Annotation of sys/dev/usb/umassvar.h, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: umassvar.h,v 1.12 2007/06/13 06:25:03 mbalmer Exp $ */
2: /* $NetBSD: umassvar.h,v 1.20 2003/09/08 19:31:01 mycroft Exp $ */
3: /*-
4: * Copyright (c) 1999 MAEKAWA Masahide <bishop@rr.iij4u.or.jp>,
5: * Nick Hibma <n_hibma@freebsd.org>
6: * All rights reserved.
7: *
8: * Redistribution and use in source and binary forms, with or without
9: * modification, are permitted provided that the following conditions
10: * are met:
11: * 1. Redistributions of source code must retain the above copyright
12: * notice, this list of conditions and the following disclaimer.
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: *
17: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20: * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
21: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27: * SUCH DAMAGE.
28: *
29: * $FreeBSD: src/sys/dev/usb/umass.c,v 1.13 2000/03/26 01:39:12 n_hibma Exp $
30: */
31:
32: #ifdef UMASS_DEBUG
33: #define DIF(m, x) if (umassdebug & (m)) do { x ; } while (0)
34: #define DPRINTF(m, x) do { if (umassdebug & (m)) printf x; } while (0)
35: #define UDMASS_UPPER 0x00008000 /* upper layer */
36: #define UDMASS_GEN 0x00010000 /* general */
37: #define UDMASS_SCSI 0x00020000 /* scsi */
38: #define UDMASS_UFI 0x00040000 /* ufi command set */
39: #define UDMASS_8070 0x00080000 /* 8070i command set */
40: #define UDMASS_USB 0x00100000 /* USB general */
41: #define UDMASS_BBB 0x00200000 /* Bulk-Only transfers */
42: #define UDMASS_CBI 0x00400000 /* CBI transfers */
43: #define UDMASS_ALL 0xffff0000 /* all of the above */
44:
45: #define UDMASS_XFER 0x40000000 /* all transfers */
46: #define UDMASS_CMD 0x80000000
47:
48: extern int umassdebug;
49: #else
50: #define DIF(m, x) /* nop */
51: #define DPRINTF(m, x) /* nop */
52: #endif
53:
54: /* Generic definitions */
55:
56: #define UFI_COMMAND_LENGTH 12
57:
58: /* Direction for umass_*_transfer */
59: #define DIR_NONE 0
60: #define DIR_IN 1
61: #define DIR_OUT 2
62:
63: /* Endpoints for umass */
64: #define UMASS_BULKIN 0
65: #define UMASS_BULKOUT 1
66: #define UMASS_INTRIN 2
67: #define UMASS_NEP 3
68:
69: /* Bulk-Only features */
70:
71: #define UR_BBB_RESET 0xff /* Bulk-Only reset */
72: #define UR_BBB_GET_MAX_LUN 0xfe
73:
74: /* Command Block Wrapper */
75: typedef struct {
76: uDWord dCBWSignature;
77: #define CBWSIGNATURE 0x43425355
78: uDWord dCBWTag;
79: uDWord dCBWDataTransferLength;
80: uByte bCBWFlags;
81: #define CBWFLAGS_OUT 0x00
82: #define CBWFLAGS_IN 0x80
83: uByte bCBWLUN;
84: uByte bCDBLength;
85: #define CBWCDBLENGTH 16
86: uByte CBWCDB[CBWCDBLENGTH];
87: } umass_bbb_cbw_t;
88: #define UMASS_BBB_CBW_SIZE 31
89:
90: /* Command Status Wrapper */
91: typedef struct {
92: uDWord dCSWSignature;
93: #define CSWSIGNATURE 0x53425355
94: #define CSWSIGNATURE_OLYMPUS_C1 0x55425355
95: uDWord dCSWTag;
96: uDWord dCSWDataResidue;
97: uByte bCSWStatus;
98: #define CSWSTATUS_GOOD 0x0
99: #define CSWSTATUS_FAILED 0x1
100: #define CSWSTATUS_PHASE 0x2
101: } umass_bbb_csw_t;
102: #define UMASS_BBB_CSW_SIZE 13
103:
104: /* CBI features */
105:
106: #define UR_CBI_ADSC 0x00
107:
108: typedef unsigned char umass_cbi_cbl_t[16]; /* Command block */
109:
110: typedef union {
111: struct {
112: uByte type;
113: #define IDB_TYPE_CCI 0x00
114: uByte value;
115: #define IDB_VALUE_PASS 0x00
116: #define IDB_VALUE_FAIL 0x01
117: #define IDB_VALUE_PHASE 0x02
118: #define IDB_VALUE_PERSISTENT 0x03
119: #define IDB_VALUE_STATUS_MASK 0x03
120: } common;
121:
122: struct {
123: uByte asc;
124: uByte ascq;
125: } ufi;
126: } umass_cbi_sbl_t;
127:
128: struct umass_softc; /* see below */
129:
130: typedef void (*umass_callback)(struct umass_softc *, void *, int, int);
131: #define STATUS_CMD_OK 0 /* everything ok */
132: #define STATUS_CMD_UNKNOWN 1 /* will have to fetch sense */
133: #define STATUS_CMD_FAILED 2 /* transfer was ok, command failed */
134: #define STATUS_WIRE_FAILED 3 /* couldn't even get command across */
135:
136: typedef void (*umass_wire_xfer)(struct umass_softc *, int, void *, int, void *,
137: int, int, u_int, umass_callback, void *);
138: typedef void (*umass_wire_reset)(struct umass_softc *, int);
139: typedef void (*umass_wire_state)(usbd_xfer_handle, usbd_private_handle,
140: usbd_status);
141:
142: struct umass_wire_methods {
143: umass_wire_xfer wire_xfer;
144: umass_wire_reset wire_reset;
145: umass_wire_state wire_state;
146: };
147:
148: struct umassbus_softc {
149: struct device *sc_child; /* child device, for detach */
150: };
151:
152: /* the per device structure */
153: struct umass_softc {
154: struct device sc_dev; /* base device */
155: usbd_device_handle sc_udev; /* device */
156: usbd_interface_handle sc_iface; /* interface */
157: int sc_ifaceno; /* interface number */
158:
159: u_int8_t sc_epaddr[UMASS_NEP];
160: usbd_pipe_handle sc_pipe[UMASS_NEP];
161: usb_device_request_t sc_req;
162:
163: const struct umass_wire_methods *sc_methods;
164:
165: u_int8_t sc_wire; /* wire protocol */
166: #define UMASS_WPROTO_UNSPEC 0
167: #define UMASS_WPROTO_BBB 1
168: #define UMASS_WPROTO_CBI 2
169: #define UMASS_WPROTO_CBI_I 3
170:
171: u_int8_t sc_cmd; /* command protocol */
172: #define UMASS_CPROTO_UNSPEC 0
173: #define UMASS_CPROTO_SCSI 1
174: #define UMASS_CPROTO_ATAPI 2
175: #define UMASS_CPROTO_UFI 3
176: #define UMASS_CPROTO_RBC 4
177: #define UMASS_CPROTO_ISD_ATA 5
178:
179: u_int32_t sc_quirks;
180: #define UMASS_QUIRK_WRONG_CSWSIG 0x00000001
181: #define UMASS_QUIRK_WRONG_CSWTAG 0x00000002
182:
183: u_int32_t sc_busquirks;
184:
185: /* Bulk specific variables for transfers in progress */
186: umass_bbb_cbw_t cbw; /* command block wrapper */
187: umass_bbb_csw_t csw; /* command status wrapper*/
188: /* CBI specific variables for transfers in progress */
189: umass_cbi_cbl_t cbl; /* command block */
190: umass_cbi_sbl_t sbl; /* status block */
191:
192: /* xfer handles
193: * Most of our operations are initiated from interrupt context, so
194: * we need to avoid using the one that is in use. We want to avoid
195: * allocating them in the interrupt context as well.
196: */
197: /* indices into array below */
198: #define XFER_BBB_CBW 0 /* Bulk-Only */
199: #define XFER_BBB_DATA 1
200: #define XFER_BBB_DCLEAR 2
201: #define XFER_BBB_CSW1 3
202: #define XFER_BBB_CSW2 4
203: #define XFER_BBB_SCLEAR 5
204: #define XFER_BBB_RESET1 6
205: #define XFER_BBB_RESET2 7
206: #define XFER_BBB_RESET3 8
207:
208: #define XFER_CBI_CB 0 /* CBI */
209: #define XFER_CBI_DATA 1
210: #define XFER_CBI_STATUS 2
211: #define XFER_CBI_DCLEAR 3
212: #define XFER_CBI_SCLEAR 4
213: #define XFER_CBI_RESET1 5
214: #define XFER_CBI_RESET2 6
215: #define XFER_CBI_RESET3 7
216:
217: #define XFER_NR 9 /* maximum number */
218:
219: usbd_xfer_handle transfer_xfer[XFER_NR]; /* for ctrl xfers */
220:
221: void *data_buffer;
222:
223: int transfer_dir; /* data direction */
224: void *transfer_data; /* data buffer */
225: int transfer_datalen; /* (maximum) length */
226: int transfer_actlen; /* actual length */
227: umass_callback transfer_cb; /* callback */
228: void *transfer_priv; /* for callback */
229: int transfer_status;
230:
231: int transfer_state;
232: #define TSTATE_IDLE 0
233: #define TSTATE_BBB_COMMAND 1 /* CBW transfer */
234: #define TSTATE_BBB_DATA 2 /* Data transfer */
235: #define TSTATE_BBB_DCLEAR 3 /* clear endpt stall */
236: #define TSTATE_BBB_STATUS1 4 /* clear endpt stall */
237: #define TSTATE_BBB_SCLEAR 5 /* clear endpt stall */
238: #define TSTATE_BBB_STATUS2 6 /* CSW transfer */
239: #define TSTATE_BBB_RESET1 7 /* reset command */
240: #define TSTATE_BBB_RESET2 8 /* in clear stall */
241: #define TSTATE_BBB_RESET3 9 /* out clear stall */
242: #define TSTATE_CBI_COMMAND 10 /* command transfer */
243: #define TSTATE_CBI_DATA 11 /* data transfer */
244: #define TSTATE_CBI_STATUS 12 /* status transfer */
245: #define TSTATE_CBI_DCLEAR 13 /* clear ep stall */
246: #define TSTATE_CBI_SCLEAR 14 /* clear ep stall */
247: #define TSTATE_CBI_RESET1 15 /* reset command */
248: #define TSTATE_CBI_RESET2 16 /* in clear stall */
249: #define TSTATE_CBI_RESET3 17 /* out clear stall */
250: #define TSTATE_STATES 18 /* # of states above */
251:
252:
253: int timeout; /* in msecs */
254:
255: u_int8_t maxlun; /* max lun supported */
256:
257: #ifdef UMASS_DEBUG
258: struct timeval tv;
259: #endif
260:
261: int sc_xfer_flags;
262: char sc_dying;
263: int sc_refcnt;
264: int sc_sense;
265:
266: struct umassbus_softc *bus; /* bus dependent data */
267:
268: /* For polled transfers */
269: int polling_depth;
270: usbd_status polled_xfer_status;
271: usbd_xfer_handle next_polled_xfer;
272: };
273:
274: #define UMASS_MAX_TRANSFER_SIZE MAXBSIZE
CVSweb