aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/ata/libata-eh.c30
-rw-r--r--include/linux/libata.h5
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)
358void ata_scsi_error(struct Scsi_Host *host) 358void 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;