root/dev/usb/ehcivar.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. ehci_soft_qtd_t
  2. ehci_soft_qh_t
  3. ehci_softc_t

    1 /*      $OpenBSD: ehcivar.h,v 1.13 2007/06/12 16:26:36 mbalmer Exp $ */
    2 /*      $NetBSD: ehcivar.h,v 1.19 2005/04/29 15:04:29 augustss Exp $    */
    3 
    4 /*
    5  * Copyright (c) 2001 The NetBSD Foundation, Inc.
    6  * All rights reserved.
    7  *
    8  * This code is derived from software contributed to The NetBSD Foundation
    9  * by Lennart Augustsson (lennart@augustsson.net).
   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  * 3. All advertising materials mentioning features or use of this software
   20  *    must display the following acknowledgement:
   21  *        This product includes software developed by the NetBSD
   22  *        Foundation, Inc. and its contributors.
   23  * 4. Neither the name of The NetBSD Foundation nor the names of its
   24  *    contributors may be used to endorse or promote products derived
   25  *    from this software without specific prior written permission.
   26  *
   27  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
   28  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
   29  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
   30  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
   31  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
   32  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
   33  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
   34  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
   35  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
   36  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
   37  * POSSIBILITY OF SUCH DAMAGE.
   38  */
   39 
   40 typedef struct ehci_soft_qtd {
   41         ehci_qtd_t qtd;
   42         struct ehci_soft_qtd *nextqtd; /* mirrors nextqtd in TD */
   43         ehci_physaddr_t physaddr;
   44         usbd_xfer_handle xfer;
   45         LIST_ENTRY(ehci_soft_qtd) hnext;
   46         u_int16_t len;
   47 } ehci_soft_qtd_t;
   48 #define EHCI_SQTD_SIZE ((sizeof (struct ehci_soft_qtd) + EHCI_QTD_ALIGN - 1) / EHCI_QTD_ALIGN * EHCI_QTD_ALIGN)
   49 #define EHCI_SQTD_CHUNK (EHCI_PAGE_SIZE / EHCI_SQTD_SIZE)
   50 
   51 typedef struct ehci_soft_qh {
   52         ehci_qh_t qh;
   53         struct ehci_soft_qh *next;
   54         struct ehci_soft_qh *prev;
   55         struct ehci_soft_qtd *sqtd;
   56         ehci_physaddr_t physaddr;
   57         int islot;
   58 } ehci_soft_qh_t;
   59 #define EHCI_SQH_SIZE ((sizeof (struct ehci_soft_qh) + EHCI_QH_ALIGN - 1) / EHCI_QH_ALIGN * EHCI_QH_ALIGN)
   60 #define EHCI_SQH_CHUNK (EHCI_PAGE_SIZE / EHCI_SQH_SIZE)
   61 
   62 struct ehci_xfer {
   63         struct usbd_xfer xfer;
   64         struct usb_task abort_task;
   65         LIST_ENTRY(ehci_xfer) inext; /* list of active xfers */
   66         ehci_soft_qtd_t *sqtdstart;
   67         ehci_soft_qtd_t *sqtdend;
   68         u_int32_t ehci_xfer_flags;
   69 #ifdef DIAGNOSTIC
   70         int isdone;
   71 #endif
   72 };
   73 #define EHCI_XFER_ABORTING      0x0001  /* xfer is aborting. */
   74 #define EHCI_XFER_ABORTWAIT     0x0002  /* abort completion is being awaited. */
   75 
   76 #define EXFER(xfer) ((struct ehci_xfer *)(xfer))
   77 
   78 /* Information about an entry in the interrupt list. */
   79 struct ehci_soft_islot {
   80         ehci_soft_qh_t *sqh;    /* Queue Head. */
   81 };
   82 
   83 #define EHCI_FRAMELIST_MAXCOUNT 1024
   84 #define EHCI_IPOLLRATES         8 /* Poll rates (1ms, 2, 4, 8 .. 128) */
   85 #define EHCI_INTRQHS            ((1 << EHCI_IPOLLRATES) - 1)
   86 #define EHCI_IQHIDX(lev, pos) \
   87         ((((pos) & ((1 << (lev)) - 1)) | (1 << (lev))) - 1)
   88 #define EHCI_ILEV_IVAL(lev)     (1 << (lev))
   89 
   90 
   91 #define EHCI_HASH_SIZE 128
   92 #define EHCI_COMPANION_MAX 8
   93 
   94 typedef struct ehci_softc {
   95         struct usbd_bus sc_bus;         /* base device */
   96         bus_space_tag_t iot;
   97         bus_space_handle_t ioh;
   98         bus_size_t sc_size;
   99         u_int sc_offs;                  /* offset to operational regs */
  100         int sc_flags;                   /* misc flags */
  101 #define EHCIF_DROPPED_INTR_WORKAROUND   0x01
  102 
  103         char sc_vendor[16];             /* vendor string for root hub */
  104         int sc_id_vendor;               /* vendor ID for root hub */
  105 
  106         u_int32_t sc_cmd;               /* shadow of cmd reg during suspend */
  107         void *sc_powerhook;             /* cookie from power hook */
  108         void *sc_shutdownhook;          /* cookie from shutdown hook */
  109 
  110         usb_dma_t sc_fldma;
  111         ehci_link_t *sc_flist;
  112         u_int sc_flsize;
  113         u_int sc_rand;                  /* XXX need proper intr scheduling */
  114 
  115         struct ehci_soft_islot sc_islots[EHCI_INTRQHS];
  116 
  117         LIST_HEAD(, ehci_xfer) sc_intrhead;
  118 
  119         ehci_soft_qh_t *sc_freeqhs;
  120         ehci_soft_qtd_t *sc_freeqtds;
  121 
  122         int sc_noport;
  123         u_int8_t sc_addr;               /* device address */
  124         u_int8_t sc_conf;               /* device configuration */
  125         usbd_xfer_handle sc_intrxfer;
  126         char sc_isreset;
  127         char sc_softwake;
  128 
  129         u_int32_t sc_eintrs;
  130         ehci_soft_qh_t *sc_async_head;
  131 
  132         SIMPLEQ_HEAD(, usbd_xfer) sc_free_xfers; /* free xfers */
  133 
  134         struct rwlock sc_doorbell_lock;
  135 
  136         struct timeout sc_tmo_pcd;
  137         struct timeout sc_tmo_intrlist;
  138 
  139         struct device *sc_child;                /* /dev/usb# device */
  140 
  141         char sc_dying;
  142 } ehci_softc_t;
  143 
  144 #define EREAD1(sc, a) bus_space_read_1((sc)->iot, (sc)->ioh, (a))
  145 #define EREAD2(sc, a) bus_space_read_2((sc)->iot, (sc)->ioh, (a))
  146 #define EREAD4(sc, a) bus_space_read_4((sc)->iot, (sc)->ioh, (a))
  147 #define EWRITE1(sc, a, x) bus_space_write_1((sc)->iot, (sc)->ioh, (a), (x))
  148 #define EWRITE2(sc, a, x) bus_space_write_2((sc)->iot, (sc)->ioh, (a), (x))
  149 #define EWRITE4(sc, a, x) bus_space_write_4((sc)->iot, (sc)->ioh, (a), (x))
  150 #define EOREAD1(sc, a) bus_space_read_1((sc)->iot, (sc)->ioh, (sc)->sc_offs+(a))
  151 #define EOREAD2(sc, a) bus_space_read_2((sc)->iot, (sc)->ioh, (sc)->sc_offs+(a))
  152 #define EOREAD4(sc, a) bus_space_read_4((sc)->iot, (sc)->ioh, (sc)->sc_offs+(a))
  153 #define EOWRITE1(sc, a, x) bus_space_write_1((sc)->iot, (sc)->ioh, (sc)->sc_offs+(a), (x))
  154 #define EOWRITE2(sc, a, x) bus_space_write_2((sc)->iot, (sc)->ioh, (sc)->sc_offs+(a), (x))
  155 #define EOWRITE4(sc, a, x) bus_space_write_4((sc)->iot, (sc)->ioh, (sc)->sc_offs+(a), (x))
  156 
  157 usbd_status     ehci_init(ehci_softc_t *);
  158 int             ehci_intr(void *);
  159 int             ehci_detach(ehci_softc_t *, int);
  160 int             ehci_activate(struct device *, enum devact);
  161 void            ehci_shutdown(void *);

/* [<][>][^][v][top][bottom][index][help] */