Lines Matching refs:un
46 #define IOSP KSTAT_IO_PTR(un->un_stats)
53 if ((bp != un->un_sbufp) && un->un_stats && IS_RW(bp)) { \
57 #define ST_DO_ERRSTATS(un, x) \ argument
58 if (un->un_errstats) { \
60 stp = (struct st_errstats *)un->un_errstats->ks_data; \
84 #define ST_GET_CONTIG_MEM_HEAD(un, cp, len, big_enough) { \ argument
86 for ((cp) = (un)->un_contig_mem; \
92 (un)->un_contig_mem = (cp)->cm_next; \
97 (un)->un_contig_mem_available_num--; \
492 static void st_known_tape_type(struct scsi_tape *un);
509 static int st_find_eod(struct scsi_tape *un);
511 static int st_uscsi_cmd(struct scsi_tape *un, struct uscsi_cmd *, int flag);
512 static int st_mtioctop(struct scsi_tape *un, intptr_t arg, int flag);
513 static int st_mtiocltop(struct scsi_tape *un, intptr_t arg, int flag);
514 static int st_do_mtioctop(struct scsi_tape *un, struct mtlop *mtop);
515 static void st_start(struct scsi_tape *un);
516 static int st_handle_start_busy(struct scsi_tape *un, struct buf *bp,
518 static int st_handle_intr_busy(struct scsi_tape *un, struct buf *bp,
520 static int st_handle_intr_retry_lcmd(struct scsi_tape *un, struct buf *bp);
521 static void st_done_and_mutex_exit(struct scsi_tape *un, struct buf *bp);
522 static void st_init(struct scsi_tape *un);
523 static void st_make_cmd(struct scsi_tape *un, struct buf *bp,
528 static void st_set_state(struct scsi_tape *un, buf_t *bp);
531 static int st_cmd(struct scsi_tape *un, int com, int64_t count, int wait);
532 static int st_setup_cmd(struct scsi_tape *un, buf_t *bp, int com,
534 static int st_set_compression(struct scsi_tape *un);
536 static int st_determine_generic(struct scsi_tape *un);
537 static int st_determine_density(struct scsi_tape *un, int rw);
538 static int st_get_density(struct scsi_tape *un);
539 static int st_set_density(struct scsi_tape *un);
540 static int st_loadtape(struct scsi_tape *un);
541 static int st_modesense(struct scsi_tape *un);
542 static int st_modeselect(struct scsi_tape *un);
543 static errstate st_handle_incomplete(struct scsi_tape *un, struct buf *bp);
544 static int st_wrongtapetype(struct scsi_tape *un);
545 static errstate st_check_error(struct scsi_tape *un, struct scsi_pkt *pkt);
546 static errstate st_handle_sense(struct scsi_tape *un, struct buf *bp,
548 static errstate st_handle_autosense(struct scsi_tape *un, struct buf *bp,
550 static int st_get_error_entry(struct scsi_tape *un, intptr_t arg, int flag);
551 static void st_update_error_stack(struct scsi_tape *un, struct scsi_pkt *pkt,
553 static void st_empty_error_stack(struct scsi_tape *un);
554 static errstate st_decode_sense(struct scsi_tape *un, struct buf *bp, int amt,
562 static int st_gen_mode_sense(struct scsi_tape *un, ubufunc_t ubf, int page,
564 static int st_change_block_size(struct scsi_tape *un, uint32_t nblksz);
565 static int st_gen_mode_select(struct scsi_tape *un, ubufunc_t ubf,
567 static int st_read_block_limits(struct scsi_tape *un,
569 static int st_report_density_support(struct scsi_tape *un,
571 static int st_report_supported_operation(struct scsi_tape *un,
573 static int st_tape_init(struct scsi_tape *un);
574 static void st_flush(struct scsi_tape *un);
575 static void st_set_pe_errno(struct scsi_tape *un);
576 static void st_hba_unflush(struct scsi_tape *un);
577 static void st_turn_pe_on(struct scsi_tape *un);
578 static void st_turn_pe_off(struct scsi_tape *un);
579 static void st_set_pe_flag(struct scsi_tape *un);
580 static void st_clear_pe(struct scsi_tape *un);
581 static void st_wait_for_io(struct scsi_tape *un);
582 static int st_set_devconfig_page(struct scsi_tape *un, int compression_on);
583 static int st_set_datacomp_page(struct scsi_tape *un, int compression_on);
584 static int st_reserve_release(struct scsi_tape *un, int command, ubufunc_t ubf);
585 static int st_check_cdb_for_need_to_reserve(struct scsi_tape *un, uchar_t *cdb);
586 static int st_check_cmd_for_need_to_reserve(struct scsi_tape *un, uchar_t cmd,
588 static int st_take_ownership(struct scsi_tape *un, ubufunc_t ubf);
589 static int st_check_asc_ascq(struct scsi_tape *un);
590 static int st_check_clean_bit(struct scsi_tape *un);
591 static int st_check_alert_flags(struct scsi_tape *un);
592 static int st_check_sequential_clean_bit(struct scsi_tape *un);
593 static int st_check_sense_clean_bit(struct scsi_tape *un);
595 static void st_calculate_timeouts(struct scsi_tape *un);
596 static writablity st_is_drive_worm(struct scsi_tape *un);
597 static int st_read_attributes(struct scsi_tape *un, uint16_t attribute,
599 static int st_get_special_inquiry(struct scsi_tape *un, uchar_t size,
601 static int st_update_block_pos(struct scsi_tape *un, bufunc_t bf,
603 static int st_interpret_read_pos(struct scsi_tape const *un, tapepos_t *dest,
605 static int st_get_read_pos(struct scsi_tape *un, buf_t *bp);
606 static int st_logical_block_locate(struct scsi_tape *un, ubufunc_t ubf,
608 static int st_mtfsf_ioctl(struct scsi_tape *un, int64_t files);
609 static int st_mtfsr_ioctl(struct scsi_tape *un, int64_t count);
610 static int st_mtbsf_ioctl(struct scsi_tape *un, int64_t files);
611 static int st_mtnbsf_ioctl(struct scsi_tape *un, int64_t count);
612 static int st_mtbsr_ioctl(struct scsi_tape *un, int64_t num);
613 static int st_mtfsfm_ioctl(struct scsi_tape *un, int64_t cnt);
614 static int st_mtbsfm_ioctl(struct scsi_tape *un, int64_t cnt);
615 static int st_backward_space_files(struct scsi_tape *un, int64_t count,
617 static int st_forward_space_files(struct scsi_tape *un, int64_t files);
618 static int st_scenic_route_to_begining_of_file(struct scsi_tape *un,
620 static int st_space_to_begining_of_file(struct scsi_tape *un);
621 static int st_space_records(struct scsi_tape *un, int64_t records);
622 static int st_get_media_identification(struct scsi_tape *un, ubufunc_t bufunc);
623 static errstate st_command_recovery(struct scsi_tape *un, struct scsi_pkt *pkt,
627 static int st_rcmd(struct scsi_tape *un, int com, int64_t count, int wait);
628 static int st_uscsi_rcmd(struct scsi_tape *un, struct uscsi_cmd *ucmd,
630 static void st_add_recovery_info_to_pkt(struct scsi_tape *un, buf_t *bp,
632 static int st_check_mode_for_change(struct scsi_tape *un, ubufunc_t ubf);
633 static int st_test_path_to_device(struct scsi_tape *un);
634 static int st_recovery_read_pos(struct scsi_tape *un, read_p_types type,
636 static int st_recovery_get_position(struct scsi_tape *un, tapepos_t *read,
638 static int st_compare_expected_position(struct scsi_tape *un, st_err_info *ei,
642 static int st_transport(struct scsi_tape *un, struct scsi_pkt *pkt);
645 static int st_reset(struct scsi_tape *un, int reset_type);
649 static int st_set_target_TLR_mode(struct scsi_tape *un, ubufunc_t ubf);
650 static int st_make_sure_mode_data_is_correct(struct scsi_tape *un,
657 static void st_release_contig_mem(struct scsi_tape *un, struct contig_mem *cp);
658 static struct contig_mem *st_get_contig_mem(struct scsi_tape *un, size_t len,
670 static int st_validate_tapemarks(struct scsi_tape *un, ubufunc_t ubf,
674 static void st_debug_cmds(struct scsi_tape *un, int com, int count, int wait);
872 struct scsi_tape *un; in st_attach() local
899 if (!(un = ddi_get_soft_state(st_state, instance))) { in st_attach()
902 dev_instance = ((un->un_dev == 0) ? MTMINOR(instance) : in st_attach()
903 un->un_dev); in st_attach()
907 un->un_throttle = un->un_max_throttle; in st_attach()
908 un->un_tids_at_suspend = 0; in st_attach()
909 un->un_pwr_mgmt = ST_PWR_NORMAL; in st_attach()
911 if (un->un_swr_token) { in st_attach()
912 scsi_watch_resume(un->un_swr_token); in st_attach()
918 if ((un->un_tids_at_suspend & ST_DELAY_TID) != 0) { in st_attach()
920 un->un_delay_tid = timeout( in st_attach()
921 st_delayed_cv_broadcast, un, in st_attach()
927 if (un->un_tids_at_suspend & ST_HIB_TID) { in st_attach()
929 un->un_hib_tid = timeout(st_intr_restart, un, in st_attach()
939 if ((un->un_suspend_pos.pmode != invalid) && in st_attach()
940 ((un->un_suspend_pos.fileno > 0) || in st_attach()
941 (un->un_suspend_pos.blkno > 0)) || in st_attach()
942 (un->un_suspend_pos.lgclblkno > 0)) { in st_attach()
953 (void) st_validate_tapemarks(un, in st_attach()
954 st_uscsi_cmd, &un->un_suspend_pos); in st_attach()
960 un->un_suspend_pos.pmode = invalid; in st_attach()
964 if (un->un_ncmds || un->un_quef) { in st_attach()
965 st_start(un); in st_attach()
968 cv_broadcast(&un->un_suspend_cv); in st_attach()
976 un = ddi_get_soft_state(st_state, instance); in st_attach()
1008 un->un_arq_enabled = 1; in st_attach()
1010 un->un_arq_enabled = in st_attach()
1015 (un->un_arq_enabled ? "enabled" : "disabled")); in st_attach()
1017 un->un_untagged_qing = in st_attach()
1024 if (un->un_arq_enabled && un->un_untagged_qing) { in st_attach()
1038 un->un_max_throttle = un->un_throttle = un->un_last_throttle = 1; in st_attach()
1039 un->un_flush_on_errors = 0; in st_attach()
1040 un->un_mkr_pkt = (struct scsi_pkt *)NULL; in st_attach()
1044 un->un_throttle, un->un_max_throttle); in st_attach()
1047 un->un_persistence = 0; in st_attach()
1048 un->un_persist_errors = 0; in st_attach()
1053 un->un_maxdma = scsi_ifgetcap(&devp->sd_address, "dma-max", 1); in st_attach()
1054 if (un->un_maxdma == -1) { in st_attach()
1057 un->un_maxdma = (64 * ONE_K); in st_attach()
1075 un->un_maxdma_arch = scsi_ifgetcap(&devp->sd_address, "dma-max-arch", in st_attach()
1082 if ((un->un_maxdma_arch == -1) || in st_attach()
1083 ((uint_t)un->un_maxdma < (uint_t)un->un_maxdma_arch)) { in st_attach()
1084 un->un_maxdma_arch = un->un_maxdma; in st_attach()
1091 un->un_max_cdb_sz = in st_attach()
1093 if (un->un_max_cdb_sz < CDB_GROUP0) { in st_attach()
1095 "HBA reported max-cdb-length as %d\n", un->un_max_cdb_sz); in st_attach()
1096 un->un_max_cdb_sz = CDB_GROUP4; /* optimistic default */ in st_attach()
1100 un->un_multipath = 0; in st_attach()
1102 un->un_multipath = 1; in st_attach()
1105 un->un_maxbsize = MAXBSIZE_UNKNOWN; in st_attach()
1107 un->un_mediastate = MTIO_NONE; in st_attach()
1108 un->un_HeadClean = TAPE_ALERT_SUPPORT_UNKNOWN; in st_attach()
1113 un->un_stats = kstat_create("st", instance, NULL, "tape", in st_attach()
1115 if (un->un_stats) { in st_attach()
1116 un->un_stats->ks_lock = ST_MUTEX; in st_attach()
1117 kstat_install(un->un_stats); in st_attach()
1119 (void) st_create_errstats(un, instance); in st_attach()
1125 un->un_dev = MTMINOR(instance); in st_attach()
1126 st_known_tape_type(un); in st_attach()
1127 un->un_dev = 0; in st_attach()
1142 minor |= un->un_dp->default_density; in st_attach()
1154 st_reset_notification, (caddr_t)un); in st_attach()
1155 cv_destroy(&un->un_clscv); in st_attach()
1156 cv_destroy(&un->un_sbuf_cv); in st_attach()
1157 cv_destroy(&un->un_queue_cv); in st_attach()
1158 cv_destroy(&un->un_state_cv); in st_attach()
1160 cv_destroy(&un->un_contig_mem_cv); in st_attach()
1162 cv_destroy(&un->un_suspend_cv); in st_attach()
1163 cv_destroy(&un->un_tape_busy_cv); in st_attach()
1164 cv_destroy(&un->un_recov_buf_cv); in st_attach()
1165 if (un->un_recov_taskq) { in st_attach()
1166 ddi_taskq_destroy(un->un_recov_taskq); in st_attach()
1168 if (un->un_sbufp) { in st_attach()
1169 freerbuf(un->un_sbufp); in st_attach()
1171 if (un->un_recov_buf) { in st_attach()
1172 freerbuf(un->un_recov_buf); in st_attach()
1174 if (un->un_uscsi_rqs_buf) { in st_attach()
1175 kmem_free(un->un_uscsi_rqs_buf, SENSE_LENGTH); in st_attach()
1177 if (un->un_mspl) { in st_attach()
1178 i_ddi_mem_free((caddr_t)un->un_mspl, NULL); in st_attach()
1180 if (un->un_dp_size) { in st_attach()
1181 kmem_free(un->un_dp, un->un_dp_size); in st_attach()
1183 if (un->un_state) { in st_attach()
1184 kstat_delete(un->un_stats); in st_attach()
1186 if (un->un_errstats) { in st_attach()
1187 kstat_delete(un->un_errstats); in st_attach()
1190 scsi_destroy_pkt(un->un_rqs); in st_attach()
1191 scsi_free_consistent_buf(un->un_rqs_bp); in st_attach()
1222 struct scsi_tape *un; in st_detach() local
1229 if (!(un = ddi_get_soft_state(st_state, instance))) { in st_detach()
1238 st_empty_error_stack(un); in st_detach()
1255 (void *)un); in st_detach()
1257 if (((un->un_dp->options & ST_UNLOADABLE) == 0) || in st_detach()
1258 ((un->un_rsvd_status & ST_APPLICATION_RESERVATIONS) != 0) || in st_detach()
1259 (un->un_ncmds != 0) || (un->un_quef != NULL) || in st_detach()
1260 (un->un_state != ST_STATE_CLOSED)) { in st_detach()
1268 un->un_unit_attention_flags |= 4; in st_detach()
1280 if ((un->un_dev) && /* Been opened since attach */ in st_detach()
1281 ((un->un_pos.pmode == legacy) && in st_detach()
1282 (un->un_pos.fileno > 0) || /* Known position not rewound */ in st_detach()
1283 (un->un_pos.blkno != 0)) || /* Or within first file */ in st_detach()
1284 ((un->un_pos.pmode == logical) && in st_detach()
1285 (un->un_pos.lgclblkno > 0))) { in st_detach()
1296 result = st_cmd(un, SCMD_TEST_UNIT_READY, 0, SYNC_CMD); in st_detach()
1301 un->un_state = ST_STATE_CLOSED; in st_detach()
1306 un->un_status, un->un_pos.fileno, un->un_pos.blkno); in st_detach()
1312 if ((un->un_dev) && /* Been opened since attach */ in st_detach()
1314 ((((un->un_pos.pmode == legacy) && in st_detach()
1315 (un->un_pos.fileno > 0) || /* Known position not rewound */ in st_detach()
1316 (un->un_pos.blkno != 0)) || /* Or within first file */ in st_detach()
1317 ((un->un_pos.pmode == logical) && in st_detach()
1318 (un->un_pos.lgclblkno > 0))) && in st_detach()
1319 ((un->un_state == ST_STATE_CLOSED) && in st_detach()
1320 (un->un_laststate == ST_STATE_CLOSING)))) { in st_detach()
1324 " lgclblkno=0x%"PRIx64"\n", un->un_pos.pmode, in st_detach()
1325 un->un_pos.fileno, un->un_pos.blkno, in st_detach()
1326 un->un_pos.lgclblkno); in st_detach()
1327 un->un_unit_attention_flags |= 4; in st_detach()
1335 if (un->un_dev && (un->un_rsvd_status & ST_RESERVE) && in st_detach()
1338 (void) st_reserve_release(un, ST_RELEASE, st_uscsi_cmd); in st_detach()
1349 st_reset_notification, (caddr_t)un); in st_detach()
1350 cv_destroy(&un->un_clscv); in st_detach()
1351 cv_destroy(&un->un_sbuf_cv); in st_detach()
1352 cv_destroy(&un->un_queue_cv); in st_detach()
1353 cv_destroy(&un->un_suspend_cv); in st_detach()
1354 cv_destroy(&un->un_tape_busy_cv); in st_detach()
1355 cv_destroy(&un->un_recov_buf_cv); in st_detach()
1357 if (un->un_recov_taskq) { in st_detach()
1358 ddi_taskq_destroy(un->un_recov_taskq); in st_detach()
1361 if (un->un_hib_tid) { in st_detach()
1362 (void) untimeout(un->un_hib_tid); in st_detach()
1363 un->un_hib_tid = 0; in st_detach()
1366 if (un->un_delay_tid) { in st_detach()
1367 (void) untimeout(un->un_delay_tid); in st_detach()
1368 un->un_delay_tid = 0; in st_detach()
1370 cv_destroy(&un->un_state_cv); in st_detach()
1373 cv_destroy(&un->un_contig_mem_cv); in st_detach()
1375 if (un->un_contig_mem_hdl != NULL) { in st_detach()
1376 ddi_dma_free_handle(&un->un_contig_mem_hdl); in st_detach()
1379 if (un->un_sbufp) { in st_detach()
1380 freerbuf(un->un_sbufp); in st_detach()
1382 if (un->un_recov_buf) { in st_detach()
1383 freerbuf(un->un_recov_buf); in st_detach()
1385 if (un->un_uscsi_rqs_buf) { in st_detach()
1386 kmem_free(un->un_uscsi_rqs_buf, SENSE_LENGTH); in st_detach()
1388 if (un->un_mspl) { in st_detach()
1389 i_ddi_mem_free((caddr_t)un->un_mspl, NULL); in st_detach()
1391 if (un->un_rqs) { in st_detach()
1392 scsi_destroy_pkt(un->un_rqs); in st_detach()
1393 scsi_free_consistent_buf(un->un_rqs_bp); in st_detach()
1395 if (un->un_mkr_pkt) { in st_detach()
1396 scsi_destroy_pkt(un->un_mkr_pkt); in st_detach()
1398 if (un->un_arq_enabled) { in st_detach()
1401 if (un->un_dp_size) { in st_detach()
1402 kmem_free(un->un_dp, un->un_dp_size); in st_detach()
1404 if (un->un_stats) { in st_detach()
1405 kstat_delete(un->un_stats); in st_detach()
1406 un->un_stats = (kstat_t *)0; in st_detach()
1408 if (un->un_errstats) { in st_detach()
1409 kstat_delete(un->un_errstats); in st_detach()
1410 un->un_errstats = (kstat_t *)0; in st_detach()
1412 if (un->un_media_id_len) { in st_detach()
1413 kmem_free(un->un_media_id, un->un_media_id_len); in st_detach()
1449 if (un->un_dev == 0) in st_detach()
1450 un->un_dev = MTMINOR(instance); in st_detach()
1457 if (un->un_pwr_mgmt == ST_PWR_SUSPENDED) { in st_detach()
1461 if (un->un_state != ST_STATE_CLOSED) { in st_detach()
1478 while (un->un_ncmds || un->un_quef || in st_detach()
1479 (un->un_state == ST_STATE_RESOURCE_WAIT)) { in st_detach()
1481 if (cv_timedwait(&un->un_tape_busy_cv, ST_MUTEX, in st_detach()
1486 if (st_reset(un, RESET_LUN) == 0) { in st_detach()
1487 if (un->un_last_throttle) { in st_detach()
1488 un->un_throttle = in st_detach()
1489 un->un_last_throttle; in st_detach()
1505 (void) st_update_block_pos(un, st_cmd, 0); in st_detach()
1506 COPY_POS(&un->un_suspend_pos, &un->un_pos); in st_detach()
1513 (void) st_cmd(un, SCMD_WRITE_FILE_MARK, 0, SYNC_CMD); in st_detach()
1522 (void) st_cmd(un, SCMD_REWIND, 0, SYNC_CMD); in st_detach()
1525 un->un_pwr_mgmt = ST_PWR_SUSPENDED; in st_detach()
1526 un->un_throttle = 0; in st_detach()
1531 if (un->un_delay_tid) { in st_detach()
1532 timeout_id_t temp_id = un->un_delay_tid; in st_detach()
1533 un->un_delay_tid = 0; in st_detach()
1534 un->un_tids_at_suspend |= ST_DELAY_TID; in st_detach()
1540 if (un->un_hib_tid) { in st_detach()
1541 timeout_id_t temp_id = un->un_hib_tid; in st_detach()
1542 un->un_hib_tid = 0; in st_detach()
1543 un->un_tids_at_suspend |= ST_HIB_TID; in st_detach()
1552 if (un->un_swr_token) { in st_detach()
1553 opaque_t temp_token = un->un_swr_token; in st_detach()
1574 struct scsi_tape *un; in st_info() local
1583 if ((un = ddi_get_soft_state(st_state, instance)) == NULL) in st_info()
1603 struct scsi_tape *un = NULL; in st_doattach() local
1654 un = ddi_get_soft_state(st_state, instance); in st_doattach()
1656 ASSERT(un != NULL); in st_doattach()
1658 un->un_rqs_bp = scsi_alloc_consistent_buf(&devp->sd_address, NULL, in st_doattach()
1660 if (un->un_rqs_bp == NULL) { in st_doattach()
1663 un->un_rqs = scsi_init_pkt(&devp->sd_address, NULL, un->un_rqs_bp, in st_doattach()
1665 if (!un->un_rqs) { in st_doattach()
1668 ASSERT(un->un_rqs->pkt_resid == 0); in st_doattach()
1670 (struct scsi_extended_sense *)un->un_rqs_bp->b_un.b_addr; in st_doattach()
1671 ASSERT(geterror(un->un_rqs_bp) == 0); in st_doattach()
1673 (void) scsi_setup_cdb((union scsi_cdb *)un->un_rqs->pkt_cdbp, in st_doattach()
1675 FILL_SCSI1_LUN(devp, un->un_rqs); in st_doattach()
1676 un->un_rqs->pkt_flags |= (FLAG_SENSING | FLAG_HEAD | FLAG_NODISCON); in st_doattach()
1677 un->un_rqs->pkt_time = st_io_time; in st_doattach()
1678 un->un_rqs->pkt_comp = st_intr; in st_doattach()
1679 ri = (recov_info *)un->un_rqs->pkt_private; in st_doattach()
1686 un->un_sbufp = getrbuf(km_flags); in st_doattach()
1687 un->un_recov_buf = getrbuf(km_flags); in st_doattach()
1689 un->un_uscsi_rqs_buf = kmem_alloc(SENSE_LENGTH, KM_SLEEP); in st_doattach()
1697 NULL, (caddr_t *)&un->un_mspl, &rlen, NULL); in st_doattach()
1701 NULL, (caddr_t *)&un->un_read_pos_data, &rlen, NULL); in st_doattach()
1703 if (!un->un_sbufp || !un->un_mspl || !un->un_read_pos_data) { in st_doattach()
1709 bzero(un->un_mspl, sizeof (struct seq_mode)); in st_doattach()
1711 cv_init(&un->un_sbuf_cv, NULL, CV_DRIVER, NULL); in st_doattach()
1712 cv_init(&un->un_queue_cv, NULL, CV_DRIVER, NULL); in st_doattach()
1713 cv_init(&un->un_clscv, NULL, CV_DRIVER, NULL); in st_doattach()
1714 cv_init(&un->un_state_cv, NULL, CV_DRIVER, NULL); in st_doattach()
1716 cv_init(&un->un_contig_mem_cv, NULL, CV_DRIVER, NULL); in st_doattach()
1720 cv_init(&un->un_suspend_cv, NULL, CV_DRIVER, NULL); in st_doattach()
1721 cv_init(&un->un_tape_busy_cv, NULL, CV_DRIVER, NULL); in st_doattach()
1722 cv_init(&un->un_recov_buf_cv, NULL, CV_DRIVER, NULL); in st_doattach()
1724 un->un_recov_taskq = ddi_taskq_create(devp->sd_dev, in st_doattach()
1727 ASSERT(un->un_recov_taskq != NULL); in st_doattach()
1729 un->un_pos.pmode = invalid; in st_doattach()
1730 un->un_sd = devp; in st_doattach()
1731 un->un_swr_token = (opaque_t)NULL; in st_doattach()
1732 un->un_comp_page = ST_DEV_DATACOMP_PAGE | ST_DEV_CONFIG_PAGE; in st_doattach()
1733 un->un_wormable = st_is_drive_worm; in st_doattach()
1734 un->un_media_id_method = st_get_media_identification; in st_doattach()
1739 un->un_read_pos_type = LONG_POS; in st_doattach()
1741 un->un_suspend_pos.pmode = invalid; in st_doattach()
1743 st_add_recovery_info_to_pkt(un, un->un_rqs_bp, un->un_rqs); in st_doattach()
1747 DDI_DMA_SLEEP, NULL, &un->un_contig_mem_hdl) != DDI_SUCCESS) { in st_doattach()
1750 un->un_contig_mem_hdl = NULL; in st_doattach()
1782 st_reset_notification, (caddr_t)un); in st_doattach()
1791 if (un) { in st_doattach()
1792 if (un->un_mspl) { in st_doattach()
1793 i_ddi_mem_free((caddr_t)un->un_mspl, NULL); in st_doattach()
1795 if (un->un_read_pos_data) { in st_doattach()
1796 i_ddi_mem_free((caddr_t)un->un_read_pos_data, 0); in st_doattach()
1798 if (un->un_sbufp) { in st_doattach()
1799 freerbuf(un->un_sbufp); in st_doattach()
1801 if (un->un_recov_buf) { in st_doattach()
1802 freerbuf(un->un_recov_buf); in st_doattach()
1804 if (un->un_uscsi_rqs_buf) { in st_doattach()
1805 kmem_free(un->un_uscsi_rqs_buf, SENSE_LENGTH); in st_doattach()
1808 if (un->un_contig_mem_hdl != NULL) { in st_doattach()
1809 ddi_dma_free_handle(&un->un_contig_mem_hdl); in st_doattach()
1812 if (un->un_rqs) { in st_doattach()
1813 scsi_destroy_pkt(un->un_rqs); in st_doattach()
1816 if (un->un_rqs_bp) { in st_doattach()
1817 scsi_free_consistent_buf(un->un_rqs_bp); in st_doattach()
1846 st_known_tape_type(struct scsi_tape *un) in st_known_tape_type() argument
1854 reserved = (un->un_rsvd_status & ST_RESERVE) ? ST_RESERVE in st_known_tape_type()
1866 if (un->un_dp_size == 0) { in st_known_tape_type()
1867 un->un_dp_size = sizeof (struct st_drivetype); in st_known_tape_type()
1868 dp = kmem_zalloc((size_t)un->un_dp_size, KM_SLEEP); in st_known_tape_type()
1869 un->un_dp = dp; in st_known_tape_type()
1871 dp = un->un_dp; in st_known_tape_type()
1874 un->un_dp->non_motion_timeout = st_io_time; in st_known_tape_type()
1879 if ((*config_funct)(un, ST_INQUIRY->inq_vid, dp)) { in st_known_tape_type()
1907 un->un_status = 0; in st_known_tape_type()
1908 un->un_attached = 1; in st_known_tape_type()
1909 un->un_init_options = dp->options; in st_known_tape_type()
1912 st_calculate_timeouts(un); in st_known_tape_type()
1915 if (un->un_dp->type != ST_TYPE_INVALID) { in st_known_tape_type()
1919 un->un_tlr_flag = TLR_SAS_ONE_DEVICE; in st_known_tape_type()
1920 result = st_set_target_TLR_mode(un, st_uscsi_cmd); in st_known_tape_type()
1926 un->un_dp->type = ST_TYPE_INVALID; in st_known_tape_type()
1927 un->un_tlr_flag = TLR_NOT_KNOWN; in st_known_tape_type()
1929 if (scsi_ifgetcap(&un->un_sd->sd_address, in st_known_tape_type()
1931 un->un_tlr_flag = TLR_NOT_SUPPORTED; in st_known_tape_type()
1932 (void) st_set_target_TLR_mode(un, st_uscsi_cmd); in st_known_tape_type()
1934 un->un_tlr_flag = TLR_SAS_ONE_DEVICE; in st_known_tape_type()
1937 un->un_tlr_flag = TLR_NOT_SUPPORTED; in st_known_tape_type()
1946 if (reserved != ((un->un_rsvd_status & ST_RESERVE) ? ST_RESERVE in st_known_tape_type()
1948 (void) st_reserve_release(un, reserved, st_uscsi_cmd); in st_known_tape_type()
1951 un->un_unit_attention_flags |= 1; in st_known_tape_type()
1984 st_validate_conf_data(struct scsi_tape *un, int *list, int list_len, in st_validate_conf_data() argument
2073 st_get_conf_from_st_dot_conf(struct scsi_tape *un, char *vidpid, in st_get_conf_from_st_dot_conf() argument
2182 if (st_validate_conf_data(un, data_ptr, in st_get_conf_from_st_dot_conf()
2242 st_get_conf_from_st_conf_dot_c(struct scsi_tape *un, char *vidpid, in st_get_conf_from_st_conf_dot_c() argument
2271 st_get_conf_from_tape_drive(struct scsi_tape *un, char *vidpid, in st_get_conf_from_tape_drive() argument
2313 un->un_dp->options |= ST_MODE_SEL_COMP | ST_UNLOADABLE; in st_get_conf_from_tape_drive()
2314 rval = st_modesense(un); in st_get_conf_from_tape_drive()
2317 un->un_dp->type = ST_TYPE_INVALID; in st_get_conf_from_tape_drive()
2320 un->un_dp->options &= ~ST_MODE_SEL_COMP; in st_get_conf_from_tape_drive()
2330 bsize = (un->un_mspl->high_bl << 16) | in st_get_conf_from_tape_drive()
2331 (un->un_mspl->mid_bl << 8) | in st_get_conf_from_tape_drive()
2332 (un->un_mspl->low_bl); in st_get_conf_from_tape_drive()
2338 rval = st_change_block_size(un, 0); in st_get_conf_from_tape_drive()
2341 un->un_dp->type = ST_TYPE_INVALID; in st_get_conf_from_tape_drive()
2354 rval = st_change_block_size(un, 0); in st_get_conf_from_tape_drive()
2361 un->un_dp->type = ST_TYPE_INVALID; in st_get_conf_from_tape_drive()
2372 rval = st_read_block_limits(un, blklim); in st_get_conf_from_tape_drive()
2392 rval = st_get_special_inquiry(un, 6, buf, 0xb0); in st_get_conf_from_tape_drive()
2415 if (st_get_densities_from_tape_drive(un, tem_dp) == 0) { in st_get_conf_from_tape_drive()
2423 rval = st_get_timeout_values_from_tape_drive(un, tem_dp); in st_get_conf_from_tape_drive()
2432 un->un_status = KEY_NO_SENSE; in st_get_conf_from_tape_drive()
2438 st_get_densities_from_tape_drive(struct scsi_tape *un, in st_get_densities_from_tape_drive() argument
2463 if (st_report_density_support(un, den_header, buflen) != 0) { in st_get_densities_from_tape_drive()
2478 if (st_report_density_support(un, den_header, buflen) != 0) { in st_get_densities_from_tape_drive()
2591 st_get_timeout_values_from_tape_drive(struct scsi_tape *un, in st_get_timeout_values_from_tape_drive() argument
2599 rval = st_get_timeouts_value(un, SCMD_ERASE, &timeout, 0); in st_get_timeout_values_from_tape_drive()
2602 un->un_dp->type = ST_TYPE_INVALID; in st_get_timeout_values_from_tape_drive()
2610 rval = st_get_timeouts_value(un, SCMD_READ, &timeout, 0); in st_get_timeout_values_from_tape_drive()
2613 un->un_dp->type = ST_TYPE_INVALID; in st_get_timeout_values_from_tape_drive()
2621 rval = st_get_timeouts_value(un, SCMD_WRITE, &timeout, 0); in st_get_timeout_values_from_tape_drive()
2624 un->un_dp->type = ST_TYPE_INVALID; in st_get_timeout_values_from_tape_drive()
2632 rval = st_get_timeouts_value(un, SCMD_SPACE, &timeout, 0); in st_get_timeout_values_from_tape_drive()
2635 un->un_dp->type = ST_TYPE_INVALID; in st_get_timeout_values_from_tape_drive()
2643 rval = st_get_timeouts_value(un, SCMD_LOAD, &timeout, 0); in st_get_timeout_values_from_tape_drive()
2646 un->un_dp->type = ST_TYPE_INVALID; in st_get_timeout_values_from_tape_drive()
2655 rval = st_get_timeouts_value(un, SCMD_REWIND, &timeout, 0); in st_get_timeout_values_from_tape_drive()
2658 un->un_dp->type = ST_TYPE_INVALID; in st_get_timeout_values_from_tape_drive()
2666 rval = st_get_timeouts_value(un, SCMD_INQUIRY, &timeout, 0); in st_get_timeout_values_from_tape_drive()
2669 un->un_dp->type = ST_TYPE_INVALID; in st_get_timeout_values_from_tape_drive()
2681 st_get_timeouts_value(struct scsi_tape *un, uchar_t option_code, in st_get_timeouts_value() argument
2697 rval = st_report_supported_operation(un, oper, option_code, in st_get_timeouts_value()
2747 st_get_default_conf(struct scsi_tape *un, char *vidpid, struct st_drivetype *dp) in st_get_default_conf() argument
2812 if (!un->un_attached) { in st_open()
2813 st_known_tape_type(un); in st_open()
2814 if (!un->un_attached) { in st_open()
2829 if (!(flag & (FNDELAY | FNONBLOCK)) && IS_CLOSING(un)) { in st_open()
2830 un->un_laststate = un->un_state; in st_open()
2831 un->un_state = ST_STATE_CLOSE_PENDING_OPEN; in st_open()
2832 while (IS_CLOSING(un) || in st_open()
2833 un->un_state == ST_STATE_CLOSE_PENDING_OPEN) { in st_open()
2834 if (cv_wait_sig(&un->un_clscv, ST_MUTEX) == 0) { in st_open()
2836 un->un_state = un->un_laststate; in st_open()
2840 } else if (un->un_state != ST_STATE_CLOSED) { in st_open()
2848 un->un_dev = dev; in st_open()
2849 un->un_oflags = flag; /* save for use in st_tape_init() */ in st_open()
2850 un->un_errno = 0; /* no errors yet */ in st_open()
2851 un->un_restore_pos = 0; in st_open()
2852 un->un_rqs_state = 0; in st_open()
2859 switch (un->un_pos.pmode) { in st_open()
2862 un->un_state = ST_STATE_OFFLINE; in st_open()
2869 if (un->un_pos.fileno != 0 || un->un_pos.blkno != 0) { in st_open()
2882 un->un_read_only = in st_open()
2883 (un->un_oflags & FWRITE) ? RDWR : RDONLY; in st_open()
2884 un->un_state = ST_STATE_OPEN_PENDING_IO; in st_open()
2886 un->un_state = ST_STATE_OFFLINE; in st_open()
2890 if (un->un_pos.lgclblkno == 0) { in st_open()
2891 un->un_state = ST_STATE_OFFLINE; in st_open()
2893 un->un_read_only = in st_open()
2894 (un->un_oflags & FWRITE) ? RDWR : RDONLY; in st_open()
2895 un->un_state = ST_STATE_OPEN_PENDING_IO; in st_open()
2904 un->un_state = ST_STATE_OPENING; in st_open()
2909 st_empty_error_stack(un); in st_open()
2911 rval = st_tape_init(un); in st_open()
2912 if ((rval == EACCES) && (un->un_read_only & WORM)) { in st_open()
2913 un->un_state = ST_STATE_OPEN_PENDING_IO; in st_open()
2920 if ((un->un_rsvd_status & in st_open()
2922 (void) st_reserve_release(un, ST_RELEASE, in st_open()
2926 un->un_state = ST_STATE_OPEN_PENDING_IO; in st_open()
2938 un->un_state = ST_STATE_CLOSED; in st_open()
2940 un->un_err_resid = 0; in st_open()
2941 un->un_retry_ct = 0; in st_open()
2945 "st_open: return val = %x, state = %d\n", rval, un->un_state); in st_open()
2952 st_tape_init(struct scsi_tape *un) in st_tape_init() argument
2962 "st_tape_init(un = 0x%p, oflags = %d)\n", (void*)un, un->un_oflags); in st_tape_init()
2968 if (un->un_state != ST_STATE_INITIALIZING) { in st_tape_init()
2969 un->un_laststate = un->un_state; in st_tape_init()
2970 un->un_state = ST_STATE_OPENING; in st_tape_init()
2973 un->un_kbytes_xferred = 0; in st_tape_init()
2978 err = st_cmd(un, SCMD_TEST_UNIT_READY, 0, SYNC_CMD); in st_tape_init()
2985 if (un->un_rsvd_status & ST_RESERVATION_CONFLICT) { in st_tape_init()
2986 un->un_state = ST_STATE_CLOSED; in st_tape_init()
2991 } else if ((un->un_rsvd_status & in st_tape_init()
2996 un->un_state = ST_STATE_CLOSED; in st_tape_init()
3008 if (un->un_dp->type == ST_TYPE_INVALID) { in st_tape_init()
3009 un->un_comp_page = ST_DEV_DATACOMP_PAGE | ST_DEV_CONFIG_PAGE; in st_tape_init()
3010 st_known_tape_type(un); in st_tape_init()
3017 if (un->un_dp->type == ST_TYPE_INVALID) { in st_tape_init()
3018 rval = st_determine_generic(un); in st_tape_init()
3023 un->un_state = ST_STATE_CLOSED; in st_tape_init()
3035 un->un_allow_large_xfer = (uchar_t)st_allow_large_xfer; in st_tape_init()
3045 un->un_allow_large_xfer = st_allow_large_xfer && in st_tape_init()
3046 (un->un_dp->options & ST_NO_RECSIZE_LIMIT); in st_tape_init()
3051 if (un->un_maxbsize == MAXBSIZE_UNKNOWN) { in st_tape_init()
3058 un->un_rbl = kmem_zalloc(RBLSIZE, KM_SLEEP); in st_tape_init()
3060 err = st_cmd(un, SCMD_READ_BLKLIM, RBLSIZE, SYNC_CMD); in st_tape_init()
3063 err = st_cmd(un, SCMD_READ_BLKLIM, RBLSIZE, SYNC_CMD); in st_tape_init()
3070 un->un_maxbsize = (un->un_rbl->max_hi << 16) + in st_tape_init()
3071 (un->un_rbl->max_mid << 8) + in st_tape_init()
3072 un->un_rbl->max_lo; in st_tape_init()
3073 un->un_minbsize = (un->un_rbl->min_hi << 8) + in st_tape_init()
3074 un->un_rbl->min_lo; in st_tape_init()
3075 un->un_data_mod = 1 << un->un_rbl->granularity; in st_tape_init()
3076 if ((un->un_maxbsize == 0) || in st_tape_init()
3077 (un->un_allow_large_xfer == 0 && in st_tape_init()
3078 un->un_maxbsize > ST_MAXRECSIZE_FIXED)) { in st_tape_init()
3079 un->un_maxbsize = ST_MAXRECSIZE_FIXED; in st_tape_init()
3081 } else if (un->un_dp->type == ST_TYPE_DEFAULT) { in st_tape_init()
3087 if (un->un_maxbsize > ST_MAXRECSIZE_FIXED) { in st_tape_init()
3088 un->un_dp->options |= in st_tape_init()
3095 if (un->un_maxbsize == un->un_minbsize) { in st_tape_init()
3096 un->un_dp->options &= ~ST_VARIABLE; in st_tape_init()
3100 if (un->un_minbsize == 0) { in st_tape_init()
3101 un->un_minbsize = 1; in st_tape_init()
3109 err, un->un_rsvd_status); in st_tape_init()
3116 if (un->un_rsvd_status & ST_RESERVATION_CONFLICT) { in st_tape_init()
3119 un->un_allow_large_xfer = 0; in st_tape_init()
3126 if (un->un_bsize) { in st_tape_init()
3127 un->un_maxbsize = un->un_minbsize = in st_tape_init()
3128 un->un_bsize; in st_tape_init()
3130 un->un_maxbsize = ST_MAXRECSIZE_FIXED; in st_tape_init()
3131 un->un_minbsize = 1; in st_tape_init()
3138 un->un_data_mod = 1; in st_tape_init()
3141 if (un->un_rbl) { in st_tape_init()
3142 kmem_free(un->un_rbl, RBLSIZE); in st_tape_init()
3143 un->un_rbl = NULL; in st_tape_init()
3153 un->un_maxdma, un->un_maxbsize, un->un_minbsize, in st_tape_init()
3154 (un->un_allow_large_xfer ? "ALLOW": "DON'T ALLOW")); in st_tape_init()
3156 err = st_cmd(un, SCMD_TEST_UNIT_READY, 0, SYNC_CMD); in st_tape_init()
3160 un->un_laststate = un->un_state; in st_tape_init()
3161 un->un_state = ST_STATE_CLOSED; in st_tape_init()
3168 un->un_pos.pmode = invalid; in st_tape_init()
3169 if (un->un_status != KEY_UNIT_ATTENTION) { in st_tape_init()
3175 un->un_laststate = un->un_state; in st_tape_init()
3176 if (un->un_oflags & (FNONBLOCK|FNDELAY)) { in st_tape_init()
3177 un->un_mediastate = MTIO_EJECTED; in st_tape_init()
3178 un->un_state = ST_STATE_OFFLINE; in st_tape_init()
3182 un->un_state = ST_STATE_CLOSED; in st_tape_init()
3201 un->un_bsize = un->un_dp->bsize; in st_tape_init()
3206 if (un->un_restore_pos) { in st_tape_init()
3207 un->un_restore_pos = 0; in st_tape_init()
3208 un->un_pos.fileno = un->un_save_fileno; in st_tape_init()
3209 un->un_pos.blkno = un->un_save_blkno; in st_tape_init()
3210 rval = st_validate_tapemarks(un, st_uscsi_cmd, &un->un_pos); in st_tape_init()
3215 un->un_laststate = un->un_state; in st_tape_init()
3216 un->un_state = ST_STATE_CLOSED; in st_tape_init()
3221 if (un->un_pos.pmode == invalid) { in st_tape_init()
3222 rval = st_loadtape(un); in st_tape_init()
3227 un->un_laststate = un->un_state; in st_tape_init()
3228 un->un_state = ST_STATE_CLOSED; in st_tape_init()
3240 if (un->un_unit_attention_flags) { in st_tape_init()
3241 rval = st_modesense(un); in st_tape_init()
3251 if (un->un_oflags & FWRITE) { in st_tape_init()
3253 if (un->un_mspl->wp) { in st_tape_init()
3254 un->un_status = KEY_WRITE_PROTECT; in st_tape_init()
3255 un->un_laststate = un->un_state; in st_tape_init()
3256 un->un_state = ST_STATE_CLOSED; in st_tape_init()
3261 if ((un->un_dp->type == MT_ISSTK9840) && in st_tape_init()
3262 (un->un_dp->options & ST_WORMABLE)) { in st_tape_init()
3263 un->un_read_only = RDONLY; in st_tape_init()
3268 un->un_read_only = RDWR; in st_tape_init()
3271 un->un_read_only = RDONLY; in st_tape_init()
3274 if (un->un_dp->options & ST_WORMABLE && in st_tape_init()
3275 un->un_unit_attention_flags) { in st_tape_init()
3276 un->un_read_only |= un->un_wormable(un); in st_tape_init()
3278 if (((un->un_read_only == WORM) || in st_tape_init()
3279 (un->un_read_only == RDWORM)) && in st_tape_init()
3280 ((un->un_oflags & FWRITE) == FWRITE)) { in st_tape_init()
3281 un->un_status = KEY_DATA_PROTECT; in st_tape_init()
3285 un->un_read_only, un->un_pos.eof, un->un_oflags); in st_tape_init()
3294 if ((un->un_read_only == RDWR) || in st_tape_init()
3295 (un->un_read_only == WORM) && (un->un_oflags & FWRITE)) { in st_tape_init()
3296 if (un->un_dp->options & ST_REEL) { in st_tape_init()
3297 un->un_fmneeded = 2; in st_tape_init()
3299 un->un_fmneeded = 1; in st_tape_init()
3302 un->un_fmneeded = 0; in st_tape_init()
3306 "fmneeded = %x\n", un->un_fmneeded); in st_tape_init()
3314 if (st_determine_density(un, in st_tape_init()
3315 un->un_read_only == RDWR ? B_WRITE : B_READ)) { in st_tape_init()
3316 un->un_status = KEY_ILLEGAL_REQUEST; in st_tape_init()
3317 un->un_laststate = un->un_state; in st_tape_init()
3318 un->un_state = ST_STATE_CLOSED; in st_tape_init()
3331 un->un_density_known = 0; in st_tape_init()
3339 un->un_laststate = un->un_state; in st_tape_init()
3340 un->un_lastop = ST_OP_NIL; in st_tape_init()
3341 un->un_mediastate = MTIO_INSERTED; in st_tape_init()
3342 cv_broadcast(&un->un_state_cv); in st_tape_init()
3348 un->un_test_append = (un->un_oflags & FWRITE); in st_tape_init()
3354 if (un->un_unit_attention_flags) { in st_tape_init()
3355 rval = st_get_media_identification(un, st_uscsi_cmd); in st_tape_init()
3359 un->un_unit_attention_flags = 0; in st_tape_init()
3363 un->un_err_resid = 0; in st_tape_init()
3364 un->un_last_resid = 0; in st_tape_init()
3365 un->un_last_count = 0; in st_tape_init()
3398 st_wait_for_io(un); in st_close()
3401 st_turn_pe_off(un); in st_close()
3406 last_state = un->un_laststate = un->un_state; in st_close()
3407 un->un_state = ST_STATE_CLOSING; in st_close()
3409 ST_POS(ST_DEVINFO, "st_close1:", &un->un_pos); in st_close()
3416 if ((minor & MT_BSD) && (un->un_pos.eof == ST_EOF)) { in st_close()
3417 if (un->un_pos.pmode != invalid) { in st_close()
3418 un->un_pos.fileno++; in st_close()
3419 un->un_pos.blkno = 0; in st_close()
3421 un->un_pos.eof = ST_NO_EOF; in st_close()
3434 (un->un_mediastate == MTIO_INSERTED) && /* tape loaded */ in st_close()
3435 (un->un_pos.pmode != invalid) && /* XXX position known */ in st_close()
3436 ((un->un_pos.blkno != 0) && /* inside a file */ in st_close()
3437 (un->un_lastop != ST_OP_WRITE) && /* Didn't just write */ in st_close()
3438 (un->un_lastop != ST_OP_WEOF))) { /* or write filemarks */ in st_close()
3439 switch (un->un_pos.eof) { in st_close()
3448 if ((un->un_dp->options & ST_REEL) && in st_close()
3449 (!(un->un_dp->options & ST_READ_IGNORE_EOFS)) && in st_close()
3450 (un->un_pos.blkno == 0)) { in st_close()
3451 if (st_cmd(un, SCMD_SPACE, Blk(1), SYNC_CMD)) { in st_close()
3458 if (un->un_pos.eof >= ST_EOF_PENDING) { in st_close()
3459 un->un_pos.eof = ST_EOT_PENDING; in st_close()
3460 un->un_pos.fileno += 1; in st_close()
3461 un->un_pos.blkno = 0; in st_close()
3465 if (st_cmd(un, SCMD_SPACE, Fmk(1), SYNC_CMD)) { in st_close()
3473 un->un_pos.fileno, un->un_pos.blkno, in st_close()
3474 un->un_pos.eof); in st_close()
3475 un->un_pos.eof = ST_NO_EOF; in st_close()
3481 un->un_pos.fileno += 1; in st_close()
3482 un->un_pos.lgclblkno += 1; in st_close()
3483 un->un_pos.blkno = 0; in st_close()
3484 un->un_pos.eof = ST_NO_EOF; in st_close()
3494 "Undefined state 0x%x", un->un_pos.eof); in st_close()
3522 flag, un->un_fmneeded, un->un_lastop, un->un_pos.eof); in st_close()
3524 if (un->un_pos.eof == ST_EOT_PENDING) { in st_close()
3526 if (st_cmd(un, SCMD_SPACE, Fmk(-1), SYNC_CMD)) { in st_close()
3532 un->un_pos.blkno = 0; in st_close()
3533 un->un_pos.eof = ST_EOT; in st_close()
3536 un->un_pos.eof = ST_NO_EOF; in st_close()
3549 } else if ((un->un_pos.pmode != invalid) && in st_close()
3550 (un->un_fmneeded > 0) && in st_close()
3552 ((un->un_lastop == ST_OP_WRITE)||(un->un_lastop == ST_OP_WEOF))) || in st_close()
3553 ((flag == FWRITE) && (un->un_lastop == ST_OP_NIL)))) { in st_close()
3556 int was_at_eom = (un->un_pos.eof == ST_EOM) ? 1 : 0; in st_close()
3567 count = un->un_fmneeded; in st_close()
3569 if (st_cmd(un, SCMD_WRITE_FILE_MARK, count, SYNC_CMD)) { in st_close()
3575 if ((un->un_dp->options & ST_REEL) && in st_close()
3577 if (st_cmd(un, SCMD_SPACE, Fmk(-1), SYNC_CMD)) { in st_close()
3584 un->un_pos.eof = ST_NO_EOF; in st_close()
3586 un->un_pos.blkno = 0; in st_close()
3599 un->un_pos.eof = ST_EOM; in st_close()
3609 (un->un_dp->options & ST_SOFT_ERROR_REPORTING) && in st_close()
3622 un->un_pos.pmode != invalid && err == 0) { in st_close()
3653 if (un->un_sd->sd_inq->inq_ansi < 2) { in st_close()
3654 if (st_cmd(un, SCMD_REWIND, 0, SYNC_CMD)) { in st_close()
3659 if (st_cmd(un, SCMD_WRITE_FILE_MARK, 0, SYNC_CMD)) { in st_close()
3663 if ((un->un_rsvd_status & in st_close()
3666 if (st_reserve_release(un, ST_RELEASE, in st_close()
3673 if (st_cmd(un, SCMD_REWIND, 1, ASYNC_CMD)) { in st_close()
3688 un->un_pos.pmode = invalid; in st_close()
3689 un->un_running.pmode = invalid; in st_close()
3699 if (un->un_eject_tape_on_failure) { in st_close()
3700 un->un_eject_tape_on_failure = 0; in st_close()
3701 if (st_cmd(un, SCMD_LOAD, LD_UNLOAD, SYNC_CMD)) { in st_close()
3709 un->un_pos.eof = ST_NO_EOF; in st_close()
3710 un->un_mediastate = MTIO_EJECTED; in st_close()
3717 if ((un->un_rsvd_status & in st_close()
3720 (void) st_reserve_release(un, ST_RELEASE, st_uscsi_cmd); in st_close()
3726 un->un_laststate = un->un_state; in st_close()
3727 un->un_state = ST_STATE_CLOSED; in st_close()
3728 un->un_lastop = ST_OP_NIL; in st_close()
3729 un->un_throttle = 1; /* assume one request at time, for now */ in st_close()
3730 un->un_retry_ct = 0; in st_close()
3731 un->un_errno = 0; in st_close()
3732 un->un_swr_token = (opaque_t)NULL; in st_close()
3733 un->un_rsvd_status &= ~(ST_INIT_RESERVE); in st_close()
3736 if (un->un_init_options & ST_READ_IGNORE_ILI) { in st_close()
3737 un->un_dp->options |= ST_READ_IGNORE_ILI; in st_close()
3739 un->un_dp->options &= ~ST_READ_IGNORE_ILI; in st_close()
3742 if (un->un_init_options & ST_READ_IGNORE_EOFS) { in st_close()
3743 un->un_dp->options |= ST_READ_IGNORE_EOFS; in st_close()
3745 un->un_dp->options &= ~ST_READ_IGNORE_EOFS; in st_close()
3748 if (un->un_init_options & ST_SHORT_FILEMARKS) { in st_close()
3749 un->un_dp->options |= ST_SHORT_FILEMARKS; in st_close()
3751 un->un_dp->options &= ~ST_SHORT_FILEMARKS; in st_close()
3759 cv_signal(&un->un_clscv); in st_close()
3764 if (err && un->un_status != KEY_ILLEGAL_REQUEST) { in st_close()
3769 un->un_density_known = 0; in st_close()
3776 cp = un->un_contig_mem; in st_close()
3786 un->un_contig_mem_total_num = 0; in st_close()
3787 un->un_contig_mem_available_num = 0; in st_close()
3788 un->un_contig_mem = NULL; in st_close()
3789 un->un_max_contig_mem_len = 0; in st_close()
3794 err, un->un_pos.fileno, un->un_pos.blkno, un->un_pos.eof); in st_close()
3866 struct scsi_tape *un; in st_minphys() local
3868 un = ddi_get_soft_state(st_state, MTUNIT(bp->b_edev)); in st_minphys()
3876 if (un->un_allow_large_xfer) { in st_minphys()
3881 if (un->un_bsize == 0 && bp->b_bcount > un->un_maxbsize) { in st_minphys()
3882 bp->b_bcount = un->un_maxbsize; in st_minphys()
3888 if (bp->b_bcount > un->un_maxdma) { in st_minphys()
3889 bp->b_bcount = un->un_maxdma; in st_minphys()
3896 if (un->un_bsize == 0) { in st_minphys()
3912 if (bp != un->un_sbufp && un->un_bsize) { in st_minphys()
3913 bp->b_bcount -= (bp->b_bcount % un->un_bsize); in st_minphys()
3939 st_empty_error_stack(un); in st_rw()
3945 if ((un->un_bsize != 0) && (len % un->un_bsize != 0)) { in st_rw()
3948 (flag == B_WRITE) ? wr_str : rd_str, un->un_bsize); in st_rw()
3953 if ((un->un_data_mod != 0) && (len % un->un_data_mod != 0)) { in st_rw()
3956 (flag == B_WRITE) ? wr_str : rd_str, un->un_data_mod); in st_rw()
3960 if (st_recov_sz != sizeof (recov_info) && un->un_multipath) { in st_rw()
3966 un->un_errno = rval; in st_rw()
3974 un->un_silent_skip = 0; in st_rw()
3988 if (un->un_pos.eof > ST_NO_EOF) { in st_rw()
3990 "eof=%d resid=%lx\n", un->un_pos.eof, uio->uio_resid); in st_rw()
3992 if (un->un_pos.eof >= ST_EOM && (flag == B_WRITE)) { in st_rw()
3994 un->un_pos.eof = ST_EOM; in st_rw()
3996 un->un_pos.eof = ST_NO_EOF; in st_rw()
4000 if (un->un_silent_skip && uio->uio_resid != len) { in st_rw()
4001 un->un_pos.eof = ST_EOF; in st_rw()
4002 un->un_pos.blkno = un->un_save_blkno; in st_rw()
4003 un->un_pos.fileno--; in st_rw()
4006 un->un_errno = rval; in st_rw()
4037 if ((un->un_bsize != 0) && (len % un->un_bsize != 0)) { in st_arw()
4040 (flag == B_WRITE) ? wr_str : rd_str, un->un_bsize); in st_arw()
4045 if ((un->un_data_mod != 0) && (len % un->un_data_mod != 0)) { in st_arw()
4048 (flag == B_WRITE) ? wr_str : rd_str, un->un_data_mod); in st_arw()
4052 if (st_recov_sz != sizeof (recov_info) && un->un_multipath) { in st_arw()
4058 un->un_errno = rval; in st_arw()
4080 if (un->un_pos.eof > ST_NO_EOF) { in st_arw()
4082 "eof=%d resid=%lx\n", un->un_pos.eof, uio->uio_resid); in st_arw()
4084 if (un->un_pos.eof >= ST_EOM && (flag == B_WRITE)) { in st_arw()
4086 un->un_pos.eof = ST_EOM; in st_arw()
4088 !(un->un_persistence && un->un_persist_errors)) { in st_arw()
4089 un->un_pos.eof = ST_NO_EOF; in st_arw()
4092 un->un_errno = rval; in st_arw()
4103 struct scsi_tape *un; in st_queued_strategy() local
4110 un = ddi_get_soft_state(st_state, MTUNIT(bp->b_edev)); in st_queued_strategy()
4111 if (un == NULL) { in st_queued_strategy()
4124 while (un->un_pwr_mgmt == ST_PWR_SUSPENDED) { in st_queued_strategy()
4125 cv_wait(&un->un_suspend_cv, ST_MUTEX); in st_queued_strategy()
4130 bp->b_bcount, un->un_pos.fileno, un->un_pos.blkno, un->un_pos.eof); in st_queued_strategy()
4136 if (un->un_persistence && un->un_persist_errors) { in st_queued_strategy()
4143 while (un->un_sbuf_busy) { in st_queued_strategy()
4144 cv_wait(&un->un_sbuf_cv, ST_MUTEX); in st_queued_strategy()
4146 if (un->un_persistence && un->un_persist_errors) { in st_queued_strategy()
4154 ASSERT(bp != un->un_recov_buf); in st_queued_strategy()
4155 ASSERT(bp != un->un_sbufp); in st_queued_strategy()
4161 if ((un->un_rsvd_status & in st_queued_strategy()
4163 if ((un->un_dp->options & ST_NO_RESERVE_RELEASE) == 0) { in st_queued_strategy()
4164 if (st_reserve_release(un, ST_RESERVE, st_uscsi_cmd)) { in st_queued_strategy()
4165 st_bioerror(bp, un->un_errno); in st_queued_strategy()
4168 } else if (un->un_state == ST_STATE_OPEN_PENDING_IO) { in st_queued_strategy()
4174 un->un_state = ST_STATE_INITIALIZING; in st_queued_strategy()
4175 (void) st_cmd(un, SCMD_TEST_UNIT_READY, in st_queued_strategy()
4177 un->un_state = ST_STATE_OPEN_PENDING_IO; in st_queued_strategy()
4179 un->un_rsvd_status |= ST_INIT_RESERVE; in st_queued_strategy()
4189 if (un->un_state == ST_STATE_OFFLINE || un->un_restore_pos) { in st_queued_strategy()
4193 un->un_laststate = un->un_state; in st_queued_strategy()
4194 un->un_state = ST_STATE_INITIALIZING; in st_queued_strategy()
4195 if (st_tape_init(un)) { in st_queued_strategy()
4198 un->un_state = ST_STATE_OFFLINE; in st_queued_strategy()
4199 un->un_pos.pmode = invalid; in st_queued_strategy()
4203 un->un_state = ST_STATE_OPEN_PENDING_IO; in st_queued_strategy()
4204 un->un_restore_pos = 0; in st_queued_strategy()
4209 if (un->un_pos.pmode == invalid) { in st_queued_strategy()
4227 if (un->un_pos.eof == ST_EOT_PENDING) { in st_queued_strategy()
4228 if (st_cmd(un, SCMD_SPACE, Fmk(-1), SYNC_CMD)) { in st_queued_strategy()
4229 un->un_pos.pmode = invalid; in st_queued_strategy()
4230 un->un_density_known = 0; in st_queued_strategy()
4233 un->un_pos.blkno = 0; /* fix up block number.. */ in st_queued_strategy()
4234 un->un_pos.eof = ST_EOT; in st_queued_strategy()
4247 if ((un->un_state == ST_STATE_OPEN_PENDING_IO) || in st_queued_strategy()
4248 (un->un_test_append && (un->un_dp->options & ST_QIC))) { in st_queued_strategy()
4250 if (un->un_state == ST_STATE_OPEN_PENDING_IO) { in st_queued_strategy()
4251 if (st_determine_density(un, (int)reading)) { in st_queued_strategy()
4258 un->un_pos.fileno, (int)reading, in st_queued_strategy()
4259 (un->un_dp->options & ST_QIC) ? 1 : 0, in st_queued_strategy()
4260 un->un_pos.eof); in st_queued_strategy()
4262 if (!reading && un->un_pos.eof != ST_EOM) { in st_queued_strategy()
4263 if (un->un_pos.eof == ST_EOT) { in st_queued_strategy()
4264 un->un_pos.eof = ST_NO_EOF; in st_queued_strategy()
4265 } else if (un->un_pos.pmode != invalid && in st_queued_strategy()
4266 (un->un_dp->options & ST_QIC)) { in st_queued_strategy()
4275 if (un->un_state == ST_STATE_OPEN_PENDING_IO) { in st_queued_strategy()
4278 un->un_laststate = un->un_state; in st_queued_strategy()
4279 un->un_state = ST_STATE_OPEN; in st_queued_strategy()
4289 un->un_pos.eof, wasopening); in st_queued_strategy()
4291 switch (un->un_pos.eof) { in st_queued_strategy()
4326 un->un_pos.eof = ST_WRITE_AFTER_EOM; in st_queued_strategy()
4328 un->un_status = SUN_KEY_EOT; in st_queued_strategy()
4334 un->un_status = SUN_KEY_EOT; in st_queued_strategy()
4342 un->un_pos.eof = ST_NO_EOF; in st_queued_strategy()
4348 un->un_status = SUN_KEY_EOF; in st_queued_strategy()
4350 un->un_pos.eof = ST_EOF; in st_queued_strategy()
4356 un->un_status = SUN_KEY_EOF; in st_queued_strategy()
4362 un->un_pos.eof = ST_NO_EOF; in st_queued_strategy()
4363 un->un_pos.fileno += 1; in st_queued_strategy()
4364 un->un_pos.blkno = 0; in st_queued_strategy()
4370 un->un_pos.fileno); in st_queued_strategy()
4374 "now file %d (write)\n", un->un_pos.fileno); in st_queued_strategy()
4377 un->un_status = 0; in st_queued_strategy()
4402 if (bp->b_bcount > un->un_maxdma_arch && in st_queued_strategy()
4416 (void *)un->un_quef, (void *)bp); in st_queued_strategy()
4418 st_add_to_queue(&un->un_quef, &un->un_quel, un->un_quel, bp); in st_queued_strategy()
4422 st_start(un); in st_queued_strategy()
4441 st_wait_for_io(un); in st_queued_strategy()
4442 un->un_err_resid = bp->b_resid = bp->b_bcount; in st_queued_strategy()
4445 if (un->un_persistence && un->un_persist_errors) in st_queued_strategy()
4446 bioerror(bp, un->un_errno); in st_queued_strategy()
4459 struct scsi_tape *un; in st_strategy() local
4464 un = ddi_get_soft_state(st_state, MTUNIT(bp->b_edev)); in st_strategy()
4465 if (un == NULL) { in st_strategy()
4480 while (un->un_pwr_mgmt == ST_PWR_SUSPENDED) { in st_strategy()
4481 cv_wait(&un->un_suspend_cv, ST_MUTEX); in st_strategy()
4486 bp->b_bcount, un->un_pos.fileno, un->un_pos.blkno, un->un_pos.eof); in st_strategy()
4488 ASSERT((bp == un->un_recov_buf) || (bp == un->un_sbufp)); in st_strategy()
4504 st_start(un); in st_strategy()
4514 st_space_fmks(struct scsi_tape *un, int64_t count) in st_space_fmks() argument
4522 un->un_dev, count); in st_space_fmks()
4535 if ((un->un_dp->options & ST_KNOWS_EOD) && in st_space_fmks()
4536 !((un->un_dp->type == ST_TYPE_EXB8500 && in st_space_fmks()
4537 MT_DENSITY(un->un_dev) == 0))) { in st_space_fmks()
4538 if (st_cmd(un, SCMD_SPACE, Fmk(count), SYNC_CMD)) { in st_space_fmks()
4545 if (st_cmd(un, SCMD_SPACE, Fmk(1), SYNC_CMD)) { in st_space_fmks()
4558 if (st_cmd(un, SCMD_SPACE, Blk(1), SYNC_CMD)) { in st_space_fmks()
4566 if ((un->un_pos.eof >= ST_EOF_PENDING) && in st_space_fmks()
4567 (un->un_dp->options & ST_REEL)) { in st_space_fmks()
4568 un->un_status = SUN_KEY_EOT; in st_space_fmks()
4574 } else if (IN_EOF(un->un_pos)) { in st_space_fmks()
4575 un->un_pos.eof = ST_NO_EOF; in st_space_fmks()
4576 un->un_pos.fileno++; in st_space_fmks()
4577 un->un_pos.blkno = 0; in st_space_fmks()
4579 } else if (un->un_pos.eof > ST_EOF) { in st_space_fmks()
4589 un->un_err_resid = count; in st_space_fmks()
4590 COPY_POS(&un->un_pos, &un->un_err_pos); in st_space_fmks()
4608 st_find_eod(struct scsi_tape *un) in st_find_eod() argument
4614 if (un == NULL) { in st_find_eod()
4621 "st_find_eod(dev = 0x%lx): fileno = %d\n", un->un_dev, in st_find_eod()
4622 un->un_pos.fileno); in st_find_eod()
4626 COPY_POS(&savepos, &un->un_pos); in st_find_eod()
4636 if ((un->un_dp->options & ST_KNOWS_EOD) != 0) { in st_find_eod()
4637 if ((un->un_dp->type == ST_TYPE_EXB8500) && in st_find_eod()
4638 (MT_DENSITY(un->un_dev) == 0)) { in st_find_eod()
4640 } else if (un->un_pos.pmode == logical) { in st_find_eod()
4650 result = st_cmd(un, SCMD_SPACE, sp_type, SYNC_CMD); in st_find_eod()
4653 COPY_POS(&savepos, &un->un_pos); in st_find_eod()
4673 return (un->un_pos.fileno); in st_find_eod()
4682 SPACE_CNT(sp_type), un->un_pos.eof, un->un_status); in st_find_eod()
4695 if (st_cmd(un, SCMD_SPACE, Blk((1)), SYNC_CMD)) { in st_find_eod()
4698 if ((un->un_pos.eof >= ST_EOF_PENDING) && in st_find_eod()
4699 (un->un_dp->options & ST_REEL)) { in st_find_eod()
4700 un->un_status = KEY_BLANK_CHECK; in st_find_eod()
4701 un->un_pos.fileno++; in st_find_eod()
4702 un->un_pos.blkno = 0; in st_find_eod()
4705 if (IN_EOF(un->un_pos)) { in st_find_eod()
4706 un->un_pos.eof = ST_NO_EOF; in st_find_eod()
4707 un->un_pos.fileno++; in st_find_eod()
4708 un->un_pos.blkno = 0; in st_find_eod()
4710 if (un->un_pos.eof > ST_EOF) { in st_find_eod()
4714 if (un->un_pos.eof > ST_EOF) { in st_find_eod()
4720 if (un->un_dp->options & ST_KNOWS_EOD) { in st_find_eod()
4721 COPY_POS(&savepos, &un->un_pos); in st_find_eod()
4768 if (un->un_state == ST_STATE_OPEN_PENDING_IO) { in st_check_density_or_wfm()
4769 if (st_determine_density(un, mode)) { in st_check_density_or_wfm()
4773 un->un_errno = EIO; in st_check_density_or_wfm()
4781 un->un_laststate = un->un_state; in st_check_density_or_wfm()
4782 un->un_state = ST_STATE_OPEN; in st_check_density_or_wfm()
4784 } else if (un->un_pos.pmode != invalid && un->un_fmneeded > 0 && in st_check_density_or_wfm()
4785 ((un->un_lastop == ST_OP_WEOF && wfm) || in st_check_density_or_wfm()
4786 (un->un_lastop == ST_OP_WRITE && wfm))) { in st_check_density_or_wfm()
4790 COPY_POS(&spos, &un->un_pos); in st_check_density_or_wfm()
4798 if ((un->un_fmneeded > 0) || (un->un_lastop == ST_OP_WEOF)) { in st_check_density_or_wfm()
4799 wfm = un->un_fmneeded; in st_check_density_or_wfm()
4800 un->un_fmneeded = 0; in st_check_density_or_wfm()
4804 un->un_pos.pmode = invalid; in st_check_density_or_wfm()
4805 un->un_density_known = 0; in st_check_density_or_wfm()
4808 un->un_errno = EIO; in st_check_density_or_wfm()
4813 if (st_cmd(un, SCMD_SPACE, Fmk(-wfm), SYNC_CMD)) { in st_check_density_or_wfm()
4817 un->un_errno = EIO; in st_check_density_or_wfm()
4820 COPY_POS(&un->un_pos, &spos); in st_check_density_or_wfm()
4828 un->un_pos.eof = ST_NO_EOF; in st_check_density_or_wfm()
4834 if (un->un_read_only == RDWR) { in st_check_density_or_wfm()
4835 un->un_test_append = 1; in st_check_density_or_wfm()
4851 st_wait_for_io(struct scsi_tape *un) in st_wait_for_io() argument
4855 while ((un->un_ncmds) || (un->un_quef) || (un->un_runqf)) { in st_wait_for_io()
4856 cv_wait(&un->un_queue_cv, ST_MUTEX); in st_wait_for_io()
4877 ASSERT(un->un_recov_buf_busy == 0); in st_ioctl()
4882 un->un_pos.fileno, un->un_pos.blkno, un->un_pos.eof, un->un_state, in st_ioctl()
4883 un->un_persistence && un->un_persist_errors); in st_ioctl()
4901 st_empty_error_stack(un); in st_ioctl()
4909 st_wait_for_io(un); in st_ioctl()
4915 if (un->un_persistence && un->un_persist_errors) { in st_ioctl()
4921 rval = un->un_errno; in st_ioctl()
4926 ASSERT(un->un_throttle != 0); in st_ioctl()
4927 un->un_throttle = 1; /* > 1 will never happen here */ in st_ioctl()
4928 un->un_errno = 0; /* start clean from here */ in st_ioctl()
4934 if (un->un_pos.eof == ST_EOT_PENDING) { in st_ioctl()
4935 int resid = un->un_err_resid; in st_ioctl()
4936 uchar_t status = un->un_status; in st_ioctl()
4937 uchar_t lastop = un->un_lastop; in st_ioctl()
4939 if (st_cmd(un, SCMD_SPACE, Fmk(-1), SYNC_CMD)) { in st_ioctl()
4945 un->un_lastop = lastop; /* restore last operation */ in st_ioctl()
4947 un->un_status = SUN_KEY_EOT; in st_ioctl()
4949 un->un_status = status; in st_ioctl()
4951 un->un_err_resid = resid; in st_ioctl()
4953 un->un_err_pos.blkno = un->un_pos.blkno = 0; in st_ioctl()
4955 un->un_pos.eof = ST_EOT; in st_ioctl()
4981 mtget->mt_erreg = un->un_status; in st_ioctl()
4982 mtget->mt_resid = un->un_err_resid; in st_ioctl()
4983 mtget->mt_dsreg = un->un_retry_ct; in st_ioctl()
4984 if (un->un_err_pos.pmode == legacy) { in st_ioctl()
4985 mtget->mt_fileno = un->un_err_pos.fileno; in st_ioctl()
4994 if (un->un_err_pos.blkno >= 0) { in st_ioctl()
4995 mtget->mt_blkno = un->un_err_pos.blkno; in st_ioctl()
4997 mtget->mt_blkno = INF + 1 - (-un->un_err_pos.blkno); in st_ioctl()
4999 mtget->mt_type = un->un_dp->type; in st_ioctl()
5001 if (un->un_read_pos_type != NO_POS) { in st_ioctl()
5004 if (un->un_dp->options & ST_REEL) { in st_ioctl()
5024 if ((un->un_allow_large_xfer) && in st_ioctl()
5025 (un->un_dp->options & ST_NO_RECSIZE_LIMIT)) { in st_ioctl()
5026 mtget->mt_bf = min(un->un_maxbsize, in st_ioctl()
5027 un->un_maxdma) / SECSIZE; in st_ioctl()
5030 if (un->un_read_only == WORM || in st_ioctl()
5031 un->un_read_only == RDWORM) { in st_ioctl()
5040 if (un->un_persistence) { in st_ioctl()
5043 rval = st_check_clean_bit(un); in st_ioctl()
5050 if ((un->un_HeadClean & (TAPE_ALERT_SUPPORTED | in st_ioctl()
5055 if (un->un_HeadClean & (TAPE_PREVIOUSLY_DIRTY | in st_ioctl()
5064 un->un_status = 0; /* Reset status */ in st_ioctl()
5065 un->un_err_resid = 0; in st_ioctl()
5112 rval = st_get_error_entry(un, arg, flag); in st_ioctl()
5139 if (ddi_copyout(&un->un_mediastate, (void *)arg, in st_ioctl()
5162 struct st_drivetype *stdt = un->un_dp; in st_ioctl()
5262 st_turn_pe_on(un); in st_ioctl()
5264 st_turn_pe_off(un); in st_ioctl()
5269 un->un_persistence); in st_ioctl()
5274 tmp = (int)un->un_persistence; in st_ioctl()
5281 un->un_persistence); in st_ioctl()
5292 st_clear_pe(un); in st_ioctl()
5317 if (un->un_dp->options & ST_NO_RESERVE_RELEASE) { in st_ioctl()
5322 rval = st_reserve_release(un, ST_RESERVE, st_uscsi_cmd); in st_ioctl()
5325 un->un_rsvd_status |= ST_PRESERVE_RESERVE; in st_ioctl()
5338 if (un->un_dp->options & ST_NO_RESERVE_RELEASE) { in st_ioctl()
5351 rval = st_reserve_release(un, ST_RELEASE, st_uscsi_cmd); in st_ioctl()
5353 un->un_rsvd_status &= ~ST_PRESERVE_RESERVE; in st_ioctl()
5366 if (un->un_dp->options & ST_NO_RESERVE_RELEASE) { in st_ioctl()
5383 (void) st_reserve_release(un, ST_RESERVE, st_uscsi_cmd); in st_ioctl()
5385 rval = st_take_ownership(un, st_uscsi_cmd); in st_ioctl()
5401 rval = st_uscsi_cmd(un, (struct uscsi_cmd *)arg, flag); in st_ioctl()
5408 rval = st_mtioctop(un, arg, flag); in st_ioctl()
5414 rval = st_mtiocltop(un, arg, flag); in st_ioctl()
5427 if (un->un_bsize) { in st_ioctl()
5434 un->un_dp->options &= ~ST_READ_IGNORE_ILI; in st_ioctl()
5438 un->un_dp->options |= ST_READ_IGNORE_ILI; in st_ioctl()
5458 if (!(un->un_dp->options & ST_REEL)) { in st_ioctl()
5465 un->un_dp->options &= ~ST_READ_IGNORE_EOFS; in st_ioctl()
5469 un->un_dp->options |= ST_READ_IGNORE_EOFS; in st_ioctl()
5489 switch (un->un_dp->type) { in st_ioctl()
5493 un->un_dp->options &= ~ST_SHORT_FILEMARKS; in st_ioctl()
5495 un->un_dp->options |= ST_SHORT_FILEMARKS; in st_ioctl()
5509 rval = st_update_block_pos(un, st_cmd, 0); in st_ioctl()
5511 if (ddi_copyout((void *)&un->un_pos, (void *)arg, in st_ioctl()
5531 rval = st_validate_tapemarks(un, st_uscsi_cmd, &dest); in st_ioctl()
5544 if (!(un->un_persistence && un->un_persist_errors)) { in st_ioctl()
5545 un->un_errno = rval; in st_ioctl()
5558 st_mtioctop(struct scsi_tape *un, intptr_t arg, int flag) in st_mtioctop() argument
5605 rval = st_do_mtioctop(un, &local); in st_mtioctop()
5649 "st_ioctl: fileno=%x, blkno=%x, eof=%x\n", un->un_pos.fileno, in st_mtioctop()
5650 un->un_pos.blkno, un->un_pos.eof); in st_mtioctop()
5652 if (un->un_pos.pmode == invalid) { in st_mtioctop()
5653 un->un_density_known = 0; in st_mtioctop()
5661 st_mtiocltop(struct scsi_tape *un, intptr_t arg, int flag) in st_mtiocltop() argument
5671 rval = st_do_mtioctop(un, &local); in st_mtiocltop()
5681 st_do_mtioctop(struct scsi_tape *un, struct mtlop *mtop) in st_do_mtioctop() argument
5683 dev_t dev = un->un_dev; in st_do_mtioctop()
5693 un->un_pos.fileno, un->un_pos.blkno, un->un_pos.eof); in st_do_mtioctop()
5695 un->un_status = 0; in st_do_mtioctop()
5703 if (un->un_state == ST_STATE_OFFLINE) { in st_do_mtioctop()
5711 un->un_state = ST_STATE_INITIALIZING; in st_do_mtioctop()
5714 un->un_state); in st_do_mtioctop()
5720 rval = st_tape_init(un); in st_do_mtioctop()
5722 un->un_state = ST_STATE_INITIALIZING; in st_do_mtioctop()
5725 un->un_state = ST_STATE_OFFLINE; in st_do_mtioctop()
5726 un->un_pos.pmode = invalid; in st_do_mtioctop()
5732 un->un_state = ST_STATE_OPEN_PENDING_IO; in st_do_mtioctop()
5742 if (un->un_pos.pmode == invalid) { in st_do_mtioctop()
5781 if (un->un_mspl->wp || un->un_read_only & WORM) { in st_do_mtioctop()
5782 un->un_status = KEY_WRITE_PROTECT; in st_do_mtioctop()
5783 un->un_err_resid = mtop->mt_count; in st_do_mtioctop()
5784 COPY_POS(&un->un_err_pos, &un->un_pos); in st_do_mtioctop()
5787 if (un->un_dp->options & ST_REEL) { in st_do_mtioctop()
5788 un->un_fmneeded = 2; in st_do_mtioctop()
5790 un->un_fmneeded = 1; in st_do_mtioctop()
5794 st_cmd(un, SCMD_REWIND, 0, SYNC_CMD) || in st_do_mtioctop()
5795 st_cmd(un, SCMD_ERASE, mtop->mt_count, SYNC_CMD)) { in st_do_mtioctop()
5796 un->un_pos.pmode = invalid; in st_do_mtioctop()
5803 if (un->un_dp->options & ST_REEL) { in st_do_mtioctop()
5804 (void) st_cmd(un, SCMD_REWIND, 0, ASYNC_CMD); in st_do_mtioctop()
5813 if (un->un_mspl->wp || un->un_read_only & RDONLY) { in st_do_mtioctop()
5814 un->un_status = KEY_WRITE_PROTECT; in st_do_mtioctop()
5815 un->un_err_resid = mtop->mt_count; in st_do_mtioctop()
5816 COPY_POS(&un->un_err_pos, &un->un_pos); in st_do_mtioctop()
5829 if (un->un_read_only == RDWR) { in st_do_mtioctop()
5830 un->un_test_append = 1; in st_do_mtioctop()
5833 if (un->un_state == ST_STATE_OPEN_PENDING_IO) { in st_do_mtioctop()
5834 if (st_determine_density(un, B_WRITE)) { in st_do_mtioctop()
5860 st_cmd(un, SCMD_LOAD, LD_LOAD | LD_RETEN, SYNC_CMD)) { in st_do_mtioctop()
5861 un->un_pos.pmode = invalid; in st_do_mtioctop()
5878 if (st_cmd(un, SCMD_REWIND, 0, SYNC_CMD)) { in st_do_mtioctop()
5896 (void) st_cmd(un, SCMD_REWIND, 0, SYNC_CMD); in st_do_mtioctop()
5897 if (st_cmd(un, SCMD_LOAD, LD_UNLOAD, SYNC_CMD)) { in st_do_mtioctop()
5902 un->un_pos.eof = ST_NO_EOF; in st_do_mtioctop()
5903 un->un_laststate = un->un_state; in st_do_mtioctop()
5904 un->un_state = ST_STATE_OFFLINE; in st_do_mtioctop()
5905 un->un_mediastate = MTIO_EJECTED; in st_do_mtioctop()
5922 if (un->un_state > ST_STATE_INITIALIZING) { in st_do_mtioctop()
5925 rval = st_cmd(un, SCMD_LOAD, LD_LOAD, SYNC_CMD); in st_do_mtioctop()
5928 ((un->un_status == KEY_NOT_READY) && in st_do_mtioctop()
5930 (un->un_uscsi_rqs_buf->es_add_code == 0x3a) || in st_do_mtioctop()
5931 ((un->un_status == KEY_ILLEGAL_REQUEST) && in st_do_mtioctop()
5932 (un->un_dp->type == MT_ISSTK9840) && in st_do_mtioctop()
5934 (un->un_uscsi_rqs_buf->es_add_code == 0x80)))) { in st_do_mtioctop()
5947 un->un_pos.pmode = invalid; in st_do_mtioctop()
5955 un->un_state = ST_STATE_INITIALIZING; in st_do_mtioctop()
5957 rval = st_tape_init(un); in st_do_mtioctop()
5958 if ((rval == EACCES) && (un->un_read_only & WORM)) { in st_do_mtioctop()
5968 un->un_state = ST_STATE_OFFLINE; in st_do_mtioctop()
5974 un->un_status = 0; /* Reset status */ in st_do_mtioctop()
5975 un->un_err_resid = 0; in st_do_mtioctop()
5986 if ((un->un_pos.pmode == legacy && un->un_pos.eof >= ST_EOT) || in st_do_mtioctop()
5987 (un->un_lastop == ST_OP_WRITE) || in st_do_mtioctop()
5988 (un->un_lastop == ST_OP_WEOF)) { in st_do_mtioctop()
6007 if (IN_EOF(un->un_pos)) { in st_do_mtioctop()
6008 un->un_pos.fileno++; in st_do_mtioctop()
6009 un->un_pos.blkno = 0; in st_do_mtioctop()
6022 savefile = st_find_eod(un); in st_do_mtioctop()
6024 if ((un->un_status != KEY_BLANK_CHECK) && in st_do_mtioctop()
6025 (un->un_status != SUN_KEY_EOT)) { in st_do_mtioctop()
6026 un->un_pos.pmode = invalid; in st_do_mtioctop()
6036 if (un->un_dp->options & ST_REEL) { in st_do_mtioctop()
6037 if (st_cmd(un, SCMD_SPACE, Fmk(-1), SYNC_CMD)) { in st_do_mtioctop()
6038 un->un_pos.pmode = invalid; in st_do_mtioctop()
6049 un->un_pos.blkno = 0; in st_do_mtioctop()
6050 un->un_err_pos.blkno = 0; in st_do_mtioctop()
6052 un->un_err_resid = 0; in st_do_mtioctop()
6053 un->un_pos.fileno = savefile; in st_do_mtioctop()
6054 un->un_pos.eof = ST_EOT; in st_do_mtioctop()
6056 un->un_status = 0; in st_do_mtioctop()
6061 rval = st_mtfsf_ioctl(un, mtop->mt_count); in st_do_mtioctop()
6066 rval = st_mtfsr_ioctl(un, mtop->mt_count); in st_do_mtioctop()
6071 rval = st_mtbsf_ioctl(un, mtop->mt_count); in st_do_mtioctop()
6076 rval = st_mtnbsf_ioctl(un, mtop->mt_count); in st_do_mtioctop()
6081 rval = st_mtbsr_ioctl(un, mtop->mt_count); in st_do_mtioctop()
6086 rval = st_mtbsfm_ioctl(un, mtop->mt_count); in st_do_mtioctop()
6091 rval = st_mtfsfm_ioctl(un, mtop->mt_count); in st_do_mtioctop()
6104 ((un->un_dp->options & ST_VARIABLE) == 0)) { in st_do_mtioctop()
6113 (mtop->mt_count < un->un_minbsize)) { in st_do_mtioctop()
6118 if ((mtop->mt_count > min(un->un_maxbsize, un->un_maxdma)) && in st_do_mtioctop()
6119 (un->un_maxbsize != 0)) { in st_do_mtioctop()
6124 if ((mtop->mt_count % un->un_data_mod) != 0) { in st_do_mtioctop()
6128 if (st_change_block_size(un, (uint32_t)mtop->mt_count) != 0) { in st_do_mtioctop()
6140 mtop->mt_count = un->un_bsize; in st_do_mtioctop()
6145 rval = st_update_block_pos(un, st_cmd, 0); in st_do_mtioctop()
6146 mtop->mt_count = un->un_pos.lgclblkno; in st_do_mtioctop()
6150 rval = st_logical_block_locate(un, st_uscsi_cmd, &un->un_pos, in st_do_mtioctop()
6151 (uint64_t)mtop->mt_count, un->un_pos.partition); in st_do_mtioctop()
6158 if ((uint64_t)mtop->mt_count != un->un_pos.lgclblkno) { in st_do_mtioctop()
6160 mtop->mt_count = un->un_pos.lgclblkno; in st_do_mtioctop()
6166 if (st_cmd(un, SCMD_DOORLOCK, MR_LOCK, SYNC_CMD)) { in st_do_mtioctop()
6174 if (st_cmd(un, SCMD_DOORLOCK, MR_UNLOCK, SYNC_CMD)) { in st_do_mtioctop()
6193 st_uscsi_cmd(struct scsi_tape *un, struct uscsi_cmd *ucmd, int flag) in st_uscsi_cmd() argument
6200 dev_t dev = un->un_dev; in st_uscsi_cmd()
6205 "st_uscsi_cmd(dev = 0x%lx)\n", un->un_dev); in st_uscsi_cmd()
6224 if (un->un_state == ST_STATE_OFFLINE) { in st_uscsi_cmd()
6225 un->un_laststate = ST_STATE_OFFLINE; in st_uscsi_cmd()
6226 un->un_state = ST_STATE_INITIALIZING; in st_uscsi_cmd()
6243 err = st_check_cdb_for_need_to_reserve(un, in st_uscsi_cmd()
6254 (void) st_update_block_pos(un, st_cmd, 0); in st_uscsi_cmd()
6261 ASSERT(un->un_recov_buf_busy == 0); in st_uscsi_cmd()
6266 while (un->un_sbuf_busy) in st_uscsi_cmd()
6267 cv_wait(&un->un_sbuf_cv, ST_MUTEX); in st_uscsi_cmd()
6268 un->un_sbuf_busy = 1; in st_uscsi_cmd()
6293 un->un_srqbufp = uscmd->uscsi_rqbuf; in st_uscsi_cmd()
6294 bp = un->un_sbufp; in st_uscsi_cmd()
6310 un->un_fmneeded = 0; in st_uscsi_cmd()
6317 un->un_sbuf_busy = 0; in st_uscsi_cmd()
6318 un->un_srqbufp = NULL; in st_uscsi_cmd()
6329 (un->un_pos.pmode != invalid)) { in st_uscsi_cmd()
6330 un->un_running.pmode = invalid; in st_uscsi_cmd()
6331 (void) st_update_block_pos(un, st_cmd, 1); in st_uscsi_cmd()
6336 un->un_running.pmode = invalid; in st_uscsi_cmd()
6338 cv_signal(&un->un_sbuf_cv); in st_uscsi_cmd()
6348 un->un_state = ST_STATE_OFFLINE; in st_uscsi_cmd()
6373 if (un->un_pos.eof >= ST_EOT) { in st_write_fm()
6375 rval = st_cmd(un, SCMD_WRITE_FILE_MARK, 1, SYNC_CMD); in st_write_fm()
6386 rval = st_cmd(un, SCMD_WRITE_FILE_MARK, wfm, SYNC_CMD); in st_write_fm()
6403 st_start_dump(struct scsi_tape *un, struct buf *bp) in st_start_dump() argument
6420 un->un_pos.fileno, un->un_pos.blkno); in st_start_dump()
6444 st_start(struct scsi_tape *un) in st_start() argument
6454 "st_start(): dev = 0x%lx\n", un->un_dev); in st_start()
6456 if (un->un_recov_buf_busy) { in st_start()
6458 bp = un->un_recov_buf; in st_start()
6460 } else if (un->un_sbuf_busy) { in st_start()
6462 ASSERT(un->un_quef == NULL); in st_start()
6463 ASSERT(un->un_runqf == NULL); in st_start()
6464 bp = un->un_sbufp; in st_start()
6466 } else if (un->un_quef != NULL) { in st_start()
6467 if (un->un_persistence && un->un_persist_errors) { in st_start()
6470 bp = un->un_quef; in st_start()
6483 if ((un->un_throttle <= 0) || (un->un_ncmds >= un->un_throttle)) { in st_start()
6487 if (bp != un->un_recov_buf) { in st_start()
6490 un->un_throttle, un->un_ncmds); in st_start()
6491 if (un->un_ncmds == 0) { in st_start()
6498 (void) timeout(fnc, un, drv_usectohz(1000000)); in st_start()
6511 st_make_cmd(un, bp, st_runout); in st_start()
6545 if (un->un_state != ST_STATE_RESOURCE_WAIT) { in st_start()
6546 un->un_laststate = un->un_state; in st_start()
6547 un->un_state = ST_STATE_RESOURCE_WAIT; in st_start()
6554 if (un->un_persistence) { in st_start()
6555 st_set_pe_flag(un); in st_start()
6561 if (un->un_state == ST_STATE_RESOURCE_WAIT) { in st_start()
6562 un->un_state = un->un_laststate; in st_start()
6573 if (un->un_state == ST_STATE_RESOURCE_WAIT) { in st_start()
6574 un->un_state = un->un_laststate; in st_start()
6582 (void) st_remove_from_queue(&un->un_quef, &un->un_quel, bp); in st_start()
6583 st_add_to_queue(&un->un_runqf, &un->un_runql, un->un_runql, bp); in st_start()
6588 st_start_dump(un, bp); in st_start()
6592 un->un_last_throttle = un->un_throttle; in st_start()
6593 un->un_throttle = 0; /* so nothing else will come in here */ in st_start()
6594 un->un_ncmds++; in st_start()
6598 status = st_transport(un, BP_PKT(bp)); in st_start()
6600 if (un->un_last_throttle) { in st_start()
6601 un->un_throttle = un->un_last_throttle; in st_start()
6617 bp != un->un_recov_buf) { in st_start()
6620 if (st_command_recovery(un, BP_PKT(bp), in st_start()
6626 if (st_handle_start_busy(un, bp, in st_start()
6642 ST_DO_ERRSTATS(un, st_transerrs); in st_start()
6643 if ((bp == un->un_recov_buf) && (status == TRAN_BUSY)) { in st_start()
6647 st_set_pe_flag(un); in st_start()
6649 st_done_and_mutex_exit(un, bp); in st_start()
6660 st_handle_start_busy(struct scsi_tape *un, struct buf *bp, in st_handle_start_busy() argument
6679 ((queued) && (un->un_runql != bp))) { in st_handle_start_busy()
6686 st_add_to_queue(&un->un_quef, &un->un_quel, un->un_quef, bp); in st_handle_start_busy()
6693 un->un_ncmds--; in st_handle_start_busy()
6701 (void) st_remove_from_queue(&un->un_runqf, &un->un_runql, bp); in st_handle_start_busy()
6706 st_hba_unflush(un); in st_handle_start_busy()
6714 (void) timeout(st_start_restart, un, timeout_interval); in st_handle_start_busy()
6727 struct scsi_tape *un = (struct scsi_tape *)arg; in st_runout() local
6731 ASSERT(un != NULL); in st_runout()
6739 if (un->un_recov_buf_busy != 0) { in st_runout()
6740 bp = un->un_recov_buf; in st_runout()
6742 } else if (un->un_sbuf_busy != 0) { in st_runout()
6744 ASSERT(un->un_quef == NULL); in st_runout()
6745 ASSERT(un->un_runqf == NULL); in st_runout()
6746 bp = un->un_sbufp; in st_runout()
6748 } else if (un->un_quef != NULL) { in st_runout()
6749 bp = un->un_quef; in st_runout()
6750 if (un->un_persistence && un->un_persist_errors) { in st_runout()
6774 (void) st_remove_from_queue(&un->un_quef, &un->un_quel, in st_runout()
6790 st_start(un); in st_runout()
6816 st_done_and_mutex_exit(struct scsi_tape *un, struct buf *bp) in st_done_and_mutex_exit() argument
6822 ASSERT(MUTEX_HELD(&un->un_sd->sd_mutex)); in st_done_and_mutex_exit()
6824 _NOTE(LOCK_RELEASED_AS_SIDE_EFFECT(&un->un_sd->sd_mutex)) in st_done_and_mutex_exit()
6831 (void) st_remove_from_queue(&un->un_runqf, &un->un_runql, bp); in st_done_and_mutex_exit()
6833 un->un_ncmds--; in st_done_and_mutex_exit()
6834 cv_signal(&un->un_queue_cv); in st_done_and_mutex_exit()
6845 if (un->un_stats && (bp != un->un_sbufp) && IS_RW(bp)) { in st_done_and_mutex_exit()
6862 if ((pe_flagged = (un->un_persistence && un->un_persist_errors)) != 0) { in st_done_and_mutex_exit()
6863 un->un_last_resid = bp->b_resid; in st_done_and_mutex_exit()
6864 un->un_last_count = bp->b_bcount; in st_done_and_mutex_exit()
6867 if (un->un_pwr_mgmt == ST_PWR_SUSPENDED) { in st_done_and_mutex_exit()
6868 cv_broadcast(&un->un_tape_busy_cv); in st_done_and_mutex_exit()
6869 } else if (un->un_quef && un->un_throttle && !pe_flagged && in st_done_and_mutex_exit()
6870 (bp != un->un_recov_buf)) { in st_done_and_mutex_exit()
6871 st_start(un); in st_done_and_mutex_exit()
6874 un->un_retry_ct = max(pktinfo->pkt_retry_cnt, pktinfo->str_retry_cnt); in st_done_and_mutex_exit()
6876 if (bp == un->un_sbufp && (bp->b_flags & B_ASYNC)) { in st_done_and_mutex_exit()
6893 un->un_sbuf_busy = 0; in st_done_and_mutex_exit()
6894 cv_signal(&un->un_sbuf_cv); in st_done_and_mutex_exit()
6899 if (bp == un->un_sbufp && BP_UCMD(bp)) { in st_done_and_mutex_exit()
6910 (((un->un_pos.blkno % 100) == 0) || in st_done_and_mutex_exit()
6911 (un->un_persistence && un->un_persist_errors))) { in st_done_and_mutex_exit()
6916 un->un_ncmds, un->un_throttle, un->un_errno, in st_done_and_mutex_exit()
6917 un->un_persist_errors); in st_done_and_mutex_exit()
6937 st_flush(un); in st_done_and_mutex_exit()
6945 st_flush(struct scsi_tape *un) in st_flush() argument
6955 un->un_ncmds, (void *)un->un_quef); in st_flush()
6961 if (un->un_ncmds || !un->un_quef) in st_flush()
6972 while ((bp = un->un_quef) != NULL) { in st_flush()
6973 un->un_quef = bp->b_actf; in st_flush()
6979 un->un_pos.blkno, un->un_errno, bp->b_bcount); in st_flush()
6981 st_set_pe_errno(un); in st_flush()
6983 bioerror(bp, un->un_errno); in st_flush()
6998 un->un_quel = NULL; in st_flush()
7002 cv_signal(&un->un_queue_cv); in st_flush()
7011 st_determine_generic(struct scsi_tape *un) in st_determine_generic() argument
7020 "st_determine_generic(un = 0x%p)\n", (void*)un); in st_determine_generic()
7024 if (st_modesense(un)) { in st_determine_generic()
7028 bsize = (un->un_mspl->high_bl << 16) | in st_determine_generic()
7029 (un->un_mspl->mid_bl << 8) | in st_determine_generic()
7030 (un->un_mspl->low_bl); in st_determine_generic()
7033 un->un_dp->options |= ST_VARIABLE; in st_determine_generic()
7034 un->un_dp->bsize = 0; in st_determine_generic()
7035 un->un_bsize = 0; in st_determine_generic()
7042 un->un_dp->options |= ST_VARIABLE; in st_determine_generic()
7043 if (st_change_block_size(un, 0) != 0) { in st_determine_generic()
7048 un->un_dp->options &= ~ST_VARIABLE; in st_determine_generic()
7051 } else if (st_change_block_size(un, 0) == 0) { in st_determine_generic()
7057 un->un_dp->options |= ST_VARIABLE; in st_determine_generic()
7058 un->un_dp->bsize = 0; in st_determine_generic()
7059 un->un_bsize = 0; in st_determine_generic()
7061 un->un_dp->bsize = bsize; in st_determine_generic()
7062 un->un_bsize = bsize; in st_determine_generic()
7066 switch (un->un_mspl->density) { in st_determine_generic()
7074 un->un_dp->type = ST_TYPE_DEFAULT; in st_determine_generic()
7075 un->un_dp->options |= (ST_AUTODEN_OVERRIDE|ST_QIC); in st_determine_generic()
7085 un->un_dp->type = ST_TYPE_REEL; in st_determine_generic()
7086 un->un_dp->options |= ST_REEL; in st_determine_generic()
7087 un->un_dp->densities[0] = 0x1; in st_determine_generic()
7088 un->un_dp->densities[1] = 0x2; in st_determine_generic()
7089 un->un_dp->densities[2] = 0x6; in st_determine_generic()
7090 un->un_dp->densities[3] = 0x3; in st_determine_generic()
7101 un->un_dp->type = ST_TYPE_DEFAULT; in st_determine_generic()
7102 un->un_dp->options |= ST_QIC; in st_determine_generic()
7104 un->un_dp->densities[1] = 0x4; in st_determine_generic()
7105 un->un_dp->densities[2] = 0x5; in st_determine_generic()
7106 un->un_dp->densities[3] = 0x7; in st_determine_generic()
7107 un->un_dp->densities[0] = 0x0b; in st_determine_generic()
7118 un->un_dp->type = ST_TYPE_DEFAULT; in st_determine_generic()
7119 un->un_dp->options |= ST_QIC; in st_determine_generic()
7120 un->un_dp->densities[0] = 0x0f; in st_determine_generic()
7121 un->un_dp->densities[1] = 0x10; in st_determine_generic()
7122 un->un_dp->densities[2] = 0x11; in st_determine_generic()
7123 un->un_dp->densities[3] = 0x12; in st_determine_generic()
7136 un->un_dp->type = ST_TYPE_HIC; in st_determine_generic()
7137 un->un_dp->densities[0] = 0x09; in st_determine_generic()
7138 un->un_dp->densities[1] = 0x0a; in st_determine_generic()
7139 un->un_dp->densities[2] = 0x0c; in st_determine_generic()
7140 un->un_dp->densities[3] = 0x0d; in st_determine_generic()
7149 un->un_dp->type = ST_TYPE_DAT; in st_determine_generic()
7150 un->un_dp->options |= ST_AUTODEN_OVERRIDE; in st_determine_generic()
7158 un->un_dp->type = ST_TYPE_EXABYTE; in st_determine_generic()
7159 un->un_dp->options |= ST_AUTODEN_OVERRIDE; in st_determine_generic()
7167 un->un_dp->options |= in st_determine_generic()
7173 if (un->un_mspl->bufm == 0) in st_determine_generic()
7174 un->un_dp->options |= ST_NOBUF; in st_determine_generic()
7180 un->un_dp->max_rretries = un->un_dp->max_wretries = 1000; in st_determine_generic()
7188 if ((un->un_dp->options & ST_REEL) && un->un_bsize != 0 && in st_determine_generic()
7189 (un->un_dp->options & ST_VARIABLE)) { in st_determine_generic()
7190 if (st_change_block_size(un, 0) == 0) { in st_determine_generic()
7191 un->un_dp->bsize = 0; in st_determine_generic()
7192 un->un_mspl->high_bl = un->un_mspl->mid_bl = in st_determine_generic()
7193 un->un_mspl->low_bl = 0; in st_determine_generic()
7201 "Generic Drive, Vendor=%s\n\t%s", un->un_dp->name, in st_determine_generic()
7203 if (un->un_dp->options & ST_VARIABLE) { in st_determine_generic()
7209 un->un_dp->bsize); in st_determine_generic()
7216 st_determine_density(struct scsi_tape *un, int rw) in st_determine_density() argument
7224 (void*)un, (rw == B_WRITE ? wr_str: rd_str)); in st_determine_density()
7231 if (un->un_pos.pmode == logical) { in st_determine_density()
7232 if (un->un_pos.lgclblkno != 0) { in st_determine_density()
7235 } else if (un->un_pos.pmode == legacy) { in st_determine_density()
7236 if ((un->un_pos.fileno != 0) || (un->un_pos.blkno != 0)) { in st_determine_density()
7246 if ((un->un_pos.pmode == logical) && in st_determine_density()
7247 (un->un_pos.lgclblkno != 0)) { in st_determine_density()
7257 un->un_curdens = MT_DENSITY(un->un_dev); in st_determine_density()
7258 if (st_set_density(un)) { in st_determine_density()
7268 if (!un->un_density_known) { in st_determine_density()
7269 if (st_get_density(un)) { in st_determine_density()
7287 st_get_density(struct scsi_tape *un) in st_get_density() argument
7296 "st_get_density(un = 0x%p)\n", (void*)un); in st_get_density()
7319 if ((un->un_dp->options & ST_AUTODEN_OVERRIDE) || in st_get_density()
7320 (un->un_sd->sd_inq->inq_ansi > 1)) { in st_get_density()
7321 un->un_density_known = 1; in st_get_density()
7331 size = (unsigned)(un->un_dp->bsize ? un->un_dp->bsize : SECSIZE); in st_get_density()
7332 un->un_tmpbuf = kmem_alloc(size, KM_SLEEP); in st_get_density()
7338 dens = olddens = un->un_curdens = MT_DENSITY(un->un_dev); in st_get_density()
7340 for (i = 0; i < NDENSITIES; i++, ((un->un_curdens == NDENSITIES - 1) ? in st_get_density()
7341 (un->un_curdens = 0) : (un->un_curdens += 1))) { in st_get_density()
7346 dens = un->un_dp->densities[un->un_curdens]; in st_get_density()
7352 if (st_set_density(un)) { in st_get_density()
7360 succes = (st_cmd(un, SCMD_READ, (int)size, SYNC_CMD) == 0); in st_get_density()
7361 if (st_cmd(un, SCMD_REWIND, 0, SYNC_CMD)) { in st_get_density()
7365 st_init(un); in st_get_density()
7367 un->un_density_known = 1; in st_get_density()
7371 kmem_free(un->un_tmpbuf, size); in st_get_density()
7372 un->un_tmpbuf = 0; in st_get_density()
7380 st_set_density(struct scsi_tape *un) in st_set_density() argument
7387 "st_set_density(un = 0x%p): density = 0x%x\n", (void*)un, in st_set_density()
7388 un->un_dp->densities[un->un_curdens]); in st_set_density()
7392 un->un_mspl->density = un->un_dp->densities[un->un_curdens]; in st_set_density()
7394 if ((un->un_dp->options & ST_AUTODEN_OVERRIDE) == 0) { in st_set_density()
7399 if (st_modeselect(un)) { in st_set_density()
7402 } else if ((un->un_dp->options & ST_MODE_SEL_COMP) != 0) { in st_set_density()
7409 rval = st_set_compression(un); in st_set_density()
7419 un->un_density_known = 1; in st_set_density()
7427 st_loadtape(struct scsi_tape *un) in st_loadtape() argument
7434 "st_loadtape(un = 0x%p)\n", (void*) un); in st_loadtape()
7438 rval = st_update_block_pos(un, st_cmd, 0); in st_loadtape()
7446 rval = st_cmd(un, SCMD_REWIND, 1, SYNC_CMD); in st_loadtape()
7448 st_init(un); in st_loadtape()
7449 un->un_density_known = 0; in st_loadtape()
7475 struct scsi_tape *un; in st_test_append() local
7479 un = ddi_get_soft_state(st_state, MTUNIT(dev)); in st_test_append()
7486 "st_test_append(): fileno %d\n", un->un_pos.fileno); in st_test_append()
7488 un->un_laststate = un->un_state; in st_test_append()
7489 un->un_state = ST_STATE_APPEND_TESTING; in st_test_append()
7490 un->un_test_append = 0; in st_test_append()
7501 un->un_tmpbuf = kmem_alloc((unsigned)bp->b_bcount, KM_SLEEP); in st_test_append()
7502 bcopy(bp->b_un.b_addr, un->un_tmpbuf, (uint_t)bp->b_bcount); in st_test_append()
7508 if (st_cmd(un, (int)SCMD_WRITE, (int)bp->b_bcount, SYNC_CMD) == 0) { in st_test_append()
7512 bp->b_resid = un->un_sbufp->b_resid; in st_test_append()
7517 un->un_laststate = un->un_state; in st_test_append()
7518 un->un_state = ST_STATE_OPEN; in st_test_append()
7519 kmem_free(un->un_tmpbuf, bcount); in st_test_append()
7520 un->un_tmpbuf = NULL; in st_test_append()
7533 status = un->un_status; in st_test_append()
7534 un->un_status = 0; in st_test_append()
7535 (void) st_cmd(un, SCMD_READ, SECSIZE, SYNC_CMD); in st_test_append()
7536 if (un->un_status == KEY_BLANK_CHECK) { in st_test_append()
7544 un->un_laststate = un->un_state; in st_test_append()
7545 un->un_state = ST_STATE_OPEN; in st_test_append()
7546 bcopy(bp->b_un.b_addr, un->un_tmpbuf, (uint_t)bp->b_bcount); in st_test_append()
7547 if (st_cmd(un, (int)SCMD_WRITE, (int)bp->b_bcount, in st_test_append()
7564 if (st_cmd(un, SCMD_SPACE, Blk(-1), SYNC_CMD)) { in st_test_append()
7565 un->un_pos.pmode = invalid; in st_test_append()
7568 un->un_err_resid = bp->b_resid; in st_test_append()
7569 un->un_status = status; in st_test_append()
7578 un->un_laststate = un->un_state; in st_test_append()
7579 un->un_state = ST_STATE_OPEN_PENDING_IO; in st_test_append()
7580 kmem_free(un->un_tmpbuf, bcount); in st_test_append()
7581 un->un_tmpbuf = NULL; in st_test_append()
7594 st_cmd(struct scsi_tape *un, int com, int64_t count, int wait) in st_cmd() argument
7604 un->un_dev, com, count, wait); in st_cmd()
7606 ASSERT(MUTEX_HELD(&un->un_sd->sd_mutex)); in st_cmd()
7611 st_debug_cmds(un, com, count, wait); in st_cmd()
7615 st_wait_for_io(un); in st_cmd()
7618 err = st_check_cmd_for_need_to_reserve(un, com, count); in st_cmd()
7629 (void) st_update_block_pos(un, st_cmd, 0); in st_cmd()
7635 ASSERT(un->un_recov_buf_busy == 0); in st_cmd()
7637 while (un->un_sbuf_busy) in st_cmd()
7638 cv_wait(&un->un_sbuf_cv, ST_MUTEX); in st_cmd()
7639 un->un_sbuf_busy = 1; in st_cmd()
7641 bp = un->un_sbufp; in st_cmd()
7646 err = st_setup_cmd(un, bp, com, count); in st_cmd()
7648 un->un_sbuf_busy = 0; in st_cmd()
7656 (un->un_pos.pmode != invalid)) { in st_cmd()
7657 un->un_running.pmode = invalid; in st_cmd()
7658 last_err_resid = un->un_err_resid; in st_cmd()
7659 (void) st_update_block_pos(un, st_cmd, 1); in st_cmd()
7664 un->un_running.pmode = invalid; in st_cmd()
7665 un->un_err_resid = last_err_resid; in st_cmd()
7668 cv_signal(&un->un_sbuf_cv); in st_cmd()
7674 st_setup_cmd(struct scsi_tape *un, buf_t *bp, int com, int64_t count) in st_setup_cmd() argument
7677 dev_t dev = un->un_dev; in st_setup_cmd()
7691 bp->b_un.b_addr = un->un_tmpbuf; in st_setup_cmd()
7697 bp->b_un.b_addr = un->un_tmpbuf; in st_setup_cmd()
7758 bp->b_un.b_addr = (caddr_t)(un->un_mspl); in st_setup_cmd()
7764 bp->b_un.b_addr = (caddr_t)(un->un_mspl); in st_setup_cmd()
7772 bp->b_un.b_addr = (caddr_t)(un->un_rbl); in st_setup_cmd()
7791 switch (un->un_read_pos_type) { in st_setup_cmd()
7804 "st_make_cmd()\n", un->un_read_pos_type); in st_setup_cmd()
7808 bp->b_un.b_addr = (caddr_t)un->un_read_pos_data; in st_setup_cmd()
7904 st_set_compression(struct scsi_tape *un) in st_set_compression() argument
7917 if ((un->un_dp->options & ST_MODE_SEL_COMP) == 0) { in st_set_compression()
7918 un->un_comp_page = 0; in st_set_compression()
7923 minor = MT_DENSITY(un->un_dev); in st_set_compression()
7933 (un->un_dp->densities[0] == un->un_dp->densities[1]) && in st_set_compression()
7934 (un->un_dp->densities[2] == un->un_dp->densities[3]) && in st_set_compression()
7935 (un->un_dp->densities[0] != un->un_dp->densities[2])) { in st_set_compression()
7942 un->un_mspl->high_bl = (uchar_t)(un->un_bsize >> 16); in st_set_compression()
7943 un->un_mspl->mid_bl = (uchar_t)(un->un_bsize >> 8); in st_set_compression()
7944 un->un_mspl->low_bl = (uchar_t)(un->un_bsize); in st_set_compression()
7952 if ((un->un_comp_page & ST_DEV_DATACOMP_PAGE) == ST_DEV_DATACOMP_PAGE) { in st_set_compression()
7953 rval = st_set_datacomp_page(un, turn_compression_on); in st_set_compression()
7958 if (un->un_status == KEY_ILLEGAL_REQUEST) { in st_set_compression()
7963 un->un_comp_page = ST_DEV_CONFIG_PAGE; in st_set_compression()
7964 } else if (un->un_state >= ST_STATE_OPEN) { in st_set_compression()
7965 un->un_pos.pmode = invalid; in st_set_compression()
7971 un->un_comp_page = ST_DEV_DATACOMP_PAGE; in st_set_compression()
7975 if ((un->un_comp_page & ST_DEV_CONFIG_PAGE) == ST_DEV_CONFIG_PAGE) { in st_set_compression()
7976 rval = st_set_devconfig_page(un, turn_compression_on); in st_set_compression()
7981 if (un->un_status == KEY_ILLEGAL_REQUEST) { in st_set_compression()
7987 un->un_dp->options &= ~ST_MODE_SEL_COMP; in st_set_compression()
7988 un->un_comp_page = 0; in st_set_compression()
7991 } else if (un->un_state >= ST_STATE_OPEN) { in st_set_compression()
7992 un->un_pos.pmode = invalid; in st_set_compression()
8007 st_set_devconfig_page(struct scsi_tape *un, int compression_on) in st_set_devconfig_page() argument
8020 if (un->un_mspl->page_code != ST_DEV_CONFIG_PAGE) { in st_set_devconfig_page()
8021 rval = st_gen_mode_sense(un, st_uscsi_cmd, ST_DEV_CONFIG_PAGE, in st_set_devconfig_page()
8022 un->un_mspl, sizeof (struct seq_mode)); in st_set_devconfig_page()
8032 if (un->un_dp->type == ST_TYPE_FUJI) { in st_set_devconfig_page()
8045 if ((cflag == un->un_mspl->page.dev.comp_alg) && in st_set_devconfig_page()
8046 (un->un_comp_page == ST_DEV_CONFIG_PAGE)) { in st_set_devconfig_page()
8050 un->un_mspl->page.dev.comp_alg = cflag; in st_set_devconfig_page()
8060 (char *)un->un_mspl, sizeof (struct seq_mode)); in st_set_devconfig_page()
8063 rval = st_gen_mode_select(un, st_uscsi_cmd, un->un_mspl, in st_set_devconfig_page()
8073 st_set_datacomp_page(struct scsi_tape *un, int compression_on) in st_set_datacomp_page() argument
8086 if (un->un_mspl->page_code != ST_DEV_DATACOMP_PAGE) { in st_set_datacomp_page()
8087 rval = st_gen_mode_sense(un, st_uscsi_cmd, ST_DEV_DATACOMP_PAGE, in st_set_datacomp_page()
8088 un->un_mspl, sizeof (struct seq_mode)); in st_set_datacomp_page()
8101 if (un->un_mspl->page.comp.dcc == 0) { in st_set_datacomp_page()
8106 if (un->un_mspl->page.comp.dce) { in st_set_datacomp_page()
8117 (un->un_comp_page == ST_DEV_DATACOMP_PAGE)) { in st_set_datacomp_page()
8127 un->un_mspl->page.comp.dce = 1; in st_set_datacomp_page()
8129 un->un_mspl->page.comp.dce = 0; in st_set_datacomp_page()
8137 (char *)un->un_mspl, sizeof (struct seq_mode)); in st_set_datacomp_page()
8140 rval = st_gen_mode_select(un, st_uscsi_cmd, un->un_mspl, in st_set_datacomp_page()
8147 st_modesense(struct scsi_tape *un) in st_modesense() argument
8154 page = un->un_comp_page; in st_modesense()
8159 rval = st_gen_mode_sense(un, st_uscsi_cmd, page, un->un_mspl, in st_modesense()
8164 if (un->un_dp->options & ST_MODE_SEL_COMP) { in st_modesense()
8166 rval = st_gen_mode_sense(un, st_uscsi_cmd, page, in st_modesense()
8167 un->un_mspl, sizeof (struct seq_mode)); in st_modesense()
8168 if (rval == 0 && un->un_mspl->page_code == page) { in st_modesense()
8169 un->un_comp_page = page; in st_modesense()
8173 rval = st_gen_mode_sense(un, st_uscsi_cmd, page, in st_modesense()
8174 un->un_mspl, sizeof (struct seq_mode)); in st_modesense()
8175 if (rval == 0 && un->un_mspl->page_code == page) { in st_modesense()
8176 un->un_comp_page = page; in st_modesense()
8179 un->un_dp->options &= ~ST_MODE_SEL_COMP; in st_modesense()
8180 un->un_comp_page = 0; in st_modesense()
8182 un->un_comp_page = 0; in st_modesense()
8187 rval = st_cmd(un, SCMD_MODE_SENSE, MSIZE, SYNC_CMD); in st_modesense()
8193 st_modeselect(struct scsi_tape *un) in st_modeselect() argument
8202 un->un_dev, un->un_mspl->density); in st_modeselect()
8212 rval = st_modesense(un); in st_modeselect()
8216 un->un_mspl->bd_len = 8; in st_modeselect()
8217 un->un_mspl->high_nb = 0; in st_modeselect()
8218 un->un_mspl->mid_nb = 0; in st_modeselect()
8219 un->un_mspl->low_nb = 0; in st_modeselect()
8221 un->un_mspl->high_bl = (uchar_t)(un->un_bsize >> 16); in st_modeselect()
8222 un->un_mspl->mid_bl = (uchar_t)(un->un_bsize >> 8); in st_modeselect()
8223 un->un_mspl->low_bl = (uchar_t)(un->un_bsize); in st_modeselect()
8232 if (un->un_dp->options & ST_KNOWS_MEDIA) { in st_modeselect()
8236 if (un->un_mspl->media_type == in st_modeselect()
8237 un->un_dp->mediatype[ix]) { in st_modeselect()
8244 if (ix < un->un_curdens) { in st_modeselect()
8247 un->un_curdens = ix; in st_modeselect()
8255 un->un_mspl->media_type, in st_modeselect()
8256 un->un_dp->densities[best]); in st_modeselect()
8257 un->un_mspl->density = un->un_dp->densities[best]; in st_modeselect()
8260 un->un_mspl->density = in st_modeselect()
8261 un->un_dp->densities[un->un_curdens]; in st_modeselect()
8264 un->un_mspl->density = un->un_dp->densities[un->un_curdens]; in st_modeselect()
8267 if (un->un_dp->options & ST_NOBUF) { in st_modeselect()
8268 un->un_mspl->bufm = 0; in st_modeselect()
8270 un->un_mspl->bufm = 1; in st_modeselect()
8273 rval = st_set_compression(un); in st_modeselect()
8283 un->un_mspl->data_len = 0; in st_modeselect()
8284 un->un_mspl->media_type = 0; in st_modeselect()
8285 un->un_mspl->wp = 0; in st_modeselect()
8288 rval = st_cmd(un, SCMD_MODE_SELECT, MSIZE, SYNC_CMD); in st_modeselect()
8290 if (un->un_state >= ST_STATE_OPEN) { in st_modeselect()
8293 un->un_pos.pmode = invalid; in st_modeselect()
8304 (void) st_modesense(un); in st_modeselect()
8317 st_gen_mode_sense(struct scsi_tape *un, ubufunc_t ubf, int page, in st_gen_mode_sense() argument
8341 com->uscsi_timeout = un->un_dp->non_motion_timeout; in st_gen_mode_sense()
8344 r = ubf(un, com, FKIOCTL); in st_gen_mode_sense()
8355 st_gen_mode_select(struct scsi_tape *un, ubufunc_t ubf, in st_gen_mode_select() argument
8395 com->uscsi_timeout = un->un_dp->non_motion_timeout; in st_gen_mode_select()
8398 r = ubf(un, com, FKIOCTL); in st_gen_mode_select()
8405 st_read_block_limits(struct scsi_tape *un, struct read_blklim *read_blk) in st_read_block_limits() argument
8425 com->uscsi_timeout = un->un_dp->non_motion_timeout; in st_read_block_limits()
8428 rval = st_uscsi_cmd(un, com, FKIOCTL); in st_read_block_limits()
8438 st_report_density_support(struct scsi_tape *un, uchar_t *density_data, in st_report_density_support() argument
8461 com->uscsi_timeout = un->un_dp->non_motion_timeout; in st_report_density_support()
8464 rval = st_uscsi_cmd(un, com, FKIOCTL); in st_report_density_support()
8474 st_report_supported_operation(struct scsi_tape *un, uchar_t *oper_data, in st_report_supported_operation() argument
8512 com->uscsi_timeout = un->un_dp->non_motion_timeout; in st_report_supported_operation()
8515 rval = st_uscsi_cmd(un, com, FKIOCTL); in st_report_supported_operation()
8529 st_change_block_size(struct scsi_tape *un, uint32_t nblksz) in st_change_block_size() argument
8542 if (un->un_comp_page == (ST_DEV_DATACOMP_PAGE | ST_DEV_CONFIG_PAGE)) { in st_change_block_size()
8543 (void) st_modesense(un); in st_change_block_size()
8547 rval = st_gen_mode_sense(un, st_uscsi_cmd, 0, current, MSIZE); in st_change_block_size()
8562 un->un_bsize = nblksz; in st_change_block_size()
8573 rval = st_gen_mode_select(un, st_uscsi_cmd, current, MSIZE); in st_change_block_size()
8581 rval = st_modesense(un); in st_change_block_size()
8583 un->un_bsize = in st_change_block_size()
8584 (un->un_mspl->high_bl << 16) | in st_change_block_size()
8585 (un->un_mspl->mid_bl << 8) | in st_change_block_size()
8586 (un->un_mspl->low_bl); in st_change_block_size()
8588 if (un->un_bsize != nblksz) { in st_change_block_size()
8591 "(read: %u requested: %u)\n", nblksz, un->un_bsize); in st_change_block_size()
8602 st_init(struct scsi_tape *un) in st_init() argument
8610 un->un_dev); in st_init()
8612 un->un_pos.blkno = 0; in st_init()
8613 un->un_pos.fileno = 0; in st_init()
8614 un->un_lastop = ST_OP_NIL; in st_init()
8615 un->un_pos.eof = ST_NO_EOF; in st_init()
8616 un->un_pwr_mgmt = ST_PWR_NORMAL; in st_init()
8628 st_make_cmd(struct scsi_tape *un, struct buf *bp, int (*func)(caddr_t)) in st_make_cmd() argument
8643 optype prev_op = un->un_lastop; in st_make_cmd()
8645 (un->un_arq_enabled ? sizeof (struct scsi_arq_status) : 1); in st_make_cmd()
8652 "st_make_cmd(): dev = 0x%lx\n", un->un_dev); in st_make_cmd()
8663 if ((bp != un->un_sbufp) && (bp != un->un_recov_buf)) { in st_make_cmd()
8666 (caddr_t)un); in st_make_cmd()
8679 if (un->un_bsize == 0) { in st_make_cmd()
8683 count = bp->b_bcount / un->un_bsize; in st_make_cmd()
8688 un->un_lastop = ST_OP_READ; in st_make_cmd()
8689 if ((un->un_bsize == 0) && /* Not Fixed Block */ in st_make_cmd()
8690 (un->un_dp->options & ST_READ_IGNORE_ILI)) { in st_make_cmd()
8695 un->un_lastop = ST_OP_WRITE; in st_make_cmd()
8697 tval = un->un_dp->io_timeout; in st_make_cmd()
8707 wr_str: rd_str, un->un_pos.blkno, bp->b_bcount); in st_make_cmd()
8713 st_make_uscsi_cmd(un, ucmd, bp, func); in st_make_cmd()
8725 if (un->un_bsize == 0) { in st_make_cmd()
8729 count /= un->un_bsize; in st_make_cmd()
8732 un->un_lastop = ST_OP_READ; in st_make_cmd()
8733 tval = un->un_dp->io_timeout; in st_make_cmd()
8739 if (un->un_bsize != 0) { in st_make_cmd()
8741 count /= un->un_bsize; in st_make_cmd()
8746 un->un_lastop = ST_OP_WRITE; in st_make_cmd()
8747 tval = un->un_dp->io_timeout; in st_make_cmd()
8753 un->un_lastop = ST_OP_WEOF; in st_make_cmd()
8755 tval = un->un_dp->io_timeout; in st_make_cmd()
8761 if ((un->un_dp->options & ST_SHORT_FILEMARKS) && in st_make_cmd()
8762 ((un->un_dp->type == ST_TYPE_EXB8500) || in st_make_cmd()
8763 (un->un_dp->type == ST_TYPE_EXABYTE))) { in st_make_cmd()
8789 un->un_lastop = ST_OP_CTL; in st_make_cmd()
8790 tval = un->un_dp->rewind_timeout; in st_make_cmd()
8803 un->un_pos.fileno, un->un_pos.blkno); in st_make_cmd()
8808 un->un_lastop = ST_OP_CTL; in st_make_cmd()
8809 tval = un->un_dp->space_timeout; in st_make_cmd()
8819 un->un_pos.fileno, un->un_pos.blkno); in st_make_cmd()
8821 un->un_lastop = ST_OP_CTL; in st_make_cmd()
8822 tval = un->un_dp->space_timeout; in st_make_cmd()
8833 tval = un->un_dp->load_timeout; in st_make_cmd()
8835 tval = un->un_dp->unload_timeout; in st_make_cmd()
8839 tval += un->un_dp->rewind_timeout; in st_make_cmd()
8841 un->un_lastop = ST_OP_CTL; in st_make_cmd()
8855 tval = un->un_dp->erase_timeout; in st_make_cmd()
8858 tval = un->un_dp->erase_timeout; in st_make_cmd()
8861 un->un_lastop = ST_OP_CTL; in st_make_cmd()
8870 tval = un->un_dp->non_motion_timeout; in st_make_cmd()
8871 un->un_lastop = ST_OP_CTL; in st_make_cmd()
8879 tval = un->un_dp->non_motion_timeout; in st_make_cmd()
8880 un->un_lastop = ST_OP_CTL; in st_make_cmd()
8887 tval = un->un_dp->non_motion_timeout; in st_make_cmd()
8888 un->un_lastop = ST_OP_CTL; in st_make_cmd()
8895 tval = un->un_dp->non_motion_timeout; in st_make_cmd()
8896 un->un_lastop = ST_OP_CTL; in st_make_cmd()
8904 tval = un->un_dp->non_motion_timeout; in st_make_cmd()
8905 un->un_lastop = ST_OP_CTL; in st_make_cmd()
8912 tval = un->un_dp->non_motion_timeout; in st_make_cmd()
8913 un->un_lastop = ST_OP_CTL; in st_make_cmd()
8920 tval = un->un_dp->non_motion_timeout; in st_make_cmd()
8921 un->un_lastop = ST_OP_CTL; in st_make_cmd()
8927 fixbit = un->un_read_pos_type; in st_make_cmd()
8929 tval = un->un_dp->non_motion_timeout; in st_make_cmd()
8931 un->un_lastop = ST_OP_CTL; in st_make_cmd()
8932 switch (un->un_read_pos_type) { in st_make_cmd()
8945 " st_make_cmd()\n", un->un_read_pos_type); in st_make_cmd()
8956 st_recov_sz, 0, func, (caddr_t)un); in st_make_cmd()
8979 FILL_SCSI1_LUN(un->un_sd, pkt); in st_make_cmd()
8989 if (bp == un->un_recov_buf) { in st_make_cmd()
8995 st_add_recovery_info_to_pkt(un, bp, pkt); in st_make_cmd()
9011 un->un_lastop = prev_op; in st_make_cmd()
9024 st_make_uscsi_cmd(struct scsi_tape *un, struct uscsi_cmd *ucmd, in st_make_uscsi_cmd() argument
9037 "st_make_uscsi_cmd(): dev = 0x%lx\n", un->un_dev); in st_make_uscsi_cmd()
9040 if (un->un_arq_enabled) { in st_make_uscsi_cmd()
9062 cdblen, stat_size, st_recov_sz, flags, func, (caddr_t)un); in st_make_uscsi_cmd()
9093 if (bp == un->un_recov_buf) { in st_make_uscsi_cmd()
9099 st_add_recovery_info_to_pkt(un, bp, pkt); in st_make_uscsi_cmd()
9116 struct scsi_tape *un = arg; in st_intr_restart() local
9126 "st_intr_restart(), un = 0x%p\n", (void *)un); in st_intr_restart()
9128 un->un_hib_tid = 0; in st_intr_restart()
9130 if (un->un_recov_buf_busy != 0) { in st_intr_restart()
9131 bp = un->un_recov_buf; in st_intr_restart()
9133 } else if (un->un_sbuf_busy != 0) { in st_intr_restart()
9134 bp = un->un_sbufp; in st_intr_restart()
9136 } else if (un->un_quef != NULL) { in st_intr_restart()
9137 bp = un->un_quef; in st_intr_restart()
9153 (void) st_remove_from_queue(&un->un_quef, &un->un_quef, bp); in st_intr_restart()
9155 if (un->un_runqf) { in st_intr_restart()
9162 un->un_runqf = bp; in st_intr_restart()
9163 un->un_runql = bp; in st_intr_restart()
9172 status = st_transport(un, BP_PKT(bp)); in st_intr_restart()
9181 un->un_unit_attention_flags && in st_intr_restart()
9182 bp != un->un_recov_buf) { in st_intr_restart()
9183 un->un_unit_attention_flags = 0; in st_intr_restart()
9186 if (st_command_recovery(un, BP_PKT(bp), in st_intr_restart()
9193 if (st_handle_intr_busy(un, bp, in st_intr_restart()
9204 if (un->un_last_throttle) { in st_intr_restart()
9205 un->un_throttle = un->un_last_throttle; in st_intr_restart()
9208 ST_DO_ERRSTATS(un, st_transerrs); in st_intr_restart()
9213 st_set_pe_flag(un); in st_intr_restart()
9215 st_done_and_mutex_exit(un, bp); in st_intr_restart()
9217 if (un->un_last_throttle) { in st_intr_restart()
9218 un->un_throttle = un->un_last_throttle; in st_intr_restart()
9247 state, un->un_mediastate); in st_check_media()
9249 prev_state = un->un_mediastate; in st_check_media()
9255 if (state == un->un_mediastate || un->un_mediastate == MTIO_NONE) { in st_check_media()
9270 un->un_swr_token = token; in st_check_media()
9271 un->un_specified_mediastate = state; in st_check_media()
9282 while (un->un_mediastate == state) { in st_check_media()
9283 if (cv_wait_sig(&un->un_state_cv, ST_MUTEX) == 0) { in st_check_media()
9293 un->un_mediastate); in st_check_media()
9303 if ((un->un_mediastate == MTIO_INSERTED) && in st_check_media()
9304 (un->un_state == ST_STATE_OFFLINE)) { in st_check_media()
9314 un->un_state = ST_STATE_INITIALIZING; in st_check_media()
9320 if ((un->un_rsvd_status & in st_check_media()
9326 rval = st_cmd(un, SCMD_TEST_UNIT_READY, 0, SYNC_CMD); in st_check_media()
9336 un->un_mediastate = prev_state; in st_check_media()
9337 un->un_state = ST_STATE_OFFLINE; in st_check_media()
9344 rval = st_tape_init(un); in st_check_media()
9348 un->un_state = ST_STATE_OFFLINE; in st_check_media()
9349 un->un_pos.pmode = invalid; in st_check_media()
9351 un->un_state = ST_STATE_OPEN_PENDING_IO; in st_check_media()
9353 } else if ((un->un_mediastate == MTIO_EJECTED) && in st_check_media()
9354 (un->un_state != ST_STATE_OFFLINE)) { in st_check_media()
9359 un->un_laststate = un->un_state; in st_check_media()
9360 un->un_state = ST_STATE_OFFLINE; in st_check_media()
9368 un->un_swr_token = (opaque_t)NULL; in st_check_media()
9387 struct scsi_tape *un; in st_media_watch_cb() local
9393 if ((un = ddi_get_soft_state(st_state, instance)) == NULL) { in st_media_watch_cb()
9416 switch (un->un_dp->type) { in st_media_watch_cb()
9420 "default to ST_TYPE_HP\n", un->un_dp->type); in st_media_watch_cb()
9426 if (un->un_dp->type == ST_TYPE_FUJI) { in st_media_watch_cb()
9504 state = un->un_specified_mediastate; in st_media_watch_cb()
9519 state, un->un_specified_mediastate); in st_media_watch_cb()
9526 if (state != un->un_specified_mediastate) { in st_media_watch_cb()
9527 un->un_mediastate = state; in st_media_watch_cb()
9535 un->un_delay_tid = timeout(st_delayed_cv_broadcast, in st_media_watch_cb()
9536 un, drv_usectohz((clock_t)MEDIA_ACCESS_DELAY)); in st_media_watch_cb()
9540 cv_broadcast(&un->un_state_cv); in st_media_watch_cb()
9554 struct scsi_tape *un = arg; in st_delayed_cv_broadcast() local
9562 cv_broadcast(&un->un_state_cv); in st_delayed_cv_broadcast()
9572 struct scsi_tape *un = arg; in st_start_restart() local
9576 ASSERT(un != NULL); in st_start_restart()
9582 st_start(un); in st_start_restart()
9597 struct scsi_tape *un; in st_intr() local
9602 un = ddi_get_soft_state(st_state, MTUNIT(bp->b_edev)); in st_intr()
9606 ASSERT(un != NULL); in st_intr()
9610 ASSERT(bp != un->un_recov_buf); in st_intr()
9612 un->un_rqs_state &= ~(ST_RQS_ERROR); in st_intr()
9624 } else if ((pkt == un->un_rqs) || in st_intr()
9625 (un->un_state == ST_STATE_SENSING)) { in st_intr()
9626 ASSERT(pkt == un->un_rqs); in st_intr()
9627 ASSERT(un->un_state == ST_STATE_SENSING); in st_intr()
9628 un->un_state = un->un_laststate; in st_intr()
9629 rcv->cmd_bp = un->un_rqs_bp; in st_intr()
9630 ST_DO_ERRSTATS(un, st_transerrs); in st_intr()
9633 action = st_handle_incomplete(un, bp); in st_intr()
9639 } else if ((pkt == un->un_rqs) || (un->un_state == ST_STATE_SENSING)) { in st_intr()
9644 ASSERT(pkt == un->un_rqs); in st_intr()
9645 ASSERT(un->un_state == ST_STATE_SENSING); in st_intr()
9647 action = st_handle_sense(un, bp, &un->un_pos); in st_intr()
9657 rcv->cmd_bp = un->un_rqs_bp; in st_intr()
9662 un->un_state = un->un_laststate; in st_intr()
9665 } else if (un->un_arq_enabled && (pkt->pkt_state & STATE_ARQ_DONE)) { in st_intr()
9669 action = st_handle_autosense(un, bp, &un->un_pos); in st_intr()
9679 action = st_check_error(un, pkt); in st_intr()
9682 if (un->un_pwr_mgmt == ST_PWR_SUSPENDED) { in st_intr()
9690 st_add_to_queue(&un->un_runqf, &un->un_runql, in st_intr()
9691 un->un_runqf, bp); in st_intr()
9708 if (un->un_multipath) { in st_intr()
9732 (un->un_last_path_instance != pkt->pkt_path_instance)) { in st_intr()
9739 (un->un_state > ST_STATE_OPENING)) { in st_intr()
9747 un->un_last_path_instance = pkt->pkt_path_instance; in st_intr()
9754 if (un->un_state == ST_STATE_SENSING && action != QUE_SENSE) { in st_intr()
9755 un->un_state = un->un_laststate; in st_intr()
9769 un->un_pos.pmode = invalid; in st_intr()
9773 if (un->un_pos.eof < ST_EOT_PENDING && in st_intr()
9774 un->un_state >= ST_STATE_OPEN) { in st_intr()
9780 if (un->un_status != KEY_ILLEGAL_REQUEST) { in st_intr()
9781 un->un_pos.pmode = invalid; in st_intr()
9785 un->un_err_resid = bp->b_resid = bp->b_bcount; in st_intr()
9794 st_set_pe_flag(un); in st_intr()
9795 if (!(un->un_rqs_state & ST_RQS_ERROR) && in st_intr()
9796 (un->un_errno == EIO)) { in st_intr()
9797 un->un_rqs_state &= ~(ST_RQS_VALID); in st_intr()
9802 un->un_err_resid = bp->b_resid = bp->b_bcount; in st_intr()
9808 st_set_pe_flag(un); in st_intr()
9809 if (!(un->un_rqs_state & ST_RQS_ERROR) && in st_intr()
9810 (un->un_errno == EIO)) { in st_intr()
9811 un->un_rqs_state &= ~(ST_RQS_VALID); in st_intr()
9815 st_set_state(un, bp); in st_intr()
9819 if ((un->un_ncmds > 1) && !un->un_flush_on_errors) in st_intr()
9822 if (un->un_state != ST_STATE_SENSING) { in st_intr()
9823 un->un_laststate = un->un_state; in st_intr()
9824 un->un_state = ST_STATE_SENSING; in st_intr()
9830 bzero(un->un_rqs->pkt_scbp, SENSE_LENGTH); in st_intr()
9836 if (pkt != un->un_rqs) { in st_intr()
9837 ((recov_info *)un->un_rqs->pkt_private)->cmd_bp = bp; in st_intr()
9840 if (un->un_throttle) { in st_intr()
9841 un->un_last_throttle = un->un_throttle; in st_intr()
9842 un->un_throttle = 0; in st_intr()
9852 status = st_transport(un, un->un_rqs); in st_intr()
9854 if (un->un_last_throttle) { in st_intr()
9855 un->un_throttle = un->un_last_throttle; in st_intr()
9863 ST_DO_ERRSTATS(un, st_transerrs); in st_intr()
9865 un->un_pos.pmode = invalid; in st_intr()
9867 st_set_pe_flag(un); in st_intr()
9888 if (un->un_throttle) { in st_intr()
9889 un->un_last_throttle = un->un_throttle; in st_intr()
9892 if (st_handle_intr_busy(un, bp, timout) == 0) in st_intr()
9896 un->un_pos.pmode = invalid; in st_intr()
9897 un->un_err_resid = bp->b_resid = bp->b_bcount; in st_intr()
9899 st_set_pe_flag(un); in st_intr()
9904 if ((un->un_ncmds > 1) && !un->un_flush_on_errors) { in st_intr()
9906 "un_ncmds: %d can't retry cmd \n", un->un_ncmds); in st_intr()
9910 if (st_handle_intr_retry_lcmd(un, bp) == 0) in st_intr()
9914 un->un_err_resid = bp->b_resid = bp->b_bcount; in st_intr()
9915 un->un_pos.pmode = invalid; in st_intr()
9917 st_set_pe_flag(un); in st_intr()
9928 action = st_command_recovery(un, pkt, action); in st_intr()
9941 st_done_and_mutex_exit(un, bp); in st_intr()
9945 st_handle_incomplete(struct scsi_tape *un, struct buf *bp) in st_handle_incomplete() argument
9950 struct scsi_pkt *pkt = (un->un_state == ST_STATE_SENSING) ? in st_handle_incomplete()
9951 un->un_rqs : BP_PKT(bp); in st_handle_incomplete()
9959 "st_handle_incomplete(): dev = 0x%lx\n", un->un_dev); in st_handle_incomplete()
9987 if ((un->un_ncmds > 1) || (pkt->pkt_state != STATE_GOT_BUS)) { in st_handle_incomplete()
9996 if ((un->un_laststate > ST_STATE_OPENING) && in st_handle_incomplete()
10001 ST_DO_ERRSTATS(un, st_transerrs); in st_handle_incomplete()
10009 if (!un->un_flush_on_errors) { in st_handle_incomplete()
10010 un->un_status = SUN_KEY_FATAL; in st_handle_incomplete()
10014 st_set_pe_errno(un); in st_handle_incomplete()
10015 bioerror(bp, un->un_errno); in st_handle_incomplete()
10016 if (un->un_errno) in st_handle_incomplete()
10022 un->un_status = SUN_KEY_TIMEOUT; in st_handle_incomplete()
10028 if ((un->un_rsvd_status & in st_handle_incomplete()
10031 un->un_rsvd_status |= ST_LOST_RESERVE; in st_handle_incomplete()
10052 ST_DO_ERRSTATS(un, st_transerrs); in st_handle_incomplete()
10060 if ((un->un_rsvd_status & in st_handle_incomplete()
10068 un->un_pos.pmode = invalid; in st_handle_incomplete()
10070 result = st_reset(un, RESET_LUN); in st_handle_incomplete()
10072 if ((result == 0) && (un->un_state >= ST_STATE_OPEN)) { in st_handle_incomplete()
10082 if (un->un_pwr_mgmt == ST_PWR_SUSPENDED) { in st_handle_incomplete()
10084 } else if (bp == un->un_sbufp) { in st_handle_incomplete()
10102 if (un->un_state >= ST_STATE_OPEN) { in st_handle_incomplete()
10122 st_handle_intr_busy(struct scsi_tape *un, struct buf *bp, in st_handle_intr_busy() argument
10135 "st_handle_intr_busy(), un = 0x%p\n", (void *)un); in st_handle_intr_busy()
10137 if ((bp != un->un_sbufp) && (bp != un->un_recov_buf)) { in st_handle_intr_busy()
10152 ((un->un_runqf != bp) && (un->un_runql != bp) && (queued))) { in st_handle_intr_busy()
10159 (void) st_remove_from_queue(&un->un_runqf, &un->un_runql, bp); in st_handle_intr_busy()
10160 st_add_to_queue(&un->un_quef, &un->un_quel, un->un_quef, bp); in st_handle_intr_busy()
10168 un->un_throttle = 0; in st_handle_intr_busy()
10173 st_hba_unflush(un); in st_handle_intr_busy()
10179 un->un_hib_tid = timeout(st_intr_restart, un, timeout_interval); in st_handle_intr_busy()
10190 st_get_error_entry(struct scsi_tape *un, intptr_t arg, int flag) in st_get_error_entry() argument
10215 if (un->un_error_entry_stk == NULL) { in st_get_error_entry()
10225 err_link_entry_p = un->un_error_entry_stk; in st_get_error_entry()
10359 un->un_error_entry_stk = err_link_entry_p->mtees_nextp; in st_get_error_entry()
10397 st_update_error_stack(struct scsi_tape *un, struct scsi_pkt *pkt, in st_update_error_stack() argument
10448 err_entry_tmp->mtees_nextp = un->un_error_entry_stk; in st_update_error_stack()
10449 un->un_error_entry_stk = err_entry_tmp; in st_update_error_stack()
10457 st_empty_error_stack(struct scsi_tape *un) in st_empty_error_stack() argument
10468 while (un->un_error_entry_stk != NULL) { in st_empty_error_stack()
10469 linkp = un->un_error_entry_stk; in st_empty_error_stack()
10470 un->un_error_entry_stk = in st_empty_error_stack()
10471 un->un_error_entry_stk->mtees_nextp; in st_empty_error_stack()
10487 st_handle_sense(struct scsi_tape *un, struct buf *bp, tapepos_t *pos) in st_handle_sense() argument
10490 struct scsi_pkt *rqpkt = un->un_rqs; in st_handle_sense()
10552 st_update_error_stack(un, pkt, &arqstat); in st_handle_sense()
10553 return (st_decode_sense(un, bp, amt, &arqstat, pos)); in st_handle_sense()
10557 st_handle_autosense(struct scsi_tape *un, struct buf *bp, tapepos_t *pos) in st_handle_autosense() argument
10588 if (st_reset(un, RESET_LUN) == 0) { in st_handle_autosense()
10628 st_update_error_stack(un, pkt, arqstat); in st_handle_autosense()
10630 return (st_decode_sense(un, bp, amt, arqstat, pos)); in st_handle_autosense()
10634 st_decode_sense(struct scsi_tape *un, struct buf *bp, int amt, in st_decode_sense() argument
10659 if (ucmd->uscsi_rqlen && un->un_srqbufp) { in st_decode_sense()
10662 bcopy(ST_RQSENSE, un->un_srqbufp, rqlen); in st_decode_sense()
10683 if (un->un_dp->type == ST_TYPE_EMULEX) { in st_decode_sense()
10694 if (bp != un->un_sbufp && bp != un->un_recov_buf) { in st_decode_sense()
10702 if (un->un_bsize) { in st_decode_sense()
10703 resid *= un->un_bsize; in st_decode_sense()
10761 if ((un->un_state >= ST_STATE_OPEN) && in st_decode_sense()
10772 switch (un->un_status = sensep->es_key) { in st_decode_sense()
10797 if (un->un_dp->options & in st_decode_sense()
10802 un->un_err_pos.lgclblkno, scsi_cmds, in st_decode_sense()
10809 ST_DO_ERRSTATS(un, st_softerrs); in st_decode_sense()
10812 un->un_err_pos.lgclblkno, scsi_cmds, in st_decode_sense()
10833 if (un->un_bsize == 0 && resid > 0) { in st_decode_sense()
10842 } else if (un->un_bsize == 0 && resid < 0) { in st_decode_sense()
10850 ST_DO_ERRSTATS(un, st_softerrs); in st_decode_sense()
10854 un->un_running.pmode = invalid; in st_decode_sense()
10867 un->un_status = SUN_KEY_EOF; in st_decode_sense()
10869 st_set_pe_flag(un); in st_decode_sense()
10881 un->un_status = SUN_KEY_BOT; in st_decode_sense()
10891 un->un_status = SUN_KEY_EOT; in st_decode_sense()
10894 st_set_pe_flag(un); in st_decode_sense()
10901 if (un->un_laststate >= ST_STATE_OPEN) { in st_decode_sense()
10902 ST_DO_ERRSTATS(un, st_softerrs); in st_decode_sense()
10910 ST_DO_ERRSTATS(un, st_harderrs); in st_decode_sense()
10912 un->un_pos.pmode = invalid; in st_decode_sense()
10913 un->un_running.pmode = invalid; in st_decode_sense()
10925 if (un->un_bsize == 0 && resid > 0) { in st_decode_sense()
10930 } else if (un->un_bsize == 0 && resid < 0) { in st_decode_sense()
10941 un->un_status = SUN_KEY_EOF; in st_decode_sense()
10943 st_set_pe_flag(un); in st_decode_sense()
10952 un->un_status = SUN_KEY_EOT; in st_decode_sense()
10954 st_set_pe_flag(un); in st_decode_sense()
10960 ST_DO_ERRSTATS(un, st_softerrs); in st_decode_sense()
10967 ST_DO_ERRSTATS(un, st_harderrs); in st_decode_sense()
10970 if (un->un_dp->options & ST_EJECT_ON_CHANGER_FAILURE) in st_decode_sense()
10971 un->un_eject_tape_on_failure = st_check_asc_ascq(un); in st_decode_sense()
10975 ST_DO_ERRSTATS(un, st_softerrs); in st_decode_sense()
10982 if (bp != un->un_sbufp && (bp->b_flags & B_READ)) { in st_decode_sense()
10986 un->un_status = SUN_KEY_EOT; in st_decode_sense()
10989 un->un_running.pmode = invalid; in st_decode_sense()
10990 st_set_pe_flag(un); in st_decode_sense()
10992 } else if (bp != un->un_sbufp && in st_decode_sense()
10999 if (un->un_laststate >= ST_STATE_OPEN) { in st_decode_sense()
11007 (un->un_dp->options & ST_KNOWS_EOD)) { in st_decode_sense()
11016 st_set_pe_flag(un); in st_decode_sense()
11020 if (st_wrongtapetype(un)) { in st_decode_sense()
11021 un->un_status = SUN_KEY_WRONGMEDIA; in st_decode_sense()
11029 ST_DO_ERRSTATS(un, st_harderrs); in st_decode_sense()
11036 "KEY_UNIT_ATTENTION : un_state = %d\n", un->un_state); in st_decode_sense()
11038 un->un_unit_attention_flags |= 1; in st_decode_sense()
11045 if ((un->un_rsvd_status & in st_decode_sense()
11048 un->un_rsvd_status |= ST_LOST_RESERVE; in st_decode_sense()
11057 if (bp == un->un_recov_buf) { in st_decode_sense()
11076 if ((un->un_rsvd_status & in st_decode_sense()
11099 if (un->un_state <= ST_STATE_OPENING) { in st_decode_sense()
11109 (un->un_restore_pos != 1)) { in st_decode_sense()
11110 un->un_save_fileno = pos->fileno; in st_decode_sense()
11111 un->un_save_blkno = pos->blkno; in st_decode_sense()
11112 un->un_restore_pos = 1; in st_decode_sense()
11173 if (un->un_state >= ST_STATE_OPEN) { in st_decode_sense()
11174 ST_DO_ERRSTATS(un, st_harderrs); in st_decode_sense()
11197 (un->un_dp->rewind_timeout / 10)) { in st_decode_sense()
11229 un->un_state > ST_STATE_OPENING) { in st_decode_sense()
11230 ST_DO_ERRSTATS(un, st_harderrs); in st_decode_sense()
11237 un->un_mediastate = MTIO_EJECTED; in st_decode_sense()
11238 cv_broadcast(&un->un_state_cv); in st_decode_sense()
11240 if ((un->un_dp->options & ST_EJECT_ON_CHANGER_FAILURE) && in st_decode_sense()
11242 un->un_eject_tape_on_failure = st_check_asc_ascq(un); in st_decode_sense()
11259 ST_DO_ERRSTATS(un, st_harderrs); in st_decode_sense()
11272 sense_keys[un->un_status]); in st_decode_sense()
11273 ST_DO_ERRSTATS(un, st_harderrs); in st_decode_sense()
11280 un->un_state >= ST_STATE_OPEN) && (DEBUGGING || in st_decode_sense()
11281 (un->un_laststate > ST_STATE_OPENING) && in st_decode_sense()
11285 pos->lgclblkno, un->un_err_pos.lgclblkno, in st_decode_sense()
11304 un->un_rqs_state |= (ST_RQS_ERROR | ST_RQS_VALID); in st_decode_sense()
11305 bcopy(ST_RQSENSE, un->un_uscsi_rqs_buf, SENSE_LENGTH); in st_decode_sense()
11306 if (un->un_rqs_state & ST_RQS_READ) { in st_decode_sense()
11307 un->un_rqs_state &= ~(ST_RQS_READ); in st_decode_sense()
11309 un->un_rqs_state |= ST_RQS_OVR; in st_decode_sense()
11318 st_handle_intr_retry_lcmd(struct scsi_tape *un, struct buf *bp) in st_handle_intr_retry_lcmd() argument
11328 "st_handle_intr_rtr_lcmd(), un = 0x%p\n", (void *)un); in st_handle_intr_retry_lcmd()
11339 ((un->un_runqf != bp) && (un->un_runql != bp))) { in st_handle_intr_retry_lcmd()
11343 if (un->un_throttle) { in st_handle_intr_retry_lcmd()
11344 un->un_last_throttle = un->un_throttle; in st_handle_intr_retry_lcmd()
11345 un->un_throttle = 0; in st_handle_intr_retry_lcmd()
11356 status = st_transport(un, BP_PKT(bp)); in st_handle_intr_retry_lcmd()
11359 if (un->un_last_throttle) { in st_handle_intr_retry_lcmd()
11360 un->un_throttle = un->un_last_throttle; in st_handle_intr_retry_lcmd()
11373 if (st_handle_intr_busy(un, bp, ST_TRAN_BUSY_TIMEOUT) == 0) { in st_handle_intr_retry_lcmd()
11380 ST_DO_ERRSTATS(un, st_transerrs); in st_handle_intr_retry_lcmd()
11381 if (un->un_last_throttle) { in st_handle_intr_retry_lcmd()
11382 un->un_throttle = un->un_last_throttle; in st_handle_intr_retry_lcmd()
11390 st_wrongtapetype(struct scsi_tape *un) in st_wrongtapetype() argument
11402 if (un->un_dp && (un->un_dp->options & ST_QIC) && un->un_mspl) { in st_wrongtapetype()
11403 switch (un->un_dp->type) { in st_wrongtapetype()
11422 if (un->un_status == KEY_WRITE_PROTECT && in st_wrongtapetype()
11423 un->un_mspl->wp == 0) { in st_wrongtapetype()
11435 st_check_error(struct scsi_tape *un, struct scsi_pkt *pkt) in st_check_error() argument
11456 (bp != un->un_recov_buf) && in st_check_error()
11457 (un->un_state > ST_STATE_OPEN_PENDING_IO) && in st_check_error()
11458 ((un->un_rsvd_status & (ST_RESERVE | in st_check_error()
11461 un->un_rsvd_status |= ST_LOST_RESERVE; in st_check_error()
11464 un->un_rsvd_status |= ST_RESERVATION_CONFLICT; in st_check_error()
11471 un->un_multipath && (pkt->pkt_state == (STATE_GOT_BUS | in st_check_error()
11490 } else if ((un->un_rsvd_status & in st_check_error()
11500 (void) st_reset(un, RESET_ALL); in st_check_error()
11512 if (un->un_arq_enabled && in st_check_error()
11521 action = st_decode_sense(un, bp, MAX_SENSE_LENGTH - in st_check_error()
11522 pkt->pkt_resid, stat, &un->un_pos); in st_check_error()
11547 st_calc_bnum(struct scsi_tape *un, struct buf *bp, struct scsi_pkt *pkt) in st_calc_bnum() argument
11574 ASSERT(un->un_pos.eof == ST_EOM); in st_calc_bnum()
11578 ASSERT(un->un_pos.eof == ST_EOF_PENDING); in st_calc_bnum()
11582 } else if (un->un_bsize == 0) { in st_calc_bnum()
11589 un->un_kbytes_xferred += (count / ONE_K); in st_calc_bnum()
11597 nblks = (count / un->un_bsize); in st_calc_bnum()
11598 un->un_kbytes_xferred += (nblks * un->un_bsize) / ONE_K; in st_calc_bnum()
11608 if (un->un_pos.eof == ST_EOF_PENDING && bp->b_resid) { in st_calc_bnum()
11620 if (un->un_persistence && un->un_persist_errors) { in st_calc_bnum()
11621 ASSERT(un->un_pos.pmode != invalid); in st_calc_bnum()
11625 un->un_pos.blkno += nblks; in st_calc_bnum()
11626 un->un_pos.lgclblkno += nblks; in st_calc_bnum()
11627 un->un_pos.lgclblkno += nfiles; in st_calc_bnum()
11629 un->un_pos.blkno -= nblks; in st_calc_bnum()
11630 un->un_pos.lgclblkno -= nblks; in st_calc_bnum()
11631 un->un_pos.lgclblkno -= nfiles; in st_calc_bnum()
11638 un->un_running.pmode = invalid; in st_calc_bnum()
11645 if (un->un_pos.eof != ST_EOF_PENDING) { in st_calc_bnum()
11652 ((un->un_pos.blkno != ri->pos.blkno) || in st_calc_bnum()
11653 (un->un_pos.lgclblkno != ri->pos.lgclblkno))) { in st_calc_bnum()
11658 "But Got", &un->un_pos); in st_calc_bnum()
11660 un->un_running.pmode = invalid; in st_calc_bnum()
11664 if (un->un_running.pmode != invalid) { in st_calc_bnum()
11671 un->un_running.fileno++; in st_calc_bnum()
11672 un->un_running.blkno = 0; in st_calc_bnum()
11674 un->un_running.fileno--; in st_calc_bnum()
11675 un->un_running.blkno = LASTBLK; in st_calc_bnum()
11682 st_set_state(struct scsi_tape *un, struct buf *bp) in st_set_state() argument
11690 ASSERT(bp != un->un_recov_buf); in st_set_state()
11694 un->un_pos.eof, un->un_fmneeded, sp->pkt_resid, sp->pkt_resid); in st_set_state()
11696 if (bp != un->un_sbufp) { in st_set_state()
11706 st_calc_bnum(un, bp, sp); in st_set_state()
11709 un->un_lastop = ST_OP_READ; in st_set_state()
11710 un->un_fmneeded = 0; in st_set_state()
11712 un->un_lastop = ST_OP_WRITE; in st_set_state()
11713 if (un->un_dp->options & ST_REEL) { in st_set_state()
11714 un->un_fmneeded = 2; in st_set_state()
11716 un->un_fmneeded = 1; in st_set_state()
11724 if (un->un_throttle) { in st_set_state()
11725 un->un_throttle = un->un_max_throttle; in st_set_state()
11739 st_calc_bnum(un, bp, sp); in st_set_state()
11740 if (un->un_dp->options & ST_REEL) { in st_set_state()
11741 un->un_fmneeded = 2; in st_set_state()
11743 un->un_fmneeded = 1; in st_set_state()
11750 un->un_lastop = ST_OP_READ; in st_set_state()
11754 st_calc_bnum(un, bp, sp); in st_set_state()
11755 un->un_fmneeded = 0; in st_set_state()
11762 if (un->un_pos.eof != ST_EOM) { in st_set_state()
11763 un->un_pos.eof = ST_NO_EOF; in st_set_state()
11767 un->un_lastop = new_lastop = ST_OP_WEOF; in st_set_state()
11768 un->un_pos.lgclblkno += fmdone; in st_set_state()
11769 un->un_pos.fileno += fmdone; in st_set_state()
11770 un->un_pos.blkno = 0; in st_set_state()
11776 if (fmdone > un->un_fmneeded) { in st_set_state()
11777 un->un_fmneeded = 0; in st_set_state()
11779 un->un_fmneeded -= fmdone; in st_set_state()
11784 un->un_pos.eof = ST_NO_EOF; in st_set_state()
11785 un->un_pos.fileno = 0; in st_set_state()
11786 un->un_pos.blkno = 0; in st_set_state()
11787 un->un_pos.lgclblkno = 0; in st_set_state()
11788 if (un->un_pos.pmode != legacy) in st_set_state()
11789 un->un_pos.pmode = legacy; in st_set_state()
11791 un->un_restore_pos = 0; in st_set_state()
11819 un->un_lastop = new_lastop = ST_OP_CTL; in st_set_state()
11835 un->un_pos.fileno, un->un_pos.blkno); in st_set_state()
11841 if (un->un_pos.eof <= ST_EOF) { in st_set_state()
11842 un->un_pos.eof = ST_NO_EOF; in st_set_state()
11844 un->un_pos.fileno += done; in st_set_state()
11845 un->un_pos.blkno = 0; in st_set_state()
11849 if (done > un->un_pos.fileno) { in st_set_state()
11850 un->un_pos.fileno = 0; in st_set_state()
11851 un->un_pos.blkno = 0; in st_set_state()
11853 un->un_pos.fileno -= done; in st_set_state()
11854 un->un_pos.blkno = LASTBLK; in st_set_state()
11855 un->un_running.pmode = invalid; in st_set_state()
11861 un->un_pos.blkno += done; in st_set_state()
11865 if (un->un_pos.eof >= ST_EOF_PENDING) { in st_set_state()
11874 if (done > un->un_pos.blkno) { in st_set_state()
11875 un->un_pos.blkno = 0; in st_set_state()
11877 un->un_pos.fileno--; in st_set_state()
11878 un->un_pos.blkno = LASTBLK; in st_set_state()
11879 un->un_running.pmode = invalid; in st_set_state()
11882 un->un_pos.blkno -= done; in st_set_state()
11886 un->un_pos.pmode = logical; in st_set_state()
11887 un->un_pos.blkno = 0; in st_set_state()
11888 un->un_lastop = new_lastop = ST_OP_CTL; in st_set_state()
11891 un->un_pos.pmode = logical; in st_set_state()
11892 un->un_pos.eof = ST_EOM; in st_set_state()
11893 un->un_status = KEY_BLANK_CHECK; in st_set_state()
11896 un->un_pos.pmode = invalid; in st_set_state()
11901 un->un_lastop = new_lastop = ST_OP_CTL; in st_set_state()
11906 resid, un->un_pos.fileno, un->un_pos.blkno); in st_set_state()
11912 un->un_pos.fileno = 0; in st_set_state()
11913 if (un->un_pos.pmode != legacy) in st_set_state()
11914 un->un_pos.pmode = legacy; in st_set_state()
11916 un->un_state = ST_STATE_OFFLINE; in st_set_state()
11917 un->un_pos.pmode = invalid; in st_set_state()
11924 if (un->un_media_id != bogusID && un->un_media_id_len) { in st_set_state()
11925 kmem_free(un->un_media_id, un->un_media_id_len); in st_set_state()
11926 un->un_media_id = NULL; in st_set_state()
11927 un->un_media_id_len = 0; in st_set_state()
11929 un->un_density_known = 0; in st_set_state()
11930 un->un_pos.eof = ST_NO_EOF; in st_set_state()
11931 un->un_pos.blkno = 0; in st_set_state()
11932 un->un_lastop = new_lastop = ST_OP_CTL; in st_set_state()
11935 un->un_pos.eof = ST_NO_EOF; in st_set_state()
11936 un->un_pos.blkno = 0; in st_set_state()
11937 un->un_pos.fileno = 0; in st_set_state()
11938 un->un_pos.lgclblkno = 0; in st_set_state()
11939 if (un->un_pos.pmode != legacy) in st_set_state()
11940 un->un_pos.pmode = legacy; in st_set_state()
11944 un->un_rsvd_status |= ST_RESERVE; in st_set_state()
11945 un->un_rsvd_status &= in st_set_state()
11951 un->un_rsvd_status |= ST_RELEASE; in st_set_state()
11952 un->un_rsvd_status &= in st_set_state()
11967 un->un_rsvd_status |= in st_set_state()
11969 un->un_rsvd_status &= ~(ST_RELEASE | in st_set_state()
11979 un->un_rsvd_status |= ST_INIT_RESERVE; in st_set_state()
11982 un->un_rsvd_status &= ~ST_INIT_RESERVE; in st_set_state()
11985 un->un_rsvd_status &= in st_set_state()
11989 un->un_rsvd_status |= ST_RELEASE; in st_set_state()
12026 (void) st_get_read_pos(un, bp); in st_set_state()
12032 un->un_lastop = new_lastop = ST_OP_CTL; in st_set_state()
12066 un->un_pos.pmode = invalid; in st_set_state()
12067 un->un_lastop = new_lastop = ST_OP_CTL; in st_set_state()
12075 if (((un->un_lastop == ST_OP_WRITE) || in st_set_state()
12076 (un->un_lastop == ST_OP_WEOF)) && in st_set_state()
12078 un->un_lastop = new_lastop; in st_set_state()
12095 un->un_err_resid = bp->b_resid; in st_set_state()
12096 COPY_POS(&un->un_err_pos, &un->un_pos); in st_set_state()
12110 if (un->un_lastop == ST_OP_READ && un->un_pos.eof == ST_EOF_PENDING) { in st_set_state()
12120 if ((un->un_dp->options & ST_REEL) && in st_set_state()
12121 !(un->un_dp->options & ST_READ_IGNORE_EOFS) && in st_set_state()
12122 un->un_pos.blkno == 0 && un->un_pos.fileno > 0) { in st_set_state()
12123 un->un_pos.eof = ST_EOT_PENDING; in st_set_state()
12126 un->un_pos.fileno++; in st_set_state()
12127 un->un_pos.blkno = 0; in st_set_state()
12136 un->un_pos.eof = ST_EOF; in st_set_state()
12139 un->un_pos.fileno++; in st_set_state()
12142 un->un_pos.blkno = 0; in st_set_state()
12144 un->un_pos.eof = ST_NO_EOF; in st_set_state()
12161 un->un_pos.eof = ST_EOF; in st_set_state()
12163 un->un_silent_skip = 1; in st_set_state()
12164 un->un_pos.eof = ST_NO_EOF; in st_set_state()
12165 un->un_pos.fileno++; in st_set_state()
12166 un->un_pos.lgclblkno++; in st_set_state()
12167 un->un_save_blkno = un->un_pos.blkno; in st_set_state()
12168 un->un_pos.blkno = 0; in st_set_state()
12172 un->un_pos.fileno, un->un_pos.eof); in st_set_state()
12183 un->un_pos.eof = ST_EOF; in st_set_state()
12187 un->un_pos.fileno, un->un_pos.eof); in st_set_state()
12196 st_set_pe_errno(struct scsi_tape *un) in st_set_pe_errno() argument
12203 if (un->un_errno) in st_set_pe_errno()
12216 if (un->un_last_resid == un->un_last_count) { in st_set_pe_errno()
12217 switch (un->un_pos.eof) { in st_set_pe_errno()
12219 un->un_errno = ENOMEM; in st_set_pe_errno()
12223 un->un_errno = EIO; in st_set_pe_errno()
12231 un->un_last_resid = un->un_last_count = 0; in st_set_pe_errno()
12241 st_hba_unflush(struct scsi_tape *un) in st_hba_unflush() argument
12247 if (!un->un_flush_on_errors) in st_hba_unflush()
12252 if (!un->un_mkr_pkt) { in st_hba_unflush()
12253 un->un_mkr_pkt = scsi_init_pkt(ROUTE, NULL, (struct buf *)NULL, in st_hba_unflush()
12260 st_transport(un, un->un_mkr_pkt); in st_hba_unflush()
12284 struct scsi_tape *un; in st_print_cdb() local
12287 un = ddi_get_soft_state(st_state, instance); in st_print_cdb()
12294 st_dev_name(un->un_dev), st_print_scsi_cmd(*cdb)); in st_print_cdb()
12349 st_debug_cmds(struct scsi_tape *un, int com, int count, int wait) in st_debug_cmds() argument
12369 struct scsi_tape *un; in st_dev_name() local
12378 un = ddi_get_soft_state(st_state, instance); in st_dev_name()
12379 if (un) { in st_dev_name()
12441 com->uscsi_timeout = un->un_dp->non_motion_timeout; in st_report_exabyte_soft_errors()
12443 rval = st_uscsi_cmd(un, com, FKIOCTL); in st_report_exabyte_soft_errors()
12453 if ((amt >= 19) && un->un_kbytes_xferred) { in st_report_exabyte_soft_errors()
12461 if (un->un_kbytes_xferred < (EXABYTE_MIN_TRANSFER/ONE_K)) { in st_report_exabyte_soft_errors()
12469 error_rate = (count * 100)/un->un_kbytes_xferred; in st_report_exabyte_soft_errors()
12479 un->un_kbytes_xferred); in st_report_exabyte_soft_errors()
12571 com->uscsi_timeout = un->un_dp->non_motion_timeout; in st_report_dat_soft_errors()
12572 rval = st_uscsi_cmd(un, com, FKIOCTL); in st_report_dat_soft_errors()
12586 if ((amt >= MIN_LOG_SENSE_LENGTH) && un->un_kbytes_xferred) { in st_report_dat_soft_errors()
12702 rval = st_uscsi_cmd(un, com, FKIOCTL); in st_report_dat_soft_errors()
12725 switch (un->un_dp->type) { in st_report_soft_errors()
12734 un->un_dp->options &= ~ST_SOFT_ERROR_REPORTING; in st_report_soft_errors()
12748 st_turn_pe_on(struct scsi_tape *un) in st_turn_pe_on() argument
12755 un->un_persistence = 1; in st_turn_pe_on()
12762 if (un->un_arq_enabled && un->un_untagged_qing) { in st_turn_pe_on()
12770 un->un_flush_on_errors = f_o_e; in st_turn_pe_on()
12772 un->un_flush_on_errors = 0; in st_turn_pe_on()
12775 if (un->un_flush_on_errors) in st_turn_pe_on()
12776 un->un_max_throttle = (uchar_t)st_max_throttle; in st_turn_pe_on()
12778 un->un_max_throttle = 1; in st_turn_pe_on()
12780 if (un->un_dp->options & ST_RETRY_ON_RECOVERED_DEFERRED_ERROR) in st_turn_pe_on()
12781 un->un_max_throttle = 1; in st_turn_pe_on()
12784 st_clear_pe(un); in st_turn_pe_on()
12791 st_turn_pe_off(struct scsi_tape *un) in st_turn_pe_off() argument
12798 un->un_persistence = 0; in st_turn_pe_off()
12801 st_clear_pe(un); in st_turn_pe_off()
12804 if (un->un_flush_on_errors) { in st_turn_pe_off()
12811 un->un_flush_on_errors = 0; in st_turn_pe_off()
12819 st_clear_pe(struct scsi_tape *un) in st_clear_pe() argument
12825 un->un_persist_errors = 0; in st_clear_pe()
12826 un->un_throttle = un->un_last_throttle = 1; in st_clear_pe()
12827 un->un_errno = 0; in st_clear_pe()
12828 st_hba_unflush(un); in st_clear_pe()
12836 st_set_pe_flag(struct scsi_tape *un) in st_set_pe_flag() argument
12841 if (un->un_persistence) { in st_set_pe_flag()
12843 un->un_persist_errors = 1; in st_set_pe_flag()
12844 un->un_throttle = un->un_last_throttle = 0; in st_set_pe_flag()
12845 cv_broadcast(&un->un_sbuf_cv); in st_set_pe_flag()
12850 st_do_reserve(struct scsi_tape *un) in st_do_reserve() argument
12853 int was_lost = un->un_rsvd_status & ST_LOST_RESERVE; in st_do_reserve()
12871 rval = st_reserve_release(un, ST_RESERVE, st_uscsi_cmd); in st_do_reserve()
12873 if ((un->un_rsvd_status & ST_LOST_RESERVE_BETWEEN_OPENS) == in st_do_reserve()
12875 un->un_rsvd_status &= ~(ST_LOST_RESERVE | ST_RESERVE); in st_do_reserve()
12876 un->un_errno = EACCES; in st_do_reserve()
12879 rval = st_reserve_release(un, ST_RESERVE, st_uscsi_cmd); in st_do_reserve()
12882 un->un_rsvd_status |= ST_INIT_RESERVE; in st_do_reserve()
12885 un->un_running.pmode = invalid; in st_do_reserve()
12892 st_check_cdb_for_need_to_reserve(struct scsi_tape *un, uchar_t *cdb) in st_check_cdb_for_need_to_reserve() argument
12903 if ((un->un_rsvd_status & (ST_APPLICATION_RESERVATIONS)) || in st_check_cdb_for_need_to_reserve()
12904 ((un->un_rsvd_status & (ST_RESERVE | ST_LOST_RESERVE)) == in st_check_cdb_for_need_to_reserve()
12905 ST_RESERVE) || (un->un_dp->options & ST_NO_RESERVE_RELEASE)) { in st_check_cdb_for_need_to_reserve()
12937 rval = st_do_reserve(un); in st_check_cdb_for_need_to_reserve()
12944 st_check_cmd_for_need_to_reserve(struct scsi_tape *un, uchar_t cmd, int cnt) in st_check_cmd_for_need_to_reserve() argument
12955 if ((un->un_rsvd_status & (ST_APPLICATION_RESERVATIONS)) || in st_check_cmd_for_need_to_reserve()
12956 ((un->un_rsvd_status & (ST_RESERVE | ST_LOST_RESERVE)) == in st_check_cmd_for_need_to_reserve()
12957 ST_RESERVE) || (un->un_dp->options & ST_NO_RESERVE_RELEASE) || in st_check_cmd_for_need_to_reserve()
12958 ((un->un_state == ST_STATE_CLOSING) && (cmd == SCMD_REWIND))) { in st_check_cmd_for_need_to_reserve()
12988 rval = st_do_reserve(un); in st_check_cmd_for_need_to_reserve()
12995 st_reserve_release(struct scsi_tape *un, int cmd, ubufunc_t ubf) in st_reserve_release() argument
13022 uscsi_cmd.uscsi_timeout = un->un_dp->non_motion_timeout; in st_reserve_release()
13026 rval = ubf(un, &uscsi_cmd, FKIOCTL); in st_reserve_release()
13040 if (un->un_status == KEY_ILLEGAL_REQUEST) { in st_reserve_release()
13041 if ((un->un_dp->options & ST_NO_RESERVE_RELEASE) == 0) { in st_reserve_release()
13042 un->un_dp->options |= ST_NO_RESERVE_RELEASE; in st_reserve_release()
13054 st_take_ownership(struct scsi_tape *un, ubufunc_t ubf) in st_take_ownership() argument
13066 rval = st_reserve_release(un, ST_RESERVE, ubf); in st_take_ownership()
13072 if (st_reset(un, RESET_LUN) == 0) { in st_take_ownership()
13075 un->un_rsvd_status &= in st_take_ownership()
13084 (void) st_reserve_release(un, ST_RESERVE, ubf); in st_take_ownership()
13085 rval = st_reserve_release(un, ST_RESERVE, ubf); in st_take_ownership()
13087 if ((st_reserve_release(un, ST_RESERVE, ubf)) in st_take_ownership()
13089 rval = (un->un_rsvd_status & in st_take_ownership()
13099 un->un_state = ST_STATE_OFFLINE; in st_take_ownership()
13100 un->un_rsvd_status |= ST_INIT_RESERVE; in st_take_ownership()
13106 st_create_errstats(struct scsi_tape *un, int instance) in st_create_errstats() argument
13116 if (un->un_errstats == (kstat_t *)0) { in st_create_errstats()
13118 un->un_errstats = kstat_create("sterr", instance, kstatname, in st_create_errstats()
13123 if (un->un_errstats) { in st_create_errstats()
13126 stp = (struct st_errstats *)un->un_errstats->ks_data; in st_create_errstats()
13141 un->un_errstats->ks_private = un; in st_create_errstats()
13142 un->un_errstats->ks_update = nulldev; in st_create_errstats()
13143 kstat_install(un->un_errstats); in st_create_errstats()
13165 st_validate_tapemarks(struct scsi_tape *un, ubufunc_t ubf, tapepos_t *pos) in st_validate_tapemarks() argument
13172 ASSERT(MUTEX_HELD(&un->un_sd->sd_mutex)); in st_validate_tapemarks()
13189 if (pos->pmode == logical || un->un_read_pos_type != NO_POS) { in st_validate_tapemarks()
13199 if (st_logical_block_locate(un, st_uscsi_cmd, &un->un_pos, in st_validate_tapemarks()
13202 if (un->un_pos.lgclblkno == pos->lgclblkno) { in st_validate_tapemarks()
13203 COPY_POS(&un->un_pos, pos); in st_validate_tapemarks()
13227 rval = bf(un, SCMD_REWIND, 0, SYNC_CMD); in st_validate_tapemarks()
13232 un->un_pos.pmode = invalid; in st_validate_tapemarks()
13246 rval = st_cmd(un, SCMD_SPACE, Fmk(pos->fileno), SYNC_CMD); in st_validate_tapemarks()
13252 un->un_pos.pmode = invalid; in st_validate_tapemarks()
13265 rval = bf(un, SCMD_SPACE, Fmk(-1), SYNC_CMD); in st_validate_tapemarks()
13271 un->un_pos.pmode = invalid; in st_validate_tapemarks()
13281 un->un_pos.eof = pos->eof; in st_validate_tapemarks()
13282 un->un_pos.lgclblkno = pos->lgclblkno; in st_validate_tapemarks()
13293 st_check_asc_ascq(struct scsi_tape *un) in st_check_asc_ascq() argument
13320 st_logpage_supported(struct scsi_tape *un, uchar_t page) in st_logpage_supported() argument
13355 com->uscsi_timeout = un->un_dp->non_motion_timeout; in st_logpage_supported()
13356 rval = st_uscsi_cmd(un, com, FKIOCTL); in st_logpage_supported()
13397 st_check_clean_bit(struct scsi_tape *un) in st_check_clean_bit() argument
13405 if (un->un_HeadClean & TAPE_ALERT_NOT_SUPPORTED) { in st_check_clean_bit()
13409 if (un->un_HeadClean == TAPE_ALERT_SUPPORT_UNKNOWN) { in st_check_clean_bit()
13411 rval = st_logpage_supported(un, TAPE_SEQUENTIAL_PAGE); in st_check_clean_bit()
13417 un->un_HeadClean |= TAPE_SEQUENTIAL_SUPPORTED; in st_check_clean_bit()
13420 rval = st_logpage_supported(un, TAPE_ALERT_PAGE); in st_check_clean_bit()
13426 un->un_HeadClean |= TAPE_ALERT_SUPPORTED; in st_check_clean_bit()
13429 if (un->un_HeadClean == TAPE_ALERT_SUPPORT_UNKNOWN) { in st_check_clean_bit()
13431 un->un_HeadClean = TAPE_ALERT_NOT_SUPPORTED; in st_check_clean_bit()
13437 if (un->un_HeadClean & TAPE_SEQUENTIAL_SUPPORTED) { in st_check_clean_bit()
13439 rval = st_check_sequential_clean_bit(un); in st_check_clean_bit()
13445 if ((rval == 0) && (un->un_HeadClean & TAPE_ALERT_SUPPORTED)) { in st_check_clean_bit()
13447 rval = st_check_alert_flags(un); in st_check_clean_bit()
13453 if ((rval == 0) && (un->un_dp->options & ST_CLN_MASK)) { in st_check_clean_bit()
13455 rval = st_check_sense_clean_bit(un); in st_check_clean_bit()
13475 if ((un->un_HeadClean & TAPE_PREVIOUSLY_DIRTY) == 0) { in st_check_clean_bit()
13480 un->un_HeadClean |= TAPE_PREVIOUSLY_DIRTY; in st_check_clean_bit()
13485 un->un_HeadClean &= ~TAPE_PREVIOUSLY_DIRTY; in st_check_clean_bit()
13494 st_check_sequential_clean_bit(struct scsi_tape *un) in st_check_sequential_clean_bit() argument
13523 cmd->uscsi_timeout = un->un_dp->non_motion_timeout; in st_check_sequential_clean_bit()
13531 rval = st_uscsi_cmd(un, cmd, FKIOCTL); in st_check_sequential_clean_bit()
13575 st_check_alert_flags(struct scsi_tape *un) in st_check_alert_flags() argument
13609 com->uscsi_timeout = un->un_dp->non_motion_timeout; in st_check_alert_flags()
13611 rval = st_uscsi_cmd(un, com, FKIOCTL); in st_check_alert_flags()
13657 (un->un_dp->type == ST_TYPE_STK9840))) { in st_check_alert_flags()
13664 un->un_HeadClean |= TAPE_ALERT_STILL_DIRTY; in st_check_alert_flags()
13671 un->un_HeadClean &= ~TAPE_ALERT_STILL_DIRTY; in st_check_alert_flags()
13679 if (un->un_HeadClean & TAPE_ALERT_STILL_DIRTY) { in st_check_alert_flags()
13694 st_check_sense_clean_bit(struct scsi_tape *un) in st_check_sense_clean_bit() argument
13713 if ((un->un_dp->options & ST_CLN_MASK) == ST_CLN_TYPE_1) { in st_check_sense_clean_bit()
13717 } else if ((un->un_dp->options & ST_CLN_MASK) == ST_CLN_TYPE_2) { in st_check_sense_clean_bit()
13721 } else if ((un->un_dp->options & ST_CLN_MASK) == ST_CLN_TYPE_3) { in st_check_sense_clean_bit()
13750 com->uscsi_timeout = un->un_dp->non_motion_timeout; in st_check_sense_clean_bit()
13752 rval = st_uscsi_cmd(un, com, FKIOCTL); in st_check_sense_clean_bit()
13791 rval = st_cmd(un, SCMD_TEST_UNIT_READY, 0, SYNC_CMD); in st_clear_unit_attentions()
13797 st_calculate_timeouts(struct scsi_tape *un) in st_calculate_timeouts() argument
13801 if (un->un_dp->non_motion_timeout == 0) { in st_calculate_timeouts()
13802 if (un->un_dp->options & ST_LONG_TIMEOUTS) { in st_calculate_timeouts()
13803 un->un_dp->non_motion_timeout = in st_calculate_timeouts()
13806 un->un_dp->non_motion_timeout = (ushort_t)st_io_time; in st_calculate_timeouts()
13810 if (un->un_dp->io_timeout == 0) { in st_calculate_timeouts()
13811 if (un->un_dp->options & ST_LONG_TIMEOUTS) { in st_calculate_timeouts()
13812 un->un_dp->io_timeout = st_io_time * st_long_timeout_x; in st_calculate_timeouts()
13814 un->un_dp->io_timeout = (ushort_t)st_io_time; in st_calculate_timeouts()
13818 if (un->un_dp->rewind_timeout == 0) { in st_calculate_timeouts()
13819 if (un->un_dp->options & ST_LONG_TIMEOUTS) { in st_calculate_timeouts()
13820 un->un_dp->rewind_timeout = in st_calculate_timeouts()
13823 un->un_dp->rewind_timeout = (ushort_t)st_space_time; in st_calculate_timeouts()
13827 if (un->un_dp->space_timeout == 0) { in st_calculate_timeouts()
13828 if (un->un_dp->options & ST_LONG_TIMEOUTS) { in st_calculate_timeouts()
13829 un->un_dp->space_timeout = in st_calculate_timeouts()
13832 un->un_dp->space_timeout = (ushort_t)st_space_time; in st_calculate_timeouts()
13836 if (un->un_dp->load_timeout == 0) { in st_calculate_timeouts()
13837 if (un->un_dp->options & ST_LONG_TIMEOUTS) { in st_calculate_timeouts()
13838 un->un_dp->load_timeout = in st_calculate_timeouts()
13841 un->un_dp->load_timeout = (ushort_t)st_space_time; in st_calculate_timeouts()
13845 if (un->un_dp->unload_timeout == 0) { in st_calculate_timeouts()
13846 if (un->un_dp->options & ST_LONG_TIMEOUTS) { in st_calculate_timeouts()
13847 un->un_dp->unload_timeout = in st_calculate_timeouts()
13850 un->un_dp->unload_timeout = (ushort_t)st_space_time; in st_calculate_timeouts()
13854 if (un->un_dp->erase_timeout == 0) { in st_calculate_timeouts()
13855 if (un->un_dp->options & ST_LONG_ERASE) { in st_calculate_timeouts()
13856 un->un_dp->erase_timeout = in st_calculate_timeouts()
13859 un->un_dp->erase_timeout = (ushort_t)st_space_time; in st_calculate_timeouts()
13866 st_is_not_wormable(struct scsi_tape *un) in st_is_not_wormable() argument
13873 st_is_hp_dat_tape_worm(struct scsi_tape *un) in st_is_hp_dat_tape_worm() argument
13880 if (un->un_mspl->media_type == 1) { in st_is_hp_dat_tape_worm()
13894 st_is_hp_dat_worm(struct scsi_tape *un) in st_is_hp_dat_worm() argument
13904 result = st_get_special_inquiry(un, HP_DAT_INQUIRY, buf, 0); in st_is_hp_dat_worm()
13914 un->un_dp->options &= ~ST_WORMABLE; in st_is_hp_dat_worm()
13916 un->un_wormable = st_is_not_wormable; in st_is_hp_dat_worm()
13920 un->un_wormable = st_is_hp_dat_tape_worm; in st_is_hp_dat_worm()
13921 wrt = un->un_wormable(un); in st_is_hp_dat_worm()
13933 st_is_hp_lto_tape_worm(struct scsi_tape *un) in st_is_hp_lto_tape_worm() argument
13940 switch (un->un_mspl->media_type) { in st_is_hp_lto_tape_worm()
13942 switch (un->un_mspl->density) { in st_is_hp_lto_tape_worm()
13962 un->un_mspl->density); in st_is_hp_lto_tape_worm()
13979 un->un_mspl->media_type); in st_is_hp_lto_tape_worm()
13988 st_is_hp_lto_worm(struct scsi_tape *un) in st_is_hp_lto_worm() argument
13998 result = st_get_special_inquiry(un, LTO_REQ_INQUIRY, buf, 0); in st_is_hp_lto_worm()
14008 un->un_dp->options &= ~ST_WORMABLE; in st_is_hp_lto_worm()
14010 un->un_wormable = st_is_not_wormable; in st_is_hp_lto_worm()
14014 un->un_wormable = st_is_hp_lto_tape_worm; in st_is_hp_lto_worm()
14015 wrt = un->un_wormable(un); in st_is_hp_lto_worm()
14027 st_is_t10_worm_device(struct scsi_tape *un) in st_is_t10_worm_device() argument
14033 if (un->un_mspl->media_type == 0x3c) { in st_is_t10_worm_device()
14047 st_is_t10_worm(struct scsi_tape *un) in st_is_t10_worm() argument
14057 result = st_get_special_inquiry(un, 6, buf, SEQ_CAP_PAGE); in st_is_t10_worm()
14069 un->un_dp->options &= ~ST_WORMABLE; in st_is_t10_worm()
14071 un->un_wormable = st_is_not_wormable; in st_is_t10_worm()
14075 un->un_wormable = st_is_t10_worm_device; in st_is_t10_worm()
14076 wrt = un->un_wormable(un); in st_is_t10_worm()
14088 st_is_stk_worm(struct scsi_tape *un) in st_is_stk_worm() argument
14104 cmd->uscsi_timeout = un->un_dp->non_motion_timeout; in st_is_stk_worm()
14112 result = st_uscsi_cmd(un, cmd, FKIOCTL); in st_is_stk_worm()
14123 un->un_wormable = st_is_not_wormable; in st_is_stk_worm()
14128 un->un_wormable = st_is_stk_worm; in st_is_stk_worm()
14133 un->un_wormable = st_is_stk_worm; in st_is_stk_worm()
14144 st_is_dlt_tape_worm(struct scsi_tape *un) in st_is_dlt_tape_worm() argument
14156 result = st_read_attributes(un, 0x0408, buf, 10, st_uscsi_cmd); in st_is_dlt_tape_worm()
14163 if (result == EINVAL && un->un_max_cdb_sz < CDB_GROUP4) { in st_is_dlt_tape_worm()
14168 un->un_wormable = st_is_not_wormable; in st_is_dlt_tape_worm()
14177 un->un_dp->options &= ~ST_WORMABLE; in st_is_dlt_tape_worm()
14197 st_is_dlt_worm(struct scsi_tape *un) in st_is_dlt_worm() argument
14207 result = st_get_special_inquiry(un, DLT_INQ_SZ, buf, 0xC0); in st_is_dlt_worm()
14220 un->un_dp->options &= ~ST_WORMABLE; in st_is_dlt_worm()
14221 un->un_wormable = st_is_not_wormable; in st_is_dlt_worm()
14226 un->un_wormable = st_is_dlt_tape_worm; in st_is_dlt_worm()
14227 wrt = un->un_wormable(un); in st_is_dlt_worm()
14279 st_is_sony_worm(struct scsi_tape *un) in st_is_sony_worm() argument
14289 result = st_gen_mode_sense(un, st_uscsi_cmd, AIT_DEV_PAGE, in st_is_sony_worm()
14299 un->un_wormable = st_is_not_wormable; in st_is_sony_worm()
14303 un->un_wormable = st_is_sony_worm; in st_is_sony_worm()
14322 un->un_dp->options &= ~ST_WORMABLE; in st_is_sony_worm()
14331 un->un_wormable = st_is_not_wormable; in st_is_sony_worm()
14339 st_is_drive_worm(struct scsi_tape *un) in st_is_drive_worm() argument
14345 switch (un->un_dp->type) { in st_is_drive_worm()
14347 wrt = st_is_dlt_worm(un); in st_is_drive_worm()
14351 wrt = st_is_stk_worm(un); in st_is_drive_worm()
14356 wrt = st_is_sony_worm(un); in st_is_drive_worm()
14360 if (strncmp("HP ", un->un_dp->vid, 3) == 0) { in st_is_drive_worm()
14361 wrt = st_is_hp_lto_worm(un); in st_is_drive_worm()
14363 wrt = st_is_t10_worm(un); in st_is_drive_worm()
14368 if (strncmp("HP ", un->un_dp->vid, 3) == 0) { in st_is_drive_worm()
14369 wrt = st_is_hp_dat_worm(un); in st_is_drive_worm()
14371 wrt = st_is_t10_worm(un); in st_is_drive_worm()
14384 wrt = st_is_t10_worm(un); in st_is_drive_worm()
14394 un->un_dp->options &= ~ST_WORMABLE; in st_is_drive_worm()
14401 st_read_attributes(struct scsi_tape *un, uint16_t attribute, void *pnt, in st_read_attributes() argument
14413 if (un->un_sd->sd_inq->inq_ansi < 3) { in st_read_attributes()
14438 cmd->uscsi_timeout = un->un_dp->non_motion_timeout; in st_read_attributes()
14446 result = bufunc(un, cmd, FKIOCTL); in st_read_attributes()
14455 if (un->un_sd->sd_sense->es_key == KEY_ILLEGAL_REQUEST && in st_read_attributes()
14456 un->un_sd->sd_sense->es_add_code == 0x20) { in st_read_attributes()
14483 st_get_special_inquiry(struct scsi_tape *un, uchar_t size, caddr_t dest, in st_get_special_inquiry() argument
14504 cmd->uscsi_timeout = un->un_dp->non_motion_timeout; in st_get_special_inquiry()
14512 result = st_uscsi_cmd(un, cmd, FKIOCTL); in st_get_special_inquiry()
14530 st_update_block_pos(struct scsi_tape *un, bufunc_t bf, int post_space) in st_update_block_pos() argument
14533 uchar_t status = un->un_status; in st_update_block_pos()
14534 posmode previous_pmode = un->un_running.pmode; in st_update_block_pos()
14538 while (un->un_read_pos_type != NO_POS) { in st_update_block_pos()
14539 rval = bf(un, SCMD_READ_POSITION, 32, SYNC_CMD); in st_update_block_pos()
14546 ((rval = st_interpret_read_pos(un, &un->un_pos, in st_update_block_pos()
14547 un->un_read_pos_type, 32, (caddr_t)un->un_read_pos_data, in st_update_block_pos()
14556 rval = st_interpret_read_pos(un, &un->un_running, in st_update_block_pos()
14557 un->un_read_pos_type, 32, in st_update_block_pos()
14558 (caddr_t)un->un_read_pos_data, post_space); in st_update_block_pos()
14559 un->un_status = status; in st_update_block_pos()
14561 } else if (un->un_status == KEY_UNIT_ATTENTION) { in st_update_block_pos()
14562 un->un_running.pmode = previous_pmode; in st_update_block_pos()
14564 } else if (un->un_status != KEY_ILLEGAL_REQUEST) { in st_update_block_pos()
14568 un->un_read_pos_type, rval, un->un_status); in st_update_block_pos()
14578 " returned %x", un->un_read_pos_type, rval); in st_update_block_pos()
14579 un->un_running.pmode = previous_pmode; in st_update_block_pos()
14582 switch (un->un_read_pos_type) { in st_update_block_pos()
14584 un->un_read_pos_type = NO_POS; in st_update_block_pos()
14588 un->un_read_pos_type = EXT_POS; in st_update_block_pos()
14592 un->un_read_pos_type = SHORT_POS; in st_update_block_pos()
14598 un->un_read_pos_type); in st_update_block_pos()
14600 un->un_status = KEY_NO_SENSE; in st_update_block_pos()
14607 st_get_read_pos(struct scsi_tape *un, buf_t *bp) in st_get_read_pos() argument
14654 result = st_interpret_read_pos(un, &un->un_pos, cmd->uscsi_cdb[1], in st_get_read_pos()
14657 COPY_POS(&un->un_running, &un->un_pos); in st_get_read_pos()
14729 st_interpret_read_pos(struct scsi_tape const *un, tapepos_t *dest, in st_interpret_read_pos() argument
14742 if ((dest != &un->un_pos) && (post_space == 0) && in st_interpret_read_pos()
15107 st_logical_block_locate(struct scsi_tape *un, ubufunc_t ubf, tapepos_t *pos, in st_logical_block_locate() argument
15141 if (un->un_read_pos_type != LONG_POS) { in st_logical_block_locate()
15168 cmd->uscsi_timeout = un->un_dp->space_timeout; in st_logical_block_locate()
15171 rval = ubf(un, cmd, FKIOCTL); in st_logical_block_locate()
15183 if (un->un_status == KEY_ILLEGAL_REQUEST) { in st_logical_block_locate()
15187 un->un_status = 0; in st_logical_block_locate()
15189 } else if ((un->un_pos.pmode == invalid) || (rval != 0)) { in st_logical_block_locate()
15194 un->un_status = 0; in st_logical_block_locate()
15196 } else if (st_update_block_pos(un, bf, 1)) { in st_logical_block_locate()
15201 } else if (lblk > un->un_pos.lgclblkno) { in st_logical_block_locate()
15205 PRIx64"\n", un->un_pos.lgclblkno); in st_logical_block_locate()
15206 un->un_err_resid = lblk - un->un_pos.lgclblkno; in st_logical_block_locate()
15207 un->un_status = KEY_BLANK_CHECK; in st_logical_block_locate()
15209 } else if (lblk == un->un_pos.lgclblkno) { in st_logical_block_locate()
15213 un->un_err_resid = 0; in st_logical_block_locate()
15218 un->un_err_resid = lblk; in st_logical_block_locate()
15230 un->un_err_resid = cmd->uscsi_resid; in st_logical_block_locate()
15231 un->un_status = KEY_BLANK_CHECK; in st_logical_block_locate()
15234 } else if (st_update_block_pos(un, bf, 1) == 0) { in st_logical_block_locate()
15236 un->un_err_resid = lblk - pos->lgclblkno; in st_logical_block_locate()
15237 un->un_status = KEY_BLANK_CHECK; in st_logical_block_locate()
15244 un->un_err_resid = lblk; in st_logical_block_locate()
15245 un->un_status = KEY_ILLEGAL_REQUEST; in st_logical_block_locate()
15256 st_mtfsf_ioctl(struct scsi_tape *un, int64_t files) in st_mtfsf_ioctl() argument
15264 "st_mtfsf_ioctl: count=%"PRIx64", eof=%x\n", files, un->un_pos.eof); in st_mtfsf_ioctl()
15266 if ((IN_EOF(un->un_pos)) && (files == 1)) { in st_mtfsf_ioctl()
15267 un->un_pos.fileno++; in st_mtfsf_ioctl()
15268 un->un_pos.blkno = 0; in st_mtfsf_ioctl()
15273 if (un->un_pos.pmode == legacy) { in st_mtfsf_ioctl()
15282 if ((un->un_pos.eof >= ST_EOT) && in st_mtfsf_ioctl()
15284 ((un->un_dp->options & ST_REEL) == 0)) { in st_mtfsf_ioctl()
15286 un->un_err_resid = files; in st_mtfsf_ioctl()
15287 un->un_status = KEY_BLANK_CHECK; in st_mtfsf_ioctl()
15297 if (IN_EOF(un->un_pos)) { in st_mtfsf_ioctl()
15298 un->un_pos.fileno++; in st_mtfsf_ioctl()
15299 un->un_pos.blkno = 0; in st_mtfsf_ioctl()
15310 if (st_check_density_or_wfm(un->un_dev, 1, B_READ, STEPBACK)) { in st_mtfsf_ioctl()
15323 rval = st_backward_space_files(un, -files, 0); in st_mtfsf_ioctl()
15325 rval = st_forward_space_files(un, files); in st_mtfsf_ioctl()
15332 st_forward_space_files(struct scsi_tape *un, int64_t count) in st_forward_space_files() argument
15339 "fspace: count=%"PRIx64", eof=%x\n", count, un->un_pos.eof); in st_forward_space_files()
15342 ASSERT(un->un_pos.pmode != invalid); in st_forward_space_files()
15350 if (un->un_pos.pmode == legacy && un->un_pos.blkno == 0) { in st_forward_space_files()
15351 un->un_err_resid = 0; in st_forward_space_files()
15352 COPY_POS(&un->un_err_pos, &un->un_pos); in st_forward_space_files()
15360 if (un->un_pos.pmode == legacy && un->un_pos.fileno == 0) { in st_forward_space_files()
15361 rval = st_cmd(un, SCMD_REWIND, 0, SYNC_CMD); in st_forward_space_files()
15367 } else if (un->un_dp->options & ST_BSF) { in st_forward_space_files()
15368 rval = st_space_to_begining_of_file(un); in st_forward_space_files()
15374 } else if (un->un_pos.pmode == legacy) { in st_forward_space_files()
15375 rval = st_scenic_route_to_begining_of_file(un, in st_forward_space_files()
15376 un->un_pos.fileno); in st_forward_space_files()
15383 } else if (un->un_read_pos_type == LONG_POS) { in st_forward_space_files()
15384 rval = st_cmd(un, SCMD_READ_POSITION, 0, SYNC_CMD); in st_forward_space_files()
15392 rval = st_space_to_begining_of_file(un); in st_forward_space_files()
15394 rval = st_interpret_read_pos(un, &un->un_pos, LONG_POS, in st_forward_space_files()
15395 32, (caddr_t)un->un_read_pos_data, 0); in st_forward_space_files()
15396 if ((rval) && (un->un_pos.pmode == invalid)) { in st_forward_space_files()
15397 rval = st_space_to_begining_of_file(un); in st_forward_space_files()
15399 rval = st_scenic_route_to_begining_of_file(un, in st_forward_space_files()
15400 un->un_pos.fileno); in st_forward_space_files()
15409 un->un_pos.pmode = invalid; in st_forward_space_files()
15417 rval = st_space_fmks(un, count); in st_forward_space_files()
15425 rval = st_backward_space_files(un, 1, 1); in st_forward_space_files()
15432 st_scenic_route_to_begining_of_file(struct scsi_tape *un, int32_t fileno) in st_scenic_route_to_begining_of_file() argument
15438 if (st_cmd(un, SCMD_REWIND, 0, SYNC_CMD)) { in st_scenic_route_to_begining_of_file()
15440 } else if (st_cmd(un, SCMD_SPACE, Fmk(fileno), SYNC_CMD)) { in st_scenic_route_to_begining_of_file()
15448 st_space_to_begining_of_file(struct scsi_tape *un) in st_space_to_begining_of_file() argument
15457 rval = st_cmd(un, SCMD_SPACE, Fmk(-1), SYNC_CMD); in st_space_to_begining_of_file()
15466 if (un->un_status == SUN_KEY_BOT) { in st_space_to_begining_of_file()
15470 un->un_running.pmode = invalid; in st_space_to_begining_of_file()
15476 rval = st_cmd(un, SCMD_SPACE, Fmk(1), SYNC_CMD); in st_space_to_begining_of_file()
15485 st_mtfsr_ioctl(struct scsi_tape *un, int64_t count) in st_mtfsr_ioctl() argument
15496 "st_ioctl_fsr: count=%"PRIx64", eof=%x\n", count, un->un_pos.eof); in st_mtfsr_ioctl()
15498 if (un->un_pos.pmode == legacy) { in st_mtfsr_ioctl()
15503 if ((un->un_pos.eof >= ST_EOT) && (count > 0)) { in st_mtfsr_ioctl()
15505 un->un_err_resid = count; in st_mtfsr_ioctl()
15506 un->un_status = KEY_BLANK_CHECK; in st_mtfsr_ioctl()
15516 un->un_err_pos.fileno = un->un_pos.fileno; in st_mtfsr_ioctl()
15517 un->un_err_pos.blkno = un->un_pos.blkno; in st_mtfsr_ioctl()
15518 un->un_err_resid = 0; in st_mtfsr_ioctl()
15519 if (IN_EOF(un->un_pos) && SVR4_BEHAVIOR) { in st_mtfsr_ioctl()
15520 un->un_status = SUN_KEY_EOF; in st_mtfsr_ioctl()
15529 if (IN_EOF(un->un_pos)) { in st_mtfsr_ioctl()
15530 daddr_t blkno = un->un_pos.blkno; in st_mtfsr_ioctl()
15531 int fileno = un->un_pos.fileno; in st_mtfsr_ioctl()
15533 optype lastop = un->un_lastop; in st_mtfsr_ioctl()
15534 if (st_cmd(un, SCMD_SPACE, Fmk(-1), SYNC_CMD) in st_mtfsr_ioctl()
15541 un->un_pos.blkno = blkno; in st_mtfsr_ioctl()
15542 un->un_pos.fileno = fileno; in st_mtfsr_ioctl()
15543 un->un_lastop = lastop; in st_mtfsr_ioctl()
15547 if (st_check_density_or_wfm(un->un_dev, 1, B_READ, STEPBACK)) { in st_mtfsr_ioctl()
15553 return (st_space_records(un, count)); in st_mtfsr_ioctl()
15557 st_space_records(struct scsi_tape *un, int64_t count) in st_space_records() argument
15566 count, un->un_pos.eof); in st_space_records()
15568 if (un->un_pos.pmode == logical) { in st_space_records()
15569 rval = st_cmd(un, SCMD_SPACE, Blk(count), SYNC_CMD); in st_space_records()
15576 dblk = count + un->un_pos.blkno; in st_space_records()
15579 if (dblk == un->un_pos.blkno) { in st_space_records()
15580 un->un_err_resid = 0; in st_space_records()
15581 COPY_POS(&un->un_err_pos, &un->un_pos); in st_space_records()
15589 if (un->un_pos.blkno < dblk || (un->un_dp->options & ST_BSR)) { in st_space_records()
15595 dblk -= un->un_pos.blkno; in st_space_records()
15596 if (st_cmd(un, SCMD_SPACE, Blk(dblk), SYNC_CMD)) { in st_space_records()
15600 } else if (un->un_pos.eof >= ST_EOF_PENDING) { in st_space_records()
15604 if (dblk < 0 && un->un_pos.eof == ST_EOM) { in st_space_records()
15605 un->un_status = SUN_KEY_BOT; in st_space_records()
15606 un->un_pos.eof = ST_NO_EOF; in st_space_records()
15608 un->un_pos.eof == ST_EOF_PENDING) { in st_space_records()
15609 int residue = un->un_err_resid; in st_space_records()
15614 if (st_cmd(un, SCMD_SPACE, Fmk(1), SYNC_CMD)) { in st_space_records()
15620 un->un_err_resid = residue; in st_space_records()
15636 int dfile = un->un_pos.fileno; /* save current file */ in st_space_records()
15642 if (un->un_pos.blkno != 0 && in st_space_records()
15643 (st_cmd(un, SCMD_REWIND, 0, SYNC_CMD) || in st_space_records()
15644 st_cmd(un, SCMD_SPACE, Fmk(dfile), SYNC_CMD))) { in st_space_records()
15645 un->un_pos.pmode = invalid; in st_space_records()
15647 un->un_err_resid = -dblk; in st_space_records()
15648 if (un->un_pos.fileno == 0 && un->un_pos.blkno == 0) { in st_space_records()
15649 un->un_status = SUN_KEY_BOT; in st_space_records()
15650 un->un_pos.eof = ST_NO_EOF; in st_space_records()
15651 } else if (un->un_pos.fileno > 0) { in st_space_records()
15652 un->un_status = SUN_KEY_EOF; in st_space_records()
15653 un->un_pos.eof = ST_NO_EOF; in st_space_records()
15655 COPY_POS(&un->un_err_pos, &un->un_pos); in st_space_records()
15659 } else if (st_cmd(un, SCMD_REWIND, 0, SYNC_CMD) || in st_space_records()
15660 st_cmd(un, SCMD_SPACE, Fmk(dfile), SYNC_CMD) || in st_space_records()
15661 st_cmd(un, SCMD_SPACE, Blk(dblk), SYNC_CMD)) { in st_space_records()
15665 un->un_pos.pmode = invalid; in st_space_records()
15674 st_mtbsf_ioctl(struct scsi_tape *un, int64_t files) in st_mtbsf_ioctl() argument
15679 "st_mtbsf_ioctl: count=%"PRIx64", eof=%x\n", files, un->un_pos.eof); in st_mtbsf_ioctl()
15685 if ((un->un_dp->options & ST_BSF) == 0) { in st_mtbsf_ioctl()
15689 if (un->un_pos.pmode == legacy) { in st_mtbsf_ioctl()
15697 if (un->un_pos.eof >= ST_EOT && files < 0) { in st_mtbsf_ioctl()
15698 un->un_err_resid = files; in st_mtbsf_ioctl()
15699 un->un_status = SUN_KEY_EOT; in st_mtbsf_ioctl()
15708 if (IN_EOF(un->un_pos)) { in st_mtbsf_ioctl()
15709 un->un_pos.fileno++; in st_mtbsf_ioctl()
15710 un->un_pos.blkno = 0; in st_mtbsf_ioctl()
15719 if (st_check_density_or_wfm(un->un_dev, 1, 0, STEPBACK)) { in st_mtbsf_ioctl()
15731 return (st_forward_space_files(un, files)); in st_mtbsf_ioctl()
15733 return (st_backward_space_files(un, files, 1)); in st_mtbsf_ioctl()
15737 st_backward_space_files(struct scsi_tape *un, int64_t count, int infront) in st_backward_space_files() argument
15747 count, un->un_pos.eof); in st_backward_space_files()
15771 if (un->un_pos.pmode == logical) { in st_backward_space_files()
15776 un->un_pos.lgclblkno); in st_backward_space_files()
15780 if ((un->un_dp->options & ST_BSF) == 0) { in st_backward_space_files()
15785 (st_cmd(un, SCMD_SPACE, Fmk(-count), SYNC_CMD))) { in st_backward_space_files()
15789 (st_cmd(un, SCMD_SPACE, Fmk((-count)-1), SYNC_CMD)) && in st_backward_space_files()
15790 (st_cmd(un, SCMD_SPACE, Fmk(1), SYNC_CMD))) { in st_backward_space_files()
15800 infront?MTBSF:MTNBSF, count, un->un_pos.fileno, un->un_pos.blkno); in st_backward_space_files()
15818 end_fileno = un->un_pos.fileno - count; in st_backward_space_files()
15826 if (st_cmd(un, SCMD_REWIND, 0, SYNC_CMD)) { in st_backward_space_files()
15837 un->un_err_resid = -end_fileno; in st_backward_space_files()
15838 un->un_status = SUN_KEY_BOT; in st_backward_space_files()
15843 if (un->un_dp->options & ST_BSF) { in st_backward_space_files()
15854 if (st_cmd(un, SCMD_SPACE, Fmk(end_fileno), SYNC_CMD)) { in st_backward_space_files()
15860 if (st_cmd(un, SCMD_REWIND, 0, SYNC_CMD)) { in st_backward_space_files()
15874 if (st_cmd(un, SCMD_SPACE, Fmk(skip_cnt), SYNC_CMD)) { in st_backward_space_files()
15885 if ((un->un_dp->options & ST_BSF) == 0) { in st_backward_space_files()
15886 un->un_pos.eof = ST_EOF_PENDING; in st_backward_space_files()
15887 un->un_pos.fileno -= 1; in st_backward_space_files()
15888 un->un_pos.blkno = LASTBLK; in st_backward_space_files()
15889 un->un_running.pmode = invalid; in st_backward_space_files()
15895 un->un_pos.pmode = invalid; in st_backward_space_files()
15902 st_mtnbsf_ioctl(struct scsi_tape *un, int64_t count) in st_mtnbsf_ioctl() argument
15909 "nbsf: count=%"PRIx64", eof=%x\n", count, un->un_pos.eof); in st_mtnbsf_ioctl()
15911 if (un->un_pos.pmode == legacy) { in st_mtnbsf_ioctl()
15920 if (un->un_pos.eof >= ST_EOT && count < 0) { in st_mtnbsf_ioctl()
15921 un->un_err_resid = count; in st_mtnbsf_ioctl()
15922 un->un_status = SUN_KEY_EOT; in st_mtnbsf_ioctl()
15931 if (IN_EOF(un->un_pos)) { in st_mtnbsf_ioctl()
15932 un->un_pos.fileno++; in st_mtnbsf_ioctl()
15933 un->un_pos.blkno = 0; in st_mtnbsf_ioctl()
15938 if (st_check_density_or_wfm(un->un_dev, 1, 0, STEPBACK)) { in st_mtnbsf_ioctl()
15945 "mtnbsf: count=%"PRIx64", eof=%x\n", count, un->un_pos.eof); in st_mtnbsf_ioctl()
15948 rval = st_forward_space_files(un, -count); in st_mtnbsf_ioctl()
15950 rval = st_backward_space_files(un, count, 0); in st_mtnbsf_ioctl()
15956 st_mtbsr_ioctl(struct scsi_tape *un, int64_t num) in st_mtbsr_ioctl() argument
15961 "bsr: count=%"PRIx64", eof=%x\n", num, un->un_pos.eof); in st_mtbsr_ioctl()
15963 if (un->un_pos.pmode == legacy) { in st_mtbsr_ioctl()
15971 if (un->un_pos.eof >= ST_EOT && num < 0) { in st_mtbsr_ioctl()
15972 un->un_err_resid = num; in st_mtbsr_ioctl()
15973 un->un_status = SUN_KEY_EOT; in st_mtbsr_ioctl()
15980 COPY_POS(&un->un_err_pos, &un->un_pos); in st_mtbsr_ioctl()
15981 un->un_err_resid = 0; in st_mtbsr_ioctl()
15982 if (IN_EOF(un->un_pos) && SVR4_BEHAVIOR) { in st_mtbsr_ioctl()
15983 un->un_status = SUN_KEY_EOF; in st_mtbsr_ioctl()
15997 if (IN_EOF(un->un_pos)) { in st_mtbsr_ioctl()
15999 optype lastop = un->un_lastop; in st_mtbsr_ioctl()
16001 COPY_POS(&save, &un->un_pos); in st_mtbsr_ioctl()
16002 if (st_cmd(un, SCMD_SPACE, Fmk(-1), SYNC_CMD) == -1) { in st_mtbsr_ioctl()
16008 COPY_POS(&un->un_pos, &save); in st_mtbsr_ioctl()
16009 un->un_lastop = lastop; in st_mtbsr_ioctl()
16013 un->un_pos.eof = ST_NO_EOF; in st_mtbsr_ioctl()
16015 if (st_check_density_or_wfm(un->un_dev, 1, 0, STEPBACK)) { in st_mtbsr_ioctl()
16022 return (st_space_records(un, num)); in st_mtbsr_ioctl()
16026 st_mtfsfm_ioctl(struct scsi_tape *un, int64_t cnt) in st_mtfsfm_ioctl() argument
16032 rval = st_cmd(un, SCMD_SPACE, SPACE(SP_SQFLM, cnt), SYNC_CMD); in st_mtfsfm_ioctl()
16034 un->un_pos.pmode = logical; in st_mtfsfm_ioctl()
16035 } else if ((un->un_status == KEY_ILLEGAL_REQUEST) && in st_mtfsfm_ioctl()
16036 (un->un_sd->sd_sense->es_add_code == 0x24)) { in st_mtfsfm_ioctl()
16041 un->un_err_resid = cnt; in st_mtfsfm_ioctl()
16042 un->un_status = 0; in st_mtfsfm_ioctl()
16045 un->un_err_resid = cnt; in st_mtfsfm_ioctl()
16046 un->un_pos.pmode = invalid; in st_mtfsfm_ioctl()
16052 st_mtbsfm_ioctl(struct scsi_tape *un, int64_t cnt) in st_mtbsfm_ioctl() argument
16058 rval = st_cmd(un, SCMD_SPACE, SPACE(SP_SQFLM, -cnt), SYNC_CMD); in st_mtbsfm_ioctl()
16060 un->un_pos.pmode = logical; in st_mtbsfm_ioctl()
16061 } else if ((un->un_status == KEY_ILLEGAL_REQUEST) && in st_mtbsfm_ioctl()
16062 (un->un_sd->sd_sense->es_add_code == 0x24)) { in st_mtbsfm_ioctl()
16067 un->un_err_resid = cnt; in st_mtbsfm_ioctl()
16068 un->un_status = 0; in st_mtbsfm_ioctl()
16071 un->un_err_resid = cnt; in st_mtbsfm_ioctl()
16072 un->un_pos.pmode = invalid; in st_mtbsfm_ioctl()
16083 st_release_contig_mem(struct scsi_tape *un, struct contig_mem *cp) in st_release_contig_mem() argument
16089 cp->cm_next = un->un_contig_mem; in st_release_contig_mem()
16090 un->un_contig_mem = cp; in st_release_contig_mem()
16091 un->un_contig_mem_available_num++; in st_release_contig_mem()
16092 cv_broadcast(&un->un_contig_mem_cv); in st_release_contig_mem()
16105 st_get_contig_mem(struct scsi_tape *un, size_t len, int alloc_flags) in st_get_contig_mem() argument
16120 if (un->un_contig_mem_available_num > 0) { in st_get_contig_mem()
16121 ST_GET_CONTIG_MEM_HEAD(un, cp, len, big_enough); in st_get_contig_mem()
16122 } else if (un->un_contig_mem_total_num < st_max_contig_mem_num) { in st_get_contig_mem()
16140 un->un_contig_mem_total_num++; /* one more available */ in st_get_contig_mem()
16147 while (un->un_contig_mem_available_num <= 0) { in st_get_contig_mem()
16148 cv_wait(&un->un_contig_mem_cv, ST_MUTEX); in st_get_contig_mem()
16150 ST_GET_CONTIG_MEM_HEAD(un, cp, len, big_enough); in st_get_contig_mem()
16163 if (ddi_dma_mem_alloc(un->un_contig_mem_hdl, len, &st_acc_attr, in st_get_contig_mem()
16168 st_release_contig_mem(un, cp); in st_get_contig_mem()
16176 un->un_max_contig_mem_len = in st_get_contig_mem()
16177 un->un_max_contig_mem_len >= len ? in st_get_contig_mem()
16178 un->un_max_contig_mem_len : len; in st_get_contig_mem()
16195 if ((un->un_max_contig_mem_len < len) || in st_get_contig_mem()
16208 cv_wait(&un->un_contig_mem_cv, ST_MUTEX); in st_get_contig_mem()
16209 ST_GET_CONTIG_MEM_HEAD(un, cp, len, big_enough); in st_get_contig_mem()
16233 struct scsi_tape *un; in st_bigblk_xfer_done() local
16240 un = ddi_get_soft_state(st_state, MTUNIT(bp->b_edev)); in st_bigblk_xfer_done()
16241 if (un == NULL) { in st_bigblk_xfer_done()
16254 ASSERT(un->un_sbuf_busy); in st_bigblk_xfer_done()
16256 un->un_sbufp = orig_bp; in st_bigblk_xfer_done()
16270 st_release_contig_mem(un, cp); in st_bigblk_xfer_done()
16285 struct scsi_tape *un; in st_get_bigblk_bp() local
16288 un = ddi_get_soft_state(st_state, MTUNIT(bp->b_edev)); in st_get_bigblk_bp()
16289 if (un == NULL) { in st_get_bigblk_bp()
16296 cp = st_get_contig_mem(un, bp->b_bcount, KM_SLEEP); in st_get_bigblk_bp()
16307 if (bp == un->un_sbufp) { in st_get_bigblk_bp()
16309 ASSERT(un->un_sbuf_busy); in st_get_bigblk_bp()
16311 un->un_sbufp = cont_bp; in st_get_bigblk_bp()
16391 st_check_if_media_changed(struct scsi_tape *un, caddr_t data, int size) in st_check_if_media_changed() argument
16422 if (un->un_media_id_len == 0) { in st_check_if_media_changed()
16423 un->un_media_id = kmem_zalloc(size, KM_SLEEP); in st_check_if_media_changed()
16424 un->un_media_id_len = size; in st_check_if_media_changed()
16425 (void) strncpy(un->un_media_id, data, min(size, strlen(data))); in st_check_if_media_changed()
16426 un->un_media_id[min(size, strlen(data))] = 0; in st_check_if_media_changed()
16428 "Found Media Id %s length = %d\n", un->un_media_id, size); in st_check_if_media_changed()
16429 } else if (size > un->un_media_id_len) { in st_check_if_media_changed()
16430 if (strncmp(un->un_media_id, data, size) != 0) { in st_check_if_media_changed()
16435 un->un_media_id, data); in st_check_if_media_changed()
16436 kmem_free(un->un_media_id, un->un_media_id_len); in st_check_if_media_changed()
16437 un->un_media_id = kmem_zalloc(size, KM_SLEEP); in st_check_if_media_changed()
16438 un->un_media_id_len = size; in st_check_if_media_changed()
16439 (void) strncpy(un->un_media_id, data, size); in st_check_if_media_changed()
16440 un->un_media_id[size] = 0; in st_check_if_media_changed()
16441 } else if (strncmp(data, un->un_media_id, in st_check_if_media_changed()
16442 min(size, un->un_media_id_len)) != 0) { in st_check_if_media_changed()
16445 un->un_media_id, un->un_media_id_len, data, size); in st_check_if_media_changed()
16446 bzero(un->un_media_id, un->un_media_id_len); in st_check_if_media_changed()
16447 (void) strncpy(un->un_media_id, data, min(size, strlen(data))); in st_check_if_media_changed()
16448 un->un_media_id[min(size, strlen(data))] = 0; in st_check_if_media_changed()
16452 "Media Id still %s\n", un->un_media_id); in st_check_if_media_changed()
16455 ASSERT(strlen(un->un_media_id) <= size); in st_check_if_media_changed()
16487 st_handle_hex_media_id(struct scsi_tape *un, void *pnt, int size) in st_handle_hex_media_id() argument
16508 result = st_check_if_media_changed(un, buf, newsize); in st_handle_hex_media_id()
16517 st_get_media_id_via_read_attribute(struct scsi_tape *un, ubufunc_t bufunc) in st_get_media_id_via_read_attribute() argument
16525 size = sizeof (attribute_header) + max(un->un_media_id_len, ID_SIZE); in st_get_media_id_via_read_attribute()
16528 result = st_read_attributes(un, 0x0401, buffer, size, bufunc); in st_get_media_id_via_read_attribute()
16544 un->un_media_id_method = st_get_media_id_via_read_attribute; in st_get_media_id_via_read_attribute()
16547 st_handle_hex_media_id(un, buffer->data, newsize); in st_get_media_id_via_read_attribute()
16549 result = st_check_if_media_changed(un, buffer->data, in st_get_media_id_via_read_attribute()
16552 } else if (result == EINVAL && un->un_max_cdb_sz < CDB_GROUP4) { in st_get_media_id_via_read_attribute()
16560 un->un_status = 0; in st_get_media_id_via_read_attribute()
16567 st_get_media_id_via_media_serial_cmd(struct scsi_tape *un, ubufunc_t bufunc) in st_get_media_id_via_media_serial_cmd() argument
16573 int size = max(un->un_media_id_len, ID_SIZE); in st_get_media_id_via_media_serial_cmd()
16578 if (un->un_sd->sd_inq->inq_ansi < 3) { in st_get_media_id_via_media_serial_cmd()
16600 ucmd->uscsi_timeout = un->un_dp->non_motion_timeout; in st_get_media_id_via_media_serial_cmd()
16608 rval = bufunc(un, ucmd, FKIOCTL); in st_get_media_id_via_media_serial_cmd()
16624 un->un_status = 0; in st_get_media_id_via_media_serial_cmd()
16653 un->un_status = 0; in st_get_media_id_via_media_serial_cmd()
16660 un->un_media_id_method = in st_get_media_id_via_media_serial_cmd()
16663 st_check_if_media_changed(un, &buf[4], act_size); in st_get_media_id_via_media_serial_cmd()
16676 st_bogus_media_id(struct scsi_tape *un, ubufunc_t bufunc) in st_bogus_media_id() argument
16680 ASSERT(un->un_media_id == NULL || un->un_media_id == bogusID); in st_bogus_media_id()
16681 ASSERT(un->un_media_id_len == 0); in st_bogus_media_id()
16682 un->un_media_id = (char *)bogusID; in st_bogus_media_id()
16683 un->un_media_id_len = 0; in st_bogus_media_id()
16696 st_get_media_identification(struct scsi_tape *un, ubufunc_t bufunc) in st_get_media_identification() argument
16709 un->un_media_id_method = media_chk_functions[i]; in st_get_media_identification()
16710 } else if (un->un_media_id_method != media_chk_functions[i] && in st_get_media_identification()
16711 un->un_media_id_method != st_get_media_identification) { in st_get_media_identification()
16714 result = media_chk_functions[i](un, bufunc); in st_get_media_identification()
16728 st_command_recovery(struct scsi_tape *un, struct scsi_pkt *pkt, in st_command_recovery() argument
16738 ASSERT(MUTEX_HELD(&un->un_sd->sd_mutex)); in st_command_recovery()
16740 ASSERT(un->un_recov_buf_busy == 0); in st_command_recovery()
16745 if (un->un_rsvd_status & ST_INITIATED_RESET && in st_command_recovery()
16776 ret = ddi_taskq_dispatch(un->un_recov_taskq, st_recover, errinfo, in st_command_recovery()
16788 st_recov_ret(struct scsi_tape *un, st_err_info *errinfo, errstate err) in st_recov_ret() argument
16796 ASSERT(MUTEX_HELD(&un->un_sd->sd_mutex)); in st_recov_ret()
16798 _NOTE(LOCK_RELEASED_AS_SIDE_EFFECT(&un->un_sd->sd_mutex)) in st_recov_ret()
16806 mutex_exit(&un->un_sd->sd_mutex); in st_recov_ret()
16820 un->un_pos.pmode = invalid; in st_recov_ret()
16821 un->un_running.pmode = invalid; in st_recov_ret()
16825 ST_DO_ERRSTATS(un, st_transerrs); in st_recov_ret()
16827 st_set_pe_flag(un); in st_recov_ret()
16833 st_done_and_mutex_exit(un, bp); in st_recov_ret()
16842 struct scsi_tape *un; in st_recover() local
16854 un = ddi_get_soft_state(st_state, MTUNIT(bp->b_edev)); in st_recover()
16856 ASSERT(un != NULL); in st_recover()
16872 rval = st_test_path_to_device(un); in st_recover()
16882 rval = st_rcmd(un, SCMD_WRITE_FILE_MARK, 0, SYNC_CMD); in st_recover()
16886 st_recov_ret(un, errinfo, COMMAND_DONE_ERROR); in st_recover()
16900 st_recov_ret(un, errinfo, COMMAND_DONE_ERROR); in st_recover()
16907 if ((un->un_rsvd_status & in st_recover()
16915 st_recov_ret(un, errinfo, COMMAND_DONE_ERROR); in st_recover()
16925 if ((un->un_rsvd_status & ST_RESERVE | ST_PRESERVE_RESERVE) && in st_recover()
16930 st_recov_ret(un, errinfo, COMMAND_DONE_EACCES); in st_recover()
16937 if ((((un->un_rsvd_status & in st_recover()
16941 rval = st_reserve_release(un, ST_RESERVE, in st_recover()
16944 if (st_take_ownership(un, st_uscsi_rcmd) != 0) { in st_recover()
16945 st_recov_ret(un, errinfo, in st_recover()
16950 un->un_rsvd_status |= ST_RESERVE; in st_recover()
16951 un->un_rsvd_status &= ~(ST_RELEASE | ST_LOST_RESERVE | in st_recover()
16954 rval = st_make_sure_mode_data_is_correct(un, st_uscsi_rcmd); in st_recover()
16956 st_recov_ret(un, errinfo, COMMAND_DONE_ERROR); in st_recover()
16971 rval = st_make_sure_mode_data_is_correct(un, in st_recover()
16974 st_recov_ret(un, errinfo, COMMAND_DONE_ERROR); in st_recover()
16982 if (un->un_media_id != NULL && un->un_media_id != bogusID) { in st_recover()
16983 rval = st_get_media_identification(un, st_uscsi_rcmd); in st_recover()
16985 st_recov_ret(un, errinfo, COMMAND_DONE_EACCES); in st_recover()
17009 if (rcv->cmd_attrib->retriable || un->un_rqs_bp == bp) { in st_recover()
17010 status = st_recover_reissue_pkt(un, &errinfo->ei_failed_pkt); in st_recover()
17015 } else if (un->un_read_pos_type == NO_POS) { in st_recover()
17029 rval = st_compare_expected_position(un, errinfo, in st_recover()
17034 status = st_recover_reissue_pkt(un, in st_recover()
17043 st_recov_ret(un, errinfo, status); in st_recover()
17049 struct scsi_tape *un; in st_recov_cb() local
17065 un = ddi_get_soft_state(st_state, MTUNIT(bp->b_edev)); in st_recov_cb()
17066 ASSERT(un != NULL); in st_recov_cb()
17072 ASSERT(bp == un->un_recov_buf); in st_recov_cb()
17077 if (un->un_arq_enabled && pkt->pkt_state & STATE_ARQ_DONE) { in st_recov_cb()
17078 action = st_handle_autosense(un, bp, &rcv->pos); in st_recov_cb()
17082 action = st_check_error(un, pkt); in st_recov_cb()
17094 if (un->un_multipath) in st_recov_cb()
17109 if (un->un_multipath) { in st_recov_cb()
17111 (un->un_last_path_instance != pkt->pkt_path_instance)) { in st_recov_cb()
17112 if (un->un_state > ST_STATE_OPENING) { in st_recov_cb()
17117 un->un_last_path_instance = pkt->pkt_path_instance; in st_recov_cb()
17160 if (un->un_throttle) { in st_recov_cb()
17161 un->un_last_throttle = un->un_throttle; in st_recov_cb()
17164 if (st_handle_intr_busy(un, bp, timout) == 0) { in st_recov_cb()
17168 un->un_pos.pmode = invalid; in st_recov_cb()
17169 un->un_err_resid = bp->b_resid = bp->b_bcount; in st_recov_cb()
17171 st_set_pe_flag(un); in st_recov_cb()
17177 un->un_pos.pmode = invalid; in st_recov_cb()
17178 un->un_err_resid = bp->b_resid = bp->b_bcount; in st_recov_cb()
17180 st_set_pe_flag(un); in st_recov_cb()
17184 st_done_and_mutex_exit(un, bp); in st_recov_cb()
17188 st_rcmd(struct scsi_tape *un, int com, int64_t count, int wait) in st_rcmd() argument
17197 (void *)un, com, count, wait); in st_rcmd()
17199 ASSERT(MUTEX_HELD(&un->un_sd->sd_mutex)); in st_rcmd()
17204 st_debug_cmds(un, com, count, wait); in st_rcmd()
17208 while (un->un_recov_buf_busy) in st_rcmd()
17209 cv_wait(&un->un_recov_buf_cv, ST_MUTEX); in st_rcmd()
17210 un->un_recov_buf_busy = 1; in st_rcmd()
17212 bp = un->un_recov_buf; in st_rcmd()
17217 err = st_setup_cmd(un, bp, com, count); in st_rcmd()
17219 un->un_recov_buf_busy = 0; in st_rcmd()
17221 cv_signal(&un->un_recov_buf_cv); in st_rcmd()
17228 st_uscsi_rcmd(struct scsi_tape *un, struct uscsi_cmd *ucmd, int flag) in st_uscsi_rcmd() argument
17239 while (un->un_recov_buf_busy) in st_uscsi_rcmd()
17240 cv_wait(&un->un_recov_buf_cv, ST_MUTEX); in st_uscsi_rcmd()
17241 un->un_recov_buf_busy = 1; in st_uscsi_rcmd()
17243 bp = un->un_recov_buf; in st_uscsi_rcmd()
17250 rval = scsi_uscsi_handle_cmd(un->un_dev, UIO_SYSSPACE, ucmd, in st_uscsi_rcmd()
17259 un->un_recov_buf_busy = 0; in st_uscsi_rcmd()
17260 cv_signal(&un->un_recov_buf_cv); in st_uscsi_rcmd()
17269 st_add_recovery_info_to_pkt(struct scsi_tape *un, buf_t *bp, in st_add_recovery_info_to_pkt() argument
17306 COPY_POS(&rinfo->pos, &un->un_pos); in st_add_recovery_info_to_pkt()
17307 un->un_running.pmode = invalid; in st_add_recovery_info_to_pkt()
17314 if (bp == un->un_recov_buf) { in st_add_recovery_info_to_pkt()
17315 rinfo->pos.pmode = un->un_running.pmode; in st_add_recovery_info_to_pkt()
17324 if (un->un_running.pmode == invalid) { in st_add_recovery_info_to_pkt()
17325 COPY_POS(&un->un_running, &un->un_pos); in st_add_recovery_info_to_pkt()
17326 COPY_POS(&rinfo->pos, &un->un_running); in st_add_recovery_info_to_pkt()
17328 COPY_POS(&rinfo->pos, &un->un_running); in st_add_recovery_info_to_pkt()
17356 if (bp == un->un_sbufp) { in st_add_recovery_info_to_pkt()
17365 if ((lbn != un->un_running.lgclblkno) || in st_add_recovery_info_to_pkt()
17366 (pkt->pkt_cdbp[3] != un->un_running.partition)) { in st_add_recovery_info_to_pkt()
17370 un->un_running.partition = pkt->pkt_cdbp[3]; in st_add_recovery_info_to_pkt()
17371 un->un_running.pmode = logical; in st_add_recovery_info_to_pkt()
17372 un->un_running.lgclblkno = lbn; in st_add_recovery_info_to_pkt()
17375 uint64_t lbn = un->un_running.lgclblkno; in st_add_recovery_info_to_pkt()
17377 pkt->pkt_cdbp[3] = (uchar_t)un->un_running.partition; in st_add_recovery_info_to_pkt()
17390 un->un_running.lgclblkno += count; in st_add_recovery_info_to_pkt()
17397 if (un->un_mediastate == MTIO_INSERTED) { in st_add_recovery_info_to_pkt()
17429 un->un_running.fileno += count; in st_add_recovery_info_to_pkt()
17430 un->un_running.lgclblkno += count; in st_add_recovery_info_to_pkt()
17431 un->un_running.blkno = 0; in st_add_recovery_info_to_pkt()
17439 un->un_running.fileno = 0; in st_add_recovery_info_to_pkt()
17440 un->un_running.lgclblkno = 0; in st_add_recovery_info_to_pkt()
17441 un->un_running.blkno = 0; in st_add_recovery_info_to_pkt()
17442 un->un_running.eof = ST_NO_EOF; in st_add_recovery_info_to_pkt()
17443 if (un->un_running.pmode != legacy) in st_add_recovery_info_to_pkt()
17444 un->un_running.pmode = legacy; in st_add_recovery_info_to_pkt()
17458 un->un_running.pmode = invalid; in st_add_recovery_info_to_pkt()
17464 un->un_running.eof = ST_EOT; in st_add_recovery_info_to_pkt()
17465 un->un_running.pmode = invalid; in st_add_recovery_info_to_pkt()
17474 un->un_running.fileno = 0; in st_add_recovery_info_to_pkt()
17475 un->un_running.lgclblkno = 0; in st_add_recovery_info_to_pkt()
17476 un->un_running.blkno = 0; in st_add_recovery_info_to_pkt()
17477 un->un_running.eof = ST_NO_EOF; in st_add_recovery_info_to_pkt()
17496 un->un_running.lgclblkno += count; in st_add_recovery_info_to_pkt()
17497 un->un_running.blkno += count; in st_add_recovery_info_to_pkt()
17502 un->un_running.lgclblkno -= count; in st_add_recovery_info_to_pkt()
17503 un->un_running.blkno -= count; in st_add_recovery_info_to_pkt()
17515 un->un_running.lgclblkno = count; in st_add_recovery_info_to_pkt()
17516 un->un_running.blkno = 0; in st_add_recovery_info_to_pkt()
17517 un->un_running.fileno = 0; in st_add_recovery_info_to_pkt()
17518 un->un_running.pmode = logical; in st_add_recovery_info_to_pkt()
17533 st_make_sure_mode_data_is_correct(struct scsi_tape *un, ubufunc_t ubf) in st_make_sure_mode_data_is_correct() argument
17542 rval = st_check_mode_for_change(un, ubf); in st_make_sure_mode_data_is_correct()
17544 rval = st_gen_mode_select(un, ubf, un->un_mspl, in st_make_sure_mode_data_is_correct()
17547 if (un->un_tlr_flag != TLR_NOT_SUPPORTED) { in st_make_sure_mode_data_is_correct()
17548 rval |= st_set_target_TLR_mode(un, ubf); in st_make_sure_mode_data_is_correct()
17554 st_check_mode_for_change(struct scsi_tape *un, ubufunc_t ubf) in st_check_mode_for_change() argument
17565 if (un->un_comp_page == (ST_DEV_DATACOMP_PAGE | ST_DEV_CONFIG_PAGE)) { in st_check_mode_for_change()
17573 rval = st_gen_mode_sense(un, ubf, un->un_comp_page, current, in st_check_mode_for_change()
17583 that = (caddr_t)un->un_mspl; in st_check_mode_for_change()
17608 st_test_path_to_device(struct scsi_tape *un) in st_test_path_to_device() argument
17624 rval = st_rcmd(un, SCMD_TEST_UNIT_READY, 0, SYNC_CMD); in st_test_path_to_device()
17630 if (un->un_status == KEY_NOT_READY || un->un_mediastate == MTIO_EJECTED) in st_test_path_to_device()
17641 st_recovery_read_pos(struct scsi_tape *un, read_p_types type, in st_recovery_read_pos() argument
17664 cmd.uscsi_timeout = un->un_dp->non_motion_timeout; in st_recovery_read_pos()
17684 rval = st_uscsi_rcmd(un, &cmd, FKIOCTL); in st_recovery_read_pos()
17692 st_recovery_get_position(struct scsi_tape *un, tapepos_t *read, in st_recovery_get_position() argument
17696 read_p_types type = un->un_read_pos_type; in st_recovery_get_position()
17701 rval = st_recovery_read_pos(un, type, raw); in st_recovery_get_position()
17722 if (type != un->un_read_pos_type) { in st_recovery_get_position()
17723 un->un_read_pos_type = type; in st_recovery_get_position()
17730 rval = st_interpret_read_pos(un, read, type, in st_recovery_get_position()
17744 st_compare_expected_position(struct scsi_tape *un, st_err_info *ei, in st_compare_expected_position() argument
17752 ASSERT(un != NULL); in st_compare_expected_position()
17761 rval = st_recovery_get_position(un, read, readp_datap); in st_compare_expected_position()
17843 rval = st_logical_block_locate(un, in st_compare_expected_position()
17860 rval = st_logical_block_locate(un, in st_compare_expected_position()
17880 rval = st_logical_block_locate(un, in st_compare_expected_position()
17918 rval = st_logical_block_locate(un, in st_compare_expected_position()
17931 rval = st_logical_block_locate(un, in st_compare_expected_position()
17982 rval = st_logical_block_locate(un, st_uscsi_rcmd, read, in st_compare_expected_position()
18005 st_recover_reissue_pkt(struct scsi_tape *un, struct scsi_pkt *oldpkt) in st_recover_reissue_pkt() argument
18017 (un->un_arq_enabled ? sizeof (struct scsi_arq_status) : 1); in st_recover_reissue_pkt()
18046 if (bp != un->un_sbufp && bp != un->un_recov_buf) { in st_recover_reissue_pkt()
18047 ASSERT(un->un_runqf == un->un_runql); in st_recover_reissue_pkt()
18048 ASSERT(un->un_runqf == bp); in st_recover_reissue_pkt()
18054 if (pkt_bp == un->un_rqs_bp) { in st_recover_reissue_pkt()
18089 if (oldpkt == un->un_rqs) { in st_recover_reissue_pkt()
18090 ASSERT(bp == un->un_rqs_bp); in st_recover_reissue_pkt()
18091 un->un_rqs = newpkt; in st_recover_reissue_pkt()
18098 rval = st_transport(un, newpkt); in st_recover_reissue_pkt()
18108 rval = st_handle_start_busy(un, bp, ST_TRAN_BUSY_TIMEOUT, queued); in st_recover_reissue_pkt()
18118 st_transport(struct scsi_tape *un, struct scsi_pkt *pkt) in st_transport() argument
18474 st_reset(struct scsi_tape *un, int reset_type) in st_reset() argument
18478 ASSERT(MUTEX_HELD(&un->un_sd->sd_mutex)); in st_reset()
18481 un->un_rsvd_status |= ST_INITIATED_RESET; in st_reset()
18484 rval = scsi_reset(&un->un_sd->sd_address, reset_type); in st_reset()
18514 st_set_target_TLR_mode(struct scsi_tape *un, ubufunc_t ubf) in st_set_target_TLR_mode() argument
18523 ret = st_gen_mode_sense(un, ubf, 0x18, mode_data, amount); in st_set_target_TLR_mode()
18526 un->un_tlr_flag = TLR_NOT_SUPPORTED; in st_set_target_TLR_mode()
18534 un->un_tlr_flag = TLR_NOT_SUPPORTED; in st_set_target_TLR_mode()
18538 if (un->un_tlr_flag == TLR_SAS_ONE_DEVICE) { in st_set_target_TLR_mode()
18547 ret = st_gen_mode_select(un, ubf, mode_data, amount); in st_set_target_TLR_mode()
18550 un->un_tlr_flag = TLR_NOT_SUPPORTED; in st_set_target_TLR_mode()
18553 un->un_tlr_flag = TLR_NOT_KNOWN; in st_set_target_TLR_mode()
18555 un->un_tlr_flag = TLR_SAS_ONE_DEVICE; in st_set_target_TLR_mode()
18570 struct scsi_tape *un = (struct scsi_tape *)arg; in st_reset_notification() local
18575 un->un_unit_attention_flags |= 2; in st_reset_notification()
18576 if ((un->un_rsvd_status & (ST_RESERVE | ST_APPLICATION_RESERVATIONS)) == in st_reset_notification()
18578 un->un_rsvd_status |= ST_LOST_RESERVE; in st_reset_notification()
18586 if ((un->un_restore_pos == 0) && in st_reset_notification()
18587 (un->un_state == ST_STATE_CLOSED) || in st_reset_notification()
18588 (un->un_state == ST_STATE_OPEN_PENDING_IO) || in st_reset_notification()
18589 (un->un_state == ST_STATE_CLOSING)) { in st_reset_notification()
18590 un->un_restore_pos = 1; in st_reset_notification()
18593 "reset and state was %d\n", un->un_state); in st_reset_notification()