return -EINVAL;
}
- dev->driver = dr;
- }
+ /* Allocate interrupt instance for pci device */
+ dev->intr_handle =
+ rte_intr_instance_alloc(RTE_INTR_INSTANCE_F_PRIVATE);
+ if (dev->intr_handle == NULL) {
+ RTE_LOG(ERR, EAL,
+ "Failed to create interrupt instance for %s\n",
+ dev->device.name);
+ return -ENOMEM;
+ }
- if (!already_probed && (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) {
- dev->driver = NULL;
- return ret;
+ dev->vfio_req_intr_handle =
+ rte_intr_instance_alloc(RTE_INTR_INSTANCE_F_PRIVATE);
+ if (dev->vfio_req_intr_handle == NULL) {
+ rte_intr_instance_free(dev->intr_handle);
+ dev->intr_handle = NULL;
+ RTE_LOG(ERR, EAL,
+ "Failed to create vfio req interrupt instance for %s\n",
+ dev->device.name);
+ return -ENOMEM;
+ }
+
+ if (dr->drv_flags & RTE_PCI_DRV_NEED_MAPPING) {
+ ret = rte_pci_map_device(dev);
+ if (ret != 0) {
+ rte_intr_instance_free(dev->vfio_req_intr_handle);
+ dev->vfio_req_intr_handle = NULL;
+ rte_intr_instance_free(dev->intr_handle);
+ dev->intr_handle = NULL;
+ return ret;
+ }
}
+
+ dev->driver = dr;
}
RTE_LOG(INFO, EAL, "Probe PCI driver: %s (%x:%x) device: "PCI_PRI_FMT" (socket %i)\n",
!(ret > 0 &&
(dr->drv_flags & RTE_PCI_DRV_KEEP_MAPPED_RES)))
rte_pci_unmap_device(dev);
+ rte_intr_instance_free(dev->vfio_req_intr_handle);
+ dev->vfio_req_intr_handle = NULL;
+ rte_intr_instance_free(dev->intr_handle);
+ dev->intr_handle = NULL;
} else {
dev->device.driver = &dr->driver;
}
/* unmap resources for devices that use igb_uio */
rte_pci_unmap_device(dev);
+ rte_intr_instance_free(dev->intr_handle);
+ dev->intr_handle = NULL;
+ rte_intr_instance_free(dev->vfio_req_intr_handle);
+ dev->vfio_req_intr_handle = NULL;
+
return 0;
}
.plug = pci_plug,
.unplug = pci_unplug,
.parse = pci_parse,
+ .devargs_parse = rte_pci_devargs_parse,
.dma_map = pci_dma_map,
.dma_unmap = pci_dma_unmap,
.get_iommu_class = rte_pci_get_iommu_class,