diff options
| author | augustss <augustss@NetBSD.org> | 2000-04-03 12:12:38 +0000 |
|---|---|---|
| committer | augustss <augustss@NetBSD.org> | 2000-04-03 12:12:38 +0000 |
| commit | dc3ce0b35e2b38e40c305ed39747ef055746f6d2 (patch) | |
| tree | 4322e1612849f2742e565b731f6c28a54cf710ca /sys/dev/usb | |
| parent | b9d50c36a70e74055a818836ba5d3561d7512f1c (diff) | |
Enable UFI protocol. Still untested in NetBSD. Used by, e.g., Y-E Data
floppies.
Diffstat (limited to 'sys/dev/usb')
| -rw-r--r-- | sys/dev/usb/umass.c | 24 |
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; |
