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