diff options
author | 2003-11-17 21:50:13 +0000 | |
---|---|---|
committer | 2003-11-17 21:50:13 +0000 | |
commit | cf12f815a2082e9ef962456d62457be99c998ba8 (patch) | |
tree | f5c8ecc6839c8a49f5131a2e1b0d80fd202cdd6e | |
parent | aprelevka'' opens (new style) (diff) | |
download | wireguard-openbsd-cf12f815a2082e9ef962456d62457be99c998ba8.tar.xz wireguard-openbsd-cf12f815a2082e9ef962456d62457be99c998ba8.zip |
Don't wait for DRQ after issuing IDENTIFY command; instead check for DRQ
asserted after BSY is cleared in data read codepath. Solves delays in
probe.
The first version of this diff was done by costa@ a long time ago but
had some issues. This one is a partial sync with NetBSD.
ok costa@
-rw-r--r-- | sys/dev/ata/ata.c | 8 | ||||
-rw-r--r-- | sys/dev/ic/wdc.c | 14 |
2 files changed, 12 insertions, 10 deletions
diff --git a/sys/dev/ata/ata.c b/sys/dev/ata/ata.c index c9e1f08a95e..82a1afafa89 100644 --- a/sys/dev/ata/ata.c +++ b/sys/dev/ata/ata.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ata.c,v 1.21 2003/10/16 11:58:15 grange Exp $ */ +/* $OpenBSD: ata.c,v 1.22 2003/11/17 21:50:14 grange Exp $ */ /* $NetBSD: ata.c,v 1.9 1999/04/15 09:41:09 bouyer Exp $ */ /* * Copyright (c) 1998, 2001 Manuel Bouyer. All rights reserved. @@ -81,12 +81,12 @@ ata_get_params(drvp, flags, prms) if (drvp->drive_flags & DRIVE_ATA) { wdc_c.r_command = WDCC_IDENTIFY; wdc_c.r_st_bmask = WDCS_DRDY; - wdc_c.r_st_pmask = WDCS_DRQ; + wdc_c.r_st_pmask = 0; wdc_c.timeout = 3000; /* 3s */ } else if (drvp->drive_flags & DRIVE_ATAPI) { wdc_c.r_command = ATAPI_IDENTIFY_DEVICE; wdc_c.r_st_bmask = 0; - wdc_c.r_st_pmask = WDCS_DRQ; + wdc_c.r_st_pmask = 0; wdc_c.timeout = 10000; /* 10s */ } else { return CMD_ERR; @@ -168,7 +168,7 @@ ata_set_mode(drvp, mode, flags) wdc_c.r_st_pmask = 0; wdc_c.r_precomp = WDSF_SET_MODE; wdc_c.r_count = mode; - wdc_c.flags = AT_READ | flags; + wdc_c.flags = flags; wdc_c.timeout = 1000; /* 1s */ if (wdc_exec_command(drvp, &wdc_c) != WDC_COMPLETE) return CMD_AGAIN; diff --git a/sys/dev/ic/wdc.c b/sys/dev/ic/wdc.c index 77e01c68609..876e876a746 100644 --- a/sys/dev/ic/wdc.c +++ b/sys/dev/ic/wdc.c @@ -1,4 +1,4 @@ -/* $OpenBSD: wdc.c,v 1.77 2003/11/13 23:29:14 grange Exp $ */ +/* $OpenBSD: wdc.c,v 1.78 2003/11/17 21:50:13 grange Exp $ */ /* $NetBSD: wdc.c,v 1.68 1999/06/23 19:00:17 bouyer Exp $ */ @@ -1813,17 +1813,19 @@ __wdccommand_intr(chp, xfer, irq) if (irq && (xfer->c_flags & C_TIMEOU) == 0) return 0; /* IRQ was not for us */ wdc_c->flags |= AT_TIMEOU; - __wdccommand_done(chp, xfer); - WDCDEBUG_PRINT(("__wdccommand_intr returned\n"), DEBUG_INTR); - return 1; + goto out; } if (chp->wdc->cap & WDC_CAPABILITY_IRQACK) chp->wdc->irqack(chp); - - if ((wdc_c->flags & AT_READ) && (chp->ch_status & WDCS_DRQ)) { + if (wdc_c->flags & AT_READ) { + if ((chp->ch_status & WDCS_DRQ) == 0) { + wdc_c->flags |= AT_TIMEOU; + goto out; + } wdc_input_bytes(drvp, data, bcount); /* Should we wait for device to indicate idle? */ } +out: __wdccommand_done(chp, xfer); WDCDEBUG_PRINT(("__wdccommand_intr returned\n"), DEBUG_INTR); return 1; |