ethdev: fix extended statistics name index
[dpdk.git] / drivers / net / qede / qede_ethdev.c
index 2763d63..edc5b43 100644 (file)
@@ -8,6 +8,7 @@
 
 #include "qede_ethdev.h"
 #include <rte_alarm.h>
+#include <rte_version.h>
 
 /* Globals */
 static const struct qed_eth_ops *qed_ops;
@@ -159,20 +160,29 @@ static const struct rte_qede_xstats_name_off qede_xstats_strings[] = {
                offsetof(struct ecore_eth_stats, tpa_coalesced_bytes)},
 };
 
+static const struct rte_qede_xstats_name_off qede_rxq_xstats_strings[] = {
+       {"rx_q_segments",
+               offsetof(struct qede_rx_queue, rx_segs)},
+       {"rx_q_hw_errors",
+               offsetof(struct qede_rx_queue, rx_hw_errors)},
+       {"rx_q_allocation_errors",
+               offsetof(struct qede_rx_queue, rx_alloc_errors)}
+};
+
 static void qede_interrupt_action(struct ecore_hwfn *p_hwfn)
 {
        ecore_int_sp_dpc((osal_int_ptr_t)(p_hwfn));
 }
 
 static void
-qede_interrupt_handler(__rte_unused struct rte_intr_handle *handle, void *param)
+qede_interrupt_handler(struct rte_intr_handle *handle, void *param)
 {
        struct rte_eth_dev *eth_dev = (struct rte_eth_dev *)param;
        struct qede_dev *qdev = eth_dev->data->dev_private;
        struct ecore_dev *edev = &qdev->edev;
 
        qede_interrupt_action(ECORE_LEADING_HWFN(edev));
-       if (rte_intr_enable(&eth_dev->pci_dev->intr_handle))
+       if (rte_intr_enable(handle))
                DP_ERR(edev, "rte_intr_enable failed\n");
 }
 
@@ -188,31 +198,28 @@ static void qede_print_adapter_info(struct qede_dev *qdev)
 {
        struct ecore_dev *edev = &qdev->edev;
        struct qed_dev_info *info = &qdev->dev_info.common;
-       static char ver_str[QED_DRV_VER_STR_SIZE];
+       static char drv_ver[QEDE_PMD_DRV_VER_STR_SIZE];
+       static char ver_str[QEDE_PMD_DRV_VER_STR_SIZE];
 
        DP_INFO(edev, "*********************************\n");
+       DP_INFO(edev, " DPDK version:%s\n", rte_version());
        DP_INFO(edev, " Chip details : %s%d\n",
-               ECORE_IS_BB(edev) ? "BB" : "AH",
-               CHIP_REV_IS_A0(edev) ? 0 : 1);
-
-       sprintf(ver_str, "%s %s_%d.%d.%d.%d", QEDE_PMD_VER_PREFIX,
-               edev->ver_str, QEDE_PMD_VERSION_MAJOR, QEDE_PMD_VERSION_MINOR,
-               QEDE_PMD_VERSION_REVISION, QEDE_PMD_VERSION_PATCH);
-       strcpy(qdev->drv_ver, ver_str);
-       DP_INFO(edev, " Driver version : %s\n", ver_str);
-
-       sprintf(ver_str, "%d.%d.%d.%d", info->fw_major, info->fw_minor,
-               info->fw_rev, info->fw_eng);
+                 ECORE_IS_BB(edev) ? "BB" : "AH",
+                 CHIP_REV_IS_A0(edev) ? 0 : 1);
+       snprintf(ver_str, QEDE_PMD_DRV_VER_STR_SIZE, "%d.%d.%d.%d",
+                info->fw_major, info->fw_minor, info->fw_rev, info->fw_eng);
+       snprintf(drv_ver, QEDE_PMD_DRV_VER_STR_SIZE, "%s_%s",
+                ver_str, QEDE_PMD_VERSION);
+       DP_INFO(edev, " Driver version : %s\n", drv_ver);
        DP_INFO(edev, " Firmware version : %s\n", ver_str);
 
