From: Harish Patil <harish.pa...@qlogic.com> Fix to advertise device's link speed capability based on NVM port configuration instead of returning driver supported speeds.
Fixes: 95e67b479506 ("net/qede: add 100G link speed capability") Signed-off-by: Harish Patil <harish.patil at qlogic.com> --- drivers/net/qede/qede_ethdev.c | 6 ++++-- drivers/net/qede/qede_ethdev.h | 1 + drivers/net/qede/qede_if.h | 1 + drivers/net/qede/qede_main.c | 24 ++++++++++++++++++++++++ 4 files changed, 30 insertions(+), 2 deletions(-) diff --git a/drivers/net/qede/qede_ethdev.c b/drivers/net/qede/qede_ethdev.c index b91b478..59129f2 100644 --- a/drivers/net/qede/qede_ethdev.c +++ b/drivers/net/qede/qede_ethdev.c @@ -646,6 +646,7 @@ qede_dev_info_get(struct rte_eth_dev *eth_dev, { struct qede_dev *qdev = eth_dev->data->dev_private; struct ecore_dev *edev = &qdev->edev; + struct qed_link_output link; PMD_INIT_FUNC_TRACE(edev); @@ -678,8 +679,9 @@ qede_dev_info_get(struct rte_eth_dev *eth_dev, DEV_TX_OFFLOAD_UDP_CKSUM | DEV_TX_OFFLOAD_TCP_CKSUM); - dev_info->speed_capa = ETH_LINK_SPEED_25G | ETH_LINK_SPEED_40G | - ETH_LINK_SPEED_100G; + memset(&link, 0, sizeof(struct qed_link_output)); + qdev->ops->common->get_link(edev, &link); + dev_info->speed_capa = rte_eth_speed_bitflag(link.adv_speed, 0); } /* return 0 means link status changed, -1 means not changed */ diff --git a/drivers/net/qede/qede_ethdev.h b/drivers/net/qede/qede_ethdev.h index 5eb3f52..a97e3d9 100644 --- a/drivers/net/qede/qede_ethdev.h +++ b/drivers/net/qede/qede_ethdev.h @@ -30,6 +30,7 @@ #include "base/ecore_dev_api.h" #include "base/ecore_iov_api.h" #include "base/ecore_cxt.h" +#include "base/nvm_cfg.h" #include "qede_logs.h" #include "qede_if.h" diff --git a/drivers/net/qede/qede_if.h b/drivers/net/qede/qede_if.h index 2d38b1b..4936349 100644 --- a/drivers/net/qede/qede_if.h +++ b/drivers/net/qede/qede_if.h @@ -70,6 +70,7 @@ struct qed_link_output { uint32_t advertised_caps; /* In ADVERTISED defs */ uint32_t lp_caps; /* In ADVERTISED defs */ uint32_t speed; /* In Mb/s */ + uint32_t adv_speed; /* In Mb/s */ uint8_t duplex; /* In DUPLEX defs */ uint8_t port; /* In PORT defs */ bool autoneg; diff --git a/drivers/net/qede/qede_main.c b/drivers/net/qede/qede_main.c index 2d354e1..d2e476c 100644 --- a/drivers/net/qede/qede_main.c +++ b/drivers/net/qede/qede_main.c @@ -488,6 +488,7 @@ static void qed_fill_link(struct ecore_hwfn *hwfn, struct ecore_mcp_link_state link; struct ecore_mcp_link_capabilities link_caps; uint32_t media_type; + uint32_t adv_speed; uint8_t change = 0; memset(if_link, 0, sizeof(*if_link)); @@ -515,6 +516,29 @@ static void qed_fill_link(struct ecore_hwfn *hwfn, if_link->duplex = QEDE_DUPLEX_FULL; + /* Fill up the native advertised speed */ + switch (params.speed.advertised_speeds) { + case NVM_CFG1_PORT_DRV_SPEED_CAPABILITY_MASK_10G: + adv_speed = 10000; + break; + case NVM_CFG1_PORT_DRV_SPEED_CAPABILITY_MASK_25G: + adv_speed = 25000; + break; + case NVM_CFG1_PORT_DRV_SPEED_CAPABILITY_MASK_40G: + adv_speed = 40000; + break; + case NVM_CFG1_PORT_DRV_SPEED_CAPABILITY_MASK_50G: + adv_speed = 50000; + break; + case NVM_CFG1_PORT_DRV_SPEED_CAPABILITY_MASK_BB_100G: + adv_speed = 100000; + break; + default: + DP_NOTICE(hwfn, false, "Unknown speed\n"); + adv_speed = 0; + } + if_link->adv_speed = adv_speed; + if (params.speed.autoneg) if_link->supported_caps |= QEDE_SUPPORTED_AUTONEG; -- 1.7.10.3