LCOV - code coverage report
Current view: top level - dev/usb - usbdivar.h (source / functions) Hit Total Coverage
Test: 6.4 Lines: 0 5 0.0 %
Date: 2018-10-19 03:25:38 Functions: 0 1 0.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /*      $OpenBSD: usbdivar.h,v 1.75 2018/05/01 18:14:46 landry 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             :  *
      22             :  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
      23             :  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
      24             :  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
      25             :  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
      26             :  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
      27             :  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
      28             :  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
      29             :  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
      30             :  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
      31             :  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
      32             :  * POSSIBILITY OF SUCH DAMAGE.
      33             :  */
      34             : 
      35             : #ifndef _USBDIVAR_H_
      36             : #define _USBDIVAR_H_
      37             : 
      38             : #include "bpfilter.h"
      39             : #if NBPFILTER > 0
      40             : #include <net/bpf.h>
      41             : #endif
      42             : 
      43             : #include <sys/timeout.h>
      44             : 
      45             : /* From usb_mem.h */
      46             : struct usb_dma_block;
      47             : struct usb_dma {
      48             :         struct usb_dma_block    *block;
      49             :         u_int                    offs;
      50             : };
      51             : 
      52             : struct usbd_xfer;
      53             : struct usbd_pipe;
      54             : 
      55             : struct usbd_endpoint {
      56             :         usb_endpoint_descriptor_t *edesc;
      57             :         int                     refcnt;
      58             :         int                     savedtoggle;
      59             : };
      60             : 
      61             : struct usbd_bus_methods {
      62             :         usbd_status           (*open_pipe)(struct usbd_pipe *);
      63             :         int                   (*dev_setaddr)(struct usbd_device *, int);
      64             :         void                  (*soft_intr)(void *);
      65             :         void                  (*do_poll)(struct usbd_bus *);
      66             :         struct usbd_xfer *    (*allocx)(struct usbd_bus *);
      67             :         void                  (*freex)(struct usbd_bus *, struct usbd_xfer *);
      68             : };
      69             : 
      70             : struct usbd_pipe_methods {
      71             :         usbd_status           (*transfer)(struct usbd_xfer *);
      72             :         usbd_status           (*start)(struct usbd_xfer *);
      73             :         void                  (*abort)(struct usbd_xfer *);
      74             :         void                  (*close)(struct usbd_pipe *);
      75             :         void                  (*cleartoggle)(struct usbd_pipe *);
      76             :         void                  (*done)(struct usbd_xfer *);
      77             : };
      78             : 
      79             : struct usbd_tt {
      80             :         struct usbd_hub        *hub;
      81             : };
      82             : 
      83             : struct usbd_port {
      84             :         usb_port_status_t       status;
      85             :         u_int16_t               power;  /* mA of current on port */
      86             :         u_int8_t                portno;
      87             :         u_int8_t                restartcnt;
      88             : #define USBD_RESTART_MAX 5
      89             :         u_int8_t                reattach;
      90             :         struct usbd_device     *device; /* Connected device */
      91             :         struct usbd_device     *parent; /* The ports hub */
      92             :         struct usbd_tt         *tt; /* Transaction translator (if any) */
      93             : };
      94             : 
      95             : struct usbd_hub {
      96             :         int                   (*explore)(struct usbd_device *);
      97             :         void                   *hubsoftc;
      98             :         struct usbd_port       *ports;
      99             :         int                     nports;
     100             :         u_int8_t                powerdelay;
     101             :         u_int8_t                ttthink;
     102             : };
     103             : 
     104             : struct usbd_bus {
     105             :         /* Filled by HC driver */
     106             :         struct device           bdev; /* base device, host adapter */
     107             :         struct usbd_bus_methods *methods;
     108             : #if NBPFILTER > 0
     109             :         void                    *bpfif;
     110             :         caddr_t                 bpf;
     111             : #endif
     112             :         u_int32_t               pipe_size; /* size of a pipe struct */
     113             :         /* Filled by usb driver */
     114             :         struct usbd_device     *root_hub;
     115             :         struct usbd_device      *devices[USB_MAX_DEVICES];
     116             :         char                    use_polling;
     117             :         char                    dying;
     118             :         int                     flags;
     119             : #define USB_BUS_CONFIG_PENDING  0x01
     120             : #define USB_BUS_DISCONNECTING   0x02
     121             :         struct device          *usbctl;
     122             :         struct usb_device_stats stats;
     123             :         int                     intr_context;
     124             :         u_int                   no_intrs;
     125             :         int                     usbrev; /* USB revision */
     126             : #define USBREV_UNKNOWN  0
     127             : #define USBREV_PRE_1_0  1
     128             : #define USBREV_1_0      2
     129             : #define USBREV_1_1      3
     130             : #define USBREV_2_0      4
     131             : #define USBREV_3_0      5
     132             : #define USBREV_STR { "unknown", "pre 1.0", "1.0", "1.1", "2.0", "3.0" }
     133             :         void                   *soft; /* soft interrupt cookie */
     134             :         bus_dma_tag_t           dmatag; /* DMA tag */
     135             : };
     136             : 
     137             : struct usbd_device {
     138             :         struct usbd_bus        *bus;           /* our controller */
     139             :         struct usbd_pipe       *default_pipe;  /* pipe 0 */
     140             :         u_int8_t                dying;         /* hardware removed */
     141             :         u_int8_t                ref_cnt;       /* # of procs using device */
     142             :         u_int8_t                address;       /* device address */
     143             :         u_int8_t                config;        /* current configuration # */
     144             :         u_int8_t                depth;         /* distance from root hub */
     145             :         u_int8_t                speed;         /* low/full/high speed */
     146             :         u_int8_t                self_powered;  /* flag for self powered */
     147             :         u_int16_t               power;         /* mA the device uses */
     148             :         int16_t                 langid;        /* language for strings */
     149             : #define USBD_NOLANG (-1)
     150             :         struct usbd_port       *powersrc;      /* upstream hub port, or 0 */
     151             :         struct usbd_device     *myhub;         /* upstream hub */
     152             :         struct usbd_port       *myhsport;      /* closest high speed port */
     153             :         struct usbd_endpoint    def_ep;        /* for pipe 0 */
     154             :         usb_endpoint_descriptor_t def_ep_desc; /* for pipe 0 */
     155             :         struct usbd_interface  *ifaces;        /* array of all interfaces */
     156             :         usb_device_descriptor_t ddesc;         /* device descriptor */
     157             :         usb_config_descriptor_t *cdesc;        /* full config descr */
     158             :         const struct usbd_quirks     *quirks;  /* device quirks, always set */
     159             :         struct usbd_hub        *hub;           /* only if this is a hub */
     160             :         struct device         **subdevs;       /* sub-devices, 0 terminated */
     161             :         int                     ndevs;         /* # of subdevs */
     162             : 
     163             :         char                   *serial;        /* serial number, can be NULL */
     164             :         char                   *vendor;        /* vendor string, can be NULL */
     165             :         char                   *product;       /* product string, can be NULL */
     166             : };
     167             : 
     168             : struct usbd_interface {
     169             :         struct usbd_device     *device;
     170             :         usb_interface_descriptor_t *idesc;
     171             :         int                     index;
     172             :         int                     altindex;
     173             :         struct usbd_endpoint   *endpoints;
     174             :         void                   *priv;
     175             :         LIST_HEAD(, usbd_pipe)  pipes;
     176             :         u_int8_t                claimed;
     177             : };
     178             : 
     179             : struct usbd_pipe {
     180             :         struct usbd_interface  *iface;
     181             :         struct usbd_device     *device;
     182             :         struct usbd_endpoint   *endpoint;
     183             :         size_t                  pipe_size;
     184             :         char                    running;
     185             :         char                    aborting;
     186             :         SIMPLEQ_HEAD(, usbd_xfer) queue;
     187             :         LIST_ENTRY(usbd_pipe)   next;
     188             : 
     189             :         struct usbd_xfer        *intrxfer; /* used for repeating requests */
     190             :         char                    repeat;
     191             :         int                     interval;
     192             : 
     193             :         /* Filled by HC driver. */
     194             :         struct usbd_pipe_methods *methods;
     195             : };
     196             : 
     197             : struct usbd_xfer {
     198             :         struct usbd_pipe       *pipe;
     199             :         void                   *priv;
     200             :         char                   *buffer;
     201             :         u_int32_t               length;
     202             :         u_int32_t               actlen;
     203             :         u_int16_t               flags;
     204             :         u_int32_t               timeout;
     205             :         usbd_status             status;
     206             :         usbd_callback           callback;
     207             :         volatile char           done;
     208             : #ifdef DIAGNOSTIC
     209             :         u_int32_t               busy_free;
     210             : #define XFER_FREE 0x42555359
     211             : #define XFER_ONQU 0x4f4e5155
     212             : #endif
     213             : 
     214             :         /* For control pipe */
     215             :         usb_device_request_t    request;
     216             : 
     217             :         /* For isoc */
     218             :         u_int16_t               *frlengths;
     219             :         int                     nframes;
     220             : 
     221             :         /* For memory allocation */
     222             :         struct usbd_device     *device;
     223             :         struct usb_dma          dmabuf;
     224             : 
     225             :         int                     rqflags;
     226             : #define URQ_REQUEST     0x01
     227             : #define URQ_AUTO_DMABUF 0x10
     228             : #define URQ_DEV_DMABUF  0x20
     229             : 
     230             :         SIMPLEQ_ENTRY(usbd_xfer) next;
     231             : 
     232             :         void                   *hcpriv; /* private use by the HC driver */
     233             : 
     234             :         struct usb_task         abort_task;
     235             :         struct timeout          timeout_handle;
     236             : };
     237             : 
     238             : void usbd_dump_iface(struct usbd_interface *);
     239             : void usbd_dump_device(struct usbd_device *);
     240             : void usbd_dump_endpoint(struct usbd_endpoint *);
     241             : void usbd_dump_queue(struct usbd_pipe *);
     242             : void usbd_dump_pipe(struct usbd_pipe *);
     243             : 
     244             : /* Routines from usb_subr.c */
     245             : int             usbctlprint(void *, const char *);
     246             : void            usb_delay_ms(struct usbd_bus *, u_int);
     247             : usbd_status     usbd_port_disown_to_1_1(struct usbd_device *, int);
     248             : int             usbd_reset_port(struct usbd_device *, int);
     249             : usbd_status     usbd_setup_pipe(struct usbd_device *,
     250             :                     struct usbd_interface *, struct usbd_endpoint *, int,
     251             :                     struct usbd_pipe **);
     252             : int             usbd_set_address(struct usbd_device *, int);
     253             : usbd_status     usbd_new_device(struct device *, struct usbd_bus *,
     254             :                     int, int, int, struct usbd_port *);
     255             : usbd_status     usbd_fill_iface_data(struct usbd_device *, int, int);
     256             : 
     257             : usbd_status     usb_insert_transfer(struct usbd_xfer *);
     258             : void            usb_transfer_complete(struct usbd_xfer *);
     259             : int             usbd_detach(struct usbd_device *, struct device *);
     260             : 
     261             : /* Routines from usb.c */
     262             : void            usb_needs_explore(struct usbd_device *, int);
     263             : void            usb_needs_reattach(struct usbd_device *);
     264             : void            usb_schedsoftintr(struct usbd_bus *);
     265             : void            usb_tap(struct usbd_bus *, struct usbd_xfer *, uint8_t);
     266             : 
     267             : #define USBTAP_DIR_OUT  0
     268             : #define USBTAP_DIR_IN   1
     269             : 
     270             : #define UHUB_UNK_CONFIGURATION  -1
     271             : #define UHUB_UNK_INTERFACE      -1
     272             : 
     273             : static inline int
     274           0 : usbd_xfer_isread(struct usbd_xfer *xfer)
     275             : {
     276           0 :         if (xfer->rqflags & URQ_REQUEST)
     277           0 :                 return (xfer->request.bmRequestType & UT_READ);
     278             : 
     279           0 :         return (xfer->pipe->endpoint->edesc->bEndpointAddress & UE_DIR_IN);
     280           0 : }
     281             : 
     282             : #endif /* _USBDIVAR_H_ */

Generated by: LCOV version 1.13