summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorConstantine Sapuntzakis <csapuntz@cvs.openbsd.org>1999-07-23 04:24:32 +0000
committerConstantine Sapuntzakis <csapuntz@cvs.openbsd.org>1999-07-23 04:24:32 +0000
commitc2e2054df07a0c5596c4cd58d07ddf2c89107e69 (patch)
tree941bcedff84a7285cf34e48e2d18d7e2bed257a7 /sys
parent3341789e26c103a470e9d2a06278832304fb0edb (diff)
Identify Drive may have to access media. So, wait up to 10s (in polling mode)
for Identify Drive to do its thing. This should fix the "IDENTIFY timeout" some people are seeing. ATAPI SCSI buses only have 2 targets.
Diffstat (limited to 'sys')
-rw-r--r--sys/dev/atapiscsi/atapiscsi.c21
1 files changed, 8 insertions, 13 deletions
diff --git a/sys/dev/atapiscsi/atapiscsi.c b/sys/dev/atapiscsi/atapiscsi.c
index 63e8d5a1fab..a2ff393184f 100644
--- a/sys/dev/atapiscsi/atapiscsi.c
+++ b/sys/dev/atapiscsi/atapiscsi.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: atapiscsi.c,v 1.5 1999/07/22 07:45:48 deraadt Exp $ */
+/* $OpenBSD: atapiscsi.c,v 1.6 1999/07/23 04:24:31 csapuntz Exp $ */
/*
* This code is derived from code with the copyright below.
@@ -194,6 +194,7 @@ atapiscsi_attach(parent, self, aux)
as->sc_channel = aa_link->aa_channel;
as->sc_adapterlink.adapter_softc = as;
as->sc_adapterlink.adapter_target = 7;
+ as->sc_adapterlink.adapter_buswidth = 2;
as->sc_adapterlink.adapter = &atapiscsi_switch;
as->sc_adapterlink.device = &atapiscsi_dev;
as->sc_adapterlink.openings = 1;
@@ -881,20 +882,14 @@ again:
case IDENTIFY_WAIT:
errstring = "IDENTIFY";
- if (wdcwait(chp, 0, 0, delay))
+ /* Some ATAPI devices need to try to read the media
+ before responding. Well, let's hope resets while
+ polling are few and far between */
+ if (wdcwait(chp, 0, 0, (irq == 0) ? 10000 : 0))
goto timeout;
- if (chp->ch_status & WDCS_ERR) {
- chp->ch_error = bus_space_read_1(chp->cmd_iot,
- chp->cmd_ioh,
- wd_error);
- goto error;
- }
-
- if (wdcwait(chp, WDCS_DRQ, WDCS_DRQ, 1000))
- goto timeout;
-
- if (chp->ch_status & WDCS_ERR) {
+ if (!(chp->ch_status & WDCS_DRQ) &&
+ chp->ch_status & WDCS_ERR) {
chp->ch_error = bus_space_read_1(chp->cmd_iot,
chp->cmd_ioh,
wd_error);