summaryrefslogtreecommitdiff
path: root/sys/dev
diff options
context:
space:
mode:
authoraugustss <augustss@NetBSD.org>2000-04-03 12:12:38 +0000
committeraugustss <augustss@NetBSD.org>2000-04-03 12:12:38 +0000
commitdc3ce0b35e2b38e40c305ed39747ef055746f6d2 (patch)
tree4322e1612849f2742e565b731f6c28a54cf710ca /sys/dev
parentb9d50c36a70e74055a818836ba5d3561d7512f1c (diff)
Enable UFI protocol. Still untested in NetBSD. Used by, e.g., Y-E Data
floppies.
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/usb/umass.c24
1 files changed, 18 insertions, 6 deletions
diff --git a/sys/dev/usb/umass.c b/sys/dev/usb/umass.c
index 3f94212f7c8..8f39d7778b9 100644
--- a/sys/dev/usb/umass.c
+++ b/sys/dev/usb/umass.c
@@ -1,4 +1,4 @@
-/* $NetBSD: umass.c,v 1.29 2000/04/03 03:56:49 enami Exp $ */
+/* $NetBSD: umass.c,v 1.30 2000/04/03 12:12:38 augustss Exp $ */
/*-
* Copyright (c) 1999 MAEKAWA Masahide <bishop@rr.iij4u.or.jp>,
* Nick Hibma <n_hibma@freebsd.org>
@@ -172,6 +172,8 @@ int umassdebug = 0; //UDMASS_ALL;
/* Generic definitions */
+#define UFI_PROTO_LEN 12
+
/* Direction for umass_*_transfer */
#define DIR_NONE 0
#define DIR_IN 1
@@ -1040,7 +1042,7 @@ USB_ATTACH(umass)
*/
switch (sc->proto & PROTO_COMMAND) {
case PROTO_SCSI:
- /*case PROTO_UFI:*/
+ case PROTO_UFI:
sc->u.sc_link.type = BUS_SCSI;
sc->u.sc_link.scsipi_scsi.channel = SCSI_CHANNEL_ONLY_ONE;
sc->u.sc_link.adapter_softc = sc;
@@ -3025,6 +3027,7 @@ umass_scsipi_cmd(xs)
{
struct scsipi_link *sc_link = xs->sc_link;
struct umass_softc *sc = sc_link->adapter_softc;
+ int cmdlen;
int dir;
DIF(UDMASS_UPPER, sc_link->flags |= DEBUGLEVEL);
@@ -3090,12 +3093,17 @@ umass_scsipi_cmd(xs)
goto done;
}
+ cmdlen = xs->cmdlen;
+ /* All UFI commands are 12 bytes. We'll get a few garbage bytes by extending... */
+ if (sc->proto & PROTO_UFI)
+ cmdlen = UFI_PROTO_LEN;
+
if (xs->xs_control & XS_CTL_POLL) {
/* Use sync transfer. XXX Broken! */
DPRINTF(UDMASS_SCSI, ("umass_scsi_cmd: sync dir=%d\n", dir));
sc->sc_xfer_flags = USBD_SYNCHRONOUS;
sc->sc_sync_status = USBD_INVAL;
- sc->transfer(sc, sc_link->scsipi_scsi.lun, xs->cmd, xs->cmdlen,
+ sc->transfer(sc, sc_link->scsipi_scsi.lun, xs->cmd, cmdlen,
xs->data, xs->datalen, dir, 0, xs);
sc->sc_xfer_flags = 0;
DPRINTF(UDMASS_SCSI, ("umass_scsi_cmd: done err=%d\n",
@@ -3115,8 +3123,8 @@ umass_scsipi_cmd(xs)
} else {
DPRINTF(UDMASS_SCSI, ("umass_scsi_cmd: async dir=%d, cmdlen=%d"
" datalen=%d\n",
- dir, xs->cmdlen, xs->datalen));
- sc->transfer(sc, sc_link->scsipi_scsi.lun, xs->cmd, xs->cmdlen,
+ dir, cmdlen, xs->datalen));
+ sc->transfer(sc, sc_link->scsipi_scsi.lun, xs->cmd, cmdlen,
xs->data, xs->datalen, dir, umass_scsipi_cb, xs);
return (SUCCESSFULLY_QUEUED);
}
@@ -3167,6 +3175,7 @@ umass_scsipi_cb(struct umass_softc *sc, void *priv, int residue, int status)
{
struct scsipi_xfer *xs = priv;
struct scsipi_link *sc_link = xs->sc_link;
+ int cmdlen;
int s;
DPRINTF(UDMASS_CMD,("umass_scsipi_cb: xs=%p residue=%d status=%d\n",
@@ -3188,8 +3197,11 @@ umass_scsipi_cb(struct umass_softc *sc, void *priv, int residue, int status)
SCSI_CMD_LUN_SHIFT;
sc->sc_sense_cmd.length = sizeof(xs->sense);
+ cmdlen = sizeof(sc->sc_sense_cmd);
+ if (sc->proto & PROTO_UFI)
+ cmdlen = UFI_PROTO_LEN;
sc->transfer(sc, sc_link->scsipi_scsi.lun,
- &sc->sc_sense_cmd, sizeof(sc->sc_sense_cmd),
+ &sc->sc_sense_cmd, cmdlen,
&xs->sense, sizeof(xs->sense), DIR_IN,
umass_scsipi_sense_cb, xs);
return;