[BACK]Return to umassvar.h CVS log [TXT][DIR] Up to [local] / sys / dev / usb

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