]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/dev/usb/storage/ustorage_fs.c
usb: clean up empty lines in .c and .h files
[FreeBSD/FreeBSD.git] / sys / dev / usb / storage / ustorage_fs.c
1 /* $FreeBSD$ */
2 /*-
3  * SPDX-License-Identifier: BSD-3-Clause
4  *
5  * Copyright (C) 2003-2005 Alan Stern
6  * Copyright (C) 2008 Hans Petter Selasky
7  * All rights reserved.
8  *
9  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted provided that the following conditions
11  * are met:
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.
21  *
22  *
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.
34  */
35
36 /*
37  * NOTE: Much of the SCSI statemachine handling code derives from the
38  * Linux USB gadget stack.
39  */
40
41 #ifdef USB_GLOBAL_INCLUDE_FILE
42 #include USB_GLOBAL_INCLUDE_FILE
43 #else
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>
51 #include <sys/bus.h>
52 #include <sys/module.h>
53 #include <sys/lock.h>
54 #include <sys/mutex.h>
55 #include <sys/condvar.h>
56 #include <sys/sysctl.h>
57 #include <sys/sx.h>
58 #include <sys/unistd.h>
59 #include <sys/callout.h>
60 #include <sys/malloc.h>
61 #include <sys/priv.h>
62
63 #include <dev/usb/usb.h>
64 #include <dev/usb/usbdi.h>
65 #include "usbdevs.h"
66 #include "usb_if.h"
67
68 #define USB_DEBUG_VAR ustorage_fs_debug
69 #include <dev/usb/usb_debug.h>
70 #endif                  /* USB_GLOBAL_INCLUDE_FILE */
71
72 #ifdef USB_DEBUG
73 static int ustorage_fs_debug = 0;
74
75 SYSCTL_NODE(_hw_usb, OID_AUTO, ustorage_fs, CTLFLAG_RW | CTLFLAG_MPSAFE, 0,
76     "USB ustorage_fs");
77 SYSCTL_INT(_hw_usb_ustorage_fs, OID_AUTO, debug, CTLFLAG_RWTUN,
78     &ustorage_fs_debug, 0, "ustorage_fs debug level");
79 #endif
80
81 /* Define some limits */
82
83 #ifndef USTORAGE_FS_BULK_SIZE 
84 #define USTORAGE_FS_BULK_SIZE   (1U << 17)      /* bytes */
85 #endif
86
87 #ifndef USTORAGE_FS_MAX_LUN
88 #define USTORAGE_FS_MAX_LUN     8       /* units */
89 #endif
90
91 #ifndef USTORAGE_QDATA_MAX
92 #define USTORAGE_QDATA_MAX      40      /* bytes */
93 #endif
94
95 /*
96  * The SCSI ID string must be exactly 28 characters long
97  * exluding the terminating zero.
98  */
99 #ifndef USTORAGE_FS_ID_STRING
100 #define USTORAGE_FS_ID_STRING \
101         "FreeBSD " /* 8 */ \
102         "File-Stor Gadget" /* 16 */ \
103         "0101" /* 4 */
104 #endif
105
106 /*
107  * The following macro defines the number of
108  * sectors to be allocated for the RAM disk:
109  */
110 #ifndef USTORAGE_FS_RAM_SECT
111 #define USTORAGE_FS_RAM_SECT (1UL << 13)
112 #endif
113
114 static uint8_t *ustorage_fs_ramdisk;
115
116 /* USB transfer definitions */
117
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
124
125 /* USB data stage direction */
126
127 #define DIR_NONE        0
128 #define DIR_READ        1
129 #define DIR_WRITE       2
130
131 /* USB interface specific control request */
132
133 #define UR_BBB_RESET            0xff    /* Bulk-Only reset */
134 #define UR_BBB_GET_MAX_LUN      0xfe    /* Get maximum lun */
135
136 /* Command Block Wrapper */
137 typedef struct {
138         uDWord  dCBWSignature;
139 #define CBWSIGNATURE    0x43425355
140         uDWord  dCBWTag;
141         uDWord  dCBWDataTransferLength;
142         uByte   bCBWFlags;
143 #define CBWFLAGS_OUT    0x00
144 #define CBWFLAGS_IN     0x80
145         uByte   bCBWLUN;
146         uByte   bCDBLength;
147 #define CBWCDBLENGTH    16
148         uByte   CBWCDB[CBWCDBLENGTH];
149 } __packed ustorage_fs_bbb_cbw_t;
150
151 #define USTORAGE_FS_BBB_CBW_SIZE        31
152
153 /* Command Status Wrapper */
154 typedef struct {
155         uDWord  dCSWSignature;
156 #define CSWSIGNATURE    0x53425355
157         uDWord  dCSWTag;
158         uDWord  dCSWDataResidue;
159         uByte   bCSWStatus;
160 #define CSWSTATUS_GOOD  0x0
161 #define CSWSTATUS_FAILED        0x1
162 #define CSWSTATUS_PHASE 0x2
163 } __packed ustorage_fs_bbb_csw_t;
164
165 #define USTORAGE_FS_BBB_CSW_SIZE        13
166
167 struct ustorage_fs_lun {
168         uint8_t *memory_image;
169
170         uint32_t num_sectors;
171         uint32_t sense_data;
172         uint32_t sense_data_info;
173         uint32_t unit_attention_data;
174
175         uint8_t read_only:1;
176         uint8_t prevent_medium_removal:1;
177         uint8_t info_valid:1;
178         uint8_t removable:1;
179 };
180
181 struct ustorage_fs_softc {
182         ustorage_fs_bbb_cbw_t *sc_cbw;  /* Command Wrapper Block */
183         ustorage_fs_bbb_csw_t *sc_csw;  /* Command Status Block */
184         void *sc_dma_ptr;               /* Main data buffer */
185
186         struct mtx sc_mtx;
187
188         struct ustorage_fs_lun sc_lun[USTORAGE_FS_MAX_LUN];
189
190         struct {
191                 uint8_t *data_ptr;
192                 struct ustorage_fs_lun *currlun;
193
194                 uint32_t data_rem;      /* bytes, as reported by the command
195                                          * block wrapper */
196                 uint32_t offset;        /* bytes */
197
198                 uint8_t cbw_dir;
199                 uint8_t cmd_dir;
200                 uint8_t lun;
201                 uint8_t cmd_len;
202                 uint8_t data_short:1;
203                 uint8_t data_error:1;
204         }       sc_transfer;
205
206         device_t sc_dev;
207         struct usb_device *sc_udev;
208         struct usb_xfer *sc_xfer[USTORAGE_FS_T_BBB_MAX];
209
210         uint8_t sc_iface_no;            /* interface number */
211         uint8_t sc_last_lun;
212         uint8_t sc_last_xfer_index;
213         uint8_t sc_qdata[USTORAGE_QDATA_MAX];
214 };
215
216 /* prototypes */
217
218 static device_probe_t ustorage_fs_probe;
219 static device_attach_t ustorage_fs_attach;
220 static device_detach_t ustorage_fs_detach;
221 static device_suspend_t ustorage_fs_suspend;
222 static device_resume_t ustorage_fs_resume;
223 static usb_handle_request_t ustorage_fs_handle_request;
224
225 static usb_callback_t ustorage_fs_t_bbb_command_callback;
226 static usb_callback_t ustorage_fs_t_bbb_data_dump_callback;
227 static usb_callback_t ustorage_fs_t_bbb_data_read_callback;
228 static usb_callback_t ustorage_fs_t_bbb_data_write_callback;
229 static usb_callback_t ustorage_fs_t_bbb_status_callback;
230
231 static void ustorage_fs_transfer_start(struct ustorage_fs_softc *sc, uint8_t xfer_index);
232 static void ustorage_fs_transfer_stop(struct ustorage_fs_softc *sc);
233
234 static uint8_t ustorage_fs_verify(struct ustorage_fs_softc *sc);
235 static uint8_t ustorage_fs_inquiry(struct ustorage_fs_softc *sc);
236 static uint8_t ustorage_fs_request_sense(struct ustorage_fs_softc *sc);
237 static uint8_t ustorage_fs_read_capacity(struct ustorage_fs_softc *sc);
238 static uint8_t ustorage_fs_mode_sense(struct ustorage_fs_softc *sc);
239 static uint8_t ustorage_fs_start_stop(struct ustorage_fs_softc *sc);
240 static uint8_t ustorage_fs_prevent_allow(struct ustorage_fs_softc *sc);
241 static uint8_t ustorage_fs_read_format_capacities(struct ustorage_fs_softc *sc);
242 static uint8_t ustorage_fs_mode_select(struct ustorage_fs_softc *sc);
243 static uint8_t ustorage_fs_min_len(struct ustorage_fs_softc *sc, uint32_t len, uint32_t mask);
244 static uint8_t ustorage_fs_read(struct ustorage_fs_softc *sc);
245 static uint8_t ustorage_fs_write(struct ustorage_fs_softc *sc);
246 static uint8_t ustorage_fs_check_cmd(struct ustorage_fs_softc *sc, uint8_t cmd_size, uint16_t mask, uint8_t needs_medium);
247 static uint8_t ustorage_fs_do_cmd(struct ustorage_fs_softc *sc);
248
249 static device_method_t ustorage_fs_methods[] = {
250         /* USB interface */
251         DEVMETHOD(usb_handle_request, ustorage_fs_handle_request),
252
253         /* Device interface */
254         DEVMETHOD(device_probe, ustorage_fs_probe),
255         DEVMETHOD(device_attach, ustorage_fs_attach),
256         DEVMETHOD(device_detach, ustorage_fs_detach),
257         DEVMETHOD(device_suspend, ustorage_fs_suspend),
258         DEVMETHOD(device_resume, ustorage_fs_resume),
259
260         DEVMETHOD_END
261 };
262
263 static driver_t ustorage_fs_driver = {
264         .name = "ustorage_fs",
265         .methods = ustorage_fs_methods,
266         .size = sizeof(struct ustorage_fs_softc),
267 };
268
269 static devclass_t ustorage_fs_devclass;
270
271 DRIVER_MODULE(ustorage_fs, uhub, ustorage_fs_driver, ustorage_fs_devclass, NULL, 0);
272 MODULE_VERSION(ustorage_fs, 0);
273 MODULE_DEPEND(ustorage_fs, usb, 1, 1, 1);
274
275 static struct usb_config ustorage_fs_bbb_config[USTORAGE_FS_T_BBB_MAX] = {
276         [USTORAGE_FS_T_BBB_COMMAND] = {
277                 .type = UE_BULK,
278                 .endpoint = UE_ADDR_ANY,
279                 .direction = UE_DIR_OUT,
280                 .bufsize = sizeof(ustorage_fs_bbb_cbw_t),
281                 .callback = &ustorage_fs_t_bbb_command_callback,
282                 .usb_mode = USB_MODE_DEVICE,
283         },
284
285         [USTORAGE_FS_T_BBB_DATA_DUMP] = {
286                 .type = UE_BULK,
287                 .endpoint = UE_ADDR_ANY,
288                 .direction = UE_DIR_OUT,
289                 .bufsize = 0,   /* use wMaxPacketSize */
290                 .flags = {.proxy_buffer = 1,.short_xfer_ok = 1,},
291                 .callback = &ustorage_fs_t_bbb_data_dump_callback,
292                 .usb_mode = USB_MODE_DEVICE,
293         },
294
295         [USTORAGE_FS_T_BBB_DATA_READ] = {
296                 .type = UE_BULK,
297                 .endpoint = UE_ADDR_ANY,
298                 .direction = UE_DIR_OUT,
299                 .bufsize = USTORAGE_FS_BULK_SIZE,
300                 .flags = {.proxy_buffer = 1,.short_xfer_ok = 1},
301                 .callback = &ustorage_fs_t_bbb_data_read_callback,
302                 .usb_mode = USB_MODE_DEVICE,
303         },
304
305         [USTORAGE_FS_T_BBB_DATA_WRITE] = {
306                 .type = UE_BULK,
307                 .endpoint = UE_ADDR_ANY,
308                 .direction = UE_DIR_IN,
309                 .bufsize = USTORAGE_FS_BULK_SIZE,
310                 .flags = {.proxy_buffer = 1,.short_xfer_ok = 1,.ext_buffer = 1},
311                 .callback = &ustorage_fs_t_bbb_data_write_callback,
312                 .usb_mode = USB_MODE_DEVICE,
313         },
314
315         [USTORAGE_FS_T_BBB_STATUS] = {
316                 .type = UE_BULK,
317                 .endpoint = UE_ADDR_ANY,
318                 .direction = UE_DIR_IN,
319                 .bufsize = sizeof(ustorage_fs_bbb_csw_t),
320                 .flags = {.short_xfer_ok = 1},
321                 .callback = &ustorage_fs_t_bbb_status_callback,
322                 .usb_mode = USB_MODE_DEVICE,
323         },
324 };
325
326 /*
327  * USB device probe/attach/detach
328  */
329
330 static int
331 ustorage_fs_probe(device_t dev)
332 {
333         struct usb_attach_arg *uaa = device_get_ivars(dev);
334         struct usb_interface_descriptor *id;
335
336         if (uaa->usb_mode != USB_MODE_DEVICE) {
337                 return (ENXIO);
338         }
339         /* Check for a standards compliant device */
340         id = usbd_get_interface_descriptor(uaa->iface);
341         if ((id == NULL) ||
342             (id->bInterfaceClass != UICLASS_MASS) ||
343             (id->bInterfaceSubClass != UISUBCLASS_SCSI) ||
344             (id->bInterfaceProtocol != UIPROTO_MASS_BBB)) {
345                 return (ENXIO);
346         }
347         return (BUS_PROBE_GENERIC);
348 }
349
350 static int
351 ustorage_fs_attach(device_t dev)
352 {
353         struct ustorage_fs_softc *sc = device_get_softc(dev);
354         struct usb_attach_arg *uaa = device_get_ivars(dev);
355         struct usb_interface_descriptor *id;
356         int err;
357         int unit;
358
359         /*
360          * NOTE: the softc struct is cleared in device_set_driver.
361          * We can safely call ustorage_fs_detach without specifically
362          * initializing the struct.
363          */
364
365         sc->sc_dev = dev;
366         sc->sc_udev = uaa->device;
367         unit = device_get_unit(dev);
368
369         /* enable power saving mode */
370         usbd_set_power_mode(uaa->device, USB_POWER_MODE_SAVE);
371
372         if (unit == 0) {
373                 if (ustorage_fs_ramdisk == NULL) {
374                         /*
375                          * allocate a memory image for our ramdisk until
376                          * further
377                          */
378                         ustorage_fs_ramdisk =
379                             malloc(USTORAGE_FS_RAM_SECT << 9, M_USB,
380                             M_ZERO | M_WAITOK);
381                 }
382                 sc->sc_lun[0].memory_image = ustorage_fs_ramdisk;
383                 sc->sc_lun[0].num_sectors = USTORAGE_FS_RAM_SECT;
384                 sc->sc_lun[0].removable = 1;
385         }
386
387         device_set_usb_desc(dev);
388
389         mtx_init(&sc->sc_mtx, "USTORAGE_FS lock",
390             NULL, (MTX_DEF | MTX_RECURSE));
391
392         /* get interface index */
393
394         id = usbd_get_interface_descriptor(uaa->iface);
395         if (id == NULL) {
396                 device_printf(dev, "failed to get "
397                     "interface number\n");
398                 goto detach;
399         }
400         sc->sc_iface_no = id->bInterfaceNumber;
401
402         err = usbd_transfer_setup(uaa->device,
403             &uaa->info.bIfaceIndex, sc->sc_xfer, ustorage_fs_bbb_config,
404             USTORAGE_FS_T_BBB_MAX, sc, &sc->sc_mtx);
405         if (err) {
406                 device_printf(dev, "could not setup required "
407                     "transfers, %s\n", usbd_errstr(err));
408                 goto detach;
409         }
410
411         sc->sc_cbw = usbd_xfer_get_frame_buffer(sc->sc_xfer[
412             USTORAGE_FS_T_BBB_COMMAND], 0);
413         sc->sc_csw = usbd_xfer_get_frame_buffer(sc->sc_xfer[
414             USTORAGE_FS_T_BBB_STATUS], 0);
415         sc->sc_dma_ptr = usbd_xfer_get_frame_buffer(sc->sc_xfer[
416             USTORAGE_FS_T_BBB_DATA_READ], 0);
417
418         /* start Mass Storage State Machine */
419
420         mtx_lock(&sc->sc_mtx);
421         ustorage_fs_transfer_start(sc, USTORAGE_FS_T_BBB_COMMAND);
422         mtx_unlock(&sc->sc_mtx);
423
424         return (0);                     /* success */
425
426 detach:
427         ustorage_fs_detach(dev);
428         return (ENXIO);                 /* failure */
429 }
430
431 static int
432 ustorage_fs_detach(device_t dev)
433 {
434         struct ustorage_fs_softc *sc = device_get_softc(dev);
435
436         /* teardown our statemachine */
437
438         usbd_transfer_unsetup(sc->sc_xfer, USTORAGE_FS_T_BBB_MAX);
439
440         mtx_destroy(&sc->sc_mtx);
441
442         return (0);                     /* success */
443 }
444
445 static int
446 ustorage_fs_suspend(device_t dev)
447 {
448         device_printf(dev, "suspending\n");
449         return (0);                     /* success */
450 }
451
452 static int
453 ustorage_fs_resume(device_t dev)
454 {
455         device_printf(dev, "resuming\n");
456         return (0);                     /* success */
457 }
458
459 /*
460  * Generic functions to handle transfers
461  */
462
463 static void
464 ustorage_fs_transfer_start(struct ustorage_fs_softc *sc, uint8_t xfer_index)
465 {
466         if (sc->sc_xfer[xfer_index]) {
467                 sc->sc_last_xfer_index = xfer_index;
468                 usbd_transfer_start(sc->sc_xfer[xfer_index]);
469         }
470 }
471
472 static void
473 ustorage_fs_transfer_stop(struct ustorage_fs_softc *sc)
474 {
475         usbd_transfer_stop(sc->sc_xfer[sc->sc_last_xfer_index]);
476         mtx_unlock(&sc->sc_mtx);
477         usbd_transfer_drain(sc->sc_xfer[sc->sc_last_xfer_index]);
478         mtx_lock(&sc->sc_mtx);
479 }
480
481 static int
482 ustorage_fs_handle_request(device_t dev,
483     const void *preq, void **pptr, uint16_t *plen,
484     uint16_t offset, uint8_t *pstate)
485 {
486         struct ustorage_fs_softc *sc = device_get_softc(dev);
487         const struct usb_device_request *req = preq;
488         uint8_t is_complete = *pstate;
489
490         if (!is_complete) {
491                 if ((req->bmRequestType == UT_WRITE_CLASS_INTERFACE) &&
492                     (req->bRequest == UR_BBB_RESET)) {
493                         *plen = 0;
494                         mtx_lock(&sc->sc_mtx);
495                         ustorage_fs_transfer_stop(sc);
496                         sc->sc_transfer.data_error = 1;
497                         ustorage_fs_transfer_start(sc,
498                             USTORAGE_FS_T_BBB_COMMAND);
499                         mtx_unlock(&sc->sc_mtx);
500                         return (0);
501                 } else if ((req->bmRequestType == UT_READ_CLASS_INTERFACE) &&
502                            (req->bRequest == UR_BBB_GET_MAX_LUN)) {
503                         if (offset == 0) {
504                                 *plen = 1;
505                                 *pptr = &sc->sc_last_lun;
506                         } else {
507                                 *plen = 0;
508                         }
509                         return (0);
510                 }
511         }
512         return (ENXIO);                 /* use builtin handler */
513 }
514
515 static void
516 ustorage_fs_t_bbb_command_callback(struct usb_xfer *xfer, usb_error_t error)
517 {
518         struct ustorage_fs_softc *sc = usbd_xfer_softc(xfer);
519         uint32_t tag;
520         uint8_t err = 0;
521
522         DPRINTF("\n");
523
524         switch (USB_GET_STATE(xfer)) {
525         case USB_ST_TRANSFERRED:
526
527                 tag = UGETDW(sc->sc_cbw->dCBWSignature);
528
529                 if (tag != CBWSIGNATURE) {
530                         /* do nothing */
531                         DPRINTF("invalid signature 0x%08x\n", tag);
532                         break;
533                 }
534                 tag = UGETDW(sc->sc_cbw->dCBWTag);
535
536                 /* echo back tag */
537                 USETDW(sc->sc_csw->dCSWTag, tag);
538
539                 /* reset status */
540                 sc->sc_csw->bCSWStatus = 0;
541
542                 /* reset data offset, data length and data remainder */
543                 sc->sc_transfer.offset = 0;
544                 sc->sc_transfer.data_rem =
545                     UGETDW(sc->sc_cbw->dCBWDataTransferLength);
546
547                 /* reset data flags */
548                 sc->sc_transfer.data_short = 0;
549
550                 /* extract LUN */
551                 sc->sc_transfer.lun = sc->sc_cbw->bCBWLUN;
552
553                 if (sc->sc_transfer.data_rem == 0) {
554                         sc->sc_transfer.cbw_dir = DIR_NONE;
555                 } else {
556                         if (sc->sc_cbw->bCBWFlags & CBWFLAGS_IN) {
557                                 sc->sc_transfer.cbw_dir = DIR_WRITE;
558                         } else {
559                                 sc->sc_transfer.cbw_dir = DIR_READ;
560                         }
561                 }
562
563                 sc->sc_transfer.cmd_len = sc->sc_cbw->bCDBLength;
564                 if ((sc->sc_transfer.cmd_len > sizeof(sc->sc_cbw->CBWCDB)) ||
565                     (sc->sc_transfer.cmd_len == 0)) {
566                         /* just halt - this is invalid */
567                         DPRINTF("invalid command length %d bytes\n",
568                             sc->sc_transfer.cmd_len);
569                         break;
570                 }
571
572                 err = ustorage_fs_do_cmd(sc);
573                 if (err) {
574                         /* got an error */
575                         DPRINTF("command failed\n");
576                         break;
577                 }
578                 if ((sc->sc_transfer.data_rem > 0) &&
579                     (sc->sc_transfer.cbw_dir != sc->sc_transfer.cmd_dir)) {
580                         /* contradicting data transfer direction */
581                         err = 1;
582                         DPRINTF("data direction mismatch\n");
583                         break;
584                 }
585                 switch (sc->sc_transfer.cbw_dir) {
586                 case DIR_READ:
587                         ustorage_fs_transfer_start(sc, USTORAGE_FS_T_BBB_DATA_READ);
588                         break;
589                 case DIR_WRITE:
590                         ustorage_fs_transfer_start(sc, USTORAGE_FS_T_BBB_DATA_WRITE);
591                         break;
592                 default:
593                         ustorage_fs_transfer_start(sc,
594                             USTORAGE_FS_T_BBB_STATUS);
595                         break;
596                 }
597                 break;
598
599         case USB_ST_SETUP:
600 tr_setup:
601                 if (sc->sc_transfer.data_error) {
602                         sc->sc_transfer.data_error = 0;
603                         usbd_xfer_set_stall(xfer);
604                         DPRINTF("stall pipe\n");
605                 }
606                 usbd_xfer_set_frame_len(xfer, 0,
607                     sizeof(ustorage_fs_bbb_cbw_t));
608                 usbd_transfer_submit(xfer);
609                 break;
610
611         default:                        /* Error */
612                 DPRINTF("error\n");
613                 if (error == USB_ERR_CANCELLED) {
614                         break;
615                 }
616                 /* If the pipe is already stalled, don't do another stall */
617                 if (!usbd_xfer_is_stalled(xfer))
618                         sc->sc_transfer.data_error = 1;
619
620                 /* try again */
621                 goto tr_setup;
622         }
623         if (err) {
624                 if (sc->sc_csw->bCSWStatus == 0) {
625                         /* set some default error code */
626                         sc->sc_csw->bCSWStatus = CSWSTATUS_FAILED;
627                 }
628                 if (sc->sc_transfer.cbw_dir == DIR_READ) {
629                         /* dump all data */
630                         ustorage_fs_transfer_start(sc,
631                             USTORAGE_FS_T_BBB_DATA_DUMP);
632                         return;
633                 }
634                 if (sc->sc_transfer.cbw_dir == DIR_WRITE) {
635                         /* need to stall before status */
636                         sc->sc_transfer.data_error = 1;
637                 }
638                 ustorage_fs_transfer_start(sc, USTORAGE_FS_T_BBB_STATUS);
639         }
640 }
641
642 static void
643 ustorage_fs_t_bbb_data_dump_callback(struct usb_xfer *xfer, usb_error_t error)
644 {
645         struct ustorage_fs_softc *sc = usbd_xfer_softc(xfer);
646         uint32_t max_bulk = usbd_xfer_max_len(xfer);
647         int actlen, sumlen;
648
649         usbd_xfer_status(xfer, &actlen, &sumlen, NULL, NULL);
650
651         DPRINTF("\n");
652
653         switch (USB_GET_STATE(xfer)) {
654         case USB_ST_TRANSFERRED:
655                 sc->sc_transfer.data_rem -= actlen;
656                 sc->sc_transfer.offset += actlen;
657
658                 if (actlen != sumlen || sc->sc_transfer.data_rem == 0) {
659                         /* short transfer or end of data */
660                         ustorage_fs_transfer_start(sc,
661                             USTORAGE_FS_T_BBB_STATUS);
662                         break;
663                 }
664                 /* Fallthrough */
665
666         case USB_ST_SETUP:
667 tr_setup:
668                 if (max_bulk > sc->sc_transfer.data_rem) {
669                         max_bulk = sc->sc_transfer.data_rem;
670                 }
671                 if (sc->sc_transfer.data_error) {
672                         sc->sc_transfer.data_error = 0;
673                         usbd_xfer_set_stall(xfer);
674                 }
675                 usbd_xfer_set_frame_len(xfer, 0, max_bulk);
676                 usbd_transfer_submit(xfer);
677                 break;
678
679         default:                        /* Error */
680                 if (error == USB_ERR_CANCELLED) {
681                         break;
682                 }
683                 /*
684                  * If the pipe is already stalled, don't do another stall:
685                  */
686                 if (!usbd_xfer_is_stalled(xfer))
687                         sc->sc_transfer.data_error = 1;
688
689                 /* try again */
690                 goto tr_setup;
691         }
692 }
693
694 static void
695 ustorage_fs_t_bbb_data_read_callback(struct usb_xfer *xfer, usb_error_t error)
696 {
697         struct ustorage_fs_softc *sc = usbd_xfer_softc(xfer);
698         uint32_t max_bulk = usbd_xfer_max_len(xfer);
699         int actlen, sumlen;
700
701         usbd_xfer_status(xfer, &actlen, &sumlen, NULL, NULL);
702
703         DPRINTF("\n");
704
705         switch (USB_GET_STATE(xfer)) {
706         case USB_ST_TRANSFERRED:
707                 /* XXX copy data from DMA buffer */
708                 memcpy(sc->sc_transfer.data_ptr, sc->sc_dma_ptr, actlen);
709
710                 sc->sc_transfer.data_rem -= actlen;
711                 sc->sc_transfer.data_ptr += actlen;
712                 sc->sc_transfer.offset += actlen;
713
714                 if (actlen != sumlen || sc->sc_transfer.data_rem == 0) {
715                         /* short transfer or end of data */
716                         ustorage_fs_transfer_start(sc,
717                             USTORAGE_FS_T_BBB_STATUS);
718                         break;
719                 }
720                 /* Fallthrough */
721
722         case USB_ST_SETUP:
723 tr_setup:
724                 if (max_bulk > sc->sc_transfer.data_rem) {
725                         max_bulk = sc->sc_transfer.data_rem;
726                 }
727                 if (sc->sc_transfer.data_error) {
728                         sc->sc_transfer.data_error = 0;
729                         usbd_xfer_set_stall(xfer);
730                 }
731
732                 usbd_xfer_set_frame_data(xfer, 0, sc->sc_dma_ptr, max_bulk);
733                 usbd_transfer_submit(xfer);
734                 break;
735
736         default:                        /* Error */
737                 if (error == USB_ERR_CANCELLED) {
738                         break;
739                 }
740                 /* If the pipe is already stalled, don't do another stall */
741                 if (!usbd_xfer_is_stalled(xfer))
742                         sc->sc_transfer.data_error = 1;
743
744                 /* try again */
745                 goto tr_setup;
746         }
747 }
748
749 static void
750 ustorage_fs_t_bbb_data_write_callback(struct usb_xfer *xfer, usb_error_t error)
751 {
752         struct ustorage_fs_softc *sc = usbd_xfer_softc(xfer);
753         uint32_t max_bulk = usbd_xfer_max_len(xfer);
754         int actlen, sumlen;
755
756         usbd_xfer_status(xfer, &actlen, &sumlen, NULL, NULL);
757
758         DPRINTF("\n");
759
760         switch (USB_GET_STATE(xfer)) {
761         case USB_ST_TRANSFERRED:
762                 sc->sc_transfer.data_rem -= actlen;
763                 sc->sc_transfer.data_ptr += actlen;
764                 sc->sc_transfer.offset += actlen;
765
766                 if (actlen != sumlen || sc->sc_transfer.data_rem == 0) {
767                         /* short transfer or end of data */
768                         ustorage_fs_transfer_start(sc,
769                             USTORAGE_FS_T_BBB_STATUS);
770                         break;
771                 }
772         case USB_ST_SETUP:
773 tr_setup:
774                 if (max_bulk >= sc->sc_transfer.data_rem) {
775                         max_bulk = sc->sc_transfer.data_rem;
776                         if (sc->sc_transfer.data_short)
777                                 usbd_xfer_set_flag(xfer, USB_FORCE_SHORT_XFER);
778                         else
779                                 usbd_xfer_clr_flag(xfer, USB_FORCE_SHORT_XFER);
780                 } else
781                         usbd_xfer_clr_flag(xfer, USB_FORCE_SHORT_XFER);
782
783                 if (sc->sc_transfer.data_error) {
784                         sc->sc_transfer.data_error = 0;
785                         usbd_xfer_set_stall(xfer);
786                 }
787
788                 /* XXX copy data to DMA buffer */
789                 memcpy(sc->sc_dma_ptr, sc->sc_transfer.data_ptr, max_bulk);
790
791                 usbd_xfer_set_frame_data(xfer, 0, sc->sc_dma_ptr, max_bulk);
792                 usbd_transfer_submit(xfer);
793                 break;
794
795         default:                        /* Error */
796                 if (error == USB_ERR_CANCELLED) {
797                         break;
798                 }
799                 /*
800                  * If the pipe is already stalled, don't do another
801                  * stall
802                  */
803                 if (!usbd_xfer_is_stalled(xfer))
804                         sc->sc_transfer.data_error = 1;
805
806                 /* try again */
807                 goto tr_setup;
808         }
809 }
810
811 static void
812 ustorage_fs_t_bbb_status_callback(struct usb_xfer *xfer, usb_error_t error)
813 {
814         struct ustorage_fs_softc *sc = usbd_xfer_softc(xfer);
815
816         DPRINTF("\n");
817
818         switch (USB_GET_STATE(xfer)) {
819         case USB_ST_TRANSFERRED:
820                 ustorage_fs_transfer_start(sc, USTORAGE_FS_T_BBB_COMMAND);
821                 break;
822
823         case USB_ST_SETUP:
824 tr_setup:
825                 USETDW(sc->sc_csw->dCSWSignature, CSWSIGNATURE);
826                 USETDW(sc->sc_csw->dCSWDataResidue, sc->sc_transfer.data_rem);
827
828                 if (sc->sc_transfer.data_error) {
829                         sc->sc_transfer.data_error = 0;
830                         usbd_xfer_set_stall(xfer);
831                 }
832                 usbd_xfer_set_frame_len(xfer, 0,
833                     sizeof(ustorage_fs_bbb_csw_t));
834                 usbd_transfer_submit(xfer);
835                 break;
836
837         default:
838                 if (error == USB_ERR_CANCELLED) {
839                         break;
840                 }
841                 /* If the pipe is already stalled, don't do another stall */
842                 if (!usbd_xfer_is_stalled(xfer))
843                         sc->sc_transfer.data_error = 1;
844
845                 /* try again */
846                 goto tr_setup;
847         }
848 }
849
850 /* SCSI commands that we recognize */
851 #define SC_FORMAT_UNIT                  0x04
852 #define SC_INQUIRY                      0x12
853 #define SC_MODE_SELECT_6                0x15
854 #define SC_MODE_SELECT_10               0x55
855 #define SC_MODE_SENSE_6                 0x1a
856 #define SC_MODE_SENSE_10                0x5a
857 #define SC_PREVENT_ALLOW_MEDIUM_REMOVAL 0x1e
858 #define SC_READ_6                       0x08
859 #define SC_READ_10                      0x28
860 #define SC_READ_12                      0xa8
861 #define SC_READ_CAPACITY                0x25
862 #define SC_READ_FORMAT_CAPACITIES       0x23
863 #define SC_RELEASE                      0x17
864 #define SC_REQUEST_SENSE                0x03
865 #define SC_RESERVE                      0x16
866 #define SC_SEND_DIAGNOSTIC              0x1d
867 #define SC_START_STOP_UNIT              0x1b
868 #define SC_SYNCHRONIZE_CACHE            0x35
869 #define SC_TEST_UNIT_READY              0x00
870 #define SC_VERIFY                       0x2f
871 #define SC_WRITE_6                      0x0a
872 #define SC_WRITE_10                     0x2a
873 #define SC_WRITE_12                     0xaa
874
875 /* SCSI Sense Key/Additional Sense Code/ASC Qualifier values */
876 #define SS_NO_SENSE                             0
877 #define SS_COMMUNICATION_FAILURE                0x040800
878 #define SS_INVALID_COMMAND                      0x052000
879 #define SS_INVALID_FIELD_IN_CDB                 0x052400
880 #define SS_LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE   0x052100
881 #define SS_LOGICAL_UNIT_NOT_SUPPORTED           0x052500
882 #define SS_MEDIUM_NOT_PRESENT                   0x023a00
883 #define SS_MEDIUM_REMOVAL_PREVENTED             0x055302
884 #define SS_NOT_READY_TO_READY_TRANSITION        0x062800
885 #define SS_RESET_OCCURRED                       0x062900
886 #define SS_SAVING_PARAMETERS_NOT_SUPPORTED      0x053900
887 #define SS_UNRECOVERED_READ_ERROR               0x031100
888 #define SS_WRITE_ERROR                          0x030c02
889 #define SS_WRITE_PROTECTED                      0x072700
890
891 #define SK(x)           ((uint8_t) ((x) >> 16)) /* Sense Key byte, etc. */
892 #define ASC(x)          ((uint8_t) ((x) >> 8))
893 #define ASCQ(x)         ((uint8_t) (x))
894
895 /* Routines for unaligned data access */
896
897 static uint16_t
898 get_be16(uint8_t *buf)
899 {
900         return ((uint16_t)buf[0] << 8) | ((uint16_t)buf[1]);
901 }
902
903 static uint32_t
904 get_be32(uint8_t *buf)
905 {
906         return ((uint32_t)buf[0] << 24) | ((uint32_t)buf[1] << 16) |
907         ((uint32_t)buf[2] << 8) | ((uint32_t)buf[3]);
908 }
909
910 static void
911 put_be16(uint8_t *buf, uint16_t val)
912 {
913         buf[0] = val >> 8;
914         buf[1] = val;
915 }
916
917 static void
918 put_be32(uint8_t *buf, uint32_t val)
919 {
920         buf[0] = val >> 24;
921         buf[1] = val >> 16;
922         buf[2] = val >> 8;
923         buf[3] = val & 0xff;
924 }
925
926 /*------------------------------------------------------------------------*
927  *      ustorage_fs_verify
928  *
929  * Returns:
930  *    0: Success
931  * Else: Failure
932  *------------------------------------------------------------------------*/
933 static uint8_t
934 ustorage_fs_verify(struct ustorage_fs_softc *sc)
935 {
936         struct ustorage_fs_lun *currlun = sc->sc_transfer.currlun;
937         uint32_t lba;
938         uint32_t vlen;
939         uint64_t file_offset;
940         uint64_t amount_left;
941
942         /*
943          * Get the starting Logical Block Address
944          */
945         lba = get_be32(&sc->sc_cbw->CBWCDB[2]);
946
947         /*
948          * We allow DPO (Disable Page Out = don't save data in the cache)
949          * but we don't implement it.
950          */
951         if ((sc->sc_cbw->CBWCDB[1] & ~0x10) != 0) {
952                 currlun->sense_data = SS_INVALID_FIELD_IN_CDB;
953                 return (1);
954         }
955         vlen = get_be16(&sc->sc_cbw->CBWCDB[7]);
956         if (vlen == 0) {
957                 goto done;
958         }
959         /* No default reply */
960
961         /* Prepare to carry out the file verify */
962         amount_left = vlen;
963         amount_left <<= 9;
964         file_offset = lba;
965         file_offset <<= 9;
966
967         /* Range check */
968         vlen += lba;
969
970         if ((vlen < lba) ||
971             (vlen > currlun->num_sectors) ||
972             (lba >= currlun->num_sectors)) {
973                 currlun->sense_data = SS_LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE;
974                 return (1);
975         }
976         /* XXX TODO: verify that data is readable */
977 done:
978         return (ustorage_fs_min_len(sc, 0, -1U));
979 }
980
981 /*------------------------------------------------------------------------*
982  *      ustorage_fs_inquiry
983  *
984  * Returns:
985  *    0: Success
986  * Else: Failure
987  *------------------------------------------------------------------------*/
988 static uint8_t
989 ustorage_fs_inquiry(struct ustorage_fs_softc *sc)
990 {
991         uint8_t *buf = sc->sc_transfer.data_ptr;
992
993         struct ustorage_fs_lun *currlun = sc->sc_transfer.currlun;
994
995         if (!sc->sc_transfer.currlun) {
996                 /* Unsupported LUNs are okay */
997                 memset(buf, 0, 36);
998                 buf[0] = 0x7f;
999                 /* Unsupported, no device - type */
1000                 return (ustorage_fs_min_len(sc, 36, -1U));
1001         }
1002         memset(buf, 0, 8);
1003         /* Non - removable, direct - access device */
1004         if (currlun->removable)
1005                 buf[1] = 0x80;
1006         buf[2] = 2;
1007         /* ANSI SCSI level 2 */
1008         buf[3] = 2;
1009         /* SCSI - 2 INQUIRY data format */
1010         buf[4] = 31;
1011         /* Additional length */
1012         /* No special options */
1013         /* Copy in ID string */
1014         memcpy(buf + 8, USTORAGE_FS_ID_STRING, 28);
1015
1016 #if (USTORAGE_QDATA_MAX < 36)
1017 #error "(USTORAGE_QDATA_MAX < 36)"
1018 #endif
1019         return (ustorage_fs_min_len(sc, 36, -1U));
1020 }
1021
1022 /*------------------------------------------------------------------------*
1023  *      ustorage_fs_request_sense
1024  *
1025  * Returns:
1026  *    0: Success
1027  * Else: Failure
1028  *------------------------------------------------------------------------*/
1029 static uint8_t
1030 ustorage_fs_request_sense(struct ustorage_fs_softc *sc)
1031 {
1032         uint8_t *buf = sc->sc_transfer.data_ptr;
1033         struct ustorage_fs_lun *currlun = sc->sc_transfer.currlun;
1034         uint32_t sd;
1035         uint32_t sdinfo;
1036         uint8_t valid;
1037
1038         /*
1039          * From the SCSI-2 spec., section 7.9 (Unit attention condition):
1040          *
1041          * If a REQUEST SENSE command is received from an initiator
1042          * with a pending unit attention condition (before the target
1043          * generates the contingent allegiance condition), then the
1044          * target shall either:
1045          *   a) report any pending sense data and preserve the unit
1046          *      attention condition on the logical unit, or,
1047          *   b) report the unit attention condition, may discard any
1048          *      pending sense data, and clear the unit attention
1049          *      condition on the logical unit for that initiator.
1050          *
1051          * FSG normally uses option a); enable this code to use option b).
1052          */
1053 #if 0
1054         if (currlun && currlun->unit_attention_data != SS_NO_SENSE) {
1055                 currlun->sense_data = currlun->unit_attention_data;
1056                 currlun->unit_attention_data = SS_NO_SENSE;
1057         }
1058 #endif
1059
1060         if (!currlun) {
1061                 /* Unsupported LUNs are okay */
1062                 sd = SS_LOGICAL_UNIT_NOT_SUPPORTED;
1063                 sdinfo = 0;
1064                 valid = 0;
1065         } else {
1066                 sd = currlun->sense_data;
1067                 sdinfo = currlun->sense_data_info;
1068                 valid = currlun->info_valid << 7;
1069                 currlun->sense_data = SS_NO_SENSE;
1070                 currlun->sense_data_info = 0;
1071                 currlun->info_valid = 0;
1072         }
1073
1074         memset(buf, 0, 18);
1075         buf[0] = valid | 0x70;
1076         /* Valid, current error */
1077         buf[2] = SK(sd);
1078         put_be32(&buf[3], sdinfo);
1079         /* Sense information */
1080         buf[7] = 18 - 8;
1081         /* Additional sense length */
1082         buf[12] = ASC(sd);
1083         buf[13] = ASCQ(sd);
1084
1085 #if (USTORAGE_QDATA_MAX < 18)
1086 #error "(USTORAGE_QDATA_MAX < 18)"
1087 #endif
1088         return (ustorage_fs_min_len(sc, 18, -1U));
1089 }
1090
1091 /*------------------------------------------------------------------------*
1092  *      ustorage_fs_read_capacity
1093  *
1094  * Returns:
1095  *    0: Success
1096  * Else: Failure
1097  *------------------------------------------------------------------------*/
1098 static uint8_t
1099 ustorage_fs_read_capacity(struct ustorage_fs_softc *sc)
1100 {
1101         uint8_t *buf = sc->sc_transfer.data_ptr;
1102         struct ustorage_fs_lun *currlun = sc->sc_transfer.currlun;
1103         uint32_t lba = get_be32(&sc->sc_cbw->CBWCDB[2]);
1104         uint8_t pmi = sc->sc_cbw->CBWCDB[8];
1105
1106         /* Check the PMI and LBA fields */
1107         if ((pmi > 1) || ((pmi == 0) && (lba != 0))) {
1108                 currlun->sense_data = SS_INVALID_FIELD_IN_CDB;
1109                 return (1);
1110         }
1111         /* Max logical block */
1112         put_be32(&buf[0], currlun->num_sectors - 1);
1113         /* Block length */
1114         put_be32(&buf[4], 512);
1115
1116 #if (USTORAGE_QDATA_MAX < 8)
1117 #error "(USTORAGE_QDATA_MAX < 8)"
1118 #endif
1119         return (ustorage_fs_min_len(sc, 8, -1U));
1120 }
1121
1122 /*------------------------------------------------------------------------*
1123  *      ustorage_fs_mode_sense
1124  *
1125  * Returns:
1126  *    0: Success
1127  * Else: Failure
1128  *------------------------------------------------------------------------*/
1129 static uint8_t
1130 ustorage_fs_mode_sense(struct ustorage_fs_softc *sc)
1131 {
1132         uint8_t *buf = sc->sc_transfer.data_ptr;
1133         struct ustorage_fs_lun *currlun = sc->sc_transfer.currlun;
1134         uint8_t *buf0;
1135         uint16_t len;
1136         uint16_t limit;
1137         uint8_t mscmnd = sc->sc_cbw->CBWCDB[0];
1138         uint8_t pc;
1139         uint8_t page_code;
1140         uint8_t changeable_values;
1141         uint8_t all_pages;
1142
1143         buf0 = buf;
1144
1145         if ((sc->sc_cbw->CBWCDB[1] & ~0x08) != 0) {
1146                 /* Mask away DBD */
1147                 currlun->sense_data = SS_INVALID_FIELD_IN_CDB;
1148                 return (1);
1149         }
1150         pc = sc->sc_cbw->CBWCDB[2] >> 6;
1151         page_code = sc->sc_cbw->CBWCDB[2] & 0x3f;
1152         if (pc == 3) {
1153                 currlun->sense_data = SS_SAVING_PARAMETERS_NOT_SUPPORTED;
1154                 return (1);
1155         }
1156         changeable_values = (pc == 1);
1157         all_pages = (page_code == 0x3f);
1158
1159         /*
1160          * Write the mode parameter header.  Fixed values are: default
1161          * medium type, no cache control (DPOFUA), and no block descriptors.
1162          * The only variable value is the WriteProtect bit.  We will fill in
1163          * the mode data length later.
1164          */
1165         memset(buf, 0, 8);
1166         if (mscmnd == SC_MODE_SENSE_6) {
1167                 buf[2] = (currlun->read_only ? 0x80 : 0x00);
1168                 /* WP, DPOFUA */
1169                 buf += 4;
1170                 limit = 255;
1171         } else {
1172                 /* SC_MODE_SENSE_10 */
1173                 buf[3] = (currlun->read_only ? 0x80 : 0x00);
1174                 /* WP, DPOFUA */
1175                 buf += 8;
1176                 limit = 65535;
1177                 /* Should really be mod_data.buflen */
1178         }
1179
1180         /* No block descriptors */
1181
1182         /*
1183          * The mode pages, in numerical order.
1184          */
1185         if ((page_code == 0x08) || all_pages) {
1186                 buf[0] = 0x08;
1187                 /* Page code */
1188                 buf[1] = 10;
1189                 /* Page length */
1190                 memset(buf + 2, 0, 10);
1191                 /* None of the fields are changeable */
1192
1193                 if (!changeable_values) {
1194                         buf[2] = 0x04;
1195                         /* Write cache enable, */
1196                         /* Read cache not disabled */
1197                         /* No cache retention priorities */
1198                         put_be16(&buf[4], 0xffff);
1199                         /* Don 't disable prefetch */
1200                         /* Minimum prefetch = 0 */
1201                         put_be16(&buf[8], 0xffff);
1202                         /* Maximum prefetch */
1203                         put_be16(&buf[10], 0xffff);
1204                         /* Maximum prefetch ceiling */
1205                 }
1206                 buf += 12;
1207         }
1208         /*
1209          * Check that a valid page was requested and the mode data length
1210          * isn't too long.
1211          */
1212         len = buf - buf0;
1213         if (len > limit) {
1214                 currlun->sense_data = SS_INVALID_FIELD_IN_CDB;
1215                 return (1);
1216         }
1217         /* Store the mode data length */
1218         if (mscmnd == SC_MODE_SENSE_6)
1219                 buf0[0] = len - 1;
1220         else
1221                 put_be16(buf0, len - 2);
1222
1223 #if (USTORAGE_QDATA_MAX < 24)
1224 #error "(USTORAGE_QDATA_MAX < 24)"
1225 #endif
1226         return (ustorage_fs_min_len(sc, len, -1U));
1227 }
1228
1229 /*------------------------------------------------------------------------*
1230  *      ustorage_fs_start_stop
1231  *
1232  * Returns:
1233  *    0: Success
1234  * Else: Failure
1235  *------------------------------------------------------------------------*/
1236 static uint8_t
1237 ustorage_fs_start_stop(struct ustorage_fs_softc *sc)
1238 {
1239         struct ustorage_fs_lun *currlun = sc->sc_transfer.currlun;
1240         uint8_t loej;
1241         uint8_t start;
1242         uint8_t immed;
1243
1244         if (!currlun->removable) {
1245                 currlun->sense_data = SS_INVALID_COMMAND;
1246                 return (1);
1247         }
1248         immed = sc->sc_cbw->CBWCDB[1] & 0x01;
1249         loej = sc->sc_cbw->CBWCDB[4] & 0x02;
1250         start = sc->sc_cbw->CBWCDB[4] & 0x01;
1251
1252         if (immed || loej || start) {
1253                 /* compile fix */
1254         }
1255         return (0);
1256 }
1257
1258 /*------------------------------------------------------------------------*
1259  *      ustorage_fs_prevent_allow
1260  *
1261  * Returns:
1262  *    0: Success
1263  * Else: Failure
1264  *------------------------------------------------------------------------*/
1265 static uint8_t
1266 ustorage_fs_prevent_allow(struct ustorage_fs_softc *sc)
1267 {
1268         struct ustorage_fs_lun *currlun = sc->sc_transfer.currlun;
1269         uint8_t prevent;
1270
1271         if (!currlun->removable) {
1272                 currlun->sense_data = SS_INVALID_COMMAND;
1273                 return (1);
1274         }
1275         prevent = sc->sc_cbw->CBWCDB[4] & 0x01;
1276         if ((sc->sc_cbw->CBWCDB[4] & ~0x01) != 0) {
1277                 /* Mask away Prevent */
1278                 currlun->sense_data = SS_INVALID_FIELD_IN_CDB;
1279                 return (1);
1280         }
1281         if (currlun->prevent_medium_removal && !prevent) {
1282                 //fsync_sub(currlun);
1283         }
1284         currlun->prevent_medium_removal = prevent;
1285         return (0);
1286 }
1287
1288 /*------------------------------------------------------------------------*
1289  *      ustorage_fs_read_format_capacities
1290  *
1291  * Returns:
1292  *    0: Success
1293  * Else: Failure
1294  *------------------------------------------------------------------------*/
1295 static uint8_t
1296 ustorage_fs_read_format_capacities(struct ustorage_fs_softc *sc)
1297 {
1298         uint8_t *buf = sc->sc_transfer.data_ptr;
1299         struct ustorage_fs_lun *currlun = sc->sc_transfer.currlun;
1300
1301         buf[0] = buf[1] = buf[2] = 0;
1302         buf[3] = 8;
1303         /* Only the Current / Maximum Capacity Descriptor */
1304         buf += 4;
1305
1306         /* Number of blocks */
1307         put_be32(&buf[0], currlun->num_sectors);
1308         /* Block length */
1309         put_be32(&buf[4], 512);
1310         /* Current capacity */
1311         buf[4] = 0x02;
1312
1313 #if (USTORAGE_QDATA_MAX < 12)
1314 #error "(USTORAGE_QDATA_MAX < 12)"
1315 #endif
1316         return (ustorage_fs_min_len(sc, 12, -1U));
1317 }
1318
1319 /*------------------------------------------------------------------------*
1320  *      ustorage_fs_mode_select
1321  *
1322  * Return values:
1323  *    0: Success
1324  * Else: Failure
1325  *------------------------------------------------------------------------*/
1326 static uint8_t
1327 ustorage_fs_mode_select(struct ustorage_fs_softc *sc)
1328 {
1329         struct ustorage_fs_lun *currlun = sc->sc_transfer.currlun;
1330
1331         /* We don't support MODE SELECT */
1332         currlun->sense_data = SS_INVALID_COMMAND;
1333         return (1);
1334 }
1335
1336 /*------------------------------------------------------------------------*
1337  *      ustorage_fs_synchronize_cache
1338  *
1339  * Return values:
1340  *    0: Success
1341  * Else: Failure
1342  *------------------------------------------------------------------------*/
1343 static uint8_t
1344 ustorage_fs_synchronize_cache(struct ustorage_fs_softc *sc)
1345 {
1346 #if 0
1347         struct ustorage_fs_lun *currlun = sc->sc_transfer.currlun;
1348         uint8_t rc;
1349
1350         /*
1351          * We ignore the requested LBA and write out all dirty data buffers.
1352          */
1353         rc = 0;
1354         if (rc) {
1355                 currlun->sense_data = SS_WRITE_ERROR;
1356         }
1357 #endif
1358         return (0);
1359 }
1360
1361 /*------------------------------------------------------------------------*
1362  *      ustorage_fs_read - read data from disk
1363  *
1364  * Return values:
1365  *    0: Success
1366  * Else: Failure
1367  *------------------------------------------------------------------------*/
1368 static uint8_t
1369 ustorage_fs_read(struct ustorage_fs_softc *sc)
1370 {
1371         struct ustorage_fs_lun *currlun = sc->sc_transfer.currlun;
1372         uint64_t file_offset;
1373         uint32_t lba;
1374         uint32_t len;
1375
1376         /*
1377          * Get the starting Logical Block Address and check that it's not
1378          * too big
1379          */
1380         if (sc->sc_cbw->CBWCDB[0] == SC_READ_6) {
1381                 lba = (((uint32_t)sc->sc_cbw->CBWCDB[1]) << 16) |
1382                     get_be16(&sc->sc_cbw->CBWCDB[2]);
1383         } else {
1384                 lba = get_be32(&sc->sc_cbw->CBWCDB[2]);
1385
1386                 /*
1387                  * We allow DPO (Disable Page Out = don't save data in the
1388                  * cache) and FUA (Force Unit Access = don't read from the
1389                  * cache), but we don't implement them.
1390                  */
1391                 if ((sc->sc_cbw->CBWCDB[1] & ~0x18) != 0) {
1392                         currlun->sense_data = SS_INVALID_FIELD_IN_CDB;
1393                         return (1);
1394                 }
1395         }
1396         len = sc->sc_transfer.data_rem >> 9;
1397         len += lba;
1398
1399         if ((len < lba) ||
1400             (len > currlun->num_sectors) ||
1401             (lba >= currlun->num_sectors)) {
1402                 currlun->sense_data = SS_LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE;
1403                 return (1);
1404         }
1405         file_offset = lba;
1406         file_offset <<= 9;
1407
1408         sc->sc_transfer.data_ptr = currlun->memory_image + file_offset;
1409
1410         return (0);
1411 }
1412
1413 /*------------------------------------------------------------------------*
1414  *      ustorage_fs_write - write data to disk
1415  *
1416  * Return values:
1417  *    0: Success
1418  * Else: Failure
1419  *------------------------------------------------------------------------*/
1420 static uint8_t
1421 ustorage_fs_write(struct ustorage_fs_softc *sc)
1422 {
1423         struct ustorage_fs_lun *currlun = sc->sc_transfer.currlun;
1424         uint64_t file_offset;
1425         uint32_t lba;
1426         uint32_t len;
1427
1428         if (currlun->read_only) {
1429                 currlun->sense_data = SS_WRITE_PROTECTED;
1430                 return (1);
1431         }
1432         /* XXX clear SYNC */
1433
1434         /*
1435          * Get the starting Logical Block Address and check that it's not
1436          * too big.
1437          */
1438         if (sc->sc_cbw->CBWCDB[0] == SC_WRITE_6)
1439                 lba = (((uint32_t)sc->sc_cbw->CBWCDB[1]) << 16) |
1440                     get_be16(&sc->sc_cbw->CBWCDB[2]);
1441         else {
1442                 lba = get_be32(&sc->sc_cbw->CBWCDB[2]);
1443
1444                 /*
1445                  * We allow DPO (Disable Page Out = don't save data in the
1446                  * cache) and FUA (Force Unit Access = write directly to the
1447                  * medium).  We don't implement DPO; we implement FUA by
1448                  * performing synchronous output.
1449                  */
1450                 if ((sc->sc_cbw->CBWCDB[1] & ~0x18) != 0) {
1451                         currlun->sense_data = SS_INVALID_FIELD_IN_CDB;
1452                         return (1);
1453                 }
1454                 if (sc->sc_cbw->CBWCDB[1] & 0x08) {
1455                         /* FUA */
1456                         /* XXX set SYNC flag here */
1457                 }
1458         }
1459
1460         len = sc->sc_transfer.data_rem >> 9;
1461         len += lba;
1462
1463         if ((len < lba) ||
1464             (len > currlun->num_sectors) ||
1465             (lba >= currlun->num_sectors)) {
1466                 currlun->sense_data = SS_LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE;
1467                 return (1);
1468         }
1469         file_offset = lba;
1470         file_offset <<= 9;
1471
1472         sc->sc_transfer.data_ptr = currlun->memory_image + file_offset;
1473
1474         return (0);
1475 }
1476
1477 /*------------------------------------------------------------------------*
1478  *      ustorage_fs_min_len
1479  *
1480  * Return values:
1481  *    0: Success
1482  * Else: Failure
1483  *------------------------------------------------------------------------*/
1484 static uint8_t
1485 ustorage_fs_min_len(struct ustorage_fs_softc *sc, uint32_t len, uint32_t mask)
1486 {
1487         if (len != sc->sc_transfer.data_rem) {
1488                 if (sc->sc_transfer.cbw_dir == DIR_READ) {
1489                         /*
1490                          * there must be something wrong about this SCSI
1491                          * command
1492                          */
1493                         sc->sc_csw->bCSWStatus = CSWSTATUS_PHASE;
1494                         return (1);
1495                 }
1496                 /* compute the minimum length */
1497
1498                 if (sc->sc_transfer.data_rem > len) {
1499                         /* data ends prematurely */
1500                         sc->sc_transfer.data_rem = len;
1501                         sc->sc_transfer.data_short = 1;
1502                 }
1503                 /* check length alignment */
1504
1505                 if (sc->sc_transfer.data_rem & ~mask) {
1506                         /* data ends prematurely */
1507                         sc->sc_transfer.data_rem &= mask;
1508                         sc->sc_transfer.data_short = 1;
1509                 }
1510         }
1511         return (0);
1512 }
1513
1514 /*------------------------------------------------------------------------*
1515  *      ustorage_fs_check_cmd - check command routine
1516  *
1517  * Check whether the command is properly formed and whether its data
1518  * size and direction agree with the values we already have.
1519  *
1520  * Return values:
1521  *    0: Success
1522  * Else: Failure
1523  *------------------------------------------------------------------------*/
1524 static uint8_t
1525 ustorage_fs_check_cmd(struct ustorage_fs_softc *sc, uint8_t min_cmd_size,
1526     uint16_t mask, uint8_t needs_medium)
1527 {
1528         struct ustorage_fs_lun *currlun;
1529         uint8_t lun = (sc->sc_cbw->CBWCDB[1] >> 5);
1530         uint8_t i;
1531
1532         /* Verify the length of the command itself */
1533         if (min_cmd_size > sc->sc_transfer.cmd_len) {
1534                 DPRINTF("%u > %u\n",
1535                     min_cmd_size, sc->sc_transfer.cmd_len);
1536                 sc->sc_csw->bCSWStatus = CSWSTATUS_PHASE;
1537                 return (1);
1538         }
1539         /* Mask away the LUN */
1540         sc->sc_cbw->CBWCDB[1] &= 0x1f;
1541
1542         /* Check if LUN is correct */
1543         if (lun != sc->sc_transfer.lun) {
1544         }
1545         /* Check the LUN */
1546         if (sc->sc_transfer.lun <= sc->sc_last_lun) {
1547                 sc->sc_transfer.currlun = currlun =
1548                     sc->sc_lun + sc->sc_transfer.lun;
1549                 if (sc->sc_cbw->CBWCDB[0] != SC_REQUEST_SENSE) {
1550                         currlun->sense_data = SS_NO_SENSE;
1551                         currlun->sense_data_info = 0;
1552                         currlun->info_valid = 0;
1553                 }
1554                 /*
1555                  * If a unit attention condition exists, only INQUIRY
1556                  * and REQUEST SENSE commands are allowed. Anything
1557                  * else must fail!
1558                  */
1559                 if ((currlun->unit_attention_data != SS_NO_SENSE) &&
1560                     (sc->sc_cbw->CBWCDB[0] != SC_INQUIRY) &&
1561                     (sc->sc_cbw->CBWCDB[0] != SC_REQUEST_SENSE)) {
1562                         currlun->sense_data = currlun->unit_attention_data;
1563                         currlun->unit_attention_data = SS_NO_SENSE;
1564                         return (1);
1565                 }
1566         } else {
1567                 sc->sc_transfer.currlun = currlun = NULL;
1568
1569                 /*
1570                  * INQUIRY and REQUEST SENSE commands are explicitly allowed
1571                  * to use unsupported LUNs; all others may not.
1572                  */
1573                 if ((sc->sc_cbw->CBWCDB[0] != SC_INQUIRY) &&
1574                     (sc->sc_cbw->CBWCDB[0] != SC_REQUEST_SENSE)) {
1575                         return (1);
1576                 }
1577         }
1578
1579         /*
1580          * Check that only command bytes listed in the mask are
1581          * non-zero.
1582          */
1583         for (i = 0; i != min_cmd_size; i++) {
1584                 if (sc->sc_cbw->CBWCDB[i] && !(mask & (1UL << i))) {
1585                         if (currlun) {
1586                                 currlun->sense_data = SS_INVALID_FIELD_IN_CDB;
1587                         }
1588                         return (1);
1589                 }
1590         }
1591
1592         /*
1593          * If the medium isn't mounted and the command needs to access
1594          * it, return an error.
1595          */
1596         if (currlun && (!currlun->memory_image) && needs_medium) {
1597                 currlun->sense_data = SS_MEDIUM_NOT_PRESENT;
1598                 return (1);
1599         }
1600         return (0);
1601 }
1602
1603 /*------------------------------------------------------------------------*
1604  *      ustorage_fs_do_cmd - do command
1605  *
1606  * Return values:
1607  *    0: Success
1608  * Else: Failure
1609  *------------------------------------------------------------------------*/
1610 static uint8_t
1611 ustorage_fs_do_cmd(struct ustorage_fs_softc *sc)
1612 {
1613         uint8_t error = 1;
1614         uint8_t i;
1615         uint32_t temp;
1616         const uint32_t mask9 = (0xFFFFFFFFUL >> 9) << 9;
1617
1618         /* set default data transfer pointer */
1619         sc->sc_transfer.data_ptr = sc->sc_qdata;
1620
1621         DPRINTF("cmd_data[0]=0x%02x, data_rem=0x%08x\n",
1622             sc->sc_cbw->CBWCDB[0], sc->sc_transfer.data_rem);
1623
1624         switch (sc->sc_cbw->CBWCDB[0]) {
1625         case SC_INQUIRY:
1626                 sc->sc_transfer.cmd_dir = DIR_WRITE;
1627                 error = ustorage_fs_min_len(sc, sc->sc_cbw->CBWCDB[4], -1U);
1628                 if (error) {
1629                         break;
1630                 }
1631                 error = ustorage_fs_check_cmd(sc, 6,
1632                     (1UL << 4) | 1, 0);
1633                 if (error) {
1634                         break;
1635                 }
1636                 error = ustorage_fs_inquiry(sc);
1637
1638                 break;
1639
1640         case SC_MODE_SELECT_6:
1641                 sc->sc_transfer.cmd_dir = DIR_READ;
1642                 error = ustorage_fs_min_len(sc, sc->sc_cbw->CBWCDB[4], -1U);
1643                 if (error) {
1644                         break;
1645                 }
1646                 error = ustorage_fs_check_cmd(sc, 6,
1647                     (1UL << 1) | (1UL << 4) | 1, 0);
1648                 if (error) {
1649                         break;
1650                 }
1651                 error = ustorage_fs_mode_select(sc);
1652
1653                 break;
1654
1655         case SC_MODE_SELECT_10:
1656                 sc->sc_transfer.cmd_dir = DIR_READ;
1657                 error = ustorage_fs_min_len(sc,
1658                     get_be16(&sc->sc_cbw->CBWCDB[7]), -1U);
1659                 if (error) {
1660                         break;
1661                 }
1662                 error = ustorage_fs_check_cmd(sc, 10,
1663                     (1UL << 1) | (3UL << 7) | 1, 0);
1664                 if (error) {
1665                         break;
1666                 }
1667                 error = ustorage_fs_mode_select(sc);
1668
1669                 break;
1670
1671         case SC_MODE_SENSE_6:
1672                 sc->sc_transfer.cmd_dir = DIR_WRITE;
1673                 error = ustorage_fs_min_len(sc, sc->sc_cbw->CBWCDB[4], -1U);
1674                 if (error) {
1675                         break;
1676                 }
1677                 error = ustorage_fs_check_cmd(sc, 6,
1678                     (1UL << 1) | (1UL << 2) | (1UL << 4) | 1, 0);
1679                 if (error) {
1680                         break;
1681                 }
1682                 error = ustorage_fs_mode_sense(sc);
1683
1684                 break;
1685
1686         case SC_MODE_SENSE_10:
1687                 sc->sc_transfer.cmd_dir = DIR_WRITE;
1688                 error = ustorage_fs_min_len(sc,
1689                     get_be16(&sc->sc_cbw->CBWCDB[7]), -1U);
1690                 if (error) {
1691                         break;
1692                 }
1693                 error = ustorage_fs_check_cmd(sc, 10,
1694                     (1UL << 1) | (1UL << 2) | (3UL << 7) | 1, 0);
1695                 if (error) {
1696                         break;
1697                 }
1698                 error = ustorage_fs_mode_sense(sc);
1699
1700                 break;
1701
1702         case SC_PREVENT_ALLOW_MEDIUM_REMOVAL:
1703                 error = ustorage_fs_min_len(sc, 0, -1U);
1704                 if (error) {
1705                         break;
1706                 }
1707                 error = ustorage_fs_check_cmd(sc, 6,
1708                     (1UL << 4) | 1, 0);
1709                 if (error) {
1710                         break;
1711                 }
1712                 error = ustorage_fs_prevent_allow(sc);
1713
1714                 break;
1715
1716         case SC_READ_6:
1717                 i = sc->sc_cbw->CBWCDB[4];
1718                 sc->sc_transfer.cmd_dir = DIR_WRITE;
1719                 temp = ((i == 0) ? 256UL : i);
1720                 error = ustorage_fs_min_len(sc, temp << 9, mask9);
1721                 if (error) {
1722                         break;
1723                 }
1724                 error = ustorage_fs_check_cmd(sc, 6,
1725                     (7UL << 1) | (1UL << 4) | 1, 1);
1726                 if (error) {
1727                         break;
1728                 }
1729                 error = ustorage_fs_read(sc);
1730
1731                 break;
1732
1733         case SC_READ_10:
1734                 sc->sc_transfer.cmd_dir = DIR_WRITE;
1735                 temp = get_be16(&sc->sc_cbw->CBWCDB[7]);
1736                 error = ustorage_fs_min_len(sc, temp << 9, mask9);
1737                 if (error) {
1738                         break;
1739                 }
1740                 error = ustorage_fs_check_cmd(sc, 10,
1741                     (1UL << 1) | (0xfUL << 2) | (3UL << 7) | 1, 1);
1742                 if (error) {
1743                         break;
1744                 }
1745                 error = ustorage_fs_read(sc);
1746
1747                 break;
1748
1749         case SC_READ_12:
1750                 sc->sc_transfer.cmd_dir = DIR_WRITE;
1751                 temp = get_be32(&sc->sc_cbw->CBWCDB[6]);
1752                 if (temp >= (1UL << (32 - 9))) {
1753                         /* numerical overflow */
1754                         sc->sc_csw->bCSWStatus = CSWSTATUS_FAILED;
1755                         error = 1;
1756                         break;
1757                 }
1758                 error = ustorage_fs_min_len(sc, temp << 9, mask9);
1759                 if (error) {
1760                         break;
1761                 }
1762                 error = ustorage_fs_check_cmd(sc, 12,
1763                     (1UL << 1) | (0xfUL << 2) | (0xfUL << 6) | 1, 1);
1764                 if (error) {
1765                         break;
1766                 }
1767                 error = ustorage_fs_read(sc);
1768
1769                 break;
1770
1771         case SC_READ_CAPACITY:
1772                 sc->sc_transfer.cmd_dir = DIR_WRITE;
1773                 error = ustorage_fs_check_cmd(sc, 10,
1774                     (0xfUL << 2) | (1UL << 8) | 1, 1);
1775                 if (error) {
1776                         break;
1777                 }
1778                 error = ustorage_fs_read_capacity(sc);
1779
1780                 break;
1781
1782         case SC_READ_FORMAT_CAPACITIES:
1783                 sc->sc_transfer.cmd_dir = DIR_WRITE;
1784                 error = ustorage_fs_min_len(sc,
1785                     get_be16(&sc->sc_cbw->CBWCDB[7]), -1U);
1786                 if (error) {
1787                         break;
1788                 }
1789                 error = ustorage_fs_check_cmd(sc, 10,
1790                     (3UL << 7) | 1, 1);
1791                 if (error) {
1792                         break;
1793                 }
1794                 error = ustorage_fs_read_format_capacities(sc);
1795
1796                 break;
1797
1798         case SC_REQUEST_SENSE:
1799                 sc->sc_transfer.cmd_dir = DIR_WRITE;
1800                 error = ustorage_fs_min_len(sc, sc->sc_cbw->CBWCDB[4], -1U);
1801                 if (error) {
1802                         break;
1803                 }
1804                 error = ustorage_fs_check_cmd(sc, 6,
1805                     (1UL << 4) | 1, 0);
1806                 if (error) {
1807                         break;
1808                 }
1809                 error = ustorage_fs_request_sense(sc);
1810
1811                 break;
1812
1813         case SC_START_STOP_UNIT:
1814                 error = ustorage_fs_min_len(sc, 0, -1U);
1815                 if (error) {
1816                         break;
1817                 }
1818                 error = ustorage_fs_check_cmd(sc, 6,
1819                     (1UL << 1) | (1UL << 4) | 1, 0);
1820                 if (error) {
1821                         break;
1822                 }
1823                 error = ustorage_fs_start_stop(sc);
1824
1825                 break;
1826
1827         case SC_SYNCHRONIZE_CACHE:
1828                 error = ustorage_fs_min_len(sc, 0, -1U);
1829                 if (error) {
1830                         break;
1831                 }
1832                 error = ustorage_fs_check_cmd(sc, 10,
1833                     (0xfUL << 2) | (3UL << 7) | 1, 1);
1834                 if (error) {
1835                         break;
1836                 }
1837                 error = ustorage_fs_synchronize_cache(sc);
1838
1839                 break;
1840
1841         case SC_TEST_UNIT_READY:
1842                 error = ustorage_fs_min_len(sc, 0, -1U);
1843                 if (error) {
1844                         break;
1845                 }
1846                 error = ustorage_fs_check_cmd(sc, 6,
1847                     0 | 1, 1);
1848                 break;
1849
1850                 /*
1851                  * Although optional, this command is used by MS-Windows.
1852                  * We support a minimal version: BytChk must be 0.
1853                  */
1854         case SC_VERIFY:
1855                 error = ustorage_fs_min_len(sc, 0, -1U);
1856                 if (error) {
1857                         break;
1858                 }
1859                 error = ustorage_fs_check_cmd(sc, 10,
1860                     (1UL << 1) | (0xfUL << 2) | (3UL << 7) | 1, 1);
1861                 if (error) {
1862                         break;
1863                 }
1864                 error = ustorage_fs_verify(sc);
1865
1866                 break;
1867
1868         case SC_WRITE_6:
1869                 i = sc->sc_cbw->CBWCDB[4];
1870                 sc->sc_transfer.cmd_dir = DIR_READ;
1871                 temp = ((i == 0) ? 256UL : i);
1872                 error = ustorage_fs_min_len(sc, temp << 9, mask9);
1873                 if (error) {
1874                         break;
1875                 }
1876                 error = ustorage_fs_check_cmd(sc, 6,
1877                     (7UL << 1) | (1UL << 4) | 1, 1);
1878                 if (error) {
1879                         break;
1880                 }
1881                 error = ustorage_fs_write(sc);
1882
1883                 break;
1884
1885         case SC_WRITE_10:
1886                 sc->sc_transfer.cmd_dir = DIR_READ;
1887                 temp = get_be16(&sc->sc_cbw->CBWCDB[7]);
1888                 error = ustorage_fs_min_len(sc, temp << 9, mask9);
1889                 if (error) {
1890                         break;
1891                 }
1892                 error = ustorage_fs_check_cmd(sc, 10,
1893                     (1UL << 1) | (0xfUL << 2) | (3UL << 7) | 1, 1);
1894                 if (error) {
1895                         break;
1896                 }
1897                 error = ustorage_fs_write(sc);
1898
1899                 break;
1900
1901         case SC_WRITE_12:
1902                 sc->sc_transfer.cmd_dir = DIR_READ;
1903                 temp = get_be32(&sc->sc_cbw->CBWCDB[6]);
1904                 if (temp > (mask9 >> 9)) {
1905                         /* numerical overflow */
1906                         sc->sc_csw->bCSWStatus = CSWSTATUS_FAILED;
1907                         error = 1;
1908                         break;
1909                 }
1910                 error = ustorage_fs_min_len(sc, temp << 9, mask9);
1911                 if (error) {
1912                         break;
1913                 }
1914                 error = ustorage_fs_check_cmd(sc, 12,
1915                     (1UL << 1) | (0xfUL << 2) | (0xfUL << 6) | 1, 1);
1916                 if (error) {
1917                         break;
1918                 }
1919                 error = ustorage_fs_write(sc);
1920
1921                 break;
1922
1923                 /*
1924                  * Some mandatory commands that we recognize but don't
1925                  * implement.  They don't mean much in this setting.
1926                  * It's left as an exercise for anyone interested to
1927                  * implement RESERVE and RELEASE in terms of Posix
1928                  * locks.
1929                  */
1930         case SC_FORMAT_UNIT:
1931         case SC_RELEASE:
1932         case SC_RESERVE:
1933         case SC_SEND_DIAGNOSTIC:
1934                 /* Fallthrough */
1935
1936         default:
1937                 error = ustorage_fs_min_len(sc, 0, -1U);
1938                 if (error) {
1939                         break;
1940                 }
1941                 error = ustorage_fs_check_cmd(sc, sc->sc_transfer.cmd_len,
1942                     0xff, 0);
1943                 if (error) {
1944                         break;
1945                 }
1946                 sc->sc_transfer.currlun->sense_data =
1947                     SS_INVALID_COMMAND;
1948                 error = 1;
1949
1950                 break;
1951         }
1952         return (error);
1953 }