drivers: use PCI registration macro
[dpdk.git] / lib / librte_ether / rte_ethdev.c
index 3cc667a..0b9f701 100644 (file)
@@ -58,7 +58,6 @@
 #include <rte_atomic.h>
 #include <rte_branch_prediction.h>
 #include <rte_common.h>
-#include <rte_ring.h>
 #include <rte_mempool.h>
 #include <rte_malloc.h>
 #include <rte_mbuf.h>
@@ -245,9 +244,9 @@ rte_eth_dev_release_port(struct rte_eth_dev *eth_dev)
        return 0;
 }
 
-static int
-rte_eth_dev_init(struct rte_pci_driver *pci_drv,
-                struct rte_pci_device *pci_dev)
+int
+rte_eth_dev_pci_probe(struct rte_pci_driver *pci_drv,
+                     struct rte_pci_device *pci_dev)
 {
        struct eth_driver    *eth_drv;
        struct rte_eth_dev *eth_dev;
@@ -299,8 +298,8 @@ rte_eth_dev_init(struct rte_pci_driver *pci_drv,
        return diag;
 }
 
-static int
-rte_eth_dev_uninit(struct rte_pci_device *pci_dev)
+int
+rte_eth_dev_pci_remove(struct rte_pci_device *pci_dev)
 {
        const struct eth_driver *eth_drv;
        struct rte_eth_dev *eth_dev;
@@ -340,28 +339,6 @@ rte_eth_dev_uninit(struct rte_pci_device *pci_dev)
        return 0;
 }
 
-/**
- * Register an Ethernet [Poll Mode] driver.
- *
- * Function invoked by the initialization function of an Ethernet driver
- * to simultaneously register itself as a PCI driver and as an Ethernet
- * Poll Mode Driver.
- * Invokes the rte_eal_pci_register() function to register the *pci_drv*
- * structure embedded in the *eth_drv* structure, after having stored the
- * address of the rte_eth_dev_init() function in the *devinit* field of
- * the *pci_drv* structure.
- * During the PCI probing phase, the rte_eth_dev_init() function is
- * invoked for each PCI [Ethernet device] matching the embedded PCI
- * identifiers provided by the driver.
- */
-void
-rte_eth_driver_register(struct eth_driver *eth_drv)
-{
-       eth_drv->pci_drv.devinit = rte_eth_dev_init;
-       eth_drv->pci_drv.devuninit = rte_eth_dev_uninit;
-       rte_eal_pci_register(&eth_drv->pci_drv);
-}
-
 int
 rte_eth_dev_is_valid_port(uint8_t port_id)
 {
@@ -538,7 +515,7 @@ rte_eth_dev_detach_pdev(uint8_t port_id, struct rte_pci_addr *addr)
        if (rte_eal_compare_pci_addr(&vp, &freed_addr) == 0)
                goto err;
 
-       /* invoke devuninit func of the pci driver,
+       /* invoke remove func of the pci driver,
         * also remove the device from pci_device_list */
        if (rte_eal_pci_detach(&freed_addr))
                goto err;
@@ -1490,8 +1467,8 @@ rte_eth_stats_get(uint8_t port_id, struct rte_eth_stats *stats)
        memset(stats, 0, sizeof(*stats));
 
        RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->stats_get, -ENOTSUP);
-       (*dev->dev_ops->stats_get)(dev, stats);
        stats->rx_nombuf = dev->data->rx_mbuf_alloc_failed;
+       (*dev->dev_ops->stats_get)(dev, stats);
        return 0;
 }
 
@@ -1536,6 +1513,7 @@ rte_eth_xstats_get_names(uint8_t port_id,
        struct rte_eth_dev *dev;
        int cnt_used_entries;
        int cnt_expected_entries;
+       int cnt_driver_entries;
        uint32_t idx, id_queue;
 
        cnt_expected_entries = get_xstats_count(port_id);
@@ -1545,16 +1523,7 @@ rte_eth_xstats_get_names(uint8_t port_id,
 
        /* port_id checked in get_xstats_count() */
        dev = &rte_eth_devices[port_id];
-       if (dev->dev_ops->xstats_get_names != NULL) {
-               cnt_used_entries = (*dev->dev_ops->xstats_get_names)(
-                       dev, xstats_names, size);
-               if (cnt_used_entries < 0)
-                       return cnt_used_entries;
-       } else
-               /* Driver itself does not support extended stats, but
-                * still have basic stats.
-                */
-               cnt_used_entries = 0;
+       cnt_used_entries = 0;
 
        for (idx = 0; idx < RTE_NB_STATS; idx++) {
                snprintf(xstats_names[cnt_used_entries].name,
@@ -1581,6 +1550,20 @@ rte_eth_xstats_get_names(uint8_t port_id,
                        cnt_used_entries++;
                }
        }
+
+       if (dev->dev_ops->xstats_get_names != NULL) {
+               /* If there are any driver-specific xstats, append them
+                * to end of list.
+                */
+               cnt_driver_entries = (*dev->dev_ops->xstats_get_names)(
+                       dev,
+                       xstats_names + cnt_used_entries,
+                       size - cnt_used_entries);
+               if (cnt_driver_entries < 0)
+                       return cnt_driver_entries;
+               cnt_used_entries += cnt_driver_entries;
+       }
+
        return cnt_used_entries;
 }
 
@@ -1628,7 +1611,6 @@ rte_eth_xstats_get(uint8_t port_id, struct rte_eth_xstat *xstats,
                stats_ptr = RTE_PTR_ADD(&eth_stats,
                                        rte_stats_strings[i].offset);
                val = *stats_ptr;
-               xstats[count].id = count + xcount;
                xstats[count++].value = val;
        }
 
@@ -1639,7 +1621,6 @@ rte_eth_xstats_get(uint8_t port_id, struct rte_eth_xstat *xstats,
                                        rte_rxq_stats_strings[i].offset +
                                        q * sizeof(uint64_t));
                        val = *stats_ptr;
-                       xstats[count].id = count + xcount;
                        xstats[count++].value = val;
                }
        }
@@ -1651,11 +1632,13 @@ rte_eth_xstats_get(uint8_t port_id, struct rte_eth_xstat *xstats,
                                        rte_txq_stats_strings[i].offset +
                                        q * sizeof(uint64_t));
                        val = *stats_ptr;
-                       xstats[count].id = count + xcount;
                        xstats[count++].value = val;
                }
        }
 
+       for (i = 0; i < count + xcount; i++)
+               xstats[i].id = i;
+
        return count + xcount;
 }