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