net/qede: fix advertising link speed capability
[dpdk.git] / drivers / net / qede / qede_main.c
index 60655b7..d2e476c 100644 (file)
@@ -21,7 +21,7 @@ static uint8_t npar_tx_switching = 1;
 char fw_file[PATH_MAX];
 
 const char *QEDE_DEFAULT_FIRMWARE =
-       "/lib/firmware/qed/qed_init_values_zipped-8.10.9.0.bin";
+       "/lib/firmware/qed/qed_init_values-8.10.9.0.bin";
 
 static void
 qed_update_pf_params(struct ecore_dev *edev, struct ecore_pf_params *params)
@@ -384,6 +384,7 @@ int
 qed_fill_eth_dev_info(struct ecore_dev *edev, struct qed_dev_eth_info *info)
 {
        struct qede_dev *qdev = (struct qede_dev *)edev;
+       uint8_t queues = 0;
        int i;
 
        memset(info, 0, sizeof(*info));
@@ -391,20 +392,36 @@ qed_fill_eth_dev_info(struct ecore_dev *edev, struct qed_dev_eth_info *info)
        info->num_tc = 1 /* @@@TBD aelior MULTI_COS */;
 
        if (IS_PF(edev)) {
+               int max_vf_vlan_filters = 0;
+
                info->num_queues = 0;
                for_each_hwfn(edev, i)
                        info->num_queues +=
                        FEAT_NUM(&edev->hwfns[i], ECORE_PF_L2_QUE);
 
-               info->num_vlan_filters = RESC_NUM(&edev->hwfns[0], ECORE_VLAN);
+               if (edev->p_iov_info)
+                       max_vf_vlan_filters = edev->p_iov_info->total_vfs *
+                                             ECORE_ETH_VF_NUM_VLAN_FILTERS;
+               info->num_vlan_filters = RESC_NUM(&edev->hwfns[0], ECORE_VLAN) -
+                                        max_vf_vlan_filters;
 
                rte_memcpy(&info->port_mac, &edev->hwfns[0].hw_info.hw_mac_addr,
                           ETHER_ADDR_LEN);
        } else {
-               ecore_vf_get_num_rxqs(&edev->hwfns[0], &info->num_queues);
+               ecore_vf_get_num_rxqs(ECORE_LEADING_HWFN(edev),
+                                     &info->num_queues);
+               if (edev->num_hwfns > 1) {
+                       ecore_vf_get_num_rxqs(&edev->hwfns[1], &queues);
+                       info->num_queues += queues;
+                       /* Restrict 100G VF to advertise 16 queues till the
+                        * required support is available to go beyond 16.
+                        */
+                       info->num_queues = RTE_MIN(info->num_queues,
+                                                  ECORE_MAX_VF_CHAINS_PER_PF);
+               }
 
                ecore_vf_get_num_vlan_filters(&edev->hwfns[0],
-                                             &info->num_vlan_filters);
+                                             (u8 *)&info->num_vlan_filters);
 
                ecore_vf_get_port_mac(&edev->hwfns[0],
                                      (uint8_t *)&info->port_mac);
@@ -420,7 +437,7 @@ qed_fill_eth_dev_info(struct ecore_dev *edev, struct qed_dev_eth_info *info)
 
 static void
 qed_set_id(struct ecore_dev *edev, char name[NAME_SIZE],
-          const char ver_str[VER_SIZE])
+          const char ver_str[NAME_SIZE])
 {
        int i;
 
@@ -428,7 +445,7 @@ qed_set_id(struct ecore_dev *edev, char name[NAME_SIZE],
        for_each_hwfn(edev, i) {
                snprintf(edev->hwfns[i].name, NAME_SIZE, "%s-%d", name, i);
        }
-       rte_memcpy(edev->ver_str, ver_str, VER_SIZE);
+       memcpy(edev->ver_str, ver_str, NAME_SIZE);
        edev->drv_type = DRV_ID_DRV_TYPE_LINUX;
 }
 
@@ -471,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));
@@ -498,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;