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

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

CVSweb <webmaster@jp.NetBSD.org>