usbser_dsdi.h revision 7492:2387323b838f
1179102Syongari/*
2179102Syongari * CDDL HEADER START
3179102Syongari *
4179102Syongari * The contents of this file are subject to the terms of the
5179102Syongari * Common Development and Distribution License (the "License").
6179102Syongari * You may not use this file except in compliance with the License.
7179102Syongari *
8179102Syongari * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9179102Syongari * or http://www.opensolaris.org/os/licensing.
10179102Syongari * See the License for the specific language governing permissions
11179102Syongari * and limitations under the License.
12179102Syongari *
13179102Syongari * When distributing Covered Code, include this CDDL HEADER in each
14179102Syongari * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15179102Syongari * If applicable, add the following below this CDDL HEADER, with the
16179102Syongari * fields enclosed by brackets "[]" replaced with your own identifying
17179102Syongari * information: Portions Copyright [yyyy] [name of copyright owner]
18179102Syongari *
19179102Syongari * CDDL HEADER END
20179102Syongari */
21179102Syongari/*
22179102Syongari * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
23179102Syongari * Use is subject to license terms.
24179102Syongari */
25179102Syongari
26179102Syongari#ifndef _SYS_USB_USBSER_DSDI_H
27183137Syongari#define	_SYS_USB_USBSER_DSDI_H
28179102Syongari
29179102Syongari
30179102Syongari/*
31179102Syongari * USB-to-serial device-specific driver interface (DSDI)
32179102Syongari */
33179102Syongari
34179102Syongari#include <sys/types.h>
35179102Syongari#include <sys/dditypes.h>
36179102Syongari#include <sys/usb/usba.h>
37179102Syongari#include <sys/usb/usba/usbai_private.h>
38179102Syongari
39179102Syongari#ifdef	__cplusplus
40179102Syongariextern "C" {
41179102Syongari#endif
42179102Syongari
43179102Syongaritypedef void	*ds_hdl_t;	/* DSD device handler */
44179102Syongari
45179102Syongari/*
46179102Syongari * interrupt emulation callbacks
47179102Syongari */
48179102Syongaritypedef struct ds_cb {
49179102Syongari	void		(*cb_tx)(caddr_t);	/* transmit callback */
50179102Syongari	void		(*cb_rx)(caddr_t);	/* receive callback */
51179102Syongari	void		(*cb_status)(caddr_t);	/* status change callback */
52179102Syongari	caddr_t		cb_arg;			/* callback argument */
53179102Syongari} ds_cb_t;
54179102Syongari
55179102Syongaritypedef struct ds_port_params ds_port_params_t;	/* see below */
56179102Syongari
57179102Syongaritypedef struct ds_attach_info {
58179102Syongari	/*
59179102Syongari	 * passed to DSD:
60179102Syongari	 */
61179102Syongari	dev_info_t	*ai_dip;	/* devinfo */
62179102Syongari	/*
63179102Syongari	 * these event callbacks should be registered by DSD
64179102Syongari	 * using usb_register_event_cbs()
65179102Syongari	 */
66179102Syongari	usb_event_t	*ai_usb_events;
67179102Syongari	/*
68179102Syongari	 * returned by DSD:
69179102Syongari	 */
70179102Syongari	ds_hdl_t	*ai_hdl; /* handle to be used by GSD in other calls */
71179102Syongari	uint_t		*ai_port_cnt;	/* number of ports */
72179102Syongari} ds_attach_info_t;
73179102Syongari
74179102Syongari/*
75179102Syongari * device operations used by Generic Serial Driver (GSD)
76179102Syongari *
77179102Syongari * ops returning int should return USB_SUCCESS on successful completion
78179102Syongari * or appropriate USB_* error code in case of failure
79179102Syongari *
80179102Syongari * ops can block unless otherwise indicated
81179102Syongari */
82179102Syongaritypedef struct ds_ops {
83179102Syongari	int	ds_version;	/* structure version */
84179102Syongari
85179102Syongari	/*
86179102Syongari	 * configuration operations
87179102Syongari	 * ------------------------
88179102Syongari	 *
89179102Syongari	 * attach/detach device instance, called from GSD attach(9E)/detach(9E)
90179102Syongari	 */
91179102Syongari	int	(*ds_attach)(ds_attach_info_t *aip);
92179102Syongari	void	(*ds_detach)(ds_hdl_t);
93179102Syongari
94179102Syongari	/*
95179102Syongari	 * register/unregister interrupt callbacks for the given port
96179102Syongari	 */
97179102Syongari	int	(*ds_register_cb)(ds_hdl_t, uint_t port_num, ds_cb_t *cb);
98179102Syongari	void	(*ds_unregister_cb)(ds_hdl_t, uint_t port_num);
99179102Syongari
100179102Syongari	/*
101179102Syongari	 * open/close port
102179102Syongari	 */
103179102Syongari	int	(*ds_open_port)(ds_hdl_t, uint_t port_num);
104179102Syongari	int	(*ds_close_port)(ds_hdl_t, uint_t port_num);
105179102Syongari
106179102Syongari	/*
107179102Syongari	 * power management
108179102Syongari	 * ----------------
109179102Syongari	 *
110179102Syongari	 * set power level of the component;
111179102Syongari	 * DSD should set new_state to the resulting USB device state
112179102Syongari	 */
113179102Syongari	int	(*ds_usb_power)(ds_hdl_t, int comp, int level, int *new_state);
114179102Syongari
115179102Syongari	/*
116179102Syongari	 * CPR suspend/resume
117179102Syongari	 */
118179102Syongari	int	(*ds_suspend)(ds_hdl_t);
119179102Syongari	int	(*ds_resume)(ds_hdl_t);
120179102Syongari
121179102Syongari	/*
122183137Syongari	 * USB device disconnect/reconnect
123183137Syongari	 */
124179102Syongari	int	(*ds_disconnect)(ds_hdl_t);
125179102Syongari	int	(*ds_reconnect)(ds_hdl_t);
126179102Syongari
127179102Syongari	/*
128179102Syongari	 * standard UART operations
129179102Syongari	 * ------------------------
130179102Syongari	 *
131179102Syongari	 * set one or more port parameters: baud rate, parity,
132179102Syongari	 * stop bits, character size, xon/xoff char, flow control
133179102Syongari	 */
134179102Syongari	int	(*ds_set_port_params)(ds_hdl_t, uint_t port_num,
135179348Syongari			ds_port_params_t *tp);
136179348Syongari
137179102Syongari	/*
138179102Syongari	 * set modem controls: each bit set to 1 in 'mask' will be set to the
139179102Syongari	 * value of corresponding bit in 'val'; other bits are not affected
140179102Syongari	 */
141179102Syongari	int	(*ds_set_modem_ctl)(ds_hdl_t, uint_t port_num,
142179102Syongari			int mask, int val);
143179102Syongari
144179102Syongari	/*
145179102Syongari	 * get modem control/status: values of bits that correspond
146179102Syongari	 * to those set to 1 in 'mask' are returned in 'valp'
147179102Syongari	 */
148179102Syongari	int	(*ds_get_modem_ctl)(ds_hdl_t, uint_t port_num,
149179102Syongari			int mask, int *valp);
150179102Syongari
151179102Syongari	/*
152179102Syongari	 * set/clear break ('ctl' is DS_ON/DS_OFF)
153179102Syongari	 */
154179102Syongari	int	(*ds_break_ctl)(ds_hdl_t, uint_t port_num, int ctl);
155179102Syongari
156179102Syongari	/*
157179102Syongari	 * set/clear internal loopback ('ctl' is DS_ON/DS_OFF)
158179102Syongari	 */
159179102Syongari	int	(*ds_loopback)(ds_hdl_t, uint_t port_num, int ctl);
160179102Syongari
161179102Syongari	/*
162179102Syongari	 * data xfer
163179102Syongari	 * ---------
164179102Syongari	 *
165179102Syongari	 * data transmit: DSD is *required* to accept mblk for transfer and
166179102Syongari	 * return USB_SUCCESS; after which GSD no longer owns the mblk
167179102Syongari	 */
168179102Syongari	int	(*ds_tx)(ds_hdl_t, uint_t port_num, mblk_t *mp);
169179102Syongari
170179102Syongari	/*
171179102Syongari	 * data receipt: DSD returns either received data mblk or NULL
172179102Syongari	 * if no data available. this op must not block as it is intended
173179102Syongari	 * to be called from is usually called GSD receive callback
174179102Syongari	 */
175179102Syongari	mblk_t	*(*ds_rx)(ds_hdl_t, uint_t port_num);
176179102Syongari
177179102Syongari	/*
178179102Syongari	 * stop/start data transmit or/and receive:
179179102Syongari	 * 'dir' can be an OR of DS_TX and DS_RX; must succeed.
180179102Syongari	 */
181179102Syongari	void	(*ds_stop)(ds_hdl_t, uint_t port_num, int dir);
182179102Syongari	void	(*ds_start)(ds_hdl_t, uint_t port_num, int dir);
183179102Syongari
184179102Syongari	/*
185179102Syongari	 * flush FIFOs: 'dir' can be an OR of DS_TX and DS_RX,
186179102Syongari	 * affecting transmit and received FIFO respectively
187179102Syongari	 */
188	int	(*ds_fifo_flush)(ds_hdl_t, uint_t port_num, int dir);
189
190	/*
191	 * drain (wait until empty) output FIFO
192	 *
193	 * return failure if the FIFO does not get empty after at least
194	 * 'timeout' seconds (zero timeout means wait forever)
195	 */
196	int	(*ds_fifo_drain)(ds_hdl_t, uint_t port_num, int timeout);
197
198	/* V1 ops for polled I/O */
199	usb_pipe_handle_t (*ds_out_pipe)(ds_hdl_t, uint_t port_num);
200	usb_pipe_handle_t (*ds_in_pipe)(ds_hdl_t, uint_t port_num);
201} ds_ops_t;
202
203/*
204 * ds_version
205 */
206enum {
207	DS_OPS_VERSION_V0	= 0,
208	DS_OPS_VERSION_V1	= 1,
209	DS_OPS_VERSION		= DS_OPS_VERSION_V1
210};
211
212/*
213 * parameter type
214 */
215typedef enum {
216	DS_PARAM_BAUD,		/* baud rate */
217	DS_PARAM_PARITY,	/* parity */
218	DS_PARAM_STOPB,		/* stop bits */
219	DS_PARAM_CHARSZ,	/* char size */
220	DS_PARAM_XON_XOFF,	/* xon/xoff chars */
221	DS_PARAM_FLOW_CTL	/* flow control */
222} ds_port_param_type_t;
223
224/*
225 * a single param entry, union used to pass various data types
226 */
227typedef struct ds_port_param_entry {
228	ds_port_param_type_t	param;	 /* parameter */
229	union {
230		uint_t		ui;
231		uchar_t		uc[4];
232	} val;			/* parameter value(s) */
233} ds_port_param_entry_t;
234
235/*
236 * port parameter array
237 */
238struct ds_port_params {
239	ds_port_param_entry_t	*tp_entries;	/* entry array */
240	int			tp_cnt;		/* entry count */
241};
242
243/*
244 * direction (ds_fifo_flush, ds_fifo_drain)
245 */
246enum {
247	DS_TX		= 0x01,	/* transmit direction */
248	DS_RX		= 0x02	/* receive direction */
249};
250
251/*
252 * on/off (ds_break_ctl, ds_loopback)
253 */
254enum {
255	DS_OFF,
256	DS_ON
257};
258
259/*
260 * input error codes, returned by DSD in an M_BREAK message
261 */
262enum {
263	DS_PARITY_ERR	= 0x01,	/* parity error */
264	DS_FRAMING_ERR	= 0x02,	/* framing error */
265	DS_OVERRUN_ERR	= 0x03,	/* data overrun */
266	DS_BREAK_ERR	= 0x04	/* break detected */
267};
268
269#ifdef	__cplusplus
270}
271#endif
272
273#endif	/* _SYS_USB_USBSER_DSDI_H */
274