summaryrefslogtreecommitdiffstats
path: root/sys/dev/ata/ata-lowlevel.c
diff options
context:
space:
mode:
authormav <mav@FreeBSD.org>2010-11-06 19:11:49 +0000
committermav <mav@FreeBSD.org>2010-11-06 19:11:49 +0000
commitef5448bdd85a591b19ea7964549b30d897d32037 (patch)
tree4f6b136f80602bf83c7195428490690df6d0367d /sys/dev/ata/ata-lowlevel.c
parent5fd0b74a4c9151f623761f2b995f59a8e38f320e (diff)
downloadFreeBSD-src-ef5448bdd85a591b19ea7964549b30d897d32037.zip
FreeBSD-src-ef5448bdd85a591b19ea7964549b30d897d32037.tar.gz
Mark command submission timeouts as timeouts. This should trigger device
resets and increase chances of getting device back again.
Diffstat (limited to 'sys/dev/ata/ata-lowlevel.c')
-rw-r--r--sys/dev/ata/ata-lowlevel.c21
1 files changed, 13 insertions, 8 deletions
diff --git a/sys/dev/ata/ata-lowlevel.c b/sys/dev/ata/ata-lowlevel.c
index 3ef31cf..2234efb 100644
--- a/sys/dev/ata/ata-lowlevel.c
+++ b/sys/dev/ata/ata-lowlevel.c
@@ -672,7 +672,8 @@ ata_generic_command(struct ata_request *request)
/* ready to issue command ? */
if (ata_wait(ch, request->unit, 0) < 0) {
device_printf(request->parent, "timeout waiting to issue command\n");
- return -1;
+ request->flags |= ATA_R_TIMEOUT;
+ return (-1);
}
/* enable interrupt */
@@ -697,13 +698,16 @@ ata_generic_command(struct ata_request *request)
/* command interrupt device ? just return and wait for interrupt */
if (request->flags & ATA_R_ATAPI_INTR)
- return 0;
+ return (0);
/* command processed ? */
res = ata_wait(ch, request->unit, 0);
if (res != 0) {
- if (res < 0)
- device_printf(request->parent, "timeout waiting for PACKET command\n");
+ if (res < 0) {
+ device_printf(request->parent,
+ "timeout waiting for PACKET command\n");
+ request->flags |= ATA_R_TIMEOUT;
+ }
return (-1);
}
/* wait for ready to write ATAPI command block */
@@ -717,9 +721,10 @@ ata_generic_command(struct ata_request *request)
DELAY(20);
}
if (timeout <= 0) {
- device_printf(request->parent, "timeout waiting for ATAPI ready\n");
- request->result = EIO;
- return -1;
+ device_printf(request->parent,
+ "timeout waiting for ATAPI ready\n");
+ request->flags |= ATA_R_TIMEOUT;
+ return (-1);
}
/* this seems to be needed for some (slow) devices */
@@ -735,7 +740,7 @@ ata_generic_command(struct ata_request *request)
/* issue command to controller */
ATA_IDX_OUTB(ch, ATA_COMMAND, request->u.ata.command);
}
- return 0;
+ return (0);
}
static void
OpenPOWER on IntegriCloud