[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.87

1.87    ! drochner    1: /*     $NetBSD: usbdivar.h,v 1.86 2008/05/26 18:00:33 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>
                     35:
1.29      augustss   36: /* From usb_mem.h */
1.30      augustss   37: DECLARE_USB_DMA_T;
1.29      augustss   38:
1.40      augustss   39: struct usbd_xfer;
1.1       augustss   40: struct usbd_pipe;
                     41:
                     42: struct usbd_endpoint {
                     43:        usb_endpoint_descriptor_t *edesc;
                     44:        int                     refcnt;
                     45: };
                     46:
1.29      augustss   47: struct usbd_bus_methods {
1.57      augustss   48:        usbd_status           (*open_pipe)(struct usbd_pipe *pipe);
1.62      augustss   49:        void                  (*soft_intr)(void *);
1.57      augustss   50:        void                  (*do_poll)(struct usbd_bus *);
                     51:        usbd_status           (*allocm)(struct usbd_bus *, usb_dma_t *,
                     52:                                        u_int32_t bufsize);
                     53:        void                  (*freem)(struct usbd_bus *, usb_dma_t *);
                     54:        struct usbd_xfer *    (*allocx)(struct usbd_bus *);
                     55:        void                  (*freex)(struct usbd_bus *, struct usbd_xfer *);
1.29      augustss   56: };
                     57:
                     58: struct usbd_pipe_methods {
1.57      augustss   59:        usbd_status           (*transfer)(usbd_xfer_handle xfer);
                     60:        usbd_status           (*start)(usbd_xfer_handle xfer);
                     61:        void                  (*abort)(usbd_xfer_handle xfer);
                     62:        void                  (*close)(usbd_pipe_handle pipe);
                     63:        void                  (*cleartoggle)(usbd_pipe_handle pipe);
                     64:        void                  (*done)(usbd_xfer_handle xfer);
1.1       augustss   65: };
                     66:
1.79      drochner   67: #if 0 /* notyet */
1.72      augustss   68: struct usbd_tt {
                     69:        struct usbd_hub        *hub;
                     70: };
1.79      drochner   71: #endif
1.72      augustss   72:
1.1       augustss   73: struct usbd_port {
                     74:        usb_port_status_t       status;
1.11      augustss   75:        u_int16_t               power;  /* mA of current on port */
                     76:        u_int8_t                portno;
                     77:        u_int8_t                restartcnt;
                     78: #define USBD_RESTART_MAX 5
1.73      joff       79:        u_int8_t                reattach;
1.66      augustss   80:        struct usbd_device     *device; /* Connected device */
1.1       augustss   81:        struct usbd_device     *parent; /* The ports hub */
1.79      drochner   82: #if 0
1.72      augustss   83:        struct usbd_tt         *tt; /* Transaction translator (if any) */
1.79      drochner   84: #endif
1.1       augustss   85: };
                     86:
                     87: struct usbd_hub {
1.57      augustss   88:        usbd_status           (*explore)(usbd_device_handle hub);
1.11      augustss   89:        void                   *hubsoftc;
1.1       augustss   90:        usb_hub_descriptor_t    hubdesc;
                     91:        struct usbd_port        ports[1];
                     92: };
                     93:
                     94: /*****/
                     95:
                     96: struct usbd_bus {
                     97:        /* Filled by HC driver */
1.83      drochner   98:        void                    *hci_private;
1.80      drochner   99:        const struct usbd_bus_methods *methods;
1.1       augustss  100:        u_int32_t               pipe_size; /* size of a pipe struct */
                    101:        /* Filled by usb driver */
                    102:        struct usbd_device     *root_hub;
                    103:        usbd_device_handle      devices[USB_MAX_DEVICES];
                    104:        char                    needs_explore;/* a hub a signalled a change */
1.6       augustss  105:        char                    use_polling;
1.83      drochner  106:        device_t                usbctl;
1.4       augustss  107:        struct usb_device_stats stats;
1.32      augustss  108:        int                     intr_context;
                    109:        u_int                   no_intrs;
1.42      augustss  110:        int                     usbrev; /* USB revision */
                    111: #define USBREV_UNKNOWN 0
                    112: #define USBREV_PRE_1_0 1
                    113: #define USBREV_1_0     2
                    114: #define USBREV_1_1     3
1.60      augustss  115: #define USBREV_2_0     4
1.62      augustss  116: #define USBREV_STR { "unknown", "pre 1.0", "1.0", "1.1", "2.0" }
                    117:
                    118:        void                   *soft; /* soft interrupt cookie */
1.31      augustss  119:        bus_dma_tag_t           dmatag; /* DMA tag */
1.1       augustss  120: };
                    121:
                    122: struct usbd_device {
1.43      augustss  123:        struct usbd_bus        *bus;           /* our controller */
                    124:        struct usbd_pipe       *default_pipe;  /* pipe 0 */
                    125:        u_int8_t                address;       /* device addess */
                    126:        u_int8_t                config;        /* current configuration # */
                    127:        u_int8_t                depth;         /* distance from root hub */
1.66      augustss  128:        u_int8_t                speed;         /* low/full/high speed */
1.43      augustss  129:        u_int8_t                self_powered;  /* flag for self powered */
                    130:        u_int16_t               power;         /* mA the device uses */
                    131:        int16_t                 langid;        /* language for strings */
1.13      augustss  132: #define USBD_NOLANG (-1)
1.43      augustss  133:        usb_event_cookie_t      cookie;        /* unique connection id */
                    134:        struct usbd_port       *powersrc;      /* upstream hub port, or 0 */
1.66      augustss  135:        struct usbd_device     *myhub;         /* upstream hub */
1.72      augustss  136:        struct usbd_port       *myhsport;      /* closest high speed port */
1.43      augustss  137:        struct usbd_endpoint    def_ep;        /* for pipe 0 */
1.1       augustss  138:        usb_endpoint_descriptor_t def_ep_desc; /* for pipe 0 */
1.43      augustss  139:        struct usbd_interface  *ifaces;        /* array of all interfaces */
                    140:        usb_device_descriptor_t ddesc;         /* device descriptor */
                    141:        usb_config_descriptor_t *cdesc;        /* full config descr */
1.61      jdolecek  142:        const struct usbd_quirks     *quirks;  /* device quirks, always set */
1.43      augustss  143:        struct usbd_hub        *hub;           /* only if this is a hub */
1.85      drochner  144:        int                     subdevlen;     /* array length of following */
                    145:        device_t               *subdevs;       /* sub-devices */
1.87    ! drochner  146:        int                     nifaces_claimed; /* number of ifaces in use */
1.1       augustss  147: };
                    148:
                    149: struct usbd_interface {
                    150:        struct usbd_device     *device;
                    151:        usb_interface_descriptor_t *idesc;
1.10      augustss  152:        int                     index;
                    153:        int                     altindex;
1.1       augustss  154:        struct usbd_endpoint   *endpoints;
                    155:        void                   *priv;
                    156:        LIST_HEAD(, usbd_pipe)  pipes;
                    157: };
                    158:
                    159: struct usbd_pipe {
                    160:        struct usbd_interface  *iface;
                    161:        struct usbd_device     *device;
                    162:        struct usbd_endpoint   *endpoint;
1.21      augustss  163:        int                     refcnt;
1.1       augustss  164:        char                    running;
1.53      augustss  165:        char                    aborting;
1.40      augustss  166:        SIMPLEQ_HEAD(, usbd_xfer) queue;
1.1       augustss  167:        LIST_ENTRY(usbd_pipe)   next;
                    168:
1.45      augustss  169:        usbd_xfer_handle        intrxfer; /* used for repeating requests */
1.22      augustss  170:        char                    repeat;
1.45      augustss  171:        int                     interval;
1.52      augustss  172:
1.1       augustss  173:        /* Filled by HC driver. */
1.80      drochner  174:        const struct usbd_pipe_methods *methods;
1.1       augustss  175: };
                    176:
1.40      augustss  177: struct usbd_xfer {
1.1       augustss  178:        struct usbd_pipe       *pipe;
                    179:        void                   *priv;
                    180:        void                   *buffer;
                    181:        u_int32_t               length;
                    182:        u_int32_t               actlen;
                    183:        u_int16_t               flags;
                    184:        u_int32_t               timeout;
                    185:        usbd_status             status;
                    186:        usbd_callback           callback;
1.77      chs       187:        volatile u_int8_t       done;
                    188:        u_int8_t                busy_free;      /* used for DIAGNOSTIC */
                    189: #define XFER_FREE 0x46
                    190: #define XFER_BUSY 0x55
                    191: #define XFER_ONQU 0x9e
1.1       augustss  192:
1.29      augustss  193:        /* For control pipe */
1.1       augustss  194:        usb_device_request_t    request;
1.29      augustss  195:
                    196:        /* For isoc */
                    197:        u_int16_t               *frlengths;
                    198:        int                     nframes;
                    199:
                    200:        /* For memory allocation */
1.30      augustss  201:        struct usbd_device     *device;
1.29      augustss  202:        usb_dma_t               dmabuf;
                    203:
1.74      augustss  204:        u_int8_t                rqflags;
1.29      augustss  205: #define URQ_REQUEST    0x01
1.30      augustss  206: #define URQ_AUTO_DMABUF        0x10
                    207: #define URQ_DEV_DMABUF 0x20
1.1       augustss  208:
1.40      augustss  209:        SIMPLEQ_ENTRY(usbd_xfer) next;
1.1       augustss  210:
1.29      augustss  211:        void                   *hcpriv; /* private use by the HC driver */
1.74      augustss  212:        u_int8_t                hcflags; /* private use by the HC driver */
                    213: #define UXFER_ABORTING 0x01    /* xfer is aborting. */
                    214: #define UXFER_ABORTWAIT        0x02    /* abort completion is being awaited. */
1.11      augustss  215:
1.52      augustss  216:        usb_callout_t           timeout_handle;
1.1       augustss  217: };
                    218:
1.57      augustss  219: void usbd_init(void);
                    220: void usbd_finish(void);
1.64      augustss  221:
1.67      augustss  222: #ifdef USB_DEBUG
1.64      augustss  223: void usbd_dump_iface(struct usbd_interface *iface);
                    224: void usbd_dump_device(struct usbd_device *dev);
                    225: void usbd_dump_endpoint(struct usbd_endpoint *endp);
                    226: void usbd_dump_queue(usbd_pipe_handle pipe);
                    227: void usbd_dump_pipe(usbd_pipe_handle pipe);
1.67      augustss  228: #endif
1.1       augustss  229:
                    230: /* Routines from usb_subr.c */
1.57      augustss  231: int            usbctlprint(void *, const char *);
                    232: void           usb_delay_ms(usbd_bus_handle, u_int);
1.71      itojun    233: usbd_status    usbd_reset_port(usbd_device_handle, int, usb_port_status_t *);
1.57      augustss  234: usbd_status    usbd_setup_pipe(usbd_device_handle dev,
                    235:                                usbd_interface_handle iface,
                    236:                                struct usbd_endpoint *, int,
                    237:                                usbd_pipe_handle *pipe);
1.71      itojun    238: usbd_status    usbd_new_device(device_ptr_t, usbd_bus_handle, int, int, int,
1.57      augustss  239:                                struct usbd_port *);
                    240: void           usbd_remove_device(usbd_device_handle, struct usbd_port *);
1.71      itojun    241: int            usbd_printBCD(char *, size_t, int);
                    242: usbd_status    usbd_fill_iface_data(usbd_device_handle, int, int);
1.57      augustss  243: void           usb_free_device(usbd_device_handle);
                    244:
1.71      itojun    245: usbd_status    usb_insert_transfer(usbd_xfer_handle);
                    246: void           usb_transfer_complete(usbd_xfer_handle);
                    247: void           usb_disconnect_port(struct usbd_port *, device_ptr_t);
1.1       augustss  248:
                    249: /* Routines from usb.c */
1.63      augustss  250: void           usb_needs_explore(usbd_device_handle);
1.73      joff      251: void           usb_needs_reattach(usbd_device_handle);
1.57      augustss  252: void           usb_schedsoftintr(struct usbd_bus *);
1.33      augustss  253:
1.58      thorpej   254: /*
                    255:  * XXX This check is extremely bogus. Bad Bad Bad.
                    256:  */
                    257: #if defined(DIAGNOSTIC) && 0
1.33      augustss  258: #define SPLUSBCHECK \
                    259:        do { int _s = splusb(), _su = splusb(); \
1.38      augustss  260:              if (!cold && _s != _su) printf("SPLUSBCHECK failed 0x%x!=0x%x, %s:%d\n", \
1.33      augustss  261:                                   _s, _su, __FILE__, __LINE__); \
1.39      mycroft   262:             splx(_s); \
1.33      augustss  263:         } while (0)
                    264: #else
                    265: #define SPLUSBCHECK
                    266: #endif

CVSweb <webmaster@jp.NetBSD.org>