@@ -626,7 +626,7 @@ virtual_ethdev_create(const char *name, struct ether_addr *mac_addr,
eth_dev->dev_ops = &dev_private->dev_ops;
eth_dev->pci_dev = pci_dev;
- eth_dev->pci_dev->driver = ð_drv->pci_drv;
+ eth_dev->pci_dev->dev.driver = ð_drv->pci_drv.drv;
eth_dev->rx_pkt_burst = virtual_ethdev_rx_burst_success;
eth_dev->tx_pkt_burst = virtual_ethdev_tx_burst_success;
@@ -487,11 +487,12 @@ virtio_dev_close(struct rte_eth_dev *dev)
{
struct virtio_hw *hw = dev->data->dev_private;
struct rte_pci_device *pci_dev = dev->pci_dev;
+ struct rte_pci_driver *pci_drv = to_pci_driver(pci_dev->dev.driver);
PMD_INIT_LOG(DEBUG, "virtio_dev_close");
/* reset the NIC */
- if (pci_dev->driver->drv_flags & RTE_PCI_DRV_INTR_LSC)
+ if (pci_drv->drv_flags & RTE_PCI_DRV_INTR_LSC)
vtpci_irq_config(hw, VIRTIO_MSI_NO_VECTOR);
vtpci_reset(hw);
hw->started = 0;
@@ -1080,6 +1081,7 @@ virtio_has_msix(const struct rte_pci_addr *loc)
/* Extract I/O port numbers from sysfs */
static int virtio_resource_init_by_uio(struct rte_pci_device *pci_dev)
{
+ struct rte_pci_driver *pci_drv = to_pci_driver(pci_dev->dev.driver);
char dirname[PATH_MAX];
char filename[PATH_MAX];
unsigned long start, size;
@@ -1122,7 +1124,7 @@ static int virtio_resource_init_by_uio(struct rte_pci_device *pci_dev)
}
pci_dev->dev.intr_handle.type = RTE_INTR_HANDLE_UIO;
- pci_dev->driver->drv_flags |= RTE_PCI_DRV_INTR_LSC;
+ pci_drv->drv_flags |= RTE_PCI_DRV_INTR_LSC;
return 0;
}
@@ -1130,6 +1132,7 @@ static int virtio_resource_init_by_uio(struct rte_pci_device *pci_dev)
/* Extract port I/O numbers from proc/ioports */
static int virtio_resource_init_by_ioports(struct rte_pci_device *pci_dev)
{
+ struct rte_pci_driver *pci_drv = to_pci_driver(pci_dev->dev.driver);
uint16_t start, end;
int size;
FILE *fp;
@@ -1188,7 +1191,7 @@ static int virtio_resource_init_by_ioports(struct rte_pci_device *pci_dev)
start, size);
/* can't support lsc interrupt without uio */
- pci_dev->driver->drv_flags &= ~RTE_PCI_DRV_INTR_LSC;
+ pci_drv->drv_flags &= ~RTE_PCI_DRV_INTR_LSC;
return 0;
}
@@ -1265,6 +1268,7 @@ eth_virtio_dev_init(struct rte_eth_dev *eth_dev)
struct virtio_net_config *config;
struct virtio_net_config local_config;
struct rte_pci_device *pci_dev;
+ struct rte_pci_driver *pci_drv;
RTE_BUILD_BUG_ON(RTE_PKTMBUF_HEADROOM < sizeof(struct virtio_net_hdr));
@@ -1286,6 +1290,7 @@ eth_virtio_dev_init(struct rte_eth_dev *eth_dev)
}
pci_dev = eth_dev->pci_dev;
+ pci_drv = to_pci_driver(pci_dev->dev.driver);
if (virtio_resource_init(pci_dev) < 0)
return -1;
@@ -1305,7 +1310,7 @@ eth_virtio_dev_init(struct rte_eth_dev *eth_dev)
/* If host does not support status then disable LSC */
if (!vtpci_with_feature(hw, VIRTIO_NET_F_STATUS))
- pci_dev->driver->drv_flags &= ~RTE_PCI_DRV_INTR_LSC;
+ pci_drv->drv_flags &= ~RTE_PCI_DRV_INTR_LSC;
rte_eth_copy_pci_info(eth_dev, pci_dev);
@@ -1388,7 +1393,7 @@ eth_virtio_dev_init(struct rte_eth_dev *eth_dev)
pci_dev->id.device_id);
/* Setup interrupt callback */
- if (pci_dev->driver->drv_flags & RTE_PCI_DRV_INTR_LSC)
+ if (pci_drv->drv_flags & RTE_PCI_DRV_INTR_LSC)
rte_intr_callback_register(&pci_dev->dev.intr_handle,
virtio_interrupt_handler, eth_dev);
@@ -1401,6 +1406,7 @@ static int
eth_virtio_dev_uninit(struct rte_eth_dev *eth_dev)
{
struct rte_pci_device *pci_dev;
+ struct rte_pci_driver *pci_drv;
struct virtio_hw *hw = eth_dev->data->dev_private;
PMD_INIT_FUNC_TRACE();
@@ -1413,6 +1419,7 @@ eth_virtio_dev_uninit(struct rte_eth_dev *eth_dev)
virtio_dev_close(eth_dev);
}
pci_dev = eth_dev->pci_dev;
+ pci_drv = to_pci_driver(pci_dev->dev.driver);
eth_dev->dev_ops = NULL;
eth_dev->tx_pkt_burst = NULL;
@@ -1424,7 +1431,7 @@ eth_virtio_dev_uninit(struct rte_eth_dev *eth_dev)
eth_dev->data->mac_addrs = NULL;
/* reset interrupt callback */
- if (pci_dev->driver->drv_flags & RTE_PCI_DRV_INTR_LSC)
+ if (pci_drv->drv_flags & RTE_PCI_DRV_INTR_LSC)
rte_intr_callback_unregister(&pci_dev->dev.intr_handle,
virtio_interrupt_handler,
eth_dev);
@@ -1474,6 +1481,7 @@ virtio_dev_configure(struct rte_eth_dev *dev)
const struct rte_eth_rxmode *rxmode = &dev->data->dev_conf.rxmode;
struct virtio_hw *hw = dev->data->dev_private;
struct rte_pci_device *pci_dev = dev->pci_dev;
+ struct rte_pci_driver *pci_drv = to_pci_driver(pci_dev->dev.driver);
PMD_INIT_LOG(DEBUG, "configure");
@@ -1491,7 +1499,7 @@ virtio_dev_configure(struct rte_eth_dev *dev)
return -ENOTSUP;
}
- if (pci_dev->driver->drv_flags & RTE_PCI_DRV_INTR_LSC)
+ if (pci_drv->drv_flags & RTE_PCI_DRV_INTR_LSC)
if (vtpci_irq_config(hw, 0) == VIRTIO_MSI_NO_VECTOR) {
PMD_DRV_LOG(ERR, "failed to set config vector");
return -EBUSY;
@@ -1507,10 +1515,11 @@ virtio_dev_start(struct rte_eth_dev *dev)
uint16_t nb_queues, i;
struct virtio_hw *hw = dev->data->dev_private;
struct rte_pci_device *pci_dev = dev->pci_dev;
+ struct rte_pci_driver *pci_drv = to_pci_driver(pci_dev->dev.driver);
/* check if lsc interrupt feature is enabled */
if (dev->data->dev_conf.intr_conf.lsc) {
- if (!(pci_dev->driver->drv_flags & RTE_PCI_DRV_INTR_LSC)) {
+ if (!(pci_drv->drv_flags & RTE_PCI_DRV_INTR_LSC)) {
PMD_DRV_LOG(ERR, "link status not supported by host");
return -ENOTSUP;
}
@@ -394,7 +394,8 @@ rte_cryptodev_uninit(struct rte_pci_device *pci_dev)
if (cryptodev == NULL)
return -ENODEV;
- cryptodrv = (const struct rte_cryptodev_driver *)pci_dev->driver;
+ cryptodrv = (const struct rte_cryptodev_driver *)
+ to_pci_driver(pci_dev->dev.driver);
if (cryptodrv == NULL)
return -ENODEV;
@@ -199,7 +199,7 @@ rte_eal_pci_probe_one_driver(struct rte_pci_driver *dr, struct rte_pci_device *d
}
/* reference driver structure */
- dev->driver = dr;
+ dev->dev.driver = &dr->drv;
/* call the driver devinit() function */
return dr->devinit(dr, dev);
@@ -250,7 +250,7 @@ rte_eal_pci_detach_dev(struct rte_pci_driver *dr,
return -1; /* negative value is an error */
/* clear driver structure */
- dev->driver = NULL;
+ dev->dev.driver = NULL;
if (dr->drv_flags & RTE_PCI_DRV_NEED_MAPPING)
/* unmap resources for devices that use igb_uio */
@@ -160,6 +160,7 @@ struct rte_devargs;
struct rte_bus_device {
const char *name;
+ struct rte_bus_driver *driver;
struct rte_devargs *devargs;
struct rte_intr_handle intr_handle;
int numa_node;
@@ -161,7 +161,6 @@ struct rte_pci_device {
struct rte_pci_addr addr; /**< PCI location. */
struct rte_pci_id id; /**< PCI ID. */
struct rte_pci_resource mem_resource[PCI_MAX_RESOURCE]; /**< PCI Memory Resource */
- struct rte_pci_driver *driver; /**< Associated driver */
uint16_t max_vfs; /**< sriov enable if not zero */
enum rte_kernel_driver kdrv; /**< Kernel driver passthrough */
struct rte_bus_device dev; /**< Generic device */
@@ -211,6 +210,9 @@ struct rte_pci_driver {
struct rte_bus_driver drv; /**< Generic driver */
};
+#define to_pci_driver(busdrv) \
+ container_of((busdrv), struct rte_pci_driver, drv)
+
/** Device needs PCI BAR mapping (done with either IGB_UIO or VFIO) */
#define RTE_PCI_DRV_NEED_MAPPING 0x0001
/** Device driver must be registered several times until failure - deprecated */
@@ -315,7 +315,8 @@ rte_eth_dev_uninit(struct rte_pci_device *pci_dev)
if (eth_dev == NULL)
return -ENODEV;
- eth_drv = (const struct eth_driver *)pci_dev->driver;
+ eth_drv = (const struct eth_driver *)
+ to_pci_driver(pci_dev->dev.driver);
/* Invoke PMD device uninit function */
if (*eth_drv->eth_dev_uninit) {
@@ -3223,6 +3224,7 @@ rte_eth_dev_get_dcb_info(uint8_t port_id,
void
rte_eth_copy_pci_info(struct rte_eth_dev *eth_dev, struct rte_pci_device *pci_dev)
{
+ struct rte_pci_driver *drv = to_pci_driver(pci_dev->dev.driver);
if ((eth_dev == NULL) || (pci_dev == NULL)) {
RTE_PMD_DEBUG_TRACE("NULL pointer eth_dev=%p pci_dev=%p\n",
eth_dev, pci_dev);
@@ -3230,12 +3232,12 @@ rte_eth_copy_pci_info(struct rte_eth_dev *eth_dev, struct rte_pci_device *pci_de
}
eth_dev->data->dev_flags = 0;
- if (pci_dev->driver->drv_flags & RTE_PCI_DRV_INTR_LSC)
+ if (drv->drv_flags & RTE_PCI_DRV_INTR_LSC)
eth_dev->data->dev_flags |= RTE_ETH_DEV_INTR_LSC;
- if (pci_dev->driver->drv_flags & RTE_PCI_DRV_DETACHABLE)
+ if (drv->drv_flags & RTE_PCI_DRV_DETACHABLE)
eth_dev->data->dev_flags |= RTE_ETH_DEV_DETACHABLE;
eth_dev->data->kdrv = pci_dev->kdrv;
eth_dev->data->numa_node = pci_dev->dev.numa_node;
- eth_dev->data->drv_name = pci_dev->driver->name;
+ eth_dev->data->drv_name = pci_dev->dev.driver->name;
}