diff options
author | Alexander Yurchenko <grange@cvs.openbsd.org> | 2002-12-30 21:50:30 +0000 |
---|---|---|
committer | Alexander Yurchenko <grange@cvs.openbsd.org> | 2002-12-30 21:50:30 +0000 |
commit | f42b75705cee14f2b28c309ad80c9f9924d0771b (patch) | |
tree | ac588c5b1b609712beca44d9cbc887e58ba8662d /sys | |
parent | 0b5fa73158ff68f27d1b67abfcc38579b2e82ea3 (diff) |
Add new parameter to scsi_test_unit_ready(): retries number.
Use increased retries number and don't ignore SCSI_IGNORE_NOT_READY
when call scsi_test_unit_ready() for cd-rom, this makes system wait
if drive is loading media.
Tested by millert@ and fgsch@; some input and ok from krw@.
Problem reported by The lord of the CD-writers
Igor Grabin <violent@death.kiev.ua>.
Diffstat (limited to 'sys')
-rw-r--r-- | sys/scsi/cd.c | 13 | ||||
-rw-r--r-- | sys/scsi/ch.c | 3 | ||||
-rw-r--r-- | sys/scsi/scsi_base.c | 7 | ||||
-rw-r--r-- | sys/scsi/scsiconf.c | 6 | ||||
-rw-r--r-- | sys/scsi/scsiconf.h | 10 | ||||
-rw-r--r-- | sys/scsi/sd.c | 3 | ||||
-rw-r--r-- | sys/scsi/ss.c | 4 | ||||
-rw-r--r-- | sys/scsi/st.c | 10 |
8 files changed, 35 insertions, 21 deletions
diff --git a/sys/scsi/cd.c b/sys/scsi/cd.c index 251fa6144b3..01e107195f9 100644 --- a/sys/scsi/cd.c +++ b/sys/scsi/cd.c @@ -1,4 +1,4 @@ -/* $OpenBSD: cd.c,v 1.64 2002/06/09 00:01:49 art Exp $ */ +/* $OpenBSD: cd.c,v 1.65 2002/12/30 21:50:28 grange Exp $ */ /* $NetBSD: cd.c,v 1.100 1997/04/02 02:29:30 mycroft Exp $ */ /* @@ -353,10 +353,13 @@ cdopen(dev, flag, fmt, p) goto bad3; } } else { - /* Check that it is still responding and ok. */ - error = scsi_test_unit_ready(sc_link, - SCSI_IGNORE_ILLEGAL_REQUEST | - SCSI_IGNORE_MEDIA_CHANGE | SCSI_IGNORE_NOT_READY); + /* + * Check that it is still responding and ok. + * Drive can be in progress of loading media so use + * increased retries number and don't ignore NOT_READY. + */ + error = scsi_test_unit_ready(sc_link, TEST_READY_RETRIES_CD, + SCSI_IGNORE_ILLEGAL_REQUEST | SCSI_IGNORE_MEDIA_CHANGE); if (error) { if (part != RAW_PART || fmt != S_IFCHR) goto bad3; diff --git a/sys/scsi/ch.c b/sys/scsi/ch.c index c780fcf239a..112b5c3e798 100644 --- a/sys/scsi/ch.c +++ b/sys/scsi/ch.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ch.c,v 1.13 2002/10/17 17:47:24 mickey Exp $ */ +/* $OpenBSD: ch.c,v 1.14 2002/12/30 21:50:28 grange Exp $ */ /* $NetBSD: ch.c,v 1.26 1997/02/21 22:06:52 thorpej Exp $ */ /* @@ -205,6 +205,7 @@ chopen(dev, flags, fmt, p) * loaded in the drive. */ error = scsi_test_unit_ready(sc->sc_link, + TEST_READY_RETRIES_DEFAULT, SCSI_IGNORE_NOT_READY|SCSI_IGNORE_MEDIA_CHANGE); if (error) goto bad; diff --git a/sys/scsi/scsi_base.c b/sys/scsi/scsi_base.c index 2b2b3dcfc4c..7f400f5ac79 100644 --- a/sys/scsi/scsi_base.c +++ b/sys/scsi/scsi_base.c @@ -1,4 +1,4 @@ -/* $OpenBSD: scsi_base.c,v 1.38 2002/11/30 18:46:56 nate Exp $ */ +/* $OpenBSD: scsi_base.c,v 1.39 2002/12/30 21:50:28 grange Exp $ */ /* $NetBSD: scsi_base.c,v 1.43 1997/04/02 02:29:36 mycroft Exp $ */ /* @@ -247,8 +247,9 @@ scsi_size(sc_link, flags) * Get scsi driver to send a "are you ready?" command */ int -scsi_test_unit_ready(sc_link, flags) +scsi_test_unit_ready(sc_link, retries, flags) struct scsi_link *sc_link; + int retries; int flags; { struct scsi_test_unit_ready scsi_cmd; @@ -257,7 +258,7 @@ scsi_test_unit_ready(sc_link, flags) scsi_cmd.opcode = TEST_UNIT_READY; return scsi_scsi_cmd(sc_link, (struct scsi_generic *) &scsi_cmd, - sizeof(scsi_cmd), 0, 0, 5, 10000, NULL, flags); + sizeof(scsi_cmd), 0, 0, retries, 10000, NULL, flags); } /* diff --git a/sys/scsi/scsiconf.c b/sys/scsi/scsiconf.c index 2973c5c299a..dabdb3f2ef2 100644 --- a/sys/scsi/scsiconf.c +++ b/sys/scsi/scsiconf.c @@ -1,4 +1,4 @@ -/* $OpenBSD: scsiconf.c,v 1.69 2002/09/04 23:11:10 tdeval Exp $ */ +/* $OpenBSD: scsiconf.c,v 1.70 2002/12/30 21:50:28 grange Exp $ */ /* $NetBSD: scsiconf.c,v 1.57 1996/05/02 01:09:01 neil Exp $ */ /* @@ -802,7 +802,7 @@ scsi_probedev(scsi, target, lun) sc_link->flags |= scsidebug_level; #endif /* SCSIDEBUG */ - (void) scsi_test_unit_ready(sc_link, + (void) scsi_test_unit_ready(sc_link, TEST_READY_RETRIES_DEFAULT, scsi_autoconf | SCSI_IGNORE_ILLEGAL_REQUEST | SCSI_IGNORE_NOT_READY | SCSI_IGNORE_MEDIA_CHANGE); #ifdef SCSI_2_DEF @@ -932,7 +932,7 @@ scsi_probedev(scsi, target, lun) * any messages generated by config_attach() do not have * negotiation messages inserted into their midst. */ - (void) scsi_test_unit_ready(sc_link, + (void) scsi_test_unit_ready(sc_link, TEST_READY_RETRIES_DEFAULT, scsi_autoconf | SCSI_IGNORE_ILLEGAL_REQUEST | SCSI_IGNORE_NOT_READY | SCSI_IGNORE_MEDIA_CHANGE); config_attach((struct device *)scsi, cf, &sa, scsibusprint); diff --git a/sys/scsi/scsiconf.h b/sys/scsi/scsiconf.h index 85be0891e7b..b317359fde2 100644 --- a/sys/scsi/scsiconf.h +++ b/sys/scsi/scsiconf.h @@ -1,4 +1,4 @@ -/* $OpenBSD: scsiconf.h,v 1.35 2002/08/03 08:55:35 pvalchev Exp $ */ +/* $OpenBSD: scsiconf.h,v 1.36 2002/12/30 21:50:28 grange Exp $ */ /* $NetBSD: scsiconf.h,v 1.35 1997/04/02 02:29:38 mycroft Exp $ */ /* @@ -309,6 +309,12 @@ struct scsi_xfer { #define XS_SHORTSENSE 6 /* Check the ATAPI sense for the error */ #define XS_RESET 8 /* bus was reset; possible retry command */ +/* + * Possible retries numbers for scsi_test_unit_ready() + */ +#define TEST_READY_RETRIES_DEFAULT 5 +#define TEST_READY_RETRIES_CD 10 + caddr_t scsi_inqmatch(struct scsi_inquiry_data *, caddr_t, int, int, int *); @@ -318,7 +324,7 @@ struct scsi_xfer * void scsi_free_xs(struct scsi_xfer *, int); int scsi_execute_xs(struct scsi_xfer *); u_long scsi_size(struct scsi_link *, int); -int scsi_test_unit_ready(struct scsi_link *, int); +int scsi_test_unit_ready(struct scsi_link *, int, int); int scsi_change_def(struct scsi_link *, int); int scsi_inquire(struct scsi_link *, struct scsi_inquiry_data *, int); int scsi_prevent(struct scsi_link *, int, int); diff --git a/sys/scsi/sd.c b/sys/scsi/sd.c index 1c30de210f1..bfbb1e7dec8 100644 --- a/sys/scsi/sd.c +++ b/sys/scsi/sd.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sd.c,v 1.55 2002/09/04 23:07:28 tdeval Exp $ */ +/* $OpenBSD: sd.c,v 1.56 2002/12/30 21:50:29 grange Exp $ */ /* $NetBSD: sd.c,v 1.111 1997/04/02 02:29:41 mycroft Exp $ */ /*- @@ -390,6 +390,7 @@ sdopen(dev, flag, fmt, p) } else { /* Check that it is still responding and ok. */ error = scsi_test_unit_ready(sc_link, + TEST_READY_RETRIES_DEFAULT, SCSI_IGNORE_ILLEGAL_REQUEST | SCSI_IGNORE_MEDIA_CHANGE | SCSI_IGNORE_NOT_READY); diff --git a/sys/scsi/ss.c b/sys/scsi/ss.c index fb100c70916..0b5e6cb4188 100644 --- a/sys/scsi/ss.c +++ b/sys/scsi/ss.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ss.c,v 1.46 2002/06/09 00:05:57 art Exp $ */ +/* $OpenBSD: ss.c,v 1.47 2002/12/30 21:50:29 grange Exp $ */ /* $NetBSD: ss.c,v 1.10 1996/05/05 19:52:55 christos Exp $ */ /* @@ -436,7 +436,7 @@ ssopen(dev, flag, mode, p) * consider paper to be a changeable media * */ - error = scsi_test_unit_ready(sc_link, + error = scsi_test_unit_ready(sc_link, TEST_READY_RETRIES_DEFAULT, SCSI_IGNORE_MEDIA_CHANGE | SCSI_IGNORE_ILLEGAL_REQUEST | (ssmode == MODE_CONTROL ? SCSI_IGNORE_NOT_READY : 0)); if (error) diff --git a/sys/scsi/st.c b/sys/scsi/st.c index bb7ce7a81fb..13e84f50947 100644 --- a/sys/scsi/st.c +++ b/sys/scsi/st.c @@ -1,4 +1,4 @@ -/* $OpenBSD: st.c,v 1.32 2002/06/09 00:05:57 art Exp $ */ +/* $OpenBSD: st.c,v 1.33 2002/12/30 21:50:29 grange Exp $ */ /* $NetBSD: st.c,v 1.71 1997/02/21 23:03:49 thorpej Exp $ */ /* @@ -401,7 +401,7 @@ stattach(parent, self, aux) */ printf("\n"); printf("%s: %s", st->sc_dev.dv_xname, st->quirkdata ? "rogue, " : ""); - if (scsi_test_unit_ready(sc_link, + if (scsi_test_unit_ready(sc_link, TEST_READY_RETRIES_DEFAULT, scsi_autoconf | SCSI_SILENT | SCSI_IGNORE_MEDIA_CHANGE) || st_mode_sense(st, scsi_autoconf | SCSI_SILENT | SCSI_IGNORE_MEDIA_CHANGE)) @@ -530,7 +530,8 @@ stopen(dev, flags, mode, p) /* * Catch any unit attention errors. */ - error = scsi_test_unit_ready(sc_link, SCSI_IGNORE_MEDIA_CHANGE | + error = scsi_test_unit_ready(sc_link, TEST_READY_RETRIES_DEFAULT, + SCSI_IGNORE_MEDIA_CHANGE | (stmode == CTLMODE ? SCSI_IGNORE_NOT_READY : 0)); if (error) goto bad; @@ -656,7 +657,8 @@ st_mount_tape(dev, flags) * these after doing a Load instruction. * (noteably some DAT drives) */ - scsi_test_unit_ready(sc_link, SCSI_SILENT); /* XXX */ + /* XXX */ + scsi_test_unit_ready(sc_link, TEST_READY_RETRIES_DEFAULT, SCSI_SILENT); /* * Some devices can't tell you much until they have been |