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