|
@@ -1012,6 +1012,7 @@ static int vfio_vc_cap_len(struct vfio_pci_device *vdev, u16 pos)
|
|
|
static int vfio_cap_len(struct vfio_pci_device *vdev, u8 cap, u8 pos)
|
|
|
{
|
|
|
struct pci_dev *pdev = vdev->pdev;
|
|
|
+ u32 dword;
|
|
|
u16 word;
|
|
|
u8 byte;
|
|
|
int ret;
|
|
@@ -1025,7 +1026,9 @@ static int vfio_cap_len(struct vfio_pci_device *vdev, u8 cap, u8 pos)
|
|
|
return pcibios_err_to_errno(ret);
|
|
|
|
|
|
if (PCI_X_CMD_VERSION(word)) {
|
|
|
- vdev->extended_caps = true;
|
|
|
+ /* Test for extended capabilities */
|
|
|
+ pci_read_config_dword(pdev, PCI_CFG_SPACE_SIZE, &dword);
|
|
|
+ vdev->extended_caps = (dword != 0);
|
|
|
return PCI_CAP_PCIX_SIZEOF_V2;
|
|
|
} else
|
|
|
return PCI_CAP_PCIX_SIZEOF_V0;
|
|
@@ -1037,9 +1040,11 @@ static int vfio_cap_len(struct vfio_pci_device *vdev, u8 cap, u8 pos)
|
|
|
|
|
|
return byte;
|
|
|
case PCI_CAP_ID_EXP:
|
|
|
- /* length based on version */
|
|
|
- vdev->extended_caps = true;
|
|
|
+ /* Test for extended capabilities */
|
|
|
+ pci_read_config_dword(pdev, PCI_CFG_SPACE_SIZE, &dword);
|
|
|
+ vdev->extended_caps = (dword != 0);
|
|
|
|
|
|
+ /* length based on version */
|
|
|
if ((pcie_caps_reg(pdev) & PCI_EXP_FLAGS_VERS) == 1)
|
|
|
return PCI_CAP_EXP_ENDPOINT_SIZEOF_V1;
|
|
|
else
|