Skip to content

Commit

Permalink
[POWERPC] EEH recovery tweaks
Browse files Browse the repository at this point in the history
If one attempts to create a device driver recovery sequence that
does not depend on a hard reset of the device, but simply just
attempts to resume processing, then one discovers that the
recovery sequence implemented on powerpc is not quite right.
This patch fixes this up.

Signed-off-by: Linas Vepstas <linas@austin.ibm.com>
Signed-off-by: Paul Mackerras <paulus@samba.org>
  • Loading branch information
Linas Vepstas authored and Paul Mackerras committed Dec 8, 2006
1 parent 3a1d1ac commit d0e7034
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 3 deletions.
1 change: 1 addition & 0 deletions arch/powerpc/platforms/pseries/eeh.c
Original file line number Diff line number Diff line change
Expand Up @@ -337,6 +337,7 @@ int eeh_dn_check_failure(struct device_node *dn, struct pci_dev *dev)
printk (KERN_ERR "EEH: Device driver ignored %d bad reads, panicing\n",
pdn->eeh_check_count);
dump_stack();
msleep(5000);

/* re-read the slot reset state */
if (read_slot_reset_state(pdn, rets) != 0)
Expand Down
13 changes: 10 additions & 3 deletions arch/powerpc/platforms/pseries/eeh_driver.c
Original file line number Diff line number Diff line change
Expand Up @@ -170,14 +170,19 @@ static void eeh_report_reset(struct pci_dev *dev, void *userdata)
static void eeh_report_resume(struct pci_dev *dev, void *userdata)
{
struct pci_driver *driver = dev->driver;
struct device_node *dn = pci_device_to_OF_node(dev);

dev->error_state = pci_channel_io_normal;

if (!driver)
return;
if (!driver->err_handler)
return;
if (!driver->err_handler->resume)

if ((PCI_DN(dn)->eeh_mode) & EEH_MODE_IRQ_DISABLED) {
PCI_DN(dn)->eeh_mode &= ~EEH_MODE_IRQ_DISABLED;
enable_irq(dev->irq);
}
if (!driver->err_handler ||
!driver->err_handler->resume)
return;

driver->err_handler->resume(dev);
Expand Down Expand Up @@ -407,6 +412,8 @@ struct pci_dn * handle_eeh_events (struct eeh_event *event)

if (rc)
result = PCI_ERS_RESULT_NEED_RESET;
else
result = PCI_ERS_RESULT_RECOVERED;
}

/* If any device has a hard failure, then shut off everything. */
Expand Down

0 comments on commit d0e7034

Please sign in to comment.