[BACK]Return to usbdivar.h CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / sys / dev / usb

Annotation of src/sys/dev/usb/usbdivar.h, Revision 1.93.4.1

1.93.4.1! yamt        1: /*     $NetBSD: usbdivar.h,v 1.93 2011/05/27 17:19:18 drochner Exp $   */
1.41      augustss    2: /*     $FreeBSD: src/sys/dev/usb/usbdivar.h,v 1.11 1999/11/17 22:33:51 n_hibma Exp $   */
1.1       augustss    3:
                      4: /*
                      5:  * Copyright (c) 1998 The NetBSD Foundation, Inc.
                      6:  * All rights reserved.
                      7:  *
1.8       augustss    8:  * This code is derived from software contributed to The NetBSD Foundation
1.56      augustss    9:  * by Lennart Augustsson (lennart@augustsson.net) at
1.8       augustss   10:  * Carlstedt Research & Technology.
1.1       augustss   11:  *
                     12:  * Redistribution and use in source and binary forms, with or without
                     13:  * modification, are permitted provided that the following conditions
                     14:  * are met:
                     15:  * 1. Redistributions of source code must retain the above copyright
                     16:  *    notice, this list of conditions and the following disclaimer.
                     17:  * 2. Redistributions in binary form must reproduce the above copyright
                     18:  *    notice, this list of conditions and the following disclaimer in the
                     19:  *    documentation and/or other materials provided with the distribution.
                     20:  *
                     21:  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
                     22:  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
                     23:  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
                     24:  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
                     25:  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
                     26:  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
                     27:  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
                     28:  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
                     29:  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
                     30:  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
                     31:  * POSSIBILITY OF SUCH DAMAGE.
                     32:  */
                     33:
1.48      thorpej    34: #include <sys/callout.h>
1.93.4.1! yamt       35: #include <sys/bus.h>
1.48      thorpej    36:
1.29      augustss   37: /* From usb_mem.h */
1.89      dyoung     38: struct usb_dma_block;
                     39: typedef struct {
                     40:        struct usb_dma_block *block;
                     41:        u_int offs;
                     42: } usb_dma_t;
1.29      augustss   43:
1.40      augustss   44: struct usbd_xfer;
1.1       augustss   45: struct usbd_pipe;
                     46:
                     47: struct usbd_endpoint {
                     48:        usb_endpoint_descriptor_t *edesc;
                     49:        int                     refcnt;
1.93      drochner   50:        int datatoggle;
1.1       augustss   51: };
                     52:
1.29      augustss   53: struct usbd_bus_methods {
1.57      augustss   54:        usbd_status           (*open_pipe)(struct usbd_pipe *pipe);
1.62      augustss   55:        void                  (*soft_intr)(void *);
1.57      augustss   56:        void                  (*do_poll)(struct usbd_bus *);
                     57:        usbd_status           (*allocm)(struct usbd_bus *, usb_dma_t *,
                     58:                                        u_int32_t bufsize);
                     59:        void                  (*freem)(struct usbd_bus *, usb_dma_t *);
                     60:        struct usbd_xfer *    (*allocx)(struct usbd_bus *);
                     61:        void                  (*freex)(struct usbd_bus *, struct usbd_xfer *);
1.29      augustss   62: };
                     63:
                     64: struct usbd_pipe_methods {
1.57      augustss   65:        usbd_status           (*transfer)(usbd_xfer_handle xfer);
                     66:        usbd_status           (*start)(usbd_xfer_handle xfer);
                     67:        void                  (*abort)(usbd_xfer_handle xfer);
                     68:        void                  (*close)(usbd_pipe_handle pipe);
                     69:        void                  (*cleartoggle)(usbd_pipe_handle pipe);
                     70:        void                  (*done)(usbd_xfer_handle xfer);
1.1       augustss   71: };
                     72:
1.79      drochner   73: #if 0 /* notyet */
1.72      augustss   74: struct usbd_tt {
                     75:        struct usbd_hub        *hub;
                     76: };
