pci: use igb_uio mapping only when needed
Since DPDK 1.4, if RTE_EAL_UNBIND_PORTS is disabled, igb_uio mapping is done for all devices (commiteee16c964c
), 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 commita22f5ce8fc
). 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>
This commit is contained in:
parent
1a40263998
commit
10ed99419b
@ -94,9 +94,7 @@ struct rte_pci_driver my_driver = {
|
|||||||
.name = "test_driver",
|
.name = "test_driver",
|
||||||
.devinit = my_driver_init,
|
.devinit = my_driver_init,
|
||||||
.id_table = my_driver_id,
|
.id_table = my_driver_id,
|
||||||
#ifdef RTE_EAL_UNBIND_PORTS
|
|
||||||
.drv_flags = RTE_PCI_DRV_NEED_IGB_UIO,
|
.drv_flags = RTE_PCI_DRV_NEED_IGB_UIO,
|
||||||
#endif
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct rte_pci_driver my_driver2 = {
|
struct rte_pci_driver my_driver2 = {
|
||||||
|
@ -188,10 +188,8 @@ struct rte_pci_driver {
|
|||||||
uint32_t drv_flags; /**< Flags contolling handling of device. */
|
uint32_t drv_flags; /**< Flags contolling handling of device. */
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef RTE_EAL_UNBIND_PORTS
|
|
||||||
/** Device needs igb_uio kernel module */
|
/** Device needs igb_uio kernel module */
|
||||||
#define RTE_PCI_DRV_NEED_IGB_UIO 0x0001
|
#define RTE_PCI_DRV_NEED_IGB_UIO 0x0001
|
||||||
#endif
|
|
||||||
/** Device driver must be registered several times until failure */
|
/** Device driver must be registered several times until failure */
|
||||||
#define RTE_PCI_DRV_MULTIPLE 0x0002
|
#define RTE_PCI_DRV_MULTIPLE 0x0002
|
||||||
|
|
||||||
|
@ -941,13 +941,6 @@ int
|
|||||||
rte_eal_pci_probe_one_driver(struct rte_pci_driver *dr, struct rte_pci_device *dev)
|
rte_eal_pci_probe_one_driver(struct rte_pci_driver *dr, struct rte_pci_device *dev)
|
||||||
{
|
{
|
||||||
struct rte_pci_id *id_table;
|
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++) {
|
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
|
#ifdef RTE_EAL_UNBIND_PORTS
|
||||||
/* Unbind PCI devices if needed */
|
if (dr->drv_flags & RTE_PCI_DRV_NEED_IGB_UIO)
|
||||||
if (module_name != NULL)
|
/* unbind driver and load uio resources for Intel NICs */
|
||||||
if (pci_switch_module(dr, dev, uio_status, module_name) < 0)
|
if (pci_switch_module(dr, dev, 1, IGB_UIO_NAME) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
#else
|
#else
|
||||||
/* just map the NIC resources */
|
if (dr->drv_flags & RTE_PCI_DRV_NEED_IGB_UIO)
|
||||||
if (pci_uio_map_resource(dev) < 0)
|
/* just map resources for Intel NICs */
|
||||||
return -1;
|
if (pci_uio_map_resource(dev) < 0)
|
||||||
|
return -1;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* reference driver structure */
|
/* reference driver structure */
|
||||||
|
@ -279,9 +279,7 @@ static struct eth_driver rte_em_pmd = {
|
|||||||
{
|
{
|
||||||
.name = "rte_em_pmd",
|
.name = "rte_em_pmd",
|
||||||
.id_table = pci_id_em_map,
|
.id_table = pci_id_em_map,
|
||||||
#ifdef RTE_EAL_UNBIND_PORTS
|
|
||||||
.drv_flags = RTE_PCI_DRV_NEED_IGB_UIO,
|
.drv_flags = RTE_PCI_DRV_NEED_IGB_UIO,
|
||||||
#endif
|
|
||||||
},
|
},
|
||||||
.eth_dev_init = eth_em_dev_init,
|
.eth_dev_init = eth_em_dev_init,
|
||||||
.dev_private_size = sizeof(struct e1000_adapter),
|
.dev_private_size = sizeof(struct e1000_adapter),
|
||||||
|
@ -533,9 +533,7 @@ static struct eth_driver rte_igb_pmd = {
|
|||||||
{
|
{
|
||||||
.name = "rte_igb_pmd",
|
.name = "rte_igb_pmd",
|
||||||
.id_table = pci_id_igb_map,
|
.id_table = pci_id_igb_map,
|
||||||
#ifdef RTE_EAL_UNBIND_PORTS
|
|
||||||
.drv_flags = RTE_PCI_DRV_NEED_IGB_UIO,
|
.drv_flags = RTE_PCI_DRV_NEED_IGB_UIO,
|
||||||
#endif
|
|
||||||
},
|
},
|
||||||
.eth_dev_init = eth_igb_dev_init,
|
.eth_dev_init = eth_igb_dev_init,
|
||||||
.dev_private_size = sizeof(struct e1000_adapter),
|
.dev_private_size = sizeof(struct e1000_adapter),
|
||||||
@ -548,9 +546,7 @@ static struct eth_driver rte_igbvf_pmd = {
|
|||||||
{
|
{
|
||||||
.name = "rte_igbvf_pmd",
|
.name = "rte_igbvf_pmd",
|
||||||
.id_table = pci_id_igbvf_map,
|
.id_table = pci_id_igbvf_map,
|
||||||
#ifdef RTE_EAL_UNBIND_PORTS
|
|
||||||
.drv_flags = RTE_PCI_DRV_NEED_IGB_UIO,
|
.drv_flags = RTE_PCI_DRV_NEED_IGB_UIO,
|
||||||
#endif
|
|
||||||
},
|
},
|
||||||
.eth_dev_init = eth_igbvf_dev_init,
|
.eth_dev_init = eth_igbvf_dev_init,
|
||||||
.dev_private_size = sizeof(struct e1000_adapter),
|
.dev_private_size = sizeof(struct e1000_adapter),
|
||||||
|
@ -895,9 +895,7 @@ static struct eth_driver rte_ixgbe_pmd = {
|
|||||||
{
|
{
|
||||||
.name = "rte_ixgbe_pmd",
|
.name = "rte_ixgbe_pmd",
|
||||||
.id_table = pci_id_ixgbe_map,
|
.id_table = pci_id_ixgbe_map,
|
||||||
#ifdef RTE_EAL_UNBIND_PORTS
|
|
||||||
.drv_flags = RTE_PCI_DRV_NEED_IGB_UIO,
|
.drv_flags = RTE_PCI_DRV_NEED_IGB_UIO,
|
||||||
#endif
|
|
||||||
},
|
},
|
||||||
.eth_dev_init = eth_ixgbe_dev_init,
|
.eth_dev_init = eth_ixgbe_dev_init,
|
||||||
.dev_private_size = sizeof(struct ixgbe_adapter),
|
.dev_private_size = sizeof(struct ixgbe_adapter),
|
||||||
@ -910,9 +908,7 @@ static struct eth_driver rte_ixgbevf_pmd = {
|
|||||||
{
|
{
|
||||||
.name = "rte_ixgbevf_pmd",
|
.name = "rte_ixgbevf_pmd",
|
||||||
.id_table = pci_id_ixgbevf_map,
|
.id_table = pci_id_ixgbevf_map,
|
||||||
#ifdef RTE_EAL_UNBIND_PORTS
|
|
||||||
.drv_flags = RTE_PCI_DRV_NEED_IGB_UIO,
|
.drv_flags = RTE_PCI_DRV_NEED_IGB_UIO,
|
||||||
#endif
|
|
||||||
},
|
},
|
||||||
.eth_dev_init = eth_ixgbevf_dev_init,
|
.eth_dev_init = eth_ixgbevf_dev_init,
|
||||||
.dev_private_size = sizeof(struct ixgbe_adapter),
|
.dev_private_size = sizeof(struct ixgbe_adapter),
|
||||||
|
Loading…
Reference in New Issue
Block a user