xref: /onnv-gate/usr/src/uts/common/sys/usb/hwa/hwahc/hwahc.h (revision 9430:637732b28916)
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