diff options
author | Alan Cox <alan@lxorguk.ukuu.org.uk> | 2006-06-28 04:27:01 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-06-28 14:59:06 -0700 |
commit | da574af755bcb1d604e01feadf2a8c31b364447c (patch) | |
tree | de8548adf6ea7205314f0813afb3fb83a9e7da6a | |
parent | 2930d1bed7ffea3062e43b8acdeb9e0587bfc6a9 (diff) | |
download | op-kernel-dev-da574af755bcb1d604e01feadf2a8c31b364447c.zip op-kernel-dev-da574af755bcb1d604e01feadf2a8c31b364447c.tar.gz |
[PATCH] ide: fix error handling for drives which clear the FIFO on error
If the controller FIFO cleared automatically on error we must not try
and drain it as this will hang some chips.
Based in concept on a broken patch from -mm some while back
Signed-off-by: Alan Cox <alan@redhat.com>
Cc: Sergei Shtylyov <sshtylyov@ru.mvista.com>
Cc: Bartlomiej Zolnierkiewicz <B.Zolnierkiewicz@elka.pw.edu.pl>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r-- | drivers/ide/ide-io.c | 2 | ||||
-rw-r--r-- | include/linux/ide.h | 1 |
2 files changed, 2 insertions, 1 deletions
diff --git a/drivers/ide/ide-io.c b/drivers/ide/ide-io.c index 935cb25..26ceab1 100644 --- a/drivers/ide/ide-io.c +++ b/drivers/ide/ide-io.c @@ -505,7 +505,7 @@ static ide_startstop_t ide_ata_error(ide_drive_t *drive, struct request *rq, u8 } } - if ((stat & DRQ_STAT) && rq_data_dir(rq) == READ) + if ((stat & DRQ_STAT) && rq_data_dir(rq) == READ && hwif->err_stops_fifo == 0) try_to_flush_leftover_data(drive); if (hwif->INB(IDE_STATUS_REG) & (BUSY_STAT|DRQ_STAT)) diff --git a/include/linux/ide.h b/include/linux/ide.h index ef7bef2..0c10016 100644 --- a/include/linux/ide.h +++ b/include/linux/ide.h @@ -793,6 +793,7 @@ typedef struct hwif_s { unsigned auto_poll : 1; /* supports nop auto-poll */ unsigned sg_mapped : 1; /* sg_table and sg_nents are ready */ unsigned no_io_32bit : 1; /* 1 = can not do 32-bit IO ops */ + unsigned err_stops_fifo : 1; /* 1=data FIFO is cleared by an error */ struct device gendev; struct completion gendev_rel_comp; /* To deal with device release() */ |