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

Annotation of sys/dev/usb/usbdivar.h, Revision 1.1

1.1     ! nbrk        1: /*     $OpenBSD: usbdivar.h,v 1.32 2007/06/15 11:41:48 mbalmer Exp $ */
        !             2: /*     $NetBSD: usbdivar.h,v 1.70 2002/07/11 21:14:36 augustss Exp $   */
        !             3: /*     $FreeBSD: src/sys/dev/usb/usbdivar.h,v 1.11 1999/11/17 22:33:51 n_hibma Exp $   */
        !             4:
        !             5: /*
        !             6:  * Copyright (c) 1998 The NetBSD Foundation, Inc.
        !             7:  * All rights reserved.
        !             8:  *
        !             9:  * This code is derived from software contributed to The NetBSD Foundation
        !            10:  * by Lennart Augustsson (lennart@augustsson.net) at
        !            11:  * Carlstedt Research & Technology.
        !            12:  *
        !            13:  * Redistribution and use in source and binary forms, with or without
        !            14:  * modification, are permitted provided that the following conditions
        !            15:  * are met:
        !            16:  * 1. Redistributions of source code must retain the above copyright
        !            17:  *    notice, this list of conditions and the following disclaimer.
        !            18:  * 2. Redistributions in binary form must reproduce the above copyright
        !            19:  *    notice, this list of conditions and the following disclaimer in the
        !            20:  *    documentation and/or other materials provided with the distribution.
        !            21:  * 3. All advertising materials mentioning features or use of this software
        !            22:  *    must display the following acknowledgement:
        !            23:  *        This product includes software developed by the NetBSD
        !            24:  *        Foundation, Inc. and its contributors.
        !            25:  * 4. Neither the name of The NetBSD Foundation nor the names of its
        !            26:  *    contributors may be used to endorse or promote products derived
        !            27:  *    from this software without specific prior written permission.
        !            28:  *
        !            29:  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
        !            30:  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
        !            31:  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
        !            32:  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
        !            33:  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
        !            34:  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
        !            35:  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
        !            36:  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
        !            37:  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
        !            38:  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
        !            39:  * POSSIBILITY OF SUCH DAMAGE.
        !            40:  */
        !            41:
        !            42: /* From usb_mem.h */
        !            43: struct usb_dma_block;
        !            44: typedef struct {
        !            45:        struct usb_dma_block    *block;
        !            46:        u_int                    offs;
        !            47: } usb_dma_t;
        !            48:
        !            49: struct usbd_xfer;
        !            50: struct usbd_pipe;
        !            51:
        !            52: struct usbd_endpoint {
        !            53:        usb_endpoint_descriptor_t *edesc;
        !            54:        int                     refcnt;
        !            55:        int                     savedtoggle;
        !            56: };
        !            57:
        !            58: struct usbd_bus_methods {
        !            59:        usbd_status           (*open_pipe)(struct usbd_pipe *pipe);
        !            60:        void                  (*soft_intr)(void *);
        !            61:        void                  (*do_poll)(struct usbd_bus *);
        !            62:        usbd_status           (*allocm)(struct usbd_bus *, usb_dma_t *,
        !            63:                                        u_int32_t bufsize);
        !            64:        void                  (*freem)(struct usbd_bus *, usb_dma_t *);
        !            65:        struct usbd_xfer *    (*allocx)(struct usbd_bus *);
        !            66:        void                  (*freex)(struct usbd_bus *, struct usbd_xfer *);
        !            67: };
        !            68:
        !            69: struct usbd_pipe_methods {
        !            70:        usbd_status           (*transfer)(usbd_xfer_handle xfer);
        !            71:        usbd_status           (*start)(usbd_xfer_handle xfer);
        !            72:        void                  (*abort)(usbd_xfer_handle xfer);
        !            73:        void                  (*close)(usbd_pipe_handle pipe);
        !            74:        void                  (*cleartoggle)(usbd_pipe_handle pipe);
        !            75:        void                  (*done)(usbd_xfer_handle xfer);
        !            76: };
        !            77:
        !            78: struct usbd_tt {
        !            79:        struct usbd_hub        *hub;
        !            80: };
        !            81:
        !            82: struct usbd_port {
        !            83:        usb_port_status_t       status;
        !            84:        u_int16_t               power;  /* mA of current on port */
        !            85:        u_int8_t                portno;
        !            86:        u_int8_t                restartcnt;
        !            87: #define USBD_RESTART_MAX 5
        !            88:        u_int8_t                reattach;
        !            89:        struct usbd_device     *device; /* Connected device */
        !            90:        struct usbd_device     *parent; /* The ports hub */
        !            91:        struct usbd_tt         *tt; /* Transaction translator (if any) */
        !            92: };
        !            93:
        !            94: struct usbd_hub {
        !            95:        usbd_status           (*explore)(usbd_device_handle hub);
        !            96:        void                   *hubsoftc;
        !            97:        usb_hub_descriptor_t    hubdesc;
        !            98:        struct usbd_port        ports[1];
        !            99: };
        !           100:
        !           101: struct usb_softc;
        !           102:
        !           103: /*****/
        !           104:
        !           105: struct usbd_bus {
        !           106:        /* Filled by HC driver */
        !           107:        struct device           bdev; /* base device, host adapter */
        !           108:        struct usbd_bus_methods *methods;
        !           109:        u_int32_t               pipe_size; /* size of a pipe struct */
        !           110:        /* Filled by usb driver */
        !           111:        struct usbd_device     *root_hub;
        !           112:        usbd_device_handle      devices[USB_MAX_DEVICES];
        !           113:        char                    needs_explore;/* a hub a signalled a change */
        !           114:        char                    use_polling;
        !           115:        struct usb_softc       *usbctl;
        !           116:        struct usb_device_stats stats;
        !           117:        int                     intr_context;
        !           118:        u_int                   no_intrs;
        !           119:        int                     usbrev; /* USB revision */
        !           120: #define USBREV_UNKNOWN 0
        !           121: #define USBREV_PRE_1_0 1
        !           122: #define USBREV_1_0     2
        !           123: #define USBREV_1_1     3
        !           124: #define USBREV_2_0     4
        !           125: #define USBREV_STR { "unknown", "pre 1.0", "1.0", "1.1", "2.0" }
        !           126:
        !           127: #ifdef __HAVE_GENERIC_SOFT_INTERRUPTS
        !           128:        void                   *soft; /* soft interrupt cookie */
        !           129: #endif
        !           130:        bus_dma_tag_t           dmatag; /* DMA tag */
        !           131: };
        !           132:
        !           133: struct usbd_device {
        !           134:        struct usbd_bus        *bus;           /* our controller */
        !           135:        struct usbd_pipe       *default_pipe;  /* pipe 0 */
        !           136:        u_int8_t                address;       /* device address */
        !           137:        u_int8_t                config;        /* current configuration # */
        !           138:        u_int8_t                depth;         /* distance from root hub */
        !           139:        u_int8_t                speed;         /* low/full/high speed */
        !           140:        u_int8_t                self_powered;  /* flag for self powered */
        !           141:        u_int16_t               power;         /* mA the device uses */
        !           142:        int16_t                 langid;        /* language for strings */
        !           143: #define USBD_NOLANG (-1)
        !           144:        usb_event_cookie_t      cookie;        /* unique connection id */
        !           145:        struct usbd_port       *powersrc;      /* upstream hub port, or 0 */
        !           146:        struct usbd_device     *myhub;         /* upstream hub */
        !           147:        struct usbd_port       *myhsport;      /* closest high speed port */
        !           148:        struct usbd_endpoint    def_ep;        /* for pipe 0 */
        !           149:        usb_endpoint_descriptor_t def_ep_desc; /* for pipe 0 */
        !           150:        struct usbd_interface  *ifaces;        /* array of all interfaces */
        !           151:        usb_device_descriptor_t ddesc;         /* device descriptor */
        !           152:        usb_config_descriptor_t *cdesc;        /* full config descr */
        !           153:        const struct usbd_quirks     *quirks;  /* device quirks, always set */
        !           154:        struct usbd_hub        *hub;           /* only if this is a hub */
        !           155:        struct device         **subdevs;       /* sub-devices, 0 terminated */
        !           156: };
        !           157:
        !           158: struct usbd_interface {
        !           159:        struct usbd_device     *device;
        !           160:        usb_interface_descriptor_t *idesc;
        !           161:        int                     index;
        !           162:        int                     altindex;
        !           163:        struct usbd_endpoint   *endpoints;
        !           164:        void                   *priv;
        !           165:        LIST_HEAD(, usbd_pipe)  pipes;
        !           166: };
        !           167:
        !           168: struct usbd_pipe {
        !           169:        struct usbd_interface  *iface;
        !           170:        struct usbd_device     *device;
        !           171:        struct usbd_endpoint   *endpoint;
        !           172:        int                     refcnt;
        !           173:        char                    running;
        !           174:        char                    aborting;
        !           175:        SIMPLEQ_HEAD(, usbd_xfer) queue;
        !           176:        LIST_ENTRY(usbd_pipe)   next;
        !           177:
        !           178:        usbd_xfer_handle        intrxfer; /* used for repeating requests */
        !           179:        char                    repeat;
        !           180:        int                     interval;
        !           181:
        !           182:        /* Filled by HC driver. */
        !           183:        struct usbd_pipe_methods *methods;
        !           184: };
        !           185:
        !           186: struct usbd_xfer {
        !           187:        struct usbd_pipe       *pipe;
        !           188:        void                   *priv;
        !           189:        void                   *buffer;
        !           190:        u_int32_t               length;
        !           191:        u_int32_t               actlen;
        !           192:        u_int16_t               flags;
        !           193:        u_int32_t               timeout;
        !           194:        usbd_status             status;
        !           195:        usbd_callback           callback;
        !           196:        __volatile char         done;
        !           197: #ifdef DIAGNOSTIC
        !           198:        u_int32_t               busy_free;
        !           199: #define XFER_FREE 0x46524545
        !           200: #define XFER_BUSY 0x42555359
        !           201: #define XFER_ONQU 0x4f4e5155
        !           202: #endif
        !           203:
        !           204:        /* For control pipe */
        !           205:        usb_device_request_t    request;
        !           206:
        !           207:        /* For isoc */
        !           208:        u_int16_t               *frlengths;
        !           209:        int                     nframes;
        !           210:
        !           211:        /* For memory allocation */
        !           212:        struct usbd_device     *device;
        !           213:        usb_dma_t               dmabuf;
        !           214:
        !           215:        int                     rqflags;
        !           216: #define URQ_REQUEST    0x01
        !           217: #define URQ_AUTO_DMABUF        0x10
        !           218: #define URQ_DEV_DMABUF 0x20
        !           219:
        !           220:        SIMPLEQ_ENTRY(usbd_xfer) next;
        !           221:
        !           222:        void                   *hcpriv; /* private use by the HC driver */
        !           223:
        !           224:        struct timeout          timeout_handle;
        !           225: };
        !           226:
        !           227: void usbd_init(void);
        !           228: void usbd_finish(void);
        !           229:
        !           230: #ifdef USB_DEBUG
        !           231: void usbd_dump_iface(struct usbd_interface *iface);
        !           232: void usbd_dump_device(struct usbd_device *dev);
        !           233: void usbd_dump_endpoint(struct usbd_endpoint *endp);
        !           234: void usbd_dump_queue(usbd_pipe_handle pipe);
        !           235: void usbd_dump_pipe(usbd_pipe_handle pipe);
        !           236: #endif
        !           237:
        !           238: /* Routines from usb_subr.c */
        !           239: int            usbctlprint(void *, const char *);
        !           240: void           usb_delay_ms(usbd_bus_handle, u_int);
        !           241: usbd_status    usbd_reset_port(usbd_device_handle dev,
        !           242:                    int port, usb_port_status_t *ps);
        !           243: usbd_status    usbd_setup_pipe(usbd_device_handle dev,
        !           244:                    usbd_interface_handle iface, struct usbd_endpoint *, int,
        !           245:                    usbd_pipe_handle *pipe);
        !           246: usbd_status    usbd_new_device(struct device *parent, usbd_bus_handle bus,
        !           247:                    int depth, int lowspeed, int port, struct usbd_port *);
        !           248: void           usbd_remove_device(usbd_device_handle, struct usbd_port *);
        !           249: int            usbd_printBCD(char *cp, size_t len, int bcd);
        !           250: usbd_status    usbd_fill_iface_data(usbd_device_handle dev, int i, int a);
        !           251: void           usb_free_device(usbd_device_handle);
        !           252:
        !           253: usbd_status    usb_insert_transfer(usbd_xfer_handle xfer);
        !           254: void           usb_transfer_complete(usbd_xfer_handle xfer);
        !           255: void           usb_disconnect_port(struct usbd_port *up, struct device *);
        !           256:
        !           257: /* Routines from usb.c */
        !           258: void           usb_needs_explore(usbd_device_handle);
        !           259: void           usb_needs_reattach(usbd_device_handle);
        !           260: void           usb_schedsoftintr(struct usbd_bus *);
        !           261:
        !           262: /*
        !           263:  * XXX This check is extremely bogus. Bad Bad Bad.
        !           264:  */
        !           265: #if defined(DIAGNOSTIC) && 0
        !           266: #define SPLUSBCHECK \
        !           267:        do { int _s = splusb(), _su = splusb(); \
        !           268:              if (!cold && _s != _su) printf("SPLUSBCHECK failed 0x%x!=0x%x, %s:%d\n", \
        !           269:                                   _s, _su, __FILE__, __LINE__); \
        !           270:             splx(_s); \
        !           271:         } while (0)
        !           272: #else
        !           273: #define SPLUSBCHECK
        !           274: #endif
        !           275:
        !           276: /* Locator stuff. */
        !           277:
        !           278: /* XXX these values are used to statically bind some elements in the USB tree
        !           279:  * to specific driver instances. This should be somehow emulated in FreeBSD
        !           280:  * but can be done later on.
        !           281:  * The values are copied from the files.usb file in the NetBSD sources.
        !           282:  */
        !           283: #define UHUBCF_PORT_DEFAULT -1
        !           284: #define UHUBCF_CONFIGURATION_DEFAULT -1
        !           285: #define UHUBCF_INTERFACE_DEFAULT -1
        !           286: #define UHUBCF_VENDOR_DEFAULT -1
        !           287: #define UHUBCF_PRODUCT_DEFAULT -1
        !           288: #define UHUBCF_RELEASE_DEFAULT -1
        !           289:
        !           290: #define        UHUBCF_PORT             0
        !           291: #define        UHUBCF_CONFIGURATION    1
        !           292: #define        UHUBCF_INTERFACE        2
        !           293: #define        UHUBCF_VENDOR           3
        !           294: #define        UHUBCF_PRODUCT          4
        !           295: #define        UHUBCF_RELEASE          5
        !           296:
        !           297: #define        uhubcf_port             cf_loc[UHUBCF_PORT]
        !           298: #define        uhubcf_configuration    cf_loc[UHUBCF_CONFIGURATION]
        !           299: #define        uhubcf_interface        cf_loc[UHUBCF_INTERFACE]
        !           300: #define        uhubcf_vendor           cf_loc[UHUBCF_VENDOR]
        !           301: #define        uhubcf_product          cf_loc[UHUBCF_PRODUCT]
        !           302: #define        uhubcf_release          cf_loc[UHUBCF_RELEASE]
        !           303: #define        UHUB_UNK_PORT           UHUBCF_PORT_DEFAULT /* wildcarded 'port' */
        !           304: #define        UHUB_UNK_CONFIGURATION  UHUBCF_CONFIGURATION_DEFAULT /* wildcarded 'configuration' */
        !           305: #define        UHUB_UNK_INTERFACE      UHUBCF_INTERFACE_DEFAULT /* wildcarded 'interface' */
        !           306: #define        UHUB_UNK_VENDOR         UHUBCF_VENDOR_DEFAULT /* wildcarded 'vendor' */
        !           307: #define        UHUB_UNK_PRODUCT        UHUBCF_PRODUCT_DEFAULT /* wildcarded 'product' */
        !           308: #define        UHUB_UNK_RELEASE        UHUBCF_RELEASE_DEFAULT /* wildcarded 'release' */

CVSweb