}
/* 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);
}
/**
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;
}
{
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;
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;
}