Merge tag 'mac80211-for-john-2014-11-18' of git://git.kernel.org/pub/scm/linux/kernel...
[cascardo/linux.git] / arch / powerpc / kernel / eeh_pe.c
index 00e3844..53dd091 100644 (file)
@@ -428,7 +428,7 @@ int eeh_rmv_from_parent_pe(struct eeh_dev *edev)
        }
 
        /* Remove the EEH device */
-       pe = edev->pe;
+       pe = eeh_dev_to_pe(edev);
        edev->pe = NULL;
        list_del(&edev->list);
 
@@ -584,6 +584,8 @@ static void *__eeh_pe_state_clear(void *data, void *flag)
 {
        struct eeh_pe *pe = (struct eeh_pe *)data;
        int state = *((int *)flag);
+       struct eeh_dev *edev, *tmp;
+       struct pci_dev *pdev;
 
        /* Keep the state of permanently removed PE intact */
        if ((pe->freeze_count > EEH_MAX_ALLOWED_FREEZES) &&
@@ -592,9 +594,22 @@ static void *__eeh_pe_state_clear(void *data, void *flag)
 
        pe->state &= ~state;
 
-       /* Clear check count since last isolation */
-       if (state & EEH_PE_ISOLATED)
-               pe->check_count = 0;
+       /*
+        * Special treatment on clearing isolated state. Clear
+        * check count since last isolation and put all affected
+        * devices to normal state.
+        */
+       if (!(state & EEH_PE_ISOLATED))
+               return NULL;
+
+       pe->check_count = 0;
+       eeh_pe_for_each_dev(pe, edev, tmp) {
+               pdev = eeh_dev_to_pci_dev(edev);
+               if (!pdev)
+                       continue;
+
+               pdev->error_state = pci_channel_io_normal;
+       }
 
        return NULL;
 }