xref: /illumos-gate/usr/src/uts/common/sys/usb/hcd/ehci/ehcid.h (revision 4a7ceb24cfcc0a97f96d86cfe5852ae445b50e57)
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 2008 Sun Microsystems, Inc.  All rights reserved.
23  * Use is subject to license terms.
24  */
25 
26 #ifndef _SYS_USB_EHCID_H
27 #define	_SYS_USB_EHCID_H
28 
29 #pragma ident	"%Z%%M%	%I%	%E% SMI"
30 
31 #ifdef	__cplusplus
32 extern "C" {
33 #endif
34 
35 /*
36  * Enchanced Host Controller Driver (EHCI)
37  *
38  * The EHCI driver is a software driver which interfaces to the Universal
39  * Serial Bus layer (USBA) and the Host Controller (HC). The interface to
40  * the Host Controller is defined by the EHCI Host Controller Interface.
41  *
42  * This header file describes the data structures and function prototypes
43  * required for the EHCI Driver to maintain state of Host Controller (HC),
44  * to perform different USB transfers and for the bandwidth allocations.
45  */
46 
47 #include <sys/usb/hcd/ehci/ehci.h>
48 #include <sys/usb/hcd/ehci/ehci_hub.h>
49 
50 
51 /*
52  * EHCI Bandwidth Maintainence Structure.
53  *
54  * The ehci_bandwidth array keeps track of allocated bandwidth for ehci
55  * host controller. There are 32 bandwidth lists corresponding to 32 ms
56  * periodic frame lists.  Each bandwidth list inturn will contain eight
57  * micro frame bandwidth lists.
58  */
59 #define	EHCI_MAX_UFRAMES	8	/* Max uframes 125us per frame */
60 
61 typedef struct ehci_frame_bandwidth {
62 	uint_t			ehci_allocated_frame_bandwidth;
63 	uint_t			ehci_micro_frame_bandwidth[EHCI_MAX_UFRAMES];
64 } ehci_frame_bandwidth_t;
65 
66 
67 /*
68  * EHCI Host Controller state structure
69  *
70  * The Host Controller Driver (HCD) maintains the state of Host Controller
71  * (HC). There is an ehci_state structure per instance	of the EHCI
72  * host controller.
73  */
74 typedef struct ehci_state {
75 	dev_info_t		*ehci_dip;		/* Dip of HC */
76 	uint_t			ehci_instance;
77 	usba_hcdi_ops_t		*ehci_hcdi_ops;		/* HCDI structure */
78 	uint_t			ehci_flags;		/* Used for cleanup */
79 	uint16_t		ehci_vendor_id;		/* chip vendor */
80 	uint16_t		ehci_device_id;		/* chip device */
81 	uint8_t			ehci_rev_id;		/* chip revison */
82 
83 	ddi_acc_handle_t	ehci_caps_handle;	/* Caps Reg Handle */
84 	ehci_caps_t		*ehci_capsp;		/* Capability Regs */
85 	ehci_regs_t		*ehci_regsp;		/* Operational Regs */
86 
87 	ddi_acc_handle_t	ehci_config_handle;	/* Config space hndle */
88 	uint_t			ehci_frame_interval;	/* Frme inter reg */
89 	ddi_dma_attr_t		ehci_dma_attr;		/* DMA attributes */
90 
91 	ddi_intr_handle_t	*ehci_htable;		/* intr handle */
92 	int			ehci_intr_type;		/* intr type used */
93 	int			ehci_intr_cnt;		/* # of intrs inuse */
94 	uint_t			ehci_intr_pri;		/* intr priority */
95 	int			ehci_intr_cap;		/* intr capabilities */
96 	boolean_t		ehci_msi_enabled;	/* default to true */
97 	kmutex_t		ehci_int_mutex;		/* Global EHCI mutex */
98 
99 	/* Periodic Frame List area */
100 	ehci_periodic_frame_list_t	*ehci_periodic_frame_list_tablep;
101 				/* Virtual Periodic Frame List ptr */
102 	ddi_dma_cookie_t	ehci_pflt_cookie;	/* DMA cookie */
103 	ddi_dma_handle_t	ehci_pflt_dma_handle;	/* DMA handle */
104 	ddi_acc_handle_t	ehci_pflt_mem_handle;	/* Memory handle */
105 
106 	/*
107 	 * There are two pools of memory. One pool contains the memory for
108 	 * the transfer descriptors and other pool contains the memory for
109 	 * the endpoint descriptors. The advantage of the pools is that it's
110 	 * easy to go back and forth between the iommu and the cpu addresses.
111 	 *
112 	 * The pools are protected by the ehci_int_mutex because the memory
113 	 * in the pools may be accessed by either the host controller or the
114 	 * host controller driver.
115 	 */
116 
117 	/* Endpoint descriptor pool */
118 	ehci_qh_t		*ehci_qh_pool_addr;	/* Start of the pool */
119 	ddi_dma_cookie_t	ehci_qh_pool_cookie;	/* DMA cookie */
120 	ddi_dma_handle_t	ehci_qh_pool_dma_handle;	/* DMA handle */
121 	ddi_acc_handle_t	ehci_qh_pool_mem_handle;	/* Mem handle */
122 	uint_t			ehci_dma_addr_bind_flag;	/* DMA flag */
123 
124 	/* General transfer descriptor pool */
125 	ehci_qtd_t		*ehci_qtd_pool_addr;	/* Start of the pool */
126 	ddi_dma_cookie_t	ehci_qtd_pool_cookie;	/* DMA cookie */
127 	ddi_dma_handle_t	ehci_qtd_pool_dma_handle;	/* DMA hndle */
128 	ddi_acc_handle_t	ehci_qtd_pool_mem_handle;	/* Mem hndle */
129 
130 	/* Isochronous transfer descriptor pool */
131 	ehci_itd_t		*ehci_itd_pool_addr;	/* Start of the pool */
132 	ddi_dma_cookie_t	ehci_itd_pool_cookie;	/* DMA cookie */
133 	ddi_dma_handle_t	ehci_itd_pool_dma_handle;	/* DMA hndle */
134 	ddi_acc_handle_t	ehci_itd_pool_mem_handle;	/* Mem hndle */
135 
136 	/* Condition variable for advance on Asynchronous Schedule */
137 	kcondvar_t		ehci_async_schedule_advance_cv;
138 
139 	/* Head of Asynchronous Schedule List */
140 	ehci_qh_t		*ehci_head_of_async_sched_list;
141 
142 	/*
143 	 * List of QTD inserted either into Asynchronous or Periodic
144 	 * Schedule lists.
145 	 */
146 	ehci_qtd_t		*ehci_active_qtd_list;
147 	/*
148 	 * List of ITD active itd list.
149 	 */
150 	ehci_itd_t		*ehci_active_itd_list;
151 
152 	/*
153 	 * Bandwidth fields
154 	 *
155 	 * The ehci_bandwidth array keeps track of allocated bandwidth for
156 	 * ehci host controller. There are 32 bandwidth lists corresponding
157 	 * to 32 ms periodic frame lists. Each bandwidth list in turn will
158 	 * contain eight micro frame bandwidth lists.
159 	 *
160 	 * ehci_min_frame_bandwidth field indicates least allocated milli
161 	 * second bandwidth list.
162 	 */
163 	ehci_frame_bandwidth_t	ehci_frame_bandwidth[EHCI_NUM_INTR_QH_LISTS];
164 
165 	/* No. of open pipes, async qh, and periodic qh */
166 	uint_t			ehci_open_pipe_count;
167 	uint_t			ehci_open_async_count;
168 	uint_t			ehci_open_periodic_count;
169 
170 	/*
171 	 * Endpoint Reclamation List
172 	 *
173 	 * The interrupt list processing cannot be stopped when a periodic
174 	 * endpoint is removed from the list.  The endpoints are detached
175 	 * from the interrupt lattice tree and put on to the reclaimation
176 	 * list. On next SOF interrupt all those endpoints,  which are on
177 	 * the reclaimation list will be deallocated.
178 	 */
179 	ehci_qh_t		*ehci_reclaim_list;	/* Reclaimation list */
180 
181 	ehci_root_hub_t		ehci_root_hub;		/* Root hub info */
182 
183 	/* Frame number overflow information */
184 	usb_frame_number_t	ehci_fno;
185 
186 	/* For host controller error counter */
187 	uint_t			ehci_hc_error;
188 
189 	/*
190 	 * ehci_missed_intr_sts is used to save the normal mode interrupt
191 	 * status information  if an interrupt is pending for normal mode
192 	 * when polled code is entered.
193 	 */
194 	uint_t			ehci_missed_intr_sts;
195 
196 	/*
197 	 * Saved copy of the ehci registers of the normal mode & change
198 	 * required ehci registers values for the polled mode operation.
199 	 * Before returning from the polled mode to normal mode replace
200 	 * the required current registers with this saved ehci registers
201 	 * copy.
202 	 */
203 	ehci_regs_t	ehci_polled_save_regs;
204 
205 	/*
206 	 * Saved copy of the interrupt table used in normal ehci mode and
207 	 * replace this table by another interrupt table that used in the
208 	 * POLLED mode.
209 	 */
210 	ehci_qh_t *ehci_polled_frame_list_table[EHCI_NUM_PERIODIC_FRAME_LISTS];
211 
212 	/* ehci polled mode enter counter */
213 	uint_t			ehci_polled_enter_count;
214 
215 	/*
216 	 * counter for polled mode and used in suspend mode to see if
217 	 * there is a keyboard connected.
218 	 */
219 	uint_t			ehci_polled_kbd_count;
220 
221 	/* counter for polled read and use it to clean the interrupt status */
222 	uint_t			ehci_polled_read_count;
223 
224 #if defined(__x86)
225 	/* counter for polled root hub status */
226 	uint_t			ehci_polled_root_hub_count;
227 #endif	/* __x86 */
228 
229 	/* EHCI Host Controller Software State information */
230 	uint_t			ehci_hc_soft_state;
231 
232 	/* Log handle for debug, console, log messages */
233 	usb_log_handle_t	ehci_log_hdl;
234 
235 	/* Kstat structures */
236 	kstat_t			*ehci_intrs_stats;
237 	kstat_t			*ehci_total_stats;
238 	kstat_t			*ehci_count_stats[USB_N_COUNT_KSTATS];
239 } ehci_state_t;
240 
241 typedef struct ehci_intrs_stats {
242 	struct kstat_named	ehci_sts_async_sched_status;
243 	struct kstat_named	ehci_sts_periodic_sched_status;
244 	struct kstat_named	ehci_sts_empty_async_schedule;
245 	struct kstat_named	ehci_sts_host_ctrl_halted;
246 	struct kstat_named	ehci_sts_async_advance_intr;
247 	struct kstat_named	ehci_sts_host_system_error_intr;
248 	struct kstat_named	ehci_sts_frm_list_rollover_intr;
249 	struct kstat_named	ehci_sts_rh_port_change_intr;
250 	struct kstat_named	ehci_sts_usb_error_intr;
251 	struct kstat_named	ehci_sts_usb_intr;
252 	struct kstat_named	ehci_sts_not_claimed;
253 	struct kstat_named	ehci_sts_total;
254 } ehci_intrs_stats_t;
255 
256 /*
257  * ehci kstat defines
258  */
259 #define	EHCI_INTRS_STATS(ehci)	((ehci)->ehci_intrs_stats)
260 #define	EHCI_INTRS_STATS_DATA(ehci)	\
261 	((ehci_intrs_stats_t *)EHCI_INTRS_STATS((ehci))->ks_data)
262 
263 #define	EHCI_TOTAL_STATS(ehci)	((ehci)->ehci_total_stats)
264 #define	EHCI_TOTAL_STATS_DATA(ehci)	(KSTAT_IO_PTR((ehci)->ehci_total_stats))
265 #define	EHCI_CTRL_STATS(ehci)	\
266 	(KSTAT_IO_PTR((ehci)->ehci_count_stats[USB_EP_ATTR_CONTROL]))
267 #define	EHCI_BULK_STATS(ehci)	\
268 	(KSTAT_IO_PTR((ehci)->ehci_count_stats[USB_EP_ATTR_BULK]))
269 #define	EHCI_INTR_STATS(ehci)	\
270 	(KSTAT_IO_PTR((ehci)->ehci_count_stats[USB_EP_ATTR_INTR]))
271 #define	EHCI_ISOC_STATS(ehci)	\
272 	(KSTAT_IO_PTR((ehci)->ehci_count_stats[USB_EP_ATTR_ISOCH]))
273 
274 /* warlock directives, stable data */
275 _NOTE(MUTEX_PROTECTS_DATA(ehci_state_t::ehci_int_mutex, ehci_state_t))
276 _NOTE(DATA_READABLE_WITHOUT_LOCK(ehci_state_t::ehci_intr_pri))
277 _NOTE(DATA_READABLE_WITHOUT_LOCK(ehci_state_t::ehci_dip))
278 _NOTE(DATA_READABLE_WITHOUT_LOCK(ehci_state_t::ehci_regsp))
279 _NOTE(DATA_READABLE_WITHOUT_LOCK(ehci_state_t::ehci_instance))
280 _NOTE(DATA_READABLE_WITHOUT_LOCK(ehci_state_t::ehci_vendor_id))
281 _NOTE(DATA_READABLE_WITHOUT_LOCK(ehci_state_t::ehci_device_id))
282 _NOTE(DATA_READABLE_WITHOUT_LOCK(ehci_state_t::ehci_rev_id))
283 
284 /* this may not be stable data in the future */
285 _NOTE(DATA_READABLE_WITHOUT_LOCK(ehci_state_t::ehci_qtd_pool_addr))
286 _NOTE(DATA_READABLE_WITHOUT_LOCK(ehci_state_t::ehci_qtd_pool_mem_handle))
287 _NOTE(DATA_READABLE_WITHOUT_LOCK(ehci_state_t::ehci_qtd_pool_cookie))
288 _NOTE(DATA_READABLE_WITHOUT_LOCK(ehci_state_t::ehci_qh_pool_addr))
289 _NOTE(DATA_READABLE_WITHOUT_LOCK(ehci_state_t::ehci_qh_pool_mem_handle))
290 _NOTE(DATA_READABLE_WITHOUT_LOCK(ehci_state_t::ehci_qh_pool_cookie))
291 _NOTE(DATA_READABLE_WITHOUT_LOCK(ehci_state_t::ehci_itd_pool_addr))
292 _NOTE(DATA_READABLE_WITHOUT_LOCK(ehci_state_t::ehci_itd_pool_mem_handle))
293 _NOTE(DATA_READABLE_WITHOUT_LOCK(ehci_state_t::ehci_itd_pool_cookie))
294 _NOTE(DATA_READABLE_WITHOUT_LOCK(ehci_state_t::ehci_dma_addr_bind_flag))
295 _NOTE(DATA_READABLE_WITHOUT_LOCK(ehci_state_t::ehci_log_hdl))
296 
297 _NOTE(LOCK_ORDER(ehci_state::ehci_int_mutex \
298 		usba_pipe_handle_data::p_mutex \
299 		usba_device::usb_mutex \
300 		usba_ph_impl::usba_ph_mutex))
301 
302 /*
303  * Host Contoller Software States
304  *
305  * EHCI_CTLR_INIT_STATE:
306  *	The host controller soft state will be set to this during the
307  *	ehci_attach.
308  *
309  * EHCI_CTLR_SUSPEND_STATE:
310  *	The host controller soft state will be set to this during the
311  *	ehci_cpr_suspend.
312  *
313  * EHCI_CTLR_OPERATIONAL_STATE:
314  *	The host controller soft state will be set to this after moving
315  *	host controller to operational state and host controller start
316  *	generating SOF successfully.
317  *
318  * EHCI_CTLR_ERROR_STATE:
319  *	The host controller soft state will be set to this during the
320  *	no SOF or UE error conditions.
321  *
322  *	Under this state or condition, only pipe stop polling, pipe reset
323  *	and pipe close are allowed. But all other entry points like  pipe
324  *	open, get/set pipe policy, cotrol send/receive, bulk send/receive
325  *	isoch send/receive, start polling etc. will fail.
326  *
327  * State Diagram for the host controller software state
328  *
329  *
330  * ehci_attach->[INIT_STATE]
331  *	|
332  *	|	-------->----[ERROR_STATE]--<-----------<---
333  *	|      |      Failure (UE/no SOF condition)	    |
334  *	|      ^					    ^
335  *	V      |      Success				    |
336  * ehci_init_ctlr--->--------[OPERATIONAL_STATE]------>-ehci_send/recv/polling
337  *	^					    |
338  *	|					    |
339  *	|					    V
340  *	-<-ehci_cpr_resume--[SUSPEND_STATE]-<-ehci_cpr_suspend
341  */
342 #define	EHCI_CTLR_INIT_STATE		0	/* Initilization state */
343 #define	EHCI_CTLR_SUSPEND_STATE		1	/* Suspend state */
344 #define	EHCI_CTLR_OPERATIONAL_STATE	2	/* Operational state */
345 #define	EHCI_CTLR_ERROR_STATE		3	/* Ue error or no sof state */
346 
347 /*
348  * Flags for initializatoin of host controller
349  */
350 #define	EHCI_NORMAL_INITIALIZATION	0	/* Normal initialization */
351 #define	EHCI_REINITIALIZATION		1	/* Re-initialization */
352 
353 /*
354  * Periodic and non-periodic macros
355  */
356 #define	EHCI_PERIODIC_ENDPOINT(endpoint) (((endpoint->bmAttributes &\
357 				USB_EP_ATTR_MASK) == USB_EP_ATTR_INTR) ||\
358 				((endpoint->bmAttributes &\
359 				USB_EP_ATTR_MASK) == USB_EP_ATTR_ISOCH))
360 
361 #define	EHCI_NON_PERIODIC_ENDPOINT(endpoint) (((endpoint->bmAttributes &\
362 				USB_EP_ATTR_MASK) == USB_EP_ATTR_CONTROL) ||\
363 				((endpoint->bmAttributes &\
364 				USB_EP_ATTR_MASK) == USB_EP_ATTR_BULK))
365 
366 #define	EHCI_ISOC_ENDPOINT(endpoint) (((endpoint->bmAttributes &\
367 				USB_EP_ATTR_MASK) == USB_EP_ATTR_ISOCH))
368 
369 #define	EHCI_INTR_ENDPOINT(endpoint) (((endpoint->bmAttributes &\
370 				USB_EP_ATTR_MASK) == USB_EP_ATTR_INTR))
371 
372 
373 /*
374  * EHCI QH and QTD Pool sizes.
375  */
376 #define	EHCI_QH_POOL_SIZE	100
377 #define	EHCI_QTD_POOL_SIZE	200
378 #define	EHCI_ITD_POOL_SIZE	200
379 
380 /*
381  * ehci_dma_addr_bind_flag values
382  *
383  * This flag indicates if the various DMA addresses allocated by the EHCI
384  * have been bound to their respective handles. This is needed to recover
385  * without errors from ehci_cleanup when it calls ddi_dma_unbind_handle()
386  */
387 #define	EHCI_QTD_POOL_BOUND	0x01	/* For QTD pools  */
388 #define	EHCI_QH_POOL_BOUND	0x02	/* For QH pools  */
389 #define	EHCI_PFLT_DMA_BOUND	0x04	/* For Periodic Frame List area */
390 #define	EHCI_ITD_POOL_BOUND	0x08	/* For QTD pools  */
391 
392 /*
393  * Maximum SOF wait count
394  */
395 #define	MAX_SOF_WAIT_COUNT	2	/* Wait for maximum SOF frames */
396 
397 /*
398  * One uFrame	125 micro seconds
399  * One Frame	1 milli second or 8 uFrames
400  */
401 #define	EHCI_uFRAMES_PER_USB_FRAME		8
402 #define	EHCI_uFRAMES_PER_USB_FRAME_SHIFT	3
403 
404 
405 /*
406  * Pipe private structure
407  *
408  * There is an instance of this structure per pipe.  This structure holds
409  * HCD specific pipe information.  A pointer to this structure is kept in
410  * the USBA pipe handle (usba_pipe_handle_data_t).
411  */
412 typedef struct ehci_pipe_private {
413 	usba_pipe_handle_data_t	*pp_pipe_handle;	/* Back ptr to handle */
414 	ehci_qh_t		*pp_qh;			/* Pipe's qh */
415 
416 	/* State of the pipe */
417 	uint_t			pp_state;		/* See below */
418 
419 	/* Local copy of the pipe policy */
420 	usb_pipe_policy_t	pp_policy;
421 
422 	/* For Periodic Pipes Only */
423 	uint_t			pp_pnode;		/* periodic node */
424 	uchar_t			pp_smask;		/* Start split mask */
425 	uchar_t			pp_cmask;		/* Comp split mask */
426 	uint_t			pp_cur_periodic_req_cnt; /* Curr req count */
427 	uint_t			pp_max_periodic_req_cnt; /* Max req count */
428 
429 	/* For Isochronous pipes only */
430 	usb_frame_number_t	pp_next_frame_number;	/* Next frame no */
431 
432 	/*
433 	 * Each pipe may have multiple transfer wrappers. Each transfer
434 	 * wrapper represents a USB transfer on the bus.  A transfer is
435 	 * made up of one or more transactions.
436 	 */
437 	struct ehci_trans_wrapper *pp_tw_head;	/* Head of the list */
438 	struct ehci_trans_wrapper *pp_tw_tail;	/* Tail of the list */
439 
440 	struct ehci_isoc_xwrapper *pp_itw_head;	/* Head of the list */
441 	struct ehci_isoc_xwrapper *pp_itw_tail;	/* Tail of the list */
442 
443 	/*
444 	 * Pipe's transfer timeout handling & this transfer timeout handling
445 	 * will be per pipe.
446 	 */
447 	struct ehci_trans_wrapper *pp_timeout_list;	/* Timeout list */
448 	timeout_id_t		pp_timer_id;		/* Timer id  */
449 
450 	/* Done td count */
451 	uint_t			pp_count_done_qtds;	/* Done td count */
452 
453 	/* Errors */
454 	usb_cr_t		pp_error;		/* Pipe error */
455 
456 	/* Condition variable for transfers completion event */
457 	kcondvar_t		pp_xfer_cmpl_cv;	/* Xfer completion */
458 
459 	/* Pipe flag */
460 	uint_t			pp_flag;		/* For polled mode */
461 
462 	/* Halting States */
463 	uint_t			pp_halt_state;		/* Is it halting */
464 
465 	/* Condition variable for halt completion event */
466 	kcondvar_t		pp_halt_cmpl_cv;	/* Xfer completion */
467 
468 	/*
469 	 * HCD gets Interrupt/Isochronous IN polling request only once and
470 	 * it has to insert next polling requests after completion of first
471 	 * request until either stop polling/pipe close is called. So  HCD
472 	 * has to take copy of the original Interrupt/Isochronous IN request.
473 	 */
474 	usb_opaque_t		pp_client_periodic_in_reqp;
475 } ehci_pipe_private_t;
476 
477 _NOTE(MUTEX_PROTECTS_DATA(ehci_state_t::ehci_int_mutex, ehci_pipe_private_t))
478 
479 /*
480  * Pipe states
481  *
482  * ehci pipe states will be similar to usba. Refer usbai.h.
483  */
484 #define	EHCI_PIPE_STATE_IDLE		1	/* Pipe is in ready state */
485 #define	EHCI_PIPE_STATE_ACTIVE		2	/* Pipe is in busy state */
486 #define	EHCI_PIPE_STATE_ERROR		3	/* Pipe is in error state */
487 
488 /* Additional ehci pipe states for the ehci_pipe_cleanup */
489 #define	EHCI_PIPE_STATE_CLOSE		4	/* Pipe close */
490 #define	EHCI_PIPE_STATE_RESET		5	/* Pipe reset */
491 #define	EHCI_PIPE_STATE_STOP_POLLING	6	/* Pipe stop polling */
492 
493 /*
494  * Pipe flag
495  *
496  * For polled mode flag.
497  */
498 #define	EHCI_POLLED_MODE_FLAG		1	/* Polled mode flag */
499 
500 /* Pipe specific flags */
501 #define	EHCI_ISOC_XFER_CONTINUE		1	/* For isoc transfers */
502 
503 /*
504  * Halting States
505  *  prevent halting from interleaving.
506  */
507 #define	EHCI_HALT_STATE_FREE		0	/* Pipe free to accept reqs */
508 #define	EHCI_HALT_STATE_HALTING		1	/* Currently Halting */
509 
510 /*
511  * Request values for Clear_TT_Buffer
512  */
513 #define	EHCI_CLEAR_TT_BUFFER_REQTYPE	(USB_DEV_REQ_TYPE_CLASS | \
514 					USB_DEV_REQ_RCPT_OTHER)
515 #define	EHCI_CLEAR_TT_BUFFER_BREQ	8
516 
517 /*
518  * USB frame offset
519  *
520  * Add appropriate frame offset to the current usb frame number and use it
521  * as a starting frame number for a given usb isochronous request.
522  */
523 #define	EHCI_FRAME_OFFSET		2	/* Frame offset */
524 
525 /*
526  * Different interrupt polling intervals supported for high speed
527  * devices and its range must be from 1 to 16 units. This value is
528  * used as th exponent for a 2 ^ (bInterval - 1). Ex: a Binterval
529  * of 4 means a period of 8us (2 ^ (4-1)).
530  *
531  * The following values are defined after above convertion in terms
532  * 125us units.
533  */
534 #define	EHCI_INTR_1US_POLL		1	/* 1us poll interval */
535 #define	EHCI_INTR_2US_POLL		2	/* 2us poll interval */
536 #define	EHCI_INTR_4US_POLL		4	/* 4us poll interval */
537 #define	EHCI_INTR_XUS_POLL		8	/* 8us and above */
538 
539 /*
540  * The following indecies are are used to calculate Start and complete
541  * masks as per the polling interval.
542  */
543 #define	EHCI_1US_MASK_INDEX		14	/* 1us mask index */
544 #define	EHCI_2US_MASK_INDEX		12	/* 2us mask index */
545 #define	EHCI_4US_MASK_INDEX		8	/* 4us mask index */
546 #define	EHCI_XUS_MASK_INDEX		0	/* 8us and above */
547 
548 /*
549  * Different interrupt polling intervals supported for low/full/high
550  * speed devices. For high speed devices, the following values are
551  * applicable after convertion.
552  */
553 #define	EHCI_INTR_1MS_POLL		1	/* 1ms poll interval */
554 #define	EHCI_INTR_2MS_POLL		2	/* 2ms poll interval */
555 #define	EHCI_INTR_4MS_POLL		4	/* 4ms poll interval */
556 #define	EHCI_INTR_8MS_POLL		8	/* 8ms poll interval */
557 #define	EHCI_INTR_16MS_POLL		16	/* 16ms poll interval */
558 #define	EHCI_INTR_32MS_POLL		32	/* 32ms poll interval */
559 
560 /*
561  * Number of interrupt transfer requests that should be maintained on
562  * the interrupt endpoint corresponding to different polling intervals
563  * supported.
564  */
565 #define	EHCI_INTR_1MS_REQS		4	/* 1ms polling interval */
566 #define	EHCI_INTR_2MS_REQS		2	/* 2ms polling interval */
567 #define	EHCI_INTR_XMS_REQS		1	/* Between 4ms and 32ms */
568 
569 /* Function prototype */
570 typedef void (*ehci_handler_function_t)(
571 	ehci_state_t			*ehcip,
572 	ehci_pipe_private_t		*pp,
573 	struct ehci_trans_wrapper	*tw,
574 	ehci_qtd_t			*qtd,
575 	void				*ehci_handle_callback_value);
576 
577 
578 /*
579  * Transfer wrapper
580  *
581  * The transfer wrapper represents a USB transfer on the bus and there
582  * is one instance per USB transfer.  A transfer is made up of one or
583  * more transactions. EHCI uses one QTD for one transaction. So one
584  * transfer wrapper may have one or more QTDs associated.
585  *
586  * The data to be transferred are contained in the TW buffer which is
587  * virtually contiguous but physically discontiguous. When preparing
588  * the QTDs for a USB transfer, the DMA cookies corresponding to the
589  * TW buffer need to be walked through to retrieve the DMA addresses.
590  *
591  * Control and bulk pipes will have one transfer wrapper per transfer
592  * and where as Isochronous and Interrupt pipes will only have one
593  * transfer wrapper. The transfers wrapper are continually reused for
594  * the Interrupt and Isochronous pipes as those pipes are polled.
595  */
596 typedef struct ehci_trans_wrapper {
597 	struct ehci_trans_wrapper	*tw_next;	/* Next wrapper */
598 	ehci_pipe_private_t		*tw_pipe_private; /* Back ptr */
599 	ddi_dma_handle_t		tw_dmahandle;	/* DMA handle */
600 	ddi_acc_handle_t		tw_accesshandle; /* Acc hndle */
601 	ddi_dma_cookie_t		tw_cookie;	/* DMA cookie */
602 	uint_t				tw_ncookies;	/* DMA cookie count */
603 	uint_t				tw_cookie_idx;	/* DMA cookie index */
604 	size_t				tw_dma_offs;	/* DMA buffer offset */
605 	uint32_t			tw_id;		/* 32bit ID */
606 	size_t				tw_length;	/* Txfer length */
607 	char				*tw_buf;	/* Buffer for Xfer */
608 	usb_flags_t			tw_flags;	/* Flags */
609 	uint_t				tw_num_qtds;	/* Number of QTDs */
610 	ehci_qtd_t			*tw_qtd_head;	/* Head QTD */
611 	ehci_qtd_t			*tw_qtd_tail;	/* Tail QTD */
612 	uint_t				tw_direction;	/* Direction of QTD */
613 
614 	/* Current transfer request pointer */
615 	usb_opaque_t			tw_curr_xfer_reqp;
616 
617 	/* Transfer timeout information */
618 	int				tw_timeout;	/* Timeout value */
619 	struct ehci_trans_wrapper	*tw_timeout_next; /* Xfer Timeout Q */
620 
621 	/*
622 	 * This is the function to call when this td is done. This way
623 	 * we don't have to look in the td to figure out what kind it is.
624 	 */
625 	ehci_handler_function_t		tw_handle_qtd;
626 
627 	/*
628 	 * This is the callback value used when processing a done td.
629 	 */
630 	usb_opaque_t			tw_handle_callback_value;
631 
632 	/* We preallocate all the td's for each tw and place them here */
633 	ehci_qtd_t			*tw_qtd_free_list;
634 	ehci_qtd_t			*tw_alt_qtd;
635 } ehci_trans_wrapper_t;
636 
637 _NOTE(MUTEX_PROTECTS_DATA(ehci_state_t::ehci_int_mutex, ehci_trans_wrapper))
638 
639 /*
640  * Isochronous Transfer Wrapper
641  *
642  * This transfer wrapper is built specifically for the LOW/FULL/HIGH speed
643  * isochronous transfers.  A transfer wrapper consists of one or more
644  * transactionsl, but there is one one instance per USB transfer request.
645  *
646  * The isochrnous transfer wrapper are continiously reused because these
647  * pipes are polled.
648  */
649 typedef struct ehci_isoc_xwrapper {
650 	struct ehci_isoc_xwrapper	*itw_next;	/* Next wrapper in pp */
651 	ehci_pipe_private_t		*itw_pipe_private;
652 
653 	/* DMA and memory pointers */
654 	ddi_dma_handle_t		itw_dmahandle;	/* DMA handle ETT */
655 	ddi_acc_handle_t		itw_accesshandle; /* Acc hndle */
656 	ddi_dma_cookie_t		itw_cookie;	/* DMA cookie */
657 
658 	/* Transfer information */
659 	char				*itw_buf;	/* Buffer for Xfer */
660 	size_t				itw_length;	/* Txfer length */
661 	usb_flags_t			itw_flags;	/* Flags */
662 	usb_port_status_t		itw_port_status; /* Port Speed */
663 	uint_t				itw_direction;	/* Direction of ITD */
664 
665 	/* ITD information */
666 	uint_t				itw_num_itds;	/* Number of ITDs */
667 	ehci_itd_t			*itw_itd_head;	/* Head ITD */
668 	ehci_itd_t			*itw_itd_tail;	/* Tail ITD */
669 	usb_isoc_req_t			*itw_curr_xfer_reqp;
670 	usb_isoc_pkt_descr_t		*itw_curr_isoc_pktp;
671 
672 	/* We preallocate all the td's for each tw and place them here */
673 	ehci_itd_t			*itw_itd_free_list;
674 
675 	/* Device and hub information needed by every iTD */
676 	uint_t				itw_hub_addr;
677 	uint_t				itw_hub_port;
678 	uint_t				itw_endpoint_num;
679 	uint_t				itw_device_addr;
680 
681 	/*
682 	 * Callback handling function and arguement.  Called when an iTD is
683 	 * is done.
684 	 */
685 	usb_opaque_t			itw_handle_callback_value;
686 
687 	/* 32bit ID */
688 	uint32_t			itw_id;
689 } ehci_isoc_xwrapper_t;
690 
691 _NOTE(MUTEX_PROTECTS_DATA(ehci_state_t::ehci_int_mutex, ehci_isoc_xwrapper_t))
692 
693 /*
694  * Time waits for the different EHCI specific operations.
695  * These timeout values are specified in terms of microseconds.
696  */
697 #define	EHCI_RESET_TIMEWAIT	10000	/* HC reset waiting time */
698 #define	EHCI_TIMEWAIT		10000	/* HC any other waiting time */
699 #define	EHCI_SOF_TIMEWAIT	20000	/* SOF Wait time */
700 #define	EHCI_TAKEOVER_DELAY	10000	/* HC take over waiting time */
701 #define	EHCI_TAKEOVER_WAIT_COUNT	25	/* HC take over waiting count */
702 
703 /* These timeout values are specified in seconds */
704 #define	EHCI_DEFAULT_XFER_TIMEOUT	5 /* Default transfer timeout */
705 #define	EHCI_XFER_CMPL_TIMEWAIT		3 /* Xfers completion timewait */
706 
707 /* EHCI flags for general use */
708 #define	EHCI_FLAGS_NOSLEEP	0x000	/* Don't wait for SOF */
709 #define	EHCI_FLAGS_SLEEP	0x100	/* Wait for SOF */
710 #define	EHCI_FLAGS_DMA_SYNC	0x200	/* Call ddi_dma_sync */
711 
712 /*
713  * Maximum allowable data transfer  size per transaction as supported
714  * by EHCI is 20k. (See EHCI Host Controller Interface Spec Rev 0.96)
715  *
716  * Also within QTD, there will be five buffer pointers abd each buffer
717  * pointer can transfer upto 4k bytes of data.
718  */
719 #define	EHCI_MAX_QTD_XFER_SIZE	0x5000	/* Maxmum data per transaction */
720 #define	EHCI_MAX_QTD_BUF_SIZE	0x1000	/* Maxmum data per buffer */
721 
722 /*
723  * The maximum allowable bulk data transfer size. It can be different
724  * from EHCI_MAX_QTD_XFER_SIZE and if it is more then ehci driver will
725  * take care of  breaking a bulk data request into  multiples of ehci
726  * EHCI_MAX_QTD_XFER_SIZE  until request is satisfied.	Currently this
727  * value is set to 640k bytes.
728  */
729 #define	EHCI_MAX_BULK_XFER_SIZE	0xA0000	/* Maximum bulk transfer size */
730 
731 /*
732  * Timeout flags
733  *
734  * These flags will be used to stop the timer before timeout handler
735  * gets executed.
736  */
737 #define	EHCI_REMOVE_XFER_IFLAST	1	/* Stop the timer if it is last QTD */
738 #define	EHCI_REMOVE_XFER_ALWAYS	2	/* Stop the timer without condition */
739 
740 
741 /*
742  * High speed bandwidth allocation
743  *
744  * The following definitions are used during bandwidth calculations
745  * for a given high speed endpoint or high speed split transactions.
746  */
747 #define	HS_BUS_BANDWIDTH	7500	/* Up to 7500 bytes per 125us */
748 #define	HS_MAX_POLL_INTERVAL	16	/* Max high speed polling interval */
749 #define	HS_MIN_POLL_INTERVAL	1	/* Min high speed polling interval */
750 #define	HS_SOF			12	/* Length in bytes of High speed SOF */
751 #define	HS_EOF			70	/* Length in bytes of High speed EOF */
752 #define	TREE_HEIGHT		5	/* Log base 2 of 32 */
753 
754 /*
755  * As per USB 2.0 specification section 5.5.4, 20% of bus time is reserved
756  * for the non-periodic high-speed transfers. Where as peridoic high-speed
757  * transfers will get 80% of the bus time. In one micro-frame or 125us, we
758  * can transfer 7500 bytes or 60,000 bits.
759  */
760 #define	HS_NON_PERIODIC_BANDWIDTH	1500
761 #define	HS_PERIODIC_BANDWIDTH		(HS_BUS_BANDWIDTH - HS_SOF - \
762 					HS_EOF - HS_NON_PERIODIC_BANDWIDTH)
763 
764 /*
765  * High speed periodic frame bandwidth will be eight times the micro frame
766  * high speed periodic bandwidth.
767  */
768 #define	HS_PERIODIC_FRAME_BANDWIDTH	HS_PERIODIC_BANDWIDTH * EHCI_MAX_UFRAMES
769 
770 /*
771  * The following are the protocol overheads in terms of Bytes for the
772  * different transfer types.  All these protocol overhead  values are
773  * derived from the 5.11.3 section of USB 2.0 Specification.
774  */
775 #define	HS_NON_ISOC_PROTO_OVERHEAD	55
776 #define	HS_ISOC_PROTO_OVERHEAD		38
777 
778 /*
779  * The following are THE protocol overheads in terms of Bytes for the
780  * start and complete split transactions tokens overheads.  All these
781  * protocol overhead values are derived from the 8.4.2.2 and 8.4.2.3
782  * of USB2.0 Specification.
783  */
784 #define	START_SPLIT_OVERHEAD		04
785 #define	COMPLETE_SPLIT_OVERHEAD		04
786 
787 /*
788  * The Host Controller (HC) delays are the USB host controller specific
789  * delays. The value shown below is the host  controller delay for  the
790  * given EHCI host controller.
791  */
792 #define	EHCI_HOST_CONTROLLER_DELAY	18
793 
794 /*
795  * Low/Full speed bandwidth allocation
796  *
797  * The following definitions are used during bandwidth calculations for
798  * a given high speed hub or  a transaction translator	(TT) and  for a
799  * given low/full speed device connected to high speed hub or TT  using
800  * split transactions
801  */
802 #define	FS_BUS_BANDWIDTH	1500	/* Up to 1500 bytes per 1ms */
803 #define	FS_MAX_POLL_INTERVAL	255	/* Max full speed poll interval */
804 #define	FS_MIN_POLL_INTERVAL	1	/* Min full speed polling interval */
805 #define	FS_SOF			6	/* Length in bytes of Full speed SOF */
806 #define	FS_EOF			4	/* Length in bytes of Full speed EOF */
807 
808 /*
809  * Minimum polling interval for low speed endpoint
810  *
811  * According USB 2.0 Specification, a full-speed endpoint can specify
812  * a desired polling interval 1ms to 255ms and a low speed endpoints
813  * are limited to specifying only 10ms to 255ms. But some old keyboards
814  * and mice uses polling interval of 8ms. For compatibility purpose,
815  * we are using polling interval between 8ms and 255ms for low speed
816  * endpoints. The ehci driver will use 8ms polling interval if a low
817  * speed device reports a polling interval that is less than 8ms.
818  */
819 #define	LS_MAX_POLL_INTERVAL	255	/* Max low speed poll interval */
820 #define	LS_MIN_POLL_INTERVAL	8	/* Min low speed polling interval */
821 
822 /*
823  * For non-periodic transfers, reserve atleast for one low-speed device
824  * transaction. According to USB Bandwidth Analysis white paper and also
825  * as per OHCI Specification 1.0a, section 7.3.5, page 123, one low-speed
826  * transaction takes 0x628h full speed bits (197 bytes), which comes to
827  * around 13% of USB frame time.
828  *
829  * The periodic transfers will	get around 87% of USB frame time.
830  */
831 #define	FS_NON_PERIODIC_BANDWIDTH	197
832 #define	FS_PERIODIC_BANDWIDTH		(FS_BUS_BANDWIDTH - FS_SOF - \
833 					FS_EOF - FS_NON_PERIODIC_BANDWIDTH)
834 
835 /*
836  * The following are the protocol overheads in terms of Bytes for the
837  * different transfer types.  All these protocol overhead  values are
838  * derived from the 5.11.3 section of USB Specification	and  with the
839  * help of Bandwidth Analysis white paper which is posted on the  USB
840  * developer forum.
841  */
842 #define	FS_NON_ISOC_PROTO_OVERHEAD	14
843 #define	FS_ISOC_INPUT_PROTO_OVERHEAD	11
844 #define	FS_ISOC_OUTPUT_PROTO_OVERHEAD	10
845 #define	LOW_SPEED_PROTO_OVERHEAD	97
846 #define	HUB_LOW_SPEED_PROTO_OVERHEAD	01
847 
848 /* The maximum amount of isoch data that can be transferred in one uFrame */
849 #define	MAX_UFRAME_SITD_XFER		188
850 
851 /*
852  * The low speed clock below represents that to transmit one low-speed
853  * bit takes eight times more than one full speed bit time.
854  */
855 #define	LOW_SPEED_CLOCK			8
856 
857 /*
858  * The Transaction Translator (TT) delay is the additional time needed
859  * to execute low/full speed transaction from high speed split transaction
860  * for the low/full device connected to the high speed extrenal hub.
861  */
862 #define	TT_DELAY			18
863 
864 
865 /*
866  * Macros for setting/getting information
867  */
868 #define	Get_QH(addr)		ddi_get32(ehcip->ehci_qh_pool_mem_handle, \
869 					(uint32_t *)&addr)
870 
871 #define	Set_QH(addr, val)	ddi_put32(ehcip->ehci_qh_pool_mem_handle,  \
872 					((uint32_t *)&addr), \
873 					((int32_t)(val)))
874 
875 #define	Get_QTD(addr)		ddi_get32(ehcip->ehci_qtd_pool_mem_handle, \
876 					(uint32_t *)&addr)
877 
878 #define	Set_QTD(addr, val)	ddi_put32(ehcip->ehci_qtd_pool_mem_handle, \
879 					((uint32_t *)&addr), \
880 					((int32_t)(val)))
881 
882 #define	Get_ITD(addr)		ddi_get32(ehcip->ehci_itd_pool_mem_handle, \
883 					(uint32_t *)&addr)
884 
885 #define	Set_ITD(addr, val)	ddi_put32(ehcip->ehci_itd_pool_mem_handle, \
886 					((uint32_t *)&addr), \
887 					((int32_t)(val)))
888 
889 #define	Get_ITD_BODY(ptr, addr)		ddi_get32( \
890 					    ehcip->ehci_itd_pool_mem_handle, \
891 					    (uint32_t *)&ptr->itd_body[addr])
892 
893 #define	Set_ITD_BODY(ptr, addr, val)	ddi_put32( \
894 					    ehcip->ehci_itd_pool_mem_handle, \
895 					    ((uint32_t *)&ptr->itd_body[addr]),\
896 					    ((int32_t)(val)))
897 
898 #define	Get_ITD_INDEX(ptr, pos)		ddi_get32( \
899 					    ehcip->ehci_itd_pool_mem_handle, \
900 					    (uint32_t *)&ptr->itd_index[pos])
901 
902 #define	Set_ITD_INDEX(ptr, pos, val)	ddi_put32( \
903 					    ehcip->ehci_itd_pool_mem_handle, \
904 					    ((uint32_t *)&ptr->itd_index[pos]),\
905 					    ((uint32_t)(val)))
906 
907 #define	Get_ITD_FRAME(addr)		ddi_get64( \
908 					    ehcip->ehci_itd_pool_mem_handle, \
909 					    (uint64_t *)&addr)
910 
911 #define	Set_ITD_FRAME(addr, val)	ddi_put64( \
912 					    ehcip->ehci_itd_pool_mem_handle, \
913 					    ((uint64_t *)&addr), \
914 					    (val))
915 
916 #define	Get_PFLT(addr)		ddi_get32(ehcip->ehci_pflt_mem_handle, \
917 					(uint32_t *)&addr)
918 
919 #define	Set_PFLT(addr, val)	ddi_put32(ehcip->ehci_pflt_mem_handle, \
920 					((uint32_t *)&addr), \
921 					((int32_t)(uintptr_t)(val)))
922 
923 #define	Get_8Cap(addr)		ddi_get8(ehcip->ehci_caps_handle, \
924 					(uint8_t *)&ehcip->ehci_capsp->addr)
925 
926 #define	Get_16Cap(addr)		ddi_get16(ehcip->ehci_caps_handle, \
927 					(uint16_t *)&ehcip->ehci_capsp->addr)
928 
929 #define	Get_Cap(addr)		ddi_get32(ehcip->ehci_caps_handle, \
930 					(uint32_t *)&ehcip->ehci_capsp->addr)
931 
932 #define	Get_OpReg(addr)		ddi_get32(ehcip->ehci_caps_handle, \
933 					(uint32_t *)&ehcip->ehci_regsp->addr)
934 
935 #define	Set_OpReg(addr, val)	ddi_put32(ehcip->ehci_caps_handle, \
936 				((uint32_t *)&ehcip->ehci_regsp->addr), \
937 					((int32_t)(val)))
938 
939 #define	CalculateITDMultiField(pkgSize)		(1 + (((pkgSize)>>11) & 0x03))
940 
941 #define	EHCI_MAX_RETRY		10
942 
943 #define	Set_OpRegRetry(addr, val, r) \
944 				while (Get_OpReg(addr) != val) { \
945 					if (r >= EHCI_MAX_RETRY) \
946 						break; \
947 					r++; \
948 					Set_OpReg(addr, val); \
949 				}
950 
951 #define	Sync_QH_QTD_Pool(ehcip) (void) ddi_dma_sync( \
952 				ehcip->ehci_qh_pool_dma_handle, \
953 				0, EHCI_QH_POOL_SIZE * sizeof (ehci_qh_t), \
954 				DDI_DMA_SYNC_FORCPU); \
955 				(void) ddi_dma_sync( \
956 				ehcip->ehci_qtd_pool_dma_handle, \
957 				0, EHCI_QTD_POOL_SIZE * sizeof (ehci_qtd_t), \
958 				DDI_DMA_SYNC_FORCPU);
959 
960 #define	Sync_ITD_Pool(ehcip) (void) ddi_dma_sync( \
961 				ehcip->ehci_itd_pool_dma_handle, \
962 				0, EHCI_ITD_POOL_SIZE * sizeof (ehci_itd_t), \
963 				DDI_DMA_SYNC_FORCPU);
964 
965 #define	Sync_IO_Buffer(dma_handle, length) \
966 				(void) ddi_dma_sync(dma_handle, \
967 				0, length, DDI_DMA_SYNC_FORCPU);
968 
969 #define	Sync_IO_Buffer_for_device(dma_handle, length) \
970 				(void) ddi_dma_sync(dma_handle, \
971 				0, length, DDI_DMA_SYNC_FORDEV);
972 
973 /*
974  * Macros to speed handling of 32bit IDs
975  */
976 #define	EHCI_GET_ID(x)		id32_alloc((void *)(x), KM_SLEEP)
977 #define	EHCI_LOOKUP_ID(x)	id32_lookup((x))
978 #define	EHCI_FREE_ID(x)		id32_free((x))
979 
980 
981 /*
982  * Miscellaneous definitions.
983  */
984 
985 /* Data toggle bits */
986 #define	DATA0		0
987 #define	DATA1		1
988 
989 /* Halt bit actions */
990 #define	CLEAR_HALT	0
991 #define	SET_HALT	1
992 
993 typedef uint_t		halt_bit_t;
994 
995 /*
996  * Setup Packet
997  */
998 typedef struct setup_pkt {
999 	uchar_t	bmRequestType;
1000 	uchar_t	bRequest;
1001 	ushort_t wValue;
1002 	ushort_t wIndex;
1003 	ushort_t wLength;
1004 }setup_pkt_t;
1005 
1006 #define	SETUP_SIZE		8	/* Setup packet is always 8 bytes */
1007 
1008 #define	REQUEST_TYPE_OFFSET	0
1009 #define	REQUEST_OFFSET		1
1010 #define	VALUE_OFFSET		2
1011 #define	INDEX_OFFSET		4
1012 #define	LENGTH_OFFSET		6
1013 
1014 #define	TYPE_DEV_TO_HOST	0x80000000
1015 #define	DEVICE			0x00000001
1016 #define	CONFIGURATION		0x00000002
1017 
1018 /*
1019  * The following are used in attach to	 indicate
1020  * what has been succesfully allocated, so detach
1021  * can remove them.
1022  */
1023 #define	EHCI_ATTACH		0x01	/* ehci driver initilization */
1024 #define	EHCI_ZALLOC		0x02	/* Memory for ehci state structure */
1025 #define	EHCI_INTR		0x04	/* Interrupt handler registered */
1026 #define	EHCI_USBAREG		0x08	/* USBA registered */
1027 #define	EHCI_RHREG		0x10	/* Root hub driver loaded */
1028 
1029 /*
1030  * This variable is used in the EHCI_FLAGS to tell the ISR to broadcase
1031  * the ehci_async_schedule_advance_cv when an intr occurs.  It is used to
1032  * make sure that EHCI is receiving interrupts.
1033  */
1034 #define	EHCI_CV_INTR		0x20	/* Ask INTR to broadcast cv */
1035 
1036 #define	EHCI_UNIT(dev)	(getminor((dev)) & ~HUBD_IS_ROOT_HUB)
1037 
1038 /*
1039  * Debug printing
1040  * Masks
1041  */
1042 #define	PRINT_MASK_ATTA		0x00000001	/* Attach time */
1043 #define	PRINT_MASK_LISTS	0x00000002	/* List management */
1044 #define	PRINT_MASK_ROOT_HUB	0x00000004	/* Root hub stuff */
1045 #define	PRINT_MASK_ALLOC	0x00000008	/* Alloc/dealloc descr */
1046 #define	PRINT_MASK_INTR		0x00000010	/* Interrupt handling */
1047 #define	PRINT_MASK_BW		0x00000020	/* Bandwidth */
1048 #define	PRINT_MASK_CBOPS	0x00000040	/* CB-OPS */
1049 #define	PRINT_MASK_HCDI		0x00000080	/* HCDI entry points */
1050 #define	PRINT_MASK_DUMPING	0x00000100	/* Dump ehci info */
1051 #define	PRINT_MASK_ALL		0xFFFFFFFF
1052 
1053 /*
1054  * workaround for ALI chips
1055  */
1056 #define	PCI_VENDOR_ALI		0x10b9		/* PCI Vendor-id Acer */
1057 
1058 /*
1059  * NEC on COMBO and Uli M1575 can support PM
1060  */
1061 #define	PCI_VENDOR_NEC_COMBO	0x1033
1062 #define	PCI_DEVICE_NEC_COMBO	0xe0
1063 #define	PCI_VENDOR_ULi_M1575	0x10b9
1064 #define	PCI_DEVICE_ULi_M1575	0x5239
1065 
1066 /*
1067  * VIA chips have some problems, the workaround can ensure those chips
1068  * work reliably. Revisions >= 0x80 are part of a southbridge and appear
1069  * to be reliable.
1070  */
1071 #define	PCI_VENDOR_VIA		0x1106		/* PCI Vendor-id VIA */
1072 #define	PCI_VIA_REVISION_6212	0x80		/* VIA 6212 revision ID */
1073 
1074 #define	EHCI_VIA_LOST_INTERRUPTS	0x01
1075 #define	EHCI_VIA_ASYNC_SCHEDULE		0x02
1076 #define	EHCI_VIA_REDUCED_MAX_BULK_XFER_SIZE	0x04
1077 
1078 #define	EHCI_VIA_WORKAROUNDS \
1079 	(EHCI_VIA_LOST_INTERRUPTS | \
1080 	EHCI_VIA_ASYNC_SCHEDULE | \
1081 	EHCI_VIA_REDUCED_MAX_BULK_XFER_SIZE)
1082 
1083 #define	EHCI_VIA_MAX_BULK_XFER_SIZE 0x8000 /* Maximum bulk transfer size */
1084 
1085 
1086 /*
1087  * EHCI HCDI entry points
1088  *
1089  * The Host Controller Driver Interfaces (HCDI) are the software interfaces
1090  * between the Universal Serial Bus Driver (USBA) and the Host	Controller
1091  * Driver (HCD). The HCDI interfaces or entry points are subject to change.
1092  */
1093 int		ehci_hcdi_pipe_open(
1094 				usba_pipe_handle_data_t	*ph,
1095 				usb_flags_t		usb_flags);
1096 int		ehci_hcdi_pipe_close(
1097 				usba_pipe_handle_data_t	*ph,
1098 				usb_flags_t		usb_flags);
1099 int		ehci_hcdi_pipe_reset(
1100 				usba_pipe_handle_data_t	*ph,
1101 				usb_flags_t		usb_flags);
1102 int		ehci_hcdi_pipe_ctrl_xfer(
1103 				usba_pipe_handle_data_t	*ph,
1104 				usb_ctrl_req_t		*ctrl_reqp,
1105 				usb_flags_t		usb_flags);
1106 int		ehci_hcdi_bulk_transfer_size(
1107 				usba_device_t		*usba_device,
1108 				size_t			*size);
1109 int		ehci_hcdi_pipe_bulk_xfer(
1110 				usba_pipe_handle_data_t	*ph,
1111 				usb_bulk_req_t		*bulk_reqp,
1112 				usb_flags_t		usb_flags);
1113 int		ehci_hcdi_pipe_intr_xfer(
1114 				usba_pipe_handle_data_t	*ph,
1115 				usb_intr_req_t		*intr_req,
1116 				usb_flags_t		usb_flags);
1117 int		ehci_hcdi_pipe_stop_intr_polling(
1118 				usba_pipe_handle_data_t	*ph,
1119 				usb_flags_t		usb_flags);
1120 int		ehci_hcdi_get_current_frame_number(
1121 				usba_device_t		*usba_device,
1122 				usb_frame_number_t	*frame_number);
1123 int		ehci_hcdi_get_max_isoc_pkts(
1124 				usba_device_t		*usba_device,
1125 				uint_t		*max_isoc_pkts_per_request);
1126 int		ehci_hcdi_pipe_isoc_xfer(
1127 				usba_pipe_handle_data_t	*ph,
1128 				usb_isoc_req_t		*isoc_reqp,
1129 				usb_flags_t		usb_flags);
1130 int		ehci_hcdi_pipe_stop_isoc_polling(
1131 				usba_pipe_handle_data_t	*ph,
1132 				usb_flags_t		usb_flags);
1133 
1134 /*
1135  * EHCI Polled entry points function prototypes.
1136  */
1137 int		ehci_hcdi_polled_input_init(
1138 				usba_pipe_handle_data_t	*ph,
1139 				uchar_t			**polled_buf,
1140 				usb_console_info_impl_t	*info);
1141 int		ehci_hcdi_polled_input_enter(
1142 				usb_console_info_impl_t	*info);
1143 int		ehci_hcdi_polled_read(
1144 				usb_console_info_impl_t	*info,
1145 				uint_t			*num_characters);
1146 int		ehci_hcdi_polled_input_exit(
1147 				usb_console_info_impl_t	*info);
1148 int		ehci_hcdi_polled_input_fini(
1149 				usb_console_info_impl_t	*info);
1150 
1151 /*
1152  * EHCI Root Hub entry points function prototypes.
1153  */
1154 int		ehci_init_root_hub(
1155 				ehci_state_t		*ehcip);
1156 int		ehci_load_root_hub_driver(
1157 				ehci_state_t		*ehcip);
1158 int		ehci_unload_root_hub_driver(
1159 				ehci_state_t		*ehcip);
1160 int		ehci_handle_root_hub_pipe_open(
1161 				usba_pipe_handle_data_t	*ph,
1162 				usb_flags_t		flags);
1163 int		ehci_handle_root_hub_pipe_close(
1164 				usba_pipe_handle_data_t	*ph);
1165 int		ehci_handle_root_hub_pipe_reset(
1166 				usba_pipe_handle_data_t	*ph,
1167 				usb_flags_t		flags);
1168 int		ehci_handle_root_hub_request(
1169 				ehci_state_t		*ehcip,
1170 				usba_pipe_handle_data_t	*ph,
1171 				usb_ctrl_req_t		*ctrl_reqp);
1172 int		ehci_handle_root_hub_pipe_start_intr_polling(
1173 				usba_pipe_handle_data_t	*ph,
1174 				usb_intr_req_t		*intr_reqp,
1175 				usb_flags_t		flags);
1176 void		ehci_handle_root_hub_pipe_stop_intr_polling(
1177 				usba_pipe_handle_data_t	*ph,
1178 				usb_flags_t		flags);
1179 
1180 /*
1181  * EHCI Interrupt Handler entry point.
1182  */
1183 uint_t		ehci_intr(caddr_t			arg1,
1184 				caddr_t			arg2);
1185 
1186 #ifdef __cplusplus
1187 }
1188 #endif
1189 
1190 #endif /* _SYS_USB_EHCID_H */
1191