struct pci_device *pci_devices;
/** List of PCI devices assigned to this cell that support MSI-X. */
struct pci_device *msix_device_list;
- /** List of virtual PCI devices assigned to this cell. */
- struct pci_device *virtual_device_list;
/** Lock protecting changes to mmio_locations, mmio_handlers, and
* num_mmio_regions. */
union pci_msix_registers msix_registers;
/** Next PCI device in this cell with MSI-X support. */
struct pci_device *next_msix_device;
- /** Next virtual PCI device in this cell. */
- struct pci_device *next_virtual_device;
/** ivshmem specific data. */
struct pci_ivshmem_endpoint *ivshmem_endpoint;
/** Real MSI-X table. */
}
}
-static int pci_add_virtual_device(struct cell *cell, struct pci_device *device)
-{
- device->cell = cell;
- device->next_virtual_device = cell->virtual_device_list;
- cell->virtual_device_list = device;
- return 0;
-}
-
static int pci_add_physical_device(struct cell *cell, struct pci_device *device)
{
unsigned int n, pages, size = device->info->msix_region_size;
return err;
}
-static void pci_remove_virtual_device(struct pci_device *device)
-{
- struct pci_device *prev = device->cell->virtual_device_list;
-
- if (prev == device) {
- device->cell->virtual_device_list = device->next_virtual_device;
- } else {
- while (prev->next_virtual_device != device)
- prev = prev->next_virtual_device;
- prev->next_virtual_device = device->next_virtual_device;
- }
-}
-
static void pci_remove_physical_device(struct pci_device *device)
{
unsigned int size = device->info->msix_region_size;
err = pci_ivshmem_init(cell, device);
if (err)
goto error;
- err = pci_add_virtual_device(cell, device);
- if (err)
- goto error;
+
+ device->cell = cell;
+
continue;
}
if (device->cell) {
if (device->info->type == JAILHOUSE_PCI_TYPE_IVSHMEM) {
pci_ivshmem_exit(device);
- pci_remove_virtual_device(device);
} else {
pci_remove_physical_device(device);
pci_return_device_to_root_cell(device);