-       sprintf(ver_str, "%d.%d.%d.%d",
+       snprintf(ver_str, MCP_DRV_VER_STR_SIZE,
+                "%d.%d.%d.%d",
                (info->mfw_rev >> 24) & 0xff,
                (info->mfw_rev >> 16) & 0xff,
                (info->mfw_rev >> 8) & 0xff, (info->mfw_rev) & 0xff);
-       DP_INFO(edev, " Management firmware version : %s\n", ver_str);
-
+       DP_INFO(edev, " Management Firmware version : %s\n", ver_str);
        DP_INFO(edev, " Firmware file : %s\n", fw_file);
-
        DP_INFO(edev, "*********************************\n");
 }
 
@@ -639,9 +646,12 @@ 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);
 
+       dev_info->pci_dev = RTE_DEV_TO_PCI(eth_dev->device);
        dev_info->min_rx_bufsize = (uint32_t)(ETHER_MIN_MTU +
                                              QEDE_ETH_OVERHEAD);
        dev_info->max_rx_pktlen = (uint32_t)ETH_TX_MAX_NON_LSO_PKT_LEN;
@@ -671,8 +681,21 @@ 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);
+       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 */
@@ -787,6 +810,7 @@ static void qede_poll_sp_sb_cb(void *param)
 
 static void qede_dev_close(struct rte_eth_dev *eth_dev)
 {
+       struct rte_pci_device *pci_dev = RTE_DEV_TO_PCI(eth_dev->device);
        struct qede_dev *qdev = QEDE_INIT_QDEV(eth_dev);
        struct ecore_dev *edev = QEDE_INIT_EDEV(qdev);
        int rc;
@@ -813,9 +837,9 @@ static void qede_dev_close(struct rte_eth_dev *eth_dev)
 
        qdev->ops->common->remove(edev);
 
-       rte_intr_disable(&eth_dev->pci_dev->intr_handle);
+       rte_intr_disable(&pci_dev->intr_handle);
 
-       rte_intr_callback_unregister(&eth_dev->pci_dev->intr_handle,
+       rte_intr_callback_unregister(&pci_dev->intr_handle,
                                     qede_interrupt_handler, (void *)eth_dev);
 
        if (edev->num_hwfns > 1)
@@ -830,6 +854,8 @@ qede_get_stats(struct rte_eth_dev *eth_dev, struct rte_eth_stats *eth_stats)
        struct qede_dev *qdev = eth_dev->data->dev_private;
        struct ecore_dev *edev = &qdev->edev;
        struct ecore_eth_stats stats;
+       unsigned int i = 0, j = 0, qid;
+       struct qede_tx_queue *txq;
 
        qdev->ops->get_vport_stats(edev, &stats);
 
@@ -860,20 +886,73 @@ qede_get_stats(struct rte_eth_dev *eth_dev, struct rte_eth_stats *eth_stats)
            stats.tx_mcast_bytes + stats.tx_bcast_bytes;
 
        eth_stats->oerrors = stats.tx_err_drop_pkts;
+
+       /* Queue stats */
+       for (qid = 0; qid < QEDE_QUEUE_CNT(qdev); qid++) {
+               if (qdev->fp_array[qid].type & QEDE_FASTPATH_RX) {
+                       eth_stats->q_ipackets[i] =
+                               *(uint64_t *)(
+                                       ((char *)(qdev->fp_array[(qid)].rxq)) +
+                                       offsetof(struct qede_rx_queue,
+                                       rcv_pkts));
+                       eth_stats->q_errors[i] =
+                               *(uint64_t *)(
+                                       ((char *)(qdev->fp_array[(qid)].rxq)) +
+                                       offsetof(struct qede_rx_queue,
+                                       rx_hw_errors)) +
+                               *(uint64_t *)(
+                                       ((char *)(qdev->fp_array[(qid)].rxq)) +
+                                       offsetof(struct qede_rx_queue,
+                                       rx_alloc_errors));
+                       i++;
+               }
+
+               if (qdev->fp_array[qid].type & QEDE_FASTPATH_TX) {
+                       txq = qdev->fp_array[(qid)].txqs[0];
+                       eth_stats->q_opackets[j] =
+                               *((uint64_t *)(uintptr_t)
+                                       (((uint64_t)(uintptr_t)(txq)) +
+                                        offsetof(struct qede_tx_queue,
+                                                 xmit_pkts)));
+                       j++;
+               }
+       }
+}
+
+static unsigned
+qede_get_xstats_count(struct qede_dev *qdev) {
+       return RTE_DIM(qede_xstats_strings) +
+               (RTE_DIM(qede_rxq_xstats_strings) * QEDE_RSS_COUNT(qdev));
 }
 
 static int
 qede_get_xstats_names(__rte_unused struct rte_eth_dev *dev,
                      struct rte_eth_xstat_name *xstats_names, unsigned limit)
 {
-       unsigned int i, stat_cnt = RTE_DIM(qede_xstats_strings);
+       struct qede_dev *qdev = dev->data->dev_private;
+       const unsigned int stat_cnt = qede_get_xstats_count(qdev);
+       unsigned int i, qid, stat_idx = 0;
 
-       if (xstats_names != NULL)
-               for (i = 0; i < stat_cnt; i++)
-                       snprintf(xstats_names[i].name,
-                               sizeof(xstats_names[i].name),
+       if (xstats_names != NULL) {
+               for (i = 0; i < RTE_DIM(qede_xstats_strings); i++) {
+                       snprintf(xstats_names[stat_idx].name,
+                               sizeof(xstats_names[stat_idx].name),
                                "%s",
                                qede_xstats_strings[i].name);
+                       stat_idx++;
+               }
+
+               for (qid = 0; qid < QEDE_RSS_COUNT(qdev); qid++) {
+                       for (i = 0; i < RTE_DIM(qede_rxq_xstats_strings); i++) {
+                               snprintf(xstats_names[stat_idx].name,
+                                       sizeof(xstats_names[stat_idx].name),
+                                       "%.4s%d%s",
+                                       qede_rxq_xstats_strings[i].name, qid,
+                                       qede_rxq_xstats_strings[i].name + 4);
+                               stat_idx++;
+                       }
+               }
+       }
 
        return stat_cnt;
 }
@@ -885,18 +964,34 @@ qede_get_xstats(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats,
        struct qede_dev *qdev = dev->data->dev_private;
        struct ecore_dev *edev = &qdev->edev;
        struct ecore_eth_stats stats;
-       unsigned int num = RTE_DIM(qede_xstats_strings);
+       const unsigned int num = qede_get_xstats_count(qdev);
+       unsigned int i, qid, stat_idx = 0;
 
        if (n < num)
                return num;
 
        qdev->ops->get_vport_stats(edev, &stats);
 
-       for (num = 0; num < n; num++)
-               xstats[num].value = *(u64 *)(((char *)&stats) +
-                                            qede_xstats_strings[num].offset);
+       for (i = 0; i < RTE_DIM(qede_xstats_strings); i++) {
+               xstats[stat_idx].value = *(uint64_t *)(((char *)&stats) +
+                                            qede_xstats_strings[i].offset);
+               xstats[stat_idx].id = stat_idx;
+               stat_idx++;
+       }
 
-       return num;
+       for (qid = 0; qid < QEDE_QUEUE_CNT(qdev); qid++) {
+               if (qdev->fp_array[qid].type & QEDE_FASTPATH_RX) {
+                       for (i = 0; i < RTE_DIM(qede_rxq_xstats_strings); i++) {
+                               xstats[stat_idx].value = *(uint64_t *)(
+                                       ((char *)(qdev->fp_array[(qid)].rxq)) +
+                                        qede_rxq_xstats_strings[i].offset);
+                               xstats[stat_idx].id = stat_idx;
+                               stat_idx++;
+                       }
+               }
+       }
+
+       return stat_idx;
 }
 
 static void
@@ -1312,7 +1407,8 @@ static int qede_common_dev_init(struct rte_eth_dev *eth_dev, bool is_vf)
        /* Extract key data structures */
        adapter = eth_dev->data->dev_private;
        edev = &adapter->edev;
-       pci_addr = eth_dev->pci_dev->addr;
+       pci_dev = RTE_DEV_TO_PCI(eth_dev->device);
+       pci_addr = pci_dev->addr;
 
        PMD_INIT_FUNC_TRACE(edev);
 
@@ -1329,8 +1425,6 @@ static int qede_common_dev_init(struct rte_eth_dev *eth_dev, bool is_vf)
                return 0;
        }
 
-       pci_dev = eth_dev->pci_dev;
-
        rte_eth_copy_pci_info(eth_dev, pci_dev);
 
        qed_ops = qed_get_eth_ops();
@@ -1351,10 +1445,10 @@ static int qede_common_dev_init(struct rte_eth_dev *eth_dev, bool is_vf)
 
        qede_update_pf_params(edev);
 
-       rte_intr_callback_register(&eth_dev->pci_dev->intr_handle,
+       rte_intr_callback_register(&pci_dev->intr_handle,
                                   qede_interrupt_handler, (void *)eth_dev);
 
-       if (rte_intr_enable(&eth_dev->pci_dev->intr_handle)) {
+       if (rte_intr_enable(&pci_dev->intr_handle)) {
                DP_ERR(edev, "rte_intr_enable() failed\n");
                return -ENODEV;
        }
@@ -1362,11 +1456,12 @@ static int qede_common_dev_init(struct rte_eth_dev *eth_dev, bool is_vf)
        /* Start the Slowpath-process */
        memset(&params, 0, sizeof(struct qed_slowpath_params));
        params.int_mode = ECORE_INT_MODE_MSIX;
-       params.drv_major = QEDE_MAJOR_VERSION;
-       params.drv_minor = QEDE_MINOR_VERSION;
-       params.drv_rev = QEDE_REVISION_VERSION;
-       params.drv_eng = QEDE_ENGINEERING_VERSION;
-       strncpy((char *)params.name, "qede LAN", QED_DRV_VER_STR_SIZE);
+       params.drv_major = QEDE_PMD_VERSION_MAJOR;
+       params.drv_minor = QEDE_PMD_VERSION_MINOR;
+       params.drv_rev = QEDE_PMD_VERSION_REVISION;
+       params.drv_eng = QEDE_PMD_VERSION_PATCH;
+       strncpy((char *)params.name, QEDE_PMD_VER_PREFIX,
+               QEDE_PMD_DRV_VER_STR_SIZE);
 
        /* For CMT mode device do periodic polling for slowpath events.
         * This is required since uio device uses only one MSI-x
@@ -1403,7 +1498,7 @@ static int qede_common_dev_init(struct rte_eth_dev *eth_dev, bool is_vf)
 
        qede_alloc_etherdev(adapter, &dev_info);
 
-       adapter->ops->common->set_id(edev, edev->name, QEDE_DRV_MODULE_VERSION);
+       adapter->ops->common->set_id(edev, edev->name, QEDE_PMD_VERSION);
 
        if (!is_vf)
                adapter->dev_info.num_mac_addrs =
@@ -1576,5 +1671,7 @@ static struct eth_driver rte_qede_pmd = {
 
 RTE_PMD_REGISTER_PCI(net_qede, rte_qede_pmd.pci_drv);
 RTE_PMD_REGISTER_PCI_TABLE(net_qede, pci_id_qede_map);
+RTE_PMD_REGISTER_KMOD_DEP(net_qede, "* igb_uio | uio_pci_generic | vfio");
 RTE_PMD_REGISTER_PCI(net_qede_vf, rte_qedevf_pmd.pci_drv);
 RTE_PMD_REGISTER_PCI_TABLE(net_qede_vf, pci_id_qedevf_map);
+RTE_PMD_REGISTER_KMOD_DEP(net_qede_vf, "* igb_uio | vfio");