pci: ARI is a PCIe v2 feature
PATCH 1/1 pci: ARI is a PCIe v2 feature
The function pci_enable_ari() may mistakenly set the downstream port of a v1 PCIe switch in ARI Forwarding mode. This is a PCIe v2 feature, and with an SR-IOV device on that switch port believing the switch above is ARI capable it may attempt to use functions 8-255, translating into invalid (non-zero) device numbers for that bus. This has been seen to cause Completion Timeouts and general misbehaviour including hangs and panics.
Acked-by Don Dutile <[email protected]>
Tested-by Don Dutile <[email protected]>
Signed-off-by Chris Wright <[email protected]>
---
drivers/pci/pci.c | 7 ++++++- 1 files changed, 6 insertions(+), 1 deletions(-)
drivers/pci/pci.c +6 -1
@@ -1905,7 +1905,7 @@ void pci_enable_ari(struct pci_dev *dev) {int pos;u32 cap; -u16 ctrl; +u16 flags, ctrl;struct pci_dev *bridge;if (!pci_is_pcie (dev) || dev->devfn)
@@ -1923,6 +1923,11 @@ void pci_enable_ari(struct pci_dev *dev)if (!pos)return ; +/* ARI is a PCIe v2 feature */ +pci_read_config_word (bridge, pos +PCI_EXP_FLAGS , &flags); +if ((flags &PCI_EXP_FLAGS_VERS ) <2 ) +return ; +pci_read_config_dword (bridge, pos +PCI_EXP_DEVCAP2 , &cap);if (!(cap &PCI_EXP_DEVCAP2_ARI ))return ;