|
@@ -57,7 +57,7 @@ static int eeh_event_handler(void * dummy)
|
|
|
{
|
|
|
unsigned long flags;
|
|
|
struct eeh_event *event;
|
|
|
- struct eeh_dev *edev;
|
|
|
+ struct eeh_pe *pe;
|
|
|
|
|
|
set_task_comm(current, "eehd");
|
|
|
|
|
@@ -76,28 +76,23 @@ static int eeh_event_handler(void * dummy)
|
|
|
|
|
|
/* Serialize processing of EEH events */
|
|
|
mutex_lock(&eeh_event_mutex);
|
|
|
- edev = event->edev;
|
|
|
- eeh_mark_slot(eeh_dev_to_of_node(edev), EEH_MODE_RECOVERING);
|
|
|
-
|
|
|
- printk(KERN_INFO "EEH: Detected PCI bus error on device %s\n",
|
|
|
- eeh_pci_name(edev->pdev));
|
|
|
+ pe = event->pe;
|
|
|
+ eeh_pe_state_mark(pe, EEH_PE_RECOVERING);
|
|
|
+ pr_info("EEH: Detected PCI bus error on PHB#%d-PE#%x\n",
|
|
|
+ pe->phb->global_number, pe->addr);
|
|
|
|
|
|
set_current_state(TASK_INTERRUPTIBLE); /* Don't add to load average */
|
|
|
- edev = handle_eeh_events(event);
|
|
|
-
|
|
|
- if (edev) {
|
|
|
- eeh_clear_slot(eeh_dev_to_of_node(edev), EEH_MODE_RECOVERING);
|
|
|
- pci_dev_put(edev->pdev);
|
|
|
- }
|
|
|
+ handle_eeh_events(event);
|
|
|
+ eeh_pe_state_clear(pe, EEH_PE_RECOVERING);
|
|
|
|
|
|
kfree(event);
|
|
|
mutex_unlock(&eeh_event_mutex);
|
|
|
|
|
|
/* If there are no new errors after an hour, clear the counter. */
|
|
|
- if (edev && edev->freeze_count>0) {
|
|
|
+ if (pe && pe->freeze_count > 0) {
|
|
|
msleep_interruptible(3600*1000);
|
|
|
- if (edev->freeze_count>0)
|
|
|
- edev->freeze_count--;
|
|
|
+ if (pe->freeze_count > 0)
|
|
|
+ pe->freeze_count--;
|
|
|
|
|
|
}
|
|
|
|