diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/vnet/devices/virtio/pci.c | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/src/vnet/devices/virtio/pci.c b/src/vnet/devices/virtio/pci.c index e615827ccd4..0ff453eb204 100644 --- a/src/vnet/devices/virtio/pci.c +++ b/src/vnet/devices/virtio/pci.c @@ -586,7 +586,7 @@ virtio_pci_read_caps (vlib_main_t * vm, virtio_if_t * vif) clib_error_t *error = 0; virtio_main_t *vim = &virtio_main; struct virtio_pci_cap cap; - u8 pos, common_cfg = 0, notify_base = 0, dev_cfg = 0, isr = 0; + u8 pos, common_cfg = 0, notify_base = 0, dev_cfg = 0, isr = 0, pci_cfg = 0; vlib_pci_dev_handle_t h = vif->pci_dev_handle; if ((error = vlib_pci_read_config_u8 (vm, h, PCI_CAPABILITY_LIST, &pos))) @@ -637,18 +637,25 @@ virtio_pci_read_caps (vlib_main_t * vm, virtio_if_t * vif) case VIRTIO_PCI_CAP_ISR_CFG: isr = 1; break; + case VIRTIO_PCI_CAP_PCI_CFG: + if (cap.bar == 0) + pci_cfg = 1; + break; } next: pos = cap.cap_next; } + if (!pci_cfg) + clib_error_return (error, "modern virtio pci device found"); + if (common_cfg == 0 || notify_base == 0 || dev_cfg == 0 || isr == 0) { virtio_log_debug (vim, vif, "legacy virtio pci device found"); return error; } - virtio_log_debug (vim, vif, "modern virtio pci device found"); + virtio_log_debug (vim, vif, "transitional virtio pci device found"); return error; } @@ -659,7 +666,8 @@ virtio_pci_device_init (vlib_main_t * vm, virtio_if_t * vif, clib_error_t *error = 0; u8 status = 0; - virtio_pci_read_caps (vm, vif); + if ((error = virtio_pci_read_caps (vm, vif))) + clib_error_return (error, "Device not supported"); if (virtio_pci_reset_device (vm, vif) < 0) clib_error_return (error, "Failed to reset the device"); |