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 /* 22 * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 23 * Use is subject to license terms. 24 */ 25 26 #ifndef _SYS_SCSI_TARGETS_STDEF_H 27 #define _SYS_SCSI_TARGETS_STDEF_H 28 29 #include <sys/sunddi.h> 30 #include <sys/note.h> 31 #include <sys/condvar.h> 32 #include <sys/kstat.h> 33 #include <sys/int_limits.h> 34 #include <sys/scsi/scsi_types.h> 35 #include <sys/scsi/generic/sense.h> 36 #include <sys/mtio.h> 37 #include <sys/taskq.h> 38 #include <sys/taskq_impl.h> 39 40 #ifdef __cplusplus 41 extern "C" { 42 #endif 43 44 /* 45 * Defines for SCSI tape drives. 46 */ 47 48 /* 49 * Maximum variable length record size for a single request 50 */ 51 #define ST_MAXRECSIZE_VARIABLE 65535 52 53 /* 54 * If the requested record size exceeds ST_MAXRECSIZE_VARIABLE, 55 * then the following define is used. 56 */ 57 #define ST_MAXRECSIZE_VARIABLE_LIMIT 65534 58 59 #define ST_MAXRECSIZE_FIXED (63<<10) /* maximum fixed record size */ 60 #define INF 1000000000 /* old external count backwards from this from EOF */ 61 #define LASTBLK (-1) /* new internal count backwards from EOF */ 62 63 /* 64 * Supported tape device types plus default type for opening. 65 * Types 10 - 13, are special (ancient too) drives - *NOT SUPPORTED* 66 * Types 14 - 1f, are 1/4-inch cartridge drives. 67 * Types 20 - 28, are 1/2-inch cartridge or reel drives. 68 * Types 28+, are rdat (vcr) drives. 69 */ 70 #define ST_TYPE_INVALID 0x00 71 72 #define ST_TYPE_SYSGEN1 MT_ISSYSGEN11 /* Sysgen with QIC-11 only */ 73 #define ST_TYPE_SYSGEN MT_ISSYSGEN /* Sysgen with QIC-24 and QIC-11 */ 74 75 #define ST_TYPE_DEFAULT MT_ISDEFAULT /* Generic 1/4" or undetermined */ 76 #define ST_TYPE_EMULEX MT_ISMT02 /* Emulex MT-02 */ 77 #define ST_TYPE_ARCHIVE MT_ISVIPER1 /* Archive QIC-150 */ 78 #define ST_TYPE_WANGTEK MT_ISWANGTEK1 /* Wangtek QIC-150 */ 79 80 #define ST_TYPE_CDC MT_ISCDC /* CDC - (not tested) */ 81 #define ST_TYPE_FUJI MT_ISFUJI /* Fujitsu - (not tested) */ 82 #define ST_TYPE_KENNEDY MT_ISKENNEDY /* Kennedy */ 83 #define ST_TYPE_ANRITSU MT_ISANRITSU /* Anritsu */ 84 #define ST_TYPE_HP MT_ISHP /* HP */ 85 #define ST_TYPE_HIC MT_ISCCS23 /* Generic 1/2" Cartridge */ 86 #define ST_TYPE_REEL MT_ISCCS24 /* Generic 1/2" Reel Tape */ 87 #define ST_TYPE_DAT MT_ISCCS28 /* Generic DAT Tape */ 88 89 #define ST_TYPE_EXABYTE MT_ISEXABYTE /* Exabyte 8200 */ 90 #define ST_TYPE_EXB8500 MT_ISEXB8500 /* Exabyte 8500 */ 91 #define ST_TYPE_WANGTHS MT_ISWANGTHS /* Wangtek 6130HS */ 92 #define ST_TYPE_WANGDAT MT_ISWANGDAT /* WangDAT */ 93 #define ST_TYPE_PYTHON MT_ISPYTHON /* Archive Python DAT */ 94 #define ST_TYPE_STC3490 MT_ISSTC /* IBM STC 3490 */ 95 #define ST_TYPE_TAND25G MT_ISTAND25G /* TANDBERG 2.5G */ 96 #define ST_TYPE_DLT MT_ISDLT /* DLT */ 97 #define ST_TYPE_STK9840 MT_ISSTK9840 /* StorageTek 9840, 9940, 9840B */ 98 #define ST_TYPE_BMDLT1 MT_ISBMDLT1 /* Benchmark DTL1 */ 99 #define ST_TYPE_LTO MT_LTO /* sun: LTO's by HP, Seagate, IBM.. */ 100 #define ST_TYPE_AIT MT_ISAIT /* Sony AIT I, II, III and SAIT */ 101 #define ST_LAST_TYPE ST_TYPE_AIT /* Add new above type and change this */ 102 103 104 /* Internal flags */ 105 #define ST_DYNAMIC 0x2000 /* Device name has been dynamically */ 106 /* alloc'ed from the st.conf entry, */ 107 /* instead of being used from the */ 108 /* st_drivetypes array. */ 109 110 /* 111 * Defines for supported drive options 112 * 113 * WARNING : THESE OPTIONS SHOULD NEVER BE CHANGED, AS OLDER CONFIGURATIONS 114 * WILL DEPEND ON THE FLAG VALUES REMAINING THE SAME 115 */ 116 #define ST_VARIABLE 0x001 /* Device supports variable */ 117 /* length record sizes */ 118 #define ST_QIC 0x002 /* QIC tape device */ 119 #define ST_REEL 0x004 /* 1/2-inch reel tape device */ 120 #define ST_BSF 0x008 /* Device supports backspace */ 121 /* file as in mt(1) bsf : */ 122 /* backspace over EOF marks. */ 123 /* Devices not supporting bsf */ 124 /* will fail with ENOTTY upon */ 125 /* use of bsf */ 126 #define ST_BSR 0x010 /* Device supports backspace */ 127 /* record as in mt(1) bsr : */ 128 /* backspace over records. If */ 129 /* the device does not support */ 130 /* bsr, the st driver emulates */ 131 /* the action by rewinding the */ 132 /* tape and using forward space */ 133 /* file (fsf) to the correct */ 134 /* file and then uses forward */ 135 /* space record (fsr) to the */ 136 /* correct record */ 137 #define ST_LONG_ERASE 0x020 /* Device needs a longer time */ 138 /* than normal to erase */ 139 #define ST_AUTODEN_OVERRIDE 0x040 /* Auto-Density override flag */ 140 /* Device can figure out the */ 141 /* tape density automatically, */ 142 /* without issuing a */ 143 /* mode-select/mode-sense */ 144 #define ST_NOBUF 0x080 /* Don't use buffered mode. */ 145 /* This disables the device's */ 146 /* ability for buffered writes */ 147 /* I.e. The device acknowledges */ 148 /* write completion after the */ 149 /* data is written to the */ 150 /* device's buffer, but before */ 151 /* all the data is actually */ 152 /* written to tape */ 153 #define ST_RESERVED_BIT1 0x100 /* reserved bit */ 154 /* parity while talking to it. */ 155 #define ST_KNOWS_EOD 0x200 /* Device knows when EOD (End */ 156 /* of Data) has been reached. */ 157 /* If the device knows EOD, st */ 158 /* uses fast file skipping. */ 159 /* If it does not know EOD, */ 160 /* file skipping happens one */ 161 /* file at a time. */ 162 #define ST_UNLOADABLE 0x400 /* Device will not complain if */ 163 /* the st driver is unloaded & */ 164 /* loaded again; e.g. will */ 165 /* return the correct inquiry */ 166 /* string */ 167 #define ST_SOFT_ERROR_REPORTING 0x800 /* Do request or log sense on */ 168 /* close to report soft errors. */ 169 /* Currently only Exabyte and */ 170 /* DAT drives support this */ 171 /* feature. */ 172 #define ST_LONG_TIMEOUTS 0x1000 /* Device needs 5 times longer */ 173 /* timeouts for normal */ 174 /* operation */ 175 #define ST_BUFFERED_WRITES 0x4000 /* The data is buffered in the */ 176 /* driver and pre-acked to the */ 177 /* application */ 178 #define ST_NO_RECSIZE_LIMIT 0x8000 /* For variable record size */ 179 /* devices only. If flag is */ 180 /* set, then don't limit */ 181 /* record size to 64k as in */ 182 /* pre-Solaris 2.4 releases. */ 183 /* The only limit on the */ 184 /* record size will be the max */ 185 /* record size the device can */ 186 /* handle or the max DMA */ 187 /* transfer size of the */ 188 /* machine, which ever is */ 189 /* smaller. Beware of */ 190 /* incompatabilities with */ 191 /* tapes of pre-Solaris 2.4 */ 192 /* OS's written with large */ 193 /* (>64k) block sizes, as */ 194 /* their true block size is */ 195 /* a max of approx 64k */ 196 #define ST_MODE_SEL_COMP 0x10000 /* use mode select of device */ 197 /* configuration page (0x10) to */ 198 /* enable/disable compression */ 199 /* instead of density codes for */ 200 /* the "c" and "u" devices */ 201 #define ST_NO_RESERVE_RELEASE 0x20000 /* For devices which do not */ 202 /* support RESERVE/RELEASE SCSI */ 203 /* command. If this is enabled */ 204 /* then reserve/release would */ 205 /* not be used during open/ */ 206 /* close for High Availability */ 207 #define ST_READ_IGNORE_ILI 0x40000 /* This flag is only applicable */ 208 /* to variable block devices */ 209 /* which support the SILI bit */ 210 /* option. It indicates that */ 211 /* the SILI bit will be ignored */ 212 /* during reads */ 213 #define ST_READ_IGNORE_EOFS 0x80000 /* When this flag is set two */ 214 /* EOF marks do not indicate an */ 215 /* EOM. This option is only */ 216 /* supported on 1/2" reel tapes */ 217 #define ST_SHORT_FILEMARKS 0x100000 /* This option applies only to */ 218 /* EXABYTE 8mm tape drives */ 219 /* which support short */ 220 /* filemarks. When this flag */ 221 /* is set, short filemarks */ 222 /* will be used for writing */ 223 /* filemarks. */ 224 #define ST_EJECT_ON_CHANGER_FAILURE 0x200000 /* When this flag is set */ 225 /* and the tape is trapped in */ 226 /* the medium changer, the tape */ 227 /* is automatically ejected */ 228 #define ST_RETRY_ON_RECOVERED_DEFERRED_ERROR 0x400000 229 /* This option applies only to */ 230 /* IBM MAGSTAR 3590. If this */ 231 /* flag is set, the st driver */ 232 /* will retry the last cmd if */ 233 /* the last error cause a check */ 234 /* condition with error code */ 235 /* 0x71 and sense code 0x01 */ 236 #define ST_KNOWS_MEDIA 0x800000 /* Use configured media type */ 237 /* detected to select correct */ 238 /* density code. */ 239 #define ST_WORMABLE 0x1000000 240 /* Drive is capable of doing */ 241 /* Write Appends only at EOM */ 242 /* if WORM media type is loaded */ 243 #define ST_CLN_TYPE_1 0x10000000 /* When this flag is set, */ 244 /* the tape drive provides the */ 245 /* clean bit information in */ 246 /* byte 21, bitmask 0x08 of */ 247 /* Request Sense data */ 248 #define ST_CLN_TYPE_2 0x20000000 /* When this flag is set, */ 249 /* the tape drive provides the */ 250 /* clean bit information in */ 251 /* byte 70, bitmask 0xc0 of */ 252 /* Request Sense data */ 253 #define ST_CLN_TYPE_3 0x40000000 /* When this flag is set, */ 254 /* the tape drive provides the */ 255 /* clean bit information in */ 256 /* byte 18, bitmask 0x01 of */ 257 /* Request Sense data */ 258 259 #define ST_CLN_MASK (ST_CLN_TYPE_1 | ST_CLN_TYPE_2 | ST_CLN_TYPE_3) 260 #define ST_VALID_OPTS (ST_VARIABLE | ST_QIC | ST_REEL | ST_BSF | ST_BSR |\ 261 ST_LONG_ERASE | ST_AUTODEN_OVERRIDE | ST_NOBUF | ST_KNOWS_EOD |\ 262 ST_UNLOADABLE | ST_SOFT_ERROR_REPORTING | ST_LONG_TIMEOUTS |\ 263 ST_NO_RECSIZE_LIMIT | ST_MODE_SEL_COMP | ST_NO_RESERVE_RELEASE |\ 264 ST_READ_IGNORE_ILI | ST_READ_IGNORE_EOFS | ST_SHORT_FILEMARKS |\ 265 ST_EJECT_ON_CHANGER_FAILURE | ST_RETRY_ON_RECOVERED_DEFERRED_ERROR |\ 266 ST_WORMABLE | ST_CLN_TYPE_1 | ST_CLN_TYPE_2 | ST_CLN_TYPE_3) 267 268 #define NDENSITIES MT_NDENSITIES 269 #define NSPEEDS MT_NSPEEDS 270 271 /* 272 * defines for Log Sense Pages 273 */ 274 #define SUPPORTED_LOG_PAGES_PAGE 0x00 275 #define TAPE_SEQUENTIAL_PAGE 0x0c 276 #define TAPE_ALERT_PAGE 0x2e 277 278 /* 279 * Log Page Control definitions 280 */ 281 #define CURRENT_THRESHOLD_VALUES 0x00 282 #define CURRENT_CUMULATIVE_VALUES 0x40 283 #define DEFAULT_THRESHOLD_VALUES 0x80 284 #define DEFAULT_CUMULATIVE_VALUES 0xC0 285 286 /* 287 * Tape Alert Flag definitions 288 */ 289 typedef enum { 290 TAF_READ_WARN = 0x01, 291 TAF_WRITE_WARN = 0x02, 292 TAF_HARD_ERR = 0x03, 293 TAF_MEDIA_ERR = 0x04, 294 TAF_READ_FAIL = 0x05, 295 TAF_WRITE_FAIL = 0x06, 296 TAF_MEDIA_LIFE = 0x07, 297 TAF_MEDIA_NOT_DATA_GRADE = 0x08, 298 TAF_WRITE_PROTECTED = 0x09, 299 TAF_NO_MEDIA_REMOVE = 0x0A, 300 TAF_CLEANING_MEDIA = 0x0B, 301 TAF_UNSUPPERTED_FORMAT = 0x0C, 302 TAF_RECOVERED_TAPE_BREAK = 0x0D, 303 TAF_TAPE_BREAK_FAUL = 0x0E, 304 TAF_CART_MEM_FAIL = 0x0F, 305 TAF_FORCED_EJECT = 0x10, 306 TAF_READ_ONLY_FORMAT = 0x11, 307 TAF_TAPE_DIR_CORRUPT = 0x12, 308 TAF_NEARING_MEDIA_LIFE = 0x13, 309 TAF_CLEAN_NOW = 0x14, 310 TAF_CLEAN_PERIODIC = 0x15, 311 TAF_EXP_CLEAN_CART = 0x16, 312 TAF_INVALID_CLEAN_MEDIA = 0x17, 313 TAF_RETENSION_REQUEST = 0x18, 314 TAF_DUAL_PORT_INTERFACE_ERR = 0x19, 315 TAF_COOLING_FAN_FAIL = 0x1A, 316 TAF_POWER_SUPPLY_FAIL = 0x1B, 317 TAF_POWER_CONSUMPTION = 0x1C, 318 TAF_DRIVE_MAINT_REQUEST = 0x1D, 319 TAF_HARDWARE_A = 0x1E, 320 TAF_HARDWARE_B = 0x1F, 321 TAF_INTERFACE = 0x20, 322 TAF_EJECT_MEDIA = 0x21, 323 TAF_DOWNLOAD_FAIL = 0x22, 324 TAF_DRIVE_HUMIDITY = 0x23, 325 TAF_DRIVE_TEMP = 0x24, 326 TAF_DRIVE_VOLTAGE = 0x25, 327 TAF_PREDICTIVE_FAIL = 0x26, 328 TAF_DIAG_REQUIRED = 0x27, 329 TAF_LOADER_HDWR_A = 0x28, 330 TAF_LOADER_STRAY_TAPE = 0x29, 331 TAF_LOADER_HDWR_B = 0x2A, 332 TAF_LOADER_DOOR = 0x2B, 333 TAF_LOADER_HDWR_C = 0x2C, 334 TAF_LOADER_MAGAZINE = 0x2D, 335 TAF_LOADER_PREDICTIVE_FAIL = 0x2E, 336 TAF_LOST_STATISTICS = 0x32, 337 TAF_TAPE_DIR_CURRUPT_UNLOAD = 0x33, 338 TAF_TAPE_SYS_WRT_FAIL = 0x34, 339 TAF_TAPE_SYS_RD_FAIL = 0x35, 340 TAF_NO_START_OF_DATA = 0x36, 341 TAF_WORM_INTEGRITY = 0x3B, 342 TAF_WORM_OVRWRT_ATTEMPT = 0x3C 343 }tape_alert_flags; 344 345 /* 346 * For ST_TYPE_STK9840 drives only. STK drive doesn't support retension 347 * so they reuse TAF_RETENSION_REQUEST. 348 */ 349 #define CLEAN_FOR_ERRORS 0x18 350 351 352 #define TAPE_ALERT_SUPPORT_UNKNOWN 0x00 353 #define TAPE_ALERT_NOT_SUPPORTED 0x01 354 #define TAPE_ALERT_SUPPORTED 0x02 355 #define TAPE_ALERT_STILL_DIRTY 0x04 356 #define TAPE_SEQUENTIAL_SUPPORTED 0x08 357 #define TAPE_PREVIOUSLY_DIRTY 0x10 358 359 #define TAPE_ALERT_MAX_PARA 64 360 #define TAPE_SEQUENTIAL_PAGE_PARA 64 /* way more then really used */ 361 #define SEQUENTIAL_NEED_CLN 0x0100 362 363 /* 364 * Parameters 365 */ 366 #define ST_NAMESIZE 44 /* size of pretty string for vid/pid */ 367 #define VIDLEN 8 /* size of vendor identifier length */ 368 #define PIDLEN 16 /* size of product identifier length */ 369 #define VIDPIDLEN (VIDLEN + PIDLEN) 370 371 372 struct st_drivetype { 373 char name[ST_NAMESIZE]; /* Name, for debug */ 374 char length; /* Length of vendor id */ 375 char vid[VIDPIDLEN]; /* Vendor id and model (product) id */ 376 char type; /* Drive type for driver */ 377 int bsize; /* Block size */ 378 int options; /* Drive options */ 379 int max_rretries; /* Max read retries */ 380 int max_wretries; /* Max write retries */ 381 uchar_t densities[NDENSITIES]; /* density codes, low->hi */ 382 uchar_t default_density; /* default density for this drive */ 383 uchar_t mediatype[NDENSITIES]; /* was speed. mediatype for density. */ 384 ushort_t non_motion_timeout; /* Inquiry type commands */ 385 ushort_t io_timeout; /* I/O timeout in seconds */ 386 ushort_t rewind_timeout; /* rewind timeout in seconds */ 387 ushort_t space_timeout; /* space cmd timeout in seconds */ 388 ushort_t load_timeout; /* load tape time in seconds */ 389 ushort_t unload_timeout; /* unload tape time in seconds */ 390 ushort_t erase_timeout; /* erase timeout. seconds */ 391 }; 392 393 #define MINUTES(val) ((val) * 60) 394 395 struct comp_mode_page { 396 #if defined(_BIT_FIELDS_LTOH) 397 uchar_t : 6, 398 dcc: 1, /* Data Compression Capable */ 399 dce: 1; /* Data Compression Enable */ 400 uchar_t : 5, 401 red: 2, /* Report Exceptions on Decompress */ 402 dde: 1; /* Data Decompression Enabled */ 403 uchar_t comp_alg_msb; /* Compression Algorithm */ 404 uchar_t comp_alg_high; 405 uchar_t comp_alg_low; 406 uchar_t comp_alg_lsb; 407 uchar_t decomp_alg_msb; /* Decompression Algorithm */ 408 uchar_t decomp_alg_high; 409 uchar_t decomp_alg_low; 410 uchar_t decomp_alg_lsb; 411 uchar_t reservered0; 412 uchar_t reservered1; 413 uchar_t reservered2; 414 uchar_t reservered3; 415 416 #elif defined(_BIT_FIELDS_HTOL) 417 uchar_t dce: 1, /* Data Compression Enable */ 418 dcc: 1, /* Data Compression Capable */ 419 : 6; 420 uchar_t dde: 1, /* Data Decompression Enabled */ 421 red: 2, /* Report Exceptions on Decompress */ 422 : 5; 423 uchar_t comp_alg_msb; /* Compression Algorithm */ 424 uchar_t comp_alg_high; 425 uchar_t comp_alg_low; 426 uchar_t comp_alg_lsb; 427 uchar_t decomp_alg_msb; /* Decompression Algorithm */ 428 uchar_t decomp_alg_high; 429 uchar_t decomp_alg_low; 430 uchar_t decomp_alg_lsb; 431 uchar_t reservered0; 432 uchar_t reservered1; 433 uchar_t reservered2; 434 uchar_t reservered3; 435 #endif 436 }; 437 438 struct dev_mode_page { 439 #if defined(_BIT_FIELDS_LTOH) 440 uchar_t act_format: 5, /* active format */ 441 caf: 1, /* Change Active Format */ 442 cap: 1, /* Change Active Partition OBSOLETE */ 443 : 1; 444 uchar_t act_partition; /* active partition */ 445 uchar_t wrt_buf_full_ratio; /* write buffer full ratio */ 446 uchar_t rd_buf_full_ratio; /* read buffer full ratio */ 447 uchar_t wrt_delay_time_msb; /* write delay time MSB */ 448 uchar_t wrt_delay_time_lsb; /* write delay time LSB */ 449 uchar_t rew: 1, /* Report Early Warning */ 450 robo: 1, /* Reverse Object Buffer Order */ 451 socf: 2, /* Stop On Consecutive Filemarks */ 452 avc: 1, /* Automatic Velocity Control */ 453 rsmk: 1, /* Report SetMarKs OBSOLETE */ 454 lois: 1, /* Logical Object Identifiers Support */ 455 obr: 1; /* Object Buffer Recovery */ 456 uchar_t gap_size; /* OBSOLETE */ 457 uchar_t bam: 1, /* Block Address Mode */ 458 bmal: 1, /* Block Address Mode Lock */ 459 swp: 1, /* Software Write Protection */ 460 sew: 1, /* Sync data after Early Warning */ 461 eeg: 1, /* Enable Early Waring */ 462 eod_defined: 3; 463 uchar_t buf_size_leot_msb; /* Buffer size after early warning */ 464 uchar_t buf_size_leot_mid; 465 uchar_t buf_size_leot_lsb; 466 uchar_t comp_alg; /* Compression Algorithm (enable) */ 467 uchar_t prmwp: 1, /* PeRManent Write Protect */ 468 perswp: 1, /* persistant write protection */ 469 asocwp: 1, /* associated write protect */ 470 rew_on_rst: 2, /* rewind on reset */ 471 oir: 1, /* Only If Reserved */ 472 wtre: 2; /* Worm Tamper Read Enable */ 473 474 #elif defined(_BIT_FIELDS_HTOL) 475 uchar_t : 1, 476 cap: 1, /* Change Active Partition OBSOLETE */ 477 caf: 1, /* Change Active Format */ 478 act_format: 5; /* active format */ 479 uchar_t act_partition; /* active partition */ 480 uchar_t wrt_buf_full_ratio; /* write buffer full ratio */ 481 uchar_t rd_buf_full_ratio; /* read buffer full ratio */ 482 uchar_t wrt_delay_time_msb; /* write delay time MSB */ 483 uchar_t wrt_delay_time_lsb; /* write delay time LSB */ 484 uchar_t obr: 1, /* Object Buffer Recovery */ 485 lois: 1, /* Logical Object Identifiers Support */ 486 rsmk: 1, /* Report SetMarKs OBSOLETE */ 487 avc: 1, /* Automatic Velocity Control */ 488 socf: 2, /* Stop On Consecutive Filemarks */ 489 robo: 1, /* Reverse Object Buffer Order */ 490 rew: 1; /* Report Early Warning */ 491 uchar_t gap_size; /* OBSELETE */ 492 uchar_t eod_defined: 3, 493 eeg: 1, /* Enable Early Waring */ 494 sew: 1, /* Sync data after Early Warning */ 495 swp: 1, /* Software Write Protection */ 496 bmal: 1, /* Block Address Mode Lock */ 497 bam: 1; /* Block Address Mode */ 498 uchar_t buf_size_leot_msb; /* Buffer size after early warning */ 499 uchar_t buf_size_leot_mid; 500 uchar_t buf_size_leot_lsb; 501 uchar_t comp_alg; /* Compression Algorithm (enable) */ 502 uchar_t wtre: 2, /* Worm Tamper Read Enable */ 503 oir: 1, /* Only If Reserved */ 504 rew_on_rst: 2, /* rewind on reset */ 505 asocwp: 1, /* associated write protect */ 506 perswp: 1, /* persistant write protection */ 507 prmwp: 1; /* PeRManent Write Protect */ 508 #endif 509 }; 510 511 struct sas_lun_mode { 512 #if defined(_BIT_FIELDS_HTOL) 513 uchar_t : 3, 514 tran_layer_ret: 1, 515 protocol_id: 4; 516 uchar_t reserved[5]; 517 #elif defined(_BIT_FIELDS_LTOH) 518 uchar_t protocol_id: 4, 519 tran_layer_ret: 1, 520 : 3; 521 uchar_t reserved[5]; 522 #endif 523 }; 524 typedef union { 525 struct comp_mode_page comp; 526 struct dev_mode_page dev; 527 struct sas_lun_mode saslun; 528 }modepage; 529 530 /* 531 * 532 * Parameter list for the MODE_SELECT and MODE_SENSE commands. 533 * The parameter list contains a header, followed by zero or more 534 * block descriptors, followed by vendor unique parameters, if any. 535 * 536 */ 537 #define MSIZE 0x0c /* Size without additional pages */ 538 struct seq_mode { 539 #if defined(_BIT_FIELDS_LTOH) 540 uchar_t data_len; /* sense data length, sense only */ 541 uchar_t media_type; /* medium type, sense only */ 542 uchar_t speed :4, /* speed */ 543 bufm :3, /* buffered mode */ 544 wp :1; /* write protected, sense only */ 545 uchar_t bd_len; /* block length in bytes */ 546 uchar_t density; /* density code */ 547 uchar_t high_nb; /* number of logical blocks on the medium */ 548 uchar_t mid_nb; /* that are to be formatted with the density */ 549 uchar_t low_nb; /* code and block length in block descriptor */ 550 uchar_t reserved; /* reserved */ 551 uchar_t high_bl; /* block length */ 552 uchar_t mid_bl; /* " " */ 553 uchar_t low_bl; /* " " */ 554 uchar_t page_code: 6, 555 : 1, 556 ps: 1; /* Page Savable sense only */ 557 uchar_t page_len; 558 modepage page; 559 560 #elif defined(_BIT_FIELDS_HTOL) 561 uchar_t data_len; /* sense data length, sense only */ 562 uchar_t media_type; /* medium type, sense only */ 563 uchar_t wp :1, /* write protected, sense only */ 564 bufm :3, /* buffered mode */ 565 speed :4; /* speed */ 566 uchar_t bd_len; /* block length in bytes */ 567 uchar_t density; /* density code */ 568 uchar_t high_nb; /* number of logical blocks on the medium */ 569 uchar_t mid_nb; /* that are to be formatted with the density */ 570 uchar_t low_nb; /* code and block length in block descriptor */ 571 uchar_t reserved; /* reserved */ 572 uchar_t high_bl; /* block length */ 573 uchar_t mid_bl; /* " " */ 574 uchar_t low_bl; /* " " */ 575 uchar_t ps: 1, /* Page Savable sense only */ 576 : 1, 577 page_code: 6; 578 uchar_t page_len; 579 modepage page; 580 #else 581 #error One of _BIT_FIELDS_LTOH or _BIT_FIELDS_HTOL must be defined 582 #endif /* _BIT_FIELDS_LTOH */ 583 }; 584 585 /* 586 * One_command parameter data for REPORT SUPPORTED OPERATION CODES. 587 */ 588 struct one_com_des { 589 #if defined(_BIT_FIELDS_LTOH) 590 uchar_t reserved0; 591 uchar_t support: 3, /* support value */ 592 reserved1: 4, 593 ctdp: 1; /* cmd timeouts descriptor present */ 594 ushort_t cdb_size; /* cdb size */ 595 uchar_t usage[CDB_GROUP4]; /* 16 bytes, the largest CDB group */ 596 #elif defined(_BIT_FIELDS_HTOL) 597 uchar_t reserved0; 598 uchar_t ctdp: 1, /* cmd timeouts descriptor present */ 599 reserved1: 4, 600 support: 3; /* support value */ 601 ushort_t cdb_size; /* cdb size */ 602 uchar_t usage[CDB_GROUP4]; /* 16 bytes, the largest CDB group */ 603 #else 604 #error One of _BIT_FIELDS_LTOH or _BIT_FIELDS_HTOL must be defined 605 #endif /* _BIT_FIELDS_LTOH */ 606 }; 607 608 /* 609 * Command timeouts descriptor 610 */ 611 struct com_timeout_des { 612 ushort_t des_len; /* descriptor length */ 613 uchar_t reserved; 614 uchar_t com_spe; /* command specific */ 615 uint_t nom_timeout; /* nominal command processing timeout */ 616 uint_t rec_timeout; /* recommended command timeout */ 617 }; 618 619 /* 620 * Reporting options 621 */ 622 #define ALL_COMMAND_DATA_FORMAT 0 623 #define ONE_COMMAND_NO_SERVICE_DATA_FORMAT 1 624 #define ONE_COMMAND_DATA_FORMAT 2 625 626 /* 627 * Support values in One_command parameter data 628 */ 629 #define SUPPORT_VALUES_NOT_AVAILABLE 0 630 #define SUPPORT_VALUES_NOT_SUPPORT 1 631 #define SUPPORT_VALUES_SUPPORT_SCSI 3 632 #define SUPPORT_VALUES_SUPPORT_VENDOR 5 633 634 /* 635 * Parameter data for REPORT DENSITY SUPPORT command 636 */ 637 struct report_density_header { 638 ushort_t ava_dens_len; /* available density support length */ 639 uchar_t reserved0; 640 uchar_t reserved1; 641 }; 642 643 struct report_density_desc { 644 #if defined(_BIT_FIELDS_LTOH) 645 uchar_t pri_den; /* primary density code */ 646 uchar_t sec_den; /* secondary density code */ 647 uchar_t dlv:1; /* descriptor length valid */ 648 uchar_t reserved:4; 649 uchar_t deflt:1; /* is default density */ 650 uchar_t dup:1; /* pri density has one descriptor */ 651 uchar_t wrtok:1; /* support writing to media */ 652 uchar_t desc_len_hi; /* descriptor length high */ 653 uchar_t desc_len_low; /* descriptor length low */ 654 uchar_t bits_per_mm[3]; /* bits per mm */ 655 uchar_t media_width_hi; /* media width high */ 656 uchar_t media_width_low; /* media width low */ 657 ushort_t tracks; /* tracks */ 658 uint_t capacity; /* capacity */ 659 uchar_t ass_org[8]; /* assigning organization */ 660 uchar_t den_name[8]; /* density name */ 661 uchar_t description[20]; /* description */ 662 #elif defined(_BIT_FIELDS_HTOL) 663 uchar_t pri_den; /* primary density code */ 664 uchar_t sec_den; /* secondary density code */ 665 uchar_t wrtok:1; /* support writing to media */ 666 uchar_t dup:1; /* pri density has one descriptor */ 667 uchar_t deflt:1; /* is default density */ 668 uchar_t reserved:4; 669 uchar_t dlv:1; /* descriptor length valid */ 670 uchar_t desc_len_hi; /* descriptor length high */ 671 uchar_t desc_len_low; /* descriptor length low */ 672 uchar_t bits_per_mm[3]; /* bits per mm */ 673 uchar_t media_width_hi; /* media width high */ 674 uchar_t media_width_low; /* media width low */ 675 ushort_t tracks; /* tracks */ 676 uint_t capacity; /* capacity */ 677 uchar_t ass_org[8]; /* assigning organization */ 678 uchar_t den_name[8]; /* density name */ 679 uchar_t description[20]; /* description */ 680 #else 681 #error One of _BIT_FIELDS_LTOH or _BIT_FIELDS_HTOL must be defined 682 #endif /* _BIT_FIELDS_LTOH */ 683 }; 684 685 /* 686 * Data returned from the READ BLOCK LIMITS command. 687 */ 688 689 #define RBLSIZE (sizeof (struct read_blklim)) 690 struct read_blklim { 691 #if defined(_BIT_FIELDS_HTOL) 692 uchar_t reserved: 3; /* reserved */ 693 uchar_t granularity: 5; /* Minimum Modularity */ 694 #elif defined(_BIT_FIELDS_LTOH) 695 uchar_t granularity: 5; /* Minimum Modularity */ 696 uchar_t reserved: 3; /* reserved */ 697 #endif 698 uchar_t max_hi; /* Maximum block length, high byte */ 699 uchar_t max_mid; /* Maximum block length, middle byte */ 700 uchar_t max_lo; /* Maximum block length, low byte */ 701 uchar_t min_hi; /* Minimum block length, high byte */ 702 uchar_t min_lo; /* Minimum block length, low byte */ 703 }; 704 705 /* 706 * operation codes 707 */ 708 typedef enum { 709 ST_OP_NIL, 710 ST_OP_CTL, 711 ST_OP_READ, 712 ST_OP_WRITE, 713 ST_OP_WEOF 714 }optype; 715 716 /* 717 * eof/eot/eom codes. 718 */ 719 typedef enum { 720 ST_NO_EOF, 721 ST_EOF_PENDING, /* filemark pending */ 722 ST_EOF, /* at filemark */ 723 ST_EOT_PENDING, /* logical eot pending */ 724 ST_EOT, /* at logical eot */ 725 ST_EOM, /* at physical eot */ 726 ST_WRITE_AFTER_EOM /* flag for allowing writes after EOM */ 727 }pstatus; 728 729 typedef enum { invalid, legacy, logical } posmode; 730 731 typedef struct tapepos { 732 uint64_t lgclblkno; 733 int32_t fileno; 734 int32_t blkno; 735 int32_t partition; 736 pstatus eof; /* eof states */ 737 posmode pmode; 738 uint32_t: 32; 739 }tapepos_t; 740 741 /* byte 1 of cdb for type of read position command */ 742 typedef enum { 743 SHORT_POS = 0, 744 LONG_POS = 6, 745 EXT_POS = 8, 746 NO_POS = 0xff /* Drive doesn't support read position */ 747 } read_p_types; 748 749 750 /* 751 * Data returned from the READ POSITION command. 752 */ 753 754 typedef struct tape_position { 755 #if defined(_BIT_FIELDS_HTOL) 756 uchar_t begin_of_part: 1; 757 uchar_t end_of_part: 1; 758 uchar_t blk_cnt_unkwn: 1; 759 uchar_t byte_cnt_unkwn: 1; 760 uchar_t reserved0: 1; 761 uchar_t blk_posi_unkwn: 1; 762 uchar_t posi_err: 1; 763 uchar_t reserved1: 1; 764 #elif defined(_BIT_FIELDS_LTOH) 765 uchar_t reserved1: 1; 766 uchar_t posi_err: 1; 767 uchar_t blk_posi_unkwn: 1; 768 uchar_t reserved0: 1; 769 uchar_t byte_cnt_unkwn: 1; 770 uchar_t blk_cnt_unkwn: 1; 771 uchar_t end_of_part: 1; 772 uchar_t begin_of_part: 1; 773 #endif 774 uchar_t partition_number; 775 uchar_t reserved2[2]; 776 uint32_t host_block; 777 uint32_t media_block; 778 uchar_t reserved3; 779 uchar_t block_in_buff[3]; 780 uint32_t byte_in_buff; 781 }tape_position_t; 782 783 784 typedef struct tape_position_long { 785 #if defined(_BIT_FIELDS_HTOL) 786 uint32_t begin_of_part: 1; 787 uint32_t end_of_part: 1; 788 uint32_t reserved0: 2; 789 uint32_t mrk_posi_unkwn:1; 790 uint32_t blk_posi_unkwn:1; 791 uint32_t reserved1: 2; 792 #elif defined(_BIT_FIELDS_LTOH) 793 uint32_t reserved1: 2; 794 uint32_t blk_posi_unkwn:1; 795 uint32_t mrk_posi_unkwn:1; 796 uint32_t reserved0: 2; 797 uint32_t end_of_part: 1; 798 uint32_t begin_of_part: 1; 799 #endif 800 uint32_t reserved2: 24; 801 uint32_t partition; 802 uint64_t block_number; 803 uint64_t file_number; 804 uint64_t set_number; 805 }tape_position_long_t; 806 807 typedef struct tape_position_ext { 808 #if defined(_BIT_FIELDS_HTOL) 809 uchar_t begin_of_part: 1; 810 uchar_t end_of_part: 1; 811 uchar_t blk_cnt_unkwn: 1; 812 uchar_t byte_cnt_unkwn: 1; 813 uchar_t mrk_posi_unkwn: 1; 814 uchar_t blk_posi_unkwn: 1; 815 uchar_t posi_err: 1; 816 uchar_t reserved0: 1; 817 818 uchar_t partition; 819 uint16_t parameter_len; 820 /* start next word */ 821 uint32_t reserved1: 8; 822 uint32_t blks_in_buf: 24; 823 #elif defined(_BIT_FIELDS_LTOH) 824 uchar_t reserved0: 1; 825 uchar_t posi_err: 1; 826 uchar_t blk_posi_unkwn: 1; 827 uchar_t mrk_posi_unkwn: 1; 828 uchar_t byte_cnt_unkwn: 1; 829 uchar_t blk_cnt_unkwn: 1; 830 uchar_t end_of_part: 1; 831 uchar_t begin_of_part: 1; 832 833 uchar_t partition; 834 uint16_t parameter_len; 835 /* start next word */ 836 uint32_t blks_in_buf: 24; 837 uint32_t reserved1: 8; 838 #endif 839 uint64_t host_block; 840 uint64_t media_block; 841 uint64_t byte_in_buf; 842 }tape_position_ext_t; 843 844 typedef union { 845 tape_position_t srt; 846 tape_position_ext_t ext; 847 tape_position_long_t lng; 848 }read_pos_data_t; 849 850 typedef struct { 851 unsigned char cmd; 852 unsigned char 853 requires_reserve: 1, /* reserve must be done */ 854 retriable: 1, /* can be retried */ 855 chg_tape_pos: 1, /* position will change */ 856 chg_tape_data: 1, /* data on media will change */ 857 explicit_cmd_set: 1, /* explicit command set */ 858 /* 859 * 0 doesn't, 1 forward, 860 * 2 back, 3 either 861 */ 862 chg_tape_direction: 2; /* direction of pos change */ 863 #define DIR_NONE 0 864 #define DIR_FORW 1 865 #define DIR_REVC 2 866 #define DIR_EITH 3 867 unsigned char 868 /* 869 * 0 doesn't 1 read, 2 write 870 */ 871 transfers_data: 2, 872 #define TRAN_NONE 0 873 #define TRAN_READ 1 874 #define TRAN_WRTE 2 875 recov_pos_type: 1, 876 #define POS_EXPECTED 0 877 #define POS_STARTING 1 878 do_not_recover: 1; 879 uchar_t reserve_byte; 880 uint32_t reserve_mask; 881 uint64_t (*get_cnt)(uchar_t *); 882 uint64_t (*get_lba)(uchar_t *); 883 }cmd_attribute; 884 885 typedef struct { 886 buf_t *cmd_bp; 887 size_t privatelen; 888 int str_retry_cnt; 889 int pkt_retry_cnt; 890 }pkt_info; 891 892 typedef struct { 893 buf_t *cmd_bp; 894 size_t privatelen; 895 int str_retry_cnt; 896 int pkt_retry_cnt; 897 tapepos_t pos; 898 const cmd_attribute *cmd_attrib; 899 }recov_info; 900 901 #ifdef _KERNEL 902 903 #ifdef __x86 904 /* Data structure used in big block I/O on x86/x64 platform */ 905 906 /* 907 * alloc more than one contig_mem, so mutiple I/O can be 908 * on-going simultaneously 909 */ 910 #define ST_MAX_CONTIG_MEM_NUM 3 911 912 struct contig_mem { 913 struct contig_mem *cm_next; 914 size_t cm_len; 915 caddr_t cm_addr; 916 ddi_acc_handle_t cm_acc_hdl; 917 struct buf *cm_bp; 918 int cm_use_sbuf; 919 }; 920 921 #endif 922 923 #endif /* _KERNEL */ 924 925 /* 926 * driver states.. 927 */ 928 typedef enum { 929 ST_STATE_CLOSED, 930 ST_STATE_OFFLINE, 931 ST_STATE_INITIALIZING, 932 ST_STATE_OPENING, 933 ST_STATE_OPEN_PENDING_IO, 934 ST_STATE_APPEND_TESTING, 935 ST_STATE_OPEN, 936 ST_STATE_RESOURCE_WAIT, 937 ST_STATE_CLOSING, 938 ST_STATE_SENSING, 939 ST_STATE_CLOSE_PENDING_OPEN 940 }st_states; 941 942 typedef enum { RDWR, RDONLY, WORM, RDWORM, FAILED } writablity; 943 typedef enum { 944 TLR_NOT_KNOWN, 945 TLR_NOT_SUPPORTED, 946 TLR_SAS_ONE_DEVICE, 947 TLR_SAS_TWO_DEVICE 948 }st_tlr_state; 949 950 951 /* 952 * Private info for scsi tapes. Pointed to by the un_private pointer 953 * of one of the SCSI_DEVICE chains. 954 */ 955 956 struct scsi_tape { 957 struct scsi_device *un_sd; /* back pointer to SCSI_DEVICE */ 958 struct scsi_pkt *un_rqs; /* ptr to request sense command */ 959 struct scsi_pkt *un_mkr_pkt; /* ptr to marker packet */ 960 kcondvar_t un_sbuf_cv; /* cv on ownership of special buf */ 961 kcondvar_t un_queue_cv; /* cv on all queued commands */ 962 struct buf *un_sbufp; /* for use in special io */ 963 char *un_srqbufp; /* sense buffer for special io */ 964 kcondvar_t un_clscv; /* closing cv */ 965 struct buf *un_quef; /* head of wait queue */ 966 struct buf *un_quel; /* tail of wait queue */ 967 struct buf *un_runqf; /* head of run queue */ 968 struct buf *un_runql; /* tail of run queue */ 969 struct seq_mode *un_mspl; /* ptr to mode select info */ 970 struct st_drivetype *un_dp; /* ptr to drive table entry */ 971 uint_t un_dp_size; /* size of un_dp alloc'ed */ 972 caddr_t un_tmpbuf; /* buf for append, autodens ops */ 973 tapepos_t un_pos; /* Current tape position */ 974 int un_oflags; /* open flags */ 975 tapepos_t un_err_pos; /* block in file where err occurred */ 976 uint_t un_err_resid; /* resid from last error */ 977 short un_fmneeded; /* filemarks to be written - HP only */ 978 dev_t un_dev; /* unix device */ 979 uchar_t un_attached; /* unit known && attached */ 980 int un_pwr_mgmt; /* power management state */ 981 uchar_t un_density_known; /* density is known */ 982 uchar_t un_curdens; /* index into density table */ 983 optype un_lastop; /* last I/O was: read/write/ctl */ 984 st_states un_laststate; /* last state */ 985 st_states un_state; /* current state */ 986 uchar_t un_status; /* status from last sense */ 987 uchar_t un_retry_ct; /* retry count */ 988 writablity un_read_only; /* RDWR, RDONLY, WORM, RDWORM */ 989 uchar_t un_test_append; /* check writing at end of tape */ 990 uchar_t un_arq_enabled; /* auto request sense enabled */ 991 uchar_t un_untagged_qing; /* hba has untagged quing */ 992 uchar_t un_allow_large_xfer; /* allow >64k xfers if requested */ 993 uchar_t un_sbuf_busy; /* sbuf busy flag */ 994 uchar_t un_ncmds; /* number of commands outstanding */ 995 uchar_t un_throttle; /* curr. max number of cmds outst. */ 996 uchar_t un_last_throttle; /* saved max number of cmds outst. */ 997 uchar_t un_max_throttle; /* max poss. number cmds outstanding */ 998 uchar_t un_persistence; /* 1 = persistence on, 0 off */ 999 uchar_t un_persist_errors; /* 1 = persistenced flagged */ 1000 uchar_t un_flush_on_errors; /* HBA will flush all I/O's on a */ 1001 /* check condidtion or error */ 1002 uint_t un_kbytes_xferred; /* bytes (in K) counter */ 1003 uint_t un_last_resid; /* keep last resid, for PE */ 1004 uint_t un_last_count; /* keep last count, for PE */ 1005 struct kstat *un_stats; /* for I/O statistics */ 1006 struct buf *un_rqs_bp; /* bp used in rqpkt */ 1007 struct buf *un_wf; /* head of write queue */ 1008 struct buf *un_wl; /* tail of write queue */ 1009 struct read_blklim *un_rbl; /* ptr to read block limit info */ 1010 int un_maxdma; /* max dma xfer allowed by HBA */ 1011 uint_t un_bsize; /* block size currently being used */ 1012 int un_maxbsize; /* max block size allowed by drive */ 1013 uint_t un_minbsize; /* min block size allowed by drive */ 1014 int un_errno; /* errno (b_error) */ 1015 kcondvar_t un_state_cv; /* mediastate condition variable */ 1016 enum mtio_state un_mediastate; /* current media state */ 1017 enum mtio_state un_specified_mediastate; /* expected state */ 1018 timeout_id_t un_delay_tid; /* delayed cv tid */ 1019 timeout_id_t un_hib_tid; /* handle interrupt busy tid */ 1020 opaque_t un_swr_token; /* scsi_watch request token */ 1021 uchar_t un_comp_page; /* compression page */ 1022 uchar_t un_rsvd_status; /* Reservation Status */ 1023 kstat_t *un_errstats; /* for error statistics */ 1024 int un_init_options; /* Init time drive options */ 1025 int un_save_fileno; /* Save here for recovery */ 1026 daddr_t un_save_blkno; /* Save here for recovery */ 1027 uchar_t un_restore_pos; /* Indication to do recovery */ 1028 tapepos_t un_suspend_pos; /* Save blkno for SUSPEND */ 1029 uchar_t un_silent_skip; /* to catch short reads */ 1030 short un_tids_at_suspend; /* timeouts set at suspend */ 1031 kcondvar_t un_tape_busy_cv; /* busy cv */ 1032 kcondvar_t un_suspend_cv; /* busy cv */ 1033 /* restore on close */ 1034 uchar_t un_eject_tape_on_failure; /* 1 = eject tape, 0 = don't */ 1035 uchar_t un_HeadClean; /* support and need head cleaning? */ 1036 uchar_t un_rqs_state; /* see define below */ 1037 struct scsi_extended_sense 1038 *un_uscsi_rqs_buf; /* uscsi_rqs: buffer for RQS data */ 1039 uchar_t un_data_mod; /* Device required data mod */ 1040 writablity (*un_wormable) (struct scsi_tape *un); /* worm test fuct */ 1041 int un_max_cdb_sz; /* max cdb size to use */ 1042 read_p_types un_read_pos_type; 1043 read_pos_data_t *un_read_pos_data; 1044 struct mterror_entry_stack *un_error_entry_stk; 1045 /* latest sense cmd buffer */ 1046 #ifdef __x86 1047 ddi_dma_handle_t un_contig_mem_hdl; 1048 struct contig_mem *un_contig_mem; 1049 int un_contig_mem_available_num; 1050 int un_contig_mem_total_num; 1051 size_t un_max_contig_mem_len; 1052 kcondvar_t un_contig_mem_cv; 1053 int un_maxdma_arch; /* max dma xfer allowed by HBA & arch */ 1054 #endif 1055 caddr_t un_media_id; 1056 int un_media_id_len; 1057 int (*un_media_id_method)(struct scsi_tape *, int (*)()); 1058 buf_t *un_recov_buf; /* buf to recover failed commands */ 1059 kcondvar_t un_recov_buf_cv; /* cv for buf un_recov_buf */ 1060 uchar_t un_recov_buf_busy; 1061 #ifdef _KERNEL 1062 ddi_taskq_t *un_recov_taskq; 1063 #else 1064 void *un_recov_taskq; 1065 #endif 1066 tapepos_t un_running; 1067 uchar_t un_unit_attention_flags; 1068 uchar_t un_multipath; 1069 ulong_t un_last_path_instance; 1070 st_tlr_state un_tlr_flag; /* tape support TLR flag */ 1071 }; 1072 1073 typedef int (*bufunc_t)(struct scsi_tape *, int, int64_t, int); 1074 typedef int (*ubufunc_t)(struct scsi_tape *, struct uscsi_cmd *, int); 1075 1076 1077 /* 1078 * device error kstats 1079 */ 1080 struct st_errstats { 1081 struct kstat_named st_softerrs; 1082 struct kstat_named st_harderrs; 1083 struct kstat_named st_transerrs; 1084 struct kstat_named st_vid; 1085 struct kstat_named st_pid; 1086 struct kstat_named st_revision; 1087 struct kstat_named st_serial; 1088 }; 1089 1090 /* 1091 * generic log page struct 1092 */ 1093 struct log_page { 1094 #if defined(_BIT_FIELDS_LTOH) 1095 uchar_t code :6, /* page code number */ 1096 :2; /* reserved */ 1097 #elif defined(_BIT_FIELDS_HTOL) 1098 uchar_t :2, /* reserved */ 1099 code :6; /* page code number */ 1100 #endif /* _BIT_FIELDS_LTOH */ 1101 uchar_t reserved; /* reserved */ 1102 uchar_t length_hi; /* length of bytes to follow (msb) */ 1103 uchar_t length_lo; /* length of bytes to follow (lsb) */ 1104 /* 1105 * Log parameters follow right after this... 1106 */ 1107 }; 1108 1109 /* 1110 * generic log page parameter struct 1111 */ 1112 struct log_param { 1113 uchar_t pc_hi; /* parameter code (msb) */ 1114 uchar_t pc_lo; /* parameter code (lsb) */ 1115 #if defined(_BIT_FIELDS_LTOH) 1116 uchar_t lp : 1, /* list parameter */ 1117 : 1, /* reserved */ 1118 tmc : 2, /* threshold met criteria */ 1119 etc : 1, /* enable threshold comparison */ 1120 tsd : 1, /* target save disable */ 1121 ds : 1, /* disable save */ 1122 du : 1; /* disable update */ 1123 #elif defined(_BIT_FIELDS_HTOL) 1124 uchar_t du : 1, /* disable update */ 1125 ds : 1, /* disable save */ 1126 tsd : 1, /* target save disable */ 1127 etc : 1, /* enable threshold comparison */ 1128 tmc : 2, /* threshold met criteria */ 1129 : 1, /* reserved */ 1130 lp : 1; /* list parameter */ 1131 #endif /* _BIT_FIELDS_LTOH */ 1132 uchar_t length; /* length of bytes to follow */ 1133 /* 1134 * Parameter values follow right after this... 1135 */ 1136 }; 1137 /* 1138 * TapeAlert structures 1139 */ 1140 1141 struct st_tape_alert_parameter { 1142 struct log_param log_param; 1143 uchar_t param_value; 1144 }; 1145 1146 struct st_tape_alert { 1147 struct log_page log_page; 1148 struct st_tape_alert_parameter param[TAPE_ALERT_MAX_PARA]; 1149 }; 1150 1151 #define TAPE_ALERT_PARAMETER_LENGTH \ 1152 (sizeof (struct st_tape_alert_parameter)) * TAPE_ALERT_MAX_PARA 1153 1154 struct log_sequential_page_parameter { 1155 struct log_param log_param; 1156 uchar_t param_value[8]; 1157 }; 1158 1159 struct log_sequential_page { 1160 struct log_page log_page; 1161 struct log_sequential_page_parameter param[TAPE_SEQUENTIAL_PAGE_PARA]; 1162 }; 1163 1164 #if !defined(__lint) 1165 _NOTE(MUTEX_PROTECTS_DATA(scsi_device::sd_mutex, scsi_tape)) 1166 _NOTE(SCHEME_PROTECTS_DATA("stable data", scsi_tape::un_dp)) 1167 _NOTE(SCHEME_PROTECTS_DATA("stable data", scsi_tape::un_sd)) 1168 _NOTE(SCHEME_PROTECTS_DATA("not shared", scsi_tape::un_rqs)) 1169 _NOTE(SCHEME_PROTECTS_DATA("protected by cv", scsi_tape::un_sbufp)) 1170 _NOTE(DATA_READABLE_WITHOUT_LOCK(scsi_tape::un_bsize)) 1171 _NOTE(SCHEME_PROTECTS_DATA("not shared", scsi_arq_status)) 1172 _NOTE(SCHEME_PROTECTS_DATA("save sharing", 1173 scsi_tape::un_allow_large_xfer 1174 scsi_tape::un_maxbsize 1175 scsi_tape::un_maxdma 1176 )) 1177 #ifdef __x86 1178 _NOTE(DATA_READABLE_WITHOUT_LOCK(scsi_tape::un_contig_mem_hdl)) 1179 _NOTE(SCHEME_PROTECTS_DATA("not shared", contig_mem)) 1180 #endif 1181 #endif 1182 1183 1184 /* 1185 * Power management state 1186 */ 1187 #define ST_PWR_NORMAL 0 1188 #define ST_PWR_SUSPENDED 1 1189 1190 1191 #define IN_EOF(pos) (pos.eof == ST_EOF_PENDING || pos.eof == ST_EOF) 1192 1193 /* un_rqs_state codes */ 1194 1195 #define ST_RQS_OVR 0x1 /* RQS data was overwritten */ 1196 #define ST_RQS_VALID 0x2 /* RQS data is valid */ 1197 #define ST_RQS_READ 0x4 /* RQS data was read */ 1198 #define ST_RQS_ERROR 0x8 /* RQS resulted in an EIO */ 1199 1200 /* 1201 * st_intr codes 1202 */ 1203 typedef enum { 1204 COMMAND_DONE, 1205 COMMAND_DONE_ERROR, 1206 COMMAND_DONE_ERROR_RECOVERED, 1207 QUE_COMMAND, 1208 QUE_BUSY_COMMAND, 1209 QUE_SENSE, 1210 JUST_RETURN, 1211 COMMAND_DONE_EACCES, 1212 QUE_LAST_COMMAND, 1213 COMMAND_TIMEOUT, 1214 PATH_FAILED, 1215 DEVICE_RESET, 1216 DEVICE_TAMPER, 1217 ATTEMPT_RETRY 1218 }errstate; 1219 #ifdef _KERNEL 1220 typedef struct { 1221 struct scsi_arq_status ei_failing_status; 1222 tapepos_t ei_expected_pos; 1223 errstate ei_error_type; 1224 buf_t *ei_failing_bp; 1225 struct scsi_pkt ei_failed_pkt; /* must be last */ 1226 /* ...scsi_pkt_size() */ 1227 } st_err_info; 1228 #define ST_ERR_INFO_SIZE (sizeof (st_err_info) - \ 1229 sizeof (struct scsi_pkt) + scsi_pkt_size()) 1230 #endif 1231 1232 1233 /* 1234 * Reservation Status 1235 * 1236 * ST_INIT_RESERVE -Used to check if the reservation has been lost 1237 * in between opens and also to indicate the reservation 1238 * has not been done till now. 1239 * ST_RELEASE -Tape Unit is Released. 1240 * ST_RESERVE -Tape Unit is Reserved. 1241 * ST_PRESERVE_RESERVE -Reservation is to be preserved across opens. 1242 * 1243 */ 1244 #define ST_INIT_RESERVE 0x001 1245 #define ST_RELEASE 0x002 1246 #define ST_RESERVE 0x004 1247 #define ST_PRESERVE_RESERVE 0x008 1248 #define ST_RESERVATION_CONFLICT 0x010 1249 #define ST_LOST_RESERVE 0x020 1250 #define ST_APPLICATION_RESERVATIONS 0x040 1251 #define ST_INITIATED_RESET 0x080 1252 #define ST_LOST_RESERVE_BETWEEN_OPENS \ 1253 (ST_RESERVE | ST_LOST_RESERVE | ST_PRESERVE_RESERVE) 1254 1255 /* 1256 * Service action defines for Persistant Reservation Commands 1257 */ 1258 #define ST_SA_SCSI3_REGISTER 0x00 1259 #define ST_SA_SCSI3_RESERVE 0x01 1260 #define ST_SA_SCSI3_RELEASE 0x02 1261 #define ST_SA_SCSI3_CLEAR 0x03 1262 #define ST_SA_SCSI3_PREEMPT 0x04 1263 #define ST_SA_SCSI3_PREEMPTANDABORT 0x05 1264 #define ST_SA_SCSI3_REGISTERANDIGNOREKEY 0x06 1265 #define ST_SA_MASK 0x1f 1266 1267 #define ST_RESERVATION_DELAY 500000 1268 1269 /* 1270 * Asynch I/O tunables 1271 */ 1272 #define ST_MAX_THROTTLE 4 1273 1274 /* 1275 * 60 minutes seems a reasonable amount of time 1276 * to wait for tape space operations to complete. 1277 * 1278 */ 1279 #define ST_SPACE_TIME MINUTES(60) /* 60 minutes per space operation */ 1280 #define ST_LONG_SPACE_TIME_X 5 /* multipiler for long space ops */ 1281 1282 /* 1283 * 2 minutes seems a reasonable amount of time 1284 * to wait for tape i/o operations to complete. 1285 * 1286 */ 1287 #define ST_IO_TIME MINUTES(2) /* minutes per i/o */ 1288 #define ST_LONG_TIMEOUT_X 5 /* multiplier for very long timeouts */ 1289 1290 1291 /* 1292 * 10 seconds is what we'll wait if we get a Busy Status back 1293 */ 1294 #define ST_STATUS_BUSY_TIMEOUT 10*hz /* seconds Busy Waiting */ 1295 #define ST_TRAN_BUSY_TIMEOUT 4*hz /* seconds retry on TRAN_BSY */ 1296 #define ST_INTERRUPT_CONTEXT 1 1297 #define ST_START_CONTEXT 2 1298 1299 /* 1300 * Number of times we'll retry a normal operation. 1301 * 1302 * XXX This includes retries due to transport failure as well as 1303 * XXX busy timeouts- Need to distinguish between Target and Transport 1304 * XXX failure. 1305 */ 1306 1307 #define ST_RETRY_COUNT 20 1308 1309 /* 1310 * Number of times to retry a failed selection 1311 */ 1312 #define ST_SEL_RETRY_COUNT 2 1313 1314 /* 1315 * es_code value for deferred error 1316 * should be moved to sense.h 1317 */ 1318 1319 #define ST_DEFERRED_ERROR 0x01 1320 1321 /* 1322 * Maximum number of units (determined by minor device byte) 1323 */ 1324 #define ST_MAXUNIT 128 1325 1326 /* 1327 * Time to wait for completion of a command before cancelling it. 1328 * For SUSPEND use only 1329 */ 1330 #define ST_WAIT_CMDS_COMPLETE 10 /* seconds */ 1331 1332 #ifndef SECSIZE 1333 #define SECSIZE 512 1334 #endif 1335 #ifndef SECDIV 1336 #define SECDIV 9 1337 #endif 1338 1339 /* 1340 * convenient defines 1341 */ 1342 #define ST_SCSI_DEVP (un->un_sd) 1343 #define ST_DEVINFO (ST_SCSI_DEVP->sd_dev) 1344 #define ST_INQUIRY (ST_SCSI_DEVP->sd_inq) 1345 #define ST_RQSENSE (ST_SCSI_DEVP->sd_sense) 1346 #define ST_MUTEX (&ST_SCSI_DEVP->sd_mutex) 1347 #define ROUTE (&ST_SCSI_DEVP->sd_address) 1348 1349 #define BSD_BEHAVIOR (getminor(un->un_dev) & MT_BSD) 1350 #define SVR4_BEHAVIOR ((getminor(un->un_dev) & MT_BSD) == 0) 1351 #define ST_STATUS_MASK (STATUS_MASK | STATUS_TASK_ABORT) 1352 #define SCBP(pkt) ((struct scsi_status *)(pkt)->pkt_scbp) 1353 #define SCBP_C(pkt) ((*(pkt)->pkt_scbp) & ST_STATUS_MASK) 1354 #define CDBP(pkt) ((union scsi_cdb *)(pkt)->pkt_cdbp) 1355 #define BP_PKT(bp) ((struct scsi_pkt *)(bp)->av_back) 1356 #define SET_BP_PKT(bp, pkt) ((bp)->av_back = (struct buf *)(pkt)) 1357 #define BP_UCMD(bp) ((struct uscsi_cmd *)(bp)->b_back) 1358 #define USCSI_CMD(bp) (((bp) == un->un_sbufp) && (BP_UCMD(bp))) 1359 1360 #define IS_CLOSING(un) ((un)->un_state == ST_STATE_CLOSING || \ 1361 ((un)->un_state == ST_STATE_SENSING && \ 1362 (un)->un_laststate == ST_STATE_CLOSING)) 1363 1364 #define ASYNC_CMD 0 1365 #define SYNC_CMD 1 1366 1367 #define st_bioerror(bp, error) \ 1368 { bioerror(bp, error); \ 1369 un->un_errno = error; } 1370 1371 /* 1372 * Macros for internal coding of count for SPACE command: 1373 * 1374 * Top 3 bits of b_bcount define direction and type of space. 1375 * Since b_bcount (size_t) is 32 bits on 32 platforms and 64 bits on 1376 * 64 bit platforms different defines are used. 1377 * if SP_BACKSP is set direction is backward (toward BOP) 1378 * The type of space (Blocks, Filemark or sequential filemarks) is 1379 * carried in the next 2 bits. The remaining bits a signed count of 1380 * how many of that direction and type to do. 1381 */ 1382 1383 #if (defined(__lock_lint)) 1384 /* 1385 * This is a workaround for warlock not being able to parse an #ULL constant. 1386 */ 1387 #undef UINT64_MAX 1388 #define UINT64_MAX (18446744073709551615UL) 1389 #endif /* __lock_lint */ 1390 1391 #if (defined(__lock_lint) || (SIZE_MAX < UINT64_MAX)) 1392 1393 #define SP_BLK UINT32_C(0x00000000) 1394 #define SP_FLM UINT32_C(0x20000000) 1395 #define SP_SQFLM UINT32_C(0x40000000) 1396 #define SP_EOD UINT32_C(0x60000000) 1397 #define SP_BACKSP UINT32_C(0x80000000) 1398 #define SP_CMD_MASK UINT32_C(0x60000000) 1399 #define SP_CNT_MASK UINT32_C(0x1fffffff) 1400 1401 /* Macros to interpret space cmds */ 1402 #define SPACE_CNT(x) (((x) & SP_BACKSP)? \ 1403 (-((x)&(SP_CNT_MASK))):(x)&(SP_CNT_MASK)) 1404 #define SPACE_TYPE(x) ((x & SP_CMD_MASK)>>29) 1405 1406 #else /* end of small size_t in buf_t */ 1407 1408 #define SP_BLK UINT64_C(0x0000000000000000) 1409 #define SP_FLM UINT64_C(0x2000000000000000) 1410 #define SP_SQFLM UINT64_C(0x4000000000000000) 1411 #define SP_EOD UINT64_C(0x6000000000000000) 1412 #define SP_BACKSP UINT64_C(0x8000000000000000) 1413 #define SP_CMD_MASK UINT64_C(0x6000000000000000) 1414 #define SP_CNT_MASK UINT64_C(0x1fffffffffffffff) 1415 1416 /* Macros to interpret space cmds */ 1417 #define SPACE_CNT(x) (((x) & SP_BACKSP)? \ 1418 (-((x)&(SP_CNT_MASK))):(x)&(SP_CNT_MASK)) 1419 #define SPACE_TYPE(x) ((x & SP_CMD_MASK)>>61) 1420 1421 #endif /* end of big size_t in buf_t */ 1422 1423 /* Macros to assemble space cmds */ 1424 #define SPACE(cmd, cnt) ((cnt < 0) ? (SP_BACKSP | (-(cnt)) | cmd) : (cmd | cnt)) 1425 #define Fmk(x) SPACE(SP_FLM, x) 1426 #define Blk(x) SPACE(SP_BLK, x) 1427 1428 1429 1430 /* Defines for byte 4 of load/unload cmd */ 1431 #define LD_UNLOAD 0 1432 #define LD_LOAD 1 1433 #define LD_RETEN 2 1434 #define LD_EOT 4 1435 #define LD_HOLD 8 1436 1437 /* Defines for byte 4 of prevent/allow media removal */ 1438 #define MR_UNLOCK 0 1439 #define MR_LOCK 1 1440 1441 #define GET_SOFT_STATE(dev) \ 1442 register struct scsi_tape *un; \ 1443 register int instance; \ 1444 \ 1445 instance = MTUNIT(dev); \ 1446 if ((un = ddi_get_soft_state(st_state, instance)) == NULL) \ 1447 return (ENXIO); 1448 1449 /* 1450 * Debugging turned on via conditional compilation switch -DSTDEBUG 1451 */ 1452 #ifdef DEBUG 1453 #define STDEBUG 1454 #endif 1455 1456 #ifdef STDEBUG 1457 #define DEBUGGING\ 1458 ((scsi_options & SCSI_DEBUG_TGT) || (st_debug & 0x7)) 1459 1460 #define DEBLOCK(d) \ 1461 int lev = CE_NOTE; \ 1462 mutex_enter(&st_debug_mutex); \ 1463 if (d == st_lastdev || d == 0) { \ 1464 lev = CE_CONT; \ 1465 } \ 1466 mutex_exit(&st_debug_mutex); 1467 1468 #define DEBUNLOCK(d) \ 1469 mutex_enter(&st_debug_mutex); \ 1470 if (d != 0 && d != st_lastdev) { \ 1471 st_lastdev = d; \ 1472 } \ 1473 mutex_exit(&st_debug_mutex); 1474 1475 /* initialization */ 1476 #define ST_DEBUG1 if ((st_debug & 0x7) >= 1) scsi_log 1477 #define ST_DEBUG ST_DEBUG1 1478 1479 /* errors and UA's */ 1480 #define ST_DEBUG2 if ((st_debug & 0x7) >= 2) scsi_log 1481 1482 /* func calls */ 1483 #define ST_DEBUG3 if ((st_debug & 0x7) >= 3) scsi_log 1484 1485 /* ioctl calls */ 1486 #define ST_DEBUG4 if ((st_debug & 0x7) >= 4) scsi_log 1487 1488 #define ST_DEBUG5 if ((st_debug & 0x7) >= 5) scsi_log 1489 1490 /* full data tracking */ 1491 #define ST_DEBUG6 if ((st_debug & 0x7) >= 6) scsi_log 1492 1493 /* debug error recovery */ 1494 #define ST_RECOV if (st_debug & 0x8) scsi_log 1495 1496 /* Entry Point Functions */ 1497 #define ST_ENTR(d, fn) if (st_debug & 0x10) { DEBLOCK(d) \ 1498 scsi_log(d, st_label, lev, #fn); DEBUNLOCK(d) } 1499 1500 /* Non-Entry Point Functions */ 1501 #define ST_FUNC(d, fn) if (st_debug & 0x20) { DEBLOCK(d) \ 1502 scsi_log(d, st_label, lev, #fn); DEBUNLOCK(d) } 1503 1504 /* Space Information */ 1505 #define ST_SPAC if (st_debug & 0x40) scsi_log 1506 1507 /* CDB's sent */ 1508 #define ST_CDB(d, cmnt, cdb) if (st_debug & 0x180) { DEBLOCK(d) \ 1509 st_print_cdb(d, st_label, lev, cmnt, cdb); DEBUNLOCK(d) } 1510 1511 /* sense data */ 1512 #define ST_SENSE(d, cmnt, sense, size) if (st_debug & 0x200) { DEBLOCK(d) \ 1513 st_clean_print(d, st_label, lev, cmnt, sense, size); DEBUNLOCK(d) } 1514 1515 /* position data */ 1516 #define ST_POS(d, cmnt, pdata) if (st_debug & 0x400) { DEBLOCK(d) \ 1517 st_print_position(d, st_label, lev, cmnt, pdata); DEBUNLOCK(d) } 1518 1519 1520 #else 1521 1522 #define st_debug (0) 1523 #define DEBUGGING (0) 1524 #define ST_DEBUG if (0) scsi_log 1525 #define ST_DEBUG1 if (0) scsi_log 1526 #define ST_DEBUG2 if (0) scsi_log 1527 #define ST_DEBUG3 if (0) scsi_log 1528 #define ST_DEBUG4 if (0) scsi_log 1529 #define ST_DEBUG5 if (0) scsi_log 1530 #define ST_DEBUG6 if (0) scsi_log 1531 #define ST_RECOV if (0) scsi_log 1532 1533 #define ST_ENTR(d, fn) 1534 #define ST_FUNC(d, fn) 1535 #define ST_SPAC if (0) scsi_log 1536 #define ST_CDB(d, cmnt, cdb) 1537 #define ST_SENSE(d, cmnt, sense, size) 1538 #define ST_SENSE(d, cmnt, sense, size) 1539 #define ST_POS(d, cmnt, pdata) 1540 1541 #endif 1542 1543 /* 1544 * Media access values 1545 */ 1546 #define MEDIA_ACCESS_DELAY 5000000 /* usecs wait for media state change */ 1547 1548 /* 1549 * SCSI tape mode sense page information 1550 */ 1551 #define ST_DEV_CONFIG_PAGE 0x10 /* device config mode page */ 1552 #define ST_DEV_CONFIG_NO_COMP 0x00 /* use no compression */ 1553 #define ST_DEV_CONFIG_DEF_COMP 0x01 /* use default compression alg */ 1554 #define ST_COMPRESSION_DENSITY 3 /* compression minor number */ 1555 1556 /* 1557 * SCSI tape data compression Page definition. 1558 */ 1559 #define ST_DEV_DATACOMP_PAGE 0x0F /* data compression page */ 1560 1561 1562 1563 /* 1564 * maxbsize values 1565 */ 1566 #define MAXBSIZE_UNKNOWN -2 /* not found yet */ 1567 1568 #define ONE_MEG (1024 * 1024) 1569 1570 /* 1571 * generic soft error reporting 1572 * 1573 * What we are doing here is allowing a greater number of errors to occur on 1574 * smaller transfers (i.e. usually at the beginning of the tape), than on 1575 * the rest of the tape. 1576 * 1577 * A small transfer is defined as : 1578 * Transfers <= SOFT_ERROR_WARNING_THRESHOLD allow about 1.5 times more errors 1579 * 1580 * A larget tranfer is defined as : 1581 * Transfers > SOFT_ERROR_WARNING_THRESHOLD allow normal amount 1582 * 1583 */ 1584 #define READ_SOFT_ERROR_WARNING_THRESHOLD (25 * ONE_MEG) 1585 #define WRITE_SOFT_ERROR_WARNING_THRESHOLD (20 * ONE_MEG) 1586 1587 /* 1588 * soft error reporting for exabyte 1589 */ 1590 #define TAPE_SENSE_LENGTH 32 /* allows for softerror info */ 1591 1592 #define SENSE_19_BITS \ 1593 "\20\10PF\07BPE\06FPE\05ME\04ECO\03TME\02TNP\01LBOT" 1594 #define SENSE_20_BITS \ 1595 "\20\10RSVD\07RSVD\06WP\05FMKE\04URE\03WE1\02SSE\01FW" 1596 #define SENSE_21_BITS \ 1597 "\20\10RSVD\07RSVD\06RRR\05CLND\04CLN\03PEOT\02WSEB\01WSE0" 1598 1599 /* these are defined in percentages */ 1600 #define EXABYTE_WRITE_ERROR_THRESHOLD 6 1601 #define EXABYTE_READ_ERROR_THRESHOLD 3 1602 /* 1603 * minumum amount of data transfer(MB) for checking soft error rate. 1604 */ 1605 #define EXABYTE_MIN_TRANSFER (25 * ONE_MEG) 1606 1607 #define CLN 0x8 1608 #define CLND 0x10 1609 1610 /* 1611 * soft error reporting for Archive 4mm DAT 1612 */ 1613 1614 #define LOG_SENSE_LENGTH 0xff 1615 #define MIN_LOG_SENSE_LENGTH 0x2b 1616 #define DAT_SMALL_WRITE_ERROR_THRESHOLD 40 /* retries per 20 mg */ 1617 #define DAT_LARGE_WRITE_ERROR_THRESHOLD 200 /* retries for more 20 mg */ 1618 #define DAT_SMALL_READ_ERROR_THRESHOLD 5 /* errors allowed */ 1619 #define DAT_LARGE_READ_ERROR_THRESHOLD 3 /* errors allowed */ 1620 1621 /* 1622 * ST timeouts that need to be cancelled for suspend 1623 */ 1624 #define ST_HIB_TID 0x01 1625 #define ST_DELAY_TID 0x02 1626 1627 #ifdef __cplusplus 1628 } 1629 #endif 1630 1631 #endif /* _SYS_SCSI_TARGETS_STDEF_H */ 1632