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 /* 23 * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27 /* 28 * SCSI SCSA-compliant and not-so-DDI-compliant Tape Driver 29 */ 30 31 #if defined(lint) && !defined(DEBUG) 32 #define DEBUG 1 33 #endif 34 35 #include <sys/modctl.h> 36 #include <sys/scsi/scsi.h> 37 #include <sys/mtio.h> 38 #include <sys/scsi/targets/stdef.h> 39 #include <sys/file.h> 40 #include <sys/kstat.h> 41 #include <sys/ddidmareq.h> 42 #include <sys/ddi.h> 43 #include <sys/sunddi.h> 44 #include <sys/byteorder.h> 45 46 #define IOSP KSTAT_IO_PTR(un->un_stats) 47 /* 48 * stats maintained only for reads/writes as commands 49 * like rewind etc skew the wait/busy times 50 */ 51 #define IS_RW(bp) ((bp)->b_bcount > 0) 52 #define ST_DO_KSTATS(bp, kstat_function) \ 53 if ((bp != un->un_sbufp) && un->un_stats && IS_RW(bp)) { \ 54 kstat_function(IOSP); \ 55 } 56 57 #define ST_DO_ERRSTATS(un, x) \ 58 if (un->un_errstats) { \ 59 struct st_errstats *stp; \ 60 stp = (struct st_errstats *)un->un_errstats->ks_data; \ 61 stp->x.value.ul++; \ 62 } 63 64 #define FILL_SCSI1_LUN(devp, pkt) \ 65 if ((devp)->sd_inq->inq_ansi == 0x1) { \ 66 int _lun; \ 67 _lun = ddi_prop_get_int(DDI_DEV_T_ANY, (devp)->sd_dev, \ 68 DDI_PROP_DONTPASS, SCSI_ADDR_PROP_LUN, 0); \ 69 if (_lun > 0) { \ 70 ((union scsi_cdb *)(pkt)->pkt_cdbp)->scc_lun = \ 71 _lun; \ 72 } \ 73 } 74 75 /* 76 * get an available contig mem header, cp. 77 * when big_enough is true, we will return NULL, if no big enough 78 * contig mem is found. 79 * when big_enough is false, we will try to find cp containing big 80 * enough contig mem. if not found, we will ruturn the last cp available. 81 * 82 * used by st_get_contig_mem() 83 */ 84 #define ST_GET_CONTIG_MEM_HEAD(un, cp, len, big_enough) { \ 85 struct contig_mem *tmp_cp = NULL; \ 86 for ((cp) = (un)->un_contig_mem; \ 87 (cp) != NULL; \ 88 tmp_cp = (cp), (cp) = (cp)->cm_next) { \ 89 if (((cp)->cm_len >= (len)) || \ 90 (!(big_enough) && ((cp)->cm_next == NULL))) { \ 91 if (tmp_cp == NULL) { \ 92 (un)->un_contig_mem = (cp)->cm_next; \ 93 } else { \ 94 tmp_cp->cm_next = (cp)->cm_next; \ 95 } \ 96 (cp)->cm_next = NULL; \ 97 (un)->un_contig_mem_available_num--; \ 98 break; \ 99 } \ 100 } \ 101 } 102 103 #define ST_NUM_MEMBERS(array) (sizeof (array) / sizeof (array[0])) 104 #define COPY_POS(dest, source) bcopy(source, dest, sizeof (tapepos_t)) 105 #define ISALNUM(byte) \ 106 (((byte) >= 'a' && (byte) <= 'z') || \ 107 ((byte) >= 'A' && (byte) <= 'Z') || \ 108 ((byte) >= '0' && (byte) <= '9')) 109 110 #define ONE_K 1024 111 112 #define MAX_SPACE_CNT(cnt) if (cnt >= 0) { \ 113 if (cnt > MIN(SP_CNT_MASK, INT32_MAX)) \ 114 return (EINVAL); \ 115 } else { \ 116 if (-(cnt) > MIN(SP_CNT_MASK, INT32_MAX)) \ 117 return (EINVAL); \ 118 } \ 119 120 /* 121 * Global External Data Definitions 122 */ 123 extern struct scsi_key_strings scsi_cmds[]; 124 extern uchar_t scsi_cdb_size[]; 125 126 /* 127 * Local Static Data 128 */ 129 static void *st_state; 130 static char *const st_label = "st"; 131 static volatile int st_recov_sz = sizeof (recov_info); 132 static const char mp_misconf[] = { 133 "St Tape is misconfigured, MPxIO enabled and " 134 "tape-command-recovery-disable set in st.conf\n" 135 }; 136 137 #ifdef __x86 138 /* 139 * We need to use below DMA attr to alloc physically contiguous 140 * memory to do I/O in big block size 141 */ 142 static ddi_dma_attr_t st_contig_mem_dma_attr = { 143 DMA_ATTR_V0, /* version number */ 144 0x0, /* lowest usable address */ 145 0xFFFFFFFFull, /* high DMA address range */ 146 0xFFFFFFFFull, /* DMA counter register */ 147 1, /* DMA address alignment */ 148 1, /* DMA burstsizes */ 149 1, /* min effective DMA size */ 150 0xFFFFFFFFull, /* max DMA xfer size */ 151 0xFFFFFFFFull, /* segment boundary */ 152 1, /* s/g list length */ 153 1, /* granularity of device */ 154 0 /* DMA transfer flags */ 155 }; 156 157 static ddi_device_acc_attr_t st_acc_attr = { 158 DDI_DEVICE_ATTR_V0, 159 DDI_NEVERSWAP_ACC, 160 DDI_STRICTORDER_ACC 161 }; 162 163 /* set limitation for the number of contig_mem */ 164 static int st_max_contig_mem_num = ST_MAX_CONTIG_MEM_NUM; 165 #endif 166 167 /* 168 * Tunable parameters 169 * 170 * DISCLAIMER 171 * ---------- 172 * These parameters are intended for use only in system testing; if you use 173 * them in production systems, you do so at your own risk. Altering any 174 * variable not listed below may cause unpredictable system behavior. 175 * 176 * st_check_media_time 177 * 178 * Three second state check 179 * 180 * st_allow_large_xfer 181 * 182 * Gated with ST_NO_RECSIZE_LIMIT 183 * 184 * 0 - Transfers larger than 64KB will not be allowed 185 * regardless of the setting of ST_NO_RECSIZE_LIMIT 186 * 1 - Transfers larger than 64KB will be allowed 187 * if ST_NO_RECSIZE_LIMIT is TRUE for the drive 188 * 189 * st_report_soft_errors_on_close 190 * 191 * Gated with ST_SOFT_ERROR_REPORTING 192 * 193 * 0 - Errors will not be reported on close regardless 194 * of the setting of ST_SOFT_ERROR_REPORTING 195 * 196 * 1 - Errors will be reported on close if 197 * ST_SOFT_ERROR_REPORTING is TRUE for the drive 198 */ 199 static int st_selection_retry_count = ST_SEL_RETRY_COUNT; 200 static int st_retry_count = ST_RETRY_COUNT; 201 202 static int st_io_time = ST_IO_TIME; 203 static int st_long_timeout_x = ST_LONG_TIMEOUT_X; 204 205 static int st_space_time = ST_SPACE_TIME; 206 static int st_long_space_time_x = ST_LONG_SPACE_TIME_X; 207 208 static int st_error_level = SCSI_ERR_RETRYABLE; 209 static int st_check_media_time = 3000000; /* 3 Second State Check */ 210 211 static int st_max_throttle = ST_MAX_THROTTLE; 212 213 static clock_t st_wait_cmds_complete = ST_WAIT_CMDS_COMPLETE; 214 215 static int st_allow_large_xfer = 1; 216 static int st_report_soft_errors_on_close = 1; 217 218 /* 219 * End of tunable parameters list 220 */ 221 222 223 224 /* 225 * Asynchronous I/O and persistent errors, refer to PSARC/1995/228 226 * 227 * Asynchronous I/O's main offering is that it is a non-blocking way to do 228 * reads and writes. The driver will queue up all the requests it gets and 229 * have them ready to transport to the HBA. Unfortunately, we cannot always 230 * just ship the I/O requests to the HBA, as there errors and exceptions 231 * that may happen when we don't want the HBA to continue. Therein comes 232 * the flush-on-errors capability. If the HBA supports it, then st will 233 * send in st_max_throttle I/O requests at the same time. 234 * 235 * Persistent errors : This was also reasonably simple. In the interrupt 236 * routines, if there was an error or exception (FM, LEOT, media error, 237 * transport error), the persistent error bits are set and shuts everything 238 * down, but setting the throttle to zero. If we hit and exception in the 239 * HBA, and flush-on-errors were set, we wait for all outstanding I/O's to 240 * come back (with CMD_ABORTED), then flush all bp's in the wait queue with 241 * the appropriate error, and this will preserve order. Of course, depending 242 * on the exception we have to show a zero read or write before we show 243 * errors back to the application. 244 */ 245 246 extern const int st_ndrivetypes; /* defined in st_conf.c */ 247 extern const struct st_drivetype st_drivetypes[]; 248 extern const char st_conf_version[]; 249 250 #ifdef STDEBUG 251 static int st_soft_error_report_debug = 0; 252 volatile int st_debug = 0; 253 static volatile dev_info_t *st_lastdev; 254 static kmutex_t st_debug_mutex; 255 #endif 256 257 #define ST_MT02_NAME "Emulex MT02 QIC-11/24 " 258 259 static const struct vid_drivetype { 260 char *vid; 261 char type; 262 } st_vid_dt[] = { 263 {"LTO-CVE ", MT_LTO}, 264 {"QUANTUM ", MT_ISDLT}, 265 {"SONY ", MT_ISAIT}, 266 {"STK ", MT_ISSTK9840} 267 }; 268 269 static const struct driver_minor_data { 270 char *name; 271 int minor; 272 } st_minor_data[] = { 273 /* 274 * The top 4 entries are for the default densities, 275 * don't alter their position. 276 */ 277 {"", 0}, 278 {"n", MT_NOREWIND}, 279 {"b", MT_BSD}, 280 {"bn", MT_NOREWIND | MT_BSD}, 281 {"l", MT_DENSITY1}, 282 {"m", MT_DENSITY2}, 283 {"h", MT_DENSITY3}, 284 {"c", MT_DENSITY4}, 285 {"u", MT_DENSITY4}, 286 {"ln", MT_DENSITY1 | MT_NOREWIND}, 287 {"mn", MT_DENSITY2 | MT_NOREWIND}, 288 {"hn", MT_DENSITY3 | MT_NOREWIND}, 289 {"cn", MT_DENSITY4 | MT_NOREWIND}, 290 {"un", MT_DENSITY4 | MT_NOREWIND}, 291 {"lb", MT_DENSITY1 | MT_BSD}, 292 {"mb", MT_DENSITY2 | MT_BSD}, 293 {"hb", MT_DENSITY3 | MT_BSD}, 294 {"cb", MT_DENSITY4 | MT_BSD}, 295 {"ub", MT_DENSITY4 | MT_BSD}, 296 {"lbn", MT_DENSITY1 | MT_NOREWIND | MT_BSD}, 297 {"mbn", MT_DENSITY2 | MT_NOREWIND | MT_BSD}, 298 {"hbn", MT_DENSITY3 | MT_NOREWIND | MT_BSD}, 299 {"cbn", MT_DENSITY4 | MT_NOREWIND | MT_BSD}, 300 {"ubn", MT_DENSITY4 | MT_NOREWIND | MT_BSD} 301 }; 302 303 /* strings used in many debug and warning messages */ 304 static const char wr_str[] = "write"; 305 static const char rd_str[] = "read"; 306 static const char wrg_str[] = "writing"; 307 static const char rdg_str[] = "reading"; 308 static const char *space_strs[] = { 309 "records", 310 "filemarks", 311 "sequential filemarks", 312 "eod", 313 "setmarks", 314 "sequential setmarks", 315 "Reserved", 316 "Reserved" 317 }; 318 static const char *load_strs[] = { 319 "unload", /* LD_UNLOAD 0 */ 320 "load", /* LD_LOAD 1 */ 321 "retension", /* LD_RETEN 2 */ 322 "load reten", /* LD_LOAD | LD_RETEN 3 */ 323 "eod", /* LD_EOT 4 */ 324 "load EOD", /* LD_LOAD | LD_EOT 5 */ 325 "reten EOD", /* LD_RETEN | LD_EOT 6 */ 326 "load reten EOD" /* LD_LOAD|LD_RETEN|LD_EOT 7 */ 327 "hold", /* LD_HOLD 8 */ 328 "load and hold" /* LD_LOAD | LD_HOLD 9 */ 329 }; 330 331 static const char *errstatenames[] = { 332 "COMMAND_DONE", 333 "COMMAND_DONE_ERROR", 334 "COMMAND_DONE_ERROR_RECOVERED", 335 "QUE_COMMAND", 336 "QUE_BUSY_COMMAND", 337 "QUE_SENSE", 338 "JUST_RETURN", 339 "COMMAND_DONE_EACCES", 340 "QUE_LAST_COMMAND", 341 "COMMAND_TIMEOUT", 342 "PATH_FAILED", 343 "DEVICE_RESET", 344 "DEVICE_TAMPER", 345 "ATTEMPT_RETRY" 346 }; 347 348 const char *bogusID = "Unknown Media ID"; 349 350 /* default density offsets in the table above */ 351 #define DEF_BLANK 0 352 #define DEF_NOREWIND 1 353 #define DEF_BSD 2 354 #define DEF_BSD_NR 3 355 356 /* Sense Key, ASC/ASCQ for which tape ejection is needed */ 357 358 static struct tape_failure_code { 359 uchar_t key; 360 uchar_t add_code; 361 uchar_t qual_code; 362 } st_tape_failure_code[] = { 363 { KEY_HARDWARE_ERROR, 0x15, 0x01}, 364 { KEY_HARDWARE_ERROR, 0x44, 0x00}, 365 { KEY_HARDWARE_ERROR, 0x53, 0x00}, 366 { KEY_HARDWARE_ERROR, 0x53, 0x01}, 367 { KEY_NOT_READY, 0x53, 0x00}, 368 { 0xff} 369 }; 370 371 /* clean bit position and mask */ 372 373 static struct cln_bit_position { 374 ushort_t cln_bit_byte; 375 uchar_t cln_bit_mask; 376 } st_cln_bit_position[] = { 377 { 21, 0x08}, 378 { 70, 0xc0}, 379 { 18, 0x81} /* 80 bit indicates in bit mode, 1 bit clean light is on */ 380 }; 381 382 /* 383 * architecture dependent allocation restrictions. For x86, we'll set 384 * dma_attr_addr_hi to st_max_phys_addr and dma_attr_sgllen to 385 * st_sgl_size during _init(). 386 */ 387 #if defined(__sparc) 388 static ddi_dma_attr_t st_alloc_attr = { 389 DMA_ATTR_V0, /* version number */ 390 0x0, /* lowest usable address */ 391 0xFFFFFFFFull, /* high DMA address range */ 392 0xFFFFFFFFull, /* DMA counter register */ 393 1, /* DMA address alignment */ 394 1, /* DMA burstsizes */ 395 1, /* min effective DMA size */ 396 0xFFFFFFFFull, /* max DMA xfer size */ 397 0xFFFFFFFFull, /* segment boundary */ 398 1, /* s/g list length */ 399 512, /* granularity of device */ 400 0 /* DMA transfer flags */ 401 }; 402 #elif defined(__x86) 403 static ddi_dma_attr_t st_alloc_attr = { 404 DMA_ATTR_V0, /* version number */ 405 0x0, /* lowest usable address */ 406 0x0, /* high DMA address range [set in _init()] */ 407 0xFFFFull, /* DMA counter register */ 408 512, /* DMA address alignment */ 409 1, /* DMA burstsizes */ 410 1, /* min effective DMA size */ 411 0xFFFFFFFFull, /* max DMA xfer size */ 412 0xFFFFFFFFull, /* segment boundary */ 413 0, /* s/g list length */ 414 512, /* granularity of device [set in _init()] */ 415 0 /* DMA transfer flags */ 416 }; 417 uint64_t st_max_phys_addr = 0xFFFFFFFFull; 418 int st_sgl_size = 0xF; 419 420 #endif 421 422 /* 423 * Configuration Data: 424 * 425 * Device driver ops vector 426 */ 427 static int st_aread(dev_t dev, struct aio_req *aio, cred_t *cred_p); 428 static int st_awrite(dev_t dev, struct aio_req *aio, cred_t *cred_p); 429 static int st_read(dev_t dev, struct uio *uio_p, cred_t *cred_p); 430 static int st_write(dev_t dev, struct uio *uio_p, cred_t *cred_p); 431 static int st_open(dev_t *devp, int flag, int otyp, cred_t *cred_p); 432 static int st_close(dev_t dev, int flag, int otyp, cred_t *cred_p); 433 static int st_strategy(struct buf *bp); 434 static int st_queued_strategy(buf_t *bp); 435 static int st_ioctl(dev_t dev, int cmd, intptr_t arg, int flag, 436 cred_t *cred_p, int *rval_p); 437 extern int nulldev(), nodev(); 438 439 static struct cb_ops st_cb_ops = { 440 st_open, /* open */ 441 st_close, /* close */ 442 st_queued_strategy, /* strategy Not Block device but async checks */ 443 nodev, /* print */ 444 nodev, /* dump */ 445 st_read, /* read */ 446 st_write, /* write */ 447 st_ioctl, /* ioctl */ 448 nodev, /* devmap */ 449 nodev, /* mmap */ 450 nodev, /* segmap */ 451 nochpoll, /* poll */ 452 ddi_prop_op, /* cb_prop_op */ 453 0, /* streamtab */ 454 D_64BIT | D_MP | D_NEW | D_HOTPLUG | 455 D_OPEN_RETURNS_EINTR, /* cb_flag */ 456 CB_REV, /* cb_rev */ 457 st_aread, /* async I/O read entry point */ 458 st_awrite /* async I/O write entry point */ 459 460 }; 461 462 static int st_info(dev_info_t *dip, ddi_info_cmd_t infocmd, void *arg, 463 void **result); 464 static int st_probe(dev_info_t *dev); 465 static int st_attach(dev_info_t *dev, ddi_attach_cmd_t cmd); 466 static int st_detach(dev_info_t *dev, ddi_detach_cmd_t cmd); 467 468 static struct dev_ops st_ops = { 469 DEVO_REV, /* devo_rev, */ 470 0, /* refcnt */ 471 st_info, /* info */ 472 nulldev, /* identify */ 473 st_probe, /* probe */ 474 st_attach, /* attach */ 475 st_detach, /* detach */ 476 nodev, /* reset */ 477 &st_cb_ops, /* driver operations */ 478 (struct bus_ops *)0, /* bus operations */ 479 nulldev /* power */ 480 }; 481 482 /* 483 * Local Function Declarations 484 */ 485 static char *st_print_scsi_cmd(char cmd); 486 static void st_print_cdb(dev_info_t *dip, char *label, uint_t level, 487 char *title, char *cdb); 488 static void st_clean_print(dev_info_t *dev, char *label, uint_t level, 489 char *title, char *data, int len); 490 static int st_doattach(struct scsi_device *devp, int (*canwait)()); 491 static void st_known_tape_type(struct scsi_tape *un); 492 static int st_get_conf_from_st_dot_conf(struct scsi_tape *, char *, 493 struct st_drivetype *); 494 static int st_get_conf_from_st_conf_dot_c(struct scsi_tape *, char *, 495 struct st_drivetype *); 496 static int st_get_conf_from_tape_drive(struct scsi_tape *, char *, 497 struct st_drivetype *); 498 static int st_get_densities_from_tape_drive(struct scsi_tape *, 499 struct st_drivetype *); 500 static int st_get_timeout_values_from_tape_drive(struct scsi_tape *, 501 struct st_drivetype *); 502 static int st_get_timeouts_value(struct scsi_tape *, uchar_t, ushort_t *, 503 ushort_t); 504 static int st_get_default_conf(struct scsi_tape *, char *, 505 struct st_drivetype *); 506 static int st_rw(dev_t dev, struct uio *uio, int flag); 507 static int st_arw(dev_t dev, struct aio_req *aio, int flag); 508 static int st_find_eod(struct scsi_tape *un); 509 static int st_check_density_or_wfm(dev_t dev, int wfm, int mode, int stepflag); 510 static int st_uscsi_cmd(struct scsi_tape *un, struct uscsi_cmd *, int flag); 511 static int st_mtioctop(struct scsi_tape *un, intptr_t arg, int flag); 512 static int st_mtiocltop(struct scsi_tape *un, intptr_t arg, int flag); 513 static int st_do_mtioctop(struct scsi_tape *un, struct mtlop *mtop); 514 static void st_start(struct scsi_tape *un); 515 static int st_handle_start_busy(struct scsi_tape *un, struct buf *bp, 516 clock_t timeout_interval, int queued); 517 static int st_handle_intr_busy(struct scsi_tape *un, struct buf *bp, 518 clock_t timeout_interval); 519 static int st_handle_intr_retry_lcmd(struct scsi_tape *un, struct buf *bp); 520 static void st_done_and_mutex_exit(struct scsi_tape *un, struct buf *bp); 521 static void st_init(struct scsi_tape *un); 522 static void st_make_cmd(struct scsi_tape *un, struct buf *bp, 523 int (*func)(caddr_t)); 524 static void st_make_uscsi_cmd(struct scsi_tape *, struct uscsi_cmd *, 525 struct buf *bp, int (*func)(caddr_t)); 526 static void st_intr(struct scsi_pkt *pkt); 527 static void st_set_state(struct scsi_tape *un, buf_t *bp); 528 static void st_test_append(struct buf *bp); 529 static int st_runout(caddr_t); 530 static int st_cmd(struct scsi_tape *un, int com, int64_t count, int wait); 531 static int st_setup_cmd(struct scsi_tape *un, buf_t *bp, int com, 532 int64_t count); 533 static int st_set_compression(struct scsi_tape *un); 534 static int st_write_fm(dev_t dev, int wfm); 535 static int st_determine_generic(struct scsi_tape *un); 536 static int st_determine_density(struct scsi_tape *un, int rw); 537 static int st_get_density(struct scsi_tape *un); 538 static int st_set_density(struct scsi_tape *un); 539 static int st_loadtape(struct scsi_tape *un); 540 static int st_modesense(struct scsi_tape *un); 541 static int st_modeselect(struct scsi_tape *un); 542 static errstate st_handle_incomplete(struct scsi_tape *un, struct buf *bp); 543 static int st_wrongtapetype(struct scsi_tape *un); 544 static errstate st_check_error(struct scsi_tape *un, struct scsi_pkt *pkt); 545 static errstate st_handle_sense(struct scsi_tape *un, struct buf *bp, 546 tapepos_t *); 547 static errstate st_handle_autosense(struct scsi_tape *un, struct buf *bp, 548 tapepos_t *); 549 static int st_get_error_entry(struct scsi_tape *un, intptr_t arg, int flag); 550 static void st_update_error_stack(struct scsi_tape *un, struct scsi_pkt *pkt, 551 struct scsi_arq_status *cmd); 552 static void st_empty_error_stack(struct scsi_tape *un); 553 static errstate st_decode_sense(struct scsi_tape *un, struct buf *bp, int amt, 554 struct scsi_arq_status *, tapepos_t *); 555 static int st_report_soft_errors(dev_t dev, int flag); 556 static void st_delayed_cv_broadcast(void *arg); 557 static int st_check_media(dev_t dev, enum mtio_state state); 558 static int st_media_watch_cb(caddr_t arg, struct scsi_watch_result *resultp); 559 static void st_intr_restart(void *arg); 560 static void st_start_restart(void *arg); 561 static int st_gen_mode_sense(struct scsi_tape *un, ubufunc_t ubf, int page, 562 struct seq_mode *page_data, int page_size); 563 static int st_change_block_size(struct scsi_tape *un, uint32_t nblksz); 564 static int st_gen_mode_select(struct scsi_tape *un, ubufunc_t ubf, 565 struct seq_mode *page_data, int page_size); 566 static int st_read_block_limits(struct scsi_tape *un, 567 struct read_blklim *read_blk); 568 static int st_report_density_support(struct scsi_tape *un, 569 uchar_t *density_data, size_t buflen); 570 static int st_report_supported_operation(struct scsi_tape *un, 571 uchar_t *oper_data, uchar_t option_code, ushort_t service_action); 572 static int st_tape_init(struct scsi_tape *un); 573 static void st_flush(struct scsi_tape *un); 574 static void st_set_pe_errno(struct scsi_tape *un); 575 static void st_hba_unflush(struct scsi_tape *un); 576 static void st_turn_pe_on(struct scsi_tape *un); 577 static void st_turn_pe_off(struct scsi_tape *un); 578 static void st_set_pe_flag(struct scsi_tape *un); 579 static void st_clear_pe(struct scsi_tape *un); 580 static void st_wait_for_io(struct scsi_tape *un); 581 static int st_set_devconfig_page(struct scsi_tape *un, int compression_on); 582 static int st_set_datacomp_page(struct scsi_tape *un, int compression_on); 583 static int st_reserve_release(struct scsi_tape *un, int command, ubufunc_t ubf); 584 static int st_check_cdb_for_need_to_reserve(struct scsi_tape *un, uchar_t *cdb); 585 static int st_check_cmd_for_need_to_reserve(struct scsi_tape *un, uchar_t cmd, 586 int count); 587 static int st_take_ownership(struct scsi_tape *un, ubufunc_t ubf); 588 static int st_check_asc_ascq(struct scsi_tape *un); 589 static int st_check_clean_bit(struct scsi_tape *un); 590 static int st_check_alert_flags(struct scsi_tape *un); 591 static int st_check_sequential_clean_bit(struct scsi_tape *un); 592 static int st_check_sense_clean_bit(struct scsi_tape *un); 593 static int st_clear_unit_attentions(dev_t dev_instance, int max_trys); 594 static void st_calculate_timeouts(struct scsi_tape *un); 595 static writablity st_is_drive_worm(struct scsi_tape *un); 596 static int st_read_attributes(struct scsi_tape *un, uint16_t attribute, 597 void *buf, size_t size, ubufunc_t bufunc); 598 static int st_get_special_inquiry(struct scsi_tape *un, uchar_t size, 599 caddr_t dest, uchar_t page); 600 static int st_update_block_pos(struct scsi_tape *un, bufunc_t bf, 601 int post_space); 602 static int st_interpret_read_pos(struct scsi_tape const *un, tapepos_t *dest, 603 read_p_types type, size_t data_sz, const caddr_t responce, int post_space); 604 static int st_get_read_pos(struct scsi_tape *un, buf_t *bp); 605 static int st_logical_block_locate(struct scsi_tape *un, ubufunc_t ubf, 606 tapepos_t *pos, uint64_t lblk, uchar_t partition); 607 static int st_mtfsf_ioctl(struct scsi_tape *un, int64_t files); 608 static int st_mtfsr_ioctl(struct scsi_tape *un, int64_t count); 609 static int st_mtbsf_ioctl(struct scsi_tape *un, int64_t files); 610 static int st_mtnbsf_ioctl(struct scsi_tape *un, int64_t count); 611 static int st_mtbsr_ioctl(struct scsi_tape *un, int64_t num); 612 static int st_mtfsfm_ioctl(struct scsi_tape *un, int64_t cnt); 613 static int st_mtbsfm_ioctl(struct scsi_tape *un, int64_t cnt); 614 static int st_backward_space_files(struct scsi_tape *un, int64_t count, 615 int infront); 616 static int st_forward_space_files(struct scsi_tape *un, int64_t files); 617 static int st_scenic_route_to_begining_of_file(struct scsi_tape *un, 618 int32_t fileno); 619 static int st_space_to_begining_of_file(struct scsi_tape *un); 620 static int st_space_records(struct scsi_tape *un, int64_t records); 621 static int st_get_media_identification(struct scsi_tape *un, ubufunc_t bufunc); 622 static errstate st_command_recovery(struct scsi_tape *un, struct scsi_pkt *pkt, 623 errstate onentry); 624 static void st_recover(void *arg); 625 static void st_recov_cb(struct scsi_pkt *pkt); 626 static int st_rcmd(struct scsi_tape *un, int com, int64_t count, int wait); 627 static int st_uscsi_rcmd(struct scsi_tape *un, struct uscsi_cmd *ucmd, 628 int flag); 629 static void st_add_recovery_info_to_pkt(struct scsi_tape *un, buf_t *bp, 630 struct scsi_pkt *cmd); 631 static int st_check_mode_for_change(struct scsi_tape *un, ubufunc_t ubf); 632 static int st_test_path_to_device(struct scsi_tape *un); 633 static int st_recovery_read_pos(struct scsi_tape *un, read_p_types type, 634 read_pos_data_t *raw); 635 static int st_recovery_get_position(struct scsi_tape *un, tapepos_t *read, 636 read_pos_data_t *raw); 637 static int st_compare_expected_position(struct scsi_tape *un, st_err_info *ei, 638 cmd_attribute const * cmd_att, tapepos_t *read); 639 static errstate st_recover_reissue_pkt(struct scsi_tape *us, 640 struct scsi_pkt *pkt); 641 static int st_transport(struct scsi_tape *un, struct scsi_pkt *pkt); 642 static buf_t *st_remove_from_queue(buf_t **head, buf_t **tail, buf_t *bp); 643 static void st_add_to_queue(buf_t **head, buf_t **tail, buf_t *end, buf_t *bp); 644 static int st_reset(struct scsi_tape *un, int reset_type); 645 static void st_reset_notification(caddr_t arg); 646 static const cmd_attribute *st_lookup_cmd_attribute(unsigned char cmd); 647 648 #ifdef __x86 649 /* 650 * routines for I/O in big block size 651 */ 652 static void st_release_contig_mem(struct scsi_tape *un, struct contig_mem *cp); 653 static struct contig_mem *st_get_contig_mem(struct scsi_tape *un, size_t len, 654 int alloc_flags); 655 static int st_bigblk_xfer_done(struct buf *bp); 656 static struct buf *st_get_bigblk_bp(struct buf *bp); 657 #endif 658 static void st_print_position(dev_info_t *dev, char *label, uint_t level, 659 const char *comment, tapepos_t *pos); 660 661 /* 662 * error statistics create/update functions 663 */ 664 static int st_create_errstats(struct scsi_tape *, int); 665 static int st_validate_tapemarks(struct scsi_tape *un, ubufunc_t ubf, 666 tapepos_t *pos); 667 668 #ifdef STDEBUG 669 static void st_debug_cmds(struct scsi_tape *un, int com, int count, int wait); 670 #endif /* STDEBUG */ 671 static char *st_dev_name(dev_t dev); 672 673 #if !defined(lint) 674 _NOTE(SCHEME_PROTECTS_DATA("unique per pkt", 675 scsi_pkt buf uio scsi_cdb uscsi_cmd)) 676 _NOTE(SCHEME_PROTECTS_DATA("unique per pkt", scsi_extended_sense scsi_status)) 677 _NOTE(SCHEME_PROTECTS_DATA("unique per pkt", recov_info)) 678 _NOTE(SCHEME_PROTECTS_DATA("stable data", scsi_device)) 679 _NOTE(DATA_READABLE_WITHOUT_LOCK(st_drivetype scsi_address)) 680 #endif 681 682 /* 683 * autoconfiguration routines. 684 */ 685 char _depends_on[] = "misc/scsi"; 686 687 static struct modldrv modldrv = { 688 &mod_driverops, /* Type of module. This one is a driver */ 689 "SCSI tape Driver", /* Name of the module. */ 690 &st_ops /* driver ops */ 691 }; 692 693 static struct modlinkage modlinkage = { 694 MODREV_1, &modldrv, NULL 695 }; 696 697 /* 698 * Notes on Post Reset Behavior in the tape driver: 699 * 700 * When the tape drive is opened, the driver attempts to make sure that 701 * the tape head is positioned exactly where it was left when it was last 702 * closed provided the medium is not changed. If the tape drive is 703 * opened in O_NDELAY mode, the repositioning (if necessary for any loss 704 * of position due to reset) will happen when the first tape operation or 705 * I/O occurs. The repositioning (if required) may not be possible under 706 * certain situations such as when the device firmware not able to report 707 * the medium change in the REQUEST SENSE data because of a reset or a 708 * misbehaving bus not allowing the reposition to happen. In such 709 * extraordinary situations, where the driver fails to position the head 710 * at its original position, it will fail the open the first time, to 711 * save the applications from overwriting the data. All further attempts 712 * to open the tape device will result in the driver attempting to load 713 * the tape at BOT (beginning of tape). Also a warning message to 714 * indicate that further attempts to open the tape device may result in 715 * the tape being loaded at BOT will be printed on the console. If the 716 * tape device is opened in O_NDELAY mode, failure to restore the 717 * original tape head position, will result in the failure of the first 718 * tape operation or I/O, Further, the driver will invalidate its 719 * internal tape position which will necessitate the applications to 720 * validate the position by using either a tape positioning ioctl (such 721 * as MTREW) or closing and reopening the tape device. 722 * 723 */ 724 725 int 726 _init(void) 727 { 728 int e; 729 730 if (((e = ddi_soft_state_init(&st_state, 731 sizeof (struct scsi_tape), ST_MAXUNIT)) != 0)) { 732 return (e); 733 } 734 735 if ((e = mod_install(&modlinkage)) != 0) { 736 ddi_soft_state_fini(&st_state); 737 } else { 738 #ifdef STDEBUG 739 mutex_init(&st_debug_mutex, NULL, MUTEX_DRIVER, NULL); 740 #endif 741 742 #if defined(__x86) 743 /* set the max physical address for iob allocs on x86 */ 744 st_alloc_attr.dma_attr_addr_hi = st_max_phys_addr; 745 746 /* 747 * set the sgllen for iob allocs on x86. If this is set less 748 * than the number of pages the buffer will take 749 * (taking into account alignment), it would force the 750 * allocator to try and allocate contiguous pages. 751 */ 752 st_alloc_attr.dma_attr_sgllen = st_sgl_size; 753 #endif 754 } 755 756 return (e); 757 } 758 759 int 760 _fini(void) 761 { 762 int e; 763 764 if ((e = mod_remove(&modlinkage)) != 0) { 765 return (e); 766 } 767 768 #ifdef STDEBUG 769 mutex_destroy(&st_debug_mutex); 770 #endif 771 772 ddi_soft_state_fini(&st_state); 773 774 return (e); 775 } 776 777 int 778 _info(struct modinfo *modinfop) 779 { 780 return (mod_info(&modlinkage, modinfop)); 781 } 782 783 784 static int 785 st_probe(dev_info_t *devi) 786 { 787 int instance; 788 struct scsi_device *devp; 789 int rval; 790 791 #if !defined(__sparc) 792 char *tape_prop; 793 int tape_prop_len; 794 #endif 795 796 ST_ENTR(devi, st_probe); 797 798 /* If self identifying device */ 799 if (ddi_dev_is_sid(devi) == DDI_SUCCESS) { 800 return (DDI_PROBE_DONTCARE); 801 } 802 803 #if !defined(__sparc) 804 /* 805 * Since some x86 HBAs have devnodes that look like SCSI as 806 * far as we can tell but aren't really SCSI (DADK, like mlx) 807 * we check for the presence of the "tape" property. 808 */ 809 if (ddi_prop_op(DDI_DEV_T_NONE, devi, PROP_LEN_AND_VAL_ALLOC, 810 DDI_PROP_CANSLEEP, "tape", 811 (caddr_t)&tape_prop, &tape_prop_len) != DDI_PROP_SUCCESS) { 812 return (DDI_PROBE_FAILURE); 813 } 814 if (strncmp(tape_prop, "sctp", tape_prop_len) != 0) { 815 kmem_free(tape_prop, tape_prop_len); 816 return (DDI_PROBE_FAILURE); 817 } 818 kmem_free(tape_prop, tape_prop_len); 819 #endif 820 821 devp = ddi_get_driver_private(devi); 822 instance = ddi_get_instance(devi); 823 824 if (ddi_get_soft_state(st_state, instance) != NULL) { 825 return (DDI_PROBE_PARTIAL); 826 } 827 828 829 /* 830 * Turn around and call probe routine to see whether 831 * we actually have a tape at this SCSI nexus. 832 */ 833 if (scsi_probe(devp, NULL_FUNC) == SCSIPROBE_EXISTS) { 834 835 /* 836 * In checking the whole inq_dtype byte we are looking at both 837 * the Peripheral Qualifier and the Peripheral Device Type. 838 * For this driver we are only interested in sequential devices 839 * that are connected or capable if connecting to this logical 840 * unit. 841 */ 842 if (devp->sd_inq->inq_dtype == 843 (DTYPE_SEQUENTIAL | DPQ_POSSIBLE)) { 844 ST_DEBUG6(devi, st_label, SCSI_DEBUG, 845 "probe exists\n"); 846 rval = DDI_PROBE_SUCCESS; 847 } else { 848 rval = DDI_PROBE_FAILURE; 849 } 850 } else { 851 ST_DEBUG6(devi, st_label, SCSI_DEBUG, 852 "probe failure: nothing there\n"); 853 rval = DDI_PROBE_FAILURE; 854 } 855 scsi_unprobe(devp); 856 return (rval); 857 } 858 859 static int 860 st_attach(dev_info_t *devi, ddi_attach_cmd_t cmd) 861 { 862 int instance; 863 int wide; 864 int dev_instance; 865 int ret_status; 866 struct scsi_device *devp; 867 int node_ix; 868 struct scsi_tape *un; 869 870 ST_ENTR(devi, st_attach); 871 872 devp = ddi_get_driver_private(devi); 873 instance = ddi_get_instance(devi); 874 875 switch (cmd) { 876 case DDI_ATTACH: 877 if (ddi_getprop(DDI_DEV_T_ANY, devi, DDI_PROP_DONTPASS, 878 "tape-command-recovery-disable", 0) != 0) { 879 st_recov_sz = sizeof (pkt_info); 880 } 881 if (st_doattach(devp, SLEEP_FUNC) == DDI_FAILURE) { 882 return (DDI_FAILURE); 883 } 884 break; 885 case DDI_RESUME: 886 /* 887 * Suspend/Resume 888 * 889 * When the driver suspended, there might be 890 * outstanding cmds and therefore we need to 891 * reset the suspended flag and resume the scsi 892 * watch thread and restart commands and timeouts 893 */ 894 895 if (!(un = ddi_get_soft_state(st_state, instance))) { 896 return (DDI_FAILURE); 897 } 898 dev_instance = ((un->un_dev == 0) ? MTMINOR(instance) : 899 un->un_dev); 900 901 mutex_enter(ST_MUTEX); 902 903 un->un_throttle = un->un_max_throttle; 904 un->un_tids_at_suspend = 0; 905 un->un_pwr_mgmt = ST_PWR_NORMAL; 906 907 if (un->un_swr_token) { 908 scsi_watch_resume(un->un_swr_token); 909 } 910 911 /* 912 * Restart timeouts 913 */ 914 if ((un->un_tids_at_suspend & ST_DELAY_TID) != 0) { 915 mutex_exit(ST_MUTEX); 916 un->un_delay_tid = timeout( 917 st_delayed_cv_broadcast, un, 918 drv_usectohz((clock_t) 919 MEDIA_ACCESS_DELAY)); 920 mutex_enter(ST_MUTEX); 921 } 922 923 if (un->un_tids_at_suspend & ST_HIB_TID) { 924 mutex_exit(ST_MUTEX); 925 un->un_hib_tid = timeout(st_intr_restart, un, 926 ST_STATUS_BUSY_TIMEOUT); 927 mutex_enter(ST_MUTEX); 928 } 929 930 ret_status = st_clear_unit_attentions(dev_instance, 5); 931 932 /* 933 * now check if we need to restore the tape position 934 */ 935 if ((un->un_suspend_pos.pmode != invalid) && 936 ((un->un_suspend_pos.fileno > 0) || 937 (un->un_suspend_pos.blkno > 0)) || 938 (un->un_suspend_pos.lgclblkno > 0)) { 939 if (ret_status != 0) { 940 /* 941 * tape didn't get good TUR 942 * just print out error messages 943 */ 944 scsi_log(ST_DEVINFO, st_label, CE_WARN, 945 "st_attach-RESUME: tape failure " 946 " tape position will be lost"); 947 } else { 948 /* this prints errors */ 949 (void) st_validate_tapemarks(un, 950 st_uscsi_cmd, &un->un_suspend_pos); 951 } 952 /* 953 * there are no retries, if there is an error 954 * we don't know if the tape has changed 955 */ 956 un->un_suspend_pos.pmode = invalid; 957 } 958 959 /* now we are ready to start up any queued I/Os */ 960 if (un->un_ncmds || un->un_quef) { 961 st_start(un); 962 } 963 964 cv_broadcast(&un->un_suspend_cv); 965 mutex_exit(ST_MUTEX); 966 return (DDI_SUCCESS); 967 968 default: 969 return (DDI_FAILURE); 970 } 971 972 un = ddi_get_soft_state(st_state, instance); 973 974 ST_DEBUG(devi, st_label, SCSI_DEBUG, 975 "st_attach: instance=%x\n", instance); 976 977 /* 978 * Add a zero-length attribute to tell the world we support 979 * kernel ioctls (for layered drivers) 980 */ 981 (void) ddi_prop_create(DDI_DEV_T_NONE, devi, DDI_PROP_CANSLEEP, 982 DDI_KERNEL_IOCTL, NULL, 0); 983 984 ddi_report_dev((dev_info_t *)devi); 985 986 /* 987 * If it's a SCSI-2 tape drive which supports wide, 988 * tell the host adapter to use wide. 989 */ 990 wide = ((devp->sd_inq->inq_rdf == RDF_SCSI2) && 991 (devp->sd_inq->inq_wbus16 || devp->sd_inq->inq_wbus32)) ? 1 : 0; 992 993 if (scsi_ifsetcap(ROUTE, "wide-xfer", wide, 1) == 1) { 994 ST_DEBUG(devi, st_label, SCSI_DEBUG, 995 "Wide Transfer %s\n", wide ? "enabled" : "disabled"); 996 } 997 998 /* 999 * enable autorequest sense; keep the rq packet around in case 1000 * the autorequest sense fails because of a busy condition 1001 * do a getcap first in case the capability is not variable 1002 */ 1003 if (scsi_ifgetcap(ROUTE, "auto-rqsense", 1) == 1) { 1004 un->un_arq_enabled = 1; 1005 } else { 1006 un->un_arq_enabled = 1007 ((scsi_ifsetcap(ROUTE, "auto-rqsense", 1, 1) == 1) ? 1 : 0); 1008 } 1009 1010 ST_DEBUG(devi, st_label, SCSI_DEBUG, "auto request sense %s\n", 1011 (un->un_arq_enabled ? "enabled" : "disabled")); 1012 1013 un->un_untagged_qing = 1014 (scsi_ifgetcap(ROUTE, "untagged-qing", 0) == 1); 1015 1016 /* 1017 * XXX - This is just for 2.6. to tell users that write buffering 1018 * has gone away. 1019 */ 1020 if (un->un_arq_enabled && un->un_untagged_qing) { 1021 if (ddi_getprop(DDI_DEV_T_ANY, devi, DDI_PROP_DONTPASS, 1022 "tape-driver-buffering", 0) != 0) { 1023 scsi_log(ST_DEVINFO, st_label, CE_NOTE, 1024 "Write Data Buffering has been depricated. Your " 1025 "applications should continue to work normally.\n" 1026 " But, they should ported to use Asynchronous " 1027 " I/O\n" 1028 " For more information, read about " 1029 " tape-driver-buffering " 1030 "property in the st(7d) man page\n"); 1031 } 1032 } 1033 1034 un->un_max_throttle = un->un_throttle = un->un_last_throttle = 1; 1035 un->un_flush_on_errors = 0; 1036 un->un_mkr_pkt = (struct scsi_pkt *)NULL; 1037 1038 ST_DEBUG(devi, st_label, SCSI_DEBUG, 1039 "throttle=%x, max_throttle = %x\n", 1040 un->un_throttle, un->un_max_throttle); 1041 1042 /* initialize persistent errors to nil */ 1043 un->un_persistence = 0; 1044 un->un_persist_errors = 0; 1045 1046 /* 1047 * Get dma-max from HBA driver. If it is not defined, use 64k 1048 */ 1049 un->un_maxdma = scsi_ifgetcap(&devp->sd_address, "dma-max", 1); 1050 if (un->un_maxdma == -1) { 1051 ST_DEBUG(devi, st_label, SCSI_DEBUG, 1052 "Received a value that looked like -1. Using 64k maxdma"); 1053 un->un_maxdma = (64 * ONE_K); 1054 } 1055 1056 #ifdef __x86 1057 /* 1058 * for x86, the device may be able to DMA more than the system will 1059 * allow under some circumstances. We need account for both the HBA's 1060 * and system's contraints. 1061 * 1062 * Get the maximum DMA under worse case conditions. e.g. looking at the 1063 * device constraints, the max copy buffer size, and the worse case 1064 * fragmentation. NOTE: this may differ from dma-max since dma-max 1065 * doesn't take the worse case framentation into account. 1066 * 1067 * e.g. a device may be able to DMA 16MBytes, but can only DMA 1MByte 1068 * if none of the pages are contiguous. Keeping track of both of these 1069 * values allows us to support larger tape block sizes on some devices. 1070 */ 1071 un->un_maxdma_arch = scsi_ifgetcap(&devp->sd_address, "dma-max-arch", 1072 1); 1073 1074 /* 1075 * If the dma-max-arch capability is not implemented, or the value 1076 * comes back higher than what was reported in dma-max, use dma-max. 1077 */ 1078 if ((un->un_maxdma_arch == -1) || 1079 ((uint_t)un->un_maxdma < (uint_t)un->un_maxdma_arch)) { 1080 un->un_maxdma_arch = un->un_maxdma; 1081 } 1082 #endif 1083 1084 /* 1085 * Get the max allowable cdb size 1086 */ 1087 un->un_max_cdb_sz = 1088 scsi_ifgetcap(&devp->sd_address, "max-cdb-length", 1); 1089 if (un->un_max_cdb_sz < CDB_GROUP0) { 1090 ST_DEBUG(devi, st_label, SCSI_DEBUG, 1091 "HBA reported max-cdb-length as %d\n", un->un_max_cdb_sz); 1092 un->un_max_cdb_sz = CDB_GROUP4; /* optimistic default */ 1093 } 1094 1095 if (strcmp(ddi_driver_name(ddi_get_parent(ST_DEVINFO)), "scsi_vhci")) { 1096 un->un_multipath = 0; 1097 } else { 1098 un->un_multipath = 1; 1099 } 1100 1101 un->un_maxbsize = MAXBSIZE_UNKNOWN; 1102 1103 un->un_mediastate = MTIO_NONE; 1104 un->un_HeadClean = TAPE_ALERT_SUPPORT_UNKNOWN; 1105 1106 /* 1107 * initialize kstats 1108 */ 1109 un->un_stats = kstat_create("st", instance, NULL, "tape", 1110 KSTAT_TYPE_IO, 1, KSTAT_FLAG_PERSISTENT); 1111 if (un->un_stats) { 1112 un->un_stats->ks_lock = ST_MUTEX; 1113 kstat_install(un->un_stats); 1114 } 1115 (void) st_create_errstats(un, instance); 1116 1117 /* 1118 * find the drive type for this target 1119 */ 1120 mutex_enter(ST_MUTEX); 1121 un->un_dev = MTMINOR(instance); 1122 st_known_tape_type(un); 1123 un->un_dev = 0; 1124 mutex_exit(ST_MUTEX); 1125 1126 for (node_ix = 0; node_ix < ST_NUM_MEMBERS(st_minor_data); node_ix++) { 1127 int minor; 1128 char *name; 1129 1130 name = st_minor_data[node_ix].name; 1131 minor = st_minor_data[node_ix].minor; 1132 1133 /* 1134 * For default devices set the density to the 1135 * preferred default density for this device. 1136 */ 1137 if (node_ix <= DEF_BSD_NR) { 1138 minor |= un->un_dp->default_density; 1139 } 1140 minor |= MTMINOR(instance); 1141 1142 if (ddi_create_minor_node(devi, name, S_IFCHR, minor, 1143 DDI_NT_TAPE, NULL) == DDI_SUCCESS) { 1144 continue; 1145 } 1146 1147 ddi_remove_minor_node(devi, NULL); 1148 1149 (void) scsi_reset_notify(ROUTE, SCSI_RESET_CANCEL, 1150 st_reset_notification, (caddr_t)un); 1151 cv_destroy(&un->un_clscv); 1152 cv_destroy(&un->un_sbuf_cv); 1153 cv_destroy(&un->un_queue_cv); 1154 cv_destroy(&un->un_state_cv); 1155 #ifdef __x86 1156 cv_destroy(&un->un_contig_mem_cv); 1157 #endif 1158 cv_destroy(&un->un_suspend_cv); 1159 cv_destroy(&un->un_tape_busy_cv); 1160 cv_destroy(&un->un_recov_buf_cv); 1161 if (un->un_recov_taskq) { 1162 ddi_taskq_destroy(un->un_recov_taskq); 1163 } 1164 if (un->un_sbufp) { 1165 freerbuf(un->un_sbufp); 1166 } 1167 if (un->un_recov_buf) { 1168 freerbuf(un->un_recov_buf); 1169 } 1170 if (un->un_uscsi_rqs_buf) { 1171 kmem_free(un->un_uscsi_rqs_buf, SENSE_LENGTH); 1172 } 1173 if (un->un_mspl) { 1174 i_ddi_mem_free((caddr_t)un->un_mspl, NULL); 1175 } 1176 if (un->un_dp_size) { 1177 kmem_free(un->un_dp, un->un_dp_size); 1178 } 1179 if (un->un_state) { 1180 kstat_delete(un->un_stats); 1181 } 1182 if (un->un_errstats) { 1183 kstat_delete(un->un_errstats); 1184 } 1185 1186 scsi_destroy_pkt(un->un_rqs); 1187 scsi_free_consistent_buf(un->un_rqs_bp); 1188 ddi_soft_state_free(st_state, instance); 1189 devp->sd_private = NULL; 1190 devp->sd_sense = NULL; 1191 1192 ddi_prop_remove_all(devi); 1193 return (DDI_FAILURE); 1194 } 1195 1196 return (DDI_SUCCESS); 1197 } 1198 1199 /* 1200 * st_detach: 1201 * 1202 * we allow a detach if and only if: 1203 * - no tape is currently inserted 1204 * - tape position is at BOT or unknown 1205 * (if it is not at BOT then a no rewind 1206 * device was opened and we have to preserve state) 1207 * - it must be in a closed state : no timeouts or scsi_watch requests 1208 * will exist if it is closed, so we don't need to check for 1209 * them here. 1210 */ 1211 /*ARGSUSED*/ 1212 static int 1213 st_detach(dev_info_t *devi, ddi_detach_cmd_t cmd) 1214 { 1215 int instance; 1216 int result; 1217 struct scsi_device *devp; 1218 struct scsi_tape *un; 1219 clock_t wait_cmds_complete; 1220 1221 ST_ENTR(devi, st_detach); 1222 1223 instance = ddi_get_instance(devi); 1224 1225 if (!(un = ddi_get_soft_state(st_state, instance))) { 1226 return (DDI_FAILURE); 1227 } 1228 1229 mutex_enter(ST_MUTEX); 1230 1231 /* 1232 * Clear error entry stack 1233 */ 1234 st_empty_error_stack(un); 1235 1236 mutex_exit(ST_MUTEX); 1237 1238 switch (cmd) { 1239 1240 case DDI_DETACH: 1241 /* 1242 * Undo what we did in st_attach & st_doattach, 1243 * freeing resources and removing things we installed. 1244 * The system framework guarantees we are not active 1245 * with this devinfo node in any other entry points at 1246 * this time. 1247 */ 1248 1249 ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG, 1250 "st_detach: instance=%x, un=%p\n", instance, 1251 (void *)un); 1252 1253 if (((un->un_dp->options & ST_UNLOADABLE) == 0) || 1254 ((un->un_rsvd_status & ST_APPLICATION_RESERVATIONS) != 0) || 1255 (un->un_ncmds != 0) || (un->un_quef != NULL) || 1256 (un->un_state != ST_STATE_CLOSED)) { 1257 /* 1258 * we cannot unload some targets because the 1259 * inquiry returns junk unless immediately 1260 * after a reset 1261 */ 1262 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 1263 "cannot unload instance %x\n", instance); 1264 un->un_unit_attention_flags |= 4; 1265 return (DDI_FAILURE); 1266 } 1267 1268 /* 1269 * if the tape has been removed then we may unload; 1270 * do a test unit ready and if it returns NOT READY 1271 * then we assume that it is safe to unload. 1272 * as a side effect, pmode may be set to invalid if the 1273 * the test unit ready fails; 1274 * also un_state may be set to non-closed, so reset it 1275 */ 1276 if ((un->un_dev) && /* Been opened since attach */ 1277 ((un->un_pos.pmode == legacy) && 1278 (un->un_pos.fileno > 0) || /* Known position not rewound */ 1279 (un->un_pos.blkno != 0)) || /* Or within first file */ 1280 ((un->un_pos.pmode == logical) && 1281 (un->un_pos.lgclblkno > 0))) { 1282 mutex_enter(ST_MUTEX); 1283 /* 1284 * Send Test Unit Ready in the hopes that if 1285 * the drive is not in the state we think it is. 1286 * And the state will be changed so it can be detached. 1287 * If the command fails to reach the device and 1288 * the drive was not rewound or unloaded we want 1289 * to fail the detach till a user command fails 1290 * where after the detach will succead. 1291 */ 1292 result = st_cmd(un, SCMD_TEST_UNIT_READY, 0, SYNC_CMD); 1293 /* 1294 * After TUR un_state may be set to non-closed, 1295 * so reset it back. 1296 */ 1297 un->un_state = ST_STATE_CLOSED; 1298 mutex_exit(ST_MUTEX); 1299 } 1300 ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG, 1301 "un_status=%x, fileno=%x, blkno=%x\n", 1302 un->un_status, un->un_pos.fileno, un->un_pos.blkno); 1303 1304 /* 1305 * check again: 1306 * if we are not at BOT then it is not safe to unload 1307 */ 1308 if ((un->un_dev) && /* Been opened since attach */ 1309 (result != EACCES) && /* drive is use by somebody */ 1310 (((un->un_pos.pmode == legacy) && 1311 (un->un_pos.fileno > 0) || /* Known position not rewound */ 1312 (un->un_pos.blkno != 0)) || /* Or within first file */ 1313 ((un->un_pos.pmode == logical) && 1314 (un->un_pos.lgclblkno > 0)))) { 1315 1316 ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG, 1317 "cannot detach: pmode=%d fileno=0x%x, blkno=0x%x" 1318 " lgclblkno=0x%"PRIx64"\n", un->un_pos.pmode, 1319 un->un_pos.fileno, un->un_pos.blkno, 1320 un->un_pos.lgclblkno); 1321 un->un_unit_attention_flags |= 4; 1322 return (DDI_FAILURE); 1323 } 1324 1325 /* 1326 * Just To make sure that we have released the 1327 * tape unit . 1328 */ 1329 if (un->un_dev && (un->un_rsvd_status & ST_RESERVE) && 1330 !DEVI_IS_DEVICE_REMOVED(devi)) { 1331 mutex_enter(ST_MUTEX); 1332 (void) st_reserve_release(un, ST_RELEASE, st_uscsi_cmd); 1333 mutex_exit(ST_MUTEX); 1334 } 1335 1336 /* 1337 * now remove other data structures allocated in st_doattach() 1338 */ 1339 ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG, 1340 "destroying/freeing\n"); 1341 1342 (void) scsi_reset_notify(ROUTE, SCSI_RESET_CANCEL, 1343 st_reset_notification, (caddr_t)un); 1344 cv_destroy(&un->un_clscv); 1345 cv_destroy(&un->un_sbuf_cv); 1346 cv_destroy(&un->un_queue_cv); 1347 cv_destroy(&un->un_suspend_cv); 1348 cv_destroy(&un->un_tape_busy_cv); 1349 cv_destroy(&un->un_recov_buf_cv); 1350 1351 if (un->un_recov_taskq) { 1352 ddi_taskq_destroy(un->un_recov_taskq); 1353 } 1354 1355 if (un->un_hib_tid) { 1356 (void) untimeout(un->un_hib_tid); 1357 un->un_hib_tid = 0; 1358 } 1359 1360 if (un->un_delay_tid) { 1361 (void) untimeout(un->un_delay_tid); 1362 un->un_delay_tid = 0; 1363 } 1364 cv_destroy(&un->un_state_cv); 1365 1366 #ifdef __x86 1367 cv_destroy(&un->un_contig_mem_cv); 1368 1369 if (un->un_contig_mem_hdl != NULL) { 1370 ddi_dma_free_handle(&un->un_contig_mem_hdl); 1371 } 1372 #endif 1373 if (un->un_sbufp) { 1374 freerbuf(un->un_sbufp); 1375 } 1376 if (un->un_recov_buf) { 1377 freerbuf(un->un_recov_buf); 1378 } 1379 if (un->un_uscsi_rqs_buf) { 1380 kmem_free(un->un_uscsi_rqs_buf, SENSE_LENGTH); 1381 } 1382 if (un->un_mspl) { 1383 i_ddi_mem_free((caddr_t)un->un_mspl, NULL); 1384 } 1385 if (un->un_rqs) { 1386 scsi_destroy_pkt(un->un_rqs); 1387 scsi_free_consistent_buf(un->un_rqs_bp); 1388 } 1389 if (un->un_mkr_pkt) { 1390 scsi_destroy_pkt(un->un_mkr_pkt); 1391 } 1392 if (un->un_arq_enabled) { 1393 (void) scsi_ifsetcap(ROUTE, "auto-rqsense", 0, 1); 1394 } 1395 if (un->un_dp_size) { 1396 kmem_free(un->un_dp, un->un_dp_size); 1397 } 1398 if (un->un_stats) { 1399 kstat_delete(un->un_stats); 1400 un->un_stats = (kstat_t *)0; 1401 } 1402 if (un->un_errstats) { 1403 kstat_delete(un->un_errstats); 1404 un->un_errstats = (kstat_t *)0; 1405 } 1406 if (un->un_media_id_len) { 1407 kmem_free(un->un_media_id, un->un_media_id_len); 1408 } 1409 devp = ST_SCSI_DEVP; 1410 ddi_soft_state_free(st_state, instance); 1411 devp->sd_private = NULL; 1412 devp->sd_sense = NULL; 1413 scsi_unprobe(devp); 1414 ddi_prop_remove_all(devi); 1415 ddi_remove_minor_node(devi, NULL); 1416 ST_DEBUG(0, st_label, SCSI_DEBUG, "st_detach done\n"); 1417 return (DDI_SUCCESS); 1418 1419 case DDI_SUSPEND: 1420 1421 /* 1422 * Suspend/Resume 1423 * 1424 * To process DDI_SUSPEND, we must do the following: 1425 * 1426 * - check ddi_removing_power to see if power will be turned 1427 * off. if so, return DDI_FAILURE 1428 * - check if we are already suspended, 1429 * if so, return DDI_FAILURE 1430 * - check if device state is CLOSED, 1431 * if not, return DDI_FAILURE. 1432 * - wait until outstanding operations complete 1433 * - save tape state 1434 * - block new operations 1435 * - cancel pending timeouts 1436 * 1437 */ 1438 1439 if (ddi_removing_power(devi)) { 1440 return (DDI_FAILURE); 1441 } 1442 mutex_enter(ST_MUTEX); 1443 1444 /* 1445 * Shouldn't already be suspended, if so return failure 1446 */ 1447 if (un->un_pwr_mgmt == ST_PWR_SUSPENDED) { 1448 mutex_exit(ST_MUTEX); 1449 return (DDI_FAILURE); 1450 } 1451 if (un->un_state != ST_STATE_CLOSED) { 1452 mutex_exit(ST_MUTEX); 1453 return (DDI_FAILURE); 1454 } 1455 1456 /* 1457 * Wait for all outstanding I/O's to complete 1458 * 1459 * we wait on both ncmds and the wait queue for times 1460 * when we are flushing after persistent errors are 1461 * flagged, which is when ncmds can be 0, and the 1462 * queue can still have I/O's. This way we preserve 1463 * order of biodone's. 1464 */ 1465 wait_cmds_complete = ddi_get_lbolt(); 1466 wait_cmds_complete += 1467 st_wait_cmds_complete * drv_usectohz(1000000); 1468 while (un->un_ncmds || un->un_quef || 1469 (un->un_state == ST_STATE_RESOURCE_WAIT)) { 1470 1471 if (cv_timedwait(&un->un_tape_busy_cv, ST_MUTEX, 1472 wait_cmds_complete) == -1) { 1473 /* 1474 * Time expired then cancel the command 1475 */ 1476 if (st_reset(un, RESET_LUN) == 0) { 1477 if (un->un_last_throttle) { 1478 un->un_throttle = 1479 un->un_last_throttle; 1480 } 1481 mutex_exit(ST_MUTEX); 1482 return (DDI_FAILURE); 1483 } else { 1484 break; 1485 } 1486 } 1487 } 1488 1489 /* 1490 * DDI_SUSPEND says that the system "may" power down, we 1491 * remember the file and block number before rewinding. 1492 * we also need to save state before issuing 1493 * any WRITE_FILE_MARK command. 1494 */ 1495 (void) st_update_block_pos(un, st_cmd, 0); 1496 COPY_POS(&un->un_suspend_pos, &un->un_pos); 1497 1498 1499 /* 1500 * Issue a zero write file fmk command to tell the drive to 1501 * flush any buffered tape marks 1502 */ 1503 (void) st_cmd(un, SCMD_WRITE_FILE_MARK, 0, SYNC_CMD); 1504 1505 /* 1506 * Because not all tape drives correctly implement buffer 1507 * flushing with the zero write file fmk command, issue a 1508 * synchronous rewind command to force data flushing. 1509 * st_validate_tapemarks() will do a rewind during DDI_RESUME 1510 * anyway. 1511 */ 1512 (void) st_cmd(un, SCMD_REWIND, 0, SYNC_CMD); 1513 1514 /* stop any new operations */ 1515 un->un_pwr_mgmt = ST_PWR_SUSPENDED; 1516 un->un_throttle = 0; 1517 1518 /* 1519 * cancel any outstanding timeouts 1520 */ 1521 if (un->un_delay_tid) { 1522 timeout_id_t temp_id = un->un_delay_tid; 1523 un->un_delay_tid = 0; 1524 un->un_tids_at_suspend |= ST_DELAY_TID; 1525 mutex_exit(ST_MUTEX); 1526 (void) untimeout(temp_id); 1527 mutex_enter(ST_MUTEX); 1528 } 1529 1530 if (un->un_hib_tid) { 1531 timeout_id_t temp_id = un->un_hib_tid; 1532 un->un_hib_tid = 0; 1533 un->un_tids_at_suspend |= ST_HIB_TID; 1534 mutex_exit(ST_MUTEX); 1535 (void) untimeout(temp_id); 1536 mutex_enter(ST_MUTEX); 1537 } 1538 1539 /* 1540 * Suspend the scsi_watch_thread 1541 */ 1542 if (un->un_swr_token) { 1543 opaque_t temp_token = un->un_swr_token; 1544 mutex_exit(ST_MUTEX); 1545 scsi_watch_suspend(temp_token); 1546 } else { 1547 mutex_exit(ST_MUTEX); 1548 } 1549 1550 return (DDI_SUCCESS); 1551 1552 default: 1553 ST_DEBUG(0, st_label, SCSI_DEBUG, "st_detach failed\n"); 1554 return (DDI_FAILURE); 1555 } 1556 } 1557 1558 1559 /* ARGSUSED */ 1560 static int 1561 st_info(dev_info_t *dip, ddi_info_cmd_t infocmd, void *arg, void **result) 1562 { 1563 dev_t dev; 1564 struct scsi_tape *un; 1565 int instance, error; 1566 1567 ST_ENTR(dip, st_info); 1568 1569 switch (infocmd) { 1570 case DDI_INFO_DEVT2DEVINFO: 1571 dev = (dev_t)arg; 1572 instance = MTUNIT(dev); 1573 if ((un = ddi_get_soft_state(st_state, instance)) == NULL) 1574 return (DDI_FAILURE); 1575 *result = (void *) ST_DEVINFO; 1576 error = DDI_SUCCESS; 1577 break; 1578 case DDI_INFO_DEVT2INSTANCE: 1579 dev = (dev_t)arg; 1580 instance = MTUNIT(dev); 1581 *result = (void *)(uintptr_t)instance; 1582 error = DDI_SUCCESS; 1583 break; 1584 default: 1585 error = DDI_FAILURE; 1586 } 1587 return (error); 1588 } 1589 1590 static int 1591 st_doattach(struct scsi_device *devp, int (*canwait)()) 1592 { 1593 struct scsi_tape *un = NULL; 1594 recov_info *ri; 1595 int km_flags = (canwait != NULL_FUNC) ? KM_SLEEP : KM_NOSLEEP; 1596 int instance; 1597 size_t rlen; 1598 1599 ST_FUNC(devp->sd_dev, st_doattach); 1600 /* 1601 * Call the routine scsi_probe to do some of the dirty work. 1602 * If the INQUIRY command succeeds, the field sd_inq in the 1603 * device structure will be filled in. 1604 */ 1605 ST_DEBUG(devp->sd_dev, st_label, SCSI_DEBUG, 1606 "st_doattach(): probing\n"); 1607 1608 if (scsi_probe(devp, canwait) == SCSIPROBE_EXISTS) { 1609 1610 /* 1611 * In checking the whole inq_dtype byte we are looking at both 1612 * the Peripheral Qualifier and the Peripheral Device Type. 1613 * For this driver we are only interested in sequential devices 1614 * that are connected or capable if connecting to this logical 1615 * unit. 1616 */ 1617 if (devp->sd_inq->inq_dtype == 1618 (DTYPE_SEQUENTIAL | DPQ_POSSIBLE)) { 1619 ST_DEBUG(devp->sd_dev, st_label, SCSI_DEBUG, 1620 "probe exists\n"); 1621 } else { 1622 /* Something there but not a tape device */ 1623 scsi_unprobe(devp); 1624 return (DDI_FAILURE); 1625 } 1626 } else { 1627 /* Nothing there */ 1628 ST_DEBUG(devp->sd_dev, st_label, SCSI_DEBUG, 1629 "probe failure: nothing there\n"); 1630 scsi_unprobe(devp); 1631 return (DDI_FAILURE); 1632 } 1633 1634 1635 /* 1636 * The actual unit is present. 1637 * Now is the time to fill in the rest of our info.. 1638 */ 1639 instance = ddi_get_instance(devp->sd_dev); 1640 1641 if (ddi_soft_state_zalloc(st_state, instance) != DDI_SUCCESS) { 1642 goto error; 1643 } 1644 un = ddi_get_soft_state(st_state, instance); 1645 1646 ASSERT(un != NULL); 1647 1648 un->un_rqs_bp = scsi_alloc_consistent_buf(&devp->sd_address, NULL, 1649 MAX_SENSE_LENGTH, B_READ, canwait, NULL); 1650 if (un->un_rqs_bp == NULL) { 1651 goto error; 1652 } 1653 un->un_rqs = scsi_init_pkt(&devp->sd_address, NULL, un->un_rqs_bp, 1654 CDB_GROUP0, 1, st_recov_sz, PKT_CONSISTENT, canwait, NULL); 1655 if (!un->un_rqs) { 1656 goto error; 1657 } 1658 ASSERT(un->un_rqs->pkt_resid == 0); 1659 devp->sd_sense = 1660 (struct scsi_extended_sense *)un->un_rqs_bp->b_un.b_addr; 1661 ASSERT(geterror(un->un_rqs_bp) == NULL); 1662 1663 (void) scsi_setup_cdb((union scsi_cdb *)un->un_rqs->pkt_cdbp, 1664 SCMD_REQUEST_SENSE, 0, MAX_SENSE_LENGTH, 0); 1665 FILL_SCSI1_LUN(devp, un->un_rqs); 1666 un->un_rqs->pkt_flags |= (FLAG_SENSING | FLAG_HEAD | FLAG_NODISCON); 1667 un->un_rqs->pkt_time = st_io_time; 1668 un->un_rqs->pkt_comp = st_intr; 1669 ri = (recov_info *)un->un_rqs->pkt_private; 1670 if (st_recov_sz == sizeof (recov_info)) { 1671 ri->privatelen = sizeof (recov_info); 1672 } else { 1673 ri->privatelen = sizeof (pkt_info); 1674 } 1675 1676 un->un_sbufp = getrbuf(km_flags); 1677 un->un_recov_buf = getrbuf(km_flags); 1678 1679 un->un_uscsi_rqs_buf = kmem_alloc(SENSE_LENGTH, KM_SLEEP); 1680 1681 /* 1682 * use i_ddi_mem_alloc() for now until we have an interface to allocate 1683 * memory for DMA which doesn't require a DMA handle. ddi_iopb_alloc() 1684 * is obsolete and we want more flexibility in controlling the DMA 1685 * address constraints. 1686 */ 1687 (void) i_ddi_mem_alloc(devp->sd_dev, &st_alloc_attr, 1688 sizeof (struct seq_mode), ((km_flags == KM_SLEEP) ? 1 : 0), 0, 1689 NULL, (caddr_t *)&un->un_mspl, &rlen, NULL); 1690 1691 (void) i_ddi_mem_alloc(devp->sd_dev, &st_alloc_attr, 1692 sizeof (read_pos_data_t), ((km_flags == KM_SLEEP) ? 1 : 0), 0, 1693 NULL, (caddr_t *)&un->un_read_pos_data, &rlen, NULL); 1694 1695 if (!un->un_sbufp || !un->un_mspl || !un->un_read_pos_data) { 1696 ST_DEBUG6(devp->sd_dev, st_label, SCSI_DEBUG, 1697 "probe partial failure: no space\n"); 1698 goto error; 1699 } 1700 1701 bzero(un->un_mspl, sizeof (struct seq_mode)); 1702 1703 cv_init(&un->un_sbuf_cv, NULL, CV_DRIVER, NULL); 1704 cv_init(&un->un_queue_cv, NULL, CV_DRIVER, NULL); 1705 cv_init(&un->un_clscv, NULL, CV_DRIVER, NULL); 1706 cv_init(&un->un_state_cv, NULL, CV_DRIVER, NULL); 1707 #ifdef __x86 1708 cv_init(&un->un_contig_mem_cv, NULL, CV_DRIVER, NULL); 1709 #endif 1710 1711 /* Initialize power managemnet condition variable */ 1712 cv_init(&un->un_suspend_cv, NULL, CV_DRIVER, NULL); 1713 cv_init(&un->un_tape_busy_cv, NULL, CV_DRIVER, NULL); 1714 cv_init(&un->un_recov_buf_cv, NULL, CV_DRIVER, NULL); 1715 1716 un->un_recov_taskq = ddi_taskq_create(devp->sd_dev, 1717 "un_recov_taskq", 1, TASKQ_DEFAULTPRI, km_flags); 1718 1719 ASSERT(un->un_recov_taskq != NULL); 1720 1721 un->un_pos.pmode = invalid; 1722 un->un_sd = devp; 1723 un->un_swr_token = (opaque_t)NULL; 1724 un->un_comp_page = ST_DEV_DATACOMP_PAGE | ST_DEV_CONFIG_PAGE; 1725 un->un_wormable = st_is_drive_worm; 1726 un->un_media_id_method = st_get_media_identification; 1727 /* 1728 * setting long a initial as it contains logical file info. 1729 * support for long format is mandatory but many drive don't do it. 1730 */ 1731 un->un_read_pos_type = LONG_POS; 1732 1733 un->un_suspend_pos.pmode = invalid; 1734 1735 st_add_recovery_info_to_pkt(un, un->un_rqs_bp, un->un_rqs); 1736 1737 #ifdef __x86 1738 if (ddi_dma_alloc_handle(ST_DEVINFO, &st_contig_mem_dma_attr, 1739 DDI_DMA_SLEEP, NULL, &un->un_contig_mem_hdl) != DDI_SUCCESS) { 1740 ST_DEBUG6(devp->sd_dev, st_label, SCSI_DEBUG, 1741 "allocation of contiguous memory dma handle failed!"); 1742 un->un_contig_mem_hdl = NULL; 1743 goto error; 1744 } 1745 #endif 1746 1747 /* 1748 * Since this driver manages devices with "remote" hardware, 1749 * i.e. the devices themselves have no "reg" properties, 1750 * the SUSPEND/RESUME commands in detach/attach will not be 1751 * called by the power management framework unless we request 1752 * it by creating a "pm-hardware-state" property and setting it 1753 * to value "needs-suspend-resume". 1754 */ 1755 if (ddi_prop_update_string(DDI_DEV_T_NONE, devp->sd_dev, 1756 "pm-hardware-state", "needs-suspend-resume") != 1757 DDI_PROP_SUCCESS) { 1758 1759 ST_DEBUG(devp->sd_dev, st_label, SCSI_DEBUG, 1760 "ddi_prop_update(\"pm-hardware-state\") failed\n"); 1761 goto error; 1762 } 1763 1764 if (ddi_prop_create(DDI_DEV_T_NONE, devp->sd_dev, DDI_PROP_CANSLEEP, 1765 "no-involuntary-power-cycles", NULL, 0) != DDI_PROP_SUCCESS) { 1766 1767 ST_DEBUG(devp->sd_dev, st_label, SCSI_DEBUG, 1768 "ddi_prop_create(\"no-involuntary-power-cycles\") " 1769 "failed\n"); 1770 goto error; 1771 } 1772 1773 (void) scsi_reset_notify(ROUTE, SCSI_RESET_NOTIFY, 1774 st_reset_notification, (caddr_t)un); 1775 1776 ST_DEBUG6(devp->sd_dev, st_label, SCSI_DEBUG, "attach success\n"); 1777 return (DDI_SUCCESS); 1778 1779 error: 1780 devp->sd_sense = NULL; 1781 1782 ddi_remove_minor_node(devp->sd_dev, NULL); 1783 if (un) { 1784 if (un->un_mspl) { 1785 i_ddi_mem_free((caddr_t)un->un_mspl, NULL); 1786 } 1787 if (un->un_read_pos_data) { 1788 i_ddi_mem_free((caddr_t)un->un_read_pos_data, 0); 1789 } 1790 if (un->un_sbufp) { 1791 freerbuf(un->un_sbufp); 1792 } 1793 if (un->un_recov_buf) { 1794 freerbuf(un->un_recov_buf); 1795 } 1796 if (un->un_uscsi_rqs_buf) { 1797 kmem_free(un->un_uscsi_rqs_buf, SENSE_LENGTH); 1798 } 1799 #ifdef __x86 1800 if (un->un_contig_mem_hdl != NULL) { 1801 ddi_dma_free_handle(&un->un_contig_mem_hdl); 1802 } 1803 #endif 1804 if (un->un_rqs) { 1805 scsi_destroy_pkt(un->un_rqs); 1806 } 1807 1808 if (un->un_rqs_bp) { 1809 scsi_free_consistent_buf(un->un_rqs_bp); 1810 } 1811 1812 ddi_soft_state_free(st_state, instance); 1813 devp->sd_private = NULL; 1814 } 1815 1816 if (devp->sd_inq) { 1817 scsi_unprobe(devp); 1818 } 1819 return (DDI_FAILURE); 1820 } 1821 1822 typedef int 1823 (*cfg_functp)(struct scsi_tape *, char *vidpid, struct st_drivetype *); 1824 1825 static cfg_functp config_functs[] = { 1826 st_get_conf_from_st_dot_conf, 1827 st_get_conf_from_st_conf_dot_c, 1828 st_get_conf_from_tape_drive, 1829 st_get_default_conf 1830 }; 1831 1832 1833 /* 1834 * determine tape type, using tape-config-list or built-in table or 1835 * use a generic tape config entry 1836 */ 1837 static void 1838 st_known_tape_type(struct scsi_tape *un) 1839 { 1840 struct st_drivetype *dp; 1841 cfg_functp *config_funct; 1842 uchar_t reserved; 1843 1844 ST_FUNC(ST_DEVINFO, st_known_tape_type); 1845 1846 reserved = (un->un_rsvd_status & ST_RESERVE) ? ST_RESERVE 1847 : ST_RELEASE; 1848 1849 /* 1850 * XXX: Emulex MT-02 (and emulators) predates SCSI-1 and has 1851 * no vid & pid inquiry data. So, we provide one. 1852 */ 1853 if (ST_INQUIRY->inq_len == 0 || 1854 (bcmp("\0\0\0\0\0\0\0\0", ST_INQUIRY->inq_vid, 8) == 0)) { 1855 (void) strcpy((char *)ST_INQUIRY->inq_vid, ST_MT02_NAME); 1856 } 1857 1858 if (un->un_dp_size == 0) { 1859 un->un_dp_size = sizeof (struct st_drivetype); 1860 dp = kmem_zalloc((size_t)un->un_dp_size, KM_SLEEP); 1861 un->un_dp = dp; 1862 } else { 1863 dp = un->un_dp; 1864 } 1865 1866 un->un_dp->non_motion_timeout = st_io_time; 1867 /* 1868 * Loop through the configuration methods till one works. 1869 */ 1870 for (config_funct = &config_functs[0]; ; config_funct++) { 1871 if ((*config_funct)(un, ST_INQUIRY->inq_vid, dp)) { 1872 break; 1873 } 1874 } 1875 1876 /* 1877 * If we didn't just make up this configuration and 1878 * all the density codes are the same.. 1879 * Set Auto Density over ride. 1880 */ 1881 if (*config_funct != st_get_default_conf) { 1882 /* 1883 * If this device is one that is configured and all 1884 * densities are the same, This saves doing gets and set 1885 * that yield nothing. 1886 */ 1887 if ((dp->densities[0]) == (dp->densities[1]) && 1888 (dp->densities[0]) == (dp->densities[2]) && 1889 (dp->densities[0]) == (dp->densities[3])) { 1890 1891 dp->options |= ST_AUTODEN_OVERRIDE; 1892 } 1893 } 1894 1895 1896 /* 1897 * Store tape drive characteristics. 1898 */ 1899 un->un_status = 0; 1900 un->un_attached = 1; 1901 un->un_init_options = dp->options; 1902 1903 /* setup operation time-outs based on options */ 1904 st_calculate_timeouts(un); 1905 1906 /* make sure if we are supposed to be variable, make it variable */ 1907 if (dp->options & ST_VARIABLE) { 1908 dp->bsize = 0; 1909 } 1910 1911 if (reserved != ((un->un_rsvd_status & ST_RESERVE) ? ST_RESERVE 1912 : ST_RELEASE)) { 1913 (void) st_reserve_release(un, reserved, st_uscsi_cmd); 1914 } 1915 1916 un->un_unit_attention_flags |= 1; 1917 1918 scsi_log(ST_DEVINFO, st_label, CE_NOTE, "?<%s>\n", dp->name); 1919 1920 } 1921 1922 1923 typedef struct { 1924 int mask; 1925 int bottom; 1926 int top; 1927 char *name; 1928 } conf_limit; 1929 1930 static const conf_limit conf_limits[] = { 1931 1932 -1, 1, 2, "conf version", 1933 -1, MT_ISTS, ST_LAST_TYPE, "drive type", 1934 -1, 0, 0xffffff, "block size", 1935 ST_VALID_OPTS, 0, ST_VALID_OPTS, "options", 1936 -1, 0, 4, "number of densities", 1937 -1, 0, UINT8_MAX, "density code", 1938 -1, 0, 3, "default density", 1939 -1, 0, UINT16_MAX, "non motion timeout", 1940 -1, 0, UINT16_MAX, "I/O timeout", 1941 -1, 0, UINT16_MAX, "space timeout", 1942 -1, 0, UINT16_MAX, "load timeout", 1943 -1, 0, UINT16_MAX, "unload timeout", 1944 -1, 0, UINT16_MAX, "erase timeout", 1945 0, 0, 0, NULL 1946 }; 1947 1948 static int 1949 st_validate_conf_data(struct scsi_tape *un, int *list, int list_len, 1950 const char *conf_name) 1951 { 1952 int dens; 1953 int ndens; 1954 int value; 1955 int type; 1956 int count; 1957 const conf_limit *limit = &conf_limits[0]; 1958 1959 ST_FUNC(ST_DEVINFO, st_validate_conf_data); 1960 1961 ST_DEBUG3(ST_DEVINFO, st_label, CE_NOTE, 1962 "Checking %d entrys total with %d densities\n", list_len, list[4]); 1963 1964 count = list_len; 1965 type = *list; 1966 for (; count && limit->name; count--, list++, limit++) { 1967 1968 value = *list; 1969 if (value & ~limit->mask) { 1970 scsi_log(ST_DEVINFO, st_label, CE_NOTE, 1971 "%s %s value invalid bits set: 0x%X\n", 1972 conf_name, limit->name, value & ~limit->mask); 1973 *list &= limit->mask; 1974 } else if (value < limit->bottom) { 1975 scsi_log(ST_DEVINFO, st_label, CE_NOTE, 1976 "%s %s value too low: value = %d limit %d\n", 1977 conf_name, limit->name, value, limit->bottom); 1978 } else if (value > limit->top) { 1979 scsi_log(ST_DEVINFO, st_label, CE_NOTE, 1980 "%s %s value too high: value = %d limit %d\n", 1981 conf_name, limit->name, value, limit->top); 1982 } else { 1983 ST_DEBUG3(ST_DEVINFO, st_label, CE_CONT, 1984 "%s %s value = 0x%X\n", 1985 conf_name, limit->name, value); 1986 } 1987 1988 /* If not the number of densities continue */ 1989 if (limit != &conf_limits[4]) { 1990 continue; 1991 } 1992 1993 /* If number of densities is not in range can't use config */ 1994 if (value < limit->bottom || value > limit->top) { 1995 return (-1); 1996 } 1997 1998 ndens = min(value, NDENSITIES); 1999 if ((type == 1) && (list_len - ndens) != 6) { 2000 scsi_log(ST_DEVINFO, st_label, CE_NOTE, 2001 "%s conf version 1 with %d densities has %d items" 2002 " should have %d", 2003 conf_name, ndens, list_len, 6 + ndens); 2004 } else if ((type == 2) && (list_len - ndens) != 13) { 2005 scsi_log(ST_DEVINFO, st_label, CE_NOTE, 2006 "%s conf version 2 with %d densities has %d items" 2007 " should have %d", 2008 conf_name, ndens, list_len, 13 + ndens); 2009 } 2010 2011 limit++; 2012 for (dens = 0; dens < ndens && count; dens++) { 2013 count--; 2014 list++; 2015 value = *list; 2016 if (value < limit->bottom) { 2017 scsi_log(ST_DEVINFO, st_label, CE_NOTE, 2018 "%s density[%d] value too low: value =" 2019 " 0x%X limit 0x%X\n", 2020 conf_name, dens, value, limit->bottom); 2021 } else if (value > limit->top) { 2022 scsi_log(ST_DEVINFO, st_label, CE_NOTE, 2023 "%s density[%d] value too high: value =" 2024 " 0x%X limit 0x%X\n", 2025 conf_name, dens, value, limit->top); 2026 } else { 2027 ST_DEBUG3(ST_DEVINFO, st_label, CE_CONT, 2028 "%s density[%d] value = 0x%X\n", 2029 conf_name, dens, value); 2030 } 2031 } 2032 } 2033 2034 return (0); 2035 } 2036 2037 static int 2038 st_get_conf_from_st_dot_conf(struct scsi_tape *un, char *vidpid, 2039 struct st_drivetype *dp) 2040 { 2041 caddr_t config_list = NULL; 2042 caddr_t data_list = NULL; 2043 int *data_ptr; 2044 caddr_t vidptr, prettyptr, datanameptr; 2045 size_t vidlen, prettylen, datanamelen, tripletlen = 0; 2046 int config_list_len, data_list_len, len, i; 2047 int version; 2048 int found = 0; 2049 2050 ST_FUNC(ST_DEVINFO, st_get_conf_from_st_dot_conf); 2051 2052 /* 2053 * Determine type of tape controller. Type is determined by 2054 * checking the vendor ids of the earlier inquiry command and 2055 * comparing those with vids in tape-config-list defined in st.conf 2056 */ 2057 if (ddi_getlongprop(DDI_DEV_T_ANY, ST_DEVINFO, DDI_PROP_DONTPASS, 2058 "tape-config-list", (caddr_t)&config_list, &config_list_len) 2059 != DDI_PROP_SUCCESS) { 2060 return (found); 2061 } 2062 2063 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 2064 "st_get_conf_from_st_dot_conf(): st.conf has tape-config-list\n"); 2065 2066 /* 2067 * Compare vids in each triplet - if it matches, get value for 2068 * data_name and contruct a st_drivetype struct 2069 * tripletlen is not set yet! 2070 */ 2071 for (len = config_list_len, vidptr = config_list; 2072 len > 0; 2073 vidptr += tripletlen, len -= tripletlen) { 2074 2075 vidlen = strlen(vidptr); 2076 prettyptr = vidptr + vidlen + 1; 2077 prettylen = strlen(prettyptr); 2078 datanameptr = prettyptr + prettylen + 1; 2079 datanamelen = strlen(datanameptr); 2080 tripletlen = vidlen + prettylen + datanamelen + 3; 2081 2082 if (vidlen == 0) { 2083 continue; 2084 } 2085 2086 /* 2087 * If inquiry vid dosen't match this triplets vid, 2088 * try the next. 2089 */ 2090 if (strncasecmp(vidpid, vidptr, vidlen)) { 2091 continue; 2092 } 2093 2094 /* 2095 * if prettylen is zero then use the vid string 2096 */ 2097 if (prettylen == 0) { 2098 prettyptr = vidptr; 2099 prettylen = vidlen; 2100 } 2101 2102 ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG, 2103 "vid = %s, pretty=%s, dataname = %s\n", 2104 vidptr, prettyptr, datanameptr); 2105 2106 /* 2107 * get the data list 2108 */ 2109 if (ddi_getlongprop(DDI_DEV_T_ANY, ST_DEVINFO, 0, 2110 datanameptr, (caddr_t)&data_list, 2111 &data_list_len) != DDI_PROP_SUCCESS) { 2112 /* 2113 * Error in getting property value 2114 * print warning! 2115 */ 2116 scsi_log(ST_DEVINFO, st_label, CE_WARN, 2117 "data property (%s) has no value\n", 2118 datanameptr); 2119 continue; 2120 } 2121 2122 /* 2123 * now initialize the st_drivetype struct 2124 */ 2125 (void) strncpy(dp->name, prettyptr, ST_NAMESIZE - 1); 2126 dp->length = (int)min(vidlen, (VIDPIDLEN - 1)); 2127 (void) strncpy(dp->vid, vidptr, dp->length); 2128 data_ptr = (int *)data_list; 2129 /* 2130 * check if data is enough for version, type, 2131 * bsize, options, # of densities, density1, 2132 * density2, ..., default_density 2133 */ 2134 if ((data_list_len < 5 * sizeof (int)) || 2135 (data_list_len < 6 * sizeof (int) + 2136 *(data_ptr + 4) * sizeof (int))) { 2137 /* 2138 * print warning and skip to next triplet. 2139 */ 2140 scsi_log(ST_DEVINFO, st_label, CE_WARN, 2141 "data property (%s) incomplete\n", 2142 datanameptr); 2143 kmem_free(data_list, data_list_len); 2144 continue; 2145 } 2146 2147 if (st_validate_conf_data(un, data_ptr, 2148 data_list_len / sizeof (int), datanameptr)) { 2149 kmem_free(data_list, data_list_len); 2150 scsi_log(ST_DEVINFO, st_label, CE_WARN, 2151 "data property (%s) rejected\n", 2152 datanameptr); 2153 continue; 2154 } 2155 2156 /* 2157 * check version 2158 */ 2159 version = *data_ptr++; 2160 if (version != 1 && version != 2) { 2161 /* print warning but accept it */ 2162 scsi_log(ST_DEVINFO, st_label, CE_WARN, 2163 "Version # for data property (%s) " 2164 "not set to 1 or 2\n", datanameptr); 2165 } 2166 2167 dp->type = *data_ptr++; 2168 dp->bsize = *data_ptr++; 2169 dp->options = *data_ptr++; 2170 dp->options |= ST_DYNAMIC; 2171 len = *data_ptr++; 2172 for (i = 0; i < NDENSITIES; i++) { 2173 if (i < len) { 2174 dp->densities[i] = *data_ptr++; 2175 } 2176 } 2177 dp->default_density = *data_ptr << 3; 2178 if (version == 2 && 2179 data_list_len >= (13 + len) * sizeof (int)) { 2180 data_ptr++; 2181 dp->non_motion_timeout = *data_ptr++; 2182 dp->io_timeout = *data_ptr++; 2183 dp->rewind_timeout = *data_ptr++; 2184 dp->space_timeout = *data_ptr++; 2185 dp->load_timeout = *data_ptr++; 2186 dp->unload_timeout = *data_ptr++; 2187 dp->erase_timeout = *data_ptr++; 2188 } 2189 kmem_free(data_list, data_list_len); 2190 found = 1; 2191 ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG, 2192 "found in st.conf: vid = %s, pretty=%s\n", 2193 dp->vid, dp->name); 2194 break; 2195 } 2196 2197 /* 2198 * free up the memory allocated by ddi_getlongprop 2199 */ 2200 if (config_list) { 2201 kmem_free(config_list, config_list_len); 2202 } 2203 return (found); 2204 } 2205 2206 static int 2207 st_get_conf_from_st_conf_dot_c(struct scsi_tape *un, char *vidpid, 2208 struct st_drivetype *dp) 2209 { 2210 int i; 2211 2212 ST_FUNC(ST_DEVINFO, st_get_conf_from_st_conf_dot_c); 2213 /* 2214 * Determine type of tape controller. Type is determined by 2215 * checking the result of the earlier inquiry command and 2216 * comparing vendor ids with strings in a table declared in st_conf.c. 2217 */ 2218 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 2219 "st_get_conf_from_st_conf_dot_c(): looking at st_drivetypes\n"); 2220 2221 for (i = 0; i < st_ndrivetypes; i++) { 2222 if (st_drivetypes[i].length == 0) { 2223 continue; 2224 } 2225 if (strncasecmp(vidpid, st_drivetypes[i].vid, 2226 st_drivetypes[i].length)) { 2227 continue; 2228 } 2229 bcopy(&st_drivetypes[i], dp, sizeof (st_drivetypes[i])); 2230 return (1); 2231 } 2232 return (0); 2233 } 2234 2235 static int 2236 st_get_conf_from_tape_drive(struct scsi_tape *un, char *vidpid, 2237 struct st_drivetype *dp) 2238 { 2239 int bsize; 2240 ulong_t maxbsize; 2241 caddr_t buf; 2242 struct st_drivetype *tem_dp; 2243 struct read_blklim *blklim; 2244 int rval; 2245 int i; 2246 2247 ST_FUNC(ST_DEVINFO, st_get_conf_from_tape_drive); 2248 2249 /* 2250 * Determine the type of tape controller. Type is determined by 2251 * sending SCSI commands to tape drive and deriving the type from 2252 * the returned data. 2253 */ 2254 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 2255 "st_get_conf_from_tape_drive(): asking tape drive\n"); 2256 2257 tem_dp = kmem_zalloc(sizeof (struct st_drivetype), KM_SLEEP); 2258 2259 /* 2260 * Make up a name 2261 */ 2262 bcopy(vidpid, tem_dp->name, VIDPIDLEN); 2263 tem_dp->name[VIDPIDLEN] = '\0'; 2264 tem_dp->length = min(strlen(ST_INQUIRY->inq_vid), (VIDPIDLEN - 1)); 2265 (void) strncpy(tem_dp->vid, ST_INQUIRY->inq_vid, tem_dp->length); 2266 /* 2267 * 'clean' vendor and product strings of non-printing chars 2268 */ 2269 for (i = 0; i < VIDPIDLEN - 1; i ++) { 2270 if (tem_dp->name[i] < ' ' || tem_dp->name[i] > '~') { 2271 tem_dp->name[i] = '.'; 2272 } 2273 } 2274 2275 /* 2276 * MODE SENSE to determine block size. 2277 */ 2278 un->un_dp->options |= ST_MODE_SEL_COMP | ST_UNLOADABLE; 2279 rval = st_modesense(un); 2280 if (rval) { 2281 if (rval == EACCES) { 2282 un->un_dp->type = ST_TYPE_INVALID; 2283 rval = 1; 2284 } else { 2285 un->un_dp->options &= ~ST_MODE_SEL_COMP; 2286 rval = 0; 2287 } 2288 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 2289 "st_get_conf_from_tape_drive(): fail to mode sense\n"); 2290 goto exit; 2291 } 2292 2293 /* Can mode sense page 0x10 or 0xf */ 2294 tem_dp->options |= ST_MODE_SEL_COMP; 2295 bsize = (un->un_mspl->high_bl << 16) | 2296 (un->un_mspl->mid_bl << 8) | 2297 (un->un_mspl->low_bl); 2298 2299 if (bsize == 0) { 2300 tem_dp->options |= ST_VARIABLE; 2301 tem_dp->bsize = 0; 2302 } else if (bsize > ST_MAXRECSIZE_FIXED) { 2303 rval = st_change_block_size(un, 0); 2304 if (rval) { 2305 if (rval == EACCES) { 2306 un->un_dp->type = ST_TYPE_INVALID; 2307 rval = 1; 2308 } else { 2309 rval = 0; 2310 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 2311 "st_get_conf_from_tape_drive(): " 2312 "Fixed record size is too large and" 2313 "cannot switch to variable record size"); 2314 } 2315 goto exit; 2316 } 2317 tem_dp->options |= ST_VARIABLE; 2318 } else { 2319 rval = st_change_block_size(un, 0); 2320 if (rval == 0) { 2321 tem_dp->options |= ST_VARIABLE; 2322 tem_dp->bsize = 0; 2323 } else if (rval != EACCES) { 2324 tem_dp->bsize = bsize; 2325 } else { 2326 un->un_dp->type = ST_TYPE_INVALID; 2327 rval = 1; 2328 goto exit; 2329 } 2330 } 2331 2332 /* 2333 * If READ BLOCk LIMITS works and upper block size limit is 2334 * more than 64K, ST_NO_RECSIZE_LIMIT is supported. 2335 */ 2336 blklim = kmem_zalloc(sizeof (struct read_blklim), KM_SLEEP); 2337 rval = st_read_block_limits(un, blklim); 2338 if (rval) { 2339 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 2340 "st_get_conf_from_tape_drive(): " 2341 "fail to read block limits.\n"); 2342 rval = 0; 2343 kmem_free(blklim, sizeof (struct read_blklim)); 2344 goto exit; 2345 } 2346 maxbsize = (blklim->max_hi << 16) + 2347 (blklim->max_mid << 8) + blklim->max_lo; 2348 if (maxbsize > ST_MAXRECSIZE_VARIABLE) { 2349 tem_dp->options |= ST_NO_RECSIZE_LIMIT; 2350 } 2351 kmem_free(blklim, sizeof (struct read_blklim)); 2352 2353 /* 2354 * Inquiry VPD page 0xb0 to see if the tape drive supports WORM 2355 */ 2356 buf = kmem_zalloc(6, KM_SLEEP); 2357 rval = st_get_special_inquiry(un, 6, buf, 0xb0); 2358 if (rval) { 2359 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 2360 "st_get_conf_from_tape_drive(): " 2361 "fail to read vitial inquiry.\n"); 2362 rval = 0; 2363 kmem_free(buf, 6); 2364 goto exit; 2365 } 2366 if (buf[4] & 1) { 2367 tem_dp->options |= ST_WORMABLE; 2368 } 2369 kmem_free(buf, 6); 2370 2371 /* Assume BSD BSR KNOWS_EOD */ 2372 tem_dp->options |= ST_BSF | ST_BSR | ST_KNOWS_EOD | ST_UNLOADABLE; 2373 tem_dp->max_rretries = -1; 2374 tem_dp->max_wretries = -1; 2375 2376 /* 2377 * Decide the densities supported by tape drive by sending 2378 * REPORT DENSITY SUPPORT command. 2379 */ 2380 if (st_get_densities_from_tape_drive(un, tem_dp) == 0) { 2381 goto exit; 2382 } 2383 2384 /* 2385 * Decide the timeout values for several commands by sending 2386 * REPORT SUPPORTED OPERATION CODES command. 2387 */ 2388 rval = st_get_timeout_values_from_tape_drive(un, tem_dp); 2389 if (rval == 0 || ((rval == 1) && (tem_dp->type == ST_TYPE_INVALID))) { 2390 goto exit; 2391 } 2392 2393 bcopy(tem_dp, dp, sizeof (struct st_drivetype)); 2394 rval = 1; 2395 2396 exit: 2397 un->un_status = KEY_NO_SENSE; 2398 kmem_free(tem_dp, sizeof (struct st_drivetype)); 2399 return (rval); 2400 } 2401 2402 static int 2403 st_get_densities_from_tape_drive(struct scsi_tape *un, 2404 struct st_drivetype *dp) 2405 { 2406 int i, p; 2407 size_t buflen; 2408 ushort_t des_len; 2409 uchar_t *den_header; 2410 uchar_t num_den; 2411 uchar_t den[NDENSITIES]; 2412 uchar_t deflt[NDENSITIES]; 2413 struct report_density_desc *den_desc; 2414 2415 ST_FUNC(ST_DEVINFO, st_get_densities_from_type_drive); 2416 2417 /* 2418 * Since we have no idea how many densitiy support entries 2419 * will be returned, we send the command firstly assuming 2420 * there is only one. Then we can decide the number of 2421 * entries by available density support length. If multiple 2422 * entries exist, we will resend the command with enough 2423 * buffer size. 2424 */ 2425 buflen = sizeof (struct report_density_header) + 2426 sizeof (struct report_density_desc); 2427 den_header = kmem_zalloc(buflen, KM_SLEEP); 2428 if (st_report_density_support(un, den_header, buflen) != 0) { 2429 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 2430 "st_get_conf_from_tape_drive(): fail to report density.\n"); 2431 kmem_free(den_header, buflen); 2432 return (0); 2433 } 2434 des_len = 2435 BE_16(((struct report_density_header *)den_header)->ava_dens_len); 2436 num_den = (des_len - 2) / sizeof (struct report_density_desc); 2437 2438 if (num_den > 1) { 2439 kmem_free(den_header, buflen); 2440 buflen = sizeof (struct report_density_header) + 2441 sizeof (struct report_density_desc) * num_den; 2442 den_header = kmem_zalloc(buflen, KM_SLEEP); 2443 if (st_report_density_support(un, den_header, buflen) != 0) { 2444 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 2445 "st_get_conf_from_tape_drive(): " 2446 "fail to report density.\n"); 2447 kmem_free(den_header, buflen); 2448 return (0); 2449 } 2450 } 2451 2452 den_desc = (struct report_density_desc *)(den_header 2453 + sizeof (struct report_density_header)); 2454 2455 /* 2456 * Decide the drive type by assigning organization 2457 */ 2458 for (i = 0; i < ST_NUM_MEMBERS(st_vid_dt); i ++) { 2459 if (strncmp(st_vid_dt[i].vid, (char *)(den_desc->ass_org), 2460 8) == 0) { 2461 dp->type = st_vid_dt[i].type; 2462 break; 2463 } 2464 } 2465 if (i == ST_NUM_MEMBERS(st_vid_dt)) { 2466 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 2467 "st_get_conf_from_tape_drive(): " 2468 "can't find match of assigned ort.\n"); 2469 kmem_free(den_header, buflen); 2470 return (0); 2471 } 2472 2473 /* 2474 * The tape drive may support many tape formats, but the st driver 2475 * supports only the four highest densities. Since density code 2476 * values are returned by ascending sequence, we start from the 2477 * last entry of density support data block descriptor. 2478 */ 2479 p = 0; 2480 den_desc += num_den - 1; 2481 for (i = 0; i < num_den && p < NDENSITIES; i ++, den_desc --) { 2482 if ((den_desc->pri_den != 0) && (den_desc->wrtok)) { 2483 if (p != 0) { 2484 if (den_desc->pri_den >= den[p - 1]) { 2485 continue; 2486 } 2487 } 2488 den[p] = den_desc->pri_den; 2489 deflt[p] = den_desc->deflt; 2490 p ++; 2491 } 2492 } 2493 2494 switch (p) { 2495 case 0: 2496 bzero(dp->densities, NDENSITIES); 2497 dp->options |= ST_AUTODEN_OVERRIDE; 2498 dp->default_density = MT_DENSITY4; 2499 break; 2500 2501 case 1: 2502 (void) memset(dp->densities, den[0], NDENSITIES); 2503 dp->options |= ST_AUTODEN_OVERRIDE; 2504 dp->default_density = MT_DENSITY4; 2505 break; 2506 2507 case 2: 2508 dp->densities[0] = den[1]; 2509 dp->densities[1] = den[1]; 2510 dp->densities[2] = den[0]; 2511 dp->densities[3] = den[0]; 2512 if (deflt[0]) { 2513 dp->default_density = MT_DENSITY4; 2514 } else { 2515 dp->default_density = MT_DENSITY2; 2516 } 2517 break; 2518 2519 case 3: 2520 dp->densities[0] = den[2]; 2521 dp->densities[1] = den[1]; 2522 dp->densities[2] = den[0]; 2523 dp->densities[3] = den[0]; 2524 if (deflt[0]) { 2525 dp->default_density = MT_DENSITY4; 2526 } else if (deflt[1]) { 2527 dp->default_density = MT_DENSITY2; 2528 } else { 2529 dp->default_density = MT_DENSITY1; 2530 } 2531 break; 2532 2533 default: 2534 for (i = p; i > p - NDENSITIES; i --) { 2535 dp->densities[i - 1] = den[p - i]; 2536 } 2537 if (deflt[0]) { 2538 dp->default_density = MT_DENSITY4; 2539 } else if (deflt[1]) { 2540 dp->default_density = MT_DENSITY3; 2541 } else if (deflt[2]) { 2542 dp->default_density = MT_DENSITY2; 2543 } else { 2544 dp->default_density = MT_DENSITY1; 2545 } 2546 break; 2547 } 2548 2549 bzero(dp->mediatype, NDENSITIES); 2550 2551 kmem_free(den_header, buflen); 2552 return (1); 2553 } 2554 2555 static int 2556 st_get_timeout_values_from_tape_drive(struct scsi_tape *un, 2557 struct st_drivetype *dp) 2558 { 2559 ushort_t timeout; 2560 int rval; 2561 2562 ST_FUNC(ST_DEVINFO, st_get_timeout_values_from_type_drive); 2563 2564 rval = st_get_timeouts_value(un, SCMD_ERASE, &timeout, 0); 2565 if (rval) { 2566 if (rval == EACCES) { 2567 un->un_dp->type = ST_TYPE_INVALID; 2568 dp->type = ST_TYPE_INVALID; 2569 return (1); 2570 } 2571 return (0); 2572 } 2573 dp->erase_timeout = timeout; 2574 2575 rval = st_get_timeouts_value(un, SCMD_READ, &timeout, 0); 2576 if (rval) { 2577 if (rval == EACCES) { 2578 un->un_dp->type = ST_TYPE_INVALID; 2579 dp->type = ST_TYPE_INVALID; 2580 return (1); 2581 } 2582 return (0); 2583 } 2584 dp->io_timeout = timeout; 2585 2586 rval = st_get_timeouts_value(un, SCMD_WRITE, &timeout, 0); 2587 if (rval) { 2588 if (rval == EACCES) { 2589 un->un_dp->type = ST_TYPE_INVALID; 2590 dp->type = ST_TYPE_INVALID; 2591 return (1); 2592 } 2593 return (0); 2594 } 2595 dp->io_timeout = max(dp->io_timeout, timeout); 2596 2597 rval = st_get_timeouts_value(un, SCMD_SPACE, &timeout, 0); 2598 if (rval) { 2599 if (rval == EACCES) { 2600 un->un_dp->type = ST_TYPE_INVALID; 2601 dp->type = ST_TYPE_INVALID; 2602 return (1); 2603 } 2604 return (0); 2605 } 2606 dp->space_timeout = timeout; 2607 2608 rval = st_get_timeouts_value(un, SCMD_LOAD, &timeout, 0); 2609 if (rval) { 2610 if (rval == EACCES) { 2611 un->un_dp->type = ST_TYPE_INVALID; 2612 dp->type = ST_TYPE_INVALID; 2613 return (1); 2614 } 2615 return (0); 2616 } 2617 dp->load_timeout = timeout; 2618 dp->unload_timeout = timeout; 2619 2620 rval = st_get_timeouts_value(un, SCMD_REWIND, &timeout, 0); 2621 if (rval) { 2622 if (rval == EACCES) { 2623 un->un_dp->type = ST_TYPE_INVALID; 2624 dp->type = ST_TYPE_INVALID; 2625 return (1); 2626 } 2627 return (0); 2628 } 2629 dp->rewind_timeout = timeout; 2630 2631 rval = st_get_timeouts_value(un, SCMD_INQUIRY, &timeout, 0); 2632 if (rval) { 2633 if (rval == EACCES) { 2634 un->un_dp->type = ST_TYPE_INVALID; 2635 dp->type = ST_TYPE_INVALID; 2636 return (1); 2637 } 2638 return (0); 2639 } 2640 dp->non_motion_timeout = timeout; 2641 2642 return (1); 2643 } 2644 2645 static int 2646 st_get_timeouts_value(struct scsi_tape *un, uchar_t option_code, 2647 ushort_t *timeout_value, ushort_t service_action) 2648 { 2649 uchar_t *timeouts; 2650 uchar_t *oper; 2651 uchar_t support; 2652 uchar_t cdbsize; 2653 uchar_t ctdp; 2654 size_t buflen; 2655 int rval; 2656 2657 ST_FUNC(ST_DEVINFO, st_get_timeouts_value); 2658 2659 buflen = sizeof (struct one_com_des) + 2660 sizeof (struct com_timeout_des); 2661 oper = kmem_zalloc(buflen, KM_SLEEP); 2662 rval = st_report_supported_operation(un, oper, option_code, 2663 service_action); 2664 2665 if (rval) { 2666 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 2667 "st_get_timeouts_value(): " 2668 "fail to timeouts value for command %d.\n", option_code); 2669 kmem_free(oper, buflen); 2670 return (rval); 2671 } 2672 2673 support = ((struct one_com_des *)oper)->support; 2674 if ((support != SUPPORT_VALUES_SUPPORT_SCSI) && 2675 (support != SUPPORT_VALUES_SUPPORT_VENDOR)) { 2676 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 2677 "st_get_timeouts_value(): " 2678 "command %d is not supported.\n", option_code); 2679 kmem_free(oper, buflen); 2680 return (ENOTSUP); 2681 } 2682 2683 ctdp = ((struct one_com_des *)oper)->ctdp; 2684 if (!ctdp) { 2685 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 2686 "st_get_timeouts_value(): " 2687 "command timeout is not included.\n"); 2688 kmem_free(oper, buflen); 2689 return (ENOTSUP); 2690 } 2691 2692 cdbsize = BE_16(((struct one_com_des *)oper)->cdb_size); 2693 timeouts = (uchar_t *)(oper + cdbsize + 4); 2694 2695 /* 2696 * Timeout value in seconds is 4 bytes, but we only support the lower 2 2697 * bytes. If the higher 2 bytes are not zero, the timeout value is set 2698 * to 0xFFFF. 2699 */ 2700 if (*(timeouts + 8) != 0 || *(timeouts + 9) != 0) { 2701 *timeout_value = USHRT_MAX; 2702 } else { 2703 *timeout_value = ((*(timeouts + 10)) << 8) | 2704 (*(timeouts + 11)); 2705 } 2706 2707 kmem_free(oper, buflen); 2708 return (0); 2709 } 2710 2711 static int 2712 st_get_default_conf(struct scsi_tape *un, char *vidpid, struct st_drivetype *dp) 2713 { 2714 int i; 2715 2716 ST_FUNC(ST_DEVINFO, st_get_default_conf); 2717 2718 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 2719 "st_get_default_conf(): making drivetype from INQ cmd\n"); 2720 2721 /* 2722 * Make up a name 2723 */ 2724 bcopy("Vendor '", dp->name, 8); 2725 bcopy(vidpid, &dp->name[8], VIDLEN); 2726 bcopy("' Product '", &dp->name[16], 11); 2727 bcopy(&vidpid[8], &dp->name[27], PIDLEN); 2728 dp->name[ST_NAMESIZE - 2] = '\''; 2729 dp->name[ST_NAMESIZE - 1] = '\0'; 2730 dp->length = min(strlen(ST_INQUIRY->inq_vid), (VIDPIDLEN - 1)); 2731 (void) strncpy(dp->vid, ST_INQUIRY->inq_vid, dp->length); 2732 /* 2733 * 'clean' vendor and product strings of non-printing chars 2734 */ 2735 for (i = 0; i < ST_NAMESIZE - 2; i++) { 2736 if (dp->name[i] < ' ' || dp->name[i] > '~') { 2737 dp->name[i] = '.'; 2738 } 2739 } 2740 dp->type = ST_TYPE_INVALID; 2741 dp->options |= (ST_DYNAMIC | ST_UNLOADABLE | ST_MODE_SEL_COMP); 2742 2743 return (1); /* Can Not Fail */ 2744 } 2745 2746 /* 2747 * Regular Unix Entry points 2748 */ 2749 2750 2751 2752 /* ARGSUSED */ 2753 static int 2754 st_open(dev_t *dev_p, int flag, int otyp, cred_t *cred_p) 2755 { 2756 dev_t dev = *dev_p; 2757 int rval = 0; 2758 2759 GET_SOFT_STATE(dev); 2760 2761 ST_ENTR(ST_DEVINFO, st_open); 2762 2763 /* 2764 * validate that we are addressing a sensible unit 2765 */ 2766 mutex_enter(ST_MUTEX); 2767 2768 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 2769 "st_open(node = %s dev = 0x%lx, flag = %d, otyp = %d)\n", 2770 st_dev_name(dev), *dev_p, flag, otyp); 2771 2772 /* 2773 * All device accesss go thru st_strategy() where we check 2774 * suspend status 2775 */ 2776 2777 if (!un->un_attached) { 2778 st_known_tape_type(un); 2779 if (!un->un_attached) { 2780 rval = ENXIO; 2781 goto exit; 2782 } 2783 2784 } 2785 2786 /* 2787 * Check for the case of the tape in the middle of closing. 2788 * This isn't simply a check of the current state, because 2789 * we could be in state of sensing with the previous state 2790 * that of closing. 2791 * 2792 * And don't allow multiple opens. 2793 */ 2794 if (!(flag & (FNDELAY | FNONBLOCK)) && IS_CLOSING(un)) { 2795 un->un_laststate = un->un_state; 2796 un->un_state = ST_STATE_CLOSE_PENDING_OPEN; 2797 while (IS_CLOSING(un) || 2798 un->un_state == ST_STATE_CLOSE_PENDING_OPEN) { 2799 if (cv_wait_sig(&un->un_clscv, ST_MUTEX) == 0) { 2800 rval = EINTR; 2801 un->un_state = un->un_laststate; 2802 goto exit; 2803 } 2804 } 2805 } else if (un->un_state != ST_STATE_CLOSED) { 2806 rval = EBUSY; 2807 goto busy; 2808 } 2809 2810 /* 2811 * record current dev 2812 */ 2813 un->un_dev = dev; 2814 un->un_oflags = flag; /* save for use in st_tape_init() */ 2815 un->un_errno = 0; /* no errors yet */ 2816 un->un_restore_pos = 0; 2817 un->un_rqs_state = 0; 2818 2819 /* 2820 * If we are opening O_NDELAY, or O_NONBLOCK, we don't check for 2821 * anything, leave internal states alone, if fileno >= 0 2822 */ 2823 if (flag & (FNDELAY | FNONBLOCK)) { 2824 switch (un->un_pos.pmode) { 2825 2826 case invalid: 2827 un->un_state = ST_STATE_OFFLINE; 2828 break; 2829 2830 case legacy: 2831 /* 2832 * If position is anything other than rewound. 2833 */ 2834 if (un->un_pos.fileno != 0 || un->un_pos.blkno != 0) { 2835 /* 2836 * set un_read_only/write-protect status. 2837 * 2838 * If the tape is not bot we can assume 2839 * that mspl->wp_status is set properly. 2840 * else 2841 * we need to do a mode sense/Tur once 2842 * again to get the actual tape status.(since 2843 * user might have replaced the tape) 2844 * Hence make the st state OFFLINE so that 2845 * we re-intialize the tape once again. 2846 */ 2847 un->un_read_only = 2848 (un->un_oflags & FWRITE) ? RDWR : RDONLY; 2849 un->un_state = ST_STATE_OPEN_PENDING_IO; 2850 } else { 2851 un->un_state = ST_STATE_OFFLINE; 2852 } 2853 break; 2854 case logical: 2855 if (un->un_pos.lgclblkno == 0) { 2856 un->un_state = ST_STATE_OFFLINE; 2857 } else { 2858 un->un_read_only = 2859 (un->un_oflags & FWRITE) ? RDWR : RDONLY; 2860 un->un_state = ST_STATE_OPEN_PENDING_IO; 2861 } 2862 break; 2863 } 2864 rval = 0; 2865 } else { 2866 /* 2867 * Not opening O_NDELAY. 2868 */ 2869 un->un_state = ST_STATE_OPENING; 2870 2871 /* 2872 * Clear error entry stack 2873 */ 2874 st_empty_error_stack(un); 2875 2876 rval = st_tape_init(un); 2877 if ((rval == EACCES) && (un->un_read_only & WORM)) { 2878 un->un_state = ST_STATE_OPEN_PENDING_IO; 2879 rval = 0; /* so open doesn't fail */ 2880 } else if (rval) { 2881 /* 2882 * Release the tape unit, if reserved and not 2883 * preserve reserve. 2884 */ 2885 if ((un->un_rsvd_status & 2886 (ST_RESERVE | ST_PRESERVE_RESERVE)) == ST_RESERVE) { 2887 (void) st_reserve_release(un, ST_RELEASE, 2888 st_uscsi_cmd); 2889 } 2890 } else { 2891 un->un_state = ST_STATE_OPEN_PENDING_IO; 2892 } 2893 } 2894 2895 exit: 2896 /* 2897 * we don't want any uninvited guests scrogging our data when we're 2898 * busy with something, so for successful opens or failed opens 2899 * (except for EBUSY), reset these counters and state appropriately. 2900 */ 2901 if (rval != EBUSY) { 2902 if (rval) { 2903 un->un_state = ST_STATE_CLOSED; 2904 } 2905 un->un_err_resid = 0; 2906 un->un_retry_ct = 0; 2907 } 2908 busy: 2909 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 2910 "st_open: return val = %x, state = %d\n", rval, un->un_state); 2911 mutex_exit(ST_MUTEX); 2912 return (rval); 2913 2914 } 2915 2916 static int 2917 st_tape_init(struct scsi_tape *un) 2918 { 2919 int err; 2920 int rval = 0; 2921 2922 ST_FUNC(ST_DEVINFO, st_tape_init); 2923 2924 ASSERT(mutex_owned(ST_MUTEX)); 2925 2926 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 2927 "st_tape_init(un = 0x%p, oflags = %d)\n", (void*)un, un->un_oflags); 2928 2929 /* 2930 * Clean up after any errors left by 'last' close. 2931 * This also handles the case of the initial open. 2932 */ 2933 if (un->un_state != ST_STATE_INITIALIZING) { 2934 un->un_laststate = un->un_state; 2935 un->un_state = ST_STATE_OPENING; 2936 } 2937 2938 un->un_kbytes_xferred = 0; 2939 2940 /* 2941 * do a throw away TUR to clear check condition 2942 */ 2943 err = st_cmd(un, SCMD_TEST_UNIT_READY, 0, SYNC_CMD); 2944 2945 /* 2946 * If test unit ready fails because the drive is reserved 2947 * by another host fail the open for no access. 2948 */ 2949 if (err) { 2950 if (un->un_rsvd_status & ST_RESERVATION_CONFLICT) { 2951 un->un_state = ST_STATE_CLOSED; 2952 ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG, 2953 "st_tape_init: RESERVATION CONFLICT\n"); 2954 rval = EACCES; 2955 goto exit; 2956 } else if ((un->un_rsvd_status & 2957 ST_APPLICATION_RESERVATIONS) != 0) { 2958 if ((ST_RQSENSE != NULL) && 2959 (ST_RQSENSE->es_add_code == 0x2a && 2960 ST_RQSENSE->es_qual_code == 0x03)) { 2961 un->un_state = ST_STATE_CLOSED; 2962 rval = EACCES; 2963 goto exit; 2964 } 2965 } 2966 } 2967 2968 /* 2969 * Tape self identification could fail if the tape drive is used by 2970 * another host during attach time. We try to get the tape type 2971 * again. This is also applied to any posponed configuration methods. 2972 */ 2973 if (un->un_dp->type == ST_TYPE_INVALID) { 2974 un->un_comp_page = ST_DEV_DATACOMP_PAGE | ST_DEV_CONFIG_PAGE; 2975 st_known_tape_type(un); 2976 } 2977 2978 /* 2979 * If the tape type is still invalid, try to determine the generic 2980 * configuration. 2981 */ 2982 if (un->un_dp->type == ST_TYPE_INVALID) { 2983 rval = st_determine_generic(un); 2984 if (rval) { 2985 if (rval != EACCES) { 2986 rval = EIO; 2987 } 2988 un->un_state = ST_STATE_CLOSED; 2989 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 2990 "st_tape_init: %s invalid type\n", 2991 rval == EACCES ? "EACCES" : "EIO"); 2992 goto exit; 2993 } 2994 /* 2995 * If this is a Unknown Type drive, 2996 * Use the READ BLOCK LIMITS to determine if 2997 * allow large xfer is approprate if not globally 2998 * disabled with st_allow_large_xfer. 2999 */ 3000 un->un_allow_large_xfer = (uchar_t)st_allow_large_xfer; 3001 } else { 3002 3003 /* 3004 * If we allow_large_xfer (ie >64k) and have not yet found out 3005 * the max block size supported by the drive, 3006 * find it by issueing a READ_BLKLIM command. 3007 * if READ_BLKLIM cmd fails, assume drive doesn't 3008 * allow_large_xfer and min/max block sizes as 1 byte and 63k. 3009 */ 3010 un->un_allow_large_xfer = st_allow_large_xfer && 3011 (un->un_dp->options & ST_NO_RECSIZE_LIMIT); 3012 } 3013 /* 3014 * if maxbsize is unknown, set the maximum block size. 3015 */ 3016 if (un->un_maxbsize == MAXBSIZE_UNKNOWN) { 3017 3018 /* 3019 * Get the Block limits of the tape drive. 3020 * if un->un_allow_large_xfer = 0 , then make sure 3021 * that maxbsize is <= ST_MAXRECSIZE_FIXED. 3022 */ 3023 un->un_rbl = kmem_zalloc(RBLSIZE, KM_SLEEP); 3024 3025 err = st_cmd(un, SCMD_READ_BLKLIM, RBLSIZE, SYNC_CMD); 3026 if (err) { 3027 /* Retry */ 3028 err = st_cmd(un, SCMD_READ_BLKLIM, RBLSIZE, SYNC_CMD); 3029 } 3030 if (!err) { 3031 3032 /* 3033 * if cmd successful, use limit returned 3034 */ 3035 un->un_maxbsize = (un->un_rbl->max_hi << 16) + 3036 (un->un_rbl->max_mid << 8) + 3037 un->un_rbl->max_lo; 3038 un->un_minbsize = (un->un_rbl->min_hi << 8) + 3039 un->un_rbl->min_lo; 3040 un->un_data_mod = 1 << un->un_rbl->granularity; 3041 if ((un->un_maxbsize == 0) || 3042 (un->un_allow_large_xfer == 0 && 3043 un->un_maxbsize > ST_MAXRECSIZE_FIXED)) { 3044 un->un_maxbsize = ST_MAXRECSIZE_FIXED; 3045 3046 } else if (un->un_dp->type == ST_TYPE_DEFAULT) { 3047 /* 3048 * Drive is not one that is configured, But the 3049 * READ BLOCK LIMITS tells us it can do large 3050 * xfers. 3051 */ 3052 if (un->un_maxbsize > ST_MAXRECSIZE_FIXED) { 3053 un->un_dp->options |= 3054 ST_NO_RECSIZE_LIMIT; 3055 } 3056 /* 3057 * If max and mimimum block limits are the 3058 * same this is a fixed block size device. 3059 */ 3060 if (un->un_maxbsize == un->un_minbsize) { 3061 un->un_dp->options &= ~ST_VARIABLE; 3062 } 3063 } 3064 3065 if (un->un_minbsize == 0) { 3066 un->un_minbsize = 1; 3067 } 3068 3069 } else { /* error on read block limits */ 3070 3071 scsi_log(ST_DEVINFO, st_label, CE_NOTE, 3072 "!st_tape_init: Error on READ BLOCK LIMITS," 3073 " errno = %d un_rsvd_status = 0x%X\n", 3074 err, un->un_rsvd_status); 3075 3076 /* 3077 * since read block limits cmd failed, 3078 * do not allow large xfers. 3079 * use old values in st_minphys 3080 */ 3081 if (un->un_rsvd_status & ST_RESERVATION_CONFLICT) { 3082 rval = EACCES; 3083 } else { 3084 un->un_allow_large_xfer = 0; 3085 scsi_log(ST_DEVINFO, st_label, CE_NOTE, 3086 "!Disabling large transfers\n"); 3087 3088 /* 3089 * we guess maxbsize and minbsize 3090 */ 3091 if (un->un_bsize) { 3092 un->un_maxbsize = un->un_minbsize = 3093 un->un_bsize; 3094 } else { 3095 un->un_maxbsize = ST_MAXRECSIZE_FIXED; 3096 un->un_minbsize = 1; 3097 } 3098 /* 3099 * Data Mod must be set, 3100 * Even if read block limits fails. 3101 * Prevents Divide By Zero in st_rw(). 3102 */ 3103 un->un_data_mod = 1; 3104 } 3105 } 3106 if (un->un_rbl) { 3107 kmem_free(un->un_rbl, RBLSIZE); 3108 un->un_rbl = NULL; 3109 } 3110 3111 if (rval) { 3112 goto exit; 3113 } 3114 } 3115 3116 ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, 3117 "maxdma = %d, maxbsize = %d, minbsize = %d, %s large xfer\n", 3118 un->un_maxdma, un->un_maxbsize, un->un_minbsize, 3119 (un->un_allow_large_xfer ? "ALLOW": "DON'T ALLOW")); 3120 3121 err = st_cmd(un, SCMD_TEST_UNIT_READY, 0, SYNC_CMD); 3122 3123 if (err != 0) { 3124 if (err == EINTR) { 3125 un->un_laststate = un->un_state; 3126 un->un_state = ST_STATE_CLOSED; 3127 rval = EINTR; 3128 goto exit; 3129 } 3130 /* 3131 * Make sure the tape is ready 3132 */ 3133 un->un_pos.pmode = invalid; 3134 if (un->un_status != KEY_UNIT_ATTENTION) { 3135 /* 3136 * allow open no media. Subsequent MTIOCSTATE 3137 * with media present will complete the open 3138 * logic. 3139 */ 3140 un->un_laststate = un->un_state; 3141 if (un->un_oflags & (FNONBLOCK|FNDELAY)) { 3142 un->un_mediastate = MTIO_EJECTED; 3143 un->un_state = ST_STATE_OFFLINE; 3144 rval = 0; 3145 goto exit; 3146 } else { 3147 un->un_state = ST_STATE_CLOSED; 3148 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 3149 "st_tape_init EIO no media, not opened " 3150 "O_NONBLOCK|O_EXCL\n"); 3151 rval = EIO; 3152 goto exit; 3153 } 3154 } 3155 } 3156 3157 /* 3158 * On each open, initialize block size from drivetype struct, 3159 * as it could have been changed by MTSRSZ ioctl. 3160 * Now, ST_VARIABLE simply means drive is capable of variable 3161 * mode. All drives are assumed to support fixed records. 3162 * Hence, un_bsize tells what mode the drive is in. 3163 * un_bsize = 0 - variable record length 3164 * = x - fixed record length is x 3165 */ 3166 un->un_bsize = un->un_dp->bsize; 3167 3168 /* 3169 * If saved position is valid go there 3170 */ 3171 if (un->un_restore_pos) { 3172 un->un_restore_pos = 0; 3173 un->un_pos.fileno = un->un_save_fileno; 3174 un->un_pos.blkno = un->un_save_blkno; 3175 rval = st_validate_tapemarks(un, st_uscsi_cmd, &un->un_pos); 3176 if (rval != 0) { 3177 if (rval != EACCES) { 3178 rval = EIO; 3179 } 3180 un->un_laststate = un->un_state; 3181 un->un_state = ST_STATE_CLOSED; 3182 goto exit; 3183 } 3184 } 3185 3186 if (un->un_pos.pmode == invalid) { 3187 rval = st_loadtape(un); 3188 if (rval) { 3189 if (rval != EACCES) { 3190 rval = EIO; 3191 } 3192 un->un_laststate = un->un_state; 3193 un->un_state = ST_STATE_CLOSED; 3194 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 3195 "st_tape_init: %s can't open tape\n", 3196 rval == EACCES ? "EACCES" : "EIO"); 3197 goto exit; 3198 } 3199 } 3200 3201 /* 3202 * do a mode sense to pick up state of current write-protect, 3203 * Could cause reserve and fail due to conflict. 3204 */ 3205 if (un->un_unit_attention_flags) { 3206 rval = st_modesense(un); 3207 if (rval == EACCES) { 3208 goto exit; 3209 } 3210 } 3211 3212 /* 3213 * If we are opening the tape for writing, check 3214 * to make sure that the tape can be written. 3215 */ 3216 if (un->un_oflags & FWRITE) { 3217 err = 0; 3218 if (un->un_mspl->wp) { 3219 un->un_status = KEY_WRITE_PROTECT; 3220 un->un_laststate = un->un_state; 3221 un->un_state = ST_STATE_CLOSED; 3222 rval = EACCES; 3223 /* 3224 * STK sets the wp bit if volsafe tape is loaded. 3225 */ 3226 if ((un->un_dp->type == MT_ISSTK9840) && 3227 (un->un_dp->options & ST_WORMABLE)) { 3228 un->un_read_only = RDONLY; 3229 } else { 3230 goto exit; 3231 } 3232 } else { 3233 un->un_read_only = RDWR; 3234 } 3235 } else { 3236 un->un_read_only = RDONLY; 3237 } 3238 3239 if (un->un_dp->options & ST_WORMABLE && 3240 un->un_unit_attention_flags) { 3241 un->un_read_only |= un->un_wormable(un); 3242 3243 if (((un->un_read_only == WORM) || 3244 (un->un_read_only == RDWORM)) && 3245 ((un->un_oflags & FWRITE) == FWRITE)) { 3246 un->un_status = KEY_DATA_PROTECT; 3247 rval = EACCES; 3248 ST_DEBUG4(ST_DEVINFO, st_label, CE_NOTE, 3249 "read_only = %d eof = %d oflag = %d\n", 3250 un->un_read_only, un->un_pos.eof, un->un_oflags); 3251 } 3252 } 3253 3254 /* 3255 * If we're opening the tape write-only, we need to 3256 * write 2 filemarks on the HP 1/2 inch drive, to 3257 * create a null file. 3258 */ 3259 if ((un->un_read_only == RDWR) || 3260 (un->un_read_only == WORM) && (un->un_oflags & FWRITE)) { 3261 if (un->un_dp->options & ST_REEL) { 3262 un->un_fmneeded = 2; 3263 } else { 3264 un->un_fmneeded = 1; 3265 } 3266 } else { 3267 un->un_fmneeded = 0; 3268 } 3269 3270 ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, 3271 "fmneeded = %x\n", un->un_fmneeded); 3272 3273 /* 3274 * Make sure the density can be selected correctly. 3275 * If WORM can only write at the append point which in most cases 3276 * isn't BOP. st_determine_density() with a B_WRITE only attempts 3277 * to set and try densities if a BOP. 3278 */ 3279 if (st_determine_density(un, 3280 un->un_read_only == RDWR ? B_WRITE : B_READ)) { 3281 un->un_status = KEY_ILLEGAL_REQUEST; 3282 un->un_laststate = un->un_state; 3283 un->un_state = ST_STATE_CLOSED; 3284 ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG, 3285 "st_tape_init: EIO can't determine density\n"); 3286 rval = EIO; 3287 goto exit; 3288 } 3289 3290 /* 3291 * Destroy the knowledge that we have 'determined' 3292 * density so that a later read at BOT comes along 3293 * does the right density determination. 3294 */ 3295 3296 un->un_density_known = 0; 3297 3298 3299 /* 3300 * Okay, the tape is loaded and either at BOT or somewhere past. 3301 * Mark the state such that any I/O or tape space operations 3302 * will get/set the right density, etc.. 3303 */ 3304 un->un_laststate = un->un_state; 3305 un->un_lastop = ST_OP_NIL; 3306 un->un_mediastate = MTIO_INSERTED; 3307 cv_broadcast(&un->un_state_cv); 3308 3309 /* 3310 * Set test append flag if writing. 3311 * First write must check that tape is positioned correctly. 3312 */ 3313 un->un_test_append = (un->un_oflags & FWRITE); 3314 3315 /* 3316 * if there are pending unit attention flags. 3317 * Check that the media has not changed. 3318 */ 3319 if (un->un_unit_attention_flags) { 3320 rval = st_get_media_identification(un, st_uscsi_cmd); 3321 if (rval != 0 && rval != EACCES) { 3322 rval = EIO; 3323 } 3324 un->un_unit_attention_flags = 0; 3325 } 3326 3327 exit: 3328 un->un_err_resid = 0; 3329 un->un_last_resid = 0; 3330 un->un_last_count = 0; 3331 3332 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 3333 "st_tape_init: return val = %x\n", rval); 3334 return (rval); 3335 3336 } 3337 3338 3339 3340 /* ARGSUSED */ 3341 static int 3342 st_close(dev_t dev, int flag, int otyp, cred_t *cred_p) 3343 { 3344 int err = 0; 3345 int count, last_state; 3346 minor_t minor = getminor(dev); 3347 #ifdef __x86 3348 struct contig_mem *cp, *cp_temp; 3349 #endif 3350 3351 GET_SOFT_STATE(dev); 3352 3353 ST_ENTR(ST_DEVINFO, st_close); 3354 3355 /* 3356 * wait till all cmds in the pipeline have been completed 3357 */ 3358 mutex_enter(ST_MUTEX); 3359 3360 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 3361 "st_close(dev = 0x%lx, flag = %d, otyp = %d)\n", dev, flag, otyp); 3362 3363 st_wait_for_io(un); 3364 3365 /* turn off persistent errors on close, as we want close to succeed */ 3366 st_turn_pe_off(un); 3367 3368 /* 3369 * set state to indicate that we are in process of closing 3370 */ 3371 last_state = un->un_laststate = un->un_state; 3372 un->un_state = ST_STATE_CLOSING; 3373 3374 ST_POS(ST_DEVINFO, "st_close1:", &un->un_pos); 3375 3376 /* 3377 * BSD behavior: 3378 * a close always causes a silent span to the next file if we've hit 3379 * an EOF (but not yet read across it). 3380 */ 3381 if ((minor & MT_BSD) && (un->un_pos.eof == ST_EOF)) { 3382 if (un->un_pos.pmode != invalid) { 3383 un->un_pos.fileno++; 3384 un->un_pos.blkno = 0; 3385 } 3386 un->un_pos.eof = ST_NO_EOF; 3387 } 3388 3389 /* 3390 * SVR4 behavior for skipping to next file: 3391 * 3392 * If we have not seen a filemark, space to the next file 3393 * 3394 * If we have already seen the filemark we are physically in the next 3395 * file and we only increment the filenumber 3396 */ 3397 if (((minor & (MT_BSD | MT_NOREWIND)) == MT_NOREWIND) && 3398 (flag & FREAD) && /* reading or at least asked to */ 3399 (un->un_mediastate == MTIO_INSERTED) && /* tape loaded */ 3400 (un->un_pos.pmode != invalid) && /* XXX position known */ 3401 ((un->un_pos.blkno != 0) && /* inside a file */ 3402 (un->un_lastop != ST_OP_WRITE) && /* Didn't just write */ 3403 (un->un_lastop != ST_OP_WEOF))) { /* or write filemarks */ 3404 switch (un->un_pos.eof) { 3405 case ST_NO_EOF: 3406 /* 3407 * if we were reading and did not read the complete file 3408 * skip to the next file, leaving the tape correctly 3409 * positioned to read the first record of the next file 3410 * Check first for REEL if we are at EOT by trying to 3411 * read a block 3412 */ 3413 if ((un->un_dp->options & ST_REEL) && 3414 (!(un->un_dp->options & ST_READ_IGNORE_EOFS)) && 3415 (un->un_pos.blkno == 0)) { 3416 if (st_cmd(un, SCMD_SPACE, Blk(1), SYNC_CMD)) { 3417 ST_DEBUG2(ST_DEVINFO, st_label, 3418 SCSI_DEBUG, 3419 "st_close : EIO can't space\n"); 3420 err = EIO; 3421 goto error_out; 3422 } 3423 if (un->un_pos.eof >= ST_EOF_PENDING) { 3424 un->un_pos.eof = ST_EOT_PENDING; 3425 un->un_pos.fileno += 1; 3426 un->un_pos.blkno = 0; 3427 break; 3428 } 3429 } 3430 if (st_cmd(un, SCMD_SPACE, Fmk(1), SYNC_CMD)) { 3431 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 3432 "st_close: EIO can't space #2\n"); 3433 err = EIO; 3434 goto error_out; 3435 } else { 3436 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 3437 "st_close2: fileno=%x,blkno=%x,eof=%x\n", 3438 un->un_pos.fileno, un->un_pos.blkno, 3439 un->un_pos.eof); 3440 un->un_pos.eof = ST_NO_EOF; 3441 } 3442 break; 3443 3444 case ST_EOF_PENDING: 3445 case ST_EOF: 3446 un->un_pos.fileno += 1; 3447 un->un_pos.lgclblkno += 1; 3448 un->un_pos.blkno = 0; 3449 un->un_pos.eof = ST_NO_EOF; 3450 break; 3451 3452 case ST_EOT: 3453 case ST_EOT_PENDING: 3454 case ST_EOM: 3455 /* nothing to do */ 3456 break; 3457 default: 3458 ST_DEBUG(ST_DEVINFO, st_label, CE_PANIC, 3459 "Undefined state 0x%x", un->un_pos.eof); 3460 3461 } 3462 } 3463 3464 3465 /* 3466 * For performance reasons (HP 88780), the driver should 3467 * postpone writing the second tape mark until just before a file 3468 * positioning ioctl is issued (e.g., rewind). This means that 3469 * the user must not manually rewind the tape because the tape will 3470 * be missing the second tape mark which marks EOM. 3471 * However, this small performance improvement is not worth the risk. 3472 */ 3473 3474 /* 3475 * We need to back up over the filemark we inadvertently popped 3476 * over doing a read in between the two filemarks that constitute 3477 * logical eot for 1/2" tapes. Note that ST_EOT_PENDING is only 3478 * set while reading. 3479 * 3480 * If we happen to be at physical eot (ST_EOM) (writing case), 3481 * the writing of filemark(s) will clear the ST_EOM state, which 3482 * we don't want, so we save this state and restore it later. 3483 */ 3484 3485 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 3486 "flag=%x, fmneeded=%x, lastop=%x, eof=%x\n", 3487 flag, un->un_fmneeded, un->un_lastop, un->un_pos.eof); 3488 3489 if (un->un_pos.eof == ST_EOT_PENDING) { 3490 if (minor & MT_NOREWIND) { 3491 if (st_cmd(un, SCMD_SPACE, Fmk(-1), SYNC_CMD)) { 3492 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 3493 "st_close: EIO can't space #3\n"); 3494 err = EIO; 3495 goto error_out; 3496 } else { 3497 un->un_pos.blkno = 0; 3498 un->un_pos.eof = ST_EOT; 3499 } 3500 } else { 3501 un->un_pos.eof = ST_NO_EOF; 3502 } 3503 3504 /* 3505 * Do we need to write a file mark? 3506 * 3507 * only write filemarks if there are fmks to be written and 3508 * - open for write (possibly read/write) 3509 * - the last operation was a write 3510 * or: 3511 * - opened for wronly 3512 * - no data was written 3513 */ 3514 } else if ((un->un_pos.pmode != invalid) && 3515 (un->un_fmneeded > 0) && 3516 (((flag & FWRITE) && 3517 ((un->un_lastop == ST_OP_WRITE)||(un->un_lastop == ST_OP_WEOF))) || 3518 ((flag == FWRITE) && (un->un_lastop == ST_OP_NIL)))) { 3519 3520 /* save ST_EOM state */ 3521 int was_at_eom = (un->un_pos.eof == ST_EOM) ? 1 : 0; 3522 3523 /* 3524 * Note that we will write a filemark if we had opened 3525 * the tape write only and no data was written, thus 3526 * creating a null file. 3527 * 3528 * If the user already wrote one, we only have to write 1 more. 3529 * If they wrote two, we don't have to write any. 3530 */ 3531 3532 count = un->un_fmneeded; 3533 if (count > 0) { 3534 if (st_cmd(un, SCMD_WRITE_FILE_MARK, count, SYNC_CMD)) { 3535 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 3536 "st_close : EIO can't wfm\n"); 3537 err = EIO; 3538 goto error_out; 3539 } 3540 if ((un->un_dp->options & ST_REEL) && 3541 (minor & MT_NOREWIND)) { 3542 if (st_cmd(un, SCMD_SPACE, Fmk(-1), SYNC_CMD)) { 3543 ST_DEBUG2(ST_DEVINFO, st_label, 3544 SCSI_DEBUG, 3545 "st_close : EIO space fmk(-1)\n"); 3546 err = EIO; 3547 goto error_out; 3548 } 3549 un->un_pos.eof = ST_NO_EOF; 3550 /* fix up block number */ 3551 un->un_pos.blkno = 0; 3552 } 3553 } 3554 3555 /* 3556 * If we aren't going to be rewinding, and we were at 3557 * physical eot, restore the state that indicates we 3558 * are at physical eot. Once you have reached physical 3559 * eot, and you close the tape, the only thing you can 3560 * do on the next open is to rewind. Access to trailer 3561 * records is only allowed without closing the device. 3562 */ 3563 if ((minor & MT_NOREWIND) == 0 && was_at_eom) { 3564 un->un_pos.eof = ST_EOM; 3565 } 3566 } 3567 3568 /* 3569 * report soft errors if enabled and available, if we never accessed 3570 * the drive, don't get errors. This will prevent some DAT error 3571 * messages upon LOG SENSE. 3572 */ 3573 if (st_report_soft_errors_on_close && 3574 (un->un_dp->options & ST_SOFT_ERROR_REPORTING) && 3575 (last_state != ST_STATE_OFFLINE)) { 3576 if (st_report_soft_errors(dev, flag)) { 3577 err = EIO; 3578 goto error_out; 3579 } 3580 } 3581 3582 3583 /* 3584 * Do we need to rewind? Can we rewind? 3585 */ 3586 if ((minor & MT_NOREWIND) == 0 && 3587 un->un_pos.pmode != invalid && err == 0) { 3588 /* 3589 * We'd like to rewind with the 3590 * 'immediate' bit set, but this 3591 * causes problems on some drives 3592 * where subsequent opens get a 3593 * 'NOT READY' error condition 3594 * back while the tape is rewinding, 3595 * which is impossible to distinguish 3596 * from the condition of 'no tape loaded'. 3597 * 3598 * Also, for some targets, if you disconnect 3599 * with the 'immediate' bit set, you don't 3600 * actually return right away, i.e., the 3601 * target ignores your request for immediate 3602 * return. 3603 * 3604 * Instead, we'll fire off an async rewind 3605 * command. We'll mark the device as closed, 3606 * and any subsequent open will stall on 3607 * the first TEST_UNIT_READY until the rewind 3608 * completes. 3609 */ 3610 3611 /* 3612 * Used to be if reserve was not supported we'd send an 3613 * asynchronious rewind. Comments above may be slightly invalid 3614 * as the immediate bit was never set. Doing an immedate rewind 3615 * makes sense, I think fixes to not ready status might handle 3616 * the problems described above. 3617 */ 3618 if (un->un_sd->sd_inq->inq_ansi < 2) { 3619 if (st_cmd(un, SCMD_REWIND, 0, SYNC_CMD)) { 3620 err = EIO; 3621 } 3622 } else { 3623 /* flush data for older drives per scsi spec. */ 3624 if (st_cmd(un, SCMD_WRITE_FILE_MARK, 0, SYNC_CMD)) { 3625 err = EIO; 3626 } else if (st_cmd(un, SCMD_REWIND, 1, ASYNC_CMD)) { 3627 err = EIO; 3628 } 3629 } 3630 /* 3631 * Setting positions invalid in case the rewind doesn't 3632 * happen. Drives don't like to rewind if resets happen 3633 * they will tend to move back to where the rewind was 3634 * issued if a reset or something happens so that if a 3635 * write happens the data doesn't get clobbered. 3636 * 3637 * Not a big deal if the position is invalid when the 3638 * open occures it will do a read position. 3639 */ 3640 un->un_pos.pmode = invalid; 3641 un->un_running.pmode = invalid; 3642 3643 if (err == EIO) { 3644 goto error_out; 3645 } 3646 } 3647 3648 /* 3649 * eject tape if necessary 3650 */ 3651 if (un->un_eject_tape_on_failure) { 3652 un->un_eject_tape_on_failure = 0; 3653 if (st_cmd(un, SCMD_LOAD, LD_UNLOAD, SYNC_CMD)) { 3654 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 3655 "st_close : can't unload tape\n"); 3656 err = EIO; 3657 goto error_out; 3658 } else { 3659 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 3660 "st_close : tape unloaded \n"); 3661 un->un_pos.eof = ST_NO_EOF; 3662 un->un_mediastate = MTIO_EJECTED; 3663 } 3664 } 3665 /* 3666 * Release the tape unit, if default reserve/release 3667 * behaviour. 3668 */ 3669 if ((un->un_rsvd_status & 3670 (ST_RESERVE | ST_PRESERVE_RESERVE)) == ST_RESERVE) { 3671 (void) st_reserve_release(un, ST_RELEASE, st_uscsi_cmd); 3672 } 3673 error_out: 3674 /* 3675 * clear up state 3676 */ 3677 un->un_laststate = un->un_state; 3678 un->un_state = ST_STATE_CLOSED; 3679 un->un_lastop = ST_OP_NIL; 3680 un->un_throttle = 1; /* assume one request at time, for now */ 3681 un->un_retry_ct = 0; 3682 un->un_errno = 0; 3683 un->un_swr_token = (opaque_t)NULL; 3684 un->un_rsvd_status &= ~(ST_INIT_RESERVE); 3685 3686 /* Restore the options to the init time settings */ 3687 if (un->un_init_options & ST_READ_IGNORE_ILI) { 3688 un->un_dp->options |= ST_READ_IGNORE_ILI; 3689 } else { 3690 un->un_dp->options &= ~ST_READ_IGNORE_ILI; 3691 } 3692 3693 if (un->un_init_options & ST_READ_IGNORE_EOFS) { 3694 un->un_dp->options |= ST_READ_IGNORE_EOFS; 3695 } else { 3696 un->un_dp->options &= ~ST_READ_IGNORE_EOFS; 3697 } 3698 3699 if (un->un_init_options & ST_SHORT_FILEMARKS) { 3700 un->un_dp->options |= ST_SHORT_FILEMARKS; 3701 } else { 3702 un->un_dp->options &= ~ST_SHORT_FILEMARKS; 3703 } 3704 3705 ASSERT(mutex_owned(ST_MUTEX)); 3706 3707 /* 3708 * Signal anyone awaiting a close operation to complete. 3709 */ 3710 cv_signal(&un->un_clscv); 3711 3712 /* 3713 * any kind of error on closing causes all state to be tossed 3714 */ 3715 if (err && un->un_status != KEY_ILLEGAL_REQUEST) { 3716 /* 3717 * note that st_intr has already set 3718 * un_pos.pmode to invalid. 3719 */ 3720 un->un_density_known = 0; 3721 } 3722 3723 #ifdef __x86 3724 /* 3725 * free any contiguous mem alloc'ed for big block I/O 3726 */ 3727 cp = un->un_contig_mem; 3728 while (cp) { 3729 if (cp->cm_addr) { 3730 ddi_dma_mem_free(&cp->cm_acc_hdl); 3731 } 3732 cp_temp = cp; 3733 cp = cp->cm_next; 3734 kmem_free(cp_temp, 3735 sizeof (struct contig_mem) + biosize()); 3736 } 3737 un->un_contig_mem_total_num = 0; 3738 un->un_contig_mem_available_num = 0; 3739 un->un_contig_mem = NULL; 3740 un->un_max_contig_mem_len = 0; 3741 #endif 3742 3743 ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG, 3744 "st_close3: return val = %x, fileno=%x, blkno=%x, eof=%x\n", 3745 err, un->un_pos.fileno, un->un_pos.blkno, un->un_pos.eof); 3746 3747 mutex_exit(ST_MUTEX); 3748 return (err); 3749 } 3750 3751 /* 3752 * These routines perform raw i/o operations. 3753 */ 3754 3755 /* ARGSUSED2 */ 3756 static int 3757 st_aread(dev_t dev, struct aio_req *aio, cred_t *cred_p) 3758 { 3759 #ifdef STDEBUG 3760 GET_SOFT_STATE(dev); 3761 ST_ENTR(ST_DEVINFO, st_aread); 3762 #endif 3763 return (st_arw(dev, aio, B_READ)); 3764 } 3765 3766 3767 /* ARGSUSED2 */ 3768 static int 3769 st_awrite(dev_t dev, struct aio_req *aio, cred_t *cred_p) 3770 { 3771 #ifdef STDEBUG 3772 GET_SOFT_STATE(dev); 3773 ST_ENTR(ST_DEVINFO, st_awrite); 3774 #endif 3775 return (st_arw(dev, aio, B_WRITE)); 3776 } 3777 3778 3779 3780 /* ARGSUSED */ 3781 static int 3782 st_read(dev_t dev, struct uio *uiop, cred_t *cred_p) 3783 { 3784 #ifdef STDEBUG 3785 GET_SOFT_STATE(dev); 3786 ST_ENTR(ST_DEVINFO, st_read); 3787 #endif 3788 return (st_rw(dev, uiop, B_READ)); 3789 } 3790 3791 /* ARGSUSED */ 3792 static int 3793 st_write(dev_t dev, struct uio *uiop, cred_t *cred_p) 3794 { 3795 #ifdef STDEBUG 3796 GET_SOFT_STATE(dev); 3797 ST_ENTR(ST_DEVINFO, st_write); 3798 #endif 3799 return (st_rw(dev, uiop, B_WRITE)); 3800 } 3801 3802 /* 3803 * Due to historical reasons, old limits are: For variable-length devices: 3804 * if greater than 64KB - 1 (ST_MAXRECSIZE_VARIABLE), block into 64 KB - 2 3805 * ST_MAXRECSIZE_VARIABLE_LIMIT) requests; otherwise, 3806 * (let it through unmodified. For fixed-length record devices: 3807 * 63K (ST_MAXRECSIZE_FIXED) is max (default minphys). 3808 * 3809 * The new limits used are un_maxdma (retrieved using scsi_ifgetcap() 3810 * from the HBA) and un_maxbsize (retrieved by sending SCMD_READ_BLKLIM 3811 * command to the drive). 3812 * 3813 */ 3814 static void 3815 st_minphys(struct buf *bp) 3816 { 3817 struct scsi_tape *un; 3818 3819 un = ddi_get_soft_state(st_state, MTUNIT(bp->b_edev)); 3820 3821 ST_FUNC(ST_DEVINFO, st_minphys); 3822 3823 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 3824 "st_minphys(bp = 0x%p): b_bcount = 0x%lx\n", (void *)bp, 3825 bp->b_bcount); 3826 3827 if (un->un_allow_large_xfer) { 3828 3829 /* 3830 * check un_maxbsize for variable length devices only 3831 */ 3832 if (un->un_bsize == 0 && bp->b_bcount > un->un_maxbsize) { 3833 bp->b_bcount = un->un_maxbsize; 3834 } 3835 /* 3836 * can't go more that HBA maxdma limit in either fixed-length 3837 * or variable-length tape drives. 3838 */ 3839 if (bp->b_bcount > un->un_maxdma) { 3840 bp->b_bcount = un->un_maxdma; 3841 } 3842 } else { 3843 3844 /* 3845 * use old fixed limits 3846 */ 3847 if (un->un_bsize == 0) { 3848 if (bp->b_bcount > ST_MAXRECSIZE_VARIABLE) { 3849 bp->b_bcount = ST_MAXRECSIZE_VARIABLE_LIMIT; 3850 } 3851 } else { 3852 if (bp->b_bcount > ST_MAXRECSIZE_FIXED) { 3853 bp->b_bcount = ST_MAXRECSIZE_FIXED; 3854 } 3855 } 3856 } 3857 3858 /* 3859 * For regular raw I/O and Fixed Block length devices, make sure 3860 * the adjusted block count is a whole multiple of the device 3861 * block size. 3862 */ 3863 if (bp != un->un_sbufp && un->un_bsize) { 3864 bp->b_bcount -= (bp->b_bcount % un->un_bsize); 3865 } 3866 } 3867 3868 static int 3869 st_rw(dev_t dev, struct uio *uio, int flag) 3870 { 3871 int rval = 0; 3872 long len; 3873 3874 GET_SOFT_STATE(dev); 3875 3876 ST_FUNC(ST_DEVINFO, st_rw); 3877 3878 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 3879 "st_rw(dev = 0x%lx, flag = %s)\n", dev, 3880 (flag == B_READ ? rd_str: wr_str)); 3881 3882 /* get local copy of transfer length */ 3883 len = uio->uio_iov->iov_len; 3884 3885 mutex_enter(ST_MUTEX); 3886 3887 /* 3888 * Clear error entry stack 3889 */ 3890 st_empty_error_stack(un); 3891 3892 /* 3893 * If in fixed block size mode and requested read or write 3894 * is not an even multiple of that block size. 3895 */ 3896 if ((un->un_bsize != 0) && (len % un->un_bsize != 0)) { 3897 scsi_log(ST_DEVINFO, st_label, CE_WARN, 3898 "%s: not modulo %d block size\n", 3899 (flag == B_WRITE) ? wr_str : rd_str, un->un_bsize); 3900 rval = EINVAL; 3901 } 3902 3903 /* If device has set granularity in the READ_BLKLIM we honor it. */ 3904 if ((un->un_data_mod != 0) && (len % un->un_data_mod != 0)) { 3905 scsi_log(ST_DEVINFO, st_label, CE_WARN, 3906 "%s: not modulo %d device granularity\n", 3907 (flag == B_WRITE) ? wr_str : rd_str, un->un_data_mod); 3908 rval = EINVAL; 3909 } 3910 3911 if (st_recov_sz != sizeof (recov_info) && un->un_multipath) { 3912 scsi_log(ST_DEVINFO, st_label, CE_WARN, mp_misconf); 3913 rval = EFAULT; 3914 } 3915 3916 if (rval != 0) { 3917 un->un_errno = rval; 3918 mutex_exit(ST_MUTEX); 3919 return (rval); 3920 } 3921 3922 /* 3923 * Reset this so it can be set if Berkeley and read over a filemark. 3924 */ 3925 un->un_silent_skip = 0; 3926 mutex_exit(ST_MUTEX); 3927 3928 len = uio->uio_resid; 3929 3930 rval = physio(st_queued_strategy, (struct buf *)NULL, 3931 dev, flag, st_minphys, uio); 3932 /* 3933 * if we have hit logical EOT during this xfer and there is not a 3934 * full residue, then set eof back to ST_EOM to make sure that 3935 * the user will see at least one zero write 3936 * after this short write 3937 */ 3938 mutex_enter(ST_MUTEX); 3939 if (un->un_pos.eof > ST_NO_EOF) { 3940 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 3941 "eof=%d resid=%lx\n", un->un_pos.eof, uio->uio_resid); 3942 } 3943 if (un->un_pos.eof >= ST_EOM && (flag == B_WRITE)) { 3944 if ((uio->uio_resid != len) && (uio->uio_resid != 0)) { 3945 un->un_pos.eof = ST_EOM; 3946 } else if (uio->uio_resid == len) { 3947 un->un_pos.eof = ST_NO_EOF; 3948 } 3949 } 3950 3951 if (un->un_silent_skip && uio->uio_resid != len) { 3952 un->un_pos.eof = ST_EOF; 3953 un->un_pos.blkno = un->un_save_blkno; 3954 un->un_pos.fileno--; 3955 } 3956 3957 un->un_errno = rval; 3958 3959 mutex_exit(ST_MUTEX); 3960 3961 return (rval); 3962 } 3963 3964 static int 3965 st_arw(dev_t dev, struct aio_req *aio, int flag) 3966 { 3967 struct uio *uio = aio->aio_uio; 3968 int rval = 0; 3969 long len; 3970 3971 GET_SOFT_STATE(dev); 3972 3973 ST_FUNC(ST_DEVINFO, st_arw); 3974 3975 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 3976 "st_arw(dev = 0x%lx, flag = %s)\n", dev, 3977 (flag == B_READ ? rd_str: wr_str)); 3978 3979 /* get local copy of transfer length */ 3980 len = uio->uio_iov->iov_len; 3981 3982 mutex_enter(ST_MUTEX); 3983 3984 /* 3985 * If in fixed block size mode and requested read or write 3986 * is not an even multiple of that block size. 3987 */ 3988 if ((un->un_bsize != 0) && (len % un->un_bsize != 0)) { 3989 scsi_log(ST_DEVINFO, st_label, CE_WARN, 3990 "%s: not modulo %d block size\n", 3991 (flag == B_WRITE) ? wr_str : rd_str, un->un_bsize); 3992 rval = EINVAL; 3993 } 3994 3995 /* If device has set granularity in the READ_BLKLIM we honor it. */ 3996 if ((un->un_data_mod != 0) && (len % un->un_data_mod != 0)) { 3997 scsi_log(ST_DEVINFO, st_label, CE_WARN, 3998 "%s: not modulo %d device granularity\n", 3999 (flag == B_WRITE) ? wr_str : rd_str, un->un_data_mod); 4000 rval = EINVAL; 4001 } 4002 4003 if (st_recov_sz != sizeof (recov_info) && un->un_multipath) { 4004 scsi_log(ST_DEVINFO, st_label, CE_WARN, mp_misconf); 4005 rval = EFAULT; 4006 } 4007 4008 if (rval != 0) { 4009 un->un_errno = rval; 4010 mutex_exit(ST_MUTEX); 4011 return (rval); 4012 } 4013 4014 mutex_exit(ST_MUTEX); 4015 4016 len = uio->uio_resid; 4017 4018 rval = 4019 aphysio(st_queued_strategy, anocancel, dev, flag, st_minphys, aio); 4020 4021 /* 4022 * if we have hit logical EOT during this xfer and there is not a 4023 * full residue, then set eof back to ST_EOM to make sure that 4024 * the user will see at least one zero write 4025 * after this short write 4026 * 4027 * we keep this here just in case the application is not using 4028 * persistent errors 4029 */ 4030 mutex_enter(ST_MUTEX); 4031 if (un->un_pos.eof > ST_NO_EOF) { 4032 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 4033 "eof=%d resid=%lx\n", un->un_pos.eof, uio->uio_resid); 4034 } 4035 if (un->un_pos.eof >= ST_EOM && (flag == B_WRITE)) { 4036 if ((uio->uio_resid != len) && (uio->uio_resid != 0)) { 4037 un->un_pos.eof = ST_EOM; 4038 } else if (uio->uio_resid == len && 4039 !(un->un_persistence && un->un_persist_errors)) { 4040 un->un_pos.eof = ST_NO_EOF; 4041 } 4042 } 4043 un->un_errno = rval; 4044 mutex_exit(ST_MUTEX); 4045 4046 return (rval); 4047 } 4048 4049 4050 4051 static int 4052 st_queued_strategy(buf_t *bp) 4053 { 4054 struct scsi_tape *un; 4055 char reading = bp->b_flags & B_READ; 4056 int wasopening = 0; 4057 4058 /* 4059 * validate arguments 4060 */ 4061 un = ddi_get_soft_state(st_state, MTUNIT(bp->b_edev)); 4062 if (un == NULL) { 4063 bp->b_resid = bp->b_bcount; 4064 bioerror(bp, ENXIO); 4065 ST_DEBUG6(NULL, st_label, SCSI_DEBUG, 4066 "st_queued_strategy: ENXIO error exit\n"); 4067 biodone(bp); 4068 return (0); 4069 } 4070 4071 ST_ENTR(ST_DEVINFO, st_queued_strategy); 4072 4073 mutex_enter(ST_MUTEX); 4074 4075 while (un->un_pwr_mgmt == ST_PWR_SUSPENDED) { 4076 cv_wait(&un->un_suspend_cv, ST_MUTEX); 4077 } 4078 4079 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 4080 "st_queued_strategy(): bcount=0x%lx, fileno=%d, blkno=%x, eof=%d\n", 4081 bp->b_bcount, un->un_pos.fileno, un->un_pos.blkno, un->un_pos.eof); 4082 4083 /* 4084 * If persistent errors have been flagged, just nix this one. We wait 4085 * for any outstanding I/O's below, so we will be in order. 4086 */ 4087 if (un->un_persistence && un->un_persist_errors) { 4088 goto exit; 4089 } 4090 4091 /* 4092 * If last command was non queued, wait till it finishes. 4093 */ 4094 while (un->un_sbuf_busy) { 4095 cv_wait(&un->un_sbuf_cv, ST_MUTEX); 4096 /* woke up because of an error */ 4097 if (un->un_persistence && un->un_persist_errors) { 4098 goto exit; 4099 } 4100 } 4101 4102 /* 4103 * s_buf and recovery commands shouldn't come here. 4104 */ 4105 ASSERT(bp != un->un_recov_buf); 4106 ASSERT(bp != un->un_sbufp); 4107 4108 /* 4109 * If we haven't done/checked reservation on the tape unit 4110 * do it now. 4111 */ 4112 if ((un->un_rsvd_status & 4113 (ST_RESERVE | ST_APPLICATION_RESERVATIONS)) == 0) { 4114 if ((un->un_dp->options & ST_NO_RESERVE_RELEASE) == 0) { 4115 if (st_reserve_release(un, ST_RESERVE, st_uscsi_cmd)) { 4116 st_bioerror(bp, un->un_errno); 4117 goto exit; 4118 } 4119 } else if (un->un_state == ST_STATE_OPEN_PENDING_IO) { 4120 /* 4121 * Enter here to restore position for possible 4122 * resets when the device was closed and opened 4123 * in O_NDELAY mode subsequently 4124 */ 4125 un->un_state = ST_STATE_INITIALIZING; 4126 (void) st_cmd(un, SCMD_TEST_UNIT_READY, 4127 0, SYNC_CMD); 4128 un->un_state = ST_STATE_OPEN_PENDING_IO; 4129 } 4130 un->un_rsvd_status |= ST_INIT_RESERVE; 4131 } 4132 4133 /* 4134 * If we are offline, we have to initialize everything first. 4135 * This is to handle either when opened with O_NDELAY, or 4136 * we just got a new tape in the drive, after an offline. 4137 * We don't observe O_NDELAY past the open, 4138 * as it will not make sense for tapes. 4139 */ 4140 if (un->un_state == ST_STATE_OFFLINE || un->un_restore_pos) { 4141 /* 4142 * reset state to avoid recursion 4143 */ 4144 un->un_laststate = un->un_state; 4145 un->un_state = ST_STATE_INITIALIZING; 4146 if (st_tape_init(un)) { 4147 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 4148 "stioctl : OFFLINE init failure "); 4149 un->un_state = ST_STATE_OFFLINE; 4150 un->un_pos.pmode = invalid; 4151 goto b_done_err; 4152 } 4153 /* un_restore_pos make invalid */ 4154 un->un_state = ST_STATE_OPEN_PENDING_IO; 4155 un->un_restore_pos = 0; 4156 } 4157 /* 4158 * Check for legal operations 4159 */ 4160 if (un->un_pos.pmode == invalid) { 4161 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 4162 "strategy with un->un_pos.pmode invalid\n"); 4163 goto b_done_err; 4164 } 4165 4166 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 4167 "st_queued_strategy(): regular io\n"); 4168 4169 /* 4170 * Process this first. If we were reading, and we're pending 4171 * logical eot, that means we've bumped one file mark too far. 4172 */ 4173 4174 /* 4175 * Recursion warning: st_cmd will route back through here. 4176 * Not anymore st_cmd will go through st_strategy()! 4177 */ 4178 if (un->un_pos.eof == ST_EOT_PENDING) { 4179 if (st_cmd(un, SCMD_SPACE, Fmk(-1), SYNC_CMD)) { 4180 un->un_pos.pmode = invalid; 4181 un->un_density_known = 0; 4182 goto b_done_err; 4183 } 4184 un->un_pos.blkno = 0; /* fix up block number.. */ 4185 un->un_pos.eof = ST_EOT; 4186 } 4187 4188 /* 4189 * If we are in the process of opening, we may have to 4190 * determine/set the correct density. We also may have 4191 * to do a test_append (if QIC) to see whether we are 4192 * in a position to append to the end of the tape. 4193 * 4194 * If we're already at logical eot, we transition 4195 * to ST_NO_EOF. If we're at physical eot, we punt 4196 * to the switch statement below to handle. 4197 */ 4198 if ((un->un_state == ST_STATE_OPEN_PENDING_IO) || 4199 (un->un_test_append && (un->un_dp->options & ST_QIC))) { 4200 4201 if (un->un_state == ST_STATE_OPEN_PENDING_IO) { 4202 if (st_determine_density(un, (int)reading)) { 4203 goto b_done_err; 4204 } 4205 } 4206 4207 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 4208 "pending_io@fileno %d rw %d qic %d eof %d\n", 4209 un->un_pos.fileno, (int)reading, 4210 (un->un_dp->options & ST_QIC) ? 1 : 0, 4211 un->un_pos.eof); 4212 4213 if (!reading && un->un_pos.eof != ST_EOM) { 4214 if (un->un_pos.eof == ST_EOT) { 4215 un->un_pos.eof = ST_NO_EOF; 4216 } else if (un->un_pos.pmode != invalid && 4217 (un->un_dp->options & ST_QIC)) { 4218 /* 4219 * st_test_append() will do it all 4220 */ 4221 st_test_append(bp); 4222 mutex_exit(ST_MUTEX); 4223 return (0); 4224 } 4225 } 4226 if (un->un_state == ST_STATE_OPEN_PENDING_IO) { 4227 wasopening = 1; 4228 } 4229 un->un_laststate = un->un_state; 4230 un->un_state = ST_STATE_OPEN; 4231 } 4232 4233 4234 /* 4235 * Process rest of END OF FILE and END OF TAPE conditions 4236 */ 4237 4238 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 4239 "eof=%x, wasopening=%x\n", 4240 un->un_pos.eof, wasopening); 4241 4242 switch (un->un_pos.eof) { 4243 case ST_EOM: 4244 /* 4245 * This allows writes to proceed past physical 4246 * eot. We'll *really* be in trouble if the 4247 * user continues blindly writing data too 4248 * much past this point (unwind the tape). 4249 * Physical eot really means 'early warning 4250 * eot' in this context. 4251 * 4252 * Every other write from now on will succeed 4253 * (if sufficient tape left). 4254 * This write will return with resid == count 4255 * but the next one should be successful 4256 * 4257 * Note that we only transition to logical EOT 4258 * if the last state wasn't the OPENING state. 4259 * We explicitly prohibit running up to physical 4260 * eot, closing the device, and then re-opening 4261 * to proceed. Trailer records may only be gotten 4262 * at by keeping the tape open after hitting eot. 4263 * 4264 * Also note that ST_EOM cannot be set by reading- 4265 * this can only be set during writing. Reading 4266 * up to the end of the tape gets a blank check 4267 * or a double-filemark indication (ST_EOT_PENDING), 4268 * and we prohibit reading after that point. 4269 * 4270 */ 4271 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, "EOM\n"); 4272 if (wasopening == 0) { 4273 /* 4274 * this allows st_rw() to reset it back to 4275 * will see a zero write 4276 */ 4277 un->un_pos.eof = ST_WRITE_AFTER_EOM; 4278 } 4279 un->un_status = SUN_KEY_EOT; 4280 goto b_done; 4281 4282 case ST_WRITE_AFTER_EOM: 4283 case ST_EOT: 4284 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, "EOT\n"); 4285 un->un_status = SUN_KEY_EOT; 4286 if (SVR4_BEHAVIOR && reading) { 4287 goto b_done_err; 4288 } 4289 4290 if (reading) { 4291 goto b_done; 4292 } 4293 un->un_pos.eof = ST_NO_EOF; 4294 break; 4295 4296 case ST_EOF_PENDING: 4297 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 4298 "EOF PENDING\n"); 4299 un->un_status = SUN_KEY_EOF; 4300 if (SVR4_BEHAVIOR) { 4301 un->un_pos.eof = ST_EOF; 4302 goto b_done; 4303 } 4304 /* FALLTHROUGH */ 4305 case ST_EOF: 4306 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, "EOF\n"); 4307 un->un_status = SUN_KEY_EOF; 4308 if (SVR4_BEHAVIOR) { 4309 goto b_done_err; 4310 } 4311 4312 if (BSD_BEHAVIOR) { 4313 un->un_pos.eof = ST_NO_EOF; 4314 un->un_pos.fileno += 1; 4315 un->un_pos.blkno = 0; 4316 } 4317 4318 if (reading) { 4319 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 4320 "now file %d (read)\n", 4321 un->un_pos.fileno); 4322 goto b_done; 4323 } 4324 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 4325 "now file %d (write)\n", un->un_pos.fileno); 4326 break; 4327 default: 4328 un->un_status = 0; 4329 break; 4330 } 4331 4332 bp->b_flags &= ~(B_DONE); 4333 st_bioerror(bp, 0); 4334 bp->av_forw = NULL; 4335 bp->b_resid = 0; 4336 SET_BP_PKT(bp, 0); 4337 4338 4339 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 4340 "st_queued_strategy: cmd=0x%p count=%ld resid=%ld flags=0x%x" 4341 " pkt=0x%p\n", 4342 (void *)bp->b_forw, bp->b_bcount, 4343 bp->b_resid, bp->b_flags, (void *)BP_PKT(bp)); 4344 4345 #ifdef __x86 4346 /* 4347 * We will replace bp with a new bp that can do big blk xfer 4348 * if the requested xfer size is bigger than un->un_maxdma_arch 4349 * 4350 * Also, we need to make sure that we're handling real I/O 4351 * by checking group 0/1 SCSI I/O commands, if needed 4352 */ 4353 if (bp->b_bcount > un->un_maxdma_arch && 4354 ((uchar_t)(uintptr_t)bp->b_forw == SCMD_READ || 4355 (uchar_t)(uintptr_t)bp->b_forw == SCMD_READ_G4 || 4356 (uchar_t)(uintptr_t)bp->b_forw == SCMD_WRITE || 4357 (uchar_t)(uintptr_t)bp->b_forw == SCMD_WRITE_G4)) { 4358 mutex_exit(ST_MUTEX); 4359 bp = st_get_bigblk_bp(bp); 4360 mutex_enter(ST_MUTEX); 4361 } 4362 #endif 4363 4364 /* put on wait queue */ 4365 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 4366 "st_queued_strategy: un->un_quef = 0x%p, bp = 0x%p\n", 4367 (void *)un->un_quef, (void *)bp); 4368 4369 st_add_to_queue(&un->un_quef, &un->un_quel, un->un_quel, bp); 4370 4371 ST_DO_KSTATS(bp, kstat_waitq_enter); 4372 4373 st_start(un); 4374 4375 mutex_exit(ST_MUTEX); 4376 return (0); 4377 4378 b_done_err: 4379 st_bioerror(bp, EIO); 4380 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 4381 "st_queued_strategy : EIO b_done_err\n"); 4382 4383 b_done: 4384 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 4385 "st_queued_strategy: b_done\n"); 4386 4387 exit: 4388 /* 4389 * make sure no commands are outstanding or waiting before closing, 4390 * so we can guarantee order 4391 */ 4392 st_wait_for_io(un); 4393 un->un_err_resid = bp->b_resid = bp->b_bcount; 4394 4395 /* override errno here, if persistent errors were flagged */ 4396 if (un->un_persistence && un->un_persist_errors) 4397 bioerror(bp, un->un_errno); 4398 4399 mutex_exit(ST_MUTEX); 4400 4401 biodone(bp); 4402 ASSERT(mutex_owned(ST_MUTEX) == 0); 4403 return (0); 4404 } 4405 4406 4407 static int 4408 st_strategy(struct buf *bp) 4409 { 4410 struct scsi_tape *un; 4411 4412 /* 4413 * validate arguments 4414 */ 4415 un = ddi_get_soft_state(st_state, MTUNIT(bp->b_edev)); 4416 if (un == NULL) { 4417 bp->b_resid = bp->b_bcount; 4418 bioerror(bp, ENXIO); 4419 ST_DEBUG6(NULL, st_label, SCSI_DEBUG, 4420 "st_strategy: ENXIO error exit\n"); 4421 4422 biodone(bp); 4423 return (0); 4424 4425 } 4426 4427 ST_ENTR(ST_DEVINFO, st_strategy); 4428 4429 mutex_enter(ST_MUTEX); 4430 4431 while (un->un_pwr_mgmt == ST_PWR_SUSPENDED) { 4432 cv_wait(&un->un_suspend_cv, ST_MUTEX); 4433 } 4434 4435 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 4436 "st_strategy(): bcount=0x%lx, fileno=%d, blkno=%x, eof=%d\n", 4437 bp->b_bcount, un->un_pos.fileno, un->un_pos.blkno, un->un_pos.eof); 4438 4439 ASSERT((bp == un->un_recov_buf) || (bp == un->un_sbufp)); 4440 4441 bp->b_flags &= ~(B_DONE); 4442 st_bioerror(bp, 0); 4443 bp->av_forw = NULL; 4444 bp->b_resid = 0; 4445 SET_BP_PKT(bp, 0); 4446 4447 4448 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 4449 "st_strategy: cmd=0x%x count=%ld resid=%ld flags=0x%x" 4450 " pkt=0x%p\n", 4451 (unsigned char)(uintptr_t)bp->b_forw, bp->b_bcount, 4452 bp->b_resid, bp->b_flags, (void *)BP_PKT(bp)); 4453 ST_DO_KSTATS(bp, kstat_waitq_enter); 4454 4455 st_start(un); 4456 4457 mutex_exit(ST_MUTEX); 4458 return (0); 4459 } 4460 4461 /* 4462 * this routine spaces forward over filemarks 4463 */ 4464 static int 4465 st_space_fmks(struct scsi_tape *un, int64_t count) 4466 { 4467 int rval = 0; 4468 4469 ST_FUNC(ST_DEVINFO, st_space_fmks); 4470 4471 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 4472 "st_space_fmks(dev = 0x%lx, count = %"PRIx64")\n", 4473 un->un_dev, count); 4474 4475 ASSERT(mutex_owned(ST_MUTEX)); 4476 4477 /* 4478 * the risk with doing only one space operation is that we 4479 * may accidentily jump in old data 4480 * the exabyte 8500 reading 8200 tapes cannot use KNOWS_EOD 4481 * because the 8200 does not append a marker; in order not to 4482 * sacrifice the fast file skip, we do a slow skip if the low 4483 * density device has been opened 4484 */ 4485 4486 if ((un->un_dp->options & ST_KNOWS_EOD) && 4487 !((un->un_dp->type == ST_TYPE_EXB8500 && 4488 MT_DENSITY(un->un_dev) == 0))) { 4489 if (st_cmd(un, SCMD_SPACE, Fmk(count), SYNC_CMD)) { 4490 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 4491 "space_fmks : EIO can't do space cmd #1\n"); 4492 rval = EIO; 4493 } 4494 } else { 4495 while (count > 0) { 4496 if (st_cmd(un, SCMD_SPACE, Fmk(1), SYNC_CMD)) { 4497 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 4498 "space_fmks : EIO can't do space cmd #2\n"); 4499 rval = EIO; 4500 break; 4501 } 4502 count -= 1; 4503 /* 4504 * read a block to see if we have reached 4505 * end of medium (double filemark for reel or 4506 * medium error for others) 4507 */ 4508 if (count > 0) { 4509 if (st_cmd(un, SCMD_SPACE, Blk(1), SYNC_CMD)) { 4510 ST_DEBUG2(ST_DEVINFO, st_label, 4511 SCSI_DEBUG, 4512 "space_fmks : EIO can't do " 4513 "space cmd #3\n"); 4514 rval = EIO; 4515 break; 4516 } 4517 if ((un->un_pos.eof >= ST_EOF_PENDING) && 4518 (un->un_dp->options & ST_REEL)) { 4519 un->un_status = SUN_KEY_EOT; 4520 ST_DEBUG2(ST_DEVINFO, st_label, 4521 SCSI_DEBUG, 4522 "space_fmks : EIO ST_REEL\n"); 4523 rval = EIO; 4524 break; 4525 } else if (IN_EOF(un->un_pos)) { 4526 un->un_pos.eof = ST_NO_EOF; 4527 un->un_pos.fileno++; 4528 un->un_pos.blkno = 0; 4529 count--; 4530 } else if (un->un_pos.eof > ST_EOF) { 4531 ST_DEBUG2(ST_DEVINFO, st_label, 4532 SCSI_DEBUG, 4533 "space_fmks, EIO > ST_EOF\n"); 4534 rval = EIO; 4535 break; 4536 } 4537 4538 } 4539 } 4540 un->un_err_resid = count; 4541 COPY_POS(&un->un_pos, &un->un_err_pos); 4542 } 4543 ASSERT(mutex_owned(ST_MUTEX)); 4544 return (rval); 4545 } 4546 4547 /* 4548 * this routine spaces to EOD 4549 * 4550 * it keeps track of the current filenumber and returns the filenumber after 4551 * the last successful space operation, we keep the number high because as 4552 * tapes are getting larger, the possibility of more and more files exist, 4553 * 0x100000 (1 Meg of files) probably will never have to be changed any time 4554 * soon 4555 */ 4556 #define MAX_SKIP 0x100000 /* somewhat arbitrary */ 4557 4558 static int 4559 st_find_eod(struct scsi_tape *un) 4560 { 4561 tapepos_t savepos; 4562 int64_t sp_type; 4563 int result; 4564 4565 if (un == NULL) { 4566 return (-1); 4567 } 4568 4569 ST_FUNC(ST_DEVINFO, st_find_eod); 4570 4571 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 4572 "st_find_eod(dev = 0x%lx): fileno = %d\n", un->un_dev, 4573 un->un_pos.fileno); 4574 4575 ASSERT(mutex_owned(ST_MUTEX)); 4576 4577 COPY_POS(&savepos, &un->un_pos); 4578 4579 /* 4580 * see if the drive is smart enough to do the skips in 4581 * one operation; 1/2" use two filemarks 4582 * the exabyte 8500 reading 8200 tapes cannot use KNOWS_EOD 4583 * because the 8200 does not append a marker; in order not to 4584 * sacrifice the fast file skip, we do a slow skip if the low 4585 * density device has been opened 4586 */ 4587 if ((un->un_dp->options & ST_KNOWS_EOD) != 0) { 4588 if ((un->un_dp->type == ST_TYPE_EXB8500) && 4589 (MT_DENSITY(un->un_dev) == 0)) { 4590 sp_type = Fmk(1); 4591 } else if (un->un_pos.pmode == logical) { 4592 sp_type = SPACE(SP_EOD, 0); 4593 } else { 4594 sp_type = Fmk(MAX_SKIP); 4595 } 4596 } else { 4597 sp_type = Fmk(1); 4598 } 4599 4600 for (;;) { 4601 result = st_cmd(un, SCMD_SPACE, sp_type, SYNC_CMD); 4602 4603 if (result == 0) { 4604 COPY_POS(&savepos, &un->un_pos); 4605 } 4606 4607 if (sp_type == SPACE(SP_EOD, 0)) { 4608 if (result != 0) { 4609 sp_type = Fmk(MAX_SKIP); 4610 continue; 4611 } 4612 4613 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 4614 "st_find_eod: 0x%"PRIx64"\n", 4615 savepos.lgclblkno); 4616 /* 4617 * What we return will become the current file position. 4618 * After completing the space command with the position 4619 * mode that is not invalid a read position command will 4620 * be automaticly issued. If the drive support the long 4621 * read position format a valid file position can be 4622 * returned. 4623 */ 4624 return (un->un_pos.fileno); 4625 } 4626 4627 if (result != 0) { 4628 break; 4629 } 4630 4631 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 4632 "count=%"PRIx64", eof=%x, status=%x\n", 4633 SPACE_CNT(sp_type), un->un_pos.eof, un->un_status); 4634 4635 /* 4636 * If we're not EOM smart, space a record 4637 * to see whether we're now in the slot between 4638 * the two sequential filemarks that logical 4639 * EOM consists of (REEL) or hit nowhere land 4640 * (8mm). 4641 */ 4642 if (sp_type == Fmk(1)) { 4643 /* 4644 * no fast skipping, check a record 4645 */ 4646 if (st_cmd(un, SCMD_SPACE, Blk((1)), SYNC_CMD)) { 4647 break; 4648 } 4649 if ((un->un_pos.eof >= ST_EOF_PENDING) && 4650 (un->un_dp->options & ST_REEL)) { 4651 un->un_status = KEY_BLANK_CHECK; 4652 un->un_pos.fileno++; 4653 un->un_pos.blkno = 0; 4654 break; 4655 } 4656 if (IN_EOF(un->un_pos)) { 4657 un->un_pos.eof = ST_NO_EOF; 4658 un->un_pos.fileno++; 4659 un->un_pos.blkno = 0; 4660 } 4661 if (un->un_pos.eof > ST_EOF) { 4662 break; 4663 } 4664 } else { 4665 if (un->un_pos.eof > ST_EOF) { 4666 break; 4667 } 4668 } 4669 } 4670 4671 if (un->un_dp->options & ST_KNOWS_EOD) { 4672 COPY_POS(&savepos, &un->un_pos); 4673 } 4674 4675 ASSERT(mutex_owned(ST_MUTEX)); 4676 4677 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 4678 "st_find_eod: %x\n", savepos.fileno); 4679 return (savepos.fileno); 4680 } 4681 4682 4683 /* 4684 * this routine is frequently used in ioctls below; 4685 * it determines whether we know the density and if not will 4686 * determine it 4687 * if we have written the tape before, one or more filemarks are written 4688 * 4689 * depending on the stepflag, the head is repositioned to where it was before 4690 * the filemarks were written in order not to confuse step counts 4691 */ 4692 #define STEPBACK 0 4693 #define NO_STEPBACK 1 4694 4695 static int 4696 st_check_density_or_wfm(dev_t dev, int wfm, int mode, int stepflag) 4697 { 4698 4699 GET_SOFT_STATE(dev); 4700 4701 ST_FUNC(ST_DEVINFO, st_check_density_or_wfm); 4702 4703 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 4704 "st_check_density_or_wfm(dev= 0x%lx, wfm= %d, mode= %d, stpflg= %d)" 4705 "\n", dev, wfm, mode, stepflag); 4706 4707 ASSERT(mutex_owned(ST_MUTEX)); 4708 4709 /* 4710 * If we don't yet know the density of the tape we have inserted, 4711 * we have to either unconditionally set it (if we're 'writing'), 4712 * or we have to determine it. As side effects, check for any 4713 * write-protect errors, and for the need to put out any file-marks 4714 * before positioning a tape. 4715 * 4716 * If we are going to be spacing forward, and we haven't determined 4717 * the tape density yet, we have to do so now... 4718 */ 4719 if (un->un_state == ST_STATE_OPEN_PENDING_IO) { 4720 if (st_determine_density(un, mode)) { 4721 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 4722 "check_density_or_wfm : EIO can't determine " 4723 "density\n"); 4724 un->un_errno = EIO; 4725 return (EIO); 4726 } 4727 /* 4728 * Presumably we are at BOT. If we attempt to write, it will 4729 * either work okay, or bomb. We don't do a st_test_append 4730 * unless we're past BOT. 4731 */ 4732 un->un_laststate = un->un_state; 4733 un->un_state = ST_STATE_OPEN; 4734 4735 } else if (un->un_pos.pmode != invalid && un->un_fmneeded > 0 && 4736 ((un->un_lastop == ST_OP_WEOF && wfm) || 4737 (un->un_lastop == ST_OP_WRITE && wfm))) { 4738 4739 tapepos_t spos; 4740 4741 COPY_POS(&spos, &un->un_pos); 4742 4743 /* 4744 * We need to write one or two filemarks. 4745 * In the case of the HP, we need to 4746 * position the head between the two 4747 * marks. 4748 */ 4749 if ((un->un_fmneeded > 0) || (un->un_lastop == ST_OP_WEOF)) { 4750 wfm = un->un_fmneeded; 4751 un->un_fmneeded = 0; 4752 } 4753 4754 if (st_write_fm(dev, wfm)) { 4755 un->un_pos.pmode = invalid; 4756 un->un_density_known = 0; 4757 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 4758 "check_density_or_wfm : EIO can't write fm\n"); 4759 un->un_errno = EIO; 4760 return (EIO); 4761 } 4762 4763 if (stepflag == STEPBACK) { 4764 if (st_cmd(un, SCMD_SPACE, Fmk(-wfm), SYNC_CMD)) { 4765 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 4766 "check_density_or_wfm : EIO can't space " 4767 "(-wfm)\n"); 4768 un->un_errno = EIO; 4769 return (EIO); 4770 } 4771 COPY_POS(&un->un_pos, &spos); 4772 } 4773 } 4774 4775 /* 4776 * Whatever we do at this point clears the state of the eof flag. 4777 */ 4778 4779 un->un_pos.eof = ST_NO_EOF; 4780 4781 /* 4782 * If writing, let's check that we're positioned correctly 4783 * at the end of tape before issuing the next write. 4784 */ 4785 if (un->un_read_only == RDWR) { 4786 un->un_test_append = 1; 4787 } 4788 4789 ASSERT(mutex_owned(ST_MUTEX)); 4790 return (0); 4791 } 4792 4793 4794 /* 4795 * Wait for all outstaning I/O's to complete 4796 * 4797 * we wait on both ncmds and the wait queue for times when we are flushing 4798 * after persistent errors are flagged, which is when ncmds can be 0, and the 4799 * queue can still have I/O's. This way we preserve order of biodone's. 4800 */ 4801 static void 4802 st_wait_for_io(struct scsi_tape *un) 4803 { 4804 ST_FUNC(ST_DEVINFO, st_wait_for_io); 4805 ASSERT(mutex_owned(ST_MUTEX)); 4806 while ((un->un_ncmds) || (un->un_quef) || (un->un_runqf)) { 4807 cv_wait(&un->un_queue_cv, ST_MUTEX); 4808 } 4809 } 4810 4811 /* 4812 * This routine implements the ioctl calls. It is called 4813 * from the device switch at normal priority. 4814 */ 4815 /*ARGSUSED*/ 4816 static int 4817 st_ioctl(dev_t dev, int cmd, intptr_t arg, int flag, cred_t *cred_p, 4818 int *rval_p) 4819 { 4820 int tmp, rval = 0; 4821 4822 GET_SOFT_STATE(dev); 4823 4824 ST_ENTR(ST_DEVINFO, st_ioctl); 4825 4826 mutex_enter(ST_MUTEX); 4827 4828 ASSERT(un->un_recov_buf_busy == 0); 4829 4830 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 4831 "st_ioctl(): fileno=%x, blkno=%x, eof=%x, state = %d, " 4832 "pe_flag = %d\n", 4833 un->un_pos.fileno, un->un_pos.blkno, un->un_pos.eof, un->un_state, 4834 un->un_persistence && un->un_persist_errors); 4835 4836 /* 4837 * We don't want to block on these, so let them through 4838 * and we don't care about setting driver states here. 4839 */ 4840 if ((cmd == MTIOCGETDRIVETYPE) || 4841 (cmd == MTIOCGUARANTEEDORDER) || 4842 (cmd == MTIOCPERSISTENTSTATUS)) { 4843 goto check_commands; 4844 } 4845 4846 /* 4847 * We clear error entry stack except command 4848 * MTIOCGETERROR and MTIOCGET 4849 */ 4850 if ((cmd != MTIOCGETERROR) && 4851 (cmd != MTIOCGET)) { 4852 st_empty_error_stack(un); 4853 } 4854 4855 /* 4856 * wait for all outstanding commands to complete, or be dequeued. 4857 * And because ioctl's are synchronous commands, any return value 4858 * after this, will be in order 4859 */ 4860 st_wait_for_io(un); 4861 4862 /* 4863 * allow only a through clear errors and persistent status, and 4864 * status 4865 */ 4866 if (un->un_persistence && un->un_persist_errors) { 4867 if ((cmd == MTIOCLRERR) || 4868 (cmd == MTIOCPERSISTENT) || 4869 (cmd == MTIOCGET)) { 4870 goto check_commands; 4871 } else { 4872 rval = un->un_errno; 4873 goto exit; 4874 } 4875 } 4876 4877 ASSERT(un->un_throttle != 0); 4878 un->un_throttle = 1; /* > 1 will never happen here */ 4879 un->un_errno = 0; /* start clean from here */ 4880 4881 /* 4882 * first and foremost, handle any ST_EOT_PENDING cases. 4883 * That is, if a logical eot is pending notice, notice it. 4884 */ 4885 if (un->un_pos.eof == ST_EOT_PENDING) { 4886 int resid = un->un_err_resid; 4887 uchar_t status = un->un_status; 4888 uchar_t lastop = un->un_lastop; 4889 4890 if (st_cmd(un, SCMD_SPACE, Fmk(-1), SYNC_CMD)) { 4891 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 4892 "stioctl : EIO can't space fmk(-1)\n"); 4893 rval = EIO; 4894 goto exit; 4895 } 4896 un->un_lastop = lastop; /* restore last operation */ 4897 if (status == SUN_KEY_EOF) { 4898 un->un_status = SUN_KEY_EOT; 4899 } else { 4900 un->un_status = status; 4901 } 4902 un->un_err_resid = resid; 4903 /* fix up block number */ 4904 un->un_err_pos.blkno = un->un_pos.blkno = 0; 4905 /* now we're at logical eot */ 4906 un->un_pos.eof = ST_EOT; 4907 } 4908 4909 /* 4910 * now, handle the rest of the situations 4911 */ 4912 check_commands: 4913 switch (cmd) { 4914 case MTIOCGET: 4915 { 4916 #ifdef _MULTI_DATAMODEL 4917 /* 4918 * For use when a 32 bit app makes a call into a 4919 * 64 bit ioctl 4920 */ 4921 struct mtget32 mtg_local32; 4922 struct mtget32 *mtget_32 = &mtg_local32; 4923 #endif /* _MULTI_DATAMODEL */ 4924 4925 /* Get tape status */ 4926 struct mtget mtg_local; 4927 struct mtget *mtget = &mtg_local; 4928 ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, 4929 "st_ioctl: MTIOCGET\n"); 4930 4931 bzero((caddr_t)mtget, sizeof (struct mtget)); 4932 mtget->mt_erreg = un->un_status; 4933 mtget->mt_resid = un->un_err_resid; 4934 mtget->mt_dsreg = un->un_retry_ct; 4935 if (un->un_err_pos.pmode == legacy) { 4936 mtget->mt_fileno = un->un_err_pos.fileno; 4937 } else { 4938 mtget->mt_fileno = -1; 4939 } 4940 /* 4941 * If the value is positive fine. 4942 * If its negative we need to return a value based on the 4943 * old way if counting backwards from INF (1,000,000,000). 4944 */ 4945 if (un->un_err_pos.blkno >= 0) { 4946 mtget->mt_blkno = un->un_err_pos.blkno; 4947 } else { 4948 mtget->mt_blkno = INF + 1 - (-un->un_err_pos.blkno); 4949 } 4950 mtget->mt_type = un->un_dp->type; 4951 mtget->mt_flags = MTF_SCSI | MTF_ASF; 4952 if (un->un_read_pos_type != NO_POS) { 4953 mtget->mt_flags |= MTF_LOGICAL_BLOCK; 4954 } 4955 if (un->un_dp->options & ST_REEL) { 4956 mtget->mt_flags |= MTF_REEL; 4957 mtget->mt_bf = 20; 4958 } else { /* 1/4" cartridges */ 4959 switch (mtget->mt_type) { 4960 /* Emulex cartridge tape */ 4961 case MT_ISMT02: 4962 mtget->mt_bf = 40; 4963 break; 4964 default: 4965 mtget->mt_bf = 126; 4966 break; 4967 } 4968 } 4969 4970 /* 4971 * If large transfers are allowed and drive options 4972 * has no record size limit set. Calculate blocking 4973 * factor from the lesser of maxbsize and maxdma. 4974 */ 4975 if ((un->un_allow_large_xfer) && 4976 (un->un_dp->options & ST_NO_RECSIZE_LIMIT)) { 4977 mtget->mt_bf = min(un->un_maxbsize, 4978 un->un_maxdma) / SECSIZE; 4979 } 4980 4981 if (un->un_read_only == WORM || 4982 un->un_read_only == RDWORM) { 4983 mtget->mt_flags |= MTF_WORM_MEDIA; 4984 } 4985 4986 /* 4987 * In persistent error mode sending a non-queued can hang 4988 * because this ioctl gets to be run without turning off 4989 * persistense. Fake the answer based on previous info. 4990 */ 4991 if (un->un_persistence) { 4992 rval = 0; 4993 } else { 4994 rval = st_check_clean_bit(un); 4995 } 4996 if (rval == 0) { 4997 /* 4998 * If zero is returned or in persistent mode, 4999 * use the old data. 5000 */ 5001 if ((un->un_HeadClean & (TAPE_ALERT_SUPPORTED | 5002 TAPE_SEQUENTIAL_SUPPORTED|TAPE_ALERT_NOT_SUPPORTED)) 5003 != TAPE_ALERT_NOT_SUPPORTED) { 5004 mtget->mt_flags |= MTF_TAPE_CLN_SUPPORTED; 5005 } 5006 if (un->un_HeadClean & (TAPE_PREVIOUSLY_DIRTY | 5007 TAPE_ALERT_STILL_DIRTY)) { 5008 mtget->mt_flags |= MTF_TAPE_HEAD_DIRTY; 5009 } 5010 } else { 5011 mtget->mt_flags |= (ushort_t)rval; 5012 rval = 0; 5013 } 5014 5015 un->un_status = 0; /* Reset status */ 5016 un->un_err_resid = 0; 5017 tmp = sizeof (struct mtget); 5018 5019 #ifdef _MULTI_DATAMODEL 5020 5021 switch (ddi_model_convert_from(flag & FMODELS)) { 5022 case DDI_MODEL_ILP32: 5023 /* 5024 * Convert 64 bit back to 32 bit before doing 5025 * copyout. This is what the ILP32 app expects. 5026 */ 5027 mtget_32->mt_erreg = mtget->mt_erreg; 5028 mtget_32->mt_resid = mtget->mt_resid; 5029 mtget_32->mt_dsreg = mtget->mt_dsreg; 5030 mtget_32->mt_fileno = (daddr32_t)mtget->mt_fileno; 5031 mtget_32->mt_blkno = (daddr32_t)mtget->mt_blkno; 5032 mtget_32->mt_type = mtget->mt_type; 5033 mtget_32->mt_flags = mtget->mt_flags; 5034 mtget_32->mt_bf = mtget->mt_bf; 5035 5036 if (ddi_copyout(mtget_32, (void *)arg, 5037 sizeof (struct mtget32), flag)) { 5038 rval = EFAULT; 5039 } 5040 break; 5041 5042 case DDI_MODEL_NONE: 5043 if (ddi_copyout(mtget, (void *)arg, tmp, flag)) { 5044 rval = EFAULT; 5045 } 5046 break; 5047 } 5048 #else /* ! _MULTI_DATAMODE */ 5049 if (ddi_copyout(mtget, (void *)arg, tmp, flag)) { 5050 rval = EFAULT; 5051 } 5052 #endif /* _MULTI_DATAMODE */ 5053 5054 break; 5055 } 5056 case MTIOCGETERROR: 5057 /* 5058 * get error entry from error stack 5059 */ 5060 ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, 5061 "st_ioctl: MTIOCGETERROR\n"); 5062 5063 rval = st_get_error_entry(un, arg, flag); 5064 5065 break; 5066 5067 case MTIOCSTATE: 5068 { 5069 /* 5070 * return when media presence matches state 5071 */ 5072 enum mtio_state state; 5073 5074 ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, 5075 "st_ioctl: MTIOCSTATE\n"); 5076 5077 if (ddi_copyin((void *)arg, &state, sizeof (int), flag)) 5078 rval = EFAULT; 5079 5080 mutex_exit(ST_MUTEX); 5081 5082 rval = st_check_media(dev, state); 5083 5084 mutex_enter(ST_MUTEX); 5085 5086 if (rval != 0) { 5087 break; 5088 } 5089 5090 if (ddi_copyout(&un->un_mediastate, (void *)arg, 5091 sizeof (int), flag)) 5092 rval = EFAULT; 5093 break; 5094 5095 } 5096 5097 case MTIOCGETDRIVETYPE: 5098 { 5099 #ifdef _MULTI_DATAMODEL 5100 /* 5101 * For use when a 32 bit app makes a call into a 5102 * 64 bit ioctl 5103 */ 5104 struct mtdrivetype_request32 mtdtrq32; 5105 #endif /* _MULTI_DATAMODEL */ 5106 5107 /* 5108 * return mtdrivetype 5109 */ 5110 struct mtdrivetype_request mtdtrq; 5111 struct mtdrivetype mtdrtyp; 5112 struct mtdrivetype *mtdt = &mtdrtyp; 5113 struct st_drivetype *stdt = un->un_dp; 5114 5115 ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, 5116 "st_ioctl: MTIOCGETDRIVETYPE\n"); 5117 5118 #ifdef _MULTI_DATAMODEL 5119 switch (ddi_model_convert_from(flag & FMODELS)) { 5120 case DDI_MODEL_ILP32: 5121 { 5122 if (ddi_copyin((void *)arg, &mtdtrq32, 5123 sizeof (struct mtdrivetype_request32), flag)) { 5124 rval = EFAULT; 5125 break; 5126 } 5127 mtdtrq.size = mtdtrq32.size; 5128 mtdtrq.mtdtp = 5129 (struct mtdrivetype *)(uintptr_t)mtdtrq32.mtdtp; 5130 ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, 5131 "st_ioctl: size 0x%x\n", mtdtrq.size); 5132 break; 5133 } 5134 case DDI_MODEL_NONE: 5135 if (ddi_copyin((void *)arg, &mtdtrq, 5136 sizeof (struct mtdrivetype_request), flag)) { 5137 rval = EFAULT; 5138 break; 5139 } 5140 break; 5141 } 5142 5143 #else /* ! _MULTI_DATAMODEL */ 5144 if (ddi_copyin((void *)arg, &mtdtrq, 5145 sizeof (struct mtdrivetype_request), flag)) { 5146 rval = EFAULT; 5147 break; 5148 } 5149 #endif /* _MULTI_DATAMODEL */ 5150 5151 /* 5152 * if requested size is < 0 then return 5153 * error. 5154 */ 5155 if (mtdtrq.size < 0) { 5156 rval = EINVAL; 5157 break; 5158 } 5159 bzero(mtdt, sizeof (struct mtdrivetype)); 5160 (void) strncpy(mtdt->name, stdt->name, ST_NAMESIZE); 5161 (void) strncpy(mtdt->vid, stdt->vid, VIDPIDLEN - 1); 5162 mtdt->type = stdt->type; 5163 mtdt->bsize = stdt->bsize; 5164 mtdt->options = stdt->options; 5165 mtdt->max_rretries = stdt->max_rretries; 5166 mtdt->max_wretries = stdt->max_wretries; 5167 for (tmp = 0; tmp < NDENSITIES; tmp++) { 5168 mtdt->densities[tmp] = stdt->densities[tmp]; 5169 } 5170 mtdt->default_density = stdt->default_density; 5171 /* 5172 * Speed hasn't been used since the hayday of reel tape. 5173 * For all drives not setting the option ST_KNOWS_MEDIA 5174 * the speed member renamed to mediatype are zeros. 5175 * Those drives that have ST_KNOWS_MEDIA set use the 5176 * new mediatype member which is used to figure the 5177 * type of media loaded. 5178 * 5179 * So as to not break applications speed in the 5180 * mtdrivetype structure is not renamed. 5181 */ 5182 for (tmp = 0; tmp < NDENSITIES; tmp++) { 5183 mtdt->speeds[tmp] = stdt->mediatype[tmp]; 5184 } 5185 mtdt->non_motion_timeout = stdt->non_motion_timeout; 5186 mtdt->io_timeout = stdt->io_timeout; 5187 mtdt->rewind_timeout = stdt->rewind_timeout; 5188 mtdt->space_timeout = stdt->space_timeout; 5189 mtdt->load_timeout = stdt->load_timeout; 5190 mtdt->unload_timeout = stdt->unload_timeout; 5191 mtdt->erase_timeout = stdt->erase_timeout; 5192 5193 /* 5194 * Limit the maximum length of the result to 5195 * sizeof (struct mtdrivetype). 5196 */ 5197 tmp = sizeof (struct mtdrivetype); 5198 if (mtdtrq.size < tmp) 5199 tmp = mtdtrq.size; 5200 if (ddi_copyout(mtdt, mtdtrq.mtdtp, tmp, flag)) { 5201 rval = EFAULT; 5202 } 5203 break; 5204 } 5205 case MTIOCPERSISTENT: 5206 5207 if (ddi_copyin((void *)arg, &tmp, sizeof (tmp), flag)) { 5208 rval = EFAULT; 5209 break; 5210 } 5211 5212 if (tmp) { 5213 st_turn_pe_on(un); 5214 } else { 5215 st_turn_pe_off(un); 5216 } 5217 5218 ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, 5219 "st_ioctl: MTIOCPERSISTENT : persistence = %d\n", 5220 un->un_persistence); 5221 5222 break; 5223 5224 case MTIOCPERSISTENTSTATUS: 5225 tmp = (int)un->un_persistence; 5226 5227 if (ddi_copyout(&tmp, (void *)arg, sizeof (tmp), flag)) { 5228 rval = EFAULT; 5229 } 5230 ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, 5231 "st_ioctl: MTIOCPERSISTENTSTATUS:persistence = %d\n", 5232 un->un_persistence); 5233 5234 break; 5235 5236 case MTIOCLRERR: 5237 { 5238 /* clear persistent errors */ 5239 5240 ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, 5241 "st_ioctl: MTIOCLRERR\n"); 5242 5243 st_clear_pe(un); 5244 5245 break; 5246 } 5247 5248 case MTIOCGUARANTEEDORDER: 5249 { 5250 /* 5251 * this is just a holder to make a valid ioctl and 5252 * it won't be in any earlier release 5253 */ 5254 ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, 5255 "st_ioctl: MTIOCGUARANTEEDORDER\n"); 5256 5257 break; 5258 } 5259 5260 case MTIOCRESERVE: 5261 { 5262 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 5263 "st_ioctl: MTIOCRESERVE\n"); 5264 5265 /* 5266 * Check if Reserve/Release is supported. 5267 */ 5268 if (un->un_dp->options & ST_NO_RESERVE_RELEASE) { 5269 rval = ENOTTY; 5270 break; 5271 } 5272 5273 rval = st_reserve_release(un, ST_RESERVE, st_uscsi_cmd); 5274 5275 if (rval == 0) { 5276 un->un_rsvd_status |= ST_PRESERVE_RESERVE; 5277 } 5278 break; 5279 } 5280 5281 case MTIOCRELEASE: 5282 { 5283 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 5284 "st_ioctl: MTIOCRELEASE\n"); 5285 5286 /* 5287 * Check if Reserve/Release is supported. 5288 */ 5289 if (un->un_dp->options & ST_NO_RESERVE_RELEASE) { 5290 rval = ENOTTY; 5291 break; 5292 } 5293 5294 /* 5295 * Used to just clear ST_PRESERVE_RESERVE which 5296 * made the reservation release at next close. 5297 * As the user may have opened and then done a 5298 * persistant reservation we now need to drop 5299 * the reservation without closing if the user 5300 * attempts to do this. 5301 */ 5302 rval = st_reserve_release(un, ST_RELEASE, st_uscsi_cmd); 5303 5304 un->un_rsvd_status &= ~ST_PRESERVE_RESERVE; 5305 5306 break; 5307 } 5308 5309 case MTIOCFORCERESERVE: 5310 { 5311 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 5312 "st_ioctl: MTIOCFORCERESERVE\n"); 5313 5314 /* 5315 * Check if Reserve/Release is supported. 5316 */ 5317 if (un->un_dp->options & ST_NO_RESERVE_RELEASE) { 5318 rval = ENOTTY; 5319 break; 5320 } 5321 /* 5322 * allow only super user to run this. 5323 */ 5324 if (drv_priv(cred_p) != 0) { 5325 rval = EPERM; 5326 break; 5327 } 5328 /* 5329 * Throw away reserve, 5330 * not using test-unit-ready 5331 * since reserve can succeed without tape being 5332 * present in the drive. 5333 */ 5334 (void) st_reserve_release(un, ST_RESERVE, st_uscsi_cmd); 5335 5336 rval = st_take_ownership(un, st_uscsi_cmd); 5337 5338 break; 5339 } 5340 5341 case USCSICMD: 5342 { 5343 cred_t *cr; 5344 5345 ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, 5346 "st_ioctl: USCSICMD\n"); 5347 5348 cr = ddi_get_cred(); 5349 if ((drv_priv(cred_p) != 0) && (drv_priv(cr) != 0)) { 5350 rval = EPERM; 5351 } else { 5352 rval = st_uscsi_cmd(un, (struct uscsi_cmd *)arg, flag); 5353 } 5354 break; 5355 } 5356 case MTIOCTOP: 5357 ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, 5358 "st_ioctl: MTIOCTOP\n"); 5359 rval = st_mtioctop(un, arg, flag); 5360 break; 5361 5362 case MTIOCLTOP: 5363 ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, 5364 "st_ioctl: MTIOLCTOP\n"); 5365 rval = st_mtiocltop(un, arg, flag); 5366 break; 5367 5368 case MTIOCREADIGNOREILI: 5369 { 5370 int set_ili; 5371 5372 if (ddi_copyin((void *)arg, &set_ili, 5373 sizeof (set_ili), flag)) { 5374 rval = EFAULT; 5375 break; 5376 } 5377 5378 if (un->un_bsize) { 5379 rval = ENOTTY; 5380 break; 5381 } 5382 5383 switch (set_ili) { 5384 case 0: 5385 un->un_dp->options &= ~ST_READ_IGNORE_ILI; 5386 break; 5387 5388 case 1: 5389 un->un_dp->options |= ST_READ_IGNORE_ILI; 5390 break; 5391 5392 default: 5393 rval = EINVAL; 5394 break; 5395 } 5396 break; 5397 } 5398 5399 case MTIOCREADIGNOREEOFS: 5400 { 5401 int ignore_eof; 5402 5403 if (ddi_copyin((void *)arg, &ignore_eof, 5404 sizeof (ignore_eof), flag)) { 5405 rval = EFAULT; 5406 break; 5407 } 5408 5409 if (!(un->un_dp->options & ST_REEL)) { 5410 rval = ENOTTY; 5411 break; 5412 } 5413 5414 switch (ignore_eof) { 5415 case 0: 5416 un->un_dp->options &= ~ST_READ_IGNORE_EOFS; 5417 break; 5418 5419 case 1: 5420 un->un_dp->options |= ST_READ_IGNORE_EOFS; 5421 break; 5422 5423 default: 5424 rval = EINVAL; 5425 break; 5426 } 5427 break; 5428 } 5429 5430 case MTIOCSHORTFMK: 5431 { 5432 int short_fmk; 5433 5434 if (ddi_copyin((void *)arg, &short_fmk, 5435 sizeof (short_fmk), flag)) { 5436 rval = EFAULT; 5437 break; 5438 } 5439 5440 switch (un->un_dp->type) { 5441 case ST_TYPE_EXB8500: 5442 case ST_TYPE_EXABYTE: 5443 if (!short_fmk) { 5444 un->un_dp->options &= ~ST_SHORT_FILEMARKS; 5445 } else if (short_fmk == 1) { 5446 un->un_dp->options |= ST_SHORT_FILEMARKS; 5447 } else { 5448 rval = EINVAL; 5449 } 5450 break; 5451 5452 default: 5453 rval = ENOTTY; 5454 break; 5455 } 5456 break; 5457 } 5458 5459 case MTIOCGETPOS: 5460 rval = st_update_block_pos(un, st_cmd, 0); 5461 if (rval == 0) { 5462 if (ddi_copyout((void *)&un->un_pos, (void *)arg, 5463 sizeof (tapepos_t), flag)) { 5464 scsi_log(ST_DEVINFO, st_label, SCSI_DEBUG, 5465 "MTIOCGETPOS copy out failed\n"); 5466 rval = EFAULT; 5467 } 5468 } 5469 break; 5470 5471 case MTIOCRESTPOS: 5472 { 5473 tapepos_t dest; 5474 5475 if (ddi_copyin((void *)arg, &dest, sizeof (tapepos_t), 5476 flag) != 0) { 5477 scsi_log(ST_DEVINFO, st_label, SCSI_DEBUG, 5478 "MTIOCRESTPOS copy in failed\n"); 5479 rval = EFAULT; 5480 break; 5481 } 5482 rval = st_validate_tapemarks(un, st_uscsi_cmd, &dest); 5483 if (rval != 0) { 5484 rval = EIO; 5485 } 5486 break; 5487 } 5488 default: 5489 ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, 5490 "st_ioctl: unknown ioctl\n"); 5491 rval = ENOTTY; 5492 } 5493 5494 exit: 5495 if (!(un->un_persistence && un->un_persist_errors)) { 5496 un->un_errno = rval; 5497 } 5498 5499 mutex_exit(ST_MUTEX); 5500 5501 return (rval); 5502 } 5503 5504 5505 /* 5506 * do some MTIOCTOP tape operations 5507 */ 5508 static int 5509 st_mtioctop(struct scsi_tape *un, intptr_t arg, int flag) 5510 { 5511 #ifdef _MULTI_DATAMODEL 5512 /* 5513 * For use when a 32 bit app makes a call into a 5514 * 64 bit ioctl 5515 */ 5516 struct mtop32 mtop_32_for_64; 5517 #endif /* _MULTI_DATAMODEL */ 5518 struct mtop passed; 5519 struct mtlop local; 5520 int rval = 0; 5521 5522 ST_FUNC(ST_DEVINFO, st_mtioctop); 5523 5524 ASSERT(mutex_owned(ST_MUTEX)); 5525 5526 #ifdef _MULTI_DATAMODEL 5527 switch (ddi_model_convert_from(flag & FMODELS)) { 5528 case DDI_MODEL_ILP32: 5529 if (ddi_copyin((void *)arg, &mtop_32_for_64, 5530 sizeof (struct mtop32), flag)) { 5531 return (EFAULT); 5532 } 5533 local.mt_op = mtop_32_for_64.mt_op; 5534 local.mt_count = (int64_t)mtop_32_for_64.mt_count; 5535 break; 5536 5537 case DDI_MODEL_NONE: 5538 if (ddi_copyin((void *)arg, &passed, sizeof (passed), flag)) { 5539 return (EFAULT); 5540 } 5541 local.mt_op = passed.mt_op; 5542 /* prevent sign extention */ 5543 local.mt_count = (UINT32_MAX & passed.mt_count); 5544 break; 5545 } 5546 5547 #else /* ! _MULTI_DATAMODEL */ 5548 if (ddi_copyin((void *)arg, &passed, sizeof (passed), flag)) { 5549 return (EFAULT); 5550 } 5551 local.mt_op = passed.mt_op; 5552 /* prevent sign extention */ 5553 local.mt_count = (UINT32_MAX & passed.mt_count); 5554 #endif /* _MULTI_DATAMODEL */ 5555 5556 rval = st_do_mtioctop(un, &local); 5557 5558 #ifdef _MULTI_DATAMODEL 5559 switch (ddi_model_convert_from(flag & FMODELS)) { 5560 case DDI_MODEL_ILP32: 5561 if (((uint64_t)local.mt_count) > UINT32_MAX) { 5562 rval = ERANGE; 5563 break; 5564 } 5565 /* 5566 * Convert 64 bit back to 32 bit before doing 5567 * copyout. This is what the ILP32 app expects. 5568 */ 5569 mtop_32_for_64.mt_op = local.mt_op; 5570 mtop_32_for_64.mt_count = local.mt_count; 5571 5572 if (ddi_copyout(&mtop_32_for_64, (void *)arg, 5573 sizeof (struct mtop32), flag)) { 5574 rval = EFAULT; 5575 } 5576 break; 5577 5578 case DDI_MODEL_NONE: 5579 passed.mt_count = local.mt_count; 5580 passed.mt_op = local.mt_op; 5581 if (ddi_copyout(&passed, (void *)arg, sizeof (passed), flag)) { 5582 rval = EFAULT; 5583 } 5584 break; 5585 } 5586 #else /* ! _MULTI_DATAMODE */ 5587 if (((uint64_t)local.mt_count) > UINT32_MAX) { 5588 rval = ERANGE; 5589 } else { 5590 passed.mt_op = local.mt_op; 5591 passed.mt_count = local.mt_count; 5592 if (ddi_copyout(&passed, (void *)arg, sizeof (passed), flag)) { 5593 rval = EFAULT; 5594 } 5595 } 5596 #endif /* _MULTI_DATAMODE */ 5597 5598 5599 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 5600 "st_ioctl: fileno=%x, blkno=%x, eof=%x\n", un->un_pos.fileno, 5601 un->un_pos.blkno, un->un_pos.eof); 5602 5603 if (un->un_pos.pmode == invalid) { 5604 un->un_density_known = 0; 5605 } 5606 5607 ASSERT(mutex_owned(ST_MUTEX)); 5608 return (rval); 5609 } 5610 5611 static int 5612 st_mtiocltop(struct scsi_tape *un, intptr_t arg, int flag) 5613 { 5614 struct mtlop local; 5615 int rval; 5616 5617 ST_FUNC(ST_DEVINFO, st_mtiocltop); 5618 if (ddi_copyin((void *)arg, &local, sizeof (local), flag)) { 5619 return (EFAULT); 5620 } 5621 5622 rval = st_do_mtioctop(un, &local); 5623 5624 if (ddi_copyout(&local, (void *)arg, sizeof (local), flag)) { 5625 rval = EFAULT; 5626 } 5627 return (rval); 5628 } 5629 5630 5631 static int 5632 st_do_mtioctop(struct scsi_tape *un, struct mtlop *mtop) 5633 { 5634 dev_t dev = un->un_dev; 5635 int savefile; 5636 int rval = 0; 5637 5638 ST_FUNC(ST_DEVINFO, st_do_mtioctop); 5639 5640 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 5641 "st_do_mtioctop(): mt_op=%x\n", mtop->mt_op); 5642 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 5643 "fileno=%x, blkno=%x, eof=%x\n", 5644 un->un_pos.fileno, un->un_pos.blkno, un->un_pos.eof); 5645 5646 un->un_status = 0; 5647 5648 /* 5649 * if we are going to mess with a tape, we have to make sure we have 5650 * one and are not offline (i.e. no tape is initialized). We let 5651 * commands pass here that don't actually touch the tape, except for 5652 * loading and initialization (rewinding). 5653 */ 5654 if (un->un_state == ST_STATE_OFFLINE) { 5655 switch (mtop->mt_op) { 5656 case MTLOAD: 5657 case MTNOP: 5658 /* 5659 * We don't want strategy calling st_tape_init here, 5660 * so, change state 5661 */ 5662 un->un_state = ST_STATE_INITIALIZING; 5663 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 5664 "st_do_mtioctop : OFFLINE state = %d\n", 5665 un->un_state); 5666 break; 5667 default: 5668 /* 5669 * reinitialize by normal means 5670 */ 5671 rval = st_tape_init(un); 5672 if (rval) { 5673 un->un_state = ST_STATE_INITIALIZING; 5674 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 5675 "st_do_mtioctop : OFFLINE init failure "); 5676 un->un_state = ST_STATE_OFFLINE; 5677 un->un_pos.pmode = invalid; 5678 if (rval != EACCES) { 5679 rval = EIO; 5680 } 5681 return (rval); 5682 } 5683 un->un_state = ST_STATE_OPEN_PENDING_IO; 5684 break; 5685 } 5686 } 5687 5688 /* 5689 * If the file position is invalid, allow only those 5690 * commands that properly position the tape and fail 5691 * the rest with EIO 5692 */ 5693 if (un->un_pos.pmode == invalid) { 5694 switch (mtop->mt_op) { 5695 case MTWEOF: 5696 case MTRETEN: 5697 case MTERASE: 5698 case MTEOM: 5699 case MTFSF: 5700 case MTFSR: 5701 case MTBSF: 5702 case MTNBSF: 5703 case MTBSR: 5704 case MTSRSZ: 5705 case MTGRSZ: 5706 case MTSEEK: 5707 case MTBSSF: 5708 case MTFSSF: 5709 return (EIO); 5710 /* NOTREACHED */ 5711 case MTREW: 5712 case MTLOAD: 5713 case MTOFFL: 5714 case MTNOP: 5715 case MTTELL: 5716 case MTLOCK: 5717 case MTUNLOCK: 5718 break; 5719 5720 default: 5721 return (ENOTTY); 5722 /* NOTREACHED */ 5723 } 5724 } 5725 5726 switch (mtop->mt_op) { 5727 case MTERASE: 5728 /* 5729 * MTERASE rewinds the tape, erase it completely, and returns 5730 * to the beginning of the tape 5731 */ 5732 if (un->un_mspl->wp || un->un_read_only & WORM) { 5733 un->un_status = KEY_WRITE_PROTECT; 5734 un->un_err_resid = mtop->mt_count; 5735 COPY_POS(&un->un_err_pos, &un->un_pos); 5736 return (EACCES); 5737 } 5738 if (un->un_dp->options & ST_REEL) { 5739 un->un_fmneeded = 2; 5740 } else { 5741 un->un_fmneeded = 1; 5742 } 5743 mtop->mt_count = mtop->mt_count ? 1 : 0; 5744 if (st_check_density_or_wfm(dev, 1, B_WRITE, NO_STEPBACK) || 5745 st_cmd(un, SCMD_REWIND, 0, SYNC_CMD) || 5746 st_cmd(un, SCMD_ERASE, mtop->mt_count, SYNC_CMD)) { 5747 un->un_pos.pmode = invalid; 5748 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 5749 "st_do_mtioctop : EIO space or erase or " 5750 "check den)\n"); 5751 rval = EIO; 5752 } else { 5753 /* QIC and helical scan rewind after erase */ 5754 if (un->un_dp->options & ST_REEL) { 5755 (void) st_cmd(un, SCMD_REWIND, 0, ASYNC_CMD); 5756 } 5757 } 5758 break; 5759 5760 case MTWEOF: 5761 /* 5762 * write an end-of-file record 5763 */ 5764 if (un->un_mspl->wp || un->un_read_only & RDONLY) { 5765 un->un_status = KEY_WRITE_PROTECT; 5766 un->un_err_resid = mtop->mt_count; 5767 COPY_POS(&un->un_err_pos, &un->un_pos); 5768 return (EACCES); 5769 } 5770 5771 /* 5772 * zero count means just flush buffers 5773 * negative count is not permitted 5774 */ 5775 if (mtop->mt_count < 0) { 5776 return (EINVAL); 5777 } 5778 5779 /* Not on worm */ 5780 if (un->un_read_only == RDWR) { 5781 un->un_test_append = 1; 5782 } 5783 5784 if (un->un_state == ST_STATE_OPEN_PENDING_IO) { 5785 if (st_determine_density(un, B_WRITE)) { 5786 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 5787 "st_do_mtioctop : EIO : MTWEOF can't " 5788 "determine density"); 5789 return (EIO); 5790 } 5791 } 5792 5793 rval = st_write_fm(dev, (int)mtop->mt_count); 5794 if ((rval != 0) && (rval != EACCES)) { 5795 /* 5796 * Failure due to something other than illegal 5797 * request results in loss of state (st_intr). 5798 */ 5799 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 5800 "st_do_mtioctop : EIO : MTWEOF can't write " 5801 "file mark"); 5802 rval = EIO; 5803 } 5804 break; 5805 5806 case MTRETEN: 5807 /* 5808 * retension the tape 5809 */ 5810 if (st_check_density_or_wfm(dev, 1, 0, NO_STEPBACK) || 5811 st_cmd(un, SCMD_LOAD, LD_LOAD | LD_RETEN, SYNC_CMD)) { 5812 un->un_pos.pmode = invalid; 5813 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 5814 "st_do_mtioctop : EIO : MTRETEN "); 5815 rval = EIO; 5816 } 5817 break; 5818 5819 case MTREW: 5820 /* 5821 * rewind the tape 5822 */ 5823 if (st_check_density_or_wfm(dev, 1, 0, NO_STEPBACK)) { 5824 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 5825 "st_do_mtioctop : EIO:MTREW check " 5826 "density/wfm failed"); 5827 return (EIO); 5828 } 5829 if (st_cmd(un, SCMD_REWIND, 0, SYNC_CMD)) { 5830 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 5831 "st_do_mtioctop : EIO : MTREW "); 5832 rval = EIO; 5833 } 5834 break; 5835 5836 case MTOFFL: 5837 /* 5838 * rewinds, and, if appropriate, takes the device offline by 5839 * unloading the tape 5840 */ 5841 if (st_check_density_or_wfm(dev, 1, 0, NO_STEPBACK)) { 5842 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 5843 "st_do_mtioctop :EIO:MTOFFL check " 5844 "density/wfm failed"); 5845 return (EIO); 5846 } 5847 (void) st_cmd(un, SCMD_REWIND, 0, SYNC_CMD); 5848 if (st_cmd(un, SCMD_LOAD, LD_UNLOAD, SYNC_CMD)) { 5849 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 5850 "st_do_mtioctop : EIO : MTOFFL"); 5851 return (EIO); 5852 } 5853 un->un_pos.eof = ST_NO_EOF; 5854 un->un_laststate = un->un_state; 5855 un->un_state = ST_STATE_OFFLINE; 5856 un->un_mediastate = MTIO_EJECTED; 5857 break; 5858 5859 case MTLOAD: 5860 /* 5861 * This is to load a tape into the drive 5862 * Note that if the tape is not loaded, the device will have 5863 * to be opened via O_NDELAY or O_NONBLOCK. 5864 */ 5865 /* 5866 * Let's try and clean things up, if we are not 5867 * initializing, and then send in the load command, no 5868 * matter what. 5869 * 5870 * load after a media change by the user. 5871 */ 5872 5873 if (un->un_state > ST_STATE_INITIALIZING) { 5874 (void) st_check_density_or_wfm(dev, 1, 0, NO_STEPBACK); 5875 } 5876 rval = st_cmd(un, SCMD_LOAD, LD_LOAD, SYNC_CMD); 5877 /* Load command to a drive that doesn't support load */ 5878 if ((rval == EIO) && 5879 ((un->un_status == KEY_NOT_READY) && 5880 /* Medium not present */ 5881 (un->un_uscsi_rqs_buf->es_add_code == 0x3a) || 5882 ((un->un_status == KEY_ILLEGAL_REQUEST) && 5883 (un->un_dp->type == MT_ISSTK9840) && 5884 /* CSL not present */ 5885 (un->un_uscsi_rqs_buf->es_add_code == 0x80)))) { 5886 rval = ENOTTY; 5887 break; 5888 } else if (rval != EACCES && rval != 0) { 5889 rval = EIO; 5890 } 5891 if (rval) { 5892 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 5893 "st_do_mtioctop : %s : MTLOAD\n", 5894 rval == EACCES ? "EACCES" : "EIO"); 5895 /* 5896 * If load tape fails, who knows what happened... 5897 */ 5898 un->un_pos.pmode = invalid; 5899 break; 5900 } 5901 5902 /* 5903 * reset all counters appropriately using rewind, as if LOAD 5904 * succeeds, we are at BOT 5905 */ 5906 un->un_state = ST_STATE_INITIALIZING; 5907 5908 rval = st_tape_init(un); 5909 if ((rval == EACCES) && (un->un_read_only & WORM)) { 5910 rval = 0; 5911 break; 5912 } 5913 5914 if (rval != 0) { 5915 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 5916 "st_do_mtioctop : EIO : MTLOAD calls " 5917 "st_tape_init\n"); 5918 rval = EIO; 5919 un->un_state = ST_STATE_OFFLINE; 5920 } 5921 5922 break; 5923 5924 case MTNOP: 5925 un->un_status = 0; /* Reset status */ 5926 un->un_err_resid = 0; 5927 mtop->mt_count = MTUNIT(dev); 5928 break; 5929 5930 case MTEOM: 5931 /* 5932 * positions the tape at a location just after the last file 5933 * written on the tape. For cartridge and 8 mm, this after 5934 * the last file mark; for reel, this is inbetween the two 5935 * last 2 file marks 5936 */ 5937 if ((un->un_pos.pmode == legacy && un->un_pos.eof >= ST_EOT) || 5938 (un->un_lastop == ST_OP_WRITE) || 5939 (un->un_lastop == ST_OP_WEOF)) { 5940 /* 5941 * If the command wants to move to logical end 5942 * of media, and we're already there, we're done. 5943 * If we were at logical eot, we reset the state 5944 * to be *not* at logical eot. 5945 * 5946 * If we're at physical or logical eot, we prohibit 5947 * forward space operations (unconditionally). 5948 * 5949 * Also if the last operation was a write of any 5950 * kind the tape is at EOD. 5951 */ 5952 return (0); 5953 } 5954 /* 5955 * physical tape position may not be what we've been 5956 * telling the user; adjust the request accordingly 5957 */ 5958 if (IN_EOF(un->un_pos)) { 5959 un->un_pos.fileno++; 5960 un->un_pos.blkno = 0; 5961 } 5962 5963 if (st_check_density_or_wfm(dev, 1, B_READ, NO_STEPBACK)) { 5964 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 5965 "st_do_mtioctop : EIO:MTEOM check density/wfm " 5966 " failed"); 5967 return (EIO); 5968 } 5969 5970 /* 5971 * st_find_eod() returns the last fileno we knew about; 5972 */ 5973 savefile = st_find_eod(un); 5974 5975 if ((un->un_status != KEY_BLANK_CHECK) && 5976 (un->un_status != SUN_KEY_EOT)) { 5977 un->un_pos.pmode = invalid; 5978 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 5979 "st_do_mtioctop : EIO : MTEOM status check failed"); 5980 rval = EIO; 5981 } else { 5982 /* 5983 * For 1/2" reel tapes assume logical EOT marked 5984 * by two file marks or we don't care that we may 5985 * be extending the last file on the tape. 5986 */ 5987 if (un->un_dp->options & ST_REEL) { 5988 if (st_cmd(un, SCMD_SPACE, Fmk(-1), SYNC_CMD)) { 5989 un->un_pos.pmode = invalid; 5990 ST_DEBUG2(ST_DEVINFO, st_label, 5991 SCSI_DEBUG, 5992 "st_do_mtioctop : EIO : MTEOM space" 5993 " cmd failed"); 5994 rval = EIO; 5995 break; 5996 } 5997 /* 5998 * Fix up the block number. 5999 */ 6000 un->un_pos.blkno = 0; 6001 un->un_err_pos.blkno = 0; 6002 } 6003 un->un_err_resid = 0; 6004 un->un_pos.fileno = savefile; 6005 un->un_pos.eof = ST_EOT; 6006 } 6007 un->un_status = 0; 6008 break; 6009 6010 case MTFSF: 6011 MAX_SPACE_CNT(mtop->mt_count); 6012 rval = st_mtfsf_ioctl(un, mtop->mt_count); 6013 break; 6014 6015 case MTFSR: 6016 MAX_SPACE_CNT(mtop->mt_count); 6017 rval = st_mtfsr_ioctl(un, mtop->mt_count); 6018 break; 6019 6020 case MTBSF: 6021 MAX_SPACE_CNT(mtop->mt_count); 6022 rval = st_mtbsf_ioctl(un, mtop->mt_count); 6023 break; 6024 6025 case MTNBSF: 6026 MAX_SPACE_CNT(mtop->mt_count); 6027 rval = st_mtnbsf_ioctl(un, mtop->mt_count); 6028 break; 6029 6030 case MTBSR: 6031 MAX_SPACE_CNT(mtop->mt_count); 6032 rval = st_mtbsr_ioctl(un, mtop->mt_count); 6033 break; 6034 6035 case MTBSSF: 6036 MAX_SPACE_CNT(mtop->mt_count); 6037 rval = st_mtbsfm_ioctl(un, mtop->mt_count); 6038 break; 6039 6040 case MTFSSF: 6041 MAX_SPACE_CNT(mtop->mt_count); 6042 rval = st_mtfsfm_ioctl(un, mtop->mt_count); 6043 break; 6044 6045 case MTSRSZ: 6046 6047 /* 6048 * Set record-size to that sent by user 6049 * Check to see if there is reason that the requested 6050 * block size should not be set. 6051 */ 6052 6053 /* If requesting variable block size is it ok? */ 6054 if ((mtop->mt_count == 0) && 6055 ((un->un_dp->options & ST_VARIABLE) == 0)) { 6056 return (ENOTTY); 6057 } 6058 6059 /* 6060 * If requested block size is not variable "0", 6061 * is it less then minimum. 6062 */ 6063 if ((mtop->mt_count != 0) && 6064 (mtop->mt_count < un->un_minbsize)) { 6065 return (EINVAL); 6066 } 6067 6068 /* Is the requested block size more then maximum */ 6069 if ((mtop->mt_count > min(un->un_maxbsize, un->un_maxdma)) && 6070 (un->un_maxbsize != 0)) { 6071 return (EINVAL); 6072 } 6073 6074 /* Is requested block size a modulus the device likes */ 6075 if ((mtop->mt_count % un->un_data_mod) != 0) { 6076 return (EINVAL); 6077 } 6078 6079 if (st_change_block_size(un, (uint32_t)mtop->mt_count) != 0) { 6080 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 6081 "st_ioctl : MTSRSZ : EIO : cant set block size"); 6082 return (EIO); 6083 } 6084 6085 return (0); 6086 6087 case MTGRSZ: 6088 /* 6089 * Get record-size to the user 6090 */ 6091 mtop->mt_count = un->un_bsize; 6092 rval = 0; 6093 break; 6094 6095 case MTTELL: 6096 rval = st_update_block_pos(un, st_cmd, 0); 6097 mtop->mt_count = un->un_pos.lgclblkno; 6098 break; 6099 6100 case MTSEEK: 6101 rval = st_logical_block_locate(un, st_uscsi_cmd, &un->un_pos, 6102 (uint64_t)mtop->mt_count, un->un_pos.partition); 6103 /* 6104 * This bit of magic make mt print the actual position if 6105 * the resulting position was not what was asked for. 6106 */ 6107 if (rval == ESPIPE) { 6108 rval = EIO; 6109 if ((uint64_t)mtop->mt_count != un->un_pos.lgclblkno) { 6110 mtop->mt_op = MTTELL; 6111 mtop->mt_count = un->un_pos.lgclblkno; 6112 } 6113 } 6114 break; 6115 6116 case MTLOCK: 6117 if (st_cmd(un, SCMD_DOORLOCK, MR_LOCK, SYNC_CMD)) { 6118 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 6119 "st_do_mtioctop : EIO : MTLOCK"); 6120 rval = EIO; 6121 } 6122 break; 6123 6124 case MTUNLOCK: 6125 if (st_cmd(un, SCMD_DOORLOCK, MR_UNLOCK, SYNC_CMD)) { 6126 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 6127 "st_do_mtioctop : EIO : MTUNLOCK"); 6128 rval = EIO; 6129 } 6130 break; 6131 6132 default: 6133 rval = ENOTTY; 6134 } 6135 6136 return (rval); 6137 } 6138 6139 6140 /* 6141 * Run a command for uscsi ioctl. 6142 */ 6143 static int 6144 st_uscsi_cmd(struct scsi_tape *un, struct uscsi_cmd *ucmd, int flag) 6145 { 6146 struct uscsi_cmd *uscmd; 6147 struct buf *bp; 6148 enum uio_seg uioseg; 6149 int offline_state = 0; 6150 int err = 0; 6151 dev_t dev = un->un_dev; 6152 6153 ST_FUNC(ST_DEVINFO, st_uscsi_cmd); 6154 6155 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 6156 "st_uscsi_cmd(dev = 0x%lx)\n", un->un_dev); 6157 6158 ASSERT(mutex_owned(ST_MUTEX)); 6159 6160 /* 6161 * We really don't know what commands are coming in here and 6162 * we don't want to limit the commands coming in. 6163 * 6164 * If st_tape_init() gets called from st_strategy(), then we 6165 * will hang the process waiting for un->un_sbuf_busy to be cleared, 6166 * which it never will, as we set it below. To prevent 6167 * st_tape_init() from getting called, we have to set state to other 6168 * than ST_STATE_OFFLINE, so we choose ST_STATE_INITIALIZING, which 6169 * achieves this purpose already. 6170 * 6171 * We use offline_state to preserve the OFFLINE state, if it exists, 6172 * so other entry points to the driver might have the chance to call 6173 * st_tape_init(). 6174 */ 6175 if (un->un_state == ST_STATE_OFFLINE) { 6176 un->un_laststate = ST_STATE_OFFLINE; 6177 un->un_state = ST_STATE_INITIALIZING; 6178 offline_state = 1; 6179 } 6180 6181 mutex_exit(ST_MUTEX); 6182 err = scsi_uscsi_alloc_and_copyin((intptr_t)ucmd, flag, ROUTE, &uscmd); 6183 mutex_enter(ST_MUTEX); 6184 if (err != 0) { 6185 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 6186 "st_uscsi_cmd: scsi_uscsi_alloc_and_copyin failed\n"); 6187 goto exit; 6188 } 6189 6190 uioseg = (flag & FKIOCTL) ? UIO_SYSSPACE : UIO_USERSPACE; 6191 6192 /* check to see if this command requires the drive to be reserved */ 6193 if (uscmd->uscsi_cdb != NULL) { 6194 err = st_check_cdb_for_need_to_reserve(un, 6195 (uchar_t *)uscmd->uscsi_cdb); 6196 if (err) { 6197 goto exit_free; 6198 } 6199 /* 6200 * If this is a space command we need to save the starting 6201 * point so we can retry from there if the command fails. 6202 */ 6203 if ((uscmd->uscsi_cdb[0] == SCMD_SPACE) || 6204 (uscmd->uscsi_cdb[0] == (char)SCMD_SPACE_G4)) { 6205 (void) st_update_block_pos(un, st_cmd, 0); 6206 } 6207 } 6208 6209 /* 6210 * Forground should not be doing anything while recovery is active. 6211 */ 6212 ASSERT(un->un_recov_buf_busy == 0); 6213 6214 /* 6215 * Get buffer resources... 6216 */ 6217 while (un->un_sbuf_busy) 6218 cv_wait(&un->un_sbuf_cv, ST_MUTEX); 6219 un->un_sbuf_busy = 1; 6220 6221 #ifdef STDEBUG 6222 if ((uscmd->uscsi_cdb != NULL) && (st_debug & 0x7) > 6) { 6223 int rw = (uscmd->uscsi_flags & USCSI_READ) ? B_READ : B_WRITE; 6224 st_print_cdb(ST_DEVINFO, st_label, SCSI_DEBUG, 6225 "uscsi cdb", uscmd->uscsi_cdb); 6226 if (uscmd->uscsi_buflen) { 6227 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 6228 "uscsi %s of %ld bytes %s %s space\n", 6229 (rw == B_READ) ? rd_str : wr_str, 6230 uscmd->uscsi_buflen, 6231 (rw == B_READ) ? "to" : "from", 6232 (uioseg == UIO_SYSSPACE) ? "system" : "user"); 6233 } 6234 } 6235 #endif /* STDEBUG */ 6236 6237 /* 6238 * Although st_uscsi_cmd() never makes use of these 6239 * now, we are just being safe and consistent. 6240 */ 6241 uscmd->uscsi_flags &= ~(USCSI_NOINTR | USCSI_NOPARITY | 6242 USCSI_OTAG | USCSI_HTAG | USCSI_HEAD); 6243 6244 un->un_srqbufp = uscmd->uscsi_rqbuf; 6245 bp = un->un_sbufp; 6246 bzero(bp, sizeof (buf_t)); 6247 if (uscmd->uscsi_cdb != NULL) { 6248 bp->b_forw = (struct buf *)(uintptr_t)uscmd->uscsi_cdb[0]; 6249 } 6250 bp->b_back = (struct buf *)uscmd; 6251 6252 mutex_exit(ST_MUTEX); 6253 err = scsi_uscsi_handle_cmd(dev, uioseg, uscmd, st_strategy, bp, NULL); 6254 mutex_enter(ST_MUTEX); 6255 6256 /* 6257 * If scsi reset successful, don't write any filemarks. 6258 */ 6259 if ((err == 0) && (uscmd->uscsi_flags & 6260 (USCSI_RESET_LUN | USCSI_RESET_TARGET | USCSI_RESET_ALL))) { 6261 un->un_fmneeded = 0; 6262 } 6263 6264 exit_free: 6265 /* 6266 * Free resources 6267 */ 6268 un->un_sbuf_busy = 0; 6269 un->un_srqbufp = NULL; 6270 6271 /* 6272 * If was a space command need to update logical block position. 6273 * If the command failed such that positioning is invalid, Don't 6274 * update the position as the user must do this to validate the 6275 * position for data protection. 6276 */ 6277 if ((uscmd->uscsi_cdb != NULL) && 6278 ((uscmd->uscsi_cdb[0] == SCMD_SPACE) || 6279 (uscmd->uscsi_cdb[0] == (char)SCMD_SPACE_G4)) && 6280 (un->un_pos.pmode != invalid)) { 6281 un->un_running.pmode = invalid; 6282 (void) st_update_block_pos(un, st_cmd, 1); 6283 /* 6284 * Set running position to invalid so it updates on the 6285 * next command. 6286 */ 6287 un->un_running.pmode = invalid; 6288 } 6289 cv_signal(&un->un_sbuf_cv); 6290 mutex_exit(ST_MUTEX); 6291 (void) scsi_uscsi_copyout_and_free((intptr_t)ucmd, uscmd); 6292 mutex_enter(ST_MUTEX); 6293 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 6294 "st_uscsi_cmd returns 0x%x\n", err); 6295 6296 exit: 6297 /* don't lose offline state */ 6298 if (offline_state) { 6299 un->un_state = ST_STATE_OFFLINE; 6300 } 6301 6302 ASSERT(mutex_owned(ST_MUTEX)); 6303 return (err); 6304 } 6305 6306 static int 6307 st_write_fm(dev_t dev, int wfm) 6308 { 6309 int i; 6310 int rval; 6311 6312 GET_SOFT_STATE(dev); 6313 6314 ST_FUNC(ST_DEVINFO, st_write_fm); 6315 6316 ASSERT(mutex_owned(ST_MUTEX)); 6317 6318 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 6319 "st_write_fm(dev = 0x%lx, wfm = %d)\n", dev, wfm); 6320 6321 /* 6322 * write one filemark at the time after EOT 6323 */ 6324 if (un->un_pos.eof >= ST_EOT) { 6325 for (i = 0; i < wfm; i++) { 6326 rval = st_cmd(un, SCMD_WRITE_FILE_MARK, 1, SYNC_CMD); 6327 if (rval == EACCES) { 6328 return (rval); 6329 } 6330 if (rval != 0) { 6331 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 6332 "st_write_fm : EIO : write EOT file mark"); 6333 return (EIO); 6334 } 6335 } 6336 } else { 6337 rval = st_cmd(un, SCMD_WRITE_FILE_MARK, wfm, SYNC_CMD); 6338 if (rval == EACCES) { 6339 return (rval); 6340 } 6341 if (rval) { 6342 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 6343 "st_write_fm : EIO : write file mark"); 6344 return (EIO); 6345 } 6346 } 6347 6348 ASSERT(mutex_owned(ST_MUTEX)); 6349 return (0); 6350 } 6351 6352 #ifdef STDEBUG 6353 static void 6354 st_start_dump(struct scsi_tape *un, struct buf *bp) 6355 { 6356 struct scsi_pkt *pkt = BP_PKT(bp); 6357 uchar_t *cdbp = (uchar_t *)pkt->pkt_cdbp; 6358 6359 ST_FUNC(ST_DEVINFO, st_start_dump); 6360 6361 if ((st_debug & 0x7) < 6) 6362 return; 6363 scsi_log(ST_DEVINFO, st_label, SCSI_DEBUG, 6364 "st_start: cmd=0x%p count=%ld resid=%ld flags=0x%x pkt=0x%p\n", 6365 (void *)bp->b_forw, bp->b_bcount, 6366 bp->b_resid, bp->b_flags, (void *)BP_PKT(bp)); 6367 st_print_cdb(ST_DEVINFO, st_label, SCSI_DEBUG, 6368 "st_start: cdb", (caddr_t)cdbp); 6369 scsi_log(ST_DEVINFO, st_label, SCSI_DEBUG, 6370 "st_start: fileno=%d, blk=%d\n", 6371 un->un_pos.fileno, un->un_pos.blkno); 6372 } 6373 #endif 6374 6375 6376 /* 6377 * Command start && done functions 6378 */ 6379 6380 /* 6381 * st_start() 6382 * 6383 * Called from: 6384 * st_strategy() to start a command. 6385 * st_runout() to retry when scsi_pkt allocation fails on previous attempt(s). 6386 * st_attach() when resuming from power down state. 6387 * st_start_restart() to retry transport when device was previously busy. 6388 * st_done_and_mutex_exit() to start the next command when previous is done. 6389 * 6390 * On entry: 6391 * scsi_pkt may or may not be allocated. 6392 * 6393 */ 6394 static void 6395 st_start(struct scsi_tape *un) 6396 { 6397 struct buf *bp; 6398 int status; 6399 int queued; 6400 6401 ST_FUNC(ST_DEVINFO, st_start); 6402 ASSERT(mutex_owned(ST_MUTEX)); 6403 6404 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 6405 "st_start(): dev = 0x%lx\n", un->un_dev); 6406 6407 if (un->un_recov_buf_busy) { 6408 /* recovery commands can happen anytime */ 6409 bp = un->un_recov_buf; 6410 queued = 0; 6411 } else if (un->un_sbuf_busy) { 6412 /* sbuf commands should only happen with an empty queue. */ 6413 ASSERT(un->un_quef == NULL); 6414 ASSERT(un->un_runqf == NULL); 6415 bp = un->un_sbufp; 6416 queued = 0; 6417 } else if (un->un_quef != NULL) { 6418 if (un->un_persistence && un->un_persist_errors) { 6419 return; 6420 } 6421 bp = un->un_quef; 6422 queued = 1; 6423 } else { 6424 scsi_log(ST_DEVINFO, st_label, SCSI_DEBUG, 6425 "st_start() returning no buf found\n"); 6426 return; 6427 } 6428 6429 ASSERT((bp->b_flags & B_DONE) == 0); 6430 6431 /* 6432 * Don't send more than un_throttle commands to the HBA 6433 */ 6434 if ((un->un_throttle <= 0) || (un->un_ncmds >= un->un_throttle)) { 6435 /* 6436 * if doing recovery we know there is outstanding commands. 6437 */ 6438 if (bp != un->un_recov_buf) { 6439 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 6440 "st_start returning throttle = %d or ncmds = %d\n", 6441 un->un_throttle, un->un_ncmds); 6442 if (un->un_ncmds == 0) { 6443 typedef void (*func)(); 6444 func fnc = (func)st_runout; 6445 6446 scsi_log(ST_DEVINFO, st_label, SCSI_DEBUG, 6447 "Sending delayed start to st_runout()\n"); 6448 mutex_exit(ST_MUTEX); 6449 (void) timeout(fnc, un, drv_usectohz(1000000)); 6450 mutex_enter(ST_MUTEX); 6451 } 6452 return; 6453 } 6454 } 6455 6456 /* 6457 * If the buf has no scsi_pkt call st_make_cmd() to get one and 6458 * build the command. 6459 */ 6460 if (BP_PKT(bp) == NULL) { 6461 ASSERT((bp->b_flags & B_DONE) == 0); 6462 st_make_cmd(un, bp, st_runout); 6463 ASSERT((bp->b_flags & B_DONE) == 0); 6464 status = geterror(bp); 6465 6466 /* 6467 * Some HBA's don't call bioerror() to set an error. 6468 * And geterror() returns zero if B_ERROR is not set. 6469 * So if we get zero we must check b_error. 6470 */ 6471 if (status == 0 && bp->b_error != 0) { 6472 status = bp->b_error; 6473 bioerror(bp, status); 6474 } 6475 6476 /* 6477 * Some HBA's convert DDI_DMA_NORESOURCES into ENOMEM. 6478 * In tape ENOMEM has special meaning so we'll change it. 6479 */ 6480 if (status == ENOMEM) { 6481 status = 0; 6482 bioerror(bp, status); 6483 } 6484 6485 /* 6486 * Did it fail and is it retryable? 6487 * If so return and wait for the callback through st_runout. 6488 * Also looks like scsi_init_pkt() will setup a callback even 6489 * if it isn't retryable. 6490 */ 6491 if (BP_PKT(bp) == NULL) { 6492 if (status == 0) { 6493 /* 6494 * If first attempt save state. 6495 */ 6496 if (un->un_state != ST_STATE_RESOURCE_WAIT) { 6497 un->un_laststate = un->un_state; 6498 un->un_state = ST_STATE_RESOURCE_WAIT; 6499 } 6500 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 6501 "temp no resources for pkt\n"); 6502 } else if (status == EINVAL) { 6503 scsi_log(ST_DEVINFO, st_label, SCSI_DEBUG, 6504 "scsi_init_pkt rejected pkt as too big\n"); 6505 if (un->un_persistence) { 6506 st_set_pe_flag(un); 6507 } 6508 } else { 6509 /* 6510 * Unlikely that it would be retryable then not. 6511 */ 6512 if (un->un_state == ST_STATE_RESOURCE_WAIT) { 6513 un->un_state = un->un_laststate; 6514 } 6515 scsi_log(ST_DEVINFO, st_label, SCSI_DEBUG, 6516 "perm no resources for pkt errno = 0x%x\n", 6517 status); 6518 } 6519 return; 6520 } 6521 /* 6522 * Worked this time set the state back. 6523 */ 6524 if (un->un_state == ST_STATE_RESOURCE_WAIT) { 6525 un->un_state = un->un_laststate; 6526 } 6527 } 6528 6529 if (queued) { 6530 /* 6531 * move from waitq to runq 6532 */ 6533 (void) st_remove_from_queue(&un->un_quef, &un->un_quel, bp); 6534 st_add_to_queue(&un->un_runqf, &un->un_runql, un->un_runql, bp); 6535 } 6536 6537 6538 #ifdef STDEBUG 6539 st_start_dump(un, bp); 6540 #endif 6541 6542 /* could not get here if throttle was zero */ 6543 un->un_last_throttle = un->un_throttle; 6544 un->un_throttle = 0; /* so nothing else will come in here */ 6545 un->un_ncmds++; 6546 6547 ST_DO_KSTATS(bp, kstat_waitq_to_runq); 6548 6549 status = st_transport(un, BP_PKT(bp)); 6550 6551 if (un->un_last_throttle) { 6552 un->un_throttle = un->un_last_throttle; 6553 } 6554 6555 if (status != TRAN_ACCEPT) { 6556 ST_DO_KSTATS(bp, kstat_runq_back_to_waitq); 6557 ST_DEBUG(ST_DEVINFO, st_label, CE_WARN, 6558 "Unhappy transport packet status 0x%x\n", status); 6559 6560 if (status == TRAN_BUSY) { 6561 pkt_info *pkti = BP_PKT(bp)->pkt_private; 6562 6563 /* 6564 * If command recovery is enabled and this isn't 6565 * a recovery command try command recovery. 6566 */ 6567 if (pkti->privatelen == sizeof (recov_info) && 6568 bp != un->un_recov_buf) { 6569 ST_RECOV(ST_DEVINFO, st_label, CE_WARN, 6570 "Command Recovery called on busy send\n"); 6571 if (st_command_recovery(un, BP_PKT(bp), 6572 ATTEMPT_RETRY) == JUST_RETURN) { 6573 return; 6574 } 6575 } else { 6576 mutex_exit(ST_MUTEX); 6577 if (st_handle_start_busy(un, bp, 6578 ST_TRAN_BUSY_TIMEOUT, queued) == 0) { 6579 mutex_enter(ST_MUTEX); 6580 return; 6581 } 6582 /* 6583 * if too many retries, fail the transport 6584 */ 6585 mutex_enter(ST_MUTEX); 6586 } 6587 } 6588 scsi_log(ST_DEVINFO, st_label, CE_WARN, 6589 "transport rejected %d\n", status); 6590 bp->b_resid = bp->b_bcount; 6591 6592 ST_DO_KSTATS(bp, kstat_waitq_exit); 6593 ST_DO_ERRSTATS(un, st_transerrs); 6594 if ((bp == un->un_recov_buf) && (status == TRAN_BUSY)) { 6595 st_bioerror(bp, EBUSY); 6596 } else { 6597 st_bioerror(bp, EIO); 6598 st_set_pe_flag(un); 6599 } 6600 st_done_and_mutex_exit(un, bp); 6601 mutex_enter(ST_MUTEX); 6602 } 6603 6604 ASSERT(mutex_owned(ST_MUTEX)); 6605 } 6606 6607 /* 6608 * if the transport is busy, then put this bp back on the waitq 6609 */ 6610 static int 6611 st_handle_start_busy(struct scsi_tape *un, struct buf *bp, 6612 clock_t timeout_interval, int queued) 6613 { 6614 6615 pkt_info *pktinfo = BP_PKT(bp)->pkt_private; 6616 6617 ST_FUNC(ST_DEVINFO, st_handle_start_busy); 6618 6619 mutex_enter(ST_MUTEX); 6620 6621 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 6622 "st_handle_start_busy()\n"); 6623 6624 /* 6625 * Check to see if we hit the retry timeout and one last check for 6626 * making sure this is the last on the runq, if it is not, we have 6627 * to fail 6628 */ 6629 if ((pktinfo->str_retry_cnt++ > st_retry_count) || 6630 ((queued) && (un->un_runql != bp))) { 6631 mutex_exit(ST_MUTEX); 6632 return (-1); 6633 } 6634 6635 if (queued) { 6636 /* put the bp back on the waitq */ 6637 st_add_to_queue(&un->un_quef, &un->un_quel, un->un_quef, bp); 6638 } 6639 6640 /* 6641 * Decrement un_ncmds so that this 6642 * gets thru' st_start() again. 6643 */ 6644 un->un_ncmds--; 6645 6646 if (queued) { 6647 /* 6648 * since this is an error case, we won't have to do this list 6649 * walking much. We've already made sure this bp was the 6650 * last on the runq 6651 */ 6652 (void) st_remove_from_queue(&un->un_runqf, &un->un_runql, bp); 6653 6654 /* 6655 * send a marker pkt, if appropriate 6656 */ 6657 st_hba_unflush(un); 6658 6659 } 6660 /* 6661 * all queues are aligned, we are just waiting to 6662 * transport, don't alloc any more buf p's, when 6663 * st_start is reentered. 6664 */ 6665 (void) timeout(st_start_restart, un, timeout_interval); 6666 6667 mutex_exit(ST_MUTEX); 6668 return (0); 6669 } 6670 6671 6672 /* 6673 * st_runout a callback that is called what a resource allocatation failed 6674 */ 6675 static int 6676 st_runout(caddr_t arg) 6677 { 6678 struct scsi_tape *un = (struct scsi_tape *)arg; 6679 struct buf *bp; 6680 int queued; 6681 6682 ASSERT(un != NULL); 6683 6684 ST_FUNC(ST_DEVINFO, st_runout); 6685 6686 mutex_enter(ST_MUTEX); 6687 6688 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, "st_runout()\n"); 6689 6690 if (un->un_recov_buf_busy != 0) { 6691 bp = un->un_recov_buf; 6692 queued = 0; 6693 } else if (un->un_sbuf_busy != 0) { 6694 /* sbuf commands should only happen with an empty queue. */ 6695 ASSERT(un->un_quef == NULL); 6696 ASSERT(un->un_runqf == NULL); 6697 bp = un->un_sbufp; 6698 queued = 0; 6699 } else if (un->un_quef != NULL) { 6700 bp = un->un_quef; 6701 if (un->un_persistence && un->un_persist_errors) { 6702 mutex_exit(ST_MUTEX); 6703 bp->b_resid = bp->b_bcount; 6704 biodone(bp); 6705 return (1); 6706 } 6707 queued = 1; 6708 } else { 6709 ASSERT(1 == 0); 6710 mutex_exit(ST_MUTEX); 6711 return (1); 6712 } 6713 6714 /* 6715 * failed scsi_init_pkt(). If errno is zero its retryable. 6716 */ 6717 if ((bp != NULL) && (geterror(bp) != 0)) { 6718 6719 scsi_log(ST_DEVINFO, st_label, CE_WARN, 6720 "errors after pkt alloc (b_flags=0x%x, b_error=0x%x)\n", 6721 bp->b_flags, geterror(bp)); 6722 ASSERT((bp->b_flags & B_DONE) == 0); 6723 6724 if (queued) { 6725 (void) st_remove_from_queue(&un->un_quef, &un->un_quel, 6726 bp); 6727 } 6728 mutex_exit(ST_MUTEX); 6729 6730 ASSERT((bp->b_flags & B_DONE) == 0); 6731 6732 /* 6733 * Set resid, Error already set, then unblock calling thread. 6734 */ 6735 bp->b_resid = bp->b_bcount; 6736 biodone(bp); 6737 } else { 6738 /* 6739 * Try Again 6740 */ 6741 st_start(un); 6742 mutex_exit(ST_MUTEX); 6743 } 6744 6745 /* 6746 * Comments courtesy of sd.c 6747 * The scsi_init_pkt routine allows for the callback function to 6748 * return a 0 indicating the callback should be rescheduled or a 1 6749 * indicating not to reschedule. This routine always returns 1 6750 * because the driver always provides a callback function to 6751 * scsi_init_pkt. This results in a callback always being scheduled 6752 * (via the scsi_init_pkt callback implementation) if a resource 6753 * failure occurs. 6754 */ 6755 6756 return (1); 6757 } 6758 6759 /* 6760 * st_done_and_mutex_exit() 6761 * - remove bp from runq 6762 * - start up the next request 6763 * - if this was an asynch bp, clean up 6764 * - exit with released mutex 6765 */ 6766 static void 6767 st_done_and_mutex_exit(struct scsi_tape *un, struct buf *bp) 6768 { 6769 int pe_flagged = 0; 6770 struct scsi_pkt *pkt = BP_PKT(bp); 6771 pkt_info *pktinfo = pkt->pkt_private; 6772 6773 ASSERT(MUTEX_HELD(&un->un_sd->sd_mutex)); 6774 #if !defined(lint) 6775 _NOTE(LOCK_RELEASED_AS_SIDE_EFFECT(&un->un_sd->sd_mutex)) 6776 #endif 6777 6778 ST_FUNC(ST_DEVINFO, st_done_and_mutex_exit); 6779 6780 ASSERT(mutex_owned(ST_MUTEX)); 6781 6782 (void) st_remove_from_queue(&un->un_runqf, &un->un_runql, bp); 6783 6784 un->un_ncmds--; 6785 cv_signal(&un->un_queue_cv); 6786 6787 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 6788 "st_done_and_mutex_exit(): cmd=0x%x count=%ld resid=%ld flags=" 6789 "0x%x\n", pkt->pkt_cdbp[0], bp->b_bcount, 6790 bp->b_resid, bp->b_flags); 6791 6792 6793 /* 6794 * update kstats with transfer count info 6795 */ 6796 if (un->un_stats && (bp != un->un_sbufp) && IS_RW(bp)) { 6797 uint32_t n_done = bp->b_bcount - bp->b_resid; 6798 if (bp->b_flags & B_READ) { 6799 IOSP->reads++; 6800 IOSP->nread += n_done; 6801 } else { 6802 IOSP->writes++; 6803 IOSP->nwritten += n_done; 6804 } 6805 } 6806 6807 /* 6808 * Start the next one before releasing resources on this one, if 6809 * there is something on the queue and persistent errors has not been 6810 * flagged 6811 */ 6812 6813 if ((pe_flagged = (un->un_persistence && un->un_persist_errors)) != 0) { 6814 un->un_last_resid = bp->b_resid; 6815 un->un_last_count = bp->b_bcount; 6816 } 6817 6818 if (un->un_pwr_mgmt == ST_PWR_SUSPENDED) { 6819 cv_broadcast(&un->un_tape_busy_cv); 6820 } else if (un->un_quef && un->un_throttle && !pe_flagged && 6821 (bp != un->un_recov_buf)) { 6822 st_start(un); 6823 } 6824 6825 un->un_retry_ct = max(pktinfo->pkt_retry_cnt, pktinfo->str_retry_cnt); 6826 6827 if (bp == un->un_sbufp && (bp->b_flags & B_ASYNC)) { 6828 /* 6829 * Since we marked this ourselves as ASYNC, 6830 * there isn't anybody around waiting for 6831 * completion any more. 6832 */ 6833 uchar_t *cmd = pkt->pkt_cdbp; 6834 if (*cmd == SCMD_READ || *cmd == SCMD_WRITE) { 6835 bp->b_un.b_addr = (caddr_t)0; 6836 } 6837 ST_DEBUG(ST_DEVINFO, st_label, CE_NOTE, 6838 "st_done_and_mutex_exit(async): freeing pkt\n"); 6839 st_print_cdb(ST_DEVINFO, st_label, CE_NOTE, 6840 "CDB sent with B_ASYNC", (caddr_t)cmd); 6841 if (pkt) { 6842 scsi_destroy_pkt(pkt); 6843 } 6844 un->un_sbuf_busy = 0; 6845 cv_signal(&un->un_sbuf_cv); 6846 mutex_exit(ST_MUTEX); 6847 return; 6848 } 6849 6850 if (bp == un->un_sbufp && BP_UCMD(bp)) { 6851 /* 6852 * Copy status from scsi_pkt to uscsi_cmd 6853 * since st_uscsi_cmd needs it 6854 */ 6855 BP_UCMD(bp)->uscsi_status = SCBP_C(BP_PKT(bp)); 6856 } 6857 6858 6859 #ifdef STDEBUG 6860 if (((st_debug & 0x7) >= 4) && 6861 (((un->un_pos.blkno % 100) == 0) || 6862 (un->un_persistence && un->un_persist_errors))) { 6863 6864 ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG, 6865 "st_d_a_m_exit(): ncmds = %d, thr = %d, " 6866 "un_errno = %d, un_pe = %d\n", 6867 un->un_ncmds, un->un_throttle, un->un_errno, 6868 un->un_persist_errors); 6869 } 6870 6871 #endif 6872 6873 mutex_exit(ST_MUTEX); 6874 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 6875 "st_done_and_mutex_exit: freeing pkt\n"); 6876 6877 if (pkt) { 6878 scsi_destroy_pkt(pkt); 6879 } 6880 6881 biodone(bp); 6882 6883 /* 6884 * now that we biodoned that command, if persistent errors have been 6885 * flagged, flush the waitq 6886 */ 6887 if (pe_flagged) 6888 st_flush(un); 6889 } 6890 6891 6892 /* 6893 * Tape error, flush tape driver queue. 6894 */ 6895 static void 6896 st_flush(struct scsi_tape *un) 6897 { 6898 struct buf *bp; 6899 6900 ST_FUNC(ST_DEVINFO, st_flush); 6901 6902 mutex_enter(ST_MUTEX); 6903 6904 ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG, 6905 "st_flush(), ncmds = %d, quef = 0x%p\n", 6906 un->un_ncmds, (void *)un->un_quef); 6907 6908 /* 6909 * if we still have commands outstanding, wait for them to come in 6910 * before flushing the queue, and make sure there is a queue 6911 */ 6912 if (un->un_ncmds || !un->un_quef) 6913 goto exit; 6914 6915 /* 6916 * we have no more commands outstanding, so let's deal with special 6917 * cases in the queue for EOM and FM. If we are here, and un_errno 6918 * is 0, then we know there was no error and we return a 0 read or 6919 * write before showing errors 6920 */ 6921 6922 /* Flush the wait queue. */ 6923 while ((bp = un->un_quef) != NULL) { 6924 un->un_quef = bp->b_actf; 6925 6926 bp->b_resid = bp->b_bcount; 6927 6928 ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG, 6929 "st_flush() : blkno=%d, err=%d, b_bcount=%ld\n", 6930 un->un_pos.blkno, un->un_errno, bp->b_bcount); 6931 6932 st_set_pe_errno(un); 6933 6934 bioerror(bp, un->un_errno); 6935 6936 mutex_exit(ST_MUTEX); 6937 /* it should have one, but check anyway */ 6938 if (BP_PKT(bp)) { 6939 scsi_destroy_pkt(BP_PKT(bp)); 6940 } 6941 biodone(bp); 6942 mutex_enter(ST_MUTEX); 6943 } 6944 6945 /* 6946 * It's not a bad practice to reset the 6947 * waitq tail pointer to NULL. 6948 */ 6949 un->un_quel = NULL; 6950 6951 exit: 6952 /* we mucked with the queue, so let others know about it */ 6953 cv_signal(&un->un_queue_cv); 6954 mutex_exit(ST_MUTEX); 6955 } 6956 6957 6958 /* 6959 * Utility functions 6960 */ 6961 static int 6962 st_determine_generic(struct scsi_tape *un) 6963 { 6964 int bsize; 6965 static char *cart = "0.25 inch cartridge"; 6966 char *sizestr; 6967 6968 ST_FUNC(ST_DEVINFO, st_determine_generic); 6969 6970 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 6971 "st_determine_generic(un = 0x%p)\n", (void*)un); 6972 6973 ASSERT(mutex_owned(ST_MUTEX)); 6974 6975 if (st_modesense(un)) { 6976 return (-1); 6977 } 6978 6979 bsize = (un->un_mspl->high_bl << 16) | 6980 (un->un_mspl->mid_bl << 8) | 6981 (un->un_mspl->low_bl); 6982 6983 if (bsize == 0) { 6984 un->un_dp->options |= ST_VARIABLE; 6985 un->un_dp->bsize = 0; 6986 un->un_bsize = 0; 6987 } else if (bsize > ST_MAXRECSIZE_FIXED) { 6988 /* 6989 * record size of this device too big. 6990 * try and convert it to variable record length. 6991 * 6992 */ 6993 un->un_dp->options |= ST_VARIABLE; 6994 if (st_change_block_size(un, 0) != 0) { 6995 ST_DEBUG6(ST_DEVINFO, st_label, CE_WARN, 6996 "Fixed Record Size %d is too large\n", bsize); 6997 ST_DEBUG6(ST_DEVINFO, st_label, CE_WARN, 6998 "Cannot switch to variable record size\n"); 6999 un->un_dp->options &= ~ST_VARIABLE; 7000 return (-1); 7001 } 7002 } else if (st_change_block_size(un, 0) == 0) { 7003 /* 7004 * If the drive was set to a non zero block size, 7005 * See if it can be set to a zero block size. 7006 * If it works, ST_VARIABLE so user can set it as they want. 7007 */ 7008 un->un_dp->options |= ST_VARIABLE; 7009 un->un_dp->bsize = 0; 7010 un->un_bsize = 0; 7011 } else { 7012 un->un_dp->bsize = bsize; 7013 un->un_bsize = bsize; 7014 } 7015 7016 7017 switch (un->un_mspl->density) { 7018 default: 7019 case 0x0: 7020 /* 7021 * default density, cannot determine any other 7022 * information. 7023 */ 7024 sizestr = "Unknown type- assuming 0.25 inch cartridge"; 7025 un->un_dp->type = ST_TYPE_DEFAULT; 7026 un->un_dp->options |= (ST_AUTODEN_OVERRIDE|ST_QIC); 7027 break; 7028 case 0x1: 7029 case 0x2: 7030 case 0x3: 7031 case 0x6: 7032 /* 7033 * 1/2" reel 7034 */ 7035 sizestr = "0.50 inch reel"; 7036 un->un_dp->type = ST_TYPE_REEL; 7037 un->un_dp->options |= ST_REEL; 7038 un->un_dp->densities[0] = 0x1; 7039 un->un_dp->densities[1] = 0x2; 7040 un->un_dp->densities[2] = 0x6; 7041 un->un_dp->densities[3] = 0x3; 7042 break; 7043 case 0x4: 7044 case 0x5: 7045 case 0x7: 7046 case 0x0b: 7047 7048 /* 7049 * Quarter inch. 7050 */ 7051 sizestr = cart; 7052 un->un_dp->type = ST_TYPE_DEFAULT; 7053 un->un_dp->options |= ST_QIC; 7054 7055 un->un_dp->densities[1] = 0x4; 7056 un->un_dp->densities[2] = 0x5; 7057 un->un_dp->densities[3] = 0x7; 7058 un->un_dp->densities[0] = 0x0b; 7059 break; 7060 7061 case 0x0f: 7062 case 0x10: 7063 case 0x11: 7064 case 0x12: 7065 /* 7066 * QIC-120, QIC-150, QIC-320, QIC-600 7067 */ 7068 sizestr = cart; 7069 un->un_dp->type = ST_TYPE_DEFAULT; 7070 un->un_dp->options |= ST_QIC; 7071 un->un_dp->densities[0] = 0x0f; 7072 un->un_dp->densities[1] = 0x10; 7073 un->un_dp->densities[2] = 0x11; 7074 un->un_dp->densities[3] = 0x12; 7075 break; 7076 7077 case 0x09: 7078 case 0x0a: 7079 case 0x0c: 7080 case 0x0d: 7081 /* 7082 * 1/2" cartridge tapes. Include HI-TC. 7083 */ 7084 sizestr = cart; 7085 sizestr[2] = '5'; 7086 sizestr[3] = '0'; 7087 un->un_dp->type = ST_TYPE_HIC; 7088 un->un_dp->densities[0] = 0x09; 7089 un->un_dp->densities[1] = 0x0a; 7090 un->un_dp->densities[2] = 0x0c; 7091 un->un_dp->densities[3] = 0x0d; 7092 break; 7093 7094 case 0x13: 7095 /* DDS-2/DDS-3 scsi spec densities */ 7096 case 0x24: 7097 case 0x25: 7098 case 0x26: 7099 sizestr = "DAT Data Storage (DDS)"; 7100 un->un_dp->type = ST_TYPE_DAT; 7101 un->un_dp->options |= ST_AUTODEN_OVERRIDE; 7102 break; 7103 7104 case 0x14: 7105 /* 7106 * Helical Scan (Exabyte) devices 7107 */ 7108 sizestr = "8mm helical scan cartridge"; 7109 un->un_dp->type = ST_TYPE_EXABYTE; 7110 un->un_dp->options |= ST_AUTODEN_OVERRIDE; 7111 break; 7112 } 7113 7114 /* 7115 * Assume LONG ERASE, BSF and BSR 7116 */ 7117 7118 un->un_dp->options |= 7119 (ST_LONG_ERASE | ST_UNLOADABLE | ST_BSF | ST_BSR | ST_KNOWS_EOD); 7120 7121 /* 7122 * Only if mode sense data says no buffered write, set NOBUF 7123 */ 7124 if (un->un_mspl->bufm == 0) 7125 un->un_dp->options |= ST_NOBUF; 7126 7127 /* 7128 * set up large read and write retry counts 7129 */ 7130 7131 un->un_dp->max_rretries = un->un_dp->max_wretries = 1000; 7132 7133 /* 7134 * If this is a 0.50 inch reel tape, and 7135 * it is *not* variable mode, try and 7136 * set it to variable record length 7137 * mode. 7138 */ 7139 if ((un->un_dp->options & ST_REEL) && un->un_bsize != 0 && 7140 (un->un_dp->options & ST_VARIABLE)) { 7141 if (st_change_block_size(un, 0) == 0) { 7142 un->un_dp->bsize = 0; 7143 un->un_mspl->high_bl = un->un_mspl->mid_bl = 7144 un->un_mspl->low_bl = 0; 7145 } 7146 } 7147 7148 /* 7149 * Write to console about type of device found 7150 */ 7151 ST_DEBUG6(ST_DEVINFO, st_label, CE_NOTE, 7152 "Generic Drive, Vendor=%s\n\t%s", un->un_dp->name, 7153 sizestr); 7154 if (un->un_dp->options & ST_VARIABLE) { 7155 scsi_log(ST_DEVINFO, st_label, CE_NOTE, 7156 "!Variable record length I/O\n"); 7157 } else { 7158 scsi_log(ST_DEVINFO, st_label, CE_NOTE, 7159 "!Fixed record length (%d byte blocks) I/O\n", 7160 un->un_dp->bsize); 7161 } 7162 ASSERT(mutex_owned(ST_MUTEX)); 7163 return (0); 7164 } 7165 7166 static int 7167 st_determine_density(struct scsi_tape *un, int rw) 7168 { 7169 int rval = 0; 7170 7171 ST_FUNC(ST_DEVINFO, st_determine_density); 7172 7173 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 7174 "st_determine_density(un = 0x%p, rw = %s)\n", 7175 (void*)un, (rw == B_WRITE ? wr_str: rd_str)); 7176 7177 ASSERT(mutex_owned(ST_MUTEX)); 7178 7179 /* 7180 * If we're past BOT, density is determined already. 7181 */ 7182 if (un->un_pos.pmode == logical) { 7183 if (un->un_pos.lgclblkno != 0) { 7184 goto exit; 7185 } 7186 } else if (un->un_pos.pmode == legacy) { 7187 if ((un->un_pos.fileno != 0) || (un->un_pos.blkno != 0)) { 7188 /* 7189 * XXX: put in a bitch message about attempting to 7190 * XXX: change density past BOT. 7191 */ 7192 goto exit; 7193 } 7194 } else { 7195 goto exit; 7196 } 7197 if ((un->un_pos.pmode == logical) && 7198 (un->un_pos.lgclblkno != 0)) { 7199 goto exit; 7200 } 7201 7202 7203 /* 7204 * If we're going to be writing, we set the density 7205 */ 7206 if (rw == 0 || rw == B_WRITE) { 7207 /* un_curdens is used as an index into densities table */ 7208 un->un_curdens = MT_DENSITY(un->un_dev); 7209 if (st_set_density(un)) { 7210 rval = -1; 7211 } 7212 goto exit; 7213 } 7214 7215 /* 7216 * If density is known already, 7217 * we don't have to get it again.(?) 7218 */ 7219 if (!un->un_density_known) { 7220 if (st_get_density(un)) { 7221 rval = -1; 7222 } 7223 } 7224 7225 exit: 7226 ASSERT(mutex_owned(ST_MUTEX)); 7227 return (rval); 7228 } 7229 7230 7231 /* 7232 * Try to determine density. We do this by attempting to read the 7233 * first record off the tape, cycling through the available density 7234 * codes as we go. 7235 */ 7236 7237 static int 7238 st_get_density(struct scsi_tape *un) 7239 { 7240 int succes = 0, rval = -1, i; 7241 uint_t size; 7242 uchar_t dens, olddens; 7243 7244 ST_FUNC(ST_DEVINFO, st_get_density); 7245 7246 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 7247 "st_get_density(un = 0x%p)\n", (void*)un); 7248 7249 ASSERT(mutex_owned(ST_MUTEX)); 7250 7251 /* 7252 * If Auto Density override is enabled The drive has 7253 * only one density and there is no point in attempting 7254 * find the correct one. 7255 * 7256 * Since most modern drives auto detect the density 7257 * and format of the recorded media before they come 7258 * ready. What this function does is a legacy behavior 7259 * and modern drives not only don't need it, The backup 7260 * utilities that do positioning via uscsi find the un- 7261 * expected rewinds problematic. 7262 * 7263 * The drives that need this are old reel to reel devices. 7264 * I took a swag and said they must be scsi-1 or older. 7265 * I don't beleave there will any of the newer devices 7266 * that need this. There will be some scsi-1 devices that 7267 * don't need this but I don't think they will be using the 7268 * BIG aftermarket backup and restore utilitys. 7269 */ 7270 if ((un->un_dp->options & ST_AUTODEN_OVERRIDE) || 7271 (un->un_sd->sd_inq->inq_ansi > 1)) { 7272 un->un_density_known = 1; 7273 rval = 0; 7274 goto exit; 7275 } 7276 7277 /* 7278 * This will only work on variable record length tapes 7279 * if and only if all variable record length tapes autodensity 7280 * select. 7281 */ 7282 size = (unsigned)(un->un_dp->bsize ? un->un_dp->bsize : SECSIZE); 7283 un->un_tmpbuf = kmem_alloc(size, KM_SLEEP); 7284 7285 /* 7286 * Start at the specified density 7287 */ 7288 7289 dens = olddens = un->un_curdens = MT_DENSITY(un->un_dev); 7290 7291 for (i = 0; i < NDENSITIES; i++, ((un->un_curdens == NDENSITIES - 1) ? 7292 (un->un_curdens = 0) : (un->un_curdens += 1))) { 7293 /* 7294 * If we've done this density before, 7295 * don't bother to do it again. 7296 */ 7297 dens = un->un_dp->densities[un->un_curdens]; 7298 if (i > 0 && dens == olddens) 7299 continue; 7300 olddens = dens; 7301 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 7302 "trying density 0x%x\n", dens); 7303 if (st_set_density(un)) { 7304 continue; 7305 } 7306 7307 /* 7308 * XXX - the creates lots of headaches and slowdowns - must 7309 * fix. 7310 */ 7311 succes = (st_cmd(un, SCMD_READ, (int)size, SYNC_CMD) == 0); 7312 if (st_cmd(un, SCMD_REWIND, 0, SYNC_CMD)) { 7313 break; 7314 } 7315 if (succes) { 7316 st_init(un); 7317 rval = 0; 7318 un->un_density_known = 1; 7319 break; 7320 } 7321 } 7322 kmem_free(un->un_tmpbuf, size); 7323 un->un_tmpbuf = 0; 7324 7325 exit: 7326 ASSERT(mutex_owned(ST_MUTEX)); 7327 return (rval); 7328 } 7329 7330 static int 7331 st_set_density(struct scsi_tape *un) 7332 { 7333 int rval = 0; 7334 7335 ST_FUNC(ST_DEVINFO, st_set_density); 7336 7337 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 7338 "st_set_density(un = 0x%p): density = 0x%x\n", (void*)un, 7339 un->un_dp->densities[un->un_curdens]); 7340 7341 ASSERT(mutex_owned(ST_MUTEX)); 7342 7343 un->un_mspl->density = un->un_dp->densities[un->un_curdens]; 7344 7345 if ((un->un_dp->options & ST_AUTODEN_OVERRIDE) == 0) { 7346 /* 7347 * If auto density override is not set, Use mode select 7348 * to set density and compression. 7349 */ 7350 if (st_modeselect(un)) { 7351 rval = -1; 7352 } 7353 } else if ((un->un_dp->options & ST_MODE_SEL_COMP) != 0) { 7354 /* 7355 * If auto density and mode select compression are set, 7356 * This is a drive with one density code but compression 7357 * can be enabled or disabled. 7358 * Set compression but no need to set density. 7359 */ 7360 rval = st_set_compression(un); 7361 if ((rval != 0) && (rval != EALREADY)) { 7362 rval = -1; 7363 } else { 7364 rval = 0; 7365 } 7366 } 7367 7368 /* If sucessful set density and/or compression, mark density known */ 7369 if (rval == 0) { 7370 un->un_density_known = 1; 7371 } 7372 7373 ASSERT(mutex_owned(ST_MUTEX)); 7374 return (rval); 7375 } 7376 7377 static int 7378 st_loadtape(struct scsi_tape *un) 7379 { 7380 int rval; 7381 7382 ST_FUNC(ST_DEVINFO, st_loadtape); 7383 7384 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 7385 "st_loadtape(un = 0x%p)\n", (void*) un); 7386 7387 ASSERT(mutex_owned(ST_MUTEX)); 7388 7389 rval = st_update_block_pos(un, st_cmd, 0); 7390 if (rval == EACCES) { 7391 return (rval); 7392 } 7393 7394 /* 7395 * 'LOAD' the tape to BOT by rewinding 7396 */ 7397 rval = st_cmd(un, SCMD_REWIND, 1, SYNC_CMD); 7398 if (rval == 0) { 7399 st_init(un); 7400 un->un_density_known = 0; 7401 } 7402 7403 ASSERT(mutex_owned(ST_MUTEX)); 7404 return (rval); 7405 } 7406 7407 7408 /* 7409 * Note: QIC devices aren't so smart. If you try to append 7410 * after EOM, the write can fail because the device doesn't know 7411 * it's at EOM. In that case, issue a read. The read should fail 7412 * because there's no data, but the device knows it's at EOM, 7413 * so a subsequent write should succeed. To further confuse matters, 7414 * the target returns the same error if the tape is positioned 7415 * such that a write would overwrite existing data. That's why 7416 * we have to do the append test. A read in the middle of 7417 * recorded data would succeed, thus indicating we're attempting 7418 * something illegal. 7419 */ 7420 7421 7422 static void 7423 st_test_append(struct buf *bp) 7424 { 7425 dev_t dev = bp->b_edev; 7426 struct scsi_tape *un; 7427 uchar_t status; 7428 unsigned bcount; 7429 7430 un = ddi_get_soft_state(st_state, MTUNIT(dev)); 7431 7432 ST_FUNC(ST_DEVINFO, st_test_append); 7433 7434 ASSERT(mutex_owned(ST_MUTEX)); 7435 7436 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 7437 "st_test_append(): fileno %d\n", un->un_pos.fileno); 7438 7439 un->un_laststate = un->un_state; 7440 un->un_state = ST_STATE_APPEND_TESTING; 7441 un->un_test_append = 0; 7442 7443 /* 7444 * first, map in the buffer, because we're doing a double write -- 7445 * first into the kernel, then onto the tape. 7446 */ 7447 bp_mapin(bp); 7448 7449 /* 7450 * get a copy of the data.... 7451 */ 7452 un->un_tmpbuf = kmem_alloc((unsigned)bp->b_bcount, KM_SLEEP); 7453 bcopy(bp->b_un.b_addr, un->un_tmpbuf, (uint_t)bp->b_bcount); 7454 7455 /* 7456 * attempt the write.. 7457 */ 7458 7459 if (st_cmd(un, (int)SCMD_WRITE, (int)bp->b_bcount, SYNC_CMD) == 0) { 7460 success: 7461 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 7462 "append write succeeded\n"); 7463 bp->b_resid = un->un_sbufp->b_resid; 7464 mutex_exit(ST_MUTEX); 7465 bcount = (unsigned)bp->b_bcount; 7466 biodone(bp); 7467 mutex_enter(ST_MUTEX); 7468 un->un_laststate = un->un_state; 7469 un->un_state = ST_STATE_OPEN; 7470 kmem_free(un->un_tmpbuf, bcount); 7471 un->un_tmpbuf = NULL; 7472 return; 7473 } 7474 7475 /* 7476 * The append failed. Do a short read. If that fails, we are at EOM 7477 * so we can retry the write command. If that succeeds, than we're 7478 * all screwed up (the controller reported a real error). 7479 * 7480 * XXX: should the dummy read be > SECSIZE? should it be the device's 7481 * XXX: block size? 7482 * 7483 */ 7484 status = un->un_status; 7485 un->un_status = 0; 7486 (void) st_cmd(un, SCMD_READ, SECSIZE, SYNC_CMD); 7487 if (un->un_status == KEY_BLANK_CHECK) { 7488 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 7489 "append at EOM\n"); 7490 /* 7491 * Okay- the read failed. We should actually have confused 7492 * the controller enough to allow writing. In any case, the 7493 * i/o is on its own from here on out. 7494 */ 7495 un->un_laststate = un->un_state; 7496 un->un_state = ST_STATE_OPEN; 7497 bcopy(bp->b_un.b_addr, un->un_tmpbuf, (uint_t)bp->b_bcount); 7498 if (st_cmd(un, (int)SCMD_WRITE, (int)bp->b_bcount, 7499 SYNC_CMD) == 0) { 7500 goto success; 7501 } 7502 } 7503 7504 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 7505 "append write failed- not at EOM\n"); 7506 bp->b_resid = bp->b_bcount; 7507 st_bioerror(bp, EIO); 7508 7509 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 7510 "st_test_append : EIO : append write failed - not at EOM"); 7511 7512 /* 7513 * backspace one record to get back to where we were 7514 */ 7515 if (st_cmd(un, SCMD_SPACE, Blk(-1), SYNC_CMD)) { 7516 un->un_pos.pmode = invalid; 7517 } 7518 7519 un->un_err_resid = bp->b_resid; 7520 un->un_status = status; 7521 7522 /* 7523 * Note: biodone will do a bp_mapout() 7524 */ 7525 mutex_exit(ST_MUTEX); 7526 bcount = (unsigned)bp->b_bcount; 7527 biodone(bp); 7528 mutex_enter(ST_MUTEX); 7529 un->un_laststate = un->un_state; 7530 un->un_state = ST_STATE_OPEN_PENDING_IO; 7531 kmem_free(un->un_tmpbuf, bcount); 7532 un->un_tmpbuf = NULL; 7533 } 7534 7535 /* 7536 * Special command handler 7537 */ 7538 7539 /* 7540 * common st_cmd code. The fourth parameter states 7541 * whether the caller wishes to await the results 7542 * Note the release of the mutex during most of the function 7543 */ 7544 static int 7545 st_cmd(struct scsi_tape *un, int com, int64_t count, int wait) 7546 { 7547 struct buf *bp; 7548 int err; 7549 uint_t last_err_resid; 7550 7551 ST_FUNC(ST_DEVINFO, st_cmd); 7552 7553 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 7554 "st_cmd(dev = 0x%lx, com = 0x%x, count = %"PRIx64", wait = %d)\n", 7555 un->un_dev, com, count, wait); 7556 7557 ASSERT(MUTEX_HELD(&un->un_sd->sd_mutex)); 7558 ASSERT(mutex_owned(ST_MUTEX)); 7559 7560 #ifdef STDEBUG 7561 if ((st_debug & 0x7)) { 7562 st_debug_cmds(un, com, count, wait); 7563 } 7564 #endif 7565 7566 st_wait_for_io(un); 7567 7568 /* check to see if this command requires the drive to be reserved */ 7569 err = st_check_cmd_for_need_to_reserve(un, com, count); 7570 7571 if (err) { 7572 return (err); 7573 } 7574 7575 /* 7576 * A space command is not recoverable if we don't know were we 7577 * were when it was issued. 7578 */ 7579 if ((com == SCMD_SPACE) || (com == SCMD_SPACE_G4)) { 7580 (void) st_update_block_pos(un, st_cmd, 0); 7581 } 7582 7583 /* 7584 * Forground should not be doing anything while recovery is active. 7585 */ 7586 ASSERT(un->un_recov_buf_busy == 0); 7587 7588 while (un->un_sbuf_busy) 7589 cv_wait(&un->un_sbuf_cv, ST_MUTEX); 7590 un->un_sbuf_busy = 1; 7591 7592 bp = un->un_sbufp; 7593 bzero(bp, sizeof (buf_t)); 7594 7595 bp->b_flags = (wait) ? B_BUSY : B_BUSY|B_ASYNC; 7596 7597 err = st_setup_cmd(un, bp, com, count); 7598 7599 un->un_sbuf_busy = 0; 7600 7601 /* 7602 * If was a space command need to update logical block position. 7603 * Only do this if the command was sucessful or it will mask the fact 7604 * that the space command failed by promoting the pmode to logical. 7605 */ 7606 if (((com == SCMD_SPACE) || (com == SCMD_SPACE_G4)) && 7607 (un->un_pos.pmode != invalid)) { 7608 un->un_running.pmode = invalid; 7609 last_err_resid = un->un_err_resid; 7610 (void) st_update_block_pos(un, st_cmd, 1); 7611 /* 7612 * Set running position to invalid so it updates on the 7613 * next command. 7614 */ 7615 un->un_running.pmode = invalid; 7616 un->un_err_resid = last_err_resid; 7617 } 7618 7619 cv_signal(&un->un_sbuf_cv); 7620 7621 return (err); 7622 } 7623 7624 static int 7625 st_setup_cmd(struct scsi_tape *un, buf_t *bp, int com, int64_t count) 7626 { 7627 int err; 7628 dev_t dev = un->un_dev; 7629 7630 ST_FUNC(ST_DEVINFO, st_setup_cmd); 7631 /* 7632 * Set count to the actual size of the data tranfer. 7633 * For commands with no data transfer, set bp->b_bcount 7634 * to the value to be used when constructing the 7635 * cdb in st_make_cmd(). 7636 */ 7637 switch (com) { 7638 case SCMD_READ: 7639 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 7640 "special read %"PRId64"\n", count); 7641 bp->b_flags |= B_READ; 7642 bp->b_un.b_addr = un->un_tmpbuf; 7643 break; 7644 7645 case SCMD_WRITE: 7646 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 7647 "special write %"PRId64"\n", count); 7648 bp->b_un.b_addr = un->un_tmpbuf; 7649 break; 7650 7651 case SCMD_WRITE_FILE_MARK: 7652 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 7653 "write %"PRId64" file marks\n", count); 7654 bp->b_bcount = count; 7655 count = 0; 7656 break; 7657 7658 case SCMD_REWIND: 7659 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, "rewind\n"); 7660 bp->b_bcount = count; 7661 count = 0; 7662 break; 7663 7664 case SCMD_SPACE: 7665 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, "space\n"); 7666 /* 7667 * If the user could have entered a number that will 7668 * not fit in the 12 bit count field of space(8), 7669 * use space(16). 7670 */ 7671 if (((int64_t)SPACE_CNT(count) > 0x7fffff) || 7672 ((int64_t)SPACE_CNT(count) < -(0x7fffff))) { 7673 com = SCMD_SPACE_G4; 7674 } 7675 bp->b_bcount = count; 7676 count = 0; 7677 break; 7678 7679 case SCMD_RESERVE: 7680 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, "reserve"); 7681 bp->b_bcount = 0; 7682 count = 0; 7683 break; 7684 7685 case SCMD_RELEASE: 7686 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, "release"); 7687 bp->b_bcount = 0; 7688 count = 0; 7689 break; 7690 7691 case SCMD_LOAD: 7692 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 7693 "%s tape\n", (count & LD_LOAD) ? "load" : "unload"); 7694 bp->b_bcount = count; 7695 count = 0; 7696 break; 7697 7698 case SCMD_ERASE: 7699 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 7700 "erase tape\n"); 7701 bp->b_bcount = count; 7702 count = 0; 7703 break; 7704 7705 case SCMD_MODE_SENSE: 7706 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 7707 "mode sense\n"); 7708 bp->b_flags |= B_READ; 7709 bp->b_un.b_addr = (caddr_t)(un->un_mspl); 7710 break; 7711 7712 case SCMD_MODE_SELECT: 7713 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 7714 "mode select\n"); 7715 bp->b_un.b_addr = (caddr_t)(un->un_mspl); 7716 break; 7717 7718 case SCMD_READ_BLKLIM: 7719 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 7720 "read block limits\n"); 7721 bp->b_bcount = count; 7722 bp->b_flags |= B_READ; 7723 bp->b_un.b_addr = (caddr_t)(un->un_rbl); 7724 break; 7725 7726 case SCMD_TEST_UNIT_READY: 7727 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 7728 "test unit ready\n"); 7729 bp->b_bcount = 0; 7730 count = 0; 7731 break; 7732 7733 case SCMD_DOORLOCK: 7734 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 7735 "%s tape\n", (count & MR_LOCK) ? "lock" : "unlock"); 7736 bp->b_bcount = count = 0; 7737 break; 7738 7739 case SCMD_READ_POSITION: 7740 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 7741 "read position\n"); 7742 switch (un->un_read_pos_type) { 7743 case LONG_POS: 7744 count = sizeof (tape_position_long_t); 7745 break; 7746 case EXT_POS: 7747 count = min(count, sizeof (tape_position_ext_t)); 7748 break; 7749 case SHORT_POS: 7750 count = sizeof (tape_position_t); 7751 break; 7752 default: 7753 ST_DEBUG(ST_DEVINFO, st_label, CE_PANIC, 7754 "Unknown read position type 0x%x in " 7755 "st_make_cmd()\n", un->un_read_pos_type); 7756 } 7757 bp->b_bcount = count; 7758 bp->b_flags |= B_READ; 7759 bp->b_un.b_addr = (caddr_t)un->un_read_pos_data; 7760 break; 7761 7762 default: 7763 ST_DEBUG(ST_DEVINFO, st_label, CE_PANIC, 7764 "Unhandled scsi command 0x%x in st_setup_cmd()\n", com); 7765 } 7766 7767 mutex_exit(ST_MUTEX); 7768 7769 if (count > 0) { 7770 int flg = (bp->b_flags & B_READ) ? B_READ : B_WRITE; 7771 /* 7772 * We're going to do actual I/O. 7773 * Set things up for physio. 7774 */ 7775 struct iovec aiov; 7776 struct uio auio; 7777 struct uio *uio = &auio; 7778 7779 bzero(&auio, sizeof (struct uio)); 7780 bzero(&aiov, sizeof (struct iovec)); 7781 aiov.iov_base = bp->b_un.b_addr; 7782 aiov.iov_len = count; 7783 7784 uio->uio_iov = &aiov; 7785 uio->uio_iovcnt = 1; 7786 uio->uio_resid = aiov.iov_len; 7787 uio->uio_segflg = UIO_SYSSPACE; 7788 7789 /* 7790 * Let physio do the rest... 7791 */ 7792 bp->b_forw = (struct buf *)(uintptr_t)com; 7793 bp->b_back = NULL; 7794 err = physio(st_strategy, bp, dev, flg, st_minphys, uio); 7795 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 7796 "st_setup_cmd: physio returns %d\n", err); 7797 } else { 7798 /* 7799 * Mimic physio 7800 */ 7801 bp->b_forw = (struct buf *)(uintptr_t)com; 7802 bp->b_back = NULL; 7803 bp->b_edev = dev; 7804 bp->b_dev = cmpdev(dev); 7805 bp->b_blkno = 0; 7806 bp->b_resid = 0; 7807 (void) st_strategy(bp); 7808 if (bp->b_flags & B_ASYNC) { 7809 /* 7810 * This is an async command- the caller won't wait 7811 * and doesn't care about errors. 7812 */ 7813 mutex_enter(ST_MUTEX); 7814 return (0); 7815 } 7816 7817 /* 7818 * BugTraq #4260046 7819 * ---------------- 7820 * Restore Solaris 2.5.1 behavior, namely call biowait 7821 * unconditionally. The old comment said... 7822 * 7823 * "if strategy was flagged with persistent errors, we would 7824 * have an error here, and the bp would never be sent, so we 7825 * don't want to wait on a bp that was never sent...or hang" 7826 * 7827 * The new rationale, courtesy of Chitrank... 7828 * 7829 * "we should unconditionally biowait() here because 7830 * st_strategy() will do a biodone() in the persistent error 7831 * case and the following biowait() will return immediately. 7832 * If not, in the case of "errors after pkt alloc" in 7833 * st_start(), we will not biowait here which will cause the 7834 * next biowait() to return immediately which will cause 7835 * us to send out the next command. In the case where both of 7836 * these use the sbuf, when the first command completes we'll 7837 * free the packet attached to sbuf and the same pkt will 7838 * get freed again when we complete the second command. 7839 * see esc 518987. BTW, it is necessary to do biodone() in 7840 * st_start() for the pkt alloc failure case because physio() 7841 * does biowait() and will hang if we don't do biodone()" 7842 */ 7843 7844 err = biowait(bp); 7845 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 7846 "st_setup_cmd: biowait returns %d\n", err); 7847 } 7848 7849 mutex_enter(ST_MUTEX); 7850 7851 return (err); 7852 } 7853 7854 static int 7855 st_set_compression(struct scsi_tape *un) 7856 { 7857 int rval; 7858 int turn_compression_on; 7859 minor_t minor; 7860 7861 ST_FUNC(ST_DEVINFO, st_set_compression); 7862 7863 /* 7864 * Drive either dosn't have compression or it is controlled with 7865 * special density codes. Return ENOTTY so caller 7866 * knows nothing was done. 7867 */ 7868 if ((un->un_dp->options & ST_MODE_SEL_COMP) == 0) { 7869 un->un_comp_page = 0; 7870 return (ENOTTY); 7871 } 7872 7873 /* set compression based on minor node opened */ 7874 minor = MT_DENSITY(un->un_dev); 7875 7876 /* 7877 * If this the compression density or 7878 * the drive has two densities and uses mode select for 7879 * control of compression turn on compression for MT_DENSITY2 7880 * as well. 7881 */ 7882 if ((minor == ST_COMPRESSION_DENSITY) || 7883 (minor == MT_DENSITY(MT_DENSITY2)) && 7884 (un->un_dp->densities[0] == un->un_dp->densities[1]) && 7885 (un->un_dp->densities[2] == un->un_dp->densities[3]) && 7886 (un->un_dp->densities[0] != un->un_dp->densities[2])) { 7887 7888 turn_compression_on = 1; 7889 } else { 7890 turn_compression_on = 0; 7891 } 7892 7893 un->un_mspl->high_bl = (uchar_t)(un->un_bsize >> 16); 7894 un->un_mspl->mid_bl = (uchar_t)(un->un_bsize >> 8); 7895 un->un_mspl->low_bl = (uchar_t)(un->un_bsize); 7896 7897 /* 7898 * Need to determine which page does the device use for compression. 7899 * First try the data compression page. If this fails try the device 7900 * configuration page 7901 */ 7902 7903 if ((un->un_comp_page & ST_DEV_DATACOMP_PAGE) == ST_DEV_DATACOMP_PAGE) { 7904 rval = st_set_datacomp_page(un, turn_compression_on); 7905 if (rval == EALREADY) { 7906 return (rval); 7907 } 7908 if (rval != 0) { 7909 if (un->un_status == KEY_ILLEGAL_REQUEST) { 7910 /* 7911 * This device does not support data 7912 * compression page 7913 */ 7914 un->un_comp_page = ST_DEV_CONFIG_PAGE; 7915 } else if (un->un_state >= ST_STATE_OPEN) { 7916 un->un_pos.pmode = invalid; 7917 rval = EIO; 7918 } else { 7919 rval = -1; 7920 } 7921 } else { 7922 un->un_comp_page = ST_DEV_DATACOMP_PAGE; 7923 } 7924 } 7925 7926 if ((un->un_comp_page & ST_DEV_CONFIG_PAGE) == ST_DEV_CONFIG_PAGE) { 7927 rval = st_set_devconfig_page(un, turn_compression_on); 7928 if (rval == EALREADY) { 7929 return (rval); 7930 } 7931 if (rval != 0) { 7932 if (un->un_status == KEY_ILLEGAL_REQUEST) { 7933 /* 7934 * This device does not support 7935 * compression at all advice the 7936 * user and unset ST_MODE_SEL_COMP 7937 */ 7938 un->un_dp->options &= ~ST_MODE_SEL_COMP; 7939 un->un_comp_page = 0; 7940 scsi_log(ST_DEVINFO, st_label, CE_NOTE, 7941 "Device Does Not Support Compression\n"); 7942 } else if (un->un_state >= ST_STATE_OPEN) { 7943 un->un_pos.pmode = invalid; 7944 rval = EIO; 7945 } else { 7946 rval = -1; 7947 } 7948 } 7949 } 7950 7951 return (rval); 7952 } 7953 7954 /* 7955 * set or unset compression thru device configuration page. 7956 */ 7957 static int 7958 st_set_devconfig_page(struct scsi_tape *un, int compression_on) 7959 { 7960 unsigned char cflag; 7961 int rval = 0; 7962 7963 7964 ST_FUNC(ST_DEVINFO, st_set_devconfig_page); 7965 7966 ASSERT(mutex_owned(ST_MUTEX)); 7967 /* 7968 * Figure what to set compression flag to. 7969 */ 7970 if (compression_on) { 7971 /* They have selected a compression node */ 7972 if (un->un_dp->type == ST_TYPE_FUJI) { 7973 cflag = 0x84; /* use EDRC */ 7974 } else { 7975 cflag = ST_DEV_CONFIG_DEF_COMP; 7976 } 7977 } else { 7978 cflag = ST_DEV_CONFIG_NO_COMP; 7979 } 7980 7981 /* 7982 * If compression is already set the way it was requested. 7983 * And if this not the first time we has tried. 7984 */ 7985 if ((cflag == un->un_mspl->page.dev.comp_alg) && 7986 (un->un_comp_page == ST_DEV_DATACOMP_PAGE)) { 7987 return (EALREADY); 7988 } 7989 7990 un->un_mspl->page.dev.comp_alg = cflag; 7991 /* 7992 * need to send mode select even if correct compression is 7993 * already set since need to set density code 7994 */ 7995 7996 #ifdef STDEBUG 7997 if ((st_debug & 0x7) >= 6) { 7998 st_clean_print(ST_DEVINFO, st_label, SCSI_DEBUG, 7999 "st_set_devconfig_page: sense data for mode select", 8000 (char *)un->un_mspl, sizeof (struct seq_mode)); 8001 } 8002 #endif 8003 rval = st_gen_mode_select(un, st_uscsi_cmd, un->un_mspl, 8004 sizeof (struct seq_mode)); 8005 8006 return (rval); 8007 } 8008 8009 /* 8010 * set/reset compression bit thru data compression page 8011 */ 8012 static int 8013 st_set_datacomp_page(struct scsi_tape *un, int compression_on) 8014 { 8015 int compression_on_already; 8016 int rval = 0; 8017 8018 8019 ST_FUNC(ST_DEVINFO, st_set_datacomp_page); 8020 8021 ASSERT(mutex_owned(ST_MUTEX)); 8022 /* 8023 * If drive is not capable of compression (at this time) 8024 * return EALREADY so caller doesn't think that this page 8025 * is not supported. This check is for drives that can 8026 * disable compression from the front panel or configuration. 8027 * I doubt that a drive that supports this page is not really 8028 * capable of compression. 8029 */ 8030 if (un->un_mspl->page.comp.dcc == 0) { 8031 return (EALREADY); 8032 } 8033 8034 /* See if compression currently turned on */ 8035 if (un->un_mspl->page.comp.dce) { 8036 compression_on_already = 1; 8037 } else { 8038 compression_on_already = 0; 8039 } 8040 8041 /* 8042 * If compression is already set the way it was requested. 8043 * And if this not the first time we has tried. 8044 */ 8045 if ((compression_on == compression_on_already) && 8046 (un->un_comp_page == ST_DEV_DATACOMP_PAGE)) { 8047 return (EALREADY); 8048 } 8049 8050 /* 8051 * if we are already set to the appropriate compression 8052 * mode, don't set it again 8053 */ 8054 if (compression_on) { 8055 /* compression selected */ 8056 un->un_mspl->page.comp.dce = 1; 8057 } else { 8058 un->un_mspl->page.comp.dce = 0; 8059 } 8060 8061 8062 #ifdef STDEBUG 8063 if ((st_debug & 0x7) >= 6) { 8064 st_clean_print(ST_DEVINFO, st_label, SCSI_DEBUG, 8065 "st_set_datacomp_page: sense data for mode select", 8066 (char *)un->un_mspl, sizeof (struct seq_mode)); 8067 } 8068 #endif 8069 rval = st_gen_mode_select(un, st_uscsi_cmd, un->un_mspl, 8070 sizeof (struct seq_mode)); 8071 8072 return (rval); 8073 } 8074 8075 static int 8076 st_modesense(struct scsi_tape *un) 8077 { 8078 int rval; 8079 uchar_t page; 8080 8081 ST_FUNC(ST_DEVINFO, st_modesense); 8082 8083 page = un->un_comp_page; 8084 8085 switch (page) { 8086 case ST_DEV_DATACOMP_PAGE: 8087 case ST_DEV_CONFIG_PAGE: /* FALLTHROUGH */ 8088 rval = st_gen_mode_sense(un, st_uscsi_cmd, page, un->un_mspl, 8089 sizeof (struct seq_mode)); 8090 break; 8091 8092 case ST_DEV_DATACOMP_PAGE | ST_DEV_CONFIG_PAGE: 8093 if (un->un_dp->options & ST_MODE_SEL_COMP) { 8094 page = ST_DEV_CONFIG_PAGE; 8095 rval = st_gen_mode_sense(un, st_uscsi_cmd, page, 8096 un->un_mspl, sizeof (struct seq_mode)); 8097 if (rval == 0 && un->un_mspl->page_code == page) { 8098 un->un_comp_page = page; 8099 break; 8100 } 8101 page = ST_DEV_DATACOMP_PAGE; 8102 rval = st_gen_mode_sense(un, st_uscsi_cmd, page, 8103 un->un_mspl, sizeof (struct seq_mode)); 8104 if (rval == 0 && un->un_mspl->page_code == page) { 8105 un->un_comp_page = page; 8106 break; 8107 } 8108 un->un_dp->options &= ~ST_MODE_SEL_COMP; 8109 un->un_comp_page = 0; 8110 } else { 8111 un->un_comp_page = 0; 8112 } 8113 8114 default: /* FALLTHROUGH */ 8115 rval = st_cmd(un, SCMD_MODE_SENSE, MSIZE, SYNC_CMD); 8116 } 8117 return (rval); 8118 } 8119 8120 static int 8121 st_modeselect(struct scsi_tape *un) 8122 { 8123 int rval = 0; 8124 int ix; 8125 8126 ST_FUNC(ST_DEVINFO, st_modeselect); 8127 8128 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 8129 "st_modeselect(dev = 0x%lx): density = 0x%x\n", 8130 un->un_dev, un->un_mspl->density); 8131 8132 ASSERT(mutex_owned(ST_MUTEX)); 8133 8134 /* 8135 * The parameter list should be the same for all of the 8136 * cases that follow so set them here 8137 * 8138 * Try mode select first if if fails set fields manually 8139 */ 8140 rval = st_modesense(un); 8141 if (rval != 0) { 8142 ST_DEBUG3(ST_DEVINFO, st_label, CE_WARN, 8143 "st_modeselect: First mode sense failed\n"); 8144 un->un_mspl->bd_len = 8; 8145 un->un_mspl->high_nb = 0; 8146 un->un_mspl->mid_nb = 0; 8147 un->un_mspl->low_nb = 0; 8148 } 8149 un->un_mspl->high_bl = (uchar_t)(un->un_bsize >> 16); 8150 un->un_mspl->mid_bl = (uchar_t)(un->un_bsize >> 8); 8151 un->un_mspl->low_bl = (uchar_t)(un->un_bsize); 8152 8153 8154 /* 8155 * If configured to use a specific density code for a media type. 8156 * curdens is previously set by the minor node opened. 8157 * If the media type doesn't match the minor node we change it so it 8158 * looks like the correct one was opened. 8159 */ 8160 if (un->un_dp->options & ST_KNOWS_MEDIA) { 8161 uchar_t best; 8162 8163 for (best = 0xff, ix = 0; ix < NDENSITIES; ix++) { 8164 if (un->un_mspl->media_type == 8165 un->un_dp->mediatype[ix]) { 8166 best = ix; 8167 /* 8168 * It matches but it might not be the only one. 8169 * Use the highest matching media type but not 8170 * to exceed the density selected by the open. 8171 */ 8172 if (ix < un->un_curdens) { 8173 continue; 8174 } 8175 un->un_curdens = ix; 8176 break; 8177 } 8178 } 8179 /* If a match was found best will not be 0xff any more */ 8180 if (best < NDENSITIES) { 8181 ST_DEBUG3(ST_DEVINFO, st_label, CE_WARN, 8182 "found media 0x%X using density 0x%X\n", 8183 un->un_mspl->media_type, 8184 un->un_dp->densities[best]); 8185 un->un_mspl->density = un->un_dp->densities[best]; 8186 } else { 8187 /* Otherwise set density based on minor node opened */ 8188 un->un_mspl->density = 8189 un->un_dp->densities[un->un_curdens]; 8190 } 8191 } else { 8192 un->un_mspl->density = un->un_dp->densities[un->un_curdens]; 8193 } 8194 8195 if (un->un_dp->options & ST_NOBUF) { 8196 un->un_mspl->bufm = 0; 8197 } else { 8198 un->un_mspl->bufm = 1; 8199 } 8200 8201 rval = st_set_compression(un); 8202 8203 /* 8204 * If st_set_compression returned invalid or already it 8205 * found no need to do the mode select. 8206 * So do it here. 8207 */ 8208 if ((rval == ENOTTY) || (rval == EALREADY)) { 8209 8210 /* Zero non-writeable fields */ 8211 un->un_mspl->data_len = 0; 8212 un->un_mspl->media_type = 0; 8213 un->un_mspl->wp = 0; 8214 8215 /* need to set the density code */ 8216 rval = st_cmd(un, SCMD_MODE_SELECT, MSIZE, SYNC_CMD); 8217 if (rval != 0) { 8218 if (un->un_state >= ST_STATE_OPEN) { 8219 ST_DEBUG6(ST_DEVINFO, st_label, CE_WARN, 8220 "unable to set tape mode\n"); 8221 un->un_pos.pmode = invalid; 8222 rval = EIO; 8223 } else { 8224 rval = -1; 8225 } 8226 } 8227 } 8228 8229 /* 8230 * The spec recommends to send a mode sense after a mode select 8231 */ 8232 (void) st_modesense(un); 8233 8234 ASSERT(mutex_owned(ST_MUTEX)); 8235 8236 return (rval); 8237 } 8238 8239 /* 8240 * st_gen_mode_sense 8241 * 8242 * generic mode sense.. it allows for any page 8243 */ 8244 static int 8245 st_gen_mode_sense(struct scsi_tape *un, ubufunc_t ubf, int page, 8246 struct seq_mode *page_data, int page_size) 8247 { 8248 8249 int r; 8250 char cdb[CDB_GROUP0]; 8251 struct uscsi_cmd *com; 8252 struct scsi_arq_status status; 8253 8254 ST_FUNC(ST_DEVINFO, st_gen_mode_sense); 8255 8256 com = kmem_zalloc(sizeof (*com), KM_SLEEP); 8257 8258 bzero(cdb, CDB_GROUP0); 8259 cdb[0] = SCMD_MODE_SENSE; 8260 cdb[2] = (char)page; 8261 cdb[4] = (char)page_size; 8262 8263 com->uscsi_cdb = cdb; 8264 com->uscsi_cdblen = CDB_GROUP0; 8265 com->uscsi_bufaddr = (caddr_t)page_data; 8266 com->uscsi_buflen = page_size; 8267 com->uscsi_rqlen = sizeof (status); 8268 com->uscsi_rqbuf = (caddr_t)&status; 8269 com->uscsi_timeout = un->un_dp->non_motion_timeout; 8270 com->uscsi_flags = USCSI_DIAGNOSE | USCSI_RQENABLE | USCSI_READ; 8271 8272 r = ubf(un, com, FKIOCTL); 8273 kmem_free(com, sizeof (*com)); 8274 return (r); 8275 } 8276 8277 /* 8278 * st_gen_mode_select 8279 * 8280 * generic mode select.. it allows for any page 8281 */ 8282 static int 8283 st_gen_mode_select(struct scsi_tape *un, ubufunc_t ubf, 8284 struct seq_mode *page_data, int page_size) 8285 { 8286 8287 int r; 8288 char cdb[CDB_GROUP0]; 8289 struct uscsi_cmd *com; 8290 struct scsi_arq_status status; 8291 8292 ST_FUNC(ST_DEVINFO, st_gen_mode_select); 8293 8294 /* Zero non-writeable fields */ 8295 page_data->data_len = 0; 8296 page_data->media_type = 0; 8297 page_data->wp = 0; 8298 8299 /* 8300 * If mode select has any page data, zero the ps (Page Savable) bit. 8301 */ 8302 if (page_size > MSIZE) { 8303 page_data->ps = 0; 8304 } 8305 8306 8307 com = kmem_zalloc(sizeof (*com), KM_SLEEP); 8308 8309 /* 8310 * then, do a mode select to set what ever info 8311 */ 8312 bzero(cdb, CDB_GROUP0); 8313 cdb[0] = SCMD_MODE_SELECT; 8314 cdb[1] = 0x10; /* set PF bit for many third party drives */ 8315 cdb[4] = (char)page_size; 8316 8317 com->uscsi_cdb = cdb; 8318 com->uscsi_cdblen = CDB_GROUP0; 8319 com->uscsi_bufaddr = (caddr_t)page_data; 8320 com->uscsi_buflen = page_size; 8321 com->uscsi_rqlen = sizeof (status); 8322 com->uscsi_rqbuf = (caddr_t)&status; 8323 com->uscsi_timeout = un->un_dp->non_motion_timeout; 8324 com->uscsi_flags = USCSI_DIAGNOSE | USCSI_RQENABLE | USCSI_WRITE; 8325 8326 r = ubf(un, com, FKIOCTL); 8327 8328 kmem_free(com, sizeof (*com)); 8329 return (r); 8330 } 8331 8332 static int 8333 st_read_block_limits(struct scsi_tape *un, struct read_blklim *read_blk) 8334 { 8335 int rval; 8336 char cdb[CDB_GROUP0]; 8337 struct uscsi_cmd *com; 8338 struct scsi_arq_status status; 8339 8340 ST_FUNC(ST_DEVINFO, st_read_block_limits); 8341 8342 com = kmem_zalloc(sizeof (*com), KM_SLEEP); 8343 8344 bzero(cdb, CDB_GROUP0); 8345 cdb[0] = SCMD_READ_BLKLIM; 8346 8347 com->uscsi_cdb = cdb; 8348 com->uscsi_cdblen = CDB_GROUP0; 8349 com->uscsi_bufaddr = (caddr_t)read_blk; 8350 com->uscsi_buflen = sizeof (struct read_blklim); 8351 com->uscsi_rqlen = sizeof (status); 8352 com->uscsi_rqbuf = (caddr_t)&status; 8353 com->uscsi_timeout = un->un_dp->non_motion_timeout; 8354 com->uscsi_flags = USCSI_DIAGNOSE | USCSI_RQENABLE | USCSI_READ; 8355 8356 rval = st_uscsi_cmd(un, com, FKIOCTL); 8357 if (com->uscsi_status || com->uscsi_resid) { 8358 rval = -1; 8359 } 8360 8361 kmem_free(com, sizeof (*com)); 8362 return (rval); 8363 } 8364 8365 static int 8366 st_report_density_support(struct scsi_tape *un, uchar_t *density_data, 8367 size_t buflen) 8368 { 8369 int rval; 8370 char cdb[CDB_GROUP1]; 8371 struct uscsi_cmd *com; 8372 struct scsi_arq_status status; 8373 8374 ST_FUNC(ST_DEVINFO, st_report_density_support); 8375 8376 com = kmem_zalloc(sizeof (*com), KM_SLEEP); 8377 8378 bzero(cdb, CDB_GROUP1); 8379 cdb[0] = SCMD_REPORT_DENSITIES; 8380 cdb[7] = (buflen & 0xff00) >> 8; 8381 cdb[8] = buflen & 0xff; 8382 8383 com->uscsi_cdb = cdb; 8384 com->uscsi_cdblen = CDB_GROUP1; 8385 com->uscsi_bufaddr = (caddr_t)density_data; 8386 com->uscsi_buflen = buflen; 8387 com->uscsi_rqlen = sizeof (status); 8388 com->uscsi_rqbuf = (caddr_t)&status; 8389 com->uscsi_timeout = un->un_dp->non_motion_timeout; 8390 com->uscsi_flags = USCSI_DIAGNOSE | USCSI_RQENABLE | USCSI_READ; 8391 8392 rval = st_uscsi_cmd(un, com, FKIOCTL); 8393 if (com->uscsi_status || com->uscsi_resid) { 8394 rval = -1; 8395 } 8396 8397 kmem_free(com, sizeof (*com)); 8398 return (rval); 8399 } 8400 8401 static int 8402 st_report_supported_operation(struct scsi_tape *un, uchar_t *oper_data, 8403 uchar_t option_code, ushort_t service_action) 8404 { 8405 int rval; 8406 char cdb[CDB_GROUP5]; 8407 struct uscsi_cmd *com; 8408 struct scsi_arq_status status; 8409 uint32_t allo_length; 8410 8411 ST_FUNC(ST_DEVINFO, st_report_supported_operation); 8412 8413 allo_length = sizeof (struct one_com_des) + 8414 sizeof (struct com_timeout_des); 8415 com = kmem_zalloc(sizeof (*com), KM_SLEEP); 8416 8417 bzero(cdb, CDB_GROUP5); 8418 cdb[0] = (char)SCMD_MAINTENANCE_IN; 8419 cdb[1] = SSVC_ACTION_GET_SUPPORTED_OPERATIONS; 8420 if (service_action) { 8421 cdb[2] = (char)(ONE_COMMAND_DATA_FORMAT | 0x80); /* RCTD */ 8422 cdb[4] = (service_action & 0xff00) >> 8; 8423 cdb[5] = service_action & 0xff; 8424 } else { 8425 cdb[2] = (char)(ONE_COMMAND_NO_SERVICE_DATA_FORMAT | 8426 0x80); /* RCTD */ 8427 } 8428 cdb[3] = option_code; 8429 cdb[6] = (allo_length & 0xff000000) >> 24; 8430 cdb[7] = (allo_length & 0xff0000) >> 16; 8431 cdb[8] = (allo_length & 0xff00) >> 8; 8432 cdb[9] = allo_length & 0xff; 8433 8434 com->uscsi_cdb = cdb; 8435 com->uscsi_cdblen = CDB_GROUP5; 8436 com->uscsi_bufaddr = (caddr_t)oper_data; 8437 com->uscsi_buflen = allo_length; 8438 com->uscsi_rqlen = sizeof (status); 8439 com->uscsi_rqbuf = (caddr_t)&status; 8440 com->uscsi_timeout = un->un_dp->non_motion_timeout; 8441 com->uscsi_flags = USCSI_DIAGNOSE | USCSI_RQENABLE | USCSI_READ; 8442 8443 rval = st_uscsi_cmd(un, com, FKIOCTL); 8444 if (com->uscsi_status) { 8445 rval = -1; 8446 } 8447 8448 kmem_free(com, sizeof (*com)); 8449 return (rval); 8450 } 8451 8452 /* 8453 * Changes devices blocksize and bsize to requested blocksize nblksz. 8454 * Returns returned value from first failed call or zero on success. 8455 */ 8456 static int 8457 st_change_block_size(struct scsi_tape *un, uint32_t nblksz) 8458 { 8459 struct seq_mode *current; 8460 int rval; 8461 uint32_t oldblksz; 8462 8463 ST_FUNC(ST_DEVINFO, st_change_block_size); 8464 8465 current = kmem_zalloc(MSIZE, KM_SLEEP); 8466 8467 /* 8468 * If we haven't got the compression page yet, do that first. 8469 */ 8470 if (un->un_comp_page == (ST_DEV_DATACOMP_PAGE | ST_DEV_CONFIG_PAGE)) { 8471 (void) st_modesense(un); 8472 } 8473 8474 /* Read current settings */ 8475 rval = st_gen_mode_sense(un, st_uscsi_cmd, 0, current, MSIZE); 8476 if (rval != 0) { 8477 scsi_log(ST_DEVINFO, st_label, SCSI_DEBUG, 8478 "mode sense for change block size failed: rval = %d", rval); 8479 goto finish; 8480 } 8481 8482 /* Figure the current block size */ 8483 oldblksz = 8484 (current->high_bl << 16) | 8485 (current->mid_bl << 8) | 8486 (current->low_bl); 8487 8488 /* If current block size is the same as requested were done */ 8489 if (oldblksz == nblksz) { 8490 un->un_bsize = nblksz; 8491 rval = 0; 8492 goto finish; 8493 } 8494 8495 /* Change to requested block size */ 8496 current->high_bl = (uchar_t)(nblksz >> 16); 8497 current->mid_bl = (uchar_t)(nblksz >> 8); 8498 current->low_bl = (uchar_t)(nblksz); 8499 8500 /* Attempt to change block size */ 8501 rval = st_gen_mode_select(un, st_uscsi_cmd, current, MSIZE); 8502 if (rval != 0) { 8503 scsi_log(ST_DEVINFO, st_label, SCSI_DEBUG, 8504 "Set new block size failed: rval = %d", rval); 8505 goto finish; 8506 } 8507 8508 /* Read back and verify setting */ 8509 rval = st_modesense(un); 8510 if (rval == 0) { 8511 un->un_bsize = 8512 (un->un_mspl->high_bl << 16) | 8513 (un->un_mspl->mid_bl << 8) | 8514 (un->un_mspl->low_bl); 8515 8516 if (un->un_bsize != nblksz) { 8517 scsi_log(ST_DEVINFO, st_label, SCSI_DEBUG, 8518 "Blocksize set does not equal requested blocksize" 8519 "(read: %u requested: %u)\n", nblksz, un->un_bsize); 8520 rval = EIO; 8521 } 8522 } 8523 finish: 8524 kmem_free(current, MSIZE); 8525 return (rval); 8526 } 8527 8528 8529 static void 8530 st_init(struct scsi_tape *un) 8531 { 8532 ST_FUNC(ST_DEVINFO, st_init); 8533 8534 ASSERT(mutex_owned(ST_MUTEX)); 8535 8536 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 8537 "st_init(): dev = 0x%lx, will reset fileno, blkno, eof\n", 8538 un->un_dev); 8539 8540 un->un_pos.blkno = 0; 8541 un->un_pos.fileno = 0; 8542 un->un_lastop = ST_OP_NIL; 8543 un->un_pos.eof = ST_NO_EOF; 8544 un->un_pwr_mgmt = ST_PWR_NORMAL; 8545 if (st_error_level != SCSI_ERR_ALL) { 8546 if (DEBUGGING) { 8547 st_error_level = SCSI_ERR_ALL; 8548 } else { 8549 st_error_level = SCSI_ERR_RETRYABLE; 8550 } 8551 } 8552 } 8553 8554 8555 static void 8556 st_make_cmd(struct scsi_tape *un, struct buf *bp, int (*func)(caddr_t)) 8557 { 8558 struct scsi_pkt *pkt; 8559 struct uscsi_cmd *ucmd; 8560 recov_info *ri; 8561 int tval = 0; 8562 int64_t count; 8563 uint32_t additional = 0; 8564 uint32_t address = 0; 8565 union scsi_cdb *ucdb; 8566 int flags = 0; 8567 int cdb_len = CDB_GROUP0; /* default */ 8568 uchar_t com; 8569 char fixbit; 8570 char short_fm = 0; 8571 optype prev_op = un->un_lastop; 8572 int stat_size = 8573 (un->un_arq_enabled ? sizeof (struct scsi_arq_status) : 1); 8574 8575 ST_FUNC(ST_DEVINFO, st_make_cmd); 8576 8577 ASSERT(mutex_owned(ST_MUTEX)); 8578 8579 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 8580 "st_make_cmd(): dev = 0x%lx\n", un->un_dev); 8581 8582 8583 /* 8584 * fixbit is for setting the Fixed Mode and Suppress Incorrect 8585 * Length Indicator bits on read/write commands, for setting 8586 * the Long bit on erase commands, and for setting the Code 8587 * Field bits on space commands. 8588 */ 8589 8590 /* regular raw I/O */ 8591 if ((bp != un->un_sbufp) && (bp != un->un_recov_buf)) { 8592 pkt = scsi_init_pkt(ROUTE, NULL, bp, 8593 CDB_GROUP0, stat_size, st_recov_sz, 0, func, 8594 (caddr_t)un); 8595 if (pkt == NULL) { 8596 scsi_log(ST_DEVINFO, st_label, CE_NOTE, 8597 "Read Write scsi_init_pkt() failure\n"); 8598 goto exit; 8599 } 8600 ASSERT(pkt->pkt_resid == 0); 8601 #ifdef STDEBUG 8602 bzero(pkt->pkt_private, st_recov_sz); 8603 bzero(pkt->pkt_scbp, stat_size); 8604 #endif 8605 ri = (recov_info *)pkt->pkt_private; 8606 ri->privatelen = st_recov_sz; 8607 if (un->un_bsize == 0) { 8608 count = bp->b_bcount; 8609 fixbit = 0; 8610 } else { 8611 count = bp->b_bcount / un->un_bsize; 8612 fixbit = 1; 8613 } 8614 if (bp->b_flags & B_READ) { 8615 com = SCMD_READ; 8616 un->un_lastop = ST_OP_READ; 8617 if ((un->un_bsize == 0) && /* Not Fixed Block */ 8618 (un->un_dp->options & ST_READ_IGNORE_ILI)) { 8619 fixbit = 2; 8620 } 8621 } else { 8622 com = SCMD_WRITE; 8623 un->un_lastop = ST_OP_WRITE; 8624 } 8625 tval = un->un_dp->io_timeout; 8626 8627 /* 8628 * For really large xfers, increase timeout 8629 */ 8630 if (bp->b_bcount > (10 * ONE_MEG)) 8631 tval *= bp->b_bcount/(10 * ONE_MEG); 8632 8633 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 8634 "%s %d amt 0x%lx\n", (com == SCMD_WRITE) ? 8635 wr_str: rd_str, un->un_pos.blkno, bp->b_bcount); 8636 8637 } else if ((ucmd = BP_UCMD(bp)) != NULL) { 8638 /* 8639 * uscsi - build command, allocate scsi resources 8640 */ 8641 st_make_uscsi_cmd(un, ucmd, bp, func); 8642 goto exit; 8643 8644 } else { /* special I/O */ 8645 struct buf *allocbp = NULL; 8646 com = (uchar_t)(uintptr_t)bp->b_forw; 8647 count = bp->b_bcount; 8648 8649 switch (com) { 8650 case SCMD_READ: 8651 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 8652 "special read %"PRId64"\n", count); 8653 if (un->un_bsize == 0) { 8654 fixbit = 2; /* suppress SILI */ 8655 } else { 8656 fixbit = 1; /* Fixed Block Mode */ 8657 count /= un->un_bsize; 8658 } 8659 allocbp = bp; 8660 un->un_lastop = ST_OP_READ; 8661 tval = un->un_dp->io_timeout; 8662 break; 8663 8664 case SCMD_WRITE: 8665 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 8666 "special write %"PRId64"\n", count); 8667 if (un->un_bsize != 0) { 8668 fixbit = 1; /* Fixed Block Mode */ 8669 count /= un->un_bsize; 8670 } else { 8671 fixbit = 0; 8672 } 8673 allocbp = bp; 8674 un->un_lastop = ST_OP_WRITE; 8675 tval = un->un_dp->io_timeout; 8676 break; 8677 8678 case SCMD_WRITE_FILE_MARK: 8679 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 8680 "write %"PRId64" file marks\n", count); 8681 un->un_lastop = ST_OP_WEOF; 8682 fixbit = 0; 8683 tval = un->un_dp->io_timeout; 8684 /* 8685 * If ST_SHORT_FILEMARKS bit is ON for EXABYTE 8686 * device, set the Vendor Unique bit to 8687 * write Short File Mark. 8688 */ 8689 if ((un->un_dp->options & ST_SHORT_FILEMARKS) && 8690 ((un->un_dp->type == ST_TYPE_EXB8500) || 8691 (un->un_dp->type == ST_TYPE_EXABYTE))) { 8692 /* 8693 * Now the Vendor Unique bit 7 in Byte 5 of CDB 8694 * is set to to write Short File Mark 8695 */ 8696 short_fm = 1; 8697 } 8698 break; 8699 8700 case SCMD_REWIND: 8701 /* 8702 * In the case of rewind we're gona do the rewind with 8703 * the immediate bit set so status will be retured when 8704 * the command is accepted by the device. We clear the 8705 * B_ASYNC flag so we wait for that acceptance. 8706 */ 8707 if (bp->b_flags & B_ASYNC) { 8708 allocbp = bp; 8709 if (count) { 8710 fixbit = 1; 8711 bp->b_flags &= ~B_ASYNC; 8712 } 8713 } else { 8714 fixbit = 0; 8715 } 8716 count = 0; 8717 bp->b_bcount = 0; 8718 un->un_lastop = ST_OP_CTL; 8719 tval = un->un_dp->rewind_timeout; 8720 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 8721 "rewind\n"); 8722 break; 8723 8724 case SCMD_SPACE_G4: 8725 cdb_len = CDB_GROUP4; 8726 fixbit = SPACE_TYPE(bp->b_bcount); 8727 count = SPACE_CNT(bp->b_bcount); 8728 ST_DEBUG6(ST_DEVINFO, st_label, CE_WARN, 8729 " %s space %s %"PRId64" from file %d blk %d\n", 8730 bp->b_bcount & SP_BACKSP ? "backward" : "forward", 8731 space_strs[fixbit & 7], count, 8732 un->un_pos.fileno, un->un_pos.blkno); 8733 address = (count >> 48) & 0x1fff; 8734 additional = (count >> 16) & 0xffffffff; 8735 count &= 0xffff; 8736 count <<= 16; 8737 un->un_lastop = ST_OP_CTL; 8738 tval = un->un_dp->space_timeout; 8739 break; 8740 8741 case SCMD_SPACE: 8742 fixbit = SPACE_TYPE(bp->b_bcount); 8743 count = SPACE_CNT(bp->b_bcount); 8744 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 8745 " %s space %s %"PRId64" from file %d blk %d\n", 8746 bp->b_bcount & SP_BACKSP ? "backward" : "forward", 8747 space_strs[fixbit & 7], count, 8748 un->un_pos.fileno, un->un_pos.blkno); 8749 count &= 0xffffffff; 8750 un->un_lastop = ST_OP_CTL; 8751 tval = un->un_dp->space_timeout; 8752 break; 8753 8754 case SCMD_LOAD: 8755 ASSERT(count < 10); 8756 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 8757 "%s tape\n", load_strs[count]); 8758 fixbit = 0; 8759 8760 /* Loading or Unloading */ 8761 if (count & LD_LOAD) { 8762 tval = un->un_dp->load_timeout; 8763 } else { 8764 tval = un->un_dp->unload_timeout; 8765 } 8766 /* Is Retension requested */ 8767 if (count & LD_RETEN) { 8768 tval += un->un_dp->rewind_timeout; 8769 } 8770 un->un_lastop = ST_OP_CTL; 8771 break; 8772 8773 case SCMD_ERASE: 8774 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 8775 "erase tape\n"); 8776 ASSERT(count == 1); /* mt sets this */ 8777 if (count == 1) { 8778 /* 8779 * do long erase 8780 */ 8781 fixbit = 1; /* Long */ 8782 8783 /* Drive might not honor immidiate bit */ 8784 tval = un->un_dp->erase_timeout; 8785 } else { 8786 /* Short Erase */ 8787 tval = un->un_dp->erase_timeout; 8788 fixbit = 0; 8789 } 8790 un->un_lastop = ST_OP_CTL; 8791 count = 0; 8792 break; 8793 8794 case SCMD_MODE_SENSE: 8795 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 8796 "mode sense\n"); 8797 allocbp = bp; 8798 fixbit = 0; 8799 tval = un->un_dp->non_motion_timeout; 8800 un->un_lastop = ST_OP_CTL; 8801 break; 8802 8803 case SCMD_MODE_SELECT: 8804 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 8805 "mode select\n"); 8806 allocbp = bp; 8807 fixbit = 0; 8808 tval = un->un_dp->non_motion_timeout; 8809 un->un_lastop = ST_OP_CTL; 8810 break; 8811 8812 case SCMD_RESERVE: 8813 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 8814 "reserve\n"); 8815 fixbit = 0; 8816 tval = un->un_dp->non_motion_timeout; 8817 un->un_lastop = ST_OP_CTL; 8818 break; 8819 8820 case SCMD_RELEASE: 8821 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 8822 "release\n"); 8823 fixbit = 0; 8824 tval = un->un_dp->non_motion_timeout; 8825 un->un_lastop = ST_OP_CTL; 8826 break; 8827 8828 case SCMD_READ_BLKLIM: 8829 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 8830 "read block limits\n"); 8831 allocbp = bp; 8832 fixbit = count = 0; 8833 tval = un->un_dp->non_motion_timeout; 8834 un->un_lastop = ST_OP_CTL; 8835 break; 8836 8837 case SCMD_TEST_UNIT_READY: 8838 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 8839 "test unit ready\n"); 8840 fixbit = 0; 8841 tval = un->un_dp->non_motion_timeout; 8842 un->un_lastop = ST_OP_CTL; 8843 break; 8844 8845 case SCMD_DOORLOCK: 8846 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 8847 "prevent/allow media removal\n"); 8848 fixbit = 0; 8849 tval = un->un_dp->non_motion_timeout; 8850 un->un_lastop = ST_OP_CTL; 8851 break; 8852 8853 case SCMD_READ_POSITION: 8854 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 8855 "read position\n"); 8856 fixbit = un->un_read_pos_type; 8857 cdb_len = CDB_GROUP1; 8858 tval = un->un_dp->non_motion_timeout; 8859 allocbp = bp; 8860 un->un_lastop = ST_OP_CTL; 8861 switch (un->un_read_pos_type) { 8862 case LONG_POS: 8863 count = 0; 8864 break; 8865 case EXT_POS: 8866 count = sizeof (tape_position_ext_t); 8867 break; 8868 case SHORT_POS: 8869 count = 0; 8870 break; 8871 default: 8872 ST_DEBUG(ST_DEVINFO, st_label, CE_PANIC, 8873 "Unknown read position type 0x%x in " 8874 " st_make_cmd()\n", un->un_read_pos_type); 8875 } 8876 break; 8877 8878 default: 8879 ST_DEBUG(ST_DEVINFO, st_label, CE_PANIC, 8880 "Unhandled scsi command 0x%x in st_make_cmd()\n", 8881 com); 8882 } 8883 8884 pkt = scsi_init_pkt(ROUTE, NULL, allocbp, cdb_len, stat_size, 8885 st_recov_sz, 0, func, (caddr_t)un); 8886 if (pkt == NULL) { 8887 scsi_log(ST_DEVINFO, st_label, CE_NOTE, 8888 "generic command scsi_init_pkt() failure\n"); 8889 goto exit; 8890 } 8891 8892 ASSERT(pkt->pkt_resid == 0); 8893 #ifdef STDEBUG 8894 bzero(pkt->pkt_private, st_recov_sz); 8895 bzero(pkt->pkt_scbp, stat_size); 8896 #endif 8897 ri = (recov_info *)pkt->pkt_private; 8898 ri->privatelen = st_recov_sz; 8899 if (allocbp) { 8900 ASSERT(geterror(allocbp) == 0); 8901 } 8902 8903 } 8904 8905 ucdb = (union scsi_cdb *)pkt->pkt_cdbp; 8906 8907 (void) scsi_setup_cdb(ucdb, com, address, (uint_t)count, additional); 8908 FILL_SCSI1_LUN(un->un_sd, pkt); 8909 /* 8910 * Initialize the SILI/Fixed bits of the byte 1 of cdb. 8911 */ 8912 ucdb->t_code = fixbit; 8913 ucdb->g0_vu_1 = short_fm; 8914 pkt->pkt_flags = flags; 8915 8916 ASSERT(tval); 8917 pkt->pkt_time = tval; 8918 if (bp == un->un_recov_buf) { 8919 pkt->pkt_comp = st_recov_cb; 8920 } else { 8921 pkt->pkt_comp = st_intr; 8922 } 8923 8924 st_add_recovery_info_to_pkt(un, bp, pkt); 8925 8926 /* 8927 * If we just write data to tape and did a command that doesn't 8928 * change position, we still need to write a filemark. 8929 */ 8930 if ((prev_op == ST_OP_WRITE) || (prev_op == ST_OP_WEOF)) { 8931 recov_info *rcvi = pkt->pkt_private; 8932 cmd_attribute const *atrib; 8933 8934 if (rcvi->privatelen == sizeof (recov_info)) { 8935 atrib = rcvi->cmd_attrib; 8936 } else { 8937 atrib = st_lookup_cmd_attribute(com); 8938 } 8939 if (atrib->chg_tape_direction == DIR_NONE) { 8940 un->un_lastop = prev_op; 8941 } 8942 } 8943 8944 exit: 8945 ASSERT(mutex_owned(ST_MUTEX)); 8946 } 8947 8948 8949 /* 8950 * Build a command based on a uscsi command; 8951 */ 8952 static void 8953 st_make_uscsi_cmd(struct scsi_tape *un, struct uscsi_cmd *ucmd, 8954 struct buf *bp, int (*func)(caddr_t)) 8955 { 8956 struct scsi_pkt *pkt; 8957 recov_info *ri; 8958 caddr_t cdb; 8959 int cdblen; 8960 int stat_size = 1; 8961 int flags = 0; 8962 8963 ST_FUNC(ST_DEVINFO, st_make_uscsi_cmd); 8964 8965 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 8966 "st_make_uscsi_cmd(): dev = 0x%lx\n", un->un_dev); 8967 8968 if (ucmd->uscsi_flags & USCSI_RQENABLE) { 8969 if (un->un_arq_enabled) { 8970 if (ucmd->uscsi_rqlen > SENSE_LENGTH) { 8971 stat_size = (int)(ucmd->uscsi_rqlen) + 8972 sizeof (struct scsi_arq_status) - 8973 sizeof (struct scsi_extended_sense); 8974 flags = PKT_XARQ; 8975 } else { 8976 stat_size = sizeof (struct scsi_arq_status); 8977 } 8978 } 8979 } 8980 8981 ASSERT(mutex_owned(ST_MUTEX)); 8982 8983 cdb = ucmd->uscsi_cdb; 8984 cdblen = ucmd->uscsi_cdblen; 8985 8986 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 8987 "st_make_uscsi_cmd: buflen=%ld bcount=%ld\n", 8988 ucmd->uscsi_buflen, bp->b_bcount); 8989 pkt = scsi_init_pkt(ROUTE, NULL, 8990 (bp->b_bcount > 0) ? bp : NULL, 8991 cdblen, stat_size, st_recov_sz, flags, func, (caddr_t)un); 8992 if (pkt == NULL) { 8993 scsi_log(ST_DEVINFO, st_label, CE_NOTE, 8994 "uscsi command scsi_init_pkt() failure\n"); 8995 goto exit; 8996 } 8997 8998 ASSERT(pkt->pkt_resid == 0); 8999 #ifdef STDEBUG 9000 bzero(pkt->pkt_private, st_recov_sz); 9001 bzero(pkt->pkt_scbp, stat_size); 9002 #endif 9003 ri = (recov_info *)pkt->pkt_private; 9004 ri->privatelen = st_recov_sz; 9005 9006 bcopy(cdb, pkt->pkt_cdbp, (uint_t)cdblen); 9007 9008 #ifdef STDEBUG 9009 if ((st_debug & 0x7) >= 6) { 9010 st_clean_print(ST_DEVINFO, st_label, SCSI_DEBUG, 9011 "pkt_cdbp", (char *)cdb, cdblen); 9012 } 9013 #endif 9014 9015 if (ucmd->uscsi_flags & USCSI_SILENT) { 9016 pkt->pkt_flags |= FLAG_SILENT; 9017 } 9018 9019 pkt->pkt_time = ucmd->uscsi_timeout; 9020 if (bp == un->un_recov_buf) { 9021 pkt->pkt_comp = st_recov_cb; 9022 } else { 9023 pkt->pkt_comp = st_intr; 9024 } 9025 st_add_recovery_info_to_pkt(un, bp, pkt); 9026 exit: 9027 ASSERT(mutex_owned(ST_MUTEX)); 9028 } 9029 9030 9031 /* 9032 * restart cmd currently at the head of the runq 9033 * 9034 * If scsi_transport() succeeds or the retries 9035 * count exhausted, restore the throttle that was 9036 * zeroed out in st_handle_intr_busy(). 9037 * 9038 */ 9039 static void 9040 st_intr_restart(void *arg) 9041 { 9042 struct scsi_tape *un = arg; 9043 struct buf *bp; 9044 int queued; 9045 int status = TRAN_ACCEPT; 9046 9047 mutex_enter(ST_MUTEX); 9048 9049 ST_FUNC(ST_DEVINFO, st_intr_restart); 9050 9051 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 9052 "st_intr_restart(), un = 0x%p\n", (void *)un); 9053 9054 un->un_hib_tid = 0; 9055 9056 if (un->un_recov_buf_busy != 0) { 9057 bp = un->un_recov_buf; 9058 queued = 0; 9059 } else if (un->un_sbuf_busy != 0) { 9060 bp = un->un_sbufp; 9061 queued = 0; 9062 } else if (un->un_quef != NULL) { 9063 bp = un->un_quef; 9064 queued = 1; 9065 } else { 9066 mutex_exit(ST_MUTEX); 9067 return; 9068 } 9069 9070 /* 9071 * Here we know : 9072 * throttle = 0, via st_handle_intr_busy 9073 */ 9074 9075 if (queued) { 9076 /* 9077 * move from waitq to runq, if there is anything on the waitq 9078 */ 9079 (void) st_remove_from_queue(&un->un_quef, &un->un_quef, bp); 9080 9081 if (un->un_runqf) { 9082 /* 9083 * not good, we don't want to requeue something after 9084 * another. 9085 */ 9086 goto done_error; 9087 } else { 9088 un->un_runqf = bp; 9089 un->un_runql = bp; 9090 } 9091 } 9092 9093 ST_CDB(ST_DEVINFO, "Interrupt restart CDB", 9094 (char *)BP_PKT(bp)->pkt_cdbp); 9095 9096 ST_DO_KSTATS(bp, kstat_waitq_to_runq); 9097 9098 status = st_transport(un, BP_PKT(bp)); 9099 9100 if (status != TRAN_ACCEPT) { 9101 ST_DO_KSTATS(bp, kstat_runq_back_to_waitq); 9102 9103 if (status == TRAN_BUSY) { 9104 pkt_info *pkti = BP_PKT(bp)->pkt_private; 9105 9106 if (pkti->privatelen == sizeof (recov_info) && 9107 un->un_unit_attention_flags && 9108 bp != un->un_recov_buf) { 9109 un->un_unit_attention_flags = 0; 9110 ST_RECOV(ST_DEVINFO, st_label, CE_WARN, 9111 "Command Recovery called on busy resend\n"); 9112 if (st_command_recovery(un, BP_PKT(bp), 9113 ATTEMPT_RETRY) == JUST_RETURN) { 9114 mutex_exit(ST_MUTEX); 9115 return; 9116 } 9117 } 9118 mutex_exit(ST_MUTEX); 9119 if (st_handle_intr_busy(un, bp, 9120 ST_TRAN_BUSY_TIMEOUT) == 0) 9121 return; /* timeout is setup again */ 9122 mutex_enter(ST_MUTEX); 9123 } 9124 9125 done_error: 9126 ST_DEBUG6(ST_DEVINFO, st_label, CE_WARN, 9127 "restart transport rejected\n"); 9128 bp->b_resid = bp->b_bcount; 9129 9130 if (un->un_last_throttle) { 9131 un->un_throttle = un->un_last_throttle; 9132 } 9133 if (status != TRAN_ACCEPT) { 9134 ST_DO_ERRSTATS(un, st_transerrs); 9135 } 9136 ST_DO_KSTATS(bp, kstat_waitq_exit); 9137 ST_DEBUG6(ST_DEVINFO, st_label, CE_WARN, 9138 "busy restart aborted\n"); 9139 st_set_pe_flag(un); 9140 st_bioerror(bp, EIO); 9141 st_done_and_mutex_exit(un, bp); 9142 } else { 9143 if (un->un_last_throttle) { 9144 un->un_throttle = un->un_last_throttle; 9145 } 9146 mutex_exit(ST_MUTEX); 9147 } 9148 } 9149 9150 /* 9151 * st_check_media(): 9152 * Periodically check the media state using scsi_watch service; 9153 * this service calls back after TUR and possibly request sense 9154 * the callback handler (st_media_watch_cb()) decodes the request sense 9155 * data (if any) 9156 */ 9157 9158 static int 9159 st_check_media(dev_t dev, enum mtio_state state) 9160 { 9161 int rval = 0; 9162 enum mtio_state prev_state; 9163 opaque_t token = NULL; 9164 9165 GET_SOFT_STATE(dev); 9166 9167 ST_FUNC(ST_DEVINFO, st_check_media); 9168 9169 mutex_enter(ST_MUTEX); 9170 9171 ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG, 9172 "st_check_media:state=%x, mediastate=%x\n", 9173 state, un->un_mediastate); 9174 9175 prev_state = un->un_mediastate; 9176 9177 /* 9178 * is there anything to do? 9179 */ 9180 retry: 9181 if (state == un->un_mediastate || un->un_mediastate == MTIO_NONE) { 9182 /* 9183 * submit the request to the scsi_watch service; 9184 * scsi_media_watch_cb() does the real work 9185 */ 9186 mutex_exit(ST_MUTEX); 9187 token = scsi_watch_request_submit(ST_SCSI_DEVP, 9188 st_check_media_time, SENSE_LENGTH, 9189 st_media_watch_cb, (caddr_t)dev); 9190 if (token == NULL) { 9191 rval = EAGAIN; 9192 goto done; 9193 } 9194 mutex_enter(ST_MUTEX); 9195 9196 un->un_swr_token = token; 9197 un->un_specified_mediastate = state; 9198 9199 /* 9200 * now wait for media change 9201 * we will not be signalled unless mediastate == state but it 9202 * still better to test for this condition, since there 9203 * is a 5 sec cv_broadcast delay when 9204 * mediastate == MTIO_INSERTED 9205 */ 9206 ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG, 9207 "st_check_media:waiting for media state change\n"); 9208 while (un->un_mediastate == state) { 9209 if (cv_wait_sig(&un->un_state_cv, ST_MUTEX) == 0) { 9210 mutex_exit(ST_MUTEX); 9211 ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG, 9212 "st_check_media:waiting for media state " 9213 "was interrupted\n"); 9214 rval = EINTR; 9215 goto done; 9216 } 9217 ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG, 9218 "st_check_media:received signal, state=%x\n", 9219 un->un_mediastate); 9220 } 9221 } 9222 9223 /* 9224 * if we transitioned to MTIO_INSERTED, media has really been 9225 * inserted. If TUR fails, it is probably a exabyte slow spin up. 9226 * Reset and retry the state change. If everything is ok, replay 9227 * the open() logic. 9228 */ 9229 if ((un->un_mediastate == MTIO_INSERTED) && 9230 (un->un_state == ST_STATE_OFFLINE)) { 9231 ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG, 9232 "st_check_media: calling st_cmd to confirm inserted\n"); 9233 9234 /* 9235 * set this early so that TUR will make it through strategy 9236 * without triggering a st_tape_init(). We needed it set 9237 * before calling st_tape_init() ourselves anyway. If TUR 9238 * fails, set it back 9239 */ 9240 un->un_state = ST_STATE_INITIALIZING; 9241 9242 /* 9243 * If not reserved fail as getting reservation conflict 9244 * will make this hang forever. 9245 */ 9246 if ((un->un_rsvd_status & 9247 (ST_RESERVE | ST_APPLICATION_RESERVATIONS)) == 0) { 9248 mutex_exit(ST_MUTEX); 9249 rval = EACCES; 9250 goto done; 9251 } 9252 rval = st_cmd(un, SCMD_TEST_UNIT_READY, 0, SYNC_CMD); 9253 if (rval == EACCES) { 9254 ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG, 9255 "st_check_media: TUR got Reservation Conflict\n"); 9256 mutex_exit(ST_MUTEX); 9257 goto done; 9258 } 9259 if (rval) { 9260 ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG, 9261 "st_check_media: TUR failed, going to retry\n"); 9262 un->un_mediastate = prev_state; 9263 un->un_state = ST_STATE_OFFLINE; 9264 goto retry; 9265 } 9266 ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG, 9267 "st_check_media: media inserted\n"); 9268 9269 /* this also rewinds the tape */ 9270 rval = st_tape_init(un); 9271 if (rval != 0) { 9272 ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG, 9273 "st_check_media : OFFLINE init failure "); 9274 un->un_state = ST_STATE_OFFLINE; 9275 un->un_pos.pmode = invalid; 9276 } else { 9277 un->un_state = ST_STATE_OPEN_PENDING_IO; 9278 } 9279 } else if ((un->un_mediastate == MTIO_EJECTED) && 9280 (un->un_state != ST_STATE_OFFLINE)) { 9281 /* 9282 * supported devices must be rewound before ejection 9283 * rewind resets fileno & blkno 9284 */ 9285 un->un_laststate = un->un_state; 9286 un->un_state = ST_STATE_OFFLINE; 9287 } 9288 mutex_exit(ST_MUTEX); 9289 done: 9290 if (token) { 9291 (void) scsi_watch_request_terminate(token, 9292 SCSI_WATCH_TERMINATE_WAIT); 9293 mutex_enter(ST_MUTEX); 9294 un->un_swr_token = (opaque_t)NULL; 9295 mutex_exit(ST_MUTEX); 9296 } 9297 9298 ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG, "st_check_media: done\n"); 9299 9300 return (rval); 9301 } 9302 9303 /* 9304 * st_media_watch_cb() is called by scsi_watch_thread for 9305 * verifying the request sense data (if any) 9306 */ 9307 static int 9308 st_media_watch_cb(caddr_t arg, struct scsi_watch_result *resultp) 9309 { 9310 struct scsi_status *statusp = resultp->statusp; 9311 struct scsi_extended_sense *sensep = resultp->sensep; 9312 uchar_t actual_sense_length = resultp->actual_sense_length; 9313 struct scsi_tape *un; 9314 enum mtio_state state = MTIO_NONE; 9315 int instance; 9316 dev_t dev = (dev_t)arg; 9317 9318 instance = MTUNIT(dev); 9319 if ((un = ddi_get_soft_state(st_state, instance)) == NULL) { 9320 return (-1); 9321 } 9322 9323 mutex_enter(ST_MUTEX); 9324 ST_FUNC(ST_DEVINFO, st_media_watch_cb); 9325 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 9326 "st_media_watch_cb: status=%x, sensep=%p, len=%x\n", 9327 *((char *)statusp), (void *)sensep, 9328 actual_sense_length); 9329 9330 9331 /* 9332 * if there was a check condition then sensep points to valid 9333 * sense data 9334 * if status was not a check condition but a reservation or busy 9335 * status then the new state is MTIO_NONE 9336 */ 9337 if (sensep) { 9338 ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG, 9339 "st_media_watch_cb: KEY=%x, ASC=%x, ASCQ=%x\n", 9340 sensep->es_key, sensep->es_add_code, sensep->es_qual_code); 9341 9342 switch (un->un_dp->type) { 9343 default: 9344 ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG, 9345 "st_media_watch_cb: unknown drive type %d, " 9346 "default to ST_TYPE_HP\n", un->un_dp->type); 9347 /* FALLTHROUGH */ 9348 9349 case ST_TYPE_STC3490: /* STK 4220 1/2" cartridge */ 9350 case ST_TYPE_FUJI: /* 1/2" cartridge */ 9351 case ST_TYPE_HP: /* HP 88780 1/2" reel */ 9352 if (un->un_dp->type == ST_TYPE_FUJI) { 9353 ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, 9354 "st_media_watch_cb: ST_TYPE_FUJI\n"); 9355 } else { 9356 ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, 9357 "st_media_watch_cb: ST_TYPE_HP\n"); 9358 } 9359 switch (sensep->es_key) { 9360 case KEY_UNIT_ATTENTION: 9361 /* not ready to ready transition */ 9362 /* hp/es_qual_code == 80 on>off>on */ 9363 /* hp/es_qual_code == 0 on>off>unld>ld>on */ 9364 if (sensep->es_add_code == 0x28) { 9365 state = MTIO_INSERTED; 9366 } 9367 break; 9368 case KEY_NOT_READY: 9369 /* in process, rewinding or loading */ 9370 if ((sensep->es_add_code == 0x04) && 9371 (sensep->es_qual_code == 0x00)) { 9372 state = MTIO_EJECTED; 9373 } 9374 break; 9375 } 9376 break; 9377 9378 case ST_TYPE_EXB8500: /* Exabyte 8500 */ 9379 ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, 9380 "st_media_watch_cb: ST_TYPE_EXB8500\n"); 9381 switch (sensep->es_key) { 9382 case KEY_UNIT_ATTENTION: 9383 /* operator medium removal request */ 9384 if ((sensep->es_add_code == 0x5a) && 9385 (sensep->es_qual_code == 0x01)) { 9386 state = MTIO_EJECTED; 9387 /* not ready to ready transition */ 9388 } else if ((sensep->es_add_code == 0x28) && 9389 (sensep->es_qual_code == 0x00)) { 9390 state = MTIO_INSERTED; 9391 } 9392 break; 9393 case KEY_NOT_READY: 9394 /* medium not present */ 9395 if (sensep->es_add_code == 0x3a) { 9396 state = MTIO_EJECTED; 9397 } 9398 break; 9399 } 9400 break; 9401 case ST_TYPE_EXABYTE: /* Exabyte 8200 */ 9402 ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, 9403 "st_media_watch_cb: ST_TYPE_EXABYTE\n"); 9404 switch (sensep->es_key) { 9405 case KEY_NOT_READY: 9406 if ((sensep->es_add_code == 0x04) && 9407 (sensep->es_qual_code == 0x00)) { 9408 /* volume not mounted? */ 9409 state = MTIO_EJECTED; 9410 } else if (sensep->es_add_code == 0x3a) { 9411 state = MTIO_EJECTED; 9412 } 9413 break; 9414 case KEY_UNIT_ATTENTION: 9415 state = MTIO_EJECTED; 9416 break; 9417 } 9418 break; 9419 9420 case ST_TYPE_DLT: /* quantum DLT4xxx */ 9421 switch (sensep->es_key) { 9422 case KEY_UNIT_ATTENTION: 9423 if (sensep->es_add_code == 0x28) { 9424 state = MTIO_INSERTED; 9425 } 9426 break; 9427 case KEY_NOT_READY: 9428 if (sensep->es_add_code == 0x04) { 9429 /* in transition but could be either */ 9430 state = un->un_specified_mediastate; 9431 } else if ((sensep->es_add_code == 0x3a) && 9432 (sensep->es_qual_code == 0x00)) { 9433 state = MTIO_EJECTED; 9434 } 9435 break; 9436 } 9437 break; 9438 } 9439 } else if (*((char *)statusp) == STATUS_GOOD) { 9440 state = MTIO_INSERTED; 9441 } 9442 9443 ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, 9444 "st_media_watch_cb:state=%x, specified=%x\n", 9445 state, un->un_specified_mediastate); 9446 9447 /* 9448 * now signal the waiting thread if this is *not* the specified state; 9449 * delay the signal if the state is MTIO_INSERTED 9450 * to allow the target to recover 9451 */ 9452 if (state != un->un_specified_mediastate) { 9453 un->un_mediastate = state; 9454 if (state == MTIO_INSERTED) { 9455 /* 9456 * delay the signal to give the drive a chance 9457 * to do what it apparently needs to do 9458 */ 9459 ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, 9460 "st_media_watch_cb:delayed cv_broadcast\n"); 9461 un->un_delay_tid = timeout(st_delayed_cv_broadcast, 9462 un, drv_usectohz((clock_t)MEDIA_ACCESS_DELAY)); 9463 } else { 9464 ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, 9465 "st_media_watch_cb:immediate cv_broadcast\n"); 9466 cv_broadcast(&un->un_state_cv); 9467 } 9468 } 9469 mutex_exit(ST_MUTEX); 9470 return (0); 9471 } 9472 9473 /* 9474 * delayed cv_broadcast to allow for target to recover 9475 * from media insertion 9476 */ 9477 static void 9478 st_delayed_cv_broadcast(void *arg) 9479 { 9480 struct scsi_tape *un = arg; 9481 9482 ST_FUNC(ST_DEVINFO, st_delayed_cv_broadcast); 9483 9484 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 9485 "st_delayed_cv_broadcast:delayed cv_broadcast\n"); 9486 9487 mutex_enter(ST_MUTEX); 9488 cv_broadcast(&un->un_state_cv); 9489 mutex_exit(ST_MUTEX); 9490 } 9491 9492 /* 9493 * restart cmd currently at the start of the waitq 9494 */ 9495 static void 9496 st_start_restart(void *arg) 9497 { 9498 struct scsi_tape *un = arg; 9499 9500 ST_FUNC(ST_DEVINFO, st_start_restart); 9501 9502 ASSERT(un != NULL); 9503 9504 mutex_enter(ST_MUTEX); 9505 9506 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, "st_tran_restart()\n"); 9507 9508 st_start(un); 9509 9510 mutex_exit(ST_MUTEX); 9511 } 9512 9513 9514 /* 9515 * Command completion processing 9516 * 9517 */ 9518 static void 9519 st_intr(struct scsi_pkt *pkt) 9520 { 9521 recov_info *rcv = pkt->pkt_private; 9522 struct buf *bp = rcv->cmd_bp; 9523 struct scsi_tape *un; 9524 errstate action = COMMAND_DONE; 9525 clock_t timout; 9526 int status; 9527 9528 un = ddi_get_soft_state(st_state, MTUNIT(bp->b_edev)); 9529 9530 ST_FUNC(ST_DEVINFO, st_intr); 9531 9532 ASSERT(un != NULL); 9533 9534 mutex_enter(ST_MUTEX); 9535 9536 ASSERT(bp != un->un_recov_buf); 9537 9538 un->un_rqs_state &= ~(ST_RQS_ERROR); 9539 9540 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, "st_intr()\n"); 9541 9542 if (pkt->pkt_reason != CMD_CMPLT) { 9543 ST_DEBUG(ST_DEVINFO, st_label, CE_WARN, 9544 "Unhappy packet status reason = %s statistics = 0x%x\n", 9545 scsi_rname(pkt->pkt_reason), pkt->pkt_statistics); 9546 9547 /* If device has gone away not much else to do */ 9548 if (pkt->pkt_reason == CMD_DEV_GONE) { 9549 action = COMMAND_DONE_ERROR; 9550 } else if ((pkt == un->un_rqs) || 9551 (un->un_state == ST_STATE_SENSING)) { 9552 ASSERT(pkt == un->un_rqs); 9553 ASSERT(un->un_state == ST_STATE_SENSING); 9554 un->un_state = un->un_laststate; 9555 rcv->cmd_bp = un->un_rqs_bp; 9556 ST_DO_ERRSTATS(un, st_transerrs); 9557 action = COMMAND_DONE_ERROR; 9558 } else { 9559 action = st_handle_incomplete(un, bp); 9560 } 9561 /* 9562 * At this point we know that the command was successfully 9563 * completed. Now what? 9564 */ 9565 } else if ((pkt == un->un_rqs) || (un->un_state == ST_STATE_SENSING)) { 9566 /* 9567 * okay. We were running a REQUEST SENSE. Find 9568 * out what to do next. 9569 */ 9570 ASSERT(pkt == un->un_rqs); 9571 ASSERT(un->un_state == ST_STATE_SENSING); 9572 scsi_sync_pkt(pkt); 9573 action = st_handle_sense(un, bp, &un->un_pos); 9574 /* 9575 * Make rqs isn't going to be retied. 9576 */ 9577 if (action != QUE_BUSY_COMMAND && action != QUE_COMMAND) { 9578 /* 9579 * set pkt back to original packet in case we will have 9580 * to requeue it 9581 */ 9582 pkt = BP_PKT(bp); 9583 rcv->cmd_bp = un->un_rqs_bp; 9584 /* 9585 * some actions are based on un_state, hence 9586 * restore the state st was in before ST_STATE_SENSING. 9587 */ 9588 un->un_state = un->un_laststate; 9589 } 9590 9591 } else if (un->un_arq_enabled && (pkt->pkt_state & STATE_ARQ_DONE)) { 9592 /* 9593 * the transport layer successfully completed an autorqsense 9594 */ 9595 action = st_handle_autosense(un, bp, &un->un_pos); 9596 9597 } else if ((SCBP(pkt)->sts_busy) || 9598 (SCBP(pkt)->sts_chk) || 9599 (SCBP(pkt)->sts_vu7)) { 9600 /* 9601 * Okay, we weren't running a REQUEST SENSE. Call a routine 9602 * to see if the status bits we're okay. If a request sense 9603 * is to be run, that will happen. 9604 */ 9605 action = st_check_error(un, pkt); 9606 } 9607 9608 if (un->un_pwr_mgmt == ST_PWR_SUSPENDED) { 9609 switch (action) { 9610 case QUE_COMMAND: 9611 /* 9612 * return cmd to head to the queue 9613 * since we are suspending so that 9614 * it gets restarted during resume 9615 */ 9616 st_add_to_queue(&un->un_runqf, &un->un_runql, 9617 un->un_runqf, bp); 9618 9619 action = JUST_RETURN; 9620 break; 9621 9622 case QUE_SENSE: 9623 action = COMMAND_DONE_ERROR; 9624 break; 9625 9626 default: 9627 break; 9628 } 9629 } 9630 9631 /* 9632 * check for undetected path failover. 9633 */ 9634 if ((un->un_multipath) && 9635 (un->un_last_path_instance != pkt->pkt_path_instance)) { 9636 if (un->un_state > ST_STATE_OPENING) { 9637 ST_RECOV(ST_DEVINFO, st_label, CE_NOTE, 9638 "Failover detected, action is %s\n", 9639 errstatenames[action]); 9640 if (action == COMMAND_DONE) { 9641 action = PATH_FAILED; 9642 } 9643 } 9644 un->un_last_path_instance = pkt->pkt_path_instance; 9645 } 9646 9647 /* 9648 * Restore old state if we were sensing. 9649 */ 9650 if (un->un_state == ST_STATE_SENSING && action != QUE_SENSE) { 9651 un->un_state = un->un_laststate; 9652 } 9653 9654 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 9655 "st_intr: pkt=%p, bp=%p, action=%s, status=%x\n", 9656 (void *)pkt, (void *)bp, errstatenames[action], SCBP_C(pkt)); 9657 9658 again: 9659 switch (action) { 9660 case COMMAND_DONE_EACCES: 9661 /* this is to report a reservation conflict */ 9662 st_bioerror(bp, EACCES); 9663 ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG, 9664 "Reservation Conflict \n"); 9665 un->un_pos.pmode = invalid; 9666 9667 /*FALLTHROUGH*/ 9668 case COMMAND_DONE_ERROR: 9669 if (un->un_pos.eof < ST_EOT_PENDING && 9670 un->un_state >= ST_STATE_OPEN) { 9671 /* 9672 * all errors set state of the tape to 'unknown' 9673 * unless we're at EOT or are doing append testing. 9674 * If sense key was illegal request, preserve state. 9675 */ 9676 if (un->un_status != KEY_ILLEGAL_REQUEST) { 9677 un->un_pos.pmode = invalid; 9678 } 9679 } 9680 9681 un->un_err_resid = bp->b_resid = bp->b_bcount; 9682 /* 9683 * since we have an error (COMMAND_DONE_ERROR), we want to 9684 * make sure an error ocurrs, so make sure at least EIO is 9685 * returned 9686 */ 9687 if (geterror(bp) == 0) 9688 st_bioerror(bp, EIO); 9689 9690 st_set_pe_flag(un); 9691 if (!(un->un_rqs_state & ST_RQS_ERROR) && 9692 (un->un_errno == EIO)) { 9693 un->un_rqs_state &= ~(ST_RQS_VALID); 9694 } 9695 break; 9696 9697 case COMMAND_DONE_ERROR_RECOVERED: 9698 un->un_err_resid = bp->b_resid = bp->b_bcount; 9699 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 9700 "st_intr(): COMMAND_DONE_ERROR_RECOVERED"); 9701 if (geterror(bp) == 0) { 9702 st_bioerror(bp, EIO); 9703 } 9704 st_set_pe_flag(un); 9705 if (!(un->un_rqs_state & ST_RQS_ERROR) && 9706 (un->un_errno == EIO)) { 9707 un->un_rqs_state &= ~(ST_RQS_VALID); 9708 } 9709 /*FALLTHROUGH*/ 9710 case COMMAND_DONE: 9711 st_set_state(un, bp); 9712 break; 9713 9714 case QUE_SENSE: 9715 if ((un->un_ncmds > 1) && !un->un_flush_on_errors) 9716 goto sense_error; 9717 9718 if (un->un_state != ST_STATE_SENSING) { 9719 un->un_laststate = un->un_state; 9720 un->un_state = ST_STATE_SENSING; 9721 } 9722 9723 /* 9724 * zero the sense data. 9725 */ 9726 bzero(un->un_rqs->pkt_scbp, SENSE_LENGTH); 9727 9728 /* 9729 * If this is not a retry on QUE_SENSE point to the original 9730 * bp of the command that got us here. 9731 */ 9732 if (pkt != un->un_rqs) { 9733 ((recov_info *)un->un_rqs->pkt_private)->cmd_bp = bp; 9734 } 9735 9736 if (un->un_throttle) { 9737 un->un_last_throttle = un->un_throttle; 9738 un->un_throttle = 0; 9739 } 9740 9741 ST_CDB(ST_DEVINFO, "Queue sense CDB", 9742 (char *)BP_PKT(bp)->pkt_cdbp); 9743 9744 /* 9745 * never retry this, some other command will have nuked the 9746 * sense, anyway 9747 */ 9748 status = st_transport(un, un->un_rqs); 9749 9750 if (un->un_last_throttle) { 9751 un->un_throttle = un->un_last_throttle; 9752 } 9753 9754 if (status == TRAN_ACCEPT) { 9755 mutex_exit(ST_MUTEX); 9756 return; 9757 } 9758 if (status != TRAN_BUSY) 9759 ST_DO_ERRSTATS(un, st_transerrs); 9760 sense_error: 9761 un->un_pos.pmode = invalid; 9762 st_bioerror(bp, EIO); 9763 st_set_pe_flag(un); 9764 break; 9765 9766 case QUE_BUSY_COMMAND: 9767 /* longish timeout */ 9768 timout = ST_STATUS_BUSY_TIMEOUT; 9769 goto que_it_up; 9770 9771 case QUE_COMMAND: 9772 /* short timeout */ 9773 timout = ST_TRAN_BUSY_TIMEOUT; 9774 que_it_up: 9775 /* 9776 * let st_handle_intr_busy put this bp back on waitq and make 9777 * checks to see if it is ok to requeue the command. 9778 */ 9779 ST_DO_KSTATS(bp, kstat_runq_back_to_waitq); 9780 9781 /* 9782 * Save the throttle before setting up the timeout 9783 */ 9784 if (un->un_throttle) { 9785 un->un_last_throttle = un->un_throttle; 9786 } 9787 mutex_exit(ST_MUTEX); 9788 if (st_handle_intr_busy(un, bp, timout) == 0) 9789 return; /* timeout is setup again */ 9790 9791 mutex_enter(ST_MUTEX); 9792 un->un_pos.pmode = invalid; 9793 un->un_err_resid = bp->b_resid = bp->b_bcount; 9794 st_bioerror(bp, EIO); 9795 st_set_pe_flag(un); 9796 break; 9797 9798 case QUE_LAST_COMMAND: 9799 9800 if ((un->un_ncmds > 1) && !un->un_flush_on_errors) { 9801 scsi_log(ST_DEVINFO, st_label, CE_CONT, 9802 "un_ncmds: %d can't retry cmd \n", un->un_ncmds); 9803 goto last_command_error; 9804 } 9805 mutex_exit(ST_MUTEX); 9806 if (st_handle_intr_retry_lcmd(un, bp) == 0) 9807 return; 9808 mutex_enter(ST_MUTEX); 9809 last_command_error: 9810 un->un_err_resid = bp->b_resid = bp->b_bcount; 9811 un->un_pos.pmode = invalid; 9812 st_bioerror(bp, EIO); 9813 st_set_pe_flag(un); 9814 break; 9815 9816 case COMMAND_TIMEOUT: 9817 case DEVICE_RESET: 9818 case DEVICE_TAMPER: 9819 case ATTEMPT_RETRY: 9820 case PATH_FAILED: 9821 ST_RECOV(ST_DEVINFO, st_label, CE_WARN, 9822 "Command Recovery called on %s status\n", 9823 errstatenames[action]); 9824 action = st_command_recovery(un, pkt, action); 9825 goto again; 9826 9827 default: 9828 ASSERT(0); 9829 /* FALLTHRU */ 9830 case JUST_RETURN: 9831 ST_DO_KSTATS(bp, kstat_runq_back_to_waitq); 9832 mutex_exit(ST_MUTEX); 9833 return; 9834 } 9835 9836 ST_DO_KSTATS(bp, kstat_runq_exit); 9837 st_done_and_mutex_exit(un, bp); 9838 } 9839 9840 static errstate 9841 st_handle_incomplete(struct scsi_tape *un, struct buf *bp) 9842 { 9843 static char *fail = "SCSI transport failed: reason '%s': %s\n"; 9844 recov_info *rinfo; 9845 errstate rval = COMMAND_DONE_ERROR; 9846 struct scsi_pkt *pkt = (un->un_state == ST_STATE_SENSING) ? 9847 un->un_rqs : BP_PKT(bp); 9848 int result; 9849 9850 ST_FUNC(ST_DEVINFO, st_handle_incomplete); 9851 9852 rinfo = (recov_info *)pkt->pkt_private; 9853 9854 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 9855 "st_handle_incomplete(): dev = 0x%lx\n", un->un_dev); 9856 9857 ASSERT(mutex_owned(ST_MUTEX)); 9858 9859 switch (pkt->pkt_reason) { 9860 case CMD_INCOMPLETE: /* tran stopped with not normal state */ 9861 /* 9862 * this occurs when accessing a powered down drive, no 9863 * need to complain; just fail the open 9864 */ 9865 ST_CDB(ST_DEVINFO, "Incomplete CDB", (char *)pkt->pkt_cdbp); 9866 9867 /* 9868 * if we have commands outstanding in HBA, and a command 9869 * comes back incomplete, we're hosed, so reset target 9870 * If we have the bus, but cmd_incomplete, we probably just 9871 * have a failed selection, so don't reset the target, just 9872 * requeue the command and try again 9873 */ 9874 if ((un->un_ncmds > 1) || (pkt->pkt_state != STATE_GOT_BUS)) { 9875 goto reset_target; 9876 } 9877 9878 /* 9879 * Retry selection a couple more times if we're 9880 * open. If opening, we only try just once to 9881 * reduce probe time for nonexistant devices. 9882 */ 9883 if ((un->un_laststate > ST_STATE_OPENING) && 9884 (rinfo->pkt_retry_cnt < st_selection_retry_count)) { 9885 /* XXX check retriable? */ 9886 rval = QUE_COMMAND; 9887 } 9888 ST_DO_ERRSTATS(un, st_transerrs); 9889 break; 9890 9891 case CMD_ABORTED: 9892 /* 9893 * most likely this is caused by flush-on-error support. If 9894 * it was not there, the we're in trouble. 9895 */ 9896 if (!un->un_flush_on_errors) { 9897 un->un_status = SUN_KEY_FATAL; 9898 goto reset_target; 9899 } 9900 9901 st_set_pe_errno(un); 9902 bioerror(bp, un->un_errno); 9903 if (un->un_errno) 9904 return (COMMAND_DONE_ERROR); 9905 else 9906 return (COMMAND_DONE); 9907 9908 case CMD_TIMEOUT: /* Command timed out */ 9909 un->un_status = SUN_KEY_TIMEOUT; 9910 return (COMMAND_TIMEOUT); 9911 9912 case CMD_TRAN_ERR: 9913 case CMD_RESET: 9914 if (pkt->pkt_statistics & (STAT_BUS_RESET | STAT_DEV_RESET)) { 9915 if ((un->un_rsvd_status & 9916 (ST_RESERVE | ST_APPLICATION_RESERVATIONS)) == 9917 ST_RESERVE) { 9918 un->un_rsvd_status |= ST_LOST_RESERVE; 9919 ST_DEBUG3(ST_DEVINFO, st_label, CE_WARN, 9920 "Lost Reservation\n"); 9921 } 9922 rval = DEVICE_RESET; 9923 return (rval); 9924 } 9925 if (pkt->pkt_statistics & (STAT_ABORTED | STAT_TERMINATED)) { 9926 rval = DEVICE_RESET; 9927 return (rval); 9928 } 9929 /*FALLTHROUGH*/ 9930 default: 9931 scsi_log(ST_DEVINFO, st_label, CE_WARN, 9932 "Unhandled packet status reason = %s statistics = 0x%x\n", 9933 scsi_rname(pkt->pkt_reason), pkt->pkt_statistics); 9934 reset_target: 9935 9936 ST_DEBUG6(ST_DEVINFO, st_label, CE_WARN, 9937 "transport completed with %s\n", 9938 scsi_rname(pkt->pkt_reason)); 9939 ST_DO_ERRSTATS(un, st_transerrs); 9940 if ((pkt->pkt_state & STATE_GOT_TARGET) && 9941 ((pkt->pkt_statistics & (STAT_BUS_RESET | STAT_DEV_RESET | 9942 STAT_ABORTED)) == 0)) { 9943 9944 /* 9945 * If we haven't reserved the drive don't reset it. 9946 */ 9947 if ((un->un_rsvd_status & 9948 (ST_RESERVE | ST_APPLICATION_RESERVATIONS)) == 0) { 9949 return (rval); 9950 } 9951 9952 /* 9953 * if we aren't lost yet we will be soon. 9954 */ 9955 un->un_pos.pmode = invalid; 9956 9957 result = st_reset(un, RESET_LUN); 9958 9959 if ((result == 0) && (un->un_state >= ST_STATE_OPEN)) { 9960 /* no hope left to recover */ 9961 scsi_log(ST_DEVINFO, st_label, CE_WARN, 9962 "recovery by resets failed\n"); 9963 return (rval); 9964 } 9965 } 9966 } 9967 9968 9969 if (rinfo->pkt_retry_cnt++ < st_retry_count) { 9970 if (un->un_pwr_mgmt == ST_PWR_SUSPENDED) { 9971 rval = QUE_COMMAND; 9972 } else if (bp == un->un_sbufp) { 9973 if (rinfo->privatelen == sizeof (recov_info)) { 9974 if (rinfo->cmd_attrib->retriable) { 9975 /* 9976 * These commands can be rerun 9977 * with impunity 9978 */ 9979 rval = QUE_COMMAND; 9980 } 9981 } else { 9982 cmd_attribute const *attrib; 9983 attrib = 9984 st_lookup_cmd_attribute(pkt->pkt_cdbp[0]); 9985 if (attrib->retriable) { 9986 rval = QUE_COMMAND; 9987 } 9988 } 9989 } 9990 } else { 9991 rval = COMMAND_DONE_ERROR; 9992 } 9993 9994 if (un->un_state >= ST_STATE_OPEN) { 9995 scsi_log(ST_DEVINFO, st_label, CE_WARN, 9996 fail, scsi_rname(pkt->pkt_reason), 9997 (rval == COMMAND_DONE_ERROR)? 9998 "giving up" : "retrying command"); 9999 } 10000 return (rval); 10001 } 10002 10003 /* 10004 * if the device is busy, then put this bp back on the waitq, on the 10005 * interrupt thread, where we want the head of the queue and not the 10006 * end 10007 * 10008 * The callers of this routine should take measures to save the 10009 * un_throttle in un_last_throttle which will be restored in 10010 * st_intr_restart(). The only exception should be st_intr_restart() 10011 * calling this routine for which the saving is already done. 10012 */ 10013 static int 10014 st_handle_intr_busy(struct scsi_tape *un, struct buf *bp, 10015 clock_t timeout_interval) 10016 { 10017 10018 int queued; 10019 int rval = 0; 10020 pkt_info *pktinfo = BP_PKT(bp)->pkt_private; 10021 10022 mutex_enter(ST_MUTEX); 10023 10024 ST_FUNC(ST_DEVINFO, st_handle_intr_busy); 10025 10026 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 10027 "st_handle_intr_busy(), un = 0x%p\n", (void *)un); 10028 10029 if ((bp != un->un_sbufp) && (bp != un->un_recov_buf)) { 10030 queued = 1; 10031 } else { 10032 queued = 0; 10033 } 10034 10035 /* 10036 * Check to see if we hit the retry timeout. We check to make sure 10037 * this is the first one on the runq and make sure we have not 10038 * queued up any more, so this one has to be the last on the list 10039 * also. If it is not, we have to fail. If it is not the first, but 10040 * is the last we are in trouble anyway, as we are in the interrupt 10041 * context here. 10042 */ 10043 if ((pktinfo->str_retry_cnt++ > st_retry_count) || 10044 ((un->un_runqf != bp) && (un->un_runql != bp) && (queued))) { 10045 rval = -1; 10046 goto exit; 10047 } 10048 10049 /* put the bp back on the waitq */ 10050 if (queued) { 10051 (void) st_remove_from_queue(&un->un_runqf, &un->un_runql, bp); 10052 st_add_to_queue(&un->un_quef, &un->un_quel, un->un_quef, bp); 10053 } 10054 10055 /* 10056 * We don't want any other commands being started in the mean time. 10057 * If start had just released mutex after putting something on the 10058 * runq, we won't even get here. 10059 */ 10060 un->un_throttle = 0; 10061 10062 /* 10063 * send a marker pkt, if appropriate 10064 */ 10065 st_hba_unflush(un); 10066 10067 /* 10068 * all queues are aligned, we are just waiting to 10069 * transport 10070 */ 10071 un->un_hib_tid = timeout(st_intr_restart, un, timeout_interval); 10072 10073 exit: 10074 mutex_exit(ST_MUTEX); 10075 return (rval); 10076 } 10077 10078 /* 10079 * To get one error entry from error stack 10080 */ 10081 static int 10082 st_get_error_entry(struct scsi_tape *un, intptr_t arg, int flag) 10083 { 10084 #ifdef _MULTI_DATAMODEL 10085 /* 10086 * For use when a 32 bit app makes a call into a 10087 * 64 bit ioctl 10088 */ 10089 struct mterror_entry32 err_entry32; 10090 #endif /* _MULTI_DATAMODEL */ 10091 10092 int rval = 0; 10093 struct mterror_entry err_entry; 10094 struct mterror_entry_stack *err_link_entry_p; 10095 size_t arq_status_len_in, arq_status_len_kr; 10096 10097 ST_FUNC(ST_DEVINFO, st_get_error_entry); 10098 10099 ASSERT(mutex_owned(ST_MUTEX)); 10100 10101 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 10102 "st_get_error_entry()\n"); 10103 10104 /* 10105 * if error record stack empty, return ENXIO 10106 */ 10107 if (un->un_error_entry_stk == NULL) { 10108 ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, 10109 "st_get_error_entry: Error Entry Stack Empty!\n"); 10110 rval = ENXIO; 10111 goto ret; 10112 } 10113 10114 /* 10115 * get the top entry from stack 10116 */ 10117 err_link_entry_p = un->un_error_entry_stk; 10118 arq_status_len_kr = 10119 err_link_entry_p->mtees_entry.mtee_arq_status_len; 10120 10121 #ifdef _MULTI_DATAMODEL 10122 switch (ddi_model_convert_from(flag & FMODELS)) { 10123 case DDI_MODEL_ILP32: 10124 if (ddi_copyin((void *)arg, &err_entry32, 10125 MTERROR_ENTRY_SIZE_32, flag)) { 10126 rval = EFAULT; 10127 goto ret; 10128 } 10129 10130 arq_status_len_in = 10131 (size_t)err_entry32.mtee_arq_status_len; 10132 10133 err_entry32.mtee_cdb_len = 10134 (size32_t)err_link_entry_p->mtees_entry.mtee_cdb_len; 10135 10136 if (arq_status_len_in > arq_status_len_kr) 10137 err_entry32.mtee_arq_status_len = 10138 (size32_t)arq_status_len_kr; 10139 10140 if (ddi_copyout( 10141 err_link_entry_p->mtees_entry.mtee_cdb_buf, 10142 (void *)(uintptr_t)err_entry32.mtee_cdb_buf, 10143 err_entry32.mtee_cdb_len, flag)) { 10144 ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, 10145 "st_get_error_entry: Copy cdb buffer error!"); 10146 rval = EFAULT; 10147 } 10148 10149 if (ddi_copyout( 10150 err_link_entry_p->mtees_entry.mtee_arq_status, 10151 (void *)(uintptr_t)err_entry32.mtee_arq_status, 10152 err_entry32.mtee_arq_status_len, flag)) { 10153 ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, 10154 "st_get_error_entry: copy arq status error!"); 10155 rval = EFAULT; 10156 } 10157 10158 if (ddi_copyout(&err_entry32, (void *)arg, 10159 MTERROR_ENTRY_SIZE_32, flag)) { 10160 ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, 10161 "st_get_error_entry: copy arq status out error!"); 10162 rval = EFAULT; 10163 } 10164 break; 10165 10166 case DDI_MODEL_NONE: 10167 if (ddi_copyin((void *)arg, &err_entry, 10168 MTERROR_ENTRY_SIZE_64, flag)) { 10169 rval = EFAULT; 10170 goto ret; 10171 } 10172 arq_status_len_in = err_entry.mtee_arq_status_len; 10173 10174 err_entry.mtee_cdb_len = 10175 err_link_entry_p->mtees_entry.mtee_cdb_len; 10176 10177 if (arq_status_len_in > arq_status_len_kr) 10178 err_entry.mtee_arq_status_len = 10179 arq_status_len_kr; 10180 10181 if (ddi_copyout( 10182 err_link_entry_p->mtees_entry.mtee_cdb_buf, 10183 err_entry.mtee_cdb_buf, 10184 err_entry.mtee_cdb_len, flag)) { 10185 ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, 10186 "st_get_error_entry: Copy cdb buffer error!"); 10187 rval = EFAULT; 10188 } 10189 10190 if (ddi_copyout( 10191 err_link_entry_p->mtees_entry.mtee_arq_status, 10192 err_entry.mtee_arq_status, 10193 err_entry.mtee_arq_status_len, flag)) { 10194 ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, 10195 "st_get_error_entry: copy arq status error!"); 10196 rval = EFAULT; 10197 } 10198 10199 if (ddi_copyout(&err_entry, (void *)arg, 10200 MTERROR_ENTRY_SIZE_64, flag)) { 10201 ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, 10202 "st_get_error_entry: copy arq status out error!"); 10203 rval = EFAULT; 10204 } 10205 break; 10206 } 10207 #else /* _MULTI_DATAMODEL */ 10208 if (ddi_copyin((void *)arg, &err_entry, 10209 MTERROR_ENTRY_SIZE_64, flag)) { 10210 rval = EFAULT; 10211 goto ret; 10212 } 10213 arq_status_len_in = err_entry.mtee_arq_status_len; 10214 10215 err_entry.mtee_cdb_len = 10216 err_link_entry_p->mtees_entry.mtee_cdb_len; 10217 10218 if (arq_status_len_in > arq_status_len_kr) 10219 err_entry.mtee_arq_status_len = 10220 arq_status_len_kr; 10221 10222 if (ddi_copyout( 10223 err_link_entry_p->mtees_entry.mtee_cdb_buf, 10224 err_entry.mtee_cdb_buf, 10225 err_entry.mtee_cdb_len, flag)) { 10226 ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, 10227 "st_get_error_entry: Copy cdb buffer error!"); 10228 rval = EFAULT; 10229 } 10230 10231 if (ddi_copyout( 10232 err_link_entry_p->mtees_entry.mtee_arq_status, 10233 err_entry.mtee_arq_status, 10234 err_entry.mtee_arq_status_len, flag)) { 10235 ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, 10236 "st_get_error_entry: copy arq status buffer error!"); 10237 rval = EFAULT; 10238 } 10239 10240 if (ddi_copyout(&err_entry, (void *)arg, 10241 MTERROR_ENTRY_SIZE_64, flag)) { 10242 ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, 10243 "st_get_error_entry: copy arq status out error!"); 10244 rval = EFAULT; 10245 } 10246 #endif /* _MULTI_DATAMODEL */ 10247 10248 /* 10249 * update stack 10250 */ 10251 un->un_error_entry_stk = err_link_entry_p->mtees_nextp; 10252 10253 kmem_free(err_link_entry_p->mtees_entry.mtee_cdb_buf, 10254 err_link_entry_p->mtees_entry.mtee_cdb_len); 10255 err_link_entry_p->mtees_entry.mtee_cdb_buf = NULL; 10256 10257 kmem_free(err_link_entry_p->mtees_entry.mtee_arq_status, 10258 SECMDS_STATUS_SIZE); 10259 err_link_entry_p->mtees_entry.mtee_arq_status = NULL; 10260 10261 kmem_free(err_link_entry_p, MTERROR_LINK_ENTRY_SIZE); 10262 err_link_entry_p = NULL; 10263 ret: 10264 return (rval); 10265 } 10266 10267 /* 10268 * MTIOCGETERROR ioctl needs to retrieve the current sense data along with 10269 * the scsi CDB command which causes the error and generates sense data and 10270 * the scsi status. 10271 * 10272 * error-record stack 10273 * 10274 * 10275 * TOP BOTTOM 10276 * ------------------------------------------ 10277 * | 0 | 1 | 2 | ... | n | 10278 * ------------------------------------------ 10279 * ^ 10280 * | 10281 * pointer to error entry 10282 * 10283 * when st driver generates one sense data record, it creates a error-entry 10284 * and pushes it onto the stack. 10285 * 10286 */ 10287 10288 static void 10289 st_update_error_stack(struct scsi_tape *un, 10290 struct scsi_pkt *pkt, 10291 struct scsi_arq_status *cmd) 10292 { 10293 struct mterror_entry_stack *err_entry_tmp; 10294 uchar_t *cdbp = (uchar_t *)pkt->pkt_cdbp; 10295 size_t cdblen = scsi_cdb_size[CDB_GROUPID(cdbp[0])]; 10296 10297 ST_FUNC(ST_DEVINFO, st_update_error_stack); 10298 10299 ASSERT(mutex_owned(ST_MUTEX)); 10300 10301 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 10302 "st_update_error_stack()\n"); 10303 10304 ASSERT(cmd); 10305 ASSERT(cdbp); 10306 if (cdblen == 0) { 10307 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 10308 "st_update_error_stack: CDB length error!\n"); 10309 return; 10310 } 10311 10312 err_entry_tmp = kmem_alloc(MTERROR_LINK_ENTRY_SIZE, KM_SLEEP); 10313 ASSERT(err_entry_tmp != NULL); 10314 10315 err_entry_tmp->mtees_entry.mtee_cdb_buf = 10316 kmem_alloc(cdblen, KM_SLEEP); 10317 ASSERT(err_entry_tmp->mtees_entry.mtee_cdb_buf != NULL); 10318 10319 err_entry_tmp->mtees_entry.mtee_arq_status = 10320 kmem_alloc(SECMDS_STATUS_SIZE, KM_SLEEP); 10321 ASSERT(err_entry_tmp->mtees_entry.mtee_arq_status != NULL); 10322 10323 /* 10324 * copy cdb command & length to current error entry 10325 */ 10326 err_entry_tmp->mtees_entry.mtee_cdb_len = cdblen; 10327 bcopy(cdbp, err_entry_tmp->mtees_entry.mtee_cdb_buf, cdblen); 10328 10329 /* 10330 * copy scsi status length to current error entry 10331 */ 10332 err_entry_tmp->mtees_entry.mtee_arq_status_len = 10333 SECMDS_STATUS_SIZE; 10334 10335 /* 10336 * copy sense data and scsi status to current error entry 10337 */ 10338 bcopy(cmd, err_entry_tmp->mtees_entry.mtee_arq_status, 10339 SECMDS_STATUS_SIZE); 10340 10341 err_entry_tmp->mtees_nextp = un->un_error_entry_stk; 10342 un->un_error_entry_stk = err_entry_tmp; 10343 10344 } 10345 10346 /* 10347 * Empty all the error entry in stack 10348 */ 10349 static void 10350 st_empty_error_stack(struct scsi_tape *un) 10351 { 10352 struct mterror_entry_stack *linkp; 10353 10354 ST_FUNC(ST_DEVINFO, st_empty_error_stack); 10355 10356 ASSERT(mutex_owned(ST_MUTEX)); 10357 10358 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 10359 "st_empty_entry_stack()\n"); 10360 10361 while (un->un_error_entry_stk != NULL) { 10362 linkp = un->un_error_entry_stk; 10363 un->un_error_entry_stk = 10364 un->un_error_entry_stk->mtees_nextp; 10365 10366 if (linkp->mtees_entry.mtee_cdb_buf != NULL) 10367 kmem_free(linkp->mtees_entry.mtee_cdb_buf, 10368 linkp->mtees_entry.mtee_cdb_len); 10369 10370 if (linkp->mtees_entry.mtee_arq_status != NULL) 10371 kmem_free(linkp->mtees_entry.mtee_arq_status, 10372 linkp->mtees_entry.mtee_arq_status_len); 10373 10374 kmem_free(linkp, MTERROR_LINK_ENTRY_SIZE); 10375 linkp = NULL; 10376 } 10377 } 10378 10379 static errstate 10380 st_handle_sense(struct scsi_tape *un, struct buf *bp, tapepos_t *pos) 10381 { 10382 struct scsi_pkt *pkt = BP_PKT(bp); 10383 struct scsi_pkt *rqpkt = un->un_rqs; 10384 struct scsi_arq_status arqstat; 10385 recov_info *rcif = pkt->pkt_private; 10386 10387 errstate rval = COMMAND_DONE_ERROR; 10388 int amt; 10389 10390 ST_FUNC(ST_DEVINFO, st_handle_sense); 10391 10392 ASSERT(mutex_owned(ST_MUTEX)); 10393 10394 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 10395 "st_handle_sense()\n"); 10396 10397 if (SCBP(rqpkt)->sts_busy) { 10398 if (rcif->privatelen == sizeof (recov_info)) { 10399 ST_RECOV(ST_DEVINFO, st_label, CE_WARN, 10400 "Attempt recovery of busy unit on request sense\n"); 10401 rval = ATTEMPT_RETRY; 10402 } else if (rcif->pkt_retry_cnt++ < st_retry_count) { 10403 ST_DEBUG4(ST_DEVINFO, st_label, CE_WARN, 10404 "Retry busy unit on request sense\n"); 10405 rval = QUE_BUSY_COMMAND; 10406 } 10407 return (rval); 10408 } else if (SCBP(rqpkt)->sts_chk) { 10409 ST_DEBUG6(ST_DEVINFO, st_label, CE_WARN, 10410 "Check Condition on REQUEST SENSE\n"); 10411 return (rval); 10412 } 10413 10414 /* 10415 * Make sure there is sense data to look at. 10416 */ 10417 if ((rqpkt->pkt_state & (STATE_GOT_BUS | STATE_GOT_TARGET | 10418 STATE_SENT_CMD | STATE_GOT_STATUS)) != (STATE_GOT_BUS | 10419 STATE_GOT_TARGET | STATE_SENT_CMD | STATE_GOT_STATUS)) { 10420 return (rval); 10421 } 10422 10423 /* was there enough data? */ 10424 amt = (int)MAX_SENSE_LENGTH - rqpkt->pkt_resid; 10425 if ((rqpkt->pkt_state & STATE_XFERRED_DATA) == 0 || 10426 (amt < SUN_MIN_SENSE_LENGTH)) { 10427 ST_DEBUG6(ST_DEVINFO, st_label, CE_WARN, 10428 "REQUEST SENSE couldn't get sense data\n"); 10429 return (rval); 10430 } 10431 10432 bcopy(SCBP(pkt), &arqstat.sts_status, 10433 sizeof (struct scsi_status)); 10434 bcopy(SCBP(rqpkt), &arqstat.sts_rqpkt_status, 10435 sizeof (struct scsi_status)); 10436 arqstat.sts_rqpkt_reason = rqpkt->pkt_reason; 10437 arqstat.sts_rqpkt_resid = rqpkt->pkt_resid; 10438 arqstat.sts_rqpkt_state = rqpkt->pkt_state; 10439 arqstat.sts_rqpkt_statistics = rqpkt->pkt_statistics; 10440 bcopy(ST_RQSENSE, &arqstat.sts_sensedata, SENSE_LENGTH); 10441 10442 /* 10443 * copy one arqstat entry in the sense data buffer 10444 */ 10445 st_update_error_stack(un, pkt, &arqstat); 10446 return (st_decode_sense(un, bp, amt, &arqstat, pos)); 10447 } 10448 10449 static errstate 10450 st_handle_autosense(struct scsi_tape *un, struct buf *bp, tapepos_t *pos) 10451 { 10452 struct scsi_pkt *pkt = BP_PKT(bp); 10453 struct scsi_arq_status *arqstat = 10454 (struct scsi_arq_status *)pkt->pkt_scbp; 10455 errstate rval = COMMAND_DONE_ERROR; 10456 int amt; 10457 10458 ST_FUNC(ST_DEVINFO, st_handle_autosense); 10459 10460 ASSERT(mutex_owned(ST_MUTEX)); 10461 10462 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 10463 "st_handle_autosense()\n"); 10464 10465 if (arqstat->sts_rqpkt_status.sts_busy) { 10466 ST_DEBUG4(ST_DEVINFO, st_label, CE_WARN, 10467 "busy unit on request sense\n"); 10468 /* 10469 * we return QUE_SENSE so st_intr will setup the SENSE cmd. 10470 * the disadvantage is that we do not have any delay for the 10471 * second retry of rqsense and we have to keep a packet around 10472 */ 10473 return (QUE_SENSE); 10474 10475 } else if (arqstat->sts_rqpkt_reason != CMD_CMPLT) { 10476 ST_DEBUG6(ST_DEVINFO, st_label, CE_WARN, 10477 "transport error on REQUEST SENSE\n"); 10478 if ((arqstat->sts_rqpkt_state & STATE_GOT_TARGET) && 10479 ((arqstat->sts_rqpkt_statistics & 10480 (STAT_BUS_RESET | STAT_DEV_RESET | STAT_ABORTED)) == 0)) { 10481 if (st_reset(un, RESET_LUN) == 0) { 10482 ST_DEBUG6(ST_DEVINFO, st_label, CE_WARN, 10483 "recovery by resets failed\n"); 10484 } 10485 } 10486 return (rval); 10487 10488 } else if (arqstat->sts_rqpkt_status.sts_chk) { 10489 ST_DEBUG6(ST_DEVINFO, st_label, CE_WARN, 10490 "Check Condition on REQUEST SENSE\n"); 10491 return (rval); 10492 } 10493 10494 10495 /* was there enough data? */ 10496 if (pkt->pkt_state & STATE_XARQ_DONE) { 10497 amt = (int)MAX_SENSE_LENGTH - arqstat->sts_rqpkt_resid; 10498 } else { 10499 if (arqstat->sts_rqpkt_resid > SENSE_LENGTH) { 10500 amt = (int)MAX_SENSE_LENGTH - arqstat->sts_rqpkt_resid; 10501 } else { 10502 amt = (int)SENSE_LENGTH - arqstat->sts_rqpkt_resid; 10503 } 10504 } 10505 if ((arqstat->sts_rqpkt_state & STATE_XFERRED_DATA) == 0 || 10506 (amt < SUN_MIN_SENSE_LENGTH)) { 10507 ST_DEBUG6(ST_DEVINFO, st_label, CE_WARN, 10508 "REQUEST SENSE couldn't get sense data\n"); 10509 return (rval); 10510 } 10511 10512 if (pkt->pkt_state & STATE_XARQ_DONE) { 10513 bcopy(&arqstat->sts_sensedata, ST_RQSENSE, MAX_SENSE_LENGTH); 10514 } else { 10515 bcopy(&arqstat->sts_sensedata, ST_RQSENSE, SENSE_LENGTH); 10516 } 10517 10518 /* 10519 * copy one arqstat entry in the sense data buffer 10520 */ 10521 st_update_error_stack(un, pkt, arqstat); 10522 10523 return (st_decode_sense(un, bp, amt, arqstat, pos)); 10524 } 10525 10526 static errstate 10527 st_decode_sense(struct scsi_tape *un, struct buf *bp, int amt, 10528 struct scsi_arq_status *statusp, tapepos_t *pos) 10529 { 10530 struct scsi_pkt *pkt = BP_PKT(bp); 10531 recov_info *ri = pkt->pkt_private; 10532 errstate rval = COMMAND_DONE_ERROR; 10533 cmd_attribute const *attrib; 10534 long resid; 10535 struct scsi_extended_sense *sensep = ST_RQSENSE; 10536 int severity; 10537 int get_error; 10538 10539 ST_FUNC(ST_DEVINFO, st_decode_sense); 10540 10541 ASSERT(mutex_owned(ST_MUTEX)); 10542 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 10543 "st_decode_sense()\n"); 10544 10545 /* 10546 * For uscsi commands, squirrel away a copy of the 10547 * results of the Request Sense. 10548 */ 10549 if (USCSI_CMD(bp)) { 10550 struct uscsi_cmd *ucmd = BP_UCMD(bp); 10551 ucmd->uscsi_rqstatus = *(uchar_t *)statusp; 10552 if (ucmd->uscsi_rqlen && un->un_srqbufp) { 10553 uchar_t rqlen = min((uchar_t)amt, ucmd->uscsi_rqlen); 10554 ucmd->uscsi_rqresid = ucmd->uscsi_rqlen - rqlen; 10555 bcopy(ST_RQSENSE, un->un_srqbufp, rqlen); 10556 ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, 10557 "st_decode_sense: stat=0x%x resid=0x%x\n", 10558 ucmd->uscsi_rqstatus, ucmd->uscsi_rqresid); 10559 } 10560 } 10561 10562 if (ri->privatelen == sizeof (recov_info)) { 10563 attrib = ri->cmd_attrib; 10564 } else { 10565 attrib = st_lookup_cmd_attribute(pkt->pkt_cdbp[0]); 10566 } 10567 10568 /* 10569 * If the drive is an MT-02, reposition the 10570 * secondary error code into the proper place. 10571 * 10572 * XXX MT-02 is non-CCS tape, so secondary error code 10573 * is in byte 8. However, in SCSI-2, tape has CCS definition 10574 * so it's in byte 12. 10575 */ 10576 if (un->un_dp->type == ST_TYPE_EMULEX) { 10577 sensep->es_code = sensep->es_add_info[0]; 10578 } 10579 10580 ST_CDB(ST_DEVINFO, "st_decode_sense failed CDB", 10581 (caddr_t)&CDBP(pkt)->scc_cmd); 10582 10583 ST_SENSE(ST_DEVINFO, "st_decode_sense sense data", (caddr_t)statusp, 10584 sizeof (*statusp)); 10585 10586 /* for normal I/O check extract the resid values. */ 10587 if (bp != un->un_sbufp && bp != un->un_recov_buf) { 10588 if (sensep->es_valid) { 10589 resid = 10590 (sensep->es_info_1 << 24) | 10591 (sensep->es_info_2 << 16) | 10592 (sensep->es_info_3 << 8) | 10593 (sensep->es_info_4); 10594 /* If fixed block */ 10595 if (un->un_bsize) { 10596 resid *= un->un_bsize; 10597 } 10598 } else if (pkt->pkt_state & STATE_XFERRED_DATA) { 10599 resid = pkt->pkt_resid; 10600 } else { 10601 resid = bp->b_bcount; 10602 } 10603 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 10604 "st_decode_sense (rw): xferred bit = %d, resid=%ld (%d), " 10605 "pkt_resid=%ld\n", pkt->pkt_state & STATE_XFERRED_DATA, 10606 resid, 10607 (sensep->es_info_1 << 24) | 10608 (sensep->es_info_2 << 16) | 10609 (sensep->es_info_3 << 8) | 10610 (sensep->es_info_4), 10611 pkt->pkt_resid); 10612 /* 10613 * The problem is, what should we believe? 10614 */ 10615 if (resid && (pkt->pkt_resid == 0)) { 10616 pkt->pkt_resid = resid; 10617 } 10618 } else { 10619 /* 10620 * If the command is SCMD_SPACE, we need to get the 10621 * residual as returned in the sense data, to adjust 10622 * our idea of current tape position correctly 10623 */ 10624 if ((sensep->es_valid) && 10625 (CDBP(pkt)->scc_cmd == SCMD_LOCATE) || 10626 (CDBP(pkt)->scc_cmd == SCMD_LOCATE_G4) || 10627 (CDBP(pkt)->scc_cmd == SCMD_SPACE) || 10628 (CDBP(pkt)->scc_cmd == SCMD_SPACE_G4) || 10629 (CDBP(pkt)->scc_cmd == SCMD_WRITE_FILE_MARK)) { 10630 resid = 10631 (sensep->es_info_1 << 24) | 10632 (sensep->es_info_2 << 16) | 10633 (sensep->es_info_3 << 8) | 10634 (sensep->es_info_4); 10635 bp->b_resid = resid; 10636 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 10637 "st_decode_sense(other): resid=%ld\n", resid); 10638 } else { 10639 /* 10640 * If the special command is SCMD_READ, 10641 * the correct resid will be set later. 10642 */ 10643 if (attrib->get_cnt != NULL) { 10644 resid = attrib->get_cnt(pkt->pkt_cdbp); 10645 } else { 10646 resid = bp->b_bcount; 10647 } 10648 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 10649 "st_decode_sense(special read): resid=%ld\n", 10650 resid); 10651 } 10652 } 10653 10654 if ((un->un_state >= ST_STATE_OPEN) && 10655 (DEBUGGING || st_error_level == SCSI_ERR_ALL)) { 10656 st_print_cdb(ST_DEVINFO, st_label, CE_NOTE, 10657 "Failed CDB", (char *)pkt->pkt_cdbp); 10658 st_clean_print(ST_DEVINFO, st_label, CE_CONT, 10659 "sense data", (char *)sensep, amt); 10660 scsi_log(ST_DEVINFO, st_label, CE_CONT, 10661 "count 0x%lx resid 0x%lx pktresid 0x%lx\n", 10662 bp->b_bcount, resid, pkt->pkt_resid); 10663 } 10664 10665 switch (un->un_status = sensep->es_key) { 10666 case KEY_NO_SENSE: 10667 severity = SCSI_ERR_INFO; 10668 10669 /* 10670 * Erase, locate or rewind operation in progress, retry 10671 * ASC ASCQ 10672 * 00 18 Erase operation in progress 10673 * 00 19 Locate operation in progress 10674 * 00 1A Rewind operation in progress 10675 */ 10676 if (sensep->es_add_code == 0 && 10677 ((sensep->es_qual_code == 0x18) || 10678 (sensep->es_qual_code == 0x19) || 10679 (sensep->es_qual_code == 0x1a))) { 10680 rval = QUE_BUSY_COMMAND; 10681 break; 10682 } 10683 10684 goto common; 10685 10686 case KEY_RECOVERABLE_ERROR: 10687 severity = SCSI_ERR_RECOVERED; 10688 if ((sensep->es_class == CLASS_EXTENDED_SENSE) && 10689 (sensep->es_code == ST_DEFERRED_ERROR)) { 10690 if (un->un_dp->options & 10691 ST_RETRY_ON_RECOVERED_DEFERRED_ERROR) { 10692 rval = QUE_LAST_COMMAND; 10693 scsi_errmsg(ST_SCSI_DEVP, pkt, st_label, 10694 severity, pos->lgclblkno, 10695 un->un_err_pos.lgclblkno, scsi_cmds, 10696 sensep); 10697 scsi_log(ST_DEVINFO, st_label, CE_CONT, 10698 "Command will be retried\n"); 10699 } else { 10700 severity = SCSI_ERR_FATAL; 10701 rval = COMMAND_DONE_ERROR_RECOVERED; 10702 ST_DO_ERRSTATS(un, st_softerrs); 10703 scsi_errmsg(ST_SCSI_DEVP, pkt, st_label, 10704 severity, pos->lgclblkno, 10705 un->un_err_pos.lgclblkno, scsi_cmds, 10706 sensep); 10707 } 10708 break; 10709 } 10710 common: 10711 /* 10712 * XXX only want reads to be stopped by filemarks. 10713 * Don't want them to be stopped by EOT. EOT matters 10714 * only on write. 10715 */ 10716 if (sensep->es_filmk && !sensep->es_eom) { 10717 rval = COMMAND_DONE; 10718 } else if (sensep->es_eom) { 10719 rval = COMMAND_DONE; 10720 } else if (sensep->es_ili) { 10721 /* 10722 * Fun with variable length record devices: 10723 * for specifying larger blocks sizes than the 10724 * actual physical record size. 10725 */ 10726 if (un->un_bsize == 0 && resid > 0) { 10727 /* 10728 * XXX! Ugly. 10729 * The requested blocksize is > tape blocksize, 10730 * so this is ok, so we just return the 10731 * actual size xferred. 10732 */ 10733 pkt->pkt_resid = resid; 10734 rval = COMMAND_DONE; 10735 } else if (un->un_bsize == 0 && resid < 0) { 10736 /* 10737 * The requested blocksize is < tape blocksize, 10738 * so this is not ok, so we err with ENOMEM 10739 */ 10740 rval = COMMAND_DONE_ERROR_RECOVERED; 10741 st_bioerror(bp, ENOMEM); 10742 } else { 10743 ST_DO_ERRSTATS(un, st_softerrs); 10744 severity = SCSI_ERR_FATAL; 10745 rval = COMMAND_DONE_ERROR; 10746 st_bioerror(bp, EINVAL); 10747 un->un_running.pmode = invalid; 10748 } 10749 } else { 10750 /* 10751 * we hope and pray for this just being 10752 * something we can ignore (ie. a 10753 * truly recoverable soft error) 10754 */ 10755 rval = COMMAND_DONE; 10756 } 10757 if (sensep->es_filmk) { 10758 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 10759 "filemark\n"); 10760 un->un_status = SUN_KEY_EOF; 10761 pos->eof = ST_EOF_PENDING; 10762 st_set_pe_flag(un); 10763 } 10764 10765 /* 10766 * ignore eom when reading, a fmk should terminate reading 10767 */ 10768 if ((sensep->es_eom) && 10769 (CDBP(pkt)->scc_cmd != SCMD_READ)) { 10770 if ((sensep->es_add_code == 0) && 10771 (sensep->es_qual_code == 4)) { 10772 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 10773 "bot\n"); 10774 un->un_status = SUN_KEY_BOT; 10775 pos->eof = ST_NO_EOF; 10776 pos->lgclblkno = 0; 10777 pos->fileno = 0; 10778 pos->blkno = 0; 10779 if (pos->pmode != legacy) 10780 pos->pmode = legacy; 10781 } else { 10782 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 10783 "eom\n"); 10784 un->un_status = SUN_KEY_EOT; 10785 pos->eof = ST_EOM; 10786 } 10787 st_set_pe_flag(un); 10788 } 10789 10790 break; 10791 10792 case KEY_ILLEGAL_REQUEST: 10793 10794 if (un->un_laststate >= ST_STATE_OPEN) { 10795 ST_DO_ERRSTATS(un, st_softerrs); 10796 severity = SCSI_ERR_FATAL; 10797 } else { 10798 severity = SCSI_ERR_INFO; 10799 } 10800 break; 10801 10802 case KEY_MEDIUM_ERROR: 10803 ST_DO_ERRSTATS(un, st_harderrs); 10804 severity = SCSI_ERR_FATAL; 10805 check_keys: 10806 /* 10807 * attempt to process the keys in the presence of 10808 * other errors 10809 */ 10810 if (sensep->es_ili && rval != COMMAND_DONE_ERROR) { 10811 /* 10812 * Fun with variable length record devices: 10813 * for specifying larger blocks sizes than the 10814 * actual physical record size. 10815 */ 10816 if (un->un_bsize == 0 && resid > 0) { 10817 /* 10818 * XXX! Ugly 10819 */ 10820 pkt->pkt_resid = resid; 10821 } else if (un->un_bsize == 0 && resid < 0) { 10822 st_bioerror(bp, EINVAL); 10823 } else { 10824 severity = SCSI_ERR_FATAL; 10825 rval = COMMAND_DONE_ERROR; 10826 st_bioerror(bp, EINVAL); 10827 } 10828 } 10829 if (sensep->es_filmk) { 10830 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 10831 "filemark\n"); 10832 un->un_status = SUN_KEY_EOF; 10833 pos->eof = ST_EOF_PENDING; 10834 st_set_pe_flag(un); 10835 } 10836 10837 /* 10838 * ignore eom when reading, a fmk should terminate reading 10839 */ 10840 if ((sensep->es_eom) && 10841 (CDBP(pkt)->scc_cmd != SCMD_READ)) { 10842 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, "eom\n"); 10843 un->un_status = SUN_KEY_EOT; 10844 pos->eof = ST_EOM; 10845 st_set_pe_flag(un); 10846 } 10847 10848 break; 10849 10850 case KEY_VOLUME_OVERFLOW: 10851 ST_DO_ERRSTATS(un, st_softerrs); 10852 pos->eof = ST_EOM; 10853 severity = SCSI_ERR_FATAL; 10854 rval = COMMAND_DONE_ERROR; 10855 goto check_keys; 10856 10857 case KEY_HARDWARE_ERROR: 10858 ST_DO_ERRSTATS(un, st_harderrs); 10859 severity = SCSI_ERR_FATAL; 10860 rval = COMMAND_DONE_ERROR; 10861 if (un->un_dp->options & ST_EJECT_ON_CHANGER_FAILURE) 10862 un->un_eject_tape_on_failure = st_check_asc_ascq(un); 10863 break; 10864 10865 case KEY_BLANK_CHECK: 10866 ST_DO_ERRSTATS(un, st_softerrs); 10867 severity = SCSI_ERR_INFO; 10868 10869 /* 10870 * if not a special request and some data was xferred then it 10871 * it is not an error yet 10872 */ 10873 if (bp != un->un_sbufp && (bp->b_flags & B_READ)) { 10874 /* 10875 * no error for read with or without data xferred 10876 */ 10877 un->un_status = SUN_KEY_EOT; 10878 pos->eof = ST_EOT; 10879 rval = COMMAND_DONE_ERROR; 10880 un->un_running.pmode = invalid; 10881 st_set_pe_flag(un); 10882 goto check_keys; 10883 } else if (bp != un->un_sbufp && 10884 (pkt->pkt_state & STATE_XFERRED_DATA)) { 10885 rval = COMMAND_DONE; 10886 } else { 10887 rval = COMMAND_DONE_ERROR_RECOVERED; 10888 } 10889 10890 if (un->un_laststate >= ST_STATE_OPEN) { 10891 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 10892 "blank check\n"); 10893 pos->eof = ST_EOM; 10894 } 10895 if ((CDBP(pkt)->scc_cmd == SCMD_LOCATE) || 10896 (CDBP(pkt)->scc_cmd == SCMD_LOCATE_G4) || 10897 (CDBP(pkt)->scc_cmd == SCMD_SPACE) && 10898 (un->un_dp->options & ST_KNOWS_EOD)) { 10899 /* 10900 * we were doing a fast forward by skipping 10901 * multiple fmk at the time 10902 */ 10903 st_bioerror(bp, EIO); 10904 severity = SCSI_ERR_RECOVERED; 10905 rval = COMMAND_DONE; 10906 } 10907 st_set_pe_flag(un); 10908 goto check_keys; 10909 10910 case KEY_WRITE_PROTECT: 10911 if (st_wrongtapetype(un)) { 10912 un->un_status = SUN_KEY_WRONGMEDIA; 10913 ST_DEBUG6(ST_DEVINFO, st_label, CE_WARN, 10914 "wrong tape for writing- use DC6150 tape " 10915 "(or equivalent)\n"); 10916 severity = SCSI_ERR_UNKNOWN; 10917 } else { 10918 severity = SCSI_ERR_FATAL; 10919 } 10920 ST_DO_ERRSTATS(un, st_harderrs); 10921 rval = COMMAND_DONE_ERROR; 10922 st_bioerror(bp, EACCES); 10923 break; 10924 10925 case KEY_UNIT_ATTENTION: 10926 ST_DEBUG6(ST_DEVINFO, st_label, CE_WARN, 10927 "KEY_UNIT_ATTENTION : un_state = %d\n", un->un_state); 10928 10929 un->un_unit_attention_flags |= 1; 10930 /* 10931 * If we have detected a Bus Reset and the tape 10932 * drive has been reserved. 10933 */ 10934 if (ST_RQSENSE->es_add_code == 0x29) { 10935 rval = DEVICE_RESET; 10936 if ((un->un_rsvd_status & 10937 (ST_RESERVE | ST_APPLICATION_RESERVATIONS)) == 10938 ST_RESERVE) { 10939 un->un_rsvd_status |= ST_LOST_RESERVE; 10940 ST_DEBUG(ST_DEVINFO, st_label, CE_WARN, 10941 "st_decode_sense: Lost Reservation\n"); 10942 } 10943 } 10944 10945 /* 10946 * If this is a recovery command and retrable, retry. 10947 */ 10948 if (bp == un->un_recov_buf) { 10949 severity = SCSI_ERR_INFO; 10950 if (attrib->retriable && 10951 ri->pkt_retry_cnt++ < st_retry_count) { 10952 rval = QUE_COMMAND; 10953 } else { 10954 rval = COMMAND_DONE_ERROR; 10955 } 10956 break; /* Don't set position invalid */ 10957 } 10958 10959 /* 10960 * If ST_APPLICATION_RESERVATIONS is set, 10961 * If the asc/ascq indicates that the reservation 10962 * has been cleared just allow the write to continue 10963 * which would force a scsi 2 reserve. 10964 * If preempted that persistent reservation 10965 * the scsi 2 reserve would get a reservation conflict. 10966 */ 10967 if ((un->un_rsvd_status & 10968 ST_APPLICATION_RESERVATIONS) != 0) { 10969 /* 10970 * RESERVATIONS PREEMPTED 10971 * With MPxIO this could be a fail over? XXX 10972 */ 10973 if (ST_RQSENSE->es_add_code == 0x2a && 10974 ST_RQSENSE->es_qual_code == 0x03) { 10975 severity = SCSI_ERR_INFO; 10976 rval = COMMAND_DONE_ERROR; 10977 pos->pmode = invalid; 10978 break; 10979 /* 10980 * RESERVATIONS RELEASED 10981 */ 10982 } else if (ST_RQSENSE->es_add_code == 0x2a && 10983 ST_RQSENSE->es_qual_code == 0x04) { 10984 severity = SCSI_ERR_INFO; 10985 rval = COMMAND_DONE; 10986 break; 10987 } 10988 } 10989 10990 if (un->un_state <= ST_STATE_OPENING) { 10991 /* 10992 * Look, the tape isn't open yet, now determine 10993 * if the cause is a BUS RESET, Save the file 10994 * and Block positions for the callers to 10995 * recover from the loss of position. 10996 */ 10997 severity = SCSI_ERR_INFO; 10998 if ((pos->pmode != invalid) && 10999 (rval == DEVICE_RESET) && 11000 (un->un_restore_pos != 1)) { 11001 un->un_save_fileno = pos->fileno; 11002 un->un_save_blkno = pos->blkno; 11003 un->un_restore_pos = 1; 11004 } 11005 11006 if (attrib->retriable && 11007 ri->pkt_retry_cnt++ < st_retry_count) { 11008 rval = QUE_COMMAND; 11009 } else if (rval == DEVICE_RESET) { 11010 break; 11011 } else { 11012 rval = COMMAND_DONE_ERROR; 11013 } 11014 /* 11015 * Means it thinks the mode parameters have changed. 11016 * This is the result of a reset clearing settings or 11017 * another initiator changing what we set. 11018 */ 11019 } 11020 if (ST_RQSENSE->es_add_code == 0x2a) { 11021 if (ST_RQSENSE->es_qual_code == 0x1) { 11022 /* Error recovery will modeselect and retry. */ 11023 rval = DEVICE_TAMPER; 11024 severity = SCSI_ERR_INFO; 11025 break; /* don't set position invalid */ 11026 } 11027 if (ST_RQSENSE->es_qual_code == 0x0 || 11028 ST_RQSENSE->es_qual_code == 0x2 || 11029 ST_RQSENSE->es_qual_code == 0x3 || 11030 ST_RQSENSE->es_qual_code == 0x4 || 11031 ST_RQSENSE->es_qual_code == 0x5 || 11032 ST_RQSENSE->es_qual_code == 0x6 || 11033 ST_RQSENSE->es_qual_code == 0x7) { 11034 rval = DEVICE_TAMPER; 11035 severity = SCSI_ERR_INFO; 11036 } 11037 } else if (ST_RQSENSE->es_add_code == 0x28 && 11038 ((ST_RQSENSE->es_qual_code == 0x0) || 11039 ST_RQSENSE->es_qual_code == 0x5)) { 11040 /* 11041 * Not Ready to Ready change, Media may have changed. 11042 */ 11043 rval = DEVICE_TAMPER; 11044 severity = SCSI_ERR_RETRYABLE; 11045 } else { 11046 if (rval != DEVICE_RESET) { 11047 rval = COMMAND_DONE_ERROR; 11048 } else { 11049 /* 11050 * Returning DEVICE_RESET will call 11051 * error recovery. 11052 */ 11053 severity = SCSI_ERR_INFO; 11054 break; /* don't set position invalid */ 11055 } 11056 /* 11057 * Check if it is an Unexpected Unit Attention. 11058 * If state is >= ST_STATE_OPEN, we have 11059 * already done the initialization . 11060 * In this case it is Fatal Error 11061 * since no further reading/writing 11062 * can be done with fileno set to < 0. 11063 */ 11064 if (un->un_state >= ST_STATE_OPEN) { 11065 ST_DO_ERRSTATS(un, st_harderrs); 11066 severity = SCSI_ERR_FATAL; 11067 } else { 11068 severity = SCSI_ERR_INFO; 11069 } 11070 } 11071 11072 pos->pmode = invalid; 11073 11074 break; 11075 11076 case KEY_NOT_READY: 11077 /* 11078 * If in process of getting ready retry. 11079 */ 11080 if (sensep->es_add_code == 0x04 && 11081 sensep->es_qual_code == 0x01 && 11082 ri->pkt_retry_cnt++ < st_retry_count) { 11083 rval = QUE_COMMAND; 11084 severity = SCSI_ERR_INFO; 11085 } else { 11086 /* give up */ 11087 rval = COMMAND_DONE_ERROR; 11088 severity = SCSI_ERR_FATAL; 11089 } 11090 11091 /* 11092 * If this was an error and after device opened 11093 * do error stats. 11094 */ 11095 if (rval == COMMAND_DONE_ERROR && 11096 un->un_state > ST_STATE_OPENING) { 11097 ST_DO_ERRSTATS(un, st_harderrs); 11098 } 11099 11100 if (ST_RQSENSE->es_add_code == 0x3a) { 11101 if (st_error_level >= SCSI_ERR_FATAL) 11102 scsi_log(ST_DEVINFO, st_label, CE_NOTE, 11103 "Tape not inserted in drive\n"); 11104 un->un_mediastate = MTIO_EJECTED; 11105 cv_broadcast(&un->un_state_cv); 11106 } 11107 if ((un->un_dp->options & ST_EJECT_ON_CHANGER_FAILURE) && 11108 (rval != QUE_COMMAND)) 11109 un->un_eject_tape_on_failure = st_check_asc_ascq(un); 11110 break; 11111 11112 case KEY_ABORTED_COMMAND: 11113 /* XXX Do drives return this when they see a lost light? */ 11114 /* Testing would say yes */ 11115 11116 if (ri->pkt_retry_cnt++ < st_retry_count) { 11117 rval = ATTEMPT_RETRY; 11118 severity = SCSI_ERR_RETRYABLE; 11119 goto check_keys; 11120 } 11121 /* 11122 * Probably a parity error... 11123 * if we retry here then this may cause data to be 11124 * written twice or data skipped during reading 11125 */ 11126 ST_DO_ERRSTATS(un, st_harderrs); 11127 severity = SCSI_ERR_FATAL; 11128 rval = COMMAND_DONE_ERROR; 11129 goto check_keys; 11130 11131 default: 11132 /* 11133 * Undecoded sense key. Try retries and hope 11134 * that will fix the problem. Otherwise, we're 11135 * dead. 11136 */ 11137 ST_DEBUG6(ST_DEVINFO, st_label, CE_WARN, 11138 "Unhandled Sense Key '%s'\n", 11139 sense_keys[un->un_status]); 11140 ST_DO_ERRSTATS(un, st_harderrs); 11141 severity = SCSI_ERR_FATAL; 11142 rval = COMMAND_DONE_ERROR; 11143 goto check_keys; 11144 } 11145 11146 if ((!(pkt->pkt_flags & FLAG_SILENT) && 11147 un->un_state >= ST_STATE_OPEN) && (DEBUGGING || 11148 (un->un_laststate > ST_STATE_OPENING) && 11149 (severity >= st_error_level))) { 11150 11151 scsi_errmsg(ST_SCSI_DEVP, pkt, st_label, severity, 11152 pos->lgclblkno, un->un_err_pos.lgclblkno, 11153 scsi_cmds, sensep); 11154 if (sensep->es_filmk) { 11155 scsi_log(ST_DEVINFO, st_label, CE_CONT, 11156 "File Mark Detected\n"); 11157 } 11158 if (sensep->es_eom) { 11159 scsi_log(ST_DEVINFO, st_label, CE_CONT, 11160 "End-of-Media Detected\n"); 11161 } 11162 if (sensep->es_ili) { 11163 scsi_log(ST_DEVINFO, st_label, CE_CONT, 11164 "Incorrect Length Indicator Set\n"); 11165 } 11166 } 11167 get_error = geterror(bp); 11168 if (((rval == COMMAND_DONE_ERROR) || 11169 (rval == COMMAND_DONE_ERROR_RECOVERED)) && 11170 ((get_error == EIO) || (get_error == 0))) { 11171 un->un_rqs_state |= (ST_RQS_ERROR | ST_RQS_VALID); 11172 bcopy(ST_RQSENSE, un->un_uscsi_rqs_buf, SENSE_LENGTH); 11173 if (un->un_rqs_state & ST_RQS_READ) { 11174 un->un_rqs_state &= ~(ST_RQS_READ); 11175 } else { 11176 un->un_rqs_state |= ST_RQS_OVR; 11177 } 11178 } 11179 11180 return (rval); 11181 } 11182 11183 11184 static int 11185 st_handle_intr_retry_lcmd(struct scsi_tape *un, struct buf *bp) 11186 { 11187 int status = TRAN_ACCEPT; 11188 pkt_info *pktinfo = BP_PKT(bp)->pkt_private; 11189 11190 mutex_enter(ST_MUTEX); 11191 11192 ST_FUNC(ST_DEVINFO, st_handle_intr_retry_lcmd); 11193 11194 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 11195 "st_handle_intr_rtr_lcmd(), un = 0x%p\n", (void *)un); 11196 11197 /* 11198 * Check to see if we hit the retry timeout. We check to make sure 11199 * this is the first one on the runq and make sure we have not 11200 * queued up any more, so this one has to be the last on the list 11201 * also. If it is not, we have to fail. If it is not the first, but 11202 * is the last we are in trouble anyway, as we are in the interrupt 11203 * context here. 11204 */ 11205 if ((pktinfo->pkt_retry_cnt > st_retry_count) || 11206 ((un->un_runqf != bp) && (un->un_runql != bp))) { 11207 goto exit; 11208 } 11209 11210 if (un->un_throttle) { 11211 un->un_last_throttle = un->un_throttle; 11212 un->un_throttle = 0; 11213 } 11214 11215 /* 11216 * Here we know : bp is the first and last one on the runq 11217 * it is not necessary to put it back on the head of the 11218 * waitq and then move from waitq to runq. Save this queuing 11219 * and call scsi_transport. 11220 */ 11221 ST_CDB(ST_DEVINFO, "Retry lcmd CDB", (char *)BP_PKT(bp)->pkt_cdbp); 11222 11223 status = st_transport(un, BP_PKT(bp)); 11224 11225 if (status == TRAN_ACCEPT) { 11226 if (un->un_last_throttle) { 11227 un->un_throttle = un->un_last_throttle; 11228 } 11229 mutex_exit(ST_MUTEX); 11230 11231 ST_DEBUG6(ST_DEVINFO, st_label, CE_WARN, 11232 "restart transport \n"); 11233 return (0); 11234 } 11235 11236 ST_DO_KSTATS(bp, kstat_runq_back_to_waitq); 11237 mutex_exit(ST_MUTEX); 11238 11239 if (status == TRAN_BUSY) { 11240 if (st_handle_intr_busy(un, bp, ST_TRAN_BUSY_TIMEOUT) == 0) { 11241 return (0); 11242 } 11243 } 11244 ST_DEBUG6(ST_DEVINFO, st_label, CE_WARN, 11245 "restart transport rejected\n"); 11246 mutex_enter(ST_MUTEX); 11247 ST_DO_ERRSTATS(un, st_transerrs); 11248 if (un->un_last_throttle) { 11249 un->un_throttle = un->un_last_throttle; 11250 } 11251 exit: 11252 mutex_exit(ST_MUTEX); 11253 return (-1); 11254 } 11255 11256 static int 11257 st_wrongtapetype(struct scsi_tape *un) 11258 { 11259 11260 ST_FUNC(ST_DEVINFO, st_wrongtapetype); 11261 11262 ASSERT(mutex_owned(ST_MUTEX)); 11263 11264 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, "st_wrongtapetype()\n"); 11265 11266 /* 11267 * Hack to handle 600A, 600XTD, 6150 && 660 vs. 300XL tapes... 11268 */ 11269 if (un->un_dp && (un->un_dp->options & ST_QIC) && un->un_mspl) { 11270 switch (un->un_dp->type) { 11271 case ST_TYPE_WANGTEK: 11272 case ST_TYPE_ARCHIVE: 11273 /* 11274 * If this really worked, we could go off of 11275 * the density codes set in the modesense 11276 * page. For this drive, 0x10 == QIC-120, 11277 * 0xf == QIC-150, and 0x5 should be for 11278 * both QIC-24 and, maybe, QIC-11. However, 11279 * the h/w doesn't do what the manual says 11280 * that it should, so we'll key off of 11281 * getting a WRITE PROTECT error AND wp *not* 11282 * set in the mode sense information. 11283 */ 11284 /* 11285 * XXX but we already know that status is 11286 * write protect, so don't check it again. 11287 */ 11288 11289 if (un->un_status == KEY_WRITE_PROTECT && 11290 un->un_mspl->wp == 0) { 11291 return (1); 11292 } 11293 break; 11294 default: 11295 break; 11296 } 11297 } 11298 return (0); 11299 } 11300 11301 static errstate 11302 st_check_error(struct scsi_tape *un, struct scsi_pkt *pkt) 11303 { 11304 errstate action; 11305 recov_info *rcvi = pkt->pkt_private; 11306 buf_t *bp = rcvi->cmd_bp; 11307 struct scsi_arq_status *stat = (struct scsi_arq_status *)pkt->pkt_scbp; 11308 11309 ST_FUNC(ST_DEVINFO, st_check_error); 11310 11311 ASSERT(mutex_owned(ST_MUTEX)); 11312 11313 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, "st_check_error()\n"); 11314 11315 switch (SCBP_C(pkt)) { 11316 case STATUS_RESERVATION_CONFLICT: 11317 /* 11318 * Command recovery is enabled, not just opening, 11319 * we had the drive reserved and we thing its ours. 11320 * Call recovery to attempt to take it back. 11321 */ 11322 if ((rcvi->privatelen == sizeof (recov_info)) && 11323 (bp != un->un_recov_buf) && 11324 (un->un_state > ST_STATE_OPEN_PENDING_IO) && 11325 ((un->un_rsvd_status & (ST_RESERVE | 11326 ST_APPLICATION_RESERVATIONS)) != 0)) { 11327 action = ATTEMPT_RETRY; 11328 un->un_rsvd_status |= ST_LOST_RESERVE; 11329 } else { 11330 action = COMMAND_DONE_EACCES; 11331 un->un_rsvd_status |= ST_RESERVATION_CONFLICT; 11332 } 11333 break; 11334 11335 case STATUS_BUSY: 11336 ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, "unit busy\n"); 11337 if (rcvi->privatelen == sizeof (recov_info) && 11338 un->un_multipath && (pkt->pkt_state == (STATE_GOT_BUS | 11339 STATE_GOT_TARGET | STATE_SENT_CMD | STATE_GOT_STATUS))) { 11340 /* 11341 * Status returned by scsi_vhci indicating path 11342 * has failed over. 11343 */ 11344 action = PATH_FAILED; 11345 break; 11346 } 11347 /* FALLTHRU */ 11348 case STATUS_QFULL: 11349 if (rcvi->privatelen == sizeof (recov_info)) { 11350 /* 11351 * If recovery is inabled use it instead of 11352 * blind reties. 11353 */ 11354 action = ATTEMPT_RETRY; 11355 } else if (rcvi->pkt_retry_cnt++ < st_retry_count) { 11356 action = QUE_BUSY_COMMAND; 11357 } else if ((un->un_rsvd_status & 11358 (ST_RESERVE | ST_APPLICATION_RESERVATIONS)) == 0) { 11359 /* 11360 * If this is a command done before reserve is done 11361 * don't reset. 11362 */ 11363 action = COMMAND_DONE_ERROR; 11364 } else { 11365 ST_DEBUG2(ST_DEVINFO, st_label, CE_WARN, 11366 "unit busy too long\n"); 11367 (void) st_reset(un, RESET_ALL); 11368 action = COMMAND_DONE_ERROR; 11369 } 11370 break; 11371 11372 case STATUS_CHECK: 11373 case STATUS_TERMINATED: 11374 /* 11375 * we should only get here if the auto rqsense failed 11376 * thru a uscsi cmd without autorequest sense 11377 * so we just try again 11378 */ 11379 if (un->un_arq_enabled && 11380 stat->sts_rqpkt_reason == CMD_CMPLT && 11381 (stat->sts_rqpkt_state & (STATE_GOT_BUS | 11382 STATE_GOT_TARGET | STATE_SENT_CMD | STATE_GOT_STATUS)) == 11383 (STATE_GOT_BUS | STATE_GOT_TARGET | STATE_SENT_CMD | 11384 STATE_GOT_STATUS)) { 11385 11386 ST_DEBUG2(ST_DEVINFO, st_label, CE_WARN, 11387 "Really got sense data\n"); 11388 action = st_decode_sense(un, bp, MAX_SENSE_LENGTH - 11389 pkt->pkt_resid, stat, &un->un_pos); 11390 } else { 11391 ST_DEBUG2(ST_DEVINFO, st_label, CE_WARN, 11392 "Trying to queue sense command\n"); 11393 action = QUE_SENSE; 11394 } 11395 break; 11396 11397 case STATUS_TASK_ABORT: 11398 /* 11399 * This is an aborted task. This can be a reset on the other 11400 * port of a multiport drive. Lets try and recover it. 11401 */ 11402 action = DEVICE_RESET; 11403 break; 11404 11405 default: 11406 action = COMMAND_DONE; 11407 ST_DEBUG(ST_DEVINFO, st_label, CE_PANIC, 11408 "Unexpected scsi status byte 0x%x\n", SCBP_C(pkt)); 11409 } 11410 return (action); 11411 } 11412 11413 static void 11414 st_calc_bnum(struct scsi_tape *un, struct buf *bp, struct scsi_pkt *pkt) 11415 { 11416 int nblks; 11417 int nfiles; 11418 long count; 11419 recov_info *ri = pkt->pkt_private; 11420 cmd_attribute const *attrib; 11421 11422 ST_FUNC(ST_DEVINFO, st_calc_bnum); 11423 11424 ASSERT(mutex_owned(ST_MUTEX)); 11425 11426 if (ri->privatelen == sizeof (recov_info)) { 11427 attrib = ri->cmd_attrib; 11428 ASSERT(attrib->recov_pos_type == POS_EXPECTED); 11429 ASSERT(attrib->chg_tape_pos); 11430 } else { 11431 ri = NULL; 11432 attrib = st_lookup_cmd_attribute(pkt->pkt_cdbp[0]); 11433 } 11434 11435 count = bp->b_bcount - bp->b_resid; 11436 11437 /* Command reads or writes data */ 11438 if (attrib->transfers_data != TRAN_NONE) { 11439 if (count == 0) { 11440 /* failed writes should not make it here */ 11441 ASSERT(attrib->transfers_data == TRAN_READ); 11442 nblks = 0; 11443 nfiles = 1; 11444 } else if (un->un_bsize == 0) { 11445 /* 11446 * If variable block mode. 11447 * Fixed bit in CBD should be zero. 11448 */ 11449 ASSERT((pkt->pkt_cdbp[1] & 1) == 0); 11450 nblks = 1; 11451 un->un_kbytes_xferred += (count / ONE_K); 11452 nfiles = 0; 11453 } else { 11454 /* 11455 * If fixed block mode. 11456 * Fixed bit in CBD should be one. 11457 */ 11458 ASSERT((pkt->pkt_cdbp[1] & 1) == 1); 11459 nblks = (count / un->un_bsize); 11460 un->un_kbytes_xferred += (nblks * un->un_bsize) / ONE_K; 11461 nfiles = 0; 11462 } 11463 /* 11464 * So its possable to read some blocks and hit a filemark. 11465 * Example reading in fixed block mode where more then one 11466 * block at a time is requested. In this case because the 11467 * filemark is hit something less then the requesed number 11468 * of blocks is read. 11469 */ 11470 if (un->un_pos.eof == ST_EOF_PENDING && bp->b_resid) { 11471 nfiles = 1; 11472 } 11473 } else { 11474 nblks = 0; 11475 nfiles = count; 11476 } 11477 11478 /* 11479 * If some command failed after this one started and it seems 11480 * to have finshed without error count the position. 11481 */ 11482 if (un->un_persistence && un->un_persist_errors) { 11483 ASSERT(un->un_pos.pmode != invalid); 11484 } 11485 11486 if (attrib->chg_tape_direction == DIR_FORW) { 11487 un->un_pos.blkno += nblks; 11488 un->un_pos.lgclblkno += nblks; 11489 un->un_pos.lgclblkno += nfiles; 11490 } else if (attrib->chg_tape_direction == DIR_REVC) { 11491 un->un_pos.blkno -= nblks; 11492 un->un_pos.lgclblkno -= nblks; 11493 un->un_pos.lgclblkno -= nfiles; 11494 } else { 11495 ASSERT(0); 11496 } 11497 11498 /* recovery disabled */ 11499 if (ri == NULL) { 11500 un->un_running.pmode = invalid; 11501 return; 11502 } 11503 11504 /* 11505 * If we didn't just read a filemark. 11506 */ 11507 if (un->un_pos.eof != ST_EOF_PENDING) { 11508 ASSERT(nblks != 0 && nfiles == 0); 11509 /* 11510 * If Previously calulated expected position does not match 11511 * debug the expected position. 11512 */ 11513 if ((ri->pos.pmode != invalid) && nblks && 11514 ((un->un_pos.blkno != ri->pos.blkno) || 11515 (un->un_pos.lgclblkno != ri->pos.lgclblkno))) { 11516 #ifdef STDEBUG 11517 st_print_position(ST_DEVINFO, st_label, CE_NOTE, 11518 "Expected", &ri->pos); 11519 st_print_position(ST_DEVINFO, st_label, CE_NOTE, 11520 "But Got", &un->un_pos); 11521 #endif 11522 un->un_running.pmode = invalid; 11523 } 11524 } else { 11525 ASSERT(nfiles != 0); 11526 if (un->un_running.pmode != invalid) { 11527 /* 11528 * blkno and lgclblkno already counted in 11529 * st_add_recovery_info_to_pkt(). Since a block was not 11530 * read and a filemark was. 11531 */ 11532 if (attrib->chg_tape_direction == DIR_FORW) { 11533 un->un_running.fileno++; 11534 un->un_running.blkno = 0; 11535 } else if (attrib->chg_tape_direction == DIR_REVC) { 11536 un->un_running.fileno--; 11537 un->un_running.blkno = LASTBLK; 11538 } 11539 } 11540 } 11541 } 11542 11543 static void 11544 st_set_state(struct scsi_tape *un, struct buf *bp) 11545 { 11546 struct scsi_pkt *sp = BP_PKT(bp); 11547 struct uscsi_cmd *ucmd; 11548 11549 ST_FUNC(ST_DEVINFO, st_set_state); 11550 11551 ASSERT(mutex_owned(ST_MUTEX)); 11552 ASSERT(bp != un->un_recov_buf); 11553 11554 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 11555 "st_set_state(): eof=%x fmneeded=%x pkt_resid=0x%lx (%ld)\n", 11556 un->un_pos.eof, un->un_fmneeded, sp->pkt_resid, sp->pkt_resid); 11557 11558 if (bp != un->un_sbufp) { 11559 #ifdef STDEBUG 11560 if (DEBUGGING && sp->pkt_resid) { 11561 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 11562 "pkt_resid %ld bcount %ld\n", 11563 sp->pkt_resid, bp->b_bcount); 11564 } 11565 #endif 11566 bp->b_resid = sp->pkt_resid; 11567 if (geterror(bp) != EIO) { 11568 st_calc_bnum(un, bp, sp); 11569 } 11570 if (bp->b_flags & B_READ) { 11571 un->un_lastop = ST_OP_READ; 11572 un->un_fmneeded = 0; 11573 } else { 11574 un->un_lastop = ST_OP_WRITE; 11575 if (un->un_dp->options & ST_REEL) { 11576 un->un_fmneeded = 2; 11577 } else { 11578 un->un_fmneeded = 1; 11579 } 11580 } 11581 /* 11582 * all is honky dory at this point, so let's 11583 * readjust the throttle, to increase speed, if we 11584 * have not throttled down. 11585 */ 11586 if (un->un_throttle) { 11587 un->un_throttle = un->un_max_throttle; 11588 } 11589 } else { 11590 optype new_lastop = ST_OP_NIL; 11591 uchar_t cmd = (uchar_t)(intptr_t)bp->b_forw; 11592 11593 switch (cmd) { 11594 case SCMD_WRITE: 11595 case SCMD_WRITE_G4: 11596 bp->b_resid = sp->pkt_resid; 11597 new_lastop = ST_OP_WRITE; 11598 if (geterror(bp) == EIO) { 11599 break; 11600 } 11601 st_calc_bnum(un, bp, sp); 11602 if (un->un_dp->options & ST_REEL) { 11603 un->un_fmneeded = 2; 11604 } else { 11605 un->un_fmneeded = 1; 11606 } 11607 break; 11608 case SCMD_READ: 11609 case SCMD_READ_G4: 11610 bp->b_resid = sp->pkt_resid; 11611 new_lastop = ST_OP_READ; 11612 if (geterror(bp) == EIO) { 11613 break; 11614 } 11615 st_calc_bnum(un, bp, sp); 11616 un->un_fmneeded = 0; 11617 break; 11618 case SCMD_WRITE_FILE_MARK_G4: 11619 case SCMD_WRITE_FILE_MARK: 11620 { 11621 int fmdone; 11622 11623 if (un->un_pos.eof != ST_EOM) { 11624 un->un_pos.eof = ST_NO_EOF; 11625 } 11626 fmdone = (bp->b_bcount - bp->b_resid); 11627 if (fmdone > 0) { 11628 un->un_lastop = new_lastop = ST_OP_WEOF; 11629 un->un_pos.lgclblkno += fmdone; 11630 un->un_pos.fileno += fmdone; 11631 un->un_pos.blkno = 0; 11632 } else { 11633 new_lastop = ST_OP_CTL; 11634 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 11635 "Flushed buffer\n"); 11636 } 11637 if (fmdone > un->un_fmneeded) { 11638 un->un_fmneeded = 0; 11639 } else { 11640 un->un_fmneeded -= fmdone; 11641 } 11642 break; 11643 } 11644 case SCMD_REWIND: 11645 un->un_pos.eof = ST_NO_EOF; 11646 un->un_pos.fileno = 0; 11647 un->un_pos.blkno = 0; 11648 un->un_pos.lgclblkno = 0; 11649 if (un->un_pos.pmode != legacy) 11650 un->un_pos.pmode = legacy; 11651 new_lastop = ST_OP_CTL; 11652 un->un_restore_pos = 0; 11653 break; 11654 11655 case SCMD_SPACE: 11656 case SCMD_SPACE_G4: 11657 { 11658 int64_t count; 11659 int64_t resid; 11660 int64_t done; 11661 cmd_attribute const *attrib; 11662 recov_info *ri = sp->pkt_private; 11663 11664 if (ri->privatelen == sizeof (recov_info)) { 11665 attrib = ri->cmd_attrib; 11666 } else { 11667 attrib = 11668 st_lookup_cmd_attribute(sp->pkt_cdbp[0]); 11669 } 11670 11671 resid = (int64_t)SPACE_CNT(bp->b_resid); 11672 count = (int64_t)attrib->get_cnt(sp->pkt_cdbp); 11673 11674 if (count >= 0) { 11675 done = (count - resid); 11676 } else { 11677 done = ((-count) - resid); 11678 } 11679 if (done > 0) { 11680 un->un_lastop = new_lastop = ST_OP_CTL; 11681 } else { 11682 new_lastop = ST_OP_CTL; 11683 } 11684 11685 ST_SPAC(ST_DEVINFO, st_label, CE_WARN, 11686 "space cmd: cdb[1] = %s\n" 11687 "space data: = 0x%lx\n" 11688 "space count: = %"PRId64"\n" 11689 "space resid: = %"PRId64"\n" 11690 "spaces done: = %"PRId64"\n" 11691 "fileno before = %d\n" 11692 "blkno before = %d\n", 11693 space_strs[sp->pkt_cdbp[1] & 7], 11694 bp->b_bcount, 11695 count, resid, done, 11696 un->un_pos.fileno, un->un_pos.blkno); 11697 11698 switch (sp->pkt_cdbp[1]) { 11699 case SPACE_TYPE(SP_FLM): 11700 /* Space file forward */ 11701 if (count >= 0) { 11702 if (un->un_pos.eof <= ST_EOF) { 11703 un->un_pos.eof = ST_NO_EOF; 11704 } 11705 un->un_pos.fileno += done; 11706 un->un_pos.blkno = 0; 11707 break; 11708 } 11709 /* Space file backward */ 11710 if (done > un->un_pos.fileno) { 11711 un->un_pos.fileno = 0; 11712 un->un_pos.blkno = 0; 11713 } else { 11714 un->un_pos.fileno -= done; 11715 un->un_pos.blkno = LASTBLK; 11716 un->un_running.pmode = invalid; 11717 } 11718 break; 11719 case SPACE_TYPE(SP_BLK): 11720 /* Space block forward */ 11721 if (count >= 0) { 11722 un->un_pos.blkno += done; 11723 break; 11724 } 11725 /* Space block backward */ 11726 if (un->un_pos.eof >= ST_EOF_PENDING) { 11727 /* 11728 * we stepped back into 11729 * a previous file; we are not 11730 * making an effort to pretend that 11731 * we are still in the current file 11732 * ie. logical == physical position 11733 * and leave it to st_ioctl to correct 11734 */ 11735 if (done > un->un_pos.blkno) { 11736 un->un_pos.blkno = 0; 11737 } else { 11738 un->un_pos.fileno--; 11739 un->un_pos.blkno = LASTBLK; 11740 un->un_running.pmode = invalid; 11741 } 11742 } else { 11743 un->un_pos.blkno -= done; 11744 } 11745 break; 11746 case SPACE_TYPE(SP_SQFLM): 11747 un->un_pos.pmode = logical; 11748 un->un_pos.blkno = 0; 11749 un->un_lastop = new_lastop = ST_OP_CTL; 11750 break; 11751 case SPACE_TYPE(SP_EOD): 11752 un->un_pos.pmode = logical; 11753 un->un_pos.eof = ST_EOM; 11754 un->un_status = KEY_BLANK_CHECK; 11755 break; 11756 default: 11757 un->un_pos.pmode = invalid; 11758 scsi_log(ST_DEVINFO, st_label, SCSI_DEBUG, 11759 "Unsupported space cmd: %s\n", 11760 space_strs[sp->pkt_cdbp[1] & 7]); 11761 11762 un->un_lastop = new_lastop = ST_OP_CTL; 11763 } 11764 11765 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 11766 "after_space rs %"PRId64" fil %d blk %d\n", 11767 resid, un->un_pos.fileno, un->un_pos.blkno); 11768 11769 break; 11770 } 11771 case SCMD_LOAD: 11772 if ((bp->b_bcount & (LD_LOAD | LD_EOT)) == LD_LOAD) { 11773 un->un_pos.fileno = 0; 11774 if (un->un_pos.pmode != legacy) 11775 un->un_pos.pmode = legacy; 11776 } else { 11777 un->un_state = ST_STATE_OFFLINE; 11778 un->un_pos.pmode = invalid; 11779 11780 } 11781 /* 11782 * If we are loading or unloading we expect the media id 11783 * to change. Lets make it unknown. 11784 */ 11785 if (un->un_media_id != bogusID && un->un_media_id_len) { 11786 kmem_free(un->un_media_id, un->un_media_id_len); 11787 un->un_media_id = NULL; 11788 un->un_media_id_len = 0; 11789 } 11790 un->un_density_known = 0; 11791 un->un_pos.eof = ST_NO_EOF; 11792 un->un_pos.blkno = 0; 11793 un->un_lastop = new_lastop = ST_OP_CTL; 11794 break; 11795 case SCMD_ERASE: 11796 un->un_pos.eof = ST_NO_EOF; 11797 un->un_pos.blkno = 0; 11798 un->un_pos.fileno = 0; 11799 un->un_pos.lgclblkno = 0; 11800 if (un->un_pos.pmode != legacy) 11801 un->un_pos.pmode = legacy; 11802 new_lastop = ST_OP_CTL; 11803 break; 11804 case SCMD_RESERVE: 11805 un->un_rsvd_status |= ST_RESERVE; 11806 un->un_rsvd_status &= 11807 ~(ST_RELEASE | ST_LOST_RESERVE | 11808 ST_RESERVATION_CONFLICT | ST_INITIATED_RESET); 11809 new_lastop = ST_OP_CTL; 11810 break; 11811 case SCMD_RELEASE: 11812 un->un_rsvd_status |= ST_RELEASE; 11813 un->un_rsvd_status &= 11814 ~(ST_RESERVE | ST_LOST_RESERVE | 11815 ST_RESERVATION_CONFLICT | ST_INITIATED_RESET); 11816 new_lastop = ST_OP_CTL; 11817 break; 11818 case SCMD_PERSISTENT_RESERVE_IN: 11819 ST_DEBUG6(ST_DEVINFO, st_label, CE_WARN, 11820 "PGR_IN command\n"); 11821 new_lastop = ST_OP_CTL; 11822 break; 11823 case SCMD_PERSISTENT_RESERVE_OUT: 11824 switch (sp->pkt_cdbp[1] & ST_SA_MASK) { 11825 case ST_SA_SCSI3_RESERVE: 11826 case ST_SA_SCSI3_PREEMPT: 11827 case ST_SA_SCSI3_PREEMPTANDABORT: 11828 un->un_rsvd_status |= 11829 (ST_APPLICATION_RESERVATIONS | ST_RESERVE); 11830 un->un_rsvd_status &= ~(ST_RELEASE | 11831 ST_LOST_RESERVE | ST_RESERVATION_CONFLICT | 11832 ST_INITIATED_RESET); 11833 ST_DEBUG6(ST_DEVINFO, st_label, CE_WARN, 11834 "PGR Reserve and set: entering" 11835 " ST_APPLICATION_RESERVATIONS mode"); 11836 break; 11837 case ST_SA_SCSI3_REGISTER: 11838 ST_DEBUG6(ST_DEVINFO, st_label, CE_WARN, 11839 "PGR Reserve register key"); 11840 un->un_rsvd_status |= ST_INIT_RESERVE; 11841 break; 11842 case ST_SA_SCSI3_CLEAR: 11843 un->un_rsvd_status &= ~ST_INIT_RESERVE; 11844 /* FALLTHROUGH */ 11845 case ST_SA_SCSI3_RELEASE: 11846 un->un_rsvd_status &= 11847 ~(ST_APPLICATION_RESERVATIONS | ST_RESERVE | 11848 ST_LOST_RESERVE | ST_RESERVATION_CONFLICT | 11849 ST_INITIATED_RESET); 11850 un->un_rsvd_status |= ST_RELEASE; 11851 ST_DEBUG6(ST_DEVINFO, st_label, CE_WARN, 11852 "PGR Release and reset: exiting" 11853 " ST_APPLICATION_RESERVATIONS mode"); 11854 break; 11855 } 11856 new_lastop = ST_OP_CTL; 11857 break; 11858 case SCMD_TEST_UNIT_READY: 11859 case SCMD_READ_BLKLIM: 11860 case SCMD_REQUEST_SENSE: 11861 case SCMD_INQUIRY: 11862 case SCMD_RECOVER_BUF: 11863 case SCMD_MODE_SELECT: 11864 case SCMD_MODE_SENSE: 11865 case SCMD_DOORLOCK: 11866 case SCMD_READ_BUFFER: 11867 case SCMD_REPORT_DENSITIES: 11868 case SCMD_LOG_SELECT_G1: 11869 case SCMD_LOG_SENSE_G1: 11870 case SCMD_REPORT_LUNS: 11871 case SCMD_READ_ATTRIBUTE: 11872 case SCMD_WRITE_ATTRIBUTE: 11873 case SCMD_SVC_ACTION_IN_G5: 11874 new_lastop = ST_OP_CTL; 11875 break; 11876 case SCMD_READ_POSITION: 11877 new_lastop = ST_OP_CTL; 11878 /* 11879 * Only if the buf used was un_sbufp. 11880 * Among other things the prevents read positions used 11881 * as part of error recovery from messing up our 11882 * current position as they will use un_recov_buf. 11883 */ 11884 if (USCSI_CMD(bp)) { 11885 (void) st_get_read_pos(un, bp); 11886 } 11887 break; 11888 case SCMD_LOCATE: 11889 case SCMD_LOCATE_G4: 11890 /* Locate makes position mode no longer legacy */ 11891 un->un_lastop = new_lastop = ST_OP_CTL; 11892 break; 11893 case SCMD_MAINTENANCE_IN: 11894 switch (sp->pkt_cdbp[1]) { 11895 case SSVC_ACTION_GET_SUPPORTED_OPERATIONS: 11896 case SSVC_ACTION_SET_TARGET_PORT_GROUPS: 11897 new_lastop = ST_OP_CTL; 11898 break; 11899 } 11900 if (new_lastop != ST_OP_NIL) { 11901 break; 11902 } 11903 default: 11904 /* 11905 * Unknown command, If was USCSI and USCSI_SILENT 11906 * flag was not set, set position to unknown. 11907 */ 11908 if ((((ucmd = BP_UCMD(bp)) != NULL) && 11909 (ucmd->uscsi_flags & USCSI_SILENT) == 0)) { 11910 ST_DEBUG2(ST_DEVINFO, st_label, CE_WARN, 11911 "unknown cmd 0x%X caused loss of state\n", 11912 cmd); 11913 } else { 11914 /* 11915 * keep the old agreement to allow unknown 11916 * commands with the USCSI_SILENT set. 11917 * This prevents ASSERT below. 11918 */ 11919 new_lastop = ST_OP_CTL; 11920 break; 11921 } 11922 /* FALLTHROUGH */ 11923 case SCMD_WRITE_BUFFER: /* Writes new firmware to device */ 11924 un->un_pos.pmode = invalid; 11925 un->un_lastop = new_lastop = ST_OP_CTL; 11926 break; 11927 } 11928 11929 /* new_lastop should have been changed */ 11930 ASSERT(new_lastop != ST_OP_NIL); 11931 11932 /* If un_lastop should copy new_lastop */ 11933 if (((un->un_lastop == ST_OP_WRITE) || 11934 (un->un_lastop == ST_OP_WEOF)) && 11935 new_lastop != ST_OP_CTL) { 11936 un->un_lastop = new_lastop; 11937 } 11938 } 11939 11940 /* 11941 * In the st driver we have a logical and physical file position. 11942 * Under BSD behavior, when you get a zero read, the logical position 11943 * is before the filemark but after the last record of the file. 11944 * The physical position is after the filemark. MTIOCGET should always 11945 * return the logical file position. 11946 * 11947 * The next read gives a silent skip to the next file. 11948 * Under SVR4, the logical file position remains before the filemark 11949 * until the file is closed or a space operation is performed. 11950 * Hence set err_resid and err_file before changing fileno if case 11951 * BSD Behaviour. 11952 */ 11953 un->un_err_resid = bp->b_resid; 11954 COPY_POS(&un->un_err_pos, &un->un_pos); 11955 11956 11957 /* 11958 * If we've seen a filemark via the last read operation 11959 * advance the file counter, but mark things such that 11960 * the next read operation gets a zero count. We have 11961 * to put this here to handle the case of sitting right 11962 * at the end of a tape file having seen the file mark, 11963 * but the tape is closed and then re-opened without 11964 * any further i/o. That is, the position information 11965 * must be updated before a close. 11966 */ 11967 11968 if (un->un_lastop == ST_OP_READ && un->un_pos.eof == ST_EOF_PENDING) { 11969 /* 11970 * If we're a 1/2" tape, and we get a filemark 11971 * right on block 0, *AND* we were not in the 11972 * first file on the tape, and we've hit logical EOM. 11973 * We'll mark the state so that later we do the 11974 * right thing (in st_close(), st_strategy() or 11975 * st_ioctl()). 11976 * 11977 */ 11978 if ((un->un_dp->options & ST_REEL) && 11979 !(un->un_dp->options & ST_READ_IGNORE_EOFS) && 11980 un->un_pos.blkno == 0 && un->un_pos.fileno > 0) { 11981 un->un_pos.eof = ST_EOT_PENDING; 11982 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 11983 "eot pending\n"); 11984 un->un_pos.fileno++; 11985 un->un_pos.blkno = 0; 11986 } else if (BSD_BEHAVIOR) { 11987 /* 11988 * If the read of the filemark was a side effect 11989 * of reading some blocks (i.e., data was actually 11990 * read), then the EOF mark is pending and the 11991 * bump into the next file awaits the next read 11992 * operation (which will return a zero count), or 11993 * a close or a space operation, else the bump 11994 * into the next file occurs now. 11995 */ 11996 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 11997 "resid=%lx, bcount=%lx\n", 11998 bp->b_resid, bp->b_bcount); 11999 12000 if (bp->b_resid != bp->b_bcount) { 12001 un->un_pos.eof = ST_EOF; 12002 } else { 12003 un->un_silent_skip = 1; 12004 un->un_pos.eof = ST_NO_EOF; 12005 un->un_pos.fileno++; 12006 un->un_pos.lgclblkno++; 12007 un->un_save_blkno = un->un_pos.blkno; 12008 un->un_pos.blkno = 0; 12009 } 12010 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 12011 "eof of file %d, eof=%d\n", 12012 un->un_pos.fileno, un->un_pos.eof); 12013 } else if (SVR4_BEHAVIOR) { 12014 /* 12015 * If the read of the filemark was a side effect 12016 * of reading some blocks (i.e., data was actually 12017 * read), then the next read should return 0 12018 */ 12019 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 12020 "resid=%lx, bcount=%lx\n", 12021 bp->b_resid, bp->b_bcount); 12022 if (bp->b_resid == bp->b_bcount) { 12023 un->un_pos.eof = ST_EOF; 12024 } 12025 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 12026 "eof of file=%d, eof=%d\n", 12027 un->un_pos.fileno, un->un_pos.eof); 12028 } 12029 } 12030 } 12031 12032 /* 12033 * set the correct un_errno, to take corner cases into consideration 12034 */ 12035 static void 12036 st_set_pe_errno(struct scsi_tape *un) 12037 { 12038 ST_FUNC(ST_DEVINFO, st_set_pe_errno); 12039 12040 ASSERT(mutex_owned(ST_MUTEX)); 12041 12042 /* if errno is already set, don't reset it */ 12043 if (un->un_errno) 12044 return; 12045 12046 /* here un_errno == 0 */ 12047 /* 12048 * if the last transfer before flushing all the 12049 * waiting I/O's, was 0 (resid = count), then we 12050 * want to give the user an error on all the rest, 12051 * so here. If there was a transfer, we set the 12052 * resid and counts to 0, and let it drop through, 12053 * giving a zero return. the next I/O will then 12054 * give an error. 12055 */ 12056 if (un->un_last_resid == un->un_last_count) { 12057 switch (un->un_pos.eof) { 12058 case ST_EOM: 12059 un->un_errno = ENOMEM; 12060 break; 12061 case ST_EOT: 12062 case ST_EOF: 12063 un->un_errno = EIO; 12064 break; 12065 } 12066 } else { 12067 /* 12068 * we know they did not have a zero, so make 12069 * sure they get one 12070 */ 12071 un->un_last_resid = un->un_last_count = 0; 12072 } 12073 } 12074 12075 12076 /* 12077 * send in a marker pkt to terminate flushing of commands by BBA (via 12078 * flush-on-errors) property. The HBA will always return TRAN_ACCEPT 12079 */ 12080 static void 12081 st_hba_unflush(struct scsi_tape *un) 12082 { 12083 ST_FUNC(ST_DEVINFO, st_hba_unflush); 12084 12085 ASSERT(mutex_owned(ST_MUTEX)); 12086 12087 if (!un->un_flush_on_errors) 12088 return; 12089 12090 #ifdef FLUSH_ON_ERRORS 12091 12092 if (!un->un_mkr_pkt) { 12093 un->un_mkr_pkt = scsi_init_pkt(ROUTE, NULL, (struct buf *)NULL, 12094 NULL, 0, 0, 0, SLEEP_FUNC, NULL); 12095 12096 /* we slept, so it must be there */ 12097 pkt->pkt_flags |= FLAG_FLUSH_MARKER; 12098 } 12099 12100 st_transport(un, un->un_mkr_pkt); 12101 #endif 12102 } 12103 12104 static char * 12105 st_print_scsi_cmd(char cmd) 12106 { 12107 char tmp[64]; 12108 char *cpnt; 12109 12110 cpnt = scsi_cmd_name(cmd, scsi_cmds, tmp); 12111 /* tmp goes out of scope on return and caller sees garbage */ 12112 if (cpnt == tmp) { 12113 cpnt = "Unknown Command"; 12114 } 12115 return (cpnt); 12116 } 12117 12118 static void 12119 st_print_cdb(dev_info_t *dip, char *label, uint_t level, 12120 char *title, char *cdb) 12121 { 12122 int len = scsi_cdb_size[CDB_GROUPID(cdb[0])]; 12123 char buf[256]; 12124 struct scsi_tape *un; 12125 int instance = ddi_get_instance(dip); 12126 12127 un = ddi_get_soft_state(st_state, instance); 12128 12129 ST_FUNC(dip, st_print_cdb); 12130 12131 /* force one line output so repeated commands are printed once */ 12132 if ((st_debug & 0x180) == 0x100) { 12133 scsi_log(dip, label, level, "node %s cmd %s\n", 12134 st_dev_name(un->un_dev), st_print_scsi_cmd(*cdb)); 12135 return; 12136 } 12137 12138 /* force one line output so repeated CDB's are printed once */ 12139 if ((st_debug & 0x180) == 0x80) { 12140 st_clean_print(dip, label, level, NULL, cdb, len); 12141 } else { 12142 (void) sprintf(buf, "%s for cmd(%s)", title, 12143 st_print_scsi_cmd(*cdb)); 12144 st_clean_print(dip, label, level, buf, cdb, len); 12145 } 12146 } 12147 12148 static void 12149 st_clean_print(dev_info_t *dev, char *label, uint_t level, 12150 char *title, char *data, int len) 12151 { 12152 int i; 12153 int c; 12154 char *format; 12155 char buf[256]; 12156 uchar_t byte; 12157 12158 ST_FUNC(dev, st_clean_print); 12159 12160 12161 if (title) { 12162 (void) sprintf(buf, "%s:\n", title); 12163 scsi_log(dev, label, level, "%s", buf); 12164 level = CE_CONT; 12165 } 12166 12167 for (i = 0; i < len; ) { 12168 buf[0] = 0; 12169 for (c = 0; c < 8 && i < len; c++, i++) { 12170 byte = (uchar_t)data[i]; 12171 if (byte < 0x10) 12172 format = "0x0%x "; 12173 else 12174 format = "0x%x "; 12175 (void) sprintf(&buf[(int)strlen(buf)], format, byte); 12176 } 12177 (void) sprintf(&buf[(int)strlen(buf)], "\n"); 12178 12179 scsi_log(dev, label, level, "%s\n", buf); 12180 level = CE_CONT; 12181 } 12182 } 12183 12184 /* 12185 * Conditionally enabled debugging 12186 */ 12187 #ifdef STDEBUG 12188 static void 12189 st_debug_cmds(struct scsi_tape *un, int com, int count, int wait) 12190 { 12191 char tmpbuf[64]; 12192 12193 ST_FUNC(ST_DEVINFO, st_debug_cmds); 12194 12195 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 12196 "cmd=%s count=0x%x (%d) %ssync\n", 12197 scsi_cmd_name(com, scsi_cmds, tmpbuf), 12198 count, count, 12199 wait == ASYNC_CMD ? "a" : ""); 12200 } 12201 #endif /* STDEBUG */ 12202 12203 /* 12204 * Returns pointer to name of minor node name of device 'dev'. 12205 */ 12206 static char * 12207 st_dev_name(dev_t dev) 12208 { 12209 struct scsi_tape *un; 12210 const char density[] = { 'l', 'm', 'h', 'c' }; 12211 static char name[32]; 12212 minor_t minor; 12213 int instance; 12214 int nprt = 0; 12215 12216 minor = getminor(dev); 12217 instance = ((minor & 0xff80) >> 5) | (minor & 3); 12218 un = ddi_get_soft_state(st_state, instance); 12219 if (un) { 12220 ST_FUNC(ST_DEVINFO, st_dev_name); 12221 } 12222 12223 name[nprt] = density[(minor & MT_DENSITY_MASK) >> 3]; 12224 12225 if (minor & MT_BSD) { 12226 name[++nprt] = 'b'; 12227 } 12228 12229 if (minor & MT_NOREWIND) { 12230 name[++nprt] = 'n'; 12231 } 12232 12233 /* NULL terminator */ 12234 name[++nprt] = 0; 12235 12236 return (name); 12237 } 12238 12239 /* 12240 * Soft error reporting, so far unique to each drive 12241 * 12242 * Currently supported: exabyte and DAT soft error reporting 12243 */ 12244 static int 12245 st_report_exabyte_soft_errors(dev_t dev, int flag) 12246 { 12247 uchar_t *sensep; 12248 int amt; 12249 int rval = 0; 12250 char cdb[CDB_GROUP0], *c = cdb; 12251 struct uscsi_cmd *com; 12252 12253 GET_SOFT_STATE(dev); 12254 12255 ST_FUNC(ST_DEVINFO, st_report_exabyte_soft_errors); 12256 12257 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 12258 "st_report_exabyte_soft_errors(dev = 0x%lx, flag = %d)\n", 12259 dev, flag); 12260 12261 ASSERT(mutex_owned(ST_MUTEX)); 12262 12263 com = kmem_zalloc(sizeof (*com), KM_SLEEP); 12264 sensep = kmem_zalloc(TAPE_SENSE_LENGTH, KM_SLEEP); 12265 12266 *c++ = SCMD_REQUEST_SENSE; 12267 *c++ = 0; 12268 *c++ = 0; 12269 *c++ = 0; 12270 *c++ = TAPE_SENSE_LENGTH; 12271 /* 12272 * set CLRCNT (byte 5, bit 7 which clears the error counts) 12273 */ 12274 *c = (char)0x80; 12275 12276 com->uscsi_cdb = cdb; 12277 com->uscsi_cdblen = CDB_GROUP0; 12278 com->uscsi_bufaddr = (caddr_t)sensep; 12279 com->uscsi_buflen = TAPE_SENSE_LENGTH; 12280 com->uscsi_flags = USCSI_DIAGNOSE | USCSI_SILENT | USCSI_READ; 12281 com->uscsi_timeout = un->un_dp->non_motion_timeout; 12282 12283 rval = st_uscsi_cmd(un, com, FKIOCTL); 12284 if (rval || com->uscsi_status) { 12285 goto done; 12286 } 12287 12288 /* 12289 * was there enough data? 12290 */ 12291 amt = (int)TAPE_SENSE_LENGTH - com->uscsi_resid; 12292 12293 if ((amt >= 19) && un->un_kbytes_xferred) { 12294 uint_t count, error_rate; 12295 uint_t rate; 12296 12297 if (sensep[21] & CLN) { 12298 scsi_log(ST_DEVINFO, st_label, CE_WARN, 12299 "Periodic head cleaning required"); 12300 } 12301 if (un->un_kbytes_xferred < (EXABYTE_MIN_TRANSFER/ONE_K)) { 12302 goto done; 12303 } 12304 /* 12305 * check if soft error reporting needs to be done. 12306 */ 12307 count = sensep[16] << 16 | sensep[17] << 8 | sensep[18]; 12308 count &= 0xffffff; 12309 error_rate = (count * 100)/un->un_kbytes_xferred; 12310 12311 #ifdef STDEBUG 12312 if (st_soft_error_report_debug) { 12313 scsi_log(ST_DEVINFO, st_label, CE_NOTE, 12314 "Exabyte Soft Error Report:\n"); 12315 scsi_log(ST_DEVINFO, st_label, CE_CONT, 12316 "read/write error counter: %d\n", count); 12317 scsi_log(ST_DEVINFO, st_label, CE_CONT, 12318 "number of bytes transferred: %dK\n", 12319 un->un_kbytes_xferred); 12320 scsi_log(ST_DEVINFO, st_label, CE_CONT, 12321 "error_rate: %d%%\n", error_rate); 12322 12323 if (amt >= 22) { 12324 scsi_log(ST_DEVINFO, st_label, CE_CONT, 12325 "unit sense: 0x%b 0x%b 0x%b\n", 12326 sensep[19], SENSE_19_BITS, 12327 sensep[20], SENSE_20_BITS, 12328 sensep[21], SENSE_21_BITS); 12329 } 12330 if (amt >= 27) { 12331 scsi_log(ST_DEVINFO, st_label, CE_CONT, 12332 "tracking retry counter: %d\n", 12333 sensep[26]); 12334 scsi_log(ST_DEVINFO, st_label, CE_CONT, 12335 "read/write retry counter: %d\n", 12336 sensep[27]); 12337 } 12338 } 12339 #endif 12340 12341 if (flag & FWRITE) { 12342 rate = EXABYTE_WRITE_ERROR_THRESHOLD; 12343 } else { 12344 rate = EXABYTE_READ_ERROR_THRESHOLD; 12345 } 12346 if (error_rate >= rate) { 12347 scsi_log(ST_DEVINFO, st_label, CE_WARN, 12348 "Soft error rate (%d%%) during %s was too high", 12349 error_rate, 12350 ((flag & FWRITE) ? wrg_str : rdg_str)); 12351 scsi_log(ST_DEVINFO, st_label, CE_CONT, 12352 "Please, replace tape cartridge\n"); 12353 } 12354 } 12355 12356 done: 12357 kmem_free(com, sizeof (*com)); 12358 kmem_free(sensep, TAPE_SENSE_LENGTH); 12359 12360 if (rval != 0) { 12361 scsi_log(ST_DEVINFO, st_label, CE_WARN, 12362 "exabyte soft error reporting failed\n"); 12363 } 12364 return (rval); 12365 } 12366 12367 /* 12368 * this is very specific to Archive 4mm dat 12369 */ 12370 #define ONE_GIG (ONE_K * ONE_K * ONE_K) 12371 12372 static int 12373 st_report_dat_soft_errors(dev_t dev, int flag) 12374 { 12375 uchar_t *sensep; 12376 int amt, i; 12377 int rval = 0; 12378 char cdb[CDB_GROUP1], *c = cdb; 12379 struct uscsi_cmd *com; 12380 struct scsi_arq_status status; 12381 12382 GET_SOFT_STATE(dev); 12383 12384 ST_FUNC(ST_DEVINFO, st_report_dat_soft_errors); 12385 12386 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 12387 "st_report_dat_soft_errors(dev = 0x%lx, flag = %d)\n", dev, flag); 12388 12389 ASSERT(mutex_owned(ST_MUTEX)); 12390 12391 com = kmem_zalloc(sizeof (*com), KM_SLEEP); 12392 sensep = kmem_zalloc(LOG_SENSE_LENGTH, KM_SLEEP); 12393 12394 *c++ = SCMD_LOG_SENSE_G1; 12395 *c++ = 0; 12396 *c++ = (flag & FWRITE) ? 0x42 : 0x43; 12397 *c++ = 0; 12398 *c++ = 0; 12399 *c++ = 0; 12400 *c++ = 2; 12401 *c++ = 0; 12402 *c++ = (char)LOG_SENSE_LENGTH; 12403 *c = 0; 12404 com->uscsi_cdb = cdb; 12405 com->uscsi_cdblen = CDB_GROUP1; 12406 com->uscsi_bufaddr = (caddr_t)sensep; 12407 com->uscsi_buflen = LOG_SENSE_LENGTH; 12408 com->uscsi_rqlen = sizeof (status); 12409 com->uscsi_rqbuf = (caddr_t)&status; 12410 com->uscsi_flags = USCSI_DIAGNOSE | USCSI_RQENABLE | USCSI_READ; 12411 com->uscsi_timeout = un->un_dp->non_motion_timeout; 12412 rval = st_uscsi_cmd(un, com, FKIOCTL); 12413 if (rval) { 12414 scsi_log(ST_DEVINFO, st_label, CE_WARN, 12415 "DAT soft error reporting failed\n"); 12416 } 12417 if (rval || com->uscsi_status) { 12418 goto done; 12419 } 12420 12421 /* 12422 * was there enough data? 12423 */ 12424 amt = (int)LOG_SENSE_LENGTH - com->uscsi_resid; 12425 12426 if ((amt >= MIN_LOG_SENSE_LENGTH) && un->un_kbytes_xferred) { 12427 int total, retries, param_code; 12428 12429 total = -1; 12430 retries = -1; 12431 amt = sensep[3] + 4; 12432 12433 12434 #ifdef STDEBUG 12435 if (st_soft_error_report_debug) { 12436 (void) printf("logsense:"); 12437 for (i = 0; i < MIN_LOG_SENSE_LENGTH; i++) { 12438 if (i % 16 == 0) { 12439 (void) printf("\t\n"); 12440 } 12441 (void) printf(" %x", sensep[i]); 12442 } 12443 (void) printf("\n"); 12444 } 12445 #endif 12446 12447 /* 12448 * parse the param_codes 12449 */ 12450 if (sensep[0] == 2 || sensep[0] == 3) { 12451 for (i = 4; i < amt; i++) { 12452 param_code = (sensep[i++] << 8); 12453 param_code += sensep[i++]; 12454 i++; /* skip control byte */ 12455 if (param_code == 5) { 12456 if (sensep[i++] == 4) { 12457 total = (sensep[i++] << 24); 12458 total += (sensep[i++] << 16); 12459 total += (sensep[i++] << 8); 12460 total += sensep[i]; 12461 } 12462 } else if (param_code == 0x8007) { 12463 if (sensep[i++] == 2) { 12464 retries = sensep[i++] << 8; 12465 retries += sensep[i]; 12466 } 12467 } else { 12468 i += sensep[i]; 12469 } 12470 } 12471 } 12472 12473 /* 12474 * if the log sense returned valid numbers then determine 12475 * the read and write error thresholds based on the amount of 12476 * data transferred 12477 */ 12478 12479 if (total > 0 && retries > 0) { 12480 short normal_retries = 0; 12481 ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, 12482 "total xferred (%s) =%x, retries=%x\n", 12483 ((flag & FWRITE) ? wrg_str : rdg_str), 12484 total, retries); 12485 12486 if (flag & FWRITE) { 12487 if (total <= 12488 WRITE_SOFT_ERROR_WARNING_THRESHOLD) { 12489 normal_retries = 12490 DAT_SMALL_WRITE_ERROR_THRESHOLD; 12491 } else { 12492 normal_retries = 12493 DAT_LARGE_WRITE_ERROR_THRESHOLD; 12494 } 12495 } else { 12496 if (total <= 12497 READ_SOFT_ERROR_WARNING_THRESHOLD) { 12498 normal_retries = 12499 DAT_SMALL_READ_ERROR_THRESHOLD; 12500 } else { 12501 normal_retries = 12502 DAT_LARGE_READ_ERROR_THRESHOLD; 12503 } 12504 } 12505 12506 ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, 12507 "normal retries=%d\n", normal_retries); 12508 12509 if (retries >= normal_retries) { 12510 scsi_log(ST_DEVINFO, st_label, CE_WARN, 12511 "Soft error rate (retries = %d) during " 12512 "%s was too high", retries, 12513 ((flag & FWRITE) ? wrg_str : rdg_str)); 12514 scsi_log(ST_DEVINFO, st_label, CE_CONT, 12515 "Periodic head cleaning required " 12516 "and/or replace tape cartridge\n"); 12517 } 12518 12519 } else if (total == -1 || retries == -1) { 12520 scsi_log(ST_DEVINFO, st_label, CE_WARN, 12521 "log sense parameter code does not make sense\n"); 12522 } 12523 } 12524 12525 /* 12526 * reset all values 12527 */ 12528 c = cdb; 12529 *c++ = SCMD_LOG_SELECT_G1; 12530 *c++ = 2; /* this resets all values */ 12531 *c++ = (char)0xc0; 12532 *c++ = 0; 12533 *c++ = 0; 12534 *c++ = 0; 12535 *c++ = 0; 12536 *c++ = 0; 12537 *c++ = 0; 12538 *c = 0; 12539 com->uscsi_bufaddr = NULL; 12540 com->uscsi_buflen = 0; 12541 com->uscsi_flags = USCSI_DIAGNOSE | USCSI_SILENT; 12542 rval = st_uscsi_cmd(un, com, FKIOCTL); 12543 if (rval) { 12544 scsi_log(ST_DEVINFO, st_label, CE_WARN, 12545 "DAT soft error reset failed\n"); 12546 } 12547 done: 12548 kmem_free(com, sizeof (*com)); 12549 kmem_free(sensep, LOG_SENSE_LENGTH); 12550 return (rval); 12551 } 12552 12553 static int 12554 st_report_soft_errors(dev_t dev, int flag) 12555 { 12556 GET_SOFT_STATE(dev); 12557 12558 ST_FUNC(ST_DEVINFO, st_report_soft_errors); 12559 12560 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 12561 "st_report_soft_errors(dev = 0x%lx, flag = %d)\n", dev, flag); 12562 12563 ASSERT(mutex_owned(ST_MUTEX)); 12564 12565 switch (un->un_dp->type) { 12566 case ST_TYPE_EXB8500: 12567 case ST_TYPE_EXABYTE: 12568 return (st_report_exabyte_soft_errors(dev, flag)); 12569 /*NOTREACHED*/ 12570 case ST_TYPE_PYTHON: 12571 return (st_report_dat_soft_errors(dev, flag)); 12572 /*NOTREACHED*/ 12573 default: 12574 un->un_dp->options &= ~ST_SOFT_ERROR_REPORTING; 12575 return (-1); 12576 } 12577 } 12578 12579 /* 12580 * persistent error routines 12581 */ 12582 12583 /* 12584 * enable persistent errors, and set the throttle appropriately, checking 12585 * for flush-on-errors capability 12586 */ 12587 static void 12588 st_turn_pe_on(struct scsi_tape *un) 12589 { 12590 ST_FUNC(ST_DEVINFO, st_turn_pe_on); 12591 12592 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, "st_pe_on\n"); 12593 ASSERT(mutex_owned(ST_MUTEX)); 12594 12595 un->un_persistence = 1; 12596 12597 /* 12598 * only use flush-on-errors if auto-request-sense and untagged-qing are 12599 * enabled. This will simplify the error handling for request senses 12600 */ 12601 12602 if (un->un_arq_enabled && un->un_untagged_qing) { 12603 uchar_t f_o_e; 12604 12605 mutex_exit(ST_MUTEX); 12606 f_o_e = (scsi_ifsetcap(ROUTE, "flush-on-errors", 1, 1) == 1) ? 12607 1 : 0; 12608 mutex_enter(ST_MUTEX); 12609 12610 un->un_flush_on_errors = f_o_e; 12611 } else { 12612 un->un_flush_on_errors = 0; 12613 } 12614 12615 if (un->un_flush_on_errors) 12616 un->un_max_throttle = (uchar_t)st_max_throttle; 12617 else 12618 un->un_max_throttle = 1; 12619 12620 if (un->un_dp->options & ST_RETRY_ON_RECOVERED_DEFERRED_ERROR) 12621 un->un_max_throttle = 1; 12622 12623 /* this will send a marker pkt */ 12624 st_clear_pe(un); 12625 } 12626 12627 /* 12628 * This turns persistent errors permanently off 12629 */ 12630 static void 12631 st_turn_pe_off(struct scsi_tape *un) 12632 { 12633 ST_FUNC(ST_DEVINFO, st_turn_pe_off); 12634 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, "st_pe_off\n"); 12635 ASSERT(mutex_owned(ST_MUTEX)); 12636 12637 /* turn it off for good */ 12638 un->un_persistence = 0; 12639 12640 /* this will send a marker pkt */ 12641 st_clear_pe(un); 12642 12643 /* turn off flush on error capability, if enabled */ 12644 if (un->un_flush_on_errors) { 12645 mutex_exit(ST_MUTEX); 12646 (void) scsi_ifsetcap(ROUTE, "flush-on-errors", 0, 1); 12647 mutex_enter(ST_MUTEX); 12648 } 12649 12650 12651 un->un_flush_on_errors = 0; 12652 } 12653 12654 /* 12655 * This clear persistent errors, allowing more commands through, and also 12656 * sending a marker packet. 12657 */ 12658 static void 12659 st_clear_pe(struct scsi_tape *un) 12660 { 12661 ST_FUNC(ST_DEVINFO, st_clear_pe); 12662 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, "st_pe_clear\n"); 12663 ASSERT(mutex_owned(ST_MUTEX)); 12664 12665 un->un_persist_errors = 0; 12666 un->un_throttle = un->un_last_throttle = 1; 12667 un->un_errno = 0; 12668 st_hba_unflush(un); 12669 } 12670 12671 /* 12672 * This will flag persistent errors, shutting everything down, if the 12673 * application had enabled persistent errors via MTIOCPERSISTENT 12674 */ 12675 static void 12676 st_set_pe_flag(struct scsi_tape *un) 12677 { 12678 ST_FUNC(ST_DEVINFO, st_set_pe_flag); 12679 ASSERT(mutex_owned(ST_MUTEX)); 12680 12681 if (un->un_persistence) { 12682 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, "st_pe_flag\n"); 12683 un->un_persist_errors = 1; 12684 un->un_throttle = un->un_last_throttle = 0; 12685 cv_broadcast(&un->un_sbuf_cv); 12686 } 12687 } 12688 12689 static int 12690 st_do_reserve(struct scsi_tape *un) 12691 { 12692 int rval; 12693 int was_lost = un->un_rsvd_status & ST_LOST_RESERVE; 12694 12695 ST_FUNC(ST_DEVINFO, st_do_reserve); 12696 12697 /* 12698 * Issue a Throw-Away reserve command to clear the 12699 * check condition. 12700 * If the current behaviour of reserve/release is to 12701 * hold reservation across opens , and if a Bus reset 12702 * has been issued between opens then this command 12703 * would set the ST_LOST_RESERVE flags in rsvd_status. 12704 * In this case return an EACCES so that user knows that 12705 * reservation has been lost in between opens. 12706 * If this error is not returned and we continue with 12707 * successful open , then user may think position of the 12708 * tape is still the same but inreality we would rewind the 12709 * tape and continue from BOT. 12710 */ 12711 rval = st_reserve_release(un, ST_RESERVE, st_uscsi_cmd); 12712 if (rval) { 12713 if ((un->un_rsvd_status & ST_LOST_RESERVE_BETWEEN_OPENS) == 12714 ST_LOST_RESERVE_BETWEEN_OPENS) { 12715 un->un_rsvd_status &= ~(ST_LOST_RESERVE | ST_RESERVE); 12716 un->un_errno = EACCES; 12717 return (EACCES); 12718 } 12719 rval = st_reserve_release(un, ST_RESERVE, st_uscsi_cmd); 12720 } 12721 if (rval == 0) { 12722 un->un_rsvd_status |= ST_INIT_RESERVE; 12723 } 12724 if (was_lost) { 12725 un->un_running.pmode = invalid; 12726 } 12727 12728 return (rval); 12729 } 12730 12731 static int 12732 st_check_cdb_for_need_to_reserve(struct scsi_tape *un, uchar_t *cdb) 12733 { 12734 int rval; 12735 cmd_attribute const *attrib; 12736 12737 ST_FUNC(ST_DEVINFO, st_check_cdb_for_need_to_reserve); 12738 12739 /* 12740 * If already reserved no need to do it again. 12741 * Also if Reserve and Release are disabled Just return. 12742 */ 12743 if ((un->un_rsvd_status & (ST_APPLICATION_RESERVATIONS)) || 12744 ((un->un_rsvd_status & (ST_RESERVE | ST_LOST_RESERVE)) == 12745 ST_RESERVE) || (un->un_dp->options & ST_NO_RESERVE_RELEASE)) { 12746 ST_DEBUG6(ST_DEVINFO, st_label, CE_NOTE, 12747 "st_check_cdb_for_need_to_reserve() reserve unneeded %s", 12748 st_print_scsi_cmd((uchar_t)cdb[0])); 12749 return (0); 12750 } 12751 12752 /* See if command is on the list */ 12753 attrib = st_lookup_cmd_attribute(cdb[0]); 12754 12755 if (attrib == NULL) { 12756 rval = 1; /* Not found, when in doubt reserve */ 12757 } else if ((attrib->requires_reserve) != 0) { 12758 rval = 1; 12759 } else if ((attrib->reserve_byte) != 0) { 12760 /* 12761 * cmd is on list. 12762 * if byte is zero always allowed. 12763 */ 12764 rval = 1; 12765 } else if (((cdb[attrib->reserve_byte]) & 12766 (attrib->reserve_mask)) != 0) { 12767 rval = 1; 12768 } else { 12769 rval = 0; 12770 } 12771 12772 if (rval) { 12773 ST_DEBUG6(ST_DEVINFO, st_label, CE_NOTE, 12774 "Command %s requires reservation", 12775 st_print_scsi_cmd(cdb[0])); 12776 12777 rval = st_do_reserve(un); 12778 } 12779 12780 return (rval); 12781 } 12782 12783 static int 12784 st_check_cmd_for_need_to_reserve(struct scsi_tape *un, uchar_t cmd, int cnt) 12785 { 12786 int rval; 12787 cmd_attribute const *attrib; 12788 12789 ST_FUNC(ST_DEVINFO, st_check_cmd_for_need_to_reserve); 12790 12791 if ((un->un_rsvd_status & (ST_APPLICATION_RESERVATIONS)) || 12792 ((un->un_rsvd_status & (ST_RESERVE | ST_LOST_RESERVE)) == 12793 ST_RESERVE) || (un->un_dp->options & ST_NO_RESERVE_RELEASE)) { 12794 ST_DEBUG6(ST_DEVINFO, st_label, CE_NOTE, 12795 "st_check_cmd_for_need_to_reserve() reserve unneeded %s", 12796 st_print_scsi_cmd(cmd)); 12797 return (0); 12798 } 12799 12800 /* search for this command on the list */ 12801 attrib = st_lookup_cmd_attribute(cmd); 12802 12803 if (attrib == NULL) { 12804 rval = 1; /* Not found, when in doubt reserve */ 12805 } else if ((attrib->requires_reserve) != 0) { 12806 rval = 1; 12807 } else if ((attrib->reserve_byte) != 0) { 12808 /* 12809 * cmd is on list. 12810 * if byte is zero always allowed. 12811 */ 12812 rval = 1; 12813 } else if (((attrib->reserve_mask) & cnt) != 0) { 12814 rval = 1; 12815 } else { 12816 rval = 0; 12817 } 12818 12819 if (rval) { 12820 ST_DEBUG6(ST_DEVINFO, st_label, CE_NOTE, 12821 "Cmd %s requires reservation", st_print_scsi_cmd(cmd)); 12822 12823 rval = st_do_reserve(un); 12824 } 12825 12826 return (rval); 12827 } 12828 12829 static int 12830 st_reserve_release(struct scsi_tape *un, int cmd, ubufunc_t ubf) 12831 { 12832 struct uscsi_cmd uscsi_cmd; 12833 int rval; 12834 char cdb[CDB_GROUP0]; 12835 struct scsi_arq_status stat; 12836 12837 12838 12839 ST_FUNC(ST_DEVINFO, st_reserve_release); 12840 12841 ASSERT(mutex_owned(ST_MUTEX)); 12842 12843 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 12844 "st_reserve_release: %s \n", 12845 (cmd == ST_RELEASE)? "Releasing":"Reserving"); 12846 12847 bzero(&cdb, CDB_GROUP0); 12848 if (cmd == ST_RELEASE) { 12849 cdb[0] = SCMD_RELEASE; 12850 } else { 12851 cdb[0] = SCMD_RESERVE; 12852 } 12853 bzero(&uscsi_cmd, sizeof (struct uscsi_cmd)); 12854 uscsi_cmd.uscsi_flags = USCSI_WRITE | USCSI_RQENABLE; 12855 uscsi_cmd.uscsi_cdb = cdb; 12856 uscsi_cmd.uscsi_cdblen = CDB_GROUP0; 12857 uscsi_cmd.uscsi_timeout = un->un_dp->non_motion_timeout; 12858 uscsi_cmd.uscsi_rqbuf = (caddr_t)&stat; 12859 uscsi_cmd.uscsi_rqlen = sizeof (stat); 12860 12861 rval = ubf(un, &uscsi_cmd, FKIOCTL); 12862 12863 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 12864 "st_reserve_release: rval(1)=%d\n", rval); 12865 12866 if (rval) { 12867 if (uscsi_cmd.uscsi_status == STATUS_RESERVATION_CONFLICT) { 12868 rval = EACCES; 12869 } 12870 /* 12871 * dynamically turn off reserve/release support 12872 * in case of drives which do not support 12873 * reserve/release command(ATAPI drives). 12874 */ 12875 if (un->un_status == KEY_ILLEGAL_REQUEST) { 12876 if (un->un_dp->options & ST_NO_RESERVE_RELEASE) { 12877 un->un_dp->options |= ST_NO_RESERVE_RELEASE; 12878 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 12879 "Tape unit does not support " 12880 "reserve/release \n"); 12881 } 12882 rval = 0; 12883 } 12884 } 12885 return (rval); 12886 } 12887 12888 static int 12889 st_take_ownership(struct scsi_tape *un, ubufunc_t ubf) 12890 { 12891 int rval; 12892 12893 ST_FUNC(ST_DEVINFO, st_take_ownership); 12894 12895 ASSERT(mutex_owned(ST_MUTEX)); 12896 12897 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 12898 "st_take_ownership: Entering ...\n"); 12899 12900 12901 rval = st_reserve_release(un, ST_RESERVE, ubf); 12902 /* 12903 * XXX -> Should reset be done only if we get EACCES. 12904 * . 12905 */ 12906 if (rval) { 12907 if (st_reset(un, RESET_LUN) == 0) { 12908 return (EIO); 12909 } 12910 un->un_rsvd_status &= 12911 ~(ST_LOST_RESERVE | ST_RESERVATION_CONFLICT); 12912 12913 mutex_exit(ST_MUTEX); 12914 delay(drv_usectohz(ST_RESERVATION_DELAY)); 12915 mutex_enter(ST_MUTEX); 12916 /* 12917 * remove the check condition. 12918 */ 12919 (void) st_reserve_release(un, ST_RESERVE, ubf); 12920 rval = st_reserve_release(un, ST_RESERVE, ubf); 12921 if (rval != 0) { 12922 if ((st_reserve_release(un, ST_RESERVE, ubf)) 12923 != 0) { 12924 rval = (un->un_rsvd_status & 12925 ST_RESERVATION_CONFLICT) ? EACCES : EIO; 12926 return (rval); 12927 } 12928 } 12929 /* 12930 * Set tape state to ST_STATE_OFFLINE , in case if 12931 * the user wants to continue and start using 12932 * the tape. 12933 */ 12934 un->un_state = ST_STATE_OFFLINE; 12935 un->un_rsvd_status |= ST_INIT_RESERVE; 12936 } 12937 return (rval); 12938 } 12939 12940 static int 12941 st_create_errstats(struct scsi_tape *un, int instance) 12942 { 12943 char kstatname[KSTAT_STRLEN]; 12944 12945 ST_FUNC(ST_DEVINFO, st_create_errstats); 12946 12947 /* 12948 * Create device error kstats 12949 */ 12950 12951 if (un->un_errstats == (kstat_t *)0) { 12952 (void) sprintf(kstatname, "st%d,err", instance); 12953 un->un_errstats = kstat_create("sterr", instance, kstatname, 12954 "device_error", KSTAT_TYPE_NAMED, 12955 sizeof (struct st_errstats) / sizeof (kstat_named_t), 12956 KSTAT_FLAG_PERSISTENT); 12957 12958 if (un->un_errstats) { 12959 struct st_errstats *stp; 12960 12961 stp = (struct st_errstats *)un->un_errstats->ks_data; 12962 kstat_named_init(&stp->st_softerrs, "Soft Errors", 12963 KSTAT_DATA_ULONG); 12964 kstat_named_init(&stp->st_harderrs, "Hard Errors", 12965 KSTAT_DATA_ULONG); 12966 kstat_named_init(&stp->st_transerrs, "Transport Errors", 12967 KSTAT_DATA_ULONG); 12968 kstat_named_init(&stp->st_vid, "Vendor", 12969 KSTAT_DATA_CHAR); 12970 kstat_named_init(&stp->st_pid, "Product", 12971 KSTAT_DATA_CHAR); 12972 kstat_named_init(&stp->st_revision, "Revision", 12973 KSTAT_DATA_CHAR); 12974 kstat_named_init(&stp->st_serial, "Serial No", 12975 KSTAT_DATA_CHAR); 12976 un->un_errstats->ks_private = un; 12977 un->un_errstats->ks_update = nulldev; 12978 kstat_install(un->un_errstats); 12979 /* 12980 * Fill in the static data 12981 */ 12982 (void) strncpy(&stp->st_vid.value.c[0], 12983 ST_INQUIRY->inq_vid, 8); 12984 /* 12985 * XXX: Emulex MT-02 (and emulators) predates 12986 * SCSI-1 and has no vid & pid inquiry data. 12987 */ 12988 if (ST_INQUIRY->inq_len != 0) { 12989 (void) strncpy(&stp->st_pid.value.c[0], 12990 ST_INQUIRY->inq_pid, 16); 12991 (void) strncpy(&stp->st_revision.value.c[0], 12992 ST_INQUIRY->inq_revision, 4); 12993 (void) strncpy(&stp->st_serial.value.c[0], 12994 ST_INQUIRY->inq_serial, 12); 12995 } 12996 } 12997 } 12998 return (0); 12999 } 13000 13001 static int 13002 st_validate_tapemarks(struct scsi_tape *un, ubufunc_t ubf, tapepos_t *pos) 13003 { 13004 int rval; 13005 bufunc_t bf = (ubf == st_uscsi_rcmd) ? st_rcmd : st_cmd; 13006 13007 ST_FUNC(ST_DEVINFO, st_validate_tapemarks); 13008 13009 ASSERT(MUTEX_HELD(&un->un_sd->sd_mutex)); 13010 ASSERT(mutex_owned(ST_MUTEX)); 13011 13012 /* Can't restore an invalid position */ 13013 if (pos->pmode == invalid) { 13014 return (4); 13015 } 13016 13017 /* 13018 * Assumtions: 13019 * If a position was read and is in logical position mode. 13020 * If a drive supports read position it supports locate. 13021 * If the read position type is not NO_POS. even though 13022 * a read position make not have been attemped yet. 13023 * 13024 * The drive can locate to the position. 13025 */ 13026 if (pos->pmode == logical || un->un_read_pos_type != NO_POS) { 13027 /* 13028 * If position mode is logical or legacy mode try 13029 * to locate there as it is faster. 13030 * If it fails try the old way. 13031 */ 13032 scsi_log(ST_DEVINFO, st_label, CE_NOTE, 13033 "Restoring tape position to lgclblkbo=0x%"PRIx64"....", 13034 pos->lgclblkno); 13035 13036 if (st_logical_block_locate(un, st_uscsi_cmd, &un->un_pos, 13037 pos->lgclblkno, pos->partition) == 0) { 13038 /* Assume we are there copy rest of position back */ 13039 if (un->un_pos.lgclblkno == pos->lgclblkno) { 13040 COPY_POS(&un->un_pos, pos); 13041 } 13042 return (0); 13043 } 13044 13045 /* 13046 * If logical block locate failed to restore a logical 13047 * position, can't recover. 13048 */ 13049 if (pos->pmode == logical) { 13050 return (-1); 13051 } 13052 } 13053 13054 13055 scsi_log(ST_DEVINFO, st_label, CE_NOTE, 13056 "Restoring tape position at fileno=%x, blkno=%x....", 13057 pos->fileno, pos->blkno); 13058 13059 /* 13060 * Rewind ? Oh yeah, Fidelity has got the STK F/W changed 13061 * so as not to rewind tape on RESETS: Gee, Has life ever 13062 * been simple in tape land ? 13063 */ 13064 rval = bf(un, SCMD_REWIND, 0, SYNC_CMD); 13065 if (rval) { 13066 scsi_log(ST_DEVINFO, st_label, CE_WARN, 13067 "Failed to restore the last file and block position: In" 13068 " this state, Tape will be loaded at BOT during next open"); 13069 un->un_pos.pmode = invalid; 13070 return (rval); 13071 } 13072 13073 /* If the position was as the result of back space file */ 13074 if (pos->blkno > (INF / 2)) { 13075 /* Go one extra file forward */ 13076 pos->fileno++; 13077 /* Figure how many blocks to back into the previous file */ 13078 pos->blkno = -(INF - pos->blkno); 13079 } 13080 13081 /* Go to requested fileno */ 13082 if (pos->fileno) { 13083 rval = st_cmd(un, SCMD_SPACE, Fmk(pos->fileno), SYNC_CMD); 13084 if (rval) { 13085 scsi_log(ST_DEVINFO, st_label, CE_WARN, 13086 "Failed to restore the last file position: In this " 13087 " state, Tape will be loaded at BOT during next" 13088 " open %d", __LINE__); 13089 un->un_pos.pmode = invalid; 13090 pos->pmode = invalid; 13091 return (rval); 13092 } 13093 } 13094 13095 /* 13096 * If backing into a file we already did an extra file forward. 13097 * Now we have to back over the filemark to get to the end of 13098 * the previous file. The blkno has been ajusted to a negative 13099 * value so we will get to the expected location. 13100 */ 13101 if (pos->blkno) { 13102 rval = bf(un, SCMD_SPACE, Fmk(-1), SYNC_CMD); 13103 if (rval) { 13104 scsi_log(ST_DEVINFO, st_label, CE_WARN, 13105 "Failed to restore the last file position: In this " 13106 " state, Tape will be loaded at BOT during next" 13107 " open %d", __LINE__); 13108 un->un_pos.pmode = invalid; 13109 pos->pmode = invalid; 13110 return (rval); 13111 } 13112 } 13113 13114 /* 13115 * The position mode, block and fileno should be correct, 13116 * This updates eof and logical position information. 13117 */ 13118 un->un_pos.eof = pos->eof; 13119 un->un_pos.lgclblkno = pos->lgclblkno; 13120 13121 return (0); 13122 } 13123 13124 /* 13125 * check sense key, ASC, ASCQ in order to determine if the tape needs 13126 * to be ejected 13127 */ 13128 13129 static int 13130 st_check_asc_ascq(struct scsi_tape *un) 13131 { 13132 struct scsi_extended_sense *sensep = ST_RQSENSE; 13133 struct tape_failure_code *code; 13134 13135 ST_FUNC(ST_DEVINFO, st_check_asc_ascq); 13136 13137 for (code = st_tape_failure_code; code->key != 0xff; code++) { 13138 if ((code->key == sensep->es_key) && 13139 (code->add_code == sensep->es_add_code) && 13140 (code->qual_code == sensep->es_qual_code)) 13141 return (1); 13142 } 13143 return (0); 13144 } 13145 13146 /* 13147 * st_logpage_supported() sends a Log Sense command with 13148 * page code = 0 = Supported Log Pages Page to the device, 13149 * to see whether the page 'page' is supported. 13150 * Return values are: 13151 * -1 if the Log Sense command fails 13152 * 0 if page is not supported 13153 * 1 if page is supported 13154 */ 13155 13156 static int 13157 st_logpage_supported(struct scsi_tape *un, uchar_t page) 13158 { 13159 uchar_t *sp, *sensep; 13160 unsigned length; 13161 struct uscsi_cmd *com; 13162 struct scsi_arq_status status; 13163 int rval; 13164 char cdb[CDB_GROUP1] = { 13165 SCMD_LOG_SENSE_G1, 13166 0, 13167 SUPPORTED_LOG_PAGES_PAGE, 13168 0, 13169 0, 13170 0, 13171 0, 13172 0, 13173 (char)LOG_SENSE_LENGTH, 13174 0 13175 }; 13176 13177 ST_FUNC(ST_DEVINFO, st_logpage_supported); 13178 13179 ASSERT(mutex_owned(ST_MUTEX)); 13180 13181 com = kmem_zalloc(sizeof (struct uscsi_cmd), KM_SLEEP); 13182 sensep = kmem_zalloc(LOG_SENSE_LENGTH, KM_SLEEP); 13183 13184 com->uscsi_cdb = cdb; 13185 com->uscsi_cdblen = CDB_GROUP1; 13186 com->uscsi_bufaddr = (caddr_t)sensep; 13187 com->uscsi_buflen = LOG_SENSE_LENGTH; 13188 com->uscsi_rqlen = sizeof (status); 13189 com->uscsi_rqbuf = (caddr_t)&status; 13190 com->uscsi_flags = 13191 USCSI_DIAGNOSE | USCSI_RQENABLE | USCSI_READ; 13192 com->uscsi_timeout = un->un_dp->non_motion_timeout; 13193 rval = st_uscsi_cmd(un, com, FKIOCTL); 13194 if (rval || com->uscsi_status) { 13195 /* uscsi-command failed */ 13196 rval = -1; 13197 } else { 13198 13199 sp = sensep + 3; 13200 13201 for (length = *sp++; length > 0; length--, sp++) { 13202 13203 if (*sp == page) { 13204 rval = 1; 13205 break; 13206 } 13207 } 13208 } 13209 kmem_free(com, sizeof (struct uscsi_cmd)); 13210 kmem_free(sensep, LOG_SENSE_LENGTH); 13211 return (rval); 13212 } 13213 13214 13215 /* 13216 * st_check_clean_bit() gets the status of the tape's cleaning bit. 13217 * 13218 * If the device does support the TapeAlert log page, then the cleaning bit 13219 * information will be read from this page. Otherwise we will see if one of 13220 * ST_CLN_TYPE_1, ST_CLN_TYPE_2 or ST_CLN_TYPE_3 is set in the properties of 13221 * the device, which means, that we can get the cleaning bit information via 13222 * a RequestSense command. 13223 * If both methods of getting cleaning bit information are not supported 13224 * st_check_clean_bit() will return with 0. Otherwise st_check_clean_bit() 13225 * returns with 13226 * - MTF_TAPE_CLN_SUPPORTED if cleaning bit is not set or 13227 * - MTF_TAPE_CLN_SUPPORTED | MTF_TAPE_HEAD_DIRTY if cleaning bit is set. 13228 * If the call to st_uscsi_cmd() to do the Log Sense or the Request Sense 13229 * command fails, or if the amount of Request Sense data is not enough, then 13230 * st_check_clean_bit() returns with -1. 13231 */ 13232 13233 static int 13234 st_check_clean_bit(struct scsi_tape *un) 13235 { 13236 int rval = 0; 13237 13238 ST_FUNC(ST_DEVINFO, st_check_clean_bit); 13239 13240 ASSERT(mutex_owned(ST_MUTEX)); 13241 13242 if (un->un_HeadClean & TAPE_ALERT_NOT_SUPPORTED) { 13243 return (rval); 13244 } 13245 13246 if (un->un_HeadClean == TAPE_ALERT_SUPPORT_UNKNOWN) { 13247 13248 rval = st_logpage_supported(un, TAPE_SEQUENTIAL_PAGE); 13249 if (rval == -1) { 13250 return (0); 13251 } 13252 if (rval == 1) { 13253 13254 un->un_HeadClean |= TAPE_SEQUENTIAL_SUPPORTED; 13255 } 13256 13257 rval = st_logpage_supported(un, TAPE_ALERT_PAGE); 13258 if (rval == -1) { 13259 return (0); 13260 } 13261 if (rval == 1) { 13262 13263 un->un_HeadClean |= TAPE_ALERT_SUPPORTED; 13264 } 13265 13266 if (un->un_HeadClean == TAPE_ALERT_SUPPORT_UNKNOWN) { 13267 13268 un->un_HeadClean = TAPE_ALERT_NOT_SUPPORTED; 13269 } 13270 } 13271 13272 rval = 0; 13273 13274 if (un->un_HeadClean & TAPE_SEQUENTIAL_SUPPORTED) { 13275 13276 rval = st_check_sequential_clean_bit(un); 13277 if (rval == -1) { 13278 return (0); 13279 } 13280 } 13281 13282 if ((rval == 0) && (un->un_HeadClean & TAPE_ALERT_SUPPORTED)) { 13283 13284 rval = st_check_alert_flags(un); 13285 if (rval == -1) { 13286 return (0); 13287 } 13288 } 13289 13290 if ((rval == 0) && (un->un_dp->options & ST_CLN_MASK)) { 13291 13292 rval = st_check_sense_clean_bit(un); 13293 if (rval == -1) { 13294 return (0); 13295 } 13296 } 13297 13298 /* 13299 * If found a supported means to check need to clean. 13300 */ 13301 if (rval & MTF_TAPE_CLN_SUPPORTED) { 13302 13303 /* 13304 * head needs to be cleaned. 13305 */ 13306 if (rval & MTF_TAPE_HEAD_DIRTY) { 13307 13308 /* 13309 * Print log message only first time 13310 * found needing cleaned. 13311 */ 13312 if ((un->un_HeadClean & TAPE_PREVIOUSLY_DIRTY) == 0) { 13313 13314 scsi_log(ST_DEVINFO, st_label, CE_WARN, 13315 "Periodic head cleaning required"); 13316 13317 un->un_HeadClean |= TAPE_PREVIOUSLY_DIRTY; 13318 } 13319 13320 } else { 13321 13322 un->un_HeadClean &= ~TAPE_PREVIOUSLY_DIRTY; 13323 } 13324 } 13325 13326 return (rval); 13327 } 13328 13329 13330 static int 13331 st_check_sequential_clean_bit(struct scsi_tape *un) 13332 { 13333 int rval; 13334 int ix; 13335 ushort_t parameter; 13336 struct uscsi_cmd *cmd; 13337 struct log_sequential_page *sp; 13338 struct log_sequential_page_parameter *prm; 13339 struct scsi_arq_status status; 13340 char cdb[CDB_GROUP1] = { 13341 SCMD_LOG_SENSE_G1, 13342 0, 13343 TAPE_SEQUENTIAL_PAGE | CURRENT_CUMULATIVE_VALUES, 13344 0, 13345 0, 13346 0, 13347 0, 13348 (char)(sizeof (struct log_sequential_page) >> 8), 13349 (char)(sizeof (struct log_sequential_page)), 13350 0 13351 }; 13352 13353 ST_FUNC(ST_DEVINFO, st_check_sequential_clean_bit); 13354 13355 cmd = kmem_zalloc(sizeof (struct uscsi_cmd), KM_SLEEP); 13356 sp = kmem_zalloc(sizeof (struct log_sequential_page), KM_SLEEP); 13357 13358 cmd->uscsi_flags = 13359 USCSI_DIAGNOSE | USCSI_RQENABLE | USCSI_READ; 13360 cmd->uscsi_timeout = un->un_dp->non_motion_timeout; 13361 cmd->uscsi_cdb = cdb; 13362 cmd->uscsi_cdblen = CDB_GROUP1; 13363 cmd->uscsi_bufaddr = (caddr_t)sp; 13364 cmd->uscsi_buflen = sizeof (struct log_sequential_page); 13365 cmd->uscsi_rqlen = sizeof (status); 13366 cmd->uscsi_rqbuf = (caddr_t)&status; 13367 13368 rval = st_uscsi_cmd(un, cmd, FKIOCTL); 13369 13370 if (rval || cmd->uscsi_status || cmd->uscsi_resid) { 13371 13372 rval = -1; 13373 13374 } else if (sp->log_page.code != TAPE_SEQUENTIAL_PAGE) { 13375 13376 rval = -1; 13377 } 13378 13379 prm = &sp->param[0]; 13380 13381 for (ix = 0; rval == 0 && ix < TAPE_SEQUENTIAL_PAGE_PARA; ix++) { 13382 13383 if (prm->log_param.length == 0) { 13384 break; 13385 } 13386 13387 parameter = (((prm->log_param.pc_hi << 8) & 0xff00) + 13388 (prm->log_param.pc_lo & 0xff)); 13389 13390 if (parameter == SEQUENTIAL_NEED_CLN) { 13391 13392 rval = MTF_TAPE_CLN_SUPPORTED; 13393 if (prm->param_value[prm->log_param.length - 1]) { 13394 13395 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 13396 "sequential log says head dirty\n"); 13397 rval |= MTF_TAPE_HEAD_DIRTY; 13398 } 13399 } 13400 prm = (struct log_sequential_page_parameter *) 13401 &prm->param_value[prm->log_param.length]; 13402 } 13403 13404 kmem_free(cmd, sizeof (struct uscsi_cmd)); 13405 kmem_free(sp, sizeof (struct log_sequential_page)); 13406 13407 return (rval); 13408 } 13409 13410 13411 static int 13412 st_check_alert_flags(struct scsi_tape *un) 13413 { 13414 struct st_tape_alert *ta; 13415 struct uscsi_cmd *com; 13416 struct scsi_arq_status status; 13417 unsigned ix, length; 13418 int rval; 13419 tape_alert_flags flag; 13420 char cdb[CDB_GROUP1] = { 13421 SCMD_LOG_SENSE_G1, 13422 0, 13423 TAPE_ALERT_PAGE | CURRENT_THRESHOLD_VALUES, 13424 0, 13425 0, 13426 0, 13427 0, 13428 (char)(sizeof (struct st_tape_alert) >> 8), 13429 (char)(sizeof (struct st_tape_alert)), 13430 0 13431 }; 13432 13433 ST_FUNC(ST_DEVINFO, st_check_alert_clean_bit); 13434 13435 com = kmem_zalloc(sizeof (struct uscsi_cmd), KM_SLEEP); 13436 ta = kmem_zalloc(sizeof (struct st_tape_alert), KM_SLEEP); 13437 13438 com->uscsi_cdb = cdb; 13439 com->uscsi_cdblen = CDB_GROUP1; 13440 com->uscsi_bufaddr = (caddr_t)ta; 13441 com->uscsi_buflen = sizeof (struct st_tape_alert); 13442 com->uscsi_rqlen = sizeof (status); 13443 com->uscsi_rqbuf = (caddr_t)&status; 13444 com->uscsi_flags = 13445 USCSI_DIAGNOSE | USCSI_RQENABLE | USCSI_READ; 13446 com->uscsi_timeout = un->un_dp->non_motion_timeout; 13447 13448 rval = st_uscsi_cmd(un, com, FKIOCTL); 13449 13450 if (rval || com->uscsi_status || com->uscsi_resid) { 13451 13452 rval = -1; /* uscsi-command failed */ 13453 13454 } else if (ta->log_page.code != TAPE_ALERT_PAGE) { 13455 13456 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 13457 "Not Alert Log Page returned 0x%X\n", ta->log_page.code); 13458 rval = -1; 13459 } 13460 13461 length = (ta->log_page.length_hi << 8) + ta->log_page.length_lo; 13462 13463 13464 if (length != TAPE_ALERT_PARAMETER_LENGTH) { 13465 13466 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 13467 "TapeAlert length %d\n", length); 13468 } 13469 13470 13471 for (ix = 0; ix < TAPE_ALERT_MAX_PARA; ix++) { 13472 13473 /* 13474 * if rval is bad before the first pass don't bother 13475 */ 13476 if (ix == 0 && rval != 0) { 13477 13478 break; 13479 } 13480 13481 flag = ((ta->param[ix].log_param.pc_hi << 8) + 13482 ta->param[ix].log_param.pc_lo); 13483 13484 if ((ta->param[ix].param_value & 1) == 0) { 13485 continue; 13486 } 13487 /* 13488 * check to see if current parameter is of interest. 13489 * CLEAN_FOR_ERRORS is vendor specific to 9840 9940 stk's. 13490 */ 13491 if ((flag == TAF_CLEAN_NOW) || 13492 (flag == TAF_CLEAN_PERIODIC) || 13493 ((flag == CLEAN_FOR_ERRORS) && 13494 (un->un_dp->type == ST_TYPE_STK9840))) { 13495 13496 rval = MTF_TAPE_CLN_SUPPORTED; 13497 13498 13499 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 13500 "alert_page drive needs clean %d\n", flag); 13501 un->un_HeadClean |= TAPE_ALERT_STILL_DIRTY; 13502 rval |= MTF_TAPE_HEAD_DIRTY; 13503 13504 } else if (flag == TAF_CLEANING_MEDIA) { 13505 13506 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 13507 "alert_page drive was cleaned\n"); 13508 un->un_HeadClean &= ~TAPE_ALERT_STILL_DIRTY; 13509 } 13510 13511 } 13512 13513 /* 13514 * Report it as dirty till we see it cleaned 13515 */ 13516 if (un->un_HeadClean & TAPE_ALERT_STILL_DIRTY) { 13517 13518 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 13519 "alert_page still dirty\n"); 13520 rval |= MTF_TAPE_HEAD_DIRTY; 13521 } 13522 13523 kmem_free(com, sizeof (struct uscsi_cmd)); 13524 kmem_free(ta, sizeof (struct st_tape_alert)); 13525 13526 return (rval); 13527 } 13528 13529 13530 static int 13531 st_check_sense_clean_bit(struct scsi_tape *un) 13532 { 13533 uchar_t *sensep; 13534 char cdb[CDB_GROUP0]; 13535 struct uscsi_cmd *com; 13536 ushort_t byte_pos; 13537 uchar_t bit_mask; 13538 unsigned length; 13539 int index; 13540 int rval; 13541 13542 ST_FUNC(ST_DEVINFO, st_check_sense_clean_bit); 13543 13544 /* 13545 * Since this tape does not support Tape Alert, 13546 * we now try to get the cleanbit status via 13547 * Request Sense. 13548 */ 13549 13550 if ((un->un_dp->options & ST_CLN_MASK) == ST_CLN_TYPE_1) { 13551 13552 index = 0; 13553 13554 } else if ((un->un_dp->options & ST_CLN_MASK) == ST_CLN_TYPE_2) { 13555 13556 index = 1; 13557 13558 } else if ((un->un_dp->options & ST_CLN_MASK) == ST_CLN_TYPE_3) { 13559 13560 index = 2; 13561 13562 } else { 13563 13564 return (-1); 13565 } 13566 13567 byte_pos = st_cln_bit_position[index].cln_bit_byte; 13568 bit_mask = st_cln_bit_position[index].cln_bit_mask; 13569 length = byte_pos + 1; 13570 13571 com = kmem_zalloc(sizeof (struct uscsi_cmd), KM_SLEEP); 13572 sensep = kmem_zalloc(length, KM_SLEEP); 13573 13574 cdb[0] = SCMD_REQUEST_SENSE; 13575 cdb[1] = 0; 13576 cdb[2] = 0; 13577 cdb[3] = 0; 13578 cdb[4] = (char)length; 13579 cdb[5] = 0; 13580 13581 com->uscsi_cdb = cdb; 13582 com->uscsi_cdblen = CDB_GROUP0; 13583 com->uscsi_bufaddr = (caddr_t)sensep; 13584 com->uscsi_buflen = length; 13585 com->uscsi_flags = 13586 USCSI_DIAGNOSE | USCSI_SILENT | USCSI_READ; 13587 com->uscsi_timeout = un->un_dp->non_motion_timeout; 13588 13589 rval = st_uscsi_cmd(un, com, FKIOCTL); 13590 13591 if (rval || com->uscsi_status || com->uscsi_resid) { 13592 13593 rval = -1; 13594 13595 } else { 13596 13597 rval = MTF_TAPE_CLN_SUPPORTED; 13598 if ((sensep[byte_pos] & bit_mask) == bit_mask) { 13599 13600 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 13601 "sense data says head dirty\n"); 13602 rval |= MTF_TAPE_HEAD_DIRTY; 13603 } 13604 } 13605 13606 kmem_free(com, sizeof (struct uscsi_cmd)); 13607 kmem_free(sensep, length); 13608 return (rval); 13609 } 13610 13611 /* 13612 * st_clear_unit_attention 13613 * 13614 * run test unit ready's to clear out outstanding 13615 * unit attentions. 13616 * returns zero for SUCCESS or the errno from st_cmd call 13617 */ 13618 static int 13619 st_clear_unit_attentions(dev_t dev_instance, int max_trys) 13620 { 13621 int i = 0; 13622 int rval; 13623 13624 GET_SOFT_STATE(dev_instance); 13625 ST_FUNC(ST_DEVINFO, st_clear_unit_attentions); 13626 13627 do { 13628 rval = st_cmd(un, SCMD_TEST_UNIT_READY, 0, SYNC_CMD); 13629 } while ((rval != 0) && (rval != ENXIO) && (++i < max_trys)); 13630 return (rval); 13631 } 13632 13633 static void 13634 st_calculate_timeouts(struct scsi_tape *un) 13635 { 13636 ST_FUNC(ST_DEVINFO, st_calculate_timeouts); 13637 13638 if (un->un_dp->non_motion_timeout == 0) { 13639 if (un->un_dp->options & ST_LONG_TIMEOUTS) { 13640 un->un_dp->non_motion_timeout = 13641 st_io_time * st_long_timeout_x; 13642 } else { 13643 un->un_dp->non_motion_timeout = (ushort_t)st_io_time; 13644 } 13645 } 13646 13647 if (un->un_dp->io_timeout == 0) { 13648 if (un->un_dp->options & ST_LONG_TIMEOUTS) { 13649 un->un_dp->io_timeout = st_io_time * st_long_timeout_x; 13650 } else { 13651 un->un_dp->io_timeout = (ushort_t)st_io_time; 13652 } 13653 } 13654 13655 if (un->un_dp->rewind_timeout == 0) { 13656 if (un->un_dp->options & ST_LONG_TIMEOUTS) { 13657 un->un_dp->rewind_timeout = 13658 st_space_time * st_long_timeout_x; 13659 } else { 13660 un->un_dp->rewind_timeout = (ushort_t)st_space_time; 13661 } 13662 } 13663 13664 if (un->un_dp->space_timeout == 0) { 13665 if (un->un_dp->options & ST_LONG_TIMEOUTS) { 13666 un->un_dp->space_timeout = 13667 st_space_time * st_long_timeout_x; 13668 } else { 13669 un->un_dp->space_timeout = (ushort_t)st_space_time; 13670 } 13671 } 13672 13673 if (un->un_dp->load_timeout == 0) { 13674 if (un->un_dp->options & ST_LONG_TIMEOUTS) { 13675 un->un_dp->load_timeout = 13676 st_space_time * st_long_timeout_x; 13677 } else { 13678 un->un_dp->load_timeout = (ushort_t)st_space_time; 13679 } 13680 } 13681 13682 if (un->un_dp->unload_timeout == 0) { 13683 if (un->un_dp->options & ST_LONG_TIMEOUTS) { 13684 un->un_dp->unload_timeout = 13685 st_space_time * st_long_timeout_x; 13686 } else { 13687 un->un_dp->unload_timeout = (ushort_t)st_space_time; 13688 } 13689 } 13690 13691 if (un->un_dp->erase_timeout == 0) { 13692 if (un->un_dp->options & ST_LONG_ERASE) { 13693 un->un_dp->erase_timeout = 13694 st_space_time * st_long_space_time_x; 13695 } else { 13696 un->un_dp->erase_timeout = (ushort_t)st_space_time; 13697 } 13698 } 13699 } 13700 13701 13702 static writablity 13703 st_is_not_wormable(struct scsi_tape *un) 13704 { 13705 ST_FUNC(ST_DEVINFO, st_is_not_wormable); 13706 return (RDWR); 13707 } 13708 13709 static writablity 13710 st_is_hp_dat_tape_worm(struct scsi_tape *un) 13711 { 13712 writablity wrt; 13713 13714 ST_FUNC(ST_DEVINFO, st_is_hp_dat_tape_worm); 13715 13716 /* Mode sense should be current */ 13717 if (un->un_mspl->media_type == 1) { 13718 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 13719 "Drive has WORM media loaded\n"); 13720 wrt = WORM; 13721 } else { 13722 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 13723 "Drive has non WORM media loaded\n"); 13724 wrt = RDWR; 13725 } 13726 return (wrt); 13727 } 13728 13729 #define HP_DAT_INQUIRY 0x4A 13730 static writablity 13731 st_is_hp_dat_worm(struct scsi_tape *un) 13732 { 13733 char *buf; 13734 int result; 13735 writablity wrt; 13736 13737 ST_FUNC(ST_DEVINFO, st_is_hp_dat_worm); 13738 13739 buf = kmem_zalloc(HP_DAT_INQUIRY, KM_SLEEP); 13740 13741 result = st_get_special_inquiry(un, HP_DAT_INQUIRY, buf, 0); 13742 13743 if (result != 0) { 13744 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 13745 "Read Standard Inquiry for WORM support failed"); 13746 wrt = FAILED; 13747 } else if ((buf[40] & 1) == 0) { 13748 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 13749 "Drive is NOT WORMable\n"); 13750 /* This drive doesn't support it so don't check again */ 13751 un->un_dp->options &= ~ST_WORMABLE; 13752 wrt = RDWR; 13753 un->un_wormable = st_is_not_wormable; 13754 } else { 13755 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 13756 "Drive supports WORM version %d\n", buf[40] >> 1); 13757 un->un_wormable = st_is_hp_dat_tape_worm; 13758 wrt = un->un_wormable(un); 13759 } 13760 13761 kmem_free(buf, HP_DAT_INQUIRY); 13762 13763 /* 13764 * If drive doesn't support it no point in checking further. 13765 */ 13766 return (wrt); 13767 } 13768 13769 static writablity 13770 st_is_hp_lto_tape_worm(struct scsi_tape *un) 13771 { 13772 writablity wrt; 13773 13774 ST_FUNC(ST_DEVINFO, st_is_hp_lto_tape_worm); 13775 13776 /* Mode sense should be current */ 13777 switch (un->un_mspl->media_type) { 13778 case 0x00: 13779 switch (un->un_mspl->density) { 13780 case 0x40: 13781 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 13782 "Drive has standard Gen I media loaded\n"); 13783 break; 13784 case 0x42: 13785 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 13786 "Drive has standard Gen II media loaded\n"); 13787 break; 13788 case 0x44: 13789 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 13790 "Drive has standard Gen III media loaded\n"); 13791 break; 13792 case 0x46: 13793 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 13794 "Drive has standard Gen IV media loaded\n"); 13795 break; 13796 default: 13797 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 13798 "Drive has standard unknown 0x%X media loaded\n", 13799 un->un_mspl->density); 13800 } 13801 wrt = RDWR; 13802 break; 13803 case 0x01: 13804 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 13805 "Drive has WORM medium loaded\n"); 13806 wrt = WORM; 13807 break; 13808 case 0x80: 13809 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 13810 "Drive has CD-ROM emulation medium loaded\n"); 13811 wrt = WORM; 13812 break; 13813 default: 13814 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 13815 "Drive has an unexpected medium type 0x%X loaded\n", 13816 un->un_mspl->media_type); 13817 wrt = RDWR; 13818 } 13819 13820 return (wrt); 13821 } 13822 13823 #define LTO_REQ_INQUIRY 44 13824 static writablity 13825 st_is_hp_lto_worm(struct scsi_tape *un) 13826 { 13827 char *buf; 13828 int result; 13829 writablity wrt; 13830 13831 ST_FUNC(ST_DEVINFO, st_is_hp_lto_worm); 13832 13833 buf = kmem_zalloc(LTO_REQ_INQUIRY, KM_SLEEP); 13834 13835 result = st_get_special_inquiry(un, LTO_REQ_INQUIRY, buf, 0); 13836 13837 if (result != 0) { 13838 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 13839 "Read Standard Inquiry for WORM support failed"); 13840 wrt = FAILED; 13841 } else if ((buf[40] & 1) == 0) { 13842 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 13843 "Drive is NOT WORMable\n"); 13844 /* This drive doesn't support it so don't check again */ 13845 un->un_dp->options &= ~ST_WORMABLE; 13846 wrt = RDWR; 13847 un->un_wormable = st_is_not_wormable; 13848 } else { 13849 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 13850 "Drive supports WORM version %d\n", buf[40] >> 1); 13851 un->un_wormable = st_is_hp_lto_tape_worm; 13852 wrt = un->un_wormable(un); 13853 } 13854 13855 kmem_free(buf, LTO_REQ_INQUIRY); 13856 13857 /* 13858 * If drive doesn't support it no point in checking further. 13859 */ 13860 return (wrt); 13861 } 13862 13863 static writablity 13864 st_is_t10_worm_device(struct scsi_tape *un) 13865 { 13866 writablity wrt; 13867 13868 ST_FUNC(ST_DEVINFO, st_is_t10_worm_device); 13869 13870 if (un->un_mspl->media_type == 0x3c) { 13871 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 13872 "Drive has WORM media loaded\n"); 13873 wrt = WORM; 13874 } else { 13875 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 13876 "Drive has non WORM media loaded\n"); 13877 wrt = RDWR; 13878 } 13879 return (wrt); 13880 } 13881 13882 #define SEQ_CAP_PAGE (char)0xb0 13883 static writablity 13884 st_is_t10_worm(struct scsi_tape *un) 13885 { 13886 char *buf; 13887 int result; 13888 writablity wrt; 13889 13890 ST_FUNC(ST_DEVINFO, st_is_t10_worm); 13891 13892 buf = kmem_zalloc(6, KM_SLEEP); 13893 13894 result = st_get_special_inquiry(un, 6, buf, SEQ_CAP_PAGE); 13895 13896 if (result != 0) { 13897 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 13898 "Read Vitial Inquiry for Sequental Capability" 13899 " WORM support failed %x", result); 13900 wrt = FAILED; 13901 } else if ((buf[4] & 1) == 0) { 13902 ASSERT(buf[1] == SEQ_CAP_PAGE); 13903 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 13904 "Drive is NOT WORMable\n"); 13905 /* This drive doesn't support it so don't check again */ 13906 un->un_dp->options &= ~ST_WORMABLE; 13907 wrt = RDWR; 13908 un->un_wormable = st_is_not_wormable; 13909 } else { 13910 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 13911 "Drive supports WORM\n"); 13912 un->un_wormable = st_is_t10_worm_device; 13913 wrt = un->un_wormable(un); 13914 } 13915 13916 kmem_free(buf, 6); 13917 13918 return (wrt); 13919 } 13920 13921 13922 #define STK_REQ_SENSE 26 13923 13924 static writablity 13925 st_is_stk_worm(struct scsi_tape *un) 13926 { 13927 char cdb[CDB_GROUP0] = {SCMD_REQUEST_SENSE, 0, 0, 0, STK_REQ_SENSE, 0}; 13928 struct scsi_extended_sense *sense; 13929 struct uscsi_cmd *cmd; 13930 char *buf; 13931 int result; 13932 writablity wrt; 13933 13934 ST_FUNC(ST_DEVINFO, st_is_stk_worm); 13935 13936 cmd = kmem_zalloc(sizeof (struct uscsi_cmd), KM_SLEEP); 13937 buf = kmem_alloc(STK_REQ_SENSE, KM_SLEEP); 13938 sense = (struct scsi_extended_sense *)buf; 13939 13940 cmd->uscsi_flags = USCSI_READ; 13941 cmd->uscsi_timeout = un->un_dp->non_motion_timeout; 13942 cmd->uscsi_cdb = &cdb[0]; 13943 cmd->uscsi_bufaddr = buf; 13944 cmd->uscsi_buflen = STK_REQ_SENSE; 13945 cmd->uscsi_cdblen = CDB_GROUP0; 13946 cmd->uscsi_rqlen = 0; 13947 cmd->uscsi_rqbuf = NULL; 13948 13949 result = st_uscsi_cmd(un, cmd, FKIOCTL); 13950 13951 if (result != 0 || cmd->uscsi_status != 0) { 13952 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 13953 "Request Sense for WORM failed"); 13954 wrt = RDWR; 13955 } else if (sense->es_add_len + 8 < 24) { 13956 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 13957 "Drive didn't send enough sense data for WORM byte %d\n", 13958 sense->es_add_len + 8); 13959 wrt = RDWR; 13960 un->un_wormable = st_is_not_wormable; 13961 } else if ((buf[24]) & 0x02) { 13962 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 13963 "Drive has WORM tape loaded\n"); 13964 wrt = WORM; 13965 un->un_wormable = st_is_stk_worm; 13966 } else { 13967 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 13968 "Drive has normal tape loaded\n"); 13969 wrt = RDWR; 13970 un->un_wormable = st_is_stk_worm; 13971 } 13972 13973 kmem_free(buf, STK_REQ_SENSE); 13974 kmem_free(cmd, sizeof (struct uscsi_cmd)); 13975 return (wrt); 13976 } 13977 13978 #define DLT_INQ_SZ 44 13979 13980 static writablity 13981 st_is_dlt_tape_worm(struct scsi_tape *un) 13982 { 13983 caddr_t buf; 13984 int result; 13985 writablity wrt; 13986 13987 ST_FUNC(ST_DEVINFO, st_is_dlt_tape_worm); 13988 13989 buf = kmem_alloc(DLT_INQ_SZ, KM_SLEEP); 13990 13991 /* Read Attribute Media Type */ 13992 13993 result = st_read_attributes(un, 0x0408, buf, 10, st_uscsi_cmd); 13994 13995 /* 13996 * If this quantum drive is attached via an HBA that cannot 13997 * support thr read attributes command return error in the 13998 * hope that someday they will support the t10 method. 13999 */ 14000 if (result == EINVAL && un->un_max_cdb_sz < CDB_GROUP4) { 14001 scsi_log(ST_DEVINFO, st_label, SCSI_DEBUG, 14002 "Read Attribute Command for WORM Media detection is not " 14003 "supported on the HBA that this drive is attached to."); 14004 wrt = RDWR; 14005 un->un_wormable = st_is_not_wormable; 14006 goto out; 14007 } 14008 14009 if (result != 0) { 14010 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 14011 "Read Attribute Command for WORM Media returned 0x%x", 14012 result); 14013 wrt = RDWR; 14014 un->un_dp->options &= ~ST_WORMABLE; 14015 goto out; 14016 } 14017 14018 if ((uchar_t)buf[9] == 0x80) { 14019 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 14020 "Drive media is WORM\n"); 14021 wrt = WORM; 14022 } else { 14023 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 14024 "Drive media is not WORM Media 0x%x\n", (uchar_t)buf[9]); 14025 wrt = RDWR; 14026 } 14027 14028 out: 14029 kmem_free(buf, DLT_INQ_SZ); 14030 return (wrt); 14031 } 14032 14033 static writablity 14034 st_is_dlt_worm(struct scsi_tape *un) 14035 { 14036 caddr_t buf; 14037 int result; 14038 writablity wrt; 14039 14040 ST_FUNC(ST_DEVINFO, st_is_dlt_worm); 14041 14042 buf = kmem_alloc(DLT_INQ_SZ, KM_SLEEP); 14043 14044 result = st_get_special_inquiry(un, DLT_INQ_SZ, buf, 0xC0); 14045 14046 if (result != 0) { 14047 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 14048 "Read Vendor Specific Inquiry for WORM support failed"); 14049 wrt = RDWR; 14050 goto out; 14051 } 14052 14053 if ((buf[2] & 1) == 0) { 14054 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 14055 "Drive is not WORMable\n"); 14056 wrt = RDWR; 14057 un->un_dp->options &= ~ST_WORMABLE; 14058 un->un_wormable = st_is_not_wormable; 14059 goto out; 14060 } else { 14061 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 14062 "Drive is WORMable\n"); 14063 un->un_wormable = st_is_dlt_tape_worm; 14064 wrt = un->un_wormable(un); 14065 } 14066 out: 14067 kmem_free(buf, DLT_INQ_SZ); 14068 14069 return (wrt); 14070 } 14071 14072 typedef struct { 14073 struct modeheader_seq header; 14074 #if defined(_BIT_FIELDS_LTOH) /* X86 */ 14075 uchar_t pagecode :6, 14076 :2; 14077 uchar_t page_len; 14078 uchar_t syslogalive :2, 14079 device :1, 14080 abs :1, 14081 ulpbot :1, 14082 prth :1, 14083 ponej :1, 14084 ait :1; 14085 uchar_t span; 14086 14087 uchar_t :6, 14088 worm :1, 14089 mic :1; 14090 uchar_t worm_cap :1, 14091 :7; 14092 uint32_t :32; 14093 #else /* SPARC */ 14094 uchar_t :2, 14095 pagecode :6; 14096 uchar_t page_len; 14097 uchar_t ait :1, 14098 device :1, 14099 abs :1, 14100 ulpbot :1, 14101 prth :1, 14102 ponej :1, 14103 syslogalive :2; 14104 uchar_t span; 14105 uchar_t mic :1, 14106 worm :1, 14107 :6; 14108 uchar_t :7, 14109 worm_cap :1; 14110 uint32_t :32; 14111 #endif 14112 }ait_dev_con; 14113 14114 #define AIT_DEV_PAGE 0x31 14115 static writablity 14116 st_is_sony_worm(struct scsi_tape *un) 14117 { 14118 int result; 14119 writablity wrt; 14120 ait_dev_con *ait_conf; 14121 14122 ST_FUNC(ST_DEVINFO, st_is_sony_worm); 14123 14124 ait_conf = kmem_zalloc(sizeof (ait_dev_con), KM_SLEEP); 14125 14126 result = st_gen_mode_sense(un, st_uscsi_cmd, AIT_DEV_PAGE, 14127 (struct seq_mode *)ait_conf, sizeof (ait_dev_con)); 14128 14129 if (result == 0) { 14130 14131 if (ait_conf->pagecode != AIT_DEV_PAGE) { 14132 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 14133 "returned page 0x%x not 0x%x AIT_DEV_PAGE\n", 14134 ait_conf->pagecode, AIT_DEV_PAGE); 14135 wrt = RDWR; 14136 un->un_wormable = st_is_not_wormable; 14137 14138 } else if (ait_conf->worm_cap) { 14139 14140 un->un_wormable = st_is_sony_worm; 14141 14142 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 14143 "Drives is WORMable\n"); 14144 if (ait_conf->worm) { 14145 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 14146 "Media is WORM\n"); 14147 wrt = WORM; 14148 } else { 14149 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 14150 "Media is not WORM\n"); 14151 wrt = RDWR; 14152 } 14153 14154 } else { 14155 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 14156 "Drives not is WORMable\n"); 14157 wrt = RDWR; 14158 /* No further checking required */ 14159 un->un_dp->options &= ~ST_WORMABLE; 14160 } 14161 14162 } else { 14163 14164 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 14165 "AIT device config mode sense page read command failed" 14166 " result = %d ", result); 14167 wrt = FAILED; 14168 un->un_wormable = st_is_not_wormable; 14169 } 14170 14171 kmem_free(ait_conf, sizeof (ait_dev_con)); 14172 return (wrt); 14173 } 14174 14175 static writablity 14176 st_is_drive_worm(struct scsi_tape *un) 14177 { 14178 writablity wrt; 14179 14180 ST_FUNC(ST_DEVINFO, st_is_sony_worm); 14181 14182 switch (un->un_dp->type) { 14183 case MT_ISDLT: 14184 wrt = st_is_dlt_worm(un); 14185 break; 14186 14187 case MT_ISSTK9840: 14188 wrt = st_is_stk_worm(un); 14189 break; 14190 14191 case MT_IS8MM: 14192 case MT_ISAIT: 14193 wrt = st_is_sony_worm(un); 14194 break; 14195 14196 case MT_LTO: 14197 if (strncmp("HP ", un->un_dp->vid, 3) == 0) { 14198 wrt = st_is_hp_lto_worm(un); 14199 } else { 14200 wrt = st_is_t10_worm(un); 14201 } 14202 break; 14203 14204 case MT_ISDAT: 14205 if (strncmp("HP ", un->un_dp->vid, 3) == 0) { 14206 wrt = st_is_hp_dat_worm(un); 14207 } else { 14208 wrt = st_is_t10_worm(un); 14209 } 14210 break; 14211 14212 default: 14213 wrt = FAILED; 14214 break; 14215 } 14216 14217 /* 14218 * If any of the above failed try the t10 standard method. 14219 */ 14220 if (wrt == FAILED) { 14221 wrt = st_is_t10_worm(un); 14222 } 14223 14224 /* 14225 * Unknown method for detecting WORM media. 14226 */ 14227 if (wrt == FAILED) { 14228 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 14229 "Unknown method for WORM media detection\n"); 14230 wrt = RDWR; 14231 un->un_dp->options &= ~ST_WORMABLE; 14232 } 14233 14234 return (wrt); 14235 } 14236 14237 static int 14238 st_read_attributes(struct scsi_tape *un, uint16_t attribute, void *pnt, 14239 size_t size, ubufunc_t bufunc) 14240 { 14241 char cdb[CDB_GROUP4]; 14242 int result; 14243 struct uscsi_cmd *cmd; 14244 struct scsi_arq_status status; 14245 14246 caddr_t buf = (caddr_t)pnt; 14247 14248 ST_FUNC(ST_DEVINFO, st_read_attributes); 14249 14250 if (un->un_sd->sd_inq->inq_ansi < 3) { 14251 return (ENOTTY); 14252 } 14253 14254 cmd = kmem_zalloc(sizeof (struct uscsi_cmd), KM_SLEEP); 14255 14256 cdb[0] = (char)SCMD_READ_ATTRIBUTE; 14257 cdb[1] = 0; 14258 cdb[2] = 0; 14259 cdb[3] = 0; 14260 cdb[4] = 0; 14261 cdb[5] = 0; 14262 cdb[6] = 0; 14263 cdb[7] = 0; 14264 cdb[8] = (char)(attribute >> 8); 14265 cdb[9] = (char)(attribute); 14266 cdb[10] = (char)(size >> 24); 14267 cdb[11] = (char)(size >> 16); 14268 cdb[12] = (char)(size >> 8); 14269 cdb[13] = (char)(size); 14270 cdb[14] = 0; 14271 cdb[15] = 0; 14272 14273 14274 cmd->uscsi_flags = USCSI_READ | USCSI_RQENABLE | USCSI_DIAGNOSE; 14275 cmd->uscsi_timeout = un->un_dp->non_motion_timeout; 14276 cmd->uscsi_cdb = &cdb[0]; 14277 cmd->uscsi_bufaddr = (caddr_t)buf; 14278 cmd->uscsi_buflen = size; 14279 cmd->uscsi_cdblen = sizeof (cdb); 14280 cmd->uscsi_rqlen = sizeof (status); 14281 cmd->uscsi_rqbuf = (caddr_t)&status; 14282 14283 result = bufunc(un, cmd, FKIOCTL); 14284 14285 if (result != 0 || cmd->uscsi_status != 0) { 14286 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 14287 "st_read_attribute failed: result %d status %d\n", 14288 result, cmd->uscsi_status); 14289 /* 14290 * If this returns invalid operation code don't try again. 14291 */ 14292 if (un->un_sd->sd_sense->es_key == KEY_ILLEGAL_REQUEST && 14293 un->un_sd->sd_sense->es_add_code == 0x20) { 14294 result = ENOTTY; 14295 } else if (result == 0) { 14296 result = EIO; 14297 } 14298 14299 } else { 14300 14301 /* 14302 * The attribute retured should match the attribute requested. 14303 */ 14304 if (buf[4] != cdb[8] || buf[5] != cdb[9]) { 14305 scsi_log(ST_DEVINFO, st_label, SCSI_DEBUG, 14306 "st_read_attribute got wrong data back expected " 14307 "0x%x got 0x%x\n", attribute, buf[6] << 8 | buf[7]); 14308 st_clean_print(ST_DEVINFO, st_label, SCSI_DEBUG, 14309 "bad? data", buf, size); 14310 result = EIO; 14311 } 14312 } 14313 14314 kmem_free(cmd, sizeof (struct uscsi_cmd)); 14315 14316 return (result); 14317 } 14318 14319 static int 14320 st_get_special_inquiry(struct scsi_tape *un, uchar_t size, caddr_t dest, 14321 uchar_t page) 14322 { 14323 char cdb[CDB_GROUP0]; 14324 struct scsi_extended_sense *sense; 14325 struct uscsi_cmd *cmd; 14326 int result; 14327 14328 ST_FUNC(ST_DEVINFO, st_get_special_inquiry); 14329 14330 cdb[0] = SCMD_INQUIRY; 14331 cdb[1] = page ? 1 : 0; 14332 cdb[2] = page; 14333 cdb[3] = 0; 14334 cdb[4] = size; 14335 cdb[5] = 0; 14336 14337 cmd = kmem_zalloc(sizeof (struct uscsi_cmd), KM_SLEEP); 14338 sense = kmem_alloc(sizeof (struct scsi_extended_sense), KM_SLEEP); 14339 14340 cmd->uscsi_flags = USCSI_READ | USCSI_RQENABLE; 14341 cmd->uscsi_timeout = un->un_dp->non_motion_timeout; 14342 cmd->uscsi_cdb = &cdb[0]; 14343 cmd->uscsi_bufaddr = dest; 14344 cmd->uscsi_buflen = size; 14345 cmd->uscsi_cdblen = CDB_GROUP0; 14346 cmd->uscsi_rqlen = sizeof (struct scsi_extended_sense); 14347 cmd->uscsi_rqbuf = (caddr_t)sense; 14348 14349 result = st_uscsi_cmd(un, cmd, FKIOCTL); 14350 14351 if (result != 0 || cmd->uscsi_status != 0) { 14352 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 14353 "st_get_special_inquiry() failed for page %x", page); 14354 if (result == 0) { 14355 result = EIO; 14356 } 14357 } 14358 14359 kmem_free(sense, sizeof (struct scsi_extended_sense)); 14360 kmem_free(cmd, sizeof (struct uscsi_cmd)); 14361 14362 return (result); 14363 } 14364 14365 14366 static int 14367 st_update_block_pos(struct scsi_tape *un, bufunc_t bf, int post_space) 14368 { 14369 int rval = ENOTTY; 14370 uchar_t status = un->un_status; 14371 posmode previous_pmode = un->un_running.pmode; 14372 14373 ST_FUNC(ST_DEVINFO, st_update_block_pos); 14374 14375 while (un->un_read_pos_type != NO_POS) { 14376 rval = bf(un, SCMD_READ_POSITION, 32, SYNC_CMD); 14377 14378 /* 14379 * If read position command returned good status 14380 * Parse the data to see if the position can be interpreted. 14381 */ 14382 if ((rval == 0) && 14383 ((rval = st_interpret_read_pos(un, &un->un_pos, 14384 un->un_read_pos_type, 32, (caddr_t)un->un_read_pos_data, 14385 post_space)) == 0)) { 14386 /* 14387 * Update the running position as well if un_pos was 14388 * ok. But only if recovery is enabled. 14389 */ 14390 if (st_recov_sz != sizeof (recov_info)) { 14391 break; 14392 } 14393 rval = st_interpret_read_pos(un, &un->un_running, 14394 un->un_read_pos_type, 32, 14395 (caddr_t)un->un_read_pos_data, post_space); 14396 un->un_status = status; 14397 break; 14398 } else if (un->un_status == KEY_UNIT_ATTENTION) { 14399 un->un_running.pmode = previous_pmode; 14400 continue; 14401 } else if (un->un_status != KEY_ILLEGAL_REQUEST) { 14402 scsi_log(ST_DEVINFO, st_label, CE_NOTE, 14403 "st_update_block_pos() read position cmd 0x%x" 14404 " returned 0x%x un_status = %d", 14405 un->un_read_pos_type, rval, un->un_status); 14406 /* ENOTTY means it read garbage. try something else. */ 14407 if (rval == ENOTTY) { 14408 rval = EIO; /* so ENOTTY is not final rval */ 14409 } else { 14410 break; 14411 } 14412 } else { 14413 ST_DEBUG4(ST_DEVINFO, st_label, CE_NOTE, 14414 "st_update_block_pos() read position cmd %x" 14415 " returned %x", un->un_read_pos_type, rval); 14416 un->un_running.pmode = previous_pmode; 14417 } 14418 14419 switch (un->un_read_pos_type) { 14420 case SHORT_POS: 14421 un->un_read_pos_type = NO_POS; 14422 break; 14423 14424 case LONG_POS: 14425 un->un_read_pos_type = EXT_POS; 14426 break; 14427 14428 case EXT_POS: 14429 un->un_read_pos_type = SHORT_POS; 14430 break; 14431 14432 default: 14433 ST_DEBUG(ST_DEVINFO, st_label, CE_PANIC, 14434 "Unexpected read position type 0x%x", 14435 un->un_read_pos_type); 14436 } 14437 un->un_status = KEY_NO_SENSE; 14438 } 14439 14440 return (rval); 14441 } 14442 14443 static int 14444 st_get_read_pos(struct scsi_tape *un, buf_t *bp) 14445 { 14446 int result; 14447 size_t d_sz; 14448 caddr_t pos_info; 14449 struct uscsi_cmd *cmd = (struct uscsi_cmd *)bp->b_back; 14450 14451 ST_FUNC(ST_DEVINFO, st_get_read_pos); 14452 14453 if (cmd->uscsi_bufaddr == NULL || cmd->uscsi_buflen <= 0) { 14454 return (0); 14455 } 14456 14457 if (bp_mapin_common(bp, VM_NOSLEEP) == NULL) { 14458 14459 scsi_log(ST_DEVINFO, st_label, SCSI_DEBUG, 14460 "bp_mapin_common() failed"); 14461 14462 return (EIO); 14463 } 14464 14465 d_sz = bp->b_bcount - bp->b_resid; 14466 if (d_sz == 0) { 14467 bp_mapout(bp); 14468 return (EIO); 14469 } 14470 14471 /* 14472 * Copy the buf to a double-word aligned memory that can hold the 14473 * tape_position_t data structure. 14474 */ 14475 if ((pos_info = kmem_alloc(d_sz, KM_NOSLEEP)) == NULL) { 14476 scsi_log(ST_DEVINFO, st_label, SCSI_DEBUG, 14477 "kmem_alloc() failed"); 14478 bp_mapout(bp); 14479 return (EIO); 14480 } 14481 bcopy(bp->b_un.b_addr, pos_info, d_sz); 14482 14483 #ifdef STDEBUG 14484 if ((st_debug & 0x7) > 2) { 14485 st_clean_print(ST_DEVINFO, st_label, SCSI_DEBUG, 14486 "st_get_read_pos() position info", 14487 pos_info, bp->b_bcount); 14488 } 14489 #endif 14490 14491 result = st_interpret_read_pos(un, &un->un_pos, cmd->uscsi_cdb[1], 14492 d_sz, pos_info, 0); 14493 14494 COPY_POS(&un->un_running, &un->un_pos); 14495 14496 kmem_free(pos_info, d_sz); 14497 bp_mapout(bp); 14498 14499 return (result); 14500 } 14501 14502 #if defined(_BIG_ENDIAN) 14503 14504 #define FIX_ENDIAN16(x) 14505 #define FIX_ENDIAN32(x) 14506 #define FIX_ENDIAN64(x) 14507 14508 #elif defined(_LITTLE_ENDIAN) 14509 14510 static void 14511 st_swap16(uint16_t *val) 14512 { 14513 uint16_t tmp; 14514 14515 tmp = (*val >> 8) & 0xff; 14516 tmp |= (*val << 8) & 0xff00; 14517 14518 *val = tmp; 14519 } 14520 14521 static void 14522 st_swap32(uint32_t *val) 14523 { 14524 uint32_t tmp; 14525 14526 tmp = (*val >> 24) & 0xff; 14527 tmp |= (*val >> 8) & 0xff00; 14528 tmp |= (*val << 8) & 0xff0000; 14529 tmp |= (*val << 24) & 0xff000000; 14530 14531 *val = tmp; 14532 } 14533 14534 static void 14535 st_swap64(uint64_t *val) 14536 { 14537 uint32_t low; 14538 uint32_t high; 14539 14540 low = (uint32_t)(*val); 14541 high = (uint32_t)(*val >> 32); 14542 14543 st_swap32(&low); 14544 st_swap32(&high); 14545 14546 *val = high; 14547 *val |= ((uint64_t)low << 32); 14548 } 14549 14550 #define FIX_ENDIAN16(x) st_swap16(x) 14551 #define FIX_ENDIAN32(x) st_swap32(x) 14552 #define FIX_ENDIAN64(x) st_swap64(x) 14553 #endif 14554 14555 /* 14556 * st_interpret_read_pos() 14557 * 14558 * Returns: 14559 * 0 If secsessful. 14560 * EIO If read postion responce data was unuseable or invalid. 14561 * ERANGE If the position of the drive is too large for the read_p_type. 14562 * ENOTTY If the responce data looks invalid for the read position type. 14563 */ 14564 14565 static int 14566 st_interpret_read_pos(struct scsi_tape const *un, tapepos_t *dest, 14567 read_p_types type, size_t data_sz, const caddr_t responce, int post_space) 14568 { 14569 int rval = 0; 14570 int flag = 0; 14571 tapepos_t org; 14572 14573 ST_FUNC(ST_DEVINFO, st_interpret_read_pos); 14574 14575 /* 14576 * We expect the position value to change after a space command. 14577 * So if post_space is set we don't print out what has changed. 14578 */ 14579 if ((dest != &un->un_pos) && (post_space == 0) && 14580 (st_recov_sz == sizeof (recov_info))) { 14581 COPY_POS(&org, dest); 14582 flag = 1; 14583 } 14584 14585 /* 14586 * See what kind of read position was requested. 14587 */ 14588 switch (type) { 14589 14590 case SHORT_POS: /* Short data format */ 14591 { 14592 tape_position_t *pos_info = (tape_position_t *)responce; 14593 uint32_t value; 14594 14595 /* If reserved fields are non zero don't use the data */ 14596 if (pos_info->reserved0 || pos_info->reserved1 || 14597 pos_info->reserved2[0] || pos_info->reserved2[1] || 14598 pos_info->reserved3) { 14599 ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG, 14600 "Invalid Read Short Position Data returned\n"); 14601 rval = EIO; 14602 break; 14603 } 14604 /* 14605 * Position is to large to use this type of read position. 14606 */ 14607 if (pos_info->posi_err == 1) { 14608 ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG, 14609 "Drive reported position error\n"); 14610 rval = ERANGE; 14611 break; 14612 } 14613 /* 14614 * If your at the begining of partition and end at the same 14615 * time it's very small partition or bad data. 14616 */ 14617 if (pos_info->begin_of_part && pos_info->end_of_part) { 14618 ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG, 14619 "SHORT_POS returned begin and end of" 14620 " partition\n"); 14621 rval = EIO; 14622 break; 14623 } 14624 14625 if (pos_info->blk_posi_unkwn == 0) { 14626 14627 value = pos_info->host_block; 14628 FIX_ENDIAN32(&value); 14629 14630 /* 14631 * If the tape is rewound the host blcok should be 0. 14632 */ 14633 if ((pos_info->begin_of_part == 1) && 14634 (value != 0)) { 14635 ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG, 14636 "SHORT_POS returned begin of partition" 14637 " but host block was 0x%x\n", value); 14638 rval = EIO; 14639 break; 14640 } 14641 14642 if (dest->lgclblkno != value) { 14643 if (flag) 14644 flag++; 14645 ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG, 14646 "SHORT_POS current logical 0x%"PRIx64" read" 14647 " 0x%x\n", dest->lgclblkno, value); 14648 } 14649 14650 dest->lgclblkno = (uint64_t)value; 14651 14652 /* 14653 * If the begining of partition is true and the 14654 * block number is zero we will beleive that it is 14655 * rewound. Promote the pmode to legacy. 14656 */ 14657 if ((pos_info->begin_of_part == 1) && 14658 (value == 0)) { 14659 dest->blkno = 0; 14660 dest->fileno = 0; 14661 if (dest->pmode != legacy) 14662 dest->pmode = legacy; 14663 /* 14664 * otherwise if the pmode was invalid, 14665 * promote it to logical. 14666 */ 14667 } else if (dest->pmode == invalid) { 14668 dest->pmode = logical; 14669 } 14670 14671 if (dest->partition != pos_info->partition_number) { 14672 if (flag) 14673 flag++; 14674 ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG, 14675 "SHORT_POS current partition %d read %d\n", 14676 dest->partition, 14677 pos_info->partition_number); 14678 } 14679 14680 dest->partition = pos_info->partition_number; 14681 14682 } else { 14683 dest->pmode = invalid; 14684 ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG, 14685 "Tape drive reported block position as unknown\n"); 14686 } 14687 break; 14688 } 14689 14690 case LONG_POS: /* Long data format */ 14691 { 14692 uint64_t value; 14693 tape_position_long_t *long_pos_info = 14694 (tape_position_long_t *)responce; 14695 14696 /* If reserved fields are non zero don't use the data */ 14697 if ((long_pos_info->reserved0) || 14698 (long_pos_info->reserved1) || 14699 (long_pos_info->reserved2)) { 14700 ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG, 14701 "Invalid Read Long Position Data returned\n"); 14702 rval = ENOTTY; 14703 break; 14704 } 14705 14706 /* Is position Valid */ 14707 if (long_pos_info->blk_posi_unkwn == 0) { 14708 uint32_t part; 14709 14710 value = long_pos_info->block_number; 14711 FIX_ENDIAN64(&value); 14712 14713 /* 14714 * If it says we are at the begining of partition 14715 * the block value better be 0. 14716 */ 14717 if ((long_pos_info->begin_of_part == 1) && 14718 (value != 0)) { 14719 ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG, 14720 "LONG_POS returned begin of partition but" 14721 " block number was 0x%"PRIx64"\n", value); 14722 rval = ENOTTY; 14723 break; 14724 } 14725 /* 14726 * Can't be at the start and the end of the partition 14727 * at the same time if the partition is larger the 0. 14728 */ 14729 if (long_pos_info->begin_of_part && 14730 long_pos_info->end_of_part) { 14731 ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG, 14732 "LONG_POS returned begin and end of" 14733 " partition\n"); 14734 rval = ENOTTY; 14735 break; 14736 } 14737 14738 /* 14739 * If the logical block number is not what we expected. 14740 */ 14741 if (dest->lgclblkno != value) { 14742 if (flag) 14743 flag++; 14744 ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG, 14745 "LONG_POS current logical 0x%"PRIx64 14746 " read 0x%"PRIx64"\n", 14747 dest->lgclblkno, value); 14748 } 14749 dest->lgclblkno = value; 14750 14751 /* 14752 * If the begining of partition is true and the 14753 * block number is zero we will beleive that it is 14754 * rewound. Promote the pmode to legacy. 14755 */ 14756 if ((long_pos_info->begin_of_part == 1) && 14757 (long_pos_info->block_number == 0)) { 14758 dest->blkno = 0; 14759 dest->fileno = 0; 14760 if (dest->pmode != legacy) 14761 dest->pmode = legacy; 14762 /* 14763 * otherwise if the pmode was invalid, 14764 * promote it to logical. 14765 */ 14766 } else if (dest->pmode == invalid) { 14767 dest->pmode = logical; 14768 } 14769 14770 part = long_pos_info->partition; 14771 FIX_ENDIAN32(&part); 14772 if (dest->partition != part) { 14773 if (flag) 14774 flag++; 14775 ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG, 14776 "LONG_POS current partition %d" 14777 " read %d\n", dest->partition, part); 14778 } 14779 dest->partition = part; 14780 } else { 14781 /* 14782 * If the drive doesn't know location, 14783 * we don't either. 14784 */ 14785 ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG, 14786 "Tape drive reported block position as unknown\n"); 14787 dest->pmode = invalid; 14788 } 14789 14790 /* Is file position valid */ 14791 if (long_pos_info->mrk_posi_unkwn == 0) { 14792 value = long_pos_info->file_number; 14793 FIX_ENDIAN64(&value); 14794 /* 14795 * If it says we are at the begining of partition 14796 * the block value better be 0. 14797 */ 14798 if ((long_pos_info->begin_of_part == 1) && 14799 (value != 0)) { 14800 ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG, 14801 "LONG_POS returned begin of partition but" 14802 " block number was 0x%"PRIx64"\n", value); 14803 rval = ENOTTY; 14804 break; 14805 } 14806 if (((dest->pmode == legacy) || 14807 (dest->pmode == logical)) && 14808 (dest->fileno != value)) { 14809 if (flag) 14810 flag++; 14811 ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG, 14812 "LONG_POS fileno 0x%"PRIx64 14813 " not un_pos %x\n", value, 14814 dest->fileno); 14815 } else if (dest->pmode == invalid) { 14816 dest->pmode = logical; 14817 } 14818 dest->fileno = (int32_t)value; 14819 } 14820 14821 if (dest->pmode != invalid && long_pos_info->end_of_part) { 14822 dest->eof = ST_EOT; 14823 } 14824 14825 break; 14826 } 14827 14828 case EXT_POS: /* Extended data format */ 14829 { 14830 uint64_t value; 14831 uint16_t len; 14832 tape_position_ext_t *ext_pos_info = 14833 (tape_position_ext_t *)responce; 14834 14835 /* Make sure that there is enough data there */ 14836 if (data_sz < 16) { 14837 break; 14838 } 14839 14840 /* If reserved fields are non zero don't use the data */ 14841 if (ext_pos_info->reserved0 || ext_pos_info->reserved1) { 14842 ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG, 14843 "EXT_POS reserved fields not zero\n"); 14844 rval = ENOTTY; 14845 break; 14846 } 14847 14848 /* 14849 * In the unlikely event of overflowing 64 bits of position. 14850 */ 14851 if (ext_pos_info->posi_err != 0) { 14852 rval = ERANGE; 14853 break; 14854 } 14855 14856 len = ext_pos_info->parameter_len; 14857 FIX_ENDIAN16(&len); 14858 14859 if (len != 0x1c) { 14860 ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG, 14861 "EXT_POS parameter_len should be 0x1c was 0x%x\n", 14862 len); 14863 rval = ENOTTY; 14864 break; 14865 } 14866 14867 /* Is block position information valid */ 14868 if (ext_pos_info->blk_posi_unkwn == 0) { 14869 14870 value = ext_pos_info->host_block; 14871 FIX_ENDIAN64(&value); 14872 if ((ext_pos_info->begin_of_part == 1) && 14873 (value != 0)) { 14874 ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG, 14875 "EXT_POS returned begining of partition but" 14876 " the host block was 0x%"PRIx64"\n", value); 14877 rval = ENOTTY; 14878 break; 14879 } 14880 14881 if (dest->lgclblkno != value) { 14882 if (flag) 14883 flag++; 14884 ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG, 14885 "EXT_POS current logical 0x%"PRIx64 14886 " read 0x%"PRIx64"\n", 14887 dest->lgclblkno, value); 14888 } 14889 dest->lgclblkno = value; 14890 14891 /* 14892 * If the begining of partition is true and the 14893 * block number is zero we will beleive that it is 14894 * rewound. Promote the pmode to legacy. 14895 */ 14896 if ((ext_pos_info->begin_of_part == 1) && 14897 (ext_pos_info->host_block == 0)) { 14898 dest->blkno = 0; 14899 dest->fileno = 0; 14900 if (dest->pmode != legacy) { 14901 dest->pmode = legacy; 14902 } 14903 /* 14904 * otherwise if the pmode was invalid, 14905 * promote it to logical. 14906 */ 14907 } else if (dest->pmode == invalid) { 14908 dest->pmode = logical; 14909 } 14910 14911 if (dest->partition != ext_pos_info->partition) { 14912 if (flag) 14913 flag++; 14914 ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG, 14915 "EXT_POS current partition %d read %d\n", 14916 dest->partition, 14917 ext_pos_info->partition); 14918 } 14919 dest->partition = ext_pos_info->partition; 14920 14921 } else { 14922 dest->pmode = invalid; 14923 } 14924 break; 14925 } 14926 14927 default: 14928 ST_DEBUG(ST_DEVINFO, st_label, CE_PANIC, 14929 "Got unexpected SCMD_READ_POSITION type %d\n", type); 14930 rval = EIO; 14931 } 14932 14933 if ((flag > 1) && (rval == 0) && (org.pmode != invalid)) { 14934 st_print_position(ST_DEVINFO, st_label, CE_NOTE, 14935 "position read in", &org); 14936 st_print_position(ST_DEVINFO, st_label, CE_NOTE, 14937 "position read out", dest); 14938 } 14939 14940 return (rval); 14941 } 14942 14943 static int 14944 st_logical_block_locate(struct scsi_tape *un, ubufunc_t ubf, tapepos_t *pos, 14945 uint64_t lblk, uchar_t partition) 14946 { 14947 int rval; 14948 char cdb[CDB_GROUP4]; 14949 struct uscsi_cmd *cmd; 14950 struct scsi_extended_sense sense; 14951 bufunc_t bf = (ubf == st_uscsi_cmd) ? st_cmd : st_rcmd; 14952 14953 ST_FUNC(ST_DEVINFO, st_logical_block_locate); 14954 /* 14955 * Not sure what to do when doing recovery and not wanting 14956 * to update un_pos 14957 */ 14958 14959 cmd = kmem_zalloc(sizeof (struct uscsi_cmd), KM_SLEEP); 14960 14961 if (lblk <= INT32_MAX) { 14962 cmd->uscsi_cdblen = CDB_GROUP1; 14963 cdb[0] = SCMD_LOCATE; 14964 cdb[1] = pos->partition == partition ? 0 : 2; 14965 cdb[2] = 0; 14966 cdb[3] = (char)(lblk >> 24); 14967 cdb[4] = (char)(lblk >> 16); 14968 cdb[5] = (char)(lblk >> 8); 14969 cdb[6] = (char)(lblk); 14970 cdb[7] = 0; 14971 cdb[8] = partition; 14972 cdb[9] = 0; 14973 } else { 14974 /* 14975 * If the drive doesn't give a 64 bit read position data 14976 * it is unlikely it will accept 64 bit locates. 14977 */ 14978 if (un->un_read_pos_type != LONG_POS) { 14979 kmem_free(cmd, sizeof (struct uscsi_cmd)); 14980 return (ERANGE); 14981 } 14982 cmd->uscsi_cdblen = CDB_GROUP4; 14983 cdb[0] = (char)SCMD_LOCATE_G4; 14984 cdb[1] = pos->partition == partition ? 0 : 2; 14985 cdb[2] = 0; 14986 cdb[3] = partition; 14987 cdb[4] = (char)(lblk >> 56); 14988 cdb[5] = (char)(lblk >> 48); 14989 cdb[6] = (char)(lblk >> 40); 14990 cdb[7] = (char)(lblk >> 32); 14991 cdb[8] = (char)(lblk >> 24); 14992 cdb[9] = (char)(lblk >> 16); 14993 cdb[10] = (char)(lblk >> 8); 14994 cdb[11] = (char)(lblk); 14995 cdb[12] = 0; 14996 cdb[13] = 0; 14997 cdb[14] = 0; 14998 cdb[15] = 0; 14999 } 15000 15001 15002 cmd->uscsi_flags = USCSI_WRITE | USCSI_DIAGNOSE | USCSI_RQENABLE; 15003 cmd->uscsi_rqbuf = (caddr_t)&sense; 15004 cmd->uscsi_rqlen = sizeof (sense); 15005 cmd->uscsi_timeout = un->un_dp->space_timeout; 15006 cmd->uscsi_cdb = cdb; 15007 15008 rval = ubf(un, cmd, FKIOCTL); 15009 15010 pos->pmode = logical; 15011 pos->eof = ST_NO_EOF; 15012 15013 if (lblk > INT32_MAX) { 15014 /* 15015 * XXX This is a work around till we handle Descriptor format 15016 * sense data. Since we are sending a command where the standard 15017 * sense data can not correctly represent a correct residual in 15018 * 4 bytes. 15019 */ 15020 if (un->un_status == KEY_ILLEGAL_REQUEST) { 15021 scsi_log(ST_DEVINFO, st_label, SCSI_DEBUG, 15022 "Big LOCATE ILLEGAL_REQUEST: rval = %d\n", rval); 15023 /* Doesn't like big locate command */ 15024 un->un_status = 0; 15025 rval = ERANGE; 15026 } else if ((un->un_pos.pmode == invalid) || (rval != 0)) { 15027 /* Aborted big locate command */ 15028 scsi_log(ST_DEVINFO, st_label, SCSI_DEBUG, 15029 "Big LOCATE resulted in invalid pos: rval = %d\n", 15030 rval); 15031 un->un_status = 0; 15032 rval = EIO; 15033 } else if (st_update_block_pos(un, bf, 1)) { 15034 /* read position failed */ 15035 scsi_log(ST_DEVINFO, st_label, SCSI_DEBUG, 15036 "Big LOCATE and read pos: rval = %d\n", rval); 15037 rval = EIO; 15038 } else if (lblk > un->un_pos.lgclblkno) { 15039 /* read position worked but position was not expected */ 15040 scsi_log(ST_DEVINFO, st_label, SCSI_DEBUG, 15041 "Big LOCATE and recover read less then desired 0x%" 15042 PRIx64"\n", un->un_pos.lgclblkno); 15043 un->un_err_resid = lblk - un->un_pos.lgclblkno; 15044 un->un_status = KEY_BLANK_CHECK; 15045 rval = ESPIPE; 15046 } else if (lblk == un->un_pos.lgclblkno) { 15047 /* read position was what was expected */ 15048 scsi_log(ST_DEVINFO, st_label, SCSI_DEBUG, 15049 "Big LOCATE and recover seems to have worked\n"); 15050 un->un_err_resid = 0; 15051 rval = 0; 15052 } else { 15053 ST_DEBUG(ST_DEVINFO, st_label, CE_PANIC, 15054 "BIGLOCATE end up going backwards"); 15055 un->un_err_resid = lblk; 15056 rval = EIO; 15057 } 15058 15059 } else if (rval == 0) { 15060 /* Worked as requested */ 15061 pos->lgclblkno = lblk; 15062 15063 } else if (((cmd->uscsi_status & ST_STATUS_MASK) == STATUS_CHECK) && 15064 (cmd->uscsi_resid != 0)) { 15065 /* Got part way there but wasn't enough blocks on tape */ 15066 pos->lgclblkno = lblk - cmd->uscsi_resid; 15067 un->un_err_resid = cmd->uscsi_resid; 15068 un->un_status = KEY_BLANK_CHECK; 15069 rval = ESPIPE; 15070 15071 } else if (st_update_block_pos(un, bf, 1) == 0) { 15072 /* Got part way there but drive didn't tell what we missed by */ 15073 un->un_err_resid = lblk - pos->lgclblkno; 15074 un->un_status = KEY_BLANK_CHECK; 15075 rval = ESPIPE; 15076 15077 } else { 15078 scsi_log(ST_DEVINFO, st_label, SCSI_DEBUG, 15079 "Failed LOCATE and recover pos: rval = %d status = %d\n", 15080 rval, cmd->uscsi_status); 15081 un->un_err_resid = lblk; 15082 un->un_status = KEY_ILLEGAL_REQUEST; 15083 pos->pmode = invalid; 15084 rval = EIO; 15085 } 15086 15087 kmem_free(cmd, sizeof (struct uscsi_cmd)); 15088 15089 return (rval); 15090 } 15091 15092 static int 15093 st_mtfsf_ioctl(struct scsi_tape *un, int64_t files) 15094 { 15095 int rval; 15096 15097 ST_FUNC(ST_DEVINFO, st_mtfsf_ioctl); 15098 15099 15100 ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, 15101 "st_mtfsf_ioctl: count=%"PRIx64", eof=%x\n", files, un->un_pos.eof); 15102 #if 0 15103 if ((IN_EOF(un->un_pos)) && (files == 1)) { 15104 un->un_pos.fileno++; 15105 un->un_pos.blkno = 0; 15106 return (0); 15107 } 15108 #endif 15109 /* pmode == invalid already handled */ 15110 if (un->un_pos.pmode == legacy) { 15111 /* 15112 * forward space over filemark 15113 * 15114 * For ASF we allow a count of 0 on fsf which means 15115 * we just want to go to beginning of current file. 15116 * Equivalent to "nbsf(0)" or "bsf(1) + fsf". 15117 * Allow stepping over double fmk with reel 15118 */ 15119 if ((un->un_pos.eof >= ST_EOT) && 15120 (files > 0) && 15121 ((un->un_dp->options & ST_REEL) == 0)) { 15122 /* we're at EOM */ 15123 un->un_err_resid = files; 15124 un->un_status = KEY_BLANK_CHECK; 15125 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 15126 "st_mtfsf_ioctl: EIO : MTFSF at EOM"); 15127 return (EIO); 15128 } 15129 15130 /* 15131 * physical tape position may not be what we've been 15132 * telling the user; adjust the request accordingly 15133 */ 15134 if (IN_EOF(un->un_pos)) { 15135 un->un_pos.fileno++; 15136 un->un_pos.blkno = 0; 15137 /* 15138 * For positive direction case, we're now covered. 15139 * For zero or negative direction, we're covered 15140 * (almost) 15141 */ 15142 files--; 15143 } 15144 15145 } 15146 15147 if (st_check_density_or_wfm(un->un_dev, 1, B_READ, STEPBACK)) { 15148 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 15149 "st_mtfsf_ioctl: EIO : MTFSF density/wfm failed"); 15150 return (EIO); 15151 } 15152 15153 15154 /* 15155 * Forward space file marks. 15156 * We leave ourselves at block zero 15157 * of the target file number. 15158 */ 15159 if (files < 0) { 15160 rval = st_backward_space_files(un, -files, 0); 15161 } else { 15162 rval = st_forward_space_files(un, files); 15163 } 15164 15165 return (rval); 15166 } 15167 15168 static int 15169 st_forward_space_files(struct scsi_tape *un, int64_t count) 15170 { 15171 int rval; 15172 15173 ST_FUNC(ST_DEVINFO, st_forward_space_files); 15174 15175 ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, 15176 "fspace: count=%"PRIx64", eof=%x\n", count, un->un_pos.eof); 15177 15178 ASSERT(count >= 0); 15179 ASSERT(un->un_pos.pmode != invalid); 15180 15181 /* 15182 * A space with a count of zero means take me to the start of file. 15183 */ 15184 if (count == 0) { 15185 15186 /* Hay look were already there */ 15187 if (un->un_pos.pmode == legacy && un->un_pos.blkno == 0) { 15188 un->un_err_resid = 0; 15189 COPY_POS(&un->un_err_pos, &un->un_pos); 15190 return (0); 15191 } 15192 15193 /* 15194 * Well we are in the first file. 15195 * A rewind will get to the start. 15196 */ 15197 if (un->un_pos.pmode == legacy && un->un_pos.fileno == 0) { 15198 rval = st_cmd(un, SCMD_REWIND, 0, SYNC_CMD); 15199 15200 /* 15201 * Can we backspace to get there? 15202 * This should work in logical mode. 15203 */ 15204 } else if (un->un_dp->options & ST_BSF) { 15205 rval = st_space_to_begining_of_file(un); 15206 15207 /* 15208 * Can't back space but current file number is known, 15209 * So rewind and space from the begining of the partition. 15210 */ 15211 } else if (un->un_pos.pmode == legacy) { 15212 rval = st_scenic_route_to_begining_of_file(un, 15213 un->un_pos.fileno); 15214 15215 /* 15216 * pmode is logical and ST_BSF is not set. 15217 * The LONG_POS read position contains the fileno. 15218 * If the read position works, rewind and space. 15219 */ 15220 } else if (un->un_read_pos_type == LONG_POS) { 15221 rval = st_cmd(un, SCMD_READ_POSITION, 0, SYNC_CMD); 15222 if (rval) { 15223 /* 15224 * We didn't get the file position from the 15225 * read position command. 15226 * We are going to trust the drive to backspace 15227 * and then position after the filemark. 15228 */ 15229 rval = st_space_to_begining_of_file(un); 15230 } 15231 rval = st_interpret_read_pos(un, &un->un_pos, LONG_POS, 15232 32, (caddr_t)un->un_read_pos_data, 0); 15233 if ((rval) && (un->un_pos.pmode == invalid)) { 15234 rval = st_space_to_begining_of_file(un); 15235 } else { 15236 rval = st_scenic_route_to_begining_of_file(un, 15237 un->un_pos.fileno); 15238 } 15239 } else { 15240 rval = EIO; 15241 } 15242 /* 15243 * If something didn't work we are lost 15244 */ 15245 if (rval != 0) { 15246 un->un_pos.pmode = invalid; 15247 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 15248 "st_mtioctop : EIO : fspace pmode invalid"); 15249 15250 rval = EIO; 15251 } 15252 15253 } else { 15254 rval = st_space_fmks(un, count); 15255 } 15256 15257 if (rval != EIO && count < 0) { 15258 /* 15259 * we came here with a count < 0; we now need 15260 * to skip back to end up before the filemark 15261 */ 15262 rval = st_backward_space_files(un, 1, 1); 15263 } 15264 15265 return (rval); 15266 } 15267 15268 static int 15269 st_scenic_route_to_begining_of_file(struct scsi_tape *un, int32_t fileno) 15270 { 15271 int rval; 15272 15273 ST_FUNC(ST_DEVINFO, st_scenic_route_to_begining_of_file); 15274 15275 if (st_cmd(un, SCMD_REWIND, 0, SYNC_CMD)) { 15276 rval = EIO; 15277 } else if (st_cmd(un, SCMD_SPACE, Fmk(fileno), SYNC_CMD)) { 15278 rval = EIO; 15279 } 15280 15281 return (rval); 15282 } 15283 15284 static int 15285 st_space_to_begining_of_file(struct scsi_tape *un) 15286 { 15287 int rval; 15288 15289 ST_FUNC(ST_DEVINFO, st_space_to_begining_of_file); 15290 15291 /* 15292 * Back space of the file at the begining of the file. 15293 */ 15294 rval = st_cmd(un, SCMD_SPACE, Fmk(-1), SYNC_CMD); 15295 if (rval) { 15296 rval = EIO; 15297 return (rval); 15298 } 15299 15300 /* 15301 * Other interesting answers might be crashed BOT which isn't bad. 15302 */ 15303 if (un->un_status == SUN_KEY_BOT) { 15304 return (rval); 15305 } 15306 15307 un->un_running.pmode = invalid; 15308 15309 /* 15310 * Now we are on the BOP side of the filemark. Forward space to 15311 * the EOM side and we are at the begining of the file. 15312 */ 15313 rval = st_cmd(un, SCMD_SPACE, Fmk(1), SYNC_CMD); 15314 if (rval) { 15315 rval = EIO; 15316 } 15317 15318 return (rval); 15319 } 15320 15321 static int 15322 st_mtfsr_ioctl(struct scsi_tape *un, int64_t count) 15323 { 15324 15325 ST_FUNC(ST_DEVINFO, st_mtfsr_ioctl); 15326 15327 /* 15328 * forward space to inter-record gap 15329 * 15330 */ 15331 15332 ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, 15333 "st_ioctl_fsr: count=%"PRIx64", eof=%x\n", count, un->un_pos.eof); 15334 15335 if (un->un_pos.pmode == legacy) { 15336 /* 15337 * If were are at end of tape and count is forward. 15338 * Return blank check. 15339 */ 15340 if ((un->un_pos.eof >= ST_EOT) && (count > 0)) { 15341 /* we're at EOM */ 15342 un->un_err_resid = count; 15343 un->un_status = KEY_BLANK_CHECK; 15344 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 15345 "st_mtfsr_ioctl: EIO : MTFSR eof > ST_EOT"); 15346 return (EIO); 15347 } 15348 15349 /* 15350 * If count is zero there is nothing to do. 15351 */ 15352 if (count == 0) { 15353 un->un_err_pos.fileno = un->un_pos.fileno; 15354 un->un_err_pos.blkno = un->un_pos.blkno; 15355 un->un_err_resid = 0; 15356 if (IN_EOF(un->un_pos) && SVR4_BEHAVIOR) { 15357 un->un_status = SUN_KEY_EOF; 15358 } 15359 return (0); 15360 } 15361 15362 /* 15363 * physical tape position may not be what we've been 15364 * telling the user; adjust the position accordingly 15365 */ 15366 if (IN_EOF(un->un_pos)) { 15367 daddr_t blkno = un->un_pos.blkno; 15368 int fileno = un->un_pos.fileno; 15369 15370 optype lastop = un->un_lastop; 15371 if (st_cmd(un, SCMD_SPACE, Fmk(-1), SYNC_CMD) 15372 == -1) { 15373 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 15374 "st_mtfsr_ioctl:EIO:MTFSR count && IN_EOF"); 15375 return (EIO); 15376 } 15377 15378 un->un_pos.blkno = blkno; 15379 un->un_pos.fileno = fileno; 15380 un->un_lastop = lastop; 15381 } 15382 } 15383 15384 if (st_check_density_or_wfm(un->un_dev, 1, B_READ, STEPBACK)) { 15385 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 15386 "st_mtfsr_ioctl: EIO : MTFSR st_check_den"); 15387 return (EIO); 15388 } 15389 15390 return (st_space_records(un, count)); 15391 } 15392 15393 static int 15394 st_space_records(struct scsi_tape *un, int64_t count) 15395 { 15396 int64_t dblk; 15397 int rval = 0; 15398 15399 ST_FUNC(ST_DEVINFO, st_space_records); 15400 15401 ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, 15402 "st_space_records: count=%"PRIx64", eof=%x\n", 15403 count, un->un_pos.eof); 15404 15405 if (un->un_pos.pmode == logical) { 15406 rval = st_cmd(un, SCMD_SPACE, Blk(count), SYNC_CMD); 15407 if (rval != 0) { 15408 rval = EIO; 15409 } 15410 return (rval); 15411 } 15412 15413 dblk = count + un->un_pos.blkno; 15414 15415 /* Already there */ 15416 if (dblk == un->un_pos.blkno) { 15417 un->un_err_resid = 0; 15418 COPY_POS(&un->un_err_pos, &un->un_pos); 15419 return (0); 15420 } 15421 15422 /* 15423 * If the destination block is forward 15424 * or the drive will backspace records. 15425 */ 15426 if (un->un_pos.blkno < dblk || (un->un_dp->options & ST_BSR)) { 15427 /* 15428 * If we're spacing forward, or the device can 15429 * backspace records, we can just use the SPACE 15430 * command. 15431 */ 15432 dblk -= un->un_pos.blkno; 15433 if (st_cmd(un, SCMD_SPACE, Blk(dblk), SYNC_CMD)) { 15434 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 15435 "st_space_records:EIO:space_records can't spc"); 15436 rval = EIO; 15437 } else if (un->un_pos.eof >= ST_EOF_PENDING) { 15438 /* 15439 * check if we hit BOT/EOT 15440 */ 15441 if (dblk < 0 && un->un_pos.eof == ST_EOM) { 15442 un->un_status = SUN_KEY_BOT; 15443 un->un_pos.eof = ST_NO_EOF; 15444 } else if (dblk < 0 && 15445 un->un_pos.eof == ST_EOF_PENDING) { 15446 int residue = un->un_err_resid; 15447 /* 15448 * we skipped over a filemark 15449 * and need to go forward again 15450 */ 15451 if (st_cmd(un, SCMD_SPACE, Fmk(1), SYNC_CMD)) { 15452 ST_DEBUG2(ST_DEVINFO, st_label, 15453 SCSI_DEBUG, "st_space_records: EIO" 15454 " : can't space #2"); 15455 rval = EIO; 15456 } 15457 un->un_err_resid = residue; 15458 } 15459 if (rval == 0) { 15460 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 15461 "st_space_records: EIO : space_rec rval" 15462 " == 0"); 15463 rval = EIO; 15464 } 15465 } 15466 } else { 15467 /* 15468 * else we rewind, space forward across filemarks to 15469 * the desired file, and then space records to the 15470 * desired block. 15471 */ 15472 15473 int dfile = un->un_pos.fileno; /* save current file */ 15474 15475 if (dblk < 0) { 15476 /* 15477 * Wups - we're backing up over a filemark 15478 */ 15479 if (un->un_pos.blkno != 0 && 15480 (st_cmd(un, SCMD_REWIND, 0, SYNC_CMD) || 15481 st_cmd(un, SCMD_SPACE, Fmk(dfile), SYNC_CMD))) { 15482 un->un_pos.pmode = invalid; 15483 } 15484 un->un_err_resid = -dblk; 15485 if (un->un_pos.fileno == 0 && un->un_pos.blkno == 0) { 15486 un->un_status = SUN_KEY_BOT; 15487 un->un_pos.eof = ST_NO_EOF; 15488 } else if (un->un_pos.fileno > 0) { 15489 un->un_status = SUN_KEY_EOF; 15490 un->un_pos.eof = ST_NO_EOF; 15491 } 15492 COPY_POS(&un->un_err_pos, &un->un_pos); 15493 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 15494 "st_space_records:EIO:space_records : dblk < 0"); 15495 rval = EIO; 15496 } else if (st_cmd(un, SCMD_REWIND, 0, SYNC_CMD) || 15497 st_cmd(un, SCMD_SPACE, Fmk(dfile), SYNC_CMD) || 15498 st_cmd(un, SCMD_SPACE, Blk(dblk), SYNC_CMD)) { 15499 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 15500 "st_space_records: EIO :space_records : rewind " 15501 "and space failed"); 15502 un->un_pos.pmode = invalid; 15503 rval = EIO; 15504 } 15505 } 15506 15507 return (rval); 15508 } 15509 15510 static int 15511 st_mtbsf_ioctl(struct scsi_tape *un, int64_t files) 15512 { 15513 ST_FUNC(ST_DEVINFO, st_mtbsf_ioctl); 15514 15515 ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, 15516 "st_mtbsf_ioctl: count=%"PRIx64", eof=%x\n", files, un->un_pos.eof); 15517 /* 15518 * backward space of file filemark (1/2" and 8mm) 15519 * tape position will end on the beginning of tape side 15520 * of the desired file mark 15521 */ 15522 if ((un->un_dp->options & ST_BSF) == 0) { 15523 return (ENOTTY); 15524 } 15525 15526 if (un->un_pos.pmode == legacy) { 15527 15528 /* 15529 * If a negative count (which implies a forward space op) 15530 * is specified, and we're at logical or physical eot, 15531 * bounce the request. 15532 */ 15533 15534 if (un->un_pos.eof >= ST_EOT && files < 0) { 15535 un->un_err_resid = files; 15536 un->un_status = SUN_KEY_EOT; 15537 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 15538 "st_ioctl_mt_bsf : EIO : MTBSF : eof > ST_EOF"); 15539 return (EIO); 15540 } 15541 /* 15542 * physical tape position may not be what we've been 15543 * telling the user; adjust the request accordingly 15544 */ 15545 if (IN_EOF(un->un_pos)) { 15546 un->un_pos.fileno++; 15547 un->un_pos.blkno = 0; 15548 files++; 15549 ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, 15550 "st_mtbsf_ioctl in eof: count=%"PRIx64", op=%x\n", 15551 files, MTBSF); 15552 15553 } 15554 } 15555 15556 if (st_check_density_or_wfm(un->un_dev, 1, 0, STEPBACK)) { 15557 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 15558 "st_ioctl : EIO : MTBSF : check den wfm"); 15559 return (EIO); 15560 } 15561 15562 if (files <= 0) { 15563 /* 15564 * for a negative count, we need to step forward 15565 * first and then step back again 15566 */ 15567 files = -files + 1; 15568 return (st_forward_space_files(un, files)); 15569 } 15570 return (st_backward_space_files(un, files, 1)); 15571 } 15572 15573 static int 15574 st_backward_space_files(struct scsi_tape *un, int64_t count, int infront) 15575 { 15576 int64_t end_fileno; 15577 int64_t skip_cnt; 15578 int rval = 0; 15579 15580 ST_FUNC(ST_DEVINFO, st_backward_space_files); 15581 15582 ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, 15583 "st_backward_space_files: count=%"PRIx64" eof=%x\n", 15584 count, un->un_pos.eof); 15585 /* 15586 * Backspace files (MTNBSF): infront == 0 15587 * 15588 * For tapes that can backspace, backspace 15589 * count+1 filemarks and then run forward over 15590 * a filemark 15591 * 15592 * For tapes that can't backspace, 15593 * calculate desired filenumber 15594 * (un->un_pos.fileno - count), rewind, 15595 * and then space forward this amount 15596 * 15597 * Backspace filemarks (MTBSF) infront == 1 15598 * 15599 * For tapes that can backspace, backspace count 15600 * filemarks 15601 * 15602 * For tapes that can't backspace, calculate 15603 * desired filenumber (un->un_pos.fileno - count), 15604 * add 1, rewind, space forward this amount, 15605 * and mark state as ST_EOF_PENDING appropriately. 15606 */ 15607 15608 if (un->un_pos.pmode == logical) { 15609 15610 ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, 15611 "st_backward_space_files: mt_op=%x count=%"PRIx64 15612 "lgclblkno=%"PRIx64"\n", infront?MTBSF:MTNBSF, count, 15613 un->un_pos.lgclblkno); 15614 15615 15616 /* In case a drive that won't back space gets in logical mode */ 15617 if ((un->un_dp->options & ST_BSF) == 0) { 15618 rval = EIO; 15619 return (rval); 15620 } 15621 if ((infront == 1) && 15622 (st_cmd(un, SCMD_SPACE, Fmk(-count), SYNC_CMD))) { 15623 rval = EIO; 15624 return (rval); 15625 } else if ((infront == 0) && 15626 (st_cmd(un, SCMD_SPACE, Fmk((-count)-1), SYNC_CMD)) && 15627 (st_cmd(un, SCMD_SPACE, Fmk(1), SYNC_CMD))) { 15628 rval = EIO; 15629 return (rval); 15630 } 15631 return (rval); 15632 } 15633 15634 ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, 15635 "st_backward_space_files: mt_op=%x count=%"PRIx64 15636 "fileno=%x blkno=%x\n", 15637 infront?MTBSF:MTNBSF, count, un->un_pos.fileno, un->un_pos.blkno); 15638 15639 15640 15641 /* 15642 * Handle the simple case of BOT 15643 * playing a role in these cmds. 15644 * We do this by calculating the 15645 * ending file number. If the ending 15646 * file is < BOT, rewind and set an 15647 * error and mark resid appropriately. 15648 * If we're backspacing a file (not a 15649 * filemark) and the target file is 15650 * the first file on the tape, just 15651 * rewind. 15652 */ 15653 15654 /* figure expected destination of this SPACE command */ 15655 end_fileno = un->un_pos.fileno - count; 15656 15657 /* 15658 * Would the end effect of this SPACE be the same as rewinding? 15659 * If so just rewind instead. 15660 */ 15661 if ((infront != 0) && (end_fileno < 0) || 15662 (infront == 0) && (end_fileno <= 0)) { 15663 if (st_cmd(un, SCMD_REWIND, 0, SYNC_CMD)) { 15664 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 15665 "st_backward_space_files: EIO : " 15666 "rewind in lou of BSF failed\n"); 15667 rval = EIO; 15668 } 15669 if (end_fileno < 0) { 15670 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 15671 "st_backward_space_files: EIO : " 15672 "back space file greater then fileno\n"); 15673 rval = EIO; 15674 un->un_err_resid = -end_fileno; 15675 un->un_status = SUN_KEY_BOT; 15676 } 15677 return (rval); 15678 } 15679 15680 if (un->un_dp->options & ST_BSF) { 15681 skip_cnt = 1 - infront; 15682 /* 15683 * If we are going to end up at the beginning 15684 * of the file, we have to space one extra file 15685 * first, and then space forward later. 15686 */ 15687 end_fileno = -(count + skip_cnt); 15688 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 15689 "skip_cnt=%"PRIx64", tmp=%"PRIx64"\n", 15690 skip_cnt, end_fileno); 15691 if (st_cmd(un, SCMD_SPACE, Fmk(end_fileno), SYNC_CMD)) { 15692 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 15693 "st_backward_space_files:EIO:back space fm failed"); 15694 rval = EIO; 15695 } 15696 } else { 15697 if (st_cmd(un, SCMD_REWIND, 0, SYNC_CMD)) { 15698 rval = EIO; 15699 } else { 15700 skip_cnt = end_fileno + infront; 15701 } 15702 } 15703 15704 /* 15705 * If we have to space forward, do so... 15706 */ 15707 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 15708 "space forward skip_cnt=%"PRIx64", rval=%x\n", skip_cnt, rval); 15709 15710 if (rval == 0 && skip_cnt) { 15711 if (st_cmd(un, SCMD_SPACE, Fmk(skip_cnt), SYNC_CMD)) { 15712 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 15713 "st_backward_space_files:EIO:space fm skip count"); 15714 rval = EIO; 15715 } else if (infront) { 15716 /* 15717 * If we had to space forward, and we're 15718 * not a tape that can backspace, mark state 15719 * as if we'd just seen a filemark during a 15720 * a read. 15721 */ 15722 if ((un->un_dp->options & ST_BSF) == 0) { 15723 un->un_pos.eof = ST_EOF_PENDING; 15724 un->un_pos.fileno -= 1; 15725 un->un_pos.blkno = LASTBLK; 15726 un->un_running.pmode = invalid; 15727 } 15728 } 15729 } 15730 15731 if (rval != 0) { 15732 un->un_pos.pmode = invalid; 15733 } 15734 15735 return (rval); 15736 } 15737 15738 static int 15739 st_mtnbsf_ioctl(struct scsi_tape *un, int64_t count) 15740 { 15741 int rval; 15742 15743 ST_FUNC(ST_DEVINFO, st_mtnbsf_ioctl); 15744 15745 ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, 15746 "nbsf: count=%"PRIx64", eof=%x\n", count, un->un_pos.eof); 15747 15748 if (un->un_pos.pmode == legacy) { 15749 /* 15750 * backward space file to beginning of file 15751 * 15752 * If a negative count (which implies a forward space op) 15753 * is specified, and we're at logical or physical eot, 15754 * bounce the request. 15755 */ 15756 15757 if (un->un_pos.eof >= ST_EOT && count < 0) { 15758 un->un_err_resid = count; 15759 un->un_status = SUN_KEY_EOT; 15760 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 15761 "st_ioctl : EIO : > EOT and count < 0"); 15762 return (EIO); 15763 } 15764 /* 15765 * physical tape position may not be what we've been 15766 * telling the user; adjust the request accordingly 15767 */ 15768 if (IN_EOF(un->un_pos)) { 15769 un->un_pos.fileno++; 15770 un->un_pos.blkno = 0; 15771 count++; 15772 } 15773 } 15774 15775 if (st_check_density_or_wfm(un->un_dev, 1, 0, STEPBACK)) { 15776 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 15777 "st_ioctl : EIO : MTNBSF check den and wfm"); 15778 return (EIO); 15779 } 15780 15781 ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, 15782 "mtnbsf: count=%"PRIx64", eof=%x\n", count, un->un_pos.eof); 15783 15784 if (count <= 0) { 15785 rval = st_forward_space_files(un, -count); 15786 } else { 15787 rval = st_backward_space_files(un, count, 0); 15788 } 15789 return (rval); 15790 } 15791 15792 static int 15793 st_mtbsr_ioctl(struct scsi_tape *un, int64_t num) 15794 { 15795 ST_FUNC(ST_DEVINFO, st_mtbsr_ioctl); 15796 15797 ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, 15798 "bsr: count=%"PRIx64", eof=%x\n", num, un->un_pos.eof); 15799 15800 if (un->un_pos.pmode == legacy) { 15801 /* 15802 * backward space into inter-record gap 15803 * 15804 * If a negative count (which implies a forward space op) 15805 * is specified, and we're at logical or physical eot, 15806 * bounce the request. 15807 */ 15808 if (un->un_pos.eof >= ST_EOT && num < 0) { 15809 un->un_err_resid = num; 15810 un->un_status = SUN_KEY_EOT; 15811 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 15812 "st_ioctl : EIO : MTBSR > EOT"); 15813 return (EIO); 15814 } 15815 15816 if (num == 0) { 15817 COPY_POS(&un->un_err_pos, &un->un_pos); 15818 un->un_err_resid = 0; 15819 if (IN_EOF(un->un_pos) && SVR4_BEHAVIOR) { 15820 un->un_status = SUN_KEY_EOF; 15821 } 15822 return (0); 15823 } 15824 15825 /* 15826 * physical tape position may not be what we've been 15827 * telling the user; adjust the position accordingly. 15828 * bsr can not skip filemarks and continue to skip records 15829 * therefore if we are logically before the filemark but 15830 * physically at the EOT side of the filemark, we need to step 15831 * back; this allows fsr N where N > number of blocks in file 15832 * followed by bsr 1 to position at the beginning of last block 15833 */ 15834 if (IN_EOF(un->un_pos)) { 15835 tapepos_t save; 15836 optype lastop = un->un_lastop; 15837 15838 COPY_POS(&save, &un->un_pos); 15839 if (st_cmd(un, SCMD_SPACE, Fmk(-1), SYNC_CMD) == -1) { 15840 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 15841 "st_mtbsr_ioctl: EIO : MTBSR can't space"); 15842 return (EIO); 15843 } 15844 15845 COPY_POS(&un->un_pos, &save); 15846 un->un_lastop = lastop; 15847 } 15848 } 15849 15850 un->un_pos.eof = ST_NO_EOF; 15851 15852 if (st_check_density_or_wfm(un->un_dev, 1, 0, STEPBACK)) { 15853 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 15854 "st_ioctl : EIO : MTBSR : can't set density or wfm"); 15855 return (EIO); 15856 } 15857 15858 num = -num; 15859 return (st_space_records(un, num)); 15860 } 15861 15862 static int 15863 st_mtfsfm_ioctl(struct scsi_tape *un, int64_t cnt) 15864 { 15865 int rval; 15866 15867 ST_FUNC(ST_DEVINFO, st_mtfsfm_ioctl); 15868 15869 rval = st_cmd(un, SCMD_SPACE, SPACE(SP_SQFLM, cnt), SYNC_CMD); 15870 if (rval == 0) { 15871 un->un_pos.pmode = logical; 15872 } else if ((un->un_status == KEY_ILLEGAL_REQUEST) && 15873 (un->un_sd->sd_sense->es_add_code == 0x24)) { 15874 /* 15875 * Drive says invalid field in cdb. 15876 * Doesn't like space multiple. Position isn't lost. 15877 */ 15878 un->un_err_resid = cnt; 15879 un->un_status = 0; 15880 rval = ENOTTY; 15881 } else { 15882 un->un_err_resid = cnt; 15883 un->un_pos.pmode = invalid; 15884 } 15885 return (rval); 15886 } 15887 15888 static int 15889 st_mtbsfm_ioctl(struct scsi_tape *un, int64_t cnt) 15890 { 15891 int rval; 15892 15893 ST_FUNC(ST_DEVINFO, st_mtbsfm_ioctl); 15894 15895 rval = st_cmd(un, SCMD_SPACE, SPACE(SP_SQFLM, -cnt), SYNC_CMD); 15896 if (rval == 0) { 15897 un->un_pos.pmode = logical; 15898 } else if ((un->un_status == KEY_ILLEGAL_REQUEST) && 15899 (un->un_sd->sd_sense->es_add_code == 0x24)) { 15900 /* 15901 * Drive says invalid field in cdb. 15902 * Doesn't like space multiple. Position isn't lost. 15903 */ 15904 un->un_err_resid = cnt; 15905 un->un_status = 0; 15906 rval = ENOTTY; 15907 } else { 15908 un->un_err_resid = cnt; 15909 un->un_pos.pmode = invalid; 15910 } 15911 return (rval); 15912 } 15913 15914 #ifdef __x86 15915 15916 /* 15917 * release contig_mem and wake up waiting thread, if any 15918 */ 15919 static void 15920 st_release_contig_mem(struct scsi_tape *un, struct contig_mem *cp) 15921 { 15922 mutex_enter(ST_MUTEX); 15923 15924 ST_FUNC(ST_DEVINFO, st_release_contig_mem); 15925 15926 cp->cm_next = un->un_contig_mem; 15927 un->un_contig_mem = cp; 15928 un->un_contig_mem_available_num++; 15929 cv_broadcast(&un->un_contig_mem_cv); 15930 15931 mutex_exit(ST_MUTEX); 15932 } 15933 15934 /* 15935 * St_get_contig_mem will return a contig_mem if there is one available 15936 * in current system. Otherwise, it will try to alloc one, if the total 15937 * number of contig_mem is within st_max_contig_mem_num. 15938 * It will sleep, if allowed by caller or return NULL, if no contig_mem 15939 * is available for now. 15940 */ 15941 static struct contig_mem * 15942 st_get_contig_mem(struct scsi_tape *un, size_t len, int alloc_flags) 15943 { 15944 size_t rlen; 15945 struct contig_mem *cp = NULL; 15946 ddi_acc_handle_t acc_hdl; 15947 caddr_t addr; 15948 int big_enough = 0; 15949 int (*dma_alloc_cb)() = (alloc_flags == KM_SLEEP) ? 15950 DDI_DMA_SLEEP : DDI_DMA_DONTWAIT; 15951 15952 /* Try to get one available contig_mem */ 15953 mutex_enter(ST_MUTEX); 15954 15955 ST_FUNC(ST_DEVINFO, st_get_contig_mem); 15956 15957 if (un->un_contig_mem_available_num > 0) { 15958 ST_GET_CONTIG_MEM_HEAD(un, cp, len, big_enough); 15959 } else if (un->un_contig_mem_total_num < st_max_contig_mem_num) { 15960 /* 15961 * we failed to get one. we're going to 15962 * alloc one more contig_mem for this I/O 15963 */ 15964 mutex_exit(ST_MUTEX); 15965 cp = (struct contig_mem *)kmem_zalloc( 15966 sizeof (struct contig_mem) + biosize(), 15967 alloc_flags); 15968 if (cp == NULL) { 15969 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 15970 "alloc contig_mem failure\n"); 15971 return (NULL); /* cannot get one */ 15972 } 15973 cp->cm_bp = (struct buf *) 15974 (((caddr_t)cp) + sizeof (struct contig_mem)); 15975 bioinit(cp->cm_bp); 15976 mutex_enter(ST_MUTEX); 15977 un->un_contig_mem_total_num++; /* one more available */ 15978 } else { 15979 /* 15980 * we failed to get one and we're NOT allowed to 15981 * alloc more contig_mem 15982 */ 15983 if (alloc_flags == KM_SLEEP) { 15984 while (un->un_contig_mem_available_num <= 0) { 15985 cv_wait(&un->un_contig_mem_cv, ST_MUTEX); 15986 } 15987 ST_GET_CONTIG_MEM_HEAD(un, cp, len, big_enough); 15988 } else { 15989 mutex_exit(ST_MUTEX); 15990 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 15991 "alloc contig_mem failure\n"); 15992 return (NULL); /* cannot get one */ 15993 } 15994 } 15995 mutex_exit(ST_MUTEX); 15996 15997 /* We need to check if this block of mem is big enough for this I/O */ 15998 if (cp->cm_len < len) { 15999 /* not big enough, need to alloc a new one */ 16000 if (ddi_dma_mem_alloc(un->un_contig_mem_hdl, len, &st_acc_attr, 16001 DDI_DMA_STREAMING, dma_alloc_cb, NULL, 16002 &addr, &rlen, &acc_hdl) != DDI_SUCCESS) { 16003 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 16004 "alloc contig_mem failure: not enough mem\n"); 16005 st_release_contig_mem(un, cp); 16006 cp = NULL; 16007 } else { 16008 if (cp->cm_addr) { 16009 /* release previous one before attach new one */ 16010 ddi_dma_mem_free(&cp->cm_acc_hdl); 16011 } 16012 mutex_enter(ST_MUTEX); 16013 un->un_max_contig_mem_len = 16014 un->un_max_contig_mem_len >= len ? 16015 un->un_max_contig_mem_len : len; 16016 mutex_exit(ST_MUTEX); 16017 16018 /* attach new mem to this cp */ 16019 cp->cm_addr = addr; 16020 cp->cm_acc_hdl = acc_hdl; 16021 cp->cm_len = len; 16022 16023 goto alloc_ok; /* get one usable cp */ 16024 } 16025 } else { 16026 goto alloc_ok; /* get one usable cp */ 16027 } 16028 16029 /* cannot find/alloc a usable cp, when we get here */ 16030 16031 mutex_enter(ST_MUTEX); 16032 if ((un->un_max_contig_mem_len < len) || 16033 (alloc_flags != KM_SLEEP)) { 16034 mutex_exit(ST_MUTEX); 16035 return (NULL); 16036 } 16037 16038 /* 16039 * we're allowed to sleep, and there is one big enough 16040 * contig mem in the system, which is currently in use, 16041 * wait for it... 16042 */ 16043 big_enough = 1; 16044 do { 16045 cv_wait(&un->un_contig_mem_cv, ST_MUTEX); 16046 ST_GET_CONTIG_MEM_HEAD(un, cp, len, big_enough); 16047 } while (cp == NULL); 16048 mutex_exit(ST_MUTEX); 16049 16050 /* we get the big enough contig mem, finally */ 16051 16052 alloc_ok: 16053 /* init bp attached to this cp */ 16054 bioreset(cp->cm_bp); 16055 cp->cm_bp->b_un.b_addr = cp->cm_addr; 16056 cp->cm_bp->b_private = (void *)cp; 16057 16058 return (cp); 16059 } 16060 16061 /* 16062 * this is the biodone func for the bp used in big block I/O 16063 */ 16064 static int 16065 st_bigblk_xfer_done(struct buf *bp) 16066 { 16067 struct contig_mem *cp; 16068 struct buf *orig_bp; 16069 int ioerr; 16070 struct scsi_tape *un; 16071 16072 /* sanity check */ 16073 if (bp == NULL) { 16074 return (DDI_FAILURE); 16075 } 16076 16077 un = ddi_get_soft_state(st_state, MTUNIT(bp->b_edev)); 16078 if (un == NULL) { 16079 return (DDI_FAILURE); 16080 } 16081 16082 ST_FUNC(ST_DEVINFO, st_bigblk_xfer_done); 16083 16084 cp = (struct contig_mem *)bp->b_private; 16085 orig_bp = cp->cm_bp; /* get back the bp we have replaced */ 16086 cp->cm_bp = bp; 16087 16088 /* special handling for special I/O */ 16089 if (cp->cm_use_sbuf) { 16090 #ifndef __lock_lint 16091 ASSERT(un->un_sbuf_busy); 16092 #endif 16093 un->un_sbufp = orig_bp; 16094 cp->cm_use_sbuf = 0; 16095 } 16096 16097 orig_bp->b_resid = bp->b_resid; 16098 ioerr = geterror(bp); 16099 if (ioerr != 0) { 16100 bioerror(orig_bp, ioerr); 16101 } else if (orig_bp->b_flags & B_READ) { 16102 /* copy data back to original bp */ 16103 (void) bp_copyout(bp->b_un.b_addr, orig_bp, 0, 16104 bp->b_bcount - bp->b_resid); 16105 } 16106 16107 st_release_contig_mem(un, cp); 16108 16109 biodone(orig_bp); 16110 16111 return (DDI_SUCCESS); 16112 } 16113 16114 /* 16115 * We use this func to replace original bp that may not be able to do I/O 16116 * in big block size with one that can 16117 */ 16118 static struct buf * 16119 st_get_bigblk_bp(struct buf *bp) 16120 { 16121 struct contig_mem *cp; 16122 struct scsi_tape *un; 16123 struct buf *cont_bp; 16124 16125 un = ddi_get_soft_state(st_state, MTUNIT(bp->b_edev)); 16126 if (un == NULL) { 16127 return (bp); 16128 } 16129 16130 ST_FUNC(ST_DEVINFO, st_get_bigblk_bp); 16131 16132 /* try to get one contig_mem */ 16133 cp = st_get_contig_mem(un, bp->b_bcount, KM_SLEEP); 16134 if (!cp) { 16135 scsi_log(ST_DEVINFO, st_label, CE_WARN, 16136 "Cannot alloc contig buf for I/O for %lu blk size", 16137 bp->b_bcount); 16138 return (bp); 16139 } 16140 cont_bp = cp->cm_bp; 16141 cp->cm_bp = bp; 16142 16143 /* make sure that we "are" using un_sbufp for special I/O */ 16144 if (bp == un->un_sbufp) { 16145 #ifndef __lock_lint 16146 ASSERT(un->un_sbuf_busy); 16147 #endif 16148 un->un_sbufp = cont_bp; 16149 cp->cm_use_sbuf = 1; 16150 } 16151 16152 /* clone bp */ 16153 cont_bp->b_bcount = bp->b_bcount; 16154 cont_bp->b_resid = bp->b_resid; 16155 cont_bp->b_iodone = st_bigblk_xfer_done; 16156 cont_bp->b_file = bp->b_file; 16157 cont_bp->b_offset = bp->b_offset; 16158 cont_bp->b_dip = bp->b_dip; 16159 cont_bp->b_error = 0; 16160 cont_bp->b_proc = NULL; 16161 cont_bp->b_flags = bp->b_flags & ~(B_PAGEIO | B_PHYS | B_SHADOW); 16162 cont_bp->b_shadow = NULL; 16163 cont_bp->b_pages = NULL; 16164 cont_bp->b_edev = bp->b_edev; 16165 cont_bp->b_dev = bp->b_dev; 16166 cont_bp->b_lblkno = bp->b_lblkno; 16167 cont_bp->b_forw = bp->b_forw; 16168 cont_bp->b_back = bp->b_back; 16169 cont_bp->av_forw = bp->av_forw; 16170 cont_bp->av_back = bp->av_back; 16171 cont_bp->b_bufsize = bp->b_bufsize; 16172 16173 /* get data in original bp */ 16174 if (bp->b_flags & B_WRITE) { 16175 (void) bp_copyin(bp, cont_bp->b_un.b_addr, 0, bp->b_bcount); 16176 } 16177 16178 return (cont_bp); 16179 } 16180 #else 16181 #ifdef __lock_lint 16182 static int 16183 st_bigblk_xfer_done(struct buf *bp) 16184 { 16185 return (0); 16186 } 16187 #endif 16188 #endif 16189 16190 static const char *eof_status[] = 16191 { 16192 "NO_EOF", 16193 "EOF_PENDING", 16194 "EOF", 16195 "EOT_PENDING", 16196 "EOT", 16197 "EOM", 16198 "AFTER_EOM" 16199 }; 16200 static const char *mode[] = { 16201 "invalid", 16202 "legacy", 16203 "logical" 16204 }; 16205 16206 static void 16207 st_print_position(dev_info_t *dev, char *label, uint_t level, 16208 const char *comment, tapepos_t *pos) 16209 { 16210 ST_FUNC(dev, st_print_position); 16211 16212 scsi_log(dev, label, level, 16213 "%s Position data:\n", comment); 16214 scsi_log(dev, label, CE_CONT, 16215 "Positioning mode = %s", mode[pos->pmode]); 16216 scsi_log(dev, label, CE_CONT, 16217 "End Of File/Tape = %s", eof_status[pos->eof]); 16218 scsi_log(dev, label, CE_CONT, 16219 "File Number = 0x%x", pos->fileno); 16220 scsi_log(dev, label, CE_CONT, 16221 "Block Number = 0x%x", pos->blkno); 16222 scsi_log(dev, label, CE_CONT, 16223 "Logical Block = 0x%"PRIx64, pos->lgclblkno); 16224 scsi_log(dev, label, CE_CONT, 16225 "Partition Number = 0x%x", pos->partition); 16226 } 16227 static int 16228 st_check_if_media_changed(struct scsi_tape *un, caddr_t data, int size) 16229 { 16230 16231 int result = 0; 16232 int i; 16233 ST_FUNC(ST_DEVINFO, st_check_if_media_changed); 16234 16235 /* 16236 * find non alpha numeric working from the end. 16237 */ 16238 for (i = size - 1; i >= 0; i--) { 16239 if (ISALNUM(data[i]) == 0 || data[i] == ' ') { 16240 data[i] = 0; 16241 size = i; 16242 } 16243 } 16244 16245 if (size == 1) { 16246 /* 16247 * Drive seems to think its returning useful data 16248 * but it looks like all junk 16249 */ 16250 return (result); 16251 } 16252 16253 size++; 16254 16255 /* 16256 * Actually got a valid serial number. 16257 * If never stored one before alloc space for it. 16258 */ 16259 if (un->un_media_id_len == 0) { 16260 un->un_media_id = kmem_zalloc(size, KM_SLEEP); 16261 un->un_media_id_len = size; 16262 (void) strncpy(un->un_media_id, data, min(size, strlen(data))); 16263 un->un_media_id[min(size, strlen(data))] = 0; 16264 ST_DEBUG1(ST_DEVINFO, st_label, SCSI_DEBUG, 16265 "Found Media Id %s length = %d\n", un->un_media_id, size); 16266 } else if (size > un->un_media_id_len) { 16267 if (strncmp(un->un_media_id, data, size) != 0) { 16268 result = ESPIPE; 16269 } 16270 ST_DEBUG1(ST_DEVINFO, st_label, SCSI_DEBUG, 16271 "Longer Media Id old ID:%s new ID:%s\n", 16272 un->un_media_id, data); 16273 kmem_free(un->un_media_id, un->un_media_id_len); 16274 un->un_media_id = kmem_zalloc(size, KM_SLEEP); 16275 un->un_media_id_len = size; 16276 (void) strncpy(un->un_media_id, data, size); 16277 un->un_media_id[size] = 0; 16278 } else if (strncmp(data, un->un_media_id, 16279 min(size, un->un_media_id_len)) != 0) { 16280 ST_DEBUG1(ST_DEVINFO, st_label, SCSI_DEBUG, 16281 "Old Media Id %s length = %d New %s length = %d\n", 16282 un->un_media_id, un->un_media_id_len, data, size); 16283 bzero(un->un_media_id, un->un_media_id_len); 16284 (void) strncpy(un->un_media_id, data, min(size, strlen(data))); 16285 un->un_media_id[min(size, strlen(data))] = 0; 16286 result = ESPIPE; 16287 } else { 16288 ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, 16289 "Media Id still %s\n", un->un_media_id); 16290 } 16291 16292 ASSERT(strlen(un->un_media_id) <= size); 16293 16294 return (result); 16295 } 16296 #define ID_SIZE 32 16297 typedef struct 16298 { 16299 uchar_t avilable_data0; 16300 uchar_t avilable_data1; 16301 uchar_t avilable_data2; 16302 uchar_t avilable_data3; 16303 uchar_t attribute_msb; 16304 uchar_t attribute_lsb; 16305 #ifdef _BIT_FIELDS_LTOH 16306 uchar_t format : 2, 16307 : 5, 16308 read_only : 1; 16309 #else 16310 uchar_t read_only : 1, 16311 : 5, 16312 format : 2; 16313 #endif 16314 uchar_t attribute_len_msb; 16315 uchar_t attribute_len_lsb; 16316 }attribute_header; 16317 16318 typedef struct { 16319 attribute_header header; 16320 char data[1]; 16321 }mam_attribute; 16322 16323 static int 16324 st_handle_hex_media_id(struct scsi_tape *un, void *pnt, int size) 16325 { 16326 int result; 16327 int newsize = (size << 1) + 3; /* extra for leading 0x and null term */ 16328 int i; 16329 uchar_t byte; 16330 char *format; 16331 uchar_t *data = (uchar_t *)pnt; 16332 char *buf = kmem_alloc(newsize, KM_SLEEP); 16333 16334 ST_FUNC(ST_DEVINFO, st_handle_hex_media_id); 16335 16336 (void) sprintf(buf, "0x"); 16337 for (i = 0; i < size; i++) { 16338 byte = data[i]; 16339 if (byte < 0x10) 16340 format = "0%x"; 16341 else 16342 format = "%x"; 16343 (void) sprintf(&buf[(int)strlen(buf)], format, byte); 16344 } 16345 result = st_check_if_media_changed(un, buf, newsize); 16346 16347 kmem_free(buf, newsize); 16348 16349 return (result); 16350 } 16351 16352 16353 static int 16354 st_get_media_id_via_read_attribute(struct scsi_tape *un, ubufunc_t bufunc) 16355 { 16356 int result; 16357 mam_attribute *buffer; 16358 int size; 16359 int newsize; 16360 16361 ST_FUNC(ST_DEVINFO, st_get_media_id_via_read_attribute); 16362 size = sizeof (attribute_header) + max(un->un_media_id_len, ID_SIZE); 16363 again: 16364 buffer = kmem_zalloc(size, KM_SLEEP); 16365 result = st_read_attributes(un, 0x0401, buffer, size, bufunc); 16366 if (result == 0) { 16367 16368 newsize = (buffer->header.attribute_len_msb << 8) | 16369 buffer->header.attribute_len_lsb; 16370 16371 if (newsize + sizeof (attribute_header) > size) { 16372 ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG, 16373 "resizing read attribute data from %d to %d format" 16374 " %d\n", size, (int)sizeof (attribute_header) + 16375 newsize, buffer->header.format); 16376 kmem_free(buffer, size); 16377 size = newsize + sizeof (attribute_header); 16378 goto again; 16379 } 16380 16381 un->un_media_id_method = st_get_media_id_via_read_attribute; 16382 if (buffer->header.format == 0) { 16383 result = 16384 st_handle_hex_media_id(un, buffer->data, newsize); 16385 } else { 16386 result = st_check_if_media_changed(un, buffer->data, 16387 newsize); 16388 } 16389 } else if (result == EINVAL && un->un_max_cdb_sz < CDB_GROUP4) { 16390 scsi_log(ST_DEVINFO, st_label, CE_NOTE, 16391 "Read Attribute Command for Media Identification is not " 16392 "supported on the HBA that this drive is attached to."); 16393 result = ENOTTY; 16394 } 16395 16396 kmem_free(buffer, size); 16397 un->un_status = 0; 16398 16399 return (result); 16400 } 16401 16402 16403 static int 16404 st_get_media_id_via_media_serial_cmd(struct scsi_tape *un, ubufunc_t bufunc) 16405 { 16406 char cdb[CDB_GROUP5]; 16407 struct uscsi_cmd *ucmd; 16408 struct scsi_extended_sense sense; 16409 int rval; 16410 int size = max(un->un_media_id_len, ID_SIZE); 16411 caddr_t buf; 16412 16413 ST_FUNC(ST_DEVINFO, st_get_media_id_via_media_serial_cmd); 16414 16415 if (un->un_sd->sd_inq->inq_ansi < 3) { 16416 return (ENOTTY); 16417 } 16418 16419 ucmd = kmem_zalloc(sizeof (struct uscsi_cmd), KM_SLEEP); 16420 upsize: 16421 buf = kmem_alloc(size, KM_SLEEP); 16422 16423 cdb[0] = (char)SCMD_SVC_ACTION_IN_G5; 16424 cdb[1] = SSVC_ACTION_READ_MEDIA_SERIAL; 16425 cdb[2] = 0; 16426 cdb[3] = 0; 16427 cdb[4] = 0; 16428 cdb[5] = 0; 16429 cdb[6] = (char)(size >> 24); 16430 cdb[7] = (char)(size >> 16); 16431 cdb[8] = (char)(size >> 8); 16432 cdb[9] = (char)(size); 16433 cdb[10] = 0; 16434 cdb[11] = 0; 16435 16436 ucmd->uscsi_flags = USCSI_READ | USCSI_RQENABLE; 16437 ucmd->uscsi_timeout = un->un_dp->non_motion_timeout; 16438 ucmd->uscsi_cdb = &cdb[0]; 16439 ucmd->uscsi_cdblen = sizeof (cdb); 16440 ucmd->uscsi_bufaddr = buf; 16441 ucmd->uscsi_buflen = size; 16442 ucmd->uscsi_rqbuf = (caddr_t)&sense; 16443 ucmd->uscsi_rqlen = sizeof (sense); 16444 16445 rval = bufunc(un, ucmd, FKIOCTL); 16446 16447 if (rval || ucmd->uscsi_status != 0) { 16448 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 16449 "media serial command returned %d scsi_status %d" 16450 " rqstatus %d", rval, ucmd->uscsi_status, 16451 ucmd->uscsi_rqstatus); 16452 /* 16453 * If this returns invalid operation code don't try again. 16454 */ 16455 if (sense.es_key == KEY_ILLEGAL_REQUEST && 16456 sense.es_add_code == 0x20) { 16457 rval = ENOTTY; 16458 } else if (rval == 0) { 16459 rval = EIO; 16460 } 16461 un->un_status = 0; 16462 } else { 16463 int act_size; 16464 16465 /* 16466 * get reported size. 16467 */ 16468 act_size = (int)buf[3] | (int)(buf[2] << 8) | 16469 (int)(buf[1] << 16) | (int)(buf[0] << 24); 16470 16471 /* documentation says mod 4. */ 16472 while (act_size & 3) { 16473 act_size++; 16474 } 16475 16476 /* 16477 * If reported size is larger that we our buffer. 16478 * Free the old one and allocate one that is larger 16479 * enough and re-issuse the command. 16480 */ 16481 if (act_size + 4 > size) { 16482 kmem_free(buf, size); 16483 size = act_size + 4; 16484 goto upsize; 16485 } 16486 16487 if (act_size == 0) { 16488 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 16489 "media serial number is not available"); 16490 un->un_status = 0; 16491 rval = 0; 16492 } else { 16493 /* 16494 * set data pointer to point to the start 16495 * of that serial number. 16496 */ 16497 un->un_media_id_method = 16498 st_get_media_id_via_media_serial_cmd; 16499 rval = 16500 st_check_if_media_changed(un, &buf[4], act_size); 16501 } 16502 } 16503 16504 kmem_free(ucmd, sizeof (struct uscsi_cmd)); 16505 kmem_free(buf, size); 16506 16507 return (rval); 16508 } 16509 16510 16511 /* ARGSUSED */ 16512 static int 16513 st_bogus_media_id(struct scsi_tape *un, ubufunc_t bufunc) 16514 { 16515 ST_FUNC(ST_DEVINFO, st_bogus_media_id); 16516 16517 ASSERT(un->un_media_id == NULL || un->un_media_id == bogusID); 16518 ASSERT(un->un_media_id_len == 0); 16519 un->un_media_id = (char *)bogusID; 16520 un->un_media_id_len = 0; 16521 return (0); 16522 } 16523 16524 typedef int (*media_chk_function)(struct scsi_tape *, ubufunc_t bufunc); 16525 16526 media_chk_function media_chk_functions[] = { 16527 st_get_media_id_via_media_serial_cmd, 16528 st_get_media_id_via_read_attribute, 16529 st_bogus_media_id 16530 }; 16531 16532 static int 16533 st_get_media_identification(struct scsi_tape *un, ubufunc_t bufunc) 16534 { 16535 int result = 0; 16536 int i; 16537 16538 ST_FUNC(ST_DEVINFO, st_get_media_identification); 16539 16540 for (i = 0; i < ST_NUM_MEMBERS(media_chk_functions); i++) { 16541 if (result == ENOTTY) { 16542 /* 16543 * Last operation type not supported by this device. 16544 * Make so next time it doesn`t do that again. 16545 */ 16546 un->un_media_id_method = media_chk_functions[i]; 16547 } else if (un->un_media_id_method != media_chk_functions[i] && 16548 un->un_media_id_method != st_get_media_identification) { 16549 continue; 16550 } 16551 result = media_chk_functions[i](un, bufunc); 16552 /* 16553 * If result indicates the function was successful or 16554 * that the media is not the same as last known, break. 16555 */ 16556 if (result == 0 || result == ESPIPE) { 16557 break; 16558 } 16559 } 16560 16561 return (result); 16562 } 16563 16564 static errstate 16565 st_command_recovery(struct scsi_tape *un, struct scsi_pkt *pkt, 16566 errstate onentry) 16567 { 16568 16569 int ret; 16570 st_err_info *errinfo; 16571 recov_info *ri = (recov_info *)pkt->pkt_private; 16572 16573 ST_FUNC(ST_DEVINFO, st_command_recovery); 16574 16575 ASSERT(MUTEX_HELD(&un->un_sd->sd_mutex)); 16576 16577 ASSERT(un->un_recov_buf_busy == 0); 16578 16579 /* 16580 * Don't try and recover a reset that this device sent. 16581 */ 16582 if (un->un_rsvd_status & ST_INITIATED_RESET && 16583 onentry == DEVICE_RESET) { 16584 return (COMMAND_DONE_ERROR); 16585 } 16586 16587 /* 16588 * See if expected position was passed with scsi_pkt. 16589 */ 16590 if (ri->privatelen == sizeof (recov_info)) { 16591 16592 /* 16593 * Not for this command. 16594 */ 16595 if (ri->cmd_attrib->do_not_recover) { 16596 return (COMMAND_DONE_ERROR); 16597 } 16598 16599 /* 16600 * Create structure to hold all error state info. 16601 */ 16602 errinfo = kmem_zalloc(ST_ERR_INFO_SIZE, KM_SLEEP); 16603 errinfo->ei_error_type = onentry; 16604 errinfo->ei_failing_bp = ri->cmd_bp; 16605 COPY_POS(&errinfo->ei_expected_pos, &ri->pos); 16606 } else { 16607 /* disabled */ 16608 return (COMMAND_DONE_ERROR); 16609 } 16610 16611 bcopy(pkt, &errinfo->ei_failed_pkt, scsi_pkt_size()); 16612 bcopy(pkt->pkt_scbp, &errinfo->ei_failing_status, SECMDS_STATUS_SIZE); 16613 ret = ddi_taskq_dispatch(un->un_recov_taskq, st_recover, errinfo, 16614 DDI_NOSLEEP); 16615 ASSERT(ret == DDI_SUCCESS); 16616 if (ret != DDI_SUCCESS) { 16617 kmem_free(errinfo, ST_ERR_INFO_SIZE); 16618 return (COMMAND_DONE_ERROR); 16619 } 16620 return (JUST_RETURN); /* release calling thread */ 16621 } 16622 16623 16624 static void 16625 st_recov_ret(struct scsi_tape *un, st_err_info *errinfo, errstate err) 16626 { 16627 int error_number; 16628 buf_t *bp; 16629 16630 16631 ST_FUNC(ST_DEVINFO, st_recov_ret); 16632 16633 ASSERT(MUTEX_HELD(&un->un_sd->sd_mutex)); 16634 #if !defined(lint) 16635 _NOTE(LOCK_RELEASED_AS_SIDE_EFFECT(&un->un_sd->sd_mutex)) 16636 #endif 16637 16638 bp = errinfo->ei_failing_bp; 16639 kmem_free(errinfo, ST_ERR_INFO_SIZE); 16640 16641 switch (err) { 16642 case JUST_RETURN: 16643 mutex_exit(&un->un_sd->sd_mutex); 16644 return; 16645 16646 case COMMAND_DONE: 16647 case COMMAND_DONE_ERROR_RECOVERED: 16648 ST_DO_KSTATS(bp, kstat_runq_exit); 16649 error_number = 0; 16650 break; 16651 16652 default: 16653 ST_DEBUG(ST_DEVINFO, st_label, CE_PANIC, 16654 "st_recov_ret with unhandled errstat %d\n", err); 16655 /* FALLTHROUGH */ 16656 case COMMAND_DONE_ERROR: 16657 case COMMAND_DONE_EACCES: 16658 ST_DO_KSTATS(bp, kstat_waitq_exit); 16659 ST_DO_ERRSTATS(un, st_transerrs); 16660 error_number = EIO; 16661 st_set_pe_flag(un); 16662 break; 16663 16664 } 16665 16666 st_bioerror(bp, error_number); 16667 st_done_and_mutex_exit(un, bp); 16668 } 16669 16670 16671 static void 16672 st_recover(void *arg) 16673 { 16674 st_err_info *const errinfo = (st_err_info *)arg; 16675 uchar_t com = errinfo->ei_failed_pkt.pkt_cdbp[0]; 16676 struct scsi_tape *un; 16677 tapepos_t cur_pos; 16678 int rval; 16679 errstate status = COMMAND_DONE_ERROR; 16680 recov_info *rcv; 16681 buf_t *bp; 16682 16683 16684 rcv = errinfo->ei_failed_pkt.pkt_private; 16685 ASSERT(rcv->privatelen == sizeof (recov_info)); 16686 bp = rcv->cmd_bp; 16687 16688 un = ddi_get_soft_state(st_state, MTUNIT(bp->b_edev)); 16689 16690 ASSERT(un != NULL); 16691 16692 mutex_enter(ST_MUTEX); 16693 16694 ST_FUNC(ST_DEVINFO, st_recover); 16695 16696 ST_CDB(ST_DEVINFO, "Recovering command", 16697 (caddr_t)errinfo->ei_failed_pkt.pkt_cdbp); 16698 ST_SENSE(ST_DEVINFO, "sense status for failed command", 16699 (caddr_t)&errinfo->ei_failing_status, 16700 sizeof (struct scsi_arq_status)); 16701 ST_POS(ST_DEVINFO, rcv->cmd_attrib->recov_pos_type == POS_STARTING ? 16702 "starting position for recovery command" : 16703 "expected position for recovery command", 16704 &errinfo->ei_expected_pos); 16705 16706 rval = st_test_path_to_device(un); 16707 16708 ST_RECOV(ST_DEVINFO, st_label, CE_NOTE, 16709 "st_recover called with %s, TUR returned %d\n", 16710 errstatenames[errinfo->ei_error_type], rval); 16711 /* 16712 * If the drive responed to the TUR lets try and get it to sync 16713 * any data it might have in the buffer. 16714 */ 16715 if (rval == 0 && rcv->cmd_attrib->chg_tape_data) { 16716 (void) st_rcmd(un, SCMD_WRITE_FILE_MARK, 0, SYNC_CMD); 16717 } 16718 switch (errinfo->ei_error_type) { 16719 case ATTEMPT_RETRY: 16720 case COMMAND_TIMEOUT: 16721 case DEVICE_RESET: 16722 case PATH_FAILED: 16723 /* 16724 * For now if we can't talk to the device we are done. 16725 * If the drive is reserved we can try to get it back. 16726 */ 16727 if (rval != 0 && rval != EACCES) { 16728 st_recov_ret(un, errinfo, COMMAND_DONE_ERROR); 16729 return; 16730 } 16731 16732 /* 16733 * If scsi II lost reserve try and get it back. 16734 */ 16735 if ((((un->un_rsvd_status & 16736 (ST_LOST_RESERVE | ST_APPLICATION_RESERVATIONS)) == 16737 ST_LOST_RESERVE)) && 16738 (errinfo->ei_failed_pkt.pkt_cdbp[0] != SCMD_RELEASE)) { 16739 rval = st_reserve_release(un, ST_RESERVE, 16740 st_uscsi_rcmd); 16741 if (rval != 0) { 16742 if (st_take_ownership(un, st_uscsi_rcmd) != 0) { 16743 st_recov_ret(un, errinfo, 16744 COMMAND_DONE_EACCES); 16745 return; 16746 } 16747 } 16748 un->un_rsvd_status |= ST_RESERVE; 16749 un->un_rsvd_status &= ~(ST_RELEASE | ST_LOST_RESERVE | 16750 ST_RESERVATION_CONFLICT | ST_INITIATED_RESET); 16751 } 16752 rval = st_check_mode_for_change(un, st_uscsi_rcmd); 16753 if (rval) { 16754 rval = st_gen_mode_select(un, st_uscsi_rcmd, 16755 un->un_mspl, sizeof (struct seq_mode)); 16756 } 16757 if (rval) { 16758 st_recov_ret(un, errinfo, COMMAND_DONE_ERROR); 16759 return; 16760 } 16761 break; 16762 case DEVICE_TAMPER: 16763 /* 16764 * Check if the ASC/ASCQ says mode data has changed. 16765 */ 16766 if ((errinfo->ei_failing_status.sts_sensedata.es_add_code == 16767 0x2a) && 16768 (errinfo->ei_failing_status.sts_sensedata.es_qual_code == 16769 0x01)) { 16770 /* 16771 * See if mode sense changed. 16772 */ 16773 rval = st_check_mode_for_change(un, st_uscsi_rcmd); 16774 if (rval) { 16775 /* 16776 * If so change it back. 16777 */ 16778 rval = st_gen_mode_select(un, st_uscsi_rcmd, 16779 un->un_mspl, sizeof (struct seq_mode)); 16780 } 16781 if (rval) { 16782 st_recov_ret(un, errinfo, COMMAND_DONE_ERROR); 16783 return; 16784 } 16785 } 16786 /* 16787 * if we have a media id and its not bogus. 16788 * Check to see if it the same. 16789 */ 16790 if (un->un_media_id != NULL && un->un_media_id != bogusID) { 16791 rval = st_get_media_identification(un, st_uscsi_rcmd); 16792 if (rval == ESPIPE) { 16793 st_recov_ret(un, errinfo, COMMAND_DONE_EACCES); 16794 return; 16795 } 16796 } 16797 break; 16798 default: 16799 ST_DEBUG(ST_DEVINFO, st_label, CE_PANIC, 16800 "Unhandled error type %s in st_recover() 0x%x\n", 16801 errstatenames[errinfo->ei_error_type], com); 16802 } 16803 16804 /* 16805 * if command is retriable retry it. 16806 * Special case here. The command attribute for SCMD_REQUEST_SENSE 16807 * does not say that it is retriable. That because if you reissue a 16808 * request sense and the target responds the sense data will have 16809 * been consumed and no long be valid. If we get a busy status on 16810 * request sense while the state is ST_STATE_SENSING this will 16811 * reissue that pkt. 16812 * 16813 * XXX If this request sense gets sent to a different port then 16814 * the original command that failed was sent on it will not get 16815 * valid sense data for that command. 16816 */ 16817 if (rcv->cmd_attrib->retriable || un->un_rqs_bp == bp) { 16818 status = st_recover_reissue_pkt(un, &errinfo->ei_failed_pkt); 16819 16820 /* 16821 * if drive doesn't support read position we are done 16822 */ 16823 } else if (un->un_read_pos_type == NO_POS) { 16824 status = COMMAND_DONE_ERROR; 16825 /* 16826 * If this command results in a changed tape position, 16827 * lets see where we are. 16828 */ 16829 } else if (rcv->cmd_attrib->chg_tape_pos) { 16830 /* 16831 * XXX May be a reason to choose a different type here. 16832 * Long format has file position information. 16833 * Short and Extended have information about whats 16834 * in the buffer. St's positioning assumes in the buffer 16835 * to be the same as on tape. 16836 */ 16837 rval = st_compare_expected_position(un, errinfo, 16838 rcv->cmd_attrib, &cur_pos); 16839 if (rval == 0) { 16840 status = COMMAND_DONE; 16841 } else if (rval == EAGAIN) { 16842 status = st_recover_reissue_pkt(un, 16843 &errinfo->ei_failed_pkt); 16844 } else { 16845 status = COMMAND_DONE_ERROR; 16846 } 16847 } else { 16848 ASSERT(0); 16849 } 16850 16851 st_recov_ret(un, errinfo, status); 16852 } 16853 16854 static void 16855 st_recov_cb(struct scsi_pkt *pkt) 16856 { 16857 struct scsi_tape *un; 16858 struct buf *bp; 16859 recov_info *rcv; 16860 errstate action = COMMAND_DONE_ERROR; 16861 int timout = ST_TRAN_BUSY_TIMEOUT; /* short (default) timeout */ 16862 16863 /* 16864 * Get the buf from the packet. 16865 */ 16866 rcv = pkt->pkt_private; 16867 ASSERT(rcv->privatelen == sizeof (recov_info)); 16868 bp = rcv->cmd_bp; 16869 16870 /* 16871 * get the unit from the buf. 16872 */ 16873 un = ddi_get_soft_state(st_state, MTUNIT(bp->b_edev)); 16874 ASSERT(un != NULL); 16875 16876 ST_FUNC(ST_DEVINFO, st_recov_cb); 16877 16878 mutex_enter(ST_MUTEX); 16879 16880 ASSERT(bp == un->un_recov_buf); 16881 16882 16883 switch (pkt->pkt_reason) { 16884 case CMD_CMPLT: 16885 if (un->un_arq_enabled && pkt->pkt_state & STATE_ARQ_DONE) { 16886 action = st_handle_autosense(un, bp, &rcv->pos); 16887 } else if ((SCBP(pkt)->sts_busy) || 16888 (SCBP(pkt)->sts_chk) || 16889 (SCBP(pkt)->sts_vu7)) { 16890 action = st_check_error(un, pkt); 16891 } else { 16892 action = COMMAND_DONE; 16893 } 16894 break; 16895 case CMD_TIMEOUT: 16896 action = COMMAND_TIMEOUT; 16897 break; 16898 case CMD_TRAN_ERR: 16899 action = QUE_COMMAND; 16900 break; 16901 default: 16902 ST_DEBUG(ST_DEVINFO, st_label, CE_PANIC, 16903 "pkt_reason not handled yet %s", 16904 scsi_rname(pkt->pkt_reason)); 16905 action = COMMAND_DONE_ERROR; 16906 } 16907 16908 /* 16909 * check for undetected path failover. 16910 */ 16911 if ((un->un_multipath) && 16912 (un->un_last_path_instance != pkt->pkt_path_instance)) { 16913 if (un->un_state > ST_STATE_OPENING) { 16914 ST_RECOV(ST_DEVINFO, st_label, CE_NOTE, 16915 "Failover detected in recovery, action is %s\n", 16916 errstatenames[action]); 16917 } 16918 un->un_last_path_instance = pkt->pkt_path_instance; 16919 } 16920 16921 ST_RECOV(ST_DEVINFO, st_label, CE_WARN, 16922 "Recovery call back got %s status on %s\n", 16923 errstatenames[action], st_print_scsi_cmd(pkt->pkt_cdbp[0])); 16924 16925 switch (action) { 16926 case COMMAND_DONE: 16927 break; 16928 16929 case COMMAND_DONE_EACCES: 16930 bioerror(bp, EACCES); 16931 break; 16932 16933 case COMMAND_DONE_ERROR_RECOVERED: /* XXX maybe wrong */ 16934 ASSERT(0); 16935 break; 16936 16937 case COMMAND_TIMEOUT: 16938 case COMMAND_DONE_ERROR: 16939 bioerror(bp, EIO); 16940 break; 16941 16942 case DEVICE_RESET: 16943 case QUE_BUSY_COMMAND: 16944 case PATH_FAILED: 16945 /* longish timeout */ 16946 timout = ST_STATUS_BUSY_TIMEOUT; 16947 /* FALLTHRU */ 16948 case QUE_COMMAND: 16949 case DEVICE_TAMPER: 16950 case ATTEMPT_RETRY: 16951 /* 16952 * let st_handle_intr_busy put this bp back on waitq and make 16953 * checks to see if it is ok to requeue the command. 16954 */ 16955 ST_DO_KSTATS(bp, kstat_runq_back_to_waitq); 16956 16957 /* 16958 * Save the throttle before setting up the timeout 16959 */ 16960 if (un->un_throttle) { 16961 un->un_last_throttle = un->un_throttle; 16962 } 16963 mutex_exit(ST_MUTEX); 16964 if (st_handle_intr_busy(un, bp, timout) == 0) { 16965 return; /* timeout is setup again */ 16966 } 16967 mutex_enter(ST_MUTEX); 16968 un->un_pos.pmode = invalid; 16969 un->un_err_resid = bp->b_resid = bp->b_bcount; 16970 st_bioerror(bp, EIO); 16971 st_set_pe_flag(un); 16972 break; 16973 16974 default: 16975 ST_DEBUG(ST_DEVINFO, st_label, CE_PANIC, 16976 "Unhandled recovery state 0x%x\n", action); 16977 un->un_pos.pmode = invalid; 16978 un->un_err_resid = bp->b_resid = bp->b_bcount; 16979 st_bioerror(bp, EIO); 16980 st_set_pe_flag(un); 16981 break; 16982 } 16983 16984 st_done_and_mutex_exit(un, bp); 16985 } 16986 16987 static int 16988 st_rcmd(struct scsi_tape *un, int com, int64_t count, int wait) 16989 { 16990 struct buf *bp; 16991 int err; 16992 16993 ST_FUNC(ST_DEVINFO, st_rcmd); 16994 16995 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 16996 "st_rcmd(un = 0x%p, com = 0x%x, count = %"PRIx64", wait = %d)\n", 16997 (void *)un, com, count, wait); 16998 16999 ASSERT(MUTEX_HELD(&un->un_sd->sd_mutex)); 17000 ASSERT(mutex_owned(ST_MUTEX)); 17001 17002 #ifdef STDEBUG 17003 if ((st_debug & 0x7)) { 17004 st_debug_cmds(un, com, count, wait); 17005 } 17006 #endif 17007 17008 while (un->un_recov_buf_busy) 17009 cv_wait(&un->un_recov_buf_cv, ST_MUTEX); 17010 un->un_recov_buf_busy = 1; 17011 17012 bp = un->un_recov_buf; 17013 bzero(bp, sizeof (buf_t)); 17014 17015 bp->b_flags = (wait) ? B_BUSY : B_BUSY|B_ASYNC; 17016 17017 err = st_setup_cmd(un, bp, com, count); 17018 17019 un->un_recov_buf_busy = 0; 17020 17021 cv_signal(&un->un_recov_buf_cv); 17022 17023 return (err); 17024 } 17025 17026 /* args used */ 17027 static int 17028 st_uscsi_rcmd(struct scsi_tape *un, struct uscsi_cmd *ucmd, int flag) 17029 { 17030 int rval; 17031 buf_t *bp; 17032 17033 ST_FUNC(ST_DEVINFO, st_uscsi_rcmd); 17034 ASSERT(flag == FKIOCTL); 17035 17036 /* 17037 * Get buffer resources... 17038 */ 17039 while (un->un_recov_buf_busy) 17040 cv_wait(&un->un_recov_buf_cv, ST_MUTEX); 17041 un->un_recov_buf_busy = 1; 17042 17043 bp = un->un_recov_buf; 17044 bzero(bp, sizeof (buf_t)); 17045 17046 bp->b_forw = (struct buf *)(uintptr_t)ucmd->uscsi_cdb[0]; 17047 bp->b_back = (struct buf *)ucmd; 17048 17049 mutex_exit(ST_MUTEX); 17050 rval = scsi_uscsi_handle_cmd(un->un_dev, UIO_SYSSPACE, ucmd, 17051 st_strategy, bp, NULL); 17052 mutex_enter(ST_MUTEX); 17053 17054 ucmd->uscsi_resid = bp->b_resid; 17055 17056 /* 17057 * Free resources 17058 */ 17059 un->un_recov_buf_busy = 0; 17060 cv_signal(&un->un_recov_buf_cv); 17061 17062 return (rval); 17063 } 17064 17065 /* 17066 * Add data to scsi_pkt to help know what to do if the command fails. 17067 */ 17068 static void 17069 st_add_recovery_info_to_pkt(struct scsi_tape *un, buf_t *bp, 17070 struct scsi_pkt *pkt) 17071 { 17072 uint64_t count; 17073 recov_info *rinfo = (recov_info *)pkt->pkt_private; 17074 17075 ST_FUNC(ST_DEVINFO, st_add_recovery_info_to_pkt); 17076 17077 ASSERT(rinfo->privatelen == sizeof (pkt_info) || 17078 rinfo->privatelen == sizeof (recov_info)); 17079 17080 SET_BP_PKT(bp, pkt); 17081 rinfo->cmd_bp = bp; 17082 17083 if (rinfo->privatelen != sizeof (recov_info)) { 17084 return; 17085 } 17086 17087 rinfo->cmd_bp = bp; 17088 17089 rinfo->cmd_attrib = NULL; 17090 17091 /* 17092 * lookup the command attributes and add them to the recovery info. 17093 */ 17094 rinfo->cmd_attrib = st_lookup_cmd_attribute(pkt->pkt_cdbp[0]); 17095 17096 ASSERT(rinfo->cmd_attrib); 17097 17098 /* 17099 * For commands that there is no way to figure the expected position 17100 * once completed, we save the position the command was started from 17101 * so that if they fail we can position back and try again. 17102 * This has already been done in st_cmd() or st_iscsi_cmd(). 17103 */ 17104 if (rinfo->cmd_attrib->recov_pos_type == POS_STARTING) { 17105 /* save current position as the starting position. */ 17106 COPY_POS(&rinfo->pos, &un->un_pos); 17107 un->un_running.pmode = invalid; 17108 return; 17109 } 17110 17111 /* 17112 * Don't want to update the running position for recovery. 17113 */ 17114 if (bp == un->un_recov_buf) { 17115 rinfo->pos.pmode = un->un_running.pmode; 17116 return; 17117 } 17118 /* 17119 * If running position is invalid copy the current position. 17120 * Running being set invalid means we are not in a read, write 17121 * or write filemark sequence. 17122 * We'll copy the current position and start from there. 17123 */ 17124 if (un->un_running.pmode == invalid) { 17125 COPY_POS(&un->un_running, &un->un_pos); 17126 COPY_POS(&rinfo->pos, &un->un_running); 17127 } else { 17128 COPY_POS(&rinfo->pos, &un->un_running); 17129 if (rinfo->pos.pmode == legacy) { 17130 /* 17131 * Always should be more logical blocks then 17132 * data blocks and files marks. 17133 */ 17134 ASSERT((rinfo->pos.blkno >= 0) ? 17135 rinfo->pos.lgclblkno >= 17136 (rinfo->pos.blkno + rinfo->pos.fileno) : 1); 17137 } 17138 } 17139 17140 /* 17141 * If the command is not expected to change the drive position 17142 * then the running position should be the expected position. 17143 */ 17144 if (rinfo->cmd_attrib->chg_tape_pos == 0) { 17145 ASSERT(rinfo->cmd_attrib->chg_tape_direction == DIR_NONE); 17146 return; 17147 } 17148 17149 if (rinfo->cmd_attrib->explicit) { 17150 ASSERT(rinfo->pos.pmode != invalid); 17151 ASSERT(rinfo->cmd_attrib->get_cnt); 17152 count = rinfo->cmd_attrib->get_cnt(pkt->pkt_cdbp); 17153 /* 17154 * This is a user generated CDB. 17155 */ 17156 if (bp == un->un_sbufp) { 17157 uint64_t lbn; 17158 17159 lbn = rinfo->cmd_attrib->get_lba(pkt->pkt_cdbp); 17160 17161 /* 17162 * See if this CDB will generate a locate or change 17163 * partition. 17164 */ 17165 if ((lbn != un->un_running.lgclblkno) || 17166 (pkt->pkt_cdbp[3] != un->un_running.partition)) { 17167 rinfo->pos.partition = pkt->pkt_cdbp[3]; 17168 rinfo->pos.pmode = logical; 17169 rinfo->pos.lgclblkno = lbn; 17170 un->un_running.partition = pkt->pkt_cdbp[3]; 17171 un->un_running.pmode = logical; 17172 un->un_running.lgclblkno = lbn; 17173 } 17174 } else { 17175 uint64_t lbn = un->un_running.lgclblkno; 17176 17177 pkt->pkt_cdbp[3] = (uchar_t)un->un_running.partition; 17178 17179 pkt->pkt_cdbp[4] = (uchar_t)(lbn >> 56); 17180 pkt->pkt_cdbp[5] = (uchar_t)(lbn >> 48); 17181 pkt->pkt_cdbp[6] = (uchar_t)(lbn >> 40); 17182 pkt->pkt_cdbp[7] = (uchar_t)(lbn >> 32); 17183 pkt->pkt_cdbp[8] = (uchar_t)(lbn >> 24); 17184 pkt->pkt_cdbp[9] = (uchar_t)(lbn >> 16); 17185 pkt->pkt_cdbp[10] = (uchar_t)(lbn >> 8); 17186 pkt->pkt_cdbp[11] = (uchar_t)(lbn); 17187 } 17188 rinfo->pos.lgclblkno += count; 17189 rinfo->pos.blkno += count; 17190 un->un_running.lgclblkno += count; 17191 return; 17192 } 17193 17194 if (rinfo->cmd_attrib->chg_tape_pos) { 17195 17196 /* should not have got an invalid position from running. */ 17197 if (un->un_mediastate == MTIO_INSERTED) { 17198 ASSERT(rinfo->pos.pmode != invalid); 17199 } 17200 17201 /* should have either a get count or or get lba function */ 17202 ASSERT(rinfo->cmd_attrib->get_cnt != NULL || 17203 rinfo->cmd_attrib->get_lba != NULL); 17204 17205 /* only explicit commands have both and they're handled above */ 17206 ASSERT(!(rinfo->cmd_attrib->get_cnt != NULL && 17207 rinfo->cmd_attrib->get_lba != NULL)); 17208 17209 /* if it has a get count function */ 17210 if (rinfo->cmd_attrib->get_cnt != NULL) { 17211 count = rinfo->cmd_attrib->get_cnt(pkt->pkt_cdbp); 17212 if (count == 0) { 17213 return; 17214 } 17215 /* 17216 * Changes position but doesn't transfer data. 17217 * i.e. rewind, write_file_mark and load. 17218 */ 17219 if (rinfo->cmd_attrib->transfers_data == TRAN_NONE) { 17220 switch (rinfo->cmd_attrib->chg_tape_direction) { 17221 case DIR_NONE: /* Erase */ 17222 ASSERT(rinfo->cmd_attrib->cmd == 17223 SCMD_ERASE); 17224 break; 17225 case DIR_FORW: /* write_file_mark */ 17226 rinfo->pos.fileno += count; 17227 rinfo->pos.lgclblkno += count; 17228 rinfo->pos.blkno = 0; 17229 un->un_running.fileno += count; 17230 un->un_running.lgclblkno += count; 17231 un->un_running.blkno = 0; 17232 break; 17233 case DIR_REVC: /* rewind */ 17234 rinfo->pos.fileno = 0; 17235 rinfo->pos.lgclblkno = 0; 17236 rinfo->pos.blkno = 0; 17237 rinfo->pos.eof = ST_NO_EOF; 17238 rinfo->pos.pmode = legacy; 17239 un->un_running.fileno = 0; 17240 un->un_running.lgclblkno = 0; 17241 un->un_running.blkno = 0; 17242 un->un_running.eof = ST_NO_EOF; 17243 if (un->un_running.pmode != legacy) 17244 un->un_running.pmode = legacy; 17245 break; 17246 case DIR_EITH: /* Load unload */ 17247 ASSERT(rinfo->cmd_attrib->cmd == 17248 SCMD_LOAD); 17249 switch (count & (LD_LOAD | LD_RETEN | 17250 LD_RETEN | LD_HOLD)) { 17251 case LD_UNLOAD: 17252 case LD_RETEN: 17253 case LD_HOLD: 17254 case LD_LOAD | LD_HOLD: 17255 case LD_EOT | LD_HOLD: 17256 case LD_RETEN | LD_HOLD: 17257 rinfo->pos.pmode = invalid; 17258 un->un_running.pmode = invalid; 17259 break; 17260 case LD_EOT: 17261 case LD_LOAD | LD_EOT: 17262 rinfo->pos.eof = ST_EOT; 17263 rinfo->pos.pmode = invalid; 17264 un->un_running.eof = ST_EOT; 17265 un->un_running.pmode = invalid; 17266 break; 17267 case LD_LOAD: 17268 case LD_RETEN | LD_LOAD: 17269 rinfo->pos.fileno = 0; 17270 rinfo->pos.lgclblkno = 0; 17271 rinfo->pos.blkno = 0; 17272 rinfo->pos.eof = ST_NO_EOF; 17273 rinfo->pos.pmode = legacy; 17274 un->un_running.fileno = 0; 17275 un->un_running.lgclblkno = 0; 17276 un->un_running.blkno = 0; 17277 un->un_running.eof = ST_NO_EOF; 17278 break; 17279 default: 17280 ASSERT(0); 17281 } 17282 break; 17283 default: 17284 ASSERT(0); 17285 break; 17286 } 17287 } else { 17288 /* 17289 * Changes position and does transfer data. 17290 * i.e. read or write. 17291 */ 17292 switch (rinfo->cmd_attrib->chg_tape_direction) { 17293 case DIR_FORW: 17294 rinfo->pos.lgclblkno += count; 17295 rinfo->pos.blkno += count; 17296 un->un_running.lgclblkno += count; 17297 un->un_running.blkno += count; 17298 break; 17299 case DIR_REVC: 17300 rinfo->pos.lgclblkno -= count; 17301 rinfo->pos.blkno -= count; 17302 un->un_running.lgclblkno -= count; 17303 un->un_running.blkno -= count; 17304 break; 17305 default: 17306 ASSERT(0); 17307 break; 17308 } 17309 } 17310 } else if (rinfo->cmd_attrib->get_lba != NULL) { 17311 /* Have a get LBA fuction. i.e. Locate */ 17312 ASSERT(rinfo->cmd_attrib->chg_tape_direction == 17313 DIR_EITH); 17314 count = rinfo->cmd_attrib->get_lba(pkt->pkt_cdbp); 17315 un->un_running.lgclblkno = count; 17316 un->un_running.blkno = 0; 17317 un->un_running.fileno = 0; 17318 un->un_running.pmode = logical; 17319 rinfo->pos.lgclblkno = count; 17320 rinfo->pos.pmode = invalid; 17321 } else { 17322 ASSERT(0); 17323 } 17324 return; 17325 } 17326 17327 ST_CDB(ST_DEVINFO, "Unhanded CDB for position prediction", 17328 (char *)pkt->pkt_cdbp); 17329 17330 } 17331 17332 static int 17333 st_check_mode_for_change(struct scsi_tape *un, ubufunc_t ubf) 17334 { 17335 struct seq_mode *current; 17336 int rval; 17337 int i; 17338 caddr_t this; 17339 caddr_t that; 17340 17341 ST_FUNC(ST_DEVINFO, st_check_mode_for_change); 17342 17343 /* recovery called with mode tamper before mode selection */ 17344 if (un->un_comp_page == (ST_DEV_DATACOMP_PAGE | ST_DEV_CONFIG_PAGE)) { 17345 ST_RECOV(ST_DEVINFO, st_label, CE_NOTE, 17346 "Mode Select not done yet"); 17347 return (0); 17348 } 17349 17350 current = kmem_zalloc(sizeof (struct seq_mode), KM_SLEEP); 17351 17352 rval = st_gen_mode_sense(un, ubf, un->un_comp_page, current, 17353 sizeof (struct seq_mode)); 17354 if (rval != 0) { 17355 ST_RECOV(ST_DEVINFO, st_label, CE_NOTE, 17356 "Mode Sense for mode verification failed"); 17357 kmem_free(current, sizeof (struct seq_mode)); 17358 return (rval); 17359 } 17360 17361 this = (caddr_t)current; 17362 that = (caddr_t)un->un_mspl; 17363 17364 rval = bcmp(this, that, sizeof (struct seq_mode)); 17365 if (rval == 0) { 17366 ST_RECOV(ST_DEVINFO, st_label, CE_NOTE, 17367 "Found no changes in mode data"); 17368 } 17369 #ifdef STDEBUG 17370 else { 17371 for (i = 1; i < sizeof (struct seq_mode); i++) { 17372 if (this[i] != that[i]) { 17373 ST_RECOV(ST_DEVINFO, st_label, CE_CONT, 17374 "sense data changed at byte %d was " 17375 "0x%x now 0x%x", i, 17376 (uchar_t)that[i], (uchar_t)this[i]); 17377 } 17378 } 17379 } 17380 #endif 17381 kmem_free(current, sizeof (struct seq_mode)); 17382 17383 return (rval); 17384 } 17385 17386 static int 17387 st_test_path_to_device(struct scsi_tape *un) 17388 { 17389 int rval = 0; 17390 int limit = st_retry_count; 17391 17392 ST_FUNC(ST_DEVINFO, st_test_path_to_device); 17393 17394 /* 17395 * XXX Newer drives may not RESEVATION CONFLICT a TUR. 17396 */ 17397 do { 17398 if (rval != 0) { 17399 mutex_exit(ST_MUTEX); 17400 delay(drv_usectohz(1000000)); 17401 mutex_enter(ST_MUTEX); 17402 } 17403 rval = st_rcmd(un, SCMD_TEST_UNIT_READY, 0, SYNC_CMD); 17404 ST_RECOV(ST_DEVINFO, st_label, CE_NOTE, 17405 "ping TUR returned 0x%x", rval); 17406 limit--; 17407 } while (((rval == EACCES) || (rval == EBUSY)) && limit); 17408 17409 if (un->un_status == KEY_NOT_READY || un->un_mediastate == MTIO_EJECTED) 17410 rval = 0; 17411 17412 return (rval); 17413 } 17414 17415 /* 17416 * Does read position using recov_buf and doesn't update un_pos. 17417 * Does what ever kind of read position you want. 17418 */ 17419 static int 17420 st_recovery_read_pos(struct scsi_tape *un, read_p_types type, 17421 read_pos_data_t *raw) 17422 { 17423 int rval; 17424 struct uscsi_cmd cmd; 17425 struct scsi_arq_status status; 17426 char cdb[CDB_GROUP1]; 17427 17428 ST_FUNC(ST_DEVINFO, st_recovery_read_pos); 17429 bzero(&cmd, sizeof (cmd)); 17430 17431 cdb[0] = SCMD_READ_POSITION; 17432 cdb[1] = type; 17433 cdb[2] = 0; 17434 cdb[3] = 0; 17435 cdb[4] = 0; 17436 cdb[5] = 0; 17437 cdb[6] = 0; 17438 cdb[7] = 0; 17439 cdb[8] = (type == EXT_POS) ? 28 : 0; 17440 cdb[9] = 0; 17441 17442 cmd.uscsi_flags = USCSI_READ | USCSI_RQENABLE; 17443 cmd.uscsi_timeout = un->un_dp->non_motion_timeout; 17444 cmd.uscsi_cdb = cdb; 17445 cmd.uscsi_cdblen = sizeof (cdb); 17446 cmd.uscsi_rqlen = sizeof (status); 17447 cmd.uscsi_rqbuf = (caddr_t)&status; 17448 cmd.uscsi_bufaddr = (caddr_t)raw; 17449 switch (type) { 17450 case SHORT_POS: 17451 cmd.uscsi_buflen = sizeof (tape_position_t); 17452 break; 17453 case LONG_POS: 17454 cmd.uscsi_buflen = sizeof (tape_position_long_t); 17455 break; 17456 case EXT_POS: 17457 cmd.uscsi_buflen = sizeof (tape_position_ext_t); 17458 break; 17459 default: 17460 ASSERT(0); 17461 } 17462 17463 rval = st_uscsi_rcmd(un, &cmd, FKIOCTL); 17464 if (cmd.uscsi_status) { 17465 rval = EIO; 17466 } 17467 return (rval); 17468 } 17469 17470 static int 17471 st_recovery_get_position(struct scsi_tape *un, tapepos_t *read, 17472 read_pos_data_t *raw) 17473 { 17474 int rval; 17475 read_p_types type = un->un_read_pos_type; 17476 17477 ST_FUNC(ST_DEVINFO, st_recovery_get_position); 17478 17479 do { 17480 rval = st_recovery_read_pos(un, type, raw); 17481 if (rval != 0) { 17482 switch (type) { 17483 case SHORT_POS: 17484 type = NO_POS; 17485 break; 17486 17487 case LONG_POS: 17488 type = EXT_POS; 17489 break; 17490 17491 case EXT_POS: 17492 type = SHORT_POS; 17493 break; 17494 17495 default: 17496 type = LONG_POS; 17497 break; 17498 17499 } 17500 } else { 17501 if (type != un->un_read_pos_type) { 17502 un->un_read_pos_type = type; 17503 } 17504 break; 17505 } 17506 } while (type != NO_POS); 17507 17508 if (rval == 0) { 17509 rval = st_interpret_read_pos(un, read, type, 17510 sizeof (read_pos_data_t), (caddr_t)raw, 1); 17511 } 17512 return (rval); 17513 } 17514 17515 /* 17516 * based on the command do we retry, continue or give up? 17517 * possable return values? 17518 * zero do nothing looks fine. 17519 * EAGAIN retry. 17520 * EIO failed makes no sense. 17521 */ 17522 static int 17523 st_compare_expected_position(struct scsi_tape *un, st_err_info *ei, 17524 cmd_attribute const * cmd_att, tapepos_t *read) 17525 { 17526 int rval; 17527 read_pos_data_t *readp_datap; 17528 17529 ST_FUNC(ST_DEVINFO, st_compare_expected_position); 17530 17531 ASSERT(un != NULL); 17532 ASSERT(ei != NULL); 17533 ASSERT(read != NULL); 17534 ASSERT(cmd_att->chg_tape_pos); 17535 17536 COPY_POS(read, &ei->ei_expected_pos); 17537 17538 readp_datap = kmem_zalloc(sizeof (read_pos_data_t), KM_SLEEP); 17539 17540 rval = st_recovery_get_position(un, read, readp_datap); 17541 17542 kmem_free(readp_datap, sizeof (read_pos_data_t)); 17543 17544 if (rval != 0) { 17545 return (EIO); 17546 } 17547 17548 ST_POS(ST_DEVINFO, "st_compare_expected_position", read); 17549 17550 if ((read->pmode == invalid) || 17551 (ei->ei_expected_pos.pmode == invalid)) { 17552 return (EIO); 17553 } 17554 17555 /* 17556 * Command that changes tape position and have an expected position 17557 * if it were to chave completed sucessfully. 17558 */ 17559 if (cmd_att->recov_pos_type == POS_EXPECTED) { 17560 uint32_t count; 17561 int64_t difference; 17562 uchar_t reposition = 0; 17563 17564 ASSERT(cmd_att->get_cnt); 17565 count = cmd_att->get_cnt(ei->ei_failed_pkt.pkt_cdbp); 17566 17567 ST_RECOV(ST_DEVINFO, st_label, CE_NOTE, 17568 "Got count from CDB and it was %d\n", count); 17569 17570 /* 17571 * At expected? 17572 */ 17573 if (read->lgclblkno == ei->ei_expected_pos.lgclblkno) { 17574 ST_RECOV(ST_DEVINFO, st_label, CE_NOTE, 17575 "Found drive to be at expected position\n"); 17576 17577 /* 17578 * If the command should move tape and it got a busy 17579 * it shouldn't be in the expected position. 17580 */ 17581 if (ei->ei_failing_status.sts_status.sts_busy != 0) { 17582 reposition = 1; 17583 17584 /* 17585 * If the command doesn't transfer data should be good. 17586 */ 17587 } else if (cmd_att->transfers_data == TRAN_NONE) { 17588 return (0); /* Good */ 17589 17590 /* 17591 * Command transfers data, should have done so. 17592 */ 17593 } else if (ei->ei_failed_pkt.pkt_state & 17594 STATE_XFERRED_DATA) { 17595 return (0); /* Good */ 17596 } else { 17597 reposition = 1; 17598 } 17599 } 17600 17601 if (cmd_att->chg_tape_direction == DIR_FORW) { 17602 difference = 17603 ei->ei_expected_pos.lgclblkno - read->lgclblkno; 17604 17605 ST_RECOV(ST_DEVINFO, st_label, CE_NOTE, 17606 "difference between expected and actual is %" 17607 PRId64"\n", difference); 17608 if (count == difference && reposition == 0) { 17609 ST_RECOV(ST_DEVINFO, st_label, CE_NOTE, 17610 "Found failed FORW command, retrying\n"); 17611 return (EAGAIN); 17612 } 17613 17614 /* 17615 * If rewound or somewhere between the starting position 17616 * and the expected position (partial read or write). 17617 * Locate to the starting position and try the whole 17618 * thing over again. 17619 */ 17620 if ((read->lgclblkno == 0) || 17621 ((difference > 0) && (difference < count))) { 17622 rval = st_logical_block_locate(un, 17623 st_uscsi_rcmd, read, 17624 ei->ei_expected_pos.lgclblkno - count, 17625 ei->ei_expected_pos.partition); 17626 if (rval == 0) { 17627 ST_RECOV(ST_DEVINFO, st_label, 17628 CE_NOTE, "reestablished FORW" 17629 " command retrying\n"); 17630 return (EAGAIN); 17631 } 17632 /* 17633 * This handles flushed read ahead on the drive or 17634 * an aborted read that presents as a busy and advanced 17635 * the tape position. 17636 */ 17637 } else if ((cmd_att->transfers_data == TRAN_READ) && 17638 ((difference < 0) || (reposition == 1))) { 17639 rval = st_logical_block_locate(un, 17640 st_uscsi_rcmd, read, 17641 ei->ei_expected_pos.lgclblkno - count, 17642 ei->ei_expected_pos.partition); 17643 if (rval == 0) { 17644 ST_RECOV(ST_DEVINFO, st_label, 17645 CE_NOTE, "reestablished FORW" 17646 " read command retrying\n"); 17647 return (EAGAIN); 17648 } 17649 /* 17650 * XXX swag seeing difference of 2 on write filemark. 17651 * If the space to the starting position works on a 17652 * write that means the previous write made it to tape. 17653 * If not we lost data and have to give up. 17654 * 17655 * The plot thickens. Now I am attempting to cover a 17656 * count of 1 and a differance of 2 on a write. 17657 */ 17658 } else if ((difference > count) || (reposition == 1)) { 17659 rval = st_logical_block_locate(un, 17660 st_uscsi_rcmd, read, 17661 ei->ei_expected_pos.lgclblkno - count, 17662 ei->ei_expected_pos.partition); 17663 if (rval == 0) { 17664 ST_RECOV(ST_DEVINFO, st_label, 17665 CE_NOTE, "reestablished FORW" 17666 " write command retrying\n"); 17667 return (EAGAIN); 17668 } 17669 ST_RECOV(ST_DEVINFO, st_label, CE_NOTE, 17670 "Seek to block %"PRId64" returned %d\n", 17671 ei->ei_expected_pos.lgclblkno - count, 17672 rval); 17673 } else { 17674 ST_RECOV(ST_DEVINFO, st_label, CE_NOTE, 17675 "Not expected transfers_data = %d " 17676 "difference = %"PRId64, 17677 cmd_att->transfers_data, difference); 17678 } 17679 17680 return (EIO); 17681 17682 } else if (cmd_att->chg_tape_direction == DIR_REVC) { 17683 /* Don't think we can write backwards */ 17684 ASSERT(cmd_att->transfers_data != TRAN_WRTE); 17685 difference = 17686 read->lgclblkno - ei->ei_expected_pos.lgclblkno; 17687 ST_RECOV(ST_DEVINFO, st_label, CE_NOTE, 17688 "difference between expected and actual is %" 17689 PRId64"\n", difference); 17690 if (count == difference && reposition == 0) { 17691 ST_RECOV(ST_DEVINFO, st_label, CE_NOTE, 17692 "Found failed REVC command, retrying\n"); 17693 return (EAGAIN); 17694 } 17695 if ((read->lgclblkno == 0) || 17696 ((difference > 0) && (difference < count))) { 17697 rval = st_logical_block_locate(un, 17698 st_uscsi_rcmd, read, 17699 ei->ei_expected_pos.lgclblkno + count, 17700 ei->ei_expected_pos.partition); 17701 if (rval == 0) { 17702 ST_RECOV(ST_DEVINFO, st_label, 17703 CE_NOTE, "reestablished REVC" 17704 " command retrying\n"); 17705 return (EAGAIN); 17706 } 17707 /* This handles read ahead in reverse direction */ 17708 } else if ((cmd_att->transfers_data == TRAN_READ) && 17709 (difference < 0) || (reposition == 1)) { 17710 rval = st_logical_block_locate(un, 17711 st_uscsi_rcmd, read, 17712 ei->ei_expected_pos.lgclblkno - count, 17713 ei->ei_expected_pos.partition); 17714 if (rval == 0) { 17715 ST_RECOV(ST_DEVINFO, st_label, 17716 CE_NOTE, "reestablished REVC" 17717 " read command retrying\n"); 17718 return (EAGAIN); 17719 } 17720 } else { 17721 ST_RECOV(ST_DEVINFO, st_label, CE_NOTE, 17722 "Not expected transfers_data = %d " 17723 "difference = %"PRId64, 17724 cmd_att->transfers_data, difference); 17725 } 17726 return (EIO); 17727 17728 } else { 17729 /* 17730 * Commands that change tape position either 17731 * direction or don't change position should not 17732 * get here. 17733 */ 17734 ASSERT(0); 17735 } 17736 ST_RECOV(ST_DEVINFO, st_label, CE_NOTE, 17737 "Didn't find a recoverable position, Failing\n"); 17738 17739 /* 17740 * Command that changes tape position and can only be recovered 17741 * by going back to the point of origin and retrying. 17742 * 17743 * Example SCMD_SPACE. 17744 */ 17745 } else if (cmd_att->recov_pos_type == POS_STARTING) { 17746 /* 17747 * This type of command stores the starting position. 17748 * If the read position is the starting position, 17749 * reissue the command. 17750 */ 17751 if (ei->ei_expected_pos.lgclblkno == read->lgclblkno) { 17752 ST_RECOV(ST_DEVINFO, st_label, CE_NOTE, 17753 "Found Space command at starting position, " 17754 "Reissuing\n"); 17755 return (EAGAIN); 17756 } 17757 /* 17758 * Not in the position that the command was originally issued, 17759 * Attempt to locate to that position. 17760 */ 17761 rval = st_logical_block_locate(un, st_uscsi_rcmd, read, 17762 ei->ei_expected_pos.lgclblkno, 17763 ei->ei_expected_pos.partition); 17764 if (rval) { 17765 ST_RECOV(ST_DEVINFO, st_label, CE_NOTE, 17766 "Found Space at an unexpected position and locate " 17767 "back to starting position failed\n"); 17768 return (EIO); 17769 } 17770 ST_RECOV(ST_DEVINFO, st_label, CE_NOTE, 17771 "Found Space at an unexpected position and locate " 17772 "back to starting position worked, Reissuing\n"); 17773 return (EAGAIN); 17774 } 17775 st_print_position(ST_DEVINFO, st_label, CE_NOTE, 17776 "Unhandled attribute/expected position", &ei->ei_expected_pos); 17777 st_print_position(ST_DEVINFO, st_label, CE_NOTE, 17778 "Read position above did not make sense", read); 17779 ASSERT(0); 17780 return (EIO); 17781 } 17782 17783 static errstate 17784 st_recover_reissue_pkt(struct scsi_tape *un, struct scsi_pkt *oldpkt) 17785 { 17786 buf_t *bp; 17787 buf_t *pkt_bp; 17788 struct scsi_pkt *newpkt; 17789 cmd_attribute const *attrib; 17790 recov_info *rcv = oldpkt->pkt_private; 17791 uint_t cdblen; 17792 int queued = 0; 17793 int rval; 17794 int flags = 0; 17795 int stat_size = 17796 (un->un_arq_enabled ? sizeof (struct scsi_arq_status) : 1); 17797 17798 ST_FUNC(ST_DEVINFO, st_recover_reissue_pkt); 17799 17800 bp = rcv->cmd_bp; 17801 17802 if (rcv->privatelen == sizeof (recov_info)) { 17803 attrib = rcv->cmd_attrib; 17804 } else { 17805 attrib = st_lookup_cmd_attribute(oldpkt->pkt_cdbp[0]); 17806 } 17807 17808 /* 17809 * Some non-uscsi commands use the b_bcount for values that 17810 * have nothing to do with how much data is transfered. 17811 * In those cases we need to hide the buf_t from scsi_init_pkt(). 17812 */ 17813 if ((BP_UCMD(bp)) && (bp->b_bcount)) { 17814 pkt_bp = bp; 17815 } else if (attrib->transfers_data == TRAN_NONE) { 17816 pkt_bp = NULL; 17817 } else { 17818 pkt_bp = bp; 17819 } 17820 17821 /* 17822 * if this is a queued command make sure it the only one in the 17823 * run queue. 17824 */ 17825 if (bp != un->un_sbufp && bp != un->un_recov_buf) { 17826 ASSERT(un->un_runqf == un->un_runql); 17827 ASSERT(un->un_runqf == bp); 17828 queued = 1; 17829 } 17830 17831 cdblen = scsi_cdb_size[CDB_GROUPID(oldpkt->pkt_cdbp[0])]; 17832 17833 if (pkt_bp == un->un_rqs_bp) { 17834 flags |= PKT_CONSISTENT; 17835 stat_size = 1; 17836 } 17837 17838 newpkt = scsi_init_pkt(ROUTE, NULL, pkt_bp, cdblen, 17839 stat_size, rcv->privatelen, flags, NULL_FUNC, NULL); 17840 if (newpkt == NULL) { 17841 ST_RECOV(ST_DEVINFO, st_label, CE_NOTE, 17842 "Reissue pkt scsi_init_pkt() failure\n"); 17843 return (COMMAND_DONE_ERROR); 17844 } 17845 17846 ASSERT(newpkt->pkt_resid == 0); 17847 bp->b_flags &= ~(B_DONE); 17848 bp->b_resid = 0; 17849 st_bioerror(bp, 0); 17850 17851 bcopy(oldpkt->pkt_private, newpkt->pkt_private, rcv->privatelen); 17852 17853 newpkt->pkt_comp = oldpkt->pkt_comp; 17854 newpkt->pkt_time = oldpkt->pkt_time; 17855 17856 bzero(newpkt->pkt_scbp, stat_size); 17857 bcopy(oldpkt->pkt_cdbp, newpkt->pkt_cdbp, cdblen); 17858 17859 newpkt->pkt_state = 0; 17860 newpkt->pkt_statistics = 0; 17861 17862 /* 17863 * oldpkt passed in was a copy of the original. 17864 * to distroy we need the address of the original. 17865 */ 17866 oldpkt = BP_PKT(bp); 17867 17868 if (oldpkt == un->un_rqs) { 17869 ASSERT(bp == un->un_rqs_bp); 17870 un->un_rqs = newpkt; 17871 } 17872 17873 SET_BP_PKT(bp, newpkt); 17874 17875 scsi_destroy_pkt(oldpkt); 17876 17877 rval = st_transport(un, newpkt); 17878 if (rval == TRAN_ACCEPT) { 17879 return (JUST_RETURN); 17880 } 17881 ST_RECOV(ST_DEVINFO, st_label, CE_NOTE, 17882 "Reissue pkt st_transport(0x%x) failure\n", rval); 17883 if (rval != TRAN_BUSY) { 17884 return (COMMAND_DONE_ERROR); 17885 } 17886 mutex_exit(ST_MUTEX); 17887 rval = st_handle_start_busy(un, bp, ST_TRAN_BUSY_TIMEOUT, queued); 17888 mutex_enter(ST_MUTEX); 17889 if (rval) { 17890 return (COMMAND_DONE_ERROR); 17891 } 17892 17893 return (JUST_RETURN); 17894 } 17895 17896 static int 17897 st_transport(struct scsi_tape *un, struct scsi_pkt *pkt) 17898 { 17899 int status; 17900 17901 ST_FUNC(ST_DEVINFO, st_transport); 17902 17903 ST_CDB(ST_DEVINFO, "transport CDB", (caddr_t)pkt->pkt_cdbp); 17904 17905 mutex_exit(ST_MUTEX); 17906 17907 status = scsi_transport(pkt); 17908 17909 mutex_enter(ST_MUTEX); 17910 17911 return (status); 17912 } 17913 17914 /* 17915 * Removed the buf_t bp from the queue referenced to by head and tail. 17916 * Returns the buf_t pointer if it is found in the queue. 17917 * Returns NULL if it is not found. 17918 */ 17919 static buf_t * 17920 st_remove_from_queue(buf_t **head, buf_t **tail, buf_t *bp) 17921 { 17922 buf_t *runqbp; 17923 buf_t *prevbp = NULL; 17924 17925 for (runqbp = *head; runqbp != 0; runqbp = runqbp->av_forw) { 17926 if (runqbp == bp) { 17927 /* found it, is it at the head? */ 17928 if (runqbp == *head) { 17929 *head = bp->av_forw; 17930 } else { 17931 prevbp->av_forw = bp->av_forw; 17932 } 17933 if (*tail == bp) { 17934 *tail = prevbp; 17935 } 17936 bp->av_forw = NULL; 17937 return (bp); /* found and removed */ 17938 } 17939 prevbp = runqbp; 17940 } 17941 return (NULL); 17942 } 17943 17944 /* 17945 * Adds a buf_t to the queue pointed to by head and tail. 17946 * Adds it either to the head end or the tail end based on which 17947 * the passed variable end (head or tail) points at. 17948 */ 17949 static void 17950 st_add_to_queue(buf_t **head, buf_t **tail, buf_t *end, buf_t *bp) 17951 { 17952 17953 bp->av_forw = NULL; 17954 if (*head) { 17955 /* Queue is not empty */ 17956 if (end == *head) { 17957 /* Add at front of queue */ 17958 bp->av_forw = *head; 17959 *head = bp; 17960 } else if (end == *tail) { 17961 /* Add at end of queue */ 17962 (*tail)->av_forw = bp; 17963 *tail = bp; 17964 } else { 17965 ASSERT(0); 17966 } 17967 } else { 17968 /* Queue is empty */ 17969 *head = bp; 17970 *tail = bp; 17971 } 17972 } 17973 17974 17975 static uint64_t 17976 st_get_cdb_g0_rw_count(uchar_t *cdb) 17977 { 17978 uint64_t count; 17979 17980 if ((cdb[1]) & 1) { 17981 /* fixed block mode, the count is the number of blocks */ 17982 count = 17983 cdb[2] << 16 | 17984 cdb[3] << 8 | 17985 cdb[4]; 17986 } else { 17987 /* variable block mode, the count is the block size */ 17988 count = 1; 17989 } 17990 return (count); 17991 } 17992 17993 static uint64_t 17994 st_get_cdb_g0_sign_count(uchar_t *cdb) 17995 { 17996 uint64_t count; 17997 17998 count = 17999 cdb[2] << 16 | 18000 cdb[3] << 8 | 18001 cdb[4]; 18002 /* 18003 * If the sign bit of the 3 byte value is set, extended it. 18004 */ 18005 if (count & 0x800000) { 18006 count |= 0xffffffffff000000; 18007 } 18008 return (count); 18009 } 18010 18011 static uint64_t 18012 st_get_cdb_g0_count(uchar_t *cdb) 18013 { 18014 uint64_t count; 18015 18016 count = 18017 cdb[2] << 16 | 18018 cdb[3] << 8 | 18019 cdb[4]; 18020 return (count); 18021 } 18022 18023 static uint64_t 18024 st_get_cdb_g5_rw_cnt(uchar_t *cdb) 18025 { 18026 uint64_t count; 18027 18028 if ((cdb[1]) & 1) { 18029 /* fixed block mode */ 18030 count = 18031 cdb[12] << 16 | 18032 cdb[13] << 8 | 18033 cdb[14]; 18034 } else { 18035 /* variable block mode */ 18036 count = 1; 18037 } 18038 return (count); 18039 } 18040 18041 static uint64_t 18042 st_get_no_count(uchar_t *cdb) 18043 { 18044 ASSERT(cdb[0] == SCMD_REWIND); 18045 return ((uint64_t)cdb[0]); 18046 } 18047 18048 static uint64_t 18049 st_get_load_options(uchar_t *cdb) 18050 { 18051 return ((uint64_t)(cdb[4] | (LD_HOLD << 1))); 18052 } 18053 18054 static uint64_t 18055 st_get_erase_options(uchar_t *cdb) 18056 { 18057 return (cdb[1] | (cdb[0] << 8)); 18058 } 18059 18060 static uint64_t 18061 st_get_cdb_g1_lba(uchar_t *cdb) 18062 { 18063 uint64_t lba; 18064 18065 lba = 18066 cdb[3] << 24 | 18067 cdb[4] << 16 | 18068 cdb[5] << 8 | 18069 cdb[6]; 18070 return (lba); 18071 } 18072 18073 static uint64_t 18074 st_get_cdb_g5_count(uchar_t *cdb) 18075 { 18076 uint64_t count = 18077 cdb[12] << 16 | 18078 cdb[13] << 8 | 18079 cdb[14]; 18080 18081 return (count); 18082 } 18083 18084 static uint64_t 18085 st_get_cdb_g4g5_cnt(uchar_t *cdb) 18086 { 18087 uint64_t lba; 18088 18089 lba = 18090 (uint64_t)cdb[4] << 56 | 18091 (uint64_t)cdb[5] << 48 | 18092 (uint64_t)cdb[6] << 40 | 18093 (uint64_t)cdb[7] << 32 | 18094 (uint64_t)cdb[8] << 24 | 18095 (uint64_t)cdb[9] << 16 | 18096 (uint64_t)cdb[10] << 8 | 18097 (uint64_t)cdb[11]; 18098 return (lba); 18099 } 18100 18101 static const cmd_attribute cmd_attributes[] = { 18102 { SCMD_READ, 18103 1, 0, 1, 0, 0, DIR_FORW, TRAN_READ, POS_EXPECTED, 18104 0, 0, 0, st_get_cdb_g0_rw_count }, 18105 { SCMD_WRITE, 18106 1, 0, 1, 1, 0, DIR_FORW, TRAN_WRTE, POS_EXPECTED, 18107 0, 0, 0, st_get_cdb_g0_rw_count }, 18108 { SCMD_TEST_UNIT_READY, 18109 0, 1, 0, 0, 0, DIR_NONE, TRAN_NONE, POS_EXPECTED, 18110 0, 0, 0 }, 18111 { SCMD_REWIND, 18112 1, 1, 1, 0, 0, DIR_REVC, TRAN_NONE, POS_EXPECTED, 18113 0, 0, 0, st_get_no_count }, 18114 { SCMD_REQUEST_SENSE, 18115 0, 0, 0, 0, 0, DIR_NONE, TRAN_READ, POS_EXPECTED, 18116 0, 0, 0 }, 18117 { SCMD_READ_BLKLIM, 18118 0, 1, 0, 0, 0, DIR_NONE, TRAN_READ, POS_EXPECTED, 18119 0, 0, 0 }, 18120 { SCMD_READ_G4, 18121 1, 0, 1, 0, 1, DIR_FORW, TRAN_READ, POS_EXPECTED, 18122 0, 0, 0, st_get_cdb_g5_rw_cnt, st_get_cdb_g4g5_cnt }, 18123 { SCMD_WRITE_G4, 18124 1, 0, 1, 1, 1, DIR_FORW, TRAN_WRTE, POS_EXPECTED, 18125 0, 0, 0, st_get_cdb_g5_rw_cnt, st_get_cdb_g4g5_cnt }, 18126 { SCMD_READ_REVERSE, 18127 1, 0, 1, 1, 0, DIR_REVC, TRAN_READ, POS_EXPECTED, 18128 0, 0, 0, st_get_cdb_g0_rw_count }, 18129 { SCMD_READ_REVERSE_G4, 18130 1, 0, 1, 1, 1, DIR_REVC, TRAN_READ, POS_EXPECTED, 18131 0, 0, 0, st_get_cdb_g5_rw_cnt, st_get_cdb_g4g5_cnt }, 18132 { SCMD_WRITE_FILE_MARK, 18133 1, 0, 1, 1, 0, DIR_FORW, TRAN_NONE, POS_EXPECTED, 18134 0, 0, 0, st_get_cdb_g0_count }, 18135 { SCMD_WRITE_FILE_MARK_G4, 18136 1, 0, 1, 1, 1, DIR_FORW, TRAN_NONE, POS_EXPECTED, 18137 0, 0, 0, st_get_cdb_g5_count, st_get_cdb_g4g5_cnt }, 18138 { SCMD_SPACE, 18139 1, 0, 1, 0, 0, DIR_EITH, TRAN_NONE, POS_STARTING, 18140 0, 0, 0, st_get_cdb_g0_sign_count }, 18141 { SCMD_SPACE_G4, 18142 1, 0, 1, 0, 0, DIR_EITH, TRAN_NONE, POS_STARTING, 18143 0, 0, 0, st_get_cdb_g4g5_cnt }, 18144 { SCMD_INQUIRY, 18145 0, 1, 0, 0, 0, DIR_NONE, TRAN_READ, POS_EXPECTED, 18146 0, 0, 0 }, 18147 { SCMD_VERIFY_G0, 18148 1, 0, 1, 0, 0, DIR_FORW, TRAN_NONE, POS_EXPECTED, 18149 0, 0, 0, st_get_cdb_g0_rw_count }, 18150 { SCMD_VERIFY_G4, 18151 1, 0, 1, 0, 1, DIR_FORW, TRAN_NONE, POS_EXPECTED, 18152 0, 0, 0, st_get_cdb_g5_rw_cnt, st_get_cdb_g4g5_cnt }, 18153 { SCMD_RECOVER_BUF, 18154 1, 0, 1, 1, 0, DIR_REVC, TRAN_READ, POS_EXPECTED, 18155 0, 0, 0 }, 18156 { SCMD_MODE_SELECT, 18157 1, 1, 0, 0, 0, DIR_NONE, TRAN_WRTE, POS_EXPECTED, 18158 0, 0, 0 }, 18159 { SCMD_RESERVE, 18160 0, 1, 0, 0, 0, DIR_NONE, TRAN_NONE, POS_EXPECTED, 18161 0, 0, 0 }, 18162 { SCMD_RELEASE, 18163 0, 1, 0, 0, 0, DIR_NONE, TRAN_NONE, POS_EXPECTED, 18164 0, 0, 0 }, 18165 { SCMD_ERASE, 18166 1, 0, 1, 1, 0, DIR_NONE, TRAN_NONE, POS_EXPECTED, 18167 0, 0, 0, st_get_erase_options }, 18168 { SCMD_MODE_SENSE, 18169 1, 1, 0, 0, 0, DIR_NONE, TRAN_READ, POS_EXPECTED, 18170 0, 0, 0 }, 18171 { SCMD_LOAD, 18172 1, 1, 1, 0, 0, DIR_EITH, TRAN_NONE, POS_EXPECTED, 18173 0, 0, 0, st_get_load_options }, 18174 { SCMD_GDIAG, 18175 1, 1, 0, 0, 0, DIR_NONE, TRAN_READ, POS_EXPECTED, 18176 1, 0, 0 }, 18177 { SCMD_SDIAG, 18178 1, 0, 1, 1, 0, DIR_EITH, TRAN_WRTE, POS_EXPECTED, 18179 1, 0, 0 }, 18180 { SCMD_DOORLOCK, 18181 0, 1, 0, 0, 0, DIR_NONE, TRAN_NONE, POS_EXPECTED, 18182 0, 4, 3 }, 18183 { SCMD_LOCATE, 18184 1, 1, 1, 0, 0, DIR_EITH, TRAN_NONE, POS_EXPECTED, 18185 0, 0, 0, NULL, st_get_cdb_g1_lba }, 18186 { SCMD_READ_POSITION, 18187 1, 1, 0, 0, 0, DIR_NONE, TRAN_READ, POS_EXPECTED, 18188 0, 0, 0 }, 18189 { SCMD_WRITE_BUFFER, 18190 1, 0, 0, 0, 0, DIR_NONE, TRAN_WRTE, POS_EXPECTED, 18191 1, 0, 0 }, 18192 { SCMD_READ_BUFFER, 18193 1, 0, 0, 0, 0, DIR_NONE, TRAN_READ, POS_EXPECTED, 18194 1, 0, 0 }, 18195 { SCMD_REPORT_DENSITIES, 18196 0, 1, 0, 0, 0, DIR_NONE, TRAN_READ, POS_EXPECTED, 18197 0, 0, 0 }, 18198 { SCMD_LOG_SELECT_G1, 18199 1, 1, 0, 0, 0, DIR_NONE, TRAN_WRTE, POS_EXPECTED, 18200 0, 0, 0 }, 18201 { SCMD_LOG_SENSE_G1, 18202 1, 1, 0, 0, 0, DIR_NONE, TRAN_READ, POS_EXPECTED, 18203 0, 0, 0 }, 18204 { SCMD_PRIN, 18205 0, 1, 0, 0, 0, DIR_NONE, TRAN_READ, POS_EXPECTED, 18206 0, 0, 0 }, 18207 { SCMD_PROUT, 18208 0, 1, 0, 0, 0, DIR_NONE, TRAN_WRTE, POS_EXPECTED, 18209 0, 0, 0 }, 18210 { SCMD_READ_ATTRIBUTE, 18211 1, 1, 0, 0, 0, DIR_NONE, TRAN_READ, POS_EXPECTED, 18212 0, 0, 0 }, 18213 { SCMD_WRITE_ATTRIBUTE, 18214 1, 1, 0, 0, 0, DIR_NONE, TRAN_WRTE, POS_EXPECTED, 18215 0, 0, 0 }, 18216 { SCMD_LOCATE_G4, 18217 1, 1, 1, 0, 0, DIR_EITH, TRAN_NONE, POS_EXPECTED, 18218 0, 0, 0, NULL, st_get_cdb_g4g5_cnt }, 18219 { SCMD_REPORT_LUNS, 18220 0, 1, 0, 0, 0, DIR_NONE, TRAN_READ, POS_EXPECTED, 18221 0, 0, 0 }, 18222 { SCMD_SVC_ACTION_IN_G5, 18223 1, 1, 0, 0, 0, DIR_NONE, TRAN_READ, POS_EXPECTED, 18224 0, 0, 0 }, 18225 { SCMD_MAINTENANCE_IN, 18226 1, 1, 0, 0, 0, DIR_NONE, TRAN_READ, POS_EXPECTED, 18227 0, 0, 0 }, 18228 { SCMD_MAINTENANCE_OUT, 18229 1, 1, 0, 0, 0, DIR_NONE, TRAN_WRTE, POS_EXPECTED, 18230 0, 0, 0 }, 18231 { 0xff, /* Default attribute for unsupported commands */ 18232 1, 0, 0, 0, 0, DIR_NONE, TRAN_NONE, POS_STARTING, 18233 1, 0, 0, NULL, NULL } 18234 }; 18235 18236 static const cmd_attribute * 18237 st_lookup_cmd_attribute(unsigned char cmd) 18238 { 18239 int i; 18240 cmd_attribute const *attribute; 18241 18242 for (i = 0; i < ST_NUM_MEMBERS(cmd_attributes); i++) { 18243 attribute = &cmd_attributes[i]; 18244 if (attribute->cmd == cmd) { 18245 return (attribute); 18246 } 18247 } 18248 ASSERT(attribute); 18249 return (attribute); 18250 } 18251 18252 static int 18253 st_reset(struct scsi_tape *un, int reset_type) 18254 { 18255 int rval; 18256 18257 ASSERT(MUTEX_HELD(&un->un_sd->sd_mutex)); 18258 18259 ST_FUNC(ST_DEVINFO, st_reset); 18260 un->un_rsvd_status |= ST_INITIATED_RESET; 18261 mutex_exit(ST_MUTEX); 18262 do { 18263 rval = scsi_reset(&un->un_sd->sd_address, reset_type); 18264 if (rval == 0) { 18265 switch (reset_type) { 18266 case RESET_LUN: 18267 ST_DEBUG3(ST_DEVINFO, st_label, CE_WARN, 18268 "LUN reset failed trying target reset"); 18269 reset_type = RESET_TARGET; 18270 break; 18271 case RESET_TARGET: 18272 ST_DEBUG3(ST_DEVINFO, st_label, CE_WARN, 18273 "target reset failed trying bus reset"); 18274 reset_type = RESET_BUS; 18275 break; 18276 case RESET_BUS: 18277 ST_DEBUG3(ST_DEVINFO, st_label, CE_WARN, 18278 "bus reset failed trying all reset"); 18279 reset_type = RESET_ALL; 18280 default: 18281 mutex_enter(ST_MUTEX); 18282 return (rval); 18283 } 18284 } 18285 } while (rval == 0); 18286 mutex_enter(ST_MUTEX); 18287 return (rval); 18288 } 18289 18290 18291 static void 18292 st_reset_notification(caddr_t arg) 18293 { 18294 struct scsi_tape *un = (struct scsi_tape *)arg; 18295 18296 ST_FUNC(ST_DEVINFO, st_reset_notification); 18297 mutex_enter(ST_MUTEX); 18298 18299 un->un_unit_attention_flags |= 2; 18300 if ((un->un_rsvd_status & (ST_RESERVE | ST_APPLICATION_RESERVATIONS)) == 18301 ST_RESERVE) { 18302 un->un_rsvd_status |= ST_LOST_RESERVE; 18303 ST_DEBUG2(ST_DEVINFO, st_label, CE_WARN, 18304 "Lost Reservation notification"); 18305 } else { 18306 ST_DEBUG2(ST_DEVINFO, st_label, CE_WARN, 18307 "reset notification"); 18308 } 18309 18310 if ((un->un_restore_pos == 0) && 18311 (un->un_state == ST_STATE_CLOSED) || 18312 (un->un_state == ST_STATE_OPEN_PENDING_IO) || 18313 (un->un_state == ST_STATE_CLOSING)) { 18314 un->un_restore_pos = 1; 18315 } 18316 ST_DEBUG6(ST_DEVINFO, st_label, CE_WARN, 18317 "reset and state was %d\n", un->un_state); 18318 mutex_exit(ST_MUTEX); 18319 } 18320