New upstream version 18.08
[deb_dpdk.git] / drivers / bus / pci / pci_common.c
index 2a00f36..7736b3f 100644 (file)
@@ -26,6 +26,7 @@
 
 #include "private.h"
 
+
 extern struct rte_pci_bus rte_pci_bus;
 
 #define SYSFS_PCI_DEVICES "/sys/bus/pci/devices"
@@ -45,12 +46,8 @@ static struct rte_devargs *pci_devargs_lookup(struct rte_pci_device *dev)
 {
        struct rte_devargs *devargs;
        struct rte_pci_addr addr;
-       struct rte_bus *pbus;
 
-       pbus = rte_bus_find_by_name("pci");
-       TAILQ_FOREACH(devargs, &devargs_list, next) {
-               if (devargs->bus != pbus)
-                       continue;
+       RTE_EAL_DEVARGS_FOREACH("pci", devargs) {
                devargs->bus->parse(devargs->name, &addr);
                if (!rte_pci_addr_cmp(&dev->addr, &addr))
                        return devargs;
@@ -73,7 +70,7 @@ pci_name_set(struct rte_pci_device *dev)
         */
        if (devargs != NULL)
                /* If an rte_devargs exists, the generic rte_device uses the
-                * given name as its namea
+                * given name as its name.
                 */
                dev->device.name = dev->device.devargs->name;
        else
@@ -159,17 +156,24 @@ rte_pci_probe_one_driver(struct rte_pci_driver *dr,
        RTE_LOG(INFO, EAL, "  probe driver: %x:%x %s\n", dev->id.vendor_id,
                dev->id.device_id, dr->driver.name);
 
+       /*
+        * reference driver structure
+        * This needs to be before rte_pci_map_device(), as it enables to use
+        * driver flags for adjusting configuration.
+        */
+       dev->driver = dr;
+       dev->device.driver = &dr->driver;
+
        if (dr->drv_flags & RTE_PCI_DRV_NEED_MAPPING) {
                /* map resources for devices that use igb_uio */
                ret = rte_pci_map_device(dev);
-               if (ret != 0)
+               if (ret != 0) {
+                       dev->driver = NULL;
+                       dev->device.driver = NULL;
                        return ret;
+               }
        }
 
-       /* reference driver structure */
-       dev->driver = dr;
-       dev->device.driver = &dr->driver;
-
        /* call the driver probe() function */
        ret = dr->probe(dr, dev);
        if (ret) {
@@ -258,81 +262,6 @@ pci_probe_all_drivers(struct rte_pci_device *dev)
        return 1;
 }
 
-/*
- * Find the pci device specified by pci address, then invoke probe function of
- * the driver of the device.
- */
-int
-rte_pci_probe_one(const struct rte_pci_addr *addr)
-{
-       struct rte_pci_device *dev = NULL;
-
-       int ret = 0;
-
-       if (addr == NULL)
-               return -1;
-
-       /* update current pci device in global list, kernel bindings might have
-        * changed since last time we looked at it.
-        */
-       if (pci_update_device(addr) < 0)
-               goto err_return;
-
-       FOREACH_DEVICE_ON_PCIBUS(dev) {
-               if (rte_pci_addr_cmp(&dev->addr, addr))
-                       continue;
-
-               ret = pci_probe_all_drivers(dev);
-               if (ret)
-                       goto err_return;
-               return 0;
-       }
-       return -1;
-
-err_return:
-       RTE_LOG(WARNING, EAL,
-               "Requested device " PCI_PRI_FMT " cannot be used\n",
-               addr->domain, addr->bus, addr->devid, addr->function);
-       return -1;
-}
-
-/*
- * Detach device specified by its pci address.
- */
-int
-rte_pci_detach(const struct rte_pci_addr *addr)
-{
-       struct rte_pci_device *dev = NULL;
-       int ret = 0;
-
-       if (addr == NULL)
-               return -1;
-
-       FOREACH_DEVICE_ON_PCIBUS(dev) {
-               if (rte_pci_addr_cmp(&dev->addr, addr))
-                       continue;
-
-               ret = rte_pci_detach_dev(dev);
-               if (ret < 0)
-                       /* negative value is an error */
-                       goto err_return;
-               if (ret > 0)
-                       /* positive value means driver doesn't support it */
-                       continue;
-
-               rte_pci_remove_device(dev);
-               free(dev);
-               return 0;
-       }
-       return -1;
-
-err_return:
-       RTE_LOG(WARNING, EAL, "Requested device " PCI_PRI_FMT
-                       " cannot be used\n", dev->addr.domain, dev->addr.bus,
-                       dev->addr.devid, dev->addr.function);
-       return -1;
-}
-
 /*
  * Scan the content of the PCI bus, and call the probe() function for
  * all registered drivers that have a matching entry in its id_table
@@ -449,7 +378,7 @@ rte_pci_insert_device(struct rte_pci_device *exist_pci_dev,
 }
 
 /* Remove a device from PCI bus */
-void
+static void
 rte_pci_remove_device(struct rte_pci_device *pci_dev)
 {
        TAILQ_REMOVE(&rte_pci_bus.device_list, pci_dev, next);
@@ -459,17 +388,20 @@ static struct rte_device *
 pci_find_device(const struct rte_device *start, rte_dev_cmp_t cmp,
                const void *data)
 {
-       struct rte_pci_device *dev;
+       const struct rte_pci_device *pstart;
+       struct rte_pci_device *pdev;
 
-       FOREACH_DEVICE_ON_PCIBUS(dev) {
-               if (start && &dev->device == start) {
-                       start = NULL; /* starting point found */
-                       continue;
-               }
-               if (cmp(&dev->device, data) == 0)
-                       return &dev->device;
+       if (start != NULL) {
+               pstart = RTE_DEV_TO_PCI_CONST(start);
+               pdev = TAILQ_NEXT(pstart, next);
+       } else {
+               pdev = TAILQ_FIRST(&rte_pci_bus.device_list);
+       }
+       while (pdev != NULL) {
+               if (cmp(&pdev->device, data) == 0)
+                       return &pdev->device;
+               pdev = TAILQ_NEXT(pdev, next);
        }
-
        return NULL;
 }