3 * SPDX-License-Identifier: BSD-3-Clause
5 * Copyright (C) 2003-2005 Alan Stern
6 * Copyright (C) 2008 Hans Petter Selasky
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
12 * 1. Redistributions of source code must retain the above copyright
13 * notice, this list of conditions, and the following disclaimer,
14 * without modification.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in the
17 * documentation and/or other materials provided with the distribution.
18 * 3. The names of the above-listed copyright holders may not be used
19 * to endorse or promote products derived from this software without
20 * specific prior written permission.
23 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
24 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
25 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
26 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
27 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
28 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
29 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
30 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
31 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
32 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
33 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37 * NOTE: Much of the SCSI statemachine handling code derives from the
38 * Linux USB gadget stack.
41 #ifdef USB_GLOBAL_INCLUDE_FILE
42 #include USB_GLOBAL_INCLUDE_FILE
44 #include <sys/stdint.h>
45 #include <sys/stddef.h>
46 #include <sys/param.h>
47 #include <sys/queue.h>
48 #include <sys/types.h>
49 #include <sys/systm.h>
50 #include <sys/kernel.h>
52 #include <sys/module.h>
54 #include <sys/mutex.h>
55 #include <sys/condvar.h>
56 #include <sys/sysctl.h>
58 #include <sys/unistd.h>
59 #include <sys/callout.h>
60 #include <sys/malloc.h>
63 #include <dev/usb/usb.h>
64 #include <dev/usb/usbdi.h>
68 #define USB_DEBUG_VAR ustorage_fs_debug
69 #include <dev/usb/usb_debug.h>
70 #endif /* USB_GLOBAL_INCLUDE_FILE */
73 static int ustorage_fs_debug = 0;
75 SYSCTL_NODE(_hw_usb, OID_AUTO, ustorage_fs, CTLFLAG_RW | CTLFLAG_MPSAFE, 0,
77 SYSCTL_INT(_hw_usb_ustorage_fs, OID_AUTO, debug, CTLFLAG_RWTUN,
78 &ustorage_fs_debug, 0, "ustorage_fs debug level");
81 /* Define some limits */
83 #ifndef USTORAGE_FS_BULK_SIZE
84 #define USTORAGE_FS_BULK_SIZE (1U << 17) /* bytes */
87 #ifndef USTORAGE_FS_MAX_LUN
88 #define USTORAGE_FS_MAX_LUN 8 /* units */
91 #ifndef USTORAGE_QDATA_MAX
92 #define USTORAGE_QDATA_MAX 40 /* bytes */
96 * The SCSI ID string must be exactly 28 characters long
97 * exluding the terminating zero.
99 #ifndef USTORAGE_FS_ID_STRING
100 #define USTORAGE_FS_ID_STRING \
102 "File-Stor Gadget" /* 16 */ \
107 * The following macro defines the number of
108 * sectors to be allocated for the RAM disk:
110 #ifndef USTORAGE_FS_RAM_SECT
111 #define USTORAGE_FS_RAM_SECT (1UL << 13)
114 static uint8_t *ustorage_fs_ramdisk;
116 /* USB transfer definitions */
118 #define USTORAGE_FS_T_BBB_COMMAND 0
119 #define USTORAGE_FS_T_BBB_DATA_DUMP 1
120 #define USTORAGE_FS_T_BBB_DATA_READ 2
121 #define USTORAGE_FS_T_BBB_DATA_WRITE 3
122 #define USTORAGE_FS_T_BBB_STATUS 4
123 #define USTORAGE_FS_T_BBB_MAX 5
125 /* USB data stage direction */
131 /* USB interface specific control request */
133 #define UR_BBB_RESET 0xff /* Bulk-Only reset */
134 #define UR_BBB_GET_MAX_LUN 0xfe /* Get maximum lun */
136 /* Command Block Wrapper */
138 uDWord dCBWSignature;
139 #define CBWSIGNATURE 0x43425355
141 uDWord dCBWDataTransferLength;
143 #define CBWFLAGS_OUT 0x00
144 #define CBWFLAGS_IN 0x80
147 #define CBWCDBLENGTH 16
148 uByte CBWCDB[CBWCDBLENGTH];
149 } __packed ustorage_fs_bbb_cbw_t;
151 #define USTORAGE_FS_BBB_CBW_SIZE 31
153 /* Command Status Wrapper */
155 uDWord dCSWSignature;
156 #define CSWSIGNATURE 0x53425355
158 uDWord dCSWDataResidue;
160 #define CSWSTATUS_GOOD 0x0
161 #define CSWSTATUS_FAILED 0x1
162 #define CSWSTATUS_PHASE 0x2
163 } __packed ustorage_fs_bbb_csw_t;
165 #define USTORAGE_FS_BBB_CSW_SIZE 13
167 struct ustorage_fs_lun {
169 uint8_t *memory_image;
171 uint32_t num_sectors;
173 uint32_t sense_data_info;
174 uint32_t unit_attention_data;
177 uint8_t prevent_medium_removal:1;
178 uint8_t info_valid:1;
182 struct ustorage_fs_softc {
184 ustorage_fs_bbb_cbw_t *sc_cbw; /* Command Wrapper Block */
185 ustorage_fs_bbb_csw_t *sc_csw; /* Command Status Block */
186 void *sc_dma_ptr; /* Main data buffer */
190 struct ustorage_fs_lun sc_lun[USTORAGE_FS_MAX_LUN];
194 struct ustorage_fs_lun *currlun;
196 uint32_t data_rem; /* bytes, as reported by the command
198 uint32_t offset; /* bytes */
204 uint8_t data_short:1;
205 uint8_t data_error:1;
209 struct usb_device *sc_udev;
210 struct usb_xfer *sc_xfer[USTORAGE_FS_T_BBB_MAX];
212 uint8_t sc_iface_no; /* interface number */
214 uint8_t sc_last_xfer_index;
215 uint8_t sc_qdata[USTORAGE_QDATA_MAX];
220 static device_probe_t ustorage_fs_probe;
221 static device_attach_t ustorage_fs_attach;
222 static device_detach_t ustorage_fs_detach;
223 static device_suspend_t ustorage_fs_suspend;
224 static device_resume_t ustorage_fs_resume;
225 static usb_handle_request_t ustorage_fs_handle_request;
227 static usb_callback_t ustorage_fs_t_bbb_command_callback;
228 static usb_callback_t ustorage_fs_t_bbb_data_dump_callback;
229 static usb_callback_t ustorage_fs_t_bbb_data_read_callback;
230 static usb_callback_t ustorage_fs_t_bbb_data_write_callback;
231 static usb_callback_t ustorage_fs_t_bbb_status_callback;
233 static void ustorage_fs_transfer_start(struct ustorage_fs_softc *sc, uint8_t xfer_index);
234 static void ustorage_fs_transfer_stop(struct ustorage_fs_softc *sc);
236 static uint8_t ustorage_fs_verify(struct ustorage_fs_softc *sc);
237 static uint8_t ustorage_fs_inquiry(struct ustorage_fs_softc *sc);
238 static uint8_t ustorage_fs_request_sense(struct ustorage_fs_softc *sc);
239 static uint8_t ustorage_fs_read_capacity(struct ustorage_fs_softc *sc);
240 static uint8_t ustorage_fs_mode_sense(struct ustorage_fs_softc *sc);
241 static uint8_t ustorage_fs_start_stop(struct ustorage_fs_softc *sc);
242 static uint8_t ustorage_fs_prevent_allow(struct ustorage_fs_softc *sc);
243 static uint8_t ustorage_fs_read_format_capacities(struct ustorage_fs_softc *sc);
244 static uint8_t ustorage_fs_mode_select(struct ustorage_fs_softc *sc);
245 static uint8_t ustorage_fs_min_len(struct ustorage_fs_softc *sc, uint32_t len, uint32_t mask);
246 static uint8_t ustorage_fs_read(struct ustorage_fs_softc *sc);
247 static uint8_t ustorage_fs_write(struct ustorage_fs_softc *sc);
248 static uint8_t ustorage_fs_check_cmd(struct ustorage_fs_softc *sc, uint8_t cmd_size, uint16_t mask, uint8_t needs_medium);
249 static uint8_t ustorage_fs_do_cmd(struct ustorage_fs_softc *sc);
251 static device_method_t ustorage_fs_methods[] = {
253 DEVMETHOD(usb_handle_request, ustorage_fs_handle_request),
255 /* Device interface */
256 DEVMETHOD(device_probe, ustorage_fs_probe),
257 DEVMETHOD(device_attach, ustorage_fs_attach),
258 DEVMETHOD(device_detach, ustorage_fs_detach),
259 DEVMETHOD(device_suspend, ustorage_fs_suspend),
260 DEVMETHOD(device_resume, ustorage_fs_resume),
265 static driver_t ustorage_fs_driver = {
266 .name = "ustorage_fs",
267 .methods = ustorage_fs_methods,
268 .size = sizeof(struct ustorage_fs_softc),
271 static devclass_t ustorage_fs_devclass;
273 DRIVER_MODULE(ustorage_fs, uhub, ustorage_fs_driver, ustorage_fs_devclass, NULL, 0);
274 MODULE_VERSION(ustorage_fs, 0);
275 MODULE_DEPEND(ustorage_fs, usb, 1, 1, 1);
277 static struct usb_config ustorage_fs_bbb_config[USTORAGE_FS_T_BBB_MAX] = {
279 [USTORAGE_FS_T_BBB_COMMAND] = {
281 .endpoint = UE_ADDR_ANY,
282 .direction = UE_DIR_OUT,
283 .bufsize = sizeof(ustorage_fs_bbb_cbw_t),
284 .callback = &ustorage_fs_t_bbb_command_callback,
285 .usb_mode = USB_MODE_DEVICE,
288 [USTORAGE_FS_T_BBB_DATA_DUMP] = {
290 .endpoint = UE_ADDR_ANY,
291 .direction = UE_DIR_OUT,
292 .bufsize = 0, /* use wMaxPacketSize */
293 .flags = {.proxy_buffer = 1,.short_xfer_ok = 1,},
294 .callback = &ustorage_fs_t_bbb_data_dump_callback,
295 .usb_mode = USB_MODE_DEVICE,
298 [USTORAGE_FS_T_BBB_DATA_READ] = {
300 .endpoint = UE_ADDR_ANY,
301 .direction = UE_DIR_OUT,
302 .bufsize = USTORAGE_FS_BULK_SIZE,
303 .flags = {.proxy_buffer = 1,.short_xfer_ok = 1},
304 .callback = &ustorage_fs_t_bbb_data_read_callback,
305 .usb_mode = USB_MODE_DEVICE,
308 [USTORAGE_FS_T_BBB_DATA_WRITE] = {
310 .endpoint = UE_ADDR_ANY,
311 .direction = UE_DIR_IN,
312 .bufsize = USTORAGE_FS_BULK_SIZE,
313 .flags = {.proxy_buffer = 1,.short_xfer_ok = 1,.ext_buffer = 1},
314 .callback = &ustorage_fs_t_bbb_data_write_callback,
315 .usb_mode = USB_MODE_DEVICE,
318 [USTORAGE_FS_T_BBB_STATUS] = {
320 .endpoint = UE_ADDR_ANY,
321 .direction = UE_DIR_IN,
322 .bufsize = sizeof(ustorage_fs_bbb_csw_t),
323 .flags = {.short_xfer_ok = 1},
324 .callback = &ustorage_fs_t_bbb_status_callback,
325 .usb_mode = USB_MODE_DEVICE,
330 * USB device probe/attach/detach
334 ustorage_fs_probe(device_t dev)
336 struct usb_attach_arg *uaa = device_get_ivars(dev);
337 struct usb_interface_descriptor *id;
339 if (uaa->usb_mode != USB_MODE_DEVICE) {
342 /* Check for a standards compliant device */
343 id = usbd_get_interface_descriptor(uaa->iface);
345 (id->bInterfaceClass != UICLASS_MASS) ||
346 (id->bInterfaceSubClass != UISUBCLASS_SCSI) ||
347 (id->bInterfaceProtocol != UIPROTO_MASS_BBB)) {
350 return (BUS_PROBE_GENERIC);
354 ustorage_fs_attach(device_t dev)
356 struct ustorage_fs_softc *sc = device_get_softc(dev);
357 struct usb_attach_arg *uaa = device_get_ivars(dev);
358 struct usb_interface_descriptor *id;
363 * NOTE: the softc struct is cleared in device_set_driver.
364 * We can safely call ustorage_fs_detach without specifically
365 * initializing the struct.
369 sc->sc_udev = uaa->device;
370 unit = device_get_unit(dev);
372 /* enable power saving mode */
373 usbd_set_power_mode(uaa->device, USB_POWER_MODE_SAVE);
376 if (ustorage_fs_ramdisk == NULL) {
378 * allocate a memory image for our ramdisk until
381 ustorage_fs_ramdisk =
382 malloc(USTORAGE_FS_RAM_SECT << 9, M_USB,
385 if (ustorage_fs_ramdisk == NULL) {
389 sc->sc_lun[0].memory_image = ustorage_fs_ramdisk;
390 sc->sc_lun[0].num_sectors = USTORAGE_FS_RAM_SECT;
391 sc->sc_lun[0].removable = 1;
394 device_set_usb_desc(dev);
396 mtx_init(&sc->sc_mtx, "USTORAGE_FS lock",
397 NULL, (MTX_DEF | MTX_RECURSE));
399 /* get interface index */
401 id = usbd_get_interface_descriptor(uaa->iface);
403 device_printf(dev, "failed to get "
404 "interface number\n");
407 sc->sc_iface_no = id->bInterfaceNumber;
409 err = usbd_transfer_setup(uaa->device,
410 &uaa->info.bIfaceIndex, sc->sc_xfer, ustorage_fs_bbb_config,
411 USTORAGE_FS_T_BBB_MAX, sc, &sc->sc_mtx);
413 device_printf(dev, "could not setup required "
414 "transfers, %s\n", usbd_errstr(err));
418 sc->sc_cbw = usbd_xfer_get_frame_buffer(sc->sc_xfer[
419 USTORAGE_FS_T_BBB_COMMAND], 0);
420 sc->sc_csw = usbd_xfer_get_frame_buffer(sc->sc_xfer[
421 USTORAGE_FS_T_BBB_STATUS], 0);
422 sc->sc_dma_ptr = usbd_xfer_get_frame_buffer(sc->sc_xfer[
423 USTORAGE_FS_T_BBB_DATA_READ], 0);
425 /* start Mass Storage State Machine */
427 mtx_lock(&sc->sc_mtx);
428 ustorage_fs_transfer_start(sc, USTORAGE_FS_T_BBB_COMMAND);
429 mtx_unlock(&sc->sc_mtx);
431 return (0); /* success */
434 ustorage_fs_detach(dev);
435 return (ENXIO); /* failure */
439 ustorage_fs_detach(device_t dev)
441 struct ustorage_fs_softc *sc = device_get_softc(dev);
443 /* teardown our statemachine */
445 usbd_transfer_unsetup(sc->sc_xfer, USTORAGE_FS_T_BBB_MAX);
447 mtx_destroy(&sc->sc_mtx);
449 return (0); /* success */
453 ustorage_fs_suspend(device_t dev)
455 device_printf(dev, "suspending\n");
456 return (0); /* success */
460 ustorage_fs_resume(device_t dev)
462 device_printf(dev, "resuming\n");
463 return (0); /* success */
467 * Generic functions to handle transfers
471 ustorage_fs_transfer_start(struct ustorage_fs_softc *sc, uint8_t xfer_index)
473 if (sc->sc_xfer[xfer_index]) {
474 sc->sc_last_xfer_index = xfer_index;
475 usbd_transfer_start(sc->sc_xfer[xfer_index]);
480 ustorage_fs_transfer_stop(struct ustorage_fs_softc *sc)
482 usbd_transfer_stop(sc->sc_xfer[sc->sc_last_xfer_index]);
483 mtx_unlock(&sc->sc_mtx);
484 usbd_transfer_drain(sc->sc_xfer[sc->sc_last_xfer_index]);
485 mtx_lock(&sc->sc_mtx);
489 ustorage_fs_handle_request(device_t dev,
490 const void *preq, void **pptr, uint16_t *plen,
491 uint16_t offset, uint8_t *pstate)
493 struct ustorage_fs_softc *sc = device_get_softc(dev);
494 const struct usb_device_request *req = preq;
495 uint8_t is_complete = *pstate;
498 if ((req->bmRequestType == UT_WRITE_CLASS_INTERFACE) &&
499 (req->bRequest == UR_BBB_RESET)) {
501 mtx_lock(&sc->sc_mtx);
502 ustorage_fs_transfer_stop(sc);
503 sc->sc_transfer.data_error = 1;
504 ustorage_fs_transfer_start(sc,
505 USTORAGE_FS_T_BBB_COMMAND);
506 mtx_unlock(&sc->sc_mtx);
508 } else if ((req->bmRequestType == UT_READ_CLASS_INTERFACE) &&
509 (req->bRequest == UR_BBB_GET_MAX_LUN)) {
512 *pptr = &sc->sc_last_lun;
519 return (ENXIO); /* use builtin handler */
523 ustorage_fs_t_bbb_command_callback(struct usb_xfer *xfer, usb_error_t error)
525 struct ustorage_fs_softc *sc = usbd_xfer_softc(xfer);
531 switch (USB_GET_STATE(xfer)) {
532 case USB_ST_TRANSFERRED:
534 tag = UGETDW(sc->sc_cbw->dCBWSignature);
536 if (tag != CBWSIGNATURE) {
538 DPRINTF("invalid signature 0x%08x\n", tag);
541 tag = UGETDW(sc->sc_cbw->dCBWTag);
544 USETDW(sc->sc_csw->dCSWTag, tag);
547 sc->sc_csw->bCSWStatus = 0;
549 /* reset data offset, data length and data remainder */
550 sc->sc_transfer.offset = 0;
551 sc->sc_transfer.data_rem =
552 UGETDW(sc->sc_cbw->dCBWDataTransferLength);
554 /* reset data flags */
555 sc->sc_transfer.data_short = 0;
558 sc->sc_transfer.lun = sc->sc_cbw->bCBWLUN;
560 if (sc->sc_transfer.data_rem == 0) {
561 sc->sc_transfer.cbw_dir = DIR_NONE;
563 if (sc->sc_cbw->bCBWFlags & CBWFLAGS_IN) {
564 sc->sc_transfer.cbw_dir = DIR_WRITE;
566 sc->sc_transfer.cbw_dir = DIR_READ;
570 sc->sc_transfer.cmd_len = sc->sc_cbw->bCDBLength;
571 if ((sc->sc_transfer.cmd_len > sizeof(sc->sc_cbw->CBWCDB)) ||
572 (sc->sc_transfer.cmd_len == 0)) {
573 /* just halt - this is invalid */
574 DPRINTF("invalid command length %d bytes\n",
575 sc->sc_transfer.cmd_len);
579 err = ustorage_fs_do_cmd(sc);
582 DPRINTF("command failed\n");
585 if ((sc->sc_transfer.data_rem > 0) &&
586 (sc->sc_transfer.cbw_dir != sc->sc_transfer.cmd_dir)) {
587 /* contradicting data transfer direction */
589 DPRINTF("data direction mismatch\n");
592 switch (sc->sc_transfer.cbw_dir) {
594 ustorage_fs_transfer_start(sc, USTORAGE_FS_T_BBB_DATA_READ);
597 ustorage_fs_transfer_start(sc, USTORAGE_FS_T_BBB_DATA_WRITE);
600 ustorage_fs_transfer_start(sc,
601 USTORAGE_FS_T_BBB_STATUS);
608 if (sc->sc_transfer.data_error) {
609 sc->sc_transfer.data_error = 0;
610 usbd_xfer_set_stall(xfer);
611 DPRINTF("stall pipe\n");
613 usbd_xfer_set_frame_len(xfer, 0,
614 sizeof(ustorage_fs_bbb_cbw_t));
615 usbd_transfer_submit(xfer);
620 if (error == USB_ERR_CANCELLED) {
623 /* If the pipe is already stalled, don't do another stall */
624 if (!usbd_xfer_is_stalled(xfer))
625 sc->sc_transfer.data_error = 1;
631 if (sc->sc_csw->bCSWStatus == 0) {
632 /* set some default error code */
633 sc->sc_csw->bCSWStatus = CSWSTATUS_FAILED;
635 if (sc->sc_transfer.cbw_dir == DIR_READ) {
637 ustorage_fs_transfer_start(sc,
638 USTORAGE_FS_T_BBB_DATA_DUMP);
641 if (sc->sc_transfer.cbw_dir == DIR_WRITE) {
642 /* need to stall before status */
643 sc->sc_transfer.data_error = 1;
645 ustorage_fs_transfer_start(sc, USTORAGE_FS_T_BBB_STATUS);
650 ustorage_fs_t_bbb_data_dump_callback(struct usb_xfer *xfer, usb_error_t error)
652 struct ustorage_fs_softc *sc = usbd_xfer_softc(xfer);
653 uint32_t max_bulk = usbd_xfer_max_len(xfer);
656 usbd_xfer_status(xfer, &actlen, &sumlen, NULL, NULL);
660 switch (USB_GET_STATE(xfer)) {
661 case USB_ST_TRANSFERRED:
662 sc->sc_transfer.data_rem -= actlen;
663 sc->sc_transfer.offset += actlen;
665 if (actlen != sumlen || sc->sc_transfer.data_rem == 0) {
666 /* short transfer or end of data */
667 ustorage_fs_transfer_start(sc,
668 USTORAGE_FS_T_BBB_STATUS);
675 if (max_bulk > sc->sc_transfer.data_rem) {
676 max_bulk = sc->sc_transfer.data_rem;
678 if (sc->sc_transfer.data_error) {
679 sc->sc_transfer.data_error = 0;
680 usbd_xfer_set_stall(xfer);
682 usbd_xfer_set_frame_len(xfer, 0, max_bulk);
683 usbd_transfer_submit(xfer);
687 if (error == USB_ERR_CANCELLED) {
691 * If the pipe is already stalled, don't do another stall:
693 if (!usbd_xfer_is_stalled(xfer))
694 sc->sc_transfer.data_error = 1;
702 ustorage_fs_t_bbb_data_read_callback(struct usb_xfer *xfer, usb_error_t error)
704 struct ustorage_fs_softc *sc = usbd_xfer_softc(xfer);
705 uint32_t max_bulk = usbd_xfer_max_len(xfer);
708 usbd_xfer_status(xfer, &actlen, &sumlen, NULL, NULL);
712 switch (USB_GET_STATE(xfer)) {
713 case USB_ST_TRANSFERRED:
714 /* XXX copy data from DMA buffer */
715 memcpy(sc->sc_transfer.data_ptr, sc->sc_dma_ptr, actlen);
717 sc->sc_transfer.data_rem -= actlen;
718 sc->sc_transfer.data_ptr += actlen;
719 sc->sc_transfer.offset += actlen;
721 if (actlen != sumlen || sc->sc_transfer.data_rem == 0) {
722 /* short transfer or end of data */
723 ustorage_fs_transfer_start(sc,
724 USTORAGE_FS_T_BBB_STATUS);
731 if (max_bulk > sc->sc_transfer.data_rem) {
732 max_bulk = sc->sc_transfer.data_rem;
734 if (sc->sc_transfer.data_error) {
735 sc->sc_transfer.data_error = 0;
736 usbd_xfer_set_stall(xfer);
739 usbd_xfer_set_frame_data(xfer, 0, sc->sc_dma_ptr, max_bulk);
740 usbd_transfer_submit(xfer);
744 if (error == USB_ERR_CANCELLED) {
747 /* If the pipe is already stalled, don't do another stall */
748 if (!usbd_xfer_is_stalled(xfer))
749 sc->sc_transfer.data_error = 1;
757 ustorage_fs_t_bbb_data_write_callback(struct usb_xfer *xfer, usb_error_t error)
759 struct ustorage_fs_softc *sc = usbd_xfer_softc(xfer);
760 uint32_t max_bulk = usbd_xfer_max_len(xfer);
763 usbd_xfer_status(xfer, &actlen, &sumlen, NULL, NULL);
767 switch (USB_GET_STATE(xfer)) {
768 case USB_ST_TRANSFERRED:
769 sc->sc_transfer.data_rem -= actlen;
770 sc->sc_transfer.data_ptr += actlen;
771 sc->sc_transfer.offset += actlen;
773 if (actlen != sumlen || sc->sc_transfer.data_rem == 0) {
774 /* short transfer or end of data */
775 ustorage_fs_transfer_start(sc,
776 USTORAGE_FS_T_BBB_STATUS);
781 if (max_bulk >= sc->sc_transfer.data_rem) {
782 max_bulk = sc->sc_transfer.data_rem;
783 if (sc->sc_transfer.data_short)
784 usbd_xfer_set_flag(xfer, USB_FORCE_SHORT_XFER);
786 usbd_xfer_clr_flag(xfer, USB_FORCE_SHORT_XFER);
788 usbd_xfer_clr_flag(xfer, USB_FORCE_SHORT_XFER);
790 if (sc->sc_transfer.data_error) {
791 sc->sc_transfer.data_error = 0;
792 usbd_xfer_set_stall(xfer);
795 /* XXX copy data to DMA buffer */
796 memcpy(sc->sc_dma_ptr, sc->sc_transfer.data_ptr, max_bulk);
798 usbd_xfer_set_frame_data(xfer, 0, sc->sc_dma_ptr, max_bulk);
799 usbd_transfer_submit(xfer);
803 if (error == USB_ERR_CANCELLED) {
807 * If the pipe is already stalled, don't do another
810 if (!usbd_xfer_is_stalled(xfer))
811 sc->sc_transfer.data_error = 1;
819 ustorage_fs_t_bbb_status_callback(struct usb_xfer *xfer, usb_error_t error)
821 struct ustorage_fs_softc *sc = usbd_xfer_softc(xfer);
825 switch (USB_GET_STATE(xfer)) {
826 case USB_ST_TRANSFERRED:
827 ustorage_fs_transfer_start(sc, USTORAGE_FS_T_BBB_COMMAND);
832 USETDW(sc->sc_csw->dCSWSignature, CSWSIGNATURE);
833 USETDW(sc->sc_csw->dCSWDataResidue, sc->sc_transfer.data_rem);
835 if (sc->sc_transfer.data_error) {
836 sc->sc_transfer.data_error = 0;
837 usbd_xfer_set_stall(xfer);
839 usbd_xfer_set_frame_len(xfer, 0,
840 sizeof(ustorage_fs_bbb_csw_t));
841 usbd_transfer_submit(xfer);
845 if (error == USB_ERR_CANCELLED) {
848 /* If the pipe is already stalled, don't do another stall */
849 if (!usbd_xfer_is_stalled(xfer))
850 sc->sc_transfer.data_error = 1;
857 /* SCSI commands that we recognize */
858 #define SC_FORMAT_UNIT 0x04
859 #define SC_INQUIRY 0x12
860 #define SC_MODE_SELECT_6 0x15
861 #define SC_MODE_SELECT_10 0x55
862 #define SC_MODE_SENSE_6 0x1a
863 #define SC_MODE_SENSE_10 0x5a
864 #define SC_PREVENT_ALLOW_MEDIUM_REMOVAL 0x1e
865 #define SC_READ_6 0x08
866 #define SC_READ_10 0x28
867 #define SC_READ_12 0xa8
868 #define SC_READ_CAPACITY 0x25
869 #define SC_READ_FORMAT_CAPACITIES 0x23
870 #define SC_RELEASE 0x17
871 #define SC_REQUEST_SENSE 0x03
872 #define SC_RESERVE 0x16
873 #define SC_SEND_DIAGNOSTIC 0x1d
874 #define SC_START_STOP_UNIT 0x1b
875 #define SC_SYNCHRONIZE_CACHE 0x35
876 #define SC_TEST_UNIT_READY 0x00
877 #define SC_VERIFY 0x2f
878 #define SC_WRITE_6 0x0a
879 #define SC_WRITE_10 0x2a
880 #define SC_WRITE_12 0xaa
882 /* SCSI Sense Key/Additional Sense Code/ASC Qualifier values */
883 #define SS_NO_SENSE 0
884 #define SS_COMMUNICATION_FAILURE 0x040800
885 #define SS_INVALID_COMMAND 0x052000
886 #define SS_INVALID_FIELD_IN_CDB 0x052400
887 #define SS_LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE 0x052100
888 #define SS_LOGICAL_UNIT_NOT_SUPPORTED 0x052500
889 #define SS_MEDIUM_NOT_PRESENT 0x023a00
890 #define SS_MEDIUM_REMOVAL_PREVENTED 0x055302
891 #define SS_NOT_READY_TO_READY_TRANSITION 0x062800
892 #define SS_RESET_OCCURRED 0x062900
893 #define SS_SAVING_PARAMETERS_NOT_SUPPORTED 0x053900
894 #define SS_UNRECOVERED_READ_ERROR 0x031100
895 #define SS_WRITE_ERROR 0x030c02
896 #define SS_WRITE_PROTECTED 0x072700
898 #define SK(x) ((uint8_t) ((x) >> 16)) /* Sense Key byte, etc. */
899 #define ASC(x) ((uint8_t) ((x) >> 8))
900 #define ASCQ(x) ((uint8_t) (x))
902 /* Routines for unaligned data access */
905 get_be16(uint8_t *buf)
907 return ((uint16_t)buf[0] << 8) | ((uint16_t)buf[1]);
911 get_be32(uint8_t *buf)
913 return ((uint32_t)buf[0] << 24) | ((uint32_t)buf[1] << 16) |
914 ((uint32_t)buf[2] << 8) | ((uint32_t)buf[3]);
918 put_be16(uint8_t *buf, uint16_t val)
925 put_be32(uint8_t *buf, uint32_t val)
933 /*------------------------------------------------------------------------*
939 *------------------------------------------------------------------------*/
941 ustorage_fs_verify(struct ustorage_fs_softc *sc)
943 struct ustorage_fs_lun *currlun = sc->sc_transfer.currlun;
946 uint64_t file_offset;
947 uint64_t amount_left;
950 * Get the starting Logical Block Address
952 lba = get_be32(&sc->sc_cbw->CBWCDB[2]);
955 * We allow DPO (Disable Page Out = don't save data in the cache)
956 * but we don't implement it.
958 if ((sc->sc_cbw->CBWCDB[1] & ~0x10) != 0) {
959 currlun->sense_data = SS_INVALID_FIELD_IN_CDB;
962 vlen = get_be16(&sc->sc_cbw->CBWCDB[7]);
966 /* No default reply */
968 /* Prepare to carry out the file verify */
978 (vlen > currlun->num_sectors) ||
979 (lba >= currlun->num_sectors)) {
980 currlun->sense_data = SS_LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE;
983 /* XXX TODO: verify that data is readable */
985 return (ustorage_fs_min_len(sc, 0, -1U));
988 /*------------------------------------------------------------------------*
989 * ustorage_fs_inquiry
994 *------------------------------------------------------------------------*/
996 ustorage_fs_inquiry(struct ustorage_fs_softc *sc)
998 uint8_t *buf = sc->sc_transfer.data_ptr;
1000 struct ustorage_fs_lun *currlun = sc->sc_transfer.currlun;
1002 if (!sc->sc_transfer.currlun) {
1003 /* Unsupported LUNs are okay */
1006 /* Unsupported, no device - type */
1007 return (ustorage_fs_min_len(sc, 36, -1U));
1010 /* Non - removable, direct - access device */
1011 if (currlun->removable)
1014 /* ANSI SCSI level 2 */
1016 /* SCSI - 2 INQUIRY data format */
1018 /* Additional length */
1019 /* No special options */
1020 /* Copy in ID string */
1021 memcpy(buf + 8, USTORAGE_FS_ID_STRING, 28);
1023 #if (USTORAGE_QDATA_MAX < 36)
1024 #error "(USTORAGE_QDATA_MAX < 36)"
1026 return (ustorage_fs_min_len(sc, 36, -1U));
1029 /*------------------------------------------------------------------------*
1030 * ustorage_fs_request_sense
1035 *------------------------------------------------------------------------*/
1037 ustorage_fs_request_sense(struct ustorage_fs_softc *sc)
1039 uint8_t *buf = sc->sc_transfer.data_ptr;
1040 struct ustorage_fs_lun *currlun = sc->sc_transfer.currlun;
1046 * From the SCSI-2 spec., section 7.9 (Unit attention condition):
1048 * If a REQUEST SENSE command is received from an initiator
1049 * with a pending unit attention condition (before the target
1050 * generates the contingent allegiance condition), then the
1051 * target shall either:
1052 * a) report any pending sense data and preserve the unit
1053 * attention condition on the logical unit, or,
1054 * b) report the unit attention condition, may discard any
1055 * pending sense data, and clear the unit attention
1056 * condition on the logical unit for that initiator.
1058 * FSG normally uses option a); enable this code to use option b).
1061 if (currlun && currlun->unit_attention_data != SS_NO_SENSE) {
1062 currlun->sense_data = currlun->unit_attention_data;
1063 currlun->unit_attention_data = SS_NO_SENSE;
1068 /* Unsupported LUNs are okay */
1069 sd = SS_LOGICAL_UNIT_NOT_SUPPORTED;
1073 sd = currlun->sense_data;
1074 sdinfo = currlun->sense_data_info;
1075 valid = currlun->info_valid << 7;
1076 currlun->sense_data = SS_NO_SENSE;
1077 currlun->sense_data_info = 0;
1078 currlun->info_valid = 0;
1082 buf[0] = valid | 0x70;
1083 /* Valid, current error */
1085 put_be32(&buf[3], sdinfo);
1086 /* Sense information */
1088 /* Additional sense length */
1092 #if (USTORAGE_QDATA_MAX < 18)
1093 #error "(USTORAGE_QDATA_MAX < 18)"
1095 return (ustorage_fs_min_len(sc, 18, -1U));
1098 /*------------------------------------------------------------------------*
1099 * ustorage_fs_read_capacity
1104 *------------------------------------------------------------------------*/
1106 ustorage_fs_read_capacity(struct ustorage_fs_softc *sc)
1108 uint8_t *buf = sc->sc_transfer.data_ptr;
1109 struct ustorage_fs_lun *currlun = sc->sc_transfer.currlun;
1110 uint32_t lba = get_be32(&sc->sc_cbw->CBWCDB[2]);
1111 uint8_t pmi = sc->sc_cbw->CBWCDB[8];
1113 /* Check the PMI and LBA fields */
1114 if ((pmi > 1) || ((pmi == 0) && (lba != 0))) {
1115 currlun->sense_data = SS_INVALID_FIELD_IN_CDB;
1118 /* Max logical block */
1119 put_be32(&buf[0], currlun->num_sectors - 1);
1121 put_be32(&buf[4], 512);
1123 #if (USTORAGE_QDATA_MAX < 8)
1124 #error "(USTORAGE_QDATA_MAX < 8)"
1126 return (ustorage_fs_min_len(sc, 8, -1U));
1129 /*------------------------------------------------------------------------*
1130 * ustorage_fs_mode_sense
1135 *------------------------------------------------------------------------*/
1137 ustorage_fs_mode_sense(struct ustorage_fs_softc *sc)
1139 uint8_t *buf = sc->sc_transfer.data_ptr;
1140 struct ustorage_fs_lun *currlun = sc->sc_transfer.currlun;
1144 uint8_t mscmnd = sc->sc_cbw->CBWCDB[0];
1147 uint8_t changeable_values;
1152 if ((sc->sc_cbw->CBWCDB[1] & ~0x08) != 0) {
1154 currlun->sense_data = SS_INVALID_FIELD_IN_CDB;
1157 pc = sc->sc_cbw->CBWCDB[2] >> 6;
1158 page_code = sc->sc_cbw->CBWCDB[2] & 0x3f;
1160 currlun->sense_data = SS_SAVING_PARAMETERS_NOT_SUPPORTED;
1163 changeable_values = (pc == 1);
1164 all_pages = (page_code == 0x3f);
1167 * Write the mode parameter header. Fixed values are: default
1168 * medium type, no cache control (DPOFUA), and no block descriptors.
1169 * The only variable value is the WriteProtect bit. We will fill in
1170 * the mode data length later.
1173 if (mscmnd == SC_MODE_SENSE_6) {
1174 buf[2] = (currlun->read_only ? 0x80 : 0x00);
1179 /* SC_MODE_SENSE_10 */
1180 buf[3] = (currlun->read_only ? 0x80 : 0x00);
1184 /* Should really be mod_data.buflen */
1187 /* No block descriptors */
1190 * The mode pages, in numerical order.
1192 if ((page_code == 0x08) || all_pages) {
1197 memset(buf + 2, 0, 10);
1198 /* None of the fields are changeable */
1200 if (!changeable_values) {
1202 /* Write cache enable, */
1203 /* Read cache not disabled */
1204 /* No cache retention priorities */
1205 put_be16(&buf[4], 0xffff);
1206 /* Don 't disable prefetch */
1207 /* Minimum prefetch = 0 */
1208 put_be16(&buf[8], 0xffff);
1209 /* Maximum prefetch */
1210 put_be16(&buf[10], 0xffff);
1211 /* Maximum prefetch ceiling */
1216 * Check that a valid page was requested and the mode data length
1221 currlun->sense_data = SS_INVALID_FIELD_IN_CDB;
1224 /* Store the mode data length */
1225 if (mscmnd == SC_MODE_SENSE_6)
1228 put_be16(buf0, len - 2);
1230 #if (USTORAGE_QDATA_MAX < 24)
1231 #error "(USTORAGE_QDATA_MAX < 24)"
1233 return (ustorage_fs_min_len(sc, len, -1U));
1236 /*------------------------------------------------------------------------*
1237 * ustorage_fs_start_stop
1242 *------------------------------------------------------------------------*/
1244 ustorage_fs_start_stop(struct ustorage_fs_softc *sc)
1246 struct ustorage_fs_lun *currlun = sc->sc_transfer.currlun;
1251 if (!currlun->removable) {
1252 currlun->sense_data = SS_INVALID_COMMAND;
1255 immed = sc->sc_cbw->CBWCDB[1] & 0x01;
1256 loej = sc->sc_cbw->CBWCDB[4] & 0x02;
1257 start = sc->sc_cbw->CBWCDB[4] & 0x01;
1259 if (immed || loej || start) {
1265 /*------------------------------------------------------------------------*
1266 * ustorage_fs_prevent_allow
1271 *------------------------------------------------------------------------*/
1273 ustorage_fs_prevent_allow(struct ustorage_fs_softc *sc)
1275 struct ustorage_fs_lun *currlun = sc->sc_transfer.currlun;
1278 if (!currlun->removable) {
1279 currlun->sense_data = SS_INVALID_COMMAND;
1282 prevent = sc->sc_cbw->CBWCDB[4] & 0x01;
1283 if ((sc->sc_cbw->CBWCDB[4] & ~0x01) != 0) {
1284 /* Mask away Prevent */
1285 currlun->sense_data = SS_INVALID_FIELD_IN_CDB;
1288 if (currlun->prevent_medium_removal && !prevent) {
1289 //fsync_sub(currlun);
1291 currlun->prevent_medium_removal = prevent;
1295 /*------------------------------------------------------------------------*
1296 * ustorage_fs_read_format_capacities
1301 *------------------------------------------------------------------------*/
1303 ustorage_fs_read_format_capacities(struct ustorage_fs_softc *sc)
1305 uint8_t *buf = sc->sc_transfer.data_ptr;
1306 struct ustorage_fs_lun *currlun = sc->sc_transfer.currlun;
1308 buf[0] = buf[1] = buf[2] = 0;
1310 /* Only the Current / Maximum Capacity Descriptor */
1313 /* Number of blocks */
1314 put_be32(&buf[0], currlun->num_sectors);
1316 put_be32(&buf[4], 512);
1317 /* Current capacity */
1320 #if (USTORAGE_QDATA_MAX < 12)
1321 #error "(USTORAGE_QDATA_MAX < 12)"
1323 return (ustorage_fs_min_len(sc, 12, -1U));
1326 /*------------------------------------------------------------------------*
1327 * ustorage_fs_mode_select
1332 *------------------------------------------------------------------------*/
1334 ustorage_fs_mode_select(struct ustorage_fs_softc *sc)
1336 struct ustorage_fs_lun *currlun = sc->sc_transfer.currlun;
1338 /* We don't support MODE SELECT */
1339 currlun->sense_data = SS_INVALID_COMMAND;
1343 /*------------------------------------------------------------------------*
1344 * ustorage_fs_synchronize_cache
1349 *------------------------------------------------------------------------*/
1351 ustorage_fs_synchronize_cache(struct ustorage_fs_softc *sc)
1354 struct ustorage_fs_lun *currlun = sc->sc_transfer.currlun;
1358 * We ignore the requested LBA and write out all dirty data buffers.
1362 currlun->sense_data = SS_WRITE_ERROR;
1368 /*------------------------------------------------------------------------*
1369 * ustorage_fs_read - read data from disk
1374 *------------------------------------------------------------------------*/
1376 ustorage_fs_read(struct ustorage_fs_softc *sc)
1378 struct ustorage_fs_lun *currlun = sc->sc_transfer.currlun;
1379 uint64_t file_offset;
1384 * Get the starting Logical Block Address and check that it's not
1387 if (sc->sc_cbw->CBWCDB[0] == SC_READ_6) {
1388 lba = (((uint32_t)sc->sc_cbw->CBWCDB[1]) << 16) |
1389 get_be16(&sc->sc_cbw->CBWCDB[2]);
1391 lba = get_be32(&sc->sc_cbw->CBWCDB[2]);
1394 * We allow DPO (Disable Page Out = don't save data in the
1395 * cache) and FUA (Force Unit Access = don't read from the
1396 * cache), but we don't implement them.
1398 if ((sc->sc_cbw->CBWCDB[1] & ~0x18) != 0) {
1399 currlun->sense_data = SS_INVALID_FIELD_IN_CDB;
1403 len = sc->sc_transfer.data_rem >> 9;
1407 (len > currlun->num_sectors) ||
1408 (lba >= currlun->num_sectors)) {
1409 currlun->sense_data = SS_LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE;
1415 sc->sc_transfer.data_ptr = currlun->memory_image + file_offset;
1420 /*------------------------------------------------------------------------*
1421 * ustorage_fs_write - write data to disk
1426 *------------------------------------------------------------------------*/
1428 ustorage_fs_write(struct ustorage_fs_softc *sc)
1430 struct ustorage_fs_lun *currlun = sc->sc_transfer.currlun;
1431 uint64_t file_offset;
1435 if (currlun->read_only) {
1436 currlun->sense_data = SS_WRITE_PROTECTED;
1439 /* XXX clear SYNC */
1442 * Get the starting Logical Block Address and check that it's not
1445 if (sc->sc_cbw->CBWCDB[0] == SC_WRITE_6)
1446 lba = (((uint32_t)sc->sc_cbw->CBWCDB[1]) << 16) |
1447 get_be16(&sc->sc_cbw->CBWCDB[2]);
1449 lba = get_be32(&sc->sc_cbw->CBWCDB[2]);
1452 * We allow DPO (Disable Page Out = don't save data in the
1453 * cache) and FUA (Force Unit Access = write directly to the
1454 * medium). We don't implement DPO; we implement FUA by
1455 * performing synchronous output.
1457 if ((sc->sc_cbw->CBWCDB[1] & ~0x18) != 0) {
1458 currlun->sense_data = SS_INVALID_FIELD_IN_CDB;
1461 if (sc->sc_cbw->CBWCDB[1] & 0x08) {
1463 /* XXX set SYNC flag here */
1467 len = sc->sc_transfer.data_rem >> 9;
1471 (len > currlun->num_sectors) ||
1472 (lba >= currlun->num_sectors)) {
1473 currlun->sense_data = SS_LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE;
1479 sc->sc_transfer.data_ptr = currlun->memory_image + file_offset;
1484 /*------------------------------------------------------------------------*
1485 * ustorage_fs_min_len
1490 *------------------------------------------------------------------------*/
1492 ustorage_fs_min_len(struct ustorage_fs_softc *sc, uint32_t len, uint32_t mask)
1494 if (len != sc->sc_transfer.data_rem) {
1496 if (sc->sc_transfer.cbw_dir == DIR_READ) {
1498 * there must be something wrong about this SCSI
1501 sc->sc_csw->bCSWStatus = CSWSTATUS_PHASE;
1504 /* compute the minimum length */
1506 if (sc->sc_transfer.data_rem > len) {
1507 /* data ends prematurely */
1508 sc->sc_transfer.data_rem = len;
1509 sc->sc_transfer.data_short = 1;
1511 /* check length alignment */
1513 if (sc->sc_transfer.data_rem & ~mask) {
1514 /* data ends prematurely */
1515 sc->sc_transfer.data_rem &= mask;
1516 sc->sc_transfer.data_short = 1;
1522 /*------------------------------------------------------------------------*
1523 * ustorage_fs_check_cmd - check command routine
1525 * Check whether the command is properly formed and whether its data
1526 * size and direction agree with the values we already have.
1531 *------------------------------------------------------------------------*/
1533 ustorage_fs_check_cmd(struct ustorage_fs_softc *sc, uint8_t min_cmd_size,
1534 uint16_t mask, uint8_t needs_medium)
1536 struct ustorage_fs_lun *currlun;
1537 uint8_t lun = (sc->sc_cbw->CBWCDB[1] >> 5);
1540 /* Verify the length of the command itself */
1541 if (min_cmd_size > sc->sc_transfer.cmd_len) {
1542 DPRINTF("%u > %u\n",
1543 min_cmd_size, sc->sc_transfer.cmd_len);
1544 sc->sc_csw->bCSWStatus = CSWSTATUS_PHASE;
1547 /* Mask away the LUN */
1548 sc->sc_cbw->CBWCDB[1] &= 0x1f;
1550 /* Check if LUN is correct */
1551 if (lun != sc->sc_transfer.lun) {
1555 if (sc->sc_transfer.lun <= sc->sc_last_lun) {
1556 sc->sc_transfer.currlun = currlun =
1557 sc->sc_lun + sc->sc_transfer.lun;
1558 if (sc->sc_cbw->CBWCDB[0] != SC_REQUEST_SENSE) {
1559 currlun->sense_data = SS_NO_SENSE;
1560 currlun->sense_data_info = 0;
1561 currlun->info_valid = 0;
1564 * If a unit attention condition exists, only INQUIRY
1565 * and REQUEST SENSE commands are allowed. Anything
1568 if ((currlun->unit_attention_data != SS_NO_SENSE) &&
1569 (sc->sc_cbw->CBWCDB[0] != SC_INQUIRY) &&
1570 (sc->sc_cbw->CBWCDB[0] != SC_REQUEST_SENSE)) {
1571 currlun->sense_data = currlun->unit_attention_data;
1572 currlun->unit_attention_data = SS_NO_SENSE;
1576 sc->sc_transfer.currlun = currlun = NULL;
1579 * INQUIRY and REQUEST SENSE commands are explicitly allowed
1580 * to use unsupported LUNs; all others may not.
1582 if ((sc->sc_cbw->CBWCDB[0] != SC_INQUIRY) &&
1583 (sc->sc_cbw->CBWCDB[0] != SC_REQUEST_SENSE)) {
1589 * Check that only command bytes listed in the mask are
1592 for (i = 0; i != min_cmd_size; i++) {
1593 if (sc->sc_cbw->CBWCDB[i] && !(mask & (1UL << i))) {
1595 currlun->sense_data = SS_INVALID_FIELD_IN_CDB;
1602 * If the medium isn't mounted and the command needs to access
1603 * it, return an error.
1605 if (currlun && (!currlun->memory_image) && needs_medium) {
1606 currlun->sense_data = SS_MEDIUM_NOT_PRESENT;
1612 /*------------------------------------------------------------------------*
1613 * ustorage_fs_do_cmd - do command
1618 *------------------------------------------------------------------------*/
1620 ustorage_fs_do_cmd(struct ustorage_fs_softc *sc)
1625 const uint32_t mask9 = (0xFFFFFFFFUL >> 9) << 9;
1627 /* set default data transfer pointer */
1628 sc->sc_transfer.data_ptr = sc->sc_qdata;
1630 DPRINTF("cmd_data[0]=0x%02x, data_rem=0x%08x\n",
1631 sc->sc_cbw->CBWCDB[0], sc->sc_transfer.data_rem);
1633 switch (sc->sc_cbw->CBWCDB[0]) {
1635 sc->sc_transfer.cmd_dir = DIR_WRITE;
1636 error = ustorage_fs_min_len(sc, sc->sc_cbw->CBWCDB[4], -1U);
1640 error = ustorage_fs_check_cmd(sc, 6,
1645 error = ustorage_fs_inquiry(sc);
1649 case SC_MODE_SELECT_6:
1650 sc->sc_transfer.cmd_dir = DIR_READ;
1651 error = ustorage_fs_min_len(sc, sc->sc_cbw->CBWCDB[4], -1U);
1655 error = ustorage_fs_check_cmd(sc, 6,
1656 (1UL << 1) | (1UL << 4) | 1, 0);
1660 error = ustorage_fs_mode_select(sc);
1664 case SC_MODE_SELECT_10:
1665 sc->sc_transfer.cmd_dir = DIR_READ;
1666 error = ustorage_fs_min_len(sc,
1667 get_be16(&sc->sc_cbw->CBWCDB[7]), -1U);
1671 error = ustorage_fs_check_cmd(sc, 10,
1672 (1UL << 1) | (3UL << 7) | 1, 0);
1676 error = ustorage_fs_mode_select(sc);
1680 case SC_MODE_SENSE_6:
1681 sc->sc_transfer.cmd_dir = DIR_WRITE;
1682 error = ustorage_fs_min_len(sc, sc->sc_cbw->CBWCDB[4], -1U);
1686 error = ustorage_fs_check_cmd(sc, 6,
1687 (1UL << 1) | (1UL << 2) | (1UL << 4) | 1, 0);
1691 error = ustorage_fs_mode_sense(sc);
1695 case SC_MODE_SENSE_10:
1696 sc->sc_transfer.cmd_dir = DIR_WRITE;
1697 error = ustorage_fs_min_len(sc,
1698 get_be16(&sc->sc_cbw->CBWCDB[7]), -1U);
1702 error = ustorage_fs_check_cmd(sc, 10,
1703 (1UL << 1) | (1UL << 2) | (3UL << 7) | 1, 0);
1707 error = ustorage_fs_mode_sense(sc);
1711 case SC_PREVENT_ALLOW_MEDIUM_REMOVAL:
1712 error = ustorage_fs_min_len(sc, 0, -1U);
1716 error = ustorage_fs_check_cmd(sc, 6,
1721 error = ustorage_fs_prevent_allow(sc);
1726 i = sc->sc_cbw->CBWCDB[4];
1727 sc->sc_transfer.cmd_dir = DIR_WRITE;
1728 temp = ((i == 0) ? 256UL : i);
1729 error = ustorage_fs_min_len(sc, temp << 9, mask9);
1733 error = ustorage_fs_check_cmd(sc, 6,
1734 (7UL << 1) | (1UL << 4) | 1, 1);
1738 error = ustorage_fs_read(sc);
1743 sc->sc_transfer.cmd_dir = DIR_WRITE;
1744 temp = get_be16(&sc->sc_cbw->CBWCDB[7]);
1745 error = ustorage_fs_min_len(sc, temp << 9, mask9);
1749 error = ustorage_fs_check_cmd(sc, 10,
1750 (1UL << 1) | (0xfUL << 2) | (3UL << 7) | 1, 1);
1754 error = ustorage_fs_read(sc);
1759 sc->sc_transfer.cmd_dir = DIR_WRITE;
1760 temp = get_be32(&sc->sc_cbw->CBWCDB[6]);
1761 if (temp >= (1UL << (32 - 9))) {
1762 /* numerical overflow */
1763 sc->sc_csw->bCSWStatus = CSWSTATUS_FAILED;
1767 error = ustorage_fs_min_len(sc, temp << 9, mask9);
1771 error = ustorage_fs_check_cmd(sc, 12,
1772 (1UL << 1) | (0xfUL << 2) | (0xfUL << 6) | 1, 1);
1776 error = ustorage_fs_read(sc);
1780 case SC_READ_CAPACITY:
1781 sc->sc_transfer.cmd_dir = DIR_WRITE;
1782 error = ustorage_fs_check_cmd(sc, 10,
1783 (0xfUL << 2) | (1UL << 8) | 1, 1);
1787 error = ustorage_fs_read_capacity(sc);
1791 case SC_READ_FORMAT_CAPACITIES:
1792 sc->sc_transfer.cmd_dir = DIR_WRITE;
1793 error = ustorage_fs_min_len(sc,
1794 get_be16(&sc->sc_cbw->CBWCDB[7]), -1U);
1798 error = ustorage_fs_check_cmd(sc, 10,
1803 error = ustorage_fs_read_format_capacities(sc);
1807 case SC_REQUEST_SENSE:
1808 sc->sc_transfer.cmd_dir = DIR_WRITE;
1809 error = ustorage_fs_min_len(sc, sc->sc_cbw->CBWCDB[4], -1U);
1813 error = ustorage_fs_check_cmd(sc, 6,
1818 error = ustorage_fs_request_sense(sc);
1822 case SC_START_STOP_UNIT:
1823 error = ustorage_fs_min_len(sc, 0, -1U);
1827 error = ustorage_fs_check_cmd(sc, 6,
1828 (1UL << 1) | (1UL << 4) | 1, 0);
1832 error = ustorage_fs_start_stop(sc);
1836 case SC_SYNCHRONIZE_CACHE:
1837 error = ustorage_fs_min_len(sc, 0, -1U);
1841 error = ustorage_fs_check_cmd(sc, 10,
1842 (0xfUL << 2) | (3UL << 7) | 1, 1);
1846 error = ustorage_fs_synchronize_cache(sc);
1850 case SC_TEST_UNIT_READY:
1851 error = ustorage_fs_min_len(sc, 0, -1U);
1855 error = ustorage_fs_check_cmd(sc, 6,
1860 * Although optional, this command is used by MS-Windows.
1861 * We support a minimal version: BytChk must be 0.
1864 error = ustorage_fs_min_len(sc, 0, -1U);
1868 error = ustorage_fs_check_cmd(sc, 10,
1869 (1UL << 1) | (0xfUL << 2) | (3UL << 7) | 1, 1);
1873 error = ustorage_fs_verify(sc);
1878 i = sc->sc_cbw->CBWCDB[4];
1879 sc->sc_transfer.cmd_dir = DIR_READ;
1880 temp = ((i == 0) ? 256UL : i);
1881 error = ustorage_fs_min_len(sc, temp << 9, mask9);
1885 error = ustorage_fs_check_cmd(sc, 6,
1886 (7UL << 1) | (1UL << 4) | 1, 1);
1890 error = ustorage_fs_write(sc);
1895 sc->sc_transfer.cmd_dir = DIR_READ;
1896 temp = get_be16(&sc->sc_cbw->CBWCDB[7]);
1897 error = ustorage_fs_min_len(sc, temp << 9, mask9);
1901 error = ustorage_fs_check_cmd(sc, 10,
1902 (1UL << 1) | (0xfUL << 2) | (3UL << 7) | 1, 1);
1906 error = ustorage_fs_write(sc);
1911 sc->sc_transfer.cmd_dir = DIR_READ;
1912 temp = get_be32(&sc->sc_cbw->CBWCDB[6]);
1913 if (temp > (mask9 >> 9)) {
1914 /* numerical overflow */
1915 sc->sc_csw->bCSWStatus = CSWSTATUS_FAILED;
1919 error = ustorage_fs_min_len(sc, temp << 9, mask9);
1923 error = ustorage_fs_check_cmd(sc, 12,
1924 (1UL << 1) | (0xfUL << 2) | (0xfUL << 6) | 1, 1);
1928 error = ustorage_fs_write(sc);
1933 * Some mandatory commands that we recognize but don't
1934 * implement. They don't mean much in this setting.
1935 * It's left as an exercise for anyone interested to
1936 * implement RESERVE and RELEASE in terms of Posix
1939 case SC_FORMAT_UNIT:
1942 case SC_SEND_DIAGNOSTIC:
1946 error = ustorage_fs_min_len(sc, 0, -1U);
1950 error = ustorage_fs_check_cmd(sc, sc->sc_transfer.cmd_len,
1955 sc->sc_transfer.currlun->sense_data =