]> err.no Git - linux-2.6/blobdiff - drivers/scsi/libata-eh.c
[PATCH] ahci: convert to new probing mechanism and add hotplug support
[linux-2.6] / drivers / scsi / libata-eh.c
index 733dfa532977e7e4f91e5bff989428305ff3b593..30a83a57a12f2d6a0ffb88f951004f9d5711bb96 100644 (file)
@@ -46,6 +46,7 @@
 #include "libata.h"
 
 static void __ata_port_freeze(struct ata_port *ap);
+static void ata_eh_finish(struct ata_port *ap);
 
 static void ata_ering_record(struct ata_ering *ering, int is_io,
                             unsigned int err_mask)
@@ -242,8 +243,11 @@ void ata_scsi_error(struct Scsi_Host *host)
 
                spin_unlock_irqrestore(hs_lock, flags);
 
-               /* invoke EH */
-               ap->ops->error_handler(ap);
+               /* invoke EH.  if unloading, just finish failed qcs */
+               if (!(ap->flags & ATA_FLAG_UNLOADING))
+                       ap->ops->error_handler(ap);
+               else
+                       ata_eh_finish(ap);
 
                /* Exception might have happend after ->error_handler
                 * recovered the port but before this point.  Repeat
@@ -287,11 +291,14 @@ void ata_scsi_error(struct Scsi_Host *host)
        /* clean up */
        spin_lock_irqsave(hs_lock, flags);
 
-       if (ap->flags & ATA_FLAG_SCSI_HOTPLUG)
-               queue_work(ata_aux_wq, &ap->hotplug_task);
-
-       if (ap->flags & ATA_FLAG_RECOVERED)
-               ata_port_printk(ap, KERN_INFO, "EH complete\n");
+       if (ap->flags & ATA_FLAG_LOADING) {
+               ap->flags &= ~ATA_FLAG_LOADING;
+       } else {
+               if (ap->flags & ATA_FLAG_SCSI_HOTPLUG)
+                       queue_work(ata_aux_wq, &ap->hotplug_task);
+               if (ap->flags & ATA_FLAG_RECOVERED)
+                       ata_port_printk(ap, KERN_INFO, "EH complete\n");
+       }
 
        ap->flags &= ~(ATA_FLAG_SCSI_HOTPLUG | ATA_FLAG_RECOVERED);
 
@@ -1367,6 +1374,7 @@ static int ata_eh_reset(struct ata_port *ap, int classify,
        struct ata_eh_context *ehc = &ap->eh_context;
        unsigned int *classes = ehc->classes;
        int tries = ATA_EH_RESET_TRIES;
+       int verbose = !(ap->flags & ATA_FLAG_LOADING);
        unsigned int action;
        ata_reset_fn_t reset;
        int i, did_followup_srst, rc;
@@ -1414,8 +1422,10 @@ static int ata_eh_reset(struct ata_port *ap, int classify,
        }
 
  retry:
-       ata_port_printk(ap, KERN_INFO, "%s resetting port\n",
-                       reset == softreset ? "soft" : "hard");
+       /* shut up during boot probing */
+       if (verbose)
+               ata_port_printk(ap, KERN_INFO, "%s resetting port\n",
+                               reset == softreset ? "soft" : "hard");
 
        /* reset */
        ata_eh_about_to_do(ap, ATA_EH_RESET_MASK);
@@ -1799,8 +1809,11 @@ void ata_do_eh(struct ata_port *ap, ata_prereset_fn_t prereset,
               ata_reset_fn_t softreset, ata_reset_fn_t hardreset,
               ata_postreset_fn_t postreset)
 {
-       ata_eh_autopsy(ap);
-       ata_eh_report(ap);
+       if (!(ap->flags & ATA_FLAG_LOADING)) {
+               ata_eh_autopsy(ap);
+               ata_eh_report(ap);
+       }
+
        ata_eh_recover(ap, prereset, softreset, hardreset, postreset);
        ata_eh_finish(ap);
 }