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_USB_AH_H
27 #define	_SYS_USB_USB_AH_H
28 
29 
30 #ifdef __cplusplus
31 extern "C" {
32 #endif
33 
34 #include <sys/stream.h>
35 
36 #define	USB_AH_RPT_NUMBER	3
37 
38 #define	USB_AH_INPUT_RPT	0
39 #define	USB_AH_OUTPUT_RPT	1
40 #define	USB_AH_FEATURE_RPT	2
41 
42 /* definitions for various state machines */
43 #define	USB_AH_OPEN	0x00000001 /* audio hid is open for business */
44 #define	USB_AH_QWAIT	0x00000002 /* audio hid is waiting for a response */
45 
46 
47 typedef struct usb_ah_button_descr {
48 	uint_t		location;	/* which byte contains button info */
49 	uint_t		offset;		/* offset of button info */
50 	uint_t		no_of_bits;	/* size of button info */
51 	uint_t		pressed;	/* if this button is pressed or not */
52 	mblk_t		*mblk;		/* mblk for autorepeat feature */
53 	void		*uahp;		/* Back ptr for timeout routine */
54 } usb_ah_button_descr_t;
55 
56 /*
57  * structure for each report type, INPUT, OUTPUT or FEATURE
58  * Note report id 0 and only one collection is handled
59  */
60 
61 typedef struct usb_ah_rpt {
62 	hidparser_rpt_t		hid_rpt;
63 	usb_ah_button_descr_t	button_descr[USAGE_MAX];
64 } usb_ah_rpt_t;
65 
66 /* state structure for usb_ah */
67 typedef struct  usb_ah_state {
68 	queue_t			*usb_ah_readq;		/* read queue */
69 	queue_t			*usb_ah_writeq;		/* write queue */
70 	kmutex_t		usb_ah_mutex;
71 	int			usb_ah_flags;
72 	uint_t			usb_ah_packet_size;	/* size usb packet */
73 	int			usb_ah_uses_report_ids;	/* 1 if rep.ids used */
74 	int			usb_ah_report_id;	/* report id used by */
75 							/* the device */
76 
77 	/* timeout id for re-trigger ctrl */
78 
79 	timeout_id_t		usb_ah_tid;
80 
81 	/* Button descr. ptr to the currently pressed autorepeating button */
82 
83 	usb_ah_button_descr_t	*usb_ah_cur_bd;
84 
85 	/* Pointer to the parser handle */
86 
87 	hidparser_handle_t	usb_ah_report_descr;
88 	usb_ah_rpt_t		usb_ah_report[USB_AH_RPT_NUMBER];
89 } usb_ah_state_t;
90 
91 /*
92  * Only variable tid is protected by the mutex, all other r/w happens in
93  * streams and callback context, thereby ensuring that they are protected
94  * by the scheme
95  */
96 _NOTE(MUTEX_PROTECTS_DATA(usb_ah_state_t::usb_ah_mutex, usb_ah_state_t))
97 _NOTE(SCHEME_PROTECTS_DATA("unique per call", usb_ah_state_t::usb_ah_readq))
98 _NOTE(SCHEME_PROTECTS_DATA("unique per call", usb_ah_state_t::usb_ah_flags))
99 _NOTE(SCHEME_PROTECTS_DATA("unique per call", usb_ah_state_t::usb_ah_tid))
100 _NOTE(SCHEME_PROTECTS_DATA("unique per call", usb_ah_state_t::usb_ah_writeq))
101 _NOTE(SCHEME_PROTECTS_DATA("unique per call",
102 			usb_ah_state_t::usb_ah_packet_size))
103 _NOTE(SCHEME_PROTECTS_DATA("unique per call",
104 			usb_ah_state_t::usb_ah_uses_report_ids))
105 _NOTE(SCHEME_PROTECTS_DATA("unique per call",
106 			usb_ah_state_t::usb_ah_report_id))
107 _NOTE(SCHEME_PROTECTS_DATA("unique per call",
108 			usb_ah_state_t::usb_ah_report_descr))
109 _NOTE(SCHEME_PROTECTS_DATA("unique per call",
110 			usb_ah_state_t::usb_ah_cur_bd))
111 _NOTE(SCHEME_PROTECTS_DATA("unique per call",
112 			usb_ah_state_t::usb_ah_report))
113 _NOTE(SCHEME_PROTECTS_DATA("unique per call", usb_ah_button_descr_t))
114 _NOTE(SCHEME_PROTECTS_DATA("unique per call", usb_ah_rpt_t))
115 _NOTE(SCHEME_PROTECTS_DATA("unique per call", hidparser_rpt_t))
116 _NOTE(SCHEME_PROTECTS_DATA("unique per call", hidparser_usage_info_t))
117 
118 #define	USB_AH_TIMEOUT		50000	/* In usec */
119 
120 #ifdef __cplusplus
121 }
122 #endif
123 
124 #endif	/* _SYS_USB_USB_AH_H */
125