powerpc/eeh: Delay EEH probe during hotplug
authorGavin Shan <shangw@linux.vnet.ibm.com>
Thu, 20 Jun 2013 05:20:59 +0000 (13:20 +0800)
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>
Thu, 20 Jun 2013 07:05:58 +0000 (17:05 +1000)
While doing EEH recovery, the PCI devices of the problematic PE
should be removed and then added to the system again. During the
so-called hotplug event, the PCI devices of the problematic PE
will be probed through early/late phase. We would delay EEH probe
on late point for PowerNV platform since the PCI device isn't
available in early phase.

Signed-off-by: Gavin Shan <shangw@linux.vnet.ibm.com>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
arch/powerpc/kernel/eeh.c

index cda0b62..7d169d3 100644 (file)
@@ -758,6 +758,14 @@ static void eeh_add_device_early(struct device_node *dn)
 {
        struct pci_controller *phb;
 
+       /*
+        * If we're doing EEH probe based on PCI device, we
+        * would delay the probe until late stage because
+        * the PCI device isn't available this moment.
+        */
+       if (!eeh_probe_mode_devtree())
+               return;
+
        if (!of_node_to_eeh_dev(dn))
                return;
        phb = of_node_to_eeh_dev(dn)->phb;
@@ -766,7 +774,6 @@ static void eeh_add_device_early(struct device_node *dn)
        if (NULL == phb || 0 == phb->buid)
                return;
 
-       /* FIXME: hotplug support on POWERNV */
        eeh_ops->of_probe(dn, NULL);
 }
 
@@ -817,6 +824,13 @@ static void eeh_add_device_late(struct pci_dev *dev)
        edev->pdev = dev;
        dev->dev.archdata.edev = edev;
 
+       /*
+        * We have to do the EEH probe here because the PCI device
+        * hasn't been created yet in the early stage.
+        */
+       if (eeh_probe_mode_dev())
+               eeh_ops->dev_probe(dev, NULL);
+
        eeh_addr_cache_insert_dev(dev);
 }