xref: /freebsd/sys/dev/usb/storage/ustorage_fs.c (revision 7cc42f6d)
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 }
1954