]> git.droids-corp.org - dpdk.git/commitdiff
net/qede: fix advertising link speed capability
authorHarish Patil <harish.patil@qlogic.com>
Mon, 31 Oct 2016 18:35:01 +0000 (11:35 -0700)
committerThomas Monjalon <thomas.monjalon@6wind.com>
Mon, 7 Nov 2016 19:46:52 +0000 (20:46 +0100)
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@qlogic.com>
drivers/net/qede/qede_ethdev.c
drivers/net/qede/qede_ethdev.h
drivers/net/qede/qede_if.h
drivers/net/qede/qede_main.c

index b91b4780dcc3bf755073fdef5cfaaf15acb21dce..59129f25c329f7546753efc9de94bb1adf3f16a9 100644 (file)
@@ -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 */
index 5eb3f52164a2db2c6f6186c8def797fb99107cbd..a97e3d96207e08bfb17e321cf16c359f60336fbb 100644 (file)
@@ -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"
index 2d38b1bf59b5973117accbe1bd4765071bbd7a39..49363491159fb6d5daeebbd358fd05a09379e7e1 100644 (file)
@@ -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;
index 2d354e19d661bf4bbe2c230d2e3446791b578208..d2e476c7a438068ba252a9e6073cda2f62c00264 100644 (file)
@@ -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;