On Wed, Sep 28, 2011 at 08:20:33PM -0400, Donald Dutile wrote: > 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> Makes sense. Nit: please use PCI_VENDOR_ID_INTEL instead of 0x8086 below. > --- > 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) { I'd also make version == 0 last test in the list to stress the fact this is a device specific quirk, but that's a matter of taste ... > + /* > + * 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