xref: /illumos-gate/usr/src/uts/common/sys/usb/scsa2usb/scsa2usb.h (revision b6805bf78d2bbbeeaea8909a05623587b42d58b3)
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 2010 Sun Microsystems, Inc.  All rights reserved.
22  * Use is subject to license terms.
23  */
24 
25 #ifndef _SYS_USB_SCSA2USB_H
26 #define	_SYS_USB_SCSA2USB_H
27 
28 
29 #ifdef	__cplusplus
30 extern "C" {
31 #endif
32 
33 #include <sys/usb/usba/usbai_private.h>
34 
35 /*
36  * SCSA2USB: This header file contains the internal structures
37  * and variable definitions used in USB mass storage disk driver.
38  */
39 
40 
41 #define	SCSA2USB_MAX_CLONE	256
42 #define	SCSA2USB_INITIAL_ALLOC	4	/* initial soft space alloc */
43 
44 #define	MAX_COMPAT_NAMES	1	/* max compatible names for children */
45 #define	SERIAL_NUM_LEN		64	/* for reading string descriptor */
46 #define	SCSA2USB_SERIAL_LEN	12	/* len of serial no in scsi_inquiry */
47 
48 #define	SCSA2USB_MAX_LUNS	0x10	/* maximum luns supported. */
49 
50 /*
51  * limit the max transfer size to under <= 64K. Some devices
52  * have problems with large transfers
53  */
54 #define	SCSA2USB_MAX_BULK_XFER_SIZE	(64 * 1024)
55 
56 /* Blacklist some vendors whose devices could cause problems */
57 #define	MS_HAGIWARA_SYS_COM_VID	0x693	/* VendorId of Hagiwara Sys-Com */
58 #define	MS_HAGIWARA_SYSCOM_PID1	0x1	/* PID for SmartMedia(SM) device */
59 #define	MS_HAGIWARA_SYSCOM_PID2	0x3	/* PID for CompactFlash(CF) device */
60 #define	MS_HAGIWARA_SYSCOM_PID3	0x5	/* PID for SM/CF Combo device */
61 #define	MS_HAGIWARA_SYSCOM_PID4	0x2	/* PID for new SM device */
62 #define	MS_HAGIWARA_SYSCOM_PID5	0x4	/* PID for new CF device */
63 
64 #define	MS_IOMEGA_VID		0x59b	/* VendorId of Iomega */
65 #define	MS_IOMEGA_PID1_ZIP100	0x1	/* PID of an Older Iomega Zip100 */
66 #define	MS_IOMEGA_PID2_ZIP100	0x2	/* PID of Newer Iomega Zip100 */
67 #define	MS_IOMEGA_PID3_ZIP100	0x31	/* PID of Newer Iomega Zip100 */
68 #define	MS_IOMEGA_PID_ZIP250	0x30	/* PID of Newer Iomega Zip250 */
69 #define	MS_IOMEGA_PID_CLIK	0x60	/* PID of Iomega Clik! drive */
70 
71 #define	MS_MITSUMI_VID		0x3ee	/* VendorId of Mitsumi Inc */
72 #define	MS_MITSUMI_DEVICE_242	0x242	/* bcdDevice of Mitsumi CR-4804TU */
73 #define	MS_MITSUMI_DEVICE_24	0x24	/* bcdDevice of Mitsumi CR-4802TU */
74 
75 #define	MS_YEDATA_VID		0x57b	/* VendorId of Y-E Data Corp */
76 #define	MS_SMSC_VID		0x424	/* Vendor Id of SMSC */
77 #define	MS_SMSC_PID0		0xfdc	/* floppy from SMSC */
78 
79 #define	MS_NEODIO_VID		0xaec	/* Neodio Technologies Corporation */
80 #define	MS_NEODIO_DEVICE_3050	0x3050	/* PID of ND3050/Soyo BayOne */
81 					/* SM/CF/MS/SD */
82 #define	MS_SONY_FLASH_VID	0x54c	/* sony flash device */
83 #define	MS_SONY_FLASH_PID	0x8b
84 
85 #define	MS_TREK_FLASH_VID	0xa16	/* Trek flash device */
86 #define	MS_TREK_FLASH_PID	0x9988
87 
88 #define	MS_PENN_FLASH_VID	0xd7d	/* Penn flash device */
89 #define	MS_PENN_FLASH_PID	0x1320
90 
91 #define	MS_SIMPLETECH_VID	0x7c4	/* VendorId of Simpltech */
92 #define	MS_SIMPLETECH_PID1	0xa400	/* PID for UCF-100 device */
93 
94 #define	MS_ADDONICS_CARD_READER_VID 0x7cc /* addonics */
95 #define	MS_ADDONICS_CARD_READER_PID 0x320
96 
97 #define	MS_ACOMDATA_VID		0xc0b	/* VendorId of DMI (Acomdata) */
98 #define	MS_ACOMDATA_PID1	0x5fab	/* PID for 80GB USB/1394 disk */
99 
100 #define	MS_OTI_VID		0xea0	/* VendorID of OTI */
101 #define	MS_OTI_DEVICE_6828	0x6828	/* PID for 6828 flash disk */
102 
103 #define	MS_SCANLOGIC_VID	0x04ce	/* VendorID of ScanLogic */
104 #define	MS_SCANLOGIC_PID1	0x0002	/* SL USB Storage Device */
105 
106 #define	MS_SUPERTOP_VID		0x14cd	/* Super Top USB 2.0 IDE enclosure */
107 #define	MS_SUPERTOP_DEVICE_6600	0x6600
108 
109 #define	MS_AIGO_VID		0xed1	/* VendorID of Aigo */
110 #define	MS_AIGO_DEVICE_6981	0x6981	/* Aigo Miniking Device NEHFSP14 */
111 
112 #define	MS_ALCOR_VID	0x58f	/* Vendor ID of Alcor Micro Corp */
113 #define	MS_ALCOR_PID0	0x6387	/* PID for 6387 flash disk */
114 
115 #define	MS_TOSHIBA_VID	0x930	/* Vendor ID of Toshiba Corp */
116 #define	MS_TOSHIBA_PID0	0x6545	/* Kingston DataTraveler / PNY Attache Stick */
117 
118 #define	MS_PNY_VID	0x154b	/* Vendor ID of PNY Corp */
119 #define	MS_PNY_PID0	0x16	/* PNY floppy drive */
120 
121 #define	MS_WD_VID	0x1058	/* Vendor ID of Western Digital */
122 #define	MS_WD_PID   0x1001  /* PID for Western Digital USB External HDD */
123 
124 /*
125  * The AMI virtual floppy device is not a real USB storage device, but
126  * emulated by the SP firmware shipped together with important Sun x86
127  * products such as Galaxy and Thumper platforms. The device causes
128  * very long delay in boot process of these platforms which is a big
129  * performance issue. Improvement in firmware may solve the issue, but
130  * before the firmware is fixed, it needs to be taken care of by software
131  * to avoid the huge impact on user experience.
132  *
133  * The long boot delay is caused by timeouts and retries of READ CAPACITY
134  * command issued to the device. The device is a USB ufi subclass device
135  * using CBI protocol. When READ CAPACITY command is issued, the device
136  * returns STALL on the bulk endpoint during the data stage, however, it
137  * doesn't return status on the intr pipe during status stage, so the intr
138  * pipe can only fail with timeout.
139  *
140  * Reducing timeout value to 1 second can help a little bit, but the delay
141  * is still noticeable, because the target driver would make many retries
142  * for this command. It is not desirable to mess with the target driver
143  * for a broken USB device. So adding the device to the scsa2usb blacklist
144  * is the best choice we have.
145  *
146  * It is found that the READ CAPACITY failure only happens when there is
147  * no media in the floppy drive. When there is a media, the device works
148  * just fine. So READ CAPACITY command cannot be arbitrarily disabled.
149  * Media status needs to be checked before issuing the command by sending
150  * an additional TEST UNIT READY command. If TEST UNIT READY command
151  * return STATUS_GOOD, it means the media is ready and then READ CAPACITY
152  * can be issued.
153  *
154  * SCSA2USB_ATTRS_NO_MEDIA_CHECK is added below for this purpose. It is
155  * overrided in scsa2usb.c for the AMI virtual floppy device to take care
156  * of the special need.
157  */
158 #define	MS_AMI_VID		0x46b	/* VendorId of AMI */
159 #define	MS_AMI_VIRTUAL_FLOPPY	0xff40	/* PID for AMI virtual floppy */
160 
161 /*
162  * List the attributes that need special case in the driver
163  * SCSA2USB_ATTRS_GET_LUN: Bulk Only Transport Get_Max_Lun class specific
164  *		command is not implemented by these devices
165  * SCSA2USB_ATTRS_PM: Some devices don't like being power managed.
166  * SCSA2USB_ATTRS_START_STOP: Some devices don't do anything with
167  *		SCMD_START_STOP opcode (for e.g. SmartMedia/CompactFlash/
168  *		Clik!/MemoryStick/MMC USB readers/writers.
169  * SCSA2USB_ATTRS_GET_CONF: SCMD_GET_CONFIGURATION is not supported
170  * SCMD_TEST_UNIT_READY: for floppies this needs to be converted to
171  *		SCMD_START_STOP as floppies don't support this
172  * SCSA2USB_ATTRS_GET_PERF: SCMD_GET_PERFORMANCE not supported by
173  *		Mitsumi's CD-RW devices.
174  * SCSA2USB_ATTRS_BIG_TIMEOUT: Mitsumi's CD-RW devices need large
175  *		timeout with SCMD_START_STOP cmd
176  * SCSA2USB_ATTRS_RMB: Pay attention to the device's RMB setting,
177  *		instead of automatically treating it as removable
178  * SCSA2USB_ATTRS_USE_CSW_RESIDUE: Some devices report false residue in
179  *		the CSW of bulk-only transfer status stage though data
180  *		was successfully transfered, so need to ignore residue.
181  * SCSA2USB_ATTRS_NO_MEDIA_CHECK: AMI Virtual Floppy devices need to
182  *		check if media is ready before issuing READ CAPACITY.
183  * SCSA2USB_ATTRS_NO_CAP_ADJUST: Some devices return total logical block number
184  * 		instead of highest logical block address on READ_CAPACITY cmd.
185  *
186  * NOTE: If a device simply STALLs the GET_MAX_LUN BO class-specific command
187  * and recovers then it will not be added to the scsa2usb_blacklist[] table
188  * in scsa2usb.c. The other attributes will not be taken of the table unless
189  * their inclusion causes a recovery and retries (thus seriously affecting
190  * the driver performance).
191  */
192 #define	SCSA2USB_ATTRS_GET_LUN		0x01	/* GET_MAX_LUN (Bulk Only) */
193 #define	SCSA2USB_ATTRS_PM		0x02	/* Some don't support PM */
194 #define	SCSA2USB_ATTRS_START_STOP	0x04	/* SCMD_START_STOP */
195 #define	SCSA2USB_ATTRS_GET_CONF		0x08	/* SCMD_GET_CONFIGURATION */
196 #define	SCSA2USB_ATTRS_GET_PERF		0x10	/* SCMD_GET_PERFORMANCE */
197 #define	SCSA2USB_ATTRS_BIG_TIMEOUT	0x40	/* for SCMD_START_STOP */
198 #define	SCSA2USB_ATTRS_DOORLOCK		0x80	/* for SCMD_DOORLOCK */
199 #define	SCSA2USB_ATTRS_RMB		0x100	/* Pay attention to RMB */
200 #define	SCSA2USB_ATTRS_MODE_SENSE	0x200	/* SCMD_MODE_SENSE */
201 #define	SCSA2USB_ATTRS_INQUIRY		0x400	/* SCMD_INQUIRY */
202 #define	SCSA2USB_ATTRS_USE_CSW_RESIDUE	0x800	/* for residue checking */
203 #define	SCSA2USB_ATTRS_NO_MEDIA_CHECK	0x1000	/* for media checking */
204 #define	SCSA2USB_ATTRS_NO_CAP_ADJUST	0x2000	/* for CAPACITY adjusting */
205 #define	SCSA2USB_ATTRS_INQUIRY_EVPD	0x4000	/* SCMD_INQUIRY with evpd */
206 #define	SCSA2USB_ATTRS_REDUCED_CMD	\
207 	(SCSA2USB_ATTRS_DOORLOCK|SCSA2USB_ATTRS_MODE_SENSE| \
208 	SCSA2USB_ATTRS_START_STOP|SCSA2USB_ATTRS_INQUIRY| \
209 	SCSA2USB_ATTRS_USE_CSW_RESIDUE)
210 
211 #define	SCSA2USB_ALL_ATTRS		0xFFFF	/* All of the above */
212 
213 /* max inquiry length */
214 #define	SCSA2USB_MAX_INQ_LEN (offsetof(struct scsi_inquiry, inq_serial))
215 
216 /* page code of scsi mode page */
217 #ifndef SD_MODE_SENSE_PAGE3_CODE
218 #define	SD_MODE_SENSE_PAGE3_CODE	0x03
219 #endif
220 
221 #ifndef SD_MODE_SENSE_PAGE4_CODE
222 #define	SD_MODE_SENSE_PAGE4_CODE	0x04
223 #endif
224 
225 #define	SD_MODE_SENSE_PAGE_MASK		0x3F
226 
227 /*
228  * PM support
229  */
230 typedef struct scsa2usb_power  {
231 	/* device busy accounting */
232 	int		scsa2usb_pm_busy;
233 	/* this is the bit mask of the power states that device has */
234 	uint8_t		scsa2usb_pwr_states;
235 
236 	uint8_t		scsa2usb_wakeup_enabled;
237 
238 	/* current power level the device is in */
239 	uint8_t		scsa2usb_current_power;
240 } scsa2usb_power_t;
241 
242 /*
243  * CPR support:
244  *	keep track of the last command issued to the drive. If it
245  *	was TUR or EJECT then allow issuing a CPR suspend.
246  */
247 #define	LOEJECT	2		/* eject bit in start/stop cmd */
248 
249 typedef struct scsa2usb_last_cmd {
250 	/* this is the cdb of the last command issued */
251 	uchar_t		cdb[SCSI_CDB_SIZE];
252 
253 	/* this is the status of the last command issued */
254 	uint_t		status;
255 } scsa2usb_last_cmd_t;
256 
257 /*
258  * override values
259  *	These values may be set in scsa2usb.conf for particular devices
260  */
261 typedef struct scsa2usb_ov {
262 	int	vid;		/* vendor id */
263 	int	pid;		/* product id */
264 	int	rev;		/* revision */
265 	int	subclass;	/* subclass override */
266 	int	protocol;	/* protocol override */
267 	int	pmoff;		/* power management override */
268 	int	fake_removable;	/* removable device override */
269 	int	no_modesense;	/* no mode sense */
270 				/* no modesense, doorlock, PM, start/stop */
271 	int	reduced_cmd_support;
272 } scsa2usb_ov_t;
273 
274 
275 /*
276  * Per bulk device "state" data structure.
277  */
278 typedef struct scsa2usb_state {
279 	int			scsa2usb_instance;	/* Instance number    */
280 	int			scsa2usb_dev_state;	/* USB device state   */
281 	int			scsa2usb_flags; 	/* Per instance flags */
282 	int			scsa2usb_intfc_num;	/* Interface number   */
283 	dev_info_t		*scsa2usb_dip;		/* Per device. info   */
284 	scsa2usb_power_t	*scsa2usb_pm;		/* PM state info */
285 
286 	int			scsa2usb_transport_busy; /* ugen/sd traffic */
287 	int			scsa2usb_ugen_open_count;
288 	kcondvar_t		scsa2usb_transport_busy_cv;
289 	struct proc		*scsa2usb_busy_proc; /* owner of the hardware */
290 
291 	kmutex_t		scsa2usb_mutex;		/* Per instance lock  */
292 
293 	struct scsi_hba_tran	*scsa2usb_tran;		/* SCSI transport ptr */
294 	struct scsi_pkt		*scsa2usb_cur_pkt;	/* SCSI packet ptr    */
295 
296 	usba_list_entry_t	scsa2usb_waitQ[SCSA2USB_MAX_LUNS];
297 							/* waitQ list */
298 	struct scsa2usb_cmd	*scsa2usb_arq_cmd;	/* ARQ cmd */
299 	struct buf		*scsa2usb_arq_bp;	/* ARQ buf */
300 
301 	dev_info_t		*scsa2usb_lun_dip[SCSA2USB_MAX_LUNS];
302 						/* store devinfo per LUN  */
303 	struct scsi_inquiry	scsa2usb_lun_inquiry[SCSA2USB_MAX_LUNS];
304 						/* store inquiry per LUN  */
305 	usb_if_descr_t		scsa2usb_intfc_descr;	/* Interface descr    */
306 	usb_ep_descr_t		scsa2usb_bulkin_ept;	/* Bulk In descriptor */
307 	usb_ep_descr_t		scsa2usb_bulkout_ept;	/* Bulkout descriptor */
308 	usb_ep_descr_t		scsa2usb_intr_ept;	/* Intr ept descr */
309 
310 	usb_pipe_handle_t	scsa2usb_default_pipe;	/* Default pipe	Hndle */
311 	usb_pipe_handle_t	scsa2usb_intr_pipe;	/* Intr polling Hndle */
312 	usb_pipe_handle_t	scsa2usb_bulkin_pipe;	/* Bulk Inpipe Handle */
313 	usb_pipe_handle_t	scsa2usb_bulkout_pipe;	/* Bulk Outpipe Hndle */
314 
315 	uint_t			scsa2usb_pipe_state;	/* resetting state */
316 	uint_t			scsa2usb_tag;		/* current tag */
317 	uint_t			scsa2usb_pkt_state;	/* packet state */
318 	uint_t			scsa2usb_n_luns;	/* number of luns */
319 
320 	usb_log_handle_t	scsa2usb_log_handle;	/* log handle */
321 	struct scsa2usb_cpr	*scsa2usb_panic_info;	/* for cpr info */
322 
323 	size_t			scsa2usb_lbasize[SCSA2USB_MAX_LUNS];
324 							/* sector size */
325 	size_t			scsa2usb_totalsec[SCSA2USB_MAX_LUNS];
326 							/* total sectors */
327 	size_t			scsa2usb_secsz[SCSA2USB_MAX_LUNS];
328 							/* sector size */
329 	size_t			scsa2usb_max_bulk_xfer_size; /* from HCD */
330 
331 	usb_client_dev_data_t	*scsa2usb_dev_data;	/* USB registration */
332 	scsa2usb_last_cmd_t	scsa2usb_last_cmd;	/* last/prev command */
333 
334 	uint_t			scsa2usb_attrs;		/* for bad devices */
335 	uint_t			scsa2usb_cmd_protocol;	/* CMD protocol used */
336 	kthread_t		*scsa2usb_work_thread_id; /* handle commands */
337 
338 				/* conf file override values */
339 	uint_t			scsa2usb_subclass_override;
340 	uint_t			scsa2usb_protocol_override;
341 	char			*scsa2usb_override_str;
342 
343 				/* suppress repetitive disconnect warnings */
344 	boolean_t		scsa2usb_warning_given;
345 
346 	boolean_t		scsa2usb_rcvd_not_ready; /* received NOT */
347 							/* READY sense data */
348 
349 	usb_ugen_hdl_t		scsa2usb_ugen_hdl;	/* ugen support */
350 
351 	uint8_t			scsa2usb_clones[SCSA2USB_MAX_CLONE];
352 } scsa2usb_state_t;
353 
354 
355 /* for warlock */
356 _NOTE(MUTEX_PROTECTS_DATA(scsa2usb_state::scsa2usb_mutex, scsa2usb_state))
357 _NOTE(DATA_READABLE_WITHOUT_LOCK(scsa2usb_state::scsa2usb_instance))
358 _NOTE(DATA_READABLE_WITHOUT_LOCK(scsa2usb_state::scsa2usb_dip))
359 _NOTE(DATA_READABLE_WITHOUT_LOCK(scsa2usb_state::scsa2usb_arq_cmd))
360 _NOTE(DATA_READABLE_WITHOUT_LOCK(scsa2usb_state::scsa2usb_arq_bp))
361 _NOTE(DATA_READABLE_WITHOUT_LOCK(scsa2usb_state::scsa2usb_bulkin_ept))
362 _NOTE(DATA_READABLE_WITHOUT_LOCK(scsa2usb_state::scsa2usb_bulkout_ept))
363 _NOTE(DATA_READABLE_WITHOUT_LOCK(scsa2usb_state::scsa2usb_intr_ept))
364 _NOTE(DATA_READABLE_WITHOUT_LOCK(scsa2usb_state::scsa2usb_default_pipe))
365 _NOTE(DATA_READABLE_WITHOUT_LOCK(scsa2usb_state::scsa2usb_intr_pipe))
366 _NOTE(DATA_READABLE_WITHOUT_LOCK(scsa2usb_state::scsa2usb_bulkin_pipe))
367 _NOTE(DATA_READABLE_WITHOUT_LOCK(scsa2usb_state::scsa2usb_bulkout_pipe))
368 _NOTE(DATA_READABLE_WITHOUT_LOCK(scsa2usb_state::scsa2usb_log_handle))
369 _NOTE(DATA_READABLE_WITHOUT_LOCK(scsa2usb_state::scsa2usb_intfc_num))
370 _NOTE(DATA_READABLE_WITHOUT_LOCK(scsa2usb_state::scsa2usb_dev_data))
371 _NOTE(DATA_READABLE_WITHOUT_LOCK(scsa2usb_state::scsa2usb_ugen_hdl))
372 _NOTE(DATA_READABLE_WITHOUT_LOCK(scsa2usb_state::scsa2usb_pm))
373 _NOTE(SCHEME_PROTECTS_DATA("stable data", scsa2usb_power_t))
374 _NOTE(SCHEME_PROTECTS_DATA("stable data", scsi_hba_tran_t))
375 _NOTE(SCHEME_PROTECTS_DATA("unshared data", usb_bulk_req_t))
376 
377 /* scsa2usb_pipe_state values */
378 #define	SCSA2USB_PIPE_NORMAL		0x00	/* no reset or clearing	*/
379 #define	SCSA2USB_PIPE_CLOSING		0x01	/* closing all pipes */
380 #define	SCSA2USB_PIPE_DEV_RESET		0x02	/* device specific reset */
381 
382 /* pkt xfer state machine */
383 #define	SCSA2USB_PKT_NONE		0	/* device is idle */
384 #define	SCSA2USB_PKT_PROCESS_CSW	1	/* device doing status again */
385 #define	SCSA2USB_PKT_DO_COMP		2	/* device is done xfer */
386 
387 /* scsa2usb_flags values */
388 #define	SCSA2USB_FLAGS_PIPES_OPENED	0x001	/* usb pipes are open */
389 #define	SCSA2USB_FLAGS_HBA_ATTACH_SETUP	0x002	/* scsi hba setup done */
390 #define	SCSA2USB_FLAGS_LOCKS_INIT	0x004	/* basic inits done */
391 
392 /* scsa2usb_cmd_protocol values */
393 #define	SCSA2USB_UNKNOWN_PROTOCOL	0x0000	/* unknown wire protocol */
394 #define	SCSA2USB_CB_PROTOCOL		0x0001	/* CBI wire protocol */
395 #define	SCSA2USB_CBI_PROTOCOL		0x0002	/* CBI w/ intr wire protocol */
396 #define	SCSA2USB_BULK_ONLY_PROTOCOL	0x0004	/* Bulk Only wire protocol */
397 
398 #define	SCSA2USB_SCSI_CMDSET		0x1000	/* SCSI command set followed */
399 #define	SCSA2USB_ATAPI_CMDSET		0x2000	/* ATAPI command set followed */
400 #define	SCSA2USB_UFI_CMDSET		0x4000	/* UFI command set followed */
401 #define	SCSA2USB_CMDSET_MASK		0x7000	/* OR al the above */
402 
403 #define	SCSA2USB_IS_UFI_CMDSET(s) \
404 	(((s)->scsa2usb_cmd_protocol & SCSA2USB_UFI_CMDSET))
405 #define	SCSA2USB_IS_SCSI_CMDSET(s) \
406 	(((s)->scsa2usb_cmd_protocol & SCSA2USB_SCSI_CMDSET))
407 #define	SCSA2USB_IS_ATAPI_CMDSET(s) \
408 	(((s)->scsa2usb_cmd_protocol & SCSA2USB_ATAPI_CMDSET))
409 
410 #define	SCSA2USB_IS_CB(s) \
411 	(((s)->scsa2usb_cmd_protocol & SCSA2USB_CB_PROTOCOL))
412 
413 #define	SCSA2USB_IS_CBI(s) \
414 	(((s)->scsa2usb_cmd_protocol & SCSA2USB_CBI_PROTOCOL))
415 
416 #define	SCSA2USB_IS_BULK_ONLY(s) \
417 	(((s)->scsa2usb_cmd_protocol & SCSA2USB_BULK_ONLY_PROTOCOL))
418 
419 /* check if it is ok to access the device and send command to it */
420 #define	SCSA2USB_DEVICE_ACCESS_OK(s) \
421 	((s)->scsa2usb_dev_state == USB_DEV_ONLINE)
422 
423 /* check if we are in any reset */
424 #define	SCSA2USB_IN_RESET(s) \
425 	(((s)->scsa2usb_pipe_state & SCSA2USB_PIPE_DEV_RESET) != 0)
426 
427 /* check if the device is busy */
428 #define	SCSA2USB_BUSY(s) \
429 	(((s)->scsa2usb_cur_pkt) || \
430 	((s)->scsa2usb_pipe_state != SCSA2USB_PIPE_NORMAL) || \
431 	((s)->scsa2usb_pkt_state != SCSA2USB_PKT_NONE))
432 
433 /* check if we're doing cpr */
434 #define	SCSA2USB_CHK_CPR(s) \
435 	(((s)->scsa2usb_dev_state == USB_DEV_SUSPENDED))
436 
437 /* check if we're either paniced or in cpr state */
438 #define	SCSA2USB_CHK_PANIC_CPR(s) \
439 	(ddi_in_panic() || SCSA2USB_CHK_CPR(s))
440 
441 /* reset scsa2usb state after pkt_comp is called */
442 #define	SCSA2USB_RESET_CUR_PKT(s) \
443 	(s)->scsa2usb_cur_pkt = NULL; \
444 	(s)->scsa2usb_pkt_state = SCSA2USB_PKT_NONE;
445 
446 /* print a panic sync message to the console */
447 #define	SCSA2USB_PRINT_SYNC_MSG(m, s) \
448 	if ((m) == B_TRUE) { \
449 		USB_DPRINTF_L1(DPRINT_MASK_SCSA, (s)->scsa2usb_log_handle, \
450 		    "syncing not supported"); \
451 		(m) = B_FALSE; \
452 	}
453 
454 /* Cancel callbacks registered during attach time */
455 #define	SCSA2USB_CANCEL_CB(id) \
456 	if ((id)) { \
457 		(void) callb_delete((id)); \
458 		(id) = 0; \
459 	}
460 
461 /* Set SCSA2USB_PKT_DO_COMP state if there is active I/O */
462 #define	SCSA2USB_SET_PKT_DO_COMP_STATE(s) \
463 	if ((s)->scsa2usb_cur_pkt) { \
464 		(s)->scsa2usb_pkt_state = SCSA2USB_PKT_DO_COMP; \
465 	}
466 
467 #define	SCSA2USB_FREE_MSG(data) \
468 	if ((data)) { \
469 		freemsg((data)); \
470 	}
471 
472 #define	SCSA2USB_FREE_BULK_REQ(req) \
473 	if ((req)) { \
474 		usb_free_bulk_req((req));	/* Free request */ \
475 	}
476 
477 
478 /* SCSA related */
479 #define	ADDR2TRAN(ap)		((ap)->a_hba_tran)
480 #define	TRAN2SCSA2USB(tran)	((scsa2usb_state_t *)(tran)->tran_hba_private)
481 #define	ADDR2SCSA2USB(ap)	(TRAN2SCSA2USB(ADDR2TRAN(ap)))
482 
483 #define	PKT_PRIV_LEN		16
484 
485 #define	PKT_DEFAULT_TIMEOUT	5
486 
487 /*
488  * auto request sense
489  */
490 #define	RQ_MAKECOM_COMMON(pktp, flag, cmd) \
491 	(pktp)->pkt_flags = (flag), \
492 	((union scsi_cdb *)(pktp)->pkt_cdbp)->scc_cmd = (cmd), \
493 	((union scsi_cdb *)(pktp)->pkt_cdbp)->scc_lun = \
494 	    (pktp)->pkt_address.a_lun
495 
496 #define	RQ_MAKECOM_G0(pktp, flag, cmd, addr, cnt) \
497 	RQ_MAKECOM_COMMON((pktp), (flag), (cmd)), \
498 	FORMG0ADDR(((union scsi_cdb *)(pktp)->pkt_cdbp), (addr)), \
499 	FORMG0COUNT(((union scsi_cdb *)(pktp)->pkt_cdbp), (cnt))
500 
501 
502 /* transport related */
503 #define	SCSA2USB_JUST_ACCEPT	0
504 #define	SCSA2USB_TRANSPORT	1
505 #define	SCSA2USB_REJECT		-1
506 
507 /*
508  * The scsa2usb_cpr_info data structure is used for cpr related
509  * callbacks. It is used for panic callbacks as well.
510  */
511 typedef struct scsa2usb_cpr {
512 	callb_cpr_t		cpr;		/* for cpr related info */
513 	struct scsa2usb_state	*statep;	/* for scsa2usb state info */
514 	kmutex_t		lockp;		/* mutex used by cpr_info_t */
515 } scsa2usb_cpr_t;
516 
517 _NOTE(DATA_READABLE_WITHOUT_LOCK(scsa2usb_cpr_t::cpr))
518 _NOTE(DATA_READABLE_WITHOUT_LOCK(scsa2usb_cpr_t::statep))
519 
520 /*
521  * The scsa2usb_cmd data structure is defined here. It gets
522  * initialized per command that is sent to the device.
523  */
524 typedef struct scsa2usb_cmd {
525 	struct scsi_pkt		*cmd_pkt;		/* copy of pkt ptr */
526 	struct	buf		*cmd_bp;		/* copy of bp ptr */
527 	size_t			cmd_xfercount;		/* current xfer count */
528 	size_t			cmd_resid_xfercount;	/* last xfer resid */
529 	int			cmd_scblen;		/* status length */
530 	int			cmd_tag;		/* tag */
531 	int			cmd_timeout;		/* copy of pkt_time */
532 	uchar_t			cmd_cdb[SCSI_CDB_SIZE];	/* CDB */
533 	uchar_t			cmd_dir;		/* direction */
534 	uchar_t			cmd_actual_len; 	/* cdb len */
535 	uchar_t			cmd_cdblen;		/* requested  cdb len */
536 	struct scsi_arq_status	cmd_scb;		/* status, w/ arq */
537 
538 	/* used in multiple xfers */
539 	size_t			cmd_total_xfercount;	/* total xfer val */
540 	size_t			cmd_offset;		/* offset into buf */
541 	int			cmd_lba;		/* current xfer lba */
542 	int			cmd_done;		/* command done? */
543 	int			cmd_blksize;		/* block size */
544 	usba_list_entry_t	cmd_waitQ;		/* waitQ element */
545 } scsa2usb_cmd_t;
546 
547 /* for warlock */
548 _NOTE(SCHEME_PROTECTS_DATA("unique per packet or safe sharing",
549     scsi_cdb scsi_status scsi_pkt buf scsa2usb_cmd scsi_arq_status))
550 _NOTE(SCHEME_PROTECTS_DATA("stable data", scsi_device scsi_address))
551 
552 /* scsa2usb_cdb position of fields in CDB */
553 #define	SCSA2USB_OPCODE		0		/* Opcode field */
554 #define	SCSA2USB_LUN		1		/* LUN field */
555 #define	SCSA2USB_LBA_0		2		/* LBA[0] field */
556 #define	SCSA2USB_LBA_1		3		/* LBA[1] field */
557 #define	SCSA2USB_LBA_2		4		/* LBA[2] field */
558 #define	SCSA2USB_LBA_3		5		/* LBA[3] field */
559 #define	SCSA2USB_LEN_0		7		/* LEN[0] field */
560 #define	SCSA2USB_LEN_1		8		/* LEN[1] field */
561 
562 /* macros to calculate LBA for 6/10/12-byte commands */
563 #define	SCSA2USB_LBA_6BYTE(pkt) \
564 	(((pkt)->pkt_cdbp[1] & 0x1f) << 16) + \
565 	((pkt)->pkt_cdbp[2] << 8) + (pkt)->pkt_cdbp[3]
566 #define	SCSA2USB_LEN_6BYTE(pkt)		(pkt)->pkt_cdbp[4]
567 
568 #define	SCSA2USB_LEN_10BYTE(pkt) \
569 	((pkt)->pkt_cdbp[7] << 8) + (pkt)->pkt_cdbp[8]
570 #define	SCSA2USB_LBA_10BYTE(pkt) \
571 	((pkt)->pkt_cdbp[2] << 24) + ((pkt)->pkt_cdbp[3] << 16) + \
572 	    ((pkt)->pkt_cdbp[4] << 8) +  (pkt)->pkt_cdbp[5]
573 
574 #define	SCSA2USB_LEN_12BYTE(pkt) \
575 	((pkt)->pkt_cdbp[6] << 24) + ((pkt)->pkt_cdbp[7] << 16) + \
576 	    ((pkt)->pkt_cdbp[8] << 8) +  (pkt)->pkt_cdbp[9]
577 #define	SCSA2USB_LBA_12BYTE(pkt) \
578 	((pkt)->pkt_cdbp[2] << 24) + ((pkt)->pkt_cdbp[3] << 16) + \
579 	    ((pkt)->pkt_cdbp[4] << 8) +  (pkt)->pkt_cdbp[5]
580 
581 /* macros to convert a pkt to cmd and vice-versa */
582 #define	PKT2CMD(pkt)		((scsa2usb_cmd_t *)(pkt)->pkt_ha_private)
583 #define	CMD2PKT(sp)		((sp)->cmd_pkt
584 
585 /* bulk pipe default timeout value - how long the command to be tried? */
586 #define	SCSA2USB_BULK_PIPE_TIMEOUT	(2 * USB_PIPE_TIMEOUT)
587 
588 /* drain timeout in seconds on the work thread */
589 #define	SCSA2USB_DRAIN_TIMEOUT		60
590 
591 /* scsa2usb pkt xfer status phase retry times */
592 #define	SCSA2USB_STATUS_RETRIES		3
593 
594 /*
595  * limit on the number of requests that can be queued per LUN:
596  * 3 for untagged queueing, 1 for scsiwatch and a margin of 2
597  */
598 #define	SCSA2USB_MAX_REQ_PER_LUN	6
599 
600 /*
601  * The following data structure is used to save the values returned
602  * by the READ_CAPACITY command. lba is the max allowed logical block
603  * address and blen is max allowed block size.
604  */
605 typedef struct scsa2usb_read_cap {
606 	uchar_t	scsa2usb_read_cap_lba3;		/* Max lba supported */
607 	uchar_t	scsa2usb_read_cap_lba2;
608 	uchar_t	scsa2usb_read_cap_lba1;
609 	uchar_t	scsa2usb_read_cap_lba0;
610 	uchar_t	scsa2usb_read_cap_blen3;	/* Max block size supported */
611 	uchar_t	scsa2usb_read_cap_blen2;
612 	uchar_t	scsa2usb_read_cap_blen1;
613 	uchar_t	scsa2usb_read_cap_blen0;
614 } scsa2usb_read_cap_t;
615 
616 #define	SCSA2USB_MK_32BIT(a, b, c, d) \
617 		(((a) << 24) | ((b) << 16) | ((c) << 8) | (d))
618 
619 /* position of fields for SCMD_READ_CD CDB */
620 #define	SCSA2USB_READ_CD_LEN_0	6	/* LEN[0] of SCMD_READ_CD */
621 #define	SCSA2USB_READ_CD_LEN_1	7	/* LEN[1] of SCMD_READ_CD */
622 #define	SCSA2USB_READ_CD_LEN_2	8	/* LEN[2] of SCMD_READ_CD */
623 
624 /* macro to calculate LEN for SCMD_READ_CD command */
625 #define	SCSA2USB_LEN_READ_CD(pkt) \
626 	(((pkt)->pkt_cdbp[SCSA2USB_READ_CD_LEN_0] << 16) +\
627 	    ((pkt)->pkt_cdbp[SCSA2USB_READ_CD_LEN_1] << 8) +\
628 	    (pkt)->pkt_cdbp[SCSA2USB_READ_CD_LEN_2])
629 
630 /* Figure out Block Size before issuing a WRITE to CD-RW device */
631 #define	SCSA2USB_CDRW_BLKSZ(bcount, len)	((bcount) / (len));
632 #define	SCSA2USB_VALID_CDRW_BLKSZ(blksz) \
633 	(((blksz) == CDROM_BLK_2048) || ((blksz) == CDROM_BLK_2352) || \
634 	((blksz) == CDROM_BLK_2336) || ((blksz) == CDROM_BLK_2324) || \
635 	((blksz) == 0))
636 
637 /* debug and error msg logging */
638 #define	DPRINT_MASK_SCSA	0x0001		/* for SCSA */
639 #define	DPRINT_MASK_ATTA	0x0002		/* for ATTA */
640 #define	DPRINT_MASK_EVENTS	0x0004		/* for event handling */
641 #define	DPRINT_MASK_CALLBACKS	0x0008		/* for callbacks  */
642 #define	DPRINT_MASK_TIMEOUT	0x0010		/* for timeouts */
643 #define	DPRINT_MASK_DUMPING	0x0020		/* for dumping */
644 #define	DPRINT_MASK_PM		0x0040		/* for pwr mgmt */
645 #define	DPRINT_MASK_ALL		0xffffffff	/* for everything */
646 
647 #ifdef	DEBUG
648 #define	SCSA2USB_PRINT_CDB	scsa2usb_print_cdb
649 #else
650 #define	SCSA2USB_PRINT_CDB	0 &&
651 #endif
652 
653 /* ugen support */
654 #define	SCSA2USB_MINOR_UGEN_BITS_MASK	0xff
655 #define	SCSA2USB_MINOR_INSTANCE_MASK	~SCSA2USB_MINOR_UGEN_BITS_MASK
656 #define	SCSA2USB_MINOR_INSTANCE_SHIFT	8
657 
658 #define	SCSA2USB_MINOR_TO_INSTANCE(minor)	\
659 		(((minor) & SCSA2USB_MINOR_INSTANCE_MASK) >> \
660 		SCSA2USB_MINOR_INSTANCE_SHIFT)
661 
662 #ifdef __cplusplus
663 }
664 #endif
665 
666 #endif	/* _SYS_USB_SCSA2USB_H */
667