Annotation of sys/dev/usb/umassvar.h, Revision 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