function);
 
        if (rc)
-               printk(KERN_WARNING "EEH: Cannot enable function %d, err=%d dn=%s\n",
+               printk(KERN_WARNING "EEH: Unexpected state change %d, err=%d dn=%s\n",
                        function, rc, pdn->node->full_name);
 
+       rc = eeh_wait_for_slot_status (pdn, PCI_BUS_RESET_WAIT_MSEC);
+       if ((rc == 4) && (function == EEH_THAW_MMIO))
+               return 0;
+
        return rc;
 }
 
 
 /* The longest amount of time to wait for a pci device
  * to come back on line, in seconds.
  */
-#define MAX_WAIT_FOR_RECOVERY 15
+#define MAX_WAIT_FOR_RECOVERY 150
 
 struct pci_dn * handle_eeh_events (struct eeh_event *event)
 {
        if (result == PCI_ERS_RESULT_CAN_RECOVER) {
                rc = rtas_pci_enable(frozen_pdn, EEH_THAW_MMIO);
 
+               if (rc < 0)
+                       goto hard_fail;
                if (rc) {
                        result = PCI_ERS_RESULT_NEED_RESET;
                } else {
        if (result == PCI_ERS_RESULT_CAN_RECOVER) {
                rc = rtas_pci_enable(frozen_pdn, EEH_THAW_DMA);
 
+               if (rc < 0)
+                       goto hard_fail;
                if (rc)
                        result = PCI_ERS_RESULT_NEED_RESET;
                else