linux-ide.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] BIOS SATA legacy mode failure
@ 2013-09-08  6:35 Levente Kurusa
  2013-09-10  4:01 ` Robert Hancock
  0 siblings, 1 reply; 25+ messages in thread
From: Levente Kurusa @ 2013-09-08  6:35 UTC (permalink / raw)
  To: jgarzik; +Cc: linux-ide, levex

Hi,

I have been testing the Linux Kernel on a two year Toshiba NB100
netbook of mine, however when I enabled SATA compatibility/legacy mode
instead of AHCI mode in the BIOS, the kernel got stuck. I have pasted
the relevant dmesg piece along with a patch that fixes it temporarily.
What I suspect to be the cause is that the BIOS sets the device into
IDE mode, but it will report it as a SATA device and hence libata tries
to send ATA commands to it, which obviously makes it go bad. The patch
fixes it, by adding a new field to ata_device called exce_cnt, which
counts how many exceptions have occured. After three exceptions, it
automatically disables the device. Also, please note this is my first
ever patch for the kernel :-)

The following dmesg is stuck in an infinite loop.
dmesg:
ata3: lost interrupt (Status 0x50)
ata3.00: exception Emask 0x0 SAct 0x0 SErr 0x0 action 0x6 frozen
ata3.00: failed command: READ DMA
ata3.00: cmd c8/00:08:00:00:00/00:00:00:00:00/e0 tag 0 dma 4096 in
               res 40/00:00:00:00:00/00:00:00:00:00/00 Emask 0x4 (timeout)
ata3.00: status: { DRDY }
ata3: soft resetting link
ata3.00: configured for UDMA/33 (no error)
ata3.00: device reported invalid CHS sector 0
ata3: EH complete

Patch that fixes the infinite loop:
diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c
index f9476fb..eeedf80 100644
--- a/drivers/ata/libata-eh.c
+++ b/drivers/ata/libata-eh.c
@@ -2437,6 +2437,14 @@ static void ata_eh_link_report(struct ata_link *link)
                             ehc->i.action, frozen, tries_buf);
                 if (desc)
                         ata_dev_err(ehc->i.dev, "%s\n", desc);
+               ehc->i.dev->exce_cnt ++;
+               ata_dev_warn(ehc->i.dev, "Number of exceptions: %d\n", 
ehc->i.dev->exce_cnt);
+               /**
+                  * The device is failing terribly,
+                 * disable it to prevent damage.
+                 */
+               if(ehc->i.dev->exce_cnt > 2)
+                       ata_dev_disable(ehc->i.dev);
         } else {
                 ata_link_err(link, "exception Emask 0x%x "
                              "SAct 0x%x SErr 0x%x action 0x%x%s%s\n",
diff --git a/include/linux/libata.h b/include/linux/libata.h
index eae7a05..fa52ee6 100644
--- a/include/linux/libata.h
+++ b/include/linux/libata.h
@@ -660,7 +660,8 @@ struct ata_device {
         u8                      devslp_timing[ATA_LOG_DEVSLP_SIZE];

         /* error history */
-       int                     spdn_cnt;
+       int                     spdn_cnt; /* Number of speed_downs */
+       int                     exce_cnt; /* Number of exceptions that 
happenned */
         /* ering is CLEAR_END, read comment above CLEAR_END */
         struct ata_ering        ering;
  };

Regards,
Levente Kurusa

^ permalink raw reply related	[flat|nested] 25+ messages in thread

end of thread, other threads:[~2013-10-22 14:32 UTC | newest]

Thread overview: 25+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-09-08  6:35 [PATCH] BIOS SATA legacy mode failure Levente Kurusa
2013-09-10  4:01 ` Robert Hancock
2013-09-14 15:09   ` Levente Kurusa
2013-09-16  4:37     ` Robert Hancock
2013-09-17 16:47       ` Levente Kurusa
2013-09-18  1:35         ` Robert Hancock
2013-09-21  7:35           ` Levente Kurusa
2013-09-21 17:04             ` Robert Hancock
2013-09-22  7:13               ` Levente Kurusa
2013-09-25  6:31                 ` Robert Hancock
2013-09-27 13:24                   ` Levente Kurusa
2013-09-28  4:55                     ` Robert Hancock
2013-09-28 17:46                       ` Levente Kurusa
2013-09-29  1:21                         ` Robert Hancock
2013-10-01  4:25                           ` Robert Hancock
2013-10-11 16:07                             ` Levente Kurusa
2013-10-12  2:06                               ` Robert Hancock
     [not found]                                 ` <52591 681.1020001@linux.com>
2013-10-12  9:29                                 ` Levente Kurusa
2013-10-13  5:57                                   ` Robert Hancock
2013-10-13 12:02                                     ` Levente Kurusa
2013-10-16  0:16                                       ` Robert Hancock
2013-10-16 14:42                                         ` Levente Kurusa
2013-10-22  1:34                                           ` Robert Hancock
2013-10-22  2:12                                             ` Aaron Lu
2013-10-22 14:32                                               ` Levente Kurusa

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).