xref: /illumos-gate/usr/src/uts/common/sys/usb/clients/usbser/usbsprl/pl2303_var.h (revision 355b4669e025ff377602b6fc7caaf30dbc218371)
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 2006 Sun Microsystems, Inc.  All rights reserved.
23  * Use is subject to license terms.
24  */
25 
26 #ifndef _SYS_USB_USBSER_PL2303_VAR_H
27 #define	_SYS_USB_USBSER_PL2303_VAR_H
28 
29 #pragma ident	"%Z%%M%	%I%	%E% SMI"
30 
31 /*
32  * USB PL2303 definitions
33  */
34 
35 #include <sys/types.h>
36 #include <sys/dditypes.h>
37 #include <sys/note.h>
38 
39 #include <sys/usb/clients/usbser/usbser_dsdi.h>
40 
41 #ifdef	__cplusplus
42 extern "C" {
43 #endif
44 
45 /*
46  * PM support
47  */
48 typedef struct pl2303_power {
49 	uint8_t		pm_wakeup_enabled;	/* remote wakeup enabled */
50 	uint8_t		pm_pwr_states;	/* bit mask of power states */
51 	boolean_t	pm_raise_power;	/* driver is about to raise power */
52 	uint8_t		pm_cur_power;	/* current power level */
53 	uint_t		pm_busy_cnt;	/* number of set_busy requests */
54 } pl2303_pm_t;
55 
56 
57 /*
58  * From device driver's perspective, there is no difference
59  * between PL-2303HX(Chip A) and PL-2303X chips, so PL-2303X will
60  * stand for two chiptypes
61  */
62 enum pl2303_chip {
63 	pl2303_H,		/* PL-2303H chip */
64 	pl2303_X,		/* PL-2303X chip or PL-2303HX(Chip A) */
65 	pl2303_HX_CHIP_D,	/* PL-2303HX(Chip D) */
66 	pl2303_UNKNOWN		/* Unknown chip type */
67 };
68 
69 /*
70  * per device state structure
71  */
72 typedef struct pl2303_state {
73 	kmutex_t		pl_mutex;		/* structure lock */
74 	dev_info_t		*pl_dip;		/* device info */
75 	int			pl_dev_flags;		/* device flags */
76 	int			pl_port_state;		/* port state */
77 	int			pl_port_flags;		/* port flags */
78 	ds_cb_t			pl_cb;			/* DSD callbacks */
79 	/*
80 	 * USBA
81 	 */
82 	usb_client_dev_data_t	*pl_dev_data;		/* registration data */
83 	usb_event_t		*pl_usb_events;		/* usb events */
84 	usb_pipe_handle_t	pl_def_ph;		/* default pipe hdl */
85 	usb_pipe_handle_t	pl_bulkin_ph;		/* in pipe hdl */
86 	int			pl_bulkin_state;	/* in pipe state */
87 	usb_pipe_handle_t	pl_bulkout_ph;		/* in pipe hdl */
88 	int			pl_bulkout_state;	/* out pipe state */
89 	usb_log_handle_t	pl_lh;			/* USBA log handle */
90 	int			pl_dev_state;		/* USB device state */
91 	size_t			pl_xfer_sz;		/* HCI bulk xfer size */
92 	pl2303_pm_t		*pl_pm;			/* PM support */
93 	/*
94 	 * data receipt and transmit
95 	 */
96 	mblk_t			*pl_rx_mp;		/* rx data */
97 	mblk_t			*pl_tx_mp;		/* tx data */
98 	kcondvar_t		pl_tx_cv;		/* tx completion */
99 	/*
100 	 * other
101 	 */
102 	uint8_t			pl_mctl;		/* modem controls */
103 	enum pl2303_chip	pl_chiptype;		/* chip type */
104 } pl2303_state_t;
105 
106 _NOTE(MUTEX_PROTECTS_DATA(pl2303_state::pl_mutex, pl2303_state))
107 _NOTE(DATA_READABLE_WITHOUT_LOCK(pl2303_state::{
108 	pl_dip
109 	pl_dev_data
110 	pl_usb_events
111 	pl_def_ph
112 	pl_lh
113 	pl_xfer_sz
114 	pl_pm
115 	pl_port_state
116 	pl_cb.cb_rx
117 	pl_cb.cb_tx
118 	pl_cb.cb_arg
119 	pl_bulkin_ph
120 	pl_bulkout_ph
121 	pl_chiptype
122 }))
123 
124 
125 /* port state */
126 enum {
127 	PL2303_PORT_CLOSED,			/* port is closed */
128 	PL2303_PORT_OPEN,			/* port is open */
129 	PL2303_PORT_CLOSING
130 };
131 
132 /* port flags */
133 enum {
134 	PL2303_PORT_TX_STOPPED	= 0x0001	/* transmit not allowed */
135 };
136 
137 /* pipe state */
138 enum {
139 	PL2303_PIPE_CLOSED,			/* pipe is closed */
140 	PL2303_PIPE_IDLE,			/* open but no requests */
141 	PL2303_PIPE_BUSY			/* servicing request */
142 };
143 
144 /* various tunables */
145 enum {
146 	PL2303_BULKOUT_TIMEOUT		= 15,	/* bulkout timeout */
147 	PL2303_BULKIN_TIMEOUT		= 15,	/* bulkin timeout */
148 	PL2303_XFER_SZ_MAX		= 64,	/* max xfer size */
149 	PL2303_CLEANUP_LEVEL_MAX	= 6	/* cleanup level */
150 };
151 
152 
153 /*
154  * debug printing masks
155  */
156 #define	DPRINT_ATTACH		0x00000001
157 #define	DPRINT_OPEN		0x00000002
158 #define	DPRINT_CLOSE		0x00000004
159 #define	DPRINT_DEF_PIPE		0x00000010
160 #define	DPRINT_IN_PIPE		0x00000020
161 #define	DPRINT_OUT_PIPE		0x00000040
162 #define	DPRINT_IN_DATA		0x00000400
163 #define	DPRINT_OUT_DATA		0x00000800
164 #define	DPRINT_CTLOP		0x00001000
165 #define	DPRINT_HOTPLUG		0x00002000
166 #define	DPRINT_PM		0x00004000
167 #define	DPRINT_MASK_ALL		0xFFFFFFFF
168 
169 
170 /*
171  * misc macros
172  */
173 #define	NELEM(a)	(sizeof (a) / sizeof (*(a)))
174 
175 #ifdef	__cplusplus
176 }
177 #endif
178 
179 #endif	/* _SYS_USB_USBSER_PL2303_VAR_H */
180