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 2009 Sun Microsystems, Inc.  All rights reserved.
23  * Use is subject to license terms.
24  */
25 /*
26  * Copyright 2013 Hans Rosenfeld <rosenfeld@grumpf.hope-2000.org>
27  */
28 
29 #ifndef _USBSER_USBFTDI_UFTDI_VAR_H
30 #define	_USBSER_USBFTDI_UFTDI_VAR_H
31 
32 /*
33  * USB UFTDI definitions
34  */
35 
36 #include <sys/types.h>
37 #include <sys/dditypes.h>
38 #include <sys/note.h>
39 
40 #include <sys/usb/clients/usbser/usbser_dsdi.h>
41 
42 #ifdef	__cplusplus
43 extern "C" {
44 #endif
45 
46 /*
47  * PM support
48  */
49 typedef struct uftdi_pm {
50 	uint8_t		pm_wakeup_enabled;	/* remote wakeup enabled */
51 	uint8_t		pm_pwr_states;	/* bit mask of power states */
52 	boolean_t	pm_raise_power;	/* driver is about to raise power */
53 	uint8_t		pm_cur_power;	/* current power level */
54 	uint_t		pm_busy_cnt;	/* number of set_busy requests */
55 } uftdi_pm_t;
56 
57 typedef struct uftdi_regs {
58 	uint16_t	ur_baud;
59 	uint16_t	ur_data;
60 	uint16_t	ur_flowval;
61 	uint16_t	ur_flowidx;
62 } uftdi_regs_t;
63 
64 _NOTE(SCHEME_PROTECTS_DATA("uftdi_regs", uftdi_regs))
65 
66 /*
67  * per device state structure
68  */
69 typedef struct uftdi_state {
70 	kmutex_t		uf_lock;		/* structure lock */
71 	dev_info_t		*uf_dip;		/* device info */
72 	int			uf_dev_flags;		/* device flags */
73 	int			uf_hwport;		/* hw port number */
74 	int			uf_port_state;		/* port state */
75 	int			uf_port_flags;		/* port flags */
76 	ds_cb_t			uf_cb;			/* DSD callbacks */
77 
78 	/*
79 	 * USBA
80 	 */
81 	usb_client_dev_data_t	*uf_dev_data;		/* registration data */
82 	usb_event_t		*uf_usb_events;		/* usb events */
83 	usb_pipe_handle_t	uf_def_ph;		/* default pipe hdl */
84 	usb_pipe_handle_t	uf_bulkin_ph;		/* in pipe hdl */
85 	int			uf_bulkin_state;	/* in pipe state */
86 	usb_pipe_handle_t	uf_bulkout_ph;		/* in pipe hdl */
87 	int			uf_bulkout_state;	/* out pipe state */
88 	usb_log_handle_t	uf_lh;			/* USBA log handle */
89 	int			uf_dev_state;		/* USB device state */
90 	size_t			uf_ibuf_sz;		/* input buffer size */
91 	size_t			uf_obuf_sz;		/* output buffer size */
92 
93 	uftdi_pm_t		*uf_pm;			/* PM support */
94 
95 	/*
96 	 * data receive and transmit
97 	 */
98 	mblk_t			*uf_rx_mp;		/* rx data */
99 	mblk_t			*uf_tx_mp;		/* tx data */
100 	kcondvar_t		uf_tx_cv;		/* tx completion */
101 
102 	/*
103 	 * soft registers
104 	 */
105 	uftdi_regs_t		uf_softr;	/* config registers */
106 	uint16_t		uf_mctl;	/* modem control */
107 	uint8_t			uf_msr;		/* modem status */
108 	uint8_t			uf_lsr;		/* line status register */
109 
110 } uftdi_state_t;
111 
112 _NOTE(MUTEX_PROTECTS_DATA(uftdi_state::uf_lock, uftdi_state))
113 _NOTE(DATA_READABLE_WITHOUT_LOCK(uftdi_state::{
114 	uf_dip
115 	uf_dev_data
116 	uf_usb_events
117 	uf_def_ph
118 	uf_lh
119 	uf_ibuf_sz
120 	uf_obuf_sz
121 	uf_pm
122 	uf_port_state
123 	uf_cb
124 	uf_bulkin_ph
125 	uf_bulkout_ph
126 	uf_hwport
127 }))
128 
129 /* port state */
130 enum {
131 	UFTDI_PORT_CLOSED,			/* port is closed */
132 	UFTDI_PORT_OPEN,			/* port is open */
133 	UFTDI_PORT_CLOSING
134 };
135 
136 /* port flags */
137 enum {
138 	UFTDI_PORT_TX_STOPPED	= 0x0001	/* transmit not allowed */
139 };
140 
141 /* pipe state */
142 enum {
143 	UFTDI_PIPE_CLOSED,			/* pipe is closed */
144 	UFTDI_PIPE_IDLE,			/* open but no requests */
145 	UFTDI_PIPE_BUSY			/* servicing request */
146 };
147 
148 /* various numbers */
149 enum {
150 	UFTDI_BULKOUT_TIMEOUT		= 15,	/* bulkout timeout */
151 	UFTDI_BULKIN_TIMEOUT		= 15,	/* bulkin timeout */
152 	UFTDI_XFER_SZ_MAX		= 64,	/* max xfer size */
153 	UFTDI_CLEANUP_LEVEL_MAX	= 6	/* cleanup level */
154 };
155 
156 
157 /*
158  * debug printing masks
159  */
160 #define	DPRINT_ATTACH		0x00000001
161 #define	DPRINT_OPEN		0x00000002
162 #define	DPRINT_CLOSE		0x00000004
163 #define	DPRINT_DEF_PIPE		0x00000010
164 #define	DPRINT_IN_PIPE		0x00000020
165 #define	DPRINT_OUT_PIPE		0x00000040
166 #define	DPRINT_IN_DATA		0x00000400
167 #define	DPRINT_OUT_DATA		0x00000800
168 #define	DPRINT_CTLOP		0x00001000
169 #define	DPRINT_HOTPLUG		0x00002000
170 #define	DPRINT_PM		0x00004000
171 #define	DPRINT_MASK_ALL		0xFFFFFFFF
172 
173 #ifdef	__cplusplus
174 }
175 #endif
176 
177 #endif	/* _USBSER_USBFTDI_UFTDI_VAR_H */
178