14de26129Sxs /*
24de26129Sxs  * CDDL HEADER START
34de26129Sxs  *
44de26129Sxs  * The contents of this file are subject to the terms of the
5cbab2b26Slg  * Common Development and Distribution License (the "License").
6cbab2b26Slg  * You may not use this file except in compliance with the License.
74de26129Sxs  *
84de26129Sxs  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
94de26129Sxs  * or http://www.opensolaris.org/os/licensing.
104de26129Sxs  * See the License for the specific language governing permissions
114de26129Sxs  * and limitations under the License.
124de26129Sxs  *
134de26129Sxs  * When distributing Covered Code, include this CDDL HEADER in each
144de26129Sxs  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
154de26129Sxs  * If applicable, add the following below this CDDL HEADER, with the
164de26129Sxs  * fields enclosed by brackets "[]" replaced with your own identifying
174de26129Sxs  * information: Portions Copyright [yyyy] [name of copyright owner]
184de26129Sxs  *
194de26129Sxs  * CDDL HEADER END
204de26129Sxs  */
214de26129Sxs /*
22*d29f5a71Szhigang lu - Sun Microsystems - Beijing China  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
234de26129Sxs  * Use is subject to license terms.
244de26129Sxs  */
254de26129Sxs 
264de26129Sxs #ifndef _SYS_USB_USBSER_PL2303_VAR_H
274de26129Sxs #define	_SYS_USB_USBSER_PL2303_VAR_H
284de26129Sxs 
294de26129Sxs 
304de26129Sxs /*
314de26129Sxs  * USB PL2303 definitions
324de26129Sxs  */
334de26129Sxs 
344de26129Sxs #include <sys/types.h>
354de26129Sxs #include <sys/dditypes.h>
364de26129Sxs #include <sys/note.h>
374de26129Sxs 
384de26129Sxs #include <sys/usb/clients/usbser/usbser_dsdi.h>
394de26129Sxs 
404de26129Sxs #ifdef	__cplusplus
414de26129Sxs extern "C" {
424de26129Sxs #endif
434de26129Sxs 
444de26129Sxs /*
454de26129Sxs  * PM support
464de26129Sxs  */
474de26129Sxs typedef struct pl2303_power {
484de26129Sxs 	uint8_t		pm_wakeup_enabled;	/* remote wakeup enabled */
494de26129Sxs 	uint8_t		pm_pwr_states;	/* bit mask of power states */
504de26129Sxs 	boolean_t	pm_raise_power;	/* driver is about to raise power */
514de26129Sxs 	uint8_t		pm_cur_power;	/* current power level */
524de26129Sxs 	uint_t		pm_busy_cnt;	/* number of set_busy requests */
534de26129Sxs } pl2303_pm_t;
544de26129Sxs 
554de26129Sxs 
564de26129Sxs /*
574de26129Sxs  * From device driver's perspective, there is no difference
58cbab2b26Slg  * between PL-2303HX(Chip A) and PL-2303X chips, so PL-2303X will
594de26129Sxs  * stand for two chiptypes
604de26129Sxs  */
614de26129Sxs enum pl2303_chip {
624de26129Sxs 	pl2303_H,		/* PL-2303H chip */
63cbab2b26Slg 	pl2303_X,		/* PL-2303X chip or PL-2303HX(Chip A) */
64cbab2b26Slg 	pl2303_HX_CHIP_D,	/* PL-2303HX(Chip D) */
65cbab2b26Slg 	pl2303_UNKNOWN		/* Unknown chip type */
664de26129Sxs };
674de26129Sxs 
684de26129Sxs /*
694de26129Sxs  * per device state structure
704de26129Sxs  */
714de26129Sxs typedef struct pl2303_state {
724de26129Sxs 	kmutex_t		pl_mutex;		/* structure lock */
734de26129Sxs 	dev_info_t		*pl_dip;		/* device info */
744de26129Sxs 	int			pl_dev_flags;		/* device flags */
754de26129Sxs 	int			pl_port_state;		/* port state */
764de26129Sxs 	int			pl_port_flags;		/* port flags */
774de26129Sxs 	ds_cb_t			pl_cb;			/* DSD callbacks */
784de26129Sxs 	/*
794de26129Sxs 	 * USBA
804de26129Sxs 	 */
814de26129Sxs 	usb_client_dev_data_t	*pl_dev_data;		/* registration data */
824de26129Sxs 	usb_event_t		*pl_usb_events;		/* usb events */
834de26129Sxs 	usb_pipe_handle_t	pl_def_ph;		/* default pipe hdl */
844de26129Sxs 	usb_pipe_handle_t	pl_bulkin_ph;		/* in pipe hdl */
854de26129Sxs 	int			pl_bulkin_state;	/* in pipe state */
864de26129Sxs 	usb_pipe_handle_t	pl_bulkout_ph;		/* in pipe hdl */
874de26129Sxs 	int			pl_bulkout_state;	/* out pipe state */
884de26129Sxs 	usb_log_handle_t	pl_lh;			/* USBA log handle */
894de26129Sxs 	int			pl_dev_state;		/* USB device state */
904de26129Sxs 	size_t			pl_xfer_sz;		/* HCI bulk xfer size */
914de26129Sxs 	pl2303_pm_t		*pl_pm;			/* PM support */
924de26129Sxs 	/*
934de26129Sxs 	 * data receipt and transmit
944de26129Sxs 	 */
954de26129Sxs 	mblk_t			*pl_rx_mp;		/* rx data */
964de26129Sxs 	mblk_t			*pl_tx_mp;		/* tx data */
974de26129Sxs 	kcondvar_t		pl_tx_cv;		/* tx completion */
984de26129Sxs 	/*
994de26129Sxs 	 * other
1004de26129Sxs 	 */
1014de26129Sxs 	uint8_t			pl_mctl;		/* modem controls */
1024de26129Sxs 	enum pl2303_chip	pl_chiptype;		/* chip type */
1034de26129Sxs } pl2303_state_t;
1044de26129Sxs 
1054de26129Sxs _NOTE(MUTEX_PROTECTS_DATA(pl2303_state::pl_mutex, pl2303_state))
1064de26129Sxs _NOTE(DATA_READABLE_WITHOUT_LOCK(pl2303_state::{
1074de26129Sxs 	pl_dip
1084de26129Sxs 	pl_dev_data
1094de26129Sxs 	pl_usb_events
1104de26129Sxs 	pl_def_ph
1114de26129Sxs 	pl_lh
1124de26129Sxs 	pl_xfer_sz
1134de26129Sxs 	pl_pm
1144de26129Sxs 	pl_port_state
1154de26129Sxs 	pl_cb.cb_rx
1164de26129Sxs 	pl_cb.cb_tx
1174de26129Sxs 	pl_cb.cb_arg
1184de26129Sxs 	pl_bulkin_ph
1194de26129Sxs 	pl_bulkout_ph
1204de26129Sxs 	pl_chiptype
1214de26129Sxs }))
1224de26129Sxs 
1234de26129Sxs 
1244de26129Sxs /* port state */
1254de26129Sxs enum {
1264de26129Sxs 	PL2303_PORT_CLOSED,			/* port is closed */
1274de26129Sxs 	PL2303_PORT_OPEN,			/* port is open */
1284de26129Sxs 	PL2303_PORT_CLOSING
1294de26129Sxs };
1304de26129Sxs 
1314de26129Sxs /* port flags */
1324de26129Sxs enum {
1334de26129Sxs 	PL2303_PORT_TX_STOPPED	= 0x0001	/* transmit not allowed */
1344de26129Sxs };
1354de26129Sxs 
1364de26129Sxs /* pipe state */
1374de26129Sxs enum {
1384de26129Sxs 	PL2303_PIPE_CLOSED,			/* pipe is closed */
1394de26129Sxs 	PL2303_PIPE_IDLE,			/* open but no requests */
1404de26129Sxs 	PL2303_PIPE_BUSY			/* servicing request */
1414de26129Sxs };
1424de26129Sxs 
1434de26129Sxs /* various tunables */
1444de26129Sxs enum {
1454de26129Sxs 	PL2303_BULKOUT_TIMEOUT		= 15,	/* bulkout timeout */
1464de26129Sxs 	PL2303_BULKIN_TIMEOUT		= 15,	/* bulkin timeout */
1474de26129Sxs 	PL2303_XFER_SZ_MAX		= 64,	/* max xfer size */
1486918308bSyz 	PL2303_CLEANUP_LEVEL_MAX	= 6	/* cleanup level */
1494de26129Sxs };
1504de26129Sxs 
1514de26129Sxs 
1524de26129Sxs /*
1534de26129Sxs  * debug printing masks
1544de26129Sxs  */
1554de26129Sxs #define	DPRINT_ATTACH		0x00000001
1564de26129Sxs #define	DPRINT_OPEN		0x00000002
1574de26129Sxs #define	DPRINT_CLOSE		0x00000004
1584de26129Sxs #define	DPRINT_DEF_PIPE		0x00000010
1594de26129Sxs #define	DPRINT_IN_PIPE		0x00000020
1604de26129Sxs #define	DPRINT_OUT_PIPE		0x00000040
1614de26129Sxs #define	DPRINT_IN_DATA		0x00000400
1624de26129Sxs #define	DPRINT_OUT_DATA		0x00000800
1634de26129Sxs #define	DPRINT_CTLOP		0x00001000
1644de26129Sxs #define	DPRINT_HOTPLUG		0x00002000
1654de26129Sxs #define	DPRINT_PM		0x00004000
1664de26129Sxs #define	DPRINT_MASK_ALL		0xFFFFFFFF
1674de26129Sxs 
1684de26129Sxs 
1694de26129Sxs /*
1704de26129Sxs  * misc macros
1714de26129Sxs  */
1724de26129Sxs #define	NELEM(a)	(sizeof (a) / sizeof (*(a)))
1734de26129Sxs 
1744de26129Sxs #ifdef	__cplusplus
1754de26129Sxs }
1764de26129Sxs #endif
1774de26129Sxs 
1784de26129Sxs #endif	/* _SYS_USB_USBSER_PL2303_VAR_H */
179