1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 /* 22 * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 23 * Use is subject to license terms. 24 */ 25 26 #ifndef _SYS_USB_HWAHC_H 27 #define _SYS_USB_HWAHC_H 28 29 #ifdef __cplusplus 30 extern "C" { 31 #endif 32 33 34 #include <sys/usb/usba/wa.h> 35 #include <sys/usb/hubd/hub.h> 36 #include <sys/usb/hubd/hubdvar.h> 37 #include <sys/usb/usba/hcdi.h> 38 #include <sys/usb/usba/whcdi.h> 39 #include <sys/disp.h> 40 #include <sys/sunldi.h> 41 42 /* 43 * Power Management support 44 */ 45 typedef struct hwahc_power { 46 void *hwahc_state; /* points back to hwahc_state */ 47 uint8_t hwahc_pwr_states; /* bit mask of device pwr states */ 48 int hwahc_pm_busy; /* device busy counting */ 49 uint8_t hwahc_wakeup_enabled; 50 51 /* wakeup and power transistion capabilites of an interface */ 52 uint8_t hwahc_pm_capabilities; 53 54 /* current power level the device is in */ 55 uint8_t hwahc_current_power; 56 } hwahc_power_t; 57 58 _NOTE(DATA_READABLE_WITHOUT_LOCK(hwahc_power_t::hwahc_wakeup_enabled)) 59 60 /* softstate init state */ 61 #define HWAHC_LOCK_INITED 0x0001 62 #define HWAHC_HUBDI_REGISTERED 0x0002 63 #define HWAHC_MINOR_NODE_CREATED 0x0004 64 #define HWAHC_EVENTS_REGISTERED 0x0010 65 #define HWAHC_HUBREG 0x0020 66 #define HWAHC_WA_INITED 0x0040 67 #define HWAHC_HCDI_REGISTERED 0x0080 68 #define HWAHC_HC_INITED 0x0400 69 #define HWAHC_WA_STARTED 0x0800 70 71 /* hardware operation state */ 72 #define HWAHC_HW_STOPPED 0 73 #define HWAHC_HW_STARTED 1 74 #define HWAHC_HW_CH_STOPPED 2 75 #define HWAHC_HW_CH_SUSPEND 3 76 77 /* Tracking events registered by children */ 78 #define HWAHC_CHILD_EVENT_DISCONNECT 0x01 79 #define HWAHC_CHILD_EVENT_PRESUSPEND 0x02 80 81 /* Host controller software states */ 82 #define HWAHC_CTRL_INIT_STATE 0 /* Initialization state */ 83 #define HWAHC_CTRL_SUSPEND_STATE 1 /* Suspend state */ 84 #define HWAHC_CTRL_OPERATIONAL_STATE 2 /* Operational state */ 85 #define HWAHC_CTRL_ERROR_STATE 3 /* Error state */ 86 87 /* Host controller pipe states */ 88 #define HWAHC_PIPE_STATE_IDLE 1 /* Pipe is in ready state */ 89 #define HWAHC_PIPE_STATE_ACTIVE 2 /* Pipe is in busy state */ 90 #define HWAHC_PIPE_STATE_ERROR 3 /* Pipe is in error state */ 91 92 /* Additional pipe states for the hwahc_pipe_cleanup */ 93 #define HWAHC_PIPE_STATE_CLOSE 4 /* Pipe close */ 94 #define HWAHC_PIPE_STATE_RESET 5 /* Pipe reset */ 95 #define HWAHC_PIPE_STATE_STOP_POLLING 6 /* Pipe stop polling */ 96 97 typedef struct hwahc_pipe_private { 98 usba_pipe_handle_data_t *pp_pipe_handle; 99 uint_t pp_state; 100 usb_pipe_policy_t pp_policy; 101 wusb_wa_rpipe_hdl_t *pp_rp; 102 wusb_dev_info_t *pp_wdev; /* parent device */ 103 104 /* 105 * To support Intr/Isoc IN polling. 106 * Save the original client's request 107 */ 108 usb_opaque_t pp_client_periodic_in_reqp; 109 kcondvar_t pp_xfer_cmpl_cv; 110 } hwahc_pipe_private_t; 111 112 _NOTE(DATA_READABLE_WITHOUT_LOCK(hwahc_pipe_private_t::pp_pipe_handle)) 113 _NOTE(DATA_READABLE_WITHOUT_LOCK(hwahc_pipe_private_t::pp_rp)) 114 _NOTE(DATA_READABLE_WITHOUT_LOCK( 115 hwahc_pipe_private_t::pp_client_periodic_in_reqp)) 116 117 /* 118 * Softstate structure 119 */ 120 typedef struct hwahc_state { 121 int hwahc_instance; 122 uint_t hwahc_flags; 123 uint_t hwahc_dev_state; /* USB device states */ 124 usb_log_handle_t hwahc_log_handle; 125 126 hwahc_power_t *hwahc_pm; 127 dev_info_t *hwahc_dip; /* device info handle */ 128 129 /* mutex to protect softstate and hw regs */ 130 kmutex_t hwahc_mutex; 131 132 hubd_t *hwahc_hubd; 133 int hwahc_hw_state; /* hc start flag */ 134 uint_t hwahc_open_count; 135 136 int hwahc_hc_soft_state; /* driver states. */ 137 138 /* default pipe handle as a usba client device */ 139 usb_pipe_handle_t hwahc_default_pipe; 140 141 uint_t hwahc_open_pipe_count; 142 143 /* wire adapter common data */ 144 wusb_wa_data_t hwahc_wa_data; 145 wusb_secrt_data_t hwahc_secrt_data; 146 147 /* WUSB HC common data. hold HC and children info */ 148 wusb_hc_data_t hwahc_hc_data; 149 150 /* for DN notification */ 151 usba_list_entry_t hwahc_dn_notif_queue; 152 kthread_t *hwahc_notif_thread_id; 153 154 /* for transfer result notification */ 155 kthread_t *hwahc_result_thread_id; 156 kcondvar_t hwahc_result_thread_cv; 157 158 int8_t hwahc_bus_pwr; /* bus power event count */ 159 160 /* track event registration of children */ 161 uint8_t hwahc_child_events[128]; 162 163 ndi_event_hdl_t hwahc_ndi_event_hdl; 164 165 usb_client_dev_data_t *hwahc_dev_data; /* registration data */ 166 usba_hcdi_ops_t *hwahc_hcdi_ops; /* HCDI structure */ 167 168 } hwahc_state_t; 169 170 /* warlock directives */ 171 _NOTE(MUTEX_PROTECTS_DATA(hwahc_state_t::hwahc_mutex, hwahc_state_t)) 172 _NOTE(MUTEX_PROTECTS_DATA(hwahc_state_t::hwahc_mutex, hwahc_pipe_private_t)) 173 _NOTE(MUTEX_PROTECTS_DATA(hwahc_state_t::hwahc_mutex, 174 hwahc_pipe_private_t::pp_state)) 175 _NOTE(MUTEX_PROTECTS_DATA(hwahc_state_t::hwahc_mutex, hwahc_power_t)) 176 177 _NOTE(DATA_READABLE_WITHOUT_LOCK(hwahc_state_t::hwahc_log_handle)) 178 _NOTE(DATA_READABLE_WITHOUT_LOCK(hwahc_state_t::hwahc_wa_data)) 179 _NOTE(DATA_READABLE_WITHOUT_LOCK(hwahc_state_t::hwahc_dip)) 180 _NOTE(DATA_READABLE_WITHOUT_LOCK(hwahc_state_t::hwahc_default_pipe)) 181 _NOTE(DATA_READABLE_WITHOUT_LOCK(hwahc_state_t::hwahc_ndi_event_hdl)) 182 _NOTE(DATA_READABLE_WITHOUT_LOCK(hwahc_state_t::hwahc_pm 183 hwahc_state_t::hwahc_hubd)) 184 185 _NOTE(SCHEME_PROTECTS_DATA("stable data", usb_ep_comp_descr)) 186 _NOTE(SCHEME_PROTECTS_DATA("stable data", usba_device_t)) 187 188 /* Debug masks */ 189 #define PRINT_MASK_ATTA 0x00000001 /* Attach time */ 190 #define PRINT_MASK_RPIPES 0x00000002 /* Rpipe management */ 191 #define PRINT_MASK_HUB 0x00000004 /* Hub related stuff */ 192 #define PRINT_MASK_EVENTS 0x00000008 /* Intr notification */ 193 #define PRINT_MASK_SECURITY 0x00000020 /* Security info */ 194 #define PRINT_MASK_CBOPS 0x00000040 /* CB-OPS */ 195 #define PRINT_MASK_HCDI 0x00000080 /* HCDI entry points */ 196 #define PRINT_MASK_DUMPING 0x00000100 /* Dump hwa info */ 197 #define PRINT_MASK_OPEN 0x00000200 /* Open time */ 198 #define PRINT_MASK_CLOSE 0x00000400 /* Close time */ 199 #define PRINT_MASK_PM 0x00000800 /* For pwr mgmt */ 200 #define PRINT_MASK_ALL 0xFFFFFFFF 201 202 #define HWAHC_MINOR_HUB_BITS_MASK 0xff 203 #define HWAHC_MINOR_INSTANCE_MASK ~HWAHC_MINOR_HUB_BITS_MASK 204 #define HWAHC_MINOR_INSTANCE_SHIFT 8 205 206 #define HWAHC_MINOR_TO_INSTANCE(minor) \ 207 (((minor) & HWAHC_MINOR_INSTANCE_MASK) >> \ 208 HWAHC_MINOR_INSTANCE_SHIFT) 209 210 #define HWAHC_CONSTRUCT_MINOR(inst) \ 211 (inst << HWAHC_MINOR_INSTANCE_SHIFT) 212 213 /* base of MAC layer dev address for HWA class device */ 214 #define HWAHC_DEV_ADDR_BASE 0xA100 215 216 typedef struct hwahc_dn_notif_list { 217 hwa_notif_dn_recvd_t *dn_notif; 218 usba_list_entry_t notif_list; 219 } hwahc_dn_notif_list_t; 220 221 _NOTE(MUTEX_PROTECTS_DATA(hwahc_state_t::hwahc_mutex, hwahc_dn_notif_list_t)) 222 223 /* max elements in notification queue */ 224 #define HWAHC_MAX_NOTIF 100 225 226 /* notification queue drain timeout - 60sec */ 227 #define HWAHC_NOTIF_DRAIN_TIMEOUT 60 228 229 /* 230 * cfgadm state values 231 */ 232 #define HWAHC_CFGADM_NORMAL 0 /* normal state */ 233 #define HWAHC_CFGADM_DISCONNECTED 1 /* logically disconnected */ 234 #define HWAHC_CFGADM_UNCONFIGURED 2 /* port is unconfigured */ 235 #define HWAHC_CFGADM_EMPTY 3 /* port is empty */ 236 #define HWAHC_CFGADM_STILL_REFERENCED 4 /* ndi_devi_offline failed */ 237 #define HWAHC_CFGADM_CONFIGURED 5 /* port is configured */ 238 #define HWAHC_CFGADM_INVALID 0xFF /* invalid state */ 239 240 #ifdef __cplusplus 241 } 242 #endif 243 244 #endif /* _SYS_USB_HWAHC_H */