diff options
-rw-r--r-- | drivers/ata/libata-eh.c | 30 | ||||
-rw-r--r-- | include/linux/libata.h | 5 |
2 files changed, 21 insertions, 14 deletions
diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c index 8219e2d71045..daa2f74f73c8 100644 --- a/drivers/ata/libata-eh.c +++ b/drivers/ata/libata-eh.c | |||
@@ -358,7 +358,7 @@ enum scsi_eh_timer_return ata_scsi_timed_out(struct scsi_cmnd *cmd) | |||
358 | void ata_scsi_error(struct Scsi_Host *host) | 358 | void ata_scsi_error(struct Scsi_Host *host) |
359 | { | 359 | { |
360 | struct ata_port *ap = ata_shost_to_port(host); | 360 | struct ata_port *ap = ata_shost_to_port(host); |
361 | int i, repeat_cnt = ATA_EH_MAX_REPEAT; | 361 | int i; |
362 | unsigned long flags; | 362 | unsigned long flags; |
363 | 363 | ||
364 | DPRINTK("ENTER\n"); | 364 | DPRINTK("ENTER\n"); |
@@ -424,6 +424,9 @@ void ata_scsi_error(struct Scsi_Host *host) | |||
424 | __ata_port_freeze(ap); | 424 | __ata_port_freeze(ap); |
425 | 425 | ||
426 | spin_unlock_irqrestore(ap->lock, flags); | 426 | spin_unlock_irqrestore(ap->lock, flags); |
427 | |||
428 | /* initialize eh_tries */ | ||
429 | ap->eh_tries = ATA_EH_MAX_TRIES; | ||
427 | } else | 430 | } else |
428 | spin_unlock_wait(ap->lock); | 431 | spin_unlock_wait(ap->lock); |
429 | 432 | ||
@@ -468,15 +471,12 @@ void ata_scsi_error(struct Scsi_Host *host) | |||
468 | spin_lock_irqsave(ap->lock, flags); | 471 | spin_lock_irqsave(ap->lock, flags); |
469 | 472 | ||
470 | if (ap->pflags & ATA_PFLAG_EH_PENDING) { | 473 | if (ap->pflags & ATA_PFLAG_EH_PENDING) { |
471 | if (--repeat_cnt) { | 474 | if (--ap->eh_tries) { |
472 | ata_port_printk(ap, KERN_INFO, | ||
473 | "EH pending after completion, " | ||
474 | "repeating EH (cnt=%d)\n", repeat_cnt); | ||
475 | spin_unlock_irqrestore(ap->lock, flags); | 475 | spin_unlock_irqrestore(ap->lock, flags); |
476 | goto repeat; | 476 | goto repeat; |
477 | } | 477 | } |
478 | ata_port_printk(ap, KERN_ERR, "EH pending after %d " | 478 | ata_port_printk(ap, KERN_ERR, "EH pending after %d " |
479 | "tries, giving up\n", ATA_EH_MAX_REPEAT); | 479 | "tries, giving up\n", ATA_EH_MAX_TRIES); |
480 | ap->pflags &= ~ATA_PFLAG_EH_PENDING; | 480 | ap->pflags &= ~ATA_PFLAG_EH_PENDING; |
481 | } | 481 | } |
482 | 482 | ||
@@ -1778,6 +1778,7 @@ static void ata_eh_link_report(struct ata_link *link) | |||
1778 | struct ata_port *ap = link->ap; | 1778 | struct ata_port *ap = link->ap; |
1779 | struct ata_eh_context *ehc = &link->eh_context; | 1779 | struct ata_eh_context *ehc = &link->eh_context; |
1780 | const char *frozen, *desc; | 1780 | const char *frozen, *desc; |
1781 | char tries_buf[6]; | ||
1781 | int tag, nr_failed = 0; | 1782 | int tag, nr_failed = 0; |
1782 | 1783 | ||
1783 | desc = NULL; | 1784 | desc = NULL; |
@@ -1802,18 +1803,23 @@ static void ata_eh_link_report(struct ata_link *link) | |||
1802 | if (ap->pflags & ATA_PFLAG_FROZEN) | 1803 | if (ap->pflags & ATA_PFLAG_FROZEN) |
1803 | frozen = " frozen"; | 1804 | frozen = " frozen"; |
1804 | 1805 | ||
1806 | memset(tries_buf, 0, sizeof(tries_buf)); | ||
1807 | if (ap->eh_tries < ATA_EH_MAX_TRIES) | ||
1808 | snprintf(tries_buf, sizeof(tries_buf) - 1, " t%d", | ||
1809 | ap->eh_tries); | ||
1810 | |||
1805 | if (ehc->i.dev) { | 1811 | if (ehc->i.dev) { |
1806 | ata_dev_printk(ehc->i.dev, KERN_ERR, "exception Emask 0x%x " | 1812 | ata_dev_printk(ehc->i.dev, KERN_ERR, "exception Emask 0x%x " |
1807 | "SAct 0x%x SErr 0x%x action 0x%x%s\n", | 1813 | "SAct 0x%x SErr 0x%x action 0x%x%s%s\n", |
1808 | ehc->i.err_mask, link->sactive, | 1814 | ehc->i.err_mask, link->sactive, ehc->i.serror, |
1809 | ehc->i.serror, ehc->i.action, frozen); | 1815 | ehc->i.action, frozen, tries_buf); |
1810 | if (desc) | 1816 | if (desc) |
1811 | ata_dev_printk(ehc->i.dev, KERN_ERR, "%s\n", desc); | 1817 | ata_dev_printk(ehc->i.dev, KERN_ERR, "%s\n", desc); |
1812 | } else { | 1818 | } else { |
1813 | ata_link_printk(link, KERN_ERR, "exception Emask 0x%x " | 1819 | ata_link_printk(link, KERN_ERR, "exception Emask 0x%x " |
1814 | "SAct 0x%x SErr 0x%x action 0x%x%s\n", | 1820 | "SAct 0x%x SErr 0x%x action 0x%x%s%s\n", |
1815 | ehc->i.err_mask, link->sactive, | 1821 | ehc->i.err_mask, link->sactive, ehc->i.serror, |
1816 | ehc->i.serror, ehc->i.action, frozen); | 1822 | ehc->i.action, frozen, tries_buf); |
1817 | if (desc) | 1823 | if (desc) |
1818 | ata_link_printk(link, KERN_ERR, "%s\n", desc); | 1824 | ata_link_printk(link, KERN_ERR, "%s\n", desc); |
1819 | } | 1825 | } |
diff --git a/include/linux/libata.h b/include/linux/libata.h index d3defae689ca..74e034ea9016 100644 --- a/include/linux/libata.h +++ b/include/linux/libata.h | |||
@@ -293,8 +293,8 @@ enum { | |||
293 | ATA_EHI_DID_RESET = ATA_EHI_DID_SOFTRESET | ATA_EHI_DID_HARDRESET, | 293 | ATA_EHI_DID_RESET = ATA_EHI_DID_SOFTRESET | ATA_EHI_DID_HARDRESET, |
294 | ATA_EHI_RESET_MODIFIER_MASK = ATA_EHI_RESUME_LINK, | 294 | ATA_EHI_RESET_MODIFIER_MASK = ATA_EHI_RESUME_LINK, |
295 | 295 | ||
296 | /* max repeat if error condition is still set after ->error_handler */ | 296 | /* max tries if error condition is still set after ->error_handler */ |
297 | ATA_EH_MAX_REPEAT = 5, | 297 | ATA_EH_MAX_TRIES = 5, |
298 | 298 | ||
299 | /* how hard are we gonna try to probe/recover devices */ | 299 | /* how hard are we gonna try to probe/recover devices */ |
300 | ATA_PROBE_MAX_TRIES = 3, | 300 | ATA_PROBE_MAX_TRIES = 3, |
@@ -581,6 +581,7 @@ struct ata_port { | |||
581 | u32 msg_enable; | 581 | u32 msg_enable; |
582 | struct list_head eh_done_q; | 582 | struct list_head eh_done_q; |
583 | wait_queue_head_t eh_wait_q; | 583 | wait_queue_head_t eh_wait_q; |
584 | int eh_tries; | ||
584 | 585 | ||
585 | pm_message_t pm_mesg; | 586 | pm_message_t pm_mesg; |
586 | int *pm_result; | 587 | int *pm_result; |