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