1 /* $NetBSD: ohcivar.h,v 1.49 2010/11/03 22:34:23 dyoung 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 * 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 34 typedef struct ohci_soft_ed { 35 ohci_ed_t ed; 36 struct ohci_soft_ed *next; 37 ohci_physaddr_t physaddr; 38 usb_dma_t dma; 39 int offs; 40 } ohci_soft_ed_t; 41 #define OHCI_SED_SIZE ((sizeof (struct ohci_soft_ed) + OHCI_ED_ALIGN - 1) / OHCI_ED_ALIGN * OHCI_ED_ALIGN) 42 #define OHCI_SED_CHUNK 128 43 44 45 typedef struct ohci_soft_td { 46 ohci_td_t td; 47 struct ohci_soft_td *nexttd; /* mirrors nexttd in TD */ 48 struct ohci_soft_td *dnext; /* next in done list */ 49 ohci_physaddr_t physaddr; 50 usb_dma_t dma; 51 int offs; 52 LIST_ENTRY(ohci_soft_td) hnext; 53 usbd_xfer_handle xfer; 54 u_int16_t len; 55 u_int16_t flags; 56 #define OHCI_CALL_DONE 0x0001 57 #define OHCI_ADD_LEN 0x0002 58 } ohci_soft_td_t; 59 #define OHCI_STD_SIZE ((sizeof (struct ohci_soft_td) + OHCI_TD_ALIGN - 1) / OHCI_TD_ALIGN * OHCI_TD_ALIGN) 60 #define OHCI_STD_CHUNK 128 61 62 63 typedef struct ohci_soft_itd { 64 ohci_itd_t itd; 65 struct ohci_soft_itd *nextitd; /* mirrors nexttd in ITD */ 66 struct ohci_soft_itd *dnext; /* next in done list */ 67 ohci_physaddr_t physaddr; 68 usb_dma_t dma; 69 int offs; 70 LIST_ENTRY(ohci_soft_itd) hnext; 71 usbd_xfer_handle xfer; 72 u_int16_t flags; 73 char isdone; /* used only when DIAGNOSTIC is defined */ 74 } ohci_soft_itd_t; 75 #define OHCI_SITD_SIZE ((sizeof (struct ohci_soft_itd) + OHCI_ITD_ALIGN - 1) / OHCI_ITD_ALIGN * OHCI_ITD_ALIGN) 76 #define OHCI_SITD_CHUNK 64 77 78 79 #define OHCI_NO_EDS (2*OHCI_NO_INTRS-1) 80 81 #define OHCI_HASH_SIZE 128 82 83 typedef struct ohci_softc { 84 device_t sc_dev; 85 struct usbd_bus sc_bus; 86 bus_space_tag_t iot; 87 bus_space_handle_t ioh; 88 bus_size_t sc_size; 89 90 usb_dma_t sc_hccadma; 91 struct ohci_hcca *sc_hcca; 92 ohci_soft_ed_t *sc_eds[OHCI_NO_EDS]; 93 u_int sc_bws[OHCI_NO_INTRS]; 94 95 u_int32_t sc_eintrs; 96 ohci_soft_ed_t *sc_isoc_head; 97 ohci_soft_ed_t *sc_ctrl_head; 98 ohci_soft_ed_t *sc_bulk_head; 99 100 LIST_HEAD(, ohci_soft_td) sc_hash_tds[OHCI_HASH_SIZE]; 101 LIST_HEAD(, ohci_soft_itd) sc_hash_itds[OHCI_HASH_SIZE]; 102 103 int sc_noport; 104 u_int8_t sc_addr; /* device address */ 105 u_int8_t sc_conf; /* device configuration */ 106 107 int sc_endian; 108 #define OHCI_LITTLE_ENDIAN 0 /* typical (uninitialized default) */ 109 #define OHCI_BIG_ENDIAN 1 /* big endian OHCI? never seen it */ 110 #define OHCI_HOST_ENDIAN 2 /* if OHCI always matches CPU */ 111 112 #ifdef USB_USE_SOFTINTR 113 char sc_softwake; 114 #endif /* USB_USE_SOFTINTR */ 115 116 ohci_soft_ed_t *sc_freeeds; 117 ohci_soft_td_t *sc_freetds; 118 ohci_soft_itd_t *sc_freeitds; 119 120 SIMPLEQ_HEAD(, usbd_xfer) sc_free_xfers; /* free xfers */ 121 122 usbd_xfer_handle sc_intrxfer; 123 124 char sc_vendor[32]; 125 int sc_id_vendor; 126 127 u_int32_t sc_control; /* Preserved during suspend/standby */ 128 u_int32_t sc_intre; 129 130 u_int sc_overrun_cnt; 131 struct timeval sc_overrun_ntc; 132 133 struct callout sc_tmo_rhsc; 134 device_t sc_child; 135 char sc_dying; 136 struct usb_dma_reserve sc_dma_reserve; 137 } ohci_softc_t; 138 139 struct ohci_xfer { 140 struct usbd_xfer xfer; 141 struct usb_task abort_task; 142 }; 143 144 usbd_status ohci_init(ohci_softc_t *); 145 int ohci_intr(void *); 146 int ohci_detach(ohci_softc_t *, int); 147 bool ohci_shutdown(device_t, int); 148 void ohci_childdet(device_t, device_t); 149 int ohci_activate(device_t, enum devact); 150 bool ohci_resume(device_t, const pmf_qual_t *); 151 bool ohci_suspend(device_t, const pmf_qual_t *); 152