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