]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - arch/powerpc/platforms/pseries/eeh_driver.c
[POWERPC] Fix warning in pseries/eeh_driver.c
[linux-2.6-omap-h63xx.git] / arch / powerpc / platforms / pseries / eeh_driver.c
index 15e015ef68653f78dec23d8ca4008be911b4acb4..8c1ca477c52cb9164f93ecb03ac698926fccfe98 100644 (file)
@@ -42,17 +42,20 @@ static inline const char * pcid_name (struct pci_dev *pdev)
 }
 
 #ifdef DEBUG
-static void print_device_node_tree (struct pci_dn *pdn, int dent)
+static void print_device_node_tree(struct pci_dn *pdn, int dent)
 {
        int i;
-       if (!pdn) return;
-       for (i=0;i<dent; i++)
+       struct device_node *pc;
+
+       if (!pdn)
+               return;
+       for (i = 0; i < dent; i++)
                printk(" ");
        printk("dn=%s mode=%x \tcfg_addr=%x pe_addr=%x \tfull=%s\n",
                pdn->node->name, pdn->eeh_mode, pdn->eeh_config_addr,
                pdn->eeh_pe_config_addr, pdn->node->full_name);
        dent += 3;
-       struct device_node *pc = pdn->node->child;
+       pc = pdn->node->child;
        while (pc) {
                print_device_node_tree(PCI_DN(pc), dent);
                pc = pc->sibling;
@@ -105,17 +108,18 @@ static void eeh_report_error(struct pci_dev *dev, void *userdata)
                return;
 
        rc = driver->err_handler->error_detected (dev, pci_channel_io_frozen);
+
+       /* A driver that needs a reset trumps all others */
+       if (rc == PCI_ERS_RESULT_NEED_RESET) *res = rc;
        if (*res == PCI_ERS_RESULT_NONE) *res = rc;
-       if (*res == PCI_ERS_RESULT_DISCONNECT &&
-            rc == PCI_ERS_RESULT_NEED_RESET) *res = rc;
 }
 
 /**
  * eeh_report_mmio_enabled - tell drivers that MMIO has been enabled
  *
- * Report an EEH error to each device driver, collect up and
- * merge the device driver responses. Cumulative response
- * passed back in "userdata".
+ * Tells each device driver that IO ports, MMIO and config space I/O
+ * are now enabled. Collects up and merges the device driver responses.
+ * Cumulative response passed back in "userdata".
  */
 
 static void eeh_report_mmio_enabled(struct pci_dev *dev, void *userdata)
@@ -123,17 +127,16 @@ static void eeh_report_mmio_enabled(struct pci_dev *dev, void *userdata)
        enum pci_ers_result rc, *res = userdata;
        struct pci_driver *driver = dev->driver;
 
-       // dev->error_state = pci_channel_mmio_enabled;
-
        if (!driver ||
            !driver->err_handler ||
            !driver->err_handler->mmio_enabled)
                return;
 
        rc = driver->err_handler->mmio_enabled (dev);
+
+       /* A driver that needs a reset trumps all others */
+       if (rc == PCI_ERS_RESULT_NEED_RESET) *res = rc;
        if (*res == PCI_ERS_RESULT_NONE) *res = rc;
-       if (*res == PCI_ERS_RESULT_DISCONNECT &&
-            rc == PCI_ERS_RESULT_NEED_RESET) *res = rc;
 }
 
 /**
@@ -310,8 +313,6 @@ struct pci_dn * handle_eeh_events (struct eeh_event *event)
        const char *location, *pci_str, *drv_str;
 
        frozen_dn = find_device_pe(event->dn);
-       frozen_bus = pcibios_find_pci_bus(frozen_dn);
-
        if (!frozen_dn) {
 
                location = of_get_property(event->dn, "ibm,loc-code", NULL);
@@ -321,6 +322,8 @@ struct pci_dn * handle_eeh_events (struct eeh_event *event)
                        location, pci_name(event->dev));
                return NULL;
        }
+
+       frozen_bus = pcibios_find_pci_bus(frozen_dn);
        location = of_get_property(frozen_dn, "ibm,loc-code", NULL);
        location = location ? location : "unknown";
 
@@ -354,13 +357,6 @@ struct pci_dn * handle_eeh_events (struct eeh_event *event)
        if (frozen_pdn->eeh_freeze_count > EEH_MAX_ALLOWED_FREEZES)
                goto excess_failures;
 
-       /* Get the current PCI slot state. */
-       rc = eeh_wait_for_slot_status (frozen_pdn, MAX_WAIT_FOR_RECOVERY*1000);
-       if (rc < 0) {
-               printk(KERN_WARNING "EEH: Permanent failure\n");
-               goto hard_fail;
-       }
-
        printk(KERN_WARNING
           "EEH: This PCI device has failed %d times in the last hour:\n",
                frozen_pdn->eeh_freeze_count);
@@ -376,6 +372,14 @@ struct pci_dn * handle_eeh_events (struct eeh_event *event)
         */
        pci_walk_bus(frozen_bus, eeh_report_error, &result);
 
+       /* Get the current PCI slot state. This can take a long time,
+        * sometimes over 3 seconds for certain systems. */
+       rc = eeh_wait_for_slot_status (frozen_pdn, MAX_WAIT_FOR_RECOVERY*1000);
+       if (rc < 0) {
+               printk(KERN_WARNING "EEH: Permanent failure\n");
+               goto hard_fail;
+       }
+
        /* Since rtas may enable MMIO when posting the error log,
         * don't post the error log until after all dev drivers
         * have been informed.