summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/sys/usb/clients/printer/usbprn.h
blob: 5d84f3f3d7447b0177ed38da33a838324095dec8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License (the "License").
 * You may not use this file except in compliance with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 *
 * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

#ifndef _SYS_USB_USBPRN_H
#define	_SYS_USB_USBPRN_H


#ifdef	__cplusplus
extern "C" {
#endif

#include <sys/usb/usba/usbai_private.h>

/*
 * This header file contains internal driver structures info
 *
 * Write timeout values for 1K of data transfer
 */
#define	USBPRN_XFER_TIMEOUT	90	/* default timeout is 90 seconds */
#define	USBPRN_XFER_TIMEOUT_MIN	1	/* min timeout is 1 second */
#define	USBPRN_XFER_TIMEOUT_MAX	300	/* max timeout is 5 minutes */

/* ps_flags values */
#define	USBPRN_PS_IDLE			0x00 /* no activity on any pipe */
#define	USBPRN_PS_NEED_TO_XFER		0x01 /* transfer to start */

/* Maximum transfer size */
#define	USBPRN_MAX_XFER_SIZE	(8 * 1024)

/*
 * Per pipe state information
 */
typedef struct usbprn_ps {
	usb_ep_descr_t		ps_ept_descr;	/* endpoint descriptor */
	usb_pipe_handle_t	ps_handle;	/* pipe handle */
	usb_pipe_policy_t	ps_policy;	/* pipe policy */
	int			ps_flags;	/* state flags */
	int			ps_cr;		/* save last cr */
} usbprn_ps_t;

_NOTE(SCHEME_PROTECTS_DATA("USBA", usbprn_ps::ps_handle))

/*
 * PM support
 */
typedef struct usbprn_power  {
	/* device busy accounting */
	int		usbprn_pm_busy;
	uint8_t		usbprn_wakeup_enabled;

	/* this is the bit mask of the power states that device has */
	uint8_t		usbprn_pwr_states;

	/* wakeup and power transistion capabilites of an interface */
	uint8_t		usbprn_pm_capabilities;

	uint8_t		usbprn_current_power;
} usbprn_power_t;


/*
 * State structure
 */
typedef struct usbprn_state {
	dev_info_t	*usbprn_dip;		/* per-device info handle */
	int		usbprn_dev_state;	/* USB device state */
	kmutex_t	usbprn_mutex;		/* for general locking */
	int		usbprn_instance;	/* instance number */
	int		usbprn_flags;

	usb_client_dev_data_t *usbprn_dev_data;	/* registration data */

	size_t		usbprn_max_bulk_xfer_size;	/* max txfer size */
	char		*usbprn_device_id;	/* Device id string */
	int		usbprn_device_id_len;	/* Device id length */

	/* serialize access */
	usb_serialization_t usbprn_ser_acc;
	usb_serialization_t usbprn_write_acc;
	usb_serialization_t usbprn_dev_acc;

	/* mblk_t that contains the data to be sent */
	mblk_t		*usbprn_bulk_mp;

	struct	buf	*usbprn_bp;		/* Buffer ptr for strategy */

	usb_pipe_handle_t usbprn_def_ph;	/* default pipe handle */

	usbprn_ps_t	usbprn_bulk_out;	/* bulk out info */
	usbprn_ps_t	usbprn_bulk_in;		/* bulk in info */

	usb_log_handle_t usbprn_log_handle;	/* log handle */
	usb_cfg_descr_t usbprn_config_descr;	/* config desc */
	usb_if_descr_t	 usbprn_if_descr;	/* interface descr */

	char		usbprn_last_status;	/* last port status */

	usbprn_power_t	*usbprn_pm;		/* Power components */

	struct ecpp_transfer_parms usbprn_setparms; /* Set xfer parameters */
	struct prn_timeouts	usbprn_prn_timeouts;	/* prnio timeouts */

	usb_ugen_hdl_t	usbprn_ugen_hdl;		/* ugen support */
} usbprn_state_t;

/* warlock directives, stable data */
_NOTE(MUTEX_PROTECTS_DATA(usbprn_state_t::usbprn_mutex, usbprn_state_t))
_NOTE(DATA_READABLE_WITHOUT_LOCK(usbprn_state_t::usbprn_dip))
_NOTE(DATA_READABLE_WITHOUT_LOCK(usbprn_state_t::usbprn_ugen_hdl))
_NOTE(DATA_READABLE_WITHOUT_LOCK(usbprn_state_t::usbprn_pm))
_NOTE(DATA_READABLE_WITHOUT_LOCK(usbprn_state_t::usbprn_instance))
_NOTE(DATA_READABLE_WITHOUT_LOCK(usbprn_state_t::usbprn_log_handle))
_NOTE(DATA_READABLE_WITHOUT_LOCK(usbprn_state_t::usbprn_if_descr))
_NOTE(DATA_READABLE_WITHOUT_LOCK(usbprn_state_t::usbprn_dev_data))
_NOTE(DATA_READABLE_WITHOUT_LOCK(usbprn_state_t::usbprn_ser_acc))
_NOTE(DATA_READABLE_WITHOUT_LOCK(usbprn_state_t::usbprn_write_acc))
_NOTE(DATA_READABLE_WITHOUT_LOCK(usbprn_state_t::usbprn_dev_acc))
_NOTE(DATA_READABLE_WITHOUT_LOCK(usbprn_state_t::usbprn_def_ph))
_NOTE(DATA_READABLE_WITHOUT_LOCK(usbprn_state_t::usbprn_device_id))
_NOTE(DATA_READABLE_WITHOUT_LOCK(usbprn_state_t::usbprn_device_id_len))
_NOTE(SCHEME_PROTECTS_DATA("stable data", usb_pipe_policy))
_NOTE(SCHEME_PROTECTS_DATA("unshared data", mblk_t))
_NOTE(SCHEME_PROTECTS_DATA("unshared data", usb_bulk_req))


/* Values for usbprn_flags */
#define	USBPRN_LOCKS_INIT_DONE	0x01	/* locks have been init'ed */
#define	USBPRN_OPEN		0x02	/* Device is open */


/* Macros */

/*
 * Check if it the device is not being closed
 * or not being disconnected or not being suspended
 */
#define	USBPRN_DEVICE_ACCESS_OK(s) \
	(((s)->usbprn_flags & USBPRN_OPEN) && \
	(((s)->usbprn_dev_state == USB_DEV_ONLINE)))

/* Check if the pipes are idle or closed */
#define	USBPRN_PIPES_BUSY(s) \
	(((s)->usbprn_default.ps_flags != USBPRN_PS_IDLE) || \
	((s)->usbprn_bulk_out.ps_flags != USBPRN_PS_IDLE) || \
	((s)->usbprn_bulk_in.ps_flags != USBPRN_PS_IDLE))

/*
 * Debug message Masks
 */
#define	PRINT_MASK_ATTA		0x00000001	/* attach/detach */
#define	PRINT_MASK_OPEN		0x00000002
#define	PRINT_MASK_CLOSE	0x00000004
#define	PRINT_MASK_EVENTS	0x00000008
#define	PRINT_MASK_PM		0x00000010
#define	PRINT_MASK_CPR		0x00000020
#define	PRINT_MASK_ALL		0xFFFFFFFF

/* log message breakup */
#define	USBPRN_PRINT_MAXLINE	80

/* max device id length */
#define	USBPRN_MAX_DEVICE_ID_LENGTH	1024

/* ugen support */
#define	USBPRN_MINOR_UGEN_BITS_MASK	0xff
#define	USBPRN_MINOR_INSTANCE_SHIFT	8
#define	USBPRN_MINOR_INSTANCE_MASK	~USBPRN_MINOR_UGEN_BITS_MASK
#define	USBPRN_MINOR_TO_INSTANCE(minor) \
	(((minor) & USBPRN_MINOR_INSTANCE_MASK) >> \
	USBPRN_MINOR_INSTANCE_SHIFT)


#ifdef __cplusplus
}
#endif

#endif	/* _SYS_USB_USBPRN_H */