pci: use igb_uio mapping only when needed
authorThomas Monjalon <thomas.monjalon@6wind.com>
Tue, 17 Sep 2013 10:00:57 +0000 (12:00 +0200)
committerDavid Marchand <david.marchand@6wind.com>
Wed, 26 Feb 2014 10:07:28 +0000 (11:07 +0100)
Since DPDK 1.4, if RTE_EAL_UNBIND_PORTS is disabled, igb_uio mapping is
done for all devices (commit eee16c964cd), breaking some non-Intel drivers.
But pci_uio_map_resource() should only be called for Intel devices
(using igb_uio kernel module).
The flag RTE_PCI_DRV_NEED_IGB_UIO is set for all those devices, even when
RTE_EAL_UNBIND_PORTS is disabled (fixes commit a22f5ce8fcc).

Signed-off-by: David Marchand <david.marchand@6wind.com>
Signed-off-by: Thomas Monjalon <thomas.monjalon@6wind.com>
Acked-by: Damien Millescamps <damien.millescamps@6wind.com>
app/test/test_pci.c
lib/librte_eal/common/include/rte_pci.h
lib/librte_eal/linuxapp/eal/eal_pci.c
lib/librte_pmd_e1000/em_ethdev.c
lib/librte_pmd_e1000/igb_ethdev.c
lib/librte_pmd_ixgbe/ixgbe_ethdev.c

index 30fa191..8fa041e 100644 (file)
@@ -94,9 +94,7 @@ struct rte_pci_driver my_driver = {
        .name = "test_driver",
        .devinit = my_driver_init,
        .id_table = my_driver_id,
-#ifdef RTE_EAL_UNBIND_PORTS
        .drv_flags = RTE_PCI_DRV_NEED_IGB_UIO,
-#endif
 };
 
 struct rte_pci_driver my_driver2 = {
index 83ba5e9..af75877 100644 (file)
@@ -188,10 +188,8 @@ struct rte_pci_driver {
        uint32_t drv_flags;                     /**< Flags contolling handling of device. */
 };
 
-#ifdef RTE_EAL_UNBIND_PORTS
 /** Device needs igb_uio kernel module */
 #define RTE_PCI_DRV_NEED_IGB_UIO 0x0001
-#endif
 /** Device driver must be registered several times until failure */
 #define RTE_PCI_DRV_MULTIPLE 0x0002
 
index fe7d9db..6001d32 100644 (file)
@@ -941,13 +941,6 @@ int
 rte_eal_pci_probe_one_driver(struct rte_pci_driver *dr, struct rte_pci_device *dev)
 {
        struct rte_pci_id *id_table;
-#ifdef RTE_EAL_UNBIND_PORTS
-       const char *module_name = NULL;
-       int uio_status = -1;
-
-       if (dr->drv_flags & RTE_PCI_DRV_NEED_IGB_UIO)
-               module_name = IGB_UIO_NAME;
-#endif
 
        for (id_table = dr->id_table ; id_table->vendor_id != 0; id_table++) {
 
@@ -981,14 +974,15 @@ rte_eal_pci_probe_one_driver(struct rte_pci_driver *dr, struct rte_pci_device *d
                }
 
 #ifdef RTE_EAL_UNBIND_PORTS
-               /* Unbind PCI devices if needed */
-               if (module_name != NULL)
-                       if (pci_switch_module(dr, dev, uio_status, module_name) < 0)
+               if (dr->drv_flags & RTE_PCI_DRV_NEED_IGB_UIO)
+                       /* unbind driver and load uio resources for Intel NICs */
+                       if (pci_switch_module(dr, dev, 1, IGB_UIO_NAME) < 0)
                                return -1;
 #else
-               /* just map the NIC resources */
-               if (pci_uio_map_resource(dev) < 0)
-                       return -1;
+               if (dr->drv_flags & RTE_PCI_DRV_NEED_IGB_UIO)
+                       /* just map resources for Intel NICs */
+                       if (pci_uio_map_resource(dev) < 0)
+                               return -1;
 #endif
 
                /* reference driver structure */
index c0be2fd..77cf39d 100644 (file)
@@ -279,9 +279,7 @@ static struct eth_driver rte_em_pmd = {
        {
                .name = "rte_em_pmd",
                .id_table = pci_id_em_map,
-#ifdef RTE_EAL_UNBIND_PORTS
                .drv_flags = RTE_PCI_DRV_NEED_IGB_UIO,
-#endif
        },
        .eth_dev_init = eth_em_dev_init,
        .dev_private_size = sizeof(struct e1000_adapter),
index bcb2176..5536444 100644 (file)
@@ -533,9 +533,7 @@ static struct eth_driver rte_igb_pmd = {
        {
                .name = "rte_igb_pmd",
                .id_table = pci_id_igb_map,
-#ifdef RTE_EAL_UNBIND_PORTS
                .drv_flags = RTE_PCI_DRV_NEED_IGB_UIO,
-#endif
        },
        .eth_dev_init = eth_igb_dev_init,
        .dev_private_size = sizeof(struct e1000_adapter),
@@ -548,9 +546,7 @@ static struct eth_driver rte_igbvf_pmd = {
        {
                .name = "rte_igbvf_pmd",
                .id_table = pci_id_igbvf_map,
-#ifdef RTE_EAL_UNBIND_PORTS
                .drv_flags = RTE_PCI_DRV_NEED_IGB_UIO,
-#endif
        },
        .eth_dev_init = eth_igbvf_dev_init,
        .dev_private_size = sizeof(struct e1000_adapter),
index d413792..af72dbb 100644 (file)
@@ -895,9 +895,7 @@ static struct eth_driver rte_ixgbe_pmd = {
        {
                .name = "rte_ixgbe_pmd",
                .id_table = pci_id_ixgbe_map,
-#ifdef RTE_EAL_UNBIND_PORTS
                .drv_flags = RTE_PCI_DRV_NEED_IGB_UIO,
-#endif
        },
        .eth_dev_init = eth_ixgbe_dev_init,
        .dev_private_size = sizeof(struct ixgbe_adapter),
@@ -910,9 +908,7 @@ static struct eth_driver rte_ixgbevf_pmd = {
        {
                .name = "rte_ixgbevf_pmd",
                .id_table = pci_id_ixgbevf_map,
-#ifdef RTE_EAL_UNBIND_PORTS
                .drv_flags = RTE_PCI_DRV_NEED_IGB_UIO,
-#endif
        },
        .eth_dev_init = eth_ixgbevf_dev_init,
        .dev_private_size = sizeof(struct ixgbe_adapter),