1 /* $NetBSD: ohcivar.h,v 1.30 2001/12/31 12:20:35 augustss Exp $ */ 2 /* $FreeBSD: src/sys/dev/usb/ohcivar.h,v 1.13 1999/11/17 22:33:41 n_hibma Exp $ */ 3 4 /* 5 * Copyright (c) 1998 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) at 10 * Carlstedt Research & Technology. 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 * 3. All advertising materials mentioning features or use of this software 21 * must display the following acknowledgement: 22 * This product includes software developed by the NetBSD 23 * Foundation, Inc. and its contributors. 24 * 4. Neither the name of The NetBSD Foundation nor the names of its 25 * contributors may be used to endorse or promote products derived 26 * from this software without specific prior written permission. 27 * 28 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 29 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 30 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 31 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 32 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 33 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 34 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 35 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 36 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 37 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 38 * POSSIBILITY OF SUCH DAMAGE. 39 */ 40 41 typedef struct ohci_soft_ed { 42 ohci_ed_t ed; 43 struct ohci_soft_ed *next; 44 ohci_physaddr_t physaddr; 45 } ohci_soft_ed_t; 46 #define OHCI_SED_SIZE ((sizeof (struct ohci_soft_ed) + OHCI_ED_ALIGN - 1) / OHCI_ED_ALIGN * OHCI_ED_ALIGN) 47 #define OHCI_SED_CHUNK 128 48 49 50 typedef struct ohci_soft_td { 51 ohci_td_t td; 52 struct ohci_soft_td *nexttd; /* mirrors nexttd in TD */ 53 struct ohci_soft_td *dnext; /* next in done list */ 54 ohci_physaddr_t physaddr; 55 LIST_ENTRY(ohci_soft_td) hnext; 56 usbd_xfer_handle xfer; 57 u_int16_t len; 58 u_int16_t flags; 59 #define OHCI_CALL_DONE 0x0001 60 #define OHCI_ADD_LEN 0x0002 61 } ohci_soft_td_t; 62 #define OHCI_STD_SIZE ((sizeof (struct ohci_soft_td) + OHCI_TD_ALIGN - 1) / OHCI_TD_ALIGN * OHCI_TD_ALIGN) 63 #define OHCI_STD_CHUNK 128 64 65 66 typedef struct ohci_soft_itd { 67 ohci_itd_t itd; 68 struct ohci_soft_itd *nextitd; /* mirrors nexttd in ITD */ 69 struct ohci_soft_itd *dnext; /* next in done list */ 70 ohci_physaddr_t physaddr; 71 LIST_ENTRY(ohci_soft_itd) hnext; 72 usbd_xfer_handle xfer; 73 u_int16_t flags; 74 #ifdef DIAGNOSTIC 75 char isdone; 76 #endif 77 } ohci_soft_itd_t; 78 #define OHCI_SITD_SIZE ((sizeof (struct ohci_soft_itd) + OHCI_ITD_ALIGN - 1) / OHCI_ITD_ALIGN * OHCI_ITD_ALIGN) 79 #define OHCI_SITD_CHUNK 64 80 81 82 #define OHCI_NO_EDS (2*OHCI_NO_INTRS-1) 83 84 #define OHCI_HASH_SIZE 128 85 86 typedef struct ohci_softc { 87 struct usbd_bus sc_bus; /* base device */ 88 bus_space_tag_t iot; 89 bus_space_handle_t ioh; 90 bus_size_t sc_size; 91 92 usb_dma_t sc_hccadma; 93 struct ohci_hcca *sc_hcca; 94 ohci_soft_ed_t *sc_eds[OHCI_NO_EDS]; 95 u_int sc_bws[OHCI_NO_INTRS]; 96 97 u_int32_t sc_eintrs; 98 ohci_soft_ed_t *sc_isoc_head; 99 ohci_soft_ed_t *sc_ctrl_head; 100 ohci_soft_ed_t *sc_bulk_head; 101 102 LIST_HEAD(, ohci_soft_td) sc_hash_tds[OHCI_HASH_SIZE]; 103 LIST_HEAD(, ohci_soft_itd) sc_hash_itds[OHCI_HASH_SIZE]; 104 105 int sc_noport; 106 u_int8_t sc_addr; /* device address */ 107 u_int8_t sc_conf; /* device configuration */ 108 char sc_softwake; 109 110 ohci_soft_ed_t *sc_freeeds; 111 ohci_soft_td_t *sc_freetds; 112 ohci_soft_itd_t *sc_freeitds; 113 114 SIMPLEQ_HEAD(, usbd_xfer) sc_free_xfers; /* free xfers */ 115 116 usbd_xfer_handle sc_intrxfer; 117 118 ohci_soft_itd_t *sc_sidone; 119 ohci_soft_td_t *sc_sdone; 120 121 char sc_vendor[16]; 122 int sc_id_vendor; 123 124 #if defined(__NetBSD__) || defined(__OpenBSD__) 125 void *sc_powerhook; /* cookie from power hook */ 126 void *sc_shutdownhook; /* cookie from shutdown hook */ 127 #endif 128 u_int32_t sc_control; /* Preserved during suspend/standby */ 129 u_int32_t sc_intre; 130 131 u_int sc_overrun_cnt; 132 struct timeval sc_overrun_ntc; 133 134 usb_callout_t sc_tmo_rhsc; 135 136 device_ptr_t sc_child; 137 138 char sc_dying; 139 } ohci_softc_t; 140 141 struct ohci_xfer { 142 struct usbd_xfer xfer; 143 struct usb_task abort_task; 144 }; 145 146 #define OXFER(xfer) ((struct ehci_xfer *)(xfer)) 147 148 usbd_status ohci_init(ohci_softc_t *); 149 int ohci_intr(void *); 150 #if defined(__NetBSD__) || defined(__OpenBSD__) 151 int ohci_detach(ohci_softc_t *, int); 152 int ohci_activate(device_ptr_t, enum devact); 153 #endif 154 155 #define MS_TO_TICKS(ms) ((ms) * hz / 1000) 156