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 * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
22 * Use is subject to license terms.
23 */
24
25#ifndef _SYS_USB_USBPRN_H
26#define	_SYS_USB_USBPRN_H
27
28
29#ifdef	__cplusplus
30extern "C" {
31#endif
32
33#include <sys/usb/usba/usbai_private.h>
34
35/*
36 * This header file contains internal driver structures info
37 *
38 * Write timeout values for 1K of data transfer
39 */
40#define	USBPRN_XFER_TIMEOUT	90	/* default timeout is 90 seconds */
41#define	USBPRN_XFER_TIMEOUT_MIN	1	/* min timeout is 1 second */
42#define	USBPRN_XFER_TIMEOUT_MAX	300	/* max timeout is 5 minutes */
43
44/* ps_flags values */
45#define	USBPRN_PS_IDLE			0x00 /* no activity on any pipe */
46#define	USBPRN_PS_NEED_TO_XFER		0x01 /* transfer to start */
47
48/* Maximum transfer size */
49#define	USBPRN_MAX_XFER_SIZE	(8 * 1024)
50
51/*
52 * Per pipe state information
53 */
54typedef struct usbprn_ps {
55	usb_ep_descr_t		ps_ept_descr;	/* endpoint descriptor */
56	usb_pipe_handle_t	ps_handle;	/* pipe handle */
57	usb_pipe_policy_t	ps_policy;	/* pipe policy */
58	int			ps_flags;	/* state flags */
59	int			ps_cr;		/* save last cr */
60} usbprn_ps_t;
61
62_NOTE(SCHEME_PROTECTS_DATA("USBA", usbprn_ps::ps_handle))
63
64/*
65 * PM support
66 */
67typedef struct usbprn_power  {
68	/* device busy accounting */
69	int		usbprn_pm_busy;
70	uint8_t		usbprn_wakeup_enabled;
71
72	/* this is the bit mask of the power states that device has */
73	uint8_t		usbprn_pwr_states;
74
75	/* wakeup and power transistion capabilites of an interface */
76	uint8_t		usbprn_pm_capabilities;
77
78	uint8_t		usbprn_current_power;
79} usbprn_power_t;
80
81
82/*
83 * State structure
84 */
85typedef struct usbprn_state {
86	dev_info_t	*usbprn_dip;		/* per-device info handle */
87	int		usbprn_dev_state;	/* USB device state */
88	kmutex_t	usbprn_mutex;		/* for general locking */
89	int		usbprn_instance;	/* instance number */
90	int		usbprn_flags;
91
92	usb_client_dev_data_t *usbprn_dev_data;	/* registration data */
93
94	size_t		usbprn_max_bulk_xfer_size;	/* max txfer size */
95	char		*usbprn_device_id;	/* Device id string */
96	int		usbprn_device_id_len;	/* Device id length */
97
98	/* serialize access */
99	usb_serialization_t usbprn_ser_acc;
100	usb_serialization_t usbprn_write_acc;
101	usb_serialization_t usbprn_dev_acc;
102
103	/* mblk_t that contains the data to be sent */
104	mblk_t		*usbprn_bulk_mp;
105
106	struct	buf	*usbprn_bp;		/* Buffer ptr for strategy */
107
108	usb_pipe_handle_t usbprn_def_ph;	/* default pipe handle */
109
110	usbprn_ps_t	usbprn_bulk_out;	/* bulk out info */
111	usbprn_ps_t	usbprn_bulk_in;		/* bulk in info */
112
113	usb_log_handle_t usbprn_log_handle;	/* log handle */
114	usb_cfg_descr_t usbprn_config_descr;	/* config desc */
115	usb_if_descr_t	 usbprn_if_descr;	/* interface descr */
116
117	char		usbprn_last_status;	/* last port status */
118
119	usbprn_power_t	*usbprn_pm;		/* Power components */
120
121	struct ecpp_transfer_parms usbprn_setparms; /* Set xfer parameters */
122	struct prn_timeouts	usbprn_prn_timeouts;	/* prnio timeouts */
123
124	usb_ugen_hdl_t	usbprn_ugen_hdl;		/* ugen support */
125} usbprn_state_t;
126
127/* warlock directives, stable data */
128_NOTE(MUTEX_PROTECTS_DATA(usbprn_state_t::usbprn_mutex, usbprn_state_t))
129_NOTE(DATA_READABLE_WITHOUT_LOCK(usbprn_state_t::usbprn_dip))
130_NOTE(DATA_READABLE_WITHOUT_LOCK(usbprn_state_t::usbprn_ugen_hdl))
131_NOTE(DATA_READABLE_WITHOUT_LOCK(usbprn_state_t::usbprn_pm))
132_NOTE(DATA_READABLE_WITHOUT_LOCK(usbprn_state_t::usbprn_instance))
133_NOTE(DATA_READABLE_WITHOUT_LOCK(usbprn_state_t::usbprn_log_handle))
134_NOTE(DATA_READABLE_WITHOUT_LOCK(usbprn_state_t::usbprn_if_descr))
135_NOTE(DATA_READABLE_WITHOUT_LOCK(usbprn_state_t::usbprn_dev_data))
136_NOTE(DATA_READABLE_WITHOUT_LOCK(usbprn_state_t::usbprn_ser_acc))
137_NOTE(DATA_READABLE_WITHOUT_LOCK(usbprn_state_t::usbprn_write_acc))
138_NOTE(DATA_READABLE_WITHOUT_LOCK(usbprn_state_t::usbprn_dev_acc))
139_NOTE(DATA_READABLE_WITHOUT_LOCK(usbprn_state_t::usbprn_def_ph))
140_NOTE(DATA_READABLE_WITHOUT_LOCK(usbprn_state_t::usbprn_device_id))
141_NOTE(DATA_READABLE_WITHOUT_LOCK(usbprn_state_t::usbprn_device_id_len))
142_NOTE(SCHEME_PROTECTS_DATA("stable data", usb_pipe_policy))
143_NOTE(SCHEME_PROTECTS_DATA("unshared data", mblk_t))
144_NOTE(SCHEME_PROTECTS_DATA("unshared data", usb_bulk_req))
145
146
147/* Values for usbprn_flags */
148#define	USBPRN_LOCKS_INIT_DONE	0x01	/* locks have been init'ed */
149#define	USBPRN_OPEN		0x02	/* Device is open */
150
151
152/* Macros */
153
154/*
155 * Check if it the device is not being closed
156 * or not being disconnected or not being suspended
157 */
158#define	USBPRN_DEVICE_ACCESS_OK(s) \
159	(((s)->usbprn_flags & USBPRN_OPEN) && \
160	(((s)->usbprn_dev_state == USB_DEV_ONLINE)))
161
162/* Check if the pipes are idle or closed */
163#define	USBPRN_PIPES_BUSY(s) \
164	(((s)->usbprn_default.ps_flags != USBPRN_PS_IDLE) || \
165	((s)->usbprn_bulk_out.ps_flags != USBPRN_PS_IDLE) || \
166	((s)->usbprn_bulk_in.ps_flags != USBPRN_PS_IDLE))
167
168/*
169 * Debug message Masks
170 */
171#define	PRINT_MASK_ATTA		0x00000001	/* attach/detach */
172#define	PRINT_MASK_OPEN		0x00000002
173#define	PRINT_MASK_CLOSE	0x00000004
174#define	PRINT_MASK_EVENTS	0x00000008
175#define	PRINT_MASK_PM		0x00000010
176#define	PRINT_MASK_CPR		0x00000020
177#define	PRINT_MASK_ALL		0xFFFFFFFF
178
179/* log message breakup */
180#define	USBPRN_PRINT_MAXLINE	80
181
182/* max device id length */
183#define	USBPRN_MAX_DEVICE_ID_LENGTH	1024
184
185/* ugen support */
186#define	USBPRN_MINOR_UGEN_BITS_MASK	0xff
187#define	USBPRN_MINOR_INSTANCE_SHIFT	8
188#define	USBPRN_MINOR_INSTANCE_MASK	~USBPRN_MINOR_UGEN_BITS_MASK
189#define	USBPRN_MINOR_TO_INSTANCE(minor) \
190	(((minor) & USBPRN_MINOR_INSTANCE_MASK) >> \
191	USBPRN_MINOR_INSTANCE_SHIFT)
192
193
194#ifdef __cplusplus
195}
196#endif
197
198#endif	/* _SYS_USB_USBPRN_H */
199