powerpc/eeh: Use eeh_unfreeze_pe()
authorGavin Shan <gwshan@linux.vnet.ibm.com>
Tue, 30 Sep 2014 02:39:02 +0000 (12:39 +1000)
committerMichael Ellerman <mpe@ellerman.id.au>
Tue, 30 Sep 2014 07:15:14 +0000 (17:15 +1000)
The patch uses eeh_unfreeze_pe() to replace the logic clearing
frozen IO and DMA, in order to simplify the code.

Signed-off-by: Gavin Shan <gwshan@linux.vnet.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
arch/powerpc/kernel/eeh.c
arch/powerpc/kernel/eeh_driver.c
arch/powerpc/kernel/eeh_sysfs.c

index b569ce2a80374de1fcc865cbf2b7228e9bd0b5dd..c79583fe1905d1c6874adb5cd9a23f6960ddbb19 100644 (file)
@@ -1433,24 +1433,7 @@ static int eeh_pe_reenable_devices(struct eeh_pe *pe)
        }
 
        /* The PE is still in frozen state */
-       ret = eeh_ops->set_option(pe, EEH_OPT_THAW_MMIO);
-       if (ret) {
-               pr_warn("%s: Failure %d enabling MMIO for PHB#%x-PE#%x\n",
-                       __func__, ret, pe->phb->global_number, pe->addr);
-               return ret;
-       }
-
-       ret = eeh_ops->set_option(pe, EEH_OPT_THAW_DMA);
-       if (ret) {
-               pr_warn("%s: Failure %d enabling DMA for PHB#%x-PE#%x\n",
-                       __func__, ret, pe->phb->global_number, pe->addr);
-               return ret;
-       }
-
-       /* Clear software isolated state */
-       eeh_pe_state_clear(pe, EEH_PE_ISOLATED);
-
-       return ret;
+       return eeh_unfreeze_pe(pe, true);
 }
 
 /**
index 6a0dcee8e931f6584ac5066b8997e114dbc2cba9..948e6f99089f654a024bddd4d6ed84264d7b1a75 100644 (file)
@@ -450,21 +450,15 @@ static void *eeh_pe_detach_dev(void *data, void *userdata)
 static void *__eeh_clear_pe_frozen_state(void *data, void *flag)
 {
        struct eeh_pe *pe = (struct eeh_pe *)data;
-       int i, rc;
+       int i, rc = 1;
 
-       for (i = 0; i < 3; i++) {
-               rc = eeh_pci_enable(pe, EEH_OPT_THAW_MMIO);
-               if (rc)
-                       continue;
-               rc = eeh_pci_enable(pe, EEH_OPT_THAW_DMA);
-               if (!rc)
-                       break;
-       }
+       for (i = 0; rc && i < 3; i++)
+               rc = eeh_unfreeze_pe(pe, false);
 
-       /* The PE has been isolated, clear it */
+       /* Stop immediately on any errors */
        if (rc) {
-               pr_warn("%s: Can't clear frozen PHB#%x-PE#%x (%d)\n",
-                       __func__, pe->phb->global_number, pe->addr, rc);
+               pr_warn("%s: Failure %d unfreezing PHB#%x-PE#%x\n",
+                       __func__, rc, pe->phb->global_number, pe->addr);
                return (void *)pe;
        }
 
index eb15be4d8849aa1b6153f582168d4f977ee3ff48..9a44010bd4b5b9313f30c4f0c293c88438fa3569 100644 (file)
@@ -75,7 +75,6 @@ static ssize_t eeh_pe_state_store(struct device *dev,
 {
        struct pci_dev *pdev = to_pci_dev(dev);
        struct eeh_dev *edev = pci_dev_to_eeh_dev(pdev);
-       int ret;
 
        if (!edev || !edev->pe)
                return -ENODEV;
@@ -84,26 +83,8 @@ static ssize_t eeh_pe_state_store(struct device *dev,
        if (!(edev->pe->state & EEH_PE_ISOLATED))
                return count;
 
-       /* Enable MMIO */
-       ret = eeh_pci_enable(edev->pe, EEH_OPT_THAW_MMIO);
-       if (ret) {
-               pr_warn("%s: Failure %d enabling MMIO for PHB#%d-PE#%d\n",
-                       __func__, ret, edev->pe->phb->global_number,
-                       edev->pe->addr);
+       if (eeh_unfreeze_pe(edev->pe, true))
                return -EIO;
-       }
-
-       /* Enable DMA */
-       ret = eeh_pci_enable(edev->pe, EEH_OPT_THAW_DMA);
-       if (ret) {
-               pr_warn("%s: Failure %d enabling DMA for PHB#%d-PE#%d\n",
-                       __func__, ret, edev->pe->phb->global_number,
-                       edev->pe->addr);
-               return -EIO;
-       }
-
-       /* Clear software state */
-       eeh_pe_state_clear(edev->pe, EEH_PE_ISOLATED);
 
        return count;
 }