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