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