1.79      drochner   77: #endif
1.72      augustss   78:
1.1       augustss   79: struct usbd_port {
                     80:        usb_port_status_t       status;
1.11      augustss   81:        u_int16_t               power;  /* mA of current on port */
                     82:        u_int8_t                portno;
                     83:        u_int8_t                restartcnt;
                     84: #define USBD_RESTART_MAX 5
1.73      joff       85:        u_int8_t                reattach;
1.66      augustss   86:        struct usbd_device     *device; /* Connected device */
1.1       augustss   87:        struct usbd_device     *parent; /* The ports hub */
1.79      drochner   88: #if 0
1.72      augustss   89:        struct usbd_tt         *tt; /* Transaction translator (if any) */
1.79      drochner   90: #endif
1.1       augustss   91: };
                     92:
                     93: struct usbd_hub {
1.57      augustss   94:        usbd_status           (*explore)(usbd_device_handle hub);
1.11      augustss   95:        void                   *hubsoftc;
1.1       augustss   96:        usb_hub_descriptor_t    hubdesc;
                     97:        struct usbd_port        ports[1];
                     98: };
                     99:
                    100: /*****/
                    101:
                    102: struct usbd_bus {
                    103:        /* Filled by HC driver */
1.83      drochner  104:        void                    *hci_private;
1.80      drochner  105:        const struct usbd_bus_methods *methods;
1.1       augustss  106:        u_int32_t               pipe_size; /* size of a pipe struct */
                    107:        /* Filled by usb driver */
                    108:        struct usbd_device     *root_hub;
                    109:        usbd_device_handle      devices[USB_MAX_DEVICES];
                    110:        char                    needs_explore;/* a hub a signalled a change */
1.6       augustss  111:        char                    use_polling;
1.83      drochner  112:        device_t                usbctl;
1.4       augustss  113:        struct usb_device_stats stats;
1.32      augustss  114:        u_int                   no_intrs;
1.42      augustss  115:        int                     usbrev; /* USB revision */
                    116: #define USBREV_UNKNOWN 0
                    117: #define USBREV_PRE_1_0 1
                    118: #define USBREV_1_0     2
                    119: #define USBREV_1_1     3
1.60      augustss  120: #define USBREV_2_0     4
1.62      augustss  121: #define USBREV_STR { "unknown", "pre 1.0", "1.0", "1.1", "2.0" }
                    122:
                    123:        void                   *soft; /* soft interrupt cookie */
1.31      augustss  124:        bus_dma_tag_t           dmatag; /* DMA tag */
1.1       augustss  125: };
                    126:
                    127: struct usbd_device {
1.43      augustss  128:        struct usbd_bus        *bus;           /* our controller */
                    129:        struct usbd_pipe       *default_pipe;  /* pipe 0 */
                    130:        u_int8_t                address;       /* device addess */
                    131:        u_int8_t                config;        /* current configuration # */
                    132:        u_int8_t                depth;         /* distance from root hub */
1.66      augustss  133:        u_int8_t                speed;         /* low/full/high speed */
1.43      augustss  134:        u_int8_t                self_powered;  /* flag for self powered */
                    135:        u_int16_t               power;         /* mA the device uses */
                    136:        int16_t                 langid;        /* language for strings */
1.13      augustss  137: #define USBD_NOLANG (-1)
1.43      augustss  138:        usb_event_cookie_t      cookie;        /* unique connection id */
                    139:        struct usbd_port       *powersrc;      /* upstream hub port, or 0 */
1.66      augustss  140:        struct usbd_device     *myhub;         /* upstream hub */
1.72      augustss  141:        struct usbd_port       *myhsport;      /* closest high speed port */
1.43      augustss  142:        struct usbd_endpoint    def_ep;        /* for pipe 0 */
1.1       augustss  143:        usb_endpoint_descriptor_t def_ep_desc; /* for pipe 0 */
1.43      augustss  144:        struct usbd_interface  *ifaces;        /* array of all interfaces */
                    145:        usb_device_descriptor_t ddesc;         /* device descriptor */
                    146:        usb_config_descriptor_t *cdesc;        /* full config descr */
1.61      jdolecek  147:        const struct usbd_quirks     *quirks;  /* device quirks, always set */
1.43      augustss  148:        struct usbd_hub        *hub;           /* only if this is a hub */
1.85      drochner  149:        int                     subdevlen;     /* array length of following */
                    150:        device_t               *subdevs;       /* sub-devices */
1.87      drochner  151:        int                     nifaces_claimed; /* number of ifaces in use */
1.1       augustss  152: };
                    153:
                    154: struct usbd_interface {
                    155:        struct usbd_device     *device;
                    156:        usb_interface_descriptor_t *idesc;
1.10      augustss  157:        int                     index;
                    158:        int                     altindex;
1.1       augustss  159:        struct usbd_endpoint   *endpoints;
                    160:        void                   *priv;
                    161:        LIST_HEAD(, usbd_pipe)  pipes;
                    162: };
                    163:
                    164: struct usbd_pipe {
                    165:        struct usbd_interface  *iface;
                    166:        struct usbd_device     *device;
                    167:        struct usbd_endpoint   *endpoint;
1.21      augustss  168:        int                     refcnt;
1.1       augustss  169:        char                    running;
1.53      augustss  170:        char                    aborting;
1.40      augustss  171:        SIMPLEQ_HEAD(, usbd_xfer) queue;
1.1       augustss  172:        LIST_ENTRY(usbd_pipe)   next;
                    173:
1.45      augustss  174:        usbd_xfer_handle        intrxfer; /* used for repeating requests */
1.22      augustss  175:        char                    repeat;
1.45      augustss  176:        int                     interval;
1.52      augustss  177:
1.1       augustss  178:        /* Filled by HC driver. */
1.80      drochner  179:        const struct usbd_pipe_methods *methods;
1.1       augustss  180: };
                    181:
1.40      augustss  182: struct usbd_xfer {
1.1       augustss  183:        struct usbd_pipe       *pipe;
                    184:        void                   *priv;
                    185:        void                   *buffer;
                    186:        u_int32_t               length;
                    187:        u_int32_t               actlen;
                    188:        u_int16_t               flags;
                    189:        u_int32_t               timeout;
                    190:        usbd_status             status;
                    191:        usbd_callback           callback;
1.77      chs       192:        volatile u_int8_t       done;
                    193:        u_int8_t                busy_free;      /* used for DIAGNOSTIC */
                    194: #define XFER_FREE 0x46
                    195: #define XFER_BUSY 0x55
                    196: #define XFER_ONQU 0x9e
1.1       augustss  197:
1.29      augustss  198:        /* For control pipe */
1.1       augustss  199:        usb_device_request_t    request;
1.29      augustss  200:
                    201:        /* For isoc */
                    202:        u_int16_t               *frlengths;
                    203:        int                     nframes;
                    204:
                    205:        /* For memory allocation */
1.30      augustss  206:        struct usbd_device     *device;
1.29      augustss  207:        usb_dma_t               dmabuf;
                    208:
1.74      augustss  209:        u_int8_t                rqflags;
1.29      augustss  210: #define URQ_REQUEST    0x01
1.30      augustss  211: #define URQ_AUTO_DMABUF        0x10
                    212: #define URQ_DEV_DMABUF 0x20
1.1       augustss  213:
1.40      augustss  214:        SIMPLEQ_ENTRY(usbd_xfer) next;
1.1       augustss  215:
1.29      augustss  216:        void                   *hcpriv; /* private use by the HC driver */
1.74      augustss  217:        u_int8_t                hcflags; /* private use by the HC driver */
                    218: #define UXFER_ABORTING 0x01    /* xfer is aborting. */
                    219: #define UXFER_ABORTWAIT        0x02    /* abort completion is being awaited. */
1.11      augustss  220:
1.89      dyoung    221:         struct callout timeout_handle;
1.1       augustss  222: };
                    223:
1.57      augustss  224: void usbd_init(void);
                    225: void usbd_finish(void);
1.64      augustss  226:
1.92      phx       227: #if defined(USB_DEBUG) || defined(EHCI_DEBUG)
1.64      augustss  228: void usbd_dump_iface(struct usbd_interface *iface);
                    229: void usbd_dump_device(struct usbd_device *dev);
                    230: void usbd_dump_endpoint(struct usbd_endpoint *endp);
                    231: void usbd_dump_queue(usbd_pipe_handle pipe);
                    232: void usbd_dump_pipe(usbd_pipe_handle pipe);
1.67      augustss  233: #endif
1.1       augustss  234:
                    235: /* Routines from usb_subr.c */
1.57      augustss  236: int            usbctlprint(void *, const char *);
                    237: void           usb_delay_ms(usbd_bus_handle, u_int);
1.93.4.1! yamt      238: void           usbd_delay_ms(usbd_device_handle, u_int);
1.71      itojun    239: usbd_status    usbd_reset_port(usbd_device_handle, int, usb_port_status_t *);
1.57      augustss  240: usbd_status    usbd_setup_pipe(usbd_device_handle dev,
                    241:                                usbd_interface_handle iface,
                    242:                                struct usbd_endpoint *, int,
                    243:                                usbd_pipe_handle *pipe);
1.90      uebayasi  244: usbd_status    usbd_new_device(device_t, usbd_bus_handle, int, int, int,
1.89      dyoung    245:                                 struct usbd_port *);
1.90      uebayasi  246: usbd_status    usbd_reattach_device(device_t, usbd_device_handle,
1.89      dyoung    247:                                      int, const int *);
1.88      kent      248:
1.57      augustss  249: void           usbd_remove_device(usbd_device_handle, struct usbd_port *);
1.71      itojun    250: int            usbd_printBCD(char *, size_t, int);
                    251: usbd_status    usbd_fill_iface_data(usbd_device_handle, int, int);
1.57      augustss  252: void           usb_free_device(usbd_device_handle);
                    253:
1.71      itojun    254: usbd_status    usb_insert_transfer(usbd_xfer_handle);
                    255: void           usb_transfer_complete(usbd_xfer_handle);
1.91      dyoung    256: int            usb_disconnect_port(struct usbd_port *, device_t, int);
1.1       augustss  257:
                    258: /* Routines from usb.c */
1.63      augustss  259: void           usb_needs_explore(usbd_device_handle);
1.73      joff      260: void           usb_needs_reattach(usbd_device_handle);
1.57      augustss  261: void           usb_schedsoftintr(struct usbd_bus *);

CVSweb <webmaster@jp.NetBSD.org>