PCI: Fix unaligned access in AF transaction pending test
pci_wait_for_pending() uses word access, so we shouldn't be passing an offset that is only byte aligned. Use the control register offset instead, shifting the mask to match. Fixes:d0b4cc4e32
("PCI: Wrong register used to check pending traffic") Fixes:157e876ffe
("PCI: Add pci_wait_for_pending() (refactor pci_wait_for_pending_transaction()) Reported-by: Ben Hutchings <ben@decadent.org.uk> Signed-off-by: Alex Williamson <alex.williamson@redhat.com> Signed-off-by: Bjorn Helgaas <bhelgaas@google.com> Acked-by: Gavin Shan <gwshan@linux.vnet.ibm.com> CC: stable@vger.kernel.org # v3.14+
This commit is contained in:
parent
7171511eae
commit
d066c946a8
|
@ -3135,8 +3135,13 @@ static int pci_af_flr(struct pci_dev *dev, int probe)
|
|||
if (probe)
|
||||
return 0;
|
||||
|
||||
/* Wait for Transaction Pending bit clean */
|
||||
if (pci_wait_for_pending(dev, pos + PCI_AF_STATUS, PCI_AF_STATUS_TP))
|
||||
/*
|
||||
* Wait for Transaction Pending bit to clear. A word-aligned test
|
||||
* is used, so we use the conrol offset rather than status and shift
|
||||
* the test bit to match.
|
||||
*/
|
||||
if (pci_wait_for_pending(dev, pos + PCI_AF_CTRL,
|
||||
PCI_AF_STATUS_TP << 8))
|
||||
goto clear;
|
||||
|
||||
dev_err(&dev->dev, "transaction is not cleared; proceeding with reset anyway\n");
|
||||
|
|
Loading…
Reference in New Issue