root/dev/usb/umass.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. umass_match
  2. umass_attach
  3. umass_detach
  4. umass_activate
  5. umass_disco
  6. umass_polled_transfer
  7. umass_setup_transfer
  8. umass_setup_ctrl_transfer
  9. umass_adjust_transfer
  10. umass_clear_endpoint_stall
  11. umass_reset
  12. umass_bbb_reset
  13. umass_bbb_transfer
  14. umass_bbb_state
  15. umass_cbi_adsc
  16. umass_cbi_reset
  17. umass_cbi_transfer
  18. umass_cbi_state
  19. umass_bbb_get_max_lun
  20. umass_bbb_dump_cbw
  21. umass_bbb_dump_csw
  22. umass_dump_buffer

    1 /*      $OpenBSD: umass.c,v 1.52 2007/06/14 10:11:16 mbalmer Exp $ */
    2 /*      $NetBSD: umass.c,v 1.116 2004/06/30 05:53:46 mycroft Exp $      */
    3 
    4 /*
    5  * Copyright (c) 2003 The NetBSD Foundation, Inc.
    6  * All rights reserved.
    7  *
    8  * This code is derived from software contributed to The NetBSD Foundation
    9  * by Charles M. Hannum.
   10  *
   11  * Redistribution and use in source and binary forms, with or without
   12  * modification, are permitted provided that the following conditions
   13  * are met:
   14  * 1. Redistributions of source code must retain the above copyright
   15  *    notice, this list of conditions and the following disclaimer.
   16  * 2. Redistributions in binary form must reproduce the above copyright
   17  *    notice, this list of conditions and the following disclaimer in the
   18  *    documentation and/or other materials provided with the distribution.
   19  * 3. All advertising materials mentioning features or use of this software
   20  *    must display the following acknowledgement:
   21  *        This product includes software developed by the NetBSD
   22  *        Foundation, Inc. and its contributors.
   23  * 4. Neither the name of The NetBSD Foundation nor the names of its
   24  *    contributors may be used to endorse or promote products derived
   25  *    from this software without specific prior written permission.
   26  *
   27  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
   28  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
   29  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
   30  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
   31  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
   32  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
   33  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
   34  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
   35  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
   36  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
   37  * POSSIBILITY OF SUCH DAMAGE.
   38  */
   39 
   40 /*-
   41  * Copyright (c) 1999 MAEKAWA Masahide <bishop@rr.iij4u.or.jp>,
   42  *                    Nick Hibma <n_hibma@freebsd.org>
   43  * All rights reserved.
   44  *
   45  * Redistribution and use in source and binary forms, with or without
   46  * modification, are permitted provided that the following conditions
   47  * are met:
   48  * 1. Redistributions of source code must retain the above copyright
   49  *    notice, this list of conditions and the following disclaimer.
   50  * 2. Redistributions in binary form must reproduce the above copyright
   51  *    notice, this list of conditions and the following disclaimer in the
   52  *    documentation and/or other materials provided with the distribution.
   53  *
   54  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
   55  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   56  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   57  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
   58  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   59  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   60  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   61  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   62  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   63  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   64  * SUCH DAMAGE.
   65  *
   66  *     $FreeBSD: src/sys/dev/usb/umass.c,v 1.13 2000/03/26 01:39:12 n_hibma Exp $
   67  */
   68 
   69 /*
   70  * Universal Serial Bus Mass Storage Class specs:
   71  * http://www.usb.org/developers/devclass_docs/usb_msc_overview_1.2.pdf
   72  * http://www.usb.org/developers/devclass_docs/usbmassbulk_10.pdf
   73  * http://www.usb.org/developers/devclass_docs/usb_msc_cbi_1.1.pdf
   74  * http://www.usb.org/developers/devclass_docs/usbmass-ufi10.pdf
   75  */
   76 
   77 /*
   78  * Ported to NetBSD by Lennart Augustsson <augustss@NetBSD.org>.
   79  * Parts of the code written by Jason R. Thorpe <thorpej@shagadelic.org>.
   80  */
   81 
   82 /*
   83  * The driver handles 3 Wire Protocols
   84  * - Command/Bulk/Interrupt (CBI)
   85  * - Command/Bulk/Interrupt with Command Completion Interrupt (CBI with CCI)
   86  * - Mass Storage Bulk-Only (BBB)
   87  *   (BBB refers Bulk/Bulk/Bulk for Command/Data/Status phases)
   88  *
   89  * Over these wire protocols it handles the following command protocols
   90  * - SCSI
   91  * - 8070 (ATA/ATAPI for rewritable removable media)
   92  * - UFI (USB Floppy Interface)
   93  *
   94  * 8070i is a transformed version of the SCSI command set. UFI is a transformed
   95  * version of the 8070i command set.  The sc->transform method is used to
   96  * convert the commands into the appropriate format (if at all necessary).
   97  * For example, ATAPI requires all commands to be 12 bytes in length amongst
   98  * other things.
   99  *
  100  * The source code below is marked and can be split into a number of pieces
  101  * (in this order):
  102  *
  103  * - probe/attach/detach
  104  * - generic transfer routines
  105  * - BBB
  106  * - CBI
  107  * - CBI_I (in addition to functions from CBI)
  108  * - CAM (Common Access Method)
  109  * - SCSI
  110  * - UFI
  111  * - 8070i
  112  *
  113  * The protocols are implemented using a state machine, for the transfers as
  114  * well as for the resets. The state machine is contained in umass_*_state.
  115  * The state machine is started through either umass_*_transfer or
  116  * umass_*_reset.
  117  *
  118  * The reason for doing this is a) CAM performs a lot better this way and b) it
  119  * avoids using tsleep from interrupt context (for example after a failed
  120  * transfer).
  121  */
  122 
  123 /*
  124  * The SCSI related part of this driver has been derived from the
  125  * dev/ppbus/vpo.c driver, by Nicolas Souchu (nsouch@freebsd.org).
  126  *
  127  * The CAM layer uses so called actions which are messages sent to the host
  128  * adapter for completion. The actions come in through umass_cam_action. The
  129  * appropriate block of routines is called depending on the transport protocol
  130  * in use. When the transfer has finished, these routines call
  131  * umass_cam_cb again to complete the CAM command.
  132  */
  133 
  134 #include "atapiscsi.h"
  135 
  136 #include <sys/param.h>
  137 #include <sys/systm.h>
  138 #include <sys/kernel.h>
  139 #include <sys/conf.h>
  140 #include <sys/buf.h>
  141 #include <sys/device.h>
  142 #include <sys/malloc.h>
  143 #include <sys/timeout.h>
  144 #undef KASSERT
  145 #define KASSERT(cond, msg)
  146 #include <machine/bus.h>
  147 
  148 #include <scsi/scsi_all.h>
  149 
  150 #include <dev/usb/usb.h>
  151 #include <dev/usb/usbdi.h>
  152 #include <dev/usb/usbdi_util.h>
  153 #include <dev/usb/usbdivar.h>
  154 #include <dev/usb/usbdevs.h>
  155 
  156 #include <dev/usb/umassvar.h>
  157 #include <dev/usb/umass_quirks.h>
  158 #include <dev/usb/umass_scsi.h>
  159 
  160 
  161 #ifdef UMASS_DEBUG
  162 int umassdebug = 0;
  163 
  164 char *states[TSTATE_STATES+1] = {
  165         /* should be kept in sync with the list at transfer_state */
  166         "Idle",
  167         "BBB CBW",
  168         "BBB Data",
  169         "BBB Data bulk-in/-out clear stall",
  170         "BBB CSW, 1st attempt",
  171         "BBB CSW bulk-in clear stall",
  172         "BBB CSW, 2nd attempt",
  173         "BBB Reset",
  174         "BBB bulk-in clear stall",
  175         "BBB bulk-out clear stall",
  176         "CBI Command",
  177         "CBI Data",
  178         "CBI Status",
  179         "CBI Data bulk-in/-out clear stall",
  180         "CBI Status intr-in clear stall",
  181         "CBI Reset",
  182         "CBI bulk-in clear stall",
  183         "CBI bulk-out clear stall",
  184         NULL
  185 };
  186 #endif
  187 
  188 /* USB device probe/attach/detach functions */
  189 int umass_match(struct device *, void *, void *); 
  190 void umass_attach(struct device *, struct device *, void *); 
  191 int umass_detach(struct device *, int); 
  192 int umass_activate(struct device *, enum devact); 
  193 
  194 struct cfdriver umass_cd = { 
  195         NULL, "umass", DV_DULL 
  196 }; 
  197 
  198 const struct cfattach umass_ca = { 
  199         sizeof(struct umass_softc), 
  200         umass_match, 
  201         umass_attach, 
  202         umass_detach, 
  203         umass_activate, 
  204 };
  205 void umass_disco(struct umass_softc *sc);
  206 
  207 /* generic transfer functions */
  208 usbd_status umass_polled_transfer(struct umass_softc *sc,
  209                                 usbd_xfer_handle xfer);
  210 usbd_status umass_setup_transfer(struct umass_softc *sc,
  211                                 usbd_pipe_handle pipe,
  212                                 void *buffer, int buflen, int flags,
  213                                 usbd_xfer_handle xfer);
  214 usbd_status umass_setup_ctrl_transfer(struct umass_softc *sc,
  215                                 usb_device_request_t *req,
  216                                 void *buffer, int buflen, int flags,
  217                                 usbd_xfer_handle xfer);
  218 void umass_clear_endpoint_stall(struct umass_softc *sc, int endpt,
  219                                 usbd_xfer_handle xfer);
  220 void umass_adjust_transfer(struct umass_softc *);
  221 #if 0
  222 void umass_reset(struct umass_softc *sc,        transfer_cb_f cb, void *priv);
  223 #endif
  224 
  225 /* Bulk-Only related functions */
  226 void umass_bbb_transfer(struct umass_softc *, int, void *, int, void *,
  227                                int, int, u_int, umass_callback, void *);
  228 void umass_bbb_reset(struct umass_softc *, int);
  229 void umass_bbb_state(usbd_xfer_handle, usbd_private_handle, usbd_status);
  230 
  231 usbd_status umass_bbb_get_max_lun(struct umass_softc *, u_int8_t *);
  232 
  233 /* CBI related functions */
  234 void umass_cbi_transfer(struct umass_softc *, int, void *, int, void *,
  235                                int, int, u_int, umass_callback, void *);
  236 void umass_cbi_reset(struct umass_softc *, int);
  237 void umass_cbi_state(usbd_xfer_handle, usbd_private_handle, usbd_status);
  238 
  239 int umass_cbi_adsc(struct umass_softc *, char *, int, usbd_xfer_handle);
  240 
  241 const struct umass_wire_methods umass_bbb_methods = {
  242         umass_bbb_transfer,
  243         umass_bbb_reset,
  244         umass_bbb_state
  245 };
  246 
  247 const struct umass_wire_methods umass_cbi_methods = {
  248         umass_cbi_transfer,
  249         umass_cbi_reset,
  250         umass_cbi_state
  251 };
  252 
  253 #ifdef UMASS_DEBUG
  254 /* General debugging functions */
  255 void umass_bbb_dump_cbw(struct umass_softc *sc,
  256                                 umass_bbb_cbw_t *cbw);
  257 void umass_bbb_dump_csw(struct umass_softc *sc,
  258                                 umass_bbb_csw_t *csw);
  259 void umass_dump_buffer(struct umass_softc *sc, u_int8_t *buffer,
  260                                 int buflen, int printlen);
  261 #endif
  262 
  263 
  264 /*
  265  * USB device probe/attach/detach
  266  */
  267 
  268 int
  269 umass_match(struct device *parent, void *match, void *aux)
  270 {
  271         struct usb_attach_arg *uaa = aux;
  272         const struct umass_quirk *quirk;
  273         usb_interface_descriptor_t *id;
  274 
  275         if (uaa->iface == NULL)
  276                 return (UMATCH_NONE);
  277 
  278         quirk = umass_lookup(uaa->vendor, uaa->product);
  279         if (quirk != NULL)
  280                 return (quirk->uq_match);
  281 
  282         id = usbd_get_interface_descriptor(uaa->iface);
  283         if (id == NULL || id->bInterfaceClass != UICLASS_MASS)
  284                 return (UMATCH_NONE);
  285 
  286         switch (id->bInterfaceSubClass) {
  287         case UISUBCLASS_RBC:
  288         case UISUBCLASS_SFF8020I:
  289         case UISUBCLASS_QIC157:
  290         case UISUBCLASS_UFI:
  291         case UISUBCLASS_SFF8070I:
  292         case UISUBCLASS_SCSI:
  293                 break;
  294         default:
  295                 return (UMATCH_IFACECLASS);
  296         }
  297 
  298         switch (id->bInterfaceProtocol) {
  299         case UIPROTO_MASS_CBI_I:
  300         case UIPROTO_MASS_CBI:
  301         case UIPROTO_MASS_BBB_OLD:
  302         case UIPROTO_MASS_BBB:
  303                 break;
  304         default:
  305                 return (UMATCH_IFACECLASS_IFACESUBCLASS);
  306         }
  307 
  308         return (UMATCH_IFACECLASS_IFACESUBCLASS_IFACEPROTO);
  309 }
  310 
  311 void
  312 umass_attach(struct device *parent, struct device *self, void *aux)
  313 {
  314         struct umass_softc *sc = (struct umass_softc *)self;
  315         struct usb_attach_arg *uaa = aux;
  316         const struct umass_quirk *quirk;
  317         usb_interface_descriptor_t *id;
  318         usb_endpoint_descriptor_t *ed;
  319         const char *sWire, *sCommand;
  320         char *devinfop;
  321         usbd_status err;
  322         int i, bno, error;
  323 
  324         devinfop = usbd_devinfo_alloc(uaa->device, 0);
  325         printf("\n%s: %s\n", sc->sc_dev.dv_xname, devinfop);
  326         usbd_devinfo_free(devinfop);
  327 
  328         sc->sc_udev = uaa->device;
  329         sc->sc_iface = uaa->iface;
  330         sc->sc_ifaceno = uaa->ifaceno;
  331 
  332         quirk = umass_lookup(uaa->vendor, uaa->product);
  333         if (quirk != NULL) {
  334                 sc->sc_wire = quirk->uq_wire;
  335                 sc->sc_cmd = quirk->uq_cmd;
  336                 sc->sc_quirks = quirk->uq_flags;
  337                 sc->sc_busquirks = quirk->uq_busquirks;
  338 
  339                 if (quirk->uq_fixup != NULL)
  340                         (*quirk->uq_fixup)(sc);
  341         } else {
  342                 sc->sc_wire = UMASS_WPROTO_UNSPEC;
  343                 sc->sc_cmd = UMASS_CPROTO_UNSPEC;
  344                 sc->sc_quirks = 0;
  345                 sc->sc_busquirks = 0;
  346         }
  347 
  348         id = usbd_get_interface_descriptor(sc->sc_iface);
  349         if (id == NULL)
  350                 return;
  351 
  352         if (sc->sc_wire == UMASS_WPROTO_UNSPEC) {
  353                 switch (id->bInterfaceProtocol) {
  354                 case UIPROTO_MASS_CBI:
  355                         sc->sc_wire = UMASS_WPROTO_CBI;
  356                         break;
  357                 case UIPROTO_MASS_CBI_I:
  358                         sc->sc_wire = UMASS_WPROTO_CBI_I;
  359                         break;
  360                 case UIPROTO_MASS_BBB:
  361                 case UIPROTO_MASS_BBB_OLD:
  362                         sc->sc_wire = UMASS_WPROTO_BBB;
  363                         break;
  364                 default:
  365                         DPRINTF(UDMASS_GEN,
  366                                 ("%s: Unsupported wire protocol %u\n",
  367                                 sc->sc_dev.dv_xname,
  368                                 id->bInterfaceProtocol));
  369                         return;
  370                 }
  371         }
  372 
  373         if (sc->sc_cmd == UMASS_CPROTO_UNSPEC) {
  374                 switch (id->bInterfaceSubClass) {
  375                 case UISUBCLASS_SCSI:
  376                         sc->sc_cmd = UMASS_CPROTO_SCSI;
  377                         break;
  378                 case UISUBCLASS_UFI:
  379                         sc->sc_cmd = UMASS_CPROTO_UFI;
  380                         break;
  381                 case UISUBCLASS_SFF8020I:
  382                 case UISUBCLASS_SFF8070I:
  383                 case UISUBCLASS_QIC157:
  384                         sc->sc_cmd = UMASS_CPROTO_ATAPI;
  385                         break;
  386                 case UISUBCLASS_RBC:
  387                         sc->sc_cmd = UMASS_CPROTO_RBC;
  388                         break;
  389                 default:
  390                         DPRINTF(UDMASS_GEN,
  391                                 ("%s: Unsupported command protocol %u\n",
  392                                 sc->sc_dev.dv_xname,
  393                                 id->bInterfaceSubClass));
  394                         return;
  395                 }
  396         }
  397 
  398         switch (sc->sc_wire) {
  399         case UMASS_WPROTO_CBI:
  400                 sWire = "CBI";
  401                 break;
  402         case UMASS_WPROTO_CBI_I:
  403                 sWire = "CBI with CCI";
  404                 break;
  405         case UMASS_WPROTO_BBB:
  406                 sWire = "Bulk-Only";
  407                 break;
  408         default:
  409                 sWire = "unknown";
  410                 break;
  411         }
  412 
  413         switch (sc->sc_cmd) {
  414         case UMASS_CPROTO_RBC:
  415                 sCommand = "RBC";
  416                 break;
  417         case UMASS_CPROTO_SCSI:
  418                 sCommand = "SCSI";
  419                 break;
  420         case UMASS_CPROTO_UFI:
  421                 sCommand = "UFI";
  422                 break;
  423         case UMASS_CPROTO_ATAPI:
  424                 sCommand = "ATAPI";
  425                 break;
  426         case UMASS_CPROTO_ISD_ATA:
  427                 sCommand = "ISD-ATA";
  428                 break;
  429         default:
  430                 sCommand = "unknown";
  431                 break;
  432         }
  433 
  434         printf("%s: using %s over %s\n", sc->sc_dev.dv_xname, sCommand,
  435                sWire);
  436 
  437         if (quirk != NULL && quirk->uq_init != NULL) {
  438                 err = (*quirk->uq_init)(sc);
  439                 if (err) {
  440                         umass_disco(sc);
  441                         return;
  442                 }
  443         }
  444 
  445         /*
  446          * In addition to the Control endpoint the following endpoints
  447          * are required:
  448          * a) bulk-in endpoint.
  449          * b) bulk-out endpoint.
  450          * and for Control/Bulk/Interrupt with CCI (CBI_I)
  451          * c) intr-in
  452          *
  453          * The endpoint addresses are not fixed, so we have to read them
  454          * from the device descriptors of the current interface.
  455          */
  456         for (i = 0 ; i < id->bNumEndpoints ; i++) {
  457                 ed = usbd_interface2endpoint_descriptor(sc->sc_iface, i);
  458                 if (ed == NULL) {
  459                         printf("%s: could not read endpoint descriptor\n",
  460                                sc->sc_dev.dv_xname);
  461                         return;
  462                 }
  463                 if (UE_GET_DIR(ed->bEndpointAddress) == UE_DIR_IN
  464                     && (ed->bmAttributes & UE_XFERTYPE) == UE_BULK) {
  465                         sc->sc_epaddr[UMASS_BULKIN] = ed->bEndpointAddress;
  466                 } else if (UE_GET_DIR(ed->bEndpointAddress) == UE_DIR_OUT
  467                     && (ed->bmAttributes & UE_XFERTYPE) == UE_BULK) {
  468                         sc->sc_epaddr[UMASS_BULKOUT] = ed->bEndpointAddress;
  469                 } else if (sc->sc_wire == UMASS_WPROTO_CBI_I
  470                     && UE_GET_DIR(ed->bEndpointAddress) == UE_DIR_IN
  471                     && (ed->bmAttributes & UE_XFERTYPE) == UE_INTERRUPT) {
  472                         sc->sc_epaddr[UMASS_INTRIN] = ed->bEndpointAddress;
  473 #ifdef UMASS_DEBUG
  474                         if (UGETW(ed->wMaxPacketSize) > 2) {
  475                                 DPRINTF(UDMASS_CBI, ("%s: intr size is %d\n",
  476                                         sc->sc_dev.dv_xname,
  477                                         UGETW(ed->wMaxPacketSize)));
  478                         }
  479 #endif
  480                 }
  481         }
  482 
  483         /* check whether we found all the endpoints we need */
  484         if (!sc->sc_epaddr[UMASS_BULKIN] || !sc->sc_epaddr[UMASS_BULKOUT] ||
  485             (sc->sc_wire == UMASS_WPROTO_CBI_I &&
  486              !sc->sc_epaddr[UMASS_INTRIN])) {
  487                 DPRINTF(UDMASS_USB, ("%s: endpoint not found %u/%u/%u\n",
  488                         sc->sc_dev.dv_xname, sc->sc_epaddr[UMASS_BULKIN],
  489                         sc->sc_epaddr[UMASS_BULKOUT],
  490                         sc->sc_epaddr[UMASS_INTRIN]));
  491                 return;
  492         }
  493 
  494         /*
  495          * Get the maximum LUN supported by the device.
  496          */
  497         if (sc->sc_wire == UMASS_WPROTO_BBB) {
  498                 err = umass_bbb_get_max_lun(sc, &sc->maxlun);
  499                 if (err) {
  500                         printf("%s: unable to get Max Lun: %s\n",
  501                                sc->sc_dev.dv_xname, usbd_errstr(err));
  502                         return;
  503                 }
  504         } else {
  505                 sc->maxlun = 0;
  506         }
  507 
  508         /* Open the bulk-in and -out pipe */
  509         DPRINTF(UDMASS_USB, ("%s: opening iface %p epaddr %d for BULKOUT\n",
  510             sc->sc_dev.dv_xname, sc->sc_iface,
  511             sc->sc_epaddr[UMASS_BULKOUT]));
  512         err = usbd_open_pipe(sc->sc_iface, sc->sc_epaddr[UMASS_BULKOUT],
  513                                 USBD_EXCLUSIVE_USE,
  514                                 &sc->sc_pipe[UMASS_BULKOUT]);
  515         if (err) {
  516                 DPRINTF(UDMASS_USB, ("%s: cannot open %u-out pipe (bulk)\n",
  517                         sc->sc_dev.dv_xname, sc->sc_epaddr[UMASS_BULKOUT]));
  518                 umass_disco(sc);
  519                 return;
  520         }
  521         DPRINTF(UDMASS_USB, ("%s: opening iface %p epaddr %d for BULKIN\n",
  522             sc->sc_dev.dv_xname, sc->sc_iface,
  523             sc->sc_epaddr[UMASS_BULKIN]));
  524         err = usbd_open_pipe(sc->sc_iface, sc->sc_epaddr[UMASS_BULKIN],
  525                                 USBD_EXCLUSIVE_USE, &sc->sc_pipe[UMASS_BULKIN]);
  526         if (err) {
  527                 DPRINTF(UDMASS_USB, ("%s: could not open %u-in pipe (bulk)\n",
  528                         sc->sc_dev.dv_xname, sc->sc_epaddr[UMASS_BULKIN]));
  529                 umass_disco(sc);
  530                 return;
  531         }
  532         /*
  533          * Open the intr-in pipe if the protocol is CBI with CCI.
  534          * Note: early versions of the Zip drive do have an interrupt pipe, but
  535          * this pipe is unused
  536          *
  537          * We do not open the interrupt pipe as an interrupt pipe, but as a
  538          * normal bulk endpoint. We send an IN transfer down the wire at the
  539          * appropriate time, because we know exactly when to expect data on
  540          * that endpoint. This saves bandwidth, but more important, makes the
  541          * code for handling the data on that endpoint simpler. No data
  542          * arriving concurrently.
  543          */
  544         if (sc->sc_wire == UMASS_WPROTO_CBI_I) {
  545                 DPRINTF(UDMASS_USB, ("%s: opening iface %p epaddr %d for INTRIN\n",
  546                     sc->sc_dev.dv_xname, sc->sc_iface,
  547                     sc->sc_epaddr[UMASS_INTRIN]));
  548                 err = usbd_open_pipe(sc->sc_iface, sc->sc_epaddr[UMASS_INTRIN],
  549                                 USBD_EXCLUSIVE_USE, &sc->sc_pipe[UMASS_INTRIN]);
  550                 if (err) {
  551                         DPRINTF(UDMASS_USB, ("%s: couldn't open %u-in (intr)\n",
  552                                 sc->sc_dev.dv_xname,
  553                                 sc->sc_epaddr[UMASS_INTRIN]));
  554                         umass_disco(sc);
  555                         return;
  556                 }
  557         }
  558 
  559         /* initialisation of generic part */
  560         sc->transfer_state = TSTATE_IDLE;
  561 
  562         /* request a sufficient number of xfer handles */
  563         for (i = 0; i < XFER_NR; i++) {
  564                 sc->transfer_xfer[i] = usbd_alloc_xfer(uaa->device);
  565                 if (sc->transfer_xfer[i] == NULL) {
  566                         DPRINTF(UDMASS_USB, ("%s: Out of memory\n",
  567                                 sc->sc_dev.dv_xname));
  568                         umass_disco(sc);
  569                         return;
  570                 }
  571         }
  572         /* Allocate buffer for data transfer (it's huge). */
  573         switch (sc->sc_wire) {
  574         case UMASS_WPROTO_BBB:
  575                 bno = XFER_BBB_DATA;
  576                 goto dalloc;
  577         case UMASS_WPROTO_CBI:
  578                 bno = XFER_CBI_DATA;
  579                 goto dalloc;
  580         case UMASS_WPROTO_CBI_I:
  581                 bno = XFER_CBI_DATA;
  582         dalloc:
  583                 sc->data_buffer = usbd_alloc_buffer(sc->transfer_xfer[bno],
  584                                                     UMASS_MAX_TRANSFER_SIZE);
  585                 if (sc->data_buffer == NULL) {
  586                         umass_disco(sc);
  587                         return;
  588                 }
  589                 break;
  590         default:
  591                 break;
  592         }
  593 
  594         /* Initialise the wire protocol specific methods */
  595         switch (sc->sc_wire) {
  596         case UMASS_WPROTO_BBB:
  597                 sc->sc_methods = &umass_bbb_methods;
  598                 break;
  599         case UMASS_WPROTO_CBI:
  600         case UMASS_WPROTO_CBI_I:
  601                 sc->sc_methods = &umass_cbi_methods;
  602                 break;
  603         default:
  604                 umass_disco(sc);
  605                 return;
  606         }
  607 
  608         error = 0;
  609         switch (sc->sc_cmd) {
  610         case UMASS_CPROTO_RBC:
  611         case UMASS_CPROTO_SCSI:
  612                 error = umass_scsi_attach(sc);
  613                 break;
  614 
  615         case UMASS_CPROTO_UFI:
  616         case UMASS_CPROTO_ATAPI:
  617 #if (NATAPIBUS > 0) || (NATAPISCSI > 0)
  618                 error = umass_atapi_attach(sc);
  619 #else
  620                 printf("%s: atapiscsi not configured\n", sc->sc_dev.dv_xname);
  621 #endif
  622                 break;
  623 
  624         case UMASS_CPROTO_ISD_ATA:
  625                 printf("%s: isdata not configured\n", sc->sc_dev.dv_xname);
  626                 break;
  627 
  628         default:
  629                 printf("%s: command protocol=0x%x not supported\n",
  630                        sc->sc_dev.dv_xname, sc->sc_cmd);
  631                 umass_disco(sc);
  632                 return;
  633         }
  634         if (error) {
  635                 printf("%s: bus attach failed\n", sc->sc_dev.dv_xname);
  636                 umass_disco(sc);
  637                 return;
  638         }
  639 
  640         usbd_add_drv_event(USB_EVENT_DRIVER_ATTACH, sc->sc_udev,
  641                            &sc->sc_dev);
  642 
  643         DPRINTF(UDMASS_GEN, ("%s: Attach finished\n", sc->sc_dev.dv_xname));
  644 }
  645 
  646 int
  647 umass_detach(struct device *self, int flags)
  648 {
  649         struct umass_softc *sc = (struct umass_softc *)self;
  650         struct umassbus_softc *scbus;
  651         int rv = 0, i, s;
  652 
  653         DPRINTF(UDMASS_USB, ("%s: detached\n", sc->sc_dev.dv_xname));
  654 
  655         /* Abort the pipes to wake up any waiting processes. */
  656         for (i = 0 ; i < UMASS_NEP ; i++) {
  657                 if (sc->sc_pipe[i] != NULL) {
  658                         usbd_abort_pipe(sc->sc_pipe[i]);
  659                         sc->sc_pipe[i] = NULL;
  660                 }
  661         }
  662 
  663         /* Do we really need reference counting?  Perhaps in ioctl() */
  664         s = splusb();
  665         if (--sc->sc_refcnt >= 0) {
  666 #ifdef DIAGNOSTIC
  667                 printf("%s: waiting for refcnt\n", sc->sc_dev.dv_xname);
  668 #endif
  669                 /* Wait for processes to go away. */
  670                 usb_detach_wait(&sc->sc_dev);
  671         }
  672         splx(s);
  673 
  674         scbus = sc->bus;
  675         if (scbus != NULL) {
  676                 if (scbus->sc_child != NULL)
  677                         rv = config_detach(scbus->sc_child, flags);
  678                 free(scbus, M_DEVBUF);
  679                 sc->bus = NULL;
  680         }
  681 
  682         if (rv != 0)
  683                 return (rv);
  684 
  685         umass_disco(sc);
  686 
  687         usbd_add_drv_event(USB_EVENT_DRIVER_DETACH, sc->sc_udev,
  688                            &sc->sc_dev);
  689 
  690         return (rv);
  691 }
  692 
  693 int
  694 umass_activate(struct device *dev, enum devact act)
  695 {
  696         struct umass_softc *sc = (struct umass_softc *)dev;
  697         struct umassbus_softc *scbus = sc->bus;
  698         int rv = 0;
  699 
  700         DPRINTF(UDMASS_USB, ("%s: umass_activate: %d\n",
  701             sc->sc_dev.dv_xname, act));
  702 
  703         switch (act) {
  704         case DVACT_ACTIVATE:
  705                 break;
  706 
  707         case DVACT_DEACTIVATE:
  708                 sc->sc_dying = 1;
  709                 if (scbus == NULL || scbus->sc_child == NULL)
  710                         break;
  711                 rv = config_deactivate(scbus->sc_child);
  712                 DPRINTF(UDMASS_USB, ("%s: umass_activate: child "
  713                     "returned %d\n", sc->sc_dev.dv_xname, rv));
  714                 break;
  715         }
  716         return (rv);
  717 }
  718 
  719 void
  720 umass_disco(struct umass_softc *sc)
  721 {
  722         int i;
  723 
  724         DPRINTF(UDMASS_GEN, ("umass_disco\n"));
  725 
  726         /* Free the xfers. */
  727         for (i = 0; i < XFER_NR; i++)
  728                 if (sc->transfer_xfer[i] != NULL) {
  729                         usbd_free_xfer(sc->transfer_xfer[i]);
  730                         sc->transfer_xfer[i] = NULL;
  731                 }
  732 
  733         /* Remove all the pipes. */
  734         for (i = 0 ; i < UMASS_NEP ; i++) {
  735                 if (sc->sc_pipe[i] != NULL) {
  736                         usbd_close_pipe(sc->sc_pipe[i]);
  737                         sc->sc_pipe[i] = NULL;
  738                 }
  739         }
  740 }
  741 
  742 /*
  743  * Generic functions to handle transfers
  744  */
  745 
  746 usbd_status
  747 umass_polled_transfer(struct umass_softc *sc, usbd_xfer_handle xfer)
  748 {
  749         usbd_status err;
  750 
  751         if (sc->sc_dying)
  752                 return (USBD_IOERROR);
  753 
  754         /*
  755          * If a polled transfer is already in progress, preserve the new
  756          * usbd_xfer_handle and run it after the running one completes.
  757          * This converts the recursive calls into the umass_*_state callbacks
  758          * into iteration, preventing us from running out of stack under
  759          * error conditions.
  760          */
  761         if (sc->polling_depth) {
  762                 if (sc->next_polled_xfer)
  763                         panic("%s: got polled xfer %p, but %p already "
  764                             "pending\n", sc->sc_dev.dv_xname, xfer,
  765                             sc->next_polled_xfer);
  766 
  767                 DPRINTF(UDMASS_XFER, ("%s: saving polled xfer %p\n",
  768                     sc->sc_dev.dv_xname, xfer));
  769                 sc->next_polled_xfer = xfer;
  770 
  771                 return (USBD_IN_PROGRESS);
  772         }
  773 
  774         sc->polling_depth++;
  775 
  776 start_next_xfer:
  777         DPRINTF(UDMASS_XFER, ("%s: start polled xfer %p\n",
  778             sc->sc_dev.dv_xname, xfer));
  779         err = usbd_transfer(xfer);
  780         if (err && err != USBD_IN_PROGRESS && sc->next_polled_xfer == NULL) {
  781                 DPRINTF(UDMASS_BBB, ("%s: failed to setup transfer, %s\n",
  782                     sc->sc_dev.dv_xname, usbd_errstr(err)));
  783                 sc->polling_depth--;
  784                 return (err);
  785         }
  786 
  787         if (err && err != USBD_IN_PROGRESS) {
  788                 DPRINTF(UDMASS_XFER, ("umass_polled_xfer %p has error %s\n",
  789                     xfer, usbd_errstr(err)));
  790         }
  791 
  792         if (sc->next_polled_xfer != NULL) {
  793                 DPRINTF(UDMASS_XFER, ("umass_polled_xfer running next "
  794                     "transaction %p\n", sc->next_polled_xfer));
  795                 xfer = sc->next_polled_xfer;
  796                 sc->next_polled_xfer = NULL;
  797                 goto start_next_xfer;
  798         }
  799 
  800         sc->polling_depth--;
  801 
  802         return (USBD_NORMAL_COMPLETION);
  803 }
  804 
  805 usbd_status
  806 umass_setup_transfer(struct umass_softc *sc, usbd_pipe_handle pipe,
  807                         void *buffer, int buflen, int flags,
  808                         usbd_xfer_handle xfer)
  809 {
  810         usbd_status err;
  811 
  812         if (sc->sc_dying)
  813                 return (USBD_IOERROR);
  814 
  815         /* Initialise a USB transfer and then schedule it */
  816 
  817         usbd_setup_xfer(xfer, pipe, (void *)sc, buffer, buflen,
  818             flags | sc->sc_xfer_flags, sc->timeout, sc->sc_methods->wire_state);
  819 
  820         if (sc->sc_udev->bus->use_polling) {
  821                 DPRINTF(UDMASS_XFER,("%s: start polled xfer buffer=%p "
  822                     "buflen=%d flags=0x%x timeout=%d\n", sc->sc_dev.dv_xname,
  823                     buffer, buflen, flags | sc->sc_xfer_flags, sc->timeout));
  824                 err = umass_polled_transfer(sc, xfer);
  825         } else {
  826                 err = usbd_transfer(xfer);
  827                 DPRINTF(UDMASS_XFER,("%s: start xfer buffer=%p buflen=%d "
  828                     "flags=0x%x timeout=%d\n", sc->sc_dev.dv_xname,
  829                     buffer, buflen, flags | sc->sc_xfer_flags, sc->timeout));
  830         }
  831         if (err && err != USBD_IN_PROGRESS) {
  832                 DPRINTF(UDMASS_BBB, ("%s: failed to setup transfer, %s\n",
  833                         sc->sc_dev.dv_xname, usbd_errstr(err)));
  834                 return (err);
  835         }
  836 
  837         return (USBD_NORMAL_COMPLETION);
  838 }
  839 
  840 
  841 usbd_status
  842 umass_setup_ctrl_transfer(struct umass_softc *sc, usb_device_request_t *req,
  843          void *buffer, int buflen, int flags, usbd_xfer_handle xfer)
  844 {
  845         usbd_status err;
  846 
  847         if (sc->sc_dying)
  848                 return (USBD_IOERROR);
  849 
  850         /* Initialise a USB control transfer and then schedule it */
  851 
  852         usbd_setup_default_xfer(xfer, sc->sc_udev, (void *) sc,
  853             USBD_DEFAULT_TIMEOUT, req, buffer, buflen, flags,
  854             sc->sc_methods->wire_state);
  855 
  856         if (sc->sc_udev->bus->use_polling) {
  857                 DPRINTF(UDMASS_XFER,("%s: start polled ctrl xfer buffer=%p "
  858                     "buflen=%d flags=0x%x\n", sc->sc_dev.dv_xname, buffer,
  859                     buflen, flags));
  860                 err = umass_polled_transfer(sc, xfer);
  861         } else {
  862                 DPRINTF(UDMASS_XFER,("%s: start ctrl xfer buffer=%p buflen=%d "
  863                     "flags=0x%x\n", sc->sc_dev.dv_xname, buffer, buflen,
  864                     flags));
  865                 err = usbd_transfer(xfer);
  866         }
  867         if (err && err != USBD_IN_PROGRESS) {
  868                 DPRINTF(UDMASS_BBB, ("%s: failed to setup ctrl transfer, %s\n",
  869                          sc->sc_dev.dv_xname, usbd_errstr(err)));
  870 
  871                 /* do not reset, as this would make us loop */
  872                 return (err);
  873         }
  874 
  875         return (USBD_NORMAL_COMPLETION);
  876 }
  877 
  878 void
  879 umass_adjust_transfer(struct umass_softc *sc)
  880 {
  881         switch (sc->sc_cmd) {
  882         case UMASS_CPROTO_UFI:
  883                 sc->cbw.bCDBLength = UFI_COMMAND_LENGTH; 
  884                 /* Adjust the length field in certain scsi commands. */
  885                 switch (sc->cbw.CBWCDB[0]) {
  886                 case INQUIRY:
  887                         if (sc->transfer_datalen > 36) {
  888                                 sc->transfer_datalen = 36;
  889                                 sc->cbw.CBWCDB[4] = 36;
  890                         }
  891                         break;
  892                 case MODE_SENSE_BIG:
  893                         if (sc->transfer_datalen > 8) {
  894                                 sc->transfer_datalen = 8;
  895                                 sc->cbw.CBWCDB[7] = 0;
  896                                 sc->cbw.CBWCDB[8] = 8;
  897                         }
  898                         break;
  899                 case REQUEST_SENSE:
  900                         if (sc->transfer_datalen > 18) {
  901                                 sc->transfer_datalen = 18;
  902                                 sc->cbw.CBWCDB[4] = 18;
  903                         }
  904                         break;
  905                 }
  906                 break;
  907         case UMASS_CPROTO_ATAPI:
  908                 sc->cbw.bCDBLength = UFI_COMMAND_LENGTH; 
  909                 break;
  910         }
  911 }
  912 
  913 void
  914 umass_clear_endpoint_stall(struct umass_softc *sc, int endpt,
  915         usbd_xfer_handle xfer)
  916 {
  917         if (sc->sc_dying)
  918                 return;
  919 
  920         DPRINTF(UDMASS_BBB, ("%s: Clear endpoint 0x%02x stall\n",
  921                 sc->sc_dev.dv_xname, sc->sc_epaddr[endpt]));
  922 
  923         usbd_clear_endpoint_toggle(sc->sc_pipe[endpt]);
  924 
  925         sc->sc_req.bmRequestType = UT_WRITE_ENDPOINT;
  926         sc->sc_req.bRequest = UR_CLEAR_FEATURE;
  927         USETW(sc->sc_req.wValue, UF_ENDPOINT_HALT);
  928         USETW(sc->sc_req.wIndex, sc->sc_epaddr[endpt]);
  929         USETW(sc->sc_req.wLength, 0);
  930         umass_setup_ctrl_transfer(sc, &sc->sc_req, NULL, 0, 0, xfer);
  931 }
  932 
  933 #if 0
  934 void
  935 umass_reset(struct umass_softc *sc, transfer_cb_f cb, void *priv)
  936 {
  937         sc->transfer_cb = cb;
  938         sc->transfer_priv = priv;
  939 
  940         /* The reset is a forced reset, so no error (yet) */
  941         sc->reset(sc, STATUS_CMD_OK);
  942 }
  943 #endif
  944 
  945 /*
  946  * Bulk protocol specific functions
  947  */
  948 
  949 void
  950 umass_bbb_reset(struct umass_softc *sc, int status)
  951 {
  952         KASSERT(sc->sc_wire & UMASS_WPROTO_BBB,
  953                 ("sc->sc_wire == 0x%02x wrong for umass_bbb_reset\n",
  954                 sc->sc_wire));
  955 
  956         if (sc->sc_dying)
  957                 return;
  958 
  959         /*
  960          * Reset recovery (5.3.4 in Universal Serial Bus Mass Storage Class)
  961          *
  962          * For Reset Recovery the host shall issue in the following order:
  963          * a) a Bulk-Only Mass Storage Reset
  964          * b) a Clear Feature HALT to the Bulk-In endpoint
  965          * c) a Clear Feature HALT to the Bulk-Out endpoint
  966          *
  967          * This is done in 3 steps, states:
  968          * TSTATE_BBB_RESET1
  969          * TSTATE_BBB_RESET2
  970          * TSTATE_BBB_RESET3
  971          *
  972          * If the reset doesn't succeed, the device should be port reset.
  973          */
  974 
  975         DPRINTF(UDMASS_BBB, ("%s: Bulk Reset\n",
  976                 sc->sc_dev.dv_xname));
  977 
  978         sc->transfer_state = TSTATE_BBB_RESET1;
  979         sc->transfer_status = status;
  980 
  981         /* reset is a class specific interface write */
  982         sc->sc_req.bmRequestType = UT_WRITE_CLASS_INTERFACE;
  983         sc->sc_req.bRequest = UR_BBB_RESET;
  984         USETW(sc->sc_req.wValue, 0);
  985         USETW(sc->sc_req.wIndex, sc->sc_ifaceno);
  986         USETW(sc->sc_req.wLength, 0);
  987         umass_setup_ctrl_transfer(sc, &sc->sc_req, NULL, 0, 0,
  988                                   sc->transfer_xfer[XFER_BBB_RESET1]);
  989 }
  990 
  991 void
  992 umass_bbb_transfer(struct umass_softc *sc, int lun, void *cmd, int cmdlen,
  993                    void *data, int datalen, int dir, u_int timeout,
  994                    umass_callback cb, void *priv)
  995 {
  996         static int dCBWtag = 42;        /* unique for CBW of transfer */
  997         usbd_status err;
  998 
  999         DPRINTF(UDMASS_BBB,("%s: umass_bbb_transfer cmd=0x%02x\n",
 1000                 sc->sc_dev.dv_xname, *(u_char *)cmd));
 1001 
 1002         KASSERT(sc->sc_wire & UMASS_WPROTO_BBB,
 1003                 ("sc->sc_wire == 0x%02x wrong for umass_bbb_transfer\n",
 1004                 sc->sc_wire));
 1005 
 1006         if (sc->sc_dying) {
 1007                 sc->polled_xfer_status = USBD_IOERROR;
 1008                 return;
 1009         }
 1010 
 1011         /* Be a little generous. */
 1012         sc->timeout = timeout + USBD_DEFAULT_TIMEOUT;
 1013 
 1014         /*
 1015          * Do a Bulk-Only transfer with cmdlen bytes from cmd, possibly
 1016          * a data phase of datalen bytes from/to the device and finally a
 1017          * csw read phase.
 1018          * If the data direction was inbound a maximum of datalen bytes
 1019          * is stored in the buffer pointed to by data.
 1020          *
 1021          * umass_bbb_transfer initialises the transfer and lets the state
 1022          * machine in umass_bbb_state handle the completion. It uses the
 1023          * following states:
 1024          * TSTATE_BBB_COMMAND
 1025          *   -> TSTATE_BBB_DATA
 1026          *   -> TSTATE_BBB_STATUS
 1027          *   -> TSTATE_BBB_STATUS2
 1028          *   -> TSTATE_BBB_IDLE
 1029          *
 1030          * An error in any of those states will invoke
 1031          * umass_bbb_reset.
 1032          */
 1033 
 1034         /* check the given arguments */
 1035         KASSERT(datalen == 0 || data != NULL,
 1036                 ("%s: datalen > 0, but no buffer",sc->sc_dev.dv_xname));
 1037         KASSERT(cmdlen <= CBWCDBLENGTH,
 1038                 ("%s: cmdlen exceeds CDB length in CBW (%d > %d)",
 1039                         sc->sc_dev.dv_xname, cmdlen, CBWCDBLENGTH));
 1040         KASSERT(dir == DIR_NONE || datalen > 0,
 1041                 ("%s: datalen == 0 while direction is not NONE\n",
 1042                         sc->sc_dev.dv_xname));
 1043         KASSERT(datalen == 0 || dir != DIR_NONE,
 1044                 ("%s: direction is NONE while datalen is not zero\n",
 1045                         sc->sc_dev.dv_xname));
 1046         KASSERT(sizeof(umass_bbb_cbw_t) == UMASS_BBB_CBW_SIZE,
 1047                 ("%s: CBW struct does not have the right size (%d vs. %d)\n",
 1048                         sc->sc_dev.dv_xname,
 1049                         sizeof(umass_bbb_cbw_t), UMASS_BBB_CBW_SIZE));
 1050         KASSERT(sizeof(umass_bbb_csw_t) == UMASS_BBB_CSW_SIZE,
 1051                 ("%s: CSW struct does not have the right size (%d vs. %d)\n",
 1052                         sc->sc_dev.dv_xname,
 1053                         sizeof(umass_bbb_csw_t), UMASS_BBB_CSW_SIZE));
 1054 
 1055         /*
 1056          * Determine the direction of the data transfer and the length.
 1057          *
 1058          * dCBWDataTransferLength (datalen) :
 1059          *   This field indicates the number of bytes of data that the host
 1060          *   intends to transfer on the IN or OUT Bulk endpoint(as indicated by
 1061          *   the Direction bit) during the execution of this command. If this
 1062          *   field is set to 0, the device will expect that no data will be
 1063          *   transferred IN or OUT during this command, regardless of the value
 1064          *   of the Direction bit defined in dCBWFlags.
 1065          *
 1066          * dCBWFlags (dir) :
 1067          *   The bits of the Flags field are defined as follows:
 1068          *     Bits 0-6  reserved
 1069          *     Bit  7    Direction - this bit shall be ignored if the
 1070          *                           dCBWDataTransferLength field is zero.
 1071          *               0 = data Out from host to device
 1072          *               1 = data In from device to host
 1073          */
 1074 
 1075         /* Fill in the Command Block Wrapper */
 1076         USETDW(sc->cbw.dCBWSignature, CBWSIGNATURE);
 1077         USETDW(sc->cbw.dCBWTag, dCBWtag);
 1078         dCBWtag++;      /* cannot be done in macro (it will be done 4 times) */
 1079         USETDW(sc->cbw.dCBWDataTransferLength, datalen);
 1080         /* DIR_NONE is treated as DIR_OUT (0x00) */
 1081         sc->cbw.bCBWFlags = (dir == DIR_IN? CBWFLAGS_IN:CBWFLAGS_OUT);
 1082         sc->cbw.bCBWLUN = lun;
 1083         sc->cbw.bCDBLength = cmdlen;
 1084         bzero(sc->cbw.CBWCDB, sizeof(sc->cbw.CBWCDB));
 1085         memcpy(sc->cbw.CBWCDB, cmd, cmdlen);
 1086 
 1087         DIF(UDMASS_BBB, umass_bbb_dump_cbw(sc, &sc->cbw));
 1088 
 1089         /* store the details for the data transfer phase */
 1090         sc->transfer_dir = dir;
 1091         sc->transfer_data = data;
 1092         sc->transfer_datalen = datalen;
 1093         sc->transfer_actlen = 0;
 1094         sc->transfer_cb = cb;
 1095         sc->transfer_priv = priv;
 1096         sc->transfer_status = STATUS_CMD_OK;
 1097 
 1098         /* move from idle to the command state */
 1099         sc->transfer_state = TSTATE_BBB_COMMAND;
 1100 
 1101         /* Send the CBW from host to device via bulk-out endpoint. */
 1102         umass_adjust_transfer(sc);
 1103         if ((err = umass_setup_transfer(sc, sc->sc_pipe[UMASS_BULKOUT],
 1104                         &sc->cbw, UMASS_BBB_CBW_SIZE, 0,
 1105                         sc->transfer_xfer[XFER_BBB_CBW])))
 1106                 umass_bbb_reset(sc, STATUS_WIRE_FAILED);
 1107 
 1108         if (sc->sc_udev->bus->use_polling)
 1109                 sc->polled_xfer_status = err;
 1110 }
 1111 
 1112 void
 1113 umass_bbb_state(usbd_xfer_handle xfer, usbd_private_handle priv,
 1114                 usbd_status err)
 1115 {
 1116         struct umass_softc *sc = (struct umass_softc *) priv;
 1117         usbd_xfer_handle next_xfer;
 1118 
 1119         KASSERT(sc->sc_wire & UMASS_WPROTO_BBB,
 1120                 ("sc->sc_wire == 0x%02x wrong for umass_bbb_state\n",
 1121                 sc->sc_wire));
 1122 
 1123         if (sc->sc_dying)
 1124                 return;
 1125 
 1126         /*
 1127          * State handling for BBB transfers.
 1128          *
 1129          * The subroutine is rather long. It steps through the states given in
 1130          * Annex A of the Bulk-Only specification.
 1131          * Each state first does the error handling of the previous transfer
 1132          * and then prepares the next transfer.
 1133          * Each transfer is done asynchronously so after the request/transfer
 1134          * has been submitted you will find a 'return;'.
 1135          */
 1136 
 1137         DPRINTF(UDMASS_BBB, ("%s: Handling BBB state %d (%s), xfer=%p, %s\n",
 1138                 sc->sc_dev.dv_xname, sc->transfer_state,
 1139                 states[sc->transfer_state], xfer, usbd_errstr(err)));
 1140 
 1141         switch (sc->transfer_state) {
 1142 
 1143         /***** Bulk Transfer *****/
 1144         case TSTATE_BBB_COMMAND:
 1145                 /* Command transport phase, error handling */
 1146                 if (err) {
 1147                         DPRINTF(UDMASS_BBB, ("%s: failed to send CBW\n",
 1148                                 sc->sc_dev.dv_xname));
 1149                         /* If the device detects that the CBW is invalid, then
 1150                          * the device may STALL both bulk endpoints and require
 1151                          * a Bulk-Reset
 1152                          */
 1153                         umass_bbb_reset(sc, STATUS_WIRE_FAILED);
 1154                         return;
 1155                 }
 1156 
 1157                 /* Data transport phase, setup transfer */
 1158                 sc->transfer_state = TSTATE_BBB_DATA;
 1159                 if (sc->transfer_dir == DIR_IN) {
 1160                         if (umass_setup_transfer(sc, sc->sc_pipe[UMASS_BULKIN],
 1161                                         sc->data_buffer, sc->transfer_datalen,
 1162                                         USBD_SHORT_XFER_OK | USBD_NO_COPY,
 1163                                         sc->transfer_xfer[XFER_BBB_DATA]))
 1164                                 umass_bbb_reset(sc, STATUS_WIRE_FAILED);
 1165 
 1166                         return;
 1167                 } else if (sc->transfer_dir == DIR_OUT) {
 1168                         memcpy(sc->data_buffer, sc->transfer_data,
 1169                                sc->transfer_datalen);
 1170                         if (umass_setup_transfer(sc, sc->sc_pipe[UMASS_BULKOUT],
 1171                                         sc->data_buffer, sc->transfer_datalen,
 1172                                         USBD_NO_COPY,/* fixed length transfer */
 1173                                         sc->transfer_xfer[XFER_BBB_DATA]))
 1174                                 umass_bbb_reset(sc, STATUS_WIRE_FAILED);
 1175 
 1176                         return;
 1177                 } else {
 1178                         DPRINTF(UDMASS_BBB, ("%s: no data phase\n",
 1179                                 sc->sc_dev.dv_xname));
 1180                 }
 1181 
 1182                 /* FALLTHROUGH if no data phase, err == 0 */
 1183         case TSTATE_BBB_DATA:
 1184                 /* Command transport phase error handling (ignored if no data
 1185                  * phase (fallthrough from previous state)) */
 1186                 if (sc->transfer_dir != DIR_NONE) {
 1187                         /* retrieve the length of the transfer that was done */
 1188                         usbd_get_xfer_status(xfer, NULL, NULL,
 1189                              &sc->transfer_actlen, NULL);
 1190                         DPRINTF(UDMASS_BBB, ("%s: BBB_DATA actlen=%d\n",
 1191                                 sc->sc_dev.dv_xname, sc->transfer_actlen));
 1192 
 1193                         if (err) {
 1194                                 DPRINTF(UDMASS_BBB, ("%s: Data-%s %d failed, "
 1195                                         "%s\n", sc->sc_dev.dv_xname,
 1196                                         (sc->transfer_dir == DIR_IN?"in":"out"),
 1197                                         sc->transfer_datalen,usbd_errstr(err)));
 1198 
 1199                                 if (err == USBD_STALLED) {
 1200                                         sc->transfer_state = TSTATE_BBB_DCLEAR;
 1201                                         umass_clear_endpoint_stall(sc,
 1202                                           (sc->transfer_dir == DIR_IN?
 1203                                             UMASS_BULKIN:UMASS_BULKOUT),
 1204                                           sc->transfer_xfer[XFER_BBB_DCLEAR]);
 1205                                 } else {
 1206                                         /* Unless the error is a pipe stall the
 1207                                          * error is fatal.
 1208                                          */
 1209                                         umass_bbb_reset(sc,STATUS_WIRE_FAILED);
 1210                                 }
 1211                                 return;
 1212                         }
 1213                 }
 1214 
 1215                 /* FALLTHROUGH, err == 0 (no data phase or successful) */
 1216         case TSTATE_BBB_DCLEAR: /* stall clear after data phase */
 1217                 if (sc->transfer_dir == DIR_IN)
 1218                         memcpy(sc->transfer_data, sc->data_buffer,
 1219                                sc->transfer_actlen);
 1220 
 1221                 DIF(UDMASS_BBB, if (sc->transfer_dir == DIR_IN)
 1222                                         umass_dump_buffer(sc, sc->transfer_data,
 1223                                                 sc->transfer_datalen, 48));
 1224 
 1225                 /* FALLTHROUGH, err == 0 (no data phase or successful) */
 1226         case TSTATE_BBB_SCLEAR: /* stall clear after status phase */
 1227                 /* Reading of CSW after bulk stall condition in data phase
 1228                  * (TSTATE_BBB_DATA2) or bulk-in stall condition after
 1229                  * reading CSW (TSTATE_BBB_SCLEAR).
 1230                  * In the case of no data phase or successful data phase,
 1231                  * err == 0 and the following if block is passed.
 1232                  */
 1233                 if (err) {      /* should not occur */
 1234                         printf("%s: BBB bulk-%s stall clear failed, %s\n",
 1235                             sc->sc_dev.dv_xname,
 1236                             (sc->transfer_dir == DIR_IN? "in":"out"),
 1237                             usbd_errstr(err));
 1238                         umass_bbb_reset(sc, STATUS_WIRE_FAILED);
 1239                         return;
 1240                 }
 1241 
 1242                 /* Status transport phase, setup transfer */
 1243                 if (sc->transfer_state == TSTATE_BBB_COMMAND ||
 1244                     sc->transfer_state == TSTATE_BBB_DATA ||
 1245                     sc->transfer_state == TSTATE_BBB_DCLEAR) {
 1246                         /* After no data phase, successful data phase and
 1247                          * after clearing bulk-in/-out stall condition
 1248                          */
 1249                         sc->transfer_state = TSTATE_BBB_STATUS1;
 1250                         next_xfer = sc->transfer_xfer[XFER_BBB_CSW1];
 1251                 } else {
 1252                         /* After first attempt of fetching CSW */
 1253                         sc->transfer_state = TSTATE_BBB_STATUS2;
 1254                         next_xfer = sc->transfer_xfer[XFER_BBB_CSW2];
 1255                 }
 1256 
 1257                 /* Read the Command Status Wrapper via bulk-in endpoint. */
 1258                 if (umass_setup_transfer(sc, sc->sc_pipe[UMASS_BULKIN],
 1259                         &sc->csw, UMASS_BBB_CSW_SIZE, 0, next_xfer)) {
 1260                         umass_bbb_reset(sc, STATUS_WIRE_FAILED);
 1261                         return;
 1262                 }
 1263 
 1264                 return;
 1265         case TSTATE_BBB_STATUS1:        /* first attempt */
 1266         case TSTATE_BBB_STATUS2:        /* second attempt */
 1267                 /* Status transfer, error handling */
 1268                 if (err) {
 1269                         DPRINTF(UDMASS_BBB, ("%s: Failed to read CSW, %s%s\n",
 1270                                 sc->sc_dev.dv_xname, usbd_errstr(err),
 1271                                 (sc->transfer_state == TSTATE_BBB_STATUS1?
 1272                                         ", retrying":"")));
 1273 
 1274                         /* If this was the first attempt at fetching the CSW
 1275                          * retry it, otherwise fail.
 1276                          */
 1277                         if (sc->transfer_state == TSTATE_BBB_STATUS1) {
 1278                                 sc->transfer_state = TSTATE_BBB_SCLEAR;
 1279                                 umass_clear_endpoint_stall(sc, UMASS_BULKIN,
 1280                                     sc->transfer_xfer[XFER_BBB_SCLEAR]);
 1281                                 return;
 1282                         } else {
 1283                                 umass_bbb_reset(sc, STATUS_WIRE_FAILED);
 1284                                 return;
 1285                         }
 1286                 }
 1287 
 1288                 DIF(UDMASS_BBB, umass_bbb_dump_csw(sc, &sc->csw));
 1289 
 1290                 /* Translate weird command-status signatures. */
 1291                 if ((sc->sc_quirks & UMASS_QUIRK_WRONG_CSWSIG) &&
 1292                     UGETDW(sc->csw.dCSWSignature) == CSWSIGNATURE_OLYMPUS_C1)
 1293                         USETDW(sc->csw.dCSWSignature, CSWSIGNATURE);
 1294 
 1295                 /* Translate invalid command-status tags */
 1296                 if (sc->sc_quirks & UMASS_QUIRK_WRONG_CSWTAG)
 1297                         USETDW(sc->csw.dCSWTag, UGETDW(sc->cbw.dCBWTag));
 1298 
 1299                 /* Check CSW and handle any error */
 1300                 if (UGETDW(sc->csw.dCSWSignature) != CSWSIGNATURE) {
 1301                         /* Invalid CSW: Wrong signature or wrong tag might
 1302                          * indicate that the device is confused -> reset it.
 1303                          */
 1304                         printf("%s: Invalid CSW: sig 0x%08x should be 0x%08x\n",
 1305                                 sc->sc_dev.dv_xname,
 1306                                 UGETDW(sc->csw.dCSWSignature),
 1307                                 CSWSIGNATURE);
 1308 
 1309                         umass_bbb_reset(sc, STATUS_WIRE_FAILED);
 1310                         return;
 1311                 } else if (UGETDW(sc->csw.dCSWTag)
 1312                                 != UGETDW(sc->cbw.dCBWTag)) {
 1313                         printf("%s: Invalid CSW: tag %d should be %d\n",
 1314                                 sc->sc_dev.dv_xname,
 1315                                 UGETDW(sc->csw.dCSWTag),
 1316                                 UGETDW(sc->cbw.dCBWTag));
 1317 
 1318                         umass_bbb_reset(sc, STATUS_WIRE_FAILED);
 1319                         return;
 1320 
 1321                 /* CSW is valid here */
 1322                 } else if (sc->csw.bCSWStatus > CSWSTATUS_PHASE) {
 1323                         printf("%s: Invalid CSW: status %d > %d\n",
 1324                                 sc->sc_dev.dv_xname,
 1325                                 sc->csw.bCSWStatus,
 1326                                 CSWSTATUS_PHASE);
 1327 
 1328                         umass_bbb_reset(sc, STATUS_WIRE_FAILED);
 1329                         return;
 1330                 } else if (sc->csw.bCSWStatus == CSWSTATUS_PHASE) {
 1331                         printf("%s: Phase Error, residue = %d\n",
 1332                                 sc->sc_dev.dv_xname,
 1333                                 UGETDW(sc->csw.dCSWDataResidue));
 1334 
 1335                         umass_bbb_reset(sc, STATUS_WIRE_FAILED);
 1336                         return;
 1337 
 1338                 } else if (sc->transfer_actlen > sc->transfer_datalen) {
 1339                         /* Buffer overrun! Don't let this go by unnoticed */
 1340                         panic("%s: transferred %d bytes instead of %d bytes",
 1341                                 sc->sc_dev.dv_xname,
 1342                                 sc->transfer_actlen, sc->transfer_datalen);
 1343 #if 0
 1344                 } else if (sc->transfer_datalen - sc->transfer_actlen
 1345                            != UGETDW(sc->csw.dCSWDataResidue)) {
 1346                         DPRINTF(UDMASS_BBB, ("%s: actlen=%d != residue=%d\n",
 1347                                 sc->sc_dev.dv_xname,
 1348                                 sc->transfer_datalen - sc->transfer_actlen,
 1349                                 UGETDW(sc->csw.dCSWDataResidue)));
 1350 
 1351                         umass_bbb_reset(sc, STATUS_WIRE_FAILED);
 1352                         return;
 1353 #endif
 1354                 } else if (sc->csw.bCSWStatus == CSWSTATUS_FAILED) {
 1355                         DPRINTF(UDMASS_BBB, ("%s: Command Failed, res = %d\n",
 1356                                 sc->sc_dev.dv_xname,
 1357                                 UGETDW(sc->csw.dCSWDataResidue)));
 1358 
 1359                         /* SCSI command failed but transfer was successful */
 1360                         sc->transfer_state = TSTATE_IDLE;
 1361                         sc->transfer_cb(sc, sc->transfer_priv,
 1362                                         UGETDW(sc->csw.dCSWDataResidue),
 1363                                         STATUS_CMD_FAILED);
 1364 
 1365                         return;
 1366 
 1367                 } else {        /* success */
 1368                         sc->transfer_state = TSTATE_IDLE;
 1369                         sc->transfer_cb(sc, sc->transfer_priv,
 1370                                         UGETDW(sc->csw.dCSWDataResidue),
 1371                                         STATUS_CMD_OK);
 1372 
 1373                         return;
 1374                 }
 1375 
 1376         /***** Bulk Reset *****/
 1377         case TSTATE_BBB_RESET1:
 1378                 if (err)
 1379                         printf("%s: BBB reset failed, %s\n",
 1380                                 sc->sc_dev.dv_xname, usbd_errstr(err));
 1381 
 1382                 sc->transfer_state = TSTATE_BBB_RESET2;
 1383                 umass_clear_endpoint_stall(sc, UMASS_BULKIN,
 1384                         sc->transfer_xfer[XFER_BBB_RESET2]);
 1385 
 1386                 return;
 1387         case TSTATE_BBB_RESET2:
 1388                 if (err)        /* should not occur */
 1389                         printf("%s: BBB bulk-in clear stall failed, %s\n",
 1390                                sc->sc_dev.dv_xname, usbd_errstr(err));
 1391                         /* no error recovery, otherwise we end up in a loop */
 1392 
 1393                 sc->transfer_state = TSTATE_BBB_RESET3;
 1394                 umass_clear_endpoint_stall(sc, UMASS_BULKOUT,
 1395                         sc->transfer_xfer[XFER_BBB_RESET3]);
 1396 
 1397                 return;
 1398         case TSTATE_BBB_RESET3:
 1399                 if (err)        /* should not occur */
 1400                         printf("%s: BBB bulk-out clear stall failed, %s\n",
 1401                                sc->sc_dev.dv_xname, usbd_errstr(err));
 1402                         /* no error recovery, otherwise we end up in a loop */
 1403 
 1404                 sc->transfer_state = TSTATE_IDLE;
 1405                 if (sc->transfer_priv) {
 1406                         sc->transfer_cb(sc, sc->transfer_priv,
 1407                                         sc->transfer_datalen,
 1408                                         sc->transfer_status);
 1409                 }
 1410 
 1411                 return;
 1412 
 1413         /***** Default *****/
 1414         default:
 1415                 panic("%s: Unknown state %d",
 1416                       sc->sc_dev.dv_xname, sc->transfer_state);
 1417         }
 1418 }
 1419 
 1420 /*
 1421  * Command/Bulk/Interrupt (CBI) specific functions
 1422  */
 1423 
 1424 int
 1425 umass_cbi_adsc(struct umass_softc *sc, char *buffer, int buflen,
 1426                usbd_xfer_handle xfer)
 1427 {
 1428         KASSERT(sc->sc_wire & (UMASS_WPROTO_CBI|UMASS_WPROTO_CBI_I),
 1429                 ("sc->sc_wire == 0x%02x wrong for umass_cbi_adsc\n",
 1430                 sc->sc_wire));
 1431 
 1432         sc->sc_req.bmRequestType = UT_WRITE_CLASS_INTERFACE;
 1433         sc->sc_req.bRequest = UR_CBI_ADSC;
 1434         USETW(sc->sc_req.wValue, 0);
 1435         USETW(sc->sc_req.wIndex, sc->sc_ifaceno);
 1436         USETW(sc->sc_req.wLength, buflen);
 1437         return umass_setup_ctrl_transfer(sc, &sc->sc_req, buffer,
 1438                                          buflen, 0, xfer);
 1439 }
 1440 
 1441 
 1442 void
 1443 umass_cbi_reset(struct umass_softc *sc, int status)
 1444 {
 1445         int i;
 1446 #       define SEND_DIAGNOSTIC_CMDLEN   12
 1447 
 1448         KASSERT(sc->sc_wire & (UMASS_WPROTO_CBI|UMASS_WPROTO_CBI_I),
 1449                 ("sc->sc_wire == 0x%02x wrong for umass_cbi_reset\n",
 1450                 sc->sc_wire));
 1451 
 1452         if (sc->sc_dying)
 1453                 return;
 1454 
 1455         /*
 1456          * Command Block Reset Protocol
 1457          *
 1458          * First send a reset request to the device. Then clear
 1459          * any possibly stalled bulk endpoints.
 1460 
 1461          * This is done in 3 steps, states:
 1462          * TSTATE_CBI_RESET1
 1463          * TSTATE_CBI_RESET2
 1464          * TSTATE_CBI_RESET3
 1465          *
 1466          * If the reset doesn't succeed, the device should be port reset.
 1467          */
 1468 
 1469         DPRINTF(UDMASS_CBI, ("%s: CBI Reset\n",
 1470                 sc->sc_dev.dv_xname));
 1471 
 1472         KASSERT(sizeof(sc->cbl) >= SEND_DIAGNOSTIC_CMDLEN,
 1473                 ("%s: CBL struct is too small (%d < %d)\n",
 1474                         sc->sc_dev.dv_xname,
 1475                         sizeof(sc->cbl), SEND_DIAGNOSTIC_CMDLEN));
 1476 
 1477         sc->transfer_state = TSTATE_CBI_RESET1;
 1478         sc->transfer_status = status;
 1479 
 1480         /* The 0x1d code is the SEND DIAGNOSTIC command. To distinguish between
 1481          * the two the last 10 bytes of the cbl is filled with 0xff (section
 1482          * 2.2 of the CBI spec).
 1483          */
 1484         sc->cbl[0] = 0x1d;      /* Command Block Reset */
 1485         sc->cbl[1] = 0x04;
 1486         for (i = 2; i < SEND_DIAGNOSTIC_CMDLEN; i++)
 1487                 sc->cbl[i] = 0xff;
 1488 
 1489         umass_cbi_adsc(sc, sc->cbl, SEND_DIAGNOSTIC_CMDLEN,
 1490                        sc->transfer_xfer[XFER_CBI_RESET1]);
 1491         /* XXX if the command fails we should reset the port on the bub */
 1492 }
 1493 
 1494 void
 1495 umass_cbi_transfer(struct umass_softc *sc, int lun,
 1496                    void *cmd, int cmdlen, void *data, int datalen, int dir,
 1497                    u_int timeout, umass_callback cb, void *priv)
 1498 {
 1499         usbd_status err;
 1500 
 1501         DPRINTF(UDMASS_CBI,("%s: umass_cbi_transfer cmd=0x%02x, len=%d\n",
 1502                 sc->sc_dev.dv_xname, *(u_char *)cmd, datalen));
 1503 
 1504         KASSERT(sc->sc_wire & (UMASS_WPROTO_CBI|UMASS_WPROTO_CBI_I),
 1505                 ("sc->sc_wire == 0x%02x wrong for umass_cbi_transfer\n",
 1506                 sc->sc_wire));
 1507 
 1508         if (sc->sc_dying) {
 1509                 sc->polled_xfer_status = USBD_IOERROR;
 1510                 return;
 1511         }
 1512 
 1513         /* Be a little generous. */
 1514         sc->timeout = timeout + USBD_DEFAULT_TIMEOUT;
 1515 
 1516         /*
 1517          * Do a CBI transfer with cmdlen bytes from cmd, possibly
 1518          * a data phase of datalen bytes from/to the device and finally a
 1519          * csw read phase.
 1520          * If the data direction was inbound a maximum of datalen bytes
 1521          * is stored in the buffer pointed to by data.
 1522          *
 1523          * umass_cbi_transfer initialises the transfer and lets the state
 1524          * machine in umass_cbi_state handle the completion. It uses the
 1525          * following states:
 1526          * TSTATE_CBI_COMMAND
 1527          *   -> XXX fill in
 1528          *
 1529          * An error in any of those states will invoke
 1530          * umass_cbi_reset.
 1531          */
 1532 
 1533         /* check the given arguments */
 1534         KASSERT(datalen == 0 || data != NULL,
 1535                 ("%s: datalen > 0, but no buffer",sc->sc_dev.dv_xname));
 1536         KASSERT(datalen == 0 || dir != DIR_NONE,
 1537                 ("%s: direction is NONE while datalen is not zero\n",
 1538                         sc->sc_dev.dv_xname));
 1539 
 1540         /* store the details for the data transfer phase */
 1541         sc->transfer_dir = dir;
 1542         sc->transfer_data = data;
 1543         sc->transfer_datalen = datalen;
 1544         sc->transfer_actlen = 0;
 1545         sc->transfer_cb = cb;
 1546         sc->transfer_priv = priv;
 1547         sc->transfer_status = STATUS_CMD_OK;
 1548 
 1549         /* move from idle to the command state */
 1550         sc->transfer_state = TSTATE_CBI_COMMAND;
 1551 
 1552         /* Send the Command Block from host to device via control endpoint. */
 1553         sc->cbw.bCDBLength = cmdlen;
 1554         bzero(sc->cbw.CBWCDB, sizeof(sc->cbw.CBWCDB));
 1555         memcpy(sc->cbw.CBWCDB, cmd, cmdlen);
 1556         umass_adjust_transfer(sc);
 1557         if ((err = umass_cbi_adsc(sc, (void *)sc->cbw.CBWCDB, sc->cbw.bCDBLength,
 1558             sc->transfer_xfer[XFER_CBI_CB])))
 1559                 umass_cbi_reset(sc, STATUS_WIRE_FAILED);
 1560 
 1561         if (sc->sc_udev->bus->use_polling)
 1562                 sc->polled_xfer_status = err;
 1563 }
 1564 
 1565 void
 1566 umass_cbi_state(usbd_xfer_handle xfer, usbd_private_handle priv,
 1567                 usbd_status err)
 1568 {
 1569         struct umass_softc *sc = (struct umass_softc *) priv;
 1570 
 1571         KASSERT(sc->sc_wire & (UMASS_WPROTO_CBI|UMASS_WPROTO_CBI_I),
 1572                 ("sc->sc_wire == 0x%02x wrong for umass_cbi_state\n",
 1573                 sc->sc_wire));
 1574 
 1575         if (sc->sc_dying)
 1576                 return;
 1577 
 1578         /*
 1579          * State handling for CBI transfers.
 1580          */
 1581 
 1582         DPRINTF(UDMASS_CBI, ("%s: Handling CBI state %d (%s), xfer=%p, %s\n",
 1583                 sc->sc_dev.dv_xname, sc->transfer_state,
 1584                 states[sc->transfer_state], xfer, usbd_errstr(err)));
 1585 
 1586         switch (sc->transfer_state) {
 1587 
 1588         /***** CBI Transfer *****/
 1589         case TSTATE_CBI_COMMAND:
 1590                 if (err == USBD_STALLED) {
 1591                         DPRINTF(UDMASS_CBI, ("%s: Command Transport failed\n",
 1592                                 sc->sc_dev.dv_xname));
 1593                         /* Status transport by control pipe (section 2.3.2.1).
 1594                          * The command contained in the command block failed.
 1595                          *
 1596                          * The control pipe has already been unstalled by the
 1597                          * USB stack.
 1598                          * Section 2.4.3.1.1 states that the bulk in endpoints
 1599                          * should not stalled at this point.
 1600                          */
 1601 
 1602                         sc->transfer_state = TSTATE_IDLE;
 1603                         sc->transfer_cb(sc, sc->transfer_priv,
 1604                                         sc->transfer_datalen,
 1605                                         STATUS_CMD_FAILED);
 1606 
 1607                         return;
 1608                 } else if (err) {
 1609                         DPRINTF(UDMASS_CBI, ("%s: failed to send ADSC\n",
 1610                                 sc->sc_dev.dv_xname));
 1611                         umass_cbi_reset(sc, STATUS_WIRE_FAILED);
 1612                         return;
 1613                 }
 1614 
 1615                 /* Data transport phase, setup transfer */
 1616                 sc->transfer_state = TSTATE_CBI_DATA;
 1617                 if (sc->transfer_dir == DIR_IN) {
 1618                         if (umass_setup_transfer(sc, sc->sc_pipe[UMASS_BULKIN],
 1619                                         sc->data_buffer, sc->transfer_datalen,
 1620                                         USBD_SHORT_XFER_OK | USBD_NO_COPY,
 1621                                         sc->transfer_xfer[XFER_CBI_DATA]))
 1622                                 umass_cbi_reset(sc, STATUS_WIRE_FAILED);
 1623 
 1624                         return;
 1625                 } else if (sc->transfer_dir == DIR_OUT) {
 1626                         memcpy(sc->data_buffer, sc->transfer_data,
 1627                                sc->transfer_datalen);
 1628                         if (umass_setup_transfer(sc, sc->sc_pipe[UMASS_BULKOUT],
 1629                                         sc->data_buffer, sc->transfer_datalen,
 1630                                         USBD_NO_COPY,/* fixed length transfer */
 1631                                         sc->transfer_xfer[XFER_CBI_DATA]))
 1632                                 umass_cbi_reset(sc, STATUS_WIRE_FAILED);
 1633 
 1634                         return;
 1635                 } else {
 1636                         DPRINTF(UDMASS_CBI, ("%s: no data phase\n",
 1637                                 sc->sc_dev.dv_xname));
 1638                 }
 1639 
 1640                 /* FALLTHROUGH if no data phase, err == 0 */
 1641         case TSTATE_CBI_DATA:
 1642                 /* Command transport phase error handling (ignored if no data
 1643                  * phase (fallthrough from previous state)) */
 1644                 if (sc->transfer_dir != DIR_NONE) {
 1645                         /* retrieve the length of the transfer that was done */
 1646                         usbd_get_xfer_status(xfer, NULL, NULL,
 1647                             &sc->transfer_actlen, NULL);
 1648                         DPRINTF(UDMASS_CBI, ("%s: CBI_DATA actlen=%d\n",
 1649                                 sc->sc_dev.dv_xname, sc->transfer_actlen));
 1650 
 1651                         if (err) {
 1652                                 DPRINTF(UDMASS_CBI, ("%s: Data-%s %d failed, "
 1653                                         "%s\n", sc->sc_dev.dv_xname,
 1654                                         (sc->transfer_dir == DIR_IN?"in":"out"),
 1655                                         sc->transfer_datalen,usbd_errstr(err)));
 1656 
 1657                                 if (err == USBD_STALLED) {
 1658                                         sc->transfer_state = TSTATE_CBI_DCLEAR;
 1659                                         umass_clear_endpoint_stall(sc,
 1660                                           (sc->transfer_dir == DIR_IN?
 1661                                             UMASS_BULKIN:UMASS_BULKOUT),
 1662                                         sc->transfer_xfer[XFER_CBI_DCLEAR]);
 1663                                 } else {
 1664                                         /* Unless the error is a pipe stall the
 1665                                          * error is fatal.
 1666                                          */
 1667                                         umass_cbi_reset(sc, STATUS_WIRE_FAILED);
 1668                                 }
 1669                                 return;
 1670                         }
 1671                 }
 1672 
 1673                 if (sc->transfer_dir == DIR_IN)
 1674                         memcpy(sc->transfer_data, sc->data_buffer,
 1675                                sc->transfer_actlen);
 1676 
 1677                 DIF(UDMASS_CBI, if (sc->transfer_dir == DIR_IN)
 1678                                         umass_dump_buffer(sc, sc->transfer_data,
 1679                                                 sc->transfer_actlen, 48));
 1680 
 1681                 /* Status phase */
 1682                 if (sc->sc_wire == UMASS_WPROTO_CBI_I) {
 1683                         sc->transfer_state = TSTATE_CBI_STATUS;
 1684                         memset(&sc->sbl, 0, sizeof(sc->sbl));
 1685                         if (umass_setup_transfer(sc, sc->sc_pipe[UMASS_INTRIN],
 1686                                     &sc->sbl, sizeof(sc->sbl),
 1687                                     0,  /* fixed length transfer */
 1688                                     sc->transfer_xfer[XFER_CBI_STATUS]))
 1689                                 umass_cbi_reset(sc, STATUS_WIRE_FAILED);
 1690                 } else {
 1691                         /* No command completion interrupt. Request
 1692                          * sense to get status of command.
 1693                          */
 1694                         sc->transfer_state = TSTATE_IDLE;
 1695                         sc->transfer_cb(sc, sc->transfer_priv,
 1696                                 sc->transfer_datalen - sc->transfer_actlen,
 1697                                 STATUS_CMD_UNKNOWN);
 1698                 }
 1699                 return;
 1700 
 1701         case TSTATE_CBI_STATUS:
 1702                 if (err) {
 1703                         DPRINTF(UDMASS_CBI, ("%s: Status Transport failed\n",
 1704                                 sc->sc_dev.dv_xname));
 1705                         /* Status transport by interrupt pipe (section 2.3.2.2).
 1706                          */
 1707 
 1708                         if (err == USBD_STALLED) {
 1709                                 sc->transfer_state = TSTATE_CBI_SCLEAR;
 1710                                 umass_clear_endpoint_stall(sc, UMASS_INTRIN,
 1711                                         sc->transfer_xfer[XFER_CBI_SCLEAR]);
 1712                         } else {
 1713                                 umass_cbi_reset(sc, STATUS_WIRE_FAILED);
 1714                         }
 1715                         return;
 1716                 }
 1717 
 1718                 /* Dissect the information in the buffer */
 1719 
 1720                 {
 1721                         u_int32_t actlen;
 1722                         usbd_get_xfer_status(xfer, NULL, NULL, &actlen, NULL);
 1723                         DPRINTF(UDMASS_CBI, ("%s: CBI_STATUS actlen=%d\n",
 1724                             sc->sc_dev.dv_xname, actlen));
 1725                         if (actlen != 2)
 1726                                 break;
 1727                 }
 1728 
 1729                 if (sc->sc_cmd == UMASS_CPROTO_UFI) {
 1730                         int status;
 1731 
 1732                         /* Section 3.4.3.1.3 specifies that the UFI command
 1733                          * protocol returns an ASC and ASCQ in the interrupt
 1734                          * data block.
 1735                          */
 1736 
 1737                         DPRINTF(UDMASS_CBI, ("%s: UFI CCI, ASC = 0x%02x, "
 1738                                 "ASCQ = 0x%02x\n",
 1739                                 sc->sc_dev.dv_xname,
 1740                                 sc->sbl.ufi.asc, sc->sbl.ufi.ascq));
 1741 
 1742                         if ((sc->sbl.ufi.asc == 0 && sc->sbl.ufi.ascq == 0) ||
 1743                             sc->sc_sense)
 1744                                 status = STATUS_CMD_OK;
 1745                         else
 1746                                 status = STATUS_CMD_FAILED;
 1747 
 1748                         /* No autosense, command successful */
 1749                         sc->transfer_state = TSTATE_IDLE;
 1750                         sc->transfer_cb(sc, sc->transfer_priv,
 1751                             sc->transfer_datalen - sc->transfer_actlen, status);
 1752                 } else {
 1753                         int status;
 1754 
 1755                         /* Command Interrupt Data Block */
 1756 
 1757                         DPRINTF(UDMASS_CBI, ("%s: type=0x%02x, value=0x%02x\n",
 1758                                 sc->sc_dev.dv_xname,
 1759                                 sc->sbl.common.type, sc->sbl.common.value));
 1760 
 1761                         if (sc->sbl.common.type == IDB_TYPE_CCI) {
 1762                                 switch (sc->sbl.common.value &
 1763                                     IDB_VALUE_STATUS_MASK) {
 1764                                 case IDB_VALUE_PASS:
 1765                                         status = STATUS_CMD_OK;
 1766                                         break;
 1767                                 case IDB_VALUE_FAIL:
 1768                                 case IDB_VALUE_PERSISTENT:
 1769                                         status = STATUS_CMD_FAILED;
 1770                                         break;
 1771                                 case IDB_VALUE_PHASE:
 1772                                         status = STATUS_WIRE_FAILED;
 1773                                         break;
 1774                                 }
 1775 
 1776                                 sc->transfer_state = TSTATE_IDLE;
 1777                                 sc->transfer_cb(sc, sc->transfer_priv,
 1778                                     sc->transfer_datalen - sc->transfer_actlen,
 1779                                     status);
 1780                         }
 1781                 }
 1782                 return;
 1783 
 1784         case TSTATE_CBI_DCLEAR:
 1785                 if (err) {      /* should not occur */
 1786                         printf("%s: CBI bulk-in/out stall clear failed, %s\n",
 1787                                sc->sc_dev.dv_xname, usbd_errstr(err));
 1788                         umass_cbi_reset(sc, STATUS_WIRE_FAILED);
 1789                 } else {
 1790                         sc->transfer_state = TSTATE_IDLE;
 1791                         sc->transfer_cb(sc, sc->transfer_priv,
 1792                             sc->transfer_datalen, STATUS_CMD_FAILED);
 1793                 }
 1794                 return;
 1795 
 1796         case TSTATE_CBI_SCLEAR:
 1797                 if (err) {      /* should not occur */
 1798                         printf("%s: CBI intr-in stall clear failed, %s\n",
 1799                                sc->sc_dev.dv_xname, usbd_errstr(err));
 1800                         umass_cbi_reset(sc, STATUS_WIRE_FAILED);
 1801                 } else {
 1802                         sc->transfer_state = TSTATE_IDLE;
 1803                         sc->transfer_cb(sc, sc->transfer_priv,
 1804                             sc->transfer_datalen, STATUS_CMD_FAILED);
 1805                 }
 1806                 return;
 1807 
 1808         /***** CBI Reset *****/
 1809         case TSTATE_CBI_RESET1:
 1810                 if (err)
 1811                         printf("%s: CBI reset failed, %s\n",
 1812                                 sc->sc_dev.dv_xname, usbd_errstr(err));
 1813 
 1814                 sc->transfer_state = TSTATE_CBI_RESET2;
 1815                 umass_clear_endpoint_stall(sc, UMASS_BULKIN,
 1816                         sc->transfer_xfer[XFER_CBI_RESET2]);
 1817 
 1818                 return;
 1819         case TSTATE_CBI_RESET2:
 1820                 if (err)        /* should not occur */
 1821                         printf("%s: CBI bulk-in stall clear failed, %s\n",
 1822                                sc->sc_dev.dv_xname, usbd_errstr(err));
 1823                         /* no error recovery, otherwise we end up in a loop */
 1824 
 1825                 sc->transfer_state = TSTATE_CBI_RESET3;
 1826                 umass_clear_endpoint_stall(sc, UMASS_BULKOUT,
 1827                         sc->transfer_xfer[XFER_CBI_RESET3]);
 1828 
 1829                 return;
 1830         case TSTATE_CBI_RESET3:
 1831                 if (err)        /* should not occur */
 1832                         printf("%s: CBI bulk-out stall clear failed, %s\n",
 1833                                sc->sc_dev.dv_xname, usbd_errstr(err));
 1834                         /* no error recovery, otherwise we end up in a loop */
 1835 
 1836                 sc->transfer_state = TSTATE_IDLE;
 1837                 if (sc->transfer_priv) {
 1838                         sc->transfer_cb(sc, sc->transfer_priv,
 1839                                         sc->transfer_datalen,
 1840                                         sc->transfer_status);
 1841                 }
 1842 
 1843                 return;
 1844 
 1845 
 1846         /***** Default *****/
 1847         default:
 1848                 panic("%s: Unknown state %d",
 1849                       sc->sc_dev.dv_xname, sc->transfer_state);
 1850         }
 1851 }
 1852 
 1853 usbd_status
 1854 umass_bbb_get_max_lun(struct umass_softc *sc, u_int8_t *maxlun)
 1855 {
 1856         usb_device_request_t req;
 1857         usbd_status err;
 1858 
 1859         *maxlun = 0;            /* Default to 0. */
 1860 
 1861         DPRINTF(UDMASS_BBB, ("%s: Get Max Lun\n", sc->sc_dev.dv_xname));
 1862 
 1863         /* The Get Max Lun command is a class-specific request. */
 1864         req.bmRequestType = UT_READ_CLASS_INTERFACE;
 1865         req.bRequest = UR_BBB_GET_MAX_LUN;
 1866         USETW(req.wValue, 0);
 1867         USETW(req.wIndex, sc->sc_ifaceno);
 1868         USETW(req.wLength, 1);
 1869 
 1870         err = usbd_do_request_flags(sc->sc_udev, &req, maxlun,
 1871             USBD_SHORT_XFER_OK, 0, USBD_DEFAULT_TIMEOUT);
 1872         switch (err) {
 1873         case USBD_NORMAL_COMPLETION:
 1874                 DPRINTF(UDMASS_BBB, ("%s: Max Lun %d\n",
 1875                     sc->sc_dev.dv_xname, *maxlun));
 1876                 break;
 1877 
 1878         case USBD_STALLED:
 1879                 /*
 1880                  * Device doesn't support Get Max Lun request.
 1881                  */
 1882                 err = USBD_NORMAL_COMPLETION;
 1883                 DPRINTF(UDMASS_BBB, ("%s: Get Max Lun not supported\n",
 1884                     sc->sc_dev.dv_xname));
 1885                 break;
 1886 
 1887         case USBD_SHORT_XFER:
 1888                 /*
 1889                  * XXX This must mean Get Max Lun is not supported, too!
 1890                  */
 1891                 err = USBD_NORMAL_COMPLETION;
 1892                 DPRINTF(UDMASS_BBB, ("%s: Get Max Lun SHORT_XFER\n",
 1893                     sc->sc_dev.dv_xname));
 1894                 break;
 1895 
 1896         default:
 1897                 printf("%s: Get Max Lun failed: %s\n",
 1898                     sc->sc_dev.dv_xname, usbd_errstr(err));
 1899                 /* XXX Should we port_reset the device? */
 1900                 break;
 1901         }
 1902 
 1903         return (err);
 1904 }
 1905 
 1906 #ifdef UMASS_DEBUG
 1907 void
 1908 umass_bbb_dump_cbw(struct umass_softc *sc, umass_bbb_cbw_t *cbw)
 1909 {
 1910         int clen = cbw->bCDBLength;
 1911         int dlen = UGETDW(cbw->dCBWDataTransferLength);
 1912         u_int8_t *c = cbw->CBWCDB;
 1913         int tag = UGETDW(cbw->dCBWTag);
 1914         int flags = cbw->bCBWFlags;
 1915 
 1916         DPRINTF(UDMASS_BBB, ("%s: CBW %d: cmdlen=%d "
 1917                 "(0x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%s), "
 1918                 "data = %d bytes, dir = %s\n",
 1919                 sc->sc_dev.dv_xname, tag, clen,
 1920                 c[0], c[1], c[2], c[3], c[4], c[5],
 1921                 c[6], c[7], c[8], c[9],
 1922                 (clen > 10? "...":""),
 1923                 dlen, (flags == CBWFLAGS_IN? "in":
 1924                        (flags == CBWFLAGS_OUT? "out":"<invalid>"))));
 1925 }
 1926 
 1927 void
 1928 umass_bbb_dump_csw(struct umass_softc *sc, umass_bbb_csw_t *csw)
 1929 {
 1930         int sig = UGETDW(csw->dCSWSignature);
 1931         int tag = UGETDW(csw->dCSWTag);
 1932         int res = UGETDW(csw->dCSWDataResidue);
 1933         int status = csw->bCSWStatus;
 1934 
 1935         DPRINTF(UDMASS_BBB, ("%s: CSW %d: sig = 0x%08x (%s), tag = %d, "
 1936                 "res = %d, status = 0x%02x (%s)\n", sc->sc_dev.dv_xname,
 1937                 tag, sig, (sig == CSWSIGNATURE?  "valid":"invalid"),
 1938                 tag, res,
 1939                 status, (status == CSWSTATUS_GOOD? "good":
 1940                          (status == CSWSTATUS_FAILED? "failed":
 1941                           (status == CSWSTATUS_PHASE? "phase":"<invalid>")))));
 1942 }
 1943 
 1944 void
 1945 umass_dump_buffer(struct umass_softc *sc, u_int8_t *buffer, int buflen,
 1946                   int printlen)
 1947 {
 1948         int i, j;
 1949         char s1[40];
 1950         char s2[40];
 1951         char s3[5];
 1952 
 1953         s1[0] = '\0';
 1954         s3[0] = '\0';
 1955 
 1956         snprintf(s2, sizeof s2, " buffer=%p, buflen=%d", buffer, buflen);
 1957         for (i = 0; i < buflen && i < printlen; i++) {
 1958                 j = i % 16;
 1959                 if (j == 0 && i != 0) {
 1960                         DPRINTF(UDMASS_GEN, ("%s: 0x %s%s\n",
 1961                                 sc->sc_dev.dv_xname, s1, s2));
 1962                         s2[0] = '\0';
 1963                 }
 1964                 snprintf(&s1[j*2], sizeof s1 - j*2, "%02x", buffer[i] & 0xff);
 1965         }
 1966         if (buflen > printlen)
 1967                 snprintf(s3, sizeof s3, " ...");
 1968         DPRINTF(UDMASS_GEN, ("%s: 0x %s%s%s\n",
 1969                 sc->sc_dev.dv_xname, s1, s2, s3));
 1970 }
 1971 #endif

/* [<][>][^][v][top][bottom][index][help] */