st.c revision 3138:7bbdcbfa4cd5
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 2006 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27#pragma ident "%Z%%M% %I% %E% SMI" 28 29/* 30 * SCSI SCSA-compliant and not-so-DDI-compliant Tape Driver 31 */ 32 33#if defined(lint) && !defined(DEBUG) 34#define DEBUG 1 35#endif 36 37#include <sys/modctl.h> 38#include <sys/scsi/scsi.h> 39#include <sys/mtio.h> 40#include <sys/scsi/targets/stdef.h> 41#include <sys/file.h> 42#include <sys/stat.h> 43#include <sys/kstat.h> 44#include <sys/ddidmareq.h> 45#include <sys/ddi.h> 46#include <sys/sunddi.h> 47 48#define IOSP KSTAT_IO_PTR(un->un_stats) 49/* 50 * stats maintained only for reads/writes as commands 51 * like rewind etc skew the wait/busy times 52 */ 53#define IS_RW(bp) ((bp)->b_bcount > 0) 54#define ST_DO_KSTATS(bp, kstat_function) \ 55 if ((bp != un->un_sbufp) && un->un_stats && IS_RW(bp)) { \ 56 kstat_function(IOSP); \ 57 } 58 59#define ST_DO_ERRSTATS(un, x) \ 60 if (un->un_errstats) { \ 61 struct st_errstats *stp; \ 62 stp = (struct st_errstats *)un->un_errstats->ks_data; \ 63 stp->x.value.ul++; \ 64 } 65 66#define FILL_SCSI1_LUN(devp, pkt) \ 67 if ((devp)->sd_inq->inq_ansi == 0x1) { \ 68 int _lun; \ 69 _lun = ddi_prop_get_int(DDI_DEV_T_ANY, (devp)->sd_dev, \ 70 DDI_PROP_DONTPASS, SCSI_ADDR_PROP_LUN, 0); \ 71 if (_lun > 0) { \ 72 ((union scsi_cdb *)(pkt)->pkt_cdbp)->scc_lun = \ 73 _lun; \ 74 } \ 75 } 76 77/* 78 * get an available contig mem header, cp. 79 * when big_enough is true, we will return NULL, if no big enough 80 * contig mem is found. 81 * when big_enough is false, we will try to find cp containing big 82 * enough contig mem. if not found, we will ruturn the last cp available. 83 * 84 * used by st_get_contig_mem() 85 */ 86#define ST_GET_CONTIG_MEM_HEAD(un, cp, len, big_enough) { \ 87 struct contig_mem *tmp_cp = NULL; \ 88 for ((cp) = (un)->un_contig_mem; \ 89 (cp) != NULL; \ 90 tmp_cp = (cp), (cp) = (cp)->cm_next) { \ 91 if (((cp)->cm_len >= (len)) || \ 92 (!(big_enough) && ((cp)->cm_next == NULL))) { \ 93 if (tmp_cp == NULL) { \ 94 (un)->un_contig_mem = (cp)->cm_next; \ 95 } else { \ 96 tmp_cp->cm_next = (cp)->cm_next; \ 97 } \ 98 (cp)->cm_next = NULL; \ 99 (un)->un_contig_mem_available_num--; \ 100 break; \ 101 } \ 102 } \ 103} 104 105#define ST_NUM_MEMBERS(array) (sizeof (array) / sizeof (array[0])) 106 107/* 108 * Global External Data Definitions 109 */ 110extern struct scsi_key_strings scsi_cmds[]; 111extern uchar_t scsi_cdb_size[]; 112 113/* 114 * Local Static Data 115 */ 116static void *st_state; 117static char *st_label = "st"; 118 119#if defined(__i386) || defined(__amd64) 120/* 121 * We need to use below DMA attr to alloc physically contiguous 122 * memory to do I/O in big block size 123 */ 124static ddi_dma_attr_t st_contig_mem_dma_attr = { 125 DMA_ATTR_V0, /* version number */ 126 0x0, /* lowest usable address */ 127 0xFFFFFFFFull, /* high DMA address range */ 128 0xFFFFFFFFull, /* DMA counter register */ 129 1, /* DMA address alignment */ 130 1, /* DMA burstsizes */ 131 1, /* min effective DMA size */ 132 0xFFFFFFFFull, /* max DMA xfer size */ 133 0xFFFFFFFFull, /* segment boundary */ 134 1, /* s/g list length */ 135 1, /* granularity of device */ 136 0 /* DMA transfer flags */ 137}; 138 139static ddi_device_acc_attr_t st_acc_attr = { 140 DDI_DEVICE_ATTR_V0, 141 DDI_NEVERSWAP_ACC, 142 DDI_STRICTORDER_ACC 143}; 144 145/* set limitation for the number of contig_mem */ 146static int st_max_contig_mem_num = ST_MAX_CONTIG_MEM_NUM; 147#endif 148 149/* 150 * Tunable parameters 151 * 152 * DISCLAIMER 153 * ---------- 154 * These parameters are intended for use only in system testing; if you use 155 * them in production systems, you do so at your own risk. Altering any 156 * variable not listed below may cause unpredictable system behavior. 157 * 158 * st_check_media_time 159 * 160 * Three second state check 161 * 162 * st_allow_large_xfer 163 * 164 * Gated with ST_NO_RECSIZE_LIMIT 165 * 166 * 0 - Transfers larger than 64KB will not be allowed 167 * regardless of the setting of ST_NO_RECSIZE_LIMIT 168 * 1 - Transfers larger than 64KB will be allowed 169 * if ST_NO_RECSIZE_LIMIT is TRUE for the drive 170 * 171 * st_report_soft_errors_on_close 172 * 173 * Gated with ST_SOFT_ERROR_REPORTING 174 * 175 * 0 - Errors will not be reported on close regardless 176 * of the setting of ST_SOFT_ERROR_REPORTING 177 * 178 * 1 - Errors will be reported on close if 179 * ST_SOFT_ERROR_REPORTING is TRUE for the drive 180 */ 181static int st_selection_retry_count = ST_SEL_RETRY_COUNT; 182static int st_retry_count = ST_RETRY_COUNT; 183 184static int st_io_time = ST_IO_TIME; 185static int st_long_timeout_x = ST_LONG_TIMEOUT_X; 186 187static int st_space_time = ST_SPACE_TIME; 188static int st_long_space_time_x = ST_LONG_SPACE_TIME_X; 189 190static int st_error_level = SCSI_ERR_RETRYABLE; 191static int st_check_media_time = 3000000; /* 3 Second State Check */ 192 193static int st_max_throttle = ST_MAX_THROTTLE; 194 195static clock_t st_wait_cmds_complete = ST_WAIT_CMDS_COMPLETE; 196 197static int st_allow_large_xfer = 1; 198static int st_report_soft_errors_on_close = 1; 199 200/* 201 * End of tunable parameters list 202 */ 203 204 205 206/* 207 * Asynchronous I/O and persistent errors, refer to PSARC/1995/228 208 * 209 * Asynchronous I/O's main offering is that it is a non-blocking way to do 210 * reads and writes. The driver will queue up all the requests it gets and 211 * have them ready to transport to the HBA. Unfortunately, we cannot always 212 * just ship the I/O requests to the HBA, as there errors and exceptions 213 * that may happen when we don't want the HBA to continue. Therein comes 214 * the flush-on-errors capability. If the HBA supports it, then st will 215 * send in st_max_throttle I/O requests at the same time. 216 * 217 * Persistent errors : This was also reasonably simple. In the interrupt 218 * routines, if there was an error or exception (FM, LEOT, media error, 219 * transport error), the persistent error bits are set and shuts everything 220 * down, but setting the throttle to zero. If we hit and exception in the 221 * HBA, and flush-on-errors were set, we wait for all outstanding I/O's to 222 * come back (with CMD_ABORTED), then flush all bp's in the wait queue with 223 * the appropriate error, and this will preserve order. Of course, depending 224 * on the exception we have to show a zero read or write before we show 225 * errors back to the application. 226 */ 227 228extern const int st_ndrivetypes; /* defined in st_conf.c */ 229extern const struct st_drivetype st_drivetypes[]; 230 231#ifdef STDEBUG 232static int st_soft_error_report_debug = 0; 233volatile int st_debug = 0; 234#endif 235 236#define ST_MT02_NAME "Emulex MT02 QIC-11/24 " 237 238static const struct driver_minor_data { 239 char *name; 240 int minor; 241} st_minor_data[] = { 242 /* 243 * The top 4 entries are for the default densities, 244 * don't alter their position. 245 */ 246 {"", 0}, 247 {"n", MT_NOREWIND}, 248 {"b", MT_BSD}, 249 {"bn", MT_NOREWIND | MT_BSD}, 250 {"l", MT_DENSITY1}, 251 {"m", MT_DENSITY2}, 252 {"h", MT_DENSITY3}, 253 {"c", MT_DENSITY4}, 254 {"u", MT_DENSITY4}, 255 {"ln", MT_DENSITY1 | MT_NOREWIND}, 256 {"mn", MT_DENSITY2 | MT_NOREWIND}, 257 {"hn", MT_DENSITY3 | MT_NOREWIND}, 258 {"cn", MT_DENSITY4 | MT_NOREWIND}, 259 {"un", MT_DENSITY4 | MT_NOREWIND}, 260 {"lb", MT_DENSITY1 | MT_BSD}, 261 {"mb", MT_DENSITY2 | MT_BSD}, 262 {"hb", MT_DENSITY3 | MT_BSD}, 263 {"cb", MT_DENSITY4 | MT_BSD}, 264 {"ub", MT_DENSITY4 | MT_BSD}, 265 {"lbn", MT_DENSITY1 | MT_NOREWIND | MT_BSD}, 266 {"mbn", MT_DENSITY2 | MT_NOREWIND | MT_BSD}, 267 {"hbn", MT_DENSITY3 | MT_NOREWIND | MT_BSD}, 268 {"cbn", MT_DENSITY4 | MT_NOREWIND | MT_BSD}, 269 {"ubn", MT_DENSITY4 | MT_NOREWIND | MT_BSD} 270}; 271 272/* strings used in many debug and warning messages */ 273static const char wr_str[] = "write"; 274static const char rd_str[] = "read"; 275static const char wrg_str[] = "writing"; 276static const char rdg_str[] = "reading"; 277 278/* default density offsets in the table above */ 279#define DEF_BLANK 0 280#define DEF_NOREWIND 1 281#define DEF_BSD 2 282#define DEF_BSD_NR 3 283 284/* Sense Key, ASC/ASCQ for which tape ejection is needed */ 285 286static struct tape_failure_code { 287 uchar_t key; 288 uchar_t add_code; 289 uchar_t qual_code; 290} st_tape_failure_code[] = { 291 { KEY_HARDWARE_ERROR, 0x15, 0x01}, 292 { KEY_HARDWARE_ERROR, 0x44, 0x00}, 293 { KEY_HARDWARE_ERROR, 0x53, 0x00}, 294 { KEY_HARDWARE_ERROR, 0x53, 0x01}, 295 { KEY_NOT_READY, 0x53, 0x00}, 296 { 0xff} 297}; 298 299/* clean bit position and mask */ 300 301static struct cln_bit_position { 302 ushort_t cln_bit_byte; 303 uchar_t cln_bit_mask; 304} st_cln_bit_position[] = { 305 { 21, 0x08}, 306 { 70, 0xc0}, 307 { 18, 0x81} /* 80 bit indicates in bit mode, 1 bit clean light is on */ 308}; 309 310/* 311 * architecture dependent allocation restrictions. For x86, we'll set 312 * dma_attr_addr_hi to st_max_phys_addr and dma_attr_sgllen to 313 * st_sgl_size during _init(). 314 */ 315#if defined(__sparc) 316static ddi_dma_attr_t st_alloc_attr = { 317 DMA_ATTR_V0, /* version number */ 318 0x0, /* lowest usable address */ 319 0xFFFFFFFFull, /* high DMA address range */ 320 0xFFFFFFFFull, /* DMA counter register */ 321 1, /* DMA address alignment */ 322 1, /* DMA burstsizes */ 323 1, /* min effective DMA size */ 324 0xFFFFFFFFull, /* max DMA xfer size */ 325 0xFFFFFFFFull, /* segment boundary */ 326 1, /* s/g list length */ 327 512, /* granularity of device */ 328 0 /* DMA transfer flags */ 329}; 330#elif defined(__x86) 331static ddi_dma_attr_t st_alloc_attr = { 332 DMA_ATTR_V0, /* version number */ 333 0x0, /* lowest usable address */ 334 0x0, /* high DMA address range [set in _init()] */ 335 0xFFFFull, /* DMA counter register */ 336 512, /* DMA address alignment */ 337 1, /* DMA burstsizes */ 338 1, /* min effective DMA size */ 339 0xFFFFFFFFull, /* max DMA xfer size */ 340 0xFFFFFFFFull, /* segment boundary */ 341 0, /* s/g list length */ 342 512, /* granularity of device [set in _init()] */ 343 0 /* DMA transfer flags */ 344}; 345uint64_t st_max_phys_addr = 0xFFFFFFFFull; 346int st_sgl_size = 0xF; 347 348#endif 349 350/* 351 * Configuration Data: 352 * 353 * Device driver ops vector 354 */ 355static int st_aread(dev_t dev, struct aio_req *aio, cred_t *cred_p); 356static int st_awrite(dev_t dev, struct aio_req *aio, cred_t *cred_p); 357static int st_read(dev_t dev, struct uio *uio_p, cred_t *cred_p); 358static int st_write(dev_t dev, struct uio *uio_p, cred_t *cred_p); 359static int st_open(dev_t *devp, int flag, int otyp, cred_t *cred_p); 360static int st_close(dev_t dev, int flag, int otyp, cred_t *cred_p); 361static int st_strategy(struct buf *bp); 362static int st_ioctl(dev_t dev, int cmd, intptr_t arg, int flag, 363 cred_t *cred_p, int *rval_p); 364extern int nulldev(), nodev(); 365 366static struct cb_ops st_cb_ops = { 367 st_open, /* open */ 368 st_close, /* close */ 369 st_strategy, /* strategy */ 370 nodev, /* print */ 371 nodev, /* dump */ 372 st_read, /* read */ 373 st_write, /* write */ 374 st_ioctl, /* ioctl */ 375 nodev, /* devmap */ 376 nodev, /* mmap */ 377 nodev, /* segmap */ 378 nochpoll, /* poll */ 379 ddi_prop_op, /* cb_prop_op */ 380 0, /* streamtab */ 381 D_64BIT | D_MP | D_NEW | D_HOTPLUG, /* Driver compatibility flag */ 382 CB_REV, /* cb_rev */ 383 st_aread, /* async I/O read entry point */ 384 st_awrite /* async I/O write entry point */ 385 386}; 387 388static int stinfo(dev_info_t *dip, ddi_info_cmd_t infocmd, void *arg, 389 void **result); 390static int st_probe(dev_info_t *dev); 391static int st_attach(dev_info_t *dev, ddi_attach_cmd_t cmd); 392static int st_detach(dev_info_t *dev, ddi_detach_cmd_t cmd); 393 394static struct dev_ops st_ops = { 395 DEVO_REV, /* devo_rev, */ 396 0, /* refcnt */ 397 stinfo, /* info */ 398 nulldev, /* identify */ 399 st_probe, /* probe */ 400 st_attach, /* attach */ 401 st_detach, /* detach */ 402 nodev, /* reset */ 403 &st_cb_ops, /* driver operations */ 404 (struct bus_ops *)0, /* bus operations */ 405 nulldev /* power */ 406}; 407 408/* 409 * Local Function Declarations 410 */ 411static void st_clean_print(dev_info_t *dev, char *label, uint_t level, 412 char *title, char *data, int len); 413static int st_doattach(struct scsi_device *devp, int (*canwait)()); 414static void st_known_tape_type(struct scsi_tape *un); 415static int st_get_conf_from_st_dot_conf(struct scsi_tape *, char *, 416 struct st_drivetype *); 417static int st_get_conf_from_st_conf_dot_c(struct scsi_tape *, char *, 418 struct st_drivetype *); 419static int st_get_default_conf(struct scsi_tape *, char *, 420 struct st_drivetype *); 421static int st_rw(dev_t dev, struct uio *uio, int flag); 422static int st_arw(dev_t dev, struct aio_req *aio, int flag); 423static int st_find_eom(dev_t dev); 424static int st_check_density_or_wfm(dev_t dev, int wfm, int mode, int stepflag); 425static int st_ioctl_cmd(dev_t dev, struct uscsi_cmd *, 426 enum uio_seg, enum uio_seg, enum uio_seg); 427static int st_mtioctop(struct scsi_tape *un, intptr_t arg, int flag); 428static void st_start(struct scsi_tape *un); 429static int st_handle_start_busy(struct scsi_tape *un, struct buf *bp, 430 clock_t timeout_interval); 431static int st_handle_intr_busy(struct scsi_tape *un, struct buf *bp, 432 clock_t timeout_interval); 433static int st_handle_intr_retry_lcmd(struct scsi_tape *un, struct buf *bp); 434static void st_done_and_mutex_exit(struct scsi_tape *un, struct buf *bp); 435static void st_init(struct scsi_tape *un); 436static void st_make_cmd(struct scsi_tape *un, struct buf *bp, 437 int (*func)(caddr_t)); 438static void st_make_uscsi_cmd(struct scsi_tape *, struct uscsi_cmd *, 439 struct buf *bp, int (*func)(caddr_t)); 440static void st_intr(struct scsi_pkt *pkt); 441static void st_set_state(struct scsi_tape *un); 442static void st_test_append(struct buf *bp); 443static int st_runout(caddr_t); 444static int st_cmd(dev_t dev, int com, int count, int wait); 445static int st_set_compression(struct scsi_tape *un); 446static int st_write_fm(dev_t dev, int wfm); 447static int st_determine_generic(dev_t dev); 448static int st_determine_density(dev_t dev, int rw); 449static int st_get_density(dev_t dev); 450static int st_set_density(dev_t dev); 451static int st_loadtape(dev_t dev); 452static int st_modesense(struct scsi_tape *un); 453static int st_modeselect(struct scsi_tape *un); 454static int st_handle_incomplete(struct scsi_tape *un, struct buf *bp); 455static int st_wrongtapetype(struct scsi_tape *un); 456static int st_check_error(struct scsi_tape *un, struct scsi_pkt *pkt); 457static int st_handle_sense(struct scsi_tape *un, struct buf *bp); 458static int st_handle_autosense(struct scsi_tape *un, struct buf *bp); 459static int st_decode_sense(struct scsi_tape *un, struct buf *bp, int amt, 460 struct scsi_status *); 461static int st_report_soft_errors(dev_t dev, int flag); 462static void st_delayed_cv_broadcast(void *arg); 463static int st_check_media(dev_t dev, enum mtio_state state); 464static int st_media_watch_cb(caddr_t arg, struct scsi_watch_result *resultp); 465static void st_intr_restart(void *arg); 466static void st_start_restart(void *arg); 467static int st_gen_mode_sense(struct scsi_tape *un, int page, 468 struct seq_mode *page_data, int page_size); 469static int st_change_block_size(dev_t dev, uint32_t nblksz); 470static int st_gen_mode_select(struct scsi_tape *un, struct seq_mode *page_data, 471 int page_size); 472static int st_tape_init(dev_t dev); 473static void st_flush(struct scsi_tape *un); 474static void st_set_pe_errno(struct scsi_tape *un); 475static void st_hba_unflush(struct scsi_tape *un); 476static void st_turn_pe_on(struct scsi_tape *un); 477static void st_turn_pe_off(struct scsi_tape *un); 478static void st_set_pe_flag(struct scsi_tape *un); 479static void st_clear_pe(struct scsi_tape *un); 480static void st_wait_for_io(struct scsi_tape *un); 481static int st_set_devconfig_page(struct scsi_tape *un, int compression_on); 482static int st_set_datacomp_page(struct scsi_tape *un, int compression_on); 483static int st_reserve_release(struct scsi_tape *un, int command); 484static int st_check_cdb_for_need_to_reserve(struct scsi_tape *un, caddr_t cdb); 485static int st_check_cmd_for_need_to_reserve(struct scsi_tape *un, uchar_t cmd, 486 int count); 487static int st_take_ownership(dev_t dev); 488static int st_check_asc_ascq(struct scsi_tape *un); 489static int st_check_clean_bit(dev_t dev); 490static int st_check_alert_flags(dev_t dev); 491static int st_check_sequential_clean_bit(dev_t dev); 492static int st_check_sense_clean_bit(dev_t dev); 493static int st_clear_unit_attentions(dev_t dev_instance, int max_trys); 494static void st_calculate_timeouts(struct scsi_tape *un); 495static writablity st_is_drive_worm(struct scsi_tape *un); 496static int st_read_attributes(struct scsi_tape *un, uint16_t attribute, 497 caddr_t buf, size_t size); 498static int st_get_special_inquiry(struct scsi_tape *un, uchar_t size, 499 caddr_t dest, uchar_t page); 500 501#if defined(__i386) || defined(__amd64) 502/* 503 * routines for I/O in big block size 504 */ 505static void st_release_contig_mem(struct scsi_tape *un, struct contig_mem *cp); 506static struct contig_mem *st_get_contig_mem(struct scsi_tape *un, size_t len, 507 int alloc_flags); 508static int st_bigblk_xfer_done(struct buf *bp); 509static struct buf *st_get_bigblk_bp(struct buf *bp); 510#endif 511 512/* 513 * error statistics create/update functions 514 */ 515static int st_create_errstats(struct scsi_tape *, int); 516static void st_uscsi_minphys(struct buf *bp); 517static int st_validate_tapemarks(struct scsi_tape *un, int fileno, daddr_t bn); 518 519#ifdef STDEBUG 520static void st_debug_cmds(struct scsi_tape *un, int com, int count, int wait); 521static char *st_dev_name(dev_t dev); 522#endif /* STDEBUG */ 523 524#if !defined(lint) 525_NOTE(SCHEME_PROTECTS_DATA("unique per pkt", scsi_pkt buf uio scsi_cdb)) 526_NOTE(SCHEME_PROTECTS_DATA("unique per pkt", scsi_extended_sense scsi_status)) 527_NOTE(SCHEME_PROTECTS_DATA("stable data", scsi_device)) 528_NOTE(DATA_READABLE_WITHOUT_LOCK(st_drivetype scsi_address)) 529#endif 530 531/* 532 * autoconfiguration routines. 533 */ 534char _depends_on[] = "misc/scsi"; 535 536static struct modldrv modldrv = { 537 &mod_driverops, /* Type of module. This one is a driver */ 538 "SCSI tape Driver %I%", /* Name of the module. */ 539 &st_ops /* driver ops */ 540}; 541 542static struct modlinkage modlinkage = { 543 MODREV_1, &modldrv, NULL 544}; 545 546/* 547 * Notes on Post Reset Behavior in the tape driver: 548 * 549 * When the tape drive is opened, the driver attempts to make sure that 550 * the tape head is positioned exactly where it was left when it was last 551 * closed provided the medium is not changed. If the tape drive is 552 * opened in O_NDELAY mode, the repositioning (if necessary for any loss 553 * of position due to reset) will happen when the first tape operation or 554 * I/O occurs. The repositioning (if required) may not be possible under 555 * certain situations such as when the device firmware not able to report 556 * the medium change in the REQUEST SENSE data because of a reset or a 557 * misbehaving bus not allowing the reposition to happen. In such 558 * extraordinary situations, where the driver fails to position the head 559 * at its original position, it will fail the open the first time, to 560 * save the applications from overwriting the data. All further attempts 561 * to open the tape device will result in the driver attempting to load 562 * the tape at BOT (beginning of tape). Also a warning message to 563 * indicate that further attempts to open the tape device may result in 564 * the tape being loaded at BOT will be printed on the console. If the 565 * tape device is opened in O_NDELAY mode, failure to restore the 566 * original tape head position, will result in the failure of the first 567 * tape operation or I/O, Further, the driver will invalidate its 568 * internal tape position which will necessitate the applications to 569 * validate the position by using either a tape positioning ioctl (such 570 * as MTREW) or closing and reopening the tape device. 571 * 572 */ 573 574int 575_init(void) 576{ 577 int e; 578 579 if (((e = ddi_soft_state_init(&st_state, 580 sizeof (struct scsi_tape), ST_MAXUNIT)) != 0)) { 581 return (e); 582 } 583 584 if ((e = mod_install(&modlinkage)) != 0) { 585 ddi_soft_state_fini(&st_state); 586 } 587 588#if defined(__x86) 589 /* set the max physical address for iob allocs on x86 */ 590 st_alloc_attr.dma_attr_addr_hi = st_max_phys_addr; 591 592 /* 593 * set the sgllen for iob allocs on x86. If this is set less than 594 * the number of pages the buffer will take (taking into account 595 * alignment), it would force the allocator to try and allocate 596 * contiguous pages. 597 */ 598 st_alloc_attr.dma_attr_sgllen = st_sgl_size; 599#endif 600 601 return (e); 602} 603 604int 605_fini(void) 606{ 607 int e; 608 609 if ((e = mod_remove(&modlinkage)) != 0) { 610 return (e); 611 } 612 613 ddi_soft_state_fini(&st_state); 614 615 return (e); 616} 617 618int 619_info(struct modinfo *modinfop) 620{ 621 return (mod_info(&modlinkage, modinfop)); 622} 623 624 625static int 626st_probe(dev_info_t *devi) 627{ 628 int instance; 629 struct scsi_device *devp; 630 int rval; 631 632#if !defined(__sparc) 633 char *tape_prop; 634 int tape_prop_len; 635#endif 636 637 /* If self identifying device */ 638 if (ddi_dev_is_sid(devi) == DDI_SUCCESS) { 639 return (DDI_PROBE_DONTCARE); 640 } 641 642#if !defined(__sparc) 643 /* 644 * Since some x86 HBAs have devnodes that look like SCSI as 645 * far as we can tell but aren't really SCSI (DADK, like mlx) 646 * we check for the presence of the "tape" property. 647 */ 648 if (ddi_prop_op(DDI_DEV_T_NONE, devi, PROP_LEN_AND_VAL_ALLOC, 649 DDI_PROP_CANSLEEP, "tape", 650 (caddr_t)&tape_prop, &tape_prop_len) != DDI_PROP_SUCCESS) { 651 return (DDI_PROBE_FAILURE); 652 } 653 if (strncmp(tape_prop, "sctp", tape_prop_len) != 0) { 654 kmem_free(tape_prop, tape_prop_len); 655 return (DDI_PROBE_FAILURE); 656 } 657 kmem_free(tape_prop, tape_prop_len); 658#endif 659 660 devp = ddi_get_driver_private(devi); 661 instance = ddi_get_instance(devi); 662 663 if (ddi_get_soft_state(st_state, instance) != NULL) { 664 return (DDI_PROBE_PARTIAL); 665 } 666 667 668 /* 669 * Turn around and call probe routine to see whether 670 * we actually have a tape at this SCSI nexus. 671 */ 672 if (scsi_probe(devp, NULL_FUNC) == SCSIPROBE_EXISTS) { 673 674 /* 675 * In checking the whole inq_dtype byte we are looking at both 676 * the Peripheral Qualifier and the Peripheral Device Type. 677 * For this driver we are only interested in sequential devices 678 * that are connected or capable if connecting to this logical 679 * unit. 680 */ 681 if (devp->sd_inq->inq_dtype == 682 (DTYPE_SEQUENTIAL | DPQ_POSSIBLE)) { 683 ST_DEBUG6(devi, st_label, SCSI_DEBUG, 684 "probe exists\n"); 685 rval = DDI_PROBE_SUCCESS; 686 } else { 687 rval = DDI_PROBE_FAILURE; 688 } 689 } else { 690 ST_DEBUG6(devi, st_label, SCSI_DEBUG, 691 "probe failure: nothing there\n"); 692 rval = DDI_PROBE_FAILURE; 693 } 694 scsi_unprobe(devp); 695 return (rval); 696} 697 698static int 699st_attach(dev_info_t *devi, ddi_attach_cmd_t cmd) 700{ 701 int instance; 702 int wide; 703 int dev_instance; 704 int ret_status; 705 struct scsi_device *devp; 706 int node_ix; 707 struct scsi_tape *un; 708 709 devp = ddi_get_driver_private(devi); 710 instance = ddi_get_instance(devi); 711 712 switch (cmd) { 713 case DDI_ATTACH: 714 if (st_doattach(devp, SLEEP_FUNC) == DDI_FAILURE) { 715 return (DDI_FAILURE); 716 } 717 break; 718 case DDI_RESUME: 719 /* 720 * Suspend/Resume 721 * 722 * When the driver suspended, there might be 723 * outstanding cmds and therefore we need to 724 * reset the suspended flag and resume the scsi 725 * watch thread and restart commands and timeouts 726 */ 727 728 if (!(un = ddi_get_soft_state(st_state, instance))) { 729 return (DDI_FAILURE); 730 } 731 dev_instance = ((un->un_dev == 0) ? MTMINOR(instance) : 732 un->un_dev); 733 734 mutex_enter(ST_MUTEX); 735 736 un->un_throttle = un->un_max_throttle; 737 un->un_tids_at_suspend = 0; 738 un->un_pwr_mgmt = ST_PWR_NORMAL; 739 740 if (un->un_swr_token) { 741 scsi_watch_resume(un->un_swr_token); 742 } 743 744 /* 745 * Restart timeouts 746 */ 747 if ((un->un_tids_at_suspend & ST_DELAY_TID) != 0) { 748 mutex_exit(ST_MUTEX); 749 un->un_delay_tid = 750 timeout(st_delayed_cv_broadcast, un, 751 drv_usectohz((clock_t) 752 MEDIA_ACCESS_DELAY)); 753 mutex_enter(ST_MUTEX); 754 } 755 756 if (un->un_tids_at_suspend & ST_HIB_TID) { 757 mutex_exit(ST_MUTEX); 758 un->un_hib_tid = timeout(st_intr_restart, un, 759 ST_STATUS_BUSY_TIMEOUT); 760 mutex_enter(ST_MUTEX); 761 } 762 763 ret_status = st_clear_unit_attentions(dev_instance, 5); 764 765 /* 766 * now check if we need to restore the tape position 767 */ 768 if ((un->un_suspend_fileno > 0) || 769 (un->un_suspend_blkno > 0)) { 770 if (ret_status != 0) { 771 /* 772 * tape didn't get good TUR 773 * just print out error messages 774 */ 775 scsi_log(ST_DEVINFO, st_label, CE_WARN, 776 "st_attach-RESUME: tape failure " 777 " tape position will be lost"); 778 } else { 779 /* this prints errors */ 780 (void) st_validate_tapemarks(un, 781 un->un_suspend_fileno, 782 un->un_suspend_blkno); 783 } 784 /* 785 * there are no retries, if there is an error 786 * we don't know if the tape has changed 787 */ 788 un->un_suspend_fileno = 0; 789 un->un_suspend_blkno = 0; 790 } 791 792 /* now we are ready to start up any queued I/Os */ 793 if (un->un_ncmds || un->un_quef) { 794 st_start(un); 795 } 796 797 cv_broadcast(&un->un_suspend_cv); 798 mutex_exit(ST_MUTEX); 799 return (DDI_SUCCESS); 800 801 default: 802 return (DDI_FAILURE); 803 } 804 805 un = ddi_get_soft_state(st_state, instance); 806 807 ST_DEBUG(devi, st_label, SCSI_DEBUG, 808 "st_attach: instance=%x\n", instance); 809 810 /* 811 * find the drive type for this target 812 */ 813 st_known_tape_type(un); 814 815 for (node_ix = 0; node_ix < ST_NUM_MEMBERS(st_minor_data); node_ix++) { 816 int minor; 817 char *name; 818 819 name = st_minor_data[node_ix].name; 820 minor = st_minor_data[node_ix].minor; 821 822 /* 823 * For default devices set the density to the 824 * preferred default density for this device. 825 */ 826 if (node_ix <= DEF_BSD_NR) { 827 minor |= un->un_dp->default_density; 828 } 829 minor |= MTMINOR(instance); 830 831 if (ddi_create_minor_node(devi, name, S_IFCHR, minor, 832 DDI_NT_TAPE, NULL) == DDI_SUCCESS) { 833 continue; 834 } 835 836 ddi_remove_minor_node(devi, NULL); 837 if (un) { 838 cv_destroy(&un->un_clscv); 839 cv_destroy(&un->un_sbuf_cv); 840 cv_destroy(&un->un_queue_cv); 841 cv_destroy(&un->un_state_cv); 842 cv_destroy(&un->un_suspend_cv); 843 cv_destroy(&un->un_tape_busy_cv); 844 845 if (un->un_sbufp) { 846 freerbuf(un->un_sbufp); 847 } 848 if (un->un_uscsi_rqs_buf) { 849 kmem_free(un->un_uscsi_rqs_buf, SENSE_LENGTH); 850 } 851 if (un->un_mspl) { 852 i_ddi_mem_free((caddr_t)un->un_mspl, NULL); 853 } 854 scsi_destroy_pkt(un->un_rqs); 855 scsi_free_consistent_buf(un->un_rqs_bp); 856 ddi_soft_state_free(st_state, instance); 857 devp->sd_private = NULL; 858 devp->sd_sense = NULL; 859 860 } 861 ddi_prop_remove_all(devi); 862 return (DDI_FAILURE); 863 } 864 865 /* 866 * Add a zero-length attribute to tell the world we support 867 * kernel ioctls (for layered drivers) 868 */ 869 (void) ddi_prop_create(DDI_DEV_T_NONE, devi, DDI_PROP_CANSLEEP, 870 DDI_KERNEL_IOCTL, NULL, 0); 871 872 ddi_report_dev((dev_info_t *)devi); 873 874 /* 875 * If it's a SCSI-2 tape drive which supports wide, 876 * tell the host adapter to use wide. 877 */ 878 wide = ((devp->sd_inq->inq_rdf == RDF_SCSI2) && 879 (devp->sd_inq->inq_wbus16 || devp->sd_inq->inq_wbus32)) ? 880 1 : 0; 881 882 if (scsi_ifsetcap(ROUTE, "wide-xfer", wide, 1) == 1) { 883 ST_DEBUG(devi, st_label, SCSI_DEBUG, 884 "Wide Transfer %s\n", wide ? "enabled" : "disabled"); 885 } 886 887 /* 888 * enable autorequest sense; keep the rq packet around in case 889 * the autorequest sense fails because of a busy condition 890 * do a getcap first in case the capability is not variable 891 */ 892 if (scsi_ifgetcap(ROUTE, "auto-rqsense", 1) == 1) { 893 un->un_arq_enabled = 1; 894 } else { 895 un->un_arq_enabled = 896 ((scsi_ifsetcap(ROUTE, "auto-rqsense", 1, 1) == 1) ? 1 : 0); 897 } 898 899 900 ST_DEBUG(devi, st_label, SCSI_DEBUG, "auto request sense %s\n", 901 (un->un_arq_enabled ? "enabled" : "disabled")); 902 903 un->un_untagged_qing = 904 (scsi_ifgetcap(ROUTE, "untagged-qing", 0) == 1); 905 906 /* 907 * XXX - This is just for 2.6. to tell users that write buffering 908 * has gone away. 909 */ 910 if (un->un_arq_enabled && un->un_untagged_qing) { 911 if (ddi_getprop(DDI_DEV_T_ANY, devi, DDI_PROP_DONTPASS, 912 "tape-driver-buffering", 0) != 0) { 913 scsi_log(ST_DEVINFO, st_label, CE_NOTE, 914 "Write Data Buffering has been depricated. Your " 915 "applications should continue to work normally.\n" 916 " But, they should ported to use Asynchronous " 917 " I/O\n" 918 " For more information, read about " 919 " tape-driver-buffering " 920 "property in the st(7d) man page\n"); 921 } 922 } 923 924 un->un_max_throttle = un->un_throttle = un->un_last_throttle = 1; 925 un->un_flush_on_errors = 0; 926 un->un_mkr_pkt = (struct scsi_pkt *)NULL; 927 928 ST_DEBUG(devi, st_label, SCSI_DEBUG, 929 "throttle=%x, max_throttle = %x\n", 930 un->un_throttle, un->un_max_throttle); 931 932 /* initialize persistent errors to nil */ 933 un->un_persistence = 0; 934 un->un_persist_errors = 0; 935 936 /* 937 * Get dma-max from HBA driver. If it is not defined, use 64k 938 */ 939 un->un_maxdma = scsi_ifgetcap(&devp->sd_address, "dma-max", 1); 940 if (un->un_maxdma == -1) { 941 ST_DEBUG(devi, st_label, SCSI_DEBUG, 942 "Receaved a value that looked like -1. Using 64k maxdma"); 943 un->un_maxdma = (64 * 1024); 944 } 945 946 /* 947 * Get the max allowable cdb size 948 */ 949 un->un_max_cdb_sz = 950 scsi_ifgetcap(&devp->sd_address, "max-cdb-length", 1); 951 if (un->un_max_cdb_sz < CDB_GROUP0) { 952 ST_DEBUG(devi, st_label, SCSI_DEBUG, 953 "HBA reported max-cdb-length as %d\n", un->un_max_cdb_sz); 954 un->un_max_cdb_sz = CDB_GROUP4; /* optimistic default */ 955 } 956 957 un->un_maxbsize = MAXBSIZE_UNKNOWN; 958 959 un->un_mediastate = MTIO_NONE; 960 un->un_HeadClean = TAPE_ALERT_SUPPORT_UNKNOWN; 961 962 /* 963 * initialize kstats 964 */ 965 un->un_stats = kstat_create("st", instance, NULL, "tape", 966 KSTAT_TYPE_IO, 1, KSTAT_FLAG_PERSISTENT); 967 if (un->un_stats) { 968 un->un_stats->ks_lock = ST_MUTEX; 969 kstat_install(un->un_stats); 970 } 971 (void) st_create_errstats(un, instance); 972 973 return (DDI_SUCCESS); 974} 975 976/* 977 * st_detach: 978 * 979 * we allow a detach if and only if: 980 * - no tape is currently inserted 981 * - tape position is at BOT or unknown 982 * (if it is not at BOT then a no rewind 983 * device was opened and we have to preserve state) 984 * - it must be in a closed state : no timeouts or scsi_watch requests 985 * will exist if it is closed, so we don't need to check for 986 * them here. 987 */ 988/*ARGSUSED*/ 989static int 990st_detach(dev_info_t *devi, ddi_detach_cmd_t cmd) 991{ 992 int instance; 993 int dev_instance; 994 struct scsi_device *devp; 995 struct scsi_tape *un; 996 clock_t wait_cmds_complete; 997 998 instance = ddi_get_instance(devi); 999 1000 if (!(un = ddi_get_soft_state(st_state, instance))) { 1001 return (DDI_FAILURE); 1002 } 1003 1004 switch (cmd) { 1005 1006 case DDI_DETACH: 1007 /* 1008 * Undo what we did in st_attach & st_doattach, 1009 * freeing resources and removing things we installed. 1010 * The system framework guarantees we are not active 1011 * with this devinfo node in any other entry points at 1012 * this time. 1013 */ 1014 1015 ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG, 1016 "st_detach: instance=%x, un=%p\n", instance, 1017 (void *)un); 1018 1019 if (((un->un_dp->options & ST_UNLOADABLE) == 0) || 1020 (un->un_ncmds != 0) || (un->un_quef != NULL) || 1021 (un->un_state != ST_STATE_CLOSED)) { 1022 /* 1023 * we cannot unload some targets because the 1024 * inquiry returns junk unless immediately 1025 * after a reset 1026 */ 1027 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 1028 "cannot unload instance %x\n", instance); 1029 return (DDI_FAILURE); 1030 } 1031 1032 /* 1033 * if the tape has been removed then we may unload; 1034 * do a test unit ready and if it returns NOT READY 1035 * then we assume that it is safe to unload. 1036 * as a side effect, fileno may be set to -1 if the 1037 * the test unit ready fails; 1038 * also un_state may be set to non-closed, so reset it 1039 */ 1040 if ((un->un_dev) && /* Been opened since attach */ 1041 ((un->un_fileno > 0) || /* Known position not rewound */ 1042 (un->un_blkno != 0))) { /* Or within first file */ 1043 mutex_enter(ST_MUTEX); 1044 /* 1045 * Send Test Unit Ready in the hopes that if 1046 * the drive is not in the state we think it is. 1047 * And the state will be changed so it can be detached. 1048 * If the command fails to reach the device and 1049 * the drive was not rewound or unloaded we want 1050 * to fail the detach till a user command fails 1051 * where after the detach will succead. 1052 */ 1053 (void) st_cmd(un->un_dev, SCMD_TEST_UNIT_READY, 1054 0, SYNC_CMD); 1055 /* 1056 * After TUR un_state may be set to non-closed, 1057 * so reset it back. 1058 */ 1059 un->un_state = ST_STATE_CLOSED; 1060 mutex_exit(ST_MUTEX); 1061 } 1062 ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG, 1063 "un_status=%x, fileno=%x, blkno=%lx\n", 1064 un->un_status, un->un_fileno, un->un_blkno); 1065 1066 /* 1067 * check again: 1068 * if we are not at BOT then it is not safe to unload 1069 */ 1070 if ((un->un_dev) && /* Been opened since attach */ 1071 ((un->un_fileno > 0) || /* Known position not rewound */ 1072 (un->un_blkno != 0))) { /* Or within first file */ 1073 ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG, 1074 "cannot detach: fileno=%x, blkno=%lx\n", 1075 un->un_fileno, un->un_blkno); 1076 return (DDI_FAILURE); 1077 } 1078 1079 /* 1080 * Just To make sure that we have released the 1081 * tape unit . 1082 */ 1083 if (un->un_dev && (un->un_rsvd_status & ST_RESERVE) && 1084 !DEVI_IS_DEVICE_REMOVED(devi)) { 1085 mutex_enter(ST_MUTEX); 1086 (void) st_reserve_release(un, ST_RELEASE); 1087 mutex_exit(ST_MUTEX); 1088 } 1089 1090 /* 1091 * now remove other data structures allocated in st_doattach() 1092 */ 1093 ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG, 1094 "destroying/freeing\n"); 1095 cv_destroy(&un->un_clscv); 1096 cv_destroy(&un->un_sbuf_cv); 1097 cv_destroy(&un->un_queue_cv); 1098 cv_destroy(&un->un_suspend_cv); 1099 cv_destroy(&un->un_tape_busy_cv); 1100 1101 if (un->un_hib_tid) { 1102 (void) untimeout(un->un_hib_tid); 1103 un->un_hib_tid = 0; 1104 } 1105 1106 if (un->un_delay_tid) { 1107 (void) untimeout(un->un_delay_tid); 1108 un->un_delay_tid = 0; 1109 } 1110 cv_destroy(&un->un_state_cv); 1111 1112#if defined(__i386) || defined(__amd64) 1113 if (un->un_contig_mem_hdl != NULL) { 1114 ddi_dma_free_handle(&un->un_contig_mem_hdl); 1115 } 1116#endif 1117 if (un->un_sbufp) { 1118 freerbuf(un->un_sbufp); 1119 } 1120 if (un->un_uscsi_rqs_buf) { 1121 kmem_free(un->un_uscsi_rqs_buf, SENSE_LENGTH); 1122 } 1123 if (un->un_mspl) { 1124 i_ddi_mem_free((caddr_t)un->un_mspl, NULL); 1125 } 1126 if (un->un_rqs) { 1127 scsi_destroy_pkt(un->un_rqs); 1128 scsi_free_consistent_buf(un->un_rqs_bp); 1129 } 1130 if (un->un_mkr_pkt) { 1131 scsi_destroy_pkt(un->un_mkr_pkt); 1132 } 1133 if (un->un_arq_enabled) { 1134 (void) scsi_ifsetcap(ROUTE, "auto-rqsense", 0, 1); 1135 } 1136 if (un->un_dp_size) { 1137 kmem_free(un->un_dp, un->un_dp_size); 1138 } 1139 if (un->un_stats) { 1140 kstat_delete(un->un_stats); 1141 un->un_stats = (kstat_t *)0; 1142 } 1143 if (un->un_errstats) { 1144 kstat_delete(un->un_errstats); 1145 un->un_errstats = (kstat_t *)0; 1146 } 1147 devp = ST_SCSI_DEVP; 1148 ddi_soft_state_free(st_state, instance); 1149 devp->sd_private = NULL; 1150 devp->sd_sense = NULL; 1151 scsi_unprobe(devp); 1152 ddi_prop_remove_all(devi); 1153 ddi_remove_minor_node(devi, NULL); 1154 ST_DEBUG(0, st_label, SCSI_DEBUG, "st_detach done\n"); 1155 return (DDI_SUCCESS); 1156 1157 case DDI_SUSPEND: 1158 1159 /* 1160 * Suspend/Resume 1161 * 1162 * To process DDI_SUSPEND, we must do the following: 1163 * 1164 * - check ddi_removing_power to see if power will be turned 1165 * off. if so, return DDI_FAILURE 1166 * - check if we are already suspended, 1167 * if so, return DDI_FAILURE 1168 * - check if device state is CLOSED, 1169 * if not, return DDI_FAILURE. 1170 * - wait until outstanding operations complete 1171 * - save tape state 1172 * - block new operations 1173 * - cancel pending timeouts 1174 * 1175 */ 1176 1177 if (ddi_removing_power(devi)) 1178 return (DDI_FAILURE); 1179 1180 mutex_enter(ST_MUTEX); 1181 1182 /* 1183 * Shouldn't already be suspended, if so return failure 1184 */ 1185 if (un->un_pwr_mgmt == ST_PWR_SUSPENDED) { 1186 mutex_exit(ST_MUTEX); 1187 return (DDI_FAILURE); 1188 } 1189 if (un->un_state != ST_STATE_CLOSED) { 1190 mutex_exit(ST_MUTEX); 1191 return (DDI_FAILURE); 1192 } 1193 1194 /* 1195 * Wait for all outstanding I/O's to complete 1196 * 1197 * we wait on both ncmds and the wait queue for times 1198 * when we are flushing after persistent errors are 1199 * flagged, which is when ncmds can be 0, and the 1200 * queue can still have I/O's. This way we preserve 1201 * order of biodone's. 1202 */ 1203 wait_cmds_complete = ddi_get_lbolt(); 1204 wait_cmds_complete += 1205 st_wait_cmds_complete * drv_usectohz(1000000); 1206 while (un->un_ncmds || un->un_quef || 1207 (un->un_state == ST_STATE_RESOURCE_WAIT)) { 1208 1209 if (cv_timedwait(&un->un_tape_busy_cv, ST_MUTEX, 1210 wait_cmds_complete) == -1) { 1211 /* 1212 * Time expired then cancel the command 1213 */ 1214 mutex_exit(ST_MUTEX); 1215 if (scsi_reset(ROUTE, RESET_TARGET) == 0) { 1216 mutex_enter(ST_MUTEX); 1217 if (un->un_last_throttle) { 1218 un->un_throttle = 1219 un->un_last_throttle; 1220 } 1221 mutex_exit(ST_MUTEX); 1222 return (DDI_FAILURE); 1223 } else { 1224 mutex_enter(ST_MUTEX); 1225 break; 1226 } 1227 } 1228 } 1229 1230 /* 1231 * DDI_SUSPEND says that the system "may" power down, we 1232 * remember the file and block number before rewinding. 1233 * we also need to save state before issuing 1234 * any WRITE_FILE_MARK command. 1235 */ 1236 if (un->un_fileno < 0) { 1237 un->un_suspend_fileno = 0; 1238 un->un_suspend_blkno = 0; 1239 } else { 1240 un->un_suspend_fileno = un->un_fileno; 1241 un->un_suspend_blkno = un->un_blkno; 1242 } 1243 dev_instance = ((un->un_dev == 0) ? MTMINOR(instance) : 1244 un->un_dev); 1245 1246 /* 1247 * Issue a zero write file fmk command to tell the drive to 1248 * flush any buffered tape marks 1249 */ 1250 (void) st_cmd(dev_instance, SCMD_WRITE_FILE_MARK, 0, SYNC_CMD); 1251 1252 /* 1253 * Because not all tape drives correctly implement buffer 1254 * flushing with the zero write file fmk command, issue a 1255 * synchronous rewind command to force data flushing. 1256 * st_validate_tapemarks() will do a rewind during DDI_RESUME 1257 * anyway. 1258 */ 1259 (void) st_cmd(dev_instance, SCMD_REWIND, 0, SYNC_CMD); 1260 1261 /* stop any new operations */ 1262 un->un_pwr_mgmt = ST_PWR_SUSPENDED; 1263 un->un_throttle = 0; 1264 1265 /* 1266 * cancel any outstanding timeouts 1267 */ 1268 if (un->un_delay_tid) { 1269 timeout_id_t temp_id = un->un_delay_tid; 1270 un->un_delay_tid = 0; 1271 un->un_tids_at_suspend |= ST_DELAY_TID; 1272 mutex_exit(ST_MUTEX); 1273 (void) untimeout(temp_id); 1274 mutex_enter(ST_MUTEX); 1275 } 1276 1277 if (un->un_hib_tid) { 1278 timeout_id_t temp_id = un->un_hib_tid; 1279 un->un_hib_tid = 0; 1280 un->un_tids_at_suspend |= ST_HIB_TID; 1281 mutex_exit(ST_MUTEX); 1282 (void) untimeout(temp_id); 1283 mutex_enter(ST_MUTEX); 1284 } 1285 1286 /* 1287 * Suspend the scsi_watch_thread 1288 */ 1289 if (un->un_swr_token) { 1290 opaque_t temp_token = un->un_swr_token; 1291 mutex_exit(ST_MUTEX); 1292 scsi_watch_suspend(temp_token); 1293 } else { 1294 mutex_exit(ST_MUTEX); 1295 } 1296 1297 return (DDI_SUCCESS); 1298 1299 default: 1300 ST_DEBUG(0, st_label, SCSI_DEBUG, "st_detach failed\n"); 1301 return (DDI_FAILURE); 1302 } 1303} 1304 1305 1306/* ARGSUSED */ 1307static int 1308stinfo(dev_info_t *dip, ddi_info_cmd_t infocmd, void *arg, void **result) 1309{ 1310 dev_t dev; 1311 struct scsi_tape *un; 1312 int instance, error; 1313 switch (infocmd) { 1314 case DDI_INFO_DEVT2DEVINFO: 1315 dev = (dev_t)arg; 1316 instance = MTUNIT(dev); 1317 if ((un = ddi_get_soft_state(st_state, instance)) == NULL) 1318 return (DDI_FAILURE); 1319 *result = (void *) ST_DEVINFO; 1320 error = DDI_SUCCESS; 1321 break; 1322 case DDI_INFO_DEVT2INSTANCE: 1323 dev = (dev_t)arg; 1324 instance = MTUNIT(dev); 1325 *result = (void *)(uintptr_t)instance; 1326 error = DDI_SUCCESS; 1327 break; 1328 default: 1329 error = DDI_FAILURE; 1330 } 1331 return (error); 1332} 1333 1334static int 1335st_doattach(struct scsi_device *devp, int (*canwait)()) 1336{ 1337 struct scsi_pkt *rqpkt = NULL; 1338 struct scsi_tape *un = NULL; 1339 int km_flags = (canwait != NULL_FUNC) ? KM_SLEEP : KM_NOSLEEP; 1340 int instance; 1341 struct buf *bp; 1342 size_t rlen; 1343 1344 /* 1345 * Call the routine scsi_probe to do some of the dirty work. 1346 * If the INQUIRY command succeeds, the field sd_inq in the 1347 * device structure will be filled in. 1348 */ 1349 ST_DEBUG(devp->sd_dev, st_label, SCSI_DEBUG, 1350 "st_doattach(): probing\n"); 1351 1352 if (scsi_probe(devp, canwait) == SCSIPROBE_EXISTS) { 1353 1354 /* 1355 * In checking the whole inq_dtype byte we are looking at both 1356 * the Peripheral Qualifier and the Peripheral Device Type. 1357 * For this driver we are only interested in sequential devices 1358 * that are connected or capable if connecting to this logical 1359 * unit. 1360 */ 1361 if (devp->sd_inq->inq_dtype == 1362 (DTYPE_SEQUENTIAL | DPQ_POSSIBLE)) { 1363 ST_DEBUG(devp->sd_dev, st_label, SCSI_DEBUG, 1364 "probe exists\n"); 1365 } else { 1366 /* Something there but not a tape device */ 1367 scsi_unprobe(devp); 1368 return (DDI_FAILURE); 1369 } 1370 } else { 1371 /* Nothing there */ 1372 ST_DEBUG(devp->sd_dev, st_label, SCSI_DEBUG, 1373 "probe failure: nothing there\n"); 1374 scsi_unprobe(devp); 1375 return (DDI_FAILURE); 1376 } 1377 1378 bp = scsi_alloc_consistent_buf(&devp->sd_address, (struct buf *)NULL, 1379 SENSE_LENGTH, B_READ, canwait, NULL); 1380 if (!bp) { 1381 goto error; 1382 } 1383 rqpkt = scsi_init_pkt(&devp->sd_address, 1384 (struct scsi_pkt *)NULL, bp, CDB_GROUP0, 1, 0, 1385 PKT_CONSISTENT, canwait, NULL); 1386 if (!rqpkt) { 1387 goto error; 1388 } 1389 devp->sd_sense = (struct scsi_extended_sense *)bp->b_un.b_addr; 1390 ASSERT(geterror(bp) == NULL); 1391 1392 (void) scsi_setup_cdb((union scsi_cdb *)rqpkt->pkt_cdbp, 1393 SCMD_REQUEST_SENSE, 0, SENSE_LENGTH, 0); 1394 FILL_SCSI1_LUN(devp, rqpkt); 1395 1396 /* 1397 * The actual unit is present. 1398 * Now is the time to fill in the rest of our info.. 1399 */ 1400 instance = ddi_get_instance(devp->sd_dev); 1401 1402 if (ddi_soft_state_zalloc(st_state, instance) != DDI_SUCCESS) { 1403 goto error; 1404 } 1405 un = ddi_get_soft_state(st_state, instance); 1406 1407 ASSERT(un != NULL); 1408 1409 un->un_sbufp = getrbuf(km_flags); 1410 1411 un->un_uscsi_rqs_buf = kmem_alloc(SENSE_LENGTH, KM_SLEEP); 1412 1413 /* 1414 * use i_ddi_mem_alloc() for now until we have an interface to allocate 1415 * memory for DMA which doesn't require a DMA handle. ddi_iopb_alloc() 1416 * is obsolete and we want more flexibility in controlling the DMA 1417 * address constraints. 1418 */ 1419 (void) i_ddi_mem_alloc(devp->sd_dev, &st_alloc_attr, 1420 sizeof (struct seq_mode), ((km_flags == KM_SLEEP) ? 1 : 0), 0, 1421 NULL, (caddr_t *)&un->un_mspl, &rlen, NULL); 1422 1423 if (!un->un_sbufp || !un->un_mspl) { 1424 if (un->un_mspl) { 1425 i_ddi_mem_free((caddr_t)un->un_mspl, NULL); 1426 } 1427 ST_DEBUG6(devp->sd_dev, st_label, SCSI_DEBUG, 1428 "probe partial failure: no space\n"); 1429 goto error; 1430 } 1431 1432 bzero(un->un_mspl, sizeof (struct seq_mode)); 1433 1434 cv_init(&un->un_sbuf_cv, NULL, CV_DRIVER, NULL); 1435 cv_init(&un->un_queue_cv, NULL, CV_DRIVER, NULL); 1436 cv_init(&un->un_clscv, NULL, CV_DRIVER, NULL); 1437 cv_init(&un->un_state_cv, NULL, CV_DRIVER, NULL); 1438#if defined(__i386) || defined(__amd64) 1439 cv_init(&un->un_contig_mem_cv, NULL, CV_DRIVER, NULL); 1440#endif 1441 1442 /* Initialize power managemnet condition variable */ 1443 cv_init(&un->un_suspend_cv, NULL, CV_DRIVER, NULL); 1444 cv_init(&un->un_tape_busy_cv, NULL, CV_DRIVER, NULL); 1445 1446 rqpkt->pkt_flags |= (FLAG_SENSING | FLAG_HEAD | FLAG_NODISCON); 1447 1448 un->un_fileno = -1; 1449 rqpkt->pkt_time = st_io_time; 1450 rqpkt->pkt_comp = st_intr; 1451 un->un_rqs = rqpkt; 1452 un->un_sd = devp; 1453 un->un_rqs_bp = bp; 1454 un->un_swr_token = (opaque_t)NULL; 1455 un->un_comp_page = ST_DEV_DATACOMP_PAGE | ST_DEV_CONFIG_PAGE; 1456 un->un_wormable = st_is_drive_worm; 1457 1458 un->un_suspend_fileno = 0; 1459 un->un_suspend_blkno = 0; 1460 1461#if defined(__i386) || defined(__amd64) 1462 if (ddi_dma_alloc_handle(ST_DEVINFO, &st_contig_mem_dma_attr, 1463 DDI_DMA_SLEEP, NULL, &un->un_contig_mem_hdl) != DDI_SUCCESS) { 1464 ST_DEBUG6(devp->sd_dev, st_label, SCSI_DEBUG, 1465 "allocation of contiguous memory dma handle failed!"); 1466 un->un_contig_mem_hdl = NULL; 1467 goto error; 1468 } 1469#endif 1470 1471 /* 1472 * Since this driver manages devices with "remote" hardware, 1473 * i.e. the devices themselves have no "reg" properties, 1474 * the SUSPEND/RESUME commands in detach/attach will not be 1475 * called by the power management framework unless we request 1476 * it by creating a "pm-hardware-state" property and setting it 1477 * to value "needs-suspend-resume". 1478 */ 1479 if (ddi_prop_update_string(DDI_DEV_T_NONE, devp->sd_dev, 1480 "pm-hardware-state", "needs-suspend-resume") != 1481 DDI_PROP_SUCCESS) { 1482 1483 ST_DEBUG(devp->sd_dev, st_label, SCSI_DEBUG, 1484 "ddi_prop_update(\"pm-hardware-state\") failed\n"); 1485 goto error; 1486 } 1487 1488 if (ddi_prop_create(DDI_DEV_T_NONE, devp->sd_dev, DDI_PROP_CANSLEEP, 1489 "no-involuntary-power-cycles", NULL, 0) != DDI_PROP_SUCCESS) { 1490 1491 ST_DEBUG(devp->sd_dev, st_label, SCSI_DEBUG, 1492 "ddi_prop_create(\"no-involuntary-power-cycles\") " 1493 "failed\n"); 1494 goto error; 1495 } 1496 1497 ST_DEBUG6(devp->sd_dev, st_label, SCSI_DEBUG, "probe success\n"); 1498 return (DDI_SUCCESS); 1499 1500error: 1501 devp->sd_sense = NULL; 1502 1503 ddi_remove_minor_node(devp->sd_dev, NULL); 1504 if (un) { 1505 if (un->un_mspl) { 1506 i_ddi_mem_free((caddr_t)un->un_mspl, NULL); 1507 } 1508 if (un->un_sbufp) { 1509 freerbuf(un->un_sbufp); 1510 } 1511 if (un->un_uscsi_rqs_buf) { 1512 kmem_free(un->un_uscsi_rqs_buf, SENSE_LENGTH); 1513 } 1514#if defined(__i386) || defined(__amd64) 1515 if (un->un_contig_mem_hdl != NULL) { 1516 ddi_dma_free_handle(&un->un_contig_mem_hdl); 1517 } 1518#endif 1519 ddi_soft_state_free(st_state, instance); 1520 devp->sd_private = NULL; 1521 } 1522 1523 if (rqpkt) { 1524 scsi_destroy_pkt(rqpkt); 1525 } 1526 1527 if (bp) { 1528 scsi_free_consistent_buf(bp); 1529 } 1530 1531 if (devp->sd_inq) { 1532 scsi_unprobe(devp); 1533 } 1534 return (DDI_FAILURE); 1535} 1536 1537typedef int 1538(*cfg_functp)(struct scsi_tape *, char *vidpid, struct st_drivetype *); 1539 1540static cfg_functp config_functs[] = { 1541 st_get_conf_from_st_dot_conf, 1542 st_get_conf_from_st_conf_dot_c, 1543 st_get_default_conf 1544}; 1545 1546 1547/* 1548 * determine tape type, using tape-config-list or built-in table or 1549 * use a generic tape config entry 1550 */ 1551static void 1552st_known_tape_type(struct scsi_tape *un) 1553{ 1554 struct st_drivetype *dp; 1555 cfg_functp *config_funct; 1556 1557 /* 1558 * XXX: Emulex MT-02 (and emulators) predates SCSI-1 and has 1559 * no vid & pid inquiry data. So, we provide one. 1560 */ 1561 if (ST_INQUIRY->inq_len == 0 || 1562 (bcmp("\0\0\0\0\0\0\0\0", ST_INQUIRY->inq_vid, 8) == 0)) { 1563 (void) strcpy((char *)ST_INQUIRY->inq_vid, ST_MT02_NAME); 1564 } 1565 1566 un->un_dp_size = sizeof (struct st_drivetype); 1567 dp = kmem_zalloc((size_t)un->un_dp_size, KM_SLEEP); 1568 un->un_dp = dp; 1569 1570 /* 1571 * Loop through the configuration methods till one works. 1572 */ 1573 for (config_funct = &config_functs[0]; ; config_funct++) { 1574 if ((*config_funct)(un, ST_INQUIRY->inq_vid, dp)) { 1575 break; 1576 } 1577 } 1578 1579 /* 1580 * If we didn't just make up this configuration and 1581 * all the density codes are the same.. 1582 * Set Auto Density over ride. 1583 */ 1584 if (*config_funct != st_get_default_conf) { 1585 /* 1586 * If this device is one that is configured and all 1587 * densities are the same, This saves doing gets and set 1588 * that yield nothing. 1589 */ 1590 if ((dp->densities[0]) == (dp->densities[1]) && 1591 (dp->densities[0]) == (dp->densities[2]) && 1592 (dp->densities[0]) == (dp->densities[3])) { 1593 1594 dp->options |= ST_AUTODEN_OVERRIDE; 1595 } 1596 } 1597 1598 1599 /* 1600 * Store tape drive characteristics. 1601 */ 1602 un->un_status = 0; 1603 un->un_attached = 1; 1604 un->un_init_options = dp->options; 1605 1606 /* setup operation time-outs based on options */ 1607 st_calculate_timeouts(un); 1608 1609 /* make sure if we are supposed to be variable, make it variable */ 1610 if (dp->options & ST_VARIABLE) { 1611 dp->bsize = 0; 1612 } 1613 1614 scsi_log(ST_DEVINFO, st_label, CE_NOTE, "?<%s>\n", dp->name); 1615} 1616 1617 1618typedef struct { 1619 int mask; 1620 int bottom; 1621 int top; 1622 char *name; 1623} conf_limit; 1624 1625static const conf_limit conf_limits[] = { 1626 1627 -1, 1, 2, "conf version", 1628 -1, MT_ISTS, ST_LAST_TYPE, "drive type", 1629 -1, 0, 0xffffff, "block size", 1630 ST_VALID_OPTS, 0, ST_VALID_OPTS, "options", 1631 -1, 0, 4, "number of densities", 1632 -1, 0, UINT8_MAX, "density code", 1633 -1, 0, 3, "default density", 1634 -1, 0, UINT16_MAX, "non motion timeout", 1635 -1, 0, UINT16_MAX, "I/O timeout", 1636 -1, 0, UINT16_MAX, "space timeout", 1637 -1, 0, UINT16_MAX, "load timeout", 1638 -1, 0, UINT16_MAX, "unload timeout", 1639 -1, 0, UINT16_MAX, "erase timeout", 1640 0, 0, 0, NULL 1641}; 1642 1643static int 1644st_validate_conf_data(struct scsi_tape *un, int *list, int list_len, 1645 const char *conf_name) 1646{ 1647 int dens; 1648 int ndens; 1649 int value; 1650 int type; 1651 int count; 1652 const conf_limit *limit = &conf_limits[0]; 1653 1654 ST_DEBUG3(ST_DEVINFO, st_label, CE_NOTE, 1655 "Checking %d entrys total with %d densities\n", list_len, list[4]); 1656 1657 count = list_len; 1658 type = *list; 1659 for (; count && limit->name; count--, list++, limit++) { 1660 1661 value = *list; 1662 if (value & ~limit->mask) { 1663 scsi_log(ST_DEVINFO, st_label, CE_NOTE, 1664 "%s %s value invalid bits set: 0x%X\n", 1665 conf_name, limit->name, value & ~limit->mask); 1666 *list &= limit->mask; 1667 } else if (value < limit->bottom) { 1668 scsi_log(ST_DEVINFO, st_label, CE_NOTE, 1669 "%s %s value too low: value = %d limit %d\n", 1670 conf_name, limit->name, value, limit->bottom); 1671 } else if (value > limit->top) { 1672 scsi_log(ST_DEVINFO, st_label, CE_NOTE, 1673 "%s %s value too high: value = %d limit %d\n", 1674 conf_name, limit->name, value, limit->top); 1675 } else { 1676 ST_DEBUG3(ST_DEVINFO, st_label, CE_CONT, 1677 "%s %s value = 0x%X\n", 1678 conf_name, limit->name, value); 1679 } 1680 1681 /* If not the number of densities continue */ 1682 if (limit != &conf_limits[4]) { 1683 continue; 1684 } 1685 1686 /* If number of densities is not in range can't use config */ 1687 if (value < limit->bottom || value > limit->top) { 1688 return (-1); 1689 } 1690 1691 ndens = min(value, NDENSITIES); 1692 if ((type == 1) && (list_len - ndens) != 6) { 1693 scsi_log(ST_DEVINFO, st_label, CE_NOTE, 1694 "%s conf version 1 with %d densities has %d items" 1695 " should have %d", 1696 conf_name, ndens, list_len, 6 + ndens); 1697 } else if ((type == 2) && (list_len - ndens) != 13) { 1698 scsi_log(ST_DEVINFO, st_label, CE_NOTE, 1699 "%s conf version 2 with %d densities has %d items" 1700 " should have %d", 1701 conf_name, ndens, list_len, 13 + ndens); 1702 } 1703 1704 limit++; 1705 for (dens = 0; dens < ndens && count; dens++) { 1706 count--; 1707 list++; 1708 value = *list; 1709 if (value < limit->bottom) { 1710 scsi_log(ST_DEVINFO, st_label, CE_NOTE, 1711 "%s density[%d] value too low: value =" 1712 " 0x%X limit 0x%X\n", 1713 conf_name, dens, value, limit->bottom); 1714 } else if (value > limit->top) { 1715 scsi_log(ST_DEVINFO, st_label, CE_NOTE, 1716 "%s density[%d] value too high: value =" 1717 " 0x%X limit 0x%X\n", 1718 conf_name, dens, value, limit->top); 1719 } else { 1720 ST_DEBUG3(ST_DEVINFO, st_label, CE_CONT, 1721 "%s density[%d] value = 0x%X\n", 1722 conf_name, dens, value); 1723 } 1724 } 1725 } 1726 1727 return (0); 1728} 1729 1730static int 1731st_get_conf_from_st_dot_conf(struct scsi_tape *un, char *vidpid, 1732 struct st_drivetype *dp) 1733{ 1734 caddr_t config_list = NULL; 1735 caddr_t data_list = NULL; 1736 int *data_ptr; 1737 caddr_t vidptr, prettyptr, datanameptr; 1738 size_t vidlen, prettylen, datanamelen, tripletlen = 0; 1739 int config_list_len, data_list_len, len, i; 1740 int version; 1741 int found = 0; 1742 1743 1744 /* 1745 * Determine type of tape controller. Type is determined by 1746 * checking the vendor ids of the earlier inquiry command and 1747 * comparing those with vids in tape-config-list defined in st.conf 1748 */ 1749 if (ddi_getlongprop(DDI_DEV_T_ANY, ST_DEVINFO, DDI_PROP_DONTPASS, 1750 "tape-config-list", (caddr_t)&config_list, &config_list_len) 1751 != DDI_PROP_SUCCESS) { 1752 return (found); 1753 } 1754 1755 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 1756 "st_get_conf_from_st_dot_conf(): st.conf has tape-config-list\n"); 1757 1758 /* 1759 * Compare vids in each triplet - if it matches, get value for 1760 * data_name and contruct a st_drivetype struct 1761 * tripletlen is not set yet! 1762 */ 1763 for (len = config_list_len, vidptr = config_list; 1764 len > 0; 1765 vidptr += tripletlen, len -= tripletlen) { 1766 1767 vidlen = strlen(vidptr); 1768 prettyptr = vidptr + vidlen + 1; 1769 prettylen = strlen(prettyptr); 1770 datanameptr = prettyptr + prettylen + 1; 1771 datanamelen = strlen(datanameptr); 1772 tripletlen = vidlen + prettylen + datanamelen + 3; 1773 1774 if (vidlen == 0) { 1775 continue; 1776 } 1777 1778 /* 1779 * If inquiry vid dosen't match this triplets vid, 1780 * try the next. 1781 */ 1782 if (strncasecmp(vidpid, vidptr, vidlen)) { 1783 continue; 1784 } 1785 1786 /* 1787 * if prettylen is zero then use the vid string 1788 */ 1789 if (prettylen == 0) { 1790 prettyptr = vidptr; 1791 prettylen = vidlen; 1792 } 1793 1794 ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG, 1795 "vid = %s, pretty=%s, dataname = %s\n", 1796 vidptr, prettyptr, datanameptr); 1797 1798 /* 1799 * get the data list 1800 */ 1801 if (ddi_getlongprop(DDI_DEV_T_ANY, ST_DEVINFO, 0, 1802 datanameptr, (caddr_t)&data_list, 1803 &data_list_len) != DDI_PROP_SUCCESS) { 1804 /* 1805 * Error in getting property value 1806 * print warning! 1807 */ 1808 scsi_log(ST_DEVINFO, st_label, CE_WARN, 1809 "data property (%s) has no value\n", 1810 datanameptr); 1811 continue; 1812 } 1813 1814 /* 1815 * now initialize the st_drivetype struct 1816 */ 1817 (void) strncpy(dp->name, prettyptr, ST_NAMESIZE - 1); 1818 dp->length = (int)min(vidlen, (VIDPIDLEN - 1)); 1819 (void) strncpy(dp->vid, vidptr, dp->length); 1820 data_ptr = (int *)data_list; 1821 /* 1822 * check if data is enough for version, type, 1823 * bsize, options, # of densities, density1, 1824 * density2, ..., default_density 1825 */ 1826 if ((data_list_len < 5 * sizeof (int)) || 1827 (data_list_len < 6 * sizeof (int) + 1828 *(data_ptr + 4) * sizeof (int))) { 1829 /* 1830 * print warning and skip to next triplet. 1831 */ 1832 scsi_log(ST_DEVINFO, st_label, CE_WARN, 1833 "data property (%s) incomplete\n", 1834 datanameptr); 1835 kmem_free(data_list, data_list_len); 1836 continue; 1837 } 1838 1839 if (st_validate_conf_data(un, data_ptr, 1840 data_list_len / sizeof (int), datanameptr)) { 1841 kmem_free(data_list, data_list_len); 1842 scsi_log(ST_DEVINFO, st_label, CE_WARN, 1843 "data property (%s) rejected\n", 1844 datanameptr); 1845 continue; 1846 } 1847 1848 /* 1849 * check version 1850 */ 1851 version = *data_ptr++; 1852 if (version != 1 && version != 2) { 1853 /* print warning but accept it */ 1854 scsi_log(ST_DEVINFO, st_label, CE_WARN, 1855 "Version # for data property (%s) " 1856 "not set to 1 or 2\n", datanameptr); 1857 } 1858 1859 dp->type = *data_ptr++; 1860 dp->bsize = *data_ptr++; 1861 dp->options = *data_ptr++; 1862 dp->options |= ST_DYNAMIC; 1863 len = *data_ptr++; 1864 for (i = 0; i < NDENSITIES; i++) { 1865 if (i < len) { 1866 dp->densities[i] = *data_ptr++; 1867 } 1868 } 1869 dp->default_density = *data_ptr << 3; 1870 if (version == 2 && 1871 data_list_len >= (13 + len) * sizeof (int)) { 1872 data_ptr++; 1873 dp->non_motion_timeout = *data_ptr++; 1874 dp->io_timeout = *data_ptr++; 1875 dp->rewind_timeout = *data_ptr++; 1876 dp->space_timeout = *data_ptr++; 1877 dp->load_timeout = *data_ptr++; 1878 dp->unload_timeout = *data_ptr++; 1879 dp->erase_timeout = *data_ptr++; 1880 } 1881 kmem_free(data_list, data_list_len); 1882 found = 1; 1883 ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG, 1884 "found in st.conf: vid = %s, pretty=%s\n", 1885 dp->vid, dp->name); 1886 break; 1887 } 1888 1889 /* 1890 * free up the memory allocated by ddi_getlongprop 1891 */ 1892 if (config_list) { 1893 kmem_free(config_list, config_list_len); 1894 } 1895 return (found); 1896} 1897 1898static int 1899st_get_conf_from_st_conf_dot_c(struct scsi_tape *un, char *vidpid, 1900 struct st_drivetype *dp) 1901{ 1902 int i; 1903 1904 /* 1905 * Determine type of tape controller. Type is determined by 1906 * checking the result of the earlier inquiry command and 1907 * comparing vendor ids with strings in a table declared in st_conf.c. 1908 */ 1909 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 1910 "st_get_conf_from_st_conf_dot_c(): looking at st_drivetypes\n"); 1911 1912 for (i = 0; i < st_ndrivetypes; i++) { 1913 if (st_drivetypes[i].length == 0) { 1914 continue; 1915 } 1916 if (strncasecmp(vidpid, st_drivetypes[i].vid, 1917 st_drivetypes[i].length)) { 1918 continue; 1919 } 1920 bcopy(&st_drivetypes[i], dp, sizeof (st_drivetypes[i])); 1921 return (1); 1922 } 1923 return (0); 1924} 1925 1926static int 1927st_get_default_conf(struct scsi_tape *un, char *vidpid, struct st_drivetype *dp) 1928{ 1929 int i; 1930 1931 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 1932 "st_get_default_conf(): making drivetype from INQ cmd\n"); 1933 1934 1935 /* 1936 * Make up a name 1937 */ 1938 bcopy("Vendor '", dp->name, 8); 1939 bcopy(vidpid, &dp->name[8], VIDLEN); 1940 bcopy("' Product '", &dp->name[16], 11); 1941 bcopy(&vidpid[8], &dp->name[27], PIDLEN); 1942 dp->name[ST_NAMESIZE - 2] = '\''; 1943 dp->name[ST_NAMESIZE - 1] = '\0'; 1944 dp->length = min(strlen(ST_INQUIRY->inq_vid), (VIDPIDLEN - 1)); 1945 (void) strncpy(dp->vid, ST_INQUIRY->inq_vid, dp->length); 1946 /* 1947 * 'clean' vendor and product strings of non-printing chars 1948 */ 1949 for (i = 0; i < ST_NAMESIZE - 2; i++) { 1950 if (dp->name[i] < ' ' || dp->name[i] > '~') { 1951 dp->name[i] = '.'; 1952 } 1953 } 1954 dp->type = ST_TYPE_INVALID; 1955 dp->options |= (ST_DYNAMIC | ST_UNLOADABLE | ST_MODE_SEL_COMP); 1956 1957 return (1); /* Can Not Fail */ 1958} 1959 1960/* 1961 * Regular Unix Entry points 1962 */ 1963 1964 1965 1966/* ARGSUSED */ 1967static int 1968st_open(dev_t *dev_p, int flag, int otyp, cred_t *cred_p) 1969{ 1970 dev_t dev = *dev_p; 1971 int rval = 0; 1972 1973 GET_SOFT_STATE(dev); 1974 1975 /* 1976 * validate that we are addressing a sensible unit 1977 */ 1978 mutex_enter(ST_MUTEX); 1979 1980#ifdef STDEBUG 1981 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 1982 "st_open(node = %s dev = 0x%lx, flag = %d, otyp = %d)\n", 1983 st_dev_name(dev), *dev_p, flag, otyp); 1984#endif 1985 1986 /* 1987 * All device accesss go thru st_strategy() where we check 1988 * suspend status 1989 */ 1990 1991 if (!un->un_attached) { 1992 st_known_tape_type(un); 1993 if (!un->un_attached) { 1994 rval = ENXIO; 1995 goto exit; 1996 } 1997 1998 } 1999 2000 /* 2001 * Check for the case of the tape in the middle of closing. 2002 * This isn't simply a check of the current state, because 2003 * we could be in state of sensing with the previous state 2004 * that of closing. 2005 * 2006 * And don't allow multiple opens. 2007 */ 2008 if (!(flag & (FNDELAY | FNONBLOCK)) && IS_CLOSING(un)) { 2009 un->un_laststate = un->un_state; 2010 un->un_state = ST_STATE_CLOSE_PENDING_OPEN; 2011 while (IS_CLOSING(un) || 2012 un->un_state == ST_STATE_CLOSE_PENDING_OPEN) { 2013 if (cv_wait_sig(&un->un_clscv, ST_MUTEX) == 0) { 2014 rval = EINTR; 2015 un->un_state = un->un_laststate; 2016 goto exit; 2017 } 2018 } 2019 } else if (un->un_state != ST_STATE_CLOSED) { 2020 rval = EBUSY; 2021 goto busy; 2022 } 2023 2024 /* 2025 * record current dev 2026 */ 2027 un->un_dev = dev; 2028 un->un_oflags = flag; /* save for use in st_tape_init() */ 2029 un->un_errno = 0; /* no errors yet */ 2030 un->un_restore_pos = 0; 2031 un->un_rqs_state = 0; 2032 2033 /* 2034 * If we are opening O_NDELAY, or O_NONBLOCK, we don't check for 2035 * anything, leave internal states alone, if fileno >= 0 2036 */ 2037 if (flag & (FNDELAY | FNONBLOCK)) { 2038 if (un->un_fileno < 0 || (un->un_fileno == 0 && 2039 un->un_blkno == 0)) { 2040 un->un_state = ST_STATE_OFFLINE; 2041 } else if (un->un_fileno > 0 || 2042 (un->un_fileno == 0 && un->un_blkno != 0)) { 2043 /* 2044 * set un_read_only/write-protect status. 2045 * 2046 * If the tape is not bot we can assume 2047 * that mspl->wp_status is set properly. 2048 * else 2049 * we need to do a mode sense/Tur once 2050 * again to get the actual tape status.(since 2051 * user might have replaced the tape) 2052 * Hence make the st state OFFLINE so that 2053 * we re-intialize the tape once again. 2054 */ 2055 un->un_read_only = 2056 (un->un_oflags & FWRITE) ? RDWR : RDONLY; 2057 un->un_state = ST_STATE_OPEN_PENDING_IO; 2058 } else { 2059 un->un_state = ST_STATE_OFFLINE; 2060 } 2061 rval = 0; 2062 } else { 2063 /* 2064 * Not opening O_NDELAY. 2065 */ 2066 un->un_state = ST_STATE_OPENING; 2067 2068 rval = st_tape_init(dev); 2069 if ((rval == EACCES) && (un->un_read_only & WORM)) { 2070 un->un_state = ST_STATE_OPEN_PENDING_IO; 2071 rval = 0; /* so open doesn't fail */ 2072 } else if (rval) { 2073 /* 2074 * Release the tape unit, if reserved and not 2075 * preserve reserve. 2076 */ 2077 if ((un->un_rsvd_status & 2078 (ST_RESERVE | ST_PRESERVE_RESERVE)) == ST_RESERVE) { 2079 (void) st_reserve_release(un, ST_RELEASE); 2080 } 2081 } else { 2082 un->un_state = ST_STATE_OPEN_PENDING_IO; 2083 } 2084 } 2085 2086exit: 2087 /* 2088 * we don't want any uninvited guests scrogging our data when we're 2089 * busy with something, so for successful opens or failed opens 2090 * (except for EBUSY), reset these counters and state appropriately. 2091 */ 2092 if (rval != EBUSY) { 2093 if (rval) { 2094 un->un_state = ST_STATE_CLOSED; 2095 } 2096 un->un_err_resid = 0; 2097 un->un_retry_ct = 0; 2098 un->un_tran_retry_ct = 0; 2099 } 2100busy: 2101 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 2102 "st_open: return val = %x, state = %d\n", rval, un->un_state); 2103 mutex_exit(ST_MUTEX); 2104 return (rval); 2105 2106} 2107 2108static int 2109st_tape_init(dev_t dev) 2110{ 2111 int err; 2112 int rval = 0; 2113 2114 GET_SOFT_STATE(dev); 2115 2116 ASSERT(mutex_owned(ST_MUTEX)); 2117 2118 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 2119 "st_tape_init(dev = 0x%lx, oflags = %d)\n", dev, un->un_oflags); 2120 2121 /* 2122 * Clean up after any errors left by 'last' close. 2123 * This also handles the case of the initial open. 2124 */ 2125 if (un->un_state != ST_STATE_INITIALIZING) { 2126 un->un_laststate = un->un_state; 2127 un->un_state = ST_STATE_OPENING; 2128 } 2129 2130 un->un_kbytes_xferred = 0; 2131 2132 /* 2133 * do a throw away TUR to clear check condition 2134 */ 2135 err = st_cmd(dev, SCMD_TEST_UNIT_READY, 0, SYNC_CMD); 2136 2137 /* 2138 * If test unit ready fails because the drive is reserved 2139 * by another host fail the open for no access. 2140 */ 2141 if (err) { 2142 if (un->un_rsvd_status & ST_RESERVATION_CONFLICT) { 2143 un->un_state = ST_STATE_CLOSED; 2144 ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG, 2145 "st_tape_init: RESERVATION CONFLICT\n"); 2146 rval = EACCES; 2147 goto exit; 2148 } 2149 } 2150 2151 /* 2152 * See whether this is a generic device that we haven't figured 2153 * anything out about yet. 2154 */ 2155 if (un->un_dp->type == ST_TYPE_INVALID) { 2156 rval = st_determine_generic(dev); 2157 if (rval) { 2158 if (rval != EACCES) { 2159 rval = EIO; 2160 } 2161 un->un_state = ST_STATE_CLOSED; 2162 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 2163 "st_tape_init: %s invalid type\n", 2164 rval == EACCES ? "EACCES" : "EIO"); 2165 goto exit; 2166 } 2167 /* 2168 * If this is a Unknown Type drive, 2169 * Use the READ BLOCK LIMITS to determine if 2170 * allow large xfer is approprate if not globally 2171 * disabled with st_allow_large_xfer. 2172 */ 2173 un->un_allow_large_xfer = (uchar_t)st_allow_large_xfer; 2174 } else { 2175 2176 /* 2177 * If we allow_large_xfer (ie >64k) and have not yet found out 2178 * the max block size supported by the drive, 2179 * find it by issueing a READ_BLKLIM command. 2180 * if READ_BLKLIM cmd fails, assume drive doesn't 2181 * allow_large_xfer and min/max block sizes as 1 byte and 63k. 2182 */ 2183 un->un_allow_large_xfer = st_allow_large_xfer && 2184 (un->un_dp->options & ST_NO_RECSIZE_LIMIT); 2185 } 2186 /* 2187 * if maxbsize is unknown, set the maximum block size. 2188 */ 2189 if (un->un_maxbsize == MAXBSIZE_UNKNOWN) { 2190 2191 /* 2192 * Get the Block limits of the tape drive. 2193 * if un->un_allow_large_xfer = 0 , then make sure 2194 * that maxbsize is <= ST_MAXRECSIZE_FIXED. 2195 */ 2196 un->un_rbl = kmem_zalloc(RBLSIZE, KM_SLEEP); 2197 2198 err = st_cmd(dev, SCMD_READ_BLKLIM, RBLSIZE, SYNC_CMD); 2199 if (err) { 2200 /* Retry */ 2201 err = st_cmd(dev, SCMD_READ_BLKLIM, RBLSIZE, SYNC_CMD); 2202 } 2203 if (!err) { 2204 2205 /* 2206 * if cmd successful, use limit returned 2207 */ 2208 un->un_maxbsize = (un->un_rbl->max_hi << 16) + 2209 (un->un_rbl->max_mid << 8) + 2210 un->un_rbl->max_lo; 2211 un->un_minbsize = (un->un_rbl->min_hi << 8) + 2212 un->un_rbl->min_lo; 2213 un->un_data_mod = 1 << un->un_rbl->granularity; 2214 if ((un->un_maxbsize == 0) || 2215 (un->un_allow_large_xfer == 0 && 2216 un->un_maxbsize > ST_MAXRECSIZE_FIXED)) { 2217 un->un_maxbsize = ST_MAXRECSIZE_FIXED; 2218 2219 } else if (un->un_dp->type == ST_TYPE_DEFAULT) { 2220 /* 2221 * Drive is not one that is configured, But the 2222 * READ BLOCK LIMITS tells us it can do large 2223 * xfers. 2224 */ 2225 if (un->un_maxbsize > ST_MAXRECSIZE_FIXED) { 2226 un->un_dp->options |= 2227 ST_NO_RECSIZE_LIMIT; 2228 } 2229 /* 2230 * If max and mimimum block limits are the 2231 * same this is a fixed block size device. 2232 */ 2233 if (un->un_maxbsize == un->un_minbsize) { 2234 un->un_dp->options &= ~ST_VARIABLE; 2235 } 2236 } 2237 2238 if (un->un_minbsize == 0) { 2239 un->un_minbsize = 1; 2240 } 2241 2242 } else { /* error on read block limits */ 2243 2244 scsi_log(ST_DEVINFO, st_label, CE_NOTE, 2245 "!st_tape_init: Error on READ BLOCK LIMITS," 2246 " errno = %d un_rsvd_status = 0x%X\n", 2247 err, un->un_rsvd_status); 2248 2249 /* 2250 * since read block limits cmd failed, 2251 * do not allow large xfers. 2252 * use old values in st_minphys 2253 */ 2254 if (un->un_rsvd_status & ST_RESERVATION_CONFLICT) { 2255 rval = EACCES; 2256 } else { 2257 un->un_allow_large_xfer = 0; 2258 scsi_log(ST_DEVINFO, st_label, CE_NOTE, 2259 "!Disabling large transfers\n"); 2260 2261 /* 2262 * we guess maxbsize and minbsize 2263 */ 2264 if (un->un_bsize) { 2265 un->un_maxbsize = un->un_minbsize = 2266 un->un_bsize; 2267 } else { 2268 un->un_maxbsize = ST_MAXRECSIZE_FIXED; 2269 un->un_minbsize = 1; 2270 } 2271 /* 2272 * Data Mod must be set, 2273 * Even if read block limits fails. 2274 * Prevents Divide By Zero in st_rw(). 2275 */ 2276 un->un_data_mod = 1; 2277 } 2278 } 2279 if (un->un_rbl) { 2280 kmem_free(un->un_rbl, RBLSIZE); 2281 un->un_rbl = NULL; 2282 } 2283 2284 if (rval) { 2285 goto exit; 2286 } 2287 } 2288 2289 ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, 2290 "maxdma = %d, maxbsize = %d, minbsize = %d, %s large xfer\n", 2291 un->un_maxdma, un->un_maxbsize, un->un_minbsize, 2292 (un->un_allow_large_xfer ? "ALLOW": "DON'T ALLOW")); 2293 2294 err = st_cmd(dev, SCMD_TEST_UNIT_READY, 0, SYNC_CMD); 2295 2296 if (err != 0) { 2297 if (err == EINTR) { 2298 un->un_laststate = un->un_state; 2299 un->un_state = ST_STATE_CLOSED; 2300 rval = EINTR; 2301 goto exit; 2302 } 2303 /* 2304 * Make sure the tape is ready 2305 */ 2306 un->un_fileno = -1; 2307 if (un->un_status != KEY_UNIT_ATTENTION) { 2308 /* 2309 * allow open no media. Subsequent MTIOCSTATE 2310 * with media present will complete the open 2311 * logic. 2312 */ 2313 un->un_laststate = un->un_state; 2314 if (un->un_oflags & (FNONBLOCK|FNDELAY)) { 2315 un->un_mediastate = MTIO_EJECTED; 2316 un->un_state = ST_STATE_OFFLINE; 2317 rval = 0; 2318 goto exit; 2319 } else { 2320 un->un_state = ST_STATE_CLOSED; 2321 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 2322 "st_tape_init EIO no media, not opened " 2323 "O_NONBLOCK|O_EXCL\n"); 2324 rval = EIO; 2325 goto exit; 2326 } 2327 } 2328 } 2329 2330 /* 2331 * On each open, initialize block size from drivetype struct, 2332 * as it could have been changed by MTSRSZ ioctl. 2333 * Now, ST_VARIABLE simply means drive is capable of variable 2334 * mode. All drives are assumed to support fixed records. 2335 * Hence, un_bsize tells what mode the drive is in. 2336 * un_bsize = 0 - variable record length 2337 * = x - fixed record length is x 2338 */ 2339 un->un_bsize = un->un_dp->bsize; 2340 2341 if (un->un_restore_pos) { 2342 rval = st_validate_tapemarks(un, un->un_save_fileno, 2343 un->un_save_blkno); 2344 if (rval != 0) { 2345 if (rval != EACCES) { 2346 rval = EIO; 2347 } 2348 un->un_restore_pos = 0; 2349 un->un_laststate = un->un_state; 2350 un->un_state = ST_STATE_CLOSED; 2351 goto exit; 2352 } 2353 un->un_restore_pos = 0; 2354 } 2355 2356 if (un->un_fileno < 0) { 2357 rval = st_loadtape(dev); 2358 if (rval) { 2359 if (rval != EACCES) { 2360 rval = EIO; 2361 } 2362 un->un_laststate = un->un_state; 2363 un->un_state = ST_STATE_CLOSED; 2364 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 2365 "st_tape_init: %s can't open tape\n", 2366 rval == EACCES ? "EACCES" : "EIO"); 2367 goto exit; 2368 } 2369 } 2370 2371 /* 2372 * do a mode sense to pick up state of current write-protect, 2373 * Could cause reserve and fail due to conflict. 2374 */ 2375 rval = st_modesense(un); 2376 if (rval == EACCES) { 2377 goto exit; 2378 } 2379 2380 /* 2381 * If we are opening the tape for writing, check 2382 * to make sure that the tape can be written. 2383 */ 2384 if (un->un_oflags & FWRITE) { 2385 err = 0; 2386 if (un->un_mspl->wp) { 2387 un->un_status = KEY_WRITE_PROTECT; 2388 un->un_laststate = un->un_state; 2389 un->un_state = ST_STATE_CLOSED; 2390 rval = EACCES; 2391 /* 2392 * STK sets the wp bit if volsafe tape is loaded. 2393 */ 2394 if ((un->un_dp->type == MT_ISSTK9840) && 2395 (un->un_dp->options & ST_WORMABLE)) { 2396 un->un_read_only = RDONLY; 2397 } else { 2398 goto exit; 2399 } 2400 } else { 2401 un->un_read_only = RDWR; 2402 } 2403 } else { 2404 un->un_read_only = RDONLY; 2405 } 2406 2407 if (un->un_dp->options & ST_WORMABLE) { 2408 un->un_read_only |= un->un_wormable(un); 2409 2410 if (((un->un_read_only == WORM) || 2411 (un->un_read_only == RDWORM)) && 2412 ((un->un_oflags & FWRITE) == FWRITE)) { 2413 un->un_status = KEY_DATA_PROTECT; 2414 rval = EACCES; 2415 ST_DEBUG4(ST_DEVINFO, st_label, CE_NOTE, 2416 "read_only = %d eof = %d oflag = %d\n", 2417 un->un_read_only, un->un_eof, un->un_oflags); 2418 } 2419 } 2420 2421 /* 2422 * If we're opening the tape write-only, we need to 2423 * write 2 filemarks on the HP 1/2 inch drive, to 2424 * create a null file. 2425 */ 2426 if ((un->un_read_only == RDWR) || 2427 (un->un_read_only == WORM) && (un->un_oflags & FWRITE)) { 2428 if (un->un_dp->options & ST_REEL) { 2429 un->un_fmneeded = 2; 2430 } else { 2431 un->un_fmneeded = 1; 2432 } 2433 } else { 2434 un->un_fmneeded = 0; 2435 } 2436 2437 ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, 2438 "fmneeded = %x\n", un->un_fmneeded); 2439 2440 /* 2441 * Make sure the density can be selected correctly. 2442 * If WORM can only write at the append point which in most cases 2443 * isn't BOP. st_determine_density() with a B_WRITE only attempts 2444 * to set and try densities if a BOP. 2445 */ 2446 if (st_determine_density(dev, 2447 un->un_read_only == RDWR ? B_WRITE : B_READ)) { 2448 un->un_status = KEY_ILLEGAL_REQUEST; 2449 un->un_laststate = un->un_state; 2450 un->un_state = ST_STATE_CLOSED; 2451 ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG, 2452 "st_tape_init: EIO can't determine density\n"); 2453 rval = EIO; 2454 goto exit; 2455 } 2456 2457 /* 2458 * Destroy the knowledge that we have 'determined' 2459 * density so that a later read at BOT comes along 2460 * does the right density determination. 2461 */ 2462 2463 un->un_density_known = 0; 2464 2465 2466 /* 2467 * Okay, the tape is loaded and either at BOT or somewhere past. 2468 * Mark the state such that any I/O or tape space operations 2469 * will get/set the right density, etc.. 2470 */ 2471 un->un_laststate = un->un_state; 2472 un->un_lastop = ST_OP_NIL; 2473 un->un_mediastate = MTIO_INSERTED; 2474 cv_broadcast(&un->un_state_cv); 2475 2476 /* 2477 * Set test append flag if writing. 2478 * First write must check that tape is positioned correctly. 2479 */ 2480 un->un_test_append = (un->un_oflags & FWRITE); 2481 2482exit: 2483 un->un_err_resid = 0; 2484 un->un_last_resid = 0; 2485 un->un_last_count = 0; 2486 2487 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 2488 "st_tape_init: return val = %x\n", rval); 2489 return (rval); 2490 2491} 2492 2493 2494 2495/* ARGSUSED */ 2496static int 2497st_close(dev_t dev, int flag, int otyp, cred_t *cred_p) 2498{ 2499 int err = 0; 2500 int norew, count, last_state; 2501#if defined(__i386) || defined(__amd64) 2502 struct contig_mem *cp, *cp_temp; 2503#endif 2504 2505 GET_SOFT_STATE(dev); 2506 2507 /* 2508 * wait till all cmds in the pipeline have been completed 2509 */ 2510 mutex_enter(ST_MUTEX); 2511 2512 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 2513 "st_close(dev = 0x%lx, flag = %d, otyp = %d)\n", dev, flag, otyp); 2514 2515 st_wait_for_io(un); 2516 2517 /* turn off persistent errors on close, as we want close to succeed */ 2518 TURN_PE_OFF(un); 2519 2520 /* 2521 * set state to indicate that we are in process of closing 2522 */ 2523 last_state = un->un_laststate = un->un_state; 2524 un->un_state = ST_STATE_CLOSING; 2525 2526 /* 2527 * BSD behavior: 2528 * a close always causes a silent span to the next file if we've hit 2529 * an EOF (but not yet read across it). 2530 */ 2531 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 2532 "st_close1: fileno=%x, blkno=%lx, un_eof=%x\n", un->un_fileno, 2533 un->un_blkno, un->un_eof); 2534 2535 2536 if (BSD_BEHAVIOR && (un->un_eof == ST_EOF)) { 2537 if (un->un_fileno >= 0) { 2538 un->un_fileno++; 2539 un->un_blkno = 0; 2540 } 2541 un->un_eof = ST_NO_EOF; 2542 } 2543 2544 /* 2545 * rewinding? 2546 */ 2547 norew = (getminor(dev) & MT_NOREWIND); 2548 2549 /* 2550 * SVR4 behavior for skipping to next file: 2551 * 2552 * If we have not seen a filemark, space to the next file 2553 * 2554 * If we have already seen the filemark we are physically in the next 2555 * file and we only increment the filenumber 2556 */ 2557 2558 if (norew && SVR4_BEHAVIOR && (flag & FREAD) && (un->un_blkno != 0) && 2559 (un->un_lastop != ST_OP_WRITE)) { 2560 switch (un->un_eof) { 2561 case ST_NO_EOF: 2562 /* 2563 * if we were reading and did not read the complete file 2564 * skip to the next file, leaving the tape correctly 2565 * positioned to read the first record of the next file 2566 * Check first for REEL if we are at EOT by trying to 2567 * read a block 2568 */ 2569 if ((un->un_dp->options & ST_REEL) && 2570 (!(un->un_dp->options & ST_READ_IGNORE_EOFS)) && 2571 (un->un_blkno == 0)) { 2572 if (st_cmd(dev, SCMD_SPACE, Blk(1), SYNC_CMD)) { 2573 ST_DEBUG2(ST_DEVINFO, st_label, 2574 SCSI_DEBUG, 2575 "st_close : EIO can't space\n"); 2576 err = EIO; 2577 break; 2578 } 2579 if (un->un_eof >= ST_EOF_PENDING) { 2580 un->un_eof = ST_EOT_PENDING; 2581 un->un_fileno += 1; 2582 un->un_blkno = 0; 2583 break; 2584 } 2585 } 2586 if (st_cmd(dev, SCMD_SPACE, Fmk(1), SYNC_CMD)) { 2587 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 2588 "st_close: EIO can't space #2\n"); 2589 err = EIO; 2590 } else { 2591 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 2592 "st_close2: fileno=%x,blkno=%lx," 2593 "un_eof=%x\n", 2594 un->un_fileno, un->un_blkno, un->un_eof); 2595 un->un_eof = ST_NO_EOF; 2596 } 2597 break; 2598 2599 case ST_EOF_PENDING: 2600 case ST_EOF: 2601 un->un_fileno += 1; 2602 un->un_blkno = 0; 2603 un->un_eof = ST_NO_EOF; 2604 break; 2605 2606 case ST_EOT: 2607 case ST_EOT_PENDING: 2608 /* nothing to do */ 2609 break; 2610 default: 2611 scsi_log(ST_DEVINFO, st_label, CE_PANIC, 2612 "Undefined state 0x%x", un->un_eof); 2613 2614 } 2615 } 2616 2617 2618 /* 2619 * For performance reasons (HP 88780), the driver should 2620 * postpone writing the second tape mark until just before a file 2621 * positioning ioctl is issued (e.g., rewind). This means that 2622 * the user must not manually rewind the tape because the tape will 2623 * be missing the second tape mark which marks EOM. 2624 * However, this small performance improvement is not worth the risk. 2625 */ 2626 2627 /* 2628 * We need to back up over the filemark we inadvertently popped 2629 * over doing a read in between the two filemarks that constitute 2630 * logical eot for 1/2" tapes. Note that ST_EOT_PENDING is only 2631 * set while reading. 2632 * 2633 * If we happen to be at physical eot (ST_EOM) (writing case), 2634 * the writing of filemark(s) will clear the ST_EOM state, which 2635 * we don't want, so we save this state and restore it later. 2636 */ 2637 2638 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 2639 "flag=%x, fmneeded=%x, lastop=%x, eof=%x\n", 2640 flag, un->un_fmneeded, un->un_lastop, un->un_eof); 2641 2642 if (un->un_eof == ST_EOT_PENDING) { 2643 if (norew) { 2644 if (st_cmd(dev, SCMD_SPACE, Fmk((-1)), SYNC_CMD)) { 2645 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 2646 "st_close: EIO can't space #3\n"); 2647 err = EIO; 2648 } else { 2649 un->un_blkno = 0; 2650 un->un_eof = ST_EOT; 2651 } 2652 } else { 2653 un->un_eof = ST_NO_EOF; 2654 } 2655 2656 /* 2657 * Do we need to write a file mark? 2658 * 2659 * only write filemarks if there are fmks to be written and 2660 * - open for write (possibly read/write) 2661 * - the last operation was a write 2662 * or: 2663 * - opened for wronly 2664 * - no data was written 2665 */ 2666 } else if ((un->un_fileno >= 0) && (un->un_fmneeded > 0) && 2667 (((flag & FWRITE) && (un->un_lastop == ST_OP_WRITE)) || 2668 ((flag & FWRITE) && (un->un_lastop == ST_OP_WEOF)) || 2669 ((flag == FWRITE) && (un->un_lastop == ST_OP_NIL)))) { 2670 2671 /* save ST_EOM state */ 2672 int was_at_eom = (un->un_eof == ST_EOM) ? 1 : 0; 2673 2674 /* 2675 * Note that we will write a filemark if we had opened 2676 * the tape write only and no data was written, thus 2677 * creating a null file. 2678 * 2679 * If the user already wrote one, we only have to write 1 more. 2680 * If they wrote two, we don't have to write any. 2681 */ 2682 2683 count = un->un_fmneeded; 2684 if (count > 0) { 2685 if (st_cmd(dev, SCMD_WRITE_FILE_MARK, 2686 count, SYNC_CMD)) { 2687 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 2688 "st_close : EIO can't wfm\n"); 2689 err = EIO; 2690 } 2691 if ((un->un_dp->options & ST_REEL) && norew) { 2692 if (st_cmd(dev, SCMD_SPACE, Fmk((-1)), 2693 SYNC_CMD)) { 2694 ST_DEBUG2(ST_DEVINFO, st_label, 2695 SCSI_DEBUG, 2696 "st_close : EIO space fmk(-1)\n"); 2697 err = EIO; 2698 } 2699 un->un_eof = ST_NO_EOF; 2700 /* fix up block number */ 2701 un->un_blkno = 0; 2702 } 2703 } 2704 2705 /* 2706 * If we aren't going to be rewinding, and we were at 2707 * physical eot, restore the state that indicates we 2708 * are at physical eot. Once you have reached physical 2709 * eot, and you close the tape, the only thing you can 2710 * do on the next open is to rewind. Access to trailer 2711 * records is only allowed without closing the device. 2712 */ 2713 if (norew == 0 && was_at_eom) 2714 un->un_eof = ST_EOM; 2715 } 2716 2717 /* 2718 * report soft errors if enabled and available, if we never accessed 2719 * the drive, don't get errors. This will prevent some DAT error 2720 * messages upon LOG SENSE. 2721 */ 2722 if (st_report_soft_errors_on_close && 2723 (un->un_dp->options & ST_SOFT_ERROR_REPORTING) && 2724 (last_state != ST_STATE_OFFLINE)) { 2725 (void) st_report_soft_errors(dev, flag); 2726 } 2727 2728 2729 /* 2730 * Do we need to rewind? Can we rewind? 2731 */ 2732 if (norew == 0 && un->un_fileno >= 0 && err == 0) { 2733 /* 2734 * We'd like to rewind with the 2735 * 'immediate' bit set, but this 2736 * causes problems on some drives 2737 * where subsequent opens get a 2738 * 'NOT READY' error condition 2739 * back while the tape is rewinding, 2740 * which is impossible to distinguish 2741 * from the condition of 'no tape loaded'. 2742 * 2743 * Also, for some targets, if you disconnect 2744 * with the 'immediate' bit set, you don't 2745 * actually return right away, i.e., the 2746 * target ignores your request for immediate 2747 * return. 2748 * 2749 * Instead, we'll fire off an async rewind 2750 * command. We'll mark the device as closed, 2751 * and any subsequent open will stall on 2752 * the first TEST_UNIT_READY until the rewind 2753 * completes. 2754 */ 2755 2756 /* 2757 * Used to be if reserve was not supported we'd send an 2758 * asynchronious rewind. Comments above may be slightly invalid 2759 * as the immediate bit was never set. Doing an immedate rewind 2760 * makes sense, I think fixes to not ready status might handle 2761 * the problems described above. 2762 */ 2763 if (un->un_sd->sd_inq->inq_ansi < 2) { 2764 (void) st_cmd(dev, SCMD_REWIND, 0, SYNC_CMD); 2765 } else { 2766 (void) st_cmd(dev, SCMD_REWIND, 0, ASYNC_CMD); 2767 } 2768 } 2769 2770 /* 2771 * eject tape if necessary 2772 */ 2773 if (un->un_eject_tape_on_failure) { 2774 un->un_eject_tape_on_failure = 0; 2775 if (st_cmd(dev, SCMD_LOAD, 0, SYNC_CMD)) { 2776 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 2777 "st_close : can't unload tape\n"); 2778 } else { 2779 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 2780 "st_close : tape unloaded \n"); 2781 un->un_eof = ST_NO_EOF; 2782 un->un_mediastate = MTIO_EJECTED; 2783 } 2784 } 2785 /* 2786 * Release the tape unit, if default reserve/release 2787 * behaviour. 2788 */ 2789 if ((un->un_rsvd_status & 2790 (ST_RESERVE | ST_PRESERVE_RESERVE)) == ST_RESERVE) { 2791 (void) st_reserve_release(un, ST_RELEASE); 2792 } 2793 2794 /* 2795 * clear up state 2796 */ 2797 un->un_laststate = un->un_state; 2798 un->un_state = ST_STATE_CLOSED; 2799 un->un_lastop = ST_OP_NIL; 2800 un->un_throttle = 1; /* assume one request at time, for now */ 2801 un->un_retry_ct = 0; 2802 un->un_tran_retry_ct = 0; 2803 un->un_errno = 0; 2804 un->un_swr_token = (opaque_t)NULL; 2805 un->un_rsvd_status &= ~(ST_INIT_RESERVE); 2806 2807 /* Restore the options to the init time settings */ 2808 if (un->un_init_options & ST_READ_IGNORE_ILI) { 2809 un->un_dp->options |= ST_READ_IGNORE_ILI; 2810 } else { 2811 un->un_dp->options &= ~ST_READ_IGNORE_ILI; 2812 } 2813 2814 if (un->un_init_options & ST_READ_IGNORE_EOFS) { 2815 un->un_dp->options |= ST_READ_IGNORE_EOFS; 2816 } else { 2817 un->un_dp->options &= ~ST_READ_IGNORE_EOFS; 2818 } 2819 2820 if (un->un_init_options & ST_SHORT_FILEMARKS) { 2821 un->un_dp->options |= ST_SHORT_FILEMARKS; 2822 } else { 2823 un->un_dp->options &= ~ST_SHORT_FILEMARKS; 2824 } 2825 2826 ASSERT(mutex_owned(ST_MUTEX)); 2827 2828 /* 2829 * Signal anyone awaiting a close operation to complete. 2830 */ 2831 cv_signal(&un->un_clscv); 2832 2833 /* 2834 * any kind of error on closing causes all state to be tossed 2835 */ 2836 if (err && un->un_status != KEY_ILLEGAL_REQUEST) { 2837 un->un_density_known = 0; 2838 /* 2839 * note that st_intr has already set un_fileno to -1 2840 */ 2841 } 2842 2843#if defined(__i386) || defined(__amd64) 2844 /* 2845 * free any contiguous mem alloc'ed for big block I/O 2846 */ 2847 cp = un->un_contig_mem; 2848 while (cp) { 2849 if (cp->cm_addr) { 2850 ddi_dma_mem_free(&cp->cm_acc_hdl); 2851 } 2852 cp_temp = cp; 2853 cp = cp->cm_next; 2854 kmem_free(cp_temp, 2855 sizeof (struct contig_mem) + biosize()); 2856 } 2857 un->un_contig_mem_total_num = 0; 2858 un->un_contig_mem_available_num = 0; 2859 un->un_contig_mem = NULL; 2860 un->un_max_contig_mem_len = 0; 2861#endif 2862 2863 ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG, 2864 "st_close3: return val = %x, fileno=%x, blkno=%lx, un_eof=%x\n", 2865 err, un->un_fileno, un->un_blkno, un->un_eof); 2866 2867 mutex_exit(ST_MUTEX); 2868 return (err); 2869} 2870 2871/* 2872 * These routines perform raw i/o operations. 2873 */ 2874 2875/* ARGSUSED2 */ 2876static int 2877st_aread(dev_t dev, struct aio_req *aio, cred_t *cred_p) 2878{ 2879 return (st_arw(dev, aio, B_READ)); 2880} 2881 2882 2883/* ARGSUSED2 */ 2884static int 2885st_awrite(dev_t dev, struct aio_req *aio, cred_t *cred_p) 2886{ 2887 return (st_arw(dev, aio, B_WRITE)); 2888} 2889 2890 2891 2892/* ARGSUSED */ 2893static int 2894st_read(dev_t dev, struct uio *uiop, cred_t *cred_p) 2895{ 2896 return (st_rw(dev, uiop, B_READ)); 2897} 2898 2899/* ARGSUSED */ 2900static int 2901st_write(dev_t dev, struct uio *uiop, cred_t *cred_p) 2902{ 2903 return (st_rw(dev, uiop, B_WRITE)); 2904} 2905 2906/* 2907 * Due to historical reasons, old limits are: For variable-length devices: 2908 * if greater than 64KB - 1 (ST_MAXRECSIZE_VARIABLE), block into 64 KB - 2 2909 * ST_MAXRECSIZE_VARIABLE_LIMIT) requests; otherwise, 2910 * (let it through unmodified. For fixed-length record devices: 2911 * 63K (ST_MAXRECSIZE_FIXED) is max (default minphys). 2912 * 2913 * The new limits used are un_maxdma (retrieved using scsi_ifgetcap() 2914 * from the HBA) and un_maxbsize (retrieved by sending SCMD_READ_BLKLIM 2915 * command to the drive). 2916 * 2917 */ 2918static void 2919st_minphys(struct buf *bp) 2920{ 2921 struct scsi_tape *un; 2922 2923 un = ddi_get_soft_state(st_state, MTUNIT(bp->b_edev)); 2924 2925 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 2926 "st_minphys(bp = 0x%p): b_bcount = 0x%lx\n", (void *)bp, 2927 bp->b_bcount); 2928 2929 if (un->un_allow_large_xfer) { 2930 2931 /* 2932 * check un_maxbsize for variable length devices only 2933 */ 2934 if (un->un_bsize == 0 && bp->b_bcount > un->un_maxbsize) { 2935 bp->b_bcount = un->un_maxbsize; 2936 } 2937 /* 2938 * can't go more that HBA maxdma limit in either fixed-length 2939 * or variable-length tape drives. 2940 */ 2941 if (bp->b_bcount > un->un_maxdma) { 2942 bp->b_bcount = un->un_maxdma; 2943 } 2944 } else { 2945 2946 /* 2947 * use old fixed limits 2948 */ 2949 if (un->un_bsize == 0) { 2950 if (bp->b_bcount > ST_MAXRECSIZE_VARIABLE) { 2951 bp->b_bcount = ST_MAXRECSIZE_VARIABLE_LIMIT; 2952 } 2953 } else { 2954 if (bp->b_bcount > ST_MAXRECSIZE_FIXED) { 2955 bp->b_bcount = ST_MAXRECSIZE_FIXED; 2956 } 2957 } 2958 } 2959 2960 /* 2961 * For regular raw I/O and Fixed Block length devices, make sure 2962 * the adjusted block count is a whole multiple of the device 2963 * block size. 2964 */ 2965 if (bp != un->un_sbufp && un->un_bsize) { 2966 bp->b_bcount -= (bp->b_bcount % un->un_bsize); 2967 } 2968} 2969 2970/*ARGSUSED*/ 2971static void 2972st_uscsi_minphys(struct buf *bp) 2973{ 2974 /* 2975 * do not break up because the CDB count would then be 2976 * incorrect and create spurious data underrun errors. 2977 */ 2978} 2979 2980static int 2981st_rw(dev_t dev, struct uio *uio, int flag) 2982{ 2983 int rval = 0; 2984 long len; 2985 2986 GET_SOFT_STATE(dev); 2987 2988 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 2989 "st_rw(dev = 0x%lx, flag = %s)\n", dev, 2990 (flag == B_READ ? rd_str: wr_str)); 2991 2992 /* get local copy of transfer length */ 2993 len = uio->uio_iov->iov_len; 2994 2995 mutex_enter(ST_MUTEX); 2996 2997 /* 2998 * If in fixed block size mode and requested read or write 2999 * is not an even multiple of that block size. 3000 */ 3001 if ((un->un_bsize != 0) && (len % un->un_bsize != 0)) { 3002 scsi_log(ST_DEVINFO, st_label, CE_WARN, 3003 "%s: not modulo %d block size\n", 3004 (flag == B_WRITE) ? wr_str : rd_str, un->un_bsize); 3005 rval = EINVAL; 3006 } 3007 3008 /* If device has set granularity in the READ_BLKLIM we honor it. */ 3009 if ((un->un_data_mod != 0) && (len % un->un_data_mod != 0)) { 3010 scsi_log(ST_DEVINFO, st_label, CE_WARN, 3011 "%s: not modulo %d device granularity\n", 3012 (flag == B_WRITE) ? wr_str : rd_str, un->un_data_mod); 3013 rval = EINVAL; 3014 } 3015 3016 if (rval != 0) { 3017 un->un_errno = rval; 3018 mutex_exit(ST_MUTEX); 3019 return (rval); 3020 } 3021 3022 un->un_silent_skip = 0; 3023 mutex_exit(ST_MUTEX); 3024 3025 len = uio->uio_resid; 3026 3027 rval = physio(st_strategy, (struct buf *)NULL, 3028 dev, flag, st_minphys, uio); 3029 /* 3030 * if we have hit logical EOT during this xfer and there is not a 3031 * full residue, then set un_eof back to ST_EOM to make sure that 3032 * the user will see at least one zero write 3033 * after this short write 3034 */ 3035 mutex_enter(ST_MUTEX); 3036 if (un->un_eof > ST_NO_EOF) { 3037 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 3038 "un_eof=%d resid=%lx\n", un->un_eof, uio->uio_resid); 3039 } 3040 if (un->un_eof >= ST_EOM && (flag == B_WRITE)) { 3041 if ((uio->uio_resid != len) && (uio->uio_resid != 0)) { 3042 un->un_eof = ST_EOM; 3043 } else if (uio->uio_resid == len) { 3044 un->un_eof = ST_NO_EOF; 3045 } 3046 } 3047 3048 if (un->un_silent_skip && uio->uio_resid != len) { 3049 un->un_eof = ST_EOF; 3050 un->un_blkno = un->un_save_blkno; 3051 un->un_fileno--; 3052 } 3053 3054 un->un_errno = rval; 3055 3056 mutex_exit(ST_MUTEX); 3057 3058 return (rval); 3059} 3060 3061static int 3062st_arw(dev_t dev, struct aio_req *aio, int flag) 3063{ 3064 struct uio *uio = aio->aio_uio; 3065 int rval = 0; 3066 long len; 3067 3068 GET_SOFT_STATE(dev); 3069 3070 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 3071 "st_rw(dev = 0x%lx, flag = %s)\n", dev, 3072 (flag == B_READ ? rd_str: wr_str)); 3073 3074 /* get local copy of transfer length */ 3075 len = uio->uio_iov->iov_len; 3076 3077 mutex_enter(ST_MUTEX); 3078 3079 /* 3080 * If in fixed block size mode and requested read or write 3081 * is not an even multiple of that block size. 3082 */ 3083 if ((un->un_bsize != 0) && (len % un->un_bsize != 0)) { 3084 scsi_log(ST_DEVINFO, st_label, CE_WARN, 3085 "%s: not modulo %d block size\n", 3086 (flag == B_WRITE) ? wr_str : rd_str, un->un_bsize); 3087 rval = EINVAL; 3088 } 3089 3090 /* If device has set granularity in the READ_BLKLIM we honor it. */ 3091 if ((un->un_data_mod != 0) && (len % un->un_data_mod != 0)) { 3092 scsi_log(ST_DEVINFO, st_label, CE_WARN, 3093 "%s: not modulo %d device granularity\n", 3094 (flag == B_WRITE) ? wr_str : rd_str, un->un_data_mod); 3095 rval = EINVAL; 3096 } 3097 3098 if (rval != 0) { 3099 un->un_errno = rval; 3100 mutex_exit(ST_MUTEX); 3101 return (rval); 3102 } 3103 3104 mutex_exit(ST_MUTEX); 3105 3106 len = uio->uio_resid; 3107 3108 rval = aphysio(st_strategy, anocancel, dev, flag, st_minphys, aio); 3109 3110 /* 3111 * if we have hit logical EOT during this xfer and there is not a 3112 * full residue, then set un_eof back to ST_EOM to make sure that 3113 * the user will see at least one zero write 3114 * after this short write 3115 * 3116 * we keep this here just in case the application is not using 3117 * persistent errors 3118 */ 3119 mutex_enter(ST_MUTEX); 3120 if (un->un_eof > ST_NO_EOF) { 3121 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 3122 "un_eof=%d resid=%lx\n", un->un_eof, uio->uio_resid); 3123 } 3124 if (un->un_eof >= ST_EOM && (flag == B_WRITE)) { 3125 if ((uio->uio_resid != len) && (uio->uio_resid != 0)) { 3126 un->un_eof = ST_EOM; 3127 } else if (uio->uio_resid == len && !IS_PE_FLAG_SET(un)) { 3128 un->un_eof = ST_NO_EOF; 3129 } 3130 } 3131 un->un_errno = rval; 3132 mutex_exit(ST_MUTEX); 3133 3134 return (rval); 3135} 3136 3137 3138 3139static int 3140st_strategy(struct buf *bp) 3141{ 3142 struct scsi_tape *un; 3143 dev_t dev = bp->b_edev; 3144 3145 /* 3146 * validate arguments 3147 */ 3148 if ((un = ddi_get_soft_state(st_state, MTUNIT(bp->b_edev))) == NULL) { 3149 bp->b_resid = bp->b_bcount; 3150 mutex_enter(ST_MUTEX); 3151 st_bioerror(bp, ENXIO); 3152 mutex_exit(ST_MUTEX); 3153 goto error; 3154 } 3155 3156 mutex_enter(ST_MUTEX); 3157 3158 while (un->un_pwr_mgmt == ST_PWR_SUSPENDED) { 3159 cv_wait(&un->un_suspend_cv, ST_MUTEX); 3160 } 3161 3162 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 3163 "st_strategy(): bcount=0x%lx, fileno=%d, blkno=%lx, eof=%d\n", 3164 bp->b_bcount, un->un_fileno, un->un_blkno, un->un_eof); 3165 3166 /* 3167 * If persistent errors have been flagged, just nix this one. We wait 3168 * for any outstanding I/O's below, so we will be in order. 3169 */ 3170 if (IS_PE_FLAG_SET(un)) 3171 goto exit; 3172 3173 if (bp != un->un_sbufp) { 3174 char reading = bp->b_flags & B_READ; 3175 int wasopening = 0; 3176 3177 /* 3178 * If we haven't done/checked reservation on the tape unit 3179 * do it now. 3180 */ 3181 if ((un->un_rsvd_status & 3182 (ST_RESERVE | ST_APPLICATION_RESERVATIONS)) == 0) { 3183 if ((un->un_dp->options & ST_NO_RESERVE_RELEASE) == 0) { 3184 if (st_reserve_release(un, ST_RESERVE)) { 3185 st_bioerror(bp, un->un_errno); 3186 goto exit; 3187 } 3188 } else if (un->un_state == ST_STATE_OPEN_PENDING_IO) { 3189 /* 3190 * Enter here to restore position for possible 3191 * resets when the device was closed and opened 3192 * in O_NDELAY mode subsequently 3193 */ 3194 un->un_state = ST_STATE_INITIALIZING; 3195 (void) st_cmd(dev, SCMD_TEST_UNIT_READY, 3196 0, SYNC_CMD); 3197 un->un_state = ST_STATE_OPEN_PENDING_IO; 3198 } 3199 un->un_rsvd_status |= ST_INIT_RESERVE; 3200 } 3201 3202 /* 3203 * If we are offline, we have to initialize everything first. 3204 * This is to handle either when opened with O_NDELAY, or 3205 * we just got a new tape in the drive, after an offline. 3206 * We don't observe O_NDELAY past the open, 3207 * as it will not make sense for tapes. 3208 */ 3209 if (un->un_state == ST_STATE_OFFLINE || un->un_restore_pos) { 3210 /* reset state to avoid recursion */ 3211 un->un_state = ST_STATE_INITIALIZING; 3212 if (st_tape_init(dev)) { 3213 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 3214 "stioctl : OFFLINE init failure "); 3215 un->un_state = ST_STATE_OFFLINE; 3216 un->un_fileno = -1; 3217 goto b_done_err; 3218 } 3219 un->un_state = ST_STATE_OPEN_PENDING_IO; 3220 } 3221 /* 3222 * Check for legal operations 3223 */ 3224 if (un->un_fileno < 0) { 3225 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 3226 "strategy with un->un_fileno < 0\n"); 3227 goto b_done_err; 3228 } 3229 3230 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 3231 "st_strategy(): regular io\n"); 3232 3233 /* 3234 * Process this first. If we were reading, and we're pending 3235 * logical eot, that means we've bumped one file mark too far. 3236 */ 3237 3238 /* 3239 * Recursion warning: st_cmd will route back through here. 3240 */ 3241 if (un->un_eof == ST_EOT_PENDING) { 3242 if (st_cmd(dev, SCMD_SPACE, Fmk((-1)), SYNC_CMD)) { 3243 un->un_fileno = -1; 3244 un->un_density_known = 0; 3245 goto b_done_err; 3246 } 3247 un->un_blkno = 0; /* fix up block number.. */ 3248 un->un_eof = ST_EOT; 3249 } 3250 3251 /* 3252 * If we are in the process of opening, we may have to 3253 * determine/set the correct density. We also may have 3254 * to do a test_append (if QIC) to see whether we are 3255 * in a position to append to the end of the tape. 3256 * 3257 * If we're already at logical eot, we transition 3258 * to ST_NO_EOF. If we're at physical eot, we punt 3259 * to the switch statement below to handle. 3260 */ 3261 if ((un->un_state == ST_STATE_OPEN_PENDING_IO) || 3262 (un->un_test_append && (un->un_dp->options & ST_QIC))) { 3263 3264 if (un->un_state == ST_STATE_OPEN_PENDING_IO) { 3265 if (st_determine_density(dev, (int)reading)) { 3266 goto b_done_err; 3267 } 3268 } 3269 3270 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 3271 "pending_io@fileno %d rw %d qic %d eof %d\n", 3272 un->un_fileno, (int)reading, 3273 (un->un_dp->options & ST_QIC) ? 1 : 0, 3274 un->un_eof); 3275 3276 if (!reading && un->un_eof != ST_EOM) { 3277 if (un->un_eof == ST_EOT) { 3278 un->un_eof = ST_NO_EOF; 3279 } else if (un->un_fileno > 0 && 3280 (un->un_dp->options & ST_QIC)) { 3281 /* 3282 * st_test_append() will do it all 3283 */ 3284 st_test_append(bp); 3285 goto done; 3286 } 3287 } 3288 if (un->un_state == ST_STATE_OPEN_PENDING_IO) { 3289 wasopening = 1; 3290 } 3291 un->un_laststate = un->un_state; 3292 un->un_state = ST_STATE_OPEN; 3293 } 3294 3295 3296 /* 3297 * Process rest of END OF FILE and END OF TAPE conditions 3298 */ 3299 3300 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 3301 "un_eof=%x, wasopening=%x\n", 3302 un->un_eof, wasopening); 3303 3304 switch (un->un_eof) { 3305 case ST_EOM: 3306 /* 3307 * This allows writes to proceed past physical 3308 * eot. We'll *really* be in trouble if the 3309 * user continues blindly writing data too 3310 * much past this point (unwind the tape). 3311 * Physical eot really means 'early warning 3312 * eot' in this context. 3313 * 3314 * Every other write from now on will succeed 3315 * (if sufficient tape left). 3316 * This write will return with resid == count 3317 * but the next one should be successful 3318 * 3319 * Note that we only transition to logical EOT 3320 * if the last state wasn't the OPENING state. 3321 * We explicitly prohibit running up to physical 3322 * eot, closing the device, and then re-opening 3323 * to proceed. Trailer records may only be gotten 3324 * at by keeping the tape open after hitting eot. 3325 * 3326 * Also note that ST_EOM cannot be set by reading- 3327 * this can only be set during writing. Reading 3328 * up to the end of the tape gets a blank check 3329 * or a double-filemark indication (ST_EOT_PENDING), 3330 * and we prohibit reading after that point. 3331 * 3332 */ 3333 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, "EOM\n"); 3334 if (wasopening == 0) { 3335 /* 3336 * this allows st_rw() to reset it back to 3337 * ST_EOM to make sure that the application 3338 * will see a zero write 3339 */ 3340 un->un_eof = ST_WRITE_AFTER_EOM; 3341 } 3342 un->un_status = SUN_KEY_EOT; 3343 goto b_done; 3344 3345 case ST_WRITE_AFTER_EOM: 3346 case ST_EOT: 3347 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, "EOT\n"); 3348 un->un_status = SUN_KEY_EOT; 3349 if (SVR4_BEHAVIOR && reading) { 3350 goto b_done_err; 3351 } 3352 3353 if (reading) { 3354 goto b_done; 3355 } 3356 un->un_eof = ST_NO_EOF; 3357 break; 3358 3359 case ST_EOF_PENDING: 3360 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 3361 "EOF PENDING\n"); 3362 un->un_status = SUN_KEY_EOF; 3363 if (SVR4_BEHAVIOR) { 3364 un->un_eof = ST_EOF; 3365 goto b_done; 3366 } 3367 /* FALLTHROUGH */ 3368 case ST_EOF: 3369 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, "EOF\n"); 3370 un->un_status = SUN_KEY_EOF; 3371 if (SVR4_BEHAVIOR) { 3372 goto b_done_err; 3373 } 3374 3375 if (BSD_BEHAVIOR) { 3376 un->un_eof = ST_NO_EOF; 3377 un->un_fileno += 1; 3378 un->un_blkno = 0; 3379 } 3380 3381 if (reading) { 3382 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 3383 "now file %d (read)\n", 3384 un->un_fileno); 3385 goto b_done; 3386 } 3387 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 3388 "now file %d (write)\n", un->un_fileno); 3389 break; 3390 default: 3391 un->un_status = 0; 3392 break; 3393 } 3394 } 3395 3396 bp->b_flags &= ~(B_DONE); 3397 st_bioerror(bp, 0); 3398 bp->av_forw = NULL; 3399 bp->b_resid = 0; 3400 SET_BP_PKT(bp, 0); 3401 3402 3403 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 3404 "st_strategy: cmd=0x%p count=%ld resid=%ld flags=0x%x" 3405 " pkt=0x%p\n", 3406 (void *)bp->b_forw, bp->b_bcount, 3407 bp->b_resid, bp->b_flags, (void *)BP_PKT(bp)); 3408 3409#if defined(__i386) || defined(__amd64) 3410 /* 3411 * We will replace bp with a new bp that can do big blk xfer 3412 * if the requested xfer size is bigger than ST_BIGBLK_XFER 3413 * 3414 * Also, we need to make sure that we're handling real I/O 3415 * by checking group 0/1 SCSI I/O commands, if needed 3416 */ 3417 if (bp->b_bcount > ST_BIGBLK_XFER && 3418 (bp != un->un_sbufp || 3419 (uchar_t)(uintptr_t)bp->b_forw == SCMD_READ || 3420 (uchar_t)(uintptr_t)bp->b_forw == SCMD_READ_G1 || 3421 (uchar_t)(uintptr_t)bp->b_forw == SCMD_WRITE || 3422 (uchar_t)(uintptr_t)bp->b_forw == SCMD_WRITE_G1)) { 3423 mutex_exit(ST_MUTEX); 3424 bp = st_get_bigblk_bp(bp); 3425 mutex_enter(ST_MUTEX); 3426 } 3427#endif 3428 3429 /* put on wait queue */ 3430 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 3431 "st_strategy: un->un_quef = 0x%p, bp = 0x%p\n", 3432 (void *)un->un_quef, (void *)bp); 3433 3434 if (un->un_quef) { 3435 un->un_quel->b_actf = bp; 3436 } else { 3437 un->un_quef = bp; 3438 } 3439 un->un_quel = bp; 3440 3441 ST_DO_KSTATS(bp, kstat_waitq_enter); 3442 3443 st_start(un); 3444 3445done: 3446 mutex_exit(ST_MUTEX); 3447 return (0); 3448 3449 3450error: 3451 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 3452 "st_strategy: error exit\n"); 3453 3454 biodone(bp); 3455 return (0); 3456 3457b_done_err: 3458 st_bioerror(bp, EIO); 3459 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 3460 "st_strategy : EIO b_done_err\n"); 3461 3462b_done: 3463 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 3464 "st_strategy: b_done\n"); 3465 3466exit: 3467 /* 3468 * make sure no commands are outstanding or waiting before closing, 3469 * so we can guarantee order 3470 */ 3471 st_wait_for_io(un); 3472 un->un_err_resid = bp->b_resid = bp->b_bcount; 3473 3474 /* override errno here, if persistent errors were flagged */ 3475 if (IS_PE_FLAG_SET(un)) 3476 bioerror(bp, un->un_errno); 3477 3478 mutex_exit(ST_MUTEX); 3479 3480 biodone(bp); 3481 ASSERT(mutex_owned(ST_MUTEX) == 0); 3482 return (0); 3483} 3484 3485 3486 3487/* 3488 * this routine spaces forward over filemarks 3489 */ 3490static int 3491st_space_fmks(dev_t dev, int count) 3492{ 3493 int rval = 0; 3494 3495 GET_SOFT_STATE(dev); 3496 3497 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 3498 "st_space_fmks(dev = 0x%lx, count = %d)\n", dev, count); 3499 3500 ASSERT(mutex_owned(ST_MUTEX)); 3501 3502 /* 3503 * the risk with doing only one space operation is that we 3504 * may accidentily jump in old data 3505 * the exabyte 8500 reading 8200 tapes cannot use KNOWS_EOD 3506 * because the 8200 does not append a marker; in order not to 3507 * sacrifice the fast file skip, we do a slow skip if the low 3508 * density device has been opened 3509 */ 3510 3511 if ((un->un_dp->options & ST_KNOWS_EOD) && 3512 !((un->un_dp->type == ST_TYPE_EXB8500 && MT_DENSITY(dev) == 0))) { 3513 if (st_cmd(dev, SCMD_SPACE, Fmk(count), SYNC_CMD)) { 3514 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 3515 "space_fmks : EIO can't do space cmd #1\n"); 3516 rval = EIO; 3517 } 3518 } else { 3519 while (count > 0) { 3520 if (st_cmd(dev, SCMD_SPACE, Fmk(1), SYNC_CMD)) { 3521 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 3522 "space_fmks : EIO can't do space cmd #2\n"); 3523 rval = EIO; 3524 break; 3525 } 3526 count -= 1; 3527 /* 3528 * read a block to see if we have reached 3529 * end of medium (double filemark for reel or 3530 * medium error for others) 3531 */ 3532 if (count > 0) { 3533 if (st_cmd(dev, SCMD_SPACE, Blk(1), 3534 SYNC_CMD)) { 3535 ST_DEBUG2(ST_DEVINFO, st_label, 3536 SCSI_DEBUG, 3537 "space_fmks : EIO can't do " 3538 "space cmd #3\n"); 3539 rval = EIO; 3540 break; 3541 } 3542 if ((un->un_eof >= ST_EOF_PENDING) && 3543 (un->un_dp->options & ST_REEL)) { 3544 un->un_status = SUN_KEY_EOT; 3545 ST_DEBUG2(ST_DEVINFO, st_label, 3546 SCSI_DEBUG, 3547 "space_fmks : EIO ST_REEL\n"); 3548 rval = EIO; 3549 break; 3550 } else if (IN_EOF(un)) { 3551 un->un_eof = ST_NO_EOF; 3552 un->un_fileno++; 3553 un->un_blkno = 0; 3554 count--; 3555 } else if (un->un_eof > ST_EOF) { 3556 ST_DEBUG2(ST_DEVINFO, st_label, 3557 SCSI_DEBUG, 3558 "space_fmks, EIO > ST_EOF\n"); 3559 rval = EIO; 3560 break; 3561 } 3562 3563 } 3564 } 3565 un->un_err_resid = count; 3566 un->un_err_fileno = un->un_fileno; 3567 un->un_err_blkno = un->un_blkno; 3568 } 3569 ASSERT(mutex_owned(ST_MUTEX)); 3570 return (rval); 3571} 3572 3573/* 3574 * this routine spaces to EOM 3575 * 3576 * it keeps track of the current filenumber and returns the filenumber after 3577 * the last successful space operation, we keep the number high because as 3578 * tapes are getting larger, the possibility of more and more files exist, 3579 * 0x100000 (1 Meg of files) probably will never have to be changed any time 3580 * soon 3581 */ 3582#define MAX_SKIP 0x100000 /* somewhat arbitrary */ 3583 3584static int 3585st_find_eom(dev_t dev) 3586{ 3587 int count, savefile; 3588 struct scsi_tape *un; 3589 int instance; 3590 3591 instance = MTUNIT(dev); 3592 if ((un = ddi_get_soft_state(st_state, instance)) == NULL) 3593 return (-1); 3594 3595 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 3596 "st_find_eom(dev = 0x%lx): fileno = %d\n", dev, un->un_fileno); 3597 3598 ASSERT(mutex_owned(ST_MUTEX)); 3599 3600 savefile = un->un_fileno; 3601 3602 /* 3603 * see if the drive is smart enough to do the skips in 3604 * one operation; 1/2" use two filemarks 3605 * the exabyte 8500 reading 8200 tapes cannot use KNOWS_EOD 3606 * because the 8200 does not append a marker; in order not to 3607 * sacrifice the fast file skip, we do a slow skip if the low 3608 * density device has been opened 3609 */ 3610 if ((un->un_dp->options & ST_KNOWS_EOD) && 3611 !((un->un_dp->type == ST_TYPE_EXB8500 && MT_DENSITY(dev) == 0))) { 3612 count = MAX_SKIP; 3613 } else { 3614 count = 1; 3615 } 3616 3617 while (st_cmd(dev, SCMD_SPACE, Fmk(count), SYNC_CMD) == 0) { 3618 3619 savefile = un->un_fileno; 3620 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 3621 "count=%x, eof=%x, status=%x\n", count, un->un_eof, 3622 un->un_status); 3623 3624 /* 3625 * If we're not EOM smart, space a record 3626 * to see whether we're now in the slot between 3627 * the two sequential filemarks that logical 3628 * EOM consists of (REEL) or hit nowhere land 3629 * (8mm). 3630 */ 3631 if (count == 1) { 3632 /* 3633 * no fast skipping, check a record 3634 */ 3635 if (st_cmd(dev, SCMD_SPACE, Blk((1)), SYNC_CMD)) 3636 break; 3637 else if ((un->un_eof >= ST_EOF_PENDING) && 3638 (un->un_dp->options & ST_REEL)) { 3639 un->un_status = KEY_BLANK_CHECK; 3640 un->un_fileno++; 3641 un->un_blkno = 0; 3642 break; 3643 } else if (IN_EOF(un)) { 3644 un->un_eof = ST_NO_EOF; 3645 un->un_fileno++; 3646 un->un_blkno = 0; 3647 } else if (un->un_eof > ST_EOF) { 3648 break; 3649 } 3650 } else { 3651 if (un->un_eof > ST_EOF) { 3652 break; 3653 } 3654 } 3655 } 3656 3657 if (un->un_dp->options & ST_KNOWS_EOD) { 3658 savefile = un->un_fileno; 3659 } 3660 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 3661 "st_find_eom: %x\n", savefile); 3662 ASSERT(mutex_owned(ST_MUTEX)); 3663 return (savefile); 3664} 3665 3666 3667/* 3668 * this routine is frequently used in ioctls below; 3669 * it determines whether we know the density and if not will 3670 * determine it 3671 * if we have written the tape before, one or more filemarks are written 3672 * 3673 * depending on the stepflag, the head is repositioned to where it was before 3674 * the filemarks were written in order not to confuse step counts 3675 */ 3676#define STEPBACK 0 3677#define NO_STEPBACK 1 3678 3679static int 3680st_check_density_or_wfm(dev_t dev, int wfm, int mode, int stepflag) 3681{ 3682 3683 GET_SOFT_STATE(dev); 3684 3685 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 3686 "st_check_density_or_wfm(dev= 0x%lx, wfm= %d, mode= %d, stpflg= %d)\n", 3687 dev, wfm, mode, stepflag); 3688 3689 ASSERT(mutex_owned(ST_MUTEX)); 3690 3691 /* 3692 * If we don't yet know the density of the tape we have inserted, 3693 * we have to either unconditionally set it (if we're 'writing'), 3694 * or we have to determine it. As side effects, check for any 3695 * write-protect errors, and for the need to put out any file-marks 3696 * before positioning a tape. 3697 * 3698 * If we are going to be spacing forward, and we haven't determined 3699 * the tape density yet, we have to do so now... 3700 */ 3701 if (un->un_state == ST_STATE_OPEN_PENDING_IO) { 3702 if (st_determine_density(dev, mode)) { 3703 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 3704 "check_density_or_wfm : EIO can't determine " 3705 "density\n"); 3706 un->un_errno = EIO; 3707 return (EIO); 3708 } 3709 /* 3710 * Presumably we are at BOT. If we attempt to write, it will 3711 * either work okay, or bomb. We don't do a st_test_append 3712 * unless we're past BOT. 3713 */ 3714 un->un_laststate = un->un_state; 3715 un->un_state = ST_STATE_OPEN; 3716 3717 } else if (un->un_fileno >= 0 && un->un_fmneeded > 0 && 3718 ((un->un_lastop == ST_OP_WEOF && wfm) || 3719 (un->un_lastop == ST_OP_WRITE && wfm))) { 3720 3721 daddr_t blkno = un->un_blkno; 3722 int fileno = un->un_fileno; 3723 3724 /* 3725 * We need to write one or two filemarks. 3726 * In the case of the HP, we need to 3727 * position the head between the two 3728 * marks. 3729 */ 3730 if ((un->un_fmneeded > 0) || (un->un_lastop == ST_OP_WEOF)) { 3731 wfm = un->un_fmneeded; 3732 un->un_fmneeded = 0; 3733 } 3734 3735 if (st_write_fm(dev, wfm)) { 3736 un->un_fileno = -1; 3737 un->un_density_known = 0; 3738 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 3739 "check_density_or_wfm : EIO can't write fm\n"); 3740 un->un_errno = EIO; 3741 return (EIO); 3742 } 3743 3744 if (stepflag == STEPBACK) { 3745 if (st_cmd(dev, SCMD_SPACE, Fmk((-wfm)), SYNC_CMD)) { 3746 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 3747 "check_density_or_wfm : EIO can't space " 3748 "(-wfm)\n"); 3749 un->un_errno = EIO; 3750 return (EIO); 3751 } 3752 un->un_blkno = blkno; 3753 un->un_fileno = fileno; 3754 } 3755 } 3756 3757 /* 3758 * Whatever we do at this point clears the state of the eof flag. 3759 */ 3760 3761 un->un_eof = ST_NO_EOF; 3762 3763 /* 3764 * If writing, let's check that we're positioned correctly 3765 * at the end of tape before issuing the next write. 3766 */ 3767 if (un->un_read_only == RDWR) { 3768 un->un_test_append = 1; 3769 } 3770 3771 ASSERT(mutex_owned(ST_MUTEX)); 3772 return (0); 3773} 3774 3775 3776/* 3777 * Wait for all outstaning I/O's to complete 3778 * 3779 * we wait on both ncmds and the wait queue for times when we are flushing 3780 * after persistent errors are flagged, which is when ncmds can be 0, and the 3781 * queue can still have I/O's. This way we preserve order of biodone's. 3782 */ 3783static void 3784st_wait_for_io(struct scsi_tape *un) 3785{ 3786 ASSERT(mutex_owned(ST_MUTEX)); 3787 while (un->un_ncmds || un->un_quef) { 3788 cv_wait(&un->un_queue_cv, ST_MUTEX); 3789 } 3790} 3791 3792/* 3793 * This routine implements the ioctl calls. It is called 3794 * from the device switch at normal priority. 3795 */ 3796/*ARGSUSED*/ 3797static int 3798st_ioctl(dev_t dev, int cmd, intptr_t arg, int flag, cred_t *cred_p, 3799 int *rval_p) 3800{ 3801 int tmp, rval = 0; 3802 3803 GET_SOFT_STATE(dev); 3804 3805 mutex_enter(ST_MUTEX); 3806 3807 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 3808 "st_ioctl(): fileno=%x, blkno=%lx, un_eof=%x, state = %d, " 3809 "pe_flag = %d\n", 3810 un->un_fileno, un->un_blkno, un->un_eof, un->un_state, 3811 IS_PE_FLAG_SET(un)); 3812 3813 /* 3814 * We don't want to block on these, so let them through 3815 * and we don't care about setting driver states here. 3816 */ 3817 if ((cmd == MTIOCGETDRIVETYPE) || 3818 (cmd == MTIOCGUARANTEEDORDER) || 3819 (cmd == MTIOCPERSISTENTSTATUS)) { 3820 goto check_commands; 3821 } 3822 3823 /* 3824 * wait for all outstanding commands to complete, or be dequeued. 3825 * And because ioctl's are synchronous commands, any return value 3826 * after this, will be in order 3827 */ 3828 st_wait_for_io(un); 3829 3830 /* 3831 * allow only a through clear errors and persistent status, and 3832 * status 3833 */ 3834 if (IS_PE_FLAG_SET(un)) { 3835 if ((cmd == MTIOCLRERR) || 3836 (cmd == MTIOCPERSISTENT) || 3837 (cmd == MTIOCGET) || 3838 (cmd == USCSIGETRQS)) { 3839 goto check_commands; 3840 } else { 3841 rval = un->un_errno; 3842 goto exit; 3843 } 3844 } 3845 3846 un->un_throttle = 1; /* > 1 will never happen here */ 3847 un->un_errno = 0; /* start clean from here */ 3848 3849 /* 3850 * first and foremost, handle any ST_EOT_PENDING cases. 3851 * That is, if a logical eot is pending notice, notice it. 3852 */ 3853 if (un->un_eof == ST_EOT_PENDING) { 3854 int resid = un->un_err_resid; 3855 uchar_t status = un->un_status; 3856 uchar_t lastop = un->un_lastop; 3857 3858 if (st_cmd(dev, SCMD_SPACE, Fmk((-1)), SYNC_CMD)) { 3859 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 3860 "stioctl : EIO can't space fmk(-1)\n"); 3861 rval = EIO; 3862 goto exit; 3863 } 3864 un->un_lastop = lastop; /* restore last operation */ 3865 if (status == SUN_KEY_EOF) { 3866 un->un_status = SUN_KEY_EOT; 3867 } else { 3868 un->un_status = status; 3869 } 3870 un->un_err_resid = resid; 3871 un->un_err_blkno = un->un_blkno = 0; /* fix up block number */ 3872 un->un_eof = ST_EOT; /* now we're at logical eot */ 3873 } 3874 3875 /* 3876 * now, handle the rest of the situations 3877 */ 3878check_commands: 3879 switch (cmd) { 3880 case MTIOCGET: 3881 { 3882#ifdef _MULTI_DATAMODEL 3883 /* 3884 * For use when a 32 bit app makes a call into a 3885 * 64 bit ioctl 3886 */ 3887 struct mtget32 mtg_local32; 3888 struct mtget32 *mtget_32 = &mtg_local32; 3889#endif /* _MULTI_DATAMODEL */ 3890 3891 /* Get tape status */ 3892 struct mtget mtg_local; 3893 struct mtget *mtget = &mtg_local; 3894 ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, 3895 "st_ioctl: MTIOCGET\n"); 3896 3897 bzero(mtget, sizeof (struct mtget)); 3898 mtget->mt_erreg = un->un_status; 3899 mtget->mt_resid = un->un_err_resid; 3900 mtget->mt_dsreg = un->un_retry_ct; 3901 mtget->mt_fileno = un->un_err_fileno; 3902 mtget->mt_blkno = un->un_err_blkno; 3903 mtget->mt_type = un->un_dp->type; 3904 mtget->mt_flags = MTF_SCSI | MTF_ASF; 3905 if (un->un_dp->options & ST_REEL) { 3906 mtget->mt_flags |= MTF_REEL; 3907 mtget->mt_bf = 20; 3908 } else { /* 1/4" cartridges */ 3909 switch (mtget->mt_type) { 3910 /* Emulex cartridge tape */ 3911 case MT_ISMT02: 3912 mtget->mt_bf = 40; 3913 break; 3914 default: 3915 mtget->mt_bf = 126; 3916 break; 3917 } 3918 } 3919 3920 /* 3921 * If large transfers are allowed and drive options 3922 * has no record size limit set. Calculate blocking 3923 * factor from the lesser of maxbsize and maxdma. 3924 */ 3925 if ((un->un_allow_large_xfer) && 3926 (un->un_dp->options & ST_NO_RECSIZE_LIMIT)) { 3927 mtget->mt_bf = min(un->un_maxbsize, 3928 un->un_maxdma) / SECSIZE; 3929 } 3930 3931 if (un->un_read_only == WORM || 3932 un->un_read_only == RDWORM) { 3933 mtget->mt_flags |= MTF_WORM_MEDIA; 3934 } 3935 3936 rval = st_check_clean_bit(dev); 3937 if (rval == -1) { 3938 rval = EIO; 3939 goto exit; 3940 } else { 3941 mtget->mt_flags |= (ushort_t)rval; 3942 rval = 0; 3943 } 3944 3945 un->un_status = 0; /* Reset status */ 3946 un->un_err_resid = 0; 3947 tmp = sizeof (struct mtget); 3948 3949#ifdef _MULTI_DATAMODEL 3950 3951 switch (ddi_model_convert_from(flag & FMODELS)) { 3952 case DDI_MODEL_ILP32: 3953 /* 3954 * Convert 64 bit back to 32 bit before doing 3955 * copyout. This is what the ILP32 app expects. 3956 */ 3957 mtget_32->mt_erreg = mtget->mt_erreg; 3958 mtget_32->mt_resid = mtget->mt_resid; 3959 mtget_32->mt_dsreg = mtget->mt_dsreg; 3960 mtget_32->mt_fileno = (daddr32_t)mtget->mt_fileno; 3961 mtget_32->mt_blkno = (daddr32_t)mtget->mt_blkno; 3962 mtget_32->mt_type = mtget->mt_type; 3963 mtget_32->mt_flags = mtget->mt_flags; 3964 mtget_32->mt_bf = mtget->mt_bf; 3965 3966 if (ddi_copyout(mtget_32, (void *)arg, 3967 sizeof (struct mtget32), flag)) { 3968 rval = EFAULT; 3969 } 3970 break; 3971 3972 case DDI_MODEL_NONE: 3973 if (ddi_copyout(mtget, (void *)arg, tmp, flag)) { 3974 rval = EFAULT; 3975 } 3976 break; 3977 } 3978#else /* ! _MULTI_DATAMODE */ 3979 if (ddi_copyout(mtget, (void *)arg, tmp, flag)) { 3980 rval = EFAULT; 3981 } 3982#endif /* _MULTI_DATAMODE */ 3983 3984 break; 3985 } 3986 case MTIOCSTATE: 3987 { 3988 /* 3989 * return when media presence matches state 3990 */ 3991 enum mtio_state state; 3992 3993 ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, 3994 "st_ioctl: MTIOCSTATE\n"); 3995 3996 if (ddi_copyin((void *)arg, &state, sizeof (int), flag)) 3997 rval = EFAULT; 3998 3999 mutex_exit(ST_MUTEX); 4000 4001 rval = st_check_media(dev, state); 4002 4003 mutex_enter(ST_MUTEX); 4004 4005 if (rval != 0) { 4006 break; 4007 } 4008 4009 if (ddi_copyout(&un->un_mediastate, (void *)arg, 4010 sizeof (int), flag)) 4011 rval = EFAULT; 4012 break; 4013 4014 } 4015 4016 case MTIOCGETDRIVETYPE: 4017 { 4018#ifdef _MULTI_DATAMODEL 4019 /* 4020 * For use when a 32 bit app makes a call into a 4021 * 64 bit ioctl 4022 */ 4023 struct mtdrivetype_request32 mtdtrq32; 4024#endif /* _MULTI_DATAMODEL */ 4025 4026 /* 4027 * return mtdrivetype 4028 */ 4029 struct mtdrivetype_request mtdtrq; 4030 struct mtdrivetype mtdrtyp; 4031 struct mtdrivetype *mtdt = &mtdrtyp; 4032 struct st_drivetype *stdt = un->un_dp; 4033 4034 ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, 4035 "st_ioctl: MTIOCGETDRIVETYPE\n"); 4036 4037#ifdef _MULTI_DATAMODEL 4038 switch (ddi_model_convert_from(flag & FMODELS)) { 4039 case DDI_MODEL_ILP32: 4040 { 4041 if (ddi_copyin((void *)arg, &mtdtrq32, 4042 sizeof (struct mtdrivetype_request32), flag)) { 4043 rval = EFAULT; 4044 break; 4045 } 4046 mtdtrq.size = mtdtrq32.size; 4047 mtdtrq.mtdtp = 4048 (struct mtdrivetype *)(uintptr_t)mtdtrq32.mtdtp; 4049 ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, 4050 "st_ioctl: size 0x%x\n", mtdtrq.size); 4051 break; 4052 } 4053 case DDI_MODEL_NONE: 4054 if (ddi_copyin((void *)arg, &mtdtrq, 4055 sizeof (struct mtdrivetype_request), flag)) { 4056 rval = EFAULT; 4057 break; 4058 } 4059 break; 4060 } 4061 4062#else /* ! _MULTI_DATAMODEL */ 4063 if (ddi_copyin((void *)arg, &mtdtrq, 4064 sizeof (struct mtdrivetype_request), flag)) { 4065 rval = EFAULT; 4066 break; 4067 } 4068#endif /* _MULTI_DATAMODEL */ 4069 4070 /* 4071 * if requested size is < 0 then return 4072 * error. 4073 */ 4074 if (mtdtrq.size < 0) { 4075 rval = EINVAL; 4076 break; 4077 } 4078 bzero(mtdt, sizeof (struct mtdrivetype)); 4079 (void) strncpy(mtdt->name, stdt->name, ST_NAMESIZE); 4080 (void) strncpy(mtdt->vid, stdt->vid, VIDPIDLEN - 1); 4081 mtdt->type = stdt->type; 4082 mtdt->bsize = stdt->bsize; 4083 mtdt->options = stdt->options; 4084 mtdt->max_rretries = stdt->max_rretries; 4085 mtdt->max_wretries = stdt->max_wretries; 4086 for (tmp = 0; tmp < NDENSITIES; tmp++) 4087 mtdt->densities[tmp] = stdt->densities[tmp]; 4088 mtdt->default_density = stdt->default_density; 4089 /* 4090 * Speed hasn't been used since the hayday of reel tape. 4091 * For all drives not setting the option ST_KNOWS_MEDIA 4092 * the speed member renamed to mediatype are zeros. 4093 * Those drives that have ST_KNOWS_MEDIA set use the 4094 * new mediatype member which is used to figure the 4095 * type of media loaded. 4096 * 4097 * So as to not break applications speed in the 4098 * mtdrivetype structure is not renamed. 4099 */ 4100 for (tmp = 0; tmp < NDENSITIES; tmp++) { 4101 mtdt->speeds[tmp] = stdt->mediatype[tmp]; 4102 } 4103 mtdt->non_motion_timeout = stdt->non_motion_timeout; 4104 mtdt->io_timeout = stdt->io_timeout; 4105 mtdt->rewind_timeout = stdt->rewind_timeout; 4106 mtdt->space_timeout = stdt->space_timeout; 4107 mtdt->load_timeout = stdt->load_timeout; 4108 mtdt->unload_timeout = stdt->unload_timeout; 4109 mtdt->erase_timeout = stdt->erase_timeout; 4110 4111 /* 4112 * Limit the maximum length of the result to 4113 * sizeof (struct mtdrivetype). 4114 */ 4115 tmp = sizeof (struct mtdrivetype); 4116 if (mtdtrq.size < tmp) 4117 tmp = mtdtrq.size; 4118 if (ddi_copyout(mtdt, mtdtrq.mtdtp, tmp, flag)) { 4119 rval = EFAULT; 4120 } 4121 break; 4122 } 4123 case MTIOCPERSISTENT: 4124 { 4125 int persistence = 0; 4126 4127 if (ddi_copyin((void *)arg, &persistence, 4128 sizeof (int), flag)) { 4129 rval = EFAULT; 4130 break; 4131 } 4132 4133 /* non zero sets it, only 0 turns it off */ 4134 un->un_persistence = (uchar_t)persistence ? 1 : 0; 4135 4136 if (un->un_persistence) 4137 TURN_PE_ON(un); 4138 else 4139 TURN_PE_OFF(un); 4140 4141 ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, 4142 "st_ioctl: MTIOCPERSISTENT : persistence = %d\n", 4143 un->un_persistence); 4144 4145 break; 4146 } 4147 case MTIOCPERSISTENTSTATUS: 4148 { 4149 int persistence = (int)un->un_persistence; 4150 4151 if (ddi_copyout(&persistence, (void *)arg, 4152 sizeof (int), flag)) { 4153 rval = EFAULT; 4154 } 4155 ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, 4156 "st_ioctl: MTIOCPERSISTENTSTATUS:persistece = %d\n", 4157 un->un_persistence); 4158 4159 break; 4160 } 4161 4162 4163 case MTIOCLRERR: 4164 { 4165 /* clear persistent errors */ 4166 4167 ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, 4168 "st_ioctl: MTIOCLRERR\n"); 4169 4170 CLEAR_PE(un); 4171 4172 break; 4173 } 4174 4175 case MTIOCGUARANTEEDORDER: 4176 { 4177 /* 4178 * this is just a holder to make a valid ioctl and 4179 * it won't be in any earlier release 4180 */ 4181 ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, 4182 "st_ioctl: MTIOCGUARANTEEDORDER\n"); 4183 4184 break; 4185 } 4186 4187 case MTIOCRESERVE: 4188 { 4189 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 4190 "st_ioctl: MTIOCRESERVE\n"); 4191 4192 /* 4193 * Check if Reserve/Release is supported. 4194 */ 4195 if (un->un_dp->options & ST_NO_RESERVE_RELEASE) { 4196 rval = ENOTTY; 4197 break; 4198 } 4199 4200 rval = st_reserve_release(un, ST_RESERVE); 4201 4202 if (rval == 0) { 4203 un->un_rsvd_status |= ST_PRESERVE_RESERVE; 4204 } 4205 break; 4206 } 4207 4208 case MTIOCRELEASE: 4209 { 4210 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 4211 "st_ioctl: MTIOCRELEASE\n"); 4212 4213 /* 4214 * Check if Reserve/Release is supported. 4215 */ 4216 if (un->un_dp->options & ST_NO_RESERVE_RELEASE) { 4217 rval = ENOTTY; 4218 break; 4219 } 4220 4221 /* 4222 * Used to just clear ST_PRESERVE_RESERVE which 4223 * made the reservation release at next close. 4224 * As the user may have opened and then done a 4225 * persistant reservation we now need to drop 4226 * the reservation without closing if the user 4227 * attempts to do this. 4228 */ 4229 rval = st_reserve_release(un, ST_RELEASE); 4230 4231 un->un_rsvd_status &= ~ST_PRESERVE_RESERVE; 4232 4233 break; 4234 } 4235 4236 case MTIOCFORCERESERVE: 4237 { 4238 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 4239 "st_ioctl: MTIOCFORCERESERVE\n"); 4240 4241 /* 4242 * Check if Reserve/Release is supported. 4243 */ 4244 if (un->un_dp->options & ST_NO_RESERVE_RELEASE) { 4245 rval = ENOTTY; 4246 break; 4247 } 4248 /* 4249 * allow only super user to run this. 4250 */ 4251 if (drv_priv(cred_p) != 0) { 4252 rval = EPERM; 4253 break; 4254 } 4255 /* 4256 * Throw away reserve, 4257 * not using test-unit-ready 4258 * since reserve can succeed without tape being 4259 * present in the drive. 4260 */ 4261 (void) st_reserve_release(un, ST_RESERVE); 4262 4263 rval = st_take_ownership(dev); 4264 4265 break; 4266 } 4267 case USCSIGETRQS: 4268 { 4269#ifdef _MULTI_DATAMODEL 4270 /* 4271 * For use when a 32 bit app makes a call into a 4272 * 64 bit ioctl 4273 */ 4274 struct uscsi_rqs32 urqs_32; 4275 struct uscsi_rqs32 *urqs_32_ptr = &urqs_32; 4276#endif /* _MULTI_DATAMODEL */ 4277 struct uscsi_rqs urqs; 4278 struct uscsi_rqs *urqs_ptr = &urqs; 4279 ushort_t len; 4280#ifdef _MULTI_DATAMODEL 4281 switch (ddi_model_convert_from(flag & FMODELS)) { 4282 case DDI_MODEL_ILP32: 4283 { 4284 if (ddi_copyin((void *)arg, urqs_32_ptr, 4285 sizeof (struct uscsi_rqs32), flag)) { 4286 rval = EFAULT; 4287 break; 4288 } 4289 urqs_ptr->rqs_buflen = urqs_32_ptr->rqs_buflen; 4290 urqs_ptr->rqs_bufaddr = 4291 (caddr_t)(uintptr_t)urqs_32_ptr->rqs_bufaddr; 4292 break; 4293 } 4294 case DDI_MODEL_NONE: 4295 if (ddi_copyin((void *)arg, urqs_ptr, 4296 sizeof (struct uscsi_rqs), flag)) { 4297 rval = EFAULT; 4298 break; 4299 } 4300 } 4301#else /* ! _MULTI_DATAMODEL */ 4302 if (ddi_copyin((void *)arg, urqs_ptr, sizeof (urqs), flag)) { 4303 rval = EFAULT; 4304 break; 4305 } 4306#endif /* _MULTI_DATAMODEL */ 4307 4308 urqs_ptr->rqs_flags = (int)un->un_rqs_state & 4309 (ST_RQS_OVR | ST_RQS_VALID); 4310 if (urqs_ptr->rqs_buflen <= SENSE_LENGTH) { 4311 len = urqs_ptr->rqs_buflen; 4312 urqs_ptr->rqs_resid = 0; 4313 } else { 4314 len = SENSE_LENGTH; 4315 urqs_ptr->rqs_resid = urqs_ptr->rqs_buflen 4316 - SENSE_LENGTH; 4317 } 4318 if (!(un->un_rqs_state & ST_RQS_VALID)) { 4319 urqs_ptr->rqs_resid = urqs_ptr->rqs_buflen; 4320 } 4321 un->un_rqs_state |= ST_RQS_READ; 4322 un->un_rqs_state &= ~(ST_RQS_OVR); 4323 4324#ifdef _MULTI_DATAMODEL 4325 switch (ddi_model_convert_from(flag & FMODELS)) { 4326 case DDI_MODEL_ILP32: 4327 urqs_32_ptr->rqs_flags = urqs_ptr->rqs_flags; 4328 urqs_32_ptr->rqs_resid = urqs_ptr->rqs_resid; 4329 if (ddi_copyout(&urqs_32, (void *)arg, 4330 sizeof (urqs_32), flag)) { 4331 rval = EFAULT; 4332 } 4333 break; 4334 case DDI_MODEL_NONE: 4335 if (ddi_copyout(&urqs, (void *)arg, sizeof (urqs), 4336 flag)) { 4337 rval = EFAULT; 4338 } 4339 break; 4340 } 4341 4342 if (un->un_rqs_state & ST_RQS_VALID) { 4343 if (ddi_copyout(un->un_uscsi_rqs_buf, 4344 urqs_ptr->rqs_bufaddr, len, flag)) { 4345 rval = EFAULT; 4346 } 4347 } 4348#else /* ! _MULTI_DATAMODEL */ 4349 if (ddi_copyout(&urqs, (void *)arg, sizeof (urqs), flag)) { 4350 rval = EFAULT; 4351 } 4352 if (un->un_rqs_state & ST_RQS_VALID) { 4353 if (ddi_copyout(un->un_uscsi_rqs_buf, 4354 urqs_ptr->rqs_bufaddr, len, flag)) { 4355 rval = EFAULT; 4356 } 4357 } 4358#endif /* _MULTI_DATAMODEL */ 4359 break; 4360 } 4361 4362 case USCSICMD: 4363 { 4364 cred_t *cr; 4365#ifdef _MULTI_DATAMODEL 4366 /* 4367 * For use when a 32 bit app makes a call into a 4368 * 64 bit ioctl 4369 */ 4370 struct uscsi_cmd32 ucmd_32; 4371 struct uscsi_cmd32 *ucmd_32_ptr = &ucmd_32; 4372#endif /* _MULTI_DATAMODEL */ 4373 4374 /* 4375 * Run a generic USCSI command 4376 */ 4377 struct uscsi_cmd ucmd; 4378 struct uscsi_cmd *ucmd_ptr = &ucmd; 4379 enum uio_seg uioseg; 4380 4381 ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, 4382 "st_ioctl: USCSICMD\n"); 4383 4384 cr = ddi_get_cred(); 4385 if ((drv_priv(cred_p) != 0) && (drv_priv(cr) != 0)) { 4386 rval = EPERM; 4387 break; 4388 } 4389 4390#ifdef _MULTI_DATAMODEL 4391 switch (ddi_model_convert_from(flag & FMODELS)) { 4392 case DDI_MODEL_ILP32: 4393 { 4394 if (ddi_copyin((void *)arg, ucmd_32_ptr, 4395 sizeof (struct uscsi_cmd32), flag)) { 4396 rval = EFAULT; 4397 break; 4398 } 4399 uscsi_cmd32touscsi_cmd(ucmd_32_ptr, ucmd_ptr); 4400 break; 4401 } 4402 case DDI_MODEL_NONE: 4403 if (ddi_copyin((void *)arg, ucmd_ptr, sizeof (ucmd), 4404 flag)) { 4405 rval = EFAULT; 4406 break; 4407 } 4408 } 4409 4410#else /* ! _MULTI_DATAMODEL */ 4411 if (ddi_copyin((void *)arg, ucmd_ptr, sizeof (ucmd), flag)) { 4412 rval = EFAULT; 4413 break; 4414 } 4415#endif /* _MULTI_DATAMODEL */ 4416 4417 4418 /* 4419 * although st_ioctl_cmd() never makes use of these 4420 * now, we are just being safe and consistent 4421 */ 4422 ucmd.uscsi_flags &= ~(USCSI_NOINTR | USCSI_NOPARITY | 4423 USCSI_OTAG | USCSI_HTAG | USCSI_HEAD); 4424 4425 4426 uioseg = (flag & FKIOCTL) ? UIO_SYSSPACE : UIO_USERSPACE; 4427 4428 rval = st_ioctl_cmd(dev, &ucmd, uioseg, uioseg, uioseg); 4429 4430 4431#ifdef _MULTI_DATAMODEL 4432 switch (ddi_model_convert_from(flag & FMODELS)) { 4433 case DDI_MODEL_ILP32: 4434 /* 4435 * Convert 64 bit back to 32 bit before doing 4436 * copyout. This is what the ILP32 app expects. 4437 */ 4438 uscsi_cmdtouscsi_cmd32(ucmd_ptr, ucmd_32_ptr); 4439 4440 if (ddi_copyout(&ucmd_32, (void *)arg, 4441 sizeof (ucmd_32), flag)) { 4442 if (rval != 0) 4443 rval = EFAULT; 4444 } 4445 break; 4446 4447 case DDI_MODEL_NONE: 4448 if (ddi_copyout(&ucmd, (void *)arg, 4449 sizeof (ucmd), flag)) { 4450 if (rval != 0) 4451 rval = EFAULT; 4452 } 4453 break; 4454 } 4455#else /* ! _MULTI_DATAMODEL */ 4456 if (ddi_copyout(&ucmd, (void *)arg, sizeof (ucmd), flag)) { 4457 if (rval != 0) 4458 rval = EFAULT; 4459 } 4460#endif /* _MULTI_DATAMODEL */ 4461 4462 break; 4463 } 4464 4465 case MTIOCTOP: 4466 ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, 4467 "st_ioctl: MTIOCTOP\n"); 4468 rval = st_mtioctop(un, arg, flag); 4469 break; 4470 4471 case MTIOCREADIGNOREILI: 4472 { 4473 int set_ili; 4474 4475 if (ddi_copyin((void *)arg, &set_ili, 4476 sizeof (set_ili), flag)) { 4477 rval = EFAULT; 4478 break; 4479 } 4480 4481 if (un->un_bsize) { 4482 rval = ENOTTY; 4483 break; 4484 } 4485 4486 switch (set_ili) { 4487 case 0: 4488 un->un_dp->options &= ~ST_READ_IGNORE_ILI; 4489 break; 4490 4491 case 1: 4492 un->un_dp->options |= ST_READ_IGNORE_ILI; 4493 break; 4494 4495 default: 4496 rval = EINVAL; 4497 break; 4498 } 4499 break; 4500 } 4501 4502 case MTIOCREADIGNOREEOFS: 4503 { 4504 int ignore_eof; 4505 4506 if (ddi_copyin((void *)arg, &ignore_eof, 4507 sizeof (ignore_eof), flag)) { 4508 rval = EFAULT; 4509 break; 4510 } 4511 4512 if (!(un->un_dp->options & ST_REEL)) { 4513 rval = ENOTTY; 4514 break; 4515 } 4516 4517 switch (ignore_eof) { 4518 case 0: 4519 un->un_dp->options &= ~ST_READ_IGNORE_EOFS; 4520 break; 4521 4522 case 1: 4523 un->un_dp->options |= ST_READ_IGNORE_EOFS; 4524 break; 4525 4526 default: 4527 rval = EINVAL; 4528 break; 4529 } 4530 break; 4531 } 4532 4533 case MTIOCSHORTFMK: 4534 { 4535 int short_fmk; 4536 4537 if (ddi_copyin((void *)arg, &short_fmk, 4538 sizeof (short_fmk), flag)) { 4539 rval = EFAULT; 4540 break; 4541 } 4542 4543 switch (un->un_dp->type) { 4544 case ST_TYPE_EXB8500: 4545 case ST_TYPE_EXABYTE: 4546 if (!short_fmk) { 4547 un->un_dp->options &= 4548 ~ST_SHORT_FILEMARKS; 4549 } else if (short_fmk == 1) { 4550 un->un_dp->options |= 4551 ST_SHORT_FILEMARKS; 4552 } else { 4553 rval = EINVAL; 4554 } 4555 break; 4556 4557 default: 4558 rval = ENOTTY; 4559 break; 4560 } 4561 break; 4562 } 4563 4564 default: 4565 ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, 4566 "st_ioctl: unknown ioctl\n"); 4567 rval = ENOTTY; 4568 } 4569 4570exit: 4571 if (!IS_PE_FLAG_SET(un)) 4572 un->un_errno = rval; 4573 4574 mutex_exit(ST_MUTEX); 4575 4576 return (rval); 4577} 4578 4579 4580/* 4581 * do some MTIOCTOP tape operations 4582 */ 4583static int 4584st_mtioctop(struct scsi_tape *un, intptr_t arg, int flag) 4585{ 4586 struct mtop *mtop, local; 4587 int savefile, tmp, rval = 0; 4588 dev_t dev = un->un_dev; 4589#ifdef _MULTI_DATAMODEL 4590 /* 4591 * For use when a 32 bit app makes a call into a 4592 * 64 bit ioctl 4593 */ 4594 struct mtop32 mtop_32_for_64; 4595#endif /* _MULTI_DATAMODEL */ 4596 4597 4598 ASSERT(mutex_owned(ST_MUTEX)); 4599 4600 mtop = &local; 4601#ifdef _MULTI_DATAMODEL 4602 switch (ddi_model_convert_from(flag & FMODELS)) { 4603 case DDI_MODEL_ILP32: 4604 { 4605 if (ddi_copyin((void *)arg, &mtop_32_for_64, 4606 sizeof (struct mtop32), flag)) { 4607 return (EFAULT); 4608 } 4609 mtop->mt_op = mtop_32_for_64.mt_op; 4610 mtop->mt_count = (daddr_t)mtop_32_for_64.mt_count; 4611 break; 4612 } 4613 case DDI_MODEL_NONE: 4614 if (ddi_copyin((void *)arg, mtop, 4615 sizeof (struct mtop), flag)) { 4616 return (EFAULT); 4617 } 4618 break; 4619 } 4620 4621#else /* ! _MULTI_DATAMODEL */ 4622 if (ddi_copyin((void *)arg, mtop, sizeof (struct mtop), flag)) { 4623 return (EFAULT); 4624 } 4625#endif /* _MULTI_DATAMODEL */ 4626 4627 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 4628 "st_mtioctop(): mt_op=%x\n", mtop->mt_op); 4629 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 4630 "fileno=%x, blkno=%lx, un_eof=%x\n", un->un_fileno, un->un_blkno, 4631 un->un_eof); 4632 4633 rval = 0; 4634 un->un_status = 0; 4635 4636 /* 4637 * if we are going to mess with a tape, we have to make sure we have 4638 * one and are not offline (i.e. no tape is initialized). We let 4639 * commands pass here that don't actually touch the tape, except for 4640 * loading and initialization (rewinding). 4641 */ 4642 if (un->un_state == ST_STATE_OFFLINE) { 4643 switch (mtop->mt_op) { 4644 case MTLOAD: 4645 case MTNOP: 4646 /* 4647 * We don't want strategy calling st_tape_init here, 4648 * so, change state 4649 */ 4650 un->un_state = ST_STATE_INITIALIZING; 4651 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 4652 "st_mtioctop : OFFLINE state = %d\n", 4653 un->un_state); 4654 break; 4655 default: 4656 /* 4657 * reinitialize by normal means 4658 */ 4659 rval = st_tape_init(dev); 4660 if (rval) { 4661 un->un_state = ST_STATE_INITIALIZING; 4662 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 4663 "st_mtioctop : OFFLINE init failure "); 4664 un->un_state = ST_STATE_OFFLINE; 4665 un->un_fileno = -1; 4666 if (rval != EACCES) { 4667 rval = EIO; 4668 } 4669 return (rval); 4670 } 4671 un->un_state = ST_STATE_OPEN_PENDING_IO; 4672 break; 4673 } 4674 } 4675 4676 /* 4677 * If the file position is invalid, allow only those 4678 * commands that properly position the tape and fail 4679 * the rest with EIO 4680 */ 4681 if (un->un_fileno < 0) { 4682 switch (mtop->mt_op) { 4683 case MTWEOF: 4684 case MTRETEN: 4685 case MTERASE: 4686 case MTEOM: 4687 case MTFSF: 4688 case MTFSR: 4689 case MTBSF: 4690 case MTNBSF: 4691 case MTBSR: 4692 case MTSRSZ: 4693 case MTGRSZ: 4694 return (EIO); 4695 /* NOTREACHED */ 4696 case MTREW: 4697 case MTLOAD: 4698 case MTOFFL: 4699 case MTNOP: 4700 break; 4701 4702 default: 4703 return (ENOTTY); 4704 /* NOTREACHED */ 4705 } 4706 } 4707 4708 switch (mtop->mt_op) { 4709 case MTERASE: 4710 /* 4711 * MTERASE rewinds the tape, erase it completely, and returns 4712 * to the beginning of the tape 4713 */ 4714 if (un->un_mspl->wp || un->un_read_only & WORM) { 4715 un->un_status = KEY_WRITE_PROTECT; 4716 un->un_err_resid = mtop->mt_count; 4717 un->un_err_fileno = un->un_fileno; 4718 un->un_err_blkno = un->un_blkno; 4719 return (EACCES); 4720 } 4721 if (un->un_dp->options & ST_REEL) { 4722 un->un_fmneeded = 2; 4723 } else { 4724 un->un_fmneeded = 1; 4725 } 4726 if (st_check_density_or_wfm(dev, 1, B_WRITE, NO_STEPBACK) || 4727 st_cmd(dev, SCMD_REWIND, 0, SYNC_CMD) || 4728 st_cmd(dev, SCMD_ERASE, 0, SYNC_CMD)) { 4729 un->un_fileno = -1; 4730 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 4731 "st_mtioctop : EIO space or erase or check den)\n"); 4732 rval = EIO; 4733 } else { 4734 /* QIC and helical scan rewind after erase */ 4735 if (un->un_dp->options & ST_REEL) { 4736 (void) st_cmd(dev, SCMD_REWIND, 0, ASYNC_CMD); 4737 } 4738 } 4739 break; 4740 4741 case MTWEOF: 4742 /* 4743 * write an end-of-file record 4744 */ 4745 if (un->un_mspl->wp || un->un_read_only & RDONLY) { 4746 un->un_status = KEY_WRITE_PROTECT; 4747 un->un_err_resid = mtop->mt_count; 4748 un->un_err_fileno = un->un_fileno; 4749 un->un_err_blkno = un->un_blkno; 4750 return (EACCES); 4751 } 4752 4753 /* 4754 * zero count means just flush buffers 4755 * negative count is not permitted 4756 */ 4757 if (mtop->mt_count < 0) 4758 return (EINVAL); 4759 4760 /* Not on worm */ 4761 if (un->un_read_only == RDWR) { 4762 un->un_test_append = 1; 4763 } 4764 4765 if (un->un_state == ST_STATE_OPEN_PENDING_IO) { 4766 if (st_determine_density(dev, B_WRITE)) { 4767 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 4768 "st_mtioctop : EIO : MTWEOF can't determine" 4769 "density"); 4770 return (EIO); 4771 } 4772 } 4773 4774 rval = st_write_fm(dev, (int)mtop->mt_count); 4775 if ((rval != 0) && (rval != EACCES)) { 4776 /* 4777 * Failure due to something other than illegal 4778 * request results in loss of state (st_intr). 4779 */ 4780 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 4781 "st_mtioctop : EIO : MTWEOF can't write file mark"); 4782 rval = EIO; 4783 } 4784 break; 4785 4786 case MTRETEN: 4787 /* 4788 * retension the tape 4789 */ 4790 if (st_check_density_or_wfm(dev, 1, 0, NO_STEPBACK) || 4791 st_cmd(dev, SCMD_LOAD, 3, SYNC_CMD)) { 4792 un->un_fileno = -1; 4793 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 4794 "st_mtioctop : EIO : MTRETEN "); 4795 rval = EIO; 4796 } 4797 break; 4798 4799 case MTREW: 4800 /* 4801 * rewind the tape 4802 */ 4803 if (st_check_density_or_wfm(dev, 1, 0, NO_STEPBACK)) { 4804 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 4805 "st_mtioctop : EIO:MTREW check density/wfm failed"); 4806 return (EIO); 4807 } 4808 if (st_cmd(dev, SCMD_REWIND, 0, SYNC_CMD)) { 4809 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 4810 "st_mtioctop : EIO : MTREW "); 4811 rval = EIO; 4812 } 4813 break; 4814 4815 case MTOFFL: 4816 /* 4817 * rewinds, and, if appropriate, takes the device offline by 4818 * unloading the tape 4819 */ 4820 if (st_check_density_or_wfm(dev, 1, 0, NO_STEPBACK)) { 4821 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 4822 "st_mtioctop :EIO:MTOFFL check density/wfm failed"); 4823 return (EIO); 4824 } 4825 (void) st_cmd(dev, SCMD_REWIND, 0, SYNC_CMD); 4826 if (st_cmd(dev, SCMD_LOAD, 0, SYNC_CMD)) { 4827 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 4828 "st_mtioctop : EIO : MTOFFL"); 4829 return (EIO); 4830 } 4831 un->un_eof = ST_NO_EOF; 4832 un->un_laststate = un->un_state; 4833 un->un_state = ST_STATE_OFFLINE; 4834 un->un_mediastate = MTIO_EJECTED; 4835 break; 4836 4837 case MTLOAD: 4838 /* 4839 * This is to load a tape into the drive 4840 * Note that if the tape is not loaded, the device will have 4841 * to be opened via O_NDELAY or O_NONBLOCK. 4842 */ 4843 /* 4844 * Let's try and clean things up, if we are not 4845 * initializing, and then send in the load command, no 4846 * matter what. 4847 * 4848 * load after a media change by the user. 4849 */ 4850 4851 if (un->un_state > ST_STATE_INITIALIZING) 4852 (void) st_check_density_or_wfm(dev, 1, 0, NO_STEPBACK); 4853 rval = st_cmd(dev, SCMD_LOAD, 1, SYNC_CMD); 4854 if (rval) { 4855 if (rval != EACCES) { 4856 rval = EIO; 4857 } 4858 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 4859 "st_mtioctop : %s : MTLOAD\n", 4860 rval == EACCES ? "EACCES" : "EIO"); 4861 /* 4862 * If load tape fails, who knows what happened... 4863 */ 4864 un->un_fileno = -1; 4865 break; 4866 } 4867 4868 /* 4869 * reset all counters appropriately using rewind, as if LOAD 4870 * succeeds, we are at BOT 4871 */ 4872 un->un_state = ST_STATE_INITIALIZING; 4873 4874 rval = st_tape_init(dev); 4875 if ((rval == EACCES) && (un->un_read_only & WORM)) { 4876 rval = 0; 4877 break; 4878 } 4879 4880 if (rval != 0) { 4881 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 4882 "st_mtioctop : EIO : MTLOAD calls st_tape_init\n"); 4883 rval = EIO; 4884 un->un_state = ST_STATE_OFFLINE; 4885 } 4886 4887 break; 4888 4889 case MTNOP: 4890 un->un_status = 0; /* Reset status */ 4891 un->un_err_resid = 0; 4892 break; 4893 4894 case MTEOM: 4895 /* 4896 * positions the tape at a location just after the last file 4897 * written on the tape. For cartridge and 8 mm, this after 4898 * the last file mark; for reel, this is inbetween the two 4899 * last 2 file marks 4900 */ 4901 if ((un->un_eof >= ST_EOT) || 4902 (un->un_lastop == ST_OP_WRITE) || 4903 (un->un_lastop == ST_OP_WEOF)) { 4904 /* 4905 * If the command wants to move to logical end 4906 * of media, and we're already there, we're done. 4907 * If we were at logical eot, we reset the state 4908 * to be *not* at logical eot. 4909 * 4910 * If we're at physical or logical eot, we prohibit 4911 * forward space operations (unconditionally). 4912 * 4913 * Also if the last operation was a write of any 4914 * kind the tape is at EOD. 4915 */ 4916 return (0); 4917 } 4918 /* 4919 * physical tape position may not be what we've been 4920 * telling the user; adjust the request accordingly 4921 */ 4922 if (IN_EOF(un)) { 4923 un->un_fileno++; 4924 un->un_blkno = 0; 4925 } 4926 4927 if (st_check_density_or_wfm(dev, 1, B_READ, NO_STEPBACK)) { 4928 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 4929 "st_mtioctop : EIO:MTEOM check density/wfm failed"); 4930 return (EIO); 4931 } 4932 4933 /* 4934 * st_find_eom() returns the last fileno we knew about; 4935 */ 4936 savefile = st_find_eom(dev); 4937 4938 if ((un->un_status != KEY_BLANK_CHECK) && 4939 (un->un_status != SUN_KEY_EOT)) { 4940 un->un_fileno = -1; 4941 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 4942 "st_mtioctop : EIO : MTEOM status check failed"); 4943 rval = EIO; 4944 } else { 4945 /* 4946 * For 1/2" reel tapes assume logical EOT marked 4947 * by two file marks or we don't care that we may 4948 * be extending the last file on the tape. 4949 */ 4950 if (un->un_dp->options & ST_REEL) { 4951 if (st_cmd(dev, SCMD_SPACE, Fmk((-1)), 4952 SYNC_CMD)) { 4953 un->un_fileno = -1; 4954 ST_DEBUG2(ST_DEVINFO, st_label, 4955 SCSI_DEBUG, 4956 "st_mtioctop : EIO : MTEOM space " 4957 "cmd failed"); 4958 rval = EIO; 4959 break; 4960 } 4961 /* 4962 * Fix up the block number. 4963 */ 4964 un->un_blkno = 0; 4965 un->un_err_blkno = 0; 4966 } 4967 un->un_err_resid = 0; 4968 un->un_fileno = savefile; 4969 un->un_eof = ST_EOT; 4970 } 4971 un->un_status = 0; 4972 break; 4973 4974 case MTFSF: 4975 ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, 4976 "fsf: count=%lx, eof=%x\n", mtop->mt_count, 4977 un->un_eof); 4978 /* 4979 * forward space over filemark 4980 * 4981 * For ASF we allow a count of 0 on fsf which means 4982 * we just want to go to beginning of current file. 4983 * Equivalent to "nbsf(0)" or "bsf(1) + fsf". 4984 * Allow stepping over double fmk with reel 4985 */ 4986 if ((un->un_eof >= ST_EOT) && (mtop->mt_count > 0) && 4987 ((un->un_dp->options & ST_REEL) == 0)) { 4988 /* we're at EOM */ 4989 un->un_err_resid = mtop->mt_count; 4990 un->un_status = KEY_BLANK_CHECK; 4991 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 4992 "st_mtioctop : EIO : MTFSF at EOM"); 4993 return (EIO); 4994 } 4995 4996 /* 4997 * physical tape position may not be what we've been 4998 * telling the user; adjust the request accordingly 4999 */ 5000 if (IN_EOF(un)) { 5001 un->un_fileno++; 5002 un->un_blkno = 0; 5003 /* 5004 * For positive direction case, we're now covered. 5005 * For zero or negative direction, we're covered 5006 * (almost) 5007 */ 5008 mtop->mt_count--; 5009 } 5010 5011 if (st_check_density_or_wfm(dev, 1, B_READ, STEPBACK)) { 5012 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 5013 "st_mtioctop : EIO : MTFSF density/wfm failed"); 5014 return (EIO); 5015 } 5016 5017 5018 /* 5019 * Forward space file marks. 5020 * We leave ourselves at block zero 5021 * of the target file number. 5022 */ 5023 if (mtop->mt_count < 0) { 5024 mtop->mt_count = -mtop->mt_count; 5025 mtop->mt_op = MTNBSF; 5026 goto bspace; 5027 } 5028fspace: 5029 ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, 5030 "fspace: count=%lx, eof=%x\n", mtop->mt_count, 5031 un->un_eof); 5032 if ((tmp = mtop->mt_count) == 0) { 5033 if (un->un_blkno == 0) { 5034 un->un_err_resid = 0; 5035 un->un_err_fileno = un->un_fileno; 5036 un->un_err_blkno = un->un_blkno; 5037 break; 5038 } else if (un->un_fileno == 0) { 5039 rval = st_cmd(dev, SCMD_REWIND, 0, SYNC_CMD); 5040 } else if (un->un_dp->options & ST_BSF) { 5041 rval = (st_cmd(dev, SCMD_SPACE, Fmk((-1)), 5042 SYNC_CMD) || 5043 st_cmd(dev, SCMD_SPACE, Fmk(1), SYNC_CMD)); 5044 } else { 5045 tmp = un->un_fileno; 5046 rval = (st_cmd(dev, SCMD_REWIND, 0, SYNC_CMD) || 5047 st_cmd(dev, SCMD_SPACE, (int)Fmk(tmp), 5048 SYNC_CMD)); 5049 } 5050 if (rval != 0) { 5051 un->un_fileno = -1; 5052 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 5053 "st_mtioctop : EIO : fspace fileno = -1"); 5054 5055 rval = EIO; 5056 } 5057 } else { 5058 rval = st_space_fmks(dev, tmp); 5059 } 5060 5061 if (mtop->mt_op == MTBSF && rval != EIO) { 5062 /* 5063 * we came here with a count < 0; we now need 5064 * to skip back to end up before the filemark 5065 */ 5066 mtop->mt_count = 1; 5067 goto bspace; 5068 } 5069 break; 5070 5071 5072 case MTFSR: 5073 ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, 5074 "fsr: count=%lx, eof=%x\n", mtop->mt_count, 5075 un->un_eof); 5076 /* 5077 * forward space to inter-record gap 5078 * 5079 */ 5080 if ((un->un_eof >= ST_EOT) && (mtop->mt_count > 0)) { 5081 /* we're at EOM */ 5082 un->un_err_resid = mtop->mt_count; 5083 un->un_status = KEY_BLANK_CHECK; 5084 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 5085 "st_mtioctop : EIO : MTFSR un_eof > ST_EOT"); 5086 return (EIO); 5087 } 5088 5089 if (mtop->mt_count == 0) { 5090 un->un_err_fileno = un->un_fileno; 5091 un->un_err_blkno = un->un_blkno; 5092 un->un_err_resid = 0; 5093 if (IN_EOF(un) && SVR4_BEHAVIOR) { 5094 un->un_status = SUN_KEY_EOF; 5095 } 5096 return (0); 5097 } 5098 5099 /* 5100 * physical tape position may not be what we've been 5101 * telling the user; adjust the position accordingly 5102 */ 5103 if (IN_EOF(un)) { 5104 daddr_t blkno = un->un_blkno; 5105 int fileno = un->un_fileno; 5106 uchar_t lastop = un->un_lastop; 5107 if (st_cmd(dev, SCMD_SPACE, Fmk((-1)), SYNC_CMD) 5108 == -1) { 5109 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 5110 "st_mtioctop : EIO :MTFSR count && IN_EOF"); 5111 return (EIO); 5112 } 5113 5114 un->un_blkno = blkno; 5115 un->un_fileno = fileno; 5116 un->un_lastop = lastop; 5117 } 5118 5119 if (st_check_density_or_wfm(dev, 1, B_READ, STEPBACK)) { 5120 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 5121 "st_mtioctop : EIO : MTFSR st_check_den"); 5122 return (EIO); 5123 } 5124 5125space_records: 5126 ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, 5127 "space_records: count=%lx, eof=%x\n", mtop->mt_count, 5128 un->un_eof); 5129 tmp = un->un_blkno + mtop->mt_count; 5130 if (tmp == un->un_blkno) { 5131 un->un_err_resid = 0; 5132 un->un_err_fileno = un->un_fileno; 5133 un->un_err_blkno = un->un_blkno; 5134 break; 5135 } else if (un->un_blkno < tmp || 5136 (un->un_dp->options & ST_BSR)) { 5137 /* 5138 * If we're spacing forward, or the device can 5139 * backspace records, we can just use the SPACE 5140 * command. 5141 */ 5142 tmp = tmp - un->un_blkno; 5143 if (st_cmd(dev, SCMD_SPACE, Blk(tmp), SYNC_CMD)) { 5144 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 5145 "st_mtioctop :EIO:space_records can't spc"); 5146 rval = EIO; 5147 } else if (un->un_eof >= ST_EOF_PENDING) { 5148 /* 5149 * check if we hit BOT/EOT 5150 */ 5151 if (tmp < 0 && un->un_eof == ST_EOM) { 5152 un->un_status = SUN_KEY_BOT; 5153 un->un_eof = ST_NO_EOF; 5154 } else if (tmp < 0 && un->un_eof == 5155 ST_EOF_PENDING) { 5156 int residue = un->un_err_resid; 5157 /* 5158 * we skipped over a filemark 5159 * and need to go forward again 5160 */ 5161 if (st_cmd(dev, SCMD_SPACE, Fmk(1), 5162 SYNC_CMD)) { 5163 ST_DEBUG2(ST_DEVINFO, 5164 st_label, SCSI_DEBUG, 5165 "st_mtioctop : EIO : " 5166 "space_records can't " 5167 "space #2"); 5168 rval = EIO; 5169 } 5170 un->un_err_resid = residue; 5171 } 5172 if (rval == 0) { 5173 ST_DEBUG2(ST_DEVINFO, st_label, 5174 SCSI_DEBUG, 5175 "st_mtioctop : EIO : space_rec rval" 5176 " == 0"); 5177 rval = EIO; 5178 } 5179 } 5180 } else { 5181 /* 5182 * else we rewind, space forward across filemarks to 5183 * the desired file, and then space records to the 5184 * desired block. 5185 */ 5186 5187 int t = un->un_fileno; /* save current file */ 5188 5189 if (tmp < 0) { 5190 /* 5191 * Wups - we're backing up over a filemark 5192 */ 5193 if (un->un_blkno != 0 && 5194 (st_cmd(dev, SCMD_REWIND, 0, SYNC_CMD) || 5195 st_cmd(dev, SCMD_SPACE, Fmk(t), SYNC_CMD))) 5196 un->un_fileno = -1; 5197 un->un_err_resid = -tmp; 5198 if (un->un_fileno == 0 && un->un_blkno == 0) { 5199 un->un_status = SUN_KEY_BOT; 5200 un->un_eof = ST_NO_EOF; 5201 } else if (un->un_fileno > 0) { 5202 un->un_status = SUN_KEY_EOF; 5203 un->un_eof = ST_NO_EOF; 5204 } 5205 un->un_err_fileno = un->un_fileno; 5206 un->un_err_blkno = un->un_blkno; 5207 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 5208 "st_mtioctop :EIO:space_records : tmp < 0"); 5209 rval = EIO; 5210 } else if (st_cmd(dev, SCMD_REWIND, 0, SYNC_CMD) || 5211 st_cmd(dev, SCMD_SPACE, Fmk(t), SYNC_CMD) || 5212 st_cmd(dev, SCMD_SPACE, Blk(tmp), 5213 SYNC_CMD)) { 5214 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 5215 "st_mtioctop : EIO :space_records : rewind " 5216 "and space failed"); 5217 un->un_fileno = -1; 5218 rval = EIO; 5219 } 5220 } 5221 break; 5222 5223 5224 case MTBSF: 5225 ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, 5226 "bsf: count=%lx, eof=%x\n", mtop->mt_count, 5227 un->un_eof); 5228 /* 5229 * backward space of file filemark (1/2" and 8mm) 5230 * tape position will end on the beginning of tape side 5231 * of the desired file mark 5232 */ 5233 if ((un->un_dp->options & ST_BSF) == 0) { 5234 return (ENOTTY); 5235 } 5236 5237 /* 5238 * If a negative count (which implies a forward space op) 5239 * is specified, and we're at logical or physical eot, 5240 * bounce the request. 5241 */ 5242 5243 if (un->un_eof >= ST_EOT && mtop->mt_count < 0) { 5244 un->un_err_resid = mtop->mt_count; 5245 un->un_status = SUN_KEY_EOT; 5246 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 5247 "st_ioctl : EIO : MTBSF : un_eof > ST_EOF"); 5248 return (EIO); 5249 } 5250 /* 5251 * physical tape position may not be what we've been 5252 * telling the user; adjust the request accordingly 5253 */ 5254 if (IN_EOF(un)) { 5255 un->un_fileno++; 5256 un->un_blkno = 0; 5257 mtop->mt_count++; 5258 ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, 5259 "bsf in eof: count=%ld, op=%x\n", 5260 mtop->mt_count, mtop->mt_op); 5261 5262 } 5263 5264 if (st_check_density_or_wfm(dev, 1, 0, STEPBACK)) { 5265 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 5266 "st_ioctl : EIO : MTBSF : check den wfm"); 5267 return (EIO); 5268 } 5269 5270 if (mtop->mt_count <= 0) { 5271 /* 5272 * for a negative count, we need to step forward 5273 * first and then step back again 5274 */ 5275 mtop->mt_count = -mtop->mt_count+1; 5276 goto fspace; 5277 } 5278 5279bspace: 5280 { 5281 int skip_cnt, end_at_eof; 5282 5283 ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, 5284 "bspace: count=%lx, eof=%x\n", mtop->mt_count, 5285 un->un_eof); 5286 /* 5287 * Backspace files (MTNBSF): 5288 * 5289 * For tapes that can backspace, backspace 5290 * count+1 filemarks and then run forward over 5291 * a filemark 5292 * 5293 * For tapes that can't backspace, 5294 * calculate desired filenumber 5295 * (un->un_fileno - count), rewind, 5296 * and then space forward this amount 5297 * 5298 * Backspace filemarks (MTBSF) 5299 * 5300 * For tapes that can backspace, backspace count 5301 * filemarks 5302 * 5303 * For tapes that can't backspace, calculate 5304 * desired filenumber (un->un_fileno - count), 5305 * add 1, rewind, space forward this amount, 5306 * and mark state as ST_EOF_PENDING appropriately. 5307 */ 5308 5309 if (mtop->mt_op == MTBSF) { 5310 end_at_eof = 1; 5311 } else { 5312 end_at_eof = 0; 5313 } 5314 5315 ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, 5316 "bspace: mt_op=%x, count=%lx, fileno=%x, blkno=%lx\n", 5317 mtop->mt_op, mtop->mt_count, un->un_fileno, un->un_blkno); 5318 5319 /* 5320 * Handle the simple case of BOT 5321 * playing a role in these cmds. 5322 * We do this by calculating the 5323 * ending file number. If the ending 5324 * file is < BOT, rewind and set an 5325 * error and mark resid appropriately. 5326 * If we're backspacing a file (not a 5327 * filemark) and the target file is 5328 * the first file on the tape, just 5329 * rewind. 5330 */ 5331 5332 tmp = un->un_fileno - mtop->mt_count; 5333 if ((end_at_eof && tmp < 0) || (end_at_eof == 0 && tmp <= 0)) { 5334 if (st_cmd(dev, SCMD_REWIND, 0, SYNC_CMD)) { 5335 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 5336 "st_ioctl : EIO : bspace : end_at_eof && " 5337 "tmp < 0"); 5338 rval = EIO; 5339 } 5340 if (tmp < 0) { 5341 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 5342 "st_ioctl : EIO : bspace : tmp < 0"); 5343 rval = EIO; 5344 un->un_err_resid = -tmp; 5345 un->un_status = SUN_KEY_BOT; 5346 } 5347 break; 5348 } 5349 5350 if (un->un_dp->options & ST_BSF) { 5351 skip_cnt = 1 - end_at_eof; 5352 /* 5353 * If we are going to end up at the beginning 5354 * of the file, we have to space one extra file 5355 * first, and then space forward later. 5356 */ 5357 tmp = -(mtop->mt_count + skip_cnt); 5358 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 5359 "skip_cnt=%x, tmp=%x\n", skip_cnt, tmp); 5360 if (st_cmd(dev, SCMD_SPACE, Fmk(tmp), SYNC_CMD)) { 5361 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 5362 "st_ioctl : EIO : bspace : can't space " 5363 "tmp"); 5364 rval = EIO; 5365 } 5366 } else { 5367 if (st_cmd(dev, SCMD_REWIND, 0, SYNC_CMD)) { 5368 rval = EIO; 5369 } else { 5370 skip_cnt = tmp + end_at_eof; 5371 } 5372 } 5373 5374 /* 5375 * If we have to space forward, do so... 5376 */ 5377 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 5378 "space forward skip_cnt=%x, rval=%x\n", skip_cnt, rval); 5379 if (rval == 0 && skip_cnt) { 5380 if (st_cmd(dev, SCMD_SPACE, Fmk(skip_cnt), SYNC_CMD)) { 5381 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 5382 "st_ioctl : EIO : bspace : can't space " 5383 "skip_cnt"); 5384 rval = EIO; 5385 } else if (end_at_eof) { 5386 /* 5387 * If we had to space forward, and we're 5388 * not a tape that can backspace, mark state 5389 * as if we'd just seen a filemark during a 5390 * a read. 5391 */ 5392 if ((un->un_dp->options & ST_BSF) == 0) { 5393 un->un_eof = ST_EOF_PENDING; 5394 un->un_fileno -= 1; 5395 un->un_blkno = INF; 5396 } 5397 } 5398 } 5399 5400 if (rval != 0) { 5401 un->un_fileno = -1; 5402 } 5403 break; 5404 } 5405 5406 case MTNBSF: 5407 ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, 5408 "nbsf: count=%lx, eof=%x\n", mtop->mt_count, 5409 un->un_eof); 5410 /* 5411 * backward space file to beginning of file 5412 * 5413 * If a negative count (which implies a forward space op) 5414 * is specified, and we're at logical or physical eot, 5415 * bounce the request. 5416 */ 5417 5418 if (un->un_eof >= ST_EOT && mtop->mt_count < 0) { 5419 un->un_err_resid = mtop->mt_count; 5420 un->un_status = SUN_KEY_EOT; 5421 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 5422 "st_ioctl : EIO : > EOT and count < 0"); 5423 return (EIO); 5424 } 5425 /* 5426 * physical tape position may not be what we've been 5427 * telling the user; adjust the request accordingly 5428 */ 5429 if (IN_EOF(un)) { 5430 un->un_fileno++; 5431 un->un_blkno = 0; 5432 mtop->mt_count++; 5433 } 5434 5435 if (st_check_density_or_wfm(dev, 1, 0, STEPBACK)) { 5436 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 5437 "st_ioctl : EIO : MTNBSF check den and wfm"); 5438 return (EIO); 5439 } 5440 5441mtnbsf: 5442 ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, 5443 "mtnbsf: count=%lx, eof=%x\n", mtop->mt_count, 5444 un->un_eof); 5445 if (mtop->mt_count <= 0) { 5446 mtop->mt_op = MTFSF; 5447 mtop->mt_count = -mtop->mt_count; 5448 goto fspace; 5449 } 5450 goto bspace; 5451 5452 case MTBSR: 5453 ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, 5454 "bsr: count=%lx, eof=%x\n", mtop->mt_count, 5455 un->un_eof); 5456 /* 5457 * backward space into inter-record gap 5458 * 5459 * If a negative count (which implies a forward space op) 5460 * is specified, and we're at logical or physical eot, 5461 * bounce the request. 5462 */ 5463 if (un->un_eof >= ST_EOT && mtop->mt_count < 0) { 5464 un->un_err_resid = mtop->mt_count; 5465 un->un_status = SUN_KEY_EOT; 5466 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 5467 "st_ioctl : EIO : MTBSR > EOT"); 5468 return (EIO); 5469 } 5470 5471 if (mtop->mt_count == 0) { 5472 un->un_err_fileno = un->un_fileno; 5473 un->un_err_blkno = un->un_blkno; 5474 un->un_err_resid = 0; 5475 if (IN_EOF(un) && SVR4_BEHAVIOR) { 5476 un->un_status = SUN_KEY_EOF; 5477 } 5478 return (0); 5479 } 5480 5481 /* 5482 * physical tape position may not be what we've been 5483 * telling the user; adjust the position accordingly. 5484 * bsr can not skip filemarks and continue to skip records 5485 * therefore if we are logically before the filemark but 5486 * physically at the EOT side of the filemark, we need to step 5487 * back; this allows fsr N where N > number of blocks in file 5488 * followed by bsr 1 to position at the beginning of last block 5489 */ 5490 if (IN_EOF(un)) { 5491 int blkno = un->un_blkno; 5492 int fileno = un->un_fileno; 5493 uchar_t lastop = un->un_lastop; 5494 if (st_cmd(dev, SCMD_SPACE, Fmk((-1)), SYNC_CMD) 5495 == -1) { 5496 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 5497 "st_write_fm : EIO : MTBSR can't space"); 5498 return (EIO); 5499 } 5500 5501 un->un_blkno = blkno; 5502 un->un_fileno = fileno; 5503 un->un_lastop = lastop; 5504 } 5505 5506 un->un_eof = ST_NO_EOF; 5507 5508 if (st_check_density_or_wfm(dev, 1, 0, STEPBACK)) { 5509 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 5510 "st_ioctl : EIO : MTBSR : can't set density or " 5511 "wfm"); 5512 return (EIO); 5513 } 5514 5515 mtop->mt_count = -mtop->mt_count; 5516 goto space_records; 5517 5518 case MTSRSZ: 5519 5520 /* 5521 * Set record-size to that sent by user 5522 * Check to see if there is reason that the requested 5523 * block size should not be set. 5524 */ 5525 5526 /* If requesting variable block size is it ok? */ 5527 if ((mtop->mt_count == 0) && 5528 ((un->un_dp->options & ST_VARIABLE) == 0)) { 5529 return (ENOTTY); 5530 } 5531 5532 /* 5533 * If requested block size is not variable "0", 5534 * is it less then minimum. 5535 */ 5536 if ((mtop->mt_count != 0) && 5537 (mtop->mt_count < un->un_minbsize)) { 5538 return (EINVAL); 5539 } 5540 5541 /* Is the requested block size more then maximum */ 5542 if ((mtop->mt_count > min(un->un_maxbsize, un->un_maxdma)) && 5543 (un->un_maxbsize != 0)) { 5544 return (EINVAL); 5545 } 5546 5547 /* Is requested block size a modulus the device likes */ 5548 if ((mtop->mt_count % un->un_data_mod) != 0) { 5549 return (EINVAL); 5550 } 5551 5552 if (st_change_block_size(dev, (uint32_t)mtop->mt_count) != 0) { 5553 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 5554 "st_ioctl : MTSRSZ : EIO : cant set block size"); 5555 return (EIO); 5556 } 5557 5558 return (0); 5559 5560 case MTGRSZ: 5561 { 5562#ifdef _MULTI_DATAMODEL 5563 /* 5564 * For use when a 32 bit app makes a call into a 5565 * 64 bit ioctl 5566 */ 5567 struct mtop32 mtop_32_for_64; 5568#endif /* _MULTI_DATAMODEL */ 5569 5570 5571 /* 5572 * Get record-size to the user 5573 */ 5574 mtop->mt_count = un->un_bsize; 5575 5576#ifdef _MULTI_DATAMODEL 5577 switch (ddi_model_convert_from(flag & FMODELS)) { 5578 case DDI_MODEL_ILP32: 5579 /* 5580 * Convert 64 bit back to 32 bit before doing 5581 * copyout. This is what the ILP32 app expects. 5582 */ 5583 mtop_32_for_64.mt_op = mtop->mt_op; 5584 mtop_32_for_64.mt_count = mtop->mt_count; 5585 5586 if (ddi_copyout(&mtop_32_for_64, (void *)arg, 5587 sizeof (struct mtop32), flag)) { 5588 return (EFAULT); 5589 } 5590 break; 5591 5592 case DDI_MODEL_NONE: 5593 if (ddi_copyout(mtop, (void *)arg, 5594 sizeof (struct mtop), flag)) { 5595 return (EFAULT); 5596 } 5597 break; 5598 } 5599#else /* ! _MULTI_DATAMODE */ 5600 if (ddi_copyout(mtop, (void *)arg, sizeof (struct mtop), flag)) 5601 return (EFAULT); 5602 5603#endif /* _MULTI_DATAMODE */ 5604 5605 return (0); 5606 } 5607 default: 5608 rval = ENOTTY; 5609 } 5610 5611 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 5612 "st_ioctl: fileno=%x, blkno=%lx, un_eof=%x\n", un->un_fileno, 5613 un->un_blkno, un->un_eof); 5614 5615 if (un->un_fileno < 0) { 5616 un->un_density_known = 0; 5617 } 5618 5619 ASSERT(mutex_owned(ST_MUTEX)); 5620 return (rval); 5621} 5622 5623 5624/* 5625 * Run a command for uscsi ioctl. 5626 * cdbspace is address space of cdb. 5627 * dataspace is address space of the uscsi data buffer. 5628 */ 5629static int 5630st_ioctl_cmd(dev_t dev, struct uscsi_cmd *ucmd, 5631 enum uio_seg cdbspace, enum uio_seg dataspace, 5632 enum uio_seg rqbufspace) 5633{ 5634 struct buf *bp; 5635 struct uscsi_cmd *kcmd; 5636 caddr_t kcdb; 5637 int flag; 5638 int err; 5639 int rqlen; 5640 int offline_state = 0; 5641 char *krqbuf = NULL; 5642 5643 GET_SOFT_STATE(dev); 5644 5645 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 5646 "st_ioctl_cmd(dev = 0x%lx)\n", dev); 5647 5648 ASSERT(mutex_owned(ST_MUTEX)); 5649 5650 /* 5651 * We really don't know what commands are coming in here and 5652 * we don't want to limit the commands coming in. 5653 * 5654 * If st_tape_init() gets called from st_strategy(), then we 5655 * will hang the process waiting for un->un_sbuf_busy to be cleared, 5656 * which it never will, as we set it below. To prevent 5657 * st_tape_init() from getting called, we have to set state to other 5658 * than ST_STATE_OFFLINE, so we choose ST_STATE_INITIALIZING, which 5659 * achieves this purpose already 5660 * 5661 * We use offline_state to preserve the OFFLINE state, if it exists, 5662 * so other entry points to the driver might have the chance to call 5663 * st_tape_init(). 5664 */ 5665 if (un->un_state == ST_STATE_OFFLINE) { 5666 un->un_laststate = ST_STATE_OFFLINE; 5667 un->un_state = ST_STATE_INITIALIZING; 5668 offline_state = 1; 5669 } 5670 /* 5671 * Is this a request to reset the bus? 5672 * If so, we need go no further. 5673 */ 5674 if (ucmd->uscsi_flags & (USCSI_RESET|USCSI_RESET_ALL)) { 5675 flag = ((ucmd->uscsi_flags & USCSI_RESET_ALL)) ? 5676 RESET_ALL : RESET_TARGET; 5677 5678 mutex_exit(ST_MUTEX); 5679 err = (scsi_reset(ROUTE, flag)) ? 0 : EIO; 5680 mutex_enter(ST_MUTEX); 5681 5682 ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, 5683 "reset %s %s\n", 5684 (flag == RESET_ALL) ? "all" : "target", 5685 (err == 0) ? "ok" : "failed"); 5686 /* 5687 * If scsi reset successful, don't write any filemarks. 5688 */ 5689 if (err == 0) { 5690 un->un_fmneeded = 0; 5691 } else { 5692 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 5693 "st_ioctl_cmd : EIO : scsi_reset failed"); 5694 } 5695 goto exit; 5696 } 5697 5698 /* 5699 * First do some sanity checks for USCSI commands. 5700 */ 5701 if ((ucmd->uscsi_cdblen <= 0) || 5702 (ucmd->uscsi_cdblen > un->un_max_cdb_sz)) { 5703 if (cdbspace != UIO_SYSSPACE) { 5704 scsi_log(ST_DEVINFO, st_label, SCSI_DEBUG, 5705 "USCSICMD with cdb larger then transport supports"); 5706 } 5707 return (EINVAL); 5708 } 5709 5710 /* 5711 * In order to not worry about where the uscsi structure 5712 * or cdb it points to came from, we kmem_alloc copies 5713 * of them here. This will allow reference to the data 5714 * they contain long after this process has gone to 5715 * sleep and its kernel stack has been unmapped, etc. 5716 */ 5717 5718 kcdb = kmem_alloc((size_t)ucmd->uscsi_cdblen, KM_SLEEP); 5719 if (cdbspace == UIO_SYSSPACE) { 5720 bcopy(ucmd->uscsi_cdb, kcdb, ucmd->uscsi_cdblen); 5721 } else { 5722 if (ddi_copyin(ucmd->uscsi_cdb, kcdb, 5723 (size_t)ucmd->uscsi_cdblen, 0)) { 5724 kmem_free(kcdb, (size_t)ucmd->uscsi_cdblen); 5725 err = EFAULT; 5726 goto exit; 5727 } 5728 } 5729 5730 /* 5731 * can't peek at the cdb till is copied into kernal space. 5732 */ 5733 if (scsi_cdb_size[CDB_GROUPID(kcdb[0])] > un->un_max_cdb_sz) { 5734 if (cdbspace != UIO_SYSSPACE) { 5735 scsi_log(ST_DEVINFO, st_label, SCSI_DEBUG, 5736 "USCSICMD with cdb larger then transport supports"); 5737 } 5738 kmem_free(kcdb, ucmd->uscsi_cdblen); 5739 return (EINVAL); 5740 } 5741 kcmd = kmem_alloc(sizeof (struct uscsi_cmd), KM_SLEEP); 5742 bcopy(ucmd, kcmd, sizeof (struct uscsi_cmd)); 5743 kcmd->uscsi_cdb = kcdb; 5744 5745 flag = (kcmd->uscsi_flags & USCSI_READ) ? B_READ : B_WRITE; 5746 5747 /* check to see if this command requires the drive to be reserved */ 5748 err = st_check_cdb_for_need_to_reserve(un, &kcdb[0]); 5749 5750 if (err) { 5751 goto exit_free; 5752 } 5753 5754 /* 5755 * Get buffer resources... 5756 */ 5757 while (un->un_sbuf_busy) 5758 cv_wait(&un->un_sbuf_cv, ST_MUTEX); 5759 un->un_sbuf_busy = 1; 5760 5761#ifdef STDEBUG 5762 if (st_debug > 6) { 5763 st_clean_print(ST_DEVINFO, st_label, SCSI_DEBUG, 5764 "uscsi cdb", kcdb, kcmd->uscsi_cdblen); 5765 if (kcmd->uscsi_buflen) { 5766 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 5767 "uscsi %s of %ld bytes %s %s space\n", 5768 (flag == B_READ) ? rd_str : wr_str, 5769 kcmd->uscsi_buflen, 5770 (flag == B_READ) ? "to" : "from", 5771 (dataspace == UIO_SYSSPACE) ? "system" : "user"); 5772 } 5773 } 5774#endif /* ST_DEBUG */ 5775 5776 /* 5777 * Initialize Request Sense buffering, if requested. 5778 * For user processes, allocate a kernel copy of the sense buffer 5779 */ 5780 if ((kcmd->uscsi_flags & USCSI_RQENABLE) && 5781 kcmd->uscsi_rqlen && kcmd->uscsi_rqbuf) { 5782 if (rqbufspace == UIO_USERSPACE) { 5783 krqbuf = kmem_alloc(SENSE_LENGTH, KM_SLEEP); 5784 } 5785 kcmd->uscsi_rqlen = SENSE_LENGTH; 5786 kcmd->uscsi_rqresid = SENSE_LENGTH; 5787 } else { 5788 kcmd->uscsi_rqlen = 0; 5789 kcmd->uscsi_rqresid = 0; 5790 } 5791 5792 un->un_srqbufp = krqbuf; 5793 bp = un->un_sbufp; 5794 bzero(bp, sizeof (buf_t)); 5795 5796 /* 5797 * Force asynchronous mode, if necessary. 5798 */ 5799 if (ucmd->uscsi_flags & USCSI_ASYNC) { 5800 mutex_exit(ST_MUTEX); 5801 if (scsi_ifgetcap(ROUTE, "synchronous", 1) == 1) { 5802 if (scsi_ifsetcap(ROUTE, "synchronous", 0, 1) == 1) { 5803 ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG, 5804 "forced async ok\n"); 5805 } else { 5806 ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG, 5807 "forced async failed\n"); 5808 err = EINVAL; 5809 mutex_enter(ST_MUTEX); 5810 goto done; 5811 } 5812 } 5813 mutex_enter(ST_MUTEX); 5814 } 5815 5816 /* 5817 * Re-enable synchronous mode, if requested 5818 */ 5819 if (ucmd->uscsi_flags & USCSI_SYNC) { 5820 mutex_exit(ST_MUTEX); 5821 if (scsi_ifgetcap(ROUTE, "synchronous", 1) == 0) { 5822 int i = scsi_ifsetcap(ROUTE, "synchronous", 1, 1); 5823 ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG, 5824 "re-enabled sync %s\n", 5825 (i == 1) ? "ok" : "failed"); 5826 } 5827 mutex_enter(ST_MUTEX); 5828 } 5829 5830 if (kcmd->uscsi_buflen) { 5831 /* 5832 * We're going to do actual I/O. 5833 * Set things up for physio. 5834 */ 5835 struct iovec aiov; 5836 struct uio auio; 5837 struct uio *uio = &auio; 5838 5839 bzero(&auio, sizeof (struct uio)); 5840 bzero(&aiov, sizeof (struct iovec)); 5841 aiov.iov_base = kcmd->uscsi_bufaddr; 5842 aiov.iov_len = kcmd->uscsi_buflen; 5843 5844 uio->uio_iov = &aiov; 5845 uio->uio_iovcnt = 1; 5846 uio->uio_resid = aiov.iov_len; 5847 uio->uio_segflg = dataspace; 5848 5849 /* 5850 * Let physio do the rest... 5851 */ 5852 bp->b_forw = (struct buf *)(uintptr_t)kcdb[0]; 5853 bp->b_back = (struct buf *)kcmd; 5854 5855 mutex_exit(ST_MUTEX); 5856 err = physio(st_strategy, bp, dev, flag, st_uscsi_minphys, uio); 5857 mutex_enter(ST_MUTEX); 5858 } else { 5859 /* 5860 * Mimic physio 5861 */ 5862 bp->b_forw = (struct buf *)(uintptr_t)kcdb[0]; 5863 bp->b_back = (struct buf *)kcmd; 5864 bp->b_flags = B_BUSY | flag; 5865 bp->b_edev = dev; 5866 bp->b_dev = cmpdev(dev); 5867 bp->b_bcount = 0; 5868 bp->b_blkno = 0; 5869 bp->b_resid = 0; 5870 mutex_exit(ST_MUTEX); 5871 (void) st_strategy(bp); 5872 5873 /* 5874 * BugTraq #4260046 5875 * ---------------- 5876 * See comments in st_cmd. 5877 */ 5878 5879 err = biowait(bp); 5880 mutex_enter(ST_MUTEX); 5881 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 5882 "st_ioctl_cmd: biowait returns %d\n", err); 5883 } 5884 5885 /* 5886 * Copy status from kernel copy of uscsi_cmd to user copy 5887 * of uscsi_cmd - this was saved in st_done_and_mutex_exit() 5888 */ 5889 ucmd->uscsi_status = kcmd->uscsi_status; 5890 5891done: 5892 ucmd->uscsi_resid = bp->b_resid; 5893 5894 /* 5895 * Update the Request Sense status and resid 5896 */ 5897 rqlen = kcmd->uscsi_rqlen - kcmd->uscsi_rqresid; 5898 rqlen = min(((int)ucmd->uscsi_rqlen), rqlen); 5899 ucmd->uscsi_rqresid = ucmd->uscsi_rqlen - rqlen; 5900 ucmd->uscsi_rqstatus = kcmd->uscsi_rqstatus; 5901 /* 5902 * Copy out the sense data for user processes 5903 */ 5904 if (ucmd->uscsi_rqbuf && rqlen && rqbufspace == UIO_USERSPACE) { 5905 if (copyout(krqbuf, ucmd->uscsi_rqbuf, rqlen)) { 5906 err = EFAULT; 5907 } 5908 } 5909 5910 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 5911 "st_ioctl_cmd status is 0x%x, resid is 0x%lx\n", 5912 ucmd->uscsi_status, ucmd->uscsi_resid); 5913 if (DEBUGGING && (rqlen != 0)) { 5914 int i, n, len; 5915 char *data = krqbuf; 5916 scsi_log(ST_DEVINFO, st_label, SCSI_DEBUG, 5917 "rqstatus=0x%x rqlen=0x%x rqresid=0x%x\n", 5918 ucmd->uscsi_rqstatus, ucmd->uscsi_rqlen, 5919 ucmd->uscsi_rqresid); 5920 len = (int)ucmd->uscsi_rqlen - ucmd->uscsi_rqresid; 5921 for (i = 0; i < len; i += 16) { 5922 n = min(16, len-1); 5923 st_clean_print(ST_DEVINFO, st_label, CE_NOTE, 5924 " ", &data[i], n); 5925 } 5926 } 5927 5928exit_free: 5929 /* 5930 * Free resources 5931 */ 5932 un->un_sbuf_busy = 0; 5933 un->un_srqbufp = NULL; 5934 cv_signal(&un->un_sbuf_cv); 5935 5936 if (krqbuf) { 5937 kmem_free(krqbuf, SENSE_LENGTH); 5938 } 5939 kmem_free(kcdb, kcmd->uscsi_cdblen); 5940 kmem_free(kcmd, sizeof (struct uscsi_cmd)); 5941 5942 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 5943 "st_ioctl_cmd returns 0x%x\n", err); 5944 5945 5946exit: 5947 /* don't lose offline state */ 5948 if (offline_state) 5949 un->un_state = ST_STATE_OFFLINE; 5950 5951 ASSERT(mutex_owned(ST_MUTEX)); 5952 return (err); 5953} 5954 5955static int 5956st_write_fm(dev_t dev, int wfm) 5957{ 5958 int i; 5959 int rval; 5960 5961 GET_SOFT_STATE(dev); 5962 5963 ASSERT(mutex_owned(ST_MUTEX)); 5964 5965 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 5966 "st_write_fm(dev = 0x%lx, wfm = %d)\n", dev, wfm); 5967 5968 /* 5969 * write one filemark at the time after EOT 5970 */ 5971 if (un->un_eof >= ST_EOT) { 5972 for (i = 0; i < wfm; i++) { 5973 rval = st_cmd(dev, SCMD_WRITE_FILE_MARK, 1, SYNC_CMD); 5974 if (rval == EACCES) { 5975 return (rval); 5976 } 5977 if (rval != 0) { 5978 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 5979 "st_write_fm : EIO : write EOT file mark"); 5980 return (EIO); 5981 } 5982 } 5983 } else { 5984 rval = st_cmd(dev, SCMD_WRITE_FILE_MARK, wfm, SYNC_CMD); 5985 if (rval == EACCES) { 5986 return (rval); 5987 } 5988 if (rval) { 5989 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 5990 "st_write_fm : EIO : write file mark"); 5991 return (EIO); 5992 } 5993 } 5994 5995 ASSERT(mutex_owned(ST_MUTEX)); 5996 return (0); 5997} 5998 5999#ifdef STDEBUG 6000static void 6001start_dump(struct scsi_tape *un, struct buf *bp) 6002{ 6003 struct scsi_pkt *pkt = BP_PKT(bp); 6004 uchar_t *cdbp = (uchar_t *)pkt->pkt_cdbp; 6005 6006 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 6007 "st_start: cmd=0x%p count=%ld resid=%ld flags=0x%x pkt=0x%p\n", 6008 (void *)bp->b_forw, bp->b_bcount, 6009 bp->b_resid, bp->b_flags, (void *)BP_PKT(bp)); 6010 6011 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 6012 "st_start: cdb %x %x %x %x %x %x, fileno=%d, blk=%ld\n", 6013 cdbp[0], cdbp[1], cdbp[2], 6014 cdbp[3], cdbp[4], cdbp[5], un->un_fileno, 6015 un->un_blkno); 6016} 6017#endif 6018 6019 6020/* 6021 * Command start && done functions 6022 */ 6023 6024/* 6025 * st_start() 6026 * 6027 * Called from: 6028 * st_strategy() to start a command. 6029 * st_runout() to retry when scsi_pkt allocation fails on previous attempt(s). 6030 * st_attach() when resuming from power down state. 6031 * st_start_restart() to retry transport when device was previously busy. 6032 * st_done_and_mutex_exit() to start the next command when previous is done. 6033 * 6034 * On entry: 6035 * scsi_pkt may or may not be allocated. 6036 * 6037 */ 6038static void 6039st_start(struct scsi_tape *un) 6040{ 6041 struct buf *bp; 6042 int status; 6043 6044 ASSERT(mutex_owned(ST_MUTEX)); 6045 6046 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 6047 "st_start(): dev = 0x%lx\n", un->un_dev); 6048 6049 if ((bp = un->un_quef) == NULL) { 6050 return; 6051 } 6052 6053 ASSERT((bp->b_flags & B_DONE) == 0); 6054 6055 /* 6056 * Don't send more than un_throttle commands to the HBA 6057 */ 6058 if ((un->un_throttle <= 0) || (un->un_ncmds >= un->un_throttle)) { 6059 return; 6060 } 6061 6062 /* 6063 * If the buf has no scsi_pkt call st_make_cmd() to get one and 6064 * build the command. 6065 */ 6066 if (BP_PKT(bp) == NULL) { 6067 ASSERT((bp->b_flags & B_DONE) == 0); 6068 st_make_cmd(un, bp, st_runout); 6069 ASSERT((bp->b_flags & B_DONE) == 0); 6070 status = geterror(bp); 6071 6072 /* 6073 * Some HBA's don't call bioerror() to set an error. 6074 * And geterror() returns zero if B_ERROR is not set. 6075 * So if we get zero we must check b_error. 6076 */ 6077 if (status == 0 && bp->b_error != 0) { 6078 status = bp->b_error; 6079 bioerror(bp, status); 6080 } 6081 6082 /* 6083 * Some HBA's convert DDI_DMA_NORESOURCES into ENOMEM. 6084 * In tape ENOMEM has special meaning so we'll change it. 6085 */ 6086 if (status == ENOMEM) { 6087 status = 0; 6088 bioerror(bp, status); 6089 } 6090 6091 /* 6092 * Did it fail and is it retryable? 6093 * If so return and wait for the callback through st_runout. 6094 * Also looks like scsi_init_pkt() will setup a callback even 6095 * if it isn't retryable. 6096 */ 6097 if (BP_PKT(bp) == NULL) { 6098 if (status == 0) { 6099 /* 6100 * If first attempt save state. 6101 */ 6102 if (un->un_state != ST_STATE_RESOURCE_WAIT) { 6103 un->un_laststate = un->un_state; 6104 un->un_state = ST_STATE_RESOURCE_WAIT; 6105 } 6106 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 6107 "temp no resources for pkt\n"); 6108 } else { 6109 /* 6110 * Unlikely that it would be retryable then not. 6111 */ 6112 if (un->un_state == ST_STATE_RESOURCE_WAIT) { 6113 un->un_state = un->un_laststate; 6114 } 6115 scsi_log(ST_DEVINFO, st_label, SCSI_DEBUG, 6116 "perm no resources for pkt errno = 0x%x\n", 6117 status); 6118 } 6119 return; 6120 } 6121 /* 6122 * Worked this time set the state back. 6123 */ 6124 if (un->un_state == ST_STATE_RESOURCE_WAIT) { 6125 un->un_state = un->un_laststate; 6126 } 6127 } 6128 6129 /* 6130 * move from waitq to runq 6131 */ 6132 un->un_quef = bp->b_actf; 6133 if (un->un_quel == bp) { 6134 /* 6135 * For the case of queue having one 6136 * element, set the tail pointer to 6137 * point to the element. 6138 */ 6139 un->un_quel = bp->b_actf; 6140 } 6141 6142 bp->b_actf = NULL; 6143 6144 if (un->un_runqf) { 6145 un->un_runql->b_actf = bp; 6146 } else { 6147 un->un_runqf = bp; 6148 } 6149 un->un_runql = bp; 6150 6151 6152#ifdef STDEBUG 6153 start_dump(un, bp); 6154#endif 6155 6156 /* could not get here if throttle was zero */ 6157 un->un_last_throttle = un->un_throttle; 6158 un->un_throttle = 0; /* so nothing else will come in here */ 6159 un->un_ncmds++; 6160 6161 ST_DO_KSTATS(bp, kstat_waitq_to_runq); 6162 6163 mutex_exit(ST_MUTEX); 6164 6165 status = scsi_transport(BP_PKT(bp)); 6166 6167 mutex_enter(ST_MUTEX); 6168 6169 if (un->un_last_throttle) { 6170 un->un_throttle = un->un_last_throttle; 6171 } 6172 6173 if (status != TRAN_ACCEPT) { 6174 ST_DO_KSTATS(bp, kstat_runq_back_to_waitq); 6175 mutex_exit(ST_MUTEX); 6176 6177 if (status == TRAN_BUSY) { 6178 /* if too many retries, fail the transport */ 6179 if (st_handle_start_busy(un, bp, 6180 ST_TRAN_BUSY_TIMEOUT) == 0) 6181 goto done; 6182 } 6183 scsi_log(ST_DEVINFO, st_label, CE_WARN, 6184 "transport rejected\n"); 6185 bp->b_resid = bp->b_bcount; 6186 6187 6188#ifndef __lock_lint 6189 /* 6190 * warlock doesn't understand this potential 6191 * recursion? 6192 */ 6193 mutex_enter(ST_MUTEX); 6194 ST_DO_KSTATS(bp, kstat_waitq_exit); 6195 ST_DO_ERRSTATS(un, st_transerrs); 6196 st_bioerror(bp, EIO); 6197 SET_PE_FLAG(un); 6198 st_done_and_mutex_exit(un, bp); 6199#endif 6200 } else { 6201 un->un_tran_retry_ct = 0; 6202 mutex_exit(ST_MUTEX); 6203 } 6204 6205done: 6206 6207 mutex_enter(ST_MUTEX); 6208} 6209 6210/* 6211 * if the transport is busy, then put this bp back on the waitq 6212 */ 6213static int 6214st_handle_start_busy(struct scsi_tape *un, struct buf *bp, 6215 clock_t timeout_interval) 6216{ 6217 struct buf *last_quef, *runq_bp; 6218 int rval = 0; 6219 6220 mutex_enter(ST_MUTEX); 6221 6222 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 6223 "st_handle_start_busy()\n"); 6224 6225 /* 6226 * Check to see if we hit the retry timeout and one last check for 6227 * making sure this is the last on the runq, if it is not, we have 6228 * to fail 6229 */ 6230 if (((int)un->un_tran_retry_ct++ > st_retry_count) || 6231 (un->un_runql != bp)) { 6232 rval = -1; 6233 goto exit; 6234 } 6235 6236 /* put the bp back on the waitq */ 6237 if (un->un_quef) { 6238 last_quef = un->un_quef; 6239 un->un_quef = bp; 6240 bp->b_actf = last_quef; 6241 } else { 6242 bp->b_actf = NULL; 6243 un->un_quef = bp; 6244 un->un_quel = bp; 6245 } 6246 6247 /* 6248 * Decrement un_ncmds so that this 6249 * gets thru' st_start() again. 6250 */ 6251 un->un_ncmds--; 6252 6253 /* 6254 * since this is an error case, we won't have to do 6255 * this list walking much. We've already made sure this bp was the 6256 * last on the runq 6257 */ 6258 runq_bp = un->un_runqf; 6259 6260 if (un->un_runqf == bp) { 6261 un->un_runqf = NULL; 6262 un->un_runql = NULL; 6263 } else { 6264 while (runq_bp) { 6265 if (runq_bp->b_actf == bp) { 6266 runq_bp->b_actf = NULL; 6267 un->un_runql = runq_bp; 6268 break; 6269 } 6270 runq_bp = runq_bp->b_actf; 6271 } 6272 } 6273 6274 6275 /* 6276 * send a marker pkt, if appropriate 6277 */ 6278 st_hba_unflush(un); 6279 6280 /* 6281 * all queues are aligned, we are just waiting to 6282 * transport, don't alloc any more buf p's, when 6283 * st_start is reentered. 6284 */ 6285 (void) timeout(st_start_restart, un, timeout_interval); 6286 6287exit: 6288 mutex_exit(ST_MUTEX); 6289 return (rval); 6290} 6291 6292 6293/* 6294 * st_runout a callback that is called what a resource allocatation failed 6295 */ 6296static int 6297st_runout(caddr_t arg) 6298{ 6299 struct scsi_tape *un = (struct scsi_tape *)arg; 6300 struct buf *bp; 6301 ASSERT(un != NULL); 6302 6303 mutex_enter(ST_MUTEX); 6304 6305 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, "st_runout()\n"); 6306 6307 bp = un->un_quef; 6308 6309 /* 6310 * failed scsi_init_pkt(). If errno is zero its retryable. 6311 */ 6312 if ((bp != NULL) && (geterror(bp) != 0)) { 6313 6314 scsi_log(ST_DEVINFO, st_label, CE_WARN, 6315 "errors after pkt alloc (b_flags=0x%x, b_error=0x%x)\n", 6316 bp->b_flags, geterror(bp)); 6317 ASSERT((bp->b_flags & B_DONE) == 0); 6318 6319 un->un_quef = bp->b_actf; 6320 if (un->un_quel == bp) { 6321 /* 6322 * For the case of queue having one 6323 * element, set the tail pointer to 6324 * point to the element. 6325 */ 6326 un->un_quel = bp->b_actf; 6327 } 6328 mutex_exit(ST_MUTEX); 6329 bp->b_actf = NULL; 6330 6331 ASSERT((bp->b_flags & B_DONE) == 0); 6332 6333 /* 6334 * Set resid, Error already set, then unblock calling thread. 6335 */ 6336 bp->b_resid = bp->b_bcount; 6337 biodone(bp); 6338 } else { 6339 /* 6340 * Try Again 6341 */ 6342 st_start(un); 6343 mutex_exit(ST_MUTEX); 6344 } 6345 6346 /* 6347 * Comments courtesy of sd.c 6348 * The scsi_init_pkt routine allows for the callback function to 6349 * return a 0 indicating the callback should be rescheduled or a 1 6350 * indicating not to reschedule. This routine always returns 1 6351 * because the driver always provides a callback function to 6352 * scsi_init_pkt. This results in a callback always being scheduled 6353 * (via the scsi_init_pkt callback implementation) if a resource 6354 * failure occurs. 6355 */ 6356 6357 return (1); 6358} 6359 6360/* 6361 * st_done_and_mutex_exit() 6362 * - remove bp from runq 6363 * - start up the next request 6364 * - if this was an asynch bp, clean up 6365 * - exit with released mutex 6366 */ 6367static void 6368st_done_and_mutex_exit(struct scsi_tape *un, struct buf *bp) 6369{ 6370 struct buf *runqbp, *prevbp; 6371 int pe_flagged = 0; 6372 6373 ASSERT(MUTEX_HELD(&un->un_sd->sd_mutex)); 6374#if !defined(lint) 6375 _NOTE(LOCK_RELEASED_AS_SIDE_EFFECT(&un->un_sd->sd_mutex)) 6376#endif 6377 ASSERT(mutex_owned(ST_MUTEX)); 6378 6379 /* 6380 * if bp is still on the runq (anywhere), then remove it 6381 */ 6382 prevbp = NULL; 6383 for (runqbp = un->un_runqf; runqbp != 0; runqbp = runqbp->b_actf) { 6384 if (runqbp == bp) { 6385 if (runqbp == un->un_runqf) { 6386 un->un_runqf = bp->b_actf; 6387 } else { 6388 prevbp->b_actf = bp->b_actf; 6389 } 6390 if (un->un_runql == bp) { 6391 un->un_runql = prevbp; 6392 } 6393 break; 6394 } 6395 prevbp = runqbp; 6396 } 6397 bp->b_actf = NULL; 6398 6399 un->un_ncmds--; 6400 cv_signal(&un->un_queue_cv); 6401 6402 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 6403 "st_done_and_mutex_exit(): cmd=0x%x count=%ld resid=%ld flags=0x%x\n", 6404 (uchar_t)*((caddr_t)(BP_PKT(bp))->pkt_cdbp), 6405 bp->b_bcount, bp->b_resid, bp->b_flags); 6406 6407 6408 /* 6409 * update kstats with transfer count info 6410 */ 6411 if (un->un_stats && (bp != un->un_sbufp) && IS_RW(bp)) { 6412 uint32_t n_done = bp->b_bcount - bp->b_resid; 6413 if (bp->b_flags & B_READ) { 6414 IOSP->reads++; 6415 IOSP->nread += n_done; 6416 } else { 6417 IOSP->writes++; 6418 IOSP->nwritten += n_done; 6419 } 6420 } 6421 6422 /* 6423 * Start the next one before releasing resources on this one, if 6424 * there is something on the queue and persistent errors has not been 6425 * flagged 6426 */ 6427 6428 if ((pe_flagged = IS_PE_FLAG_SET(un)) != 0) { 6429 un->un_last_resid = bp->b_resid; 6430 un->un_last_count = bp->b_bcount; 6431 } 6432 6433 if (un->un_pwr_mgmt == ST_PWR_SUSPENDED) { 6434 cv_broadcast(&un->un_tape_busy_cv); 6435 } else if (un->un_quef && un->un_throttle && !pe_flagged) { 6436 st_start(un); 6437 } 6438 6439 if (bp == un->un_sbufp && (bp->b_flags & B_ASYNC)) { 6440 /* 6441 * Since we marked this ourselves as ASYNC, 6442 * there isn't anybody around waiting for 6443 * completion any more. 6444 */ 6445 uchar_t com = (uchar_t)(uintptr_t)bp->b_forw; 6446 if (com == SCMD_READ || com == SCMD_WRITE) { 6447 bp->b_un.b_addr = (caddr_t)0; 6448 } 6449 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 6450 "st_done_and_mutex_exit(async): freeing pkt\n"); 6451 scsi_destroy_pkt(BP_PKT(bp)); 6452 un->un_sbuf_busy = 0; 6453 cv_signal(&un->un_sbuf_cv); 6454 mutex_exit(ST_MUTEX); 6455 return; 6456 } 6457 6458 if (bp == un->un_sbufp && BP_UCMD(bp)) { 6459 /* 6460 * Copy status from scsi_pkt to uscsi_cmd 6461 * since st_ioctl_cmd needs it 6462 */ 6463 BP_UCMD(bp)->uscsi_status = SCBP_C(BP_PKT(bp)); 6464 } 6465 6466 6467#ifdef STDEBUG 6468 if ((st_debug >= 4) && 6469 (((un->un_blkno % 100) == 0) || IS_PE_FLAG_SET(un))) { 6470 6471 ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG, 6472 "st_d_a_m_exit(): ncmds = %d, thr = %d, " 6473 "un_errno = %d, un_pe = %d\n", 6474 un->un_ncmds, un->un_throttle, un->un_errno, 6475 un->un_persist_errors); 6476 } 6477 6478#endif 6479 6480 mutex_exit(ST_MUTEX); 6481 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 6482 "st_done_and_mutex_exit: freeing pkt\n"); 6483 6484 scsi_destroy_pkt(BP_PKT(bp)); 6485 6486 biodone(bp); 6487 6488 /* 6489 * now that we biodoned that command, if persistent errors have been 6490 * flagged, flush the waitq 6491 */ 6492 if (pe_flagged) 6493 st_flush(un); 6494} 6495 6496 6497/* 6498 * Tape error, flush tape driver queue. 6499 */ 6500static void 6501st_flush(struct scsi_tape *un) 6502{ 6503 struct buf *bp; 6504 6505 mutex_enter(ST_MUTEX); 6506 6507 ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG, 6508 "st_flush(), ncmds = %d, quef = 0x%p\n", 6509 un->un_ncmds, (void *)un->un_quef); 6510 6511 /* 6512 * if we still have commands outstanding, wait for them to come in 6513 * before flushing the queue, and make sure there is a queue 6514 */ 6515 if (un->un_ncmds || !un->un_quef) 6516 goto exit; 6517 6518 /* 6519 * we have no more commands outstanding, so let's deal with special 6520 * cases in the queue for EOM and FM. If we are here, and un_errno 6521 * is 0, then we know there was no error and we return a 0 read or 6522 * write before showing errors 6523 */ 6524 6525 /* Flush the wait queue. */ 6526 while ((bp = un->un_quef) != NULL) { 6527 un->un_quef = bp->b_actf; 6528 6529 bp->b_resid = bp->b_bcount; 6530 6531 ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG, 6532 "st_flush() : blkno=%ld, err=%d, b_bcount=%ld\n", 6533 un->un_blkno, un->un_errno, bp->b_bcount); 6534 6535 st_set_pe_errno(un); 6536 6537 bioerror(bp, un->un_errno); 6538 6539 mutex_exit(ST_MUTEX); 6540 /* it should have one, but check anyway */ 6541 if (BP_PKT(bp)) { 6542 scsi_destroy_pkt(BP_PKT(bp)); 6543 } 6544 biodone(bp); 6545 mutex_enter(ST_MUTEX); 6546 } 6547 6548 /* 6549 * It's not a bad practice to reset the 6550 * waitq tail pointer to NULL. 6551 */ 6552 un->un_quel = NULL; 6553 6554exit: 6555 /* we mucked with the queue, so let others know about it */ 6556 cv_signal(&un->un_queue_cv); 6557 mutex_exit(ST_MUTEX); 6558} 6559 6560 6561/* 6562 * Utility functions 6563 */ 6564static int 6565st_determine_generic(dev_t dev) 6566{ 6567 int bsize; 6568 static char *cart = "0.25 inch cartridge"; 6569 char *sizestr; 6570 6571 GET_SOFT_STATE(dev); 6572 6573 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 6574 "st_determine_generic(dev = 0x%lx)\n", dev); 6575 6576 ASSERT(mutex_owned(ST_MUTEX)); 6577 6578 if (st_modesense(un)) { 6579 return (-1); 6580 } 6581 6582 bsize = (un->un_mspl->high_bl << 16) | 6583 (un->un_mspl->mid_bl << 8) | 6584 (un->un_mspl->low_bl); 6585 6586 if (bsize == 0) { 6587 un->un_dp->options |= ST_VARIABLE; 6588 un->un_dp->bsize = 0; 6589 un->un_bsize = 0; 6590 } else if (bsize > ST_MAXRECSIZE_FIXED) { 6591 /* 6592 * record size of this device too big. 6593 * try and convert it to variable record length. 6594 * 6595 */ 6596 un->un_dp->options |= ST_VARIABLE; 6597 if (st_change_block_size(dev, 0) != 0) { 6598 ST_DEBUG6(ST_DEVINFO, st_label, CE_WARN, 6599 "Fixed Record Size %d is too large\n", bsize); 6600 ST_DEBUG6(ST_DEVINFO, st_label, CE_WARN, 6601 "Cannot switch to variable record size\n"); 6602 un->un_dp->options &= ~ST_VARIABLE; 6603 return (-1); 6604 } 6605 } else if (st_change_block_size(dev, 0) == 0) { 6606 /* 6607 * If the drive was set to a non zero block size, 6608 * See if it can be set to a zero block size. 6609 * If it works, ST_VARIABLE so user can set it as they want. 6610 */ 6611 un->un_dp->options |= ST_VARIABLE; 6612 un->un_dp->bsize = 0; 6613 un->un_bsize = 0; 6614 } else { 6615 un->un_dp->bsize = bsize; 6616 un->un_bsize = bsize; 6617 } 6618 6619 6620 switch (un->un_mspl->density) { 6621 default: 6622 case 0x0: 6623 /* 6624 * default density, cannot determine any other 6625 * information. 6626 */ 6627 sizestr = "Unknown type- assuming 0.25 inch cartridge"; 6628 un->un_dp->type = ST_TYPE_DEFAULT; 6629 un->un_dp->options |= (ST_AUTODEN_OVERRIDE|ST_QIC); 6630 break; 6631 case 0x1: 6632 case 0x2: 6633 case 0x3: 6634 case 0x6: 6635 /* 6636 * 1/2" reel 6637 */ 6638 sizestr = "0.50 inch reel"; 6639 un->un_dp->type = ST_TYPE_REEL; 6640 un->un_dp->options |= ST_REEL; 6641 un->un_dp->densities[0] = 0x1; 6642 un->un_dp->densities[1] = 0x2; 6643 un->un_dp->densities[2] = 0x6; 6644 un->un_dp->densities[3] = 0x3; 6645 break; 6646 case 0x4: 6647 case 0x5: 6648 case 0x7: 6649 case 0x0b: 6650 6651 /* 6652 * Quarter inch. 6653 */ 6654 sizestr = cart; 6655 un->un_dp->type = ST_TYPE_DEFAULT; 6656 un->un_dp->options |= ST_QIC; 6657 6658 un->un_dp->densities[1] = 0x4; 6659 un->un_dp->densities[2] = 0x5; 6660 un->un_dp->densities[3] = 0x7; 6661 un->un_dp->densities[0] = 0x0b; 6662 break; 6663 6664 case 0x0f: 6665 case 0x10: 6666 case 0x11: 6667 case 0x12: 6668 /* 6669 * QIC-120, QIC-150, QIC-320, QIC-600 6670 */ 6671 sizestr = cart; 6672 un->un_dp->type = ST_TYPE_DEFAULT; 6673 un->un_dp->options |= ST_QIC; 6674 un->un_dp->densities[0] = 0x0f; 6675 un->un_dp->densities[1] = 0x10; 6676 un->un_dp->densities[2] = 0x11; 6677 un->un_dp->densities[3] = 0x12; 6678 break; 6679 6680 case 0x09: 6681 case 0x0a: 6682 case 0x0c: 6683 case 0x0d: 6684 /* 6685 * 1/2" cartridge tapes. Include HI-TC. 6686 */ 6687 sizestr = cart; 6688 sizestr[2] = '5'; 6689 sizestr[3] = '0'; 6690 un->un_dp->type = ST_TYPE_HIC; 6691 un->un_dp->densities[0] = 0x09; 6692 un->un_dp->densities[1] = 0x0a; 6693 un->un_dp->densities[2] = 0x0c; 6694 un->un_dp->densities[3] = 0x0d; 6695 break; 6696 6697 case 0x13: 6698 /* DDS-2/DDS-3 scsi spec densities */ 6699 case 0x24: 6700 case 0x25: 6701 case 0x26: 6702 sizestr = "DAT Data Storage (DDS)"; 6703 un->un_dp->type = ST_TYPE_DAT; 6704 un->un_dp->options |= ST_AUTODEN_OVERRIDE; 6705 break; 6706 6707 case 0x14: 6708 /* 6709 * Helical Scan (Exabyte) devices 6710 */ 6711 sizestr = "8mm helical scan cartridge"; 6712 un->un_dp->type = ST_TYPE_EXABYTE; 6713 un->un_dp->options |= ST_AUTODEN_OVERRIDE; 6714 break; 6715 } 6716 6717 /* 6718 * Assume LONG ERASE, BSF and BSR 6719 */ 6720 6721 un->un_dp->options |= (ST_LONG_ERASE|ST_UNLOADABLE|ST_BSF| 6722 ST_BSR|ST_KNOWS_EOD); 6723 6724 /* 6725 * Only if mode sense data says no buffered write, set NOBUF 6726 */ 6727 if (un->un_mspl->bufm == 0) 6728 un->un_dp->options |= ST_NOBUF; 6729 6730 /* 6731 * set up large read and write retry counts 6732 */ 6733 6734 un->un_dp->max_rretries = un->un_dp->max_wretries = 1000; 6735 6736 /* 6737 * If this is a 0.50 inch reel tape, and 6738 * it is *not* variable mode, try and 6739 * set it to variable record length 6740 * mode. 6741 */ 6742 if ((un->un_dp->options & ST_REEL) && un->un_bsize != 0 && 6743 (un->un_dp->options & ST_VARIABLE)) { 6744 if (st_change_block_size(dev, 0) == 0) { 6745 un->un_dp->bsize = 0; 6746 un->un_mspl->high_bl = un->un_mspl->mid_bl = 6747 un->un_mspl->low_bl = 0; 6748 } 6749 } 6750 6751 /* 6752 * Write to console about type of device found 6753 */ 6754 ST_DEBUG6(ST_DEVINFO, st_label, CE_NOTE, 6755 "Generic Drive, Vendor=%s\n\t%s", un->un_dp->name, 6756 sizestr); 6757 if (un->un_dp->options & ST_VARIABLE) { 6758 scsi_log(ST_DEVINFO, st_label, CE_NOTE, 6759 "!Variable record length I/O\n"); 6760 } else { 6761 scsi_log(ST_DEVINFO, st_label, CE_NOTE, 6762 "!Fixed record length (%d byte blocks) I/O\n", 6763 un->un_dp->bsize); 6764 } 6765 ASSERT(mutex_owned(ST_MUTEX)); 6766 return (0); 6767} 6768 6769static int 6770st_determine_density(dev_t dev, int rw) 6771{ 6772 int rval = 0; 6773 6774 GET_SOFT_STATE(dev); 6775 6776 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 6777 "st_determine_density(dev = 0x%lx, rw = %s)\n", 6778 dev, (rw == B_WRITE ? wr_str: rd_str)); 6779 6780 ASSERT(mutex_owned(ST_MUTEX)); 6781 6782 /* 6783 * If we're past BOT, density is determined already. 6784 */ 6785 if (un->un_fileno > 0 || (un->un_fileno == 0 && un->un_blkno != 0)) { 6786 /* 6787 * XXX: put in a bitch message about attempting to 6788 * XXX: change density past BOT. 6789 */ 6790 goto exit; 6791 } 6792 6793 /* 6794 * If we're going to be writing, we set the density 6795 */ 6796 if (rw == 0 || rw == B_WRITE) { 6797 /* un_curdens is used as an index into densities table */ 6798 un->un_curdens = MT_DENSITY(un->un_dev); 6799 if (st_set_density(dev)) { 6800 rval = -1; 6801 } 6802 goto exit; 6803 } 6804 6805 /* 6806 * If density is known already, 6807 * we don't have to get it again.(?) 6808 */ 6809 if (!un->un_density_known) { 6810 if (st_get_density(dev)) { 6811 rval = -1; 6812 } 6813 } 6814 6815exit: 6816 ASSERT(mutex_owned(ST_MUTEX)); 6817 return (rval); 6818} 6819 6820 6821/* 6822 * Try to determine density. We do this by attempting to read the 6823 * first record off the tape, cycling through the available density 6824 * codes as we go. 6825 */ 6826 6827static int 6828st_get_density(dev_t dev) 6829{ 6830 int succes = 0, rval = -1, i; 6831 uint_t size; 6832 uchar_t dens, olddens; 6833 6834 GET_SOFT_STATE(dev); 6835 6836 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 6837 "st_get_density(dev = 0x%lx)\n", dev); 6838 6839 ASSERT(mutex_owned(ST_MUTEX)); 6840 6841 /* 6842 * If Auto Density override is enabled The drive has 6843 * only one density and there is no point in attempting 6844 * find the correct one. 6845 * 6846 * Since most modern drives auto detect the density 6847 * and format of the recorded media before they come 6848 * ready. What this function does is a legacy behavior 6849 * and modern drives not only don't need it, The backup 6850 * utilities that do positioning via uscsi find the un- 6851 * expected rewinds problematic. 6852 * 6853 * The drives that need this are old reel to reel devices. 6854 * I took a swag and said they must be scsi-1 or older. 6855 * I don't beleave there will any of the newer devices 6856 * that need this. There will be some scsi-1 devices that 6857 * don't need this but I don't think they will be using the 6858 * BIG aftermarket backup and restore utilitys. 6859 */ 6860 if ((un->un_dp->options & ST_AUTODEN_OVERRIDE) || 6861 (un->un_sd->sd_inq->inq_ansi > 1)) { 6862 un->un_density_known = 1; 6863 rval = 0; 6864 goto exit; 6865 } 6866 6867 /* 6868 * This will only work on variable record length tapes 6869 * if and only if all variable record length tapes autodensity 6870 * select. 6871 */ 6872 size = (unsigned)(un->un_dp->bsize ? un->un_dp->bsize : SECSIZE); 6873 un->un_tmpbuf = kmem_alloc(size, KM_SLEEP); 6874 6875 /* 6876 * Start at the specified density 6877 */ 6878 6879 dens = olddens = un->un_curdens = MT_DENSITY(un->un_dev); 6880 6881 for (i = 0; i < NDENSITIES; i++, ((un->un_curdens == NDENSITIES - 1) ? 6882 (un->un_curdens = 0) : 6883 (un->un_curdens += 1))) { 6884 /* 6885 * If we've done this density before, 6886 * don't bother to do it again. 6887 */ 6888 dens = un->un_dp->densities[un->un_curdens]; 6889 if (i > 0 && dens == olddens) 6890 continue; 6891 olddens = dens; 6892 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 6893 "trying density 0x%x\n", dens); 6894 if (st_set_density(dev)) { 6895 continue; 6896 } 6897 6898 /* 6899 * XXX - the creates lots of headaches and slowdowns - must 6900 * fix. 6901 */ 6902 succes = (st_cmd(dev, SCMD_READ, (int)size, SYNC_CMD) == 0); 6903 if (st_cmd(dev, SCMD_REWIND, 0, SYNC_CMD)) { 6904 break; 6905 } 6906 if (succes) { 6907 st_init(un); 6908 rval = 0; 6909 un->un_density_known = 1; 6910 break; 6911 } 6912 } 6913 kmem_free(un->un_tmpbuf, size); 6914 un->un_tmpbuf = 0; 6915 6916exit: 6917 ASSERT(mutex_owned(ST_MUTEX)); 6918 return (rval); 6919} 6920 6921static int 6922st_set_density(dev_t dev) 6923{ 6924 int rval = 0; 6925 6926 GET_SOFT_STATE(dev); 6927 6928 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 6929 "st_set_density(dev = 0x%lx): density = 0x%x\n", dev, 6930 un->un_dp->densities[un->un_curdens]); 6931 6932 ASSERT(mutex_owned(ST_MUTEX)); 6933 6934 un->un_mspl->density = un->un_dp->densities[un->un_curdens]; 6935 6936 if ((un->un_dp->options & ST_AUTODEN_OVERRIDE) == 0) { 6937 /* 6938 * If auto density override is not set, Use mode select 6939 * to set density and compression. 6940 */ 6941 if (st_modeselect(un)) { 6942 rval = -1; 6943 } 6944 } else if ((un->un_dp->options & ST_MODE_SEL_COMP) != 0) { 6945 /* 6946 * If auto density and mode select compression are set, 6947 * This is a drive with one density code but compression 6948 * can be enabled or disabled. 6949 * Set compression but no need to set density. 6950 */ 6951 rval = st_set_compression(un); 6952 if ((rval != 0) && (rval != EALREADY)) { 6953 rval = -1; 6954 } else { 6955 rval = 0; 6956 } 6957 } 6958 6959 /* If sucessful set density and/or compression, mark density known */ 6960 if (rval == 0) { 6961 un->un_density_known = 1; 6962 } 6963 6964 ASSERT(mutex_owned(ST_MUTEX)); 6965 return (rval); 6966} 6967 6968static int 6969st_loadtape(dev_t dev) 6970{ 6971 int rval; 6972 6973 GET_SOFT_STATE(dev); 6974 6975 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 6976 "st_loadtape(dev = 0x%lx)\n", dev); 6977 6978 ASSERT(mutex_owned(ST_MUTEX)); 6979 6980 /* 6981 * 'LOAD' the tape to BOT by rewinding 6982 */ 6983 rval = st_cmd(dev, SCMD_REWIND, 1, SYNC_CMD); 6984 if (rval == 0) { 6985 st_init(un); 6986 un->un_density_known = 0; 6987 } 6988 6989 ASSERT(mutex_owned(ST_MUTEX)); 6990 return (rval); 6991} 6992 6993 6994/* 6995 * Note: QIC devices aren't so smart. If you try to append 6996 * after EOM, the write can fail because the device doesn't know 6997 * it's at EOM. In that case, issue a read. The read should fail 6998 * because there's no data, but the device knows it's at EOM, 6999 * so a subsequent write should succeed. To further confuse matters, 7000 * the target returns the same error if the tape is positioned 7001 * such that a write would overwrite existing data. That's why 7002 * we have to do the append test. A read in the middle of 7003 * recorded data would succeed, thus indicating we're attempting 7004 * something illegal. 7005 */ 7006 7007void bp_mapin(struct buf *bp); 7008 7009static void 7010st_test_append(struct buf *bp) 7011{ 7012 dev_t dev = bp->b_edev; 7013 struct scsi_tape *un; 7014 uchar_t status; 7015 unsigned bcount; 7016 7017 un = ddi_get_soft_state(st_state, MTUNIT(dev)); 7018 7019 ASSERT(mutex_owned(ST_MUTEX)); 7020 7021 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 7022 "st_test_append(): fileno %d\n", un->un_fileno); 7023 7024 un->un_laststate = un->un_state; 7025 un->un_state = ST_STATE_APPEND_TESTING; 7026 un->un_test_append = 0; 7027 7028 /* 7029 * first, map in the buffer, because we're doing a double write -- 7030 * first into the kernel, then onto the tape. 7031 */ 7032 bp_mapin(bp); 7033 7034 /* 7035 * get a copy of the data.... 7036 */ 7037 un->un_tmpbuf = kmem_alloc((unsigned)bp->b_bcount, KM_SLEEP); 7038 bcopy(bp->b_un.b_addr, un->un_tmpbuf, (uint_t)bp->b_bcount); 7039 7040 /* 7041 * attempt the write.. 7042 */ 7043 7044 if (st_cmd(dev, (int)SCMD_WRITE, (int)bp->b_bcount, SYNC_CMD) == 0) { 7045success: 7046 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 7047 "append write succeeded\n"); 7048 bp->b_resid = un->un_sbufp->b_resid; 7049 mutex_exit(ST_MUTEX); 7050 bcount = (unsigned)bp->b_bcount; 7051 biodone(bp); 7052 mutex_enter(ST_MUTEX); 7053 un->un_laststate = un->un_state; 7054 un->un_state = ST_STATE_OPEN; 7055 kmem_free(un->un_tmpbuf, bcount); 7056 un->un_tmpbuf = NULL; 7057 return; 7058 } 7059 7060 /* 7061 * The append failed. Do a short read. If that fails, we are at EOM 7062 * so we can retry the write command. If that succeeds, than we're 7063 * all screwed up (the controller reported a real error). 7064 * 7065 * XXX: should the dummy read be > SECSIZE? should it be the device's 7066 * XXX: block size? 7067 * 7068 */ 7069 status = un->un_status; 7070 un->un_status = 0; 7071 (void) st_cmd(dev, SCMD_READ, SECSIZE, SYNC_CMD); 7072 if (un->un_status == KEY_BLANK_CHECK) { 7073 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 7074 "append at EOM\n"); 7075 /* 7076 * Okay- the read failed. We should actually have confused 7077 * the controller enough to allow writing. In any case, the 7078 * i/o is on its own from here on out. 7079 */ 7080 un->un_laststate = un->un_state; 7081 un->un_state = ST_STATE_OPEN; 7082 bcopy(bp->b_un.b_addr, un->un_tmpbuf, (uint_t)bp->b_bcount); 7083 if (st_cmd(dev, (int)SCMD_WRITE, (int)bp->b_bcount, 7084 SYNC_CMD) == 0) { 7085 goto success; 7086 } 7087 } 7088 7089 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 7090 "append write failed- not at EOM\n"); 7091 bp->b_resid = bp->b_bcount; 7092 st_bioerror(bp, EIO); 7093 7094 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 7095 "st_test_append : EIO : append write failed - not at EOM"); 7096 7097 /* 7098 * backspace one record to get back to where we were 7099 */ 7100 if (st_cmd(dev, SCMD_SPACE, Blk(-1), SYNC_CMD)) { 7101 un->un_fileno = -1; 7102 } 7103 7104 un->un_err_resid = bp->b_resid; 7105 un->un_status = status; 7106 7107 /* 7108 * Note: biodone will do a bp_mapout() 7109 */ 7110 mutex_exit(ST_MUTEX); 7111 bcount = (unsigned)bp->b_bcount; 7112 biodone(bp); 7113 mutex_enter(ST_MUTEX); 7114 un->un_laststate = un->un_state; 7115 un->un_state = ST_STATE_OPEN_PENDING_IO; 7116 kmem_free(un->un_tmpbuf, bcount); 7117 un->un_tmpbuf = NULL; 7118} 7119 7120/* 7121 * Special command handler 7122 */ 7123 7124/* 7125 * common st_cmd code. The fourth parameter states 7126 * whether the caller wishes to await the results 7127 * Note the release of the mutex during most of the function 7128 */ 7129static int 7130st_cmd(dev_t dev, int com, int count, int wait) 7131{ 7132 struct buf *bp; 7133 int err; 7134 7135 GET_SOFT_STATE(dev); 7136 7137 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 7138 "st_cmd(dev = 0x%lx, com = 0x%x, count = %x, wait = %d)\n", 7139 dev, com, count, wait); 7140 7141 ASSERT(MUTEX_HELD(&un->un_sd->sd_mutex)); 7142 ASSERT(mutex_owned(ST_MUTEX)); 7143 7144#ifdef STDEBUG 7145 if (st_debug) 7146 st_debug_cmds(un, com, count, wait); 7147#endif 7148 7149 /* check to see if this command requires the drive to be reserved */ 7150 err = st_check_cmd_for_need_to_reserve(un, com, count); 7151 7152 if (err) { 7153 return (err); 7154 } 7155 7156 while (un->un_sbuf_busy) 7157 cv_wait(&un->un_sbuf_cv, ST_MUTEX); 7158 un->un_sbuf_busy = 1; 7159 7160 bp = un->un_sbufp; 7161 bzero(bp, sizeof (buf_t)); 7162 7163 bp->b_flags = (wait) ? B_BUSY : B_BUSY|B_ASYNC; 7164 7165 /* 7166 * Set count to the actual size of the data tranfer. 7167 * For commands with no data transfer, set bp->b_bcount 7168 * to the value to be used when constructing the 7169 * cdb in st_make_cmd(). 7170 */ 7171 switch (com) { 7172 case SCMD_READ: 7173 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 7174 "special read %d\n", count); 7175 bp->b_flags |= B_READ; 7176 bp->b_un.b_addr = un->un_tmpbuf; 7177 break; 7178 7179 case SCMD_WRITE: 7180 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 7181 "special write %d\n", count); 7182 bp->b_un.b_addr = un->un_tmpbuf; 7183 break; 7184 7185 case SCMD_WRITE_FILE_MARK: 7186 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 7187 "write %d file marks\n", count); 7188 bp->b_bcount = count; 7189 count = 0; 7190 break; 7191 7192 case SCMD_REWIND: 7193 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, "rewind\n"); 7194 bp->b_bcount = 0; 7195 count = 0; 7196 break; 7197 7198 case SCMD_SPACE: 7199 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, "space\n"); 7200 bp->b_bcount = count; 7201 count = 0; 7202 break; 7203 7204 case SCMD_RESERVE: 7205 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, "reserve"); 7206 bp->b_bcount = 0; 7207 count = 0; 7208 break; 7209 7210 case SCMD_RELEASE: 7211 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, "release"); 7212 bp->b_bcount = 0; 7213 count = 0; 7214 break; 7215 7216 case SCMD_LOAD: 7217 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 7218 "%s tape\n", (count) ? "load" : "unload"); 7219 bp->b_bcount = count; 7220 count = 0; 7221 break; 7222 7223 case SCMD_ERASE: 7224 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 7225 "erase tape\n"); 7226 bp->b_bcount = 0; 7227 count = 0; 7228 break; 7229 7230 case SCMD_MODE_SENSE: 7231 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 7232 "mode sense\n"); 7233 bp->b_flags |= B_READ; 7234 bp->b_un.b_addr = (caddr_t)(un->un_mspl); 7235 break; 7236 7237 case SCMD_MODE_SELECT: 7238 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 7239 "mode select\n"); 7240 bp->b_un.b_addr = (caddr_t)(un->un_mspl); 7241 break; 7242 7243 case SCMD_READ_BLKLIM: 7244 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 7245 "read block limits\n"); 7246 bp->b_flags |= B_READ; 7247 bp->b_un.b_addr = (caddr_t)(un->un_rbl); 7248 break; 7249 7250 case SCMD_TEST_UNIT_READY: 7251 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 7252 "test unit ready\n"); 7253 bp->b_bcount = 0; 7254 count = 0; 7255 break; 7256 default: 7257 ST_DEBUG(ST_DEVINFO, st_label, CE_PANIC, 7258 "Unhandled scsi command 0x%x in st_cmd()\n", com); 7259 } 7260 7261 mutex_exit(ST_MUTEX); 7262 7263 if (count > 0) { 7264 /* 7265 * We're going to do actual I/O. 7266 * Set things up for physio. 7267 */ 7268 struct iovec aiov; 7269 struct uio auio; 7270 struct uio *uio = &auio; 7271 7272 bzero(&auio, sizeof (struct uio)); 7273 bzero(&aiov, sizeof (struct iovec)); 7274 aiov.iov_base = bp->b_un.b_addr; 7275 aiov.iov_len = count; 7276 7277 uio->uio_iov = &aiov; 7278 uio->uio_iovcnt = 1; 7279 uio->uio_resid = aiov.iov_len; 7280 uio->uio_segflg = UIO_SYSSPACE; 7281 7282 /* 7283 * Let physio do the rest... 7284 */ 7285 bp->b_forw = (struct buf *)(uintptr_t)com; 7286 bp->b_back = NULL; 7287 err = physio(st_strategy, bp, dev, 7288 (bp->b_flags & B_READ) ? B_READ : B_WRITE, 7289 st_minphys, uio); 7290 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 7291 "st_cmd: physio returns %d\n", err); 7292 } else { 7293 /* 7294 * Mimic physio 7295 */ 7296 bp->b_forw = (struct buf *)(uintptr_t)com; 7297 bp->b_back = NULL; 7298 bp->b_edev = dev; 7299 bp->b_dev = cmpdev(dev); 7300 bp->b_blkno = 0; 7301 bp->b_resid = 0; 7302 (void) st_strategy(bp); 7303 if (!wait) { 7304 /* 7305 * This is an async command- the caller won't wait 7306 * and doesn't care about errors. 7307 */ 7308 mutex_enter(ST_MUTEX); 7309 return (0); 7310 } 7311 7312 /* 7313 * BugTraq #4260046 7314 * ---------------- 7315 * Restore Solaris 2.5.1 behavior, namely call biowait 7316 * unconditionally. The old comment said... 7317 * 7318 * "if strategy was flagged with persistent errors, we would 7319 * have an error here, and the bp would never be sent, so we 7320 * don't want to wait on a bp that was never sent...or hang" 7321 * 7322 * The new rationale, courtesy of Chitrank... 7323 * 7324 * "we should unconditionally biowait() here because 7325 * st_strategy() will do a biodone() in the persistent error 7326 * case and the following biowait() will return immediately. 7327 * If not, in the case of "errors after pkt alloc" in 7328 * st_start(), we will not biowait here which will cause the 7329 * next biowait() to return immediately which will cause 7330 * us to send out the next command. In the case where both of 7331 * these use the sbuf, when the first command completes we'll 7332 * free the packet attached to sbuf and the same pkt will 7333 * get freed again when we complete the second command. 7334 * see esc 518987. BTW, it is necessary to do biodone() in 7335 * st_start() for the pkt alloc failure case because physio() 7336 * does biowait() and will hang if we don't do biodone()" 7337 */ 7338 7339 err = biowait(bp); 7340 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 7341 "st_cmd: biowait returns %d\n", err); 7342 } 7343 mutex_enter(ST_MUTEX); 7344 7345 un->un_sbuf_busy = 0; 7346 cv_signal(&un->un_sbuf_cv); 7347 return (err); 7348} 7349 7350static int 7351st_set_compression(struct scsi_tape *un) 7352{ 7353 int rval; 7354 int turn_compression_on; 7355 minor_t minor; 7356 7357 /* 7358 * Drive either dosn't have compression or it is controlled with 7359 * special density codes. Return ENOTTY so caller 7360 * knows nothing was done. 7361 */ 7362 if ((un->un_dp->options & ST_MODE_SEL_COMP) == 0) { 7363 un->un_comp_page = 0; 7364 return (ENOTTY); 7365 } 7366 7367 /* set compression based on minor node opened */ 7368 minor = MT_DENSITY(un->un_dev); 7369 7370 /* 7371 * If this the compression density or 7372 * the drive has two densities and uses mode select for 7373 * control of compression turn on compression for MT_DENSITY2 7374 * as well. 7375 */ 7376 if ((minor == ST_COMPRESSION_DENSITY) || 7377 (minor == MT_DENSITY(MT_DENSITY2)) && 7378 (un->un_dp->densities[0] == un->un_dp->densities[1]) && 7379 (un->un_dp->densities[2] == un->un_dp->densities[3]) && 7380 (un->un_dp->densities[0] != un->un_dp->densities[2])) { 7381 7382 turn_compression_on = 1; 7383 } else { 7384 turn_compression_on = 0; 7385 } 7386 7387 un->un_mspl->high_bl = (uchar_t)(un->un_bsize >> 16); 7388 un->un_mspl->mid_bl = (uchar_t)(un->un_bsize >> 8); 7389 un->un_mspl->low_bl = (uchar_t)(un->un_bsize); 7390 7391 /* 7392 * Need to determine which page does the device use for compression. 7393 * First try the data compression page. If this fails try the device 7394 * configuration page 7395 */ 7396 7397 if ((un->un_comp_page & ST_DEV_DATACOMP_PAGE) == ST_DEV_DATACOMP_PAGE) { 7398 rval = st_set_datacomp_page(un, turn_compression_on); 7399 if (rval == EALREADY) { 7400 return (rval); 7401 } 7402 if (rval != 0) { 7403 if (un->un_status == KEY_ILLEGAL_REQUEST) { 7404 /* 7405 * This device does not support data 7406 * compression page 7407 */ 7408 un->un_comp_page = ST_DEV_CONFIG_PAGE; 7409 } else if (un->un_state >= ST_STATE_OPEN) { 7410 un->un_fileno = -1; 7411 rval = EIO; 7412 } else { 7413 rval = -1; 7414 } 7415 } else { 7416 un->un_comp_page = ST_DEV_DATACOMP_PAGE; 7417 } 7418 } 7419 7420 if ((un->un_comp_page & ST_DEV_CONFIG_PAGE) == ST_DEV_CONFIG_PAGE) { 7421 rval = st_set_devconfig_page(un, turn_compression_on); 7422 if (rval == EALREADY) { 7423 return (rval); 7424 } 7425 if (rval != 0) { 7426 if (un->un_status == KEY_ILLEGAL_REQUEST) { 7427 /* 7428 * This device does not support 7429 * compression at all advice the 7430 * user and unset ST_MODE_SEL_COMP 7431 */ 7432 un->un_dp->options &= ~ST_MODE_SEL_COMP; 7433 un->un_comp_page = 0; 7434 scsi_log(ST_DEVINFO, st_label, CE_NOTE, 7435 "Device Does Not Support Compression\n"); 7436 } else if (un->un_state >= ST_STATE_OPEN) { 7437 un->un_fileno = -1; 7438 rval = EIO; 7439 } else { 7440 rval = -1; 7441 } 7442 } 7443 } 7444 7445 return (rval); 7446} 7447 7448/* 7449 * set or unset compression thru device configuration page. 7450 */ 7451static int 7452st_set_devconfig_page(struct scsi_tape *un, int compression_on) 7453{ 7454 unsigned char cflag; 7455 int rval = 0; 7456 7457 ASSERT(mutex_owned(ST_MUTEX)); 7458 7459 /* 7460 * Figure what to set compression flag to. 7461 */ 7462 if (compression_on) { 7463 /* They have selected a compression node */ 7464 if (un->un_dp->type == ST_TYPE_FUJI) { 7465 cflag = 0x84; /* use EDRC */ 7466 } else { 7467 cflag = ST_DEV_CONFIG_DEF_COMP; 7468 } 7469 } else { 7470 cflag = ST_DEV_CONFIG_NO_COMP; 7471 } 7472 7473 /* 7474 * If compression is already set the way it was requested. 7475 * And if this not the first time we has tried. 7476 */ 7477 if ((cflag == un->un_mspl->page.dev.comp_alg) && 7478 (un->un_comp_page == ST_DEV_DATACOMP_PAGE)) { 7479 return (EALREADY); 7480 } 7481 7482 un->un_mspl->page.dev.comp_alg = cflag; 7483 /* 7484 * need to send mode select even if correct compression is 7485 * already set since need to set density code 7486 */ 7487 7488#ifdef STDEBUG 7489 if (st_debug >= 6) { 7490 st_clean_print(ST_DEVINFO, st_label, SCSI_DEBUG, 7491 "st_set_devconfig_page: sense data for mode select", 7492 (char *)un->un_mspl, sizeof (struct seq_mode)); 7493 } 7494#endif 7495 rval = st_gen_mode_select(un, un->un_mspl, sizeof (struct seq_mode)); 7496 7497 return (rval); 7498} 7499 7500/* 7501 * set/reset compression bit thru data compression page 7502 */ 7503static int 7504st_set_datacomp_page(struct scsi_tape *un, int compression_on) 7505{ 7506 int compression_on_already; 7507 int rval = 0; 7508 7509 ASSERT(mutex_owned(ST_MUTEX)); 7510 7511 /* 7512 * If drive is not capable of compression (at this time) 7513 * return EALREADY so caller doesn't think that this page 7514 * is not supported. This check is for drives that can 7515 * disable compression from the front panel or configuration. 7516 * I doubt that a drive that supports this page is not really 7517 * capable of compression. 7518 */ 7519 if (un->un_mspl->page.comp.dcc == 0) { 7520 return (EALREADY); 7521 } 7522 7523 /* See if compression currently turned on */ 7524 if (un->un_mspl->page.comp.dce) { 7525 compression_on_already = 1; 7526 } else { 7527 compression_on_already = 0; 7528 } 7529 7530 /* 7531 * If compression is already set the way it was requested. 7532 * And if this not the first time we has tried. 7533 */ 7534 if ((compression_on == compression_on_already) && 7535 (un->un_comp_page == ST_DEV_DATACOMP_PAGE)) { 7536 return (EALREADY); 7537 } 7538 7539 /* 7540 * if we are already set to the appropriate compression 7541 * mode, don't set it again 7542 */ 7543 if (compression_on) { 7544 /* compression selected */ 7545 un->un_mspl->page.comp.dce = 1; 7546 } else { 7547 un->un_mspl->page.comp.dce = 0; 7548 } 7549 7550 7551#ifdef STDEBUG 7552 if (st_debug >= 6) { 7553 st_clean_print(ST_DEVINFO, st_label, SCSI_DEBUG, 7554 "st_set_datacomp_page: sense data for mode select", 7555 (char *)un->un_mspl, sizeof (struct seq_mode)); 7556 } 7557#endif 7558 rval = st_gen_mode_select(un, un->un_mspl, sizeof (struct seq_mode)); 7559 7560 return (rval); 7561} 7562 7563static int 7564st_modesense(struct scsi_tape *un) 7565{ 7566 int rval; 7567 uchar_t page; 7568 7569 page = un->un_comp_page; 7570 7571 switch (page) { 7572 case ST_DEV_DATACOMP_PAGE: 7573 case ST_DEV_CONFIG_PAGE: /* fall through */ 7574 rval = st_gen_mode_sense(un, page, un->un_mspl, 7575 sizeof (struct seq_mode)); 7576 break; 7577 7578 case ST_DEV_DATACOMP_PAGE | ST_DEV_CONFIG_PAGE: 7579 if (un->un_dp->options & ST_MODE_SEL_COMP) { 7580 page = ST_DEV_DATACOMP_PAGE; 7581 rval = st_gen_mode_sense(un, page, un->un_mspl, 7582 sizeof (struct seq_mode)); 7583 if (rval == 0 && un->un_mspl->page_code == page) { 7584 un->un_comp_page = page; 7585 break; 7586 } 7587 page = ST_DEV_CONFIG_PAGE; 7588 rval = st_gen_mode_sense(un, page, un->un_mspl, 7589 sizeof (struct seq_mode)); 7590 if (rval == 0 && un->un_mspl->page_code == page) { 7591 un->un_comp_page = page; 7592 break; 7593 } 7594 un->un_dp->options &= ~ST_MODE_SEL_COMP; 7595 un->un_comp_page = 0; 7596 } else { 7597 un->un_comp_page = 0; 7598 } 7599 7600 default: /* fall through */ 7601 rval = st_cmd(un->un_dev, SCMD_MODE_SENSE, MSIZE, SYNC_CMD); 7602 } 7603 return (rval); 7604} 7605 7606static int 7607st_modeselect(struct scsi_tape *un) 7608{ 7609 int rval = 0; 7610 int ix; 7611 7612 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 7613 "st_modeselect(dev = 0x%lx): density = 0x%x\n", 7614 un->un_dev, un->un_mspl->density); 7615 7616 ASSERT(mutex_owned(ST_MUTEX)); 7617 7618 /* 7619 * The parameter list should be the same for all of the 7620 * cases that follow so set them here 7621 * 7622 * Try mode select first if if fails set fields manually 7623 */ 7624 rval = st_modesense(un); 7625 if (rval != 0) { 7626 ST_DEBUG3(ST_DEVINFO, st_label, CE_WARN, 7627 "st_modeselect: First mode sense failed\n"); 7628 un->un_mspl->bd_len = 8; 7629 un->un_mspl->high_nb = 0; 7630 un->un_mspl->mid_nb = 0; 7631 un->un_mspl->low_nb = 0; 7632 } 7633 un->un_mspl->high_bl = (uchar_t)(un->un_bsize >> 16); 7634 un->un_mspl->mid_bl = (uchar_t)(un->un_bsize >> 8); 7635 un->un_mspl->low_bl = (uchar_t)(un->un_bsize); 7636 7637 7638 /* 7639 * If configured to use a specific density code for a media type. 7640 * curdens is previously set by the minor node opened. 7641 * If the media type doesn't match the minor node we change it so it 7642 * looks like the correct one was opened. 7643 */ 7644 if (un->un_dp->options & ST_KNOWS_MEDIA) { 7645 uchar_t best; 7646 7647 for (best = 0xff, ix = 0; ix < NDENSITIES; ix++) { 7648 if (un->un_mspl->media_type == 7649 un->un_dp->mediatype[ix]) { 7650 best = ix; 7651 /* 7652 * It matches but it might not be the only one. 7653 * Use the highest matching media type but not 7654 * to exceed the density selected by the open. 7655 */ 7656 if (ix < un->un_curdens) { 7657 continue; 7658 } 7659 un->un_curdens = ix; 7660 break; 7661 } 7662 } 7663 /* If a match was found best will not be 0xff any more */ 7664 if (best < NDENSITIES) { 7665 ST_DEBUG3(ST_DEVINFO, st_label, CE_WARN, 7666 "found media 0x%X using density 0x%X\n", 7667 un->un_mspl->media_type, 7668 un->un_dp->densities[best]); 7669 un->un_mspl->density = un->un_dp->densities[best]; 7670 } else { 7671 /* Otherwise set density based on minor node opened */ 7672 un->un_mspl->density = 7673 un->un_dp->densities[un->un_curdens]; 7674 } 7675 } else { 7676 un->un_mspl->density = un->un_dp->densities[un->un_curdens]; 7677 } 7678 7679 if (un->un_dp->options & ST_NOBUF) { 7680 un->un_mspl->bufm = 0; 7681 } else { 7682 un->un_mspl->bufm = 1; 7683 } 7684 7685 rval = st_set_compression(un); 7686 7687 /* 7688 * If st_set_compression returned invalid or already it 7689 * found no need to do the mode select. 7690 * So do it here. 7691 */ 7692 if ((rval == ENOTTY) || (rval == EALREADY)) { 7693 7694 /* Zero non-writeable fields */ 7695 un->un_mspl->data_len = 0; 7696 un->un_mspl->media_type = 0; 7697 un->un_mspl->wp = 0; 7698 7699 /* need to set the density code */ 7700 rval = st_cmd(un->un_dev, SCMD_MODE_SELECT, MSIZE, SYNC_CMD); 7701 if (rval != 0) { 7702 if (un->un_state >= ST_STATE_OPEN) { 7703 ST_DEBUG6(ST_DEVINFO, st_label, CE_WARN, 7704 "unable to set tape mode\n"); 7705 un->un_fileno = -1; 7706 rval = EIO; 7707 } else { 7708 rval = -1; 7709 } 7710 } 7711 } 7712 7713 /* 7714 * The spec recommends to send a mode sense after a mode select 7715 */ 7716 (void) st_modesense(un); 7717 7718 ASSERT(mutex_owned(ST_MUTEX)); 7719 7720 return (rval); 7721} 7722 7723/* 7724 * st_gen_mode_sense 7725 * 7726 * generic mode sense.. it allows for any page 7727 */ 7728static int 7729st_gen_mode_sense(struct scsi_tape *un, int page, struct seq_mode *page_data, 7730 int page_size) 7731{ 7732 7733 int r; 7734 char cdb[CDB_GROUP0]; 7735 struct uscsi_cmd *com; 7736 7737 com = kmem_zalloc(sizeof (*com), KM_SLEEP); 7738 7739 bzero(cdb, CDB_GROUP0); 7740 cdb[0] = SCMD_MODE_SENSE; 7741 cdb[2] = (char)page; 7742 cdb[4] = (char)page_size; 7743 7744 com->uscsi_cdb = cdb; 7745 com->uscsi_cdblen = CDB_GROUP0; 7746 com->uscsi_bufaddr = (caddr_t)page_data; 7747 com->uscsi_buflen = page_size; 7748 com->uscsi_timeout = un->un_dp->non_motion_timeout; 7749 com->uscsi_flags = USCSI_DIAGNOSE | USCSI_SILENT | 7750 USCSI_READ | USCSI_RQENABLE; 7751 7752 r = st_ioctl_cmd(un->un_dev, com, UIO_SYSSPACE, UIO_SYSSPACE, 7753 UIO_SYSSPACE); 7754 kmem_free(com, sizeof (*com)); 7755 return (r); 7756} 7757 7758/* 7759 * st_gen_mode_select 7760 * 7761 * generic mode select.. it allows for any page 7762 */ 7763static int 7764st_gen_mode_select(struct scsi_tape *un, struct seq_mode *page_data, 7765 int page_size) 7766{ 7767 7768 int r; 7769 char cdb[CDB_GROUP0]; 7770 struct uscsi_cmd *com; 7771 7772 /* Zero non-writeable fields */ 7773 page_data->data_len = 0; 7774 page_data->media_type = 0; 7775 page_data->wp = 0; 7776 7777 /* 7778 * If mode select has any page data, zero the ps (Page Savable) bit. 7779 */ 7780 if (page_size > MSIZE) { 7781 page_data->ps = 0; 7782 } 7783 7784 7785 com = kmem_zalloc(sizeof (*com), KM_SLEEP); 7786 7787 /* 7788 * then, do a mode select to set what ever info 7789 */ 7790 bzero(cdb, CDB_GROUP0); 7791 cdb[0] = SCMD_MODE_SELECT; 7792 cdb[1] = 0x10; /* set PF bit for many third party drives */ 7793 cdb[4] = (char)page_size; 7794 7795 com->uscsi_cdb = cdb; 7796 com->uscsi_cdblen = CDB_GROUP0; 7797 com->uscsi_bufaddr = (caddr_t)page_data; 7798 com->uscsi_buflen = page_size; 7799 com->uscsi_timeout = un->un_dp->non_motion_timeout; 7800 com->uscsi_flags = USCSI_DIAGNOSE | USCSI_SILENT 7801 | USCSI_WRITE | USCSI_RQENABLE; 7802 7803 r = st_ioctl_cmd(un->un_dev, com, UIO_SYSSPACE, UIO_SYSSPACE, 7804 UIO_SYSSPACE); 7805 7806 kmem_free(com, sizeof (*com)); 7807 return (r); 7808} 7809 7810/* 7811 * Changes devices blocksize and bsize to requested blocksize nblksz. 7812 * Returns returned value from first failed call or zero on success. 7813 */ 7814static int 7815st_change_block_size(dev_t dev, uint32_t nblksz) 7816{ 7817 struct seq_mode *current; 7818 int rval; 7819 uint32_t oldblksz; 7820 7821 GET_SOFT_STATE(dev); 7822 7823 current = kmem_zalloc(MSIZE, KM_SLEEP); 7824 7825 /* Read current settings */ 7826 rval = st_gen_mode_sense(un, 0, current, MSIZE); 7827 if (rval != 0) { 7828 scsi_log(ST_DEVINFO, st_label, SCSI_DEBUG, 7829 "mode sense for change block size failed: rval = %d", rval); 7830 goto finish; 7831 } 7832 7833 /* Figure the current block size */ 7834 oldblksz = 7835 (current->high_bl << 16) | 7836 (current->mid_bl << 8) | 7837 (current->low_bl); 7838 7839 /* If current block size is the same as requested were done */ 7840 if (oldblksz == nblksz) { 7841 un->un_bsize = nblksz; 7842 rval = 0; 7843 goto finish; 7844 } 7845 7846 /* Change to requested block size */ 7847 current->high_bl = (uchar_t)(nblksz >> 16); 7848 current->mid_bl = (uchar_t)(nblksz >> 8); 7849 current->low_bl = (uchar_t)(nblksz); 7850 7851 /* Attempt to change block size */ 7852 rval = st_gen_mode_select(un, current, MSIZE); 7853 if (rval != 0) { 7854 scsi_log(ST_DEVINFO, st_label, SCSI_DEBUG, 7855 "Set new block size failed: rval = %d", rval); 7856 goto finish; 7857 } 7858 7859 /* Read back and verify setting */ 7860 rval = st_modesense(un); 7861 if (rval == 0) { 7862 un->un_bsize = 7863 (un->un_mspl->high_bl << 16) | 7864 (un->un_mspl->mid_bl << 8) | 7865 (un->un_mspl->low_bl); 7866 7867 if (un->un_bsize != nblksz) { 7868 scsi_log(ST_DEVINFO, st_label, SCSI_DEBUG, 7869 "Blocksize set does not equal requested blocksize" 7870 "(read: %u requested: %u)\n", nblksz, un->un_bsize); 7871 rval = EIO; 7872 } 7873 } 7874finish: 7875 kmem_free(current, MSIZE); 7876 return (rval); 7877} 7878 7879 7880static void 7881st_init(struct scsi_tape *un) 7882{ 7883 ASSERT(mutex_owned(ST_MUTEX)); 7884 7885 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 7886 "st_init(): dev = 0x%lx, will reset fileno, blkno, eof\n", un->un_dev); 7887 7888 un->un_blkno = 0; 7889 un->un_fileno = 0; 7890 un->un_lastop = ST_OP_NIL; 7891 un->un_eof = ST_NO_EOF; 7892 un->un_pwr_mgmt = ST_PWR_NORMAL; 7893 if (st_error_level != SCSI_ERR_ALL) { 7894 if (DEBUGGING) { 7895 st_error_level = SCSI_ERR_ALL; 7896 } else { 7897 st_error_level = SCSI_ERR_RETRYABLE; 7898 } 7899 } 7900} 7901 7902 7903static void 7904st_make_cmd(struct scsi_tape *un, struct buf *bp, int (*func)(caddr_t)) 7905{ 7906 struct scsi_pkt *pkt; 7907 struct uscsi_cmd *ucmd; 7908 int count, tval = 0; 7909 int flags = 0; 7910 uchar_t com; 7911 char fixbit; 7912 7913 ASSERT(mutex_owned(ST_MUTEX)); 7914 7915 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 7916 "st_make_cmd(): dev = 0x%lx\n", un->un_dev); 7917 7918 7919 /* 7920 * fixbit is for setting the Fixed Mode and Suppress Incorrect 7921 * Length Indicator bits on read/write commands, for setting 7922 * the Long bit on erase commands, and for setting the Code 7923 * Field bits on space commands. 7924 * XXX why do we set lastop here? 7925 */ 7926 7927 if (bp != un->un_sbufp) { /* regular raw I/O */ 7928 int stat_size = (un->un_arq_enabled ? 7929 sizeof (struct scsi_arq_status) : 1); 7930 pkt = scsi_init_pkt(ROUTE, NULL, bp, 7931 CDB_GROUP0, stat_size, 0, 0, func, (caddr_t)un); 7932 if (pkt == NULL) { 7933 goto exit; 7934 } 7935 SET_BP_PKT(bp, pkt); 7936 if (un->un_bsize == 0) { 7937 count = bp->b_bcount; 7938 fixbit = 0; 7939 } else { 7940 count = bp->b_bcount / un->un_bsize; 7941 fixbit = 1; 7942 } 7943 if (bp->b_flags & B_READ) { 7944 com = SCMD_READ; 7945 un->un_lastop = ST_OP_READ; 7946 if ((un->un_bsize == 0) && /* Not Fixed Block */ 7947 (un->un_dp->options & ST_READ_IGNORE_ILI)) { 7948 fixbit = 2; 7949 } 7950 } else { 7951 com = SCMD_WRITE; 7952 un->un_lastop = ST_OP_WRITE; 7953 } 7954 7955 tval = un->un_dp->io_timeout; 7956 7957 /* 7958 * For really large xfers, increase timeout 7959 */ 7960 if (bp->b_bcount > (10 * ONE_MEG)) 7961 tval *= bp->b_bcount/(10 * ONE_MEG); 7962 7963 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 7964 "%s %ld amt 0x%lx\n", (com == SCMD_WRITE) ? 7965 wr_str: rd_str, un->un_blkno, bp->b_bcount); 7966 7967 } else if ((ucmd = BP_UCMD(bp)) != NULL) { 7968 /* 7969 * uscsi - build command, allocate scsi resources 7970 */ 7971 st_make_uscsi_cmd(un, ucmd, bp, func); 7972 goto exit; 7973 7974 } else { /* special I/O */ 7975 struct buf *allocbp = NULL; 7976 int stat_size = (un->un_arq_enabled ? 7977 sizeof (struct scsi_arq_status) : 1); 7978 7979 7980 com = (uchar_t)(uintptr_t)bp->b_forw; 7981 count = bp->b_bcount; 7982 7983 switch (com) { 7984 case SCMD_READ: 7985 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 7986 "special read %d\n", count); 7987 if (un->un_bsize == 0) { 7988 fixbit = 2; /* suppress SILI */ 7989 } else { 7990 fixbit = 1; /* Fixed Block Mode */ 7991 count /= un->un_bsize; 7992 } 7993 allocbp = bp; 7994 un->un_lastop = ST_OP_READ; 7995 tval = un->un_dp->io_timeout; 7996 break; 7997 7998 case SCMD_WRITE: 7999 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 8000 "special write %d\n", count); 8001 if (un->un_bsize != 0) { 8002 fixbit = 1; /* Fixed Block Mode */ 8003 count /= un->un_bsize; 8004 } else { 8005 fixbit = 0; 8006 } 8007 allocbp = bp; 8008 un->un_lastop = ST_OP_WRITE; 8009 tval = un->un_dp->io_timeout; 8010 break; 8011 8012 case SCMD_WRITE_FILE_MARK: 8013 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 8014 "write %d file marks\n", count); 8015 un->un_lastop = ST_OP_WEOF; 8016 fixbit = 0; 8017 tval = un->un_dp->io_timeout; 8018 break; 8019 8020 case SCMD_REWIND: 8021 if (bp->b_flags & B_ASYNC) { 8022 fixbit = 1; 8023 } else { 8024 fixbit = 0; 8025 } 8026 count = 0; 8027 un->un_lastop = ST_OP_CTL; 8028 tval = un->un_dp->rewind_timeout; 8029 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 8030 "rewind\n"); 8031 break; 8032 8033 case SCMD_SPACE: 8034 fixbit = Isfmk(count); 8035 count = (int)space_cnt(count); 8036 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 8037 "space %d %s from file %d blk %ld\n", 8038 count, (fixbit) ? "filemarks" : "records", 8039 un->un_fileno, un->un_blkno); 8040 un->un_lastop = ST_OP_CTL; 8041 tval = un->un_dp->space_timeout; 8042 break; 8043 8044 case SCMD_LOAD: 8045 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 8046 "%s tape\n", (count & 1) ? "load" : "unload"); 8047 fixbit = 0; 8048 8049 /* Loading or Unloading */ 8050 if (count & 1) { 8051 tval = un->un_dp->load_timeout; 8052 } else { 8053 tval = un->un_dp->unload_timeout; 8054 } 8055 /* Is Retension requested */ 8056 if (count & 2) { 8057 tval += un->un_dp->rewind_timeout; 8058 } 8059 un->un_lastop = ST_OP_CTL; 8060 break; 8061 8062 case SCMD_ERASE: 8063 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 8064 "erase tape\n"); 8065 count = 0; 8066 /* 8067 * We support long erase only 8068 */ 8069 fixbit = 1; 8070 tval = un->un_dp->erase_timeout; 8071 un->un_lastop = ST_OP_CTL; 8072 break; 8073 8074 case SCMD_MODE_SENSE: 8075 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 8076 "mode sense\n"); 8077 allocbp = bp; 8078 fixbit = 0; 8079 tval = un->un_dp->non_motion_timeout; 8080 break; 8081 8082 case SCMD_MODE_SELECT: 8083 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 8084 "mode select\n"); 8085 allocbp = bp; 8086 fixbit = 0; 8087 tval = un->un_dp->non_motion_timeout; 8088 break; 8089 8090 case SCMD_RESERVE: 8091 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 8092 "reserve\n"); 8093 fixbit = 0; 8094 tval = un->un_dp->non_motion_timeout; 8095 break; 8096 8097 case SCMD_RELEASE: 8098 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 8099 "release\n"); 8100 fixbit = 0; 8101 tval = un->un_dp->non_motion_timeout; 8102 break; 8103 8104 case SCMD_READ_BLKLIM: 8105 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 8106 "read block limits\n"); 8107 allocbp = bp; 8108 fixbit = count = 0; 8109 tval = un->un_dp->non_motion_timeout; 8110 break; 8111 8112 case SCMD_TEST_UNIT_READY: 8113 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 8114 "test unit ready\n"); 8115 fixbit = 0; 8116 tval = un->un_dp->non_motion_timeout; 8117 break; 8118 default: 8119 ST_DEBUG(ST_DEVINFO, st_label, CE_PANIC, 8120 "Unhandled scsi command 0x%x in st_make_cmd()\n", 8121 com); 8122 } 8123 pkt = scsi_init_pkt(ROUTE, NULL, allocbp, 8124 CDB_GROUP0, stat_size, 0, 0, func, (caddr_t)un); 8125 if (pkt == NULL) { 8126 goto exit; 8127 } 8128 if (allocbp) 8129 ASSERT(geterror(allocbp) == 0); 8130 8131 } 8132 8133 (void) scsi_setup_cdb((union scsi_cdb *)pkt->pkt_cdbp, 8134 com, 0, (uint_t)count, 0); 8135 FILL_SCSI1_LUN(un->un_sd, pkt); 8136 /* 8137 * Initialize the SILI/Fixed bits of the byte 1 of cdb. 8138 */ 8139 ((union scsi_cdb *)(pkt->pkt_cdbp))->t_code = fixbit; 8140 pkt->pkt_flags = flags; 8141 8142 /* 8143 * If ST_SHORT_FILEMARKS bit is ON for EXABYTE 8144 * device, set the Vendor Unique bit to 8145 * write Short File Mark. 8146 */ 8147 if (com == SCMD_WRITE_FILE_MARK && 8148 un->un_dp->options & ST_SHORT_FILEMARKS) { 8149 switch (un->un_dp->type) { 8150 case ST_TYPE_EXB8500: 8151 case ST_TYPE_EXABYTE: 8152 /* 8153 * Now the Vendor Unique bit 7 in Byte 5 of CDB 8154 * is set to to write Short File Mark 8155 */ 8156 ((union scsi_cdb *)pkt->pkt_cdbp)->g0_vu_1 = 1; 8157 break; 8158 8159 default: 8160 /* 8161 * Well, if ST_SHORT_FILEMARKS is set for other 8162 * tape drives, it is just ignored 8163 */ 8164 break; 8165 } 8166 } 8167 ASSERT(tval); 8168 pkt->pkt_time = tval; 8169 pkt->pkt_comp = st_intr; 8170 pkt->pkt_private = (opaque_t)bp; 8171 SET_BP_PKT(bp, pkt); 8172 8173exit: 8174 ASSERT(mutex_owned(ST_MUTEX)); 8175} 8176 8177 8178/* 8179 * Build a command based on a uscsi command; 8180 */ 8181static void 8182st_make_uscsi_cmd(struct scsi_tape *un, struct uscsi_cmd *ucmd, 8183 struct buf *bp, int (*func)(caddr_t)) 8184{ 8185 struct scsi_pkt *pkt; 8186 caddr_t cdb; 8187 int cdblen; 8188 int stat_size; 8189 8190 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 8191 "st_make_uscsi_cmd(): dev = 0x%lx\n", un->un_dev); 8192 8193 if (ucmd->uscsi_flags & USCSI_RQENABLE) { 8194 stat_size = (un->un_arq_enabled ? 8195 sizeof (struct scsi_arq_status) : 1); 8196 } else { 8197 stat_size = 1; 8198 } 8199 8200 ASSERT(mutex_owned(ST_MUTEX)); 8201 8202 un->un_lastop = ST_OP_CTL; /* usual */ 8203 8204 cdb = ucmd->uscsi_cdb; 8205 cdblen = ucmd->uscsi_cdblen; 8206 8207 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 8208 "st_make_uscsi_cmd: buflen=%ld bcount=%ld\n", 8209 ucmd->uscsi_buflen, bp->b_bcount); 8210 pkt = scsi_init_pkt(ROUTE, NULL, 8211 (bp->b_bcount > 0) ? bp : NULL, 8212 cdblen, stat_size, 0, 0, func, (caddr_t)un); 8213 if (pkt == NULL) { 8214 goto exit; 8215 } 8216 8217 bcopy(cdb, pkt->pkt_cdbp, (uint_t)cdblen); 8218 8219#ifdef STDEBUG 8220 if (st_debug >= 6) { 8221 st_clean_print(ST_DEVINFO, st_label, SCSI_DEBUG, 8222 "pkt_cdbp", (char *)cdb, cdblen); 8223 } 8224#endif 8225 8226 if (ucmd->uscsi_flags & USCSI_SILENT) { 8227 pkt->pkt_flags |= FLAG_SILENT; 8228 } 8229 8230 pkt->pkt_time = ucmd->uscsi_timeout; 8231 pkt->pkt_comp = st_intr; 8232 pkt->pkt_private = (opaque_t)bp; 8233 SET_BP_PKT(bp, pkt); 8234exit: 8235 ASSERT(mutex_owned(ST_MUTEX)); 8236} 8237 8238 8239/* 8240 * restart cmd currently at the head of the runq 8241 * 8242 * If scsi_transport() succeeds or the retries 8243 * count exhausted, restore the throttle that was 8244 * zeroed out in st_handle_intr_busy(). 8245 * 8246 */ 8247static void 8248st_intr_restart(void *arg) 8249{ 8250 struct scsi_tape *un = arg; 8251 struct buf *bp; 8252 int status = TRAN_ACCEPT; 8253 8254 mutex_enter(ST_MUTEX); 8255 8256 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 8257 "st_intr_restart(), un = 0x%p\n", (void *)un); 8258 8259 un->un_hib_tid = 0; 8260 8261 /* 8262 * move from waitq to runq, if there is anything on the waitq 8263 */ 8264 if ((bp = un->un_quef) == NULL) { 8265 mutex_exit(ST_MUTEX); 8266 return; 8267 } 8268 8269 /* 8270 * Here we know : 8271 * throttle = 0, via st_handle_intr_busy 8272 */ 8273 8274 if (un->un_quel == bp) { 8275 un->un_quel = NULL; 8276 un->un_quef = NULL; /* we know it's the first one */ 8277 } else { 8278 un->un_quef = bp->b_actf; 8279 } 8280 bp->b_actf = NULL; 8281 8282 if (un->un_runqf) { 8283 /* 8284 * not good, we don't want to requeue something after 8285 * another. 8286 */ 8287 mutex_exit(ST_MUTEX); 8288 goto done_error; 8289 } else { 8290 un->un_runqf = bp; 8291 un->un_runql = bp; 8292 } 8293 8294 ST_DO_KSTATS(bp, kstat_waitq_to_runq); 8295 8296 mutex_exit(ST_MUTEX); 8297 8298 status = scsi_transport(BP_PKT(bp)); 8299 8300 mutex_enter(ST_MUTEX); 8301 8302 if (status != TRAN_ACCEPT) { 8303 ST_DO_KSTATS(bp, kstat_runq_back_to_waitq); 8304 mutex_exit(ST_MUTEX); 8305 8306 if (status == TRAN_BUSY) { 8307 if (st_handle_intr_busy(un, bp, 8308 ST_TRAN_BUSY_TIMEOUT) == 0) 8309 return; /* timeout is setup again */ 8310 } 8311 8312 } else { 8313 un->un_tran_retry_ct = 0; 8314 if (un->un_last_throttle) { 8315 un->un_throttle = un->un_last_throttle; 8316 } 8317 mutex_exit(ST_MUTEX); 8318 return; 8319 } 8320 8321done_error: 8322 ST_DEBUG6(ST_DEVINFO, st_label, CE_WARN, 8323 "restart transport rejected\n"); 8324 bp->b_resid = bp->b_bcount; 8325 8326#ifndef __lock_lint 8327 /* 8328 * warlock doesn't understand this potential 8329 * recursion? 8330 */ 8331 mutex_enter(ST_MUTEX); 8332 if (un->un_last_throttle) { 8333 un->un_throttle = un->un_last_throttle; 8334 } 8335 if (status != TRAN_ACCEPT) 8336 ST_DO_ERRSTATS(un, st_transerrs); 8337 ST_DO_KSTATS(bp, kstat_waitq_exit); 8338 SET_PE_FLAG(un); 8339 st_bioerror(bp, EIO); 8340 st_done_and_mutex_exit(un, bp); 8341#endif 8342 ST_DEBUG6(ST_DEVINFO, st_label, CE_WARN, 8343 "busy restart aborted\n"); 8344} 8345 8346/* 8347 * st_check_media(): 8348 * Periodically check the media state using scsi_watch service; 8349 * this service calls back after TUR and possibly request sense 8350 * the callback handler (st_media_watch_cb()) decodes the request sense 8351 * data (if any) 8352 */ 8353 8354static int 8355st_check_media(dev_t dev, enum mtio_state state) 8356{ 8357 int rval = 0; 8358 enum mtio_state prev_state; 8359 opaque_t token = NULL; 8360 8361 GET_SOFT_STATE(dev); 8362 8363 mutex_enter(ST_MUTEX); 8364 8365 ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG, 8366 "st_check_media:state=%x, mediastate=%x\n", 8367 state, un->un_mediastate); 8368 8369 prev_state = un->un_mediastate; 8370 8371 /* 8372 * is there anything to do? 8373 */ 8374retry: 8375 if (state == un->un_mediastate || un->un_mediastate == MTIO_NONE) { 8376 /* 8377 * submit the request to the scsi_watch service; 8378 * scsi_media_watch_cb() does the real work 8379 */ 8380 mutex_exit(ST_MUTEX); 8381 token = scsi_watch_request_submit(ST_SCSI_DEVP, 8382 st_check_media_time, SENSE_LENGTH, 8383 st_media_watch_cb, (caddr_t)dev); 8384 if (token == NULL) { 8385 rval = EAGAIN; 8386 goto done; 8387 } 8388 mutex_enter(ST_MUTEX); 8389 8390 un->un_swr_token = token; 8391 un->un_specified_mediastate = state; 8392 8393 /* 8394 * now wait for media change 8395 * we will not be signalled unless mediastate == state but it 8396 * still better to test for this condition, since there 8397 * is a 5 sec cv_broadcast delay when 8398 * mediastate == MTIO_INSERTED 8399 */ 8400 ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG, 8401 "st_check_media:waiting for media state change\n"); 8402 while (un->un_mediastate == state) { 8403 if (cv_wait_sig(&un->un_state_cv, ST_MUTEX) == 0) { 8404 mutex_exit(ST_MUTEX); 8405 ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG, 8406 "st_check_media:waiting for media state " 8407 "was interrupted\n"); 8408 rval = EINTR; 8409 goto done; 8410 } 8411 ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG, 8412 "st_check_media:received signal, state=%x\n", 8413 un->un_mediastate); 8414 } 8415 } 8416 8417 /* 8418 * if we transitioned to MTIO_INSERTED, media has really been 8419 * inserted. If TUR fails, it is probably a exabyte slow spin up. 8420 * Reset and retry the state change. If everything is ok, replay 8421 * the open() logic. 8422 */ 8423 if ((un->un_mediastate == MTIO_INSERTED) && 8424 (un->un_state == ST_STATE_OFFLINE)) { 8425 ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG, 8426 "st_check_media: calling st_cmd to confirm inserted\n"); 8427 8428 /* 8429 * set this early so that TUR will make it through strategy 8430 * without triggering a st_tape_init(). We needed it set 8431 * before calling st_tape_init() ourselves anyway. If TUR 8432 * fails, set it back 8433 */ 8434 un->un_state = ST_STATE_INITIALIZING; 8435 8436 /* 8437 * If not reserved fail as getting reservation conflict 8438 * will make this hang forever. 8439 */ 8440 if ((un->un_rsvd_status & 8441 (ST_RESERVE | ST_APPLICATION_RESERVATIONS)) == 0) { 8442 mutex_exit(ST_MUTEX); 8443 rval = EACCES; 8444 goto done; 8445 } 8446 rval = st_cmd(dev, SCMD_TEST_UNIT_READY, 0, SYNC_CMD); 8447 if (rval == EACCES) { 8448 ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG, 8449 "st_check_media: TUR got Reservation Conflict\n"); 8450 mutex_exit(ST_MUTEX); 8451 goto done; 8452 } 8453 if (rval) { 8454 ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG, 8455 "st_check_media: TUR failed, going to retry\n"); 8456 un->un_mediastate = prev_state; 8457 un->un_state = ST_STATE_OFFLINE; 8458 goto retry; 8459 } 8460 ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG, 8461 "st_check_media: media inserted\n"); 8462 8463 /* this also rewinds the tape */ 8464 rval = st_tape_init(dev); 8465 if (rval != 0) { 8466 ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG, 8467 "st_check_media : OFFLINE init failure "); 8468 un->un_state = ST_STATE_OFFLINE; 8469 un->un_fileno = -1; 8470 } else { 8471 un->un_state = ST_STATE_OPEN_PENDING_IO; 8472 un->un_fileno = 0; 8473 un->un_blkno = 0; 8474 } 8475 } else if ((un->un_mediastate == MTIO_EJECTED) && 8476 (un->un_state != ST_STATE_OFFLINE)) { 8477 /* 8478 * supported devices must be rewound before ejection 8479 * rewind resets fileno & blkno 8480 */ 8481 un->un_laststate = un->un_state; 8482 un->un_state = ST_STATE_OFFLINE; 8483 } 8484 mutex_exit(ST_MUTEX); 8485done: 8486 if (token) { 8487 (void) scsi_watch_request_terminate(token, 8488 SCSI_WATCH_TERMINATE_WAIT); 8489 mutex_enter(ST_MUTEX); 8490 un->un_swr_token = (opaque_t)NULL; 8491 mutex_exit(ST_MUTEX); 8492 } 8493 8494 ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG, "st_check_media: done\n"); 8495 8496 return (rval); 8497} 8498 8499/* 8500 * st_media_watch_cb() is called by scsi_watch_thread for 8501 * verifying the request sense data (if any) 8502 */ 8503static int 8504st_media_watch_cb(caddr_t arg, struct scsi_watch_result *resultp) 8505{ 8506 struct scsi_status *statusp = resultp->statusp; 8507 struct scsi_extended_sense *sensep = resultp->sensep; 8508 uchar_t actual_sense_length = resultp->actual_sense_length; 8509 struct scsi_tape *un; 8510 enum mtio_state state = MTIO_NONE; 8511 int instance; 8512 dev_t dev = (dev_t)arg; 8513 8514 instance = MTUNIT(dev); 8515 if ((un = ddi_get_soft_state(st_state, instance)) == NULL) { 8516 return (-1); 8517 } 8518 8519 mutex_enter(ST_MUTEX); 8520 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 8521 "st_media_watch_cb: status=%x, sensep=%p, len=%x\n", 8522 *((char *)statusp), (void *)sensep, 8523 actual_sense_length); 8524 8525 /* 8526 * if there was a check condition then sensep points to valid 8527 * sense data 8528 * if status was not a check condition but a reservation or busy 8529 * status then the new state is MTIO_NONE 8530 */ 8531 if (sensep) { 8532 ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG, 8533 "st_media_watch_cb: KEY=%x, ASC=%x, ASCQ=%x\n", 8534 sensep->es_key, sensep->es_add_code, sensep->es_qual_code); 8535 8536 switch (un->un_dp->type) { 8537 default: 8538 ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG, 8539 "st_media_watch_cb: unknown drive type %d, default to ST_TYPE_HP\n", 8540 un->un_dp->type); 8541 /* FALLTHROUGH */ 8542 8543 case ST_TYPE_STC3490: /* STK 4220 1/2" cartridge */ 8544 case ST_TYPE_FUJI: /* 1/2" cartridge */ 8545 case ST_TYPE_HP: /* HP 88780 1/2" reel */ 8546 if (un->un_dp->type == ST_TYPE_FUJI) { 8547 ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, 8548 "st_media_watch_cb: ST_TYPE_FUJI\n"); 8549 } else { 8550 ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, 8551 "st_media_watch_cb: ST_TYPE_HP\n"); 8552 } 8553 switch (sensep->es_key) { 8554 case KEY_UNIT_ATTENTION: 8555 /* not ready to ready transition */ 8556 /* hp/es_qual_code == 80 on>off>on */ 8557 /* hp/es_qual_code == 0 on>off>unld>ld>on */ 8558 if (sensep->es_add_code == 0x28) { 8559 state = MTIO_INSERTED; 8560 } 8561 break; 8562 case KEY_NOT_READY: 8563 /* in process, rewinding or loading */ 8564 if ((sensep->es_add_code == 0x04) && 8565 (sensep->es_qual_code == 0x00)) { 8566 state = MTIO_EJECTED; 8567 } 8568 break; 8569 } 8570 break; 8571 8572 case ST_TYPE_EXB8500: /* Exabyte 8500 */ 8573 ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, 8574 "st_media_watch_cb: ST_TYPE_EXB8500\n"); 8575 switch (sensep->es_key) { 8576 case KEY_UNIT_ATTENTION: 8577 /* operator medium removal request */ 8578 if ((sensep->es_add_code == 0x5a) && 8579 (sensep->es_qual_code == 0x01)) { 8580 state = MTIO_EJECTED; 8581 /* not ready to ready transition */ 8582 } else if ((sensep->es_add_code == 0x28) && 8583 (sensep->es_qual_code == 0x00)) { 8584 state = MTIO_INSERTED; 8585 } 8586 break; 8587 case KEY_NOT_READY: 8588 /* medium not present */ 8589 if (sensep->es_add_code == 0x3a) { 8590 state = MTIO_EJECTED; 8591 } 8592 break; 8593 } 8594 break; 8595 case ST_TYPE_EXABYTE: /* Exabyte 8200 */ 8596 ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, 8597 "st_media_watch_cb: ST_TYPE_EXABYTE\n"); 8598 switch (sensep->es_key) { 8599 case KEY_NOT_READY: 8600 if ((sensep->es_add_code == 0x04) && 8601 (sensep->es_qual_code == 0x00)) { 8602 /* volume not mounted? */ 8603 state = MTIO_EJECTED; 8604 } else if (sensep->es_add_code == 0x3a) { 8605 state = MTIO_EJECTED; 8606 } 8607 break; 8608 case KEY_UNIT_ATTENTION: 8609 state = MTIO_EJECTED; 8610 break; 8611 } 8612 break; 8613 8614 case ST_TYPE_DLT: /* quantum DLT4xxx */ 8615 switch (sensep->es_key) { 8616 case KEY_UNIT_ATTENTION: 8617 if (sensep->es_add_code == 0x28) { 8618 state = MTIO_INSERTED; 8619 } 8620 break; 8621 case KEY_NOT_READY: 8622 if (sensep->es_add_code == 0x04) { 8623 /* in transition but could be either */ 8624 state = un->un_specified_mediastate; 8625 } else if ((sensep->es_add_code == 0x3a) && 8626 (sensep->es_qual_code == 0x00)) { 8627 state = MTIO_EJECTED; 8628 } 8629 break; 8630 } 8631 break; 8632 } 8633 } else if (*((char *)statusp) == STATUS_GOOD) { 8634 state = MTIO_INSERTED; 8635 } 8636 8637 ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, 8638 "st_media_watch_cb:state=%x, specified=%x\n", 8639 state, un->un_specified_mediastate); 8640 8641 /* 8642 * now signal the waiting thread if this is *not* the specified state; 8643 * delay the signal if the state is MTIO_INSERTED 8644 * to allow the target to recover 8645 */ 8646 if (state != un->un_specified_mediastate) { 8647 un->un_mediastate = state; 8648 if (state == MTIO_INSERTED) { 8649 /* 8650 * delay the signal to give the drive a chance 8651 * to do what it apparently needs to do 8652 */ 8653 ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, 8654 "st_media_watch_cb:delayed cv_broadcast\n"); 8655 un->un_delay_tid = timeout(st_delayed_cv_broadcast, 8656 un, drv_usectohz((clock_t)MEDIA_ACCESS_DELAY)); 8657 } else { 8658 ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, 8659 "st_media_watch_cb:immediate cv_broadcast\n"); 8660 cv_broadcast(&un->un_state_cv); 8661 } 8662 } 8663 mutex_exit(ST_MUTEX); 8664 return (0); 8665} 8666 8667/* 8668 * delayed cv_broadcast to allow for target to recover 8669 * from media insertion 8670 */ 8671static void 8672st_delayed_cv_broadcast(void *arg) 8673{ 8674 struct scsi_tape *un = arg; 8675 8676 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 8677 "st_delayed_cv_broadcast:delayed cv_broadcast\n"); 8678 8679 mutex_enter(ST_MUTEX); 8680 cv_broadcast(&un->un_state_cv); 8681 mutex_exit(ST_MUTEX); 8682} 8683 8684/* 8685 * restart cmd currently at the start of the waitq 8686 */ 8687static void 8688st_start_restart(void *arg) 8689{ 8690 struct scsi_tape *un = arg; 8691 8692 ASSERT(un != NULL); 8693 8694 mutex_enter(ST_MUTEX); 8695 8696 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 8697 "st_tran_restart()\n"); 8698 8699 if (un->un_quef) { 8700 st_start(un); 8701 } 8702 8703 mutex_exit(ST_MUTEX); 8704} 8705 8706 8707/* 8708 * Command completion processing 8709 * 8710 */ 8711static void 8712st_intr(struct scsi_pkt *pkt) 8713{ 8714 struct scsi_tape *un; 8715 struct buf *last_runqf; 8716 struct buf *bp; 8717 int action = COMMAND_DONE; 8718 clock_t timout; 8719 int status; 8720 8721 bp = (struct buf *)pkt->pkt_private; 8722 un = ddi_get_soft_state(st_state, MTUNIT(bp->b_edev)); 8723 8724 mutex_enter(ST_MUTEX); 8725 8726 un->un_rqs_state &= ~(ST_RQS_ERROR); 8727 8728 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, "st_intr()\n"); 8729 8730 if (pkt->pkt_reason != CMD_CMPLT) { 8731 8732 /* If device has gone away not much else to do */ 8733 if (pkt->pkt_reason == CMD_DEV_GONE) { 8734 action = COMMAND_DONE_ERROR; 8735 } else if (un->un_state == ST_STATE_SENSING) { 8736 ST_DO_ERRSTATS(un, st_transerrs); 8737 action = COMMAND_DONE_ERROR; 8738 } else { 8739 action = st_handle_incomplete(un, bp); 8740 } 8741 /* 8742 * At this point we know that the command was successfully 8743 * completed. Now what? 8744 */ 8745 } else if (un->un_arq_enabled && 8746 (pkt->pkt_state & STATE_ARQ_DONE)) { 8747 /* 8748 * the transport layer successfully completed an autorqsense 8749 */ 8750 action = st_handle_autosense(un, bp); 8751 8752 } else if (un->un_state == ST_STATE_SENSING) { 8753 /* 8754 * okay. We were running a REQUEST SENSE. Find 8755 * out what to do next. 8756 * some actions are based on un_state, hence 8757 * restore the state st was in before ST_STATE_SENSING. 8758 */ 8759 un->un_state = un->un_laststate; 8760 action = st_handle_sense(un, bp); 8761 /* 8762 * set pkt back to original packet in case we will have 8763 * to requeue it 8764 */ 8765 pkt = BP_PKT(bp); 8766 } else if ((SCBP(pkt)->sts_busy) || (SCBP(pkt)->sts_chk)) { 8767 /* 8768 * Okay, we weren't running a REQUEST SENSE. Call a routine 8769 * to see if the status bits we're okay. If a request sense 8770 * is to be run, that will happen. 8771 */ 8772 action = st_check_error(un, pkt); 8773 } 8774 8775 if (un->un_pwr_mgmt == ST_PWR_SUSPENDED) { 8776 switch (action) { 8777 case QUE_COMMAND: 8778 /* 8779 * return cmd to head to the queue 8780 * since we are suspending so that 8781 * it gets restarted during resume 8782 */ 8783 if (un->un_runqf) { 8784 last_runqf = un->un_runqf; 8785 un->un_runqf = bp; 8786 bp->b_actf = last_runqf; 8787 } else { 8788 bp->b_actf = NULL; 8789 un->un_runqf = bp; 8790 un->un_runql = bp; 8791 } 8792 action = JUST_RETURN; 8793 break; 8794 8795 case QUE_SENSE: 8796 action = COMMAND_DONE_ERROR; 8797 break; 8798 8799 default: 8800 break; 8801 } 8802 } 8803 8804 /* 8805 * Restore old state if we were sensing. 8806 */ 8807 if (un->un_state == ST_STATE_SENSING && action != QUE_SENSE) { 8808 un->un_state = un->un_laststate; 8809 } 8810 8811 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 8812 "st_intr: pkt=%p, bp=%p, action=%x, status=%x\n", 8813 (void *)pkt, (void *)bp, action, SCBP_C(pkt)); 8814 8815 8816 switch (action) { 8817 case COMMAND_DONE_EACCES: 8818 /* this is to report a reservation conflict */ 8819 st_bioerror(bp, EACCES); 8820 ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG, 8821 "Reservation Conflict \n"); 8822 8823 /*FALLTHROUGH*/ 8824 case COMMAND_DONE_ERROR: 8825 if (un->un_eof < ST_EOT_PENDING && 8826 un->un_state >= ST_STATE_OPEN) { 8827 /* 8828 * all errors set state of the tape to 'unknown' 8829 * unless we're at EOT or are doing append testing. 8830 * If sense key was illegal request, preserve state. 8831 */ 8832 if (un->un_status != KEY_ILLEGAL_REQUEST) { 8833 un->un_fileno = -1; 8834 } 8835 } 8836 un->un_err_resid = bp->b_resid = bp->b_bcount; 8837 /* 8838 * since we have an error (COMMAND_DONE_ERROR), we want to 8839 * make sure an error ocurrs, so make sure at least EIO is 8840 * returned 8841 */ 8842 if (geterror(bp) == 0) 8843 st_bioerror(bp, EIO); 8844 8845 SET_PE_FLAG(un); 8846 if (!(un->un_rqs_state & ST_RQS_ERROR) && 8847 (un->un_errno == EIO)) { 8848 un->un_rqs_state &= ~(ST_RQS_VALID); 8849 } 8850 goto done; 8851 8852 case COMMAND_DONE_ERROR_RECOVERED: 8853 un->un_err_resid = bp->b_resid = bp->b_bcount; 8854 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 8855 "st_intr(): COMMAND_DONE_ERROR_RECOVERED"); 8856 if (geterror(bp) == 0) 8857 st_bioerror(bp, EIO); 8858 SET_PE_FLAG(un); 8859 if (!(un->un_rqs_state & ST_RQS_ERROR) && 8860 (un->un_errno == EIO)) { 8861 un->un_rqs_state &= ~(ST_RQS_VALID); 8862 } 8863 /*FALLTHROUGH*/ 8864 case COMMAND_DONE: 8865 st_set_state(un); 8866done: 8867 ST_DO_KSTATS(bp, kstat_runq_exit); 8868 st_done_and_mutex_exit(un, bp); 8869 return; 8870 8871 case QUE_SENSE: 8872 if ((un->un_ncmds > 1) && !un->un_flush_on_errors) 8873 goto sense_error; 8874 8875 if (un->un_state != ST_STATE_SENSING) { 8876 un->un_laststate = un->un_state; 8877 un->un_state = ST_STATE_SENSING; 8878 } 8879 8880 un->un_rqs->pkt_private = (opaque_t)bp; 8881 bzero(ST_RQSENSE, SENSE_LENGTH); 8882 8883 if (un->un_throttle) { 8884 un->un_last_throttle = un->un_throttle; 8885 un->un_throttle = 0; 8886 } 8887 8888 mutex_exit(ST_MUTEX); 8889 8890 /* 8891 * never retry this, some other command will have nuked the 8892 * sense, anyway 8893 */ 8894 status = scsi_transport(un->un_rqs); 8895 8896 mutex_enter(ST_MUTEX); 8897 8898 if (un->un_last_throttle) { 8899 un->un_throttle = un->un_last_throttle; 8900 } 8901 8902 if (status == TRAN_ACCEPT) { 8903 mutex_exit(ST_MUTEX); 8904 return; 8905 } 8906 if (status != TRAN_BUSY) 8907 ST_DO_ERRSTATS(un, st_transerrs); 8908sense_error: 8909 un->un_fileno = -1; 8910 st_bioerror(bp, EIO); 8911 SET_PE_FLAG(un); 8912 goto done; 8913 8914 case QUE_BUSY_COMMAND: 8915 /* longish timeout */ 8916 timout = ST_STATUS_BUSY_TIMEOUT; 8917 goto que_it_up; 8918 8919 case QUE_COMMAND: 8920 /* short timeout */ 8921 timout = ST_TRAN_BUSY_TIMEOUT; 8922que_it_up: 8923 /* 8924 * let st_handle_intr_busy put this bp back on waitq and make 8925 * checks to see if it is ok to requeue the command. 8926 */ 8927 ST_DO_KSTATS(bp, kstat_runq_back_to_waitq); 8928 8929 /* 8930 * Save the throttle before setting up the timeout 8931 */ 8932 if (un->un_throttle) { 8933 un->un_last_throttle = un->un_throttle; 8934 } 8935 mutex_exit(ST_MUTEX); 8936 if (st_handle_intr_busy(un, bp, timout) == 0) 8937 return; /* timeout is setup again */ 8938 8939 mutex_enter(ST_MUTEX); 8940 un->un_fileno = -1; 8941 un->un_err_resid = bp->b_resid = bp->b_bcount; 8942 st_bioerror(bp, EIO); 8943 SET_PE_FLAG(un); 8944 goto done; 8945 8946 case QUE_LAST_COMMAND: 8947 8948 if ((un->un_ncmds > 1) && !un->un_flush_on_errors) { 8949 scsi_log(ST_DEVINFO, st_label, CE_CONT, 8950 "un_ncmds: %d can't retry cmd \n", un->un_ncmds); 8951 goto last_command_error; 8952 } 8953 mutex_exit(ST_MUTEX); 8954 if (st_handle_intr_retry_lcmd(un, bp) == 0) 8955 return; 8956 mutex_enter(ST_MUTEX); 8957last_command_error: 8958 un->un_err_resid = bp->b_resid = bp->b_bcount; 8959 un->un_fileno = -1; 8960 st_bioerror(bp, EIO); 8961 SET_PE_FLAG(un); 8962 goto done; 8963 8964 case JUST_RETURN: 8965 default: 8966 ST_DO_KSTATS(bp, kstat_runq_back_to_waitq); 8967 mutex_exit(ST_MUTEX); 8968 return; 8969 } 8970 /*NOTREACHED*/ 8971} 8972 8973static int 8974st_handle_incomplete(struct scsi_tape *un, struct buf *bp) 8975{ 8976 static char *fail = "SCSI transport failed: reason '%s': %s\n"; 8977 int rval = COMMAND_DONE_ERROR; 8978 struct scsi_pkt *pkt = (un->un_state == ST_STATE_SENSING) ? 8979 un->un_rqs : BP_PKT(bp); 8980 int result; 8981 8982 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 8983 "st_handle_incomplete(): dev = 0x%lx\n", un->un_dev); 8984 8985 ASSERT(mutex_owned(ST_MUTEX)); 8986 8987 switch (pkt->pkt_reason) { 8988 case CMD_INCOMPLETE: /* tran stopped with not normal state */ 8989 /* 8990 * this occurs when accessing a powered down drive, no 8991 * need to complain; just fail the open 8992 */ 8993#ifdef STDEBUG 8994 if (st_debug >= 1) { 8995 st_clean_print(ST_DEVINFO, st_label, CE_WARN, 8996 "Failed CDB", (char *)pkt->pkt_cdbp, CDB_SIZE); 8997 } 8998 8999#endif 9000 /* 9001 * if we have commands outstanding in HBA, and a command 9002 * comes back incomplete, we're hosed, so reset target 9003 * If we have the bus, but cmd_incomplete, we probably just 9004 * have a failed selection, so don't reset the target, just 9005 * requeue the command and try again 9006 */ 9007 if ((un->un_ncmds > 1) || (pkt->pkt_state != STATE_GOT_BUS)) { 9008 goto reset_target; 9009 } 9010 9011 /* 9012 * Retry selection a couple more times if we're 9013 * open. If opening, we only try just once to 9014 * reduce probe time for nonexistant devices. 9015 */ 9016 if ((un->un_laststate > ST_STATE_OPENING) && 9017 ((int)un->un_retry_ct < st_selection_retry_count)) { 9018 rval = QUE_COMMAND; 9019 } 9020 ST_DO_ERRSTATS(un, st_transerrs); 9021 break; 9022 9023 case CMD_ABORTED: 9024 /* 9025 * most likely this is caused by flush-on-error support. If 9026 * it was not there, the we're in trouble. 9027 */ 9028 if (!un->un_flush_on_errors) { 9029 un->un_status = SUN_KEY_FATAL; 9030 goto reset_target; 9031 } 9032 9033 st_set_pe_errno(un); 9034 bioerror(bp, un->un_errno); 9035 if (un->un_errno) 9036 return (COMMAND_DONE_ERROR); 9037 else 9038 return (COMMAND_DONE); 9039 9040 case CMD_TIMEOUT: /* Command timed out */ 9041 un->un_status = SUN_KEY_TIMEOUT; 9042 9043 /*FALLTHROUGH*/ 9044 default: 9045reset_target: 9046 ST_DEBUG6(ST_DEVINFO, st_label, CE_WARN, 9047 "transport completed with %s\n", 9048 scsi_rname(pkt->pkt_reason)); 9049 ST_DO_ERRSTATS(un, st_transerrs); 9050 if ((pkt->pkt_state & STATE_GOT_TARGET) && 9051 ((pkt->pkt_statistics & (STAT_BUS_RESET | STAT_DEV_RESET | 9052 STAT_ABORTED)) == 0)) { 9053 9054 /* 9055 * If we haven't reserved the drive don't reset it. 9056 */ 9057 if ((un->un_rsvd_status & 9058 (ST_RESERVE | ST_APPLICATION_RESERVATIONS)) == 0) { 9059 return (rval); 9060 } 9061 9062 mutex_exit(ST_MUTEX); 9063 9064 result = scsi_reset(ROUTE, RESET_TARGET); 9065 /* 9066 * if target reset fails, then pull the chain 9067 */ 9068 if (result == 0) { 9069 result = scsi_reset(ROUTE, RESET_ALL); 9070 } 9071 mutex_enter(ST_MUTEX); 9072 9073 if ((result == 0) && (un->un_state >= ST_STATE_OPEN)) { 9074 /* no hope left to recover */ 9075 scsi_log(ST_DEVINFO, st_label, CE_WARN, 9076 "recovery by resets failed\n"); 9077 return (rval); 9078 } 9079 } 9080 } 9081 9082 if ((pkt->pkt_reason == CMD_RESET) || (pkt->pkt_statistics & 9083 (STAT_BUS_RESET | STAT_DEV_RESET))) { 9084 if ((un->un_rsvd_status & ST_RESERVE)) { 9085 un->un_rsvd_status |= ST_LOST_RESERVE; 9086 ST_DEBUG3(ST_DEVINFO, st_label, CE_WARN, 9087 "Lost Reservation\n"); 9088 } 9089 } 9090 9091 if ((int)un->un_retry_ct++ < st_retry_count) { 9092 if (un->un_pwr_mgmt == ST_PWR_SUSPENDED) { 9093 rval = QUE_COMMAND; 9094 } else if (bp == un->un_sbufp) { 9095 switch ((uchar_t)(uintptr_t)bp->b_forw) { 9096 case SCMD_MODE_SENSE: 9097 case SCMD_MODE_SELECT: 9098 case SCMD_READ_BLKLIM: 9099 case SCMD_REWIND: 9100 case SCMD_LOAD: 9101 case SCMD_TEST_UNIT_READY: 9102 /* 9103 * These commands can be rerun with impunity 9104 */ 9105 rval = QUE_COMMAND; 9106 break; 9107 9108 default: 9109 break; 9110 } 9111 } 9112 } else { 9113 rval = COMMAND_DONE_ERROR; 9114 } 9115 9116 if (un->un_state >= ST_STATE_OPEN) { 9117 scsi_log(ST_DEVINFO, st_label, CE_WARN, 9118 fail, scsi_rname(pkt->pkt_reason), 9119 (rval == COMMAND_DONE_ERROR)? 9120 "giving up" : "retrying command"); 9121 } 9122 return (rval); 9123} 9124 9125/* 9126 * if the device is busy, then put this bp back on the waitq, on the 9127 * interrupt thread, where we want the head of the queue and not the 9128 * end 9129 * 9130 * The callers of this routine should take measures to save the 9131 * un_throttle in un_last_throttle which will be restored in 9132 * st_intr_restart(). The only exception should be st_intr_restart() 9133 * calling this routine for which the saving is already done. 9134 */ 9135static int 9136st_handle_intr_busy(struct scsi_tape *un, struct buf *bp, 9137 clock_t timeout_interval) 9138{ 9139 struct buf *last_quef; 9140 int rval = 0; 9141 9142 mutex_enter(ST_MUTEX); 9143 9144 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 9145 "st_handle_intr_busy(), un = 0x%p\n", (void *)un); 9146 9147 /* 9148 * Check to see if we hit the retry timeout. We check to make sure 9149 * this is the first one on the runq and make sure we have not 9150 * queued up any more, so this one has to be the last on the list 9151 * also. If it is not, we have to fail. If it is not the first, but 9152 * is the last we are in trouble anyway, as we are in the interrupt 9153 * context here. 9154 */ 9155 if (((int)un->un_tran_retry_ct++ > st_retry_count) || 9156 ((un->un_runqf != bp) && (un->un_runql != bp))) { 9157 rval = -1; 9158 goto exit; 9159 } 9160 9161 /* put the bp back on the waitq */ 9162 if (un->un_quef) { 9163 last_quef = un->un_quef; 9164 un->un_quef = bp; 9165 bp->b_actf = last_quef; 9166 } else { 9167 bp->b_actf = NULL; 9168 un->un_quef = bp; 9169 un->un_quel = bp; 9170 } 9171 9172 /* 9173 * We know that this is the first and last on the runq at this time, 9174 * so we just nullify those two queues 9175 */ 9176 un->un_runqf = NULL; 9177 un->un_runql = NULL; 9178 9179 /* 9180 * We don't want any other commands being started in the mean time. 9181 * If start had just released mutex after putting something on the 9182 * runq, we won't even get here. 9183 */ 9184 un->un_throttle = 0; 9185 9186 /* 9187 * send a marker pkt, if appropriate 9188 */ 9189 st_hba_unflush(un); 9190 9191 /* 9192 * all queues are aligned, we are just waiting to 9193 * transport 9194 */ 9195 un->un_hib_tid = timeout(st_intr_restart, un, timeout_interval); 9196 9197exit: 9198 mutex_exit(ST_MUTEX); 9199 return (rval); 9200} 9201 9202static int 9203st_handle_sense(struct scsi_tape *un, struct buf *bp) 9204{ 9205 struct scsi_pkt *rqpkt = un->un_rqs; 9206 int rval = COMMAND_DONE_ERROR; 9207 int amt; 9208 9209 ASSERT(mutex_owned(ST_MUTEX)); 9210 9211 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 9212 "st_handle_sense()\n"); 9213 9214 if (SCBP(rqpkt)->sts_busy) { 9215 ST_DEBUG4(ST_DEVINFO, st_label, CE_WARN, 9216 "busy unit on request sense\n"); 9217 if ((int)un->un_retry_ct++ < st_retry_count) { 9218 rval = QUE_BUSY_COMMAND; 9219 } 9220 return (rval); 9221 } else if (SCBP(rqpkt)->sts_chk) { 9222 ST_DEBUG6(ST_DEVINFO, st_label, CE_WARN, 9223 "Check Condition on REQUEST SENSE\n"); 9224 return (rval); 9225 } 9226 9227 /* was there enough data? */ 9228 amt = (int)SENSE_LENGTH - rqpkt->pkt_resid; 9229 if ((rqpkt->pkt_state & STATE_XFERRED_DATA) == 0 || 9230 (amt < SUN_MIN_SENSE_LENGTH)) { 9231 ST_DEBUG6(ST_DEVINFO, st_label, CE_WARN, 9232 "REQUEST SENSE couldn't get sense data\n"); 9233 return (rval); 9234 } 9235 return (st_decode_sense(un, bp, amt, SCBP(rqpkt))); 9236} 9237 9238static int 9239st_handle_autosense(struct scsi_tape *un, struct buf *bp) 9240{ 9241 struct scsi_pkt *pkt = BP_PKT(bp); 9242 struct scsi_arq_status *arqstat = 9243 (struct scsi_arq_status *)pkt->pkt_scbp; 9244 int rval = COMMAND_DONE_ERROR; 9245 int amt; 9246 9247 ASSERT(mutex_owned(ST_MUTEX)); 9248 9249 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 9250 "st_handle_autosense()\n"); 9251 9252 if (arqstat->sts_rqpkt_status.sts_busy) { 9253 ST_DEBUG4(ST_DEVINFO, st_label, CE_WARN, 9254 "busy unit on request sense\n"); 9255 /* 9256 * we return QUE_SENSE so st_intr will setup the SENSE cmd. 9257 * the disadvantage is that we do not have any delay for the 9258 * second retry of rqsense and we have to keep a packet around 9259 */ 9260 return (QUE_SENSE); 9261 9262 } else if (arqstat->sts_rqpkt_reason != CMD_CMPLT) { 9263 ST_DEBUG6(ST_DEVINFO, st_label, CE_WARN, 9264 "transport error on REQUEST SENSE\n"); 9265 if ((arqstat->sts_rqpkt_state & STATE_GOT_TARGET) && 9266 ((arqstat->sts_rqpkt_statistics & 9267 (STAT_BUS_RESET | STAT_DEV_RESET | STAT_ABORTED)) == 0)) { 9268 mutex_exit(ST_MUTEX); 9269 if (scsi_reset(ROUTE, RESET_TARGET) == 0) { 9270 /* 9271 * if target reset fails, then pull the chain 9272 */ 9273 if (scsi_reset(ROUTE, RESET_ALL) == 0) { 9274 ST_DEBUG6(ST_DEVINFO, st_label, 9275 CE_WARN, 9276 "recovery by resets failed\n"); 9277 } 9278 } 9279 mutex_enter(ST_MUTEX); 9280 } 9281 return (rval); 9282 9283 } else if (arqstat->sts_rqpkt_status.sts_chk) { 9284 ST_DEBUG6(ST_DEVINFO, st_label, CE_WARN, 9285 "Check Condition on REQUEST SENSE\n"); 9286 return (rval); 9287 } 9288 9289 9290 /* was there enough data? */ 9291 amt = (int)SENSE_LENGTH - arqstat->sts_rqpkt_resid; 9292 if ((arqstat->sts_rqpkt_state & STATE_XFERRED_DATA) == 0 || 9293 (amt < SUN_MIN_SENSE_LENGTH)) { 9294 ST_DEBUG6(ST_DEVINFO, st_label, CE_WARN, 9295 "REQUEST SENSE couldn't get sense data\n"); 9296 return (rval); 9297 } 9298 9299 bcopy(&arqstat->sts_sensedata, ST_RQSENSE, SENSE_LENGTH); 9300 9301 return (st_decode_sense(un, bp, amt, &arqstat->sts_rqpkt_status)); 9302} 9303 9304static int 9305st_decode_sense(struct scsi_tape *un, struct buf *bp, int amt, 9306 struct scsi_status *statusp) 9307{ 9308 struct scsi_pkt *pkt = BP_PKT(bp); 9309 int rval = COMMAND_DONE_ERROR; 9310 long resid; 9311 struct scsi_extended_sense *sensep = ST_RQSENSE; 9312 int severity; 9313 int get_error; 9314 9315 ASSERT(mutex_owned(ST_MUTEX)); 9316 9317 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 9318 "st_decode_sense()\n"); 9319 9320 /* 9321 * For uscsi commands, squirrel away a copy of the 9322 * results of the Request Sense. 9323 */ 9324 if (USCSI_CMD(bp)) { 9325 struct uscsi_cmd *ucmd = BP_UCMD(bp); 9326 ucmd->uscsi_rqstatus = *(uchar_t *)statusp; 9327 if (ucmd->uscsi_rqlen && un->un_srqbufp) { 9328 uchar_t rqlen = min((uchar_t)amt, ucmd->uscsi_rqlen); 9329 ucmd->uscsi_rqresid = ucmd->uscsi_rqlen - rqlen; 9330 bcopy(ST_RQSENSE, un->un_srqbufp, rqlen); 9331 ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, 9332 "st_decode_sense: stat=0x%x resid=0x%x\n", 9333 ucmd->uscsi_rqstatus, ucmd->uscsi_rqresid); 9334 } 9335 } 9336 9337 /* 9338 * If the drive is an MT-02, reposition the 9339 * secondary error code into the proper place. 9340 * 9341 * XXX MT-02 is non-CCS tape, so secondary error code 9342 * is in byte 8. However, in SCSI-2, tape has CCS definition 9343 * so it's in byte 12. 9344 */ 9345 if (un->un_dp->type == ST_TYPE_EMULEX) { 9346 sensep->es_code = sensep->es_add_info[0]; 9347 } 9348 9349 /* for normal I/O check extract the resid values. */ 9350 if (bp != un->un_sbufp) { 9351 if (sensep->es_valid) { 9352 resid = (sensep->es_info_1 << 24) | 9353 (sensep->es_info_2 << 16) | 9354 (sensep->es_info_3 << 8) | 9355 (sensep->es_info_4); 9356 if (un->un_bsize) { 9357 resid *= un->un_bsize; 9358 } 9359 } else if (pkt->pkt_state & STATE_XFERRED_DATA) { 9360 resid = pkt->pkt_resid; 9361 } else { 9362 resid = bp->b_bcount; 9363 } 9364 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 9365 "st_handle_sense (rw): xferred bit = %d, resid=%ld (%d), " 9366 "pkt_resid=%ld\n", pkt->pkt_state & STATE_XFERRED_DATA, 9367 resid, 9368 (sensep->es_info_1 << 24) | 9369 (sensep->es_info_2 << 16) | 9370 (sensep->es_info_3 << 8) | 9371 (sensep->es_info_4), 9372 pkt->pkt_resid); 9373 /* 9374 * The problem is, what should we believe? 9375 */ 9376 if (resid && (pkt->pkt_resid == 0)) { 9377 pkt->pkt_resid = resid; 9378 } 9379 } else { 9380 /* 9381 * If the command is SCMD_SPACE, we need to get the 9382 * residual as returned in the sense data, to adjust 9383 * our idea of current tape position correctly 9384 */ 9385 if ((CDBP(pkt)->scc_cmd == SCMD_SPACE || 9386 CDBP(pkt)->scc_cmd == SCMD_WRITE_FILE_MARK) && 9387 (sensep->es_valid)) { 9388 resid = (sensep->es_info_1 << 24) | 9389 (sensep->es_info_2 << 16) | 9390 (sensep->es_info_3 << 8) | 9391 (sensep->es_info_4); 9392 bp->b_resid = resid; 9393 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 9394 "st_handle_sense(other): resid=%ld\n", 9395 resid); 9396 } else { 9397 /* 9398 * If the special command is SCMD_READ, 9399 * the correct resid will be set later. 9400 */ 9401 resid = bp->b_bcount; 9402 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 9403 "st_handle_sense(special read): resid=%ld\n", 9404 resid); 9405 } 9406 } 9407 9408 if ((un->un_state >= ST_STATE_OPEN) && 9409 (DEBUGGING || st_error_level == SCSI_ERR_ALL)) { 9410 st_clean_print(ST_DEVINFO, st_label, CE_NOTE, 9411 "Failed CDB", (char *)pkt->pkt_cdbp, CDB_SIZE); 9412 st_clean_print(ST_DEVINFO, st_label, CE_CONT, 9413 "sense data", (char *)sensep, amt); 9414 scsi_log(ST_DEVINFO, st_label, CE_CONT, 9415 "count 0x%lx resid 0x%lx pktresid 0x%lx\n", 9416 bp->b_bcount, resid, pkt->pkt_resid); 9417 } 9418 9419 switch (un->un_status = sensep->es_key) { 9420 case KEY_NO_SENSE: 9421 severity = SCSI_ERR_INFO; 9422 goto common; 9423 9424 case KEY_RECOVERABLE_ERROR: 9425 severity = SCSI_ERR_RECOVERED; 9426 if ((sensep->es_class == CLASS_EXTENDED_SENSE) && 9427 (sensep->es_code == ST_DEFERRED_ERROR)) { 9428 if (un->un_dp->options & 9429 ST_RETRY_ON_RECOVERED_DEFERRED_ERROR) { 9430 rval = QUE_LAST_COMMAND; 9431 scsi_errmsg(ST_SCSI_DEVP, pkt, st_label, severity, 9432 un->un_blkno, un->un_err_blkno, scsi_cmds, 9433 sensep); 9434 scsi_log(ST_DEVINFO, st_label, CE_CONT, 9435 "Command will be retried\n"); 9436 } else { 9437 severity = SCSI_ERR_FATAL; 9438 rval = COMMAND_DONE_ERROR_RECOVERED; 9439 ST_DO_ERRSTATS(un, st_softerrs); 9440 scsi_errmsg(ST_SCSI_DEVP, pkt, st_label, severity, 9441 un->un_blkno, un->un_err_blkno, scsi_cmds, 9442 sensep); 9443 } 9444 break; 9445 } 9446common: 9447 /* 9448 * XXX only want reads to be stopped by filemarks. 9449 * Don't want them to be stopped by EOT. EOT matters 9450 * only on write. 9451 */ 9452 if (sensep->es_filmk && !sensep->es_eom) { 9453 rval = COMMAND_DONE; 9454 } else if (sensep->es_eom) { 9455 rval = COMMAND_DONE; 9456 } else if (sensep->es_ili) { 9457 /* 9458 * Fun with variable length record devices: 9459 * for specifying larger blocks sizes than the 9460 * actual physical record size. 9461 */ 9462 if (un->un_bsize == 0 && resid > 0) { 9463 /* 9464 * XXX! Ugly. 9465 * The requested blocksize is > tape blocksize, 9466 * so this is ok, so we just return the 9467 * actual size xferred. 9468 */ 9469 pkt->pkt_resid = resid; 9470 rval = COMMAND_DONE; 9471 } else if (un->un_bsize == 0 && resid < 0) { 9472 /* 9473 * The requested blocksize is < tape blocksize, 9474 * so this is not ok, so we err with ENOMEM 9475 */ 9476 rval = COMMAND_DONE_ERROR_RECOVERED; 9477 st_bioerror(bp, ENOMEM); 9478 } else { 9479 ST_DO_ERRSTATS(un, st_softerrs); 9480 severity = SCSI_ERR_FATAL; 9481 rval = COMMAND_DONE_ERROR; 9482 st_bioerror(bp, EINVAL); 9483 } 9484 } else { 9485 /* 9486 * we hope and pray for this just being 9487 * something we can ignore (ie. a 9488 * truly recoverable soft error) 9489 */ 9490 rval = COMMAND_DONE; 9491 } 9492 if (sensep->es_filmk) { 9493 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 9494 "filemark\n"); 9495 un->un_status = SUN_KEY_EOF; 9496 un->un_eof = ST_EOF_PENDING; 9497 SET_PE_FLAG(un); 9498 } 9499 9500 /* 9501 * ignore eom when reading, a fmk should terminate reading 9502 */ 9503 if ((sensep->es_eom) && 9504 (CDBP(pkt)->scc_cmd != SCMD_READ)) { 9505 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, "eom\n"); 9506 un->un_status = SUN_KEY_EOT; 9507 un->un_eof = ST_EOM; 9508 SET_PE_FLAG(un); 9509 } 9510 9511 break; 9512 9513 case KEY_ILLEGAL_REQUEST: 9514 9515 if (un->un_laststate >= ST_STATE_OPEN) { 9516 ST_DO_ERRSTATS(un, st_softerrs); 9517 severity = SCSI_ERR_FATAL; 9518 } else { 9519 severity = SCSI_ERR_INFO; 9520 } 9521 break; 9522 9523 case KEY_MEDIUM_ERROR: 9524 ST_DO_ERRSTATS(un, st_harderrs); 9525 severity = SCSI_ERR_FATAL; 9526 9527 /* 9528 * for (buffered) writes, a medium error must be fatal 9529 */ 9530 if (CDBP(pkt)->scc_cmd != SCMD_WRITE) { 9531 rval = COMMAND_DONE_ERROR_RECOVERED; 9532 } 9533 9534check_keys: 9535 /* 9536 * attempt to process the keys in the presence of 9537 * other errors 9538 */ 9539 if (sensep->es_ili && rval != COMMAND_DONE_ERROR) { 9540 /* 9541 * Fun with variable length record devices: 9542 * for specifying larger blocks sizes than the 9543 * actual physical record size. 9544 */ 9545 if (un->un_bsize == 0 && resid > 0) { 9546 /* 9547 * XXX! Ugly 9548 */ 9549 pkt->pkt_resid = resid; 9550 } else if (un->un_bsize == 0 && resid < 0) { 9551 st_bioerror(bp, EINVAL); 9552 } else { 9553 severity = SCSI_ERR_FATAL; 9554 rval = COMMAND_DONE_ERROR; 9555 st_bioerror(bp, EINVAL); 9556 } 9557 } 9558 if (sensep->es_filmk) { 9559 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 9560 "filemark\n"); 9561 un->un_status = SUN_KEY_EOF; 9562 un->un_eof = ST_EOF_PENDING; 9563 SET_PE_FLAG(un); 9564 } 9565 9566 /* 9567 * ignore eom when reading, a fmk should terminate reading 9568 */ 9569 if ((sensep->es_eom) && 9570 (CDBP(pkt)->scc_cmd != SCMD_READ)) { 9571 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, "eom\n"); 9572 un->un_status = SUN_KEY_EOT; 9573 un->un_eof = ST_EOM; 9574 SET_PE_FLAG(un); 9575 } 9576 9577 break; 9578 9579 case KEY_VOLUME_OVERFLOW: 9580 ST_DO_ERRSTATS(un, st_softerrs); 9581 un->un_eof = ST_EOM; 9582 severity = SCSI_ERR_FATAL; 9583 rval = COMMAND_DONE_ERROR; 9584 goto check_keys; 9585 9586 case KEY_HARDWARE_ERROR: 9587 ST_DO_ERRSTATS(un, st_harderrs); 9588 severity = SCSI_ERR_FATAL; 9589 rval = COMMAND_DONE_ERROR; 9590 if (un->un_dp->options & ST_EJECT_ON_CHANGER_FAILURE) 9591 un->un_eject_tape_on_failure = st_check_asc_ascq(un); 9592 break; 9593 9594 case KEY_BLANK_CHECK: 9595 ST_DO_ERRSTATS(un, st_softerrs); 9596 severity = SCSI_ERR_INFO; 9597 9598 /* 9599 * if not a special request and some data was xferred then it 9600 * it is not an error yet 9601 */ 9602 if (bp != un->un_sbufp && (bp->b_flags & B_READ)) { 9603 /* 9604 * no error for read with or without data xferred 9605 */ 9606 un->un_status = SUN_KEY_EOT; 9607 un->un_eof = ST_EOT; 9608 rval = COMMAND_DONE_ERROR; 9609 SET_PE_FLAG(un); 9610 goto check_keys; 9611 } else if (bp != un->un_sbufp && 9612 (pkt->pkt_state & STATE_XFERRED_DATA)) { 9613 rval = COMMAND_DONE; 9614 } else { 9615 rval = COMMAND_DONE_ERROR_RECOVERED; 9616 } 9617 9618 if (un->un_laststate >= ST_STATE_OPEN) { 9619 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 9620 "blank check\n"); 9621 un->un_eof = ST_EOM; 9622 } 9623 if ((CDBP(pkt)->scc_cmd == SCMD_SPACE) && 9624 (un->un_dp->options & ST_KNOWS_EOD) && 9625 (severity = SCSI_ERR_INFO)) { 9626 /* 9627 * we were doing a fast forward by skipping 9628 * multiple fmk at the time 9629 */ 9630 st_bioerror(bp, EIO); 9631 severity = SCSI_ERR_RECOVERED; 9632 rval = COMMAND_DONE; 9633 } 9634 SET_PE_FLAG(un); 9635 goto check_keys; 9636 9637 case KEY_WRITE_PROTECT: 9638 if (st_wrongtapetype(un)) { 9639 un->un_status = SUN_KEY_WRONGMEDIA; 9640 ST_DEBUG6(ST_DEVINFO, st_label, CE_WARN, 9641 "wrong tape for writing- use DC6150 tape (or equivalent)\n"); 9642 severity = SCSI_ERR_UNKNOWN; 9643 } else { 9644 severity = SCSI_ERR_FATAL; 9645 } 9646 ST_DO_ERRSTATS(un, st_harderrs); 9647 rval = COMMAND_DONE_ERROR; 9648 st_bioerror(bp, EACCES); 9649 break; 9650 9651 case KEY_UNIT_ATTENTION: 9652 ST_DEBUG6(ST_DEVINFO, st_label, CE_WARN, 9653 "KEY_UNIT_ATTENTION : un_state = %d\n", un->un_state); 9654 9655 /* 9656 * If we have detected a Bus Reset and the tape 9657 * drive has been reserved. 9658 */ 9659 if (ST_RQSENSE->es_add_code == 0x29 && 9660 (un->un_rsvd_status & ST_RESERVE)) { 9661 un->un_rsvd_status |= ST_LOST_RESERVE; 9662 ST_DEBUG(ST_DEVINFO, st_label, CE_WARN, 9663 "st_decode_sense: Lost Reservation\n"); 9664 } 9665 9666 if (un->un_state <= ST_STATE_OPENING) { 9667 /* 9668 * Look, the tape isn't open yet, now determine 9669 * if the cause is a BUS RESET, Save the file and 9670 * Block positions for the callers to recover from 9671 * the loss of position. 9672 */ 9673 if ((un->un_fileno >= 0) && 9674 (un->un_fileno || un->un_blkno)) { 9675 if (ST_RQSENSE->es_add_code == 0x29) { 9676 un->un_save_fileno = un->un_fileno; 9677 un->un_save_blkno = un->un_blkno; 9678 un->un_restore_pos = 1; 9679 } 9680 } 9681 9682 if ((int)un->un_retry_ct++ < st_retry_count) { 9683 rval = QUE_COMMAND; 9684 } else { 9685 rval = COMMAND_DONE_ERROR; 9686 } 9687 severity = SCSI_ERR_INFO; 9688 9689 } else { 9690 /* 9691 * Check if it is an Unexpected Unit Attention. 9692 * If state is >= ST_STATE_OPEN, we have 9693 * already done the initialization . 9694 * In this case it is Fatal Error 9695 * since no further reading/writing 9696 * can be done with fileno set to < 0. 9697 */ 9698 if (un->un_state >= ST_STATE_OPEN) { 9699 ST_DO_ERRSTATS(un, st_harderrs); 9700 severity = SCSI_ERR_FATAL; 9701 } else { 9702 severity = SCSI_ERR_INFO; 9703 } 9704 rval = COMMAND_DONE_ERROR; 9705 } 9706 un->un_fileno = -1; 9707 9708 break; 9709 9710 case KEY_NOT_READY: 9711 /* 9712 * If in process of getting ready retry. 9713 */ 9714 if (sensep->es_add_code == 0x04 && 9715 sensep->es_qual_code == 0x01 && 9716 un->un_retry_ct++ < st_retry_count) { 9717 rval = QUE_COMMAND; 9718 severity = SCSI_ERR_INFO; 9719 } else { 9720 /* give up */ 9721 rval = COMMAND_DONE_ERROR; 9722 severity = SCSI_ERR_FATAL; 9723 } 9724 9725 /* 9726 * If this was an error and after device opened 9727 * do error stats. 9728 */ 9729 if (rval == COMMAND_DONE_ERROR && 9730 un->un_state > ST_STATE_OPENING) { 9731 ST_DO_ERRSTATS(un, st_harderrs); 9732 } 9733 9734 if (ST_RQSENSE->es_add_code == 0x3a) { 9735 if (st_error_level >= SCSI_ERR_FATAL) 9736 scsi_log(ST_DEVINFO, st_label, CE_NOTE, 9737 "Tape not inserted in drive\n"); 9738 un->un_mediastate = MTIO_EJECTED; 9739 cv_broadcast(&un->un_state_cv); 9740 } 9741 if ((un->un_dp->options & ST_EJECT_ON_CHANGER_FAILURE) && 9742 (rval != QUE_COMMAND)) 9743 un->un_eject_tape_on_failure = st_check_asc_ascq(un); 9744 break; 9745 9746 case KEY_ABORTED_COMMAND: 9747 9748 /* 9749 * Probably a parity error... 9750 * if we retry here then this may cause data to be 9751 * written twice or data skipped during reading 9752 */ 9753 ST_DO_ERRSTATS(un, st_harderrs); 9754 severity = SCSI_ERR_FATAL; 9755 rval = COMMAND_DONE_ERROR; 9756 goto check_keys; 9757 9758 default: 9759 /* 9760 * Undecoded sense key. Try retries and hope 9761 * that will fix the problem. Otherwise, we're 9762 * dead. 9763 */ 9764 ST_DEBUG6(ST_DEVINFO, st_label, CE_WARN, 9765 "Unhandled Sense Key '%s'\n", 9766 sense_keys[un->un_status]); 9767 ST_DO_ERRSTATS(un, st_harderrs); 9768 severity = SCSI_ERR_FATAL; 9769 rval = COMMAND_DONE_ERROR; 9770 goto check_keys; 9771 } 9772 9773 if ((!(pkt->pkt_flags & FLAG_SILENT) && 9774 un->un_state >= ST_STATE_OPEN) && (DEBUGGING || 9775 (un->un_laststate > ST_STATE_OPENING) && 9776 (severity >= st_error_level))) { 9777 9778 scsi_errmsg(ST_SCSI_DEVP, pkt, st_label, severity, 9779 un->un_blkno, un->un_err_blkno, scsi_cmds, sensep); 9780 if (sensep->es_filmk) { 9781 scsi_log(ST_DEVINFO, st_label, CE_CONT, 9782 "File Mark Detected\n"); 9783 } 9784 if (sensep->es_eom) { 9785 scsi_log(ST_DEVINFO, st_label, CE_CONT, 9786 "End-of-Media Detected\n"); 9787 } 9788 if (sensep->es_ili) { 9789 scsi_log(ST_DEVINFO, st_label, CE_CONT, 9790 "Incorrect Length Indicator Set\n"); 9791 } 9792 } 9793 get_error = geterror(bp); 9794 if (((rval == COMMAND_DONE_ERROR) || 9795 (rval == COMMAND_DONE_ERROR_RECOVERED)) && 9796 ((get_error == EIO) || (get_error == 0))) { 9797 un->un_rqs_state |= (ST_RQS_ERROR | ST_RQS_VALID); 9798 bcopy(ST_RQSENSE, un->un_uscsi_rqs_buf, SENSE_LENGTH); 9799 if (un->un_rqs_state & ST_RQS_READ) { 9800 un->un_rqs_state &= ~(ST_RQS_READ); 9801 } else { 9802 un->un_rqs_state |= ST_RQS_OVR; 9803 } 9804 } 9805 9806 return (rval); 9807} 9808 9809 9810static int 9811st_handle_intr_retry_lcmd(struct scsi_tape *un, struct buf *bp) 9812{ 9813 int status = TRAN_ACCEPT; 9814 9815 mutex_enter(ST_MUTEX); 9816 9817 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 9818 "st_handle_intr_rtr_lcmd(), un = 0x%p\n", (void *)un); 9819 9820 /* 9821 * Check to see if we hit the retry timeout. We check to make sure 9822 * this is the first one on the runq and make sure we have not 9823 * queued up any more, so this one has to be the last on the list 9824 * also. If it is not, we have to fail. If it is not the first, but 9825 * is the last we are in trouble anyway, as we are in the interrupt 9826 * context here. 9827 */ 9828 if (((int)un->un_retry_ct > st_retry_count) || 9829 ((un->un_runqf != bp) && (un->un_runql != bp))) { 9830 goto exit; 9831 } 9832 9833 if (un->un_throttle) { 9834 un->un_last_throttle = un->un_throttle; 9835 un->un_throttle = 0; 9836 } 9837 9838 /* 9839 * Here we know : bp is the first and last one on the runq 9840 * it is not necessary to put it back on the head of the 9841 * waitq and then move from waitq to runq. Save this queuing 9842 * and call scsi_transport. 9843 */ 9844 9845 mutex_exit(ST_MUTEX); 9846 9847 status = scsi_transport(BP_PKT(bp)); 9848 9849 mutex_enter(ST_MUTEX); 9850 9851 if (status == TRAN_ACCEPT) { 9852 un->un_tran_retry_ct = 0; 9853 if (un->un_last_throttle) { 9854 un->un_throttle = un->un_last_throttle; 9855 } 9856 mutex_exit(ST_MUTEX); 9857 9858 ST_DEBUG6(ST_DEVINFO, st_label, CE_WARN, 9859 "restart transport \n"); 9860 return (0); 9861 } 9862 9863 ST_DO_KSTATS(bp, kstat_runq_back_to_waitq); 9864 mutex_exit(ST_MUTEX); 9865 9866 if (status == TRAN_BUSY) { 9867 if (st_handle_intr_busy(un, bp, 9868 ST_TRAN_BUSY_TIMEOUT) == 0) 9869 return (0); 9870 } 9871 ST_DEBUG6(ST_DEVINFO, st_label, CE_WARN, 9872 "restart transport rejected\n"); 9873 mutex_enter(ST_MUTEX); 9874 ST_DO_ERRSTATS(un, st_transerrs); 9875 if (un->un_last_throttle) { 9876 un->un_throttle = un->un_last_throttle; 9877 } 9878exit: 9879 mutex_exit(ST_MUTEX); 9880 return (-1); 9881} 9882 9883static int 9884st_wrongtapetype(struct scsi_tape *un) 9885{ 9886 9887 ASSERT(mutex_owned(ST_MUTEX)); 9888 9889 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 9890 "st_wrongtapetype()\n"); 9891 9892 /* 9893 * Hack to handle 600A, 600XTD, 6150 && 660 vs. 300XL tapes... 9894 */ 9895 if (un->un_dp && (un->un_dp->options & ST_QIC) && un->un_mspl) { 9896 switch (un->un_dp->type) { 9897 case ST_TYPE_WANGTEK: 9898 case ST_TYPE_ARCHIVE: 9899 /* 9900 * If this really worked, we could go off of 9901 * the density codes set in the modesense 9902 * page. For this drive, 0x10 == QIC-120, 9903 * 0xf == QIC-150, and 0x5 should be for 9904 * both QIC-24 and, maybe, QIC-11. However, 9905 * the h/w doesn't do what the manual says 9906 * that it should, so we'll key off of 9907 * getting a WRITE PROTECT error AND wp *not* 9908 * set in the mode sense information. 9909 */ 9910 /* 9911 * XXX but we already know that status is 9912 * write protect, so don't check it again. 9913 */ 9914 9915 if (un->un_status == KEY_WRITE_PROTECT && 9916 un->un_mspl->wp == 0) { 9917 return (1); 9918 } 9919 break; 9920 default: 9921 break; 9922 } 9923 } 9924 return (0); 9925} 9926 9927static int 9928st_check_error(struct scsi_tape *un, struct scsi_pkt *pkt) 9929{ 9930 int action; 9931 9932 ASSERT(mutex_owned(ST_MUTEX)); 9933 9934 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, "st_check_error()\n"); 9935 9936 if (SCBP_C(pkt) == STATUS_RESERVATION_CONFLICT) { 9937 action = COMMAND_DONE_EACCES; 9938 un->un_rsvd_status |= ST_RESERVATION_CONFLICT; 9939 } else if (SCBP(pkt)->sts_busy) { 9940 ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, "unit busy\n"); 9941 if ((int)un->un_retry_ct++ < st_retry_count) { 9942 action = QUE_BUSY_COMMAND; 9943 } else if ((un->un_rsvd_status & 9944 (ST_RESERVE | ST_APPLICATION_RESERVATIONS)) == 0) { 9945 /* 9946 * If this is a command done before reserve is done 9947 * don't reset. 9948 */ 9949 action = COMMAND_DONE_ERROR; 9950 } else { 9951 ST_DEBUG2(ST_DEVINFO, st_label, CE_WARN, 9952 "unit busy too long\n"); 9953 mutex_exit(ST_MUTEX); 9954 if (scsi_reset(ROUTE, RESET_TARGET) == 0) { 9955 (void) scsi_reset(ROUTE, RESET_ALL); 9956 } 9957 mutex_enter(ST_MUTEX); 9958 action = COMMAND_DONE_ERROR; 9959 } 9960 } else if (SCBP(pkt)->sts_chk) { 9961 /* 9962 * we should only get here if the auto rqsense failed 9963 * thru a uscsi cmd without autorequest sense 9964 * so we just try again 9965 */ 9966 action = QUE_SENSE; 9967 } else { 9968 action = COMMAND_DONE; 9969 } 9970 return (action); 9971} 9972 9973static void 9974st_calc_bnum(struct scsi_tape *un, struct buf *bp) 9975{ 9976 int n; 9977 9978 ASSERT(mutex_owned(ST_MUTEX)); 9979 9980 if (un->un_bsize == 0) { 9981 n = ((bp->b_bcount - bp->b_resid == 0) ? 0 : 1); 9982 un->un_kbytes_xferred += (bp->b_bcount - bp->b_resid)/1000; 9983 } else { 9984 n = ((bp->b_bcount - bp->b_resid) / un->un_bsize); 9985 } 9986 un->un_blkno += n; 9987} 9988 9989static void 9990st_set_state(struct scsi_tape *un) 9991{ 9992 struct buf *bp = un->un_runqf; 9993 struct scsi_pkt *sp = BP_PKT(bp); 9994 struct uscsi_cmd *ucmd; 9995 9996 ASSERT(mutex_owned(ST_MUTEX)); 9997 9998 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 9999 "st_set_state(): un_eof=%x fmneeded=%x pkt_resid=0x%lx (%ld)\n", 10000 un->un_eof, un->un_fmneeded, sp->pkt_resid, sp->pkt_resid); 10001 10002 if (bp != un->un_sbufp) { 10003#ifdef STDEBUG 10004 if (DEBUGGING && sp->pkt_resid) { 10005 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 10006 "pkt_resid %ld bcount %ld\n", 10007 sp->pkt_resid, bp->b_bcount); 10008 } 10009#endif 10010 bp->b_resid = sp->pkt_resid; 10011 st_calc_bnum(un, bp); 10012 if (bp->b_flags & B_READ) { 10013 un->un_lastop = ST_OP_READ; 10014 un->un_fmneeded = 0; 10015 } else { 10016 un->un_lastop = ST_OP_WRITE; 10017 if (un->un_dp->options & ST_REEL) { 10018 un->un_fmneeded = 2; 10019 } else { 10020 un->un_fmneeded = 1; 10021 } 10022 } 10023 /* 10024 * all is honky dory at this point, so let's 10025 * readjust the throttle, to increase speed, if we 10026 * have not throttled down. 10027 */ 10028 if (un->un_throttle) 10029 un->un_throttle = un->un_max_throttle; 10030 } else { 10031 char saved_lastop = un->un_lastop; 10032 uchar_t cmd = (uchar_t)(intptr_t)bp->b_forw; 10033 10034 un->un_lastop = ST_OP_CTL; 10035 10036 switch (cmd) { 10037 case SCMD_WRITE: 10038 bp->b_resid = sp->pkt_resid; 10039 un->un_lastop = ST_OP_WRITE; 10040 st_calc_bnum(un, bp); 10041 if (un->un_dp->options & ST_REEL) { 10042 un->un_fmneeded = 2; 10043 } else { 10044 un->un_fmneeded = 1; 10045 } 10046 break; 10047 case SCMD_READ: 10048 bp->b_resid = sp->pkt_resid; 10049 un->un_lastop = ST_OP_READ; 10050 st_calc_bnum(un, bp); 10051 un->un_fmneeded = 0; 10052 break; 10053 case SCMD_WRITE_FILE_MARK: 10054 if (un->un_eof != ST_EOM) 10055 un->un_eof = ST_NO_EOF; 10056 un->un_lastop = ST_OP_WEOF; 10057 un->un_fileno += (bp->b_bcount - bp->b_resid); 10058 un->un_blkno = 0; 10059 if (un->un_dp->options & ST_REEL) { 10060 un->un_fmneeded -= 10061 (bp->b_bcount - bp->b_resid); 10062 if (un->un_fmneeded < 0) { 10063 un->un_fmneeded = 0; 10064 } 10065 } else { 10066 un->un_fmneeded = 0; 10067 } 10068 10069 break; 10070 case SCMD_REWIND: 10071 un->un_eof = ST_NO_EOF; 10072 un->un_fileno = 0; 10073 un->un_blkno = 0; 10074 break; 10075 10076 case SCMD_SPACE: 10077 { 10078 int space_fmk, count; 10079 long resid; 10080 10081 count = (int)space_cnt(bp->b_bcount); 10082 resid = (long)space_cnt(bp->b_resid); 10083 space_fmk = ((bp->b_bcount) & (1<<24)) ? 1 : 0; 10084 10085 10086 if (count >= 0) { 10087 if (space_fmk) { 10088 if (un->un_eof <= ST_EOF) { 10089 un->un_eof = ST_NO_EOF; 10090 } 10091 un->un_fileno += (count - resid); 10092 un->un_blkno = 0; 10093 } else { 10094 un->un_blkno += count - resid; 10095 } 10096 } else if (count < 0) { 10097 if (space_fmk) { 10098 un->un_fileno -= 10099 ((-count) - resid); 10100 if (un->un_fileno < 0) { 10101 un->un_fileno = 0; 10102 un->un_blkno = 0; 10103 } else { 10104 un->un_blkno = INF; 10105 } 10106 } else { 10107 if (un->un_eof >= ST_EOF_PENDING) { 10108 /* 10109 * we stepped back into 10110 * a previous file; we are not 10111 * making an effort to pretend that 10112 * we are still in the current file 10113 * ie. logical == physical position 10114 * and leave it to st_ioctl to correct 10115 */ 10116 if (un->un_fileno > 0) { 10117 un->un_fileno--; 10118 un->un_blkno = INF; 10119 } else { 10120 un->un_blkno = 0; 10121 } 10122 } else { 10123 un->un_blkno -= 10124 (-count) - resid; 10125 } 10126 } 10127 } 10128 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 10129 "aft_space rs %ld fil %d blk %ld\n", 10130 resid, un->un_fileno, un->un_blkno); 10131 break; 10132 } 10133 case SCMD_LOAD: 10134 if (bp->b_bcount & 0x1) { 10135 un->un_fileno = 0; 10136 } else { 10137 un->un_state = ST_STATE_OFFLINE; 10138 un->un_fileno = -1; 10139 } 10140 un->un_density_known = 0; 10141 un->un_eof = ST_NO_EOF; 10142 un->un_blkno = 0; 10143 break; 10144 case SCMD_ERASE: 10145 un->un_eof = ST_NO_EOF; 10146 un->un_blkno = 0; 10147 un->un_fileno = 0; 10148 break; 10149 case SCMD_RESERVE: 10150 un->un_rsvd_status |= ST_RESERVE; 10151 un->un_rsvd_status &= 10152 ~(ST_RELEASE | ST_LOST_RESERVE | 10153 ST_RESERVATION_CONFLICT); 10154 un->un_lastop = saved_lastop; 10155 break; 10156 case SCMD_RELEASE: 10157 un->un_rsvd_status |= ST_RELEASE; 10158 un->un_rsvd_status &= 10159 ~(ST_RESERVE | ST_LOST_RESERVE | 10160 ST_RESERVATION_CONFLICT); 10161 un->un_lastop = saved_lastop; 10162 break; 10163 case SCMD_PERSISTENT_RESERVE_IN: 10164 ST_DEBUG6(ST_DEVINFO, st_label, CE_WARN, 10165 "PGR_IN command\n"); 10166 break; 10167 case SCMD_PERSISTENT_RESERVE_OUT: 10168 switch (sp->pkt_cdbp[1] & ST_SA_MASK) { 10169 case ST_SA_SCSI3_RESERVE: 10170 case ST_SA_SCSI3_PREEMPT: 10171 case ST_SA_SCSI3_PREEMPTANDABORT: 10172 un->un_rsvd_status |= 10173 ST_APPLICATION_RESERVATIONS; 10174 ST_DEBUG6(ST_DEVINFO, st_label, CE_WARN, 10175 "PGR Reserve and set: entering" 10176 " ST_APPLICATION_RESERVATIONS mode"); 10177 break; 10178 case ST_SA_SCSI3_RELEASE: 10179 case ST_SA_SCSI3_CLEAR: 10180 un->un_rsvd_status &= 10181 ~ST_APPLICATION_RESERVATIONS; 10182 ST_DEBUG6(ST_DEVINFO, st_label, CE_WARN, 10183 "PGR Release and reset: exiting" 10184 " ST_APPLICATION_RESERVATIONS mode"); 10185 break; 10186 } 10187 break; 10188 case SCMD_TEST_UNIT_READY: 10189 case SCMD_READ_BLKLIM: 10190 case SCMD_REQUEST_SENSE: 10191 case SCMD_INQUIRY: 10192 case SCMD_RECOVER_BUF: 10193 case SCMD_MODE_SELECT: 10194 case SCMD_MODE_SENSE: 10195 case SCMD_DOORLOCK: 10196 case SCMD_READ_POSITION: 10197 case SCMD_READ_BUFFER: 10198 case SCMD_REPORT_DENSITIES: 10199 case SCMD_LOG_SELECT_G1: 10200 case SCMD_LOG_SENSE_G1: 10201 case SCMD_REPORT_LUNS: 10202 case SCMD_READ_ATTRIBUTE: 10203 un->un_lastop = saved_lastop; 10204 break; 10205 case SCMD_LOCATE: /* Locate makes position unknown */ 10206 default: 10207 /* 10208 * Unknown command, If was USCSI and USCSI_SILENT 10209 * flag was not set, set position to unknown. 10210 */ 10211 if ((((ucmd = BP_UCMD(bp)) != NULL) && 10212 (ucmd->uscsi_flags & USCSI_SILENT) == 0)) { 10213 ST_DEBUG2(ST_DEVINFO, st_label, CE_WARN, 10214 "unknown cmd 0x%X caused loss of state\n", 10215 cmd); 10216 } else { 10217 break; 10218 } 10219 /* FALLTHROUGH */ 10220 case SCMD_WRITE_BUFFER: /* Writes new firmware to device */ 10221 un->un_fileno = -1; 10222 break; 10223 } 10224 } 10225 10226 /* 10227 * In the st driver we have a logical and physical file position. 10228 * Under BSD behavior, when you get a zero read, the logical position 10229 * is before the filemark but after the last record of the file. 10230 * The physical position is after the filemark. MTIOCGET should always 10231 * return the logical file position. 10232 * 10233 * The next read gives a silent skip to the next file. 10234 * Under SVR4, the logical file position remains before the filemark 10235 * until the file is closed or a space operation is performed. 10236 * Hence set err_resid and err_file before changing fileno if case 10237 * BSD Behaviour. 10238 */ 10239 un->un_err_resid = bp->b_resid; 10240 un->un_err_fileno = un->un_fileno; 10241 un->un_err_blkno = un->un_blkno; 10242 un->un_retry_ct = 0; 10243 10244 10245 /* 10246 * If we've seen a filemark via the last read operation 10247 * advance the file counter, but mark things such that 10248 * the next read operation gets a zero count. We have 10249 * to put this here to handle the case of sitting right 10250 * at the end of a tape file having seen the file mark, 10251 * but the tape is closed and then re-opened without 10252 * any further i/o. That is, the position information 10253 * must be updated before a close. 10254 */ 10255 10256 if (un->un_lastop == ST_OP_READ && un->un_eof == ST_EOF_PENDING) { 10257 /* 10258 * If we're a 1/2" tape, and we get a filemark 10259 * right on block 0, *AND* we were not in the 10260 * first file on the tape, and we've hit logical EOM. 10261 * We'll mark the state so that later we do the 10262 * right thing (in st_close(), st_strategy() or 10263 * st_ioctl()). 10264 * 10265 */ 10266 if ((un->un_dp->options & ST_REEL) && 10267 !(un->un_dp->options & ST_READ_IGNORE_EOFS) && 10268 un->un_blkno == 0 && un->un_fileno > 0) { 10269 un->un_eof = ST_EOT_PENDING; 10270 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 10271 "eot pending\n"); 10272 un->un_fileno++; 10273 un->un_blkno = 0; 10274 } else if (BSD_BEHAVIOR) { 10275 /* 10276 * If the read of the filemark was a side effect 10277 * of reading some blocks (i.e., data was actually 10278 * read), then the EOF mark is pending and the 10279 * bump into the next file awaits the next read 10280 * operation (which will return a zero count), or 10281 * a close or a space operation, else the bump 10282 * into the next file occurs now. 10283 */ 10284 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 10285 "resid=%lx, bcount=%lx\n", 10286 bp->b_resid, bp->b_bcount); 10287 if (bp->b_resid != bp->b_bcount) { 10288 un->un_eof = ST_EOF; 10289 } else { 10290 un->un_silent_skip = 1; 10291 un->un_eof = ST_NO_EOF; 10292 un->un_fileno++; 10293 un->un_save_blkno = un->un_blkno; 10294 un->un_blkno = 0; 10295 } 10296 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 10297 "eof of file %d, un_eof=%d\n", 10298 un->un_fileno, un->un_eof); 10299 } else if (SVR4_BEHAVIOR) { 10300 /* 10301 * If the read of the filemark was a side effect 10302 * of reading some blocks (i.e., data was actually 10303 * read), then the next read should return 0 10304 */ 10305 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 10306 "resid=%lx, bcount=%lx\n", 10307 bp->b_resid, bp->b_bcount); 10308 if (bp->b_resid == bp->b_bcount) { 10309 un->un_eof = ST_EOF; 10310 } 10311 ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, 10312 "eof of file=%d, un_eof=%d\n", 10313 un->un_fileno, un->un_eof); 10314 } 10315 } 10316} 10317 10318/* 10319 * set the correct un_errno, to take corner cases into consideration 10320 */ 10321static void 10322st_set_pe_errno(struct scsi_tape *un) 10323{ 10324 ASSERT(mutex_owned(ST_MUTEX)); 10325 10326 /* if errno is already set, don't reset it */ 10327 if (un->un_errno) 10328 return; 10329 10330 /* here un_errno == 0 */ 10331 /* 10332 * if the last transfer before flushing all the 10333 * waiting I/O's, was 0 (resid = count), then we 10334 * want to give the user an error on all the rest, 10335 * so here. If there was a transfer, we set the 10336 * resid and counts to 0, and let it drop through, 10337 * giving a zero return. the next I/O will then 10338 * give an error. 10339 */ 10340 if (un->un_last_resid == un->un_last_count) { 10341 switch (un->un_eof) { 10342 case ST_EOM: 10343 un->un_errno = ENOMEM; 10344 break; 10345 case ST_EOT: 10346 case ST_EOF: 10347 un->un_errno = EIO; 10348 break; 10349 } 10350 } else { 10351 /* 10352 * we know they did not have a zero, so make 10353 * sure they get one 10354 */ 10355 un->un_last_resid = un->un_last_count = 0; 10356 } 10357} 10358 10359 10360/* 10361 * send in a marker pkt to terminate flushing of commands by BBA (via 10362 * flush-on-errors) property. The HBA will always return TRAN_ACCEPT 10363 */ 10364static void 10365st_hba_unflush(struct scsi_tape *un) 10366{ 10367 ASSERT(mutex_owned(ST_MUTEX)); 10368 10369 if (!un->un_flush_on_errors) 10370 return; 10371 10372#ifdef FLUSH_ON_ERRORS 10373 10374 if (!un->un_mkr_pkt) { 10375 un->un_mkr_pkt = scsi_init_pkt(ROUTE, NULL, (struct buf *)NULL, 10376 NULL, 0, 0, 0, SLEEP_FUNC, NULL); 10377 10378 /* we slept, so it must be there */ 10379 pkt->pkt_flags |= FLAG_FLUSH_MARKER; 10380 } 10381 10382 mutex_exit(ST_MUTEX); 10383 scsi_transport(un->un_mkr_pkt); 10384 mutex_enter(ST_MUTEX); 10385#endif 10386} 10387 10388static void 10389st_clean_print(dev_info_t *dev, char *label, uint_t level, 10390 char *title, char *data, int len) 10391{ 10392 int i; 10393 char buf[256]; 10394 10395 (void) sprintf(buf, "%s: ", title); 10396 for (i = 0; i < len; i++) { 10397 (void) sprintf(&buf[(int)strlen(buf)], "0x%x ", 10398 (data[i] & 0xff)); 10399 } 10400 (void) sprintf(&buf[(int)strlen(buf)], "\n"); 10401 10402 scsi_log(dev, label, level, "%s", buf); 10403} 10404 10405/* 10406 * Conditionally enabled debugging 10407 */ 10408#ifdef STDEBUG 10409static void 10410st_debug_cmds(struct scsi_tape *un, int com, int count, int wait) 10411{ 10412 char tmpbuf[64]; 10413 10414 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 10415 "cmd=%s count=0x%x (%d) %ssync\n", 10416 scsi_cmd_name(com, scsi_cmds, tmpbuf), 10417 count, count, 10418 wait == ASYNC_CMD ? "a" : ""); 10419} 10420 10421/* 10422 * Returns pointer to name of minor node name of device 'dev'. 10423 */ 10424static char * 10425st_dev_name(dev_t dev) 10426{ 10427 const char density[] = { 'l', 'm', 'h', 'c' }; 10428 static char name[4]; 10429 minor_t minor; 10430 int nprt = 0; 10431 10432 minor = getminor(dev); 10433 name[nprt] = density[(minor & MT_DENSITY_MASK) >> 3]; 10434 10435 if (minor & MT_BSD) { 10436 name[++nprt] = 'b'; 10437 } 10438 10439 if (minor & MT_NOREWIND) { 10440 name[++nprt] = 'n'; 10441 } 10442 10443 /* NULL terminator */ 10444 name[++nprt] = 0; 10445 10446 return (name); 10447} 10448#endif /* STDEBUG */ 10449 10450/* 10451 * Soft error reporting, so far unique to each drive 10452 * 10453 * Currently supported: exabyte and DAT soft error reporting 10454 */ 10455static int 10456st_report_exabyte_soft_errors(dev_t dev, int flag) 10457{ 10458 uchar_t *sensep; 10459 int amt; 10460 int rval = 0; 10461 char cdb[CDB_GROUP0], *c = cdb; 10462 struct uscsi_cmd *com; 10463 10464 GET_SOFT_STATE(dev); 10465 10466 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 10467 "st_report_exabyte_soft_errors(dev = 0x%lx, flag = %d)\n", 10468 dev, flag); 10469 10470 ASSERT(mutex_owned(ST_MUTEX)); 10471 10472 com = kmem_zalloc(sizeof (*com), KM_SLEEP); 10473 sensep = kmem_zalloc(TAPE_SENSE_LENGTH, KM_SLEEP); 10474 10475 *c++ = SCMD_REQUEST_SENSE; 10476 *c++ = 0; 10477 *c++ = 0; 10478 *c++ = 0; 10479 *c++ = TAPE_SENSE_LENGTH; 10480 /* 10481 * set CLRCNT (byte 5, bit 7 which clears the error counts) 10482 */ 10483 *c = (char)0x80; 10484 10485 com->uscsi_cdb = cdb; 10486 com->uscsi_cdblen = CDB_GROUP0; 10487 com->uscsi_bufaddr = (caddr_t)sensep; 10488 com->uscsi_buflen = TAPE_SENSE_LENGTH; 10489 com->uscsi_flags = USCSI_DIAGNOSE | USCSI_SILENT 10490 | USCSI_READ | USCSI_RQENABLE; 10491 com->uscsi_timeout = un->un_dp->non_motion_timeout; 10492 10493 rval = st_ioctl_cmd(dev, com, UIO_SYSSPACE, UIO_SYSSPACE, 10494 UIO_SYSSPACE); 10495 if (rval || com->uscsi_status) { 10496 goto done; 10497 } 10498 10499 /* 10500 * was there enough data? 10501 */ 10502 amt = (int)TAPE_SENSE_LENGTH - com->uscsi_resid; 10503 10504 if ((amt >= 19) && un->un_kbytes_xferred) { 10505 uint_t count, error_rate; 10506 uint_t rate; 10507 10508 if (sensep[21] & CLN) { 10509 scsi_log(ST_DEVINFO, st_label, CE_WARN, 10510 "Periodic head cleaning required"); 10511 } 10512 if (un->un_kbytes_xferred < (EXABYTE_MIN_TRANSFER/1000)) 10513 goto done; 10514 /* 10515 * check if soft error reporting needs to be done. 10516 */ 10517 count = sensep[16] << 16 | sensep[17] << 8 | sensep[18]; 10518 count &= 0xffffff; 10519 error_rate = (count * 100)/un->un_kbytes_xferred; 10520 10521#ifdef STDEBUG 10522 if (st_soft_error_report_debug) { 10523 scsi_log(ST_DEVINFO, st_label, CE_NOTE, 10524 "Exabyte Soft Error Report:\n"); 10525 scsi_log(ST_DEVINFO, st_label, CE_CONT, 10526 "read/write error counter: %d\n", count); 10527 scsi_log(ST_DEVINFO, st_label, CE_CONT, 10528 "number of bytes transferred: %dK\n", 10529 un->un_kbytes_xferred); 10530 scsi_log(ST_DEVINFO, st_label, CE_CONT, 10531 "error_rate: %d%%\n", error_rate); 10532 10533 if (amt >= 22) { 10534 scsi_log(ST_DEVINFO, st_label, CE_CONT, 10535 "unit sense: 0x%b 0x%b 0x%b\n", 10536 sensep[19], SENSE_19_BITS, 10537 sensep[20], SENSE_20_BITS, 10538 sensep[21], SENSE_21_BITS); 10539 } 10540 if (amt >= 27) { 10541 scsi_log(ST_DEVINFO, st_label, CE_CONT, 10542 "tracking retry counter: %d\n", 10543 sensep[26]); 10544 scsi_log(ST_DEVINFO, st_label, CE_CONT, 10545 "read/write retry counter: %d\n", 10546 sensep[27]); 10547 } 10548 } 10549#endif 10550 10551 if (flag & FWRITE) { 10552 rate = EXABYTE_WRITE_ERROR_THRESHOLD; 10553 } else { 10554 rate = EXABYTE_READ_ERROR_THRESHOLD; 10555 } 10556 if (error_rate >= rate) { 10557 scsi_log(ST_DEVINFO, st_label, CE_WARN, 10558 "Soft error rate (%d%%) during %s was too high", 10559 error_rate, 10560 ((flag & FWRITE) ? wrg_str : rdg_str)); 10561 scsi_log(ST_DEVINFO, st_label, CE_CONT, 10562 "Please, replace tape cartridge\n"); 10563 } 10564 } 10565 10566done: 10567 kmem_free(com, sizeof (*com)); 10568 kmem_free(sensep, TAPE_SENSE_LENGTH); 10569 10570 if (rval != 0) { 10571 scsi_log(ST_DEVINFO, st_label, CE_WARN, 10572 "exabyte soft error reporting failed\n"); 10573 } 10574 return (rval); 10575} 10576 10577/* 10578 * this is very specific to Archive 4mm dat 10579 */ 10580#define ONEGIG (1024 * 1024 * 1024) 10581 10582static int 10583st_report_dat_soft_errors(dev_t dev, int flag) 10584{ 10585 uchar_t *sensep; 10586 int amt, i; 10587 int rval = 0; 10588 char cdb[CDB_GROUP1], *c = cdb; 10589 struct uscsi_cmd *com; 10590 10591 GET_SOFT_STATE(dev); 10592 10593 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 10594 "st_report_dat_soft_errors(dev = 0x%lx, flag = %d)\n", dev, flag); 10595 10596 ASSERT(mutex_owned(ST_MUTEX)); 10597 10598 com = kmem_zalloc(sizeof (*com), KM_SLEEP); 10599 sensep = kmem_zalloc(LOG_SENSE_LENGTH, KM_SLEEP); 10600 10601 *c++ = SCMD_LOG_SENSE_G1; 10602 *c++ = 0; 10603 *c++ = (flag & FWRITE) ? 0x42 : 0x43; 10604 *c++ = 0; 10605 *c++ = 0; 10606 *c++ = 0; 10607 *c++ = 2; 10608 *c++ = 0; 10609 *c++ = (char)LOG_SENSE_LENGTH; 10610 *c = 0; 10611 com->uscsi_cdb = cdb; 10612 com->uscsi_cdblen = CDB_GROUP1; 10613 com->uscsi_bufaddr = (caddr_t)sensep; 10614 com->uscsi_buflen = LOG_SENSE_LENGTH; 10615 com->uscsi_flags = 10616 USCSI_DIAGNOSE | USCSI_SILENT | USCSI_READ | USCSI_RQENABLE; 10617 com->uscsi_timeout = un->un_dp->non_motion_timeout; 10618 rval = 10619 st_ioctl_cmd(dev, com, UIO_SYSSPACE, UIO_SYSSPACE, UIO_SYSSPACE); 10620 if (rval) { 10621 scsi_log(ST_DEVINFO, st_label, CE_WARN, 10622 "DAT soft error reporting failed\n"); 10623 } 10624 if (rval || com->uscsi_status) { 10625 goto done; 10626 } 10627 10628 /* 10629 * was there enough data? 10630 */ 10631 amt = (int)LOG_SENSE_LENGTH - com->uscsi_resid; 10632 10633 if ((amt >= MIN_LOG_SENSE_LENGTH) && un->un_kbytes_xferred) { 10634 int total, retries, param_code; 10635 10636 total = -1; 10637 retries = -1; 10638 amt = sensep[3] + 4; 10639 10640 10641#ifdef STDEBUG 10642 if (st_soft_error_report_debug) { 10643 (void) printf("logsense:"); 10644 for (i = 0; i < MIN_LOG_SENSE_LENGTH; i++) { 10645 if (i % 16 == 0) { 10646 (void) printf("\t\n"); 10647 } 10648 (void) printf(" %x", sensep[i]); 10649 } 10650 (void) printf("\n"); 10651 } 10652#endif 10653 10654 /* 10655 * parse the param_codes 10656 */ 10657 if (sensep[0] == 2 || sensep[0] == 3) { 10658 for (i = 4; i < amt; i++) { 10659 param_code = (sensep[i++] << 8); 10660 param_code += sensep[i++]; 10661 i++; /* skip control byte */ 10662 if (param_code == 5) { 10663 if (sensep[i++] == 4) { 10664 total = (sensep[i++] << 24); 10665 total += (sensep[i++] << 16); 10666 total += (sensep[i++] << 8); 10667 total += sensep[i]; 10668 } 10669 } else if (param_code == 0x8007) { 10670 if (sensep[i++] == 2) { 10671 retries = sensep[i++] << 8; 10672 retries += sensep[i]; 10673 } 10674 } else { 10675 i += sensep[i]; 10676 } 10677 } 10678 } 10679 10680 /* 10681 * if the log sense returned valid numbers then determine 10682 * the read and write error thresholds based on the amount of 10683 * data transferred 10684 */ 10685 10686 if (total > 0 && retries > 0) { 10687 short normal_retries = 0; 10688 ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, 10689 "total xferred (%s) =%x, retries=%x\n", 10690 ((flag & FWRITE) ? wrg_str : rdg_str), 10691 total, retries); 10692 10693 if (flag & FWRITE) { 10694 if (total <= 10695 WRITE_SOFT_ERROR_WARNING_THRESHOLD) { 10696 normal_retries = 10697 DAT_SMALL_WRITE_ERROR_THRESHOLD; 10698 } else { 10699 normal_retries = 10700 DAT_LARGE_WRITE_ERROR_THRESHOLD; 10701 } 10702 } else { 10703 if (total <= 10704 READ_SOFT_ERROR_WARNING_THRESHOLD) { 10705 normal_retries = 10706 DAT_SMALL_READ_ERROR_THRESHOLD; 10707 } else { 10708 normal_retries = 10709 DAT_LARGE_READ_ERROR_THRESHOLD; 10710 } 10711 } 10712 10713 ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, 10714 "normal retries=%d\n", normal_retries); 10715 10716 if (retries >= normal_retries) { 10717 scsi_log(ST_DEVINFO, st_label, CE_WARN, 10718 "Soft error rate (retries = %d) during " 10719 "%s was too high", retries, 10720 ((flag & FWRITE) ? wrg_str : rdg_str)); 10721 scsi_log(ST_DEVINFO, st_label, CE_CONT, 10722 "Periodic head cleaning required " 10723 "and/or replace tape cartridge\n"); 10724 } 10725 10726 } else if (total == -1 || retries == -1) { 10727 scsi_log(ST_DEVINFO, st_label, CE_WARN, 10728 "log sense parameter code does not make sense\n"); 10729 } 10730 } 10731 10732 /* 10733 * reset all values 10734 */ 10735 c = cdb; 10736 *c++ = SCMD_LOG_SELECT_G1; 10737 *c++ = 2; /* this resets all values */ 10738 *c++ = (char)0xc0; 10739 *c++ = 0; 10740 *c++ = 0; 10741 *c++ = 0; 10742 *c++ = 0; 10743 *c++ = 0; 10744 *c++ = 0; 10745 *c = 0; 10746 com->uscsi_bufaddr = NULL; 10747 com->uscsi_buflen = 0; 10748 com->uscsi_flags = USCSI_DIAGNOSE | USCSI_SILENT | USCSI_RQENABLE; 10749 rval = 10750 st_ioctl_cmd(dev, com, UIO_SYSSPACE, UIO_SYSSPACE, UIO_SYSSPACE); 10751 if (rval) { 10752 scsi_log(ST_DEVINFO, st_label, CE_WARN, 10753 "DAT soft error reset failed\n"); 10754 } 10755done: 10756 kmem_free(com, sizeof (*com)); 10757 kmem_free(sensep, LOG_SENSE_LENGTH); 10758 return (rval); 10759} 10760 10761static int 10762st_report_soft_errors(dev_t dev, int flag) 10763{ 10764 GET_SOFT_STATE(dev); 10765 10766 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 10767 "st_report_soft_errors(dev = 0x%lx, flag = %d)\n", dev, flag); 10768 10769 ASSERT(mutex_owned(ST_MUTEX)); 10770 10771 switch (un->un_dp->type) { 10772 case ST_TYPE_EXB8500: 10773 case ST_TYPE_EXABYTE: 10774 return (st_report_exabyte_soft_errors(dev, flag)); 10775 /*NOTREACHED*/ 10776 case ST_TYPE_PYTHON: 10777 return (st_report_dat_soft_errors(dev, flag)); 10778 /*NOTREACHED*/ 10779 default: 10780 un->un_dp->options &= ~ST_SOFT_ERROR_REPORTING; 10781 return (-1); 10782 } 10783} 10784 10785/* 10786 * persistent error routines 10787 */ 10788 10789/* 10790 * enable persistent errors, and set the throttle appropriately, checking 10791 * for flush-on-errors capability 10792 */ 10793static void 10794st_turn_pe_on(struct scsi_tape *un) 10795{ 10796 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, "st_pe_on\n"); 10797 ASSERT(mutex_owned(ST_MUTEX)); 10798 10799 un->un_persistence = 1; 10800 10801 /* 10802 * only use flush-on-errors if auto-request-sense and untagged-qing are 10803 * enabled. This will simplify the error handling for request senses 10804 */ 10805 10806 if (un->un_arq_enabled && un->un_untagged_qing) { 10807 uchar_t f_o_e; 10808 10809 mutex_exit(ST_MUTEX); 10810 f_o_e = (scsi_ifsetcap(ROUTE, "flush-on-errors", 1, 1) == 1) ? 10811 1 : 0; 10812 mutex_enter(ST_MUTEX); 10813 10814 un->un_flush_on_errors = f_o_e; 10815 } else { 10816 un->un_flush_on_errors = 0; 10817 } 10818 10819 if (un->un_flush_on_errors) 10820 un->un_max_throttle = (uchar_t)st_max_throttle; 10821 else 10822 un->un_max_throttle = 1; 10823 10824 if (un->un_dp->options & ST_RETRY_ON_RECOVERED_DEFERRED_ERROR) 10825 un->un_max_throttle = 1; 10826 10827 /* this will send a marker pkt */ 10828 CLEAR_PE(un); 10829} 10830 10831/* 10832 * This turns persistent errors permanently off 10833 */ 10834static void 10835st_turn_pe_off(struct scsi_tape *un) 10836{ 10837 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, "st_pe_off\n"); 10838 ASSERT(mutex_owned(ST_MUTEX)); 10839 10840 /* turn it off for good */ 10841 un->un_persistence = 0; 10842 10843 /* this will send a marker pkt */ 10844 CLEAR_PE(un); 10845 10846 /* turn off flush on error capability, if enabled */ 10847 if (un->un_flush_on_errors) { 10848 mutex_exit(ST_MUTEX); 10849 (void) scsi_ifsetcap(ROUTE, "flush-on-errors", 0, 1); 10850 mutex_enter(ST_MUTEX); 10851 } 10852 10853 10854 un->un_flush_on_errors = 0; 10855} 10856 10857/* 10858 * This clear persistent errors, allowing more commands through, and also 10859 * sending a marker packet. 10860 */ 10861static void 10862st_clear_pe(struct scsi_tape *un) 10863{ 10864 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, "st_pe_clear\n"); 10865 ASSERT(mutex_owned(ST_MUTEX)); 10866 10867 un->un_persist_errors = 0; 10868 un->un_throttle = un->un_last_throttle = 1; 10869 un->un_errno = 0; 10870 st_hba_unflush(un); 10871} 10872 10873/* 10874 * This will flag persistent errors, shutting everything down, if the 10875 * application had enabled persistent errors via MTIOCPERSISTENT 10876 */ 10877static void 10878st_set_pe_flag(struct scsi_tape *un) 10879{ 10880 ASSERT(mutex_owned(ST_MUTEX)); 10881 10882 if (un->un_persistence) { 10883 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, "st_pe_flag\n"); 10884 un->un_persist_errors = 1; 10885 un->un_throttle = un->un_last_throttle = 0; 10886 } 10887} 10888 10889/* 10890 * List of commands that are allowed to be done while another host holds 10891 * the reservation. 10892 */ 10893struct { 10894 uchar_t cmd; 10895 uchar_t byte; /* byte to look for data */ 10896 uint32_t mask; /* bits that matter in the above data */ 10897} rcmds[] = { 10898 { SCMD_TEST_UNIT_READY, 0, 0 }, /* may fail on older drives */ 10899 { SCMD_REQUEST_SENSE, 0, 0 }, 10900 { SCMD_READ_BLKLIM, 0, 0 }, 10901 { SCMD_INQUIRY, 0, 0 }, 10902 { SCMD_RESERVE, 0, 0 }, 10903 { SCMD_RELEASE, 0, 0 }, 10904 { SCMD_DOORLOCK, 4, 3 }, /* allow (unlock) media access only */ 10905 { SCMD_REPORT_DENSITIES, 0, 0 }, 10906 { SCMD_LOG_SENSE_G1, 0, 0 }, 10907 { SCMD_PERSISTENT_RESERVE_IN, 0, 0 }, 10908 { SCMD_PERSISTENT_RESERVE_OUT, 0, 0 }, 10909 { SCMD_REPORT_LUNS, 0, 0 } 10910}; 10911 10912static int 10913st_do_reserve(struct scsi_tape *un) 10914{ 10915 int rval; 10916 10917 /* 10918 * Issue a Throw-Away reserve command to clear the 10919 * check condition. 10920 * If the current behaviour of reserve/release is to 10921 * hold reservation across opens , and if a Bus reset 10922 * has been issued between opens then this command 10923 * would set the ST_LOST_RESERVE flags in rsvd_status. 10924 * In this case return an EACCES so that user knows that 10925 * reservation has been lost in between opens. 10926 * If this error is not returned and we continue with 10927 * successful open , then user may think position of the 10928 * tape is still the same but inreality we would rewind the 10929 * tape and continue from BOT. 10930 */ 10931 rval = st_reserve_release(un, ST_RESERVE); 10932 if (rval) { 10933 if ((un->un_rsvd_status & ST_LOST_RESERVE_BETWEEN_OPENS) == 10934 ST_LOST_RESERVE_BETWEEN_OPENS) { 10935 un->un_rsvd_status &= ~(ST_LOST_RESERVE | ST_RESERVE); 10936 un->un_errno = EACCES; 10937 return (EACCES); 10938 } 10939 rval = st_reserve_release(un, ST_RESERVE); 10940 } 10941 if (rval == 0) { 10942 un->un_rsvd_status |= ST_INIT_RESERVE; 10943 } 10944 10945 return (rval); 10946} 10947 10948static int 10949st_check_cdb_for_need_to_reserve(struct scsi_tape *un, caddr_t cdb) 10950{ 10951 int i; 10952 int rval = 0; 10953 10954 /* 10955 * If already reserved no need to do it again. 10956 * Also if Reserve and Release are disabled Just return. 10957 */ 10958 if ((un->un_rsvd_status & (ST_RESERVE | ST_APPLICATION_RESERVATIONS)) || 10959 (un->un_dp->options & ST_NO_RESERVE_RELEASE)) { 10960 ST_DEBUG6(ST_DEVINFO, st_label, CE_NOTE, 10961 "st_check_cdb_for_need_to_reserve() reserve unneeded 0x%x", 10962 cdb[0]); 10963 return (0); 10964 } 10965 10966 /* See if command is on the list */ 10967 for (i = 0; i < ST_NUM_MEMBERS(rcmds); i++) { 10968 if ((uchar_t)cdb[0] == rcmds[i].cmd) { 10969 /* 10970 * cmd is on list. 10971 * if byte is zero always allowed. 10972 */ 10973 if (rcmds[i].byte == 0) { 10974 return (rval); 10975 } 10976 if (((cdb[rcmds[i].byte]) & (rcmds[i].mask)) == 0) { 10977 return (rval); 10978 } 10979 break; 10980 } 10981 } 10982 10983 ST_DEBUG6(ST_DEVINFO, st_label, CE_NOTE, 10984 "Command 0x%x requires reservation", cdb[0]); 10985 10986 rval = st_do_reserve(un); 10987 10988 return (rval); 10989} 10990 10991static int 10992st_check_cmd_for_need_to_reserve(struct scsi_tape *un, uchar_t cmd, int cnt) 10993{ 10994 int i; 10995 int rval = 0; 10996 10997 if ((un->un_rsvd_status & (ST_RESERVE | ST_APPLICATION_RESERVATIONS)) || 10998 (un->un_dp->options & ST_NO_RESERVE_RELEASE)) { 10999 ST_DEBUG6(ST_DEVINFO, st_label, CE_NOTE, 11000 "st_check_cmd_for_need_to_reserve() reserve unneeded 0x%x", 11001 cmd); 11002 return (0); 11003 } 11004 11005 /* See if command is on the list */ 11006 for (i = 0; i < ST_NUM_MEMBERS(rcmds); i++) { 11007 if (cmd == rcmds[i].cmd) { 11008 /* 11009 * cmd is on list. 11010 * if byte is zero always allowed. 11011 */ 11012 if (rcmds[i].byte == 0) { 11013 return (rval); 11014 } 11015 if (((rcmds[i].mask) & cnt) == 0) { 11016 return (rval); 11017 } 11018 break; 11019 } 11020 } 11021 11022 ST_DEBUG6(ST_DEVINFO, st_label, CE_NOTE, 11023 "Cmd 0x%x requires reservation", cmd); 11024 11025 rval = st_do_reserve(un); 11026 11027 return (rval); 11028} 11029 11030static int 11031st_reserve_release(struct scsi_tape *un, int cmd) 11032{ 11033 struct uscsi_cmd uscsi_cmd; 11034 struct uscsi_cmd *com = &uscsi_cmd; 11035 int rval; 11036 char cdb[CDB_GROUP0]; 11037 11038 11039 ASSERT(mutex_owned(ST_MUTEX)); 11040 11041 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 11042 "st_reserve_release: %s \n", 11043 (cmd == ST_RELEASE)? "Releasing":"Reserving"); 11044 11045 bzero(cdb, CDB_GROUP0); 11046 if (cmd == ST_RELEASE) { 11047 cdb[0] = SCMD_RELEASE; 11048 } else { 11049 cdb[0] = SCMD_RESERVE; 11050 } 11051 bzero(com, sizeof (struct uscsi_cmd)); 11052 com->uscsi_flags = USCSI_WRITE; 11053 com->uscsi_cdb = cdb; 11054 com->uscsi_cdblen = CDB_GROUP0; 11055 com->uscsi_timeout = un->un_dp->non_motion_timeout; 11056 11057 rval = st_ioctl_cmd(un->un_dev, com, UIO_SYSSPACE, UIO_SYSSPACE, 11058 UIO_SYSSPACE); 11059 11060 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 11061 "st_reserve_release: rval(1)=%d\n", rval); 11062 11063 if (rval) { 11064 if (com->uscsi_status == STATUS_RESERVATION_CONFLICT) { 11065 rval = EACCES; 11066 } 11067 /* 11068 * dynamically turn off reserve/release support 11069 * in case of drives which do not support 11070 * reserve/release command(ATAPI drives). 11071 */ 11072 if (un->un_status == KEY_ILLEGAL_REQUEST) { 11073 if (un->un_dp->options & ST_NO_RESERVE_RELEASE) { 11074 un->un_dp->options |= ST_NO_RESERVE_RELEASE; 11075 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 11076 "Tape unit does not support " 11077 "reserve/release \n"); 11078 } 11079 rval = 0; 11080 } 11081 } 11082 return (rval); 11083} 11084 11085static int 11086st_take_ownership(dev_t dev) 11087{ 11088 int rval; 11089 11090 GET_SOFT_STATE(dev); 11091 ASSERT(mutex_owned(ST_MUTEX)); 11092 11093 ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, 11094 "st_take_ownership: Entering ...\n"); 11095 11096 11097 rval = st_reserve_release(un, ST_RESERVE); 11098 /* 11099 * XXX -> Should reset be done only if we get EACCES. 11100 * . 11101 */ 11102 if (rval) { 11103 mutex_exit(ST_MUTEX); 11104 if (scsi_reset(ROUTE, RESET_TARGET) == 0) { 11105 if (scsi_reset(ROUTE, RESET_ALL) == 0) { 11106 mutex_enter(ST_MUTEX); 11107 return (EIO); 11108 } 11109 } 11110 mutex_enter(ST_MUTEX); 11111 un->un_rsvd_status &= 11112 ~(ST_LOST_RESERVE | ST_RESERVATION_CONFLICT); 11113 11114 mutex_exit(ST_MUTEX); 11115 delay(drv_usectohz(ST_RESERVATION_DELAY)); 11116 mutex_enter(ST_MUTEX); 11117 /* 11118 * remove the check condition. 11119 */ 11120 (void) st_reserve_release(un, ST_RESERVE); 11121 if ((rval = st_reserve_release(un, ST_RESERVE)) != 0) { 11122 if ((st_reserve_release(un, ST_RESERVE)) != 0) { 11123 rval = (un->un_rsvd_status & 11124 ST_RESERVATION_CONFLICT) ? EACCES : EIO; 11125 return (rval); 11126 } 11127 } 11128 /* 11129 * Set tape state to ST_STATE_OFFLINE , in case if 11130 * the user wants to continue and start using 11131 * the tape. 11132 */ 11133 un->un_state = ST_STATE_OFFLINE; 11134 un->un_rsvd_status |= ST_INIT_RESERVE; 11135 } 11136 return (rval); 11137} 11138 11139static int 11140st_create_errstats(struct scsi_tape *un, int instance) 11141{ 11142 char kstatname[KSTAT_STRLEN]; 11143 11144 /* 11145 * Create device error kstats 11146 */ 11147 11148 if (un->un_errstats == (kstat_t *)0) { 11149 (void) sprintf(kstatname, "st%d,err", instance); 11150 un->un_errstats = kstat_create("sterr", instance, kstatname, 11151 "device_error", KSTAT_TYPE_NAMED, 11152 sizeof (struct st_errstats) / sizeof (kstat_named_t), 11153 KSTAT_FLAG_PERSISTENT); 11154 11155 if (un->un_errstats) { 11156 struct st_errstats *stp; 11157 11158 stp = (struct st_errstats *)un->un_errstats->ks_data; 11159 kstat_named_init(&stp->st_softerrs, "Soft Errors", 11160 KSTAT_DATA_ULONG); 11161 kstat_named_init(&stp->st_harderrs, "Hard Errors", 11162 KSTAT_DATA_ULONG); 11163 kstat_named_init(&stp->st_transerrs, "Transport Errors", 11164 KSTAT_DATA_ULONG); 11165 kstat_named_init(&stp->st_vid, "Vendor", 11166 KSTAT_DATA_CHAR); 11167 kstat_named_init(&stp->st_pid, "Product", 11168 KSTAT_DATA_CHAR); 11169 kstat_named_init(&stp->st_revision, "Revision", 11170 KSTAT_DATA_CHAR); 11171 kstat_named_init(&stp->st_serial, "Serial No", 11172 KSTAT_DATA_CHAR); 11173 un->un_errstats->ks_private = un; 11174 un->un_errstats->ks_update = nulldev; 11175 kstat_install(un->un_errstats); 11176 /* 11177 * Fill in the static data 11178 */ 11179 (void) strncpy(&stp->st_vid.value.c[0], 11180 ST_INQUIRY->inq_vid, 8); 11181 /* 11182 * XXX: Emulex MT-02 (and emulators) predates 11183 * SCSI-1 and has no vid & pid inquiry data. 11184 */ 11185 if (ST_INQUIRY->inq_len != 0) { 11186 (void) strncpy(&stp->st_pid.value.c[0], 11187 ST_INQUIRY->inq_pid, 16); 11188 (void) strncpy(&stp->st_revision.value.c[0], 11189 ST_INQUIRY->inq_revision, 4); 11190 (void) strncpy(&stp->st_serial.value.c[0], 11191 ST_INQUIRY->inq_serial, 12); 11192 } 11193 } 11194 } 11195 return (0); 11196} 11197 11198static int 11199st_validate_tapemarks(struct scsi_tape *un, int fileno, daddr_t blkno) 11200{ 11201 dev_t dev; 11202 int rval; 11203 11204 ASSERT(MUTEX_HELD(&un->un_sd->sd_mutex)); 11205 ASSERT(mutex_owned(ST_MUTEX)); 11206 11207 dev = un->un_dev; 11208 11209 scsi_log(ST_DEVINFO, st_label, CE_NOTE, "Restoring tape" 11210 " position at fileno=%x, blkno=%lx....", fileno, blkno); 11211 11212 /* 11213 * Rewind ? Oh yeah, Fidelity has got the STK F/W changed 11214 * so as not to rewind tape on RESETS: Gee, Has life ever 11215 * been simple in tape land ? 11216 */ 11217 rval = st_cmd(dev, SCMD_REWIND, 0, SYNC_CMD); 11218 if (rval) { 11219 scsi_log(ST_DEVINFO, st_label, CE_WARN, 11220 "Failed to restore the last file and block position: In" 11221 " this state, Tape will be loaded at BOT during next open"); 11222 un->un_fileno = -1; 11223 return (rval); 11224 } 11225 11226 if (fileno) { 11227 rval = st_cmd(dev, SCMD_SPACE, Fmk(fileno), SYNC_CMD); 11228 if (rval) { 11229 scsi_log(ST_DEVINFO, st_label, CE_WARN, 11230 "Failed to restore the last file position: In this " 11231 " state, Tape will be loaded at BOT during next open"); 11232 un->un_fileno = -1; 11233 return (rval); 11234 } 11235 } 11236 11237 if (blkno) { 11238 rval = st_cmd(dev, SCMD_SPACE, Blk(blkno), SYNC_CMD); 11239 if (rval) { 11240 scsi_log(ST_DEVINFO, st_label, CE_WARN, 11241 "Failed to restore the last block position: In this" 11242 " state, tape will be loaded at BOT during next open"); 11243 un->un_fileno = -1; 11244 return (rval); 11245 } 11246 } 11247 11248 return (0); 11249} 11250 11251/* 11252 * check sense key, ASC, ASCQ in order to determine if the tape needs 11253 * to be ejected 11254 */ 11255 11256static int 11257st_check_asc_ascq(struct scsi_tape *un) 11258{ 11259 struct scsi_extended_sense *sensep = ST_RQSENSE; 11260 struct tape_failure_code *code; 11261 11262 for (code = st_tape_failure_code; code->key != 0xff; code++) { 11263 if ((code->key == sensep->es_key) && 11264 (code->add_code == sensep->es_add_code) && 11265 (code->qual_code == sensep->es_qual_code)) 11266 return (1); 11267 } 11268 return (0); 11269} 11270 11271/* 11272 * st_logpage_supported() sends a Log Sense command with 11273 * page code = 0 = Supported Log Pages Page to the device, 11274 * to see whether the page 'page' is supported. 11275 * Return values are: 11276 * -1 if the Log Sense command fails 11277 * 0 if page is not supported 11278 * 1 if page is supported 11279 */ 11280 11281static int 11282st_logpage_supported(dev_t dev, uchar_t page) 11283{ 11284 uchar_t *sp, *sensep; 11285 unsigned length; 11286 struct uscsi_cmd *com; 11287 int rval; 11288 char cdb[CDB_GROUP1] = { 11289 SCMD_LOG_SENSE_G1, 11290 0, 11291 SUPPORTED_LOG_PAGES_PAGE, 11292 0, 11293 0, 11294 0, 11295 0, 11296 0, 11297 (char)LOG_SENSE_LENGTH, 11298 0 11299 }; 11300 11301 GET_SOFT_STATE(dev); 11302 ASSERT(mutex_owned(ST_MUTEX)); 11303 11304 com = kmem_zalloc(sizeof (struct uscsi_cmd), KM_SLEEP); 11305 sensep = kmem_zalloc(LOG_SENSE_LENGTH, KM_SLEEP); 11306 11307 com->uscsi_cdb = cdb; 11308 com->uscsi_cdblen = CDB_GROUP1; 11309 com->uscsi_bufaddr = (caddr_t)sensep; 11310 com->uscsi_buflen = LOG_SENSE_LENGTH; 11311 com->uscsi_flags = 11312 USCSI_DIAGNOSE | USCSI_SILENT | USCSI_READ | USCSI_RQENABLE; 11313 com->uscsi_timeout = un->un_dp->non_motion_timeout; 11314 rval = st_ioctl_cmd(dev, com, UIO_SYSSPACE, UIO_SYSSPACE, UIO_SYSSPACE); 11315 if (rval || com->uscsi_status) { 11316 /* uscsi-command failed */ 11317 rval = -1; 11318 } else { 11319 11320 sp = sensep + 3; 11321 11322 for (length = *sp++; length > 0; length--, sp++) { 11323 11324 if (*sp == page) { 11325 rval = 1; 11326 break; 11327 } 11328 } 11329 } 11330 kmem_free(com, sizeof (struct uscsi_cmd)); 11331 kmem_free(sensep, LOG_SENSE_LENGTH); 11332 return (rval); 11333} 11334 11335 11336/* 11337 * st_check_clean_bit() gets the status of the tape's cleaning bit. 11338 * 11339 * If the device does support the TapeAlert log page, then the cleaning bit 11340 * information will be read from this page. Otherwise we will see if one of 11341 * ST_CLN_TYPE_1, ST_CLN_TYPE_2 or ST_CLN_TYPE_3 is set in the properties of 11342 * the device, which means, that we can get the cleaning bit information via 11343 * a RequestSense command. 11344 * If both methods of getting cleaning bit information are not supported 11345 * st_check_clean_bit() will return with 0. Otherwise st_check_clean_bit() 11346 * returns with 11347 * - MTF_TAPE_CLN_SUPPORTED if cleaning bit is not set or 11348 * - MTF_TAPE_CLN_SUPPORTED | MTF_TAPE_HEAD_DIRTY if cleaning bit is set. 11349 * If the call to st_ioctl_cmd() to do the Log Sense or the Request Sense 11350 * command fails, or if the amount of Request Sense data is not enough, then 11351 * st_check_clean_bit() returns with -1. 11352 */ 11353 11354static int 11355st_check_clean_bit(dev_t dev) 11356{ 11357 int rval = 0; 11358 11359 GET_SOFT_STATE(dev); 11360 11361 ASSERT(mutex_owned(ST_MUTEX)); 11362 11363 if (un->un_HeadClean & TAPE_ALERT_NOT_SUPPORTED) { 11364 return (rval); 11365 } 11366 11367 if (un->un_HeadClean == TAPE_ALERT_SUPPORT_UNKNOWN) { 11368 11369 rval = st_logpage_supported(dev, TAPE_SEQUENTIAL_PAGE); 11370 if (rval == 1) { 11371 11372 un->un_HeadClean |= TAPE_SEQUENTIAL_SUPPORTED; 11373 } 11374 11375 rval = st_logpage_supported(dev, TAPE_ALERT_PAGE); 11376 if (rval == 1) { 11377 11378 un->un_HeadClean |= TAPE_ALERT_SUPPORTED; 11379 } 11380 11381 if (un->un_HeadClean == TAPE_ALERT_SUPPORT_UNKNOWN) { 11382 11383 un->un_HeadClean = TAPE_ALERT_NOT_SUPPORTED; 11384 } 11385 } 11386 11387 rval = 0; 11388 11389 if (un->un_HeadClean & TAPE_SEQUENTIAL_SUPPORTED) { 11390 11391 rval = st_check_sequential_clean_bit(dev); 11392 } 11393 11394 if ((rval <= 0) && (un->un_HeadClean & TAPE_ALERT_SUPPORTED)) { 11395 11396 rval = st_check_alert_flags(dev); 11397 } 11398 11399 if ((rval <= 0) && (un->un_dp->options & ST_CLN_MASK)) { 11400 11401 rval = st_check_sense_clean_bit(dev); 11402 } 11403 11404 if (rval < 0) { 11405 return (rval); 11406 } 11407 11408 /* 11409 * If found a supported means to check need to clean. 11410 */ 11411 if (rval & MTF_TAPE_CLN_SUPPORTED) { 11412 11413 /* 11414 * head needs to be cleaned. 11415 */ 11416 if (rval & MTF_TAPE_HEAD_DIRTY) { 11417 11418 /* 11419 * Print log message only first time 11420 * found needing cleaned. 11421 */ 11422 if ((un->un_HeadClean & TAPE_PREVIOUSLY_DIRTY) == 0) { 11423 11424 scsi_log(ST_DEVINFO, st_label, CE_WARN, 11425 "Periodic head cleaning required"); 11426 11427 un->un_HeadClean |= TAPE_PREVIOUSLY_DIRTY; 11428 } 11429 11430 } else { 11431 11432 un->un_HeadClean &= ~TAPE_PREVIOUSLY_DIRTY; 11433 } 11434 } 11435 11436 return (rval); 11437} 11438 11439 11440static int 11441st_check_sequential_clean_bit(dev_t dev) 11442{ 11443 int rval; 11444 int ix; 11445 ushort_t parameter; 11446 struct uscsi_cmd *cmd; 11447 struct log_sequential_page *sp; 11448 struct log_sequential_page_parameter *prm; 11449 char cdb[CDB_GROUP1] = { 11450 SCMD_LOG_SENSE_G1, 11451 0, 11452 TAPE_SEQUENTIAL_PAGE | CURRENT_CUMULATIVE_VALUES, 11453 0, 11454 0, 11455 0, 11456 0, 11457 (char)(sizeof (struct log_sequential_page) >> 8), 11458 (char)(sizeof (struct log_sequential_page)), 11459 0 11460 }; 11461 11462 GET_SOFT_STATE(dev); 11463 11464 cmd = kmem_zalloc(sizeof (struct uscsi_cmd), KM_SLEEP); 11465 sp = kmem_zalloc(sizeof (struct log_sequential_page), KM_SLEEP); 11466 11467 cmd->uscsi_flags = 11468 USCSI_DIAGNOSE | USCSI_SILENT | USCSI_READ | USCSI_RQENABLE; 11469 cmd->uscsi_timeout = un->un_dp->non_motion_timeout; 11470 cmd->uscsi_cdb = cdb; 11471 cmd->uscsi_cdblen = CDB_GROUP1; 11472 cmd->uscsi_bufaddr = (caddr_t)sp; 11473 cmd->uscsi_buflen = sizeof (struct log_sequential_page); 11474 11475 rval = st_ioctl_cmd(dev, cmd, UIO_SYSSPACE, UIO_SYSSPACE, UIO_SYSSPACE); 11476 11477 if (rval || cmd->uscsi_status || cmd->uscsi_resid) { 11478 11479 rval = -1; 11480 11481 } else if (sp->log_page.code != TAPE_SEQUENTIAL_PAGE) { 11482 11483 rval = -1; 11484 } 11485 11486 prm = &sp->param[0]; 11487 11488 for (ix = 0; rval == 0 && ix < TAPE_SEQUENTIAL_PAGE_PARA; ix++) { 11489 11490 if (prm->log_param.length == 0) { 11491 break; 11492 } 11493 11494 parameter = (((prm->log_param.pc_hi << 8) & 0xff00) + 11495 (prm->log_param.pc_lo & 0xff)); 11496 11497 if (parameter == SEQUENTIAL_NEED_CLN) { 11498 11499 rval = MTF_TAPE_CLN_SUPPORTED; 11500 if (prm->param_value[prm->log_param.length - 1]) { 11501 11502 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 11503 "sequential log says head dirty\n"); 11504 rval |= MTF_TAPE_HEAD_DIRTY; 11505 } 11506 } 11507 prm = (struct log_sequential_page_parameter *) 11508 &prm->param_value[prm->log_param.length]; 11509 } 11510 11511 kmem_free(cmd, sizeof (struct uscsi_cmd)); 11512 kmem_free(sp, sizeof (struct log_sequential_page)); 11513 11514 return (rval); 11515} 11516 11517 11518static int 11519st_check_alert_flags(dev_t dev) 11520{ 11521 struct st_tape_alert *ta; 11522 struct uscsi_cmd *com; 11523 unsigned ix, length; 11524 int rval; 11525 tape_alert_flags flag; 11526 char cdb[CDB_GROUP1] = { 11527 SCMD_LOG_SENSE_G1, 11528 0, 11529 TAPE_ALERT_PAGE | CURRENT_THRESHOLD_VALUES, 11530 0, 11531 0, 11532 0, 11533 0, 11534 (char)(sizeof (struct st_tape_alert) >> 8), 11535 (char)(sizeof (struct st_tape_alert)), 11536 0 11537 }; 11538 11539 GET_SOFT_STATE(dev); 11540 11541 com = kmem_zalloc(sizeof (struct uscsi_cmd), KM_SLEEP); 11542 ta = kmem_zalloc(sizeof (struct st_tape_alert), KM_SLEEP); 11543 11544 com->uscsi_cdb = cdb; 11545 com->uscsi_cdblen = CDB_GROUP1; 11546 com->uscsi_bufaddr = (caddr_t)ta; 11547 com->uscsi_buflen = sizeof (struct st_tape_alert); 11548 com->uscsi_flags = 11549 USCSI_DIAGNOSE | USCSI_SILENT | USCSI_READ | USCSI_RQENABLE; 11550 com->uscsi_timeout = un->un_dp->non_motion_timeout; 11551 11552 rval = st_ioctl_cmd(dev, com, UIO_SYSSPACE, UIO_SYSSPACE, UIO_SYSSPACE); 11553 11554 if (rval || com->uscsi_status || com->uscsi_resid) { 11555 11556 rval = -1; /* uscsi-command failed */ 11557 11558 } else if (ta->log_page.code != TAPE_ALERT_PAGE) { 11559 11560 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 11561 "Not Alert Log Page returned 0x%X\n", ta->log_page.code); 11562 rval = -1; 11563 } 11564 11565 length = (ta->log_page.length_hi << 8) + ta->log_page.length_lo; 11566 11567 11568 if (length != TAPE_ALERT_PARAMETER_LENGTH) { 11569 11570 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 11571 "TapeAlert length %d\n", length); 11572 } 11573 11574 11575 for (ix = 0; ix < TAPE_ALERT_MAX_PARA; ix++) { 11576 11577 /* 11578 * if rval is bad before the first pass don't bother 11579 */ 11580 if (ix == 0 && rval != 0) { 11581 11582 break; 11583 } 11584 11585 flag = ((ta->param[ix].log_param.pc_hi << 8) + 11586 ta->param[ix].log_param.pc_lo); 11587 11588 if ((ta->param[ix].param_value & 1) == 0) { 11589 continue; 11590 } 11591 /* 11592 * check to see if current parameter is of interest. 11593 * CLEAN_FOR_ERRORS is vendor specific to 9840 9940 stk's. 11594 */ 11595 if ((flag == TAF_CLEAN_NOW) || 11596 (flag == TAF_CLEAN_PERIODIC) || 11597 ((flag == CLEAN_FOR_ERRORS) && 11598 (un->un_dp->type == ST_TYPE_STK9840))) { 11599 11600 rval = MTF_TAPE_CLN_SUPPORTED; 11601 11602 11603 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 11604 "alert_page drive needs clean %d\n", flag); 11605 un->un_HeadClean |= TAPE_ALERT_STILL_DIRTY; 11606 rval |= MTF_TAPE_HEAD_DIRTY; 11607 11608 } else if (flag == TAF_CLEANING_MEDIA) { 11609 11610 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 11611 "alert_page drive was cleaned\n"); 11612 un->un_HeadClean &= ~TAPE_ALERT_STILL_DIRTY; 11613 } 11614 11615 } 11616 11617 /* 11618 * Report it as dirty till we see it cleaned 11619 */ 11620 if (un->un_HeadClean & TAPE_ALERT_STILL_DIRTY) { 11621 11622 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 11623 "alert_page still dirty\n"); 11624 rval |= MTF_TAPE_HEAD_DIRTY; 11625 } 11626 11627 kmem_free(com, sizeof (struct uscsi_cmd)); 11628 kmem_free(ta, sizeof (struct st_tape_alert)); 11629 11630 return (rval); 11631} 11632 11633 11634static int 11635st_check_sense_clean_bit(dev_t dev) 11636{ 11637 uchar_t *sensep; 11638 char cdb[CDB_GROUP0]; 11639 struct uscsi_cmd *com; 11640 ushort_t byte_pos; 11641 uchar_t bit_mask; 11642 unsigned length; 11643 int index; 11644 int rval; 11645 11646 GET_SOFT_STATE(dev); 11647 11648 /* 11649 * Since this tape does not support Tape Alert, 11650 * we now try to get the cleanbit status via 11651 * Request Sense. 11652 */ 11653 11654 if ((un->un_dp->options & ST_CLN_MASK) == ST_CLN_TYPE_1) { 11655 11656 index = 0; 11657 11658 } else if ((un->un_dp->options & ST_CLN_MASK) == ST_CLN_TYPE_2) { 11659 11660 index = 1; 11661 11662 } else if ((un->un_dp->options & ST_CLN_MASK) == ST_CLN_TYPE_3) { 11663 11664 index = 2; 11665 11666 } else { 11667 11668 return (-1); 11669 } 11670 11671 byte_pos = st_cln_bit_position[index].cln_bit_byte; 11672 bit_mask = st_cln_bit_position[index].cln_bit_mask; 11673 length = byte_pos + 1; 11674 11675 com = kmem_zalloc(sizeof (struct uscsi_cmd), KM_SLEEP); 11676 sensep = kmem_zalloc(length, KM_SLEEP); 11677 11678 cdb[0] = SCMD_REQUEST_SENSE; 11679 cdb[1] = 0; 11680 cdb[2] = 0; 11681 cdb[3] = 0; 11682 cdb[4] = (char)length; 11683 cdb[5] = 0; 11684 11685 com->uscsi_cdb = cdb; 11686 com->uscsi_cdblen = CDB_GROUP0; 11687 com->uscsi_bufaddr = (caddr_t)sensep; 11688 com->uscsi_buflen = length; 11689 com->uscsi_flags = 11690 USCSI_DIAGNOSE | USCSI_SILENT | USCSI_READ | USCSI_RQENABLE; 11691 com->uscsi_timeout = un->un_dp->non_motion_timeout; 11692 11693 rval = st_ioctl_cmd(dev, com, UIO_SYSSPACE, UIO_SYSSPACE, 11694 UIO_SYSSPACE); 11695 11696 if (rval || com->uscsi_status || com->uscsi_resid) { 11697 11698 rval = -1; 11699 11700 } else { 11701 11702 rval = MTF_TAPE_CLN_SUPPORTED; 11703 if ((sensep[byte_pos] & bit_mask) == bit_mask) { 11704 11705 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 11706 "sense data says head dirty\n"); 11707 rval |= MTF_TAPE_HEAD_DIRTY; 11708 } 11709 } 11710 11711 kmem_free(com, sizeof (struct uscsi_cmd)); 11712 kmem_free(sensep, length); 11713 return (rval); 11714} 11715 11716/* 11717 * st_clear_unit_attention 11718 * 11719 * run test unit ready's to clear out outstanding 11720 * unit attentions. 11721 * returns zero for SUCCESS or the errno from st_cmd call 11722 */ 11723static int 11724st_clear_unit_attentions(dev_t dev_instance, int max_trys) 11725{ 11726 int i = 0; 11727 int rval; 11728 11729 do { 11730 rval = st_cmd(dev_instance, SCMD_TEST_UNIT_READY, 0, SYNC_CMD); 11731 } while ((rval != 0) && (rval != ENXIO) && (++i < max_trys)); 11732 return (rval); 11733} 11734 11735static void 11736st_calculate_timeouts(struct scsi_tape *un) 11737{ 11738 if (un->un_dp->non_motion_timeout == 0) { 11739 if (un->un_dp->options & ST_LONG_TIMEOUTS) { 11740 un->un_dp->non_motion_timeout = 11741 st_io_time * st_long_timeout_x; 11742 } else { 11743 un->un_dp->non_motion_timeout = (ushort_t)st_io_time; 11744 } 11745 } 11746 11747 if (un->un_dp->io_timeout == 0) { 11748 if (un->un_dp->options & ST_LONG_TIMEOUTS) { 11749 un->un_dp->io_timeout = st_io_time * st_long_timeout_x; 11750 } else { 11751 un->un_dp->io_timeout = (ushort_t)st_io_time; 11752 } 11753 } 11754 11755 if (un->un_dp->rewind_timeout == 0) { 11756 if (un->un_dp->options & ST_LONG_TIMEOUTS) { 11757 un->un_dp->rewind_timeout = 11758 st_space_time * st_long_timeout_x; 11759 } else { 11760 un->un_dp->rewind_timeout = (ushort_t)st_space_time; 11761 } 11762 } 11763 11764 if (un->un_dp->space_timeout == 0) { 11765 if (un->un_dp->options & ST_LONG_TIMEOUTS) { 11766 un->un_dp->space_timeout = 11767 st_space_time * st_long_timeout_x; 11768 } else { 11769 un->un_dp->space_timeout = (ushort_t)st_space_time; 11770 } 11771 } 11772 11773 if (un->un_dp->load_timeout == 0) { 11774 if (un->un_dp->options & ST_LONG_TIMEOUTS) { 11775 un->un_dp->load_timeout = 11776 st_space_time * st_long_timeout_x; 11777 } else { 11778 un->un_dp->load_timeout = (ushort_t)st_space_time; 11779 } 11780 } 11781 11782 if (un->un_dp->unload_timeout == 0) { 11783 if (un->un_dp->options & ST_LONG_TIMEOUTS) { 11784 un->un_dp->unload_timeout = 11785 st_space_time * st_long_timeout_x; 11786 } else { 11787 un->un_dp->unload_timeout = (ushort_t)st_space_time; 11788 } 11789 } 11790 11791 if (un->un_dp->erase_timeout == 0) { 11792 if (un->un_dp->options & ST_LONG_ERASE) { 11793 un->un_dp->erase_timeout = 11794 st_space_time * st_long_space_time_x; 11795 } else { 11796 un->un_dp->erase_timeout = (ushort_t)st_space_time; 11797 } 11798 } 11799} 11800 11801 11802/*ARGSUSED*/ 11803static writablity 11804st_is_not_wormable(struct scsi_tape *un) 11805{ 11806 return (RDWR); 11807} 11808 11809static writablity 11810st_is_hp_lto_tape_worm(struct scsi_tape *un) 11811{ 11812 writablity wrt; 11813 11814 11815 /* Mode sense should be current */ 11816 switch (un->un_mspl->media_type) { 11817 case 0x00: 11818 switch (un->un_mspl->density) { 11819 case 0x40: 11820 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 11821 "Drive has standard Gen I media loaded\n"); 11822 break; 11823 case 0x42: 11824 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 11825 "Drive has standard Gen II media loaded\n"); 11826 break; 11827 case 0x44: 11828 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 11829 "Drive has standard Gen III media loaded\n"); 11830 break; 11831 default: 11832 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 11833 "Drive has standard unknown 0x%X media loaded\n", 11834 un->un_mspl->density); 11835 } 11836 wrt = RDWR; 11837 break; 11838 case 0x01: 11839 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 11840 "Drive has WORM medium loaded\n"); 11841 wrt = WORM; 11842 break; 11843 case 0x80: 11844 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 11845 "Drive has CD-ROM emulation medium loaded\n"); 11846 wrt = WORM; 11847 break; 11848 default: 11849 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 11850 "Drive has an unexpected medium type 0x%X loaded\n", 11851 un->un_mspl->media_type); 11852 wrt = RDWR; 11853 } 11854 11855 return (wrt); 11856} 11857 11858#define LTO_REQ_INQUIRY 44 11859static writablity 11860st_is_hp_lto_worm(struct scsi_tape *un) 11861{ 11862 char *buf; 11863 int result; 11864 writablity wrt; 11865 11866 buf = kmem_zalloc(LTO_REQ_INQUIRY, KM_SLEEP); 11867 11868 result = st_get_special_inquiry(un, LTO_REQ_INQUIRY, buf, 0); 11869 11870 if (result != 0) { 11871 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 11872 "Read Standard Inquiry for WORM support failed"); 11873 wrt = ERROR; 11874 } else if ((buf[40] & 1) == 0) { 11875 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 11876 "Drive is NOT WORMable\n"); 11877 /* This drive doesn't support it so don't check again */ 11878 un->un_dp->options &= ~ST_WORMABLE; 11879 wrt = RDWR; 11880 un->un_wormable = st_is_not_wormable; 11881 } else { 11882 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 11883 "Drive supports WORM version %d\n", buf[40] >> 1); 11884 un->un_wormable = st_is_hp_lto_tape_worm; 11885 wrt = un->un_wormable(un); 11886 } 11887 11888 kmem_free(buf, LTO_REQ_INQUIRY); 11889 11890 /* 11891 * If drive doesn't support it no point in checking further. 11892 */ 11893 return (wrt); 11894} 11895 11896static writablity 11897st_is_t10_worm_device(struct scsi_tape *un) 11898{ 11899 writablity wrt; 11900 11901 if (un->un_mspl->media_type == 0x3c) { 11902 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 11903 "Drive has WORM media loaded\n"); 11904 wrt = WORM; 11905 } else { 11906 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 11907 "Drive has non WORM media loaded\n"); 11908 wrt = RDWR; 11909 } 11910 return (wrt); 11911} 11912 11913#define SEQ_CAP_PAGE (char)0xb0 11914static writablity 11915st_is_t10_worm(struct scsi_tape *un) 11916{ 11917 char *buf; 11918 int result; 11919 writablity wrt; 11920 11921 buf = kmem_zalloc(6, KM_SLEEP); 11922 11923 result = st_get_special_inquiry(un, 6, buf, SEQ_CAP_PAGE); 11924 11925 if (result != 0) { 11926 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 11927 "Read Vitial Inquiry for Sequental Capability" 11928 " WORM support failed %x", result); 11929 wrt = ERROR; 11930 } else if ((buf[4] & 1) == 0) { 11931 ASSERT(buf[1] == SEQ_CAP_PAGE); 11932 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 11933 "Drive is NOT WORMable\n"); 11934 /* This drive doesn't support it so don't check again */ 11935 un->un_dp->options &= ~ST_WORMABLE; 11936 wrt = RDWR; 11937 un->un_wormable = st_is_not_wormable; 11938 } else { 11939 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 11940 "Drive supports WORM\n"); 11941 un->un_wormable = st_is_t10_worm_device; 11942 wrt = un->un_wormable(un); 11943 } 11944 11945 kmem_free(buf, 6); 11946 11947 return (wrt); 11948} 11949 11950 11951#define STK_REQ_SENSE 26 11952 11953static writablity 11954st_is_stk_worm(struct scsi_tape *un) 11955{ 11956 char cdb[CDB_GROUP0] = {SCMD_REQUEST_SENSE, 0, 0, 0, STK_REQ_SENSE, 0}; 11957 struct scsi_extended_sense *sense; 11958 struct uscsi_cmd *cmd; 11959 char *buf; 11960 int result; 11961 writablity wrt; 11962 11963 cmd = kmem_zalloc(sizeof (struct uscsi_cmd), KM_SLEEP); 11964 buf = kmem_alloc(STK_REQ_SENSE, KM_SLEEP); 11965 sense = (struct scsi_extended_sense *)buf; 11966 11967 cmd->uscsi_flags = USCSI_READ; 11968 cmd->uscsi_timeout = un->un_dp->non_motion_timeout; 11969 cmd->uscsi_cdb = &cdb[0]; 11970 cmd->uscsi_bufaddr = buf; 11971 cmd->uscsi_buflen = STK_REQ_SENSE; 11972 cmd->uscsi_cdblen = CDB_GROUP0; 11973 cmd->uscsi_rqlen = 0; 11974 cmd->uscsi_rqbuf = NULL; 11975 11976 result = st_ioctl_cmd(un->un_dev, cmd, 11977 UIO_SYSSPACE, UIO_SYSSPACE, UIO_SYSSPACE); 11978 11979 if (result != 0 || cmd->uscsi_status != 0) { 11980 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 11981 "Request Sense for WORM failed"); 11982 wrt = RDWR; 11983 } else if (sense->es_add_len + 8 < 24) { 11984 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 11985 "Drive didn't send enough sense data for WORM byte %d\n", 11986 sense->es_add_len + 8); 11987 wrt = RDWR; 11988 un->un_wormable = st_is_not_wormable; 11989 } else if ((buf[24]) & 0x02) { 11990 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 11991 "Drive has WORM tape loaded\n"); 11992 wrt = WORM; 11993 un->un_wormable = st_is_stk_worm; 11994 } else { 11995 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 11996 "Drive has normal tape loaded\n"); 11997 wrt = RDWR; 11998 un->un_wormable = st_is_stk_worm; 11999 } 12000 12001 kmem_free(buf, STK_REQ_SENSE); 12002 kmem_free(cmd, sizeof (struct uscsi_cmd)); 12003 return (wrt); 12004} 12005 12006#define DLT_INQ_SZ 44 12007 12008static writablity 12009st_is_dlt_tape_worm(struct scsi_tape *un) 12010{ 12011 caddr_t buf; 12012 int result; 12013 writablity wrt; 12014 12015 buf = kmem_alloc(DLT_INQ_SZ, KM_SLEEP); 12016 12017 /* Read Attribute Media Type */ 12018 12019 result = st_read_attributes(un, 0x0408, buf, 10); 12020 12021 /* 12022 * If this quantum drive is attached via an HBA that cannot 12023 * support thr read attributes command return error in the 12024 * hope that someday they will support the t10 method. 12025 */ 12026 if (result == EINVAL && un->un_max_cdb_sz < CDB_GROUP4) { 12027 scsi_log(ST_DEVINFO, st_label, SCSI_DEBUG, 12028 "Read Attribute Command for WORM Media detection is not " 12029 "supported on the HBA that this drive is attached to."); 12030 wrt = RDWR; 12031 un->un_wormable = st_is_not_wormable; 12032 goto out; 12033 } 12034 12035 if (result != 0) { 12036 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 12037 "Read Attribute Command for WORM Media returned 0x%x", 12038 result); 12039 wrt = RDWR; 12040 un->un_dp->options &= ~ST_WORMABLE; 12041 goto out; 12042 } 12043 12044 if ((uchar_t)buf[9] == 0x80) { 12045 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 12046 "Drive media is WORM\n"); 12047 wrt = WORM; 12048 } else { 12049 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 12050 "Drive media is not WORM Media 0x%x\n", (uchar_t)buf[9]); 12051 wrt = RDWR; 12052 } 12053 12054out: 12055 kmem_free(buf, DLT_INQ_SZ); 12056 return (wrt); 12057} 12058 12059static writablity 12060st_is_dlt_worm(struct scsi_tape *un) 12061{ 12062 caddr_t buf; 12063 int result; 12064 writablity wrt; 12065 12066 buf = kmem_alloc(DLT_INQ_SZ, KM_SLEEP); 12067 12068 result = st_get_special_inquiry(un, DLT_INQ_SZ, buf, 0xC0); 12069 12070 if (result != 0) { 12071 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 12072 "Read Vendor Specific Inquiry for WORM support failed"); 12073 wrt = RDWR; 12074 goto out; 12075 } 12076 12077 if ((buf[2] & 1) == 0) { 12078 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 12079 "Drive is not WORMable\n"); 12080 wrt = RDWR; 12081 un->un_dp->options &= ~ST_WORMABLE; 12082 un->un_wormable = st_is_not_wormable; 12083 goto out; 12084 } else { 12085 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 12086 "Drive is WORMable\n"); 12087 un->un_wormable = st_is_dlt_tape_worm; 12088 wrt = un->un_wormable(un); 12089 } 12090out: 12091 kmem_free(buf, DLT_INQ_SZ); 12092 12093 return (wrt); 12094} 12095 12096typedef struct { 12097 struct modeheader_seq header; 12098#if defined(_BIT_FIELDS_LTOH) /* X86 */ 12099 uchar_t pagecode :6, 12100 :2; 12101 uchar_t page_len; 12102 uchar_t syslogalive :2, 12103 device :1, 12104 abs :1, 12105 ulpbot :1, 12106 prth :1, 12107 ponej :1, 12108 ait :1; 12109 uchar_t span; 12110 12111 uchar_t :6, 12112 worm :1, 12113 mic :1; 12114 uchar_t worm_cap :1, 12115 :7; 12116 uint32_t :32; 12117#else /* SPARC */ 12118 uchar_t :2, 12119 pagecode :6; 12120 uchar_t page_len; 12121 uchar_t ait :1, 12122 device :1, 12123 abs :1, 12124 ulpbot :1, 12125 prth :1, 12126 ponej :1, 12127 syslogalive :2; 12128 uchar_t span; 12129 uchar_t mic :1, 12130 worm :1, 12131 :6; 12132 uchar_t :7, 12133 worm_cap :1; 12134 uint32_t :32; 12135#endif 12136}ait_dev_con; 12137 12138#define AIT_DEV_PAGE 0x31 12139static writablity 12140st_is_sony_worm(struct scsi_tape *un) 12141{ 12142 int result; 12143 writablity wrt; 12144 ait_dev_con *ait_conf; 12145 12146 ait_conf = kmem_zalloc(sizeof (ait_dev_con), KM_SLEEP); 12147 12148 result = st_gen_mode_sense(un, AIT_DEV_PAGE, 12149 (struct seq_mode *)ait_conf, sizeof (ait_dev_con)); 12150 12151 if (result == 0) { 12152 12153 if (ait_conf->pagecode != AIT_DEV_PAGE) { 12154 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 12155 "returned page 0x%x not 0x%x AIT_DEV_PAGE\n", 12156 ait_conf->pagecode, AIT_DEV_PAGE); 12157 wrt = RDWR; 12158 un->un_wormable = st_is_not_wormable; 12159 12160 } else if (ait_conf->worm_cap) { 12161 12162 un->un_wormable = st_is_sony_worm; 12163 12164 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 12165 "Drives is WORMable\n"); 12166 if (ait_conf->worm) { 12167 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 12168 "Media is WORM\n"); 12169 wrt = WORM; 12170 } else { 12171 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 12172 "Media is not WORM\n"); 12173 wrt = RDWR; 12174 } 12175 12176 } else { 12177 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 12178 "Drives not is WORMable\n"); 12179 wrt = RDWR; 12180 /* No further checking required */ 12181 un->un_dp->options &= ~ST_WORMABLE; 12182 } 12183 12184 } else { 12185 12186 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 12187 "AIT device config mode sense page read command failed" 12188 " result = %d ", result); 12189 wrt = ERROR; 12190 un->un_wormable = st_is_not_wormable; 12191 } 12192 12193 kmem_free(ait_conf, sizeof (ait_dev_con)); 12194 return (wrt); 12195} 12196 12197static writablity 12198st_is_drive_worm(struct scsi_tape *un) 12199{ 12200 writablity wrt; 12201 12202 switch (un->un_dp->type) { 12203 case MT_ISDLT: 12204 wrt = st_is_dlt_worm(un); 12205 break; 12206 12207 case MT_ISSTK9840: 12208 wrt = st_is_stk_worm(un); 12209 break; 12210 12211 case MT_IS8MM: 12212 case MT_ISAIT: 12213 wrt = st_is_sony_worm(un); 12214 break; 12215 12216 case MT_LTO: 12217 if (strncmp("HP ", un->un_dp->vid, 3) == 0) { 12218 wrt = st_is_hp_lto_worm(un); 12219 } else { 12220 wrt = st_is_t10_worm(un); 12221 } 12222 break; 12223 12224 default: 12225 wrt = ERROR; 12226 break; 12227 } 12228 12229 /* 12230 * If any of the above failed try the t10 standard method. 12231 */ 12232 if (wrt == ERROR) { 12233 wrt = st_is_t10_worm(un); 12234 } 12235 12236 /* 12237 * Unknown method for detecting WORM media. 12238 */ 12239 if (wrt == ERROR) { 12240 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 12241 "Unknown method for WORM media detection\n"); 12242 wrt = RDWR; 12243 un->un_dp->options &= ~ST_WORMABLE; 12244 } 12245 12246 return (wrt); 12247} 12248 12249static int 12250st_read_attributes(struct scsi_tape *un, uint16_t attribute, caddr_t buf, 12251 size_t size) 12252{ 12253 uchar_t cdb[CDB_GROUP4]; 12254 struct uscsi_cmd *cmd; 12255 int result; 12256 12257 cdb[0] = SCMD_READ_ATTRIBUTE; 12258 cdb[1] = 0; 12259 cdb[2] = 0; 12260 cdb[3] = 0; 12261 cdb[4] = 0; 12262 cdb[5] = 0; 12263 cdb[6] = 0; 12264 cdb[7] = 0; 12265 cdb[8] = (uchar_t)(attribute >> 8); 12266 cdb[9] = (uchar_t)(attribute); 12267 cdb[10] = (uchar_t)(size >> 24); 12268 cdb[11] = (uchar_t)(size >> 16); 12269 cdb[12] = (uchar_t)(size >> 8); 12270 cdb[13] = (uchar_t)(size); 12271 cdb[14] = 0; 12272 cdb[15] = 0; 12273 12274 cmd = kmem_zalloc(sizeof (struct uscsi_cmd), KM_SLEEP); 12275 12276 cmd->uscsi_flags = USCSI_READ | USCSI_DIAGNOSE; 12277 cmd->uscsi_timeout = un->un_dp->non_motion_timeout; 12278 cmd->uscsi_cdb = (caddr_t)&cdb[0]; 12279 cmd->uscsi_bufaddr = (caddr_t)buf; 12280 cmd->uscsi_buflen = size; 12281 cmd->uscsi_cdblen = sizeof (cdb); 12282 12283 result = st_ioctl_cmd(un->un_dev, cmd, 12284 UIO_SYSSPACE, UIO_SYSSPACE, UIO_SYSSPACE); 12285 12286 if (result != 0 || cmd->uscsi_status != 0) { 12287 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 12288 "st_read_attribute failed: result %d status %d\n", 12289 result, cmd->uscsi_status); 12290 if (result == 0) { 12291 result = EIO; 12292 } 12293 } 12294 12295 kmem_free(cmd, sizeof (cdb)); 12296 return (result); 12297} 12298 12299static int 12300st_get_special_inquiry(struct scsi_tape *un, uchar_t size, caddr_t dest, 12301 uchar_t page) 12302{ 12303 char cdb[CDB_GROUP0]; 12304 struct scsi_extended_sense *sense; 12305 struct uscsi_cmd *cmd; 12306 int result; 12307 12308 cdb[0] = SCMD_INQUIRY; 12309 cdb[1] = page ? 1 : 0; 12310 cdb[2] = page; 12311 cdb[3] = 0; 12312 cdb[4] = size; 12313 cdb[5] = 0; 12314 12315 cmd = kmem_zalloc(sizeof (struct uscsi_cmd), KM_SLEEP); 12316 sense = kmem_alloc(sizeof (struct scsi_extended_sense), KM_SLEEP); 12317 12318 cmd->uscsi_flags = USCSI_READ | USCSI_RQENABLE; 12319 cmd->uscsi_timeout = un->un_dp->non_motion_timeout; 12320 cmd->uscsi_cdb = &cdb[0]; 12321 cmd->uscsi_bufaddr = dest; 12322 cmd->uscsi_buflen = size; 12323 cmd->uscsi_cdblen = CDB_GROUP0; 12324 cmd->uscsi_rqlen = sizeof (struct scsi_extended_sense); 12325 cmd->uscsi_rqbuf = (caddr_t)sense; 12326 12327 result = st_ioctl_cmd(un->un_dev, cmd, 12328 UIO_SYSSPACE, UIO_SYSSPACE, UIO_SYSSPACE); 12329 12330 if (result != 0 || cmd->uscsi_status != 0) { 12331 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 12332 "st_get_special_inquiry() failed for page %x", page); 12333 if (result == 0) { 12334 result = EIO; 12335 } 12336 } 12337 12338 kmem_free(sense, sizeof (struct scsi_extended_sense)); 12339 kmem_free(cmd, sizeof (struct uscsi_cmd)); 12340 12341 return (result); 12342} 12343 12344 12345#if defined(__i386) || defined(__amd64) 12346 12347/* 12348 * release contig_mem and wake up waiting thread, if any 12349 */ 12350static void 12351st_release_contig_mem(struct scsi_tape *un, struct contig_mem *cp) 12352{ 12353 mutex_enter(ST_MUTEX); 12354 12355 cp->cm_next = un->un_contig_mem; 12356 un->un_contig_mem = cp; 12357 un->un_contig_mem_available_num++; 12358 cv_broadcast(&un->un_contig_mem_cv); 12359 12360 mutex_exit(ST_MUTEX); 12361} 12362 12363/* 12364 * St_get_contig_mem will return a contig_mem if there is one available 12365 * in current system. Otherwise, it will try to alloc one, if the total 12366 * number of contig_mem is within st_max_contig_mem_num. 12367 * It will sleep, if allowed by caller or return NULL, if no contig_mem 12368 * is available for now. 12369 */ 12370static struct contig_mem * 12371st_get_contig_mem(struct scsi_tape *un, size_t len, int alloc_flags) 12372{ 12373 size_t rlen; 12374 struct contig_mem *cp = NULL; 12375 ddi_acc_handle_t acc_hdl; 12376 caddr_t addr; 12377 int big_enough = 0; 12378 int (*dma_alloc_cb)() = (alloc_flags == KM_SLEEP) ? 12379 DDI_DMA_SLEEP : DDI_DMA_DONTWAIT; 12380 12381 /* Try to get one available contig_mem */ 12382 mutex_enter(ST_MUTEX); 12383 if (un->un_contig_mem_available_num > 0) { 12384 ST_GET_CONTIG_MEM_HEAD(un, cp, len, big_enough); 12385 } else if (un->un_contig_mem_total_num < st_max_contig_mem_num) { 12386 /* 12387 * we failed to get one. we're going to 12388 * alloc one more contig_mem for this I/O 12389 */ 12390 mutex_exit(ST_MUTEX); 12391 cp = (struct contig_mem *)kmem_zalloc( 12392 sizeof (struct contig_mem) + biosize(), 12393 alloc_flags); 12394 if (cp == NULL) { 12395 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 12396 "alloc contig_mem failure\n"); 12397 return (NULL); /* cannot get one */ 12398 } 12399 cp->cm_bp = (struct buf *) 12400 (((caddr_t)cp) + sizeof (struct contig_mem)); 12401 bioinit(cp->cm_bp); 12402 mutex_enter(ST_MUTEX); 12403 un->un_contig_mem_total_num++; /* one more available */ 12404 } else { 12405 /* 12406 * we failed to get one and we're NOT allowed to 12407 * alloc more contig_mem 12408 */ 12409 if (alloc_flags == KM_SLEEP) { 12410 while (un->un_contig_mem_available_num <= 0) { 12411 cv_wait(&un->un_contig_mem_cv, 12412 ST_MUTEX); 12413 } 12414 ST_GET_CONTIG_MEM_HEAD(un, cp, len, big_enough); 12415 } else { 12416 mutex_exit(ST_MUTEX); 12417 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 12418 "alloc contig_mem failure\n"); 12419 return (NULL); /* cannot get one */ 12420 } 12421 } 12422 mutex_exit(ST_MUTEX); 12423 12424 /* We need to check if this block of mem is big enough for this I/O */ 12425 if (cp->cm_len < len) { 12426 /* not big enough, need to alloc a new one */ 12427 if (ddi_dma_mem_alloc(un->un_contig_mem_hdl, len, &st_acc_attr, 12428 DDI_DMA_STREAMING, dma_alloc_cb, NULL, 12429 &addr, &rlen, &acc_hdl) != DDI_SUCCESS) { 12430 ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG, 12431 "alloc contig_mem failure: not enough mem\n"); 12432 st_release_contig_mem(un, cp); 12433 cp = NULL; 12434 } else { 12435 if (cp->cm_addr) { 12436 /* release previous one before attach new one */ 12437 ddi_dma_mem_free(&cp->cm_acc_hdl); 12438 } 12439 mutex_enter(ST_MUTEX); 12440 un->un_max_contig_mem_len = 12441 un->un_max_contig_mem_len >= len ? 12442 un->un_max_contig_mem_len : len; 12443 mutex_exit(ST_MUTEX); 12444 12445 /* attach new mem to this cp */ 12446 cp->cm_addr = addr; 12447 cp->cm_acc_hdl = acc_hdl; 12448 cp->cm_len = len; 12449 12450 goto alloc_ok; /* get one usable cp */ 12451 } 12452 } else { 12453 goto alloc_ok; /* get one usable cp */ 12454 } 12455 12456 /* cannot find/alloc a usable cp, when we get here */ 12457 12458 mutex_enter(ST_MUTEX); 12459 if ((un->un_max_contig_mem_len < len) || 12460 (alloc_flags != KM_SLEEP)) { 12461 mutex_exit(ST_MUTEX); 12462 return (NULL); 12463 } 12464 12465 /* 12466 * we're allowed to sleep, and there is one big enough 12467 * contig mem in the system, which is currently in use, 12468 * wait for it... 12469 */ 12470 big_enough = 1; 12471 do { 12472 cv_wait(&un->un_contig_mem_cv, ST_MUTEX); 12473 ST_GET_CONTIG_MEM_HEAD(un, cp, len, big_enough); 12474 } while (cp == NULL); 12475 mutex_exit(ST_MUTEX); 12476 12477 /* we get the big enough contig mem, finally */ 12478 12479alloc_ok: 12480 /* init bp attached to this cp */ 12481 bioreset(cp->cm_bp); 12482 cp->cm_bp->b_un.b_addr = cp->cm_addr; 12483 cp->cm_bp->b_private = (void *)cp; 12484 12485 return (cp); 12486} 12487 12488/* 12489 * this is the biodone func for the bp used in big block I/O 12490 */ 12491static int 12492st_bigblk_xfer_done(struct buf *bp) 12493{ 12494 struct contig_mem *cp; 12495 struct buf *orig_bp; 12496 int remapped = 0; 12497 int ioerr; 12498 struct scsi_tape *un; 12499 12500 /* sanity check */ 12501 if (bp == NULL) { 12502 return (DDI_FAILURE); 12503 } 12504 12505 un = ddi_get_soft_state(st_state, MTUNIT(bp->b_edev)); 12506 if (un == NULL) { 12507 return (DDI_FAILURE); 12508 } 12509 12510 cp = (struct contig_mem *)bp->b_private; 12511 orig_bp = cp->cm_bp; /* get back the bp we have replaced */ 12512 cp->cm_bp = bp; 12513 12514 /* special handling for special I/O */ 12515 if (cp->cm_use_sbuf) { 12516#ifndef __lock_lint 12517 ASSERT(un->un_sbuf_busy); 12518#endif 12519 un->un_sbufp = orig_bp; 12520 cp->cm_use_sbuf = 0; 12521 } 12522 12523 orig_bp->b_resid = bp->b_resid; 12524 ioerr = geterror(bp); 12525 if (ioerr != 0) { 12526 bioerror(orig_bp, ioerr); 12527 } else if (orig_bp->b_flags & B_READ) { 12528 /* copy data back to original bp */ 12529 if (orig_bp->b_flags & (B_PHYS | B_PAGEIO)) { 12530 bp_mapin(orig_bp); 12531 remapped = 1; 12532 } 12533 bcopy(bp->b_un.b_addr, orig_bp->b_un.b_addr, 12534 bp->b_bcount - bp->b_resid); 12535 if (remapped) 12536 bp_mapout(orig_bp); 12537 } 12538 12539 st_release_contig_mem(un, cp); 12540 12541 biodone(orig_bp); 12542 12543 return (DDI_SUCCESS); 12544} 12545 12546/* 12547 * We use this func to replace original bp that may not be able to do I/O 12548 * in big block size with one that can 12549 */ 12550static struct buf * 12551st_get_bigblk_bp(struct buf *bp) 12552{ 12553 struct contig_mem *cp; 12554 struct scsi_tape *un; 12555 struct buf *cont_bp; 12556 int remapped = 0; 12557 12558 un = ddi_get_soft_state(st_state, MTUNIT(bp->b_edev)); 12559 if (un == NULL) { 12560 return (bp); 12561 } 12562 12563 /* try to get one contig_mem */ 12564 cp = st_get_contig_mem(un, bp->b_bcount, KM_SLEEP); 12565 if (!cp) { 12566 scsi_log(ST_DEVINFO, st_label, CE_WARN, 12567 "Cannot alloc contig buf for I/O for %lu blk size", 12568 bp->b_bcount); 12569 return (bp); 12570 } 12571 cont_bp = cp->cm_bp; 12572 cp->cm_bp = bp; 12573 12574 /* make sure that we "are" using un_sbufp for special I/O */ 12575 if (bp == un->un_sbufp) { 12576#ifndef __lock_lint 12577 ASSERT(un->un_sbuf_busy); 12578#endif 12579 un->un_sbufp = cont_bp; 12580 cp->cm_use_sbuf = 1; 12581 } 12582 12583 /* clone bp */ 12584 cont_bp->b_bcount = bp->b_bcount; 12585 cont_bp->b_resid = bp->b_resid; 12586 cont_bp->b_iodone = st_bigblk_xfer_done; 12587 cont_bp->b_file = bp->b_file; 12588 cont_bp->b_offset = bp->b_offset; 12589 cont_bp->b_dip = bp->b_dip; 12590 cont_bp->b_error = 0; 12591 cont_bp->b_proc = NULL; 12592 cont_bp->b_flags = bp->b_flags & ~(B_PAGEIO | B_PHYS | B_SHADOW); 12593 cont_bp->b_shadow = NULL; 12594 cont_bp->b_pages = NULL; 12595 cont_bp->b_edev = bp->b_edev; 12596 cont_bp->b_dev = bp->b_dev; 12597 cont_bp->b_lblkno = bp->b_lblkno; 12598 cont_bp->b_forw = bp->b_forw; 12599 cont_bp->b_back = bp->b_back; 12600 cont_bp->av_forw = bp->av_forw; 12601 cont_bp->av_back = bp->av_back; 12602 cont_bp->b_bufsize = bp->b_bufsize; 12603 12604 /* get data in original bp */ 12605 if (bp->b_flags & B_WRITE) { 12606 if (bp->b_flags & (B_PHYS | B_PAGEIO)) { 12607 bp_mapin(bp); 12608 remapped = 1; 12609 } 12610 bcopy(bp->b_un.b_addr, cont_bp->b_un.b_addr, bp->b_bcount); 12611 if (remapped) 12612 bp_mapout(bp); 12613 } 12614 12615 return (cont_bp); 12616} 12617#else 12618#ifdef __lock_lint 12619static int 12620st_bigblk_xfer_done(struct buf *bp) 12621{ 12622 return (0); 12623} 12624#endif 12625#endif 12626