summaryrefslogtreecommitdiff
path: root/sys/scsi
diff options
context:
space:
mode:
Diffstat (limited to 'sys/scsi')
-rw-r--r--sys/scsi/cd_scsi.c44
-rw-r--r--sys/scsi/ch.c33
-rw-r--r--sys/scsi/scsi_base.c59
-rw-r--r--sys/scsi/scsiconf.h6
-rw-r--r--sys/scsi/sd_scsi.c41
-rw-r--r--sys/scsi/ss_mustek.c12
-rw-r--r--sys/scsi/ss_mustek.h10
-rw-r--r--sys/scsi/st.c32
8 files changed, 95 insertions, 142 deletions
diff --git a/sys/scsi/cd_scsi.c b/sys/scsi/cd_scsi.c
index a423823d0b6..b148d4b15d8 100644
--- a/sys/scsi/cd_scsi.c
+++ b/sys/scsi/cd_scsi.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cd_scsi.c,v 1.5 2004/05/09 14:08:11 krw Exp $ */
+/* $OpenBSD: cd_scsi.c,v 1.6 2005/04/05 12:13:16 krw Exp $ */
/* $NetBSD: cd_scsi.c,v 1.14 1998/08/31 22:28:06 cgd Exp $ */
/*-
@@ -104,25 +104,8 @@ cd_scsibus_get_mode(cd, data, page, len, flags)
struct scsi_cd_mode_data *data;
int page, len, flags;
{
- struct scsi_mode_sense scsi_cmd;
-
-#ifdef DIAGNOSTIC
- if (len == 0 || len > 256) {
- printf ("cd_scsibus_get_mode: Mode page %02x request "
- "bad size: %d bytes\n", page, len);
- return (EINVAL);
- }
-#endif
-
- bzero(&scsi_cmd, sizeof(scsi_cmd));
- bzero(data, sizeof(*data));
- scsi_cmd.opcode = MODE_SENSE;
- scsi_cmd.page = page;
- scsi_cmd.length = len & 0xff;
- return (scsi_scsi_cmd(cd->sc_link,
- (struct scsi_generic *)&scsi_cmd, sizeof(scsi_cmd),
- (u_char *)data, len, CDRETRIES, 20000, NULL,
- SCSI_DATA_IN));
+ return scsi_mode_sense(cd->sc_link, 0, page, (u_char *)data,
+ len, flags, 20000);
}
/*
@@ -134,30 +117,13 @@ cd_scsibus_set_mode(cd, data, len, flags)
struct scsi_cd_mode_data *data;
int len, flags;
{
- struct scsi_mode_select scsi_cmd;
-
-#ifdef DIAGNOSTIC
- if (len == 0 || len > 256) {
- printf ("cd_scsibus_set_mode: Set mode request "
- "bad size: %d bytes\n", len);
- return (EINVAL);
- }
-#endif
-
- bzero(&scsi_cmd, sizeof(scsi_cmd));
- scsi_cmd.opcode = MODE_SELECT;
- scsi_cmd.byte2 |= SMS_PF;
- scsi_cmd.length = len & 0xff;
-
/* SPC-2 revision 16, section 8.3: Mode parameters
When used with the [MODE SELECT command], the data
length field is reserved. */
data->header.data_length = 0;
- return (scsi_scsi_cmd(cd->sc_link,
- (struct scsi_generic *)&scsi_cmd, sizeof(scsi_cmd),
- (u_char *)data, len, CDRETRIES, 20000, NULL,
- SCSI_DATA_OUT));
+ return scsi_mode_select(cd->sc_link, SMS_PF, (u_char *)data, len, flags,
+ 20000);
}
int
diff --git a/sys/scsi/ch.c b/sys/scsi/ch.c
index 024c690160b..45e8bcf0324 100644
--- a/sys/scsi/ch.c
+++ b/sys/scsi/ch.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ch.c,v 1.17 2004/11/30 19:28:36 krw Exp $ */
+/* $OpenBSD: ch.c,v 1.18 2005/04/05 12:13:16 krw Exp $ */
/* $NetBSD: ch.c,v 1.26 1997/02/21 22:06:52 thorpej Exp $ */
/*
@@ -609,11 +609,10 @@ ch_getelemstatus(sc, first, count, data, datalen)
* softc.
*/
int
-ch_get_params(sc, scsiflags)
+ch_get_params(sc, flags)
struct ch_softc *sc;
- int scsiflags;
+ int flags;
{
- struct scsi_mode_sense cmd;
struct scsi_mode_sense_data {
struct scsi_mode_header header;
union {
@@ -626,17 +625,10 @@ ch_get_params(sc, scsiflags)
u_int8_t *moves, *exchanges;
/*
- * Grab info from the element address assignment page.
+ * Grab info from the element address assignment page (0x1d).
*/
- bzero(&cmd, sizeof(cmd));
- bzero(&sense_data, sizeof(sense_data));
- cmd.opcode = MODE_SENSE;
- cmd.byte2 |= 0x08; /* disable block descriptors */
- cmd.page = 0x1d;
- cmd.length = (sizeof(sense_data) & 0xff);
- error = scsi_scsi_cmd(sc->sc_link, (struct scsi_generic *)&cmd,
- sizeof(cmd), (u_char *)&sense_data, sizeof(sense_data), CHRETRIES,
- 6000, NULL, scsiflags | SCSI_DATA_IN);
+ error = scsi_mode_sense(sc->sc_link, SMS_DBD, 0x1d,
+ (u_char *)&sense_data, sizeof(sense_data), flags, 6000);
if (error) {
printf("%s: could not sense element address page\n",
sc->sc_dev.dv_xname);
@@ -655,17 +647,10 @@ ch_get_params(sc, scsiflags)
/* XXX ask for page trasport geom */
/*
- * Grab info from the capabilities page.
+ * Grab info from the capabilities page (0x1f).
*/
- bzero(&cmd, sizeof(cmd));
- bzero(&sense_data, sizeof(sense_data));
- cmd.opcode = MODE_SENSE;
- cmd.byte2 |= 0x08; /* disable block descriptors */
- cmd.page = 0x1f;
- cmd.length = (sizeof(sense_data) & 0xff);
- error = scsi_scsi_cmd(sc->sc_link, (struct scsi_generic *)&cmd,
- sizeof(cmd), (u_char *)&sense_data, sizeof(sense_data), CHRETRIES,
- 6000, NULL, scsiflags | SCSI_DATA_IN);
+ error = scsi_mode_sense(sc->sc_link, SMS_DBD, 0x1f,
+ (u_char *)&sense_data, sizeof(sense_data), flags, 6000);
if (error) {
printf("%s: could not sense capabilities page\n",
sc->sc_dev.dv_xname);
diff --git a/sys/scsi/scsi_base.c b/sys/scsi/scsi_base.c
index 734303ac95d..84b81b6bf5e 100644
--- a/sys/scsi/scsi_base.c
+++ b/sys/scsi/scsi_base.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: scsi_base.c,v 1.64 2005/04/01 23:34:39 krw Exp $ */
+/* $OpenBSD: scsi_base.c,v 1.65 2005/04/05 12:13:16 krw Exp $ */
/* $NetBSD: scsi_base.c,v 1.43 1997/04/02 02:29:36 mycroft Exp $ */
/*
@@ -356,6 +356,63 @@ scsi_start(sc_link, type, flags)
type == SSS_START ? 30000 : 10000, NULL, flags);
}
+int
+scsi_mode_sense(sc_link, byte2, page, data, len, flags, timeout)
+ struct scsi_link *sc_link;
+ int byte2, page, flags, timeout;
+ size_t len;
+ u_char *data;
+{
+ struct scsi_mode_sense scsi_cmd;
+ int error;
+
+ /*
+ * Make sure the sense buffer is clean before we do the mode sense, so
+ * that checks for bogus values of 0 will work in case the mode sense
+ * fails.
+ */
+ bzero(data, len);
+
+ bzero(&scsi_cmd, sizeof(scsi_cmd));
+ scsi_cmd.opcode = MODE_SENSE;
+ scsi_cmd.byte2 = byte2;
+ scsi_cmd.page = page;
+ scsi_cmd.length = len & 0xff;
+
+ error = scsi_scsi_cmd(sc_link, (struct scsi_generic *)&scsi_cmd,
+ sizeof(scsi_cmd), data, len, 4, timeout, NULL,
+ flags | SCSI_DATA_IN);
+
+ SC_DEBUG(sc_link, SDEV_DB2, ("scsi_mode_sense: page %#x, error = %d\n",
+ page, error));
+
+ return (error);
+}
+
+int
+scsi_mode_select(sc_link, byte2, data, len, flags, timeout)
+ struct scsi_link *sc_link;
+ int byte2, flags, timeout;
+ size_t len;
+ u_char *data;
+{
+ struct scsi_mode_select scsi_cmd;
+ int error;
+
+ bzero(&scsi_cmd, sizeof(scsi_cmd));
+ scsi_cmd.opcode = MODE_SELECT;
+ scsi_cmd.byte2 = byte2;
+ scsi_cmd.length = len & 0xff;
+
+ error = scsi_scsi_cmd(sc_link, (struct scsi_generic *)&scsi_cmd,
+ sizeof(scsi_cmd), data, len, 4, timeout, NULL,
+ flags | SCSI_DATA_OUT);
+
+ SC_DEBUG(sc_link, SDEV_DB2, ("scsi_mode_select: error = %d\n", error));
+
+ return (error);
+}
+
/*
* This routine is called by the scsi interrupt when the transfer is complete.
*/
diff --git a/sys/scsi/scsiconf.h b/sys/scsi/scsiconf.h
index 644fd76eec8..2fcf7e253e5 100644
--- a/sys/scsi/scsiconf.h
+++ b/sys/scsi/scsiconf.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: scsiconf.h,v 1.48 2004/11/30 19:28:37 krw Exp $ */
+/* $OpenBSD: scsiconf.h,v 1.49 2005/04/05 12:13:16 krw Exp $ */
/* $NetBSD: scsiconf.h,v 1.35 1997/04/02 02:29:38 mycroft Exp $ */
/*
@@ -330,6 +330,10 @@ int scsi_test_unit_ready(struct scsi_link *, int, int);
int scsi_inquire(struct scsi_link *, struct scsi_inquiry_data *, int);
int scsi_prevent(struct scsi_link *, int, int);
int scsi_start(struct scsi_link *, int, int);
+int scsi_mode_sense(struct scsi_link *, int, int, u_char *, size_t,
+ int, int);
+int scsi_mode_select(struct scsi_link *, int, u_char *, size_t, int,
+ int);
void scsi_done(struct scsi_xfer *);
void scsi_user_done(struct scsi_xfer *);
int scsi_scsi_cmd(struct scsi_link *, struct scsi_generic *,
diff --git a/sys/scsi/sd_scsi.c b/sys/scsi/sd_scsi.c
index e6ea2d2e9dc..4dd4b9e7203 100644
--- a/sys/scsi/sd_scsi.c
+++ b/sys/scsi/sd_scsi.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: sd_scsi.c,v 1.6 2003/06/25 02:18:35 krw Exp $ */
+/* $OpenBSD: sd_scsi.c,v 1.7 2005/04/05 12:13:16 krw Exp $ */
/* $NetBSD: sd_scsi.c,v 1.8 1998/10/08 20:21:13 thorpej Exp $ */
/*-
@@ -95,27 +95,8 @@ sd_scsibus_mode_sense(sd, scsi_sense, page, flags)
struct sd_scsibus_mode_sense_data *scsi_sense;
int page, flags;
{
- struct scsi_mode_sense scsi_cmd;
-
- /*
- * Make sure the sense buffer is clean before we do
- * the mode sense, so that checks for bogus values of
- * 0 will work in case the mode sense fails.
- */
- bzero(scsi_sense, sizeof(*scsi_sense));
-
- bzero(&scsi_cmd, sizeof(scsi_cmd));
- scsi_cmd.opcode = MODE_SENSE;
- scsi_cmd.page = page;
- scsi_cmd.length = sizeof(*scsi_sense);
- /*
- * If the command worked, use the results to fill out
- * the parameter structure
- */
- return (scsi_scsi_cmd(sd->sc_link,
- (struct scsi_generic *)&scsi_cmd, sizeof(scsi_cmd),
- (u_char *)scsi_sense, sizeof(*scsi_sense),
- SDRETRIES, 6000, NULL, flags | SCSI_DATA_IN | SCSI_SILENT));
+ return scsi_mode_sense(sd->sc_link, 0, page, (u_char *)scsi_sense,
+ sizeof(*scsi_sense), flags | SCSI_SILENT, 6000);
}
int
@@ -124,7 +105,6 @@ sd_scsibus_get_optparms(sd, dp, flags)
struct disk_parms *dp;
int flags;
{
- struct scsi_mode_sense scsi_cmd;
struct sd_scsibus_mode_sense_data scsi_sense;
int error;
@@ -137,18 +117,11 @@ sd_scsibus_get_optparms(sd, dp, flags)
* It is better to get the following params from the
* mode sense page 6 only (optical device parameter page).
* However, there are stupid optical devices which does NOT
- * support the page 6. Ghaa....
+ * support the page 6. Ask for all (0x3f) pages. Ghaa....
*/
- bzero(&scsi_cmd, sizeof(scsi_cmd));
- scsi_cmd.opcode = MODE_SENSE;
- scsi_cmd.page = 0x3f; /* all pages */
- scsi_cmd.length = sizeof(struct scsi_mode_header) +
- sizeof(struct scsi_blk_desc);
-
- if ((error = scsi_scsi_cmd(sd->sc_link,
- (struct scsi_generic *)&scsi_cmd, sizeof(scsi_cmd),
- (u_char *)&scsi_sense, sizeof(scsi_sense), SDRETRIES,
- 6000, NULL, flags | SCSI_DATA_IN)) != 0)
+ error = scsi_mode_sense(sd->sc_link, 0, 0x3f, (u_char *)&scsi_sense,
+ sizeof(scsi_sense), flags, 6000);
+ if (error != 0)
return (SDGP_RESULT_OFFLINE); /* XXX? */
dp->blksize = _3btol(scsi_sense.blk_desc.blklen);
diff --git a/sys/scsi/ss_mustek.c b/sys/scsi/ss_mustek.c
index b258b452416..aa37da6151e 100644
--- a/sys/scsi/ss_mustek.c
+++ b/sys/scsi/ss_mustek.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ss_mustek.c,v 1.9 2002/03/14 01:27:13 millert Exp $ */
+/* $OpenBSD: ss_mustek.c,v 1.10 2005/04/05 12:13:16 krw Exp $ */
/* $NetBSD: ss_mustek.c,v 1.4 1996/05/05 19:52:57 christos Exp $ */
/*
@@ -254,7 +254,6 @@ int
mustek_trigger_scanner(ss)
struct ss_softc *ss;
{
- struct mustek_mode_select_cmd mode_cmd;
struct mustek_mode_select_data mode_data;
struct mustek_set_window_cmd window_cmd;
struct mustek_set_window_data window_data;
@@ -311,10 +310,6 @@ mustek_trigger_scanner(ss)
/*
* do what it takes to actualize the mode
*/
- bzero(&mode_cmd, sizeof(mode_cmd));
- mode_cmd.opcode = MUSTEK_MODE_SELECT;
- _lto2b(sizeof(mode_data), mode_cmd.length);
-
bzero(&mode_data, sizeof(mode_data));
mode_data.mode =
MUSTEK_MODE_MASK | MUSTEK_HT_PATTERN_BUILTIN | MUSTEK_UNIT_SPEC;
@@ -341,9 +336,8 @@ mustek_trigger_scanner(ss)
SC_DEBUG(sc_link, SDEV_DB1, ("mustek_trigger_scanner: mode_select\n"));
/* send the command to the scanner */
- error = scsi_scsi_cmd(sc_link, (struct scsi_generic *) &mode_cmd,
- sizeof(mode_cmd), (u_char *) &mode_data, sizeof(mode_data),
- MUSTEK_RETRIES, 5000, NULL, SCSI_DATA_OUT);
+ error = scsi_mode_select(sc_link, 0, (u_char *)&mode_data,
+ sizeof(mode_data), 0, 5000);
if (error)
return (error);
diff --git a/sys/scsi/ss_mustek.h b/sys/scsi/ss_mustek.h
index ff5dcc7b40a..95dbc4b3107 100644
--- a/sys/scsi/ss_mustek.h
+++ b/sys/scsi/ss_mustek.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: ss_mustek.h,v 1.4 1996/05/07 09:34:33 niklas Exp $ */
+/* $OpenBSD: ss_mustek.h,v 1.5 2005/04/05 12:13:16 krw Exp $ */
/* $NetBSD: ss_mustek.h,v 1.2 1996/03/19 03:08:37 mycroft Exp $ */
/*
@@ -52,7 +52,6 @@
#define MUSTEK_SET_WINDOW 0x04 /* set image area and windows */
#define MUSTEK_READ 0x08 /* read command */
#define MUSTEK_GET_STATUS 0x0f /* image status */
-#define MUSTEK_MODE_SELECT 0x15 /* set resolution, paper length, .. */
#define MUSTEK_ADF 0x10 /* ADF and backtracking selection */
#define MUSTEK_START_STOP 0x1b /* start/stop scan */
#define MUSTEK_LUT 0x55 /* look up table download */
@@ -126,13 +125,6 @@ struct mustek_get_status_data {
u_int8_t lines[3]; /* LSB */
};
-struct mustek_mode_select_cmd {
- u_int8_t opcode; /* 0x15 */
- u_int8_t reserved[2];
- u_int8_t length[2];
- u_int8_t control;
-};
-
/*
* resolution settings:
* MFS06000CX:
diff --git a/sys/scsi/st.c b/sys/scsi/st.c
index 84efb0ca844..c7a45fa4779 100644
--- a/sys/scsi/st.c
+++ b/sys/scsi/st.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: st.c,v 1.43 2004/11/30 19:28:37 krw Exp $ */
+/* $OpenBSD: st.c,v 1.44 2005/04/05 12:13:16 krw Exp $ */
/* $NetBSD: st.c,v 1.71 1997/02/21 23:03:49 thorpej Exp $ */
/*
@@ -1429,9 +1429,8 @@ st_mode_sense(st, flags)
struct st_softc *st;
int flags;
{
- u_int scsi_sense_len;
+ size_t scsi_sense_len;
int error;
- struct scsi_mode_sense cmd;
struct scsi_sense {
struct scsi_mode_header header;
struct scsi_blk_desc blk_desc;
@@ -1442,21 +1441,10 @@ st_mode_sense(st, flags)
scsi_sense_len = 12 + st->page_0_size;
/*
- * Set up a mode sense
+ * Ask for page 0 mode sense data.
*/
- bzero(&cmd, sizeof(cmd));
- cmd.opcode = MODE_SENSE;
- cmd.length = scsi_sense_len;
-
- /*
- * do the command, but we don't need the results
- * just print them for our interest's sake, if asked,
- * or if we need it as a template for the mode select
- * store it away.
- */
- error = scsi_scsi_cmd(sc_link, (struct scsi_generic *) &cmd,
- sizeof(cmd), (u_char *) &scsi_sense, scsi_sense_len,
- ST_RETRIES, ST_CTL_TIME, NULL, flags | SCSI_DATA_IN);
+ error = scsi_mode_sense(sc_link, 0, 0, (u_char *)&scsi_sense,
+ scsi_sense_len, flags, ST_CTL_TIME);
if (error)
return error;
@@ -1490,7 +1478,6 @@ st_mode_select(st, flags)
int flags;
{
u_int scsi_select_len;
- struct scsi_mode_select cmd;
struct scsi_select {
struct scsi_mode_header header;
struct scsi_blk_desc blk_desc;
@@ -1518,10 +1505,6 @@ st_mode_select(st, flags)
/*
* Set up for a mode select
*/
- bzero(&cmd, sizeof(cmd));
- cmd.opcode = MODE_SELECT;
- cmd.length = scsi_select_len;
-
bzero(&scsi_select, scsi_select_len);
scsi_select.header.blk_desc_len = sizeof(struct scsi_blk_desc);
scsi_select.header.dev_spec &= ~SMH_DSP_BUFF_MODE;
@@ -1538,9 +1521,8 @@ st_mode_select(st, flags)
/*
* do the command
*/
- return scsi_scsi_cmd(sc_link, (struct scsi_generic *) &cmd,
- sizeof(cmd), (u_char *) &scsi_select, scsi_select_len,
- ST_RETRIES, ST_CTL_TIME, NULL, flags | SCSI_DATA_OUT);
+ return scsi_mode_select(st->sc_link, 0, (u_char *)&scsi_select,
+ scsi_select_len, flags, ST_CTL_TIME);
}
/*