Merge remote-tracking branch 'pci/pci/gavin-window-alignment' into next
[firefly-linux-kernel-4.4.55.git] / arch / powerpc / platforms / pseries / eeh_event.c
index fb506317ebb09141716d0d9bfe068fe7f953221d..51faaac8abe6c401636326deebd59f4d12457b28 100644 (file)
@@ -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);
-       }
+       eeh_handle_event(pe);
+       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--;
 
        }
 
@@ -119,36 +114,23 @@ static void eeh_thread_launcher(struct work_struct *dummy)
 
 /**
  * eeh_send_failure_event - Generate a PCI error event
- * @edev: EEH device
+ * @pe: EEH PE
  *
  * This routine can be called within an interrupt context;
  * the actual event will be delivered in a normal context
  * (from a workqueue).
  */
-int eeh_send_failure_event(struct eeh_dev *edev)
+int eeh_send_failure_event(struct eeh_pe *pe)
 {
        unsigned long flags;
        struct eeh_event *event;
-       struct device_node *dn = eeh_dev_to_of_node(edev);
-       const char *location;
-
-       if (!mem_init_done) {
-               printk(KERN_ERR "EEH: event during early boot not handled\n");
-               location = of_get_property(dn, "ibm,loc-code", NULL);
-               printk(KERN_ERR "EEH: device node = %s\n", dn->full_name);
-               printk(KERN_ERR "EEH: PCI location = %s\n", location);
-               return 1;
-       }
-       event = kmalloc(sizeof(*event), GFP_ATOMIC);
-       if (event == NULL) {
-               printk(KERN_ERR "EEH: out of memory, event not handled\n");
-               return 1;
-       }
-
-       if (edev->pdev)
-               pci_dev_get(edev->pdev);
 
-       event->edev = edev;
+       event = kzalloc(sizeof(*event), GFP_ATOMIC);
+       if (!event) {
+               pr_err("EEH: out of memory, event not handled\n");
+               return -ENOMEM;
+       }
+       event->pe = pe;
 
        /* We may or may not be called in an interrupt context */
        spin_lock_irqsave(&eeh_eventlist_lock, flags);