From: Harish Patil <harish.pa...@qlogic.com> Fix to use bitmapped values in NVM configuration for speed capability advertisement. This issue is specific to 25G NIC since it is capable of 25G and 10G speeds.
Fixes: 64c239b7f8b7 ("net/qede: fix advertising link speed capability") Signed-off-by: Harish Patil <harish.patil at qlogic.com> --- drivers/net/qede/qede_ethdev.c | 15 ++++++++++++++- drivers/net/qede/qede_if.h | 2 +- drivers/net/qede/qede_main.c | 25 ++----------------------- 3 files changed, 17 insertions(+), 25 deletions(-) diff --git a/drivers/net/qede/qede_ethdev.c b/drivers/net/qede/qede_ethdev.c index 59129f2..f57f80d 100644 --- a/drivers/net/qede/qede_ethdev.c +++ b/drivers/net/qede/qede_ethdev.c @@ -647,6 +647,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; + uint32_t speed_cap = 0; PMD_INIT_FUNC_TRACE(edev); @@ -681,7 +682,19 @@ qede_dev_info_get(struct rte_eth_dev *eth_dev, 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); + if (link.adv_speed & NVM_CFG1_PORT_DRV_SPEED_CAPABILITY_MASK_1G) + speed_cap |= ETH_LINK_SPEED_1G; + if (link.adv_speed & NVM_CFG1_PORT_DRV_SPEED_CAPABILITY_MASK_10G) + speed_cap |= ETH_LINK_SPEED_10G; + if (link.adv_speed & NVM_CFG1_PORT_DRV_SPEED_CAPABILITY_MASK_25G) + speed_cap |= ETH_LINK_SPEED_25G; + if (link.adv_speed & NVM_CFG1_PORT_DRV_SPEED_CAPABILITY_MASK_40G) + speed_cap |= ETH_LINK_SPEED_40G; + if (link.adv_speed & NVM_CFG1_PORT_DRV_SPEED_CAPABILITY_MASK_50G) + speed_cap |= ETH_LINK_SPEED_50G; + if (link.adv_speed & NVM_CFG1_PORT_DRV_SPEED_CAPABILITY_MASK_BB_100G) + speed_cap |= ETH_LINK_SPEED_100G; + dev_info->speed_capa = speed_cap; } /* return 0 means link status changed, -1 means not changed */ diff --git a/drivers/net/qede/qede_if.h b/drivers/net/qede/qede_if.h index 4936349..2131fe2 100644 --- a/drivers/net/qede/qede_if.h +++ b/drivers/net/qede/qede_if.h @@ -70,7 +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 */ + uint32_t adv_speed; /* Speed mask */ 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 d2e476c..ab22409 100644 --- a/drivers/net/qede/qede_main.c +++ b/drivers/net/qede/qede_main.c @@ -488,7 +488,6 @@ 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)); @@ -516,28 +515,8 @@ 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; + /* Fill up the native advertised speed cap mask */ + if_link->adv_speed = params.speed.advertised_speeds; if (params.speed.autoneg) if_link->supported_caps |= QEDE_SUPPORTED_AUTONEG; -- 1.8.3.1