1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21/*
22 * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
23 * Use is subject to license terms.
24 */
25
26#ifndef _SYS_USB_BULKONLY_H
27#define	_SYS_USB_BULKONLY_H
28
29
30#ifdef	__cplusplus
31extern "C" {
32#endif
33
34/*
35 * usb_bulkonly.h: This header file provides the data structures
36 * and variable definitions for the mass storage bulk only protocol.
37 * (See Universal Serial Bus Mass Storage Class Bulk-Only Transport rev 1.0)
38 */
39
40/* Reset value to be passed */
41#define	BULK_ONLY_RESET			0xFF
42/* Bulk Class specific req  */
43/* Bulk Class specific GET_Max_LUN bmRequest value */
44#define	BULK_ONLY_GET_MAXLUN_BMREQ \
45	(USB_DEV_REQ_DEV_TO_HOST | USB_DEV_REQ_TYPE_CLASS | \
46		USB_DEV_REQ_RCPT_IF)
47/* Bulk Class specific GET_Max_LUN bRequest value */
48#define	BULK_ONLY_GET_MAXLUN_REQ	0xFE
49
50/*
51 * Command Block Wrapper:
52 *	The CBW is used to transfer commands to the device.
53 */
54#define	CBW_SIGNATURE	0x43425355	/* "USBC" */
55#define	CBW_DIR_IN	0x80		/* CBW from device to the host */
56#define	CBW_DIR_OUT	0x00		/* CBW from host to the device */
57#define	CBW_CDB_LEN	16		/* CDB Len to 10 byte cmds */
58
59#define	USB_BULK_CBWCMD_LEN	0x1F
60
61#define	CBW_MSB(x)	((x) & 0xFF)		/* Swap msb */
62#define	CBW_MID1(x)	((x) >> 8 & 0xFF)
63#define	CBW_MID2(x)	((x) >> 16 & 0xFF)
64#define	CBW_LSB(x)	((x) >> 24 & 0xFF)
65
66/*
67 * Command Status Wrapper:
68 *	The device shall not execute any subsequent command until the
69 *	associated CSW from the previous command has been successfully
70 *	transported.
71 *
72 *	All CSW transfers shall be ordered withe LSB first.
73 */
74typedef	struct usb_bulk_csw {
75	uchar_t	csw_dCSWSignature0;	/* Signature */
76	uchar_t	csw_dCSWSignature1;
77	uchar_t	csw_dCSWSignature2;
78	uchar_t	csw_dCSWSignature3;
79	uchar_t	csw_dCSWTag3;		/* random tag */
80	uchar_t	csw_dCSWTag2;
81	uchar_t	csw_dCSWTag1;
82	uchar_t	csw_dCSWTag0;
83	uchar_t	csw_dCSWDataResidue0;	/* data not transferred */
84	uchar_t	csw_dCSWDataResidue1;
85	uchar_t	csw_dCSWDataResidue2;
86	uchar_t	csw_dCSWDataResidue3;
87	uchar_t	csw_bCSWStatus;		/* command status */
88} usb_bulk_csw_t;
89
90#define	CSW_SIGNATURE	0x53425355	/* "SBSU" */
91
92#define	CSW_STATUS_GOOD		0x0	/* Good status */
93#define	CSW_STATUS_FAILED	0x1	/* Command failed */
94#define	CSW_STATUS_PHASE_ERROR	0x2	/* Phase error */
95#define	CSW_LEN			0xD	/* CSW Command Len */
96
97/* Vendor specific command needed for specific Bulk Only devices */
98#define	IOMEGA_CMD_CARTRIDGE_PROTECT	0x0C
99
100#ifdef __cplusplus
101}
102#endif
103
104#endif	/* _SYS_USB_BULKONLY_H */
105