pci: add flag to force unbind device
authorDamien Millescamps <damien.millescamps@6wind.com>
Wed, 10 Jul 2013 13:14:52 +0000 (15:14 +0200)
committerDavid Marchand <david.marchand@6wind.com>
Wed, 26 Feb 2014 10:07:28 +0000 (11:07 +0100)
Some devices need to be unbound in order to be used via the PMD
without kernel module.

Signed-off-by: Damien Millescamps <damien.millescamps@6wind.com>
Acked-by: Thomas Monjalon <thomas.monjalon@6wind.com>
lib/librte_eal/common/include/rte_pci.h
lib/librte_eal/linuxapp/eal/eal_pci.c

index af75877..9d4f94f 100644 (file)
@@ -192,6 +192,8 @@ struct rte_pci_driver {
 #define RTE_PCI_DRV_NEED_IGB_UIO 0x0001
 /** Device driver must be registered several times until failure */
 #define RTE_PCI_DRV_MULTIPLE 0x0002
+/** Device needs to be unbound even if no module is provided */
+#define RTE_PCI_DRV_FORCE_UNBIND 0x0004
 
 /**< Internal use only - Macro used by pci addr parsing functions **/
 #define GET_PCIADDR_FIELD(in, fd, lim, dlm)                   \
index 6001d32..074d7cf 100644 (file)
@@ -974,10 +974,16 @@ rte_eal_pci_probe_one_driver(struct rte_pci_driver *dr, struct rte_pci_device *d
                }
 
 #ifdef RTE_EAL_UNBIND_PORTS
-               if (dr->drv_flags & RTE_PCI_DRV_NEED_IGB_UIO)
+               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 if (dr->drv_flags & RTE_PCI_DRV_FORCE_UNBIND &&
+                          rte_eal_process_type() == RTE_PROC_PRIMARY) {
+                       /* unbind current driver */
+                       if (pci_unbind_kernel_driver(dev) < 0)
+                               return -1;
+               }
 #else
                if (dr->drv_flags & RTE_PCI_DRV_NEED_IGB_UIO)
                        /* just map resources for Intel NICs */