}
 
                if (ap->ops->error_handler) {
+                       struct ata_eh_info *ehi = &ap->eh_info;
                        unsigned long flags;
 
                        ata_port_probe(ap);
                        /* kick EH for boot probing */
                        spin_lock_irqsave(ap->lock, flags);
 
-                       ap->eh_info.probe_mask = (1 << ATA_MAX_DEVICES) - 1;
-                       ap->eh_info.action |= ATA_EH_SOFTRESET;
+                       ehi->probe_mask = (1 << ATA_MAX_DEVICES) - 1;
+                       ehi->action |= ATA_EH_SOFTRESET;
+                       ehi->flags |= ATA_EHI_NO_AUTOPSY | ATA_EHI_QUIET;
 
                        ap->pflags |= ATA_PFLAG_LOADING;
                        ata_port_schedule_eh(ap);
 
        /* clean up */
        spin_lock_irqsave(ap->lock, flags);
 
-       if (ap->pflags & ATA_PFLAG_LOADING) {
+       if (ap->pflags & ATA_PFLAG_LOADING)
                ap->pflags &= ~ATA_PFLAG_LOADING;
-       } else {
-               if (ap->pflags & ATA_PFLAG_SCSI_HOTPLUG)
-                       queue_work(ata_aux_wq, &ap->hotplug_task);
-               if (ap->pflags & ATA_PFLAG_RECOVERED)
-                       ata_port_printk(ap, KERN_INFO, "EH complete\n");
-       }
+       else if (ap->pflags & ATA_PFLAG_SCSI_HOTPLUG)
+               queue_work(ata_aux_wq, &ap->hotplug_task);
+
+       if (ap->pflags & ATA_PFLAG_RECOVERED)
+               ata_port_printk(ap, KERN_INFO, "EH complete\n");
 
        ap->pflags &= ~(ATA_PFLAG_SCSI_HOTPLUG | ATA_PFLAG_RECOVERED);
 
        unsigned long flags;
 
        spin_lock_irqsave(ap->lock, flags);
+
        ata_eh_clear_action(dev, &ap->eh_info, action);
-       ap->pflags |= ATA_PFLAG_RECOVERED;
+
+       if (!(ap->eh_context.i.flags & ATA_EHI_QUIET))
+               ap->pflags |= ATA_PFLAG_RECOVERED;
+
        spin_unlock_irqrestore(ap->lock, flags);
 }
 
 
        DPRINTK("ENTER\n");
 
+       if (ehc->i.flags & ATA_EHI_NO_AUTOPSY)
+               return;
+
        /* obtain and analyze SError */
        rc = sata_scr_read(ap, SCR_ERROR, &serror);
        if (rc == 0) {
        struct ata_eh_context *ehc = &ap->eh_context;
        unsigned int *classes = ehc->classes;
        int tries = ATA_EH_RESET_TRIES;
-       int verbose = !(ap->pflags & ATA_PFLAG_LOADING);
+       int verbose = !(ehc->i.flags & ATA_EHI_QUIET);
        unsigned int action;
        ata_reset_fn_t reset;
        int i, did_followup_srst, rc;
               ata_reset_fn_t softreset, ata_reset_fn_t hardreset,
               ata_postreset_fn_t postreset)
 {
-       if (!(ap->pflags & ATA_PFLAG_LOADING)) {
-               ata_eh_autopsy(ap);
-               ata_eh_report(ap);
-       }
-
+       ata_eh_autopsy(ap);
+       ata_eh_report(ap);
        ata_eh_recover(ap, prereset, softreset, hardreset, postreset);
        ata_eh_finish(ap);
 }