Thanks Jason, On Fri, 4 Dec 2015 16:49:52 +0800 Jason Wang <jasow...@redhat.com> wrote: > > @@ -2257,6 +2262,10 @@ static void vmxnet3_pci_realize(PCIDevice *pci_dev, > > Error **errp) > > > > vmxnet3_net_init(s); > > > > + if (pci_is_express(pci_dev) && pci_bus_is_express(pci_dev->bus)) { > > Looks like pci_bus_is_express() has been checked in > pcie_endpoint_cap_init().
Yes, but only for toggling between 'type = PCI_EXP_TYPE_ENDPOINT' vs. 'type = PCI_EXP_TYPE_RC_END'. We would not like to expose the capability stating device is an express endpoint (of any kind) unless it is located on a pcie bus. > > +static void vmxnet3_realize(DeviceState *qdev, Error **errp) > > +{ > > + VMXNET3Class *vc = VMXNET3_DEVICE_GET_CLASS(qdev); > > + PCIDevice *pci_dev = PCI_DEVICE(qdev); > > + VMXNET3State *s = VMXNET3(qdev); > > + > > + if (!(s->compat_flags & VMXNET3_COMPAT_FLAG_DISABLE_PCIE)) { > > + pci_dev->cap_present |= QEMU_PCI_CAP_EXPRESS; > > + } > > + > > + vc->parent_dc_realize(qdev, errp); > > +} > > It's not clear that how the class helps here. Why not simply do > everthing in vmxnet3_pci_realize()? Since 'vmxnet3_pci_realize' is invoked too late. By the time it's invoked, the config space is already allocated during 'pci_qdev_realize', without correctly knowing whether the device is pci or pcie. We must call 'pci_qdev_realize' (parent_dc_realize) only after 'cap_present' is properly set. See discussion here: https://lists.nongnu.org/archive/html/qemu-devel/2015-12/msg00043.html Regards, Shmulik