From 53f34def694fb28b1fb5dada473b7217d5118390 Mon Sep 17 00:00:00 2001 From: gehenna Date: Fri, 14 Dec 2001 05:58:13 +0000 Subject: [PATCH] Change style to store endpoint addresses and pipes. --- sys/dev/usb/umass.c | 125 +++++++++++++++++++---------------------- sys/dev/usb/umassvar.h | 17 +++--- 2 files changed, 66 insertions(+), 76 deletions(-) diff --git a/sys/dev/usb/umass.c b/sys/dev/usb/umass.c index d2d29b3c0580..21250abfaf58 100644 --- a/sys/dev/usb/umass.c +++ b/sys/dev/usb/umass.c @@ -1,4 +1,4 @@ -/* $NetBSD: umass.c,v 1.72 2001/12/12 15:23:58 augustss Exp $ */ +/* $NetBSD: umass.c,v 1.73 2001/12/14 05:58:13 gehenna Exp $ */ /*- * Copyright (c) 1999 MAEKAWA Masahide , * Nick Hibma @@ -94,7 +94,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: umass.c,v 1.72 2001/12/12 15:23:58 augustss Exp $"); +__KERNEL_RCSID(0, "$NetBSD: umass.c,v 1.73 2001/12/14 05:58:13 gehenna Exp $"); #include "atapibus.h" @@ -171,8 +171,7 @@ Static usbd_status umass_setup_ctrl_transfer(struct umass_softc *sc, usb_device_request_t *req, void *buffer, int buflen, int flags, usbd_xfer_handle xfer); -Static void umass_clear_endpoint_stall(struct umass_softc *sc, - u_int8_t endpt, usbd_pipe_handle pipe, +Static void umass_clear_endpoint_stall(struct umass_softc *sc, int endpt, usbd_xfer_handle xfer); #if 0 Static void umass_reset(struct umass_softc *sc, transfer_cb_f cb, void *priv); @@ -547,14 +546,14 @@ USB_ATTACH(umass) } if (UE_GET_DIR(ed->bEndpointAddress) == UE_DIR_IN && (ed->bmAttributes & UE_XFERTYPE) == UE_BULK) { - sc->bulkin = ed->bEndpointAddress; + sc->sc_epaddr[UMASS_BULKIN] = ed->bEndpointAddress; } else if (UE_GET_DIR(ed->bEndpointAddress) == UE_DIR_OUT && (ed->bmAttributes & UE_XFERTYPE) == UE_BULK) { - sc->bulkout = ed->bEndpointAddress; + sc->sc_epaddr[UMASS_BULKOUT] = ed->bEndpointAddress; } else if (sc->wire_proto == WPROTO_CBI_I && UE_GET_DIR(ed->bEndpointAddress) == UE_DIR_IN && (ed->bmAttributes & UE_XFERTYPE) == UE_INTERRUPT) { - sc->intrin = ed->bEndpointAddress; + sc->sc_epaddr[UMASS_INTRIN] = ed->bEndpointAddress; #ifdef UMASS_DEBUG if (UGETW(ed->wMaxPacketSize) > 2) { DPRINTF(UDMASS_CBI, ("%s: intr size is %d\n", @@ -566,11 +565,12 @@ USB_ATTACH(umass) } /* check whether we found all the endpoints we need */ - if (!sc->bulkin || !sc->bulkout - || (sc->wire_proto == WPROTO_CBI_I && !sc->intrin) ) { - DPRINTF(UDMASS_USB, ("%s: endpoint not found %d/%d/%d\n", - USBDEVNAME(sc->sc_dev), - sc->bulkin, sc->bulkout, sc->intrin)); + if (!sc->sc_epaddr[UMASS_BULKIN] || !sc->sc_epaddr[UMASS_BULKOUT] || + (sc->wire_proto == WPROTO_CBI_I && !sc->sc_epaddr[UMASS_INTRIN]) ) { + DPRINTF(UDMASS_USB, ("%s: endpoint not found %u/%u/%u\n", + USBDEVNAME(sc->sc_dev), sc->sc_epaddr[UMASS_BULKIN], + sc->sc_epaddr[UMASS_BULKOUT], + sc->sc_epaddr[UMASS_INTRIN])); umass_disco(sc); USB_ATTACH_ERROR_RETURN; } @@ -590,19 +590,20 @@ USB_ATTACH(umass) } /* Open the bulk-in and -out pipe */ - err = usbd_open_pipe(sc->iface, sc->bulkout, - USBD_EXCLUSIVE_USE, &sc->bulkout_pipe); + err = usbd_open_pipe(sc->iface, sc->sc_epaddr[UMASS_BULKOUT], + USBD_EXCLUSIVE_USE, + &sc->sc_pipe[UMASS_BULKOUT]); if (err) { - DPRINTF(UDMASS_USB, ("%s: cannot open %d-out pipe (bulk)\n", - USBDEVNAME(sc->sc_dev), sc->bulkout)); + DPRINTF(UDMASS_USB, ("%s: cannot open %u-out pipe (bulk)\n", + USBDEVNAME(sc->sc_dev), sc->sc_epaddr[UMASS_BULKOUT])); umass_disco(sc); USB_ATTACH_ERROR_RETURN; } - err = usbd_open_pipe(sc->iface, sc->bulkin, - USBD_EXCLUSIVE_USE, &sc->bulkin_pipe); + err = usbd_open_pipe(sc->iface, sc->sc_epaddr[UMASS_BULKIN], + USBD_EXCLUSIVE_USE, &sc->sc_pipe[UMASS_BULKIN]); if (err) { - DPRINTF(UDMASS_USB, ("%s: could not open %d-in pipe (bulk)\n", - USBDEVNAME(sc->sc_dev), sc->bulkin)); + DPRINTF(UDMASS_USB, ("%s: could not open %u-in pipe (bulk)\n", + USBDEVNAME(sc->sc_dev), sc->sc_epaddr[UMASS_BULKIN])); umass_disco(sc); USB_ATTACH_ERROR_RETURN; } @@ -619,11 +620,12 @@ USB_ATTACH(umass) * arriving concurrently. */ if (sc->wire_proto == WPROTO_CBI_I) { - err = usbd_open_pipe(sc->iface, sc->intrin, - USBD_EXCLUSIVE_USE, &sc->intrin_pipe); + err = usbd_open_pipe(sc->iface, sc->sc_epaddr[UMASS_INTRIN], + USBD_EXCLUSIVE_USE, &sc->sc_pipe[UMASS_INTRIN]); if (err) { - DPRINTF(UDMASS_USB, ("%s: couldn't open %d-in (intr)\n", - USBDEVNAME(sc->sc_dev), sc->intrin)); + DPRINTF(UDMASS_USB, ("%s: couldn't open %u-in (intr)\n", + USBDEVNAME(sc->sc_dev), + sc->sc_epaddr[UMASS_INTRIN])); umass_disco(sc); USB_ATTACH_ERROR_RETURN; } @@ -699,17 +701,15 @@ USB_ATTACH(umass) USB_DETACH(umass) { USB_DETACH_START(umass, sc); - int rv = 0; + int rv = 0, i; DPRINTF(UDMASS_USB, ("%s: detached\n", USBDEVNAME(sc->sc_dev))); /* Abort the pipes to wake up any waiting processes. */ - if (sc->bulkout_pipe != NULL) - usbd_abort_pipe(sc->bulkout_pipe); - if (sc->bulkin_pipe != NULL) - usbd_abort_pipe(sc->bulkin_pipe); - if (sc->intrin_pipe != NULL) - usbd_abort_pipe(sc->intrin_pipe); + for (i = 0 ; i < UMASS_NEP ; i++) { + if (sc->sc_pipe[i] != NULL) + usbd_abort_pipe(sc->sc_pipe[i]); + } #if 0 /* Do we really need reference counting? Perhaps in ioctl() */ @@ -749,12 +749,10 @@ umass_disco(struct umass_softc *sc) } /* Remove all the pipes. */ - if (sc->bulkout_pipe != NULL) - usbd_close_pipe(sc->bulkout_pipe); - if (sc->bulkin_pipe != NULL) - usbd_close_pipe(sc->bulkin_pipe); - if (sc->intrin_pipe != NULL) - usbd_close_pipe(sc->intrin_pipe); + for (i = 0 ; i < UMASS_NEP ; i++) { + if (sc->sc_pipe[i] != NULL) + usbd_close_pipe(sc->sc_pipe[i]); + } } Static void @@ -834,27 +832,23 @@ umass_setup_ctrl_transfer(struct umass_softc *sc, usbd_device_handle dev, } Static void -umass_clear_endpoint_stall(struct umass_softc *sc, - u_int8_t endpt, usbd_pipe_handle pipe, usbd_xfer_handle xfer) +umass_clear_endpoint_stall(struct umass_softc *sc, int endpt, + usbd_xfer_handle xfer) { - usbd_device_handle dev; - if (sc->sc_dying) return; DPRINTF(UDMASS_BBB, ("%s: Clear endpoint 0x%02x stall\n", USBDEVNAME(sc->sc_dev), endpt)); - usbd_interface2device_handle(sc->iface, &dev); - - usbd_clear_endpoint_toggle(pipe); + usbd_clear_endpoint_toggle(sc->sc_pipe[endpt]); sc->request.bmRequestType = UT_WRITE_ENDPOINT; sc->request.bRequest = UR_CLEAR_FEATURE; USETW(sc->request.wValue, UF_ENDPOINT_HALT); - USETW(sc->request.wIndex, endpt); + USETW(sc->request.wIndex, sc->sc_epaddr[endpt]); USETW(sc->request.wLength, 0); - umass_setup_ctrl_transfer(sc, dev, &sc->request, NULL, 0, 0, xfer); + umass_setup_ctrl_transfer(sc, sc->sc_udev, &sc->request, NULL, 0, 0, xfer); } #if 0 @@ -1022,7 +1016,7 @@ umass_bbb_transfer(struct umass_softc *sc, int lun, void *cmd, int cmdlen, sc->transfer_state = TSTATE_BBB_COMMAND; /* Send the CBW from host to device via bulk-out endpoint. */ - if (umass_setup_transfer(sc, sc->bulkout_pipe, + if (umass_setup_transfer(sc, sc->sc_pipe[UMASS_BULKOUT], &sc->cbw, UMASS_BBB_CBW_SIZE, 0, sc->transfer_xfer[XFER_BBB_CBW])) { umass_bbb_reset(sc, STATUS_WIRE_FAILED); @@ -1077,7 +1071,7 @@ umass_bbb_state(usbd_xfer_handle xfer, usbd_private_handle priv, /* Data transport phase, setup transfer */ sc->transfer_state = TSTATE_BBB_DATA; if (sc->transfer_dir == DIR_IN) { - if (umass_setup_transfer(sc, sc->bulkin_pipe, + if (umass_setup_transfer(sc, sc->sc_pipe[UMASS_BULKIN], sc->data_buffer, sc->transfer_datalen, USBD_SHORT_XFER_OK | USBD_NO_COPY, sc->transfer_xfer[XFER_BBB_DATA])) @@ -1087,7 +1081,7 @@ umass_bbb_state(usbd_xfer_handle xfer, usbd_private_handle priv, } else if (sc->transfer_dir == DIR_OUT) { memcpy(sc->data_buffer, sc->transfer_data, sc->transfer_datalen); - if (umass_setup_transfer(sc, sc->bulkout_pipe, + if (umass_setup_transfer(sc, sc->sc_pipe[UMASS_BULKOUT], sc->data_buffer, sc->transfer_datalen, USBD_NO_COPY,/* fixed length transfer */ sc->transfer_xfer[XFER_BBB_DATA])) @@ -1118,9 +1112,7 @@ umass_bbb_state(usbd_xfer_handle xfer, usbd_private_handle priv, sc->transfer_state = TSTATE_BBB_DCLEAR; umass_clear_endpoint_stall(sc, (sc->transfer_dir == DIR_IN? - sc->bulkin:sc->bulkout), - (sc->transfer_dir == DIR_IN? - sc->bulkin_pipe:sc->bulkout_pipe), + UMASS_BULKIN:UMASS_BULKOUT), sc->transfer_xfer[XFER_BBB_DCLEAR]); return; } else { @@ -1176,8 +1168,8 @@ umass_bbb_state(usbd_xfer_handle xfer, usbd_private_handle priv, } /* Read the Command Status Wrapper via bulk-in endpoint. */ - if (umass_setup_transfer(sc, sc->bulkin_pipe, &sc->csw, - UMASS_BBB_CSW_SIZE, 0, next_xfer)) { + if (umass_setup_transfer(sc, sc->sc_pipe[UMASS_BULKIN], + &sc->csw, UMASS_BBB_CSW_SIZE, 0, next_xfer)) { umass_bbb_reset(sc, STATUS_WIRE_FAILED); return; } @@ -1197,8 +1189,7 @@ umass_bbb_state(usbd_xfer_handle xfer, usbd_private_handle priv, */ if (sc->transfer_state == TSTATE_BBB_STATUS1) { sc->transfer_state = TSTATE_BBB_SCLEAR; - umass_clear_endpoint_stall(sc, - sc->bulkin, sc->bulkin_pipe, + umass_clear_endpoint_stall(sc, UMASS_BULKIN, sc->transfer_xfer[XFER_BBB_SCLEAR]); return; } else { @@ -1298,7 +1289,7 @@ umass_bbb_state(usbd_xfer_handle xfer, usbd_private_handle priv, USBDEVNAME(sc->sc_dev), usbd_errstr(err)); sc->transfer_state = TSTATE_BBB_RESET2; - umass_clear_endpoint_stall(sc, sc->bulkin, sc->bulkin_pipe, + umass_clear_endpoint_stall(sc, UMASS_BULKIN, sc->transfer_xfer[XFER_BBB_RESET2]); return; @@ -1309,7 +1300,7 @@ umass_bbb_state(usbd_xfer_handle xfer, usbd_private_handle priv, /* no error recovery, otherwise we end up in a loop */ sc->transfer_state = TSTATE_BBB_RESET3; - umass_clear_endpoint_stall(sc, sc->bulkout, sc->bulkout_pipe, + umass_clear_endpoint_stall(sc, UMASS_BULKOUT, sc->transfer_xfer[XFER_BBB_RESET3]); return; @@ -1522,7 +1513,7 @@ umass_cbi_state(usbd_xfer_handle xfer, usbd_private_handle priv, sc->transfer_state = TSTATE_CBI_DATA; if (sc->transfer_dir == DIR_IN) { - if (umass_setup_transfer(sc, sc->bulkin_pipe, + if (umass_setup_transfer(sc, sc->sc_pipe[UMASS_BULKIN], sc->transfer_data, sc->transfer_datalen, USBD_SHORT_XFER_OK | USBD_NO_COPY, sc->transfer_xfer[XFER_CBI_DATA])) @@ -1531,7 +1522,7 @@ umass_cbi_state(usbd_xfer_handle xfer, usbd_private_handle priv, } else if (sc->transfer_dir == DIR_OUT) { memcpy(sc->data_buffer, sc->transfer_data, sc->transfer_datalen); - if (umass_setup_transfer(sc, sc->bulkout_pipe, + if (umass_setup_transfer(sc, sc->sc_pipe[UMASS_BULKOUT], sc->transfer_data, sc->transfer_datalen, USBD_NO_COPY,/* fixed length transfer */ sc->transfer_xfer[XFER_CBI_DATA])) @@ -1541,7 +1532,7 @@ umass_cbi_state(usbd_xfer_handle xfer, usbd_private_handle priv, DPRINTF(UDMASS_CBI, ("%s: no data phase\n", USBDEVNAME(sc->sc_dev))); sc->transfer_state = TSTATE_CBI_STATUS; - if (umass_setup_transfer(sc, sc->intrin_pipe, + if (umass_setup_transfer(sc, sc->sc_pipe[UMASS_INTRIN], &sc->sbl, sizeof(sc->sbl), 0, /* fixed length transfer */ sc->transfer_xfer[XFER_CBI_STATUS])){ @@ -1574,8 +1565,7 @@ umass_cbi_state(usbd_xfer_handle xfer, usbd_private_handle priv, if (err == USBD_STALLED) { sc->transfer_state = TSTATE_CBI_DCLEAR; - umass_clear_endpoint_stall(sc, - sc->bulkin, sc->bulkin_pipe, + umass_clear_endpoint_stall(sc, UMASS_BULKIN, sc->transfer_xfer[XFER_CBI_DCLEAR]); } else { umass_cbi_reset(sc, STATUS_WIRE_FAILED); @@ -1594,7 +1584,7 @@ umass_cbi_state(usbd_xfer_handle xfer, usbd_private_handle priv, if (sc->wire_proto == WPROTO_CBI_I) { sc->transfer_state = TSTATE_CBI_STATUS; memset(&sc->sbl, 0, sizeof(sc->sbl)); - if (umass_setup_transfer(sc, sc->intrin_pipe, + if (umass_setup_transfer(sc, sc->sc_pipe[UMASS_INTRIN], &sc->sbl, sizeof(sc->sbl), 0, /* fixed length transfer */ sc->transfer_xfer[XFER_CBI_STATUS])){ @@ -1620,8 +1610,7 @@ umass_cbi_state(usbd_xfer_handle xfer, usbd_private_handle priv, if (err == USBD_STALLED) { sc->transfer_state = TSTATE_CBI_SCLEAR; - umass_clear_endpoint_stall(sc, - sc->intrin, sc->intrin_pipe, + umass_clear_endpoint_stall(sc, UMASS_INTRIN, sc->transfer_xfer[XFER_CBI_SCLEAR]); } else { umass_cbi_reset(sc, STATUS_WIRE_FAILED); @@ -1708,7 +1697,7 @@ umass_cbi_state(usbd_xfer_handle xfer, usbd_private_handle priv, USBDEVNAME(sc->sc_dev), usbd_errstr(err)); sc->transfer_state = TSTATE_CBI_RESET2; - umass_clear_endpoint_stall(sc, sc->bulkin, sc->bulkin_pipe, + umass_clear_endpoint_stall(sc, UMASS_BULKIN, sc->transfer_xfer[XFER_CBI_RESET2]); return; @@ -1719,7 +1708,7 @@ umass_cbi_state(usbd_xfer_handle xfer, usbd_private_handle priv, /* no error recovery, otherwise we end up in a loop */ sc->transfer_state = TSTATE_CBI_RESET3; - umass_clear_endpoint_stall(sc, sc->bulkout, sc->bulkout_pipe, + umass_clear_endpoint_stall(sc, UMASS_BULKOUT, sc->transfer_xfer[XFER_CBI_RESET3]); return; diff --git a/sys/dev/usb/umassvar.h b/sys/dev/usb/umassvar.h index 4899d4c1c94f..4182afa87d9f 100644 --- a/sys/dev/usb/umassvar.h +++ b/sys/dev/usb/umassvar.h @@ -1,4 +1,4 @@ -/* $NetBSD: umassvar.h,v 1.5 2001/11/25 19:15:47 augustss Exp $ */ +/* $NetBSD: umassvar.h,v 1.6 2001/12/14 05:58:14 gehenna Exp $ */ /*- * Copyright (c) 1999 MAEKAWA Masahide , * Nick Hibma @@ -68,6 +68,11 @@ extern int umassdebug; #define MS_TO_TICKS(ms) ((ms) * hz / 1000) +/* Endpoints for umass */ +#define UMASS_BULKIN 0 +#define UMASS_BULKOUT 1 +#define UMASS_INTRIN 2 +#define UMASS_NEP 3 /* Bulk-Only features */ @@ -151,6 +156,9 @@ struct umass_softc { USBBASEDEVICE sc_dev; /* base device */ usbd_device_handle sc_udev; /* device */ + u_int8_t sc_epaddr[UMASS_NEP]; + usbd_pipe_handle sc_pipe[UMASS_NEP]; + unsigned char drive; #define DRIVE_GENERIC 0 /* use defaults for this one */ #define ZIP_100 1 /* to be used for quirks */ @@ -199,13 +207,6 @@ struct umass_softc { usbd_interface_handle iface; /* Mass Storage interface */ int ifaceno; /* MS iface number */ - u_int8_t bulkin; /* bulk-in Endpoint Address */ - u_int8_t bulkout; /* bulk-out Endpoint Address */ - u_int8_t intrin; /* intr-in Endp. (CBI) */ - usbd_pipe_handle bulkin_pipe; - usbd_pipe_handle bulkout_pipe; - usbd_pipe_handle intrin_pipe; - /* Reset the device in a wire protocol specific way */ wire_reset_f reset;