提交 ff45f9dd 编写于 作者: B Ben Shelton 提交者: Bjorn Helgaas

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: NBen Shelton <benjamin.h.shelton@intel.com>
Signed-off-by: NBjorn Helgaas <bhelgaas@google.com>
上级 70675e0b
...@@ -399,10 +399,6 @@ static int sriov_init(struct pci_dev *dev, int pos) ...@@ -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 @@ static int sriov_init(struct pci_dev *dev, int pos) ...@@ -420,6 +416,10 @@ static int sriov_init(struct pci_dev *dev, int pos)
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);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册