diff options
| author | gehenna <gehenna@NetBSD.org> | 2001-12-14 08:46:19 +0000 |
|---|---|---|
| committer | gehenna <gehenna@NetBSD.org> | 2001-12-14 08:46:19 +0000 |
| commit | 2d27ad7c731ec22a4e9d12011d9f536ca0d7c66d (patch) | |
| tree | b2b02340896370c65471d596cde3d56453224981 /sys/dev | |
| parent | 25be1c42e2497a3c4d77995bc22c904e4b79a94f (diff) | |
Define a new structure to store wire specific control methods.
The basic BBB/CBI functions are stored as members of constant structure.
When attached device, softc holds one of that constant structures.
Diffstat (limited to 'sys/dev')
| -rw-r--r-- | sys/dev/usb/umass.c | 63 | ||||
| -rw-r--r-- | sys/dev/usb/umassbus.c | 28 | ||||
| -rw-r--r-- | sys/dev/usb/umassvar.h | 38 |
3 files changed, 63 insertions, 66 deletions
diff --git a/sys/dev/usb/umass.c b/sys/dev/usb/umass.c index bec92df21f3..3f05de8f148 100644 --- a/sys/dev/usb/umass.c +++ b/sys/dev/usb/umass.c @@ -1,4 +1,4 @@ -/* $NetBSD: umass.c,v 1.74 2001/12/14 06:21:56 gehenna Exp $ */ +/* $NetBSD: umass.c,v 1.75 2001/12/14 08:46:19 gehenna Exp $ */ /*- * Copyright (c) 1999 MAEKAWA Masahide <bishop@rr.iij4u.or.jp>, * Nick Hibma <n_hibma@freebsd.org> @@ -94,7 +94,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: umass.c,v 1.74 2001/12/14 06:21:56 gehenna Exp $"); +__KERNEL_RCSID(0, "$NetBSD: umass.c,v 1.75 2001/12/14 08:46:19 gehenna Exp $"); #include "atapibus.h" @@ -177,27 +177,32 @@ Static void umass_reset(struct umass_softc *sc, transfer_cb_f cb, void *priv); #endif /* Bulk-Only related functions */ -Static void umass_bbb_reset(struct umass_softc *sc, int status); -Static void umass_bbb_transfer(struct umass_softc *sc, int lun, - void *cmd, int cmdlen, - void *data, int datalen, int dir, - u_int timeout, transfer_cb_f cb, void *priv); -Static void umass_bbb_state(usbd_xfer_handle xfer, - usbd_private_handle priv, - usbd_status err); -usbd_status umass_bbb_get_max_lun(struct umass_softc *sc, u_int8_t *maxlun); +Static void umass_bbb_transfer(struct umass_softc *, int, void *, int, void *, + int, int, u_int, umass_callback, void *); +Static void umass_bbb_reset(struct umass_softc *, int); +Static void umass_bbb_state(usbd_xfer_handle, usbd_private_handle, usbd_status); +usbd_status umass_bbb_get_max_lun(struct umass_softc *, u_int8_t *); /* CBI related functions */ -Static int umass_cbi_adsc(struct umass_softc *sc, char *buffer,int buflen, - usbd_xfer_handle xfer); -Static void umass_cbi_reset(struct umass_softc *sc, int status); -Static void umass_cbi_transfer(struct umass_softc *sc, int lun, - void *cmd, int cmdlen, - void *data, int datalen, int dir, - u_int timeout, transfer_cb_f cb, void *priv); -Static void umass_cbi_state(usbd_xfer_handle xfer, - usbd_private_handle priv, usbd_status err); +Static void umass_cbi_transfer(struct umass_softc *, int, void *, int, void *, + int, int, u_int, umass_callback, void *); +Static void umass_cbi_reset(struct umass_softc *, int); +Static void umass_cbi_state(usbd_xfer_handle, usbd_private_handle, usbd_status); + +Static int umass_cbi_adsc(struct umass_softc *, char *, int, usbd_xfer_handle); + +const struct umass_wire_methods umass_bbb_methods = { + umass_bbb_transfer, + umass_bbb_reset, + umass_bbb_state +}; + +const struct umass_wire_methods umass_cbi_methods = { + umass_cbi_transfer, + umass_cbi_reset, + umass_cbi_state +}; #ifdef UMASS_DEBUG /* General debugging functions */ @@ -667,14 +672,10 @@ USB_ATTACH(umass) /* Initialise the wire protocol specific methods */ if (sc->wire_proto == WPROTO_BBB) { - sc->reset = umass_bbb_reset; - sc->transfer = umass_bbb_transfer; - sc->state = umass_bbb_state; + sc->sc_methods = &umass_bbb_methods; } else if (sc->wire_proto == WPROTO_CBI || sc->wire_proto == WPROTO_CBI_I) { - sc->reset = umass_cbi_reset; - sc->transfer = umass_cbi_transfer; - sc->state = umass_cbi_state; + sc->sc_methods = &umass_cbi_methods; #ifdef UMASS_DEBUG } else { panic("%s:%d: Unknown wire proto 0x%02x\n", @@ -786,7 +787,7 @@ umass_setup_transfer(struct umass_softc *sc, usbd_pipe_handle pipe, /* Initialiase a USB transfer and then schedule it */ usbd_setup_xfer(xfer, pipe, (void *)sc, buffer, buflen, - flags | sc->sc_xfer_flags, sc->timeout, sc->state); + flags | sc->sc_xfer_flags, sc->timeout, sc->sc_methods->wire_state); err = usbd_transfer(xfer); DPRINTF(UDMASS_XFER,("%s: start xfer buffer=%p buflen=%d flags=0x%x " @@ -813,8 +814,8 @@ umass_setup_ctrl_transfer(struct umass_softc *sc, usb_device_request_t *req, /* Initialiase a USB control transfer and then schedule it */ - usbd_setup_default_xfer(xfer, sc->sc_udev, (void *) sc, - sc->timeout, req, buffer, buflen, flags, sc->state); + usbd_setup_default_xfer(xfer, sc->sc_udev, (void *) sc, sc->timeout, + req, buffer, buflen, flags, sc->sc_methods->wire_state); err = usbd_transfer(xfer); if (err && err != USBD_IN_PROGRESS) { @@ -908,7 +909,7 @@ umass_bbb_reset(struct umass_softc *sc, int status) Static void umass_bbb_transfer(struct umass_softc *sc, int lun, void *cmd, int cmdlen, void *data, int datalen, int dir, u_int timeout, - transfer_cb_f cb, void *priv) + umass_callback cb, void *priv) { static int dCBWtag = 42; /* unique for CBW of transfer */ @@ -1394,7 +1395,7 @@ umass_cbi_reset(struct umass_softc *sc, int status) Static void umass_cbi_transfer(struct umass_softc *sc, int lun, void *cmd, int cmdlen, void *data, int datalen, int dir, - u_int timeout, transfer_cb_f cb, void *priv) + u_int timeout, umass_callback cb, void *priv) { DPRINTF(UDMASS_CBI,("%s: umass_cbi_transfer cmd=0x%02x, len=%d\n", USBDEVNAME(sc->sc_dev), *(u_char*)cmd, datalen)); diff --git a/sys/dev/usb/umassbus.c b/sys/dev/usb/umassbus.c index 8b994b21558..ddd3042fb7b 100644 --- a/sys/dev/usb/umassbus.c +++ b/sys/dev/usb/umassbus.c @@ -1,4 +1,4 @@ -/* $NetBSD: umassbus.c,v 1.15 2001/12/02 22:44:34 bouyer Exp $ */ +/* $NetBSD: umassbus.c,v 1.16 2001/12/14 08:46:20 gehenna Exp $ */ /* * Copyright (c) 2001 The NetBSD Foundation, Inc. @@ -38,7 +38,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: umassbus.c,v 1.15 2001/12/02 22:44:34 bouyer Exp $"); +__KERNEL_RCSID(0, "$NetBSD: umassbus.c,v 1.16 2001/12/14 08:46:20 gehenna Exp $"); #include "atapibus.h" #include "scsibus.h" @@ -330,9 +330,10 @@ umass_scsipi_request(struct scsipi_channel *chan, ("umass_scsi_cmd: sync dir=%d\n", dir)); sc->sc_xfer_flags = USBD_SYNCHRONOUS; sc->bus.sc_sync_status = USBD_INVAL; - sc->transfer(sc, periph->periph_lun, cmd, cmdlen, - xs->data, xs->datalen, dir, xs->timeout, - 0, xs); + sc->sc_methods->wire_xfer(sc, periph->periph_lun, cmd, + cmdlen, xs->data, + xs->datalen, dir, + xs->timeout, 0, xs); sc->sc_xfer_flags = 0; DPRINTF(UDMASS_SCSI, ("umass_scsi_cmd: done err=%d\n", sc->bus.sc_sync_status)); @@ -353,9 +354,11 @@ umass_scsipi_request(struct scsipi_channel *chan, ("umass_scsi_cmd: async dir=%d, cmdlen=%d" " datalen=%d\n", dir, cmdlen, xs->datalen)); - sc->transfer(sc, periph->periph_lun, cmd, cmdlen, - xs->data, xs->datalen, dir, xs->timeout, - umass_scsipi_cb, xs); + sc->sc_methods->wire_xfer(sc, periph->periph_lun, cmd, + cmdlen, xs->data, + xs->datalen, dir, + xs->timeout, + umass_scsipi_cb, xs); return; } @@ -467,10 +470,11 @@ umass_scsipi_cb(struct umass_softc *sc, void *priv, int residue, int status) cmdlen = sizeof(sc->bus.sc_sense_cmd); if (sc->cmd_proto == CPROTO_UFI) /* XXX */ cmdlen = UFI_COMMAND_LENGTH; - sc->transfer(sc, periph->periph_lun, - &sc->bus.sc_sense_cmd, cmdlen, - &xs->sense, sizeof(xs->sense), DIR_IN, - xs->timeout, umass_scsipi_sense_cb, xs); + sc->sc_methods->wire_xfer(sc, periph->periph_lun, + &sc->bus.sc_sense_cmd, cmdlen, + &xs->sense, sizeof(xs->sense), + DIR_IN, xs->timeout, + umass_scsipi_sense_cb, xs); return; case STATUS_WIRE_FAILED: diff --git a/sys/dev/usb/umassvar.h b/sys/dev/usb/umassvar.h index 4182afa87d9..9bd4812d8f8 100644 --- a/sys/dev/usb/umassvar.h +++ b/sys/dev/usb/umassvar.h @@ -1,4 +1,4 @@ -/* $NetBSD: umassvar.h,v 1.6 2001/12/14 05:58:14 gehenna Exp $ */ +/* $NetBSD: umassvar.h,v 1.7 2001/12/14 08:46:21 gehenna Exp $ */ /*- * Copyright (c) 1999 MAEKAWA Masahide <bishop@rr.iij4u.or.jp>, * Nick Hibma <n_hibma@freebsd.org> @@ -135,21 +135,23 @@ typedef union { struct umass_softc; /* see below */ -typedef void (*transfer_cb_f)(struct umass_softc *sc, void *priv, - int residue, int status); +typedef void (*umass_callback)(struct umass_softc *, void *, int, int); #define STATUS_CMD_OK 0 /* everything ok */ #define STATUS_CMD_UNKNOWN 1 /* will have to fetch sense */ #define STATUS_CMD_FAILED 2 /* transfer was ok, command failed */ #define STATUS_WIRE_FAILED 3 /* couldn't even get command across */ -typedef void (*wire_reset_f)(struct umass_softc *sc, int status); -typedef void (*wire_transfer_f)(struct umass_softc *sc, int lun, - void *cmd, int cmdlen, void *data, int datalen, - int dir, u_int timeout, transfer_cb_f cb, - void *priv); -typedef void (*wire_state_f)(usbd_xfer_handle xfer, - usbd_private_handle priv, usbd_status err); +typedef void (*umass_wire_xfer)(struct umass_softc *, int, void *, int, void *, + int, int, u_int, umass_callback, void *); +typedef void (*umass_wire_reset)(struct umass_softc *, int); +typedef void (*umass_wire_state)(usbd_xfer_handle, usbd_private_handle, + usbd_status); +struct umass_wire_methods { + umass_wire_xfer wire_xfer; + umass_wire_reset wire_reset; + umass_wire_state wire_state; +}; /* the per device structure */ struct umass_softc { @@ -159,6 +161,8 @@ struct umass_softc { u_int8_t sc_epaddr[UMASS_NEP]; usbd_pipe_handle sc_pipe[UMASS_NEP]; + const struct umass_wire_methods *sc_methods; + unsigned char drive; #define DRIVE_GENERIC 0 /* use defaults for this one */ #define ZIP_100 1 /* to be used for quirks */ @@ -207,18 +211,6 @@ struct umass_softc { usbd_interface_handle iface; /* Mass Storage interface */ int ifaceno; /* MS iface number */ - /* Reset the device in a wire protocol specific way */ - wire_reset_f reset; - - /* The start of a wire transfer. It prepares the whole transfer (cmd, - * data, and status stage) and initiates it. It is up to the state - * machine (below) to handle the various stages and errors in these - */ - wire_transfer_f transfer; - - /* The state machine, handling the various states during a transfer */ - wire_state_f state; - /* Bulk specific variables for transfers in progress */ umass_bbb_cbw_t cbw; /* command block wrapper */ umass_bbb_csw_t csw; /* command status wrapper*/ @@ -265,7 +257,7 @@ struct umass_softc { void *transfer_data; /* data buffer */ int transfer_datalen; /* (maximum) length */ int transfer_actlen; /* actual length */ - transfer_cb_f transfer_cb; /* callback */ + umass_callback transfer_cb; /* callback */ void *transfer_priv; /* for callback */ int transfer_status; |
