浏览代码

PCI: Enable SR-IOV ARI Capable Hierarchy before reading TotalVFs

For some SR-IOV devices, the number of available virtual functions, i.e.,
TotalVFs, increases after setting the ARI Capable Hierarchy bit in the
SR-IOV Control register.  This violates the SR-IOV spec, r1.1, sec 3.3.6,
which says TotalVFs is HwInit, but we don't need TotalVFs before setting
the ARI Capable bit anyway.

Set the ARI Capable Hierarchy bit (if ARI is enabled in the upstream
bridge) before reading TotalVFs.

[bhelgaas: changelog]
Signed-off-by: Ben Shelton <benjamin.h.shelton@intel.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Ben Shelton 9 年之前
父节点
当前提交
ff45f9ddbc
共有 1 个文件被更改,包括 4 次插入4 次删除
  1. 4 4
      drivers/pci/iov.c

+ 4 - 4
drivers/pci/iov.c

@@ -399,10 +399,6 @@ static int sriov_init(struct pci_dev *dev, int pos)
 		ssleep(1);
 		ssleep(1);
 	}
 	}
 
 
-	pci_read_config_word(dev, pos + PCI_SRIOV_TOTAL_VF, &total);
-	if (!total)
-		return 0;
-
 	ctrl = 0;
 	ctrl = 0;
 	list_for_each_entry(pdev, &dev->bus->devices, bus_list)
 	list_for_each_entry(pdev, &dev->bus->devices, bus_list)
 		if (pdev->is_physfn)
 		if (pdev->is_physfn)
@@ -420,6 +416,10 @@ found:
 	if (!offset || (total > 1 && !stride))
 	if (!offset || (total > 1 && !stride))
 		return -EIO;
 		return -EIO;
 
 
+	pci_read_config_word(dev, pos + PCI_SRIOV_TOTAL_VF, &total);
+	if (!total)
+		return 0;
+
 	pci_read_config_dword(dev, pos + PCI_SRIOV_SUP_PGSIZE, &pgsz);
 	pci_read_config_dword(dev, pos + PCI_SRIOV_SUP_PGSIZE, &pgsz);
 	i = PAGE_SHIFT > 12 ? PAGE_SHIFT - 12 : 0;
 	i = PAGE_SHIFT > 12 ? PAGE_SHIFT - 12 : 0;
 	pgsz &= ~((1 << i) - 1);
 	pgsz &= ~((1 << i) - 1);