powerpc/eeh: Use eeh_unfreeze_pe()

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>
This commit is contained in:
Gavin Shan 2014-09-30 12:39:02 +10:00 committed by Michael Ellerman
parent 4eeeff0ebc
commit c9dd014397
3 changed files with 8 additions and 50 deletions

View File

@ -1433,24 +1433,7 @@ static int eeh_pe_reenable_devices(struct eeh_pe *pe)
} }
/* The PE is still in frozen state */ /* The PE is still in frozen state */
ret = eeh_ops->set_option(pe, EEH_OPT_THAW_MMIO); return eeh_unfreeze_pe(pe, true);
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;
} }
/** /**

View 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) static void *__eeh_clear_pe_frozen_state(void *data, void *flag)
{ {
struct eeh_pe *pe = (struct eeh_pe *)data; struct eeh_pe *pe = (struct eeh_pe *)data;
int i, rc; int i, rc = 1;
for (i = 0; i < 3; i++) { for (i = 0; rc && i < 3; i++)
rc = eeh_pci_enable(pe, EEH_OPT_THAW_MMIO); rc = eeh_unfreeze_pe(pe, false);
if (rc)
continue;
rc = eeh_pci_enable(pe, EEH_OPT_THAW_DMA);
if (!rc)
break;
}
/* The PE has been isolated, clear it */ /* Stop immediately on any errors */
if (rc) { if (rc) {
pr_warn("%s: Can't clear frozen PHB#%x-PE#%x (%d)\n", pr_warn("%s: Failure %d unfreezing PHB#%x-PE#%x\n",
__func__, pe->phb->global_number, pe->addr, rc); __func__, rc, pe->phb->global_number, pe->addr);
return (void *)pe; return (void *)pe;
} }

View File

@ -75,7 +75,6 @@ static ssize_t eeh_pe_state_store(struct device *dev,
{ {
struct pci_dev *pdev = to_pci_dev(dev); struct pci_dev *pdev = to_pci_dev(dev);
struct eeh_dev *edev = pci_dev_to_eeh_dev(pdev); struct eeh_dev *edev = pci_dev_to_eeh_dev(pdev);
int ret;
if (!edev || !edev->pe) if (!edev || !edev->pe)
return -ENODEV; return -ENODEV;
@ -84,26 +83,8 @@ static ssize_t eeh_pe_state_store(struct device *dev,
if (!(edev->pe->state & EEH_PE_ISOLATED)) if (!(edev->pe->state & EEH_PE_ISOLATED))
return count; return count;
/* Enable MMIO */ if (eeh_unfreeze_pe(edev->pe, true))
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);
return -EIO; 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; return count;
} }