aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorTejun Heo <htejun@gmail.com>2007-06-10 01:26:20 -0400
committerJeff Garzik <jeff@garzik.org>2007-06-11 00:52:53 -0400
commite141d999b682cda9907179e3b843acb64c34a1d8 (patch)
tree2b9c7ebb9d01e7b335077a11a6ec982f3906dd7f /drivers
parent5acd50f641e697cb42240f278350a4f8eac9b4f5 (diff)
libata: limit post SRST nsect/lbal wait to ~100ms
After SRST, libata used to wait for nsect/lbal to be set to 1/1 for the slave device. However, some ATAPI devices don't set nsect/lbal after SRST and the wait itself isn't too useful as we're gonna wait for !BSY right after that anyway. Before reset-seq update, nsect/lbal wait failure used to be ignored and caused 30sec delay during detection. After reset-seq, all timeouts are considered error conditions making libata fail to detect such ATAPI devices. This patch limits nsect/lbal wait to around 100ms. This should give acceptable behavior to such ATAPI devices while not disturbing the heavily used code path too much. Signed-off-by: Tejun Heo <htejun@gmail.com> Signed-off-by: Jeff Garzik <jeff@garzik.org>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/ata/libata-core.c32
1 files changed, 19 insertions, 13 deletions
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c
index 76aa94f55af..047eabd7536 100644
--- a/drivers/ata/libata-core.c
+++ b/drivers/ata/libata-core.c
@@ -3061,22 +3061,28 @@ static int ata_bus_post_reset(struct ata_port *ap, unsigned int devmask,
3061 } 3061 }
3062 } 3062 }
3063 3063
3064 /* if device 1 was found in ata_devchk, wait for 3064 /* if device 1 was found in ata_devchk, wait for register
3065 * register access, then wait for BSY to clear 3065 * access briefly, then wait for BSY to clear.
3066 */ 3066 */
3067 while (dev1) { 3067 if (dev1) {
3068 u8 nsect, lbal; 3068 int i;
3069 3069
3070 ap->ops->dev_select(ap, 1); 3070 ap->ops->dev_select(ap, 1);
3071 nsect = ioread8(ioaddr->nsect_addr); 3071
3072 lbal = ioread8(ioaddr->lbal_addr); 3072 /* Wait for register access. Some ATAPI devices fail
3073 if ((nsect == 1) && (lbal == 1)) 3073 * to set nsect/lbal after reset, so don't waste too
3074 break; 3074 * much time on it. We're gonna wait for !BSY anyway.
3075 if (time_after(jiffies, deadline)) 3075 */
3076 return -EBUSY; 3076 for (i = 0; i < 2; i++) {
3077 msleep(50); /* give drive a breather */ 3077 u8 nsect, lbal;
3078 } 3078
3079 if (dev1) { 3079 nsect = ioread8(ioaddr->nsect_addr);
3080 lbal = ioread8(ioaddr->lbal_addr);
3081 if ((nsect == 1) && (lbal == 1))
3082 break;
3083 msleep(50); /* give drive a breather */
3084 }
3085
3080 rc = ata_wait_ready(ap, deadline); 3086 rc = ata_wait_ready(ap, deadline);
3081 if (rc) { 3087 if (rc) {
3082 if (rc != -ENODEV) 3088 if (rc != -ENODEV)