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