commit f9c29774d2174df6ffc20becec20928948198914 changed the PCIe Capability structure version check from if > 2 fail, to if ==1, size=x, if ==2, size=y, else fail. Turns out the 82599's VF has an errata where it's PCIe Cap struct version is 0, which now fails device assignment due to the else fallout, where before, it would blissfully work. Add a quirk if version=0, & intel-82599, set size to version 2 struct. Signed-off-by: Donald_Dutile <ddutile@xxxxxxxxxx> --- hw/device-assignment.c | 12 ++++++++++-- 1 files changed, 10 insertions(+), 2 deletions(-) diff --git a/hw/device-assignment.c b/hw/device-assignment.c index 288f80c..ed2a883 100644 --- a/hw/device-assignment.c +++ b/hw/device-assignment.c @@ -1261,12 +1261,20 @@ static int assigned_device_pci_cap_init(PCIDevice *pci_dev) if ((pos = pci_find_cap_offset(pci_dev, PCI_CAP_ID_EXP, 0))) { uint8_t version, size; - uint16_t type, devctl, lnkcap, lnksta; + uint16_t type, devctl, lnkcap, lnksta, vendor, device; uint32_t devcap; + vendor = pci_get_word(pci_dev->config + PCI_VENDOR_ID); + device = pci_get_word(pci_dev->config + PCI_DEVICE_ID); version = pci_get_byte(pci_dev->config + pos + PCI_EXP_FLAGS); version &= PCI_EXP_FLAGS_VERS; - if (version == 1) { + if (version == 0 && vendor == 0x8086 && device == 0x10ed) { + /* + * quirk for Intel 82599 VF with invalid PCIe capability version, + * should really be version 2 (same as PF) + */ + size = 0x3c; + } else if (version == 1) { size = 0x14; } else if (version == 2) { /* -- 1.7.1 -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html