Lines Matching refs:un

658 #define	SD_IS_PARALLEL_SCSI(un)		\  argument
659 ((un)->un_interconnect_type == SD_INTERCONNECT_PARALLEL)
660 #define SD_IS_SERIAL(un) \ argument
661 (((un)->un_interconnect_type == SD_INTERCONNECT_SATA) ||\
662 ((un)->un_interconnect_type == SD_INTERCONNECT_SAS))
676 #define New_state(un, s) \ argument
677 (un)->un_last_state = (un)->un_state, (un)->un_state = (s)
678 #define Restore_state(un) \ argument
679 { uchar_t tmp = (un)->un_last_state; New_state((un), tmp); }
722 static void sd_log_trace(uint_t comp, struct sd_lun *un, const char *fmt, ...);
724 static void sd_log_info(uint_t comp, struct sd_lun *un, const char *fmt, ...);
726 static void sd_log_err(uint_t comp, struct sd_lun *un, const char *fmt, ...);
757 static sd_ssc_t *sd_ssc_init(struct sd_lun *un);
783 static void sd_ssc_extract_info(sd_ssc_t *ssc, struct sd_lun *un,
794 static void sd_read_unit_properties(struct sd_lun *un);
795 static int sd_process_sdconf_file(struct sd_lun *un);
796 static void sd_nvpair_str_decode(struct sd_lun *un, char *nvpair_str);
797 static void sd_set_properties(struct sd_lun *un, char *name, char *value);
798 static void sd_get_tunables_from_conf(struct sd_lun *un, int flags,
800 static void sd_process_sdconf_table(struct sd_lun *un);
801 static int sd_sdconf_id_match(struct sd_lun *un, char *id, int idlen);
802 static int sd_blank_cmp(struct sd_lun *un, char *id, int idlen);
803 static int sd_chk_vers1_data(struct sd_lun *un, int flags, int *prop_list,
805 static void sd_set_vers1_properties(struct sd_lun *un, int flags,
816 static void sd_create_pm_components(dev_info_t *devi, struct sd_lun *un);
820 static int sd_pm_state_change(struct sd_lun *un, int level, int flag);
828 static void sd_set_unit_attributes(struct sd_lun *un, dev_info_t *devi);
829 static void sd_create_errstats(struct sd_lun *un, int instance);
830 static void sd_set_errstats(struct sd_lun *un);
831 static void sd_set_pstats(struct sd_lun *un);
834 static int sd_scsi_poll(struct sd_lun *un, struct scsi_pkt *pkt);
835 static int sd_send_polled_RQS(struct sd_lun *un);
853 static void sd_update_block_info(struct sd_lun *un, uint32_t lbasize,
875 static void sd_mapblockaddr_iostart(int index, struct sd_lun *un,
877 static void sd_mapblocksize_iostart(int index, struct sd_lun *un,
879 static void sd_checksum_iostart(int index, struct sd_lun *un, struct buf *bp);
880 static void sd_checksum_uscsi_iostart(int index, struct sd_lun *un,
882 static void sd_pm_iostart(int index, struct sd_lun *un, struct buf *bp);
883 static void sd_core_iostart(int index, struct sd_lun *un, struct buf *bp);
888 static void sd_buf_iodone(int index, struct sd_lun *un, struct buf *bp);
889 static void sd_uscsi_iodone(int index, struct sd_lun *un, struct buf *bp);
890 static void sd_mapblockaddr_iodone(int index, struct sd_lun *un,
892 static void sd_mapblocksize_iodone(int index, struct sd_lun *un,
894 static void sd_checksum_iodone(int index, struct sd_lun *un, struct buf *bp);
895 static void sd_checksum_uscsi_iodone(int index, struct sd_lun *un,
897 static void sd_pm_iodone(int index, struct sd_lun *un, struct buf *bp);
905 static int sd_setup_rw_pkt(struct sd_lun *un, struct scsi_pkt **pktpp,
909 static int sd_setup_next_rw_pkt(struct sd_lun *un, struct scsi_pkt *pktp,
919 static void sd_xbuf_init(struct sd_lun *un, struct buf *bp, struct sd_xbuf *xp,
922 static int sd_pm_entry(struct sd_lun *un);
923 static void sd_pm_exit(struct sd_lun *un);
930 static void sd_add_buf_to_waitq(struct sd_lun *un, struct buf *bp);
932 static void sd_start_cmds(struct sd_lun *un, struct buf *immed_bp);
944 static void sd_print_transport_rejected_message(struct sd_lun *un,
946 static void sd_print_incomplete_msg(struct sd_lun *un, struct buf *bp,
948 static void sd_print_sense_failed_msg(struct sd_lun *un, struct buf *bp,
950 static void sd_print_cmd_incomplete_msg(struct sd_lun *un, struct buf *bp,
953 static void sd_retry_command(struct sd_lun *un, struct buf *bp,
955 void (*user_funcp)(struct sd_lun *un, struct buf *bp, void *argp, int c),
959 static void sd_set_retry_bp(struct sd_lun *un, struct buf *bp,
962 static void sd_send_request_sense_command(struct sd_lun *un, struct buf *bp,
966 static void sd_return_failed_command(struct sd_lun *un, struct buf *bp,
968 static void sd_return_failed_command_no_restart(struct sd_lun *un,
970 static void sd_return_command(struct sd_lun *un, struct buf *bp);
971 static void sd_sync_with_callback(struct sd_lun *un);
974 static void sd_mark_rqs_busy(struct sd_lun *un, struct buf *bp);
975 static struct buf *sd_mark_rqs_idle(struct sd_lun *un, struct sd_xbuf *xp);
977 static void sd_reduce_throttle(struct sd_lun *un, int throttle_type);
980 static void sd_init_cdb_limits(struct sd_lun *un);
982 static void sd_pkt_status_good(struct sd_lun *un, struct buf *bp,
988 static void sd_pkt_status_check_condition(struct sd_lun *un, struct buf *bp,
990 static void sd_pkt_status_busy(struct sd_lun *un, struct buf *bp,
992 static void sd_pkt_status_reservation_conflict(struct sd_lun *un,
994 static void sd_pkt_status_qfull(struct sd_lun *un, struct buf *bp,
997 static void sd_handle_request_sense(struct sd_lun *un, struct buf *bp,
999 static void sd_handle_auto_request_sense(struct sd_lun *un, struct buf *bp,
1001 static int sd_validate_sense_data(struct sd_lun *un, struct buf *bp,
1003 static void sd_decode_sense(struct sd_lun *un, struct buf *bp,
1006 static void sd_print_sense_msg(struct sd_lun *un, struct buf *bp,
1009 static void sd_sense_key_no_sense(struct sd_lun *un, struct buf *bp,
1011 static void sd_sense_key_recoverable_error(struct sd_lun *un,
1014 static void sd_sense_key_not_ready(struct sd_lun *un,
1017 static void sd_sense_key_medium_or_hardware_error(struct sd_lun *un,
1020 static void sd_sense_key_illegal_request(struct sd_lun *un, struct buf *bp,
1022 static void sd_sense_key_unit_attention(struct sd_lun *un,
1025 static void sd_sense_key_fail_command(struct sd_lun *un, struct buf *bp,
1027 static void sd_sense_key_blank_check(struct sd_lun *un, struct buf *bp,
1029 static void sd_sense_key_aborted_command(struct sd_lun *un, struct buf *bp,
1031 static void sd_sense_key_default(struct sd_lun *un,
1035 static void sd_print_retry_msg(struct sd_lun *un, struct buf *bp,
1038 static void sd_pkt_reason_cmd_incomplete(struct sd_lun *un, struct buf *bp,
1040 static void sd_pkt_reason_cmd_tran_err(struct sd_lun *un, struct buf *bp,
1042 static void sd_pkt_reason_cmd_reset(struct sd_lun *un, struct buf *bp,
1044 static void sd_pkt_reason_cmd_aborted(struct sd_lun *un, struct buf *bp,
1046 static void sd_pkt_reason_cmd_timeout(struct sd_lun *un, struct buf *bp,
1048 static void sd_pkt_reason_cmd_unx_bus_free(struct sd_lun *un, struct buf *bp,
1050 static void sd_pkt_reason_cmd_tag_reject(struct sd_lun *un, struct buf *bp,
1052 static void sd_pkt_reason_default(struct sd_lun *un, struct buf *bp,
1055 static void sd_reset_target(struct sd_lun *un, struct scsi_pkt *pktp);
1063 static void sd_log_dev_status_event(struct sd_lun *un, char *esc, int km_flag);
1064 static void sd_log_lun_expansion_event(struct sd_lun *un, int km_flag);
1065 static void sd_log_eject_request_event(struct sd_lun *un, int km_flag);
1068 static int sd_handle_mchange(struct sd_lun *un);
1083 static int sd_send_scsi_SYNCHRONIZE_CACHE(struct sd_lun *un,
1114 static int sd_alloc_rqs(struct scsi_device *devp, struct sd_lun *un);
1115 static void sd_free_rqs(struct sd_lun *un);
1117 static void sd_dump_memory(struct sd_lun *un, uint_t comp, char *title,
1119 static void sd_panic_for_res_conflict(struct sd_lun *un);
1134 static void sd_mhd_watch_incomplete(struct sd_lun *un, struct scsi_pkt *pkt);
1142 static int sd_persistent_reservation_in_read_keys(struct sd_lun *un,
1144 static int sd_persistent_reservation_in_read_resv(struct sd_lun *un,
1173 static void sr_ejected(register struct sd_lun *un);
1175 static opaque_t sd_watch_request_submit(struct sd_lun *un);
1188 static int sd_wm_cache_constructor(void *wm, void *un, int flags);
1189 static void sd_wm_cache_destructor(void *wm, void *un);
1190 static struct sd_w_map *sd_range_lock(struct sd_lun *un, daddr_t startb,
1192 static struct sd_w_map *sd_get_range(struct sd_lun *un, daddr_t startb,
1194 static void sd_free_inlist_wmap(struct sd_lun *un, struct sd_w_map *wmp);
1195 static void sd_range_unlock(struct sd_lun *un, struct sd_w_map *wm);
1198 sddump_do_read_of_rmw(struct sd_lun *un, uint64_t blkno, uint64_t nblk,
1205 static void sd_failfast_flushq(struct sd_lun *un);
1211 static int sd_setup_next_xfer(struct sd_lun *un, struct buf *bp,
1265 static void sd_faultinjection_ioctl(int cmd, intptr_t arg, struct sd_lun *un);
1267 static void sd_injection_log(char *buf, struct sd_lun *un);
1371 typedef void (*sd_chain_t)(int index, struct sd_lun *un, struct buf *bp);
1927 #define SD_BEGIN_IOSTART(index, un, bp) \ argument
1928 ((*(sd_iostart_chain[index]))(index, un, bp))
1930 #define SD_BEGIN_IODONE(index, un, bp) \ argument
1931 ((*(sd_iodone_chain[index]))(index, un, bp))
1933 #define SD_NEXT_IOSTART(index, un, bp) \ argument
1934 ((*(sd_iostart_chain[(index) + 1]))((index) + 1, un, bp))
1936 #define SD_NEXT_IODONE(index, un, bp) \ argument
1937 ((*(sd_iodone_chain[(index) - 1]))((index) - 1, un, bp))
2088 sd_log_err(uint_t comp, struct sd_lun *un, const char *fmt, ...) in sd_log_err() argument
2093 ASSERT(un != NULL); in sd_log_err()
2094 dev = SD_DEVINFO(un); in sd_log_err()
2103 ((sd_debug_un == NULL) || (sd_debug_un == un))) { in sd_log_err()
2113 if (un->sd_injection_mask & comp) { in sd_log_err()
2118 sd_injection_log(sd_log_buf, un); in sd_log_err()
2137 sd_log_info(uint_t component, struct sd_lun *un, const char *fmt, ...) in sd_log_info() argument
2142 ASSERT(un != NULL); in sd_log_info()
2143 dev = SD_DEVINFO(un); in sd_log_info()
2153 ((sd_debug_un == NULL) || (sd_debug_un == un))) { in sd_log_info()
2163 if (un->sd_injection_mask & component) { in sd_log_info()
2168 sd_injection_log(sd_log_buf, un); in sd_log_info()
2187 sd_log_trace(uint_t component, struct sd_lun *un, const char *fmt, ...) in sd_log_trace() argument
2192 ASSERT(un != NULL); in sd_log_trace()
2193 dev = SD_DEVINFO(un); in sd_log_trace()
2203 ((sd_debug_un == NULL) || (sd_debug_un == un))) { in sd_log_trace()
2213 if (un->sd_injection_mask & component) { in sd_log_trace()
2218 sd_injection_log(sd_log_buf, un); in sd_log_trace()
2344 struct sd_lun *un; in sdinfo() local
2353 if ((un = ddi_get_soft_state(sd_state, instance)) == NULL) { in sdinfo()
2356 *result = (void *) SD_DEVINFO(un); in sdinfo()
2397 struct sd_lun *un; in sd_prop_op() local
2399 if ((un = ddi_get_soft_state(sd_state, ddi_get_instance(dip))) == NULL) in sd_prop_op()
2403 return (cmlb_prop_op(un->un_cmlbhandle, in sd_prop_op()
2733 struct sd_lun *un; in sd_spin_up_unit() local
2736 un = ssc->ssc_un; in sd_spin_up_unit()
2737 ASSERT(un != NULL); in sd_spin_up_unit()
2782 bcopy(bufaddr, SD_INQUIRY(un), SUN_INQSIZE); in sd_spin_up_unit()
2823 struct sd_lun *un; in sd_enable_descr_sense() local
2826 un = ssc->ssc_un; in sd_enable_descr_sense()
2827 ASSERT(un != NULL); in sd_enable_descr_sense()
2840 SD_ERROR(SD_LOG_COMMON, un, in sd_enable_descr_sense()
2864 SD_ERROR(SD_LOG_COMMON, un, in sd_enable_descr_sense()
2888 SD_INFO(SD_LOG_COMMON, un, in sd_enable_descr_sense()
2910 struct sd_lun *un = arg; in sd_reenable_dsense_task() local
2913 ASSERT(un != NULL); in sd_reenable_dsense_task()
2915 ssc = sd_ssc_init(un); in sd_reenable_dsense_task()
2948 struct sd_lun *un; in sd_set_mmc_caps() local
2951 un = ssc->ssc_un; in sd_set_mmc_caps()
2952 ASSERT(un != NULL); in sd_set_mmc_caps()
2959 un->un_f_mmc_cap = FALSE; in sd_set_mmc_caps()
2960 un->un_f_dvdram_writable_device = FALSE; in sd_set_mmc_caps()
2961 un->un_f_cfg_cdda = FALSE; in sd_set_mmc_caps()
2978 un->un_f_mmc_cap = TRUE; in sd_set_mmc_caps()
2981 if (un->un_f_mmc_gesn_polling) { in sd_set_mmc_caps()
2991 un->un_f_mmc_gesn_polling = FALSE; in sd_set_mmc_caps()
2992 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_set_mmc_caps()
3014 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, in sd_set_mmc_caps()
3024 un->un_f_cfg_cdda = (sense_page[5] & 0x01) ? TRUE : FALSE; in sd_set_mmc_caps()
3027 un->un_f_dvdram_writable_device = (sense_page[3] & 0x20) ? TRUE : FALSE; in sd_set_mmc_caps()
3028 if (un->un_f_dvdram_writable_device == TRUE) { in sd_set_mmc_caps()
3081 un->un_f_dvdram_writable_device = TRUE; in sd_set_mmc_caps()
3122 struct sd_lun *un; in sd_check_for_writable_cd() local
3125 un = ssc->ssc_un; in sd_check_for_writable_cd()
3126 ASSERT(un != NULL); in sd_check_for_writable_cd()
3127 ASSERT(mutex_owned(SD_MUTEX(un))); in sd_check_for_writable_cd()
3133 un->un_f_mmc_writable_media = FALSE; in sd_check_for_writable_cd()
3134 mutex_exit(SD_MUTEX(un)); in sd_check_for_writable_cd()
3145 mutex_enter(SD_MUTEX(un)); in sd_check_for_writable_cd()
3151 un->un_f_mmc_writable_media = TRUE; in sd_check_for_writable_cd()
3164 mutex_exit(SD_MUTEX(un)); in sd_check_for_writable_cd()
3171 mutex_enter(SD_MUTEX(un)); in sd_check_for_writable_cd()
3186 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, in sd_check_for_writable_cd()
3210 mutex_exit(SD_MUTEX(un)); in sd_check_for_writable_cd()
3222 mutex_enter(SD_MUTEX(un)); in sd_check_for_writable_cd()
3234 mutex_enter(SD_MUTEX(un)); in sd_check_for_writable_cd()
3244 un->un_f_mmc_writable_media = TRUE; in sd_check_for_writable_cd()
3269 sd_read_unit_properties(struct sd_lun *un) in sd_read_unit_properties() argument
3278 ASSERT(un != NULL); in sd_read_unit_properties()
3279 if (sd_process_sdconf_file(un) == SD_FAILURE) { in sd_read_unit_properties()
3280 sd_process_sdconf_table(un); in sd_read_unit_properties()
3349 sd_process_sdconf_file(struct sd_lun *un) in sd_process_sdconf_file() argument
3363 ASSERT(un != NULL); in sd_process_sdconf_file()
3366 if (ddi_prop_lookup_string_array(DDI_DEV_T_ANY, SD_DEVINFO(un), in sd_process_sdconf_file()
3381 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, in sd_process_sdconf_file()
3395 if (sd_sdconf_id_match(un, vidptr, vidlen) != SD_SUCCESS) { in sd_process_sdconf_file()
3409 sd_nvpair_str_decode(un, dnlist_ptr); in sd_process_sdconf_file()
3423 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_process_sdconf_file()
3429 SD_DEVINFO(un), 0, dataname_ptr, &data_list, in sd_process_sdconf_file()
3431 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_process_sdconf_file()
3444 if (sd_chk_vers1_data(un, data_list[1], in sd_process_sdconf_file()
3447 sd_get_tunables_from_conf(un, in sd_process_sdconf_file()
3450 sd_set_vers1_properties(un, in sd_process_sdconf_file()
3457 scsi_log(SD_DEVINFO(un), sd_label, in sd_process_sdconf_file()
3487 sd_nvpair_str_decode(struct sd_lun *un, char *nvpair_str) in sd_nvpair_str_decode() argument
3499 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_nvpair_str_decode()
3503 sd_set_properties(un, name, value); in sd_nvpair_str_decode()
3519 sd_set_properties(struct sd_lun *un, char *name, char *value) in sd_set_properties() argument
3526 un->un_f_suppress_cache_flush = TRUE; in sd_set_properties()
3528 un->un_f_suppress_cache_flush = FALSE; in sd_set_properties()
3532 SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: " in sd_set_properties()
3534 un->un_f_suppress_cache_flush); in sd_set_properties()
3540 un->un_ctype = val; in sd_set_properties()
3544 SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: " in sd_set_properties()
3545 "ctype set to %d\n", un->un_ctype); in sd_set_properties()
3551 un->un_busy_timeout = drv_usectohz(val / 1000); in sd_set_properties()
3555 SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: " in sd_set_properties()
3556 "busy_timeout set to %d\n", un->un_busy_timeout); in sd_set_properties()
3562 un->un_f_disksort_disabled = FALSE; in sd_set_properties()
3564 un->un_f_disksort_disabled = TRUE; in sd_set_properties()
3568 SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: " in sd_set_properties()
3570 un->un_f_disksort_disabled); in sd_set_properties()
3576 un->un_f_power_condition_disabled = FALSE; in sd_set_properties()
3578 un->un_f_power_condition_disabled = TRUE; in sd_set_properties()
3582 SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: " in sd_set_properties()
3584 un->un_f_power_condition_disabled); in sd_set_properties()
3590 un->un_reserve_release_time = val; in sd_set_properties()
3594 SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: " in sd_set_properties()
3596 un->un_reserve_release_time); in sd_set_properties()
3602 un->un_f_lun_reset_enabled = TRUE; in sd_set_properties()
3604 un->un_f_lun_reset_enabled = FALSE; in sd_set_properties()
3608 SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: " in sd_set_properties()
3610 un->un_f_lun_reset_enabled); in sd_set_properties()
3616 un->un_busy_retry_count = val; in sd_set_properties()
3620 SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: " in sd_set_properties()
3621 "busy retry count set to %d\n", un->un_busy_retry_count); in sd_set_properties()
3627 un->un_retry_count = val; in sd_set_properties()
3631 SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: " in sd_set_properties()
3632 "timeout retry count set to %d\n", un->un_retry_count); in sd_set_properties()
3638 un->un_notready_retry_count = val; in sd_set_properties()
3642 SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: " in sd_set_properties()
3644 un->un_notready_retry_count); in sd_set_properties()
3650 un->un_reset_retry_count = val; in sd_set_properties()
3654 SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: " in sd_set_properties()
3656 un->un_reset_retry_count); in sd_set_properties()
3662 un->un_saved_throttle = un->un_throttle = val; in sd_set_properties()
3666 SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: " in sd_set_properties()
3667 "throttle set to %d\n", un->un_throttle); in sd_set_properties()
3672 un->un_min_throttle = val; in sd_set_properties()
3676 SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: " in sd_set_properties()
3677 "min throttle set to %d\n", un->un_min_throttle); in sd_set_properties()
3682 un->un_f_rmw_type = val; in sd_set_properties()
3686 SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: " in sd_set_properties()
3687 "RMW type set to %d\n", un->un_f_rmw_type); in sd_set_properties()
3692 ISP2(val) && val >= un->un_tgt_blocksize && in sd_set_properties()
3693 val >= un->un_sys_blocksize) { in sd_set_properties()
3694 un->un_phy_blocksize = val; in sd_set_properties()
3698 SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: " in sd_set_properties()
3699 "physical block size set to %d\n", un->un_phy_blocksize); in sd_set_properties()
3704 un->un_victim_retry_count = val; in sd_set_properties()
3708 SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: " in sd_set_properties()
3710 un->un_victim_retry_count); in sd_set_properties()
3718 if ((un->un_throttle < SD_LOWEST_VALID_THROTTLE) || in sd_set_properties()
3719 (un->un_min_throttle < SD_LOWEST_VALID_THROTTLE) || in sd_set_properties()
3720 (un->un_min_throttle > un->un_throttle)) { in sd_set_properties()
3721 un->un_saved_throttle = un->un_throttle = sd_max_throttle; in sd_set_properties()
3722 un->un_min_throttle = sd_min_throttle; in sd_set_properties()
3727 un->un_f_mmc_gesn_polling = TRUE; in sd_set_properties()
3729 un->un_f_mmc_gesn_polling = FALSE; in sd_set_properties()
3733 SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: " in sd_set_properties()
3735 un->un_f_mmc_gesn_polling); in sd_set_properties()
3741 SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: " in sd_set_properties()
3758 sd_get_tunables_from_conf(struct sd_lun *un, int flags, int *data_list, in sd_get_tunables_from_conf() argument
3778 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_get_tunables_from_conf()
3784 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_get_tunables_from_conf()
3790 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_get_tunables_from_conf()
3796 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_get_tunables_from_conf()
3802 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_get_tunables_from_conf()
3808 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_get_tunables_from_conf()
3814 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_get_tunables_from_conf()
3820 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_get_tunables_from_conf()
3826 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_get_tunables_from_conf()
3832 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_get_tunables_from_conf()
3839 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_get_tunables_from_conf()
3863 sd_process_sdconf_table(struct sd_lun *un) in sd_process_sdconf_table() argument
3869 ASSERT(un != NULL); in sd_process_sdconf_table()
3881 if (sd_sdconf_id_match(un, id, idlen) == SD_SUCCESS) { in sd_process_sdconf_table()
3882 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_process_sdconf_table()
3884 sd_set_vers1_properties(un, in sd_process_sdconf_table()
3916 sd_sdconf_id_match(struct sd_lun *un, char *id, int idlen) in sd_sdconf_id_match() argument
3921 ASSERT(un != NULL); in sd_sdconf_id_match()
3922 sd_inq = un->un_sd->sd_inq; in sd_sdconf_id_match()
3937 rval = sd_blank_cmp(un, id, idlen); in sd_sdconf_id_match()
3952 j = sizeof (SD_INQUIRY(un)->inq_pid) - in sd_sdconf_id_match()
3959 if (bcmp(&SD_INQUIRY(un)->inq_pid[i], in sd_sdconf_id_match()
3998 sd_blank_cmp(struct sd_lun *un, char *id, int idlen) in sd_blank_cmp() argument
4003 cnt = sizeof (SD_INQUIRY(un)->inq_vid) + in sd_blank_cmp()
4004 sizeof (SD_INQUIRY(un)->inq_pid); in sd_blank_cmp()
4006 ASSERT(un != NULL); in sd_blank_cmp()
4007 p2 = un->un_sd->sd_inq->inq_vid; in sd_blank_cmp()
4061 sd_chk_vers1_data(struct sd_lun *un, int flags, int *prop_list, in sd_chk_vers1_data() argument
4068 ASSERT(un != NULL); in sd_chk_vers1_data()
4072 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, in sd_chk_vers1_data()
4077 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, in sd_chk_vers1_data()
4085 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, in sd_chk_vers1_data()
4104 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, in sd_chk_vers1_data()
4108 scsi_log(SD_DEVINFO(un), sd_label, CE_CONT, "Size expected: " in sd_chk_vers1_data()
4134 sd_set_vers1_properties(struct sd_lun *un, int flags, sd_tunables *prop_list) in sd_set_vers1_properties() argument
4136 ASSERT(un != NULL); in sd_set_vers1_properties()
4144 un->un_f_opt_disable_cache = TRUE; in sd_set_vers1_properties()
4145 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_set_vers1_properties()
4151 un->un_f_cfg_playmsf_bcd = TRUE; in sd_set_vers1_properties()
4152 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_set_vers1_properties()
4156 un->un_f_cfg_readsub_bcd = TRUE; in sd_set_vers1_properties()
4157 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_set_vers1_properties()
4161 un->un_f_cfg_read_toc_trk_bcd = TRUE; in sd_set_vers1_properties()
4162 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_set_vers1_properties()
4166 un->un_f_cfg_read_toc_addr_bcd = TRUE; in sd_set_vers1_properties()
4167 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_set_vers1_properties()
4171 un->un_f_cfg_no_read_header = TRUE; in sd_set_vers1_properties()
4172 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_set_vers1_properties()
4176 un->un_f_cfg_read_cd_xd4 = TRUE; in sd_set_vers1_properties()
4177 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_set_vers1_properties()
4183 un->un_f_opt_fab_devid = TRUE; in sd_set_vers1_properties()
4184 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_set_vers1_properties()
4191 un->un_saved_throttle = un->un_throttle = in sd_set_vers1_properties()
4193 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_set_vers1_properties()
4202 un->un_notready_retry_count = in sd_set_vers1_properties()
4204 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_set_vers1_properties()
4206 " set to %d\n", un->un_notready_retry_count); in sd_set_vers1_properties()
4215 un->un_ctype = prop_list->sdt_ctype; in sd_set_vers1_properties()
4216 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_set_vers1_properties()
4221 un->un_ctype = prop_list->sdt_ctype; in sd_set_vers1_properties()
4222 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_set_vers1_properties()
4227 un->un_ctype = prop_list->sdt_ctype; in sd_set_vers1_properties()
4228 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_set_vers1_properties()
4233 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, in sd_set_vers1_properties()
4243 un->un_busy_retry_count = in sd_set_vers1_properties()
4245 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_set_vers1_properties()
4248 un->un_busy_retry_count); in sd_set_vers1_properties()
4254 un->un_reset_retry_count = in sd_set_vers1_properties()
4256 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_set_vers1_properties()
4259 un->un_reset_retry_count); in sd_set_vers1_properties()
4265 un->un_reserve_release_time = in sd_set_vers1_properties()
4267 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_set_vers1_properties()
4270 un->un_reserve_release_time); in sd_set_vers1_properties()
4279 un->un_f_cfg_tur_check = TRUE; in sd_set_vers1_properties()
4280 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_set_vers1_properties()
4285 un->un_min_throttle = prop_list->sdt_min_throttle; in sd_set_vers1_properties()
4286 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_set_vers1_properties()
4288 un->un_min_throttle); in sd_set_vers1_properties()
4292 un->un_f_disksort_disabled = in sd_set_vers1_properties()
4295 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_set_vers1_properties()
4302 un->un_f_lun_reset_enabled = in sd_set_vers1_properties()
4305 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_set_vers1_properties()
4312 un->un_f_suppress_cache_flush = in sd_set_vers1_properties()
4315 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_set_vers1_properties()
4322 un->un_f_power_condition_disabled = in sd_set_vers1_properties()
4325 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_set_vers1_properties()
4335 if ((un->un_throttle < SD_LOWEST_VALID_THROTTLE) || in sd_set_vers1_properties()
4336 (un->un_min_throttle < SD_LOWEST_VALID_THROTTLE) || in sd_set_vers1_properties()
4337 (un->un_min_throttle > un->un_throttle)) { in sd_set_vers1_properties()
4338 un->un_saved_throttle = un->un_throttle = sd_max_throttle; in sd_set_vers1_properties()
4339 un->un_min_throttle = sd_min_throttle; in sd_set_vers1_properties()
4374 sd_get_physical_geometry(struct sd_lun *un, cmlb_geom_t *pgeom_p, in sd_get_physical_geometry() argument
4397 ASSERT(un != NULL); in sd_get_physical_geometry()
4400 if (ISCD(un)) { in sd_get_physical_geometry()
4403 lbasize = un->un_sys_blocksize; in sd_get_physical_geometry()
4423 if (ISCD(un) || in sd_get_physical_geometry()
4424 un->un_interconnect_type == SD_INTERCONNECT_SATA || in sd_get_physical_geometry()
4425 (un->un_ctype == CTYPE_CCS && SD_INQUIRY(un)->inq_ansi >= 5)) in sd_get_physical_geometry()
4428 cdbsize = (un->un_f_cfg_is_atapi == TRUE) ? CDB_GROUP2 : CDB_GROUP0; in sd_get_physical_geometry()
4434 ssc = sd_ssc_init(un); in sd_get_physical_geometry()
4438 SD_ERROR(SD_LOG_COMMON, un, in sd_get_physical_geometry()
4449 if (un->un_f_cfg_is_atapi == TRUE) { in sd_get_physical_geometry()
4489 sector_size = un->un_sys_blocksize; in sd_get_physical_geometry()
4491 sector_size &= ~(un->un_sys_blocksize - 1); in sd_get_physical_geometry()
4497 SD_INFO(SD_LOG_COMMON, un, in sd_get_physical_geometry()
4499 SD_INFO(SD_LOG_COMMON, un, in sd_get_physical_geometry()
4502 SD_INFO(SD_LOG_COMMON, un, in sd_get_physical_geometry()
4516 SD_ERROR(SD_LOG_COMMON, un, in sd_get_physical_geometry()
4527 if (un->un_f_cfg_is_atapi == TRUE) { in sd_get_physical_geometry()
4566 SD_INFO(SD_LOG_COMMON, un, in sd_get_physical_geometry()
4568 SD_INFO(SD_LOG_COMMON, un, in sd_get_physical_geometry()
4570 SD_INFO(SD_LOG_COMMON, un, in sd_get_physical_geometry()
4572 SD_INFO(SD_LOG_COMMON, un, " pgeom_p: %p; read cap: %d\n", in sd_get_physical_geometry()
4582 SD_INFO(SD_LOG_COMMON, un, in sd_get_physical_geometry()
4602 SD_INFO(SD_LOG_COMMON, un, in sd_get_physical_geometry()
4604 SD_INFO(SD_LOG_COMMON, un, in sd_get_physical_geometry()
4607 SD_INFO(SD_LOG_COMMON, un, in sd_get_physical_geometry()
4610 SD_INFO(SD_LOG_COMMON, un, in sd_get_physical_geometry()
4612 SD_INFO(SD_LOG_COMMON, un, in sd_get_physical_geometry()
4616 SD_INFO(SD_LOG_COMMON, un, in sd_get_physical_geometry()
4670 sd_get_virtual_geometry(struct sd_lun *un, cmlb_geom_t *lgeom_p, in sd_get_virtual_geometry() argument
4676 ASSERT(un != NULL); in sd_get_virtual_geometry()
4679 (void) scsi_ifsetcap(SD_ADDRESS(un), "sector-size", lbasize, 1); in sd_get_virtual_geometry()
4680 (void) scsi_ifsetcap(SD_ADDRESS(un), "total-sectors", capacity, 1); in sd_get_virtual_geometry()
4683 geombuf = (uint_t)scsi_ifgetcap(SD_ADDRESS(un), "geometry", 1); in sd_get_virtual_geometry()
4693 lgeom_p->g_secsize = un->un_sys_blocksize; in sd_get_virtual_geometry()
4718 SD_INFO(SD_LOG_COMMON, un, "sd_get_virtual_geometry: (cached)\n"); in sd_get_virtual_geometry()
4736 sd_update_block_info(struct sd_lun *un, uint32_t lbasize, uint64_t capacity) in sd_update_block_info() argument
4739 un->un_tgt_blocksize = lbasize; in sd_update_block_info()
4740 un->un_f_tgt_blocksize_is_valid = TRUE; in sd_update_block_info()
4741 if (!un->un_f_has_removable_media) { in sd_update_block_info()
4742 un->un_sys_blocksize = lbasize; in sd_update_block_info()
4747 un->un_blockcount = capacity; in sd_update_block_info()
4748 un->un_f_blockcount_is_valid = TRUE; in sd_update_block_info()
4753 if (un->un_errstats != NULL) { in sd_update_block_info()
4756 capacity *= un->un_sys_blocksize; in sd_update_block_info()
4757 stp = (struct sd_errstats *)un->un_errstats->ks_data; in sd_update_block_info()
4769 sd_parse_blk_limits_vpd(struct sd_lun *un, uchar_t *vpd_pg) in sd_parse_blk_limits_vpd() argument
4771 sd_blk_limits_t *lim = &un->un_blk_lim; in sd_parse_blk_limits_vpd()
4829 struct sd_lun *un = ssc->ssc_un; in sd_setup_blk_limits() local
4834 if (un->un_vpd_page_mask & SD_VPD_BLK_LIMITS_PG) { in sd_setup_blk_limits()
4876 struct sd_lun *un; in sd_register_devid() local
4879 un = ssc->ssc_un; in sd_register_devid()
4880 ASSERT(un != NULL); in sd_register_devid()
4881 ASSERT(mutex_owned(SD_MUTEX(un))); in sd_register_devid()
4882 ASSERT((SD_DEVINFO(un)) == devi); in sd_register_devid()
4896 if (un->un_vpd_page_mask & SD_VPD_UNIT_SERIAL_PG) { in sd_register_devid()
4898 mutex_exit(SD_MUTEX(un)); in sd_register_devid()
4910 DDI_DEV_T_NONE, SD_DEVINFO(un), in sd_register_devid()
4933 SD_DEVINFO(un), in sd_register_devid()
4938 mutex_enter(SD_MUTEX(un)); in sd_register_devid()
4942 if (un->un_vpd_page_mask & SD_VPD_DEVID_WWN_PG) { in sd_register_devid()
4943 mutex_exit(SD_MUTEX(un)); in sd_register_devid()
4955 mutex_enter(SD_MUTEX(un)); in sd_register_devid()
4968 if (ddi_devid_get(SD_DEVINFO(un), &un->un_devid) == DDI_SUCCESS) { in sd_register_devid()
4969 ASSERT(un->un_devid); in sd_register_devid()
4970 un->un_f_devid_transport_defined = TRUE; in sd_register_devid()
4981 if (un->un_f_opt_fab_devid == TRUE) { in sd_register_devid()
4997 if (un->un_devid != NULL) { in sd_register_devid()
4998 (void) ddi_devid_register(SD_DEVINFO(un), in sd_register_devid()
4999 un->un_devid); in sd_register_devid()
5000 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_register_devid()
5008 (char *)ddi_driver_name(SD_DEVINFO(un)), in sd_register_devid()
5009 (uchar_t *)SD_INQUIRY(un), sizeof (*SD_INQUIRY(un)), in sd_register_devid()
5011 inq83_resid, &un->un_devid) == DDI_SUCCESS) { in sd_register_devid()
5014 (void) ddi_devid_register(SD_DEVINFO(un), un->un_devid); in sd_register_devid()
5034 un->un_f_opt_fab_devid = TRUE; in sd_register_devid()
5037 if (un->un_devid != NULL) { in sd_register_devid()
5038 (void) ddi_devid_register(SD_DEVINFO(un), in sd_register_devid()
5039 un->un_devid); in sd_register_devid()
5040 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_register_devid()
5085 struct sd_lun *un; in sd_get_devid() local
5088 un = ssc->ssc_un; in sd_get_devid()
5089 ASSERT(un != NULL); in sd_get_devid()
5090 ASSERT(mutex_owned(SD_MUTEX(un))); in sd_get_devid()
5092 SD_TRACE(SD_LOG_ATTACH_DETACH, un, "sd_get_devid: entry: un: 0x%p\n", in sd_get_devid()
5093 un); in sd_get_devid()
5095 if (un->un_devid != NULL) { in sd_get_devid()
5099 mutex_exit(SD_MUTEX(un)); in sd_get_devid()
5100 if (cmlb_get_devid_block(un->un_cmlbhandle, &blk, in sd_get_devid()
5102 mutex_enter(SD_MUTEX(un)); in sd_get_devid()
5112 mutex_enter(SD_MUTEX(un)); in sd_get_devid()
5113 buffer_size = SD_REQBYTES2TGTBYTES(un, sizeof (struct dk_devid)); in sd_get_devid()
5114 mutex_exit(SD_MUTEX(un)); in sd_get_devid()
5157 mutex_enter(SD_MUTEX(un)); in sd_get_devid()
5159 un->un_devid = tmpid; in sd_get_devid()
5160 bcopy(&dkdevid->dkd_devid, un->un_devid, sz); in sd_get_devid()
5164 SD_TRACE(SD_LOG_ATTACH_DETACH, un, "sd_get_devid: exit: un:0x%p\n", un); in sd_get_devid()
5168 mutex_enter(SD_MUTEX(un)); in sd_get_devid()
5190 struct sd_lun *un; in sd_create_devid() local
5193 un = ssc->ssc_un; in sd_create_devid()
5194 ASSERT(un != NULL); in sd_create_devid()
5197 if (ddi_devid_init(SD_DEVINFO(un), DEVID_FAB, 0, NULL, &un->un_devid) in sd_create_devid()
5204 ddi_devid_free(un->un_devid); in sd_create_devid()
5205 un->un_devid = NULL; in sd_create_devid()
5208 return (un->un_devid); in sd_create_devid()
5235 struct sd_lun *un; in sd_write_deviceid() local
5238 un = ssc->ssc_un; in sd_write_deviceid()
5239 ASSERT(un != NULL); in sd_write_deviceid()
5240 ASSERT(mutex_owned(SD_MUTEX(un))); in sd_write_deviceid()
5242 mutex_exit(SD_MUTEX(un)); in sd_write_deviceid()
5243 if (cmlb_get_devid_block(un->un_cmlbhandle, &blk, in sd_write_deviceid()
5245 mutex_enter(SD_MUTEX(un)); in sd_write_deviceid()
5251 buf = kmem_zalloc(un->un_sys_blocksize, KM_SLEEP); in sd_write_deviceid()
5259 mutex_enter(SD_MUTEX(un)); in sd_write_deviceid()
5260 bcopy(un->un_devid, &dkdevid->dkd_devid, in sd_write_deviceid()
5261 ddi_devid_sizeof(un->un_devid)); in sd_write_deviceid()
5262 mutex_exit(SD_MUTEX(un)); in sd_write_deviceid()
5276 status = sd_send_scsi_WRITE(ssc, buf, un->un_sys_blocksize, blk, in sd_write_deviceid()
5281 kmem_free(buf, un->un_sys_blocksize); in sd_write_deviceid()
5283 mutex_enter(SD_MUTEX(un)); in sd_write_deviceid()
5314 struct sd_lun *un; in sd_check_vpd_page_support() local
5317 un = ssc->ssc_un; in sd_check_vpd_page_support()
5318 ASSERT(un != NULL); in sd_check_vpd_page_support()
5319 ASSERT(mutex_owned(SD_MUTEX(un))); in sd_check_vpd_page_support()
5321 mutex_exit(SD_MUTEX(un)); in sd_check_vpd_page_support()
5335 mutex_enter(SD_MUTEX(un)); in sd_check_vpd_page_support()
5361 un->un_vpd_page_mask |= SD_VPD_SUPPORTED_PG; in sd_check_vpd_page_support()
5364 un->un_vpd_page_mask |= SD_VPD_UNIT_SERIAL_PG; in sd_check_vpd_page_support()
5367 un->un_vpd_page_mask |= SD_VPD_OPERATING_PG; in sd_check_vpd_page_support()
5370 un->un_vpd_page_mask |= SD_VPD_ASCII_OP_PG; in sd_check_vpd_page_support()
5373 un->un_vpd_page_mask |= SD_VPD_DEVID_WWN_PG; in sd_check_vpd_page_support()
5376 un->un_vpd_page_mask |= SD_VPD_EXTENDED_DATA_PG; in sd_check_vpd_page_support()
5379 un->un_vpd_page_mask |= SD_VPD_BLK_LIMITS_PG; in sd_check_vpd_page_support()
5382 un->un_vpd_page_mask |= SD_VPD_DEV_CHARACTER_PG; in sd_check_vpd_page_support()
5391 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_check_vpd_page_support()
5416 struct sd_lun *un; in sd_setup_pm() local
5419 un = ssc->ssc_un; in sd_setup_pm()
5420 ASSERT(un != NULL); in sd_setup_pm()
5428 ASSERT(!mutex_owned(SD_MUTEX(un))); in sd_setup_pm()
5446 if (un->un_f_pm_supported) { in sd_setup_pm()
5454 un->un_f_start_stop_supported = TRUE; in sd_setup_pm()
5456 if (un->un_f_power_condition_supported) { in sd_setup_pm()
5461 un->un_f_power_condition_supported = FALSE; in sd_setup_pm()
5464 if (!un->un_f_power_condition_supported) { in sd_setup_pm()
5470 un->un_f_start_stop_supported = FALSE; in sd_setup_pm()
5477 un->un_f_pm_is_enabled = TRUE; in sd_setup_pm()
5478 (void) sd_create_pm_components(devi, un); in sd_setup_pm()
5483 if (un->un_f_log_sense_supported) { in sd_setup_pm()
5488 un->un_start_stop_cycle_page = in sd_setup_pm()
5498 un->un_f_log_sense_supported = FALSE; in sd_setup_pm()
5499 un->un_f_pm_log_sense_smart = FALSE; in sd_setup_pm()
5510 if (!un->un_f_log_sense_supported) { in sd_setup_pm()
5511 un->un_power_level = SD_SPINDLE_ON; in sd_setup_pm()
5512 un->un_f_pm_is_enabled = FALSE; in sd_setup_pm()
5537 un->un_power_level = SD_SPINDLE_ON; in sd_setup_pm()
5538 un->un_f_pm_is_enabled = FALSE; in sd_setup_pm()
5551 un->un_start_stop_cycle_page = START_STOP_CYCLE_VU_PAGE; in sd_setup_pm()
5552 un->un_f_pm_is_enabled = TRUE; in sd_setup_pm()
5558 un->un_power_level = SD_SPINDLE_ON; in sd_setup_pm()
5559 un->un_f_pm_is_enabled = FALSE; in sd_setup_pm()
5565 un->un_start_stop_cycle_page = START_STOP_CYCLE_PAGE; in sd_setup_pm()
5566 un->un_f_pm_is_enabled = TRUE; in sd_setup_pm()
5570 if (un->un_f_pm_is_enabled == TRUE) { in sd_setup_pm()
5575 log_page_size, un->un_start_stop_cycle_page, in sd_setup_pm()
5595 (void) sd_create_pm_components(devi, un); in sd_setup_pm()
5597 un->un_power_level = SD_SPINDLE_ON; in sd_setup_pm()
5598 un->un_f_pm_is_enabled = FALSE; in sd_setup_pm()
5615 sd_create_pm_components(dev_info_t *devi, struct sd_lun *un) in sd_create_pm_components() argument
5617 ASSERT(!mutex_owned(SD_MUTEX(un))); in sd_create_pm_components()
5619 if (un->un_f_power_condition_supported) { in sd_create_pm_components()
5623 un->un_power_level = SD_SPINDLE_ACTIVE; in sd_create_pm_components()
5624 un->un_f_pm_is_enabled = FALSE; in sd_create_pm_components()
5631 un->un_power_level = SD_SPINDLE_ON; in sd_create_pm_components()
5632 un->un_f_pm_is_enabled = FALSE; in sd_create_pm_components()
5648 if (un->un_f_attach_spinup && (pm_raise_power(SD_DEVINFO(un), 0, in sd_create_pm_components()
5649 SD_PM_STATE_ACTIVE(un)) == DDI_SUCCESS)) { in sd_create_pm_components()
5650 mutex_enter(SD_MUTEX(un)); in sd_create_pm_components()
5651 un->un_power_level = SD_PM_STATE_ACTIVE(un); in sd_create_pm_components()
5652 mutex_enter(&un->un_pm_mutex); in sd_create_pm_components()
5654 un->un_pm_count = 0; in sd_create_pm_components()
5656 mutex_enter(SD_MUTEX(un)); in sd_create_pm_components()
5657 un->un_power_level = SD_PM_STATE_STOPPED(un); in sd_create_pm_components()
5658 mutex_enter(&un->un_pm_mutex); in sd_create_pm_components()
5660 un->un_pm_count = -1; in sd_create_pm_components()
5662 mutex_exit(&un->un_pm_mutex); in sd_create_pm_components()
5663 mutex_exit(SD_MUTEX(un)); in sd_create_pm_components()
5684 struct sd_lun *un; in sd_ddi_suspend() local
5687 un = ddi_get_soft_state(sd_state, ddi_get_instance(devi)); in sd_ddi_suspend()
5688 if (un == NULL) { in sd_ddi_suspend()
5692 SD_TRACE(SD_LOG_IO_PM, un, "sd_ddi_suspend: entry\n"); in sd_ddi_suspend()
5694 mutex_enter(SD_MUTEX(un)); in sd_ddi_suspend()
5697 if (un->un_state == SD_STATE_SUSPENDED) { in sd_ddi_suspend()
5698 mutex_exit(SD_MUTEX(un)); in sd_ddi_suspend()
5699 SD_TRACE(SD_LOG_IO_PM, un, "sd_ddi_suspend: " in sd_ddi_suspend()
5705 if (un->un_resvd_status & in sd_ddi_suspend()
5707 mutex_exit(SD_MUTEX(un)); in sd_ddi_suspend()
5708 SD_TRACE(SD_LOG_IO_PM, un, "sd_ddi_suspend: " in sd_ddi_suspend()
5717 if ((un->un_state == SD_STATE_RWAIT) || in sd_ddi_suspend()
5718 (un->un_state == SD_STATE_PM_CHANGING)) { in sd_ddi_suspend()
5719 mutex_exit(SD_MUTEX(un)); in sd_ddi_suspend()
5720 SD_TRACE(SD_LOG_IO_PM, un, "sd_ddi_suspend: " in sd_ddi_suspend()
5726 un->un_save_state = un->un_last_state; in sd_ddi_suspend()
5727 New_state(un, SD_STATE_SUSPENDED); in sd_ddi_suspend()
5744 while (un->un_ncmds_in_transport != 0) { in sd_ddi_suspend()
5748 if (cv_timedwait(&un->un_disk_busy_cv, SD_MUTEX(un), in sd_ddi_suspend()
5754 Restore_state(un); in sd_ddi_suspend()
5755 un->un_last_state = un->un_save_state; in sd_ddi_suspend()
5757 cv_broadcast(&un->un_suspend_cv); in sd_ddi_suspend()
5758 mutex_exit(SD_MUTEX(un)); in sd_ddi_suspend()
5759 SD_ERROR(SD_LOG_IO_PM, un, in sd_ddi_suspend()
5761 SD_TRACE(SD_LOG_IO_PM, un, "sd_ddi_suspend: exiting\n"); in sd_ddi_suspend()
5770 if (SD_OK_TO_SUSPEND_SCSI_WATCHER(un)) { in sd_ddi_suspend()
5771 opaque_t temp_token = un->un_swr_token; in sd_ddi_suspend()
5772 mutex_exit(SD_MUTEX(un)); in sd_ddi_suspend()
5774 mutex_enter(SD_MUTEX(un)); in sd_ddi_suspend()
5777 if (un->un_reset_throttle_timeid != NULL) { in sd_ddi_suspend()
5778 timeout_id_t temp_id = un->un_reset_throttle_timeid; in sd_ddi_suspend()
5779 un->un_reset_throttle_timeid = NULL; in sd_ddi_suspend()
5780 mutex_exit(SD_MUTEX(un)); in sd_ddi_suspend()
5782 mutex_enter(SD_MUTEX(un)); in sd_ddi_suspend()
5785 if (un->un_dcvb_timeid != NULL) { in sd_ddi_suspend()
5786 timeout_id_t temp_id = un->un_dcvb_timeid; in sd_ddi_suspend()
5787 un->un_dcvb_timeid = NULL; in sd_ddi_suspend()
5788 mutex_exit(SD_MUTEX(un)); in sd_ddi_suspend()
5790 mutex_enter(SD_MUTEX(un)); in sd_ddi_suspend()
5793 mutex_enter(&un->un_pm_mutex); in sd_ddi_suspend()
5794 if (un->un_pm_timeid != NULL) { in sd_ddi_suspend()
5795 timeout_id_t temp_id = un->un_pm_timeid; in sd_ddi_suspend()
5796 un->un_pm_timeid = NULL; in sd_ddi_suspend()
5797 mutex_exit(&un->un_pm_mutex); in sd_ddi_suspend()
5798 mutex_exit(SD_MUTEX(un)); in sd_ddi_suspend()
5800 mutex_enter(SD_MUTEX(un)); in sd_ddi_suspend()
5802 mutex_exit(&un->un_pm_mutex); in sd_ddi_suspend()
5805 if (un->un_rmw_msg_timeid != NULL) { in sd_ddi_suspend()
5806 timeout_id_t temp_id = un->un_rmw_msg_timeid; in sd_ddi_suspend()
5807 un->un_rmw_msg_timeid = NULL; in sd_ddi_suspend()
5808 mutex_exit(SD_MUTEX(un)); in sd_ddi_suspend()
5810 mutex_enter(SD_MUTEX(un)); in sd_ddi_suspend()
5813 if (un->un_retry_timeid != NULL) { in sd_ddi_suspend()
5814 timeout_id_t temp_id = un->un_retry_timeid; in sd_ddi_suspend()
5815 un->un_retry_timeid = NULL; in sd_ddi_suspend()
5816 mutex_exit(SD_MUTEX(un)); in sd_ddi_suspend()
5818 mutex_enter(SD_MUTEX(un)); in sd_ddi_suspend()
5820 if (un->un_retry_bp != NULL) { in sd_ddi_suspend()
5821 un->un_retry_bp->av_forw = un->un_waitq_headp; in sd_ddi_suspend()
5822 un->un_waitq_headp = un->un_retry_bp; in sd_ddi_suspend()
5823 if (un->un_waitq_tailp == NULL) { in sd_ddi_suspend()
5824 un->un_waitq_tailp = un->un_retry_bp; in sd_ddi_suspend()
5826 un->un_retry_bp = NULL; in sd_ddi_suspend()
5827 un->un_retry_statp = NULL; in sd_ddi_suspend()
5831 if (un->un_direct_priority_timeid != NULL) { in sd_ddi_suspend()
5832 timeout_id_t temp_id = un->un_direct_priority_timeid; in sd_ddi_suspend()
5833 un->un_direct_priority_timeid = NULL; in sd_ddi_suspend()
5834 mutex_exit(SD_MUTEX(un)); in sd_ddi_suspend()
5836 mutex_enter(SD_MUTEX(un)); in sd_ddi_suspend()
5839 if (un->un_f_is_fibre == TRUE) { in sd_ddi_suspend()
5843 if (un->un_insert_event != NULL) { in sd_ddi_suspend()
5844 mutex_exit(SD_MUTEX(un)); in sd_ddi_suspend()
5845 (void) ddi_remove_event_handler(un->un_insert_cb_id); in sd_ddi_suspend()
5846 mutex_enter(SD_MUTEX(un)); in sd_ddi_suspend()
5847 un->un_insert_event = NULL; in sd_ddi_suspend()
5850 if (un->un_remove_event != NULL) { in sd_ddi_suspend()
5851 mutex_exit(SD_MUTEX(un)); in sd_ddi_suspend()
5852 (void) ddi_remove_event_handler(un->un_remove_cb_id); in sd_ddi_suspend()
5853 mutex_enter(SD_MUTEX(un)); in sd_ddi_suspend()
5854 un->un_remove_event = NULL; in sd_ddi_suspend()
5858 mutex_exit(SD_MUTEX(un)); in sd_ddi_suspend()
5860 SD_TRACE(SD_LOG_IO_PM, un, "sd_ddi_suspend: exit\n"); in sd_ddi_suspend()
5880 struct sd_lun *un; in sd_ddi_resume() local
5882 un = ddi_get_soft_state(sd_state, ddi_get_instance(devi)); in sd_ddi_resume()
5883 if (un == NULL) { in sd_ddi_resume()
5887 SD_TRACE(SD_LOG_IO_PM, un, "sd_ddi_resume: entry\n"); in sd_ddi_resume()
5889 mutex_enter(SD_MUTEX(un)); in sd_ddi_resume()
5890 Restore_state(un); in sd_ddi_resume()
5896 un->un_last_state = un->un_save_state; in sd_ddi_resume()
5909 un->un_throttle = un->un_saved_throttle; in sd_ddi_resume()
5920 if (un->un_f_attach_spinup) { in sd_ddi_resume()
5921 mutex_exit(SD_MUTEX(un)); in sd_ddi_resume()
5922 (void) pm_raise_power(SD_DEVINFO(un), 0, in sd_ddi_resume()
5923 SD_PM_STATE_ACTIVE(un)); in sd_ddi_resume()
5924 mutex_enter(SD_MUTEX(un)); in sd_ddi_resume()
5931 cv_broadcast(&un->un_suspend_cv); in sd_ddi_resume()
5932 cv_broadcast(&un->un_state_cv); in sd_ddi_resume()
5935 if (SD_OK_TO_RESUME_SCSI_WATCHER(un)) { in sd_ddi_resume()
5936 scsi_watch_resume(un->un_swr_token); in sd_ddi_resume()
5950 ddi_xbuf_dispatch(un->un_xbuf_attr); in sd_ddi_resume()
5952 sd_start_cmds(un, NULL); in sd_ddi_resume()
5953 mutex_exit(SD_MUTEX(un)); in sd_ddi_resume()
5955 SD_TRACE(SD_LOG_IO_PM, un, "sd_ddi_resume: exit\n"); in sd_ddi_resume()
5977 sd_pm_state_change(struct sd_lun *un, int level, int flag) in sd_pm_state_change() argument
5979 ASSERT(un != NULL); in sd_pm_state_change()
5980 SD_TRACE(SD_LOG_POWER, un, "sd_pm_state_change: entry\n"); in sd_pm_state_change()
5982 ASSERT(!mutex_owned(SD_MUTEX(un))); in sd_pm_state_change()
5983 mutex_enter(SD_MUTEX(un)); in sd_pm_state_change()
5985 if (flag == SD_PM_STATE_ROLLBACK || SD_PM_IS_IO_CAPABLE(un, level)) { in sd_pm_state_change()
5986 un->un_power_level = level; in sd_pm_state_change()
5987 ASSERT(!mutex_owned(&un->un_pm_mutex)); in sd_pm_state_change()
5988 mutex_enter(&un->un_pm_mutex); in sd_pm_state_change()
5989 if (SD_DEVICE_IS_IN_LOW_POWER(un)) { in sd_pm_state_change()
5990 un->un_pm_count++; in sd_pm_state_change()
5991 ASSERT(un->un_pm_count == 0); in sd_pm_state_change()
5993 mutex_exit(&un->un_pm_mutex); in sd_pm_state_change()
5999 if ((un->un_f_pm_is_enabled == FALSE) || (un->un_resvd_status & in sd_pm_state_change()
6001 mutex_exit(SD_MUTEX(un)); in sd_pm_state_change()
6002 SD_TRACE(SD_LOG_POWER, un, in sd_pm_state_change()
6007 SD_INFO(SD_LOG_POWER, un, "sd_pm_state_change: " in sd_pm_state_change()
6008 "un_ncmds_in_driver=%ld\n", un->un_ncmds_in_driver); in sd_pm_state_change()
6015 if ((un->un_ncmds_in_driver == 0) && in sd_pm_state_change()
6016 (un->un_state != SD_STATE_RWAIT)) { in sd_pm_state_change()
6022 mutex_enter(&un->un_pm_mutex); in sd_pm_state_change()
6023 un->un_pm_count = -1; in sd_pm_state_change()
6024 mutex_exit(&un->un_pm_mutex); in sd_pm_state_change()
6025 un->un_power_level = level; in sd_pm_state_change()
6029 mutex_exit(SD_MUTEX(un)); in sd_pm_state_change()
6031 SD_TRACE(SD_LOG_POWER, un, "sd_pm_state_change: exit\n"); in sd_pm_state_change()
6059 struct sd_lun *un = arg; in sd_pm_idletimeout_handler() local
6065 mutex_enter(SD_MUTEX(un)); in sd_pm_idletimeout_handler()
6066 mutex_enter(&un->un_pm_mutex); in sd_pm_idletimeout_handler()
6068 if (un->un_pm_idle_timeid == NULL) { in sd_pm_idletimeout_handler()
6069 mutex_exit(&un->un_pm_mutex); in sd_pm_idletimeout_handler()
6070 mutex_exit(SD_MUTEX(un)); in sd_pm_idletimeout_handler()
6073 if (((gethrtime() - un->un_pm_idle_time) > idletime) && in sd_pm_idletimeout_handler()
6074 (un->un_ncmds_in_driver == 0) && (un->un_pm_count == 0)) { in sd_pm_idletimeout_handler()
6079 if (un->un_f_non_devbsize_supported) { in sd_pm_idletimeout_handler()
6080 un->un_buf_chain_type = SD_CHAIN_INFO_RMMEDIA; in sd_pm_idletimeout_handler()
6082 un->un_buf_chain_type = SD_CHAIN_INFO_DISK; in sd_pm_idletimeout_handler()
6084 un->un_uscsi_chain_type = SD_CHAIN_INFO_USCSI_CMD; in sd_pm_idletimeout_handler()
6086 SD_TRACE(SD_LOG_IO_PM, un, in sd_pm_idletimeout_handler()
6088 (void) pm_idle_component(SD_DEVINFO(un), 0); in sd_pm_idletimeout_handler()
6089 un->un_pm_idle_timeid = NULL; in sd_pm_idletimeout_handler()
6091 un->un_pm_idle_timeid = in sd_pm_idletimeout_handler()
6092 timeout(sd_pm_idletimeout_handler, un, in sd_pm_idletimeout_handler()
6095 mutex_exit(&un->un_pm_mutex); in sd_pm_idletimeout_handler()
6096 mutex_exit(SD_MUTEX(un)); in sd_pm_idletimeout_handler()
6111 struct sd_lun *un = arg; in sd_pm_timeout_handler() local
6113 (void) pm_idle_component(SD_DEVINFO(un), 0); in sd_pm_timeout_handler()
6114 mutex_enter(&un->un_pm_mutex); in sd_pm_timeout_handler()
6115 un->un_pm_timeid = NULL; in sd_pm_timeout_handler()
6116 mutex_exit(&un->un_pm_mutex); in sd_pm_timeout_handler()
6134 struct sd_lun *un; in sdpower() local
6151 if (((un = ddi_get_soft_state(sd_state, instance)) == NULL) || in sdpower()
6152 !SD_PM_IS_LEVEL_VALID(un, level) || component != 0) { in sdpower()
6156 ssc = sd_ssc_init(un); in sdpower()
6158 SD_TRACE(SD_LOG_IO_PM, un, "sdpower: entry, level = %d\n", level); in sdpower()
6160 mutex_enter(SD_MUTEX(un)); in sdpower()
6162 SD_INFO(SD_LOG_POWER, un, "sdpower: un_ncmds_in_driver = %ld\n", in sdpower()
6163 un->un_ncmds_in_driver); in sdpower()
6172 if ((!SD_PM_IS_IO_CAPABLE(un, level)) && in sdpower()
6173 (un->un_ncmds_in_driver != 0)) { in sdpower()
6174 mutex_exit(SD_MUTEX(un)); in sdpower()
6176 SD_TRACE(SD_LOG_IO_PM, un, in sdpower()
6190 if ((un->un_state == SD_STATE_OFFLINE) || in sdpower()
6191 (un->un_state == SD_STATE_SUSPENDED)) { in sdpower()
6192 mutex_exit(SD_MUTEX(un)); in sdpower()
6194 SD_TRACE(SD_LOG_IO_PM, un, in sdpower()
6206 state_before_pm = un->un_state; in sdpower()
6207 un->un_state = SD_STATE_PM_CHANGING; in sdpower()
6209 mutex_exit(SD_MUTEX(un)); in sdpower()
6216 if (SD_PM_STOP_MOTOR_NEEDED(un, level) && in sdpower()
6217 un->un_f_log_sense_supported) { in sdpower()
6225 mutex_enter(SD_MUTEX(un)); in sdpower()
6226 log_sense_page = un->un_start_stop_cycle_page; in sdpower()
6227 mutex_exit(SD_MUTEX(un)); in sdpower()
6246 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, in sdpower()
6257 mutex_enter(SD_MUTEX(un)); in sdpower()
6258 un->un_state = state_before_pm; in sdpower()
6259 cv_broadcast(&un->un_suspend_cv); in sdpower()
6260 mutex_exit(SD_MUTEX(un)); in sdpower()
6261 SD_TRACE(SD_LOG_IO_PM, un, in sdpower()
6279 if (un->un_f_pm_log_sense_smart) { in sdpower()
6280 sd_pm_tran_data.un.smart_count.allowed = maxcycles; in sdpower()
6281 sd_pm_tran_data.un.smart_count.consumed = ncycles; in sdpower()
6282 sd_pm_tran_data.un.smart_count.flag = 0; in sdpower()
6285 sd_pm_tran_data.un.scsi_cycles.lifemax = maxcycles; in sdpower()
6286 sd_pm_tran_data.un.scsi_cycles.ncycles = ncycles; in sdpower()
6288 sd_pm_tran_data.un.scsi_cycles.svc_date[i] = in sdpower()
6291 sd_pm_tran_data.un.scsi_cycles.flag = 0; in sdpower()
6334 mutex_enter(&un->un_pm_mutex); in sdpower()
6335 if (un->un_pm_timeid == NULL) { in sdpower()
6336 un->un_pm_timeid = in sdpower()
6338 un, intvlp * drv_usectohz(1000000)); in sdpower()
6339 mutex_exit(&un->un_pm_mutex); in sdpower()
6340 (void) pm_busy_component(SD_DEVINFO(un), 0); in sdpower()
6342 mutex_exit(&un->un_pm_mutex); in sdpower()
6349 mutex_enter(SD_MUTEX(un)); in sdpower()
6350 un->un_state = state_before_pm; in sdpower()
6351 cv_broadcast(&un->un_suspend_cv); in sdpower()
6352 mutex_exit(SD_MUTEX(un)); in sdpower()
6354 SD_TRACE(SD_LOG_IO_PM, un, "sdpower: exit, " in sdpower()
6364 mutex_enter(SD_MUTEX(un)); in sdpower()
6365 un->un_state = state_before_pm; in sdpower()
6366 cv_broadcast(&un->un_suspend_cv); in sdpower()
6367 mutex_exit(SD_MUTEX(un)); in sdpower()
6368 SD_TRACE(SD_LOG_IO_PM, un, in sdpower()
6375 if (!SD_PM_IS_IO_CAPABLE(un, level)) { in sdpower()
6380 mutex_enter(SD_MUTEX(un)); in sdpower()
6381 save_state = un->un_last_state; in sdpower()
6382 last_power_level = un->un_power_level; in sdpower()
6388 ASSERT(un->un_ncmds_in_driver == 0); in sdpower()
6389 mutex_exit(SD_MUTEX(un)); in sdpower()
6395 if ((rval = sd_pm_state_change(un, level, SD_PM_STATE_CHANGE)) in sdpower()
6402 mutex_enter(SD_MUTEX(un)); in sdpower()
6403 un->un_state = state_before_pm; in sdpower()
6404 un->un_power_level = last_power_level; in sdpower()
6405 cv_broadcast(&un->un_suspend_cv); in sdpower()
6406 mutex_exit(SD_MUTEX(un)); in sdpower()
6407 SD_TRACE(SD_LOG_IO_PM, un, in sdpower()
6427 if (SD_PM_IS_IO_CAPABLE(un, level)) { in sdpower()
6434 if (un->un_f_power_condition_supported) { in sdpower()
6437 SD_TRACE(SD_LOG_IO_PM, un, in sdpower()
6443 SD_TRACE(SD_LOG_IO_PM, un, "sdpower: sending \'%s\' unit\n", in sdpower()
6457 if ((sval == ENXIO) && un->un_f_has_removable_media) { in sdpower()
6470 if (!SD_PM_IS_IO_CAPABLE(un, level)) { in sdpower()
6480 (void) sd_pm_state_change(un, last_power_level, in sdpower()
6482 mutex_enter(SD_MUTEX(un)); in sdpower()
6483 un->un_last_state = save_state; in sdpower()
6484 mutex_exit(SD_MUTEX(un)); in sdpower()
6485 } else if (un->un_f_monitor_media_state) { in sdpower()
6494 mutex_enter(SD_MUTEX(un)); in sdpower()
6495 un->un_f_watcht_stopped = FALSE; in sdpower()
6496 if (un->un_swr_token != NULL) { in sdpower()
6497 opaque_t temp_token = un->un_swr_token; in sdpower()
6498 un->un_f_watcht_stopped = TRUE; in sdpower()
6499 un->un_swr_token = NULL; in sdpower()
6500 mutex_exit(SD_MUTEX(un)); in sdpower()
6504 mutex_exit(SD_MUTEX(un)); in sdpower()
6523 (void) sd_pm_state_change(un, level, in sdpower()
6530 if (un->un_f_monitor_media_state) { in sdpower()
6531 mutex_enter(SD_MUTEX(un)); in sdpower()
6532 if (un->un_f_watcht_stopped == TRUE) { in sdpower()
6535 un->un_f_watcht_stopped = FALSE; in sdpower()
6536 mutex_exit(SD_MUTEX(un)); in sdpower()
6538 sd_watch_request_submit(un); in sdpower()
6539 mutex_enter(SD_MUTEX(un)); in sdpower()
6540 un->un_swr_token = temp_token; in sdpower()
6542 mutex_exit(SD_MUTEX(un)); in sdpower()
6552 mutex_enter(SD_MUTEX(un)); in sdpower()
6553 un->un_state = state_before_pm; in sdpower()
6554 cv_broadcast(&un->un_suspend_cv); in sdpower()
6555 mutex_exit(SD_MUTEX(un)); in sdpower()
6557 SD_TRACE(SD_LOG_IO_PM, un, "sdpower: exit, status = 0x%x\n", rval); in sdpower()
6640 sd_sync_with_callback(struct sd_lun *un) in sd_sync_with_callback() argument
6642 ASSERT(un != NULL); in sd_sync_with_callback()
6644 mutex_enter(SD_MUTEX(un)); in sd_sync_with_callback()
6646 ASSERT(un->un_in_callback >= 0); in sd_sync_with_callback()
6648 while (un->un_in_callback > 0) { in sd_sync_with_callback()
6649 mutex_exit(SD_MUTEX(un)); in sd_sync_with_callback()
6651 mutex_enter(SD_MUTEX(un)); in sd_sync_with_callback()
6654 mutex_exit(SD_MUTEX(un)); in sd_sync_with_callback()
6677 struct sd_lun *un; in sd_unit_attach() local
6789 if ((un = ddi_get_soft_state(sd_state, instance)) == NULL) { in sd_unit_attach()
6803 un->un_sd = devp; in sd_unit_attach()
6804 devp->sd_private = (opaque_t)un; in sd_unit_attach()
6810 SD_TRACE(SD_LOG_ATTACH_DETACH, un, in sd_unit_attach()
6812 ddi_driver_name(devi), un, instance); in sd_unit_attach()
6823 un->un_node_type = DDI_NT_CD_CHAN; in sd_unit_attach()
6824 un->un_ctype = CTYPE_CDROM; in sd_unit_attach()
6827 un->un_node_type = DDI_NT_BLOCK_CHAN; in sd_unit_attach()
6828 un->un_ctype = CTYPE_ROD; in sd_unit_attach()
6831 un->un_node_type = DDI_NT_BLOCK_CHAN; in sd_unit_attach()
6832 un->un_ctype = CTYPE_CCS; in sd_unit_attach()
6849 un->un_f_is_fibre = TRUE; in sd_unit_attach()
6850 switch (scsi_ifgetcap(SD_ADDRESS(un), "interconnect-type", -1)) { in sd_unit_attach()
6852 un->un_interconnect_type = SD_INTERCONNECT_SSA; in sd_unit_attach()
6853 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_unit_attach()
6854 "sd_unit_attach: un:0x%p SD_INTERCONNECT_SSA\n", un); in sd_unit_attach()
6857 un->un_f_is_fibre = FALSE; in sd_unit_attach()
6858 un->un_interconnect_type = SD_INTERCONNECT_PARALLEL; in sd_unit_attach()
6859 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_unit_attach()
6860 "sd_unit_attach: un:0x%p SD_INTERCONNECT_PARALLEL\n", un); in sd_unit_attach()
6863 un->un_f_is_fibre = FALSE; in sd_unit_attach()
6864 un->un_interconnect_type = SD_INTERCONNECT_SAS; in sd_unit_attach()
6865 un->un_node_type = DDI_NT_BLOCK_SAS; in sd_unit_attach()
6866 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_unit_attach()
6867 "sd_unit_attach: un:0x%p SD_INTERCONNECT_SAS\n", un); in sd_unit_attach()
6870 un->un_f_is_fibre = FALSE; in sd_unit_attach()
6871 un->un_interconnect_type = SD_INTERCONNECT_SATA; in sd_unit_attach()
6872 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_unit_attach()
6873 "sd_unit_attach: un:0x%p SD_INTERCONNECT_SATA\n", un); in sd_unit_attach()
6876 un->un_interconnect_type = SD_INTERCONNECT_FIBRE; in sd_unit_attach()
6877 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_unit_attach()
6878 "sd_unit_attach: un:0x%p SD_INTERCONNECT_FIBRE\n", un); in sd_unit_attach()
6881 un->un_interconnect_type = SD_INTERCONNECT_FABRIC; in sd_unit_attach()
6882 un->un_node_type = DDI_NT_BLOCK_FABRIC; in sd_unit_attach()
6883 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_unit_attach()
6884 "sd_unit_attach: un:0x%p SD_INTERCONNECT_FABRIC\n", un); in sd_unit_attach()
6899 un->un_interconnect_type = SD_DEFAULT_INTERCONNECT_TYPE; in sd_unit_attach()
6900 if (!SD_IS_PARALLEL_SCSI(un)) { in sd_unit_attach()
6901 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_unit_attach()
6903 "INTERCONNECT_FIBRE\n", un); in sd_unit_attach()
6905 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_unit_attach()
6907 "INTERCONNECT_PARALLEL\n", un); in sd_unit_attach()
6908 un->un_f_is_fibre = FALSE; in sd_unit_attach()
6913 if (un->un_f_is_fibre == TRUE) { in sd_unit_attach()
6914 if (scsi_ifgetcap(SD_ADDRESS(un), "scsi-version", 1) == in sd_unit_attach()
6916 switch (un->un_interconnect_type) { in sd_unit_attach()
6919 un->un_node_type = DDI_NT_BLOCK_WWN; in sd_unit_attach()
6930 if (sd_alloc_rqs(devp, un) != DDI_SUCCESS) { in sd_unit_attach()
6945 un->un_retry_count = un->un_f_is_fibre ? 3 : 5; in sd_unit_attach()
6952 un->un_notready_retry_count = in sd_unit_attach()
6953 ISCD(un) ? CD_NOT_READY_RETRY_COUNT(un) in sd_unit_attach()
6954 : DISK_NOT_READY_RETRY_COUNT(un); in sd_unit_attach()
6961 un->un_busy_retry_count = un->un_retry_count; in sd_unit_attach()
6969 un->un_reset_retry_count = (un->un_retry_count / 2); in sd_unit_attach()
6974 un->un_victim_retry_count = (2 * un->un_retry_count); in sd_unit_attach()
6981 un->un_reserve_release_time = 5; in sd_unit_attach()
6988 un->un_max_xfer_size = (uint_t)SD_DEFAULT_MAX_XFER_SIZE; in sd_unit_attach()
6989 un->un_partial_dma_supported = 1; in sd_unit_attach()
6998 if (un->un_f_is_fibre == TRUE) { in sd_unit_attach()
6999 un->un_f_allow_bus_device_reset = TRUE; in sd_unit_attach()
7003 un->un_f_allow_bus_device_reset = TRUE; in sd_unit_attach()
7004 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_unit_attach()
7006 "enabled\n", un); in sd_unit_attach()
7008 un->un_f_allow_bus_device_reset = FALSE; in sd_unit_attach()
7009 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_unit_attach()
7011 "disabled\n", un); in sd_unit_attach()
7027 un->un_f_cfg_is_atapi = TRUE; in sd_unit_attach()
7028 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_unit_attach()
7029 "sd_unit_attach: un:0x%p Atapi device\n", un); in sd_unit_attach()
7034 un->un_f_cfg_is_atapi = TRUE; in sd_unit_attach()
7035 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_unit_attach()
7036 "sd_unit_attach: un:0x%p Atapi device\n", un); in sd_unit_attach()
7041 un->un_cmd_timeout = SD_IO_TIME; in sd_unit_attach()
7043 un->un_busy_timeout = SD_BSY_TIMEOUT; in sd_unit_attach()
7046 un->un_state = SD_STATE_NORMAL; in sd_unit_attach()
7047 un->un_last_state = SD_STATE_NORMAL; in sd_unit_attach()
7050 un->un_throttle = sd_max_throttle; in sd_unit_attach()
7051 un->un_saved_throttle = sd_max_throttle; in sd_unit_attach()
7052 un->un_min_throttle = sd_min_throttle; in sd_unit_attach()
7054 if (un->un_f_is_fibre == TRUE) { in sd_unit_attach()
7055 un->un_f_use_adaptive_throttle = TRUE; in sd_unit_attach()
7057 un->un_f_use_adaptive_throttle = FALSE; in sd_unit_attach()
7061 cv_init(&un->un_state_cv, NULL, CV_DRIVER, NULL); in sd_unit_attach()
7062 un->un_mediastate = DKIO_NONE; in sd_unit_attach()
7063 un->un_specified_mediastate = DKIO_NONE; in sd_unit_attach()
7066 cv_init(&un->un_suspend_cv, NULL, CV_DRIVER, NULL); in sd_unit_attach()
7067 cv_init(&un->un_disk_busy_cv, NULL, CV_DRIVER, NULL); in sd_unit_attach()
7070 un->un_power_level = SD_SPINDLE_UNINIT; in sd_unit_attach()
7072 cv_init(&un->un_wcc_cv, NULL, CV_DRIVER, NULL); in sd_unit_attach()
7073 un->un_f_wcc_inprog = 0; in sd_unit_attach()
7079 un->un_f_disksort_disabled = FALSE; in sd_unit_attach()
7080 un->un_f_rmw_type = SD_RMW_TYPE_DEFAULT; in sd_unit_attach()
7081 un->un_f_enable_rmw = FALSE; in sd_unit_attach()
7087 un->un_f_mmc_gesn_polling = TRUE; in sd_unit_attach()
7094 un->un_phy_blocksize = DEV_BSIZE; in sd_unit_attach()
7104 sd_read_unit_properties(un); in sd_unit_attach()
7105 SD_TRACE(SD_LOG_ATTACH_DETACH, un, in sd_unit_attach()
7106 "sd_unit_attach: un:0x%p property configuration complete.\n", un); in sd_unit_attach()
7115 un->un_f_is_hotpluggable = TRUE; in sd_unit_attach()
7122 sd_set_unit_attributes(un, devi); in sd_unit_attach()
7130 un->un_f_blockcount_is_valid = FALSE; in sd_unit_attach()
7131 un->un_f_tgt_blocksize_is_valid = FALSE; in sd_unit_attach()
7137 un->un_tgt_blocksize = un->un_sys_blocksize = DEV_BSIZE; in sd_unit_attach()
7138 un->un_blockcount = 0; in sd_unit_attach()
7144 sd_init_cdb_limits(un); in sd_unit_attach()
7149 if (un->un_f_non_devbsize_supported) { in sd_unit_attach()
7150 un->un_buf_chain_type = SD_CHAIN_INFO_RMMEDIA; in sd_unit_attach()
7152 un->un_buf_chain_type = SD_CHAIN_INFO_DISK; in sd_unit_attach()
7154 un->un_uscsi_chain_type = SD_CHAIN_INFO_USCSI_CMD; in sd_unit_attach()
7155 un->un_direct_chain_type = SD_CHAIN_INFO_DIRECT_CMD; in sd_unit_attach()
7156 un->un_priority_chain_type = SD_CHAIN_INFO_PRIORITY_CMD; in sd_unit_attach()
7158 un->un_xbuf_attr = ddi_xbuf_attr_create(sizeof (struct sd_xbuf), in sd_unit_attach()
7159 sd_xbuf_strategy, un, sd_xbuf_active_limit, sd_xbuf_reserve_limit, in sd_unit_attach()
7161 ddi_xbuf_attr_register_devinfo(un->un_xbuf_attr, devi); in sd_unit_attach()
7164 if (ISCD(un)) { in sd_unit_attach()
7165 un->un_additional_codes = sd_additional_codes; in sd_unit_attach()
7167 un->un_additional_codes = NULL; in sd_unit_attach()
7185 un->un_stats = kstat_create(sd_label, instance, in sd_unit_attach()
7187 if (un->un_stats != NULL) { in sd_unit_attach()
7188 un->un_stats->ks_lock = SD_MUTEX(un); in sd_unit_attach()
7189 kstat_install(un->un_stats); in sd_unit_attach()
7191 SD_TRACE(SD_LOG_ATTACH_DETACH, un, in sd_unit_attach()
7192 "sd_unit_attach: un:0x%p un_stats created\n", un); in sd_unit_attach()
7194 un->un_unmapstats_ks = kstat_create(sd_label, instance, "unmapstats", in sd_unit_attach()
7195 "misc", KSTAT_TYPE_NAMED, sizeof (*un->un_unmapstats) / in sd_unit_attach()
7197 if (un->un_unmapstats_ks) { in sd_unit_attach()
7198 un->un_unmapstats = un->un_unmapstats_ks->ks_data; in sd_unit_attach()
7200 kstat_named_init(&un->un_unmapstats->us_cmds, in sd_unit_attach()
7202 kstat_named_init(&un->un_unmapstats->us_errs, in sd_unit_attach()
7204 kstat_named_init(&un->un_unmapstats->us_extents, in sd_unit_attach()
7206 kstat_named_init(&un->un_unmapstats->us_bytes, in sd_unit_attach()
7209 kstat_install(un->un_unmapstats_ks); in sd_unit_attach()
7215 sd_create_errstats(un, instance); in sd_unit_attach()
7216 if (un->un_errstats == NULL) { in sd_unit_attach()
7219 SD_TRACE(SD_LOG_ATTACH_DETACH, un, in sd_unit_attach()
7220 "sd_unit_attach: un:0x%p errstats created\n", un); in sd_unit_attach()
7228 if (SD_IS_PARALLEL_SCSI(un) || SD_IS_SERIAL(un)) { in sd_unit_attach()
7237 un->un_tagflags = 0; in sd_unit_attach()
7239 (un->un_f_arq_enabled == TRUE)) { in sd_unit_attach()
7240 if (scsi_ifsetcap(SD_ADDRESS(un), "tagged-qing", in sd_unit_attach()
7242 un->un_tagflags = FLAG_STAG; in sd_unit_attach()
7243 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_unit_attach()
7245 "enabled\n", un); in sd_unit_attach()
7246 } else if (scsi_ifgetcap(SD_ADDRESS(un), in sd_unit_attach()
7248 un->un_f_opt_queueing = TRUE; in sd_unit_attach()
7249 un->un_saved_throttle = un->un_throttle = in sd_unit_attach()
7250 min(un->un_throttle, 3); in sd_unit_attach()
7252 un->un_f_opt_queueing = FALSE; in sd_unit_attach()
7253 un->un_saved_throttle = un->un_throttle = 1; in sd_unit_attach()
7255 } else if ((scsi_ifgetcap(SD_ADDRESS(un), "untagged-qing", 0) in sd_unit_attach()
7256 == 1) && (un->un_f_arq_enabled == TRUE)) { in sd_unit_attach()
7258 un->un_f_opt_queueing = TRUE; in sd_unit_attach()
7259 un->un_saved_throttle = un->un_throttle = in sd_unit_attach()
7260 min(un->un_throttle, 3); in sd_unit_attach()
7262 un->un_f_opt_queueing = FALSE; in sd_unit_attach()
7263 un->un_saved_throttle = un->un_throttle = 1; in sd_unit_attach()
7264 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_unit_attach()
7265 "sd_unit_attach: un:0x%p no tag queueing\n", un); in sd_unit_attach()
7271 if (SD_IS_SERIAL(un)) { in sd_unit_attach()
7272 un->un_max_xfer_size = in sd_unit_attach()
7275 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_unit_attach()
7277 "size=0x%x\n", un, un->un_max_xfer_size); in sd_unit_attach()
7290 if (SD_IS_PARALLEL_SCSI(un) && in sd_unit_attach()
7293 if (scsi_ifsetcap(SD_ADDRESS(un), "wide-xfer", in sd_unit_attach()
7295 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_unit_attach()
7297 "enabled\n", un); in sd_unit_attach()
7304 if (un->un_saved_throttle == sd_max_throttle) { in sd_unit_attach()
7305 un->un_max_xfer_size = in sd_unit_attach()
7308 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_unit_attach()
7310 "size=0x%x\n", un, un->un_max_xfer_size); in sd_unit_attach()
7313 if (scsi_ifsetcap(SD_ADDRESS(un), "wide-xfer", in sd_unit_attach()
7315 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_unit_attach()
7317 "Wide Transfer disabled\n", un); in sd_unit_attach()
7321 un->un_tagflags = FLAG_STAG; in sd_unit_attach()
7322 un->un_max_xfer_size = ddi_getprop(DDI_DEV_T_ANY, in sd_unit_attach()
7329 if (un->un_f_lun_reset_enabled) { in sd_unit_attach()
7330 if (scsi_ifsetcap(SD_ADDRESS(un), "lun-reset", 1, 1) == 1) { in sd_unit_attach()
7331 SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_unit_attach: " in sd_unit_attach()
7332 "un:0x%p lun_reset capability set\n", un); in sd_unit_attach()
7334 SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_unit_attach: " in sd_unit_attach()
7335 "un:0x%p lun-reset capability not set\n", un); in sd_unit_attach()
7347 max_xfer_size = scsi_ifgetcap(SD_ADDRESS(un), "dma-max", 1); in sd_unit_attach()
7348 if ((max_xfer_size > 0) && (max_xfer_size < un->un_max_xfer_size)) { in sd_unit_attach()
7350 un->un_max_xfer_size = max_xfer_size; in sd_unit_attach()
7351 if (un->un_partial_dma_supported == 0) in sd_unit_attach()
7352 un->un_partial_dma_supported = 1; in sd_unit_attach()
7354 if (ddi_prop_get_int(DDI_DEV_T_ANY, SD_DEVINFO(un), in sd_unit_attach()
7356 if (ddi_xbuf_attr_setup_brk(un->un_xbuf_attr, in sd_unit_attach()
7357 un->un_max_xfer_size) == 1) { in sd_unit_attach()
7358 un->un_buf_breakup_supported = 1; in sd_unit_attach()
7359 SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_unit_attach: " in sd_unit_attach()
7360 "un:0x%p Buf breakup enabled\n", un); in sd_unit_attach()
7367 if (un->un_partial_dma_supported == 1) { in sd_unit_attach()
7368 un->un_pkt_flags = PKT_DMA_PARTIAL; in sd_unit_attach()
7370 un->un_pkt_flags = 0; in sd_unit_attach()
7374 ssc = sd_ssc_init(un); in sd_unit_attach()
7380 un->un_fm_private = in sd_unit_attach()
7382 sfip = (struct sd_fm_internal *)un->un_fm_private; in sd_unit_attach()
7385 sfip->fm_ssc.ssc_un = un; in sd_unit_attach()
7387 if (ISCD(un) || in sd_unit_attach()
7388 un->un_f_has_removable_media || in sd_unit_attach()
7404 fm_scsi_log = ddi_prop_get_int(DDI_DEV_T_ANY, SD_DEVINFO(un), in sd_unit_attach()
7448 if (un->un_f_descr_format_supported) { in sd_unit_attach()
7457 SD_TRACE(SD_LOG_ATTACH_DETACH, un, in sd_unit_attach()
7458 "sd_unit_attach: un:0x%p spin-up successful\n", un); in sd_unit_attach()
7496 sd_update_block_info(un, lbasize, capacity); in sd_unit_attach()
7498 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_unit_attach()
7500 "blocks; lbasize= %ld.\n", un, in sd_unit_attach()
7501 un->un_blockcount, un->un_tgt_blocksize); in sd_unit_attach()
7512 scsi_log(SD_DEVINFO(un), in sd_unit_attach()
7525 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_unit_attach()
7528 "returned reservation conflict\n", un); in sd_unit_attach()
7553 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_unit_attach()
7555 "conflict.\n", un); in sd_unit_attach()
7560 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_unit_attach()
7561 "sd_unit_attach: un:0x%p spin-up failed.", un); in sd_unit_attach()
7570 if (ISCD(un)) { in sd_unit_attach()
7591 mutex_init(&un->un_pm_mutex, NULL, MUTEX_DRIVER, NULL); in sd_unit_attach()
7592 cv_init(&un->un_pm_busy_cv, NULL, CV_DRIVER, NULL); in sd_unit_attach()
7594 if (un->un_f_pm_is_enabled == FALSE) { in sd_unit_attach()
7606 if (un->un_f_non_devbsize_supported) { in sd_unit_attach()
7607 un->un_buf_chain_type = SD_CHAIN_INFO_RMMEDIA_NO_PM; in sd_unit_attach()
7609 un->un_buf_chain_type = SD_CHAIN_INFO_DISK_NO_PM; in sd_unit_attach()
7611 un->un_uscsi_chain_type = SD_CHAIN_INFO_USCSI_CMD_NO_PM; in sd_unit_attach()
7635 (void) scsi_ifsetcap(SD_ADDRESS(un), "qfull-retries", in sd_unit_attach()
7640 (void) scsi_ifsetcap(SD_ADDRESS(un), "qfull-retry-interval", in sd_unit_attach()
7652 un->un_mediastate = DKIO_NONE; in sd_unit_attach()
7664 cmlb_alloc_handle(&un->un_cmlbhandle); in sd_unit_attach()
7670 if (!un->un_f_has_removable_media && !un->un_f_is_hotpluggable && in sd_unit_attach()
7671 (lbasize == un->un_sys_blocksize)) in sd_unit_attach()
7676 VOID2BOOLEAN(un->un_f_has_removable_media != 0), in sd_unit_attach()
7677 VOID2BOOLEAN(un->un_f_is_hotpluggable != 0), in sd_unit_attach()
7678 un->un_node_type, offbyone, un->un_cmlbhandle, in sd_unit_attach()
7690 geom_label_valid = (cmlb_validate(un->un_cmlbhandle, 0, in sd_unit_attach()
7693 mutex_enter(SD_MUTEX(un)); in sd_unit_attach()
7698 if (un->un_f_devid_supported) { in sd_unit_attach()
7701 mutex_exit(SD_MUTEX(un)); in sd_unit_attach()
7704 if (un->un_f_opt_disable_cache == TRUE) { in sd_unit_attach()
7711 SD_ERROR(SD_LOG_ATTACH_DETACH, un, in sd_unit_attach()
7713 "caching", un); in sd_unit_attach()
7725 mutex_enter(SD_MUTEX(un)); in sd_unit_attach()
7726 un->un_f_write_cache_enabled = (wc_enabled != 0); in sd_unit_attach()
7727 un->un_f_cache_mode_changeable = (wc_changeable != 0); in sd_unit_attach()
7728 mutex_exit(SD_MUTEX(un)); in sd_unit_attach()
7730 if ((un->un_f_rmw_type != SD_RMW_TYPE_RETURN_ERROR && in sd_unit_attach()
7731 un->un_tgt_blocksize != DEV_BSIZE) || in sd_unit_attach()
7732 un->un_f_enable_rmw) { in sd_unit_attach()
7733 if (!(un->un_wm_cache)) { in sd_unit_attach()
7736 ddi_driver_name(SD_DEVINFO(un)), in sd_unit_attach()
7737 ddi_get_instance(SD_DEVINFO(un))); in sd_unit_attach()
7738 un->un_wm_cache = kmem_cache_create( in sd_unit_attach()
7742 (void *)un, NULL, 0); in sd_unit_attach()
7743 if (!(un->un_wm_cache)) { in sd_unit_attach()
7765 un->un_reservation_type = SD_SCSI3_RESERVATION; in sd_unit_attach()
7766 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_unit_attach()
7767 "sd_unit_attach: un:0x%p SCSI-3 reservations\n", un); in sd_unit_attach()
7774 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_unit_attach()
7775 "sd_unit_attach: un:0x%p SCSI-2 reservations\n", un); in sd_unit_attach()
7776 un->un_reservation_type = SD_SCSI2_RESERVATION; in sd_unit_attach()
7784 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_unit_attach()
7785 "sd_unit_attach: un:0x%p default SCSI3 reservations\n", un); in sd_unit_attach()
7786 un->un_reservation_type = SD_SCSI3_RESERVATION; in sd_unit_attach()
7805 if (un->un_f_pkstats_enabled && geom_label_valid) { in sd_unit_attach()
7806 sd_set_pstats(un); in sd_unit_attach()
7807 SD_TRACE(SD_LOG_IO_PARTITION, un, in sd_unit_attach()
7808 "sd_unit_attach: un:0x%p pstats created and set\n", un); in sd_unit_attach()
7811 sd_set_errstats(un); in sd_unit_attach()
7812 SD_TRACE(SD_LOG_ATTACH_DETACH, un, in sd_unit_attach()
7813 "sd_unit_attach: un:0x%p errstats set\n", un); in sd_unit_attach()
7823 if (SD_IS_PARALLEL_SCSI(un) && (tgt >= 0) && (tgt < NTARGETS_WIDE)) { in sd_unit_attach()
7827 SD_TRACE(SD_LOG_ATTACH_DETACH, un, in sd_unit_attach()
7828 "sd_unit_attach: un:0x%p exit success\n", un); in sd_unit_attach()
7846 (void) scsi_ifsetcap(SD_ADDRESS(un), "lun-reset", 0, 1); in sd_unit_attach()
7847 (void) scsi_ifsetcap(SD_ADDRESS(un), "wide-xfer", 0, 1); in sd_unit_attach()
7855 (void) scsi_ifsetcap(SD_ADDRESS(un), "tagged-qing", 0, 1); in sd_unit_attach()
7858 if (un->un_f_is_fibre == FALSE) { in sd_unit_attach()
7859 (void) scsi_ifsetcap(SD_ADDRESS(un), "auto-rqsense", 0, 1); in sd_unit_attach()
7867 mutex_enter(SD_MUTEX(un)); in sd_unit_attach()
7870 kmem_free(un->un_fm_private, sizeof (struct sd_fm_internal)); in sd_unit_attach()
7873 if (un->un_direct_priority_timeid != NULL) { in sd_unit_attach()
7874 timeout_id_t temp_id = un->un_direct_priority_timeid; in sd_unit_attach()
7875 un->un_direct_priority_timeid = NULL; in sd_unit_attach()
7876 mutex_exit(SD_MUTEX(un)); in sd_unit_attach()
7878 mutex_enter(SD_MUTEX(un)); in sd_unit_attach()
7882 if (un->un_startstop_timeid != NULL) { in sd_unit_attach()
7883 timeout_id_t temp_id = un->un_startstop_timeid; in sd_unit_attach()
7884 un->un_startstop_timeid = NULL; in sd_unit_attach()
7885 mutex_exit(SD_MUTEX(un)); in sd_unit_attach()
7887 mutex_enter(SD_MUTEX(un)); in sd_unit_attach()
7891 if (un->un_reset_throttle_timeid != NULL) { in sd_unit_attach()
7892 timeout_id_t temp_id = un->un_reset_throttle_timeid; in sd_unit_attach()
7893 un->un_reset_throttle_timeid = NULL; in sd_unit_attach()
7894 mutex_exit(SD_MUTEX(un)); in sd_unit_attach()
7896 mutex_enter(SD_MUTEX(un)); in sd_unit_attach()
7900 if (un->un_rmw_msg_timeid != NULL) { in sd_unit_attach()
7901 timeout_id_t temp_id = un->un_rmw_msg_timeid; in sd_unit_attach()
7902 un->un_rmw_msg_timeid = NULL; in sd_unit_attach()
7903 mutex_exit(SD_MUTEX(un)); in sd_unit_attach()
7905 mutex_enter(SD_MUTEX(un)); in sd_unit_attach()
7909 if (un->un_retry_timeid != NULL) { in sd_unit_attach()
7910 timeout_id_t temp_id = un->un_retry_timeid; in sd_unit_attach()
7911 un->un_retry_timeid = NULL; in sd_unit_attach()
7912 mutex_exit(SD_MUTEX(un)); in sd_unit_attach()
7914 mutex_enter(SD_MUTEX(un)); in sd_unit_attach()
7918 if (un->un_dcvb_timeid != NULL) { in sd_unit_attach()
7919 timeout_id_t temp_id = un->un_dcvb_timeid; in sd_unit_attach()
7920 un->un_dcvb_timeid = NULL; in sd_unit_attach()
7921 mutex_exit(SD_MUTEX(un)); in sd_unit_attach()
7923 mutex_enter(SD_MUTEX(un)); in sd_unit_attach()
7926 mutex_exit(SD_MUTEX(un)); in sd_unit_attach()
7929 ASSERT(un->un_ncmds_in_transport == 0); in sd_unit_attach()
7930 ASSERT(un->un_ncmds_in_driver == 0); in sd_unit_attach()
7933 sd_sync_with_callback(un); in sd_unit_attach()
7939 if (un->un_errstats != NULL) { in sd_unit_attach()
7940 kstat_delete(un->un_errstats); in sd_unit_attach()
7941 un->un_errstats = NULL; in sd_unit_attach()
7946 if (un->un_stats != NULL) { in sd_unit_attach()
7947 kstat_delete(un->un_stats); in sd_unit_attach()
7948 un->un_stats = NULL; in sd_unit_attach()
7951 ddi_xbuf_attr_unregister_devinfo(un->un_xbuf_attr, devi); in sd_unit_attach()
7952 ddi_xbuf_attr_destroy(un->un_xbuf_attr); in sd_unit_attach()
7955 cv_destroy(&un->un_state_cv); in sd_unit_attach()
7957 sd_free_rqs(un); in sd_unit_attach()
7962 bzero(un, sizeof (struct sd_lun)); /* Clear any stale data! */ in sd_unit_attach()
7997 struct sd_lun *un; in sd_unit_detach() local
8011 ((un = (struct sd_lun *)devp->sd_private) == NULL) || in sd_unit_detach()
8012 (un->un_ncmds_in_driver != 0)) { in sd_unit_detach()
8016 SD_TRACE(SD_LOG_ATTACH_DETACH, un, "sd_unit_detach: entry 0x%p\n", un); in sd_unit_detach()
8021 dev = sd_make_device(SD_DEVINFO(un)); in sd_unit_detach()
8027 mutex_enter(SD_MUTEX(un)); in sd_unit_detach()
8034 if (un->un_ocmap.lyropen[i] != 0) { in sd_unit_detach()
8045 if ((un->un_ncmds_in_transport != 0) || (un->un_retry_timeid != NULL) || in sd_unit_detach()
8046 (un->un_direct_priority_timeid != NULL) || in sd_unit_detach()
8047 (un->un_state == SD_STATE_RWAIT)) { in sd_unit_detach()
8048 mutex_exit(SD_MUTEX(un)); in sd_unit_detach()
8049 SD_ERROR(SD_LOG_ATTACH_DETACH, un, in sd_unit_detach()
8057 if ((un->un_resvd_status & SD_RESERVE) && in sd_unit_detach()
8058 !(un->un_resvd_status & SD_LOST_RESERVE)) { in sd_unit_detach()
8059 mutex_exit(SD_MUTEX(un)); in sd_unit_detach()
8065 SD_ERROR(SD_LOG_ATTACH_DETACH, un, in sd_unit_detach()
8069 mutex_exit(SD_MUTEX(un)); in sd_unit_detach()
8077 mutex_enter(SD_MUTEX(un)); in sd_unit_detach()
8078 if (un->un_resvd_timeid != NULL) { in sd_unit_detach()
8079 timeout_id_t temp_id = un->un_resvd_timeid; in sd_unit_detach()
8080 un->un_resvd_timeid = NULL; in sd_unit_detach()
8081 mutex_exit(SD_MUTEX(un)); in sd_unit_detach()
8083 mutex_enter(SD_MUTEX(un)); in sd_unit_detach()
8086 if (un->un_reset_throttle_timeid != NULL) { in sd_unit_detach()
8087 timeout_id_t temp_id = un->un_reset_throttle_timeid; in sd_unit_detach()
8088 un->un_reset_throttle_timeid = NULL; in sd_unit_detach()
8089 mutex_exit(SD_MUTEX(un)); in sd_unit_detach()
8091 mutex_enter(SD_MUTEX(un)); in sd_unit_detach()
8094 if (un->un_startstop_timeid != NULL) { in sd_unit_detach()
8095 timeout_id_t temp_id = un->un_startstop_timeid; in sd_unit_detach()
8096 un->un_startstop_timeid = NULL; in sd_unit_detach()
8097 mutex_exit(SD_MUTEX(un)); in sd_unit_detach()
8099 mutex_enter(SD_MUTEX(un)); in sd_unit_detach()
8102 if (un->un_rmw_msg_timeid != NULL) { in sd_unit_detach()
8103 timeout_id_t temp_id = un->un_rmw_msg_timeid; in sd_unit_detach()
8104 un->un_rmw_msg_timeid = NULL; in sd_unit_detach()
8105 mutex_exit(SD_MUTEX(un)); in sd_unit_detach()
8107 mutex_enter(SD_MUTEX(un)); in sd_unit_detach()
8110 if (un->un_dcvb_timeid != NULL) { in sd_unit_detach()
8111 timeout_id_t temp_id = un->un_dcvb_timeid; in sd_unit_detach()
8112 un->un_dcvb_timeid = NULL; in sd_unit_detach()
8113 mutex_exit(SD_MUTEX(un)); in sd_unit_detach()
8116 mutex_exit(SD_MUTEX(un)); in sd_unit_detach()
8122 mutex_enter(SD_MUTEX(un)); in sd_unit_detach()
8125 if (un->un_direct_priority_timeid != NULL) { in sd_unit_detach()
8126 timeout_id_t temp_id = un->un_direct_priority_timeid; in sd_unit_detach()
8127 un->un_direct_priority_timeid = NULL; in sd_unit_detach()
8128 mutex_exit(SD_MUTEX(un)); in sd_unit_detach()
8130 mutex_enter(SD_MUTEX(un)); in sd_unit_detach()
8134 if (un->un_mhd_token != NULL) { in sd_unit_detach()
8135 mutex_exit(SD_MUTEX(un)); in sd_unit_detach()
8137 if (scsi_watch_request_terminate(un->un_mhd_token, in sd_unit_detach()
8139 SD_ERROR(SD_LOG_ATTACH_DETACH, un, in sd_unit_detach()
8149 mutex_enter(SD_MUTEX(un)); in sd_unit_detach()
8150 un->un_mhd_token = NULL; in sd_unit_detach()
8153 if (un->un_swr_token != NULL) { in sd_unit_detach()
8154 mutex_exit(SD_MUTEX(un)); in sd_unit_detach()
8156 if (scsi_watch_request_terminate(un->un_swr_token, in sd_unit_detach()
8158 SD_ERROR(SD_LOG_ATTACH_DETACH, un, in sd_unit_detach()
8168 mutex_enter(SD_MUTEX(un)); in sd_unit_detach()
8169 un->un_swr_token = NULL; in sd_unit_detach()
8172 mutex_exit(SD_MUTEX(un)); in sd_unit_detach()
8179 (void) scsi_reset_notify(SD_ADDRESS(un), SCSI_RESET_CANCEL, in sd_unit_detach()
8180 sd_mhd_reset_notify_cb, (caddr_t)un); in sd_unit_detach()
8189 mutex_enter(&un->un_pm_mutex); in sd_unit_detach()
8190 if (un->un_pm_idle_timeid != NULL) { in sd_unit_detach()
8191 timeout_id_t temp_id = un->un_pm_idle_timeid; in sd_unit_detach()
8192 un->un_pm_idle_timeid = NULL; in sd_unit_detach()
8193 mutex_exit(&un->un_pm_mutex); in sd_unit_detach()
8202 (void) pm_idle_component(SD_DEVINFO(un), 0); in sd_unit_detach()
8203 mutex_enter(&un->un_pm_mutex); in sd_unit_detach()
8211 if (un->un_pm_timeid != NULL) { in sd_unit_detach()
8212 timeout_id_t temp_id = un->un_pm_timeid; in sd_unit_detach()
8213 un->un_pm_timeid = NULL; in sd_unit_detach()
8214 mutex_exit(&un->un_pm_mutex); in sd_unit_detach()
8222 (void) pm_idle_component(SD_DEVINFO(un), 0); in sd_unit_detach()
8225 mutex_exit(&un->un_pm_mutex); in sd_unit_detach()
8226 if ((un->un_f_pm_is_enabled == TRUE) && in sd_unit_detach()
8227 (pm_lower_power(SD_DEVINFO(un), 0, SD_PM_STATE_STOPPED(un)) in sd_unit_detach()
8229 SD_ERROR(SD_LOG_ATTACH_DETACH, un, in sd_unit_detach()
8242 mutex_enter(&un->un_pm_mutex); in sd_unit_detach()
8243 if (un->un_pm_timeid != NULL) { in sd_unit_detach()
8244 timeout_id_t temp_id = un->un_pm_timeid; in sd_unit_detach()
8245 un->un_pm_timeid = NULL; in sd_unit_detach()
8246 mutex_exit(&un->un_pm_mutex); in sd_unit_detach()
8248 (void) pm_idle_component(SD_DEVINFO(un), 0); in sd_unit_detach()
8250 mutex_exit(&un->un_pm_mutex); in sd_unit_detach()
8260 (void) scsi_ifsetcap(SD_ADDRESS(un), "lun-reset", 0, 1); in sd_unit_detach()
8261 (void) scsi_ifsetcap(SD_ADDRESS(un), "wide-xfer", 0, 1); in sd_unit_detach()
8274 (void) scsi_ifsetcap(SD_ADDRESS(un), "tagged-qing", 0, 1); in sd_unit_detach()
8277 if (un->un_f_is_fibre == FALSE) { in sd_unit_detach()
8278 (void) scsi_ifsetcap(SD_ADDRESS(un), "auto-rqsense", 0, 1); in sd_unit_detach()
8284 if (un->un_f_is_fibre == TRUE) { in sd_unit_detach()
8285 if ((un->un_insert_event != NULL) && in sd_unit_detach()
8286 (ddi_remove_event_handler(un->un_insert_cb_id) != in sd_unit_detach()
8294 SD_ERROR(SD_LOG_ATTACH_DETACH, un, in sd_unit_detach()
8298 un->un_insert_event = NULL; in sd_unit_detach()
8300 if ((un->un_remove_event != NULL) && in sd_unit_detach()
8301 (ddi_remove_event_handler(un->un_remove_cb_id) != in sd_unit_detach()
8309 SD_ERROR(SD_LOG_ATTACH_DETACH, un, in sd_unit_detach()
8313 un->un_remove_event = NULL; in sd_unit_detach()
8317 sd_sync_with_callback(un); in sd_unit_detach()
8319 cmlb_detach(un->un_cmlbhandle, (void *)SD_PATH_DIRECT); in sd_unit_detach()
8320 cmlb_free_handle(&un->un_cmlbhandle); in sd_unit_detach()
8333 kmem_free(un->un_fm_private, sizeof (struct sd_fm_internal)); in sd_unit_detach()
8339 if (un->un_f_devid_transport_defined == FALSE) in sd_unit_detach()
8346 if (un->un_devid) { in sd_unit_detach()
8347 ddi_devid_free(un->un_devid); in sd_unit_detach()
8348 un->un_devid = NULL; in sd_unit_detach()
8354 if (un->un_wm_cache != NULL) { in sd_unit_detach()
8355 kmem_cache_destroy(un->un_wm_cache); in sd_unit_detach()
8356 un->un_wm_cache = NULL; in sd_unit_detach()
8365 if (un->un_stats != NULL) { in sd_unit_detach()
8366 kstat_delete(un->un_stats); in sd_unit_detach()
8367 un->un_stats = NULL; in sd_unit_detach()
8369 if (un->un_unmapstats != NULL) { in sd_unit_detach()
8370 kstat_delete(un->un_unmapstats_ks); in sd_unit_detach()
8371 un->un_unmapstats_ks = NULL; in sd_unit_detach()
8372 un->un_unmapstats = NULL; in sd_unit_detach()
8374 if (un->un_errstats != NULL) { in sd_unit_detach()
8375 kstat_delete(un->un_errstats); in sd_unit_detach()
8376 un->un_errstats = NULL; in sd_unit_detach()
8380 if (un->un_f_pkstats_enabled) { in sd_unit_detach()
8382 if (un->un_pstats[i] != NULL) { in sd_unit_detach()
8383 kstat_delete(un->un_pstats[i]); in sd_unit_detach()
8384 un->un_pstats[i] = NULL; in sd_unit_detach()
8390 ddi_xbuf_attr_unregister_devinfo(un->un_xbuf_attr, devi); in sd_unit_detach()
8391 ddi_xbuf_attr_destroy(un->un_xbuf_attr); in sd_unit_detach()
8396 mutex_destroy(&un->un_pm_mutex); in sd_unit_detach()
8397 cv_destroy(&un->un_pm_busy_cv); in sd_unit_detach()
8399 cv_destroy(&un->un_wcc_cv); in sd_unit_detach()
8402 cv_destroy(&un->un_state_cv); in sd_unit_detach()
8405 cv_destroy(&un->un_suspend_cv); in sd_unit_detach()
8406 cv_destroy(&un->un_disk_busy_cv); in sd_unit_detach()
8408 sd_free_rqs(un); in sd_unit_detach()
8413 bzero(un, sizeof (struct sd_lun)); in sd_unit_detach()
8437 mutex_exit(SD_MUTEX(un)); in sd_unit_detach()
8443 SD_TRACE(SD_LOG_ATTACH_DETACH, un, "sd_unit_detach: exit failure\n"); in sd_unit_detach()
8466 sd_create_errstats(struct sd_lun *un, int instance) in sd_create_errstats() argument
8473 ASSERT(un != NULL); in sd_create_errstats()
8475 if (un->un_errstats != NULL) { in sd_create_errstats()
8484 un->un_errstats = kstat_create(kstatmodule_err, instance, kstatname, in sd_create_errstats()
8487 if (un->un_errstats == NULL) { in sd_create_errstats()
8488 SD_ERROR(SD_LOG_ATTACH_DETACH, un, in sd_create_errstats()
8493 stp = (struct sd_errstats *)un->un_errstats->ks_data; in sd_create_errstats()
8523 un->un_errstats->ks_private = un; in sd_create_errstats()
8524 un->un_errstats->ks_update = nulldev; in sd_create_errstats()
8526 kstat_install(un->un_errstats); in sd_create_errstats()
8548 sd_set_errstats(struct sd_lun *un) in sd_set_errstats() argument
8553 ASSERT(un != NULL); in sd_set_errstats()
8554 ASSERT(un->un_errstats != NULL); in sd_set_errstats()
8555 stp = (struct sd_errstats *)un->un_errstats->ks_data; in sd_set_errstats()
8557 (void) strncpy(stp->sd_vid.value.c, un->un_sd->sd_inq->inq_vid, 8); in sd_set_errstats()
8558 (void) strncpy(stp->sd_pid.value.c, un->un_sd->sd_inq->inq_pid, 16); in sd_set_errstats()
8560 un->un_sd->sd_inq->inq_revision, 4); in sd_set_errstats()
8568 if ((bcmp(&SD_INQUIRY(un)->inq_pid[9], "SUN", 3) != 0) || in sd_set_errstats()
8569 (bcmp(&SD_INQUIRY(un)->inq_serial, stp->sd_serial.value.c, in sd_set_errstats()
8570 sizeof (SD_INQUIRY(un)->inq_serial)) != 0)) { in sd_set_errstats()
8587 if (bcmp(&SD_INQUIRY(un)->inq_pid[9], "SUN", 3) == 0) { in sd_set_errstats()
8588 bcopy(&SD_INQUIRY(un)->inq_serial, stp->sd_serial.value.c, in sd_set_errstats()
8589 sizeof (SD_INQUIRY(un)->inq_serial)); in sd_set_errstats()
8594 if (ddi_prop_lookup_string(DDI_DEV_T_ANY, SD_DEVINFO(un), in sd_set_errstats()
8603 if (un->un_f_blockcount_is_valid != TRUE) { in sd_set_errstats()
8620 ((uint64_t)un->un_blockcount * un->un_sys_blocksize); in sd_set_errstats()
8638 sd_set_pstats(struct sd_lun *un) in sd_set_pstats() argument
8646 ASSERT(un != NULL); in sd_set_pstats()
8648 instance = ddi_get_instance(SD_DEVINFO(un)); in sd_set_pstats()
8653 if (cmlb_partinfo(un->un_cmlbhandle, i, in sd_set_pstats()
8656 mutex_enter(SD_MUTEX(un)); in sd_set_pstats()
8658 if ((un->un_pstats[i] == NULL) && in sd_set_pstats()
8665 un->un_pstats[i] = kstat_create(sd_label, in sd_set_pstats()
8668 if (un->un_pstats[i] != NULL) { in sd_set_pstats()
8669 un->un_pstats[i]->ks_lock = SD_MUTEX(un); in sd_set_pstats()
8670 kstat_install(un->un_pstats[i]); in sd_set_pstats()
8673 mutex_exit(SD_MUTEX(un)); in sd_set_pstats()
8680 #define SDC_CDB_GROUP(un) ((un->un_f_cfg_is_atapi == TRUE) ? \ argument
8682 #define SDC_HDRLEN(un) ((un->un_f_cfg_is_atapi == TRUE) ? \ argument
8688 #define SDC_BUFLEN(un) (SDC_HDRLEN(un) + MODE_BLK_DESC_LENGTH + \ argument
8695 struct sd_lun *un = ssc->ssc_un; in sd_get_caching_mode_page() local
8697 size_t buflen = SDC_BUFLEN(un); in sd_get_caching_mode_page()
8698 int hdrlen = SDC_HDRLEN(un); in sd_get_caching_mode_page()
8715 rval = sd_send_scsi_MODE_SENSE(ssc, SDC_CDB_GROUP(un), *header, buflen, in sd_get_caching_mode_page()
8718 SD_ERROR(SD_LOG_IOCTL_RMMEDIA, un, "%s: Mode Sense Failed\n", in sd_get_caching_mode_page()
8728 if (un->un_f_cfg_is_atapi == TRUE) { in sd_get_caching_mode_page()
8784 struct sd_lun *un = ssc->ssc_un; in sd_cache_control() local
8787 size_t buflen = SDC_BUFLEN(un); in sd_cache_control()
8788 int hdrlen = SDC_HDRLEN(un); in sd_cache_control()
8839 if (un->un_f_cfg_is_atapi == TRUE) { in sd_cache_control()
8852 rval = sd_send_scsi_MODE_SELECT(ssc, SDC_CDB_GROUP(un), in sd_cache_control()
8903 struct sd_lun *un = ssc->ssc_un; in sd_get_write_cache_enabled() local
8906 size_t buflen = SDC_BUFLEN(un); in sd_get_write_cache_enabled()
8907 int hdrlen = SDC_HDRLEN(un); in sd_get_write_cache_enabled()
8972 struct sd_lun *un = ssc->ssc_un; in sd_get_write_cache_changeable() local
8975 size_t buflen = SDC_BUFLEN(un); in sd_get_write_cache_changeable()
8976 int hdrlen = SDC_HDRLEN(un); in sd_get_write_cache_changeable()
9044 struct sd_lun *un; in sd_get_nv_sup() local
9047 un = ssc->ssc_un; in sd_get_nv_sup()
9048 ASSERT(un != NULL); in sd_get_nv_sup()
9050 mutex_enter(SD_MUTEX(un)); in sd_get_nv_sup()
9057 un->un_f_sync_nv_supported = FALSE; in sd_get_nv_sup()
9064 if (un->un_f_suppress_cache_flush == TRUE) { in sd_get_nv_sup()
9065 mutex_exit(SD_MUTEX(un)); in sd_get_nv_sup()
9070 un->un_vpd_page_mask & SD_VPD_EXTENDED_DATA_PG) { in sd_get_nv_sup()
9071 mutex_exit(SD_MUTEX(un)); in sd_get_nv_sup()
9079 SD_TRACE(SD_LOG_COMMON, un, in sd_get_nv_sup()
9085 mutex_enter(SD_MUTEX(un)); in sd_get_nv_sup()
9092 un->un_f_sync_nv_supported = TRUE; in sd_get_nv_sup()
9094 mutex_exit(SD_MUTEX(un)); in sd_get_nv_sup()
9101 mutex_exit(SD_MUTEX(un)); in sd_get_nv_sup()
9109 mutex_enter(SD_MUTEX(un)); in sd_get_nv_sup()
9110 if (un->un_f_sync_nv_supported) { in sd_get_nv_sup()
9111 mutex_exit(SD_MUTEX(un)); in sd_get_nv_sup()
9114 (void) sd_send_scsi_SYNCHRONIZE_CACHE(un, dkc); in sd_get_nv_sup()
9126 mutex_exit(SD_MUTEX(un)); in sd_get_nv_sup()
9129 SD_TRACE(SD_LOG_COMMON, un, "sd_get_nv_sup: \ in sd_get_nv_sup()
9131 un->un_f_suppress_cache_flush); in sd_get_nv_sup()
9177 sd_pm_entry(struct sd_lun *un) in sd_pm_entry() argument
9181 ASSERT(!mutex_owned(SD_MUTEX(un))); in sd_pm_entry()
9182 ASSERT(!mutex_owned(&un->un_pm_mutex)); in sd_pm_entry()
9184 SD_TRACE(SD_LOG_IO_PM, un, "sd_pm_entry: entry\n"); in sd_pm_entry()
9186 if (un->un_f_pm_is_enabled == FALSE) { in sd_pm_entry()
9187 SD_TRACE(SD_LOG_IO_PM, un, in sd_pm_entry()
9208 mutex_enter(&un->un_pm_mutex); in sd_pm_entry()
9209 while (un->un_pm_busy == TRUE) { in sd_pm_entry()
9210 cv_wait(&un->un_pm_busy_cv, &un->un_pm_mutex); in sd_pm_entry()
9212 un->un_pm_busy = TRUE; in sd_pm_entry()
9214 if (un->un_pm_count < 1) { in sd_pm_entry()
9216 SD_TRACE(SD_LOG_IO_PM, un, "sd_pm_entry: busy component\n"); in sd_pm_entry()
9224 mutex_exit(&un->un_pm_mutex); in sd_pm_entry()
9225 return_status = pm_busy_component(SD_DEVINFO(un), 0); in sd_pm_entry()
9228 mutex_enter(&un->un_pm_mutex); in sd_pm_entry()
9230 if (un->un_pm_count < 0) { in sd_pm_entry()
9231 mutex_exit(&un->un_pm_mutex); in sd_pm_entry()
9233 SD_TRACE(SD_LOG_IO_PM, un, in sd_pm_entry()
9242 return_status = pm_raise_power(SD_DEVINFO(un), 0, in sd_pm_entry()
9243 SD_PM_STATE_ACTIVE(un)); in sd_pm_entry()
9245 mutex_enter(&un->un_pm_mutex); in sd_pm_entry()
9254 SD_TRACE(SD_LOG_IO_PM, un, in sd_pm_entry()
9258 (void) pm_idle_component(SD_DEVINFO(un), 0); in sd_pm_entry()
9259 un->un_pm_count--; in sd_pm_entry()
9266 ASSERT(un->un_pm_count == 0); in sd_pm_entry()
9279 mutex_exit(&un->un_pm_mutex); in sd_pm_entry()
9280 mutex_enter(SD_MUTEX(un)); in sd_pm_entry()
9281 SD_TRACE(SD_LOG_IO_PM, un, in sd_pm_entry()
9283 un->un_uscsi_chain_type); in sd_pm_entry()
9285 if (un->un_f_non_devbsize_supported) { in sd_pm_entry()
9286 un->un_buf_chain_type = in sd_pm_entry()
9289 un->un_buf_chain_type = in sd_pm_entry()
9292 un->un_uscsi_chain_type = SD_CHAIN_INFO_USCSI_CMD_NO_PM; in sd_pm_entry()
9294 SD_TRACE(SD_LOG_IO_PM, un, in sd_pm_entry()
9296 un->un_uscsi_chain_type); in sd_pm_entry()
9297 mutex_exit(SD_MUTEX(un)); in sd_pm_entry()
9298 mutex_enter(&un->un_pm_mutex); in sd_pm_entry()
9300 if (un->un_pm_idle_timeid == NULL) { in sd_pm_entry()
9302 un->un_pm_idle_timeid = in sd_pm_entry()
9303 timeout(sd_pm_idletimeout_handler, un, in sd_pm_entry()
9311 (void) pm_busy_component(SD_DEVINFO(un), 0); in sd_pm_entry()
9315 un->un_pm_busy = FALSE; in sd_pm_entry()
9317 cv_signal(&un->un_pm_busy_cv); in sd_pm_entry()
9319 un->un_pm_count++; in sd_pm_entry()
9321 SD_TRACE(SD_LOG_IO_PM, un, in sd_pm_entry()
9322 "sd_pm_entry: exiting, un_pm_count = %d\n", un->un_pm_count); in sd_pm_entry()
9324 mutex_exit(&un->un_pm_mutex); in sd_pm_entry()
9341 sd_pm_exit(struct sd_lun *un) in sd_pm_exit() argument
9343 ASSERT(!mutex_owned(SD_MUTEX(un))); in sd_pm_exit()
9344 ASSERT(!mutex_owned(&un->un_pm_mutex)); in sd_pm_exit()
9346 SD_TRACE(SD_LOG_IO_PM, un, "sd_pm_exit: entry\n"); in sd_pm_exit()
9352 if (un->un_f_pm_is_enabled == TRUE) { in sd_pm_exit()
9354 mutex_enter(&un->un_pm_mutex); in sd_pm_exit()
9355 un->un_pm_count--; in sd_pm_exit()
9357 SD_TRACE(SD_LOG_IO_PM, un, in sd_pm_exit()
9358 "sd_pm_exit: un_pm_count = %d\n", un->un_pm_count); in sd_pm_exit()
9360 ASSERT(un->un_pm_count >= 0); in sd_pm_exit()
9361 if (un->un_pm_count == 0) { in sd_pm_exit()
9362 mutex_exit(&un->un_pm_mutex); in sd_pm_exit()
9364 SD_TRACE(SD_LOG_IO_PM, un, in sd_pm_exit()
9367 (void) pm_idle_component(SD_DEVINFO(un), 0); in sd_pm_exit()
9370 mutex_exit(&un->un_pm_mutex); in sd_pm_exit()
9374 SD_TRACE(SD_LOG_IO_PM, un, "sd_pm_exit: exiting\n"); in sd_pm_exit()
9400 struct sd_lun *un; in sdopen() local
9421 if ((un = ddi_get_soft_state(sd_state, instance)) == NULL) { in sdopen()
9440 mutex_enter(SD_MUTEX(un)); in sdopen()
9450 while ((un->un_state == SD_STATE_SUSPENDED) || in sdopen()
9451 (un->un_state == SD_STATE_PM_CHANGING)) { in sdopen()
9452 cv_wait(&un->un_suspend_cv, SD_MUTEX(un)); in sdopen()
9455 mutex_exit(SD_MUTEX(un)); in sdopen()
9456 if (sd_pm_entry(un) != DDI_SUCCESS) { in sdopen()
9458 SD_ERROR(SD_LOG_OPEN_CLOSE, un, in sdopen()
9462 mutex_enter(SD_MUTEX(un)); in sdopen()
9466 SD_TRACE(SD_LOG_OPEN_CLOSE, un, "sdopen: un=%p\n", (void *)un); in sdopen()
9468 SD_TRACE(SD_LOG_OPEN_CLOSE, un, in sdopen()
9470 un->un_exclopen, flag, un->un_ocmap.lyropen[part]); in sdopen()
9472 SD_TRACE(SD_LOG_OPEN_CLOSE, un, in sdopen()
9474 un->un_exclopen, flag, un->un_ocmap.regopen[otyp]); in sdopen()
9477 if (un->un_exclopen & (partmask)) { in sdopen()
9483 if (un->un_ocmap.lyropen[part]) { in sdopen()
9487 if (un->un_ocmap.regopen[i] & (partmask)) { in sdopen()
9502 if (un->un_f_chk_wp_open) { in sdopen()
9504 mutex_exit(SD_MUTEX(un)); in sdopen()
9512 if (un->un_f_dvdram_writable_device == FALSE) { in sdopen()
9513 if (ISCD(un) || sr_check_wp(dev)) { in sdopen()
9515 mutex_enter(SD_MUTEX(un)); in sdopen()
9516 SD_ERROR(SD_LOG_OPEN_CLOSE, un, "sdopen: " in sdopen()
9521 mutex_enter(SD_MUTEX(un)); in sdopen()
9532 mutex_exit(SD_MUTEX(un)); in sdopen()
9533 ssc = sd_ssc_init(un); in sdopen()
9536 mutex_enter(SD_MUTEX(un)); in sdopen()
9544 if (rval == SD_READY_VALID && (!ISCD(un))) { in sdopen()
9546 mutex_exit(SD_MUTEX(un)); in sdopen()
9547 (void) cmlb_partinfo(un->un_cmlbhandle, part, &nblks, in sdopen()
9549 mutex_enter(SD_MUTEX(un)); in sdopen()
9553 (!ISCD(un) && nblks <= 0)) { in sdopen()
9554 rval = un->un_f_has_removable_media ? ENXIO : EIO; in sdopen()
9555 SD_ERROR(SD_LOG_OPEN_CLOSE, un, "sdopen: " in sdopen()
9567 cp = &un->un_ocmap.chkd[0]; in sdopen()
9568 while (cp < &un->un_ocmap.chkd[OCSIZE]) { in sdopen()
9574 if (cp == &un->un_ocmap.chkd[OCSIZE]) { in sdopen()
9575 mutex_exit(SD_MUTEX(un)); in sdopen()
9576 cmlb_invalidate(un->un_cmlbhandle, in sdopen()
9578 mutex_enter(SD_MUTEX(un)); in sdopen()
9585 un->un_ocmap.lyropen[part]++; in sdopen()
9587 un->un_ocmap.regopen[otyp] |= partmask; in sdopen()
9592 un->un_exclopen |= (partmask); in sdopen()
9604 mutex_exit(SD_MUTEX(un)); in sdopen()
9605 if (cmlb_efi_label_capacity(un->un_cmlbhandle, &label_cap, in sdopen()
9607 mutex_enter(SD_MUTEX(un)); in sdopen()
9608 if (un->un_f_blockcount_is_valid && in sdopen()
9609 un->un_blockcount > label_cap && in sdopen()
9610 un->un_f_expnevent == B_FALSE) { in sdopen()
9611 un->un_f_expnevent = B_TRUE; in sdopen()
9612 mutex_exit(SD_MUTEX(un)); in sdopen()
9613 sd_log_lun_expansion_event(un, in sdopen()
9615 mutex_enter(SD_MUTEX(un)); in sdopen()
9618 mutex_enter(SD_MUTEX(un)); in sdopen()
9622 SD_TRACE(SD_LOG_OPEN_CLOSE, un, "sdopen: " in sdopen()
9625 mutex_exit(SD_MUTEX(un)); in sdopen()
9627 sd_pm_exit(un); in sdopen()
9630 SD_TRACE(SD_LOG_OPEN_CLOSE, un, "sdopen: exit success\n"); in sdopen()
9634 SD_ERROR(SD_LOG_OPEN_CLOSE, un, "sdopen: fail exclusive open\n"); in sdopen()
9638 mutex_exit(SD_MUTEX(un)); in sdopen()
9644 sd_pm_exit(un); in sdopen()
9670 struct sd_lun *un; in sdclose() local
9681 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) { in sdclose()
9688 SD_TRACE(SD_LOG_OPEN_CLOSE, un, in sdclose()
9691 mutex_enter(SD_MUTEX(un)); in sdclose()
9694 while (un->un_state == SD_STATE_PM_CHANGING) { in sdclose()
9695 cv_wait(&un->un_suspend_cv, SD_MUTEX(un)); in sdclose()
9698 if (un->un_exclopen & (1 << part)) { in sdclose()
9699 un->un_exclopen &= ~(1 << part); in sdclose()
9704 un->un_ocmap.lyropen[part] -= 1; in sdclose()
9706 un->un_ocmap.regopen[otyp] &= ~(1 << part); in sdclose()
9709 cp = &un->un_ocmap.chkd[0]; in sdclose()
9710 while (cp < &un->un_ocmap.chkd[OCSIZE]) { in sdclose()
9717 if (cp == &un->un_ocmap.chkd[OCSIZE]) { in sdclose()
9718 SD_TRACE(SD_LOG_OPEN_CLOSE, un, "sdclose: last close\n"); in sdclose()
9724 un->un_throttle = un->un_saved_throttle; in sdclose()
9726 if (un->un_state == SD_STATE_OFFLINE) { in sdclose()
9727 if (un->un_f_is_fibre == FALSE) { in sdclose()
9728 scsi_log(SD_DEVINFO(un), sd_label, in sdclose()
9731 mutex_exit(SD_MUTEX(un)); in sdclose()
9732 cmlb_invalidate(un->un_cmlbhandle, in sdclose()
9734 mutex_enter(SD_MUTEX(un)); in sdclose()
9755 if ((un->un_f_sync_cache_supported && in sdclose()
9756 un->un_f_sync_cache_required) || in sdclose()
9757 un->un_f_dvdram_writable_device == TRUE) { in sdclose()
9758 mutex_exit(SD_MUTEX(un)); in sdclose()
9759 if (sd_pm_entry(un) == DDI_SUCCESS) { in sdclose()
9761 sd_send_scsi_SYNCHRONIZE_CACHE(un, in sdclose()
9769 sd_pm_exit(un); in sdclose()
9773 mutex_enter(SD_MUTEX(un)); in sdclose()
9782 if (un->un_f_doorlock_supported) { in sdclose()
9783 mutex_exit(SD_MUTEX(un)); in sdclose()
9784 if (sd_pm_entry(un) == DDI_SUCCESS) { in sdclose()
9787 ssc = sd_ssc_init(un); in sdclose()
9795 sd_pm_exit(un); in sdclose()
9796 if (ISCD(un) && (rval != 0) && in sdclose()
9803 mutex_enter(SD_MUTEX(un)); in sdclose()
9811 if (un->un_f_has_removable_media) { in sdclose()
9812 sr_ejected(un); in sdclose()
9823 if ((un->un_wm_cache != NULL) && in sdclose()
9824 (un->un_ncmds_in_driver == 0)) { in sdclose()
9825 kmem_cache_destroy(un->un_wm_cache); in sdclose()
9826 un->un_wm_cache = NULL; in sdclose()
9831 mutex_exit(SD_MUTEX(un)); in sdclose()
9861 struct sd_lun *un; in sd_ready_and_valid() local
9865 un = ssc->ssc_un; in sd_ready_and_valid()
9866 ASSERT(un != NULL); in sd_ready_and_valid()
9867 ASSERT(!mutex_owned(SD_MUTEX(un))); in sd_ready_and_valid()
9869 mutex_enter(SD_MUTEX(un)); in sd_ready_and_valid()
9874 if (un->un_f_has_removable_media) { in sd_ready_and_valid()
9875 mutex_exit(SD_MUTEX(un)); in sd_ready_and_valid()
9880 mutex_enter(SD_MUTEX(un)); in sd_ready_and_valid()
9888 is_valid = SD_IS_VALID_LABEL(un); in sd_ready_and_valid()
9889 mutex_enter(SD_MUTEX(un)); in sd_ready_and_valid()
9891 (un->un_f_blockcount_is_valid == FALSE) || in sd_ready_and_valid()
9892 (un->un_f_tgt_blocksize_is_valid == FALSE)) { in sd_ready_and_valid()
9895 mutex_exit(SD_MUTEX(un)); in sd_ready_and_valid()
9902 cmlb_invalidate(un->un_cmlbhandle, in sd_ready_and_valid()
9904 mutex_enter(SD_MUTEX(un)); in sd_ready_and_valid()
9909 mutex_enter(SD_MUTEX(un)); in sd_ready_and_valid()
9910 sd_update_block_info(un, lbasize, capacity); in sd_ready_and_valid()
9917 if (!is_valid && ISCD(un)) { in sd_ready_and_valid()
9926 mutex_exit(SD_MUTEX(un)); in sd_ready_and_valid()
9933 mutex_enter(SD_MUTEX(un)); in sd_ready_and_valid()
9943 if (((un->un_f_rmw_type != SD_RMW_TYPE_RETURN_ERROR || in sd_ready_and_valid()
9944 un->un_f_non_devbsize_supported) && in sd_ready_and_valid()
9945 un->un_tgt_blocksize != DEV_BSIZE) || in sd_ready_and_valid()
9946 un->un_f_enable_rmw) { in sd_ready_and_valid()
9947 if (!(un->un_wm_cache)) { in sd_ready_and_valid()
9950 ddi_driver_name(SD_DEVINFO(un)), in sd_ready_and_valid()
9951 ddi_get_instance(SD_DEVINFO(un))); in sd_ready_and_valid()
9952 un->un_wm_cache = kmem_cache_create( in sd_ready_and_valid()
9956 (void *)un, NULL, 0); in sd_ready_and_valid()
9957 if (!(un->un_wm_cache)) { in sd_ready_and_valid()
9964 if (un->un_state == SD_STATE_NORMAL) { in sd_ready_and_valid()
9978 mutex_exit(SD_MUTEX(un)); in sd_ready_and_valid()
9980 mutex_enter(SD_MUTEX(un)); in sd_ready_and_valid()
9983 mutex_exit(SD_MUTEX(un)); in sd_ready_and_valid()
9984 cmlb_invalidate(un->un_cmlbhandle, in sd_ready_and_valid()
9986 mutex_enter(SD_MUTEX(un)); in sd_ready_and_valid()
9988 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, in sd_ready_and_valid()
9993 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, in sd_ready_and_valid()
10002 if (un->un_f_format_in_progress == FALSE) { in sd_ready_and_valid()
10003 mutex_exit(SD_MUTEX(un)); in sd_ready_and_valid()
10005 (void) cmlb_validate(un->un_cmlbhandle, 0, in sd_ready_and_valid()
10007 if (cmlb_partinfo(un->un_cmlbhandle, part, NULL, NULL, NULL, in sd_ready_and_valid()
10010 mutex_enter(SD_MUTEX(un)); in sd_ready_and_valid()
10014 if (un->un_f_pkstats_enabled) { in sd_ready_and_valid()
10015 sd_set_pstats(un); in sd_ready_and_valid()
10016 SD_TRACE(SD_LOG_IO_PARTITION, un, in sd_ready_and_valid()
10018 "set\n", un); in sd_ready_and_valid()
10020 mutex_enter(SD_MUTEX(un)); in sd_ready_and_valid()
10028 if (un->un_f_doorlock_supported) { in sd_ready_and_valid()
10029 mutex_exit(SD_MUTEX(un)); in sd_ready_and_valid()
10033 if ((status != 0) && ISCD(un)) { in sd_ready_and_valid()
10035 mutex_enter(SD_MUTEX(un)); in sd_ready_and_valid()
10042 mutex_enter(SD_MUTEX(un)); in sd_ready_and_valid()
10046 un->un_mediastate = DKIO_INSERTED; in sd_ready_and_valid()
10047 cv_broadcast(&un->un_state_cv); in sd_ready_and_valid()
10057 if (un->un_errstats != NULL) { in sd_ready_and_valid()
10058 stp = (struct sd_errstats *)un->un_errstats->ks_data; in sd_ready_and_valid()
10060 (un->un_f_blockcount_is_valid == TRUE)) { in sd_ready_and_valid()
10062 (uint64_t)((uint64_t)un->un_blockcount * in sd_ready_and_valid()
10063 un->un_sys_blocksize); in sd_ready_and_valid()
10067 mutex_exit(SD_MUTEX(un)); in sd_ready_and_valid()
10086 struct sd_lun *un; in sdmin() local
10091 un = ddi_get_soft_state(sd_state, instance); in sdmin()
10092 ASSERT(un != NULL); in sdmin()
10098 if (un->un_buf_breakup_supported) { in sdmin()
10102 if (bp->b_bcount > un->un_max_xfer_size) { in sdmin()
10103 bp->b_bcount = un->un_max_xfer_size; in sdmin()
10129 struct sd_lun *un = NULL; in sdread() local
10134 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) { in sdread()
10138 ASSERT(!mutex_owned(SD_MUTEX(un))); in sdread()
10141 if (!SD_IS_VALID_LABEL(un) && !ISCD(un)) { in sdread()
10142 mutex_enter(SD_MUTEX(un)); in sdread()
10148 while ((un->un_state == SD_STATE_SUSPENDED) || in sdread()
10149 (un->un_state == SD_STATE_PM_CHANGING)) { in sdread()
10150 cv_wait(&un->un_suspend_cv, SD_MUTEX(un)); in sdread()
10152 un->un_ncmds_in_driver++; in sdread()
10153 mutex_exit(SD_MUTEX(un)); in sdread()
10156 ssc = sd_ssc_init(un); in sdread()
10164 mutex_enter(SD_MUTEX(un)); in sdread()
10165 un->un_ncmds_in_driver--; in sdread()
10166 ASSERT(un->un_ncmds_in_driver >= 0); in sdread()
10167 mutex_exit(SD_MUTEX(un)); in sdread()
10175 if (un->un_f_rmw_type == SD_RMW_TYPE_RETURN_ERROR && in sdread()
10176 !un->un_f_enable_rmw) in sdread()
10177 secmask = un->un_tgt_blocksize - 1; in sdread()
10182 SD_ERROR(SD_LOG_READ_WRITE, un, in sdread()
10187 SD_ERROR(SD_LOG_READ_WRITE, un, in sdread()
10220 struct sd_lun *un = NULL; in sdwrite() local
10225 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) { in sdwrite()
10229 ASSERT(!mutex_owned(SD_MUTEX(un))); in sdwrite()
10231 if (!SD_IS_VALID_LABEL(un) && !ISCD(un)) { in sdwrite()
10232 mutex_enter(SD_MUTEX(un)); in sdwrite()
10238 while ((un->un_state == SD_STATE_SUSPENDED) || in sdwrite()
10239 (un->un_state == SD_STATE_PM_CHANGING)) { in sdwrite()
10240 cv_wait(&un->un_suspend_cv, SD_MUTEX(un)); in sdwrite()
10242 un->un_ncmds_in_driver++; in sdwrite()
10243 mutex_exit(SD_MUTEX(un)); in sdwrite()
10246 ssc = sd_ssc_init(un); in sdwrite()
10254 mutex_enter(SD_MUTEX(un)); in sdwrite()
10255 un->un_ncmds_in_driver--; in sdwrite()
10256 ASSERT(un->un_ncmds_in_driver >= 0); in sdwrite()
10257 mutex_exit(SD_MUTEX(un)); in sdwrite()
10265 if (un->un_f_rmw_type == SD_RMW_TYPE_RETURN_ERROR && in sdwrite()
10266 !un->un_f_enable_rmw) in sdwrite()
10267 secmask = un->un_tgt_blocksize - 1; in sdwrite()
10272 SD_ERROR(SD_LOG_READ_WRITE, un, in sdwrite()
10277 SD_ERROR(SD_LOG_READ_WRITE, un, in sdwrite()
10309 struct sd_lun *un = NULL; in sdaread() local
10315 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) { in sdaread()
10319 ASSERT(!mutex_owned(SD_MUTEX(un))); in sdaread()
10321 if (!SD_IS_VALID_LABEL(un) && !ISCD(un)) { in sdaread()
10322 mutex_enter(SD_MUTEX(un)); in sdaread()
10328 while ((un->un_state == SD_STATE_SUSPENDED) || in sdaread()
10329 (un->un_state == SD_STATE_PM_CHANGING)) { in sdaread()
10330 cv_wait(&un->un_suspend_cv, SD_MUTEX(un)); in sdaread()
10332 un->un_ncmds_in_driver++; in sdaread()
10333 mutex_exit(SD_MUTEX(un)); in sdaread()
10336 ssc = sd_ssc_init(un); in sdaread()
10344 mutex_enter(SD_MUTEX(un)); in sdaread()
10345 un->un_ncmds_in_driver--; in sdaread()
10346 ASSERT(un->un_ncmds_in_driver >= 0); in sdaread()
10347 mutex_exit(SD_MUTEX(un)); in sdaread()
10355 if (un->un_f_rmw_type == SD_RMW_TYPE_RETURN_ERROR && in sdaread()
10356 !un->un_f_enable_rmw) in sdaread()
10357 secmask = un->un_tgt_blocksize - 1; in sdaread()
10362 SD_ERROR(SD_LOG_READ_WRITE, un, in sdaread()
10367 SD_ERROR(SD_LOG_READ_WRITE, un, in sdaread()
10399 struct sd_lun *un = NULL; in sdawrite() local
10405 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) { in sdawrite()
10409 ASSERT(!mutex_owned(SD_MUTEX(un))); in sdawrite()
10411 if (!SD_IS_VALID_LABEL(un) && !ISCD(un)) { in sdawrite()
10412 mutex_enter(SD_MUTEX(un)); in sdawrite()
10418 while ((un->un_state == SD_STATE_SUSPENDED) || in sdawrite()
10419 (un->un_state == SD_STATE_PM_CHANGING)) { in sdawrite()
10420 cv_wait(&un->un_suspend_cv, SD_MUTEX(un)); in sdawrite()
10422 un->un_ncmds_in_driver++; in sdawrite()
10423 mutex_exit(SD_MUTEX(un)); in sdawrite()
10426 ssc = sd_ssc_init(un); in sdawrite()
10434 mutex_enter(SD_MUTEX(un)); in sdawrite()
10435 un->un_ncmds_in_driver--; in sdawrite()
10436 ASSERT(un->un_ncmds_in_driver >= 0); in sdawrite()
10437 mutex_exit(SD_MUTEX(un)); in sdawrite()
10445 if (un->un_f_rmw_type == SD_RMW_TYPE_RETURN_ERROR && in sdawrite()
10446 !un->un_f_enable_rmw) in sdawrite()
10447 secmask = un->un_tgt_blocksize - 1; in sdawrite()
10452 SD_ERROR(SD_LOG_READ_WRITE, un, in sdawrite()
10457 SD_ERROR(SD_LOG_READ_WRITE, un, in sdawrite()
10676 struct sd_lun *un; in sdstrategy() local
10678 un = ddi_get_soft_state(sd_state, SD_GET_INSTANCE_FROM_BUF(bp)); in sdstrategy()
10679 if (un == NULL) { in sdstrategy()
10687 if (un->un_state == SD_STATE_DUMPING) { in sdstrategy()
10694 ASSERT(!mutex_owned(SD_MUTEX(un))); in sdstrategy()
10702 mutex_enter(SD_MUTEX(un)); in sdstrategy()
10707 while ((un->un_state == SD_STATE_SUSPENDED) || in sdstrategy()
10708 (un->un_state == SD_STATE_PM_CHANGING)) { in sdstrategy()
10709 cv_wait(&un->un_suspend_cv, SD_MUTEX(un)); in sdstrategy()
10712 un->un_ncmds_in_driver++; in sdstrategy()
10719 if (un->un_f_cfg_is_atapi == TRUE) { in sdstrategy()
10720 mutex_exit(SD_MUTEX(un)); in sdstrategy()
10722 mutex_enter(SD_MUTEX(un)); in sdstrategy()
10724 SD_INFO(SD_LOG_IO, un, "sdstrategy: un_ncmds_in_driver = %ld\n", in sdstrategy()
10725 un->un_ncmds_in_driver); in sdstrategy()
10728 un->un_f_sync_cache_required = TRUE; in sdstrategy()
10730 mutex_exit(SD_MUTEX(un)); in sdstrategy()
10738 return (ddi_xbuf_qstrategy(bp, un->un_xbuf_attr)); in sdstrategy()
10754 struct sd_lun *un = arg; in sd_xbuf_strategy() local
10758 ASSERT(un != NULL); in sd_xbuf_strategy()
10759 ASSERT(!mutex_owned(SD_MUTEX(un))); in sd_xbuf_strategy()
10765 sd_xbuf_init(un, bp, xp, SD_CHAIN_BUFIO, NULL); in sd_xbuf_strategy()
10768 SD_BEGIN_IOSTART(((struct sd_xbuf *)xp)->xb_chain_iostart, un, bp); in sd_xbuf_strategy()
10793 sd_xbuf_init(struct sd_lun *un, struct buf *bp, struct sd_xbuf *xp, in sd_xbuf_init() argument
10798 ASSERT(un != NULL); in sd_xbuf_init()
10802 SD_INFO(SD_LOG_IO, un, "sd_xbuf_init: buf:0x%p chain type:0x%x\n", in sd_xbuf_init()
10805 xp->xb_un = un; in sd_xbuf_init()
10823 index = un->un_buf_chain_type; in sd_xbuf_init()
10824 if ((!un->un_f_has_removable_media) && in sd_xbuf_init()
10825 (un->un_tgt_blocksize != 0) && in sd_xbuf_init()
10826 (un->un_tgt_blocksize != DEV_BSIZE || in sd_xbuf_init()
10827 un->un_f_enable_rmw)) { in sd_xbuf_init()
10829 if (un->un_f_enable_rmw) { in sd_xbuf_init()
10831 (un->un_phy_blocksize / DEV_BSIZE) - 1; in sd_xbuf_init()
10832 secmask = un->un_phy_blocksize - 1; in sd_xbuf_init()
10835 (un->un_tgt_blocksize / DEV_BSIZE) - 1; in sd_xbuf_init()
10836 secmask = un->un_tgt_blocksize - 1; in sd_xbuf_init()
10841 if ((un->un_f_rmw_type != in sd_xbuf_init()
10843 un->un_f_enable_rmw) { in sd_xbuf_init()
10844 if (un->un_f_pm_is_enabled == FALSE) in sd_xbuf_init()
10855 index = un->un_uscsi_chain_type; in sd_xbuf_init()
10858 index = un->un_direct_chain_type; in sd_xbuf_init()
10861 index = un->un_priority_chain_type; in sd_xbuf_init()
10896 SD_INFO(SD_LOG_IO, un, "sd_xbuf_init: done.\n"); in sd_xbuf_init()
10915 struct sd_lun *un; in sd_uscsi_strategy() local
10923 un = ddi_get_soft_state(sd_state, SD_GET_INSTANCE_FROM_BUF(bp)); in sd_uscsi_strategy()
10924 if (un == NULL) { in sd_uscsi_strategy()
10931 ASSERT(!mutex_owned(SD_MUTEX(un))); in sd_uscsi_strategy()
10933 SD_TRACE(SD_LOG_IO, un, "sd_uscsi_strategy: entry: buf:0x%p\n", bp); in sd_uscsi_strategy()
10942 mutex_enter(SD_MUTEX(un)); in sd_uscsi_strategy()
10948 if (un->un_f_cfg_is_atapi == TRUE) { in sd_uscsi_strategy()
10949 mutex_exit(SD_MUTEX(un)); in sd_uscsi_strategy()
10951 mutex_enter(SD_MUTEX(un)); in sd_uscsi_strategy()
10953 un->un_ncmds_in_driver++; in sd_uscsi_strategy()
10954 SD_INFO(SD_LOG_IO, un, "sd_uscsi_strategy: un_ncmds_in_driver = %ld\n", in sd_uscsi_strategy()
10955 un->un_ncmds_in_driver); in sd_uscsi_strategy()
10959 un->un_f_sync_cache_required = TRUE; in sd_uscsi_strategy()
10961 mutex_exit(SD_MUTEX(un)); in sd_uscsi_strategy()
10988 sd_xbuf_init(un, bp, xp, chain_type, uip->ui_cmdp); in sd_uscsi_strategy()
10991 SD_BEGIN_IOSTART(xp->xb_chain_iostart, un, bp); in sd_uscsi_strategy()
10993 SD_TRACE(SD_LOG_IO, un, "sd_uscsi_strategy: exit: buf:0x%p\n", bp); in sd_uscsi_strategy()
11030 struct sd_lun *un; in sd_send_scsi_cmd() local
11034 un = ddi_get_soft_state(sd_state, SDUNIT(dev)); in sd_send_scsi_cmd()
11035 if (un == NULL) { in sd_send_scsi_cmd()
11042 ssc = sd_ssc_init(un); in sd_send_scsi_cmd()
11114 sd_ssc_init(struct sd_lun *un) in sd_ssc_init() argument
11120 ASSERT(un != NULL); in sd_ssc_init()
11121 ASSERT(!mutex_owned(SD_MUTEX(un))); in sd_ssc_init()
11140 ssc->ssc_un = un; in sd_ssc_init()
11202 struct sd_lun *un; in sd_ssc_send() local
11209 un = ssc->ssc_un; in sd_ssc_send()
11210 ASSERT(un != NULL); in sd_ssc_send()
11213 ASSERT(!mutex_owned(SD_MUTEX(un))); in sd_ssc_send()
11223 SD_INFO(SD_LOG_SDTEST, un, in sd_ssc_send()
11245 mutex_enter(SD_MUTEX(un)); in sd_ssc_send()
11246 mutex_enter(&un->un_pm_mutex); in sd_ssc_send()
11248 SD_DEVICE_IS_IN_LOW_POWER(un)) { in sd_ssc_send()
11249 SD_TRACE(SD_LOG_IO, un, "sd_ssc_send:" in sd_ssc_send()
11250 "un:0x%p is in low power\n", un); in sd_ssc_send()
11251 mutex_exit(&un->un_pm_mutex); in sd_ssc_send()
11252 mutex_exit(SD_MUTEX(un)); in sd_ssc_send()
11255 mutex_exit(&un->un_pm_mutex); in sd_ssc_send()
11256 mutex_exit(SD_MUTEX(un)); in sd_ssc_send()
11261 SD_TRACE(SD_LOG_IO, un, in sd_ssc_send()
11262 "sd_ssc_send: entry: un:0x%p UIO_USERSPACE\n", un); in sd_ssc_send()
11265 SD_TRACE(SD_LOG_IO, un, in sd_ssc_send()
11266 "sd_ssc_send: entry: un:0x%p UIO_SYSSPACE\n", un); in sd_ssc_send()
11269 SD_TRACE(SD_LOG_IO, un, in sd_ssc_send()
11270 "sd_ssc_send: entry: un:0x%p UNEXPECTED SPACE\n", un); in sd_ssc_send()
11276 SD_ADDRESS(un), &uscmd); in sd_ssc_send()
11278 SD_TRACE(SD_LOG_IO, un, "sd_sense_scsi_cmd: " in sd_ssc_send()
11279 "scsi_uscsi_alloc_and_copyin failed\n", un); in sd_ssc_send()
11285 mutex_enter(SD_MUTEX(un)); in sd_ssc_send()
11286 un->un_f_format_in_progress = TRUE; in sd_ssc_send()
11287 mutex_exit(SD_MUTEX(un)); in sd_ssc_send()
11312 dev = SD_GET_DEV(un); in sd_ssc_send()
11323 SD_INFO(SD_LOG_IO, un, "sd_ssc_send: " in sd_ssc_send()
11327 SD_INFO(SD_LOG_IO, un, "sd_ssc_send: " in sd_ssc_send()
11331 SD_DUMP_MEMORY(un, SD_LOG_IO, in sd_ssc_send()
11339 mutex_enter(SD_MUTEX(un)); in sd_ssc_send()
11340 un->un_f_format_in_progress = FALSE; in sd_ssc_send()
11341 mutex_exit(SD_MUTEX(un)); in sd_ssc_send()
11430 struct sd_lun *un; in sd_ssc_assessment() local
11433 un = ssc->ssc_un; in sd_ssc_assessment()
11434 ASSERT(un != NULL); in sd_ssc_assessment()
11448 SD_INFO(SD_LOG_SDTEST, un, in sd_ssc_assessment()
11511 (un->un_f_arq_enabled == TRUE) && in sd_ssc_assessment()
11521 scsi_log(SD_DEVINFO(un), sd_label, CE_CONT, in sd_ssc_assessment()
11544 struct sd_lun *un; in sd_ssc_post() local
11548 un = ssc->ssc_un; in sd_ssc_post()
11549 ASSERT(un != NULL); in sd_ssc_post()
11559 if (ISCD(un) || un->un_f_has_removable_media) { in sd_ssc_post()
11655 sd_buf_iodone(int index, struct sd_lun *un, struct buf *bp) in sd_buf_iodone() argument
11659 ASSERT(un != NULL); in sd_buf_iodone()
11661 ASSERT(!mutex_owned(SD_MUTEX(un))); in sd_buf_iodone()
11663 SD_TRACE(SD_LOG_IO_CORE, un, "sd_buf_iodone: entry.\n"); in sd_buf_iodone()
11669 if (ddi_xbuf_done(bp, un->un_xbuf_attr)) { in sd_buf_iodone()
11670 mutex_enter(SD_MUTEX(un)); in sd_buf_iodone()
11679 un->un_pm_idle_time = gethrtime(); in sd_buf_iodone()
11681 un->un_ncmds_in_driver--; in sd_buf_iodone()
11682 ASSERT(un->un_ncmds_in_driver >= 0); in sd_buf_iodone()
11683 SD_INFO(SD_LOG_IO, un, in sd_buf_iodone()
11685 un->un_ncmds_in_driver); in sd_buf_iodone()
11687 mutex_exit(SD_MUTEX(un)); in sd_buf_iodone()
11692 SD_TRACE(SD_LOG_IO_CORE, un, "sd_buf_iodone: exit.\n"); in sd_buf_iodone()
11705 sd_uscsi_iodone(int index, struct sd_lun *un, struct buf *bp) in sd_uscsi_iodone() argument
11709 ASSERT(un != NULL); in sd_uscsi_iodone()
11714 ASSERT(!mutex_owned(SD_MUTEX(un))); in sd_uscsi_iodone()
11716 SD_INFO(SD_LOG_IO, un, "sd_uscsi_iodone: entry.\n"); in sd_uscsi_iodone()
11720 mutex_enter(SD_MUTEX(un)); in sd_uscsi_iodone()
11729 un->un_pm_idle_time = gethrtime(); in sd_uscsi_iodone()
11731 un->un_ncmds_in_driver--; in sd_uscsi_iodone()
11732 ASSERT(un->un_ncmds_in_driver >= 0); in sd_uscsi_iodone()
11733 SD_INFO(SD_LOG_IO, un, "sd_uscsi_iodone: un_ncmds_in_driver = %ld\n", in sd_uscsi_iodone()
11734 un->un_ncmds_in_driver); in sd_uscsi_iodone()
11736 mutex_exit(SD_MUTEX(un)); in sd_uscsi_iodone()
11748 SD_INFO(SD_LOG_IO, un, "sd_uscsi_iodone: exit.\n"); in sd_uscsi_iodone()
11786 sd_mapblockaddr_iostart(int index, struct sd_lun *un, struct buf *bp) in sd_mapblockaddr_iostart() argument
11798 ASSERT(un != NULL); in sd_mapblockaddr_iostart()
11800 ASSERT(!mutex_owned(SD_MUTEX(un))); in sd_mapblockaddr_iostart()
11802 SD_TRACE(SD_LOG_IO_PARTITION, un, in sd_mapblockaddr_iostart()
11816 if (!SD_IS_VALID_LABEL(un)) { in sd_mapblockaddr_iostart()
11823 ssc = sd_ssc_init(un); in sd_mapblockaddr_iostart()
11835 if (!un->un_f_has_removable_media) { in sd_mapblockaddr_iostart()
11836 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, in sd_mapblockaddr_iostart()
11841 SD_BEGIN_IODONE(index, un, bp); in sd_mapblockaddr_iostart()
11850 (void) cmlb_partinfo(un->un_cmlbhandle, partition, in sd_mapblockaddr_iostart()
11853 if (un->un_f_enable_rmw) { in sd_mapblockaddr_iostart()
11854 blknomask = (un->un_phy_blocksize / DEV_BSIZE) - 1; in sd_mapblockaddr_iostart()
11855 secmask = un->un_phy_blocksize - 1; in sd_mapblockaddr_iostart()
11857 blknomask = (un->un_tgt_blocksize / DEV_BSIZE) - 1; in sd_mapblockaddr_iostart()
11858 secmask = un->un_tgt_blocksize - 1; in sd_mapblockaddr_iostart()
11865 if (!(NOT_DEVBSIZE(un)) || un->un_f_enable_rmw) { in sd_mapblockaddr_iostart()
11872 xp->xb_blkno = SD_SYS2TGTBLOCK(un, xp->xb_blkno); in sd_mapblockaddr_iostart()
11880 } else if (!un->un_f_enable_rmw && in sd_mapblockaddr_iostart()
11881 un->un_f_rmw_type == SD_RMW_TYPE_RETURN_ERROR) { in sd_mapblockaddr_iostart()
11884 } else if (un->un_f_rmw_type == SD_RMW_TYPE_DEFAULT) { in sd_mapblockaddr_iostart()
11885 mutex_enter(SD_MUTEX(un)); in sd_mapblockaddr_iostart()
11886 if (!un->un_f_enable_rmw && in sd_mapblockaddr_iostart()
11887 un->un_rmw_msg_timeid == NULL) { in sd_mapblockaddr_iostart()
11888 scsi_log(SD_DEVINFO(un), sd_label, in sd_mapblockaddr_iostart()
11894 un->un_tgt_blocksize); in sd_mapblockaddr_iostart()
11895 un->un_rmw_msg_timeid = in sd_mapblockaddr_iostart()
11897 un, SD_RMW_MSG_PRINT_TIMEOUT); in sd_mapblockaddr_iostart()
11899 un->un_rmw_incre_count ++; in sd_mapblockaddr_iostart()
11901 mutex_exit(SD_MUTEX(un)); in sd_mapblockaddr_iostart()
11904 nblocks = SD_TGT2SYSBLOCK(un, nblocks); in sd_mapblockaddr_iostart()
11905 partition_offset = SD_TGT2SYSBLOCK(un, in sd_mapblockaddr_iostart()
11939 if ((!NOT_DEVBSIZE(un)) && is_aligned) { in sd_mapblockaddr_iostart()
11940 requested_nblocks = SD_BYTES2TGTBLOCKS(un, bp->b_bcount); in sd_mapblockaddr_iostart()
11959 if ((!NOT_DEVBSIZE(un)) && is_aligned) { in sd_mapblockaddr_iostart()
11960 resid = SD_TGTBLOCKS2BYTES(un, in sd_mapblockaddr_iostart()
11987 SD_NEXT_IOSTART(index, un, bp); in sd_mapblockaddr_iostart()
11989 SD_TRACE(SD_LOG_IO_PARTITION, un, in sd_mapblockaddr_iostart()
11996 SD_BEGIN_IODONE(index, un, bp); in sd_mapblockaddr_iostart()
11997 SD_TRACE(SD_LOG_IO_PARTITION, un, in sd_mapblockaddr_iostart()
12011 sd_mapblockaddr_iodone(int index, struct sd_lun *un, struct buf *bp) in sd_mapblockaddr_iodone() argument
12014 ASSERT(un != NULL); in sd_mapblockaddr_iodone()
12016 ASSERT(!mutex_owned(SD_MUTEX(un))); in sd_mapblockaddr_iodone()
12018 SD_TRACE(SD_LOG_IO_PARTITION, un, in sd_mapblockaddr_iodone()
12063 SD_NEXT_IODONE(index, un, bp); in sd_mapblockaddr_iodone()
12065 SD_TRACE(SD_LOG_IO_PARTITION, un, in sd_mapblockaddr_iodone()
12092 sd_mapblocksize_iostart(int index, struct sd_lun *un, struct buf *bp) in sd_mapblocksize_iostart() argument
12101 ASSERT(un != NULL); in sd_mapblocksize_iostart()
12103 ASSERT(!mutex_owned(SD_MUTEX(un))); in sd_mapblocksize_iostart()
12106 SD_TRACE(SD_LOG_IO_RMMEDIA, un, in sd_mapblocksize_iostart()
12112 if (ISCD(un) && ((bp->b_flags & B_READ) == 0) && in sd_mapblocksize_iostart()
12113 (un->un_f_mmc_writable_media == FALSE)) { in sd_mapblocksize_iostart()
12116 SD_BEGIN_IODONE(index, un, bp); in sd_mapblocksize_iostart()
12125 if ((un->un_tgt_blocksize == DEV_BSIZE && !un->un_f_enable_rmw) || in sd_mapblocksize_iostart()
12132 ASSERT(!ISROD(un)); in sd_mapblocksize_iostart()
12138 SD_INFO(SD_LOG_IO_RMMEDIA, un, "sd_mapblocksize_iostart: " in sd_mapblocksize_iostart()
12140 un->un_tgt_blocksize, DEV_BSIZE); in sd_mapblocksize_iostart()
12141 SD_INFO(SD_LOG_IO_RMMEDIA, un, "sd_mapblocksize_iostart: " in sd_mapblocksize_iostart()
12143 SD_INFO(SD_LOG_IO_RMMEDIA, un, "sd_mapblocksize_iostart: " in sd_mapblocksize_iostart()
12184 if (un->un_f_enable_rmw) { in sd_mapblocksize_iostart()
12186 (first_byte / un->un_phy_blocksize) * in sd_mapblocksize_iostart()
12187 (un->un_phy_blocksize / DEV_BSIZE); in sd_mapblocksize_iostart()
12189 un->un_phy_blocksize - 1) / un->un_phy_blocksize) * in sd_mapblocksize_iostart()
12190 (un->un_phy_blocksize / DEV_BSIZE); in sd_mapblocksize_iostart()
12192 start_block = xp->xb_blkno = first_byte / un->un_tgt_blocksize; in sd_mapblocksize_iostart()
12194 un->un_tgt_blocksize - 1) / un->un_tgt_blocksize; in sd_mapblocksize_iostart()
12198 request_bytes = (end_block - start_block) * un->un_tgt_blocksize; in sd_mapblocksize_iostart()
12205 if (un->un_f_enable_rmw) { in sd_mapblocksize_iostart()
12206 if (((first_byte % un->un_phy_blocksize) == 0) && in sd_mapblocksize_iostart()
12207 ((bp->b_bcount % un->un_phy_blocksize) == 0)) { in sd_mapblocksize_iostart()
12211 if (((first_byte % un->un_tgt_blocksize) == 0) && in sd_mapblocksize_iostart()
12212 ((bp->b_bcount % un->un_tgt_blocksize) == 0)) { in sd_mapblocksize_iostart()
12223 bsp->mbs_wmp = sd_range_lock(un, start_block, end_block - 1, in sd_mapblocksize_iostart()
12271 if (un->un_f_enable_rmw) { in sd_mapblocksize_iostart()
12273 ((offset_t)xp->xb_blkno * un->un_sys_blocksize)); in sd_mapblocksize_iostart()
12275 (bsp->mbs_copy_offset < un->un_phy_blocksize)); in sd_mapblocksize_iostart()
12278 ((offset_t)xp->xb_blkno * un->un_tgt_blocksize)); in sd_mapblocksize_iostart()
12280 (bsp->mbs_copy_offset < un->un_tgt_blocksize)); in sd_mapblocksize_iostart()
12299 SD_INFO(SD_LOG_IO_RMMEDIA, un, in sd_mapblocksize_iostart()
12301 SD_INFO(SD_LOG_IO_RMMEDIA, un, in sd_mapblocksize_iostart()
12304 SD_INFO(SD_LOG_IO_RMMEDIA, un, in sd_mapblocksize_iostart()
12308 SD_NEXT_IOSTART(index, un, bp); in sd_mapblocksize_iostart()
12310 SD_TRACE(SD_LOG_IO_RMMEDIA, un, in sd_mapblocksize_iostart()
12324 sd_mapblocksize_iodone(int index, struct sd_lun *un, struct buf *bp) in sd_mapblocksize_iodone() argument
12339 ASSERT(un != NULL); in sd_mapblocksize_iodone()
12342 SD_TRACE(SD_LOG_IO_RMMEDIA, un, in sd_mapblocksize_iodone()
12349 if ((un->un_tgt_blocksize == DEV_BSIZE && !un->un_f_enable_rmw) || in sd_mapblocksize_iodone()
12369 sd_range_unlock(un, bsp->mbs_wmp); in sd_mapblocksize_iodone()
12385 ASSERT(!mutex_owned(SD_MUTEX(un))); in sd_mapblocksize_iodone()
12397 sd_range_unlock(un, bsp->mbs_wmp); in sd_mapblocksize_iodone()
12416 if (un->un_f_enable_rmw) { in sd_mapblocksize_iodone()
12419 shadow_start = SD_TGTBLOCKS2BYTES(un, (offset_t)xp->xb_blkno); in sd_mapblocksize_iodone()
12431 if (un->un_f_enable_rmw) { in sd_mapblocksize_iodone()
12433 (copy_offset < un->un_phy_blocksize)); in sd_mapblocksize_iodone()
12436 (copy_offset < un->un_tgt_blocksize)); in sd_mapblocksize_iodone()
12578 SD_NEXT_IODONE(index, un, bp); in sd_mapblocksize_iodone()
12592 sd_checksum_iostart(int index, struct sd_lun *un, struct buf *bp) in sd_checksum_iostart() argument
12594 ASSERT(un != NULL); in sd_checksum_iostart()
12596 ASSERT(!mutex_owned(SD_MUTEX(un))); in sd_checksum_iostart()
12597 SD_NEXT_IOSTART(index, un, bp); in sd_checksum_iostart()
12611 sd_checksum_iodone(int index, struct sd_lun *un, struct buf *bp) in sd_checksum_iodone() argument
12613 ASSERT(un != NULL); in sd_checksum_iodone()
12615 ASSERT(!mutex_owned(SD_MUTEX(un))); in sd_checksum_iodone()
12616 SD_NEXT_IODONE(index, un, bp); in sd_checksum_iodone()
12630 sd_checksum_uscsi_iostart(int index, struct sd_lun *un, struct buf *bp) in sd_checksum_uscsi_iostart() argument
12632 ASSERT(un != NULL); in sd_checksum_uscsi_iostart()
12634 ASSERT(!mutex_owned(SD_MUTEX(un))); in sd_checksum_uscsi_iostart()
12635 SD_NEXT_IOSTART(index, un, bp); in sd_checksum_uscsi_iostart()
12649 sd_checksum_uscsi_iodone(int index, struct sd_lun *un, struct buf *bp) in sd_checksum_uscsi_iodone() argument
12651 ASSERT(un != NULL); in sd_checksum_uscsi_iodone()
12653 ASSERT(!mutex_owned(SD_MUTEX(un))); in sd_checksum_uscsi_iodone()
12654 SD_NEXT_IODONE(index, un, bp); in sd_checksum_uscsi_iodone()
12667 sd_pm_iostart(int index, struct sd_lun *un, struct buf *bp) in sd_pm_iostart() argument
12669 ASSERT(un != NULL); in sd_pm_iostart()
12671 ASSERT(!mutex_owned(SD_MUTEX(un))); in sd_pm_iostart()
12672 ASSERT(!mutex_owned(&un->un_pm_mutex)); in sd_pm_iostart()
12674 SD_TRACE(SD_LOG_IO_PM, un, "sd_pm_iostart: entry\n"); in sd_pm_iostart()
12676 if (sd_pm_entry(un) != DDI_SUCCESS) { in sd_pm_iostart()
12684 SD_BEGIN_IODONE(index, un, bp); in sd_pm_iostart()
12686 SD_TRACE(SD_LOG_IO_PM, un, "sd_pm_iostart: exit\n"); in sd_pm_iostart()
12690 SD_NEXT_IOSTART(index, un, bp); in sd_pm_iostart()
12692 SD_TRACE(SD_LOG_IO_PM, un, "sd_pm_iostart: exit\n"); in sd_pm_iostart()
12705 sd_pm_iodone(int index, struct sd_lun *un, struct buf *bp) in sd_pm_iodone() argument
12707 ASSERT(un != NULL); in sd_pm_iodone()
12709 ASSERT(!mutex_owned(&un->un_pm_mutex)); in sd_pm_iodone()
12711 SD_TRACE(SD_LOG_IO_PM, un, "sd_pm_iodone: entry\n"); in sd_pm_iodone()
12717 if (un->un_f_pm_is_enabled == TRUE) { in sd_pm_iodone()
12718 sd_pm_exit(un); in sd_pm_iodone()
12721 SD_NEXT_IODONE(index, un, bp); in sd_pm_iodone()
12723 SD_TRACE(SD_LOG_IO_PM, un, "sd_pm_iodone: exit\n"); in sd_pm_iodone()
12742 sd_core_iostart(int index, struct sd_lun *un, struct buf *bp) in sd_core_iostart() argument
12746 ASSERT(un != NULL); in sd_core_iostart()
12748 ASSERT(!mutex_owned(SD_MUTEX(un))); in sd_core_iostart()
12751 SD_TRACE(SD_LOG_IO_CORE, un, "sd_core_iostart: entry: bp:0x%p\n", bp); in sd_core_iostart()
12756 mutex_enter(SD_MUTEX(un)); in sd_core_iostart()
12763 (un->un_failfast_state == SD_FAILFAST_ACTIVE)) { in sd_core_iostart()
12764 mutex_exit(SD_MUTEX(un)); in sd_core_iostart()
12767 SD_BEGIN_IODONE(index, un, bp); in sd_core_iostart()
12779 sd_start_cmds(un, bp); in sd_core_iostart()
12785 sd_add_buf_to_waitq(un, bp); in sd_core_iostart()
12786 SD_UPDATE_KSTATS(un, kstat_waitq_enter, bp); in sd_core_iostart()
12787 sd_start_cmds(un, NULL); in sd_core_iostart()
12790 mutex_exit(SD_MUTEX(un)); in sd_core_iostart()
12792 SD_TRACE(SD_LOG_IO_CORE, un, "sd_core_iostart: exit: bp:0x%p\n", bp); in sd_core_iostart()
12822 sd_init_cdb_limits(struct sd_lun *un) in sd_init_cdb_limits() argument
12831 un->un_mincdb = SD_CDB_GROUP1; in sd_init_cdb_limits()
12832 if (!un->un_f_is_fibre && !un->un_f_cfg_is_atapi && !ISROD(un) && in sd_init_cdb_limits()
12833 !un->un_f_has_removable_media) { in sd_init_cdb_limits()
12834 un->un_mincdb = SD_CDB_GROUP0; in sd_init_cdb_limits()
12840 un->un_max_hba_cdb = scsi_ifgetcap(SD_ADDRESS(un), "max-cdb-length", 1); in sd_init_cdb_limits()
12841 if (0 >= un->un_max_hba_cdb) { in sd_init_cdb_limits()
12842 un->un_max_hba_cdb = CDB_GROUP4; in sd_init_cdb_limits()
12844 } else if (0 < un->un_max_hba_cdb && in sd_init_cdb_limits()
12845 un->un_max_hba_cdb < CDB_GROUP1) { in sd_init_cdb_limits()
12847 } else if (CDB_GROUP1 <= un->un_max_hba_cdb && in sd_init_cdb_limits()
12848 un->un_max_hba_cdb < CDB_GROUP5) { in sd_init_cdb_limits()
12850 } else if (CDB_GROUP5 <= un->un_max_hba_cdb && in sd_init_cdb_limits()
12851 un->un_max_hba_cdb < CDB_GROUP4) { in sd_init_cdb_limits()
12861 un->un_maxcdb = (un->un_f_has_removable_media) ? SD_CDB_GROUP5 : in sd_init_cdb_limits()
12864 un->un_status_len = (int)((un->un_f_arq_enabled == TRUE) in sd_init_cdb_limits()
12866 if (!ISCD(un)) in sd_init_cdb_limits()
12867 un->un_cmd_timeout = (ushort_t)sd_io_time; in sd_init_cdb_limits()
12868 un->un_uscsi_timeout = ((ISCD(un)) ? 2 : 1) * un->un_cmd_timeout; in sd_init_cdb_limits()
12899 struct sd_lun *un; in sd_initpkt_for_buf() local
12909 un = SD_GET_UN(bp); in sd_initpkt_for_buf()
12910 ASSERT(un != NULL); in sd_initpkt_for_buf()
12911 ASSERT(mutex_owned(SD_MUTEX(un))); in sd_initpkt_for_buf()
12914 SD_TRACE(SD_LOG_IO_CORE, un, in sd_initpkt_for_buf()
12917 mutex_exit(SD_MUTEX(un)); in sd_initpkt_for_buf()
12938 blockcount = SD_BYTES2TGTBLOCKS(un, bp->b_bcount); in sd_initpkt_for_buf()
12940 cmd_flags = un->un_pkt_flags | (xp->xb_pkt_flags & SD_XB_INITPKT_MASK); in sd_initpkt_for_buf()
12946 rval = sd_setup_rw_pkt(un, &pktp, bp, in sd_initpkt_for_buf()
12947 cmd_flags, sdrunout, (caddr_t)un, in sd_initpkt_for_buf()
12957 if ((un->un_pkt_flags & PKT_DMA_PARTIAL) != 0 && in sd_initpkt_for_buf()
12973 pktp->pkt_flags = un->un_tagflags; in sd_initpkt_for_buf()
12974 pktp->pkt_time = un->un_cmd_timeout; in sd_initpkt_for_buf()
12980 SD_TRACE(SD_LOG_IO_CORE, un, in sd_initpkt_for_buf()
12987 mutex_enter(SD_MUTEX(un)); in sd_initpkt_for_buf()
13005 mutex_enter(SD_MUTEX(un)); in sd_initpkt_for_buf()
13006 New_state(un, SD_STATE_RWAIT); in sd_initpkt_for_buf()
13008 SD_ERROR(SD_LOG_IO_CORE, un, in sd_initpkt_for_buf()
13022 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, in sd_initpkt_for_buf()
13025 SD_ERROR(SD_LOG_IO_CORE, un, in sd_initpkt_for_buf()
13027 mutex_enter(SD_MUTEX(un)); in sd_initpkt_for_buf()
13074 sd_setup_rw_pkt(struct sd_lun *un, in sd_setup_rw_pkt() argument
13087 for (i = un->un_mincdb; i <= un->un_maxcdb; i++) { in sd_setup_rw_pkt()
13109 return_pktp = scsi_init_pkt(SD_ADDRESS(un), *pktpp, in sd_setup_rw_pkt()
13110 bp, cp->sc_grpcode, un->un_status_len, 0, in sd_setup_rw_pkt()
13136 SD_BYTES2TGTBLOCKS(un, in sd_setup_rw_pkt()
13150 SD_FILL_SCSI1_LUN(un, return_pktp); in sd_setup_rw_pkt()
13217 sd_setup_next_rw_pkt(struct sd_lun *un, in sd_setup_next_rw_pkt() argument
13242 if (scsi_init_pkt(SD_ADDRESS(un), pktp, bp, 0, 0, 0, 0, in sd_setup_next_rw_pkt()
13247 SD_BYTES2TGTBLOCKS(un, pktp->pkt_resid); in sd_setup_next_rw_pkt()
13251 SD_FILL_SCSI1_LUN(un, pktp); in sd_setup_next_rw_pkt()
13304 struct sd_lun *un; in sd_initpkt_for_uscsi() local
13311 un = SD_GET_UN(bp); in sd_initpkt_for_uscsi()
13312 ASSERT(un != NULL); in sd_initpkt_for_uscsi()
13313 ASSERT(mutex_owned(SD_MUTEX(un))); in sd_initpkt_for_uscsi()
13319 SD_TRACE(SD_LOG_IO_CORE, un, in sd_initpkt_for_uscsi()
13341 pktp = scsi_init_pkt(SD_ADDRESS(un), NULL, in sd_initpkt_for_uscsi()
13345 (un->un_pkt_flags & ~PKT_DMA_PARTIAL) | PKT_XARQ, in sd_initpkt_for_uscsi()
13346 sdrunout, (caddr_t)un); in sd_initpkt_for_uscsi()
13348 pktp = scsi_init_pkt(SD_ADDRESS(un), NULL, in sd_initpkt_for_uscsi()
13351 (un->un_pkt_flags & ~PKT_DMA_PARTIAL), in sd_initpkt_for_uscsi()
13352 sdrunout, (caddr_t)un); in sd_initpkt_for_uscsi()
13362 New_state(un, SD_STATE_RWAIT); in sd_initpkt_for_uscsi()
13364 SD_ERROR(SD_LOG_IO_CORE, un, in sd_initpkt_for_uscsi()
13377 if ((un->un_pkt_flags & PKT_DMA_PARTIAL) && in sd_initpkt_for_uscsi()
13380 SD_ERROR(SD_LOG_IO_CORE, un, "sd_initpkt_for_uscsi: " in sd_initpkt_for_uscsi()
13389 SD_FILL_SCSI1_LUN(un, pktp); in sd_initpkt_for_uscsi()
13408 if (un->un_f_is_fibre == FALSE) { in sd_initpkt_for_uscsi()
13437 flags |= un->un_tagflags & FLAG_TAGMASK; in sd_initpkt_for_uscsi()
13454 pktp->pkt_time = un->un_uscsi_timeout; in sd_initpkt_for_uscsi()
13468 SD_TRACE(SD_LOG_IO_CORE, un, in sd_initpkt_for_uscsi()
13491 struct sd_lun *un; in sd_destroypkt_for_uscsi() local
13497 un = SD_GET_UN(bp); in sd_destroypkt_for_uscsi()
13498 ASSERT(un != NULL); in sd_destroypkt_for_uscsi()
13499 ASSERT(!mutex_owned(SD_MUTEX(un))); in sd_destroypkt_for_uscsi()
13503 SD_TRACE(SD_LOG_IO_CORE, un, in sd_destroypkt_for_uscsi()
13551 SD_TRACE(SD_LOG_IO_CORE, un, in sd_destroypkt_for_uscsi()
13579 struct sd_lun *un; in sd_bioclone_alloc() local
13587 un = SD_GET_UN(bp); in sd_bioclone_alloc()
13588 ASSERT(un != NULL); in sd_bioclone_alloc()
13589 ASSERT(!mutex_owned(SD_MUTEX(un))); in sd_bioclone_alloc()
13591 new_bp = bioclone(bp, 0, datalen, SD_GET_DEV(un), blkno, func, in sd_bioclone_alloc()
13638 struct sd_lun *un; in sd_shadow_buf_alloc() local
13646 un = SD_GET_UN(bp); in sd_shadow_buf_alloc()
13647 ASSERT(un != NULL); in sd_shadow_buf_alloc()
13648 ASSERT(!mutex_owned(SD_MUTEX(un))); in sd_shadow_buf_alloc()
13662 new_bp = scsi_alloc_consistent_buf(SD_ADDRESS(un), NULL, in sd_shadow_buf_alloc()
13792 sd_print_transport_rejected_message(struct sd_lun *un, struct sd_xbuf *xp, in sd_print_transport_rejected_message() argument
13795 ASSERT(un != NULL); in sd_print_transport_rejected_message()
13796 ASSERT(mutex_owned(SD_MUTEX(un))); in sd_print_transport_rejected_message()
13817 (SD_FM_LOG(un) == SD_FM_LOG_NSUP)) { in sd_print_transport_rejected_message()
13820 (un->un_tran_fatal_count == 1)) { in sd_print_transport_rejected_message()
13823 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, in sd_print_transport_rejected_message()
13827 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, in sd_print_transport_rejected_message()
13831 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, in sd_print_transport_rejected_message()
13859 sd_add_buf_to_waitq(struct sd_lun *un, struct buf *bp) in sd_add_buf_to_waitq() argument
13864 ASSERT(un != NULL); in sd_add_buf_to_waitq()
13865 ASSERT(mutex_owned(SD_MUTEX(un))); in sd_add_buf_to_waitq()
13868 if (un->un_waitq_headp == NULL) { in sd_add_buf_to_waitq()
13869 ASSERT(un->un_waitq_tailp == NULL); in sd_add_buf_to_waitq()
13870 un->un_waitq_headp = un->un_waitq_tailp = bp; in sd_add_buf_to_waitq()
13875 ASSERT(un->un_waitq_tailp != NULL); in sd_add_buf_to_waitq()
13881 if (un->un_f_disksort_disabled || un->un_f_enable_rmw) { in sd_add_buf_to_waitq()
13882 un->un_waitq_tailp->av_forw = bp; in sd_add_buf_to_waitq()
13883 un->un_waitq_tailp = bp; in sd_add_buf_to_waitq()
13906 ap = un->un_waitq_headp; in sd_add_buf_to_waitq()
13971 if (ap == un->un_waitq_tailp) { in sd_add_buf_to_waitq()
13972 un->un_waitq_tailp = bp; in sd_add_buf_to_waitq()
13995 sd_start_cmds(struct sd_lun *un, struct buf *immed_bp) argument
14006 ASSERT(un != NULL);
14007 ASSERT(mutex_owned(SD_MUTEX(un)));
14008 ASSERT(un->un_ncmds_in_transport >= 0);
14009 ASSERT(un->un_throttle >= 0);
14011 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, "sd_start_cmds: entry\n");
14030 if ((un->un_state == SD_STATE_DUMPING) ||
14031 (ddi_in_panic() && (un->un_in_callback > 1))) {
14032 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
14054 if (bp == un->un_retry_bp) {
14055 ASSERT((un->un_retry_statp == NULL) ||
14056 (un->un_retry_statp == kstat_waitq_enter) ||
14057 (un->un_retry_statp ==
14068 if ((un->un_retry_statp == kstat_waitq_enter) ||
14069 (un->un_retry_statp ==
14074 saved_statp = un->un_retry_statp;
14076 un->un_retry_statp = NULL;
14078 SD_TRACE(SD_LOG_IO | SD_LOG_ERROR, un,
14081 un, un->un_retry_bp, un->un_throttle,
14082 un->un_ncmds_in_transport);
14084 SD_TRACE(SD_LOG_IO_CORE, un, "sd_start_cmds: "
14088 } else if ((bp = un->un_waitq_headp) != NULL) {
14102 if (un->un_ncmds_in_transport >= un->un_throttle) {
14103 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
14108 if (un->un_retry_bp != NULL) {
14109 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
14113 if (un->un_startstop_timeid != NULL) {
14114 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
14119 if (un->un_direct_priority_timeid != NULL) {
14120 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
14127 un->un_waitq_headp = bp->av_forw;
14128 if (un->un_waitq_headp == NULL) {
14129 un->un_waitq_tailp = NULL;
14133 SD_TRACE(SD_LOG_IO_CORE, un,
14138 SD_TRACE(SD_LOG_IO_CORE, un,
14153 if ((un->un_state != SD_STATE_SUSPENDED) &&
14154 (un->un_state != SD_STATE_PM_CHANGING)) {
14155 New_state(un, SD_STATE_NORMAL);
14216 ASSERT(bp != un->un_rqs_bp);
14222 SD_TRACE(SD_LOG_IO_CORE, un,
14237 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
14258 if (bp != un->un_retry_bp) {
14290 if (un->un_retry_statp == NULL) {
14296 un->un_retry_statp =
14300 if ((un->un_startstop_timeid == NULL) &&
14301 (un->un_retry_timeid == NULL) &&
14302 (un->un_direct_priority_timeid ==
14305 un->un_retry_timeid =
14308 un, SD_RESTART_TIMEOUT);
14320 bp->av_forw = un->un_waitq_headp;
14321 un->un_waitq_headp = bp;
14322 if (un->un_waitq_tailp == NULL) {
14323 un->un_waitq_tailp = bp;
14332 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
14343 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
14353 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
14373 SD_UPDATE_KSTATS(un, kstat_waitq_exit, bp);
14375 sd_return_failed_command_no_restart(un, bp, EIO);
14388 un->un_ncmds_in_transport++;
14389 SD_UPDATE_KSTATS(un, statp, bp);
14399 SD_TRACE(SD_LOG_IO_CORE, un,
14403 mutex_exit(SD_MUTEX(un));
14405 mutex_enter(SD_MUTEX(un));
14407 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
14413 un->un_tran_fatal_count = 0;
14417 un->un_ncmds_in_transport--;
14418 ASSERT(un->un_ncmds_in_transport >= 0);
14426 if (bp == un->un_rqs_bp) {
14427 SD_UPDATE_KSTATS(un, kstat_runq_exit, bp);
14428 bp = sd_mark_rqs_idle(un, xp);
14429 sd_retry_command(un, bp, SD_RETRIES_STANDARD,
14430 NULL, NULL, EIO, un->un_busy_timeout / 500,
14442 if ((un->un_f_is_fibre == TRUE) &&
14473 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
14477 SD_UPDATE_KSTATS(un, kstat_runq_exit, bp);
14478 un->un_direct_priority_timeid =
14480 bp, un->un_busy_timeout / 500);
14489 if (bp != un->un_retry_bp) {
14490 sd_reduce_throttle(un, SD_THROTTLE_TRAN_BUSY);
14498 sd_set_retry_bp(un, bp, un->un_busy_timeout / 500,
14503 un->un_tran_fatal_count++;
14508 un->un_ncmds_in_transport--;
14509 ASSERT(un->un_ncmds_in_transport >= 0);
14517 if (bp == un->un_rqs_bp) {
14518 bp = sd_mark_rqs_idle(un, xp);
14525 SD_UPDATE_ERRSTATS(un, sd_transerrs);
14528 SD_UPDATE_KSTATS(un, kstat_runq_exit, bp);
14529 sd_print_transport_rejected_message(un, xp, rval);
14539 ASSERT(un->un_fm_private != NULL);
14540 sfip = un->un_fm_private;
14542 sd_ssc_extract_info(&sfip->fm_ssc, un,
14553 sd_return_failed_command_no_restart(un, bp, EIO);
14559 if (un->un_state == SD_STATE_SUSPENDED) {
14560 cv_broadcast(&un->un_disk_busy_cv);
14573 ASSERT(mutex_owned(SD_MUTEX(un)));
14574 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, "sd_start_cmds: exit\n");
14589 sd_return_command(struct sd_lun *un, struct buf *bp) argument
14596 ASSERT(un != NULL);
14597 ASSERT(mutex_owned(SD_MUTEX(un)));
14598 ASSERT(bp != un->un_rqs_bp);
14603 sfip = (struct sd_fm_internal *)un->un_fm_private;
14606 SD_TRACE(SD_LOG_IO_CORE, un, "sd_return_command: entry\n");
14611 if ((un->un_partial_dma_supported == 1) &&
14616 if (sd_setup_next_xfer(un, bp, pktp, xp) != 0) {
14621 sd_retry_command(un, bp, SD_RETRIES_NOCHECK,
14623 sd_start_cmds(un, NULL);
14637 if (bp == un->un_failfast_bp) {
14638 ASSERT(un->un_failfast_state == SD_FAILFAST_INACTIVE);
14639 un->un_failfast_bp = NULL;
14646 un->un_failfast_state = SD_FAILFAST_INACTIVE;
14653 sd_ssc_extract_info(&sfip->fm_ssc, un, pktp, bp, xp);
14663 sd_ssc_extract_info(&sfip->fm_ssc, un, pktp, bp, xp);
14672 if (bp == un->un_retry_bp) {
14673 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
14675 "RETURNING retry_bp:0x%p\n", un, un->un_retry_bp);
14676 un->un_retry_bp = NULL;
14677 un->un_retry_statp = NULL;
14680 SD_UPDATE_RDWR_STATS(un, bp);
14681 SD_UPDATE_PARTITION_STATS(un, bp);
14683 switch (un->un_state) {
14689 cv_broadcast(&un->un_disk_busy_cv);
14692 sd_start_cmds(un, NULL);
14697 mutex_exit(SD_MUTEX(un));
14702 SD_BEGIN_IODONE(xp->xb_chain_iodone, un, bp);
14704 ASSERT(!mutex_owned(SD_MUTEX(un)));
14705 mutex_enter(SD_MUTEX(un));
14707 SD_TRACE(SD_LOG_IO_CORE, un, "sd_return_command: exit\n");
14720 sd_return_failed_command(struct sd_lun *un, struct buf *bp, int errcode) argument
14723 ASSERT(un != NULL);
14724 ASSERT(mutex_owned(SD_MUTEX(un)));
14726 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
14735 sd_return_command(un, bp);
14736 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
14751 sd_return_failed_command_no_restart(struct sd_lun *un, struct buf *bp, argument
14757 ASSERT(un != NULL);
14758 ASSERT(mutex_owned(SD_MUTEX(un)));
14763 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
14779 if (bp == un->un_failfast_bp) {
14780 ASSERT(un->un_failfast_state == SD_FAILFAST_INACTIVE);
14781 un->un_failfast_bp = NULL;
14784 if (bp == un->un_retry_bp) {
14789 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
14791 " un:0x%p: RETURNING retry_bp:0x%p\n", un, un->un_retry_bp);
14792 un->un_retry_bp = NULL;
14793 un->un_retry_statp = NULL;
14796 SD_UPDATE_RDWR_STATS(un, bp);
14797 SD_UPDATE_PARTITION_STATS(un, bp);
14799 mutex_exit(SD_MUTEX(un));
14806 SD_BEGIN_IODONE(xp->xb_chain_iodone, un, bp);
14808 mutex_enter(SD_MUTEX(un));
14810 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
14862 sd_retry_command(struct sd_lun *un, struct buf *bp, int retry_check_flag, argument
14863 void (*user_funcp)(struct sd_lun *un, struct buf *bp, void *argp, int code), argument
14871 ASSERT(un != NULL);
14872 ASSERT(mutex_owned(SD_MUTEX(un)));
14879 sfip = (struct sd_fm_internal *)un->un_fm_private;
14882 SD_TRACE(SD_LOG_IO | SD_LOG_ERROR, un,
14898 scsi_log(SD_DEVINFO(un), sd_label, CE_NOTE,
14900 sd_dump_memory(un, SD_LOG_IO, "CDB",
14902 sd_dump_memory(un, SD_LOG_IO, "Sense Data",
14913 switch (un->un_state) {
14916 bp->av_forw = un->un_waitq_headp;
14917 un->un_waitq_headp = bp;
14918 if (un->un_waitq_tailp == NULL) {
14919 un->un_waitq_tailp = bp;
14921 if (bp == un->un_retry_bp) {
14922 un->un_retry_bp = NULL;
14923 un->un_retry_statp = NULL;
14925 SD_UPDATE_KSTATS(un, kstat_waitq_enter, bp);
14926 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, "sd_retry_command: "
14956 if (un->un_failfast_state == SD_FAILFAST_ACTIVE) {
14957 ASSERT(un->un_failfast_bp == NULL);
14976 if (un->un_failfast_bp == NULL) {
14984 un->un_failfast_bp = bp;
14986 } else if (un->un_failfast_bp == bp) {
14993 un->un_failfast_state = SD_FAILFAST_ACTIVE;
14994 un->un_failfast_bp = NULL;
14995 sd_failfast_flushq(un);
15037 un->un_failfast_state = SD_FAILFAST_INACTIVE;
15051 if (xp->xb_victim_retry_count < un->un_victim_retry_count) {
15060 if (xp->xb_retry_count >= un->un_retry_count) {
15062 SD_TRACE(SD_LOG_IO_CORE, un,
15079 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
15086 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
15092 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
15098 if (xp->xb_retry_count >= un->un_busy_retry_count) {
15100 SD_TRACE(SD_LOG_IO_CORE, un,
15105 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
15126 sd_ssc_extract_info(&sfip->fm_ssc, un, pktp, bp, xp);
15141 if (un->un_ncmds_in_transport >= un->un_throttle) {
15146 retry_delay = un->un_busy_timeout;
15148 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
15157 (*user_funcp)(un, bp, user_arg,
15160 sd_print_incomplete_msg(un, bp, user_arg,
15162 sd_print_cmd_incomplete_msg(un, bp, user_arg,
15164 sd_print_sense_failed_msg(un, bp, user_arg,
15169 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
15176 sd_start_cmds(un, bp);
15178 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
15189 (*user_funcp)(un, bp, user_arg, SD_DELAYED_RETRY_ISSUED);
15192 sd_set_retry_bp(un, bp, retry_delay, statp);
15194 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, "sd_retry_command: exit\n");
15200 (*user_funcp)(un, bp, user_arg, SD_NO_RETRY_ISSUED);
15205 SD_INFO(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
15208 sd_return_failed_command(un, bp, failure_code);
15210 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, "sd_retry_command: exit\n");
15228 sd_set_retry_bp(struct sd_lun *un, struct buf *bp, clock_t retry_delay, argument
15231 ASSERT(un != NULL);
15232 ASSERT(mutex_owned(SD_MUTEX(un)));
15235 SD_TRACE(SD_LOG_IO | SD_LOG_ERROR, un,
15236 "sd_set_retry_bp: entry: un:0x%p bp:0x%p\n", un, bp);
15250 if (un->un_retry_bp == NULL) {
15251 ASSERT(un->un_retry_statp == NULL);
15252 un->un_retry_bp = bp;
15265 un->un_retry_statp = statp;
15270 if (un->un_retry_bp == bp) {
15277 un->un_retry_statp = statp;
15293 if ((retry_delay != 0) && (un->un_startstop_timeid == NULL) &&
15294 (un->un_direct_priority_timeid == NULL)) {
15295 un->un_retry_timeid =
15296 timeout(sd_start_retry_command, un, retry_delay);
15297 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
15300 un, bp, un->un_retry_timeid);
15313 if ((un->un_failfast_bp != NULL) &&
15314 (un->un_failfast_bp == un->un_waitq_headp)) {
15319 bp->av_forw = un->un_waitq_headp->av_forw;
15320 un->un_waitq_headp->av_forw = bp;
15321 if (un->un_waitq_headp == un->un_waitq_tailp) {
15322 un->un_waitq_tailp = bp;
15326 bp->av_forw = un->un_waitq_headp;
15327 un->un_waitq_headp = bp;
15328 if (un->un_waitq_tailp == NULL) {
15329 un->un_waitq_tailp = bp;
15336 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
15337 "sd_set_retry_bp: un:0x%p already delayed retry\n", un);
15342 SD_UPDATE_KSTATS(un, statp, bp);
15345 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
15346 "sd_set_retry_bp: exit un:0x%p\n", un);
15365 struct sd_lun *un = arg; local
15367 ASSERT(un != NULL);
15368 ASSERT(!mutex_owned(SD_MUTEX(un)));
15370 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
15373 mutex_enter(SD_MUTEX(un));
15375 un->un_retry_timeid = NULL;
15377 if (un->un_retry_bp != NULL) {
15378 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
15380 un, un->un_retry_bp);
15381 sd_start_cmds(un, un->un_retry_bp);
15384 mutex_exit(SD_MUTEX(un));
15386 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
15403 struct sd_lun *un = arg; local
15405 ASSERT(un != NULL);
15406 ASSERT(!mutex_owned(SD_MUTEX(un)));
15408 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
15411 mutex_enter(SD_MUTEX(un));
15413 if (un->un_rmw_incre_count > 0) {
15414 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
15418 un->un_rmw_incre_count, un->un_tgt_blocksize,
15420 un->un_rmw_incre_count = 0;
15421 un->un_rmw_msg_timeid = timeout(sd_rmw_msg_print_handler,
15422 un, SD_RMW_MSG_PRINT_TIMEOUT);
15424 un->un_rmw_msg_timeid = NULL;
15427 mutex_exit(SD_MUTEX(un));
15429 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
15450 struct sd_lun *un; local
15453 un = SD_GET_UN(priority_bp);
15454 ASSERT(un != NULL);
15455 ASSERT(!mutex_owned(SD_MUTEX(un)));
15457 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
15460 mutex_enter(SD_MUTEX(un));
15461 un->un_direct_priority_timeid = NULL;
15462 sd_start_cmds(un, priority_bp);
15463 mutex_exit(SD_MUTEX(un));
15465 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
15479 sd_send_request_sense_command(struct sd_lun *un, struct buf *bp, argument
15483 ASSERT(un != NULL);
15484 ASSERT(mutex_owned(SD_MUTEX(un)));
15486 SD_TRACE(SD_LOG_IO | SD_LOG_ERROR, un, "sd_send_request_sense_command: "
15494 if (ddi_in_panic() || (un->un_state == SD_STATE_SUSPENDED) ||
15495 (un->un_state == SD_STATE_DUMPING)) {
15496 sd_return_failed_command(un, bp, EIO);
15497 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
15511 if ((un->un_sense_isbusy != 0) || (un->un_ncmds_in_transport > 0)) {
15514 sd_retry_command(un, bp, SD_RETRIES_NOCHECK,
15515 NULL, NULL, 0, un->un_busy_timeout,
15517 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
15521 sd_return_failed_command(un, bp, EIO);
15522 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
15529 sd_mark_rqs_busy(un, bp);
15530 sd_start_cmds(un, un->un_rqs_bp);
15532 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
15547 sd_mark_rqs_busy(struct sd_lun *un, struct buf *bp) argument
15551 ASSERT(un != NULL);
15553 ASSERT(mutex_owned(SD_MUTEX(un)));
15554 ASSERT(un->un_sense_isbusy == 0);
15556 SD_TRACE(SD_LOG_IO_CORE, un, "sd_mark_rqs_busy: entry: "
15557 "buf:0x%p xp:0x%p un:0x%p\n", bp, SD_GET_XBUF(bp), un);
15559 sense_xp = SD_GET_XBUF(un->un_rqs_bp);
15562 SD_INFO(SD_LOG_IO, un,
15569 un->un_sense_isbusy = 1;
15570 un->un_rqs_bp->b_resid = 0;
15577 bzero(un->un_rqs_bp->b_un.b_addr, SENSE_LENGTH);
15603 SD_TRACE(SD_LOG_IO_CORE, un, "sd_mark_rqs_busy: exit\n");
15620 sd_mark_rqs_idle(struct sd_lun *un, struct sd_xbuf *sense_xp) argument
15623 ASSERT(un != NULL);
15625 ASSERT(mutex_owned(SD_MUTEX(un)));
15626 ASSERT(un->un_sense_isbusy != 0);
15628 un->un_sense_isbusy = 0;
15651 sd_alloc_rqs(struct scsi_device *devp, struct sd_lun *un) argument
15655 ASSERT(un != NULL);
15656 ASSERT(!mutex_owned(SD_MUTEX(un)));
15657 ASSERT(un->un_rqs_bp == NULL);
15658 ASSERT(un->un_rqs_pktp == NULL);
15664 un->un_rqs_bp = scsi_alloc_consistent_buf(&devp->sd_address, NULL,
15666 if (un->un_rqs_bp == NULL) {
15670 un->un_rqs_pktp = scsi_init_pkt(&devp->sd_address, NULL, un->un_rqs_bp,
15673 if (un->un_rqs_pktp == NULL) {
15674 sd_free_rqs(un);
15679 (void) scsi_setup_cdb((union scsi_cdb *)un->un_rqs_pktp->pkt_cdbp,
15682 SD_FILL_SCSI1_LUN(un, un->un_rqs_pktp);
15685 un->un_rqs_pktp->pkt_comp = sdintr;
15686 un->un_rqs_pktp->pkt_time = sd_io_time;
15687 un->un_rqs_pktp->pkt_flags |=
15696 sd_xbuf_init(un, un->un_rqs_bp, xp, SD_CHAIN_NULL, NULL);
15697 xp->xb_pktp = un->un_rqs_pktp;
15698 SD_INFO(SD_LOG_ATTACH_DETACH, un,
15700 un, xp, un->un_rqs_pktp, un->un_rqs_bp);
15706 un->un_rqs_pktp->pkt_private = un->un_rqs_bp;
15707 ASSERT(un->un_rqs_bp->b_private == xp);
15726 if (un->un_f_is_fibre == TRUE) {
15727 un->un_f_arq_enabled = TRUE;
15734 (void) scsi_ifsetcap(SD_ADDRESS(un), "auto-rqsense", 1, 1);
15736 switch (scsi_ifgetcap(SD_ADDRESS(un), "auto-rqsense", 1)) {
15738 SD_INFO(SD_LOG_ATTACH_DETACH, un,
15745 if (scsi_ifsetcap(SD_ADDRESS(un), "auto-rqsense", 1, 1)
15748 SD_INFO(SD_LOG_ATTACH_DETACH, un,
15750 un->un_f_arq_enabled = TRUE;
15753 SD_INFO(SD_LOG_ATTACH_DETACH, un,
15755 un->un_f_arq_enabled = FALSE;
15763 SD_INFO(SD_LOG_ATTACH_DETACH, un,
15765 un->un_f_arq_enabled = TRUE;
15772 SD_INFO(SD_LOG_ATTACH_DETACH, un,
15774 un->un_f_arq_enabled = FALSE;
15792 sd_free_rqs(struct sd_lun *un) argument
15794 ASSERT(un != NULL);
15796 SD_TRACE(SD_LOG_IO_CORE, un, "sd_free_rqs: entry\n");
15805 if (un->un_rqs_pktp != NULL) {
15806 scsi_destroy_pkt(un->un_rqs_pktp);
15807 un->un_rqs_pktp = NULL;
15810 if (un->un_rqs_bp != NULL) {
15811 struct sd_xbuf *xp = SD_GET_XBUF(un->un_rqs_bp);
15815 scsi_free_consistent_buf(un->un_rqs_bp);
15816 un->un_rqs_bp = NULL;
15818 SD_TRACE(SD_LOG_IO_CORE, un, "sd_free_rqs: exit\n");
15840 sd_reduce_throttle(struct sd_lun *un, int throttle_type) argument
15842 ASSERT(un != NULL);
15843 ASSERT(mutex_owned(SD_MUTEX(un)));
15844 ASSERT(un->un_ncmds_in_transport >= 0);
15846 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, "sd_reduce_throttle: "
15848 un, un->un_throttle, un->un_ncmds_in_transport);
15850 if (un->un_throttle > 1) {
15851 if (un->un_f_use_adaptive_throttle == TRUE) {
15854 if (un->un_busy_throttle == 0) {
15855 un->un_busy_throttle = un->un_throttle;
15859 un->un_busy_throttle = 0;
15865 if (un->un_ncmds_in_transport > 0) {
15866 un->un_throttle = un->un_ncmds_in_transport;
15870 if (un->un_ncmds_in_transport == 0) {
15871 un->un_throttle = 1;
15873 un->un_throttle = un->un_ncmds_in_transport;
15879 if (un->un_reset_throttle_timeid == NULL) {
15880 un->un_reset_throttle_timeid = timeout(sd_restore_throttle,
15881 un, SD_THROTTLE_RESET_INTERVAL);
15882 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
15886 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, "sd_reduce_throttle: "
15887 "exit: un:0x%p un_throttle:%d\n", un, un->un_throttle);
15906 struct sd_lun *un = arg; local
15908 ASSERT(un != NULL);
15909 ASSERT(!mutex_owned(SD_MUTEX(un)));
15911 mutex_enter(SD_MUTEX(un));
15913 SD_TRACE(SD_LOG_IO | SD_LOG_ERROR, un, "sd_restore_throttle: "
15914 "entry: un:0x%p un_throttle:%d\n", un, un->un_throttle);
15916 un->un_reset_throttle_timeid = NULL;
15918 if (un->un_f_use_adaptive_throttle == TRUE) {
15928 if (un->un_busy_throttle > 0) {
15929 un->un_throttle = un->un_busy_throttle;
15930 un->un_busy_throttle = 0;
15939 throttle = un->un_throttle +
15940 max((un->un_throttle / 10), 1);
15941 un->un_throttle =
15942 (throttle < un->un_saved_throttle) ?
15943 throttle : un->un_saved_throttle;
15944 if (un->un_throttle < un->un_saved_throttle) {
15945 un->un_reset_throttle_timeid =
15947 un,
15958 if (un->un_throttle < un->un_min_throttle) {
15959 un->un_throttle = un->un_saved_throttle;
15962 SD_TRACE(SD_LOG_IO | SD_LOG_ERROR, un, "sd_restore_throttle: "
15964 un->un_throttle, un->un_saved_throttle);
15965 un->un_throttle = un->un_saved_throttle;
15968 SD_TRACE(SD_LOG_IO | SD_LOG_ERROR, un,
15971 sd_start_cmds(un, NULL);
15973 SD_TRACE(SD_LOG_IO | SD_LOG_ERROR, un,
15975 un, un->un_throttle);
15977 mutex_exit(SD_MUTEX(un));
15979 SD_TRACE(SD_LOG_IO | SD_LOG_ERROR, un, "sd_restore_throttle: exit\n");
16011 struct sd_lun *un = (struct sd_lun *)arg; local
16013 ASSERT(un != NULL);
16014 ASSERT(!mutex_owned(SD_MUTEX(un)));
16016 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, "sdrunout: entry\n");
16018 mutex_enter(SD_MUTEX(un));
16019 sd_start_cmds(un, NULL);
16020 mutex_exit(SD_MUTEX(un));
16026 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, "sdrunout: exit\n");
16045 struct sd_lun *un; local
16055 un = SD_GET_UN(bp);
16056 ASSERT(un != NULL);
16057 ASSERT(!mutex_owned(SD_MUTEX(un)));
16061 SD_INFO(SD_LOG_IOERR, un, "sdintr: sdintr calling Fault injection\n");
16067 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, "sdintr: entry: buf:0x%p,"
16068 " xp:0x%p, un:0x%p\n", bp, xp, un);
16070 mutex_enter(SD_MUTEX(un));
16072 ASSERT(un->un_fm_private != NULL);
16073 sscp = &((struct sd_fm_internal *)(un->un_fm_private))->fm_ssc;
16077 un->un_ncmds_in_transport--;
16078 ASSERT(un->un_ncmds_in_transport >= 0);
16081 un->un_in_callback++;
16083 SD_UPDATE_KSTATS(un, kstat_runq_exit, bp);
16086 if (bp == un->un_retry_bp) {
16087 SD_TRACE(SD_LOG_IO | SD_LOG_ERROR, un, "sdintr: "
16089 un, un->un_retry_bp, un->un_ncmds_in_transport);
16099 if (un->un_last_pkt_reason != CMD_DEV_GONE) {
16100 un->un_last_pkt_reason = CMD_DEV_GONE;
16101 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
16104 if (un->un_mediastate != DKIO_DEV_GONE) {
16105 un->un_mediastate = DKIO_DEV_GONE;
16106 cv_broadcast(&un->un_state_cv);
16112 if (bp == un->un_rqs_bp) {
16113 bp = sd_mark_rqs_idle(un, xp);
16115 sd_return_failed_command(un, bp, EIO);
16120 SD_TRACE(SD_LOG_COMMON, un,
16130 (un->un_f_arq_enabled == TRUE)) {
16177 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
16179 sd_return_failed_command(un, bp, EIO);
16193 if ((un->un_f_is_fibre == TRUE) &&
16201 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
16204 sd_handle_auto_request_sense(un, bp, xp, pktp);
16211 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
16213 sd_handle_request_sense(un, bp, xp, pktp);
16241 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
16246 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
16250 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
16255 sd_return_command(un, bp);
16261 un->un_in_callback--;
16262 ASSERT(un->un_in_callback >= 0);
16263 mutex_exit(SD_MUTEX(un));
16292 if ((un->un_f_is_fibre == TRUE) &&
16307 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
16316 sd_send_request_sense_command(un, bp, pktp);
16318 sd_return_failed_command(un, bp, EIO);
16335 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
16337 sd_pkt_status_good(un, bp, xp, pktp);
16342 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
16344 sd_pkt_status_check_condition(un, bp, xp, pktp);
16348 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
16350 sd_pkt_status_busy(un, bp, xp, pktp);
16354 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
16356 sd_pkt_status_reservation_conflict(un, bp, xp, pktp);
16360 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
16362 sd_pkt_status_qfull(un, bp, xp, pktp);
16370 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
16381 sd_return_failed_command(un, bp, EIO);
16385 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
16392 sd_return_failed_command(un, bp, EIO);
16399 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
16401 sd_pkt_reason_cmd_incomplete(un, bp, xp, pktp);
16404 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
16406 sd_pkt_reason_cmd_tran_err(un, bp, xp, pktp);
16409 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
16411 sd_pkt_reason_cmd_reset(un, bp, xp, pktp);
16414 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
16416 sd_pkt_reason_cmd_aborted(un, bp, xp, pktp);
16419 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
16421 sd_pkt_reason_cmd_timeout(un, bp, xp, pktp);
16424 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
16426 sd_pkt_reason_cmd_unx_bus_free(un, bp, xp, pktp);
16429 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
16431 sd_pkt_reason_cmd_tag_reject(un, bp, xp, pktp);
16434 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
16443 sd_pkt_reason_default(un, bp, xp, pktp);
16448 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, "sdintr: exit\n");
16451 un->un_in_callback--;
16452 ASSERT(un->un_in_callback >= 0);
16460 mutex_exit(SD_MUTEX(un));
16479 sd_print_incomplete_msg(struct sd_lun *un, struct buf *bp, void *arg, int code) argument
16485 ASSERT(un != NULL);
16486 ASSERT(mutex_owned(SD_MUTEX(un)));
16504 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
16520 sd_pkt_status_good(struct sd_lun *un, struct buf *bp, argument
16525 ASSERT(un != NULL);
16526 ASSERT(mutex_owned(SD_MUTEX(un)));
16534 SD_TRACE(SD_LOG_IO_CORE, un, "sd_pkt_status_good: entry\n");
16536 SD_UPDATE_ERRSTATS(un, sd_harderrs);
16546 sd_return_command(un, bp);
16547 SD_TRACE(SD_LOG_IO_CORE, un, "sd_pkt_status_good: exit\n");
16556 sd_retry_command(un, bp, SD_RETRIES_STANDARD, sd_print_incomplete_msg,
16559 SD_TRACE(SD_LOG_IO_CORE, un, "sd_pkt_status_good: exit\n");
16580 sd_handle_request_sense(struct sd_lun *un, struct buf *sense_bp, argument
16588 ASSERT(un != NULL);
16589 ASSERT(mutex_owned(SD_MUTEX(un)));
16598 ASSERT(sense_pktp == un->un_rqs_pktp);
16599 ASSERT(sense_bp == un->un_rqs_bp);
16617 SD_UPDATE_ERRSTATS(un, sd_harderrs);
16619 cmd_bp = sd_mark_rqs_idle(un, sense_xp);
16620 sd_retry_command(un, cmd_bp, SD_RETRIES_STANDARD,
16662 (void) sd_mark_rqs_idle(un, sense_xp);
16670 if (sd_validate_sense_data(un, cmd_bp, cmd_xp, actual_len) ==
16672 sd_decode_sense(un, cmd_bp, cmd_xp, cmd_pktp);
16675 SD_DUMP_MEMORY(un, SD_LOG_IO_CORE, "Failed CDB",
16677 SD_DUMP_MEMORY(un, SD_LOG_IO_CORE, "Sense Data",
16679 sd_return_failed_command(un, cmd_bp, EIO);
16700 sd_handle_auto_request_sense(struct sd_lun *un, struct buf *bp, argument
16706 ASSERT(un != NULL);
16707 ASSERT(mutex_owned(SD_MUTEX(un)));
16711 ASSERT(pktp != un->un_rqs_pktp);
16712 ASSERT(bp != un->un_rqs_bp);
16726 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
16730 sd_reset_target(un, pktp);
16732 sd_retry_command(un, bp, SD_RETRIES_STANDARD,
16768 if (sd_validate_sense_data(un, bp, xp, actual_len) ==
16770 sd_decode_sense(un, bp, xp, pktp);
16790 sd_print_sense_failed_msg(struct sd_lun *un, struct buf *bp, void *arg, argument
16795 ASSERT(un != NULL);
16796 ASSERT(mutex_owned(SD_MUTEX(un)));
16800 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, msgp);
16819 sd_validate_sense_data(struct sd_lun *un, struct buf *bp, struct sd_xbuf *xp, argument
16827 ASSERT(un != NULL);
16828 ASSERT(mutex_owned(SD_MUTEX(un)));
16830 ASSERT(bp != un->un_rqs_bp);
16832 ASSERT(un->un_fm_private != NULL);
16837 sscp = &((struct sd_fm_internal *)(un->un_fm_private))->fm_ssc;
16848 sd_pkt_status_reservation_conflict(un, bp, xp, pktp);
16852 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
16854 sd_retry_command(un, bp, SD_RETRIES_BUSY, NULL,
16855 NULL, EIO, un->un_busy_timeout / 500, kstat_waitq_enter);
16859 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
16861 sd_retry_command(un, bp, SD_RETRIES_STANDARD, NULL,
16862 NULL, EIO, un->un_busy_timeout / 500, kstat_waitq_enter);
16916 if (SD_FM_LOG(un) == SD_FM_LOG_NSUP) {
16917 scsi_log(SD_DEVINFO(un), sd_label,
16930 sd_return_failed_command(un, bp, EIO);
16964 sd_retry_command(un, bp, SD_RETRIES_STANDARD,
16966 un->un_f_is_fibre ? drv_usectohz(100000) : (clock_t)0, NULL);
16980 sd_decode_sense(struct sd_lun *un, struct buf *bp, struct sd_xbuf *xp, argument
16985 ASSERT(un != NULL);
16986 ASSERT(mutex_owned(SD_MUTEX(un)));
16988 ASSERT(bp != un->un_rqs_bp);
16996 sd_sense_key_no_sense(un, bp, xp, pktp);
16999 sd_sense_key_recoverable_error(un, xp->xb_sense_data,
17003 sd_sense_key_not_ready(un, xp->xb_sense_data,
17008 sd_sense_key_medium_or_hardware_error(un,
17012 sd_sense_key_illegal_request(un, bp, xp, pktp);
17015 sd_sense_key_unit_attention(un, xp->xb_sense_data,
17021 sd_sense_key_fail_command(un, bp, xp, pktp);
17024 sd_sense_key_blank_check(un, bp, xp, pktp);
17027 sd_sense_key_aborted_command(un, bp, xp, pktp);
17034 sd_sense_key_default(un, xp->xb_sense_data,
17067 sd_dump_memory(struct sd_lun *un, uint_t comp, char *title, uchar_t *data, argument
17149 scsi_log(SD_DEVINFO(un), sd_label, CE_NOTE, "%s", local_buf);
17169 sd_print_sense_msg(struct sd_lun *un, struct buf *bp, void *arg, int code) argument
17180 ASSERT(un != NULL);
17181 ASSERT(mutex_owned(SD_MUTEX(un)));
17234 sd_dump_memory(un, SD_LOG_IO, "Failed CDB",
17236 sd_dump_memory(un, SD_LOG_IO, "Sense Data",
17252 if (SD_FM_LOG(un) == SD_FM_LOG_NSUP ||
17255 scsi_vu_errmsg(SD_SCSI_DEVP(un), pktp, sd_label, severity,
17258 un->un_additional_codes, NULL);
17271 sd_sense_key_no_sense(struct sd_lun *un, struct buf *bp, struct sd_xbuf *xp, argument
17276 ASSERT(un != NULL);
17277 ASSERT(mutex_owned(SD_MUTEX(un)));
17285 SD_UPDATE_ERRSTATS(un, sd_softerrs);
17287 sd_retry_command(un, bp, SD_RETRIES_STANDARD, sd_print_sense_msg,
17301 sd_sense_key_recoverable_error(struct sd_lun *un, uint8_t *sense_datap, argument
17308 ASSERT(un != NULL);
17309 ASSERT(mutex_owned(SD_MUTEX(un)));
17318 sd_return_command(un, bp);
17326 SD_UPDATE_ERRSTATS(un, sd_rq_pfa_err);
17330 SD_UPDATE_ERRSTATS(un, sd_softerrs);
17331 SD_UPDATE_ERRSTATS(un, sd_rq_recov_err);
17337 sd_print_sense_msg(un, bp, &si, SD_NO_RETRY_ISSUED);
17338 sd_return_command(un, bp);
17342 sd_retry_command(un, bp, SD_RETRIES_STANDARD, sd_print_sense_msg,
17358 sd_sense_key_not_ready(struct sd_lun *un, uint8_t *sense_datap, struct buf *bp, argument
17365 ASSERT(un != NULL);
17366 ASSERT(mutex_owned(SD_MUTEX(un)));
17379 if ((ISCD(un) && (asc == 0x3A)) ||
17381 SD_UPDATE_ERRSTATS(un, sd_harderrs);
17382 SD_UPDATE_ERRSTATS(un, sd_rq_ntrdy_err);
17388 if (xp->xb_nr_retry_count >= un->un_notready_retry_count) {
17390 if (un->un_f_has_removable_media && (asc == 0x04) &&
17409 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
17439 if (un->un_f_is_fibre == TRUE) {
17442 (un->un_startstop_timeid == NULL)) {
17443 scsi_log(SD_DEVINFO(un), sd_label,
17446 sd_reset_target(un, pktp);
17451 un->un_reset_retry_count)) &&
17452 (un->un_startstop_timeid == NULL)) {
17453 scsi_log(SD_DEVINFO(un), sd_label,
17456 sd_reset_target(un, pktp);
17494 if (un->un_f_has_removable_media) {
17529 if (un->un_startstop_timeid != NULL) {
17530 SD_INFO(SD_LOG_ERROR, un,
17532 " %s%d\n", ddi_driver_name(SD_DEVINFO(un)),
17533 ddi_get_instance(SD_DEVINFO(un)));
17546 un->un_startstop_timeid = timeout(sd_start_stop_unit_callback,
17547 un, un->un_busy_timeout / 2);
17549 sd_set_retry_bp(un, bp, 0, kstat_waitq_enter);
17554 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
17561 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
17565 sr_ejected(un);
17566 un->un_mediastate = DKIO_EJECTED;
17568 cv_broadcast(&un->un_state_cv);
17574 scsi_log(SD_DEVINFO(un), sd_label, CE_NOTE,
17589 sd_retry_command(un, bp, SD_RETRIES_NOCHECK, sd_print_sense_msg,
17590 &si, EIO, un->un_busy_timeout, NULL);
17595 sd_print_sense_msg(un, bp, &si, SD_NO_RETRY_ISSUED);
17596 sd_return_failed_command(un, bp, EIO);
17611 sd_sense_key_medium_or_hardware_error(struct sd_lun *un, uint8_t *sense_datap, argument
17617 ASSERT(un != NULL);
17618 ASSERT(mutex_owned(SD_MUTEX(un)));
17627 SD_UPDATE_ERRSTATS(un, sd_rq_media_err);
17630 SD_UPDATE_ERRSTATS(un, sd_harderrs);
17632 if ((un->un_reset_retry_count != 0) &&
17633 (xp->xb_retry_count == un->un_reset_retry_count)) {
17634 mutex_exit(SD_MUTEX(un));
17636 if (un->un_f_allow_bus_device_reset == TRUE) {
17639 if (un->un_f_lun_reset_enabled == TRUE) {
17640 SD_TRACE(SD_LOG_IO_CORE, un,
17643 reset_retval = scsi_reset(SD_ADDRESS(un),
17647 SD_TRACE(SD_LOG_IO_CORE, un,
17650 (void) scsi_reset(SD_ADDRESS(un),
17654 mutex_enter(SD_MUTEX(un));
17661 sd_retry_command(un, bp, SD_RETRIES_STANDARD, sd_print_sense_msg,
17676 sd_sense_key_illegal_request(struct sd_lun *un, struct buf *bp, argument
17681 ASSERT(un != NULL);
17682 ASSERT(mutex_owned(SD_MUTEX(un)));
17687 SD_UPDATE_ERRSTATS(un, sd_rq_illrq_err);
17693 sd_print_sense_msg(un, bp, &si, SD_NO_RETRY_ISSUED);
17694 sd_return_failed_command(un, bp, EIO);
17709 sd_sense_key_unit_attention(struct sd_lun *un, uint8_t *sense_datap, argument
17723 ASSERT(un != NULL);
17724 ASSERT(mutex_owned(SD_MUTEX(un)));
17736 SD_UPDATE_ERRSTATS(un, sd_rq_pfa_err);
17745 if ((un->un_resvd_status & SD_RESERVE) == SD_RESERVE) {
17746 un->un_resvd_status |=
17749 if (un->un_blockcount + 1 > SD_GROUP1_MAX_ADDRESS) {
17751 un, KM_NOSLEEP) == TASKQID_INVALID) {
17757 SD_ERROR(SD_LOG_ERROR, un,
17766 if (!un->un_f_has_removable_media) {
17785 SD_UPDATE_ERRSTATS(un, sd_harderrs);
17786 SD_UPDATE_ERRSTATS(un, sd_rq_nodev_err);
17788 sd_print_sense_msg(un, bp, &si, SD_NO_RETRY_ISSUED);
17789 sd_return_failed_command(un, bp, EIO);
17826 if (taskq_dispatch(sd_tq, sd_target_change_task, un,
17828 SD_ERROR(SD_LOG_ERROR, un,
17838 SD_UPDATE_ERRSTATS(un, sd_harderrs);
17839 SD_UPDATE_ERRSTATS(un, sd_rq_nodev_err);
17843 sd_retry_command(un, bp, retry_check_flag, sd_print_sense_msg, &si,
17859 sd_sense_key_fail_command(struct sd_lun *un, struct buf *bp, struct sd_xbuf *xp, argument
17864 ASSERT(un != NULL);
17865 ASSERT(mutex_owned(SD_MUTEX(un)));
17873 sd_print_sense_msg(un, bp, &si, SD_NO_RETRY_ISSUED);
17874 sd_return_failed_command(un, bp, EIO);
17889 sd_sense_key_blank_check(struct sd_lun *un, struct buf *bp, struct sd_xbuf *xp, argument
17894 ASSERT(un != NULL);
17895 ASSERT(mutex_owned(SD_MUTEX(un)));
17904 si.ssi_severity = (un->un_f_has_removable_media) ? SCSI_ERR_ALL :
17908 sd_print_sense_msg(un, bp, &si, SD_NO_RETRY_ISSUED);
17909 sd_return_failed_command(un, bp, EIO);
17924 sd_sense_key_aborted_command(struct sd_lun *un, struct buf *bp, argument
17929 ASSERT(un != NULL);
17930 ASSERT(mutex_owned(SD_MUTEX(un)));
17938 SD_UPDATE_ERRSTATS(un, sd_harderrs);
17944 sd_retry_command(un, bp, SD_RETRIES_STANDARD, sd_print_sense_msg,
17960 sd_sense_key_default(struct sd_lun *un, uint8_t *sense_datap, struct buf *bp, argument
17966 ASSERT(un != NULL);
17967 ASSERT(mutex_owned(SD_MUTEX(un)));
17972 SD_UPDATE_ERRSTATS(un, sd_harderrs);
17979 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
17986 sd_retry_command(un, bp, SD_RETRIES_STANDARD, sd_print_sense_msg,
18007 sd_print_retry_msg(struct sd_lun *un, struct buf *bp, void *arg, int flag) argument
18014 ASSERT(un != NULL);
18015 ASSERT(mutex_owned(SD_MUTEX(un)));
18022 ASSERT(!mutex_owned(&un->un_pm_mutex));
18023 mutex_enter(&un->un_pm_mutex);
18024 if ((un->un_state == SD_STATE_SUSPENDED) ||
18025 (SD_DEVICE_IS_IN_LOW_POWER(un)) ||
18027 mutex_exit(&un->un_pm_mutex);
18030 mutex_exit(&un->un_pm_mutex);
18043 if (ddi_in_panic() || (un->un_state == SD_STATE_OFFLINE) ||
18044 ((pktp->pkt_reason == un->un_last_pkt_reason) &&
18057 if (SD_FM_LOG(un) == SD_FM_LOG_NSUP) {
18058 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
18071 un->un_last_pkt_reason = pktp->pkt_reason;
18091 sd_print_cmd_incomplete_msg(struct sd_lun *un, struct buf *bp, void *arg, argument
18096 ASSERT(un != NULL);
18097 ASSERT(mutex_owned(SD_MUTEX(un)));
18103 if (un->un_state != SD_STATE_OFFLINE) {
18110 dip = un->un_sd->sd_dev;
18113 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
18116 New_state(un, SD_STATE_OFFLINE);
18124 sd_print_retry_msg(un, bp, arg, code);
18139 sd_pkt_reason_cmd_incomplete(struct sd_lun *un, struct buf *bp, argument
18144 ASSERT(un != NULL);
18145 ASSERT(mutex_owned(SD_MUTEX(un)));
18153 SD_UPDATE_ERRSTATS(un, sd_transerrs);
18154 sd_reset_target(un, pktp);
18167 SD_UPDATE_RESERVATION_STATUS(un, pktp);
18169 sd_retry_command(un, bp, flag,
18184 sd_pkt_reason_cmd_tran_err(struct sd_lun *un, struct buf *bp, argument
18187 ASSERT(un != NULL);
18188 ASSERT(mutex_owned(SD_MUTEX(un)));
18197 SD_UPDATE_ERRSTATS(un, sd_harderrs);
18201 SD_UPDATE_ERRSTATS(un, sd_transerrs);
18202 sd_reset_target(un, pktp);
18205 SD_UPDATE_RESERVATION_STATUS(un, pktp);
18207 sd_retry_command(un, bp, (SD_RETRIES_STANDARD | SD_RETRIES_ISOLATE),
18222 sd_pkt_reason_cmd_reset(struct sd_lun *un, struct buf *bp, struct sd_xbuf *xp, argument
18225 ASSERT(un != NULL);
18226 ASSERT(mutex_owned(SD_MUTEX(un)));
18232 SD_UPDATE_ERRSTATS(un, sd_transerrs);
18233 sd_reset_target(un, pktp);
18235 SD_UPDATE_RESERVATION_STATUS(un, pktp);
18244 sd_retry_command(un, bp, (SD_RETRIES_VICTIM | SD_RETRIES_ISOLATE),
18260 sd_pkt_reason_cmd_aborted(struct sd_lun *un, struct buf *bp, struct sd_xbuf *xp, argument
18263 ASSERT(un != NULL);
18264 ASSERT(mutex_owned(SD_MUTEX(un)));
18270 SD_UPDATE_ERRSTATS(un, sd_transerrs);
18271 sd_reset_target(un, pktp);
18273 SD_UPDATE_RESERVATION_STATUS(un, pktp);
18282 sd_retry_command(un, bp, (SD_RETRIES_VICTIM | SD_RETRIES_ISOLATE),
18297 sd_pkt_reason_cmd_timeout(struct sd_lun *un, struct buf *bp, struct sd_xbuf *xp, argument
18300 ASSERT(un != NULL);
18301 ASSERT(mutex_owned(SD_MUTEX(un)));
18307 SD_UPDATE_ERRSTATS(un, sd_transerrs);
18308 sd_reset_target(un, pktp);
18310 SD_UPDATE_RESERVATION_STATUS(un, pktp);
18317 sd_retry_command(un, bp,
18333 sd_pkt_reason_cmd_unx_bus_free(struct sd_lun *un, struct buf *bp, argument
18336 void (*funcp)(struct sd_lun *un, struct buf *bp, void *arg, int code);
18338 ASSERT(un != NULL);
18339 ASSERT(mutex_owned(SD_MUTEX(un)));
18344 SD_UPDATE_ERRSTATS(un, sd_harderrs);
18345 SD_UPDATE_RESERVATION_STATUS(un, pktp);
18350 sd_retry_command(un, bp, (SD_RETRIES_STANDARD | SD_RETRIES_ISOLATE),
18364 sd_pkt_reason_cmd_tag_reject(struct sd_lun *un, struct buf *bp, argument
18367 ASSERT(un != NULL);
18368 ASSERT(mutex_owned(SD_MUTEX(un)));
18373 SD_UPDATE_ERRSTATS(un, sd_harderrs);
18375 un->un_tagflags = 0;
18376 if (un->un_f_opt_queueing == TRUE) {
18377 un->un_throttle = min(un->un_throttle, 3);
18379 un->un_throttle = 1;
18381 mutex_exit(SD_MUTEX(un));
18382 (void) scsi_ifsetcap(SD_ADDRESS(un), "tagged-qing", 0, 1);
18383 mutex_enter(SD_MUTEX(un));
18385 SD_UPDATE_RESERVATION_STATUS(un, pktp);
18388 sd_retry_command(un, bp, (SD_RETRIES_NOCHECK | SD_RETRIES_ISOLATE),
18403 sd_pkt_reason_default(struct sd_lun *un, struct buf *bp, struct sd_xbuf *xp, argument
18406 ASSERT(un != NULL);
18407 ASSERT(mutex_owned(SD_MUTEX(un)));
18412 SD_UPDATE_ERRSTATS(un, sd_transerrs);
18413 sd_reset_target(un, pktp);
18415 SD_UPDATE_RESERVATION_STATUS(un, pktp);
18417 sd_retry_command(un, bp, (SD_RETRIES_STANDARD | SD_RETRIES_ISOLATE),
18432 sd_pkt_status_check_condition(struct sd_lun *un, struct buf *bp, argument
18435 ASSERT(un != NULL);
18436 ASSERT(mutex_owned(SD_MUTEX(un)));
18441 SD_TRACE(SD_LOG_IO, un, "sd_pkt_status_check_condition: "
18450 if (un->un_f_arq_enabled == FALSE) {
18451 SD_INFO(SD_LOG_IO_CORE, un, "sd_pkt_status_check_condition: "
18453 sd_send_request_sense_command(un, bp, pktp);
18455 SD_INFO(SD_LOG_IO_CORE, un, "sd_pkt_status_check_condition: "
18461 sd_retry_command(un, bp, SD_RETRIES_STANDARD, NULL, NULL, EIO,
18462 un->un_f_is_fibre?drv_usectohz(100000):(clock_t)0,
18466 SD_TRACE(SD_LOG_IO_CORE, un, "sd_pkt_status_check_condition: exit\n");
18479 sd_pkt_status_busy(struct sd_lun *un, struct buf *bp, struct sd_xbuf *xp, argument
18482 ASSERT(un != NULL);
18483 ASSERT(mutex_owned(SD_MUTEX(un)));
18488 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
18492 if (xp->xb_retry_count >= un->un_busy_retry_count) {
18493 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
18495 sd_return_failed_command(un, bp, EIO);
18496 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
18510 ((un->un_reset_retry_count < 2) ? 2 : un->un_reset_retry_count)) {
18512 mutex_exit(SD_MUTEX(un));
18513 if (un->un_f_allow_bus_device_reset == TRUE) {
18518 if (un->un_f_lun_reset_enabled == TRUE) {
18519 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
18521 rval = scsi_reset(SD_ADDRESS(un), RESET_LUN);
18524 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
18526 rval = scsi_reset(SD_ADDRESS(un), RESET_TARGET);
18534 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
18536 rval = scsi_reset(SD_ADDRESS(un), RESET_ALL);
18538 mutex_enter(SD_MUTEX(un));
18544 sd_return_failed_command(un, bp, EIO);
18545 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
18555 sd_retry_command(un, bp, SD_RETRIES_NOCHECK, NULL, NULL,
18556 EIO, un->un_busy_timeout, NULL);
18558 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
18573 sd_pkt_status_reservation_conflict(struct sd_lun *un, struct buf *bp, argument
18576 ASSERT(un != NULL);
18577 ASSERT(mutex_owned(SD_MUTEX(un)));
18587 if (un->un_reservation_type == SD_SCSI3_RESERVATION) {
18591 sd_return_failed_command(un, bp, EACCES);
18596 un->un_resvd_status |= SD_RESERVATION_CONFLICT;
18598 if ((un->un_resvd_status & SD_FAILFAST) != 0) {
18601 sd_panic_for_res_conflict(un);
18604 SD_ERROR(SD_LOG_IO, un,
18606 sd_return_failed_command(un, bp, EACCES);
18620 SD_ERROR(SD_LOG_IO, un,
18622 sd_return_failed_command(un, bp, EIO);
18632 sd_retry_command(un, bp, SD_RETRIES_STANDARD, NULL, NULL, EIO,
18655 sd_pkt_status_qfull(struct sd_lun *un, struct buf *bp, struct sd_xbuf *xp, argument
18658 ASSERT(un != NULL);
18659 ASSERT(mutex_owned(SD_MUTEX(un)));
18664 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
18671 sd_reduce_throttle(un, SD_THROTTLE_QFULL);
18672 sd_retry_command(un, bp, SD_RETRIES_NOCHECK, NULL, NULL, 0,
18675 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
18690 sd_reset_target(struct sd_lun *un, struct scsi_pkt *pktp) argument
18694 ASSERT(un != NULL);
18695 ASSERT(mutex_owned(SD_MUTEX(un)));
18698 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, "sd_reset_target: entry\n");
18705 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
18710 mutex_exit(SD_MUTEX(un));
18712 if (un->un_f_allow_bus_device_reset == TRUE) {
18713 if (un->un_f_lun_reset_enabled == TRUE) {
18714 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
18716 rval = scsi_reset(SD_ADDRESS(un), RESET_LUN);
18719 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
18721 rval = scsi_reset(SD_ADDRESS(un), RESET_TARGET);
18726 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
18728 (void) scsi_reset(SD_ADDRESS(un), RESET_ALL);
18731 mutex_enter(SD_MUTEX(un));
18733 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, "sd_reset_target: exit\n");
18746 struct sd_lun *un = arg; local
18752 ASSERT(un != NULL);
18753 ASSERT(!mutex_owned(SD_MUTEX(un)));
18755 if ((un->un_f_blockcount_is_valid == FALSE) ||
18756 (un->un_f_tgt_blocksize_is_valid == FALSE)) {
18760 ssc = sd_ssc_init(un);
18764 SD_ERROR(SD_LOG_ERROR, un,
18770 mutex_enter(SD_MUTEX(un));
18771 if (capacity <= un->un_blockcount) {
18772 mutex_exit(SD_MUTEX(un));
18776 sd_update_block_info(un, lbasize, capacity);
18777 mutex_exit(SD_MUTEX(un));
18783 if (cmlb_efi_label_capacity(un->un_cmlbhandle, &label_cap,
18785 mutex_enter(SD_MUTEX(un));
18786 if (un->un_f_blockcount_is_valid &&
18787 un->un_blockcount > label_cap) {
18788 mutex_exit(SD_MUTEX(un));
18789 sd_log_lun_expansion_event(un, KM_SLEEP);
18791 mutex_exit(SD_MUTEX(un));
18808 sd_log_dev_status_event(struct sd_lun *un, char *esc, int km_flag) argument
18818 SD_ERROR(SD_LOG_ERROR, un,
18826 SD_ERROR(SD_LOG_ERROR, un,
18832 (void) ddi_pathname(SD_DEVINFO(un), path + n);
18848 SD_ERROR(SD_LOG_ERROR, un,
18853 err = ddi_log_sysevent(SD_DEVINFO(un), SUNW_VENDOR,
18856 SD_ERROR(SD_LOG_ERROR, un,
18875 sd_log_lun_expansion_event(struct sd_lun *un, int km_flag) argument
18877 sd_log_dev_status_event(un, ESC_DEV_DLE, km_flag);
18889 sd_log_eject_request_event(struct sd_lun *un, int km_flag) argument
18891 sd_log_dev_status_event(un, ESC_DEV_EJECT_REQUEST, km_flag);
18907 struct sd_lun *un; local
18920 un = SD_GET_UN(bp);
18921 ASSERT(un != NULL);
18922 ASSERT(!mutex_owned(SD_MUTEX(un)));
18923 ASSERT(un->un_f_monitor_media_state);
18937 if ((err = sd_handle_mchange(un)) == 0) {
18954 mutex_enter(SD_MUTEX(un));
18956 SD_UPDATE_ERRSTATS(un, sd_harderrs);
18957 SD_UPDATE_ERRSTATS(un, sd_rq_nodev_err);
18959 sd_print_sense_msg(un, bp, &si, SD_NO_RETRY_ISSUED);
18960 sd_return_failed_command(un, bp, EIO);
18962 sd_retry_command(un, bp, SD_RETRIES_UA, sd_print_sense_msg,
18965 mutex_exit(SD_MUTEX(un));
18984 sd_handle_mchange(struct sd_lun *un) argument
18991 ASSERT(!mutex_owned(SD_MUTEX(un)));
18992 ASSERT(un->un_f_monitor_media_state);
18994 ssc = sd_ssc_init(un);
19001 mutex_enter(SD_MUTEX(un));
19002 sd_update_block_info(un, lbasize, capacity);
19004 if (un->un_errstats != NULL) {
19006 (struct sd_errstats *)un->un_errstats->ks_data;
19008 ((uint64_t)un->un_blockcount *
19009 (uint64_t)un->un_tgt_blocksize);
19015 if (ISCD(un)) {
19023 mutex_exit(SD_MUTEX(un));
19024 cmlb_invalidate(un->un_cmlbhandle, (void *)SD_PATH_DIRECT_PRIORITY);
19027 if (cmlb_validate(un->un_cmlbhandle, 0,
19032 if (un->un_f_pkstats_enabled) {
19033 sd_set_pstats(un);
19034 SD_TRACE(SD_LOG_IO_PARTITION, un,
19036 "set\n", un);
19081 struct sd_lun *un; local
19084 un = ssc->ssc_un;
19085 ASSERT(un != NULL);
19086 ASSERT(!mutex_owned(SD_MUTEX(un)));
19088 SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_DOORLOCK: entry: un:0x%p\n", un);
19091 if (un->un_f_doorlock_supported == FALSE) {
19101 mutex_enter(SD_MUTEX(un));
19102 if (un->un_f_ejecting == TRUE) {
19103 mutex_exit(SD_MUTEX(un));
19106 mutex_exit(SD_MUTEX(un));
19124 SD_TRACE(SD_LOG_IO, un,
19139 un->un_f_doorlock_supported = FALSE;
19191 struct sd_lun *un; local
19195 un = ssc->ssc_un;
19196 ASSERT(un != NULL);
19197 ASSERT(!mutex_owned(SD_MUTEX(un)));
19201 SD_TRACE(SD_LOG_IO, un,
19202 "sd_send_scsi_READ_CAPACITY: entry: un:0x%p\n", un);
19311 if ((un->un_f_cfg_is_atapi == TRUE) && (ISCD(un))) {
19329 if (un->un_f_has_removable_media)
19330 capacity *= (lbasize / un->un_sys_blocksize);
19341 SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_READ_CAPACITY: "
19410 struct sd_lun *un; local
19414 un = ssc->ssc_un;
19415 ASSERT(un != NULL);
19416 ASSERT(!mutex_owned(SD_MUTEX(un)));
19420 SD_TRACE(SD_LOG_IO, un,
19421 "sd_send_scsi_READ_CAPACITY: entry: un:0x%p\n", un);
19495 un->un_thin_flags = 0;
19497 un->un_thin_flags |= SD_THIN_PROV_ENABLED;
19499 un->un_thin_flags |= SD_THIN_PROV_READ_ZEROS;
19551 if ((un->un_f_cfg_is_atapi == TRUE) && (ISCD(un))) {
19569 if (un->un_f_has_removable_media)
19570 capacity *= (lbasize / un->un_sys_blocksize);
19576 SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_READ_CAPACITY_16: "
19628 struct sd_lun *un; local
19631 un = ssc->ssc_un;
19632 ASSERT(un != NULL);
19633 ASSERT(!mutex_owned(SD_MUTEX(un)));
19635 SD_TRACE(SD_LOG_IO, un,
19636 "sd_send_scsi_START_STOP_UNIT: entry: un:0x%p\n", un);
19638 if (un->un_f_check_start_stop &&
19641 (un->un_f_start_stop_supported != TRUE)) {
19651 mutex_enter(SD_MUTEX(un));
19652 if (un->un_f_ejecting == TRUE) {
19653 mutex_exit(SD_MUTEX(un));
19656 mutex_exit(SD_MUTEX(un));
19715 SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_START_STOP_UNIT: exit\n");
19735 struct sd_lun *un = arg; local
19736 ASSERT(un != NULL);
19737 ASSERT(!mutex_owned(SD_MUTEX(un)));
19739 SD_TRACE(SD_LOG_IO, un, "sd_start_stop_unit_callback: entry\n");
19741 (void) taskq_dispatch(sd_tq, sd_start_stop_unit_task, un, KM_NOSLEEP);
19758 struct sd_lun *un = arg; local
19763 ASSERT(un != NULL);
19764 ASSERT(!mutex_owned(SD_MUTEX(un)));
19766 SD_TRACE(SD_LOG_IO, un, "sd_start_stop_unit_task: entry\n");
19772 mutex_enter(SD_MUTEX(un));
19773 if (un->un_f_format_in_progress == TRUE) {
19774 mutex_exit(SD_MUTEX(un));
19777 mutex_exit(SD_MUTEX(un));
19779 ssc = sd_ssc_init(un);
19790 if (un->un_f_power_condition_supported) {
19791 mutex_enter(SD_MUTEX(un));
19792 ASSERT(SD_PM_IS_LEVEL_VALID(un, un->un_power_level));
19793 power_level = sd_pwr_pc.ran_perf[un->un_power_level]
19794 > 0 ? un->un_power_level : SD_SPINDLE_ACTIVE;
19795 mutex_exit(SD_MUTEX(un));
19829 mutex_enter(SD_MUTEX(un));
19830 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
19832 un, un->un_retry_bp);
19833 un->un_startstop_timeid = NULL; /* Timeout is no longer pending */
19834 sd_start_cmds(un, un->un_retry_bp);
19835 mutex_exit(SD_MUTEX(un));
19837 SD_TRACE(SD_LOG_IO, un, "sd_start_stop_unit_task: exit\n");
19867 struct sd_lun *un; local
19870 un = ssc->ssc_un;
19871 ASSERT(un != NULL);
19872 ASSERT(!mutex_owned(SD_MUTEX(un)));
19875 SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_INQUIRY: entry: un:0x%p\n", un);
19909 SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_INQUIRY: exit\n");
19949 struct sd_lun *un; local
19952 un = ssc->ssc_un;
19953 ASSERT(un != NULL);
19954 ASSERT(!mutex_owned(SD_MUTEX(un)));
19956 SD_TRACE(SD_LOG_IO, un,
19957 "sd_send_scsi_TEST_UNIT_READY: entry: un:0x%p\n", un);
19969 if (un->un_f_cfg_tur_check == TRUE) {
19970 mutex_enter(SD_MUTEX(un));
19971 if (un->un_ncmds_in_transport != 0) {
19972 mutex_exit(SD_MUTEX(un));
19975 mutex_exit(SD_MUTEX(un));
20030 SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_TEST_UNIT_READY: exit\n");
20060 struct sd_lun *un; local
20063 un = ssc->ssc_un;
20064 ASSERT(un != NULL);
20065 ASSERT(!mutex_owned(SD_MUTEX(un)));
20068 SD_TRACE(SD_LOG_IO, un,
20069 "sd_send_scsi_PERSISTENT_RESERVE_IN: entry: un:0x%p\n", un);
20123 SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_PERSISTENT_RESERVE_IN: exit\n");
20168 struct sd_lun *un; local
20171 un = ssc->ssc_un;
20172 ASSERT(un != NULL);
20173 ASSERT(!mutex_owned(SD_MUTEX(un)));
20176 SD_TRACE(SD_LOG_IO, un,
20177 "sd_send_scsi_PERSISTENT_RESERVE_OUT: entry: un:0x%p\n", un);
20280 SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_PERSISTENT_RESERVE_OUT: exit\n");
20322 sd_send_scsi_SYNCHRONIZE_CACHE(struct sd_lun *un, struct dk_callback *dkc) argument
20331 SD_TRACE(SD_LOG_IO, un,
20332 "sd_send_scsi_SYNCHRONIZE_CACHE: entry: un:0x%p\n", un);
20334 ASSERT(un != NULL);
20335 ASSERT(!mutex_owned(SD_MUTEX(un)));
20343 mutex_enter(SD_MUTEX(un));
20345 if (un->un_f_suppress_cache_flush == TRUE) {
20346 mutex_exit(SD_MUTEX(un));
20351 SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_SYNCHRONIZE_CACHE: \
20353 un->un_f_suppress_cache_flush);
20361 mutex_exit(SD_MUTEX(un));
20370 mutex_enter(SD_MUTEX(un));
20371 if (dkc != NULL && un->un_f_sync_nv_supported &&
20379 mutex_exit(SD_MUTEX(un));
20423 bp->b_edev = SD_GET_DEV(un);
20429 mutex_enter(SD_MUTEX(un));
20430 un->un_f_sync_cache_required = FALSE;
20431 mutex_exit(SD_MUTEX(un));
20458 struct sd_lun *un; local
20471 un = ddi_get_soft_state(sd_state, SD_GET_INSTANCE_FROM_BUF(bp));
20472 ASSERT(un != NULL);
20493 mutex_enter(SD_MUTEX(un));
20494 un->un_f_sync_nv_supported = FALSE;
20495 mutex_exit(SD_MUTEX(un));
20497 SD_TRACE(SD_LOG_IO, un,
20503 mutex_enter(SD_MUTEX(un));
20504 un->un_f_sync_cache_supported = FALSE;
20505 mutex_exit(SD_MUTEX(un));
20506 SD_TRACE(SD_LOG_IO, un,
20525 mutex_enter(SD_MUTEX(un));
20526 un->un_f_sync_cache_required = TRUE;
20527 mutex_exit(SD_MUTEX(un));
20533 if (!un->un_f_has_removable_media) {
20534 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
20563 struct sd_lun *un = ssc->ssc_un; local
20589 ucmd_buf.uscsi_timeout = un->un_cmd_timeout;
20598 if (un->un_unmapstats) {
20599 atomic_inc_64(&un->un_unmapstats->us_cmds.value.ui64);
20600 atomic_add_64(&un->un_unmapstats->us_extents.value.ui64,
20602 atomic_add_64(&un->un_unmapstats->us_bytes.value.ui64,
20607 if (un->un_unmapstats)
20608 atomic_inc_64(&un->un_unmapstats->us_errs.value.ui64);
20618 if (un->un_unmapstats)
20619 atomic_inc_64(&un->un_unmapstats->us_errs.value.ui64);
20648 struct sd_lun *un = ssc->ssc_un; local
20650 sd_blk_limits_t *lim = &un->un_blk_lim;
20662 rval = cmlb_partinfo(un->un_cmlbhandle, partition, &part_len_sysblks,
20669 ASSERT(un->un_blk_lim.lim_max_unmap_lba_cnt != 0);
20670 ASSERT(un->un_blk_lim.lim_max_unmap_descr_cnt != 0);
20673 (uint64_t)lim->lim_max_unmap_lba_cnt * un->un_tgt_blocksize :
20691 bytes_issued), SD_TGTBLOCKS2BYTES(un, UINT32_MAX));
20708 ubd->ubd_lba = BE_64(SD_BYTES2TGTBLOCKS(un,
20710 ubd->ubd_lba_cnt = BE_32(SD_BYTES2TGTBLOCKS(un, len));
20754 struct sd_lun *un = ssc->ssc_un; local
20757 ASSERT(!mutex_owned(SD_MUTEX(un)));
20761 if (!(un->un_thin_flags & SD_THIN_PROV_ENABLED) ||
20762 un->un_blk_lim.lim_max_unmap_descr_cnt == 0 ||
20763 un->un_blk_lim.lim_max_unmap_lba_cnt == 0) {
20815 struct sd_lun *un; local
20818 un = ssc->ssc_un;
20819 ASSERT(un != NULL);
20820 ASSERT(!mutex_owned(SD_MUTEX(un)));
20825 SD_TRACE(SD_LOG_IO, un,
20826 "sd_send_scsi_GET_CONFIGURATION: entry: un:0x%p\n", un);
20869 SD_DUMP_MEMORY(un, SD_LOG_IO,
20874 SD_TRACE(SD_LOG_IO, un,
20907 struct sd_lun *un; local
20910 un = ssc->ssc_un;
20911 ASSERT(un != NULL);
20912 ASSERT(!mutex_owned(SD_MUTEX(un)));
20917 SD_TRACE(SD_LOG_IO, un,
20918 "sd_send_scsi_feature_GET_CONFIGURATION: entry: un:0x%p\n", un);
20962 SD_DUMP_MEMORY(un, SD_LOG_IO,
20967 SD_TRACE(SD_LOG_IO, un,
21009 struct sd_lun *un; local
21012 un = ssc->ssc_un;
21013 ASSERT(un != NULL);
21014 ASSERT(!mutex_owned(SD_MUTEX(un)));
21019 SD_TRACE(SD_LOG_IO, un,
21020 "sd_send_scsi_MODE_SENSE: entry: un:0x%p\n", un);
21040 SD_FILL_SCSI1_LUN_CDB(un, &cdb);
21083 SD_DUMP_MEMORY(un, SD_LOG_IO, "sd_send_scsi_MODE_SENSE: data",
21086 SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_MODE_SENSE: exit\n");
21126 struct sd_lun *un; local
21129 un = ssc->ssc_un;
21130 ASSERT(un != NULL);
21131 ASSERT(!mutex_owned(SD_MUTEX(un)));
21136 SD_TRACE(SD_LOG_IO, un,
21137 "sd_send_scsi_MODE_SELECT: entry: un:0x%p\n", un);
21159 SD_FILL_SCSI1_LUN_CDB(un, &cdb);
21191 SD_DUMP_MEMORY(un, SD_LOG_IO, "sd_send_scsi_MODE_SELECT: data",
21194 SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_MODE_SELECT: exit\n");
21236 struct sd_lun *un; local
21239 un = ssc->ssc_un;
21240 ASSERT(un != NULL);
21241 ASSERT(!mutex_owned(SD_MUTEX(un)));
21245 SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_RDWR: entry: un:0x%p\n", un);
21247 if (un->un_f_tgt_blocksize_is_valid != TRUE) {
21251 mutex_enter(SD_MUTEX(un));
21252 block_count = SD_BYTES2TGTBLOCKS(un, buflen);
21253 mutex_exit(SD_MUTEX(un));
21257 SD_INFO(SD_LOG_IO, un, "sd_send_scsi_RDWR: "
21269 (un->un_f_cfg_is_atapi == TRUE))
21297 SD_FILL_SCSI1_LUN_CDB(un, &cdb);
21328 SD_DUMP_MEMORY(un, SD_LOG_IO, "sd_send_scsi_RDWR: data",
21332 SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_RDWR: exit\n");
21360 struct sd_lun *un; local
21363 un = ssc->ssc_un;
21364 ASSERT(un != NULL);
21365 ASSERT(!mutex_owned(SD_MUTEX(un)));
21367 SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_LOG_SENSE: entry: un:0x%p\n", un);
21426 mutex_enter(SD_MUTEX(un));
21427 un->un_start_stop_cycle_page =
21431 un->un_start_stop_cycle_page;
21432 mutex_exit(SD_MUTEX(un));
21457 SD_DUMP_MEMORY(un, SD_LOG_IO, "sd_send_scsi_LOG_SENSE: data",
21461 SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_LOG_SENSE: exit\n");
21491 struct sd_lun *un; local
21494 un = ssc->ssc_un;
21495 ASSERT(un != NULL);
21496 ASSERT(!mutex_owned(SD_MUTEX(un)));
21499 SD_TRACE(SD_LOG_IO, un,
21500 "sd_send_scsi_GET_EVENT_STATUS_NOTIFICATION: entry: un:0x%p\n", un);
21535 SD_TRACE(SD_LOG_IO, un,
21582 struct sd_lun *un = NULL; local
21594 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
21598 ASSERT(!mutex_owned(SD_MUTEX(un)));
21601 ssc = sd_ssc_init(un);
21603 is_valid = SD_IS_VALID_LABEL(un);
21611 mutex_enter(SD_MUTEX(un));
21612 while ((un->un_state == SD_STATE_SUSPENDED) ||
21613 (un->un_state == SD_STATE_PM_CHANGING)) {
21614 cv_wait(&un->un_suspend_cv, SD_MUTEX(un));
21624 un->un_ncmds_in_driver++;
21672 if (!ISCD(un)) {
21673 un->un_ncmds_in_driver--;
21674 ASSERT(un->un_ncmds_in_driver >= 0);
21675 mutex_exit(SD_MUTEX(un));
21683 if (!un->un_f_eject_media_supported) {
21684 un->un_ncmds_in_driver--;
21685 ASSERT(un->un_ncmds_in_driver >= 0);
21686 mutex_exit(SD_MUTEX(un));
21692 mutex_exit(SD_MUTEX(un));
21695 mutex_enter(SD_MUTEX(un));
21696 un->un_ncmds_in_driver--;
21697 ASSERT(un->un_ncmds_in_driver >= 0);
21698 mutex_exit(SD_MUTEX(un));
21702 mutex_enter(SD_MUTEX(un));
21730 mutex_exit(SD_MUTEX(un));
21732 mutex_enter(SD_MUTEX(un));
21746 if (un->un_f_has_removable_media) {
21756 un->un_ncmds_in_driver--;
21757 ASSERT(un->un_ncmds_in_driver >= 0);
21758 mutex_exit(SD_MUTEX(un));
21766 mutex_exit(SD_MUTEX(un));
21770 SD_TRACE(SD_LOG_IOCTL, un, "DKIOCINFO\n");
21775 SD_TRACE(SD_LOG_IOCTL, un, "DKIOCGMEDIAINFO\n");
21780 SD_TRACE(SD_LOG_IOCTL, un, "DKIOCGMEDIAINFOEXT\n");
21804 SD_TRACE(SD_LOG_IOCTL, un, "DKIOC %d\n", cmd);
21808 if (un->un_f_has_removable_media)
21818 err = cmlb_ioctl(un->un_cmlbhandle, dev,
21823 ((un->un_f_pkstats_enabled) &&
21827 tmprval = cmlb_validate(un->un_cmlbhandle, CMLB_SILENT,
21829 if ((tmprval == 0) && un->un_f_pkstats_enabled) {
21830 sd_set_pstats(un);
21831 SD_TRACE(SD_LOG_IO_PARTITION, un,
21833 "set\n", un);
21840 mutex_enter(SD_MUTEX(un));
21841 if (un->un_f_devid_supported &&
21842 (un->un_f_opt_fab_devid == TRUE)) {
21843 if (un->un_devid == NULL) {
21844 sd_register_devid(ssc, SD_DEVINFO(un),
21855 ddi_devid_free(un->un_devid);
21856 un->un_devid = NULL;
21860 mutex_exit(SD_MUTEX(un));
21866 SD_TRACE(SD_LOG_IOCTL, un, "DKIOCLOCK\n");
21872 SD_TRACE(SD_LOG_IOCTL, un, "DKIOCUNLOCK\n");
21879 SD_TRACE(SD_LOG_IOCTL, un, "DKIOCSTATE\n");
21886 if (ddi_copyout(&un->un_mediastate, (void *)arg,
21895 SD_TRACE(SD_LOG_IOCTL, un, "DKIOCREMOVABLE\n");
21896 i = un->un_f_has_removable_media ? 1 : 0;
21905 SD_TRACE(SD_LOG_IOCTL, un, "DKIOCSOLIDSTATE\n");
21906 i = un->un_f_is_solid_state ? 1 : 0;
21915 SD_TRACE(SD_LOG_IOCTL, un, "DKIOCHOTPLUGGABLE\n");
21916 i = un->un_f_is_hotpluggable ? 1 : 0;
21925 SD_TRACE(SD_LOG_IOCTL, un, "DKIOCREADONLY\n");
21927 if ((ISCD(un) && !un->un_f_mmc_writable_media) ||
21939 SD_TRACE(SD_LOG_IOCTL, un, "DKIOCGTEMPERATURE\n");
21944 SD_TRACE(SD_LOG_IOCTL, un, "MHIOCENFAILFAST\n");
21951 SD_TRACE(SD_LOG_IOCTL, un, "MHIOCTKOWN\n");
21958 SD_TRACE(SD_LOG_IOCTL, un, "MHIOCRELEASE\n");
21965 SD_TRACE(SD_LOG_IOCTL, un, "MHIOCSTATUS\n");
21984 SD_TRACE(SD_LOG_IOCTL, un, "MHIOCQRESERVE\n");
21991 SD_TRACE(SD_LOG_IOCTL, un, "MHIOCREREGISTERDEVID\n");
21994 } else if (!un->un_f_devid_supported) {
22002 SD_TRACE(SD_LOG_IOCTL, un, "MHIOCGRP_INKEYS\n");
22005 if (un->un_reservation_type == SD_SCSI2_RESERVATION) {
22015 SD_TRACE(SD_LOG_IOCTL, un, "MHIOCGRP_INRESV\n");
22018 if (un->un_reservation_type == SD_SCSI2_RESERVATION) {
22027 SD_TRACE(SD_LOG_IOCTL, un, "MHIOCGRP_REGISTER\n");
22029 if (un->un_reservation_type == SD_SCSI2_RESERVATION) {
22049 SD_TRACE(SD_LOG_IOCTL, un, "MHIOCGRP_CLEAR\n");
22051 if (un->un_reservation_type == SD_SCSI2_RESERVATION) {
22071 SD_TRACE(SD_LOG_IOCTL, un, "MHIOCGRP_RESERVE\n");
22073 if (un->un_reservation_type == SD_SCSI2_RESERVATION) {
22093 SD_TRACE(SD_LOG_IOCTL, un, "MHIOCGRP_PREEMPTANDABORT\n");
22095 if (un->un_reservation_type == SD_SCSI2_RESERVATION) {
22116 SD_TRACE(SD_LOG_IOCTL, un, "MHIOCGRP_REGISTERANDIGNOREKEY\n");
22118 if (un->un_reservation_type == SD_SCSI2_RESERVATION) {
22139 SD_TRACE(SD_LOG_IOCTL, un, "USCSICMD\n");
22148 if (un->un_f_format_in_progress == TRUE) {
22164 SD_TRACE(SD_LOG_IOCTL, un, "USCSIMAXXFER\n");
22169 const uscsi_xfer_t xfer = un->un_max_xfer_size;
22182 SD_TRACE(SD_LOG_IOCTL, un, "PAUSE-RESUME\n");
22183 if (!ISCD(un)) {
22191 SD_TRACE(SD_LOG_IOCTL, un, "CDROMPLAYMSF\n");
22192 if (!ISCD(un)) {
22200 SD_TRACE(SD_LOG_IOCTL, un, "CDROMPLAYTRKIND\n");
22205 if (!ISCD(un) || (un->un_f_cfg_is_atapi == TRUE)) {
22207 if (!ISCD(un)) {
22216 SD_TRACE(SD_LOG_IOCTL, un, "CDROMREADTOCHDR\n");
22217 if (!ISCD(un)) {
22225 SD_TRACE(SD_LOG_IOCTL, un, "CDROMREADTOCENTRY\n");
22226 if (!ISCD(un)) {
22234 SD_TRACE(SD_LOG_IOCTL, un, "CDROMSTOP\n");
22235 if (!ISCD(un)) {
22245 SD_TRACE(SD_LOG_IOCTL, un, "CDROMSTART\n");
22246 if (!ISCD(un)) {
22256 SD_TRACE(SD_LOG_IOCTL, un, "CDROMCLOSETRAY\n");
22257 if (!ISCD(un)) {
22269 SD_TRACE(SD_LOG_IOCTL, un, "EJECT\n");
22270 if (!un->un_f_eject_media_supported) {
22278 SD_TRACE(SD_LOG_IOCTL, un, "CDROMVOLCTRL\n");
22279 if (!ISCD(un)) {
22287 SD_TRACE(SD_LOG_IOCTL, un, "CDROMSUBCHNL\n");
22288 if (!ISCD(un)) {
22296 SD_TRACE(SD_LOG_IOCTL, un, "CDROMREADMODE2\n");
22297 if (!ISCD(un)) {
22299 } else if (un->un_f_cfg_is_atapi == TRUE) {
22312 SD_TRACE(SD_LOG_IOCTL, un, "CDROMREADMODE1\n");
22313 if (!ISCD(un)) {
22321 SD_TRACE(SD_LOG_IOCTL, un, "CDROMREADOFFSET\n");
22322 if (!ISCD(un)) {
22331 SD_TRACE(SD_LOG_IOCTL, un, "CDROMSBLKMODE\n");
22336 if (!ISCD(un) || (un->un_f_cfg_is_atapi == TRUE)) {
22338 } else if (un->un_f_mmc_cap == TRUE) {
22350 mutex_enter(SD_MUTEX(un));
22351 if ((!(un->un_exclopen & (1<<SDPART(dev)))) ||
22352 (un->un_ncmds_in_transport > 0)) {
22353 mutex_exit(SD_MUTEX(un));
22356 mutex_exit(SD_MUTEX(un));
22363 SD_TRACE(SD_LOG_IOCTL, un, "CDROMGBLKMODE\n");
22364 if (!ISCD(un)) {
22366 } else if ((un->un_f_cfg_is_atapi != FALSE) &&
22367 (un->un_f_blockcount_is_valid != FALSE)) {
22374 if (ddi_copyout(&un->un_tgt_blocksize, (void *)arg,
22392 SD_TRACE(SD_LOG_IOCTL, un, "CDROMXDRVSPEED\n");
22393 if (!ISCD(un)) {
22395 } else if (un->un_f_mmc_cap == TRUE) {
22424 } else if (un->un_f_cfg_is_atapi == TRUE) {
22432 SD_TRACE(SD_LOG_IOCTL, un, "CDROMCDDA\n");
22433 if (!ISCD(un)) {
22441 SD_TRACE(SD_LOG_IOCTL, un, "CDROMCDXA\n");
22442 if (!ISCD(un)) {
22450 SD_TRACE(SD_LOG_IOCTL, un, "CDROMSUBCODE\n");
22451 if (!ISCD(un)) {
22467 SD_INFO(SD_LOG_IOCTL, un, "sdioctl: DKIOCRESET: "
22469 if (scsi_reset(SD_ADDRESS(un), reset_level)) {
22479 SD_INFO(SD_LOG_IOCTL, un, "sdioctl: DKIOCABORT:\n");
22480 if (scsi_abort(SD_ADDRESS(un), NULL)) {
22499 SD_INFO(SD_LOG_SDTEST, un, "sdioctl:"
22502 sd_faultinjection_ioctl(cmd, arg, un);
22512 mutex_enter(SD_MUTEX(un));
22513 if (!un->un_f_sync_cache_supported ||
22514 !un->un_f_write_cache_enabled) {
22515 err = un->un_f_sync_cache_supported ?
22517 mutex_exit(SD_MUTEX(un));
22531 mutex_exit(SD_MUTEX(un));
22536 err = sd_send_scsi_SYNCHRONIZE_CACHE(un, dkc);
22539 err = sd_send_scsi_SYNCHRONIZE_CACHE(un, NULL);
22561 SD_TRACE(SD_LOG_IOCTL, un, "DKIOC_CANFREE\n");
22562 i = (un->un_thin_flags & SD_THIN_PROV_ENABLED) ? 1 : 0;
22589 if (!un->un_f_cache_mode_changeable) {
22604 mutex_enter(SD_MUTEX(un));
22610 if (un->un_f_opt_disable_cache && wce) {
22611 mutex_exit(SD_MUTEX(un));
22620 while (un->un_f_wcc_inprog)
22621 cv_wait(&un->un_wcc_cv, SD_MUTEX(un));
22623 un->un_f_wcc_inprog = 1;
22625 mutex_exit(SD_MUTEX(un));
22631 mutex_enter(SD_MUTEX(un));
22632 un->un_f_wcc_inprog = 0;
22633 cv_broadcast(&un->un_wcc_cv);
22634 mutex_exit(SD_MUTEX(un));
22638 mutex_enter(SD_MUTEX(un));
22639 un->un_f_write_cache_enabled = (cur_wce != 0);
22641 if (un->un_f_write_cache_enabled && wce == 0) {
22647 sync_supported = un->un_f_sync_cache_supported;
22655 if (!un->un_f_suppress_cache_flush) {
22656 mutex_exit(SD_MUTEX(un));
22661 err = sd_send_scsi_SYNCHRONIZE_CACHE(un,
22665 mutex_exit(SD_MUTEX(un));
22668 mutex_enter(SD_MUTEX(un));
22670 un->un_f_write_cache_enabled = 0;
22673 } else if (!un->un_f_write_cache_enabled && wce != 0) {
22679 un->un_f_write_cache_enabled = 1;
22687 if (!un->un_f_suppress_cache_flush) {
22688 mutex_exit(SD_MUTEX(un));
22692 mutex_exit(SD_MUTEX(un));
22695 mutex_enter(SD_MUTEX(un));
22698 un->un_f_write_cache_enabled = 0;
22702 un->un_f_wcc_inprog = 0;
22703 cv_broadcast(&un->un_wcc_cv);
22704 mutex_exit(SD_MUTEX(un));
22712 mutex_enter(SD_MUTEX(un));
22713 un->un_ncmds_in_driver--;
22714 ASSERT(un->un_ncmds_in_driver >= 0);
22715 mutex_exit(SD_MUTEX(un));
22721 SD_TRACE(SD_LOG_IOCTL, un, "sdioctl: exit: %d\n", err);
22725 mutex_enter(SD_MUTEX(un));
22726 un->un_ncmds_in_driver--;
22727 ASSERT(un->un_ncmds_in_driver >= 0);
22728 mutex_exit(SD_MUTEX(un));
22736 SD_TRACE(SD_LOG_IOCTL, un, "sdioctl: exit: %d\n", err);
22761 struct sd_lun *un = NULL; local
22766 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
22773 switch (un->un_ctype) {
22781 pdip = ddi_get_parent(SD_DEVINFO(un));
22790 lun = ddi_prop_get_int(DDI_DEV_T_ANY, SD_DEVINFO(un),
22792 tgt = ddi_prop_get_int(DDI_DEV_T_ANY, SD_DEVINFO(un),
22796 info->dki_unit = ddi_get_instance(SD_DEVINFO(un));
22798 (void) strncpy(info->dki_dname, ddi_driver_name(SD_DEVINFO(un)),
22804 info->dki_maxtransfer = un->un_max_xfer_size / un->un_sys_blocksize;
22841 struct sd_lun *un = NULL; local
22854 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL ||
22855 (un->un_state == SD_STATE_OFFLINE)) {
22859 SD_TRACE(SD_LOG_IOCTL_DKIO, un, "sd_get_media_info_com: entry\n");
22863 ssc = sd_ssc_init(un);
22874 if (ISCD(un)) {
22878 if (un->un_f_mmc_cap == TRUE) {
22918 sinq = un->un_sd->sd_inq;
22946 if (dki_pbsize && un->un_f_descr_format_supported) {
22954 pbsize = MAX(pbsize, un->un_phy_blocksize);
22958 !un->un_f_descr_format_supported) {
22964 if (un->un_f_enable_rmw &&
22965 un->un_phy_blocksize != 0) {
22966 pbsize = un->un_phy_blocksize;
22977 if (un->un_f_has_removable_media) {
22978 media_capacity *= un->un_sys_blocksize;
22990 if (un->un_f_enable_rmw &&
23003 mutex_enter(SD_MUTEX(un));
23004 if ((un->un_f_blockcount_is_valid == TRUE) &&
23005 (un->un_f_tgt_blocksize_is_valid == TRUE) &&
23006 (capacity > un->un_blockcount)) {
23007 un->un_f_expnevent = B_FALSE;
23008 sd_update_block_info(un, lbasize, capacity);
23010 mutex_exit(SD_MUTEX(un));
23118 sd_watch_request_submit(struct sd_lun *un) argument
23123 dev = sd_make_device(SD_DEVINFO(un));
23125 if (un->un_f_mmc_cap && un->un_f_mmc_gesn_polling) {
23126 return (scsi_mmc_watch_request_submit(SD_SCSI_DEVP(un),
23130 return (scsi_watch_request_submit(SD_SCSI_DEVP(un),
23163 struct sd_lun *un = NULL; local
23169 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
23173 SD_TRACE(SD_LOG_COMMON, un, "sd_check_media: entry\n");
23175 ssc = sd_ssc_init(un);
23177 mutex_enter(SD_MUTEX(un));
23179 SD_TRACE(SD_LOG_COMMON, un, "sd_check_media: "
23180 "state=%x, mediastate=%x\n", state, un->un_mediastate);
23182 prev_state = un->un_mediastate;
23185 if (state == un->un_mediastate || un->un_mediastate == DKIO_NONE) {
23190 mutex_exit(SD_MUTEX(un));
23199 if (sd_pm_entry(un) != DDI_SUCCESS) {
23200 mutex_enter(SD_MUTEX(un));
23204 token = sd_watch_request_submit(un);
23206 sd_pm_exit(un);
23208 mutex_enter(SD_MUTEX(un));
23223 un->un_ncmds_in_driver--;
23224 ASSERT(un->un_ncmds_in_driver >= 0);
23230 un->un_swr_token = token;
23231 un->un_specified_mediastate = state;
23239 SD_TRACE(SD_LOG_COMMON, un,
23241 while (un->un_mediastate == state) {
23242 if (cv_wait_sig(&un->un_state_cv, SD_MUTEX(un)) == 0) {
23243 SD_TRACE(SD_LOG_COMMON, un,
23246 un->un_ncmds_in_driver++;
23250 SD_TRACE(SD_LOG_COMMON, un,
23252 un->un_mediastate);
23258 un->un_ncmds_in_driver++;
23262 if (prev_state == DKIO_INSERTED && un->un_mediastate == DKIO_EJECTED) {
23263 sr_ejected(un);
23266 if (un->un_mediastate == DKIO_INSERTED && prev_state != DKIO_INSERTED) {
23270 SD_TRACE(SD_LOG_COMMON, un, "sd_check_media: media inserted\n");
23271 mutex_exit(SD_MUTEX(un));
23278 if (sd_pm_entry(un) == DDI_SUCCESS) {
23282 sd_pm_exit(un);
23288 mutex_enter(SD_MUTEX(un));
23293 mutex_enter(SD_MUTEX(un));
23296 mutex_enter(SD_MUTEX(un));
23298 sd_update_block_info(un, lbasize, capacity);
23303 if (ISCD(un)) {
23307 mutex_exit(SD_MUTEX(un));
23308 cmlb_invalidate(un->un_cmlbhandle, (void *)SD_PATH_DIRECT);
23309 if ((cmlb_validate(un->un_cmlbhandle, 0,
23310 (void *)SD_PATH_DIRECT) == 0) && un->un_f_pkstats_enabled) {
23311 sd_set_pstats(un);
23312 SD_TRACE(SD_LOG_IO_PARTITION, un,
23314 "set\n", un);
23320 sd_pm_exit(un);
23329 mutex_enter(SD_MUTEX(un));
23333 un->un_f_watcht_stopped = FALSE;
23334 if (token != NULL && un->un_swr_token != NULL) {
23340 token = un->un_swr_token;
23341 mutex_exit(SD_MUTEX(un));
23345 mutex_enter(SD_MUTEX(un));
23346 un->un_swr_token = (opaque_t)NULL;
23348 mutex_enter(SD_MUTEX(un));
23357 if (un->un_errstats) {
23360 stp = (struct sd_errstats *)un->un_errstats->ks_data;
23362 (un->un_f_blockcount_is_valid == TRUE)) {
23364 (uint64_t)((uint64_t)un->un_blockcount *
23365 un->un_sys_blocksize);
23368 mutex_exit(SD_MUTEX(un));
23369 SD_TRACE(SD_LOG_COMMON, un, "sd_check_media: done\n");
23386 struct sd_lun *un = arg; local
23388 SD_TRACE(SD_LOG_COMMON, un, "sd_delayed_cv_broadcast\n");
23390 mutex_enter(SD_MUTEX(un));
23391 un->un_dcvb_timeid = NULL;
23392 cv_broadcast(&un->un_state_cv);
23393 mutex_exit(SD_MUTEX(un));
23416 struct sd_lun *un; local
23424 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
23429 mutex_enter(SD_MUTEX(un));
23430 SD_TRACE(SD_LOG_COMMON, un,
23435 un->un_mediastate = DKIO_DEV_GONE;
23436 cv_broadcast(&un->un_state_cv);
23437 mutex_exit(SD_MUTEX(un));
23442 if (un->un_f_mmc_cap && un->un_f_mmc_gesn_polling) {
23452 sd_log_eject_request_event(un, KM_NOSLEEP);
23465 SD_INFO(SD_LOG_COMMON, un,
23519 mutex_exit(SD_MUTEX(un));
23529 SD_TRACE(SD_LOG_COMMON, un,
23531 state, un->un_specified_mediastate);
23538 if (state != un->un_specified_mediastate) {
23539 un->un_mediastate = state;
23545 SD_TRACE(SD_LOG_COMMON, un,
23547 if (un->un_dcvb_timeid == NULL) {
23548 un->un_dcvb_timeid =
23549 timeout(sd_delayed_cv_broadcast, un,
23553 SD_TRACE(SD_LOG_COMMON, un,
23555 cv_broadcast(&un->un_state_cv);
23558 mutex_exit(SD_MUTEX(un));
23583 struct sd_lun *un = NULL; local
23590 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
23594 ssc = sd_ssc_init(un);
23614 ASSERT(!mutex_owned(&un->un_pm_mutex));
23615 mutex_enter(&un->un_pm_mutex);
23616 if (SD_DEVICE_IS_IN_LOW_POWER(un)) {
23622 mutex_exit(&un->un_pm_mutex);
23633 mutex_exit(&un->un_pm_mutex);
23634 if (sd_pm_entry(un) != DDI_SUCCESS) {
23690 sd_pm_exit(un);
23727 struct sd_lun *un; local
23730 un = ssc->ssc_un;
23731 ASSERT(un != NULL);
23763 SD_ERROR(SD_LOG_COMMON, un,
23805 struct sd_lun *un = NULL; local
23809 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
23817 mutex_enter(SD_MUTEX(un));
23818 un->un_resvd_status |= SD_FAILFAST;
23819 mutex_exit(SD_MUTEX(un));
23829 mutex_enter(SD_MUTEX(un));
23830 un->un_resvd_status &= ~SD_FAILFAST;
23831 mutex_exit(SD_MUTEX(un));
23858 struct sd_lun *un = NULL; local
23862 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
23877 mutex_enter(SD_MUTEX(un));
23879 un->un_resvd_status |= SD_RESERVE;
23890 if ((un->un_resvd_status & SD_FAILFAST) == 0) {
23891 mutex_exit(SD_MUTEX(un));
23894 SD_TRACE(SD_LOG_IOCTL_MHD, un,
23898 mutex_exit(SD_MUTEX(un));
23900 (void) scsi_reset_notify(SD_ADDRESS(un), SCSI_RESET_NOTIFY,
23901 sd_mhd_reset_notify_cb, (caddr_t)un);
23903 un->un_resvd_status &= ~SD_RESERVE;
23904 mutex_exit(SD_MUTEX(un));
23931 struct sd_lun *un = NULL; local
23936 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
23940 mutex_enter(SD_MUTEX(un));
23941 resvd_status_save = un->un_resvd_status;
23942 un->un_resvd_status &=
23944 if (un->un_resvd_timeid) {
23945 resvd_timeid_save = un->un_resvd_timeid;
23946 un->un_resvd_timeid = NULL;
23947 mutex_exit(SD_MUTEX(un));
23950 mutex_exit(SD_MUTEX(un));
23960 mutex_enter(SD_MUTEX(un));
23961 if ((un->un_mhd_token) &&
23962 ((un->un_resvd_status & SD_FAILFAST) == 0)) {
23963 mutex_exit(SD_MUTEX(un));
23966 mutex_exit(SD_MUTEX(un));
23968 (void) scsi_reset_notify(SD_ADDRESS(un), SCSI_RESET_CANCEL,
23969 sd_mhd_reset_notify_cb, (caddr_t)un);
23974 mutex_enter(SD_MUTEX(un));
23975 un->un_resvd_status = resvd_status_save;
23976 mutex_exit(SD_MUTEX(un));
24001 struct sd_lun *un = NULL; local
24005 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
24009 ASSERT(!mutex_owned(SD_MUTEX(un)));
24011 mutex_enter(SD_MUTEX(un));
24014 if (un->un_devid != NULL) {
24015 ddi_devid_unregister(SD_DEVINFO(un));
24019 ddi_devid_free(un->un_devid);
24020 un->un_devid = NULL;
24024 mutex_exit(SD_MUTEX(un));
24025 ssc = sd_ssc_init(un);
24027 mutex_enter(SD_MUTEX(un));
24031 sd_register_devid(ssc, SD_DEVINFO(un), SD_TARGET_IS_UNRESERVED);
24039 mutex_exit(SD_MUTEX(un));
24071 struct sd_lun *un; local
24075 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
24089 if ((rval = sd_persistent_reservation_in_read_keys(un,
24105 if ((rval = sd_persistent_reservation_in_read_keys(un,
24121 rval = sd_persistent_reservation_in_read_keys(un, &inkeys, flag);
24155 struct sd_lun *un; local
24159 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
24174 if ((rval = sd_persistent_reservation_in_read_resv(un,
24190 if ((rval = sd_persistent_reservation_in_read_resv(un,
24206 rval = sd_persistent_reservation_in_read_resv(un, &inresvs, flag);
24297 struct sd_lun *un; local
24300 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
24306 mutex_enter(SD_MUTEX(un));
24308 if (un->un_mhd_token) {
24309 token = un->un_mhd_token;
24310 un->un_mhd_token = NULL;
24311 mutex_exit(SD_MUTEX(un));
24314 mutex_enter(SD_MUTEX(un));
24316 mutex_exit(SD_MUTEX(un));
24330 if (un->un_resvd_status & SD_RESERVE) {
24334 mutex_exit(SD_MUTEX(un));
24337 mutex_exit(SD_MUTEX(un));
24352 token = scsi_watch_request_submit(SD_SCSI_DEVP(un), interval,
24361 mutex_enter(SD_MUTEX(un));
24362 un->un_mhd_token = token;
24363 mutex_exit(SD_MUTEX(un));
24392 struct sd_lun *un; local
24405 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
24409 SD_TRACE(SD_LOG_IOCTL_MHD, un,
24416 sd_mhd_watch_incomplete(un, pkt);
24426 mutex_enter(SD_MUTEX(un));
24427 if ((un->un_resvd_status & SD_FAILFAST) &&
24429 sd_panic_for_res_conflict(un);
24432 SD_INFO(SD_LOG_IOCTL_MHD, un,
24434 un->un_resvd_status |= SD_RESERVATION_CONFLICT;
24435 mutex_exit(SD_MUTEX(un));
24441 mutex_enter(SD_MUTEX(un));
24444 (un->un_resvd_status & SD_RESERVE)) {
24450 un->un_resvd_status |=
24452 SD_INFO(SD_LOG_IOCTL_MHD, un,
24459 mutex_enter(SD_MUTEX(un));
24462 if ((un->un_resvd_status & SD_RESERVE) &&
24463 (un->un_resvd_status & SD_LOST_RESERVE)) {
24464 if (un->un_resvd_status & SD_WANT_RESERVE) {
24469 if (un->un_resvd_timeid) {
24470 timeout_id_t temp_id = un->un_resvd_timeid;
24471 un->un_resvd_timeid = NULL;
24472 mutex_exit(SD_MUTEX(un));
24474 mutex_enter(SD_MUTEX(un));
24476 un->un_resvd_status &= ~SD_WANT_RESERVE;
24478 if (un->un_resvd_timeid == 0) {
24480 un->un_resvd_timeid = timeout(sd_mhd_resvd_recover,
24485 mutex_exit(SD_MUTEX(un));
24503 sd_mhd_watch_incomplete(struct sd_lun *un, struct scsi_pkt *pkt) argument
24509 ASSERT(un != NULL);
24513 mutex_enter(SD_MUTEX(un));
24514 if (un->un_state == SD_STATE_DUMPING) {
24515 mutex_exit(SD_MUTEX(un));
24544 un->un_tagflags = 0;
24546 if (un->un_f_opt_queueing == TRUE) {
24547 un->un_throttle = min(un->un_throttle, 3);
24549 un->un_throttle = 1;
24551 mutex_exit(SD_MUTEX(un));
24552 (void) scsi_ifsetcap(SD_ADDRESS(un), "tagged-qing", 0, 1);
24553 mutex_enter(SD_MUTEX(un));
24577 mutex_exit(SD_MUTEX(un));
24578 if (un->un_f_allow_bus_device_reset == TRUE) {
24579 if (un->un_f_lun_reset_enabled == TRUE) {
24581 scsi_reset(SD_ADDRESS(un),
24586 scsi_reset(SD_ADDRESS(un),
24591 (void) scsi_reset(SD_ADDRESS(un), RESET_ALL);
24593 mutex_enter(SD_MUTEX(un));
24601 if ((un->un_resvd_status & SD_RESERVE) == SD_RESERVE) {
24602 un->un_resvd_status |=
24604 SD_INFO(SD_LOG_IOCTL_MHD, un,
24615 SD_INFO(SD_LOG_IOCTL_MHD, un, "sd_mhd_watch_incomplete: "
24617 if (un->un_state != SD_STATE_OFFLINE) {
24618 New_state(un, SD_STATE_OFFLINE);
24626 if (pkt->pkt_reason != un->un_last_pkt_reason) {
24627 SD_ERROR(SD_LOG_IOCTL_MHD, un,
24633 un->un_last_pkt_reason = pkt->pkt_reason;
24634 mutex_exit(SD_MUTEX(un));
24699 struct sd_lun *un; local
24705 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
24709 mutex_enter(SD_MUTEX(un));
24710 un->un_resvd_timeid = NULL;
24711 if (un->un_resvd_status & SD_WANT_RESERVE) {
24717 mutex_exit(SD_MUTEX(un));
24720 mutex_exit(SD_MUTEX(un));
24755 SD_INFO(SD_LOG_IOCTL_MHD, un, "sd_mhd_resvd_recover: "
24790 struct sd_lun *un; local
24802 un = ddi_get_soft_state(sd_state,
24804 if (un == NULL) {
24826 mutex_enter(SD_MUTEX(un));
24827 if ((un->un_resvd_status & SD_RESERVE) == SD_RESERVE) {
24835 un->un_resvd_status &= ~SD_LOST_RESERVE;
24836 mutex_exit(SD_MUTEX(un));
24840 mutex_enter(SD_MUTEX(un));
24841 un->un_resvd_status |= SD_RESERVE;
24842 mutex_exit(SD_MUTEX(un));
24843 SD_INFO(SD_LOG_IOCTL_MHD, un,
24847 mutex_enter(SD_MUTEX(un));
24848 un->un_resvd_status |= SD_LOST_RESERVE;
24849 mutex_exit(SD_MUTEX(un));
24850 SD_INFO(SD_LOG_IOCTL_MHD, un,
24855 mutex_exit(SD_MUTEX(un));
24866 SD_TRACE(SD_LOG_IOCTL_MHD, un,
24944 struct sd_lun *un = (struct sd_lun *)arg; local
24946 mutex_enter(SD_MUTEX(un));
24947 if ((un->un_resvd_status & SD_RESERVE) == SD_RESERVE) {
24948 un->un_resvd_status |= (SD_LOST_RESERVE | SD_WANT_RESERVE);
24949 SD_INFO(SD_LOG_IOCTL_MHD, un,
24952 mutex_exit(SD_MUTEX(un));
24999 struct sd_lun *un; local
25011 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
25020 SD_ERROR(SD_LOG_IOCTL_MHD, un,
25026 mutex_enter(SD_MUTEX(un));
25027 un->un_resvd_status |= SD_RESERVE;
25028 un->un_resvd_status &=
25030 mutex_exit(SD_MUTEX(un));
25040 SD_INFO(SD_LOG_IOCTL_MHD, un,
25054 mutex_enter(SD_MUTEX(un));
25055 rval = (un->un_resvd_status &
25057 mutex_exit(SD_MUTEX(un));
25063 mutex_enter(SD_MUTEX(un));
25064 if (err || (un->un_resvd_status & SD_LOST_RESERVE)) {
25071 un->un_resvd_status |= SD_RESERVE;
25072 un->un_resvd_status &= ~(SD_LOST_RESERVE | SD_WANT_RESERVE);
25073 mutex_exit(SD_MUTEX(un));
25075 SD_INFO(SD_LOG_IOCTL_MHD, un,
25090 SD_TRACE(SD_LOG_IOCTL_MHD, un,
25113 struct sd_lun *un = NULL; local
25120 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
25128 com->uscsi_timeout = un->un_reserve_release_time;
25153 if (un->un_f_lun_reset_enabled == TRUE) {
25154 reset_retval = scsi_reset(SD_ADDRESS(un), RESET_LUN);
25158 reset_retval = scsi_reset(SD_ADDRESS(un), RESET_TARGET);
25161 (scsi_reset(SD_ADDRESS(un), RESET_ALL) == 0)) {
25203 struct sd_lun *un; local
25220 if (((un = ddi_get_soft_state(sd_state, instance)) == NULL) ||
25221 !SD_IS_VALID_LABEL(un) || ISCD(un)) {
25225 _NOTE(NOW_INVISIBLE_TO_OTHER_THREADS(*un))
25227 SD_TRACE(SD_LOG_DUMP, un, "sddump: entry\n");
25230 SD_INFO(SD_LOG_DUMP, un, "sddump: partition = %d\n", partition);
25232 if (!(NOT_DEVBSIZE(un))) {
25236 blknomask = (un->un_tgt_blocksize / DEV_BSIZE) - 1;
25237 secmask = un->un_tgt_blocksize - 1;
25240 SD_TRACE(SD_LOG_DUMP, un,
25242 un->un_tgt_blocksize);
25247 SD_TRACE(SD_LOG_DUMP, un,
25249 un->un_tgt_blocksize);
25257 (void) cmlb_partinfo(un->un_cmlbhandle, partition,
25260 if (NOT_DEVBSIZE(un)) {
25262 SD_TRACE(SD_LOG_DUMP, un,
25269 if (((blkno / (un->un_tgt_blocksize / DEV_BSIZE)) +
25270 (nblk / (un->un_tgt_blocksize / DEV_BSIZE))) > nblks) {
25271 SD_TRACE(SD_LOG_DUMP, un,
25279 mutex_enter(&un->un_pm_mutex);
25280 if (SD_DEVICE_IS_IN_LOW_POWER(un)) {
25283 mutex_exit(&un->un_pm_mutex);
25288 (void) pm_raise_power(SD_DEVINFO(un), 0,
25289 SD_PM_STATE_ACTIVE(un));
25296 SD_INFO(SD_LOG_DUMP, un, "sddump: starting device\n");
25298 start_pktp = scsi_init_pkt(SD_ADDRESS(un), NULL, NULL,
25299 CDB_GROUP0, un->un_status_len, 0, 0, NULL_FUNC, NULL);
25310 mutex_enter(SD_MUTEX(un));
25311 SD_FILL_SCSI1_LUN(un, start_pktp);
25312 mutex_exit(SD_MUTEX(un));
25317 if (sd_scsi_poll(un, start_pktp) != 0) {
25322 (void) sd_pm_state_change(un, SD_PM_STATE_ACTIVE(un),
25325 mutex_exit(&un->un_pm_mutex);
25328 mutex_enter(SD_MUTEX(un));
25329 un->un_throttle = 0;
25339 if ((un->un_state != SD_STATE_SUSPENDED) &&
25340 (un->un_state != SD_STATE_DUMPING)) {
25342 New_state(un, SD_STATE_DUMPING);
25344 if (un->un_f_is_fibre == FALSE) {
25345 mutex_exit(SD_MUTEX(un));
25359 if (scsi_reset(SD_ADDRESS(un), RESET_ALL) == 0) {
25360 mutex_enter(SD_MUTEX(un));
25361 Restore_state(un);
25362 mutex_exit(SD_MUTEX(un));
25369 if (sd_send_polled_RQS(un) == SD_FAILURE) {
25370 SD_INFO(SD_LOG_DUMP, un,
25373 mutex_enter(SD_MUTEX(un));
25381 if (NOT_DEVBSIZE(un)) {
25384 blkno = blkno / (un->un_tgt_blocksize / DEV_BSIZE);
25388 SD_INFO(SD_LOG_DUMP, un, "sddump: disk blkno = 0x%x\n", blkno);
25395 if (NOT_DEVBSIZE(un)) {
25396 tgt_byte_offset = blkno * un->un_sys_blocksize;
25397 tgt_byte_count = nblk * un->un_sys_blocksize;
25398 if ((tgt_byte_offset % un->un_tgt_blocksize) ||
25399 (tgt_byte_count % un->un_tgt_blocksize)) {
25405 tgt_blkno = tgt_byte_offset / un->un_tgt_blocksize;
25408 (un->un_tgt_blocksize - 1)) /
25409 un->un_tgt_blocksize) - tgt_blkno;
25417 err = sddump_do_read_of_rmw(un, tgt_blkno, tgt_nblk,
25420 mutex_exit(SD_MUTEX(un));
25429 ((uint64_t)(blkno * un->un_sys_blocksize)) -
25430 ((uint64_t)(tgt_blkno * un->un_tgt_blocksize));
25432 ASSERT(io_start_offset < un->un_tgt_blocksize);
25437 (size_t)nblk * un->un_sys_blocksize);
25440 tgt_blkno = tgt_byte_offset / un->un_tgt_blocksize;
25441 tgt_nblk = tgt_byte_count / un->un_tgt_blocksize;
25456 mutex_exit(SD_MUTEX(un));
25473 if (!(NOT_DEVBSIZE(un))) {
25474 nblk = nblk / (un->un_tgt_blocksize / DEV_BSIZE);
25482 if (un->un_partial_dma_supported == 1) {
25485 un->un_tgt_blocksize);
25486 nblk = dma_resid / un->un_tgt_blocksize;
25492 rval = sd_setup_next_rw_pkt(un, wr_pktp, wr_bp,
25496 rval = sd_setup_rw_pkt(un, &wr_pktp, wr_bp,
25497 un->un_pkt_flags, NULL_FUNC, NULL,
25501 rval = sd_setup_rw_pkt(un, &wr_pktp, wr_bp,
25512 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
25517 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
25522 scsi_log(SD_DEVINFO(un), sd_label, CE_CONT,
25528 scsi_log(SD_DEVINFO(un), sd_label, CE_CONT,
25533 scsi_log(SD_DEVINFO(un), sd_label, CE_CONT,
25537 mutex_enter(SD_MUTEX(un));
25538 Restore_state(un);
25539 if (NOT_DEVBSIZE(un) && (doing_rmw == TRUE)) {
25540 mutex_exit(SD_MUTEX(un));
25543 mutex_exit(SD_MUTEX(un));
25550 if (un->un_partial_dma_supported == 1) {
25556 nblk -= SD_BYTES2TGTBLOCKS(un, dma_resid);
25576 SD_TRACE(SD_LOG_DUMP, un, "sddump: sending write\n");
25578 if ((sd_scsi_poll(un, wr_pktp) == 0) &&
25588 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
25594 SD_INFO(SD_LOG_DUMP, un,
25597 (void) sd_send_polled_RQS(un);
25606 SD_INFO(SD_LOG_DUMP, un,
25609 if (un->un_f_lun_reset_enabled == TRUE) {
25610 reset_retval = scsi_reset(SD_ADDRESS(un),
25614 (void) scsi_reset(SD_ADDRESS(un), RESET_TARGET);
25616 (void) sd_send_polled_RQS(un);
25619 SD_INFO(SD_LOG_DUMP, un,
25622 mutex_enter(SD_MUTEX(un));
25623 sd_reset_target(un, wr_pktp);
25624 mutex_exit(SD_MUTEX(un));
25632 (void) scsi_reset(SD_ADDRESS(un), RESET_ALL);
25633 (void) sd_send_polled_RQS(un);
25639 mutex_enter(SD_MUTEX(un));
25640 if ((NOT_DEVBSIZE(un)) && (doing_rmw == TRUE)) {
25641 mutex_exit(SD_MUTEX(un));
25644 mutex_exit(SD_MUTEX(un));
25646 SD_TRACE(SD_LOG_DUMP, un, "sddump: exit: err = %d\n", err);
25666 sd_scsi_poll(struct sd_lun *un, struct scsi_pkt *pktp) argument
25670 ASSERT(un != NULL);
25671 ASSERT(!mutex_owned(SD_MUTEX(un)));
25677 pktp->pkt_flags |= un->un_tagflags;
25694 (void) sd_send_polled_RQS(un);
25712 sd_send_polled_RQS(struct sd_lun *un) argument
25718 ASSERT(un != NULL);
25719 ASSERT(!mutex_owned(SD_MUTEX(un)));
25723 rqs_pktp = un->un_rqs_pktp;
25724 rqs_bp = un->un_rqs_bp;
25726 mutex_enter(SD_MUTEX(un));
25728 if (un->un_sense_isbusy) {
25730 mutex_exit(SD_MUTEX(un));
25738 un->un_sense_isbusy = 1;
25744 mutex_exit(SD_MUTEX(un));
25746 SD_INFO(SD_LOG_COMMON, un, "sd_send_polled_RQS: req sense buf at"
25754 SD_INFO(SD_LOG_COMMON, un,
25758 SD_DUMP_MEMORY(un, SD_LOG_COMMON, "sd_send_polled_RQS:",
25761 mutex_enter(SD_MUTEX(un));
25762 un->un_sense_isbusy = 0;
25763 mutex_exit(SD_MUTEX(un));
25983 sd_persistent_reservation_in_read_keys(struct sd_lun *un, argument
26003 ssc = sd_ssc_init(un);
26013 SD_ERROR(SD_LOG_IOCTL_MHD, un,
26026 SD_ERROR(SD_LOG_IOCTL_MHD, un,
26038 SD_ERROR(SD_LOG_IOCTL_MHD, un,
26072 SD_ERROR(SD_LOG_IOCTL_MHD, un,
26082 SD_ERROR(SD_LOG_IOCTL_MHD, un,
26094 SD_ERROR(SD_LOG_IOCTL_MHD, un,
26106 SD_ERROR(SD_LOG_IOCTL_MHD, un,
26143 sd_persistent_reservation_in_read_resv(struct sd_lun *un, argument
26166 ssc = sd_ssc_init(un);
26176 SD_ERROR(SD_LOG_IOCTL_MHD, un,
26189 SD_ERROR(SD_LOG_IOCTL_MHD, un,
26200 SD_ERROR(SD_LOG_IOCTL_MHD, un,
26234 SD_ERROR(SD_LOG_IOCTL_MHD, un,
26244 SD_ERROR(SD_LOG_IOCTL_MHD, un,
26256 SD_ERROR(SD_LOG_IOCTL_MHD, un,
26279 SD_ERROR(SD_LOG_IOCTL_MHD, un,
26325 struct sd_lun *un = NULL; local
26336 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
26349 ssc = sd_ssc_init(un);
26354 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
26364 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
26398 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
26428 ssc = sd_ssc_init(un);
26434 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
26445 ssc = sd_ssc_init(un);
26451 ASSERT(!mutex_owned(SD_MUTEX(un)));
26452 mutex_enter(SD_MUTEX(un));
26453 sd_update_block_info(un, (uint32_t)data, 0);
26454 mutex_exit(SD_MUTEX(un));
26459 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
26511 struct sd_lun *un = NULL; local
26522 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
26532 ssc = sd_ssc_init(un);
26538 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
26548 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
26583 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
26611 ssc = sd_ssc_init(un);
26623 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
26626 ssc = sd_ssc_init(un);
26635 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
26679 struct sd_lun *un; local
26693 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
26699 ssc = sd_ssc_init(un);
26705 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
26715 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
26754 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
26790 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
26824 struct sd_lun *un; local
26829 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
26844 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, "sr_pause_resume:"
26887 struct sd_lun *un; local
26898 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
26909 if (un->un_f_cfg_playmsf_bcd == TRUE) {
27011 struct sd_lun *un = NULL; local
27027 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
27037 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
27048 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
27057 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
27069 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
27081 if (un->un_f_mmc_cap == TRUE) {
27139 struct sd_lun *un; local
27151 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL ||
27152 (un->un_state == SD_STATE_OFFLINE)) {
27203 } else if (un->un_f_cfg_readsub_bcd == TRUE) {
27258 struct sd_lun *un = NULL; local
27270 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL ||
27271 (un->un_state == SD_STATE_OFFLINE)) {
27295 if (un->un_f_cfg_read_toc_trk_bcd == TRUE) {
27326 } else if (un->un_f_cfg_read_toc_addr_bcd == TRUE) {
27433 struct sd_lun *un; local
27445 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL ||
27446 (un->un_state == SD_STATE_OFFLINE)) {
27473 if (un->un_f_cfg_read_toc_trk_bcd == TRUE) {
27525 struct sd_lun *un; local
27541 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL ||
27542 (un->un_state == SD_STATE_OFFLINE)) {
27546 SD_TRACE(SD_LOG_ATTACH_DETACH, un,
27547 "sd_read_mode1: entry: un:0x%p\n", un);
27569 ssc = sd_ssc_init(un);
27574 SD_TRACE(SD_LOG_ATTACH_DETACH, un,
27575 "sd_read_mode1: exit: un:0x%p\n", un);
27604 struct sd_lun *un; local
27621 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL ||
27622 (un->un_state == SD_STATE_OFFLINE)) {
27649 if (un->un_f_cfg_read_cd_xd4 == TRUE) {
27715 struct sd_lun *un; local
27734 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL ||
27735 (un->un_state == SD_STATE_OFFLINE)) {
27748 mutex_enter(SD_MUTEX(un));
27749 if (un->un_ncmds_in_driver != 1) {
27750 mutex_exit(SD_MUTEX(un));
27753 mutex_exit(SD_MUTEX(un));
27755 SD_TRACE(SD_LOG_ATTACH_DETACH, un,
27756 "sd_read_mode2: entry: un:0x%p\n", un);
27780 restore_blksize = un->un_tgt_blocksize;
27830 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
27842 SD_TRACE(SD_LOG_ATTACH_DETACH, un,
27843 "sd_read_mode2: exit: un:0x%p\n", un);
27869 struct sd_lun *un; local
27875 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL ||
27876 (un->un_state == SD_STATE_OFFLINE)) {
27883 ssc = sd_ssc_init(un);
27888 SD_ERROR(SD_LOG_IOCTL_RMMEDIA, un,
27905 ssc = sd_ssc_init(un);
27910 SD_ERROR(SD_LOG_IOCTL_RMMEDIA, un,
27917 mutex_enter(SD_MUTEX(un));
27918 sd_update_block_info(un, blksize, 0);
27919 mutex_exit(SD_MUTEX(un));
27953 struct sd_lun *un; local
27970 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
27980 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
27990 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
27999 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
28011 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, "sr_read_cdda: "
28032 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
28043 if (un->un_f_cfg_cdda == TRUE) {
28121 struct sd_lun *un; local
28139 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
28177 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, "sr_read_cdxa: "
28198 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
28207 if (un->un_f_mmc_cap == TRUE) {
28260 struct sd_lun *un; local
28264 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL ||
28265 (un->un_state == SD_STATE_OFFLINE)) {
28278 mutex_enter(SD_MUTEX(un));
28279 if (un->un_f_ejecting == TRUE) {
28280 mutex_exit(SD_MUTEX(un));
28283 un->un_f_ejecting = TRUE;
28284 mutex_exit(SD_MUTEX(un));
28286 ssc = sd_ssc_init(un);
28292 mutex_enter(SD_MUTEX(un));
28293 un->un_f_ejecting = FALSE;
28294 mutex_exit(SD_MUTEX(un));
28298 ssc = sd_ssc_init(un);
28304 mutex_enter(SD_MUTEX(un));
28305 sr_ejected(un);
28306 un->un_mediastate = DKIO_EJECTED;
28307 un->un_f_ejecting = FALSE;
28308 cv_broadcast(&un->un_state_cv);
28309 mutex_exit(SD_MUTEX(un));
28311 mutex_enter(SD_MUTEX(un));
28312 un->un_f_ejecting = FALSE;
28313 mutex_exit(SD_MUTEX(un));
28330 sr_ejected(struct sd_lun *un) argument
28334 ASSERT(un != NULL);
28335 ASSERT(mutex_owned(SD_MUTEX(un)));
28337 un->un_f_blockcount_is_valid = FALSE;
28338 un->un_f_tgt_blocksize_is_valid = FALSE;
28339 mutex_exit(SD_MUTEX(un));
28340 cmlb_invalidate(un->un_cmlbhandle, (void *)SD_PATH_DIRECT_PRIORITY);
28341 mutex_enter(SD_MUTEX(un));
28343 if (un->un_errstats != NULL) {
28344 stp = (struct sd_errstats *)un->un_errstats->ks_data;
28371 struct sd_lun *un; local
28383 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
28387 if (un->un_f_cfg_is_atapi == TRUE) {
28394 ssc = sd_ssc_init(un);
28405 ssc = sd_ssc_init(un);
28451 struct sd_lun *un; local
28467 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL ||
28468 (un->un_state == SD_STATE_OFFLINE)) {
28476 if ((un->un_f_cfg_is_atapi == TRUE) || (un->un_f_mmc_cap == TRUE)) {
28486 ssc = sd_ssc_init(un);
28493 SD_ERROR(SD_LOG_IOCTL_RMMEDIA, un,
28504 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
28525 ssc = sd_ssc_init(un);
28532 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
28541 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
28582 ssc = sd_ssc_init(un);
28583 if ((un->un_f_cfg_is_atapi == TRUE) || (un->un_f_mmc_cap == TRUE)) {
28624 struct sd_lun *un; local
28635 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL ||
28636 (un->un_state == SD_STATE_OFFLINE)) {
28672 if (un->un_tgt_blocksize == CDROM_BLK_512) {
28674 } else if (un->un_tgt_blocksize == CDROM_BLK_1024) {
28705 sd_wm_cache_constructor(void *wm, void *un, int flags) argument
28724 sd_wm_cache_destructor(void *wm, void *un) argument
28750 sd_range_lock(struct sd_lun *un, daddr_t startb, daddr_t endb, ushort_t typ) argument
28758 ASSERT(un != NULL);
28759 ASSERT(!mutex_owned(SD_MUTEX(un)));
28761 mutex_enter(SD_MUTEX(un));
28771 if (!(typ & SD_WTYPE_RMW) && !(un->un_rmw_count)) {
28779 tmp_wmp = sd_get_range(un, startb, endb);
28781 if ((wmp != NULL) && ONLIST(un, wmp)) {
28787 FREE_ONLIST_WMAP(un, wmp);
28805 ASSERT(un->un_wm_cache);
28813 wmp = kmem_cache_alloc(un->un_wm_cache,
28816 mutex_exit(SD_MUTEX(un));
28819 wmp = kmem_cache_alloc(un->un_wm_cache,
28821 mutex_enter(SD_MUTEX(un));
28838 un->un_rmw_count++;
28843 if (!ONLIST(un, wmp)) {
28844 wmp->wm_next = un->un_wm;
28848 un->un_wm = wmp;
28861 cv_wait(&sl_wmp->wm_avail, SD_MUTEX(un));
28871 CHK_N_FREEWMP(un, wmp);
28891 mutex_exit(SD_MUTEX(un));
28913 sd_get_range(struct sd_lun *un, daddr_t startb, daddr_t endb) argument
28917 ASSERT(un != NULL);
28919 for (wmp = un->un_wm; wmp != NULL; wmp = wmp->wm_next) {
28945 sd_free_inlist_wmap(struct sd_lun *un, struct sd_w_map *wmp) argument
28947 ASSERT(un != NULL);
28949 if (un->un_wm == wmp) {
28950 un->un_wm = wmp->wm_next;
28961 kmem_cache_free(un->un_wm_cache, wmp);
28976 sd_range_unlock(struct sd_lun *un, struct sd_w_map *wm) argument
28978 ASSERT(un != NULL);
28980 ASSERT(!mutex_owned(SD_MUTEX(un)));
28982 mutex_enter(SD_MUTEX(un));
28985 un->un_rmw_count--;
28998 sd_free_inlist_wmap(un, wm);
29001 mutex_exit(SD_MUTEX(un));
29023 struct sd_lun *un; local
29034 un = SD_GET_UN(bp);
29035 ASSERT(un != NULL);
29036 ASSERT(!mutex_owned(SD_MUTEX(un)));
29038 SD_TRACE(SD_LOG_IO_RMMEDIA, un,
29049 SD_NEXT_IOSTART(bsp->mbs_layer_index, un, bp);
29051 SD_TRACE(SD_LOG_IO_RMMEDIA, un,
29077 sddump_do_read_of_rmw(struct sd_lun *un, uint64_t blkno, uint64_t nblk, argument
29087 ASSERT(un != NULL);
29088 ASSERT(mutex_owned(SD_MUTEX(un)));
29090 target_blocksize = un->un_tgt_blocksize;
29092 mutex_exit(SD_MUTEX(un));
29094 bp = scsi_alloc_consistent_buf(SD_ADDRESS(un), (struct buf *)NULL,
29097 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
29103 rval = sd_setup_rw_pkt(un, &pkt, bp, 0, NULL_FUNC, NULL,
29107 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
29126 SD_TRACE(SD_LOG_DUMP, un, "sddump: sending read\n");
29128 if ((sd_scsi_poll(un, pkt) == 0) && (pkt->pkt_resid == 0)) {
29138 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
29145 SD_INFO(SD_LOG_DUMP, un,
29148 (void) sd_send_polled_RQS(un);
29157 SD_INFO(SD_LOG_DUMP, un,
29160 if (un->un_f_lun_reset_enabled == TRUE) {
29161 reset_retval = scsi_reset(SD_ADDRESS(un),
29165 (void) scsi_reset(SD_ADDRESS(un), RESET_TARGET);
29167 (void) sd_send_polled_RQS(un);
29170 SD_INFO(SD_LOG_DUMP, un,
29173 mutex_enter(SD_MUTEX(un));
29174 sd_reset_target(un, pkt);
29175 mutex_exit(SD_MUTEX(un));
29183 (void) scsi_reset(SD_ADDRESS(un), RESET_ALL);
29184 (void) sd_send_polled_RQS(un);
29198 mutex_enter(SD_MUTEX(un));
29217 sd_failfast_flushq(struct sd_lun *un) argument
29223 ASSERT(un != NULL);
29224 ASSERT(mutex_owned(SD_MUTEX(un)));
29225 ASSERT(un->un_failfast_state == SD_FAILFAST_ACTIVE);
29226 ASSERT(un->un_failfast_bp == NULL);
29228 SD_TRACE(SD_LOG_IO_FAILFAST, un,
29229 "sd_failfast_flushq: entry: un:0x%p\n", un);
29240 if (un->un_failfast_headp == NULL) {
29241 ASSERT(un->un_failfast_tailp == NULL);
29242 un->un_failfast_headp = un->un_waitq_headp;
29244 ASSERT(un->un_failfast_tailp != NULL);
29245 un->un_failfast_tailp->av_forw = un->un_waitq_headp;
29248 un->un_failfast_tailp = un->un_waitq_tailp;
29251 for (bp = un->un_waitq_headp; bp != NULL; bp = bp->av_forw) {
29252 SD_UPDATE_KSTATS(un, kstat_waitq_exit, bp);
29256 un->un_waitq_headp = un->un_waitq_tailp = NULL;
29263 for (bp = un->un_waitq_headp; bp != NULL; bp = next_waitq_bp) {
29284 if (bp == un->un_waitq_headp) {
29286 un->un_waitq_headp = next_waitq_bp;
29287 if (un->un_waitq_headp == NULL) {
29289 un->un_waitq_tailp = NULL;
29296 ASSERT(un->un_waitq_headp != NULL);
29300 if (bp == un->un_waitq_tailp) {
29303 un->un_waitq_tailp = prev_waitq_bp;
29313 SD_UPDATE_KSTATS(un, kstat_waitq_exit, bp);
29318 if (un->un_failfast_headp == NULL) {
29320 ASSERT(un->un_failfast_tailp == NULL);
29321 un->un_failfast_headp =
29322 un->un_failfast_tailp = bp;
29325 ASSERT(un->un_failfast_tailp != NULL);
29326 ASSERT(un->un_failfast_tailp->b_flags &
29328 un->un_failfast_tailp->av_forw = bp;
29329 un->un_failfast_tailp = bp;
29337 while ((bp = un->un_failfast_headp) != NULL) {
29339 un->un_failfast_headp = bp->av_forw;
29340 if (un->un_failfast_headp == NULL) {
29341 un->un_failfast_tailp = NULL;
29350 sd_return_failed_command_no_restart(un, bp, EIO);
29355 ddi_xbuf_flushq(un->un_xbuf_attr, sd_failfast_flushq_callback);
29358 SD_TRACE(SD_LOG_IO_FAILFAST, un,
29359 "sd_failfast_flushq: exit: un:0x%p\n", un);
29395 sd_setup_next_xfer(struct sd_lun *un, struct buf *bp, argument
29415 num_blks_not_xfered = SD_BYTES2TGTBLOCKS(un, bytes_not_xfered);
29421 SD_BYTES2TGTBLOCKS(un, bp->b_bcount - bytes_not_xfered);
29428 rval = sd_setup_next_rw_pkt(un, pkt, bp,
29455 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
29475 sd_panic_for_res_conflict(struct sd_lun *un) argument
29482 ddi_pathname(SD_DEVINFO(un), path_str));
29509 sd_faultinjection_ioctl(int cmd, intptr_t arg, struct sd_lun *un) argument
29514 SD_TRACE(SD_LOG_IOERR, un, "sd_faultinjection_ioctl: entry\n");
29516 mutex_enter(SD_MUTEX(un));
29521 SD_INFO(SD_LOG_SDTEST, un,
29526 SD_INFO(SD_LOG_IOERR, un,
29532 SD_INFO(SD_LOG_SDTEST, un,
29536 un->sd_injection_mask = 0xFFFFFFFF;
29538 un->sd_fi_fifo_pkt[i] = NULL;
29539 un->sd_fi_fifo_xb[i] = NULL;
29540 un->sd_fi_fifo_un[i] = NULL;
29541 un->sd_fi_fifo_arq[i] = NULL;
29543 un->sd_fi_fifo_start = 0;
29544 un->sd_fi_fifo_end = 0;
29546 mutex_enter(&(un->un_fi_mutex));
29547 un->sd_fi_log[0] = '\0';
29548 un->sd_fi_buf_len = 0;
29549 mutex_exit(&(un->un_fi_mutex));
29551 SD_INFO(SD_LOG_IOERR, un,
29557 SD_INFO(SD_LOG_SDTEST, un,
29560 un->sd_injection_mask = 0x0;
29564 if (un->sd_fi_fifo_pkt[i] != NULL) {
29565 kmem_free(un->sd_fi_fifo_pkt[i],
29568 if (un->sd_fi_fifo_xb[i] != NULL) {
29569 kmem_free(un->sd_fi_fifo_xb[i],
29572 if (un->sd_fi_fifo_un[i] != NULL) {
29573 kmem_free(un->sd_fi_fifo_un[i],
29576 if (un->sd_fi_fifo_arq[i] != NULL) {
29577 kmem_free(un->sd_fi_fifo_arq[i],
29580 un->sd_fi_fifo_pkt[i] = NULL;
29581 un->sd_fi_fifo_un[i] = NULL;
29582 un->sd_fi_fifo_xb[i] = NULL;
29583 un->sd_fi_fifo_arq[i] = NULL;
29585 un->sd_fi_fifo_start = 0;
29586 un->sd_fi_fifo_end = 0;
29588 SD_INFO(SD_LOG_IOERR, un,
29594 SD_INFO(SD_LOG_SDTEST, un,
29597 i = un->sd_fi_fifo_end % SD_FI_MAX_ERROR;
29602 if (un->sd_fi_fifo_pkt[i] != NULL) {
29603 kmem_free(un->sd_fi_fifo_pkt[i],
29607 un->sd_fi_fifo_pkt[i] =
29609 if (un->sd_fi_fifo_pkt[i] == NULL) {
29613 rval = ddi_copyin((void *)arg, un->sd_fi_fifo_pkt[i],
29616 kmem_free(un->sd_fi_fifo_pkt[i],
29618 un->sd_fi_fifo_pkt[i] = NULL;
29621 SD_INFO(SD_LOG_IOERR, un,
29628 SD_INFO(SD_LOG_SDTEST, un,
29631 i = un->sd_fi_fifo_end % SD_FI_MAX_ERROR;
29635 if (un->sd_fi_fifo_xb[i] != NULL) {
29636 kmem_free(un->sd_fi_fifo_xb[i],
29638 un->sd_fi_fifo_xb[i] = NULL;
29641 un->sd_fi_fifo_xb[i] =
29643 if (un->sd_fi_fifo_xb[i] == NULL) {
29647 rval = ddi_copyin((void *)arg, un->sd_fi_fifo_xb[i],
29651 kmem_free(un->sd_fi_fifo_xb[i],
29653 un->sd_fi_fifo_xb[i] = NULL;
29656 SD_INFO(SD_LOG_IOERR, un,
29663 SD_INFO(SD_LOG_SDTEST, un,
29666 i = un->sd_fi_fifo_end % SD_FI_MAX_ERROR;
29670 if (un->sd_fi_fifo_un[i] != NULL) {
29671 kmem_free(un->sd_fi_fifo_un[i],
29673 un->sd_fi_fifo_un[i] = NULL;
29676 un->sd_fi_fifo_un[i] =
29678 if (un->sd_fi_fifo_un[i] == NULL) {
29682 rval = ddi_copyin((void *)arg, un->sd_fi_fifo_un[i],
29685 kmem_free(un->sd_fi_fifo_un[i],
29687 un->sd_fi_fifo_un[i] = NULL;
29691 SD_INFO(SD_LOG_IOERR, un,
29699 SD_INFO(SD_LOG_SDTEST, un,
29701 i = un->sd_fi_fifo_end % SD_FI_MAX_ERROR;
29705 if (un->sd_fi_fifo_arq[i] != NULL) {
29706 kmem_free(un->sd_fi_fifo_arq[i],
29708 un->sd_fi_fifo_arq[i] = NULL;
29711 un->sd_fi_fifo_arq[i] =
29713 if (un->sd_fi_fifo_arq[i] == NULL) {
29717 rval = ddi_copyin((void *)arg, un->sd_fi_fifo_arq[i],
29720 kmem_free(un->sd_fi_fifo_arq[i],
29722 un->sd_fi_fifo_arq[i] = NULL;
29726 SD_INFO(SD_LOG_IOERR, un,
29739 un->sd_fi_fifo_end + i < SD_FI_MAX_ERROR) {
29740 un->sd_fi_fifo_end += i;
29743 SD_INFO(SD_LOG_IOERR, un,
29745 if (un->sd_fi_fifo_end + i < SD_FI_MAX_ERROR) {
29746 un->sd_fi_fifo_end++;
29749 SD_INFO(SD_LOG_IOERR, un,
29751 un->sd_fi_fifo_end);
29756 SD_INFO(SD_LOG_SDTEST, un,
29761 mutex_enter(&(un->un_fi_mutex));
29762 rval = ddi_copyout(un->sd_fi_log, (void *)arg,
29763 un->sd_fi_buf_len+1, 0);
29764 mutex_exit(&(un->un_fi_mutex));
29776 mutex_exit(SD_MUTEX(un));
29777 SD_TRACE(SD_LOG_IOERR, un, "sd_faultinjection_ioctl: exit\n");
29792 sd_injection_log(char *buf, struct sd_lun *un) argument
29796 ASSERT(un != NULL);
29799 mutex_enter(&(un->un_fi_mutex));
29803 if (len + un->sd_fi_buf_len < SD_FI_MAX_BUF) {
29804 uint_t offset = strlen((char *)un->sd_fi_log);
29805 char *destp = (char *)un->sd_fi_log + offset;
29810 un->sd_fi_buf_len += len;
29811 un->sd_fi_log[un->sd_fi_buf_len] = '\0';
29814 mutex_exit(&(un->un_fi_mutex));
29837 struct sd_lun *un; local
29844 un = SD_GET_UN(bp);
29846 ASSERT(un != NULL);
29848 mutex_enter(SD_MUTEX(un));
29850 SD_TRACE(SD_LOG_SDTEST, un,
29855 un->sd_fi_fifo_start == un->sd_fi_fifo_end) {
29856 mutex_exit(SD_MUTEX(un));
29860 SD_INFO(SD_LOG_SDTEST, un,
29864 i = un->sd_fi_fifo_start % SD_FI_MAX_ERROR;
29866 fi_pkt = un->sd_fi_fifo_pkt[i];
29867 fi_xb = un->sd_fi_fifo_xb[i];
29868 fi_un = un->sd_fi_fifo_un[i];
29869 fi_arq = un->sd_fi_fifo_arq[i];
29921 SD_CONDSET(un->un_sd->sd_inq, un, inq_rmb, "inq_rmb");
29922 SD_CONDSET(un, un, un_ctype, "un_ctype");
29923 SD_CONDSET(un, un, un_reset_retry_count,
29925 SD_CONDSET(un, un, un_reservation_type, "un_reservation_type");
29926 SD_CONDSET(un, un, un_resvd_status, "un_resvd_status");
29927 SD_CONDSET(un, un, un_f_arq_enabled, "un_f_arq_enabled");
29928 SD_CONDSET(un, un, un_f_allow_bus_device_reset,
29930 SD_CONDSET(un, un, un_f_opt_queueing, "un_f_opt_queueing");
29940 if (un->sd_fi_fifo_pkt[i] != NULL) {
29941 kmem_free(un->sd_fi_fifo_pkt[i], sizeof (struct sd_fi_pkt));
29943 if (un->sd_fi_fifo_xb[i] != NULL) {
29944 kmem_free(un->sd_fi_fifo_xb[i], sizeof (struct sd_fi_xb));
29946 if (un->sd_fi_fifo_un[i] != NULL) {
29947 kmem_free(un->sd_fi_fifo_un[i], sizeof (struct sd_fi_un));
29949 if (un->sd_fi_fifo_arq[i] != NULL) {
29950 kmem_free(un->sd_fi_fifo_arq[i], sizeof (struct sd_fi_arq));
29959 un->sd_fi_fifo_pkt[i] = NULL;
29960 un->sd_fi_fifo_un[i] = NULL;
29961 un->sd_fi_fifo_xb[i] = NULL;
29962 un->sd_fi_fifo_arq[i] = NULL;
29964 un->sd_fi_fifo_start++;
29966 mutex_exit(SD_MUTEX(un));
29968 SD_INFO(SD_LOG_SDTEST, un, "sd_faultinjection: exit\n");
30245 sd_set_unit_attributes(struct sd_lun *un, dev_info_t *devi) argument
30249 ASSERT(un->un_sd);
30250 ASSERT(un->un_sd->sd_inq);
30255 un->un_f_sync_cache_supported = TRUE;
30262 un->un_f_sync_cache_required = FALSE;
30264 if (un->un_sd->sd_inq->inq_rmb) {
30270 un->un_f_has_removable_media = TRUE;
30275 un->un_f_non_devbsize_supported = TRUE;
30280 un->un_f_doorlock_supported = TRUE;
30288 un->un_f_chk_wp_open = TRUE;
30294 un->un_f_monitor_media_state = TRUE;
30301 un->un_f_check_start_stop = TRUE;
30307 un->un_f_eject_media_supported = TRUE;
30317 un->un_f_pm_supported = TRUE;
30334 un->un_f_devid_supported = TRUE;
30339 un->un_f_attach_spinup = TRUE;
30347 if (SD_INQUIRY(un)->inq_dtype == DTYPE_DIRECT) {
30348 un->un_f_descr_format_supported = TRUE;
30357 un->un_f_pkstats_enabled = (ddi_prop_get_int(DDI_DEV_T_ANY,
30358 SD_DEVINFO(un), DDI_PROP_DONTPASS,
30379 un->un_f_log_sense_supported = TRUE;
30380 if (!un->un_f_power_condition_disabled &&
30381 SD_INQUIRY(un)->inq_ansi == 6) {
30382 un->un_f_power_condition_supported = TRUE;
30394 un->un_f_log_sense_supported = FALSE;
30397 un->un_f_pm_supported = TRUE;
30398 if (!un->un_f_power_condition_disabled &&
30400 un->un_f_power_condition_supported =
30404 un->un_f_log_sense_supported = TRUE;
30405 un->un_f_pm_log_sense_smart =
30410 SD_INFO(SD_LOG_ATTACH_DETACH, un,
30412 "property set to %d.\n", un, un->un_f_pm_supported);
30416 if (un->un_f_is_hotpluggable) {
30423 un->un_f_monitor_media_state = TRUE;
30425 un->un_f_check_start_stop = TRUE;
30440 struct sd_lun *un; local
30452 un = ddi_get_soft_state(sd_state, ddi_get_instance(devi));
30453 if (un == NULL)
30459 ssc = sd_ssc_init(un);
30460 mutex_enter(SD_MUTEX(un));
30461 if (un->un_f_tgt_blocksize_is_valid == FALSE) {
30462 mutex_exit(SD_MUTEX(un));
30467 mutex_enter(SD_MUTEX(un));
30468 sd_update_block_info(un, lbasize, cap);
30469 if ((un->un_f_tgt_blocksize_is_valid == FALSE)) {
30470 mutex_exit(SD_MUTEX(un));
30476 if (NOT_DEVBSIZE(un)) {
30482 real_addr = first_byte / un->un_tgt_blocksize;
30485 un->un_tgt_blocksize - 1) / un->un_tgt_blocksize;
30488 buffer_size = (end_block - real_addr) * un->un_tgt_blocksize;
30490 SD_TRACE(SD_LOG_IO_PARTITION, un, "sd_tg_rdwr",
30494 if (((first_byte % un->un_tgt_blocksize) != 0) ||
30495 (reqlength % un->un_tgt_blocksize) != 0)
30509 if (ISCD(un) && (cmd == TG_READ) &&
30510 (un->un_f_blockcount_is_valid == TRUE) &&
30511 ((start_block == (un->un_blockcount - 1)) ||
30512 (start_block == (un->un_blockcount - 2)))) {
30516 mutex_exit(SD_MUTEX(un));
30521 bcopy(dkl + SD_TGTBYTEOFFSET(un, start_block,
30530 bcopy(bufaddr, dkl + SD_TGTBYTEOFFSET(un, start_block,
30557 struct sd_lun *un; local
30563 un = ddi_get_soft_state(sd_state, ddi_get_instance(devi));
30564 if (un == NULL)
30572 mutex_enter(SD_MUTEX(un));
30574 if ((un->un_f_blockcount_is_valid == TRUE) &&
30575 (un->un_f_tgt_blocksize_is_valid == TRUE)) {
30576 cap = un->un_blockcount;
30577 lbasize = un->un_tgt_blocksize;
30578 mutex_exit(SD_MUTEX(un));
30581 mutex_exit(SD_MUTEX(un));
30582 ssc = sd_ssc_init(un);
30596 mutex_enter(SD_MUTEX(un));
30597 sd_update_block_info(un, lbasize, cap);
30598 if ((un->un_f_blockcount_is_valid == FALSE) ||
30599 (un->un_f_tgt_blocksize_is_valid == FALSE)) {
30600 mutex_exit(SD_MUTEX(un));
30603 mutex_exit(SD_MUTEX(un));
30617 ret = sd_get_physical_geometry(un, (cmlb_geom_t *)arg,
30621 ret = sd_get_virtual_geometry(un,
30627 mutex_enter(SD_MUTEX(un));
30629 un->un_f_mmc_writable_media;
30631 un->un_f_is_solid_state;
30633 un->un_f_is_rotational;
30634 mutex_exit(SD_MUTEX(un));
30665 struct sd_lun *un; local
30678 un = ssc->ssc_un;
30679 ASSERT(un != NULL);
30681 dip = un->un_sd->sd_dev;
30693 if (ddi_in_panic() || (un->un_state == SD_STATE_SUSPENDED) ||
30694 (un->un_state == SD_STATE_DUMPING))
30708 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
30747 scsi_fm_ereport_post(un->un_sd, uscsi_path_instance, NULL,
30774 scsi_fm_ereport_post(un->un_sd, uscsi_path_instance,
30803 scsi_fm_ereport_post(un->un_sd, uscsi_path_instance,
30845 scsi_fm_ereport_post(un->un_sd, uscsi_path_instance, NULL,
30888 scsi_fm_ereport_post(un->un_sd,
30937 scsi_fm_ereport_post(un->un_sd,
30993 scsi_fm_ereport_post(un->un_sd, uscsi_path_instance,
31027 sd_ssc_extract_info(sd_ssc_t *ssc, struct sd_lun *un, struct scsi_pkt *pktp, argument
31038 ASSERT(un != NULL);
31043 ASSERT(mutex_owned(SD_MUTEX(un)));
31143 struct sd_lun *un; local
31146 un = ssc->ssc_un;
31147 ASSERT(un != NULL);
31148 ASSERT(!mutex_owned(SD_MUTEX(un)));
31150 mutex_enter(SD_MUTEX(un));
31151 un->un_f_is_rotational = TRUE;
31152 un->un_f_is_solid_state = FALSE;
31154 if (ISCD(un)) {
31155 mutex_exit(SD_MUTEX(un));
31160 un->un_vpd_page_mask & SD_VPD_DEV_CHARACTER_PG) {
31161 mutex_exit(SD_MUTEX(un));
31169 SD_TRACE(SD_LOG_COMMON, un,
31176 mutex_enter(SD_MUTEX(un));
31182 un->un_f_is_rotational = FALSE;
31184 un->un_f_is_rotational = FALSE;
31185 un->un_f_is_solid_state = TRUE;
31190 un->un_f_disksort_disabled = TRUE;
31193 mutex_exit(SD_MUTEX(un));
31200 mutex_exit(SD_MUTEX(un));
31223 struct sd_lun *un; local
31226 un = ssc->ssc_un;
31227 ASSERT(un != NULL);
31228 ASSERT(!mutex_owned(SD_MUTEX(un)));
31230 mutex_enter(SD_MUTEX(un));
31231 if (ISCD(un)) {
31232 mutex_exit(SD_MUTEX(un));
31236 if (un->un_f_descr_format_supported) {
31237 mutex_exit(SD_MUTEX(un));
31240 mutex_enter(SD_MUTEX(un));
31243 un->un_phy_blocksize = DEV_BSIZE;
31246 un->un_phy_blocksize = DEV_BSIZE;
31247 } else if (pbsize > un->un_phy_blocksize) {
31252 un->un_phy_blocksize = pbsize;
31259 if (sd_sdconf_id_match(un, sd_flash_dev_table[i], devid_len)
31261 un->un_phy_blocksize = SSD_SECSIZE;
31262 if (un->un_f_is_solid_state &&
31263 un->un_phy_blocksize != un->un_tgt_blocksize)
31264 un->un_f_enable_rmw = TRUE;
31268 mutex_exit(SD_MUTEX(un));