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 /* 23 * Copyright 2005 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27 #ifndef _SYS_SCSI_TARGETS_STDEF_H 28 #define _SYS_SCSI_TARGETS_STDEF_H 29 30 #pragma ident "%Z%%M% %I% %E% SMI" 31 32 #include <sys/note.h> 33 #include <sys/condvar.h> 34 #include <sys/kstat.h> 35 #include <sys/scsi/scsi_types.h> 36 #include <sys/mtio.h> 37 38 #ifdef __cplusplus 39 extern "C" { 40 #endif 41 42 /* 43 * Defines for SCSI tape drives. 44 */ 45 46 /* 47 * Maximum variable length record size for a single request 48 */ 49 #define ST_MAXRECSIZE_VARIABLE 65535 50 51 /* 52 * If the requested record size exceeds ST_MAXRECSIZE_VARIABLE, 53 * then the following define is used. 54 */ 55 #define ST_MAXRECSIZE_VARIABLE_LIMIT 65534 56 57 #define ST_MAXRECSIZE_FIXED (63<<10) /* maximum fixed record size */ 58 #define INF 1000000000 59 60 /* 61 * Supported tape device types plus default type for opening. 62 * Types 10 - 13, are special (ancient too) drives - *NOT SUPPORTED* 63 * Types 14 - 1f, are 1/4-inch cartridge drives. 64 * Types 20 - 28, are 1/2-inch cartridge or reel drives. 65 * Types 28+, are rdat (vcr) drives. 66 */ 67 #define ST_TYPE_INVALID 0x00 68 69 #define ST_TYPE_SYSGEN1 MT_ISSYSGEN11 /* Sysgen with QIC-11 only */ 70 #define ST_TYPE_SYSGEN MT_ISSYSGEN /* Sysgen with QIC-24 and QIC-11 */ 71 72 #define ST_TYPE_DEFAULT MT_ISDEFAULT /* Generic 1/4" or undetermined */ 73 #define ST_TYPE_EMULEX MT_ISMT02 /* Emulex MT-02 */ 74 #define ST_TYPE_ARCHIVE MT_ISVIPER1 /* Archive QIC-150 */ 75 #define ST_TYPE_WANGTEK MT_ISWANGTEK1 /* Wangtek QIC-150 */ 76 77 #define ST_TYPE_CDC MT_ISCDC /* CDC - (not tested) */ 78 #define ST_TYPE_FUJI MT_ISFUJI /* Fujitsu - (not tested) */ 79 #define ST_TYPE_KENNEDY MT_ISKENNEDY /* Kennedy */ 80 #define ST_TYPE_ANRITSU MT_ISANRITSU /* Anritsu */ 81 #define ST_TYPE_HP MT_ISHP /* HP */ 82 #define ST_TYPE_HIC MT_ISCCS23 /* Generic 1/2" Cartridge */ 83 #define ST_TYPE_REEL MT_ISCCS24 /* Generic 1/2" Reel Tape */ 84 #define ST_TYPE_DAT MT_ISCCS28 /* Generic DAT Tape */ 85 86 #define ST_TYPE_EXABYTE MT_ISEXABYTE /* Exabyte 8200 */ 87 #define ST_TYPE_EXB8500 MT_ISEXB8500 /* Exabyte 8500 */ 88 #define ST_TYPE_WANGTHS MT_ISWANGTHS /* Wangtek 6130HS */ 89 #define ST_TYPE_WANGDAT MT_ISWANGDAT /* WangDAT */ 90 #define ST_TYPE_PYTHON MT_ISPYTHON /* Archive Python DAT */ 91 #define ST_TYPE_STC3490 MT_ISSTC /* IBM STC 3490 */ 92 #define ST_TYPE_TAND25G MT_ISTAND25G /* TANDBERG 2.5G */ 93 #define ST_TYPE_DLT MT_ISDLT /* DLT */ 94 #define ST_TYPE_STK9840 MT_ISSTK9840 /* StorageTek 9840, 9940, 9840B */ 95 #define ST_TYPE_BMDLT1 MT_ISBMDLT1 /* Benchmark DTL1 */ 96 #define ST_TYPE_LTO MT_LTO /* sun: LTO's by HP, Seagate, IBM.. */ 97 #define ST_LAST_TYPE ST_TYPE_LTO /* Add new above type and change this */ 98 99 100 /* Internal flags */ 101 #define ST_DYNAMIC 0x2000 /* Device name has been dynamically */ 102 /* alloc'ed from the st.conf entry, */ 103 /* instead of being used from the */ 104 /* st_drivetypes array. */ 105 106 /* 107 * Defines for supported drive options 108 * 109 * WARNING : THESE OPTIONS SHOULD NEVER BE CHANGED, AS OLDER CONFIGURATIONS 110 * WILL DEPEND ON THE FLAG VALUES REMAINING THE SAME 111 */ 112 #define ST_VARIABLE 0x001 /* Device supports variable */ 113 /* length record sizes */ 114 #define ST_QIC 0x002 /* QIC tape device */ 115 #define ST_REEL 0x004 /* 1/2-inch reel tape device */ 116 #define ST_BSF 0x008 /* Device supports backspace */ 117 /* file as in mt(1) bsf : */ 118 /* backspace over EOF marks. */ 119 /* Devices not supporting bsf */ 120 /* will fail with ENOTTY upon */ 121 /* use of bsf */ 122 #define ST_BSR 0x010 /* Device supports backspace */ 123 /* record as in mt(1) bsr : */ 124 /* backspace over records. If */ 125 /* the device does not support */ 126 /* bsr, the st driver emulates */ 127 /* the action by rewinding the */ 128 /* tape and using forward space */ 129 /* file (fsf) to the correct */ 130 /* file and then uses forward */ 131 /* space record (fsr) to the */ 132 /* correct record */ 133 #define ST_LONG_ERASE 0x020 /* Device needs a longer time */ 134 /* than normal to erase */ 135 #define ST_AUTODEN_OVERRIDE 0x040 /* Auto-Density override flag */ 136 /* Device can figure out the */ 137 /* tape density automatically, */ 138 /* without issuing a */ 139 /* mode-select/mode-sense */ 140 #define ST_NOBUF 0x080 /* Don't use buffered mode. */ 141 /* This disables the device's */ 142 /* ability for buffered writes */ 143 /* I.e. The device acknowledges */ 144 /* write completion after the */ 145 /* data is written to the */ 146 /* device's buffer, but before */ 147 /* all the data is actually */ 148 /* written to tape */ 149 #define ST_RESERVED_BIT1 0x100 /* resreved bit */ 150 /* parity while talking to it. */ 151 #define ST_KNOWS_EOD 0x200 /* Device knows when EOD (End */ 152 /* of Data) has been reached. */ 153 /* If the device knows EOD, st */ 154 /* uses fast file skipping. */ 155 /* If it does not know EOD, */ 156 /* file skipping happens one */ 157 /* file at a time. */ 158 #define ST_UNLOADABLE 0x400 /* Device will not complain if */ 159 /* the st driver is unloaded & */ 160 /* loaded again; e.g. will */ 161 /* return the correct inquiry */ 162 /* string */ 163 #define ST_SOFT_ERROR_REPORTING 0x800 /* Do request or log sense on */ 164 /* close to report soft errors. */ 165 /* Currently only Exabyte and */ 166 /* DAT drives support this */ 167 /* feature. */ 168 #define ST_LONG_TIMEOUTS 0x1000 /* Device needs 5 times longer */ 169 /* timeouts for normal */ 170 /* operation */ 171 #define ST_BUFFERED_WRITES 0x4000 /* The data is buffered in the */ 172 /* driver and pre-acked to the */ 173 /* application */ 174 #define ST_NO_RECSIZE_LIMIT 0x8000 /* For variable record size */ 175 /* devices only. If flag is */ 176 /* set, then don't limit */ 177 /* record size to 64k as in */ 178 /* pre-Solaris 2.4 releases. */ 179 /* The only limit on the */ 180 /* record size will be the max */ 181 /* record size the device can */ 182 /* handle or the max DMA */ 183 /* transfer size of the */ 184 /* machine, which ever is */ 185 /* smaller. Beware of */ 186 /* incompatabilities with */ 187 /* tapes of pre-Solaris 2.4 */ 188 /* OS's written with large */ 189 /* (>64k) block sizes, as */ 190 /* their true block size is */ 191 /* a max of approx 64k */ 192 #define ST_MODE_SEL_COMP 0x10000 /* use mode select of device */ 193 /* configuration page (0x10) to */ 194 /* enable/disable compression */ 195 /* instead of density codes for */ 196 /* the "c" and "u" devices */ 197 #define ST_NO_RESERVE_RELEASE 0x20000 /* For devices which do not */ 198 /* support RESERVE/RELEASE SCSI */ 199 /* command. If this is enabled */ 200 /* then reserve/release would */ 201 /* not be used during open/ */ 202 /* close for High Availability */ 203 #define ST_READ_IGNORE_ILI 0x40000 /* This flag is only applicable */ 204 /* to variable block devices */ 205 /* which support the SILI bit */ 206 /* option. It indicates that */ 207 /* the SILI bit will be ignored */ 208 /* during reads */ 209 #define ST_READ_IGNORE_EOFS 0x80000 /* When this flag is set two */ 210 /* EOF marks do not indicate an */ 211 /* EOM. This option is only */ 212 /* supported on 1/2" reel tapes */ 213 #define ST_SHORT_FILEMARKS 0x100000 /* This option applies only to */ 214 /* EXABYTE 8mm tape drives */ 215 /* which support short */ 216 /* filemarks. When this flag */ 217 /* is set, short filemarks */ 218 /* will be used for writing */ 219 /* filemarks. */ 220 #define ST_EJECT_ON_CHANGER_FAILURE 0x200000 /* When this flag is set */ 221 /* and the tape is trapped in */ 222 /* the medium changer, the tape */ 223 /* is automatically ejected */ 224 #define ST_RETRY_ON_RECOVERED_DEFERRED_ERROR 0x400000 225 /* This option applies only to */ 226 /* IBM MAGSTAR 3590. If this */ 227 /* flag is set, the st driver */ 228 /* will retry the last cmd if */ 229 /* the last error cause a check */ 230 /* condition with error code */ 231 /* 0x71 and sense code 0x01 */ 232 #define ST_KNOWS_MEDIA 0x800000 /* Use configured media type */ 233 /* detected to select correct */ 234 /* density code. */ 235 #define ST_CLN_TYPE_1 0x10000000 /* When this flag is set, */ 236 /* the tape drive provides the */ 237 /* clean bit information in */ 238 /* byte 21, bitmask 0x08 of */ 239 /* Request Sense data */ 240 #define ST_CLN_TYPE_2 0x20000000 /* When this flag is set, */ 241 /* the tape drive provides the */ 242 /* clean bit information in */ 243 /* byte 70, bitmask 0xc0 of */ 244 /* Request Sense data */ 245 #define ST_CLN_TYPE_3 0x40000000 /* When this flag is set, */ 246 /* the tape drive provides the */ 247 /* clean bit information in */ 248 /* byte 18, bitmask 0x01 of */ 249 /* Request Sense data */ 250 251 #define ST_CLN_MASK (ST_CLN_TYPE_1 | ST_CLN_TYPE_2 | ST_CLN_TYPE_3) 252 #define ST_VALID_OPTS (ST_VARIABLE | ST_QIC | ST_REEL | ST_BSF | ST_BSR |\ 253 ST_LONG_ERASE | ST_AUTODEN_OVERRIDE | ST_NOBUF | ST_KNOWS_EOD |\ 254 ST_UNLOADABLE | ST_SOFT_ERROR_REPORTING | ST_LONG_TIMEOUTS |\ 255 ST_NO_RECSIZE_LIMIT | ST_MODE_SEL_COMP | ST_NO_RESERVE_RELEASE |\ 256 ST_READ_IGNORE_ILI | ST_READ_IGNORE_EOFS | ST_SHORT_FILEMARKS |\ 257 ST_EJECT_ON_CHANGER_FAILURE | ST_RETRY_ON_RECOVERED_DEFERRED_ERROR |\ 258 ST_CLN_TYPE_1 | ST_CLN_TYPE_2 | ST_CLN_TYPE_3) 259 260 #define NDENSITIES MT_NDENSITIES 261 #define NSPEEDS MT_NSPEEDS 262 263 /* 264 * defines for Log Sense Pages 265 */ 266 #define SUPPORTED_LOG_PAGES_PAGE 0x00 267 #define TAPE_SEQUENTIAL_PAGE 0x0c 268 #define TAPE_ALERT_PAGE 0x2e 269 270 /* 271 * Log Page Control definitions 272 */ 273 #define CURRENT_THRESHOLD_VALUES 0x00 274 #define CURRENT_CUMULATIVE_VALUES 0x40 275 #define DEFAULT_THRESHOLD_VALUES 0x80 276 #define DEFAULT_CUMULATIVE_VALUES 0xC0 277 278 /* 279 * Tape Alert Flag definitions 280 */ 281 #define CLEANING_MEDIA 11 282 #define CLEAN_NOW 20 283 #define CLEAN_PERIODIC 21 284 #define CLEAN_FOR_ERRORS 24 285 286 #define TAPE_ALERT_SUPPORT_UNKNOWN 0x00 287 #define TAPE_ALERT_NOT_SUPPORTED 0x01 288 #define TAPE_ALERT_SUPPORTED 0x02 289 #define TAPE_ALERT_STILL_DIRTY 0x04 290 #define TAPE_SEQUENTIAL_SUPPORTED 0x08 291 #define TAPE_PREVIOUSLY_DIRTY 0x10 292 293 #define TAPE_ALERT_MAX_PARA 64 294 #define TAPE_SEQUENTIAL_PAGE_PARA 64 /* way more then really used */ 295 #define SEQUENTIAL_NEED_CLN 0x0100 296 297 /* 298 * Parameters 299 */ 300 #define ST_NAMESIZE 44 /* size of pretty string for vid/pid */ 301 #define VIDLEN 8 /* size of vendor identifier length */ 302 #define PIDLEN 16 /* size of product identifier length */ 303 #define VIDPIDLEN (VIDLEN + PIDLEN) 304 305 306 struct st_drivetype { 307 char name[ST_NAMESIZE]; /* Name, for debug */ 308 char length; /* Length of vendor id */ 309 char vid[VIDPIDLEN]; /* Vendor id and model (product) id */ 310 char type; /* Drive type for driver */ 311 int bsize; /* Block size */ 312 int options; /* Drive options */ 313 int max_rretries; /* Max read retries */ 314 int max_wretries; /* Max write retries */ 315 uchar_t densities[NDENSITIES]; /* density codes, low->hi */ 316 uchar_t default_density; /* default density for this drive */ 317 uchar_t mediatype[NDENSITIES]; /* was speed. mediatype for density. */ 318 ushort_t non_motion_timeout; /* Inquiry type commands */ 319 ushort_t io_timeout; /* I/O timeout in seconds */ 320 ushort_t rewind_timeout; /* rewind timeout in seconds */ 321 ushort_t space_timeout; /* space cmd timeout in seconds */ 322 ushort_t load_timeout; /* load tape time in seconds */ 323 ushort_t unload_timeout; /* unload tape time in seconds */ 324 ushort_t erase_timeout; /* erase timeout. seconds */ 325 }; 326 327 #define MINUTES(val) ((val) * 60) 328 329 struct comp_mode_page { 330 #if defined(_BIT_FIELDS_LTOH) 331 uchar_t : 6, 332 dcc: 1, /* Data Compression Capable */ 333 dce: 1; /* Data Compression Enable */ 334 uchar_t : 5, 335 red: 2, /* Report Exceptions on Decompress */ 336 dde: 1; /* Data Decompression Enabled */ 337 uchar_t comp_alg_msb; /* Compression Algorithm */ 338 uchar_t comp_alg_high; 339 uchar_t comp_alg_low; 340 uchar_t comp_alg_lsb; 341 uchar_t decomp_alg_msb; /* Decompression Algorithm */ 342 uchar_t decomp_alg_high; 343 uchar_t decomp_alg_low; 344 uchar_t decomp_alg_lsb; 345 uchar_t reservered0; 346 uchar_t reservered1; 347 uchar_t reservered2; 348 uchar_t reservered3; 349 350 #elif defined(_BIT_FIELDS_HTOL) 351 uchar_t dce: 1, /* Data Compression Enable */ 352 dcc: 1, /* Data Compression Capable */ 353 : 6; 354 uchar_t dde: 1, /* Data Decompression Enabled */ 355 red: 2, /* Report Exceptions on Decompress */ 356 : 5; 357 uchar_t comp_alg_msb; /* Compression Algorithm */ 358 uchar_t comp_alg_high; 359 uchar_t comp_alg_low; 360 uchar_t comp_alg_lsb; 361 uchar_t decomp_alg_msb; /* Decompression Algorithm */ 362 uchar_t decomp_alg_high; 363 uchar_t decomp_alg_low; 364 uchar_t decomp_alg_lsb; 365 uchar_t reservered0; 366 uchar_t reservered1; 367 uchar_t reservered2; 368 uchar_t reservered3; 369 #endif 370 }; 371 372 struct dev_mode_page { 373 #if defined(_BIT_FIELDS_LTOH) 374 uchar_t act_format: 5, /* active format */ 375 caf: 1, /* Change Active Format */ 376 cap: 1, /* Change Active Partition */ 377 : 1; 378 uchar_t act_partition; /* active partition */ 379 uchar_t wrt_buf_full_ratio; /* write buffer full ratio */ 380 uchar_t rd_buf_full_ratio; /* read buffer full ratio */ 381 uchar_t wrt_delay_time_msb; /* write delay time MSB */ 382 uchar_t wrt_delay_time_lsb; /* write delay time LSB */ 383 uchar_t rew: 1, /* Report Early Warning */ 384 rbo: 1, /* Reverse Buffer Order */ 385 socf: 2, /* Stop On Consecutive Filemarks */ 386 avc: 1, /* Automatic Velocity Control */ 387 rsmk: 1, /* Report SetMarKs */ 388 bis: 1, /* Block Ids Supported */ 389 dbr: 1; /* Data Buffer Recovery */ 390 uchar_t gap_size; 391 uchar_t : 3, 392 sew: 1, /* Sync data after Early Warning */ 393 eeg: 1, /* Enable Early Waring */ 394 eod_defined: 3; 395 uchar_t buf_size_leot_msb; /* Buffer size after early warning */ 396 uchar_t buf_size_leot_mid; 397 uchar_t buf_size_leot_lsb; 398 uchar_t comp_alg; /* Compression Algorithm (enable) */ 399 uchar_t reservered; 400 401 #elif defined(_BIT_FIELDS_HTOL) 402 uchar_t : 1, 403 cap: 1, /* Change Active Partition */ 404 caf: 1, /* Change Active Format */ 405 act_format: 5; /* active format */ 406 uchar_t act_partition; /* active partition */ 407 uchar_t wrt_buf_full_ratio; /* write buffer full ratio */ 408 uchar_t rd_buf_full_ratio; /* read buffer full ratio */ 409 uchar_t wrt_delay_time_msb; /* write delay time MSB */ 410 uchar_t wrt_delay_time_lsb; /* write delay time LSB */ 411 uchar_t dbr: 1, /* Data Buffer Recovery */ 412 bis: 1, /* Block Ids Supported */ 413 rsmk: 1, /* Report SetMarKs */ 414 avc: 1, /* Automatic Velocity Control */ 415 socf: 2, /* Stop On Consecutive Filemarks */ 416 rbo: 1, /* Reverse Buffer Order */ 417 rew: 1; /* Report Early Warning */ 418 uchar_t gap_size; 419 uchar_t eod_defined: 3, 420 eeg: 1, /* Enable Early Waring */ 421 sew: 1, /* Sync data after Early Warning */ 422 : 3; 423 uchar_t buf_size_leot_msb; /* Buffer size after early warning */ 424 uchar_t buf_size_leot_mid; 425 uchar_t buf_size_leot_lsb; 426 uchar_t comp_alg; /* Compression Algorithm (enable) */ 427 uchar_t reservered; 428 #endif 429 }; 430 431 typedef union { 432 struct comp_mode_page comp; 433 struct dev_mode_page dev; 434 }modepage; 435 436 /* 437 * 438 * Parameter list for the MODE_SELECT and MODE_SENSE commands. 439 * The parameter list contains a header, followed by zero or more 440 * block descriptors, followed by vendor unique parameters, if any. 441 * 442 */ 443 #define MSIZE 0x0c /* Size without additional pages */ 444 struct seq_mode { 445 #if defined(_BIT_FIELDS_LTOH) 446 uchar_t data_len; /* sense data length, sense only */ 447 uchar_t media_type; /* medium type, sense only */ 448 uchar_t speed :4, /* speed */ 449 bufm :3, /* buffered mode */ 450 wp :1; /* write protected, sense only */ 451 uchar_t bd_len; /* block length in bytes */ 452 uchar_t density; /* density code */ 453 uchar_t high_nb; /* number of logical blocks on the medium */ 454 uchar_t mid_nb; /* that are to be formatted with the density */ 455 uchar_t low_nb; /* code and block length in block descriptor */ 456 uchar_t reserved; /* reserved */ 457 uchar_t high_bl; /* block length */ 458 uchar_t mid_bl; /* " " */ 459 uchar_t low_bl; /* " " */ 460 uchar_t page_code: 6, 461 : 1, 462 ps: 1; /* Page Savable sense only */ 463 uchar_t page_len; 464 modepage page; 465 466 #elif defined(_BIT_FIELDS_HTOL) 467 uchar_t data_len; /* sense data length, sense only */ 468 uchar_t media_type; /* medium type, sense only */ 469 uchar_t wp :1, /* write protected, sense only */ 470 bufm :3, /* buffered mode */ 471 speed :4; /* speed */ 472 uchar_t bd_len; /* block length in bytes */ 473 uchar_t density; /* density code */ 474 uchar_t high_nb; /* number of logical blocks on the medium */ 475 uchar_t mid_nb; /* that are to be formatted with the density */ 476 uchar_t low_nb; /* code and block length in block descriptor */ 477 uchar_t reserved; /* reserved */ 478 uchar_t high_bl; /* block length */ 479 uchar_t mid_bl; /* " " */ 480 uchar_t low_bl; /* " " */ 481 uchar_t ps: 1, /* Page Savable sense only */ 482 : 1, 483 page_code: 6; 484 uchar_t page_len; 485 modepage page; 486 #else 487 #error One of _BIT_FIELDS_LTOH or _BIT_FIELDS_HTOL must be defined 488 #endif /* _BIT_FIELDS_LTOH */ 489 }; 490 491 /* 492 * Data returned from the READ BLOCK LIMITS command. 493 */ 494 495 #define RBLSIZE (sizeof (struct read_blklim)) 496 struct read_blklim { 497 #if defined(_BIT_FIELDS_HTOL) 498 uchar_t reserved: 3; /* reserved */ 499 uchar_t granularity: 5; /* Minimum Modularity */ 500 #elif defined(_BIT_FIELDS_LTOH) 501 uchar_t granularity: 5; /* Minimum Modularity */ 502 uchar_t reserved: 3; /* reserved */ 503 #endif 504 uchar_t max_hi; /* Maximum block length, high byte */ 505 uchar_t max_mid; /* Maximum block length, middle byte */ 506 uchar_t max_lo; /* Maximum block length, low byte */ 507 uchar_t min_hi; /* Minimum block length, high byte */ 508 uchar_t min_lo; /* Minimum block length, low byte */ 509 }; 510 511 /* 512 * Private info for scsi tapes. Pointed to by the un_private pointer 513 * of one of the SCSI_DEVICE chains. 514 */ 515 516 struct scsi_tape { 517 struct scsi_device *un_sd; /* back pointer to SCSI_DEVICE */ 518 struct scsi_pkt *un_rqs; /* ptr to request sense command */ 519 struct scsi_pkt *un_mkr_pkt; /* ptr to marker packet */ 520 kcondvar_t un_sbuf_cv; /* cv on ownership of special buf */ 521 kcondvar_t un_queue_cv; /* cv on all queued commands */ 522 struct buf *un_sbufp; /* for use in special io */ 523 char *un_srqbufp; /* sense buffer for special io */ 524 kcondvar_t un_clscv; /* closing cv */ 525 struct buf *un_quef; /* head of wait queue */ 526 struct buf *un_quel; /* tail of wait queue */ 527 struct buf *un_runqf; /* head of run queue */ 528 struct buf *un_runql; /* tail of run queue */ 529 struct seq_mode *un_mspl; /* ptr to mode select info */ 530 struct st_drivetype *un_dp; /* ptr to drive table entry */ 531 uint_t un_dp_size; /* size of un_dp alloc'ed */ 532 caddr_t un_tmpbuf; /* buf for append, autodens ops */ 533 daddr_t un_blkno; /* block # in file (512 byte blocks) */ 534 int un_oflags; /* open flags */ 535 int un_fileno; /* current file number on tape */ 536 int un_err_fileno; /* file where error occurred */ 537 daddr_t un_err_blkno; /* block in file where err occurred */ 538 uint_t un_err_resid; /* resid from last error */ 539 short un_fmneeded; /* filemarks to be written - HP only */ 540 dev_t un_dev; /* unix device */ 541 uchar_t un_attached; /* unit known && attached */ 542 int un_pwr_mgmt; /* power management state */ 543 uchar_t un_density_known; /* density is known */ 544 uchar_t un_curdens; /* index into density table */ 545 uchar_t un_lastop; /* last I/O was: read/write/ctl */ 546 uchar_t un_eof; /* eof states */ 547 uchar_t un_laststate; /* last state */ 548 uchar_t un_state; /* current state */ 549 uchar_t un_status; /* status from last sense */ 550 uchar_t un_retry_ct; /* retry count */ 551 uchar_t un_tran_retry_ct; /* transport retry count */ 552 uchar_t un_read_only; /* 1 == opened O_RDONLY */ 553 uchar_t un_test_append; /* check writing at end of tape */ 554 uchar_t un_arq_enabled; /* auto request sense enabled */ 555 uchar_t un_untagged_qing; /* hba has untagged quing */ 556 uchar_t un_allow_large_xfer; /* allow >64k xfers if requested */ 557 uchar_t un_sbuf_busy; /* sbuf busy flag */ 558 uchar_t un_ncmds; /* number of commands outstanding */ 559 uchar_t un_throttle; /* curr. max number of cmds outst. */ 560 uchar_t un_last_throttle; /* saved max number of cmds outst. */ 561 uchar_t un_max_throttle; /* max poss. number cmds outstanding */ 562 uchar_t un_persistence; /* 1 = persistence on, 0 off */ 563 uchar_t un_persist_errors; /* 1 = persistenced flagged */ 564 uchar_t un_flush_on_errors; /* HBA will flush all I/O's on a */ 565 /* check condidtion or error */ 566 uint_t un_kbytes_xferred; /* bytes (in K) counter */ 567 uint_t un_last_resid; /* keep last resid, for PE */ 568 uint_t un_last_count; /* keep last count, for PE */ 569 struct kstat *un_stats; /* for I/O statistics */ 570 struct buf *un_rqs_bp; /* bp used in rqpkt */ 571 struct buf *un_wf; /* head of write queue */ 572 struct buf *un_wl; /* tail of write queue */ 573 struct read_blklim *un_rbl; /* ptr to read block limit info */ 574 int un_maxdma; /* max dma xfer allowed by HBA */ 575 uint_t un_bsize; /* block size currently being used */ 576 int un_maxbsize; /* max block size allowed by drive */ 577 uint_t un_minbsize; /* min block size allowed by drive */ 578 int un_errno; /* errno (b_error) */ 579 kcondvar_t un_state_cv; /* mediastate condition variable */ 580 enum mtio_state un_mediastate; /* current media state */ 581 enum mtio_state un_specified_mediastate; /* expected state */ 582 timeout_id_t un_delay_tid; /* delayed cv tid */ 583 timeout_id_t un_hib_tid; /* handle interrupt busy tid */ 584 opaque_t un_swr_token; /* scsi_watch request token */ 585 uchar_t un_comp_page; /* compression page */ 586 uchar_t un_rsvd_status; /* Reservation Status */ 587 kstat_t *un_errstats; /* for error statistics */ 588 int un_init_options; /* Init time drive options */ 589 int un_save_fileno; /* Save here for recovery */ 590 daddr_t un_save_blkno; /* Save here for recovery */ 591 uchar_t un_restore_pos; /* Indication to do recovery */ 592 int un_suspend_fileno; /* Save fileno for SUSPEND */ 593 daddr_t un_suspend_blkno; /* Save blkno for SUSPEND */ 594 uchar_t un_silent_skip; /* to catch short reads */ 595 short un_tids_at_suspend; /* timeouts set at suspend */ 596 kcondvar_t un_tape_busy_cv; /* busy cv */ 597 kcondvar_t un_suspend_cv; /* busy cv */ 598 /* restore on close */ 599 uchar_t un_eject_tape_on_failure; /* 1 = eject tape, 0 = don't */ 600 uchar_t un_HeadClean; /* support and need head cleaning? */ 601 uchar_t un_rqs_state; /* see define below */ 602 caddr_t un_uscsi_rqs_buf; /* uscsi_rqs: buffer for RQS data */ 603 uchar_t un_data_mod; /* Device required data mod */ 604 }; 605 /* 606 * device error kstats 607 */ 608 struct st_errstats { 609 struct kstat_named st_softerrs; 610 struct kstat_named st_harderrs; 611 struct kstat_named st_transerrs; 612 struct kstat_named st_vid; 613 struct kstat_named st_pid; 614 struct kstat_named st_revision; 615 struct kstat_named st_serial; 616 }; 617 618 /* 619 * generic log page struct 620 */ 621 struct log_page { 622 #if defined(_BIT_FIELDS_LTOH) 623 uchar_t code :6, /* page code number */ 624 :2; /* reserved */ 625 #elif defined(_BIT_FIELDS_HTOL) 626 uchar_t :2, /* reserved */ 627 code :6; /* page code number */ 628 #endif /* _BIT_FIELDS_LTOH */ 629 uchar_t reserved; /* reserved */ 630 uchar_t length_hi; /* length of bytes to follow (msb) */ 631 uchar_t length_lo; /* length of bytes to follow (lsb) */ 632 /* 633 * Log parameters follow right after this... 634 */ 635 }; 636 637 /* 638 * generic log page parameter struct 639 */ 640 struct log_param { 641 uchar_t pc_hi; /* parameter code (msb) */ 642 uchar_t pc_lo; /* parameter code (lsb) */ 643 #if defined(_BIT_FIELDS_LTOH) 644 uchar_t lp : 1, /* list parameter */ 645 : 1, /* reserved */ 646 tmc : 2, /* threshold met criteria */ 647 etc : 1, /* enable threshold comparison */ 648 tsd : 1, /* target save disable */ 649 ds : 1, /* disable save */ 650 du : 1; /* disable update */ 651 #elif defined(_BIT_FIELDS_HTOL) 652 uchar_t du : 1, /* disable update */ 653 ds : 1, /* disable save */ 654 tsd : 1, /* target save disable */ 655 etc : 1, /* enable threshold comparison */ 656 tmc : 2, /* threshold met criteria */ 657 : 1, /* reserved */ 658 lp : 1; /* list parameter */ 659 #endif /* _BIT_FIELDS_LTOH */ 660 uchar_t length; /* length of bytes to follow */ 661 /* 662 * Parameter values follow right after this... 663 */ 664 }; 665 /* 666 * TapeAlert structures 667 */ 668 669 struct st_tape_alert_parameter { 670 struct log_param log_param; 671 uchar_t param_value; 672 }; 673 674 struct st_tape_alert { 675 struct log_page log_page; 676 struct st_tape_alert_parameter param[TAPE_ALERT_MAX_PARA]; 677 }; 678 679 #define TAPE_ALERT_PARAMETER_LENGTH \ 680 (sizeof (struct st_tape_alert_parameter)) * TAPE_ALERT_MAX_PARA 681 682 struct log_sequential_page_parameter { 683 struct log_param log_param; 684 uchar_t param_value[8]; 685 }; 686 687 struct log_sequential_page { 688 struct log_page log_page; 689 struct log_sequential_page_parameter param[TAPE_SEQUENTIAL_PAGE_PARA]; 690 }; 691 692 #if !defined(__lint) 693 _NOTE(MUTEX_PROTECTS_DATA(scsi_device::sd_mutex, scsi_tape)) 694 _NOTE(SCHEME_PROTECTS_DATA("stable data", scsi_tape::un_dp)) 695 _NOTE(SCHEME_PROTECTS_DATA("stable data", scsi_tape::un_sd)) 696 _NOTE(SCHEME_PROTECTS_DATA("not shared", scsi_tape::un_rqs)) 697 _NOTE(DATA_READABLE_WITHOUT_LOCK(scsi_tape::un_bsize)) 698 _NOTE(SCHEME_PROTECTS_DATA("not shared", scsi_arq_status)) 699 _NOTE(SCHEME_PROTECTS_DATA("save sharing", 700 scsi_tape::un_allow_large_xfer 701 scsi_tape::un_maxbsize 702 scsi_tape::un_maxdma 703 )) 704 #endif 705 706 707 /* 708 * driver states.. 709 */ 710 #define ST_STATE_CLOSED 0 711 #define ST_STATE_OFFLINE 1 712 #define ST_STATE_INITIALIZING 2 713 #define ST_STATE_OPENING 3 714 #define ST_STATE_OPEN_PENDING_IO 4 715 #define ST_STATE_APPEND_TESTING 5 716 #define ST_STATE_OPEN 6 717 #define ST_STATE_RESOURCE_WAIT 7 718 #define ST_STATE_CLOSING 8 719 #define ST_STATE_SENSING 9 720 #define ST_STATE_CLOSE_PENDING_OPEN 10 721 722 /* 723 * Power management state 724 */ 725 #define ST_PWR_NORMAL 0 726 #define ST_PWR_SUSPENDED 1 727 728 /* 729 * operation codes 730 */ 731 732 #define ST_OP_NIL 0 733 #define ST_OP_CTL 1 734 #define ST_OP_READ 2 735 #define ST_OP_WRITE 3 736 #define ST_OP_WEOF 4 737 738 /* 739 * eof/eot/eom codes. 740 */ 741 742 #define ST_NO_EOF 0x00 743 #define ST_EOF_PENDING 0x01 /* filemark pending */ 744 #define ST_EOF 0x02 /* at filemark */ 745 #define ST_EOT_PENDING 0x03 /* logical eot pending */ 746 #define ST_EOT 0x04 /* at logical eot */ 747 #define ST_EOM 0x05 /* at physical eot */ 748 #define ST_WRITE_AFTER_EOM 0x06 /* flag for allowing writes after EOM */ 749 750 #define IN_EOF(un) (un->un_eof == ST_EOF_PENDING || un->un_eof == ST_EOF) 751 752 /* un_rqs_state codes */ 753 754 #define ST_RQS_OVR 0x1 /* RQS data was overwritten */ 755 #define ST_RQS_VALID 0x2 /* RQS data is valid */ 756 #define ST_RQS_READ 0x4 /* RQS data was read */ 757 #define ST_RQS_ERROR 0x8 /* RQS resulted in an EIO */ 758 759 /* 760 * stintr codes 761 */ 762 763 #define COMMAND_DONE 0 764 #define COMMAND_DONE_ERROR 1 765 #define COMMAND_DONE_ERROR_RECOVERED 2 766 #define QUE_COMMAND 3 767 #define QUE_BUSY_COMMAND 4 768 #define QUE_SENSE 5 769 #define JUST_RETURN 6 770 #define COMMAND_DONE_EACCES 7 771 #define QUE_LAST_COMMAND 8 772 773 774 /* 775 * Reservation Status 776 * 777 * ST_INIT_RESERVE -Used to check if the reservation has been lost 778 * in between opens and also to indicate the reservation 779 * has not been done till now. 780 * ST_RELEASE -Tape Unit is Released. 781 * ST_RESERVE -Tape Unit is Reserved. 782 * ST_PRESERVE_RESERVE -Reservation is to be preserved across opens. 783 * 784 */ 785 #define ST_INIT_RESERVE 0x001 786 #define ST_RELEASE 0x002 787 #define ST_RESERVE 0x004 788 #define ST_PRESERVE_RESERVE 0x008 789 #define ST_RESERVATION_CONFLICT 0x010 790 #define ST_LOST_RESERVE 0x020 791 792 #define ST_RESERVE_SUPPORTED(un) \ 793 ((un->un_dp->options & ST_NO_RESERVE_RELEASE) == 0) 794 795 #define ST_RESERVATION_DELAY 500000 796 797 /* 798 * Asynch I/O tunables 799 */ 800 #define ST_MAX_THROTTLE 4 801 802 /* 803 * 60 minutes seems a reasonable amount of time 804 * to wait for tape space operations to complete. 805 * 806 */ 807 #define ST_SPACE_TIME MINUTES(60) /* 60 minutes per space operation */ 808 #define ST_LONG_SPACE_TIME_X 5 /* multipiler for long space ops */ 809 810 /* 811 * 2 minutes seems a reasonable amount of time 812 * to wait for tape i/o operations to complete. 813 * 814 */ 815 #define ST_IO_TIME MINUTES(2) /* minutes per i/o */ 816 #define ST_LONG_TIMEOUT_X 5 /* multiplier for very long timeouts */ 817 818 819 /* 820 * 10 seconds is what we'll wait if we get a Busy Status back 821 */ 822 #define ST_STATUS_BUSY_TIMEOUT 10*hz /* seconds Busy Waiting */ 823 #define ST_TRAN_BUSY_TIMEOUT 1*hz /* seconds retry on TRAN_BSY */ 824 #define ST_INTERRUPT_CONTEXT 1 825 #define ST_START_CONTEXT 2 826 827 /* 828 * Number of times we'll retry a normal operation. 829 * 830 * XXX This includes retries due to transport failure as well as 831 * XXX busy timeouts- Need to distinguish between Target and Transport 832 * XXX failure. 833 */ 834 835 #define ST_RETRY_COUNT 20 836 837 /* 838 * Number of times to retry a failed selection 839 */ 840 #define ST_SEL_RETRY_COUNT 2 841 842 /* 843 * es_code value for deferred error 844 * should be moved to sense.h 845 */ 846 847 #define ST_DEFERRED_ERROR 0x01 848 849 /* 850 * Maximum number of units (determined by minor device byte) 851 */ 852 #define ST_MAXUNIT 128 853 854 /* 855 * Time to wait for completion of a command before cancelling it. 856 * For SUSPEND use only 857 */ 858 #define ST_WAIT_CMDS_COMPLETE 10 /* seconds */ 859 860 #ifndef SECSIZE 861 #define SECSIZE 512 862 #endif 863 #ifndef SECDIV 864 #define SECDIV 9 865 #endif 866 867 /* 868 * convenient defines 869 */ 870 #define ST_SCSI_DEVP (un->un_sd) 871 #define ST_DEVINFO (ST_SCSI_DEVP->sd_dev) 872 #define ST_INQUIRY (ST_SCSI_DEVP->sd_inq) 873 #define ST_RQSENSE (ST_SCSI_DEVP->sd_sense) 874 #define ST_MUTEX (&ST_SCSI_DEVP->sd_mutex) 875 #define ROUTE (&ST_SCSI_DEVP->sd_address) 876 877 #define BSD_BEHAVIOR (getminor(un->un_dev) & MT_BSD) 878 #define SVR4_BEHAVIOR ((getminor(un->un_dev) & MT_BSD) == 0) 879 #define SCBP(pkt) ((struct scsi_status *)(pkt)->pkt_scbp) 880 #define SCBP_C(pkt) ((*(pkt)->pkt_scbp) & STATUS_MASK) 881 #define CDBP(pkt) ((union scsi_cdb *)(pkt)->pkt_cdbp) 882 #define BP_PKT(bp) ((struct scsi_pkt *)(bp)->av_back) 883 #define SET_BP_PKT(bp, pkt) ((bp)->av_back = (struct buf *)(pkt)) 884 #define BP_UCMD(bp) ((struct uscsi_cmd *)(bp)->b_back) 885 #define USCSI_CMD(bp) (((bp) == un->un_sbufp) && (BP_UCMD(bp))) 886 887 #define IS_CLOSING(un) ((un)->un_state == ST_STATE_CLOSING || \ 888 ((un)->un_state == ST_STATE_SENSING && \ 889 (un)->un_laststate == ST_STATE_CLOSING)) 890 891 #define ASYNC_CMD 0 892 #define SYNC_CMD 1 893 894 /* 895 * Flush tape wait queue as needed. 896 */ 897 898 #define IS_PE_FLAG_SET(un) ((un)->un_persistence && (un)->un_persist_errors) 899 900 #define TURN_PE_ON(un) st_turn_pe_on(un) 901 #define TURN_PE_OFF(un) st_turn_pe_off(un) 902 #define SET_PE_FLAG(un) st_set_pe_flag(un) 903 #define CLEAR_PE(un) st_clear_pe(un) 904 905 #define st_bioerror(bp, error) \ 906 { bioerror(bp, error); \ 907 un->un_errno = error; } 908 909 /* 910 * Macros for internal coding of count for SPACE command: 911 * 912 * Isfmk is 1 when spacing filemarks; 0 when spacing records: 913 * bit 24 set indicates a space filemark command. 914 * Fmk sets the filemark bit (24) and changes a backspace 915 * count into a positive number with the sign bit set. 916 * Blk changes a backspace count into a positive number with 917 * the sign bit set. 918 * space_cnt converts backwards counts to negative numbers. 919 */ 920 #define Isfmk(x) ((x & (1<<24)) != 0) 921 #define Fmk(x) ((1<<24)|((x < 0) ? ((-(x)) | (1<<30)): x)) 922 #define Blk(x) ((x < 0)? ((-(x))|(1<<30)): x) 923 #define space_cnt(x) (((x) & (1<<30))? (-((x)&((1<<24)-1))):(x)&((1<<24)-1)) 924 925 926 #define GET_SOFT_STATE(dev) \ 927 register struct scsi_tape *un; \ 928 register int instance; \ 929 \ 930 instance = MTUNIT(dev); \ 931 if ((un = ddi_get_soft_state(st_state, instance)) == NULL) \ 932 return (ENXIO); 933 934 /* 935 * flag for st_start(), which allows making a copy of the bp 936 * (copyin only works in user context) 937 */ 938 #define ST_USER_CONTEXT 1 939 940 /* 941 * Debugging turned on via conditional compilation switch -DSTDEBUG 942 */ 943 #ifdef DEBUG 944 #define STDEBUG 945 #endif 946 947 #ifdef STDEBUG 948 #define DEBUGGING ((scsi_options & SCSI_DEBUG_TGT) || st_debug > 1) 949 950 951 #define ST_DEBUG1 if (st_debug >= 1) scsi_log /* initialization */ 952 #define ST_DEBUG ST_DEBUG1 953 954 #define ST_DEBUG2 if (st_debug >= 2) scsi_log /* errors and UA's */ 955 #define ST_DEBUG3 if (st_debug >= 3) scsi_log /* func calls */ 956 #define ST_DEBUG4 if (st_debug >= 4) scsi_log /* ioctl calls */ 957 #define ST_DEBUG5 if (st_debug >= 5) scsi_log 958 #define ST_DEBUG6 if (st_debug >= 6) scsi_log /* full data tracking */ 959 960 #define ST_DEBUG_SP if (st_debug == 10) scsi_log /* special cases */ 961 962 #else 963 964 #define st_debug (0) 965 #define DEBUGGING (0) 966 #define ST_DEBUG if (0) scsi_log 967 #define ST_DEBUG1 if (0) scsi_log 968 #define ST_DEBUG2 if (0) scsi_log 969 #define ST_DEBUG3 if (0) scsi_log 970 #define ST_DEBUG4 if (0) scsi_log 971 #define ST_DEBUG5 if (0) scsi_log 972 #define ST_DEBUG6 if (0) scsi_log 973 974 #define ST_DEBUG_SP if (0) scsi_log /* special cases */ 975 976 #endif 977 978 /* 979 * Media access values 980 */ 981 #define MEDIA_ACCESS_DELAY 5000000 /* usecs wait for media state change */ 982 983 /* 984 * SCSI tape mode sense page information 985 */ 986 #define ST_DEV_CONFIG_PAGE 0x10 /* device config mode page */ 987 #define ST_DEV_CONFIG_NO_COMP 0x00 /* use no compression */ 988 #define ST_DEV_CONFIG_DEF_COMP 0x01 /* use default compression alg */ 989 #define ST_COMPRESSION_DENSITY 3 /* compression minor number */ 990 991 /* 992 * SCSI tape data compression Page definition. 993 */ 994 #define ST_DEV_DATACOMP_PAGE 0x0F /* data compression page */ 995 996 997 998 /* 999 * maxbsize values 1000 */ 1001 #define MAXBSIZE_UNKNOWN -2 /* not found yet */ 1002 1003 #define ONE_MEG (1024 * 1024) 1004 1005 /* 1006 * generic soft error reporting 1007 * 1008 * What we are doing here is allowing a greater number of errors to occur on 1009 * smaller transfers (i.e. usually at the beginning of the tape), than on 1010 * the rest of the tape. 1011 * 1012 * A small transfer is defined as : 1013 * Transfers <= SOFT_ERROR_WARNING_THRESHOLD allow about 1.5 times more errors 1014 * 1015 * A larget tranfer is defined as : 1016 * Transfers > SOFT_ERROR_WARNING_THRESHOLD allow normal amount 1017 * 1018 */ 1019 #define READ_SOFT_ERROR_WARNING_THRESHOLD (25 * ONE_MEG) 1020 #define WRITE_SOFT_ERROR_WARNING_THRESHOLD (20 * ONE_MEG) 1021 1022 /* 1023 * soft error reporting for exabyte 1024 */ 1025 #define TAPE_SENSE_LENGTH 32 /* allows for softerror info */ 1026 1027 #define SENSE_19_BITS \ 1028 "\20\10PF\07BPE\06FPE\05ME\04ECO\03TME\02TNP\01LBOT" 1029 #define SENSE_20_BITS \ 1030 "\20\10RSVD\07RSVD\06WP\05FMKE\04URE\03WE1\02SSE\01FW" 1031 #define SENSE_21_BITS \ 1032 "\20\10RSVD\07RSVD\06RRR\05CLND\04CLN\03PEOT\02WSEB\01WSE0" 1033 1034 /* these are defined in percentages */ 1035 #define EXABYTE_WRITE_ERROR_THRESHOLD 6 1036 #define EXABYTE_READ_ERROR_THRESHOLD 3 1037 /* 1038 * minumum amount of data transfer(MB) for checking soft error rate. 1039 */ 1040 #define EXABYTE_MIN_TRANSFER (25 * ONE_MEG) 1041 1042 #define CLN 0x8 1043 #define CLND 0x10 1044 1045 /* 1046 * soft error reporting for Archive 4mm DAT 1047 */ 1048 1049 #define LOG_SENSE_LENGTH 0xff 1050 #define MIN_LOG_SENSE_LENGTH 0x2b 1051 #define DAT_SMALL_WRITE_ERROR_THRESHOLD 40 /* retries per 20 mg */ 1052 #define DAT_LARGE_WRITE_ERROR_THRESHOLD 200 /* retries for more 20 mg */ 1053 #define DAT_SMALL_READ_ERROR_THRESHOLD 5 /* errors allowed */ 1054 #define DAT_LARGE_READ_ERROR_THRESHOLD 3 /* errors allowed */ 1055 1056 /* 1057 * ST timeouts that need to be cancelled for suspend 1058 */ 1059 #define ST_HIB_TID 0x01 1060 #define ST_DELAY_TID 0x02 1061 1062 #ifdef __cplusplus 1063 } 1064 #endif 1065 1066 #endif /* _SYS_SCSI_TARGETS_STDEF_H */ 1067