1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
|
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
#ifndef _SYS_USB_USBSACM_H
#define _SYS_USB_USBSACM_H
#include <sys/types.h>
#include <sys/dditypes.h>
#include <sys/note.h>
#include <sys/usb/clients/usbser/usbser_dsdi.h>
#ifdef __cplusplus
extern "C" {
#endif
typedef struct usbsacm_port usbsacm_port_t;
typedef struct usbsacm_state usbsacm_state_t;
/*
* PM support
*/
typedef struct usbsacm_power {
uint8_t pm_wakeup_enabled; /* remote wakeup enabled */
uint8_t pm_pwr_states; /* bit mask of power states */
boolean_t pm_raise_power; /* driver is about to raise power */
uint8_t pm_cur_power; /* current power level */
uint_t pm_busy_cnt; /* number of set_busy requests */
} usbsacm_pm_t;
/*
* per bulk in/out structure
*/
struct usbsacm_port {
kmutex_t acm_port_mutex; /* structure lock */
usbsacm_state_t *acm_device; /* back pointer */
usb_pipe_handle_t acm_bulkin_ph; /* in pipe hdl */
int acm_bulkin_state; /* in pipe state */
usb_pipe_handle_t acm_bulkout_ph; /* out pipe hdl */
int acm_bulkout_state; /* out pipe state */
usb_pipe_handle_t acm_intr_ph; /* intr pipe hdl */
int acm_intr_state; /* intr pipe state */
usb_ep_descr_t acm_intr_ep_descr; /* ep descriptor */
int acm_ctrl_if_no; /* control interface */
int acm_data_if_no; /* data interface */
int acm_data_port_no; /* which data port */
ds_cb_t acm_cb; /* DSD callbacks */
mblk_t *acm_rx_mp; /* rx data */
mblk_t *acm_tx_mp; /* tx data */
kcondvar_t acm_tx_cv; /* tx completion */
uint8_t acm_mctlout; /* controls out */
uint8_t acm_mctlin; /* controls in */
int acm_cap; /* port capabilities */
usb_cdc_line_coding_t acm_line_coding; /* port line coding */
int acm_port_state; /* port state */
size_t acm_bulkin_size; /* bulkin xfer size */
};
_NOTE(MUTEX_PROTECTS_DATA(usbsacm_port::acm_port_mutex, usbsacm_port))
_NOTE(DATA_READABLE_WITHOUT_LOCK(usbsacm_port::{
acm_device
acm_cb.cb_rx
acm_cb.cb_tx
acm_cb.cb_arg
acm_bulkin_ph
acm_bulkout_ph
acm_intr_ph
acm_ctrl_if_no
acm_data_if_no
acm_data_port_no
acm_port_state
}))
struct usbsacm_state {
kmutex_t acm_mutex; /* structure lock */
dev_info_t *acm_dip; /* device info */
usb_client_dev_data_t *acm_dev_data; /* registration data */
usb_event_t *acm_usb_events; /* usb events */
usb_pipe_handle_t acm_def_ph; /* default pipe hdl */
usb_log_handle_t acm_lh; /* USBA log handle */
int acm_dev_state; /* USB device state */
size_t acm_xfer_sz; /* bulk xfer size */
boolean_t acm_compatibility; /* if conform to spec */
usbsacm_port_t *acm_ports; /* per port structs */
int acm_port_cnt; /* port number */
usbsacm_pm_t *acm_pm; /* PM support */
};
_NOTE(MUTEX_PROTECTS_DATA(usbsacm_state::acm_mutex, usbsacm_state))
_NOTE(DATA_READABLE_WITHOUT_LOCK(usbsacm_state::{
acm_dip
acm_dev_data
acm_usb_events
acm_def_ph
acm_lh
acm_dev_state
acm_xfer_sz
acm_compatibility
acm_ports
acm_port_cnt
acm_pm
}))
/* port state */
enum {
USBSACM_PORT_CLOSED, /* port is closed */
USBSACM_PORT_OPEN, /* port is open */
USBSACM_PORT_CLOSING
};
/* pipe state */
enum {
USBSACM_PIPE_CLOSED, /* pipe is closed */
USBSACM_PIPE_IDLE, /* open but no requests */
USBSACM_PIPE_BUSY, /* servicing request */
USBSACM_PIPE_CLOSING /* pipe is closing */
};
/* various tunables */
enum {
USBSACM_BULKOUT_TIMEOUT = 15, /* bulkout timeout */
USBSACM_BULKIN_TIMEOUT = 0 /* bulkin timeout */
};
/* hardware definitions */
enum {
USBSACM_REQ_OUT = USB_DEV_REQ_TYPE_CLASS| USB_DEV_REQ_HOST_TO_DEV,
USBSACM_REQ_IN = USB_DEV_REQ_TYPE_CLASS | USB_DEV_REQ_DEV_TO_HOST,
USBSACM_REQ_WRITE_IF = USBSACM_REQ_OUT | USB_DEV_REQ_RCPT_IF,
USBSACM_REQ_READ_IF = USBSACM_REQ_IN | USB_DEV_REQ_RCPT_IF
};
#define PRINT_MASK_ATTA 0x00000001
#define PRINT_MASK_CLOSE 0x00000002
#define PRINT_MASK_OPEN 0x00000004
#define PRINT_MASK_EVENTS 0x00000008
#define PRINT_MASK_PM 0x00000010
#define PRINT_MASK_CB 0x00000020
#define PRINT_MASK_ALL 0xFFFFFFFF
#define NELEM(a) (sizeof (a) / sizeof (*(a)))
#ifdef __cplusplus
}
#endif
#endif /* _SYS_USB_USBSACM_H */
|