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 30extern "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 */ 45typedef 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 97typedef 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 */ 120typedef 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 216typedef 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 */ 245