diff options
-rw-r--r-- | drivers/scsi/libata-core.c | 6 | ||||
-rw-r--r-- | drivers/scsi/libata-eh.c | 31 | ||||
-rw-r--r-- | include/linux/libata.h | 2 |
3 files changed, 23 insertions, 16 deletions
diff --git a/drivers/scsi/libata-core.c b/drivers/scsi/libata-core.c index 73174452d1c..f368536f8e9 100644 --- a/drivers/scsi/libata-core.c +++ b/drivers/scsi/libata-core.c | |||
@@ -5447,6 +5447,7 @@ int ata_device_add(const struct ata_probe_ent *ent) | |||
5447 | } | 5447 | } |
5448 | 5448 | ||
5449 | if (ap->ops->error_handler) { | 5449 | if (ap->ops->error_handler) { |
5450 | struct ata_eh_info *ehi = &ap->eh_info; | ||
5450 | unsigned long flags; | 5451 | unsigned long flags; |
5451 | 5452 | ||
5452 | ata_port_probe(ap); | 5453 | ata_port_probe(ap); |
@@ -5454,8 +5455,9 @@ int ata_device_add(const struct ata_probe_ent *ent) | |||
5454 | /* kick EH for boot probing */ | 5455 | /* kick EH for boot probing */ |
5455 | spin_lock_irqsave(ap->lock, flags); | 5456 | spin_lock_irqsave(ap->lock, flags); |
5456 | 5457 | ||
5457 | ap->eh_info.probe_mask = (1 << ATA_MAX_DEVICES) - 1; | 5458 | ehi->probe_mask = (1 << ATA_MAX_DEVICES) - 1; |
5458 | ap->eh_info.action |= ATA_EH_SOFTRESET; | 5459 | ehi->action |= ATA_EH_SOFTRESET; |
5460 | ehi->flags |= ATA_EHI_NO_AUTOPSY | ATA_EHI_QUIET; | ||
5459 | 5461 | ||
5460 | ap->pflags |= ATA_PFLAG_LOADING; | 5462 | ap->pflags |= ATA_PFLAG_LOADING; |
5461 | ata_port_schedule_eh(ap); | 5463 | ata_port_schedule_eh(ap); |
diff --git a/drivers/scsi/libata-eh.c b/drivers/scsi/libata-eh.c index d19666c376a..1e9e73d1348 100644 --- a/drivers/scsi/libata-eh.c +++ b/drivers/scsi/libata-eh.c | |||
@@ -322,14 +322,13 @@ void ata_scsi_error(struct Scsi_Host *host) | |||
322 | /* clean up */ | 322 | /* clean up */ |
323 | spin_lock_irqsave(ap->lock, flags); | 323 | spin_lock_irqsave(ap->lock, flags); |
324 | 324 | ||
325 | if (ap->pflags & ATA_PFLAG_LOADING) { | 325 | if (ap->pflags & ATA_PFLAG_LOADING) |
326 | ap->pflags &= ~ATA_PFLAG_LOADING; | 326 | ap->pflags &= ~ATA_PFLAG_LOADING; |
327 | } else { | 327 | else if (ap->pflags & ATA_PFLAG_SCSI_HOTPLUG) |
328 | if (ap->pflags & ATA_PFLAG_SCSI_HOTPLUG) | 328 | queue_work(ata_aux_wq, &ap->hotplug_task); |
329 | queue_work(ata_aux_wq, &ap->hotplug_task); | 329 | |
330 | if (ap->pflags & ATA_PFLAG_RECOVERED) | 330 | if (ap->pflags & ATA_PFLAG_RECOVERED) |
331 | ata_port_printk(ap, KERN_INFO, "EH complete\n"); | 331 | ata_port_printk(ap, KERN_INFO, "EH complete\n"); |
332 | } | ||
333 | 332 | ||
334 | ap->pflags &= ~(ATA_PFLAG_SCSI_HOTPLUG | ATA_PFLAG_RECOVERED); | 333 | ap->pflags &= ~(ATA_PFLAG_SCSI_HOTPLUG | ATA_PFLAG_RECOVERED); |
335 | 334 | ||
@@ -759,8 +758,12 @@ static void ata_eh_about_to_do(struct ata_port *ap, struct ata_device *dev, | |||
759 | unsigned long flags; | 758 | unsigned long flags; |
760 | 759 | ||
761 | spin_lock_irqsave(ap->lock, flags); | 760 | spin_lock_irqsave(ap->lock, flags); |
761 | |||
762 | ata_eh_clear_action(dev, &ap->eh_info, action); | 762 | ata_eh_clear_action(dev, &ap->eh_info, action); |
763 | ap->pflags |= ATA_PFLAG_RECOVERED; | 763 | |
764 | if (!(ap->eh_context.i.flags & ATA_EHI_QUIET)) | ||
765 | ap->pflags |= ATA_PFLAG_RECOVERED; | ||
766 | |||
764 | spin_unlock_irqrestore(ap->lock, flags); | 767 | spin_unlock_irqrestore(ap->lock, flags); |
765 | } | 768 | } |
766 | 769 | ||
@@ -1274,6 +1277,9 @@ static void ata_eh_autopsy(struct ata_port *ap) | |||
1274 | 1277 | ||
1275 | DPRINTK("ENTER\n"); | 1278 | DPRINTK("ENTER\n"); |
1276 | 1279 | ||
1280 | if (ehc->i.flags & ATA_EHI_NO_AUTOPSY) | ||
1281 | return; | ||
1282 | |||
1277 | /* obtain and analyze SError */ | 1283 | /* obtain and analyze SError */ |
1278 | rc = sata_scr_read(ap, SCR_ERROR, &serror); | 1284 | rc = sata_scr_read(ap, SCR_ERROR, &serror); |
1279 | if (rc == 0) { | 1285 | if (rc == 0) { |
@@ -1464,7 +1470,7 @@ static int ata_eh_reset(struct ata_port *ap, int classify, | |||
1464 | struct ata_eh_context *ehc = &ap->eh_context; | 1470 | struct ata_eh_context *ehc = &ap->eh_context; |
1465 | unsigned int *classes = ehc->classes; | 1471 | unsigned int *classes = ehc->classes; |
1466 | int tries = ATA_EH_RESET_TRIES; | 1472 | int tries = ATA_EH_RESET_TRIES; |
1467 | int verbose = !(ap->pflags & ATA_PFLAG_LOADING); | 1473 | int verbose = !(ehc->i.flags & ATA_EHI_QUIET); |
1468 | unsigned int action; | 1474 | unsigned int action; |
1469 | ata_reset_fn_t reset; | 1475 | ata_reset_fn_t reset; |
1470 | int i, did_followup_srst, rc; | 1476 | int i, did_followup_srst, rc; |
@@ -1907,11 +1913,8 @@ void ata_do_eh(struct ata_port *ap, ata_prereset_fn_t prereset, | |||
1907 | ata_reset_fn_t softreset, ata_reset_fn_t hardreset, | 1913 | ata_reset_fn_t softreset, ata_reset_fn_t hardreset, |
1908 | ata_postreset_fn_t postreset) | 1914 | ata_postreset_fn_t postreset) |
1909 | { | 1915 | { |
1910 | if (!(ap->pflags & ATA_PFLAG_LOADING)) { | 1916 | ata_eh_autopsy(ap); |
1911 | ata_eh_autopsy(ap); | 1917 | ata_eh_report(ap); |
1912 | ata_eh_report(ap); | ||
1913 | } | ||
1914 | |||
1915 | ata_eh_recover(ap, prereset, softreset, hardreset, postreset); | 1918 | ata_eh_recover(ap, prereset, softreset, hardreset, postreset); |
1916 | ata_eh_finish(ap); | 1919 | ata_eh_finish(ap); |
1917 | } | 1920 | } |
diff --git a/include/linux/libata.h b/include/linux/libata.h index 2f7bbfc0c41..36938ae1254 100644 --- a/include/linux/libata.h +++ b/include/linux/libata.h | |||
@@ -260,6 +260,8 @@ enum { | |||
260 | /* ata_eh_info->flags */ | 260 | /* ata_eh_info->flags */ |
261 | ATA_EHI_HOTPLUGGED = (1 << 0), /* could have been hotplugged */ | 261 | ATA_EHI_HOTPLUGGED = (1 << 0), /* could have been hotplugged */ |
262 | ATA_EHI_RESUME_LINK = (1 << 1), /* need to resume link */ | 262 | ATA_EHI_RESUME_LINK = (1 << 1), /* need to resume link */ |
263 | ATA_EHI_NO_AUTOPSY = (1 << 2), /* no autopsy */ | ||
264 | ATA_EHI_QUIET = (1 << 3), /* be quiet */ | ||
263 | 265 | ||
264 | ATA_EHI_DID_RESET = (1 << 16), /* already reset this port */ | 266 | ATA_EHI_DID_RESET = (1 << 16), /* already reset this port */ |
265 | 267 | ||