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