[PATCH v8 35/45] powerpc/powernv: Fundamental reset in pnv_pci_reset_secondary_bus()
Gavin Shan
gwshan at linux.vnet.ibm.com
Wed Feb 17 14:44:18 AEDT 2016
In pnv_pci_reset_secondary_bus(), we should issue fundamental reset
if any one subordinate device of the specified bus is requesting that.
Otherwise, the device might not come up after the reset.
Signed-off-by: Gavin Shan <gwshan at linux.vnet.ibm.com>
---
arch/powerpc/platforms/powernv/eeh-powernv.c | 21 ++++++++++++++++++++-
1 file changed, 20 insertions(+), 1 deletion(-)
diff --git a/arch/powerpc/platforms/powernv/eeh-powernv.c b/arch/powerpc/platforms/powernv/eeh-powernv.c
index 593b8dc..c7454ba 100644
--- a/arch/powerpc/platforms/powernv/eeh-powernv.c
+++ b/arch/powerpc/platforms/powernv/eeh-powernv.c
@@ -866,9 +866,28 @@ static int pnv_eeh_bridge_reset(struct pci_dev *dev, int option)
return 0;
}
+static int pnv_pci_dev_reset_type(struct pci_dev *pdev, void *data)
+{
+ int *freset = data;
+
+ /*
+ * Stop the iteration immediately if there has any one
+ * PCI device requesting fundamental reset.
+ */
+ *freset |= pdev->needs_freset;
+ return *freset;
+}
+
void pnv_pci_reset_secondary_bus(struct pci_dev *dev)
{
- pnv_eeh_bridge_reset(dev, EEH_RESET_HOT);
+ int option, freset = 0;
+
+ if (dev->subordinate)
+ pci_walk_bus(dev->subordinate,
+ pnv_pci_dev_reset_type, &freset);
+
+ option = freset ? EEH_RESET_FUNDAMENTAL : EEH_RESET_HOT;
+ pnv_eeh_bridge_reset(dev, option);
pnv_eeh_bridge_reset(dev, EEH_RESET_DEACTIVATE);
}
--
2.1.0
More information about the Linuxppc-dev
mailing list