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()
3488 sd_nvpair_str_decode(struct sd_lun *un, char *nvpair_str) in sd_nvpair_str_decode() argument
3500 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_nvpair_str_decode()
3504 sd_set_properties(un, name, value); in sd_nvpair_str_decode()
3520 sd_set_properties(struct sd_lun *un, char *name, char *value) in sd_set_properties() argument
3527 un->un_f_suppress_cache_flush = TRUE; in sd_set_properties()
3529 un->un_f_suppress_cache_flush = FALSE; in sd_set_properties()
3533 SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: " in sd_set_properties()
3535 un->un_f_suppress_cache_flush); in sd_set_properties()
3541 un->un_ctype = val; in sd_set_properties()
3545 SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: " in sd_set_properties()
3546 "ctype set to %d\n", un->un_ctype); in sd_set_properties()
3552 un->un_busy_timeout = drv_usectohz(val / 1000); in sd_set_properties()
3556 SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: " in sd_set_properties()
3557 "busy_timeout set to %d\n", un->un_busy_timeout); in sd_set_properties()
3563 un->un_f_disksort_disabled = FALSE; in sd_set_properties()
3565 un->un_f_disksort_disabled = TRUE; in sd_set_properties()
3569 SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: " in sd_set_properties()
3571 un->un_f_disksort_disabled); in sd_set_properties()
3577 un->un_f_power_condition_disabled = FALSE; in sd_set_properties()
3579 un->un_f_power_condition_disabled = TRUE; in sd_set_properties()
3583 SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: " in sd_set_properties()
3585 un->un_f_power_condition_disabled); in sd_set_properties()
3591 un->un_reserve_release_time = val; in sd_set_properties()
3595 SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: " in sd_set_properties()
3597 un->un_reserve_release_time); in sd_set_properties()
3603 un->un_f_lun_reset_enabled = TRUE; in sd_set_properties()
3605 un->un_f_lun_reset_enabled = FALSE; in sd_set_properties()
3609 SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: " in sd_set_properties()
3611 un->un_f_lun_reset_enabled); in sd_set_properties()
3617 un->un_busy_retry_count = val; in sd_set_properties()
3621 SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: " in sd_set_properties()
3622 "busy retry count set to %d\n", un->un_busy_retry_count); in sd_set_properties()
3628 un->un_retry_count = val; in sd_set_properties()
3632 SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: " in sd_set_properties()
3633 "timeout retry count set to %d\n", un->un_retry_count); in sd_set_properties()
3639 un->un_notready_retry_count = val; in sd_set_properties()
3643 SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: " in sd_set_properties()
3645 un->un_notready_retry_count); in sd_set_properties()
3651 un->un_reset_retry_count = val; in sd_set_properties()
3655 SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: " in sd_set_properties()
3657 un->un_reset_retry_count); in sd_set_properties()
3663 un->un_saved_throttle = un->un_throttle = val; in sd_set_properties()
3667 SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: " in sd_set_properties()
3668 "throttle set to %d\n", un->un_throttle); in sd_set_properties()
3673 un->un_min_throttle = val; in sd_set_properties()
3677 SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: " in sd_set_properties()
3678 "min throttle set to %d\n", un->un_min_throttle); in sd_set_properties()
3683 un->un_f_rmw_type = val; in sd_set_properties()
3687 SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: " in sd_set_properties()
3688 "RMW type set to %d\n", un->un_f_rmw_type); in sd_set_properties()
3693 ISP2(val) && val >= un->un_tgt_blocksize && in sd_set_properties()
3694 val >= un->un_sys_blocksize) { in sd_set_properties()
3695 un->un_phy_blocksize = val; in sd_set_properties()
3699 SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: " in sd_set_properties()
3700 "physical block size set to %d\n", un->un_phy_blocksize); in sd_set_properties()
3705 un->un_victim_retry_count = val; in sd_set_properties()
3709 SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: " in sd_set_properties()
3711 un->un_victim_retry_count); in sd_set_properties()
3719 if ((un->un_throttle < SD_LOWEST_VALID_THROTTLE) || in sd_set_properties()
3720 (un->un_min_throttle < SD_LOWEST_VALID_THROTTLE) || in sd_set_properties()
3721 (un->un_min_throttle > un->un_throttle)) { in sd_set_properties()
3722 un->un_saved_throttle = un->un_throttle = sd_max_throttle; in sd_set_properties()
3723 un->un_min_throttle = sd_min_throttle; in sd_set_properties()
3728 un->un_f_mmc_gesn_polling = TRUE; in sd_set_properties()
3730 un->un_f_mmc_gesn_polling = FALSE; in sd_set_properties()
3734 SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: " in sd_set_properties()
3736 un->un_f_mmc_gesn_polling); in sd_set_properties()
3742 SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_set_properties: " in sd_set_properties()
3759 sd_get_tunables_from_conf(struct sd_lun *un, int flags, int *data_list, in sd_get_tunables_from_conf() argument
3779 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_get_tunables_from_conf()
3785 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_get_tunables_from_conf()
3791 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_get_tunables_from_conf()
3797 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_get_tunables_from_conf()
3803 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_get_tunables_from_conf()
3809 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_get_tunables_from_conf()
3815 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_get_tunables_from_conf()
3821 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_get_tunables_from_conf()
3827 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_get_tunables_from_conf()
3833 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_get_tunables_from_conf()
3840 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_get_tunables_from_conf()
3864 sd_process_sdconf_table(struct sd_lun *un) in sd_process_sdconf_table() argument
3870 ASSERT(un != NULL); in sd_process_sdconf_table()
3882 if (sd_sdconf_id_match(un, id, idlen) == SD_SUCCESS) { in sd_process_sdconf_table()
3883 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_process_sdconf_table()
3885 sd_set_vers1_properties(un, in sd_process_sdconf_table()
3917 sd_sdconf_id_match(struct sd_lun *un, char *id, int idlen) in sd_sdconf_id_match() argument
3922 ASSERT(un != NULL); in sd_sdconf_id_match()
3923 sd_inq = un->un_sd->sd_inq; in sd_sdconf_id_match()
3938 rval = sd_blank_cmp(un, id, idlen); in sd_sdconf_id_match()
3953 j = sizeof (SD_INQUIRY(un)->inq_pid) - in sd_sdconf_id_match()
3960 if (bcmp(&SD_INQUIRY(un)->inq_pid[i], in sd_sdconf_id_match()
3999 sd_blank_cmp(struct sd_lun *un, char *id, int idlen) in sd_blank_cmp() argument
4004 cnt = sizeof (SD_INQUIRY(un)->inq_vid) + in sd_blank_cmp()
4005 sizeof (SD_INQUIRY(un)->inq_pid); in sd_blank_cmp()
4007 ASSERT(un != NULL); in sd_blank_cmp()
4008 p2 = un->un_sd->sd_inq->inq_vid; in sd_blank_cmp()
4062 sd_chk_vers1_data(struct sd_lun *un, int flags, int *prop_list, in sd_chk_vers1_data() argument
4069 ASSERT(un != NULL); in sd_chk_vers1_data()
4073 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, in sd_chk_vers1_data()
4078 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, in sd_chk_vers1_data()
4086 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, in sd_chk_vers1_data()
4105 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, in sd_chk_vers1_data()
4109 scsi_log(SD_DEVINFO(un), sd_label, CE_CONT, "Size expected: " in sd_chk_vers1_data()
4135 sd_set_vers1_properties(struct sd_lun *un, int flags, sd_tunables *prop_list) in sd_set_vers1_properties() argument
4137 ASSERT(un != NULL); in sd_set_vers1_properties()
4145 un->un_f_opt_disable_cache = TRUE; in sd_set_vers1_properties()
4146 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_set_vers1_properties()
4152 un->un_f_cfg_playmsf_bcd = TRUE; in sd_set_vers1_properties()
4153 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_set_vers1_properties()
4157 un->un_f_cfg_readsub_bcd = TRUE; in sd_set_vers1_properties()
4158 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_set_vers1_properties()
4162 un->un_f_cfg_read_toc_trk_bcd = TRUE; in sd_set_vers1_properties()
4163 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_set_vers1_properties()
4167 un->un_f_cfg_read_toc_addr_bcd = TRUE; in sd_set_vers1_properties()
4168 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_set_vers1_properties()
4172 un->un_f_cfg_no_read_header = TRUE; in sd_set_vers1_properties()
4173 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_set_vers1_properties()
4177 un->un_f_cfg_read_cd_xd4 = TRUE; in sd_set_vers1_properties()
4178 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_set_vers1_properties()
4184 un->un_f_opt_fab_devid = TRUE; in sd_set_vers1_properties()
4185 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_set_vers1_properties()
4192 un->un_saved_throttle = un->un_throttle = in sd_set_vers1_properties()
4194 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_set_vers1_properties()
4203 un->un_notready_retry_count = in sd_set_vers1_properties()
4205 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_set_vers1_properties()
4207 " set to %d\n", un->un_notready_retry_count); in sd_set_vers1_properties()
4216 un->un_ctype = prop_list->sdt_ctype; in sd_set_vers1_properties()
4217 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_set_vers1_properties()
4222 un->un_ctype = prop_list->sdt_ctype; in sd_set_vers1_properties()
4223 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_set_vers1_properties()
4228 un->un_ctype = prop_list->sdt_ctype; in sd_set_vers1_properties()
4229 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_set_vers1_properties()
4234 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, in sd_set_vers1_properties()
4244 un->un_busy_retry_count = in sd_set_vers1_properties()
4246 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_set_vers1_properties()
4249 un->un_busy_retry_count); in sd_set_vers1_properties()
4255 un->un_reset_retry_count = in sd_set_vers1_properties()
4257 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_set_vers1_properties()
4260 un->un_reset_retry_count); in sd_set_vers1_properties()
4266 un->un_reserve_release_time = in sd_set_vers1_properties()
4268 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_set_vers1_properties()
4271 un->un_reserve_release_time); in sd_set_vers1_properties()
4280 un->un_f_cfg_tur_check = TRUE; in sd_set_vers1_properties()
4281 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_set_vers1_properties()
4286 un->un_min_throttle = prop_list->sdt_min_throttle; in sd_set_vers1_properties()
4287 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_set_vers1_properties()
4289 un->un_min_throttle); in sd_set_vers1_properties()
4293 un->un_f_disksort_disabled = in sd_set_vers1_properties()
4296 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_set_vers1_properties()
4303 un->un_f_lun_reset_enabled = in sd_set_vers1_properties()
4306 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_set_vers1_properties()
4313 un->un_f_suppress_cache_flush = in sd_set_vers1_properties()
4316 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_set_vers1_properties()
4323 un->un_f_power_condition_disabled = in sd_set_vers1_properties()
4326 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_set_vers1_properties()
4336 if ((un->un_throttle < SD_LOWEST_VALID_THROTTLE) || in sd_set_vers1_properties()
4337 (un->un_min_throttle < SD_LOWEST_VALID_THROTTLE) || in sd_set_vers1_properties()
4338 (un->un_min_throttle > un->un_throttle)) { in sd_set_vers1_properties()
4339 un->un_saved_throttle = un->un_throttle = sd_max_throttle; in sd_set_vers1_properties()
4340 un->un_min_throttle = sd_min_throttle; in sd_set_vers1_properties()
4375 sd_get_physical_geometry(struct sd_lun *un, cmlb_geom_t *pgeom_p, in sd_get_physical_geometry() argument
4398 ASSERT(un != NULL); in sd_get_physical_geometry()
4401 if (ISCD(un)) { in sd_get_physical_geometry()
4404 lbasize = un->un_sys_blocksize; in sd_get_physical_geometry()
4424 if (ISCD(un) || in sd_get_physical_geometry()
4425 un->un_interconnect_type == SD_INTERCONNECT_SATA || in sd_get_physical_geometry()
4426 (un->un_ctype == CTYPE_CCS && SD_INQUIRY(un)->inq_ansi >= 5)) in sd_get_physical_geometry()
4429 cdbsize = (un->un_f_cfg_is_atapi == TRUE) ? CDB_GROUP2 : CDB_GROUP0; in sd_get_physical_geometry()
4435 ssc = sd_ssc_init(un); in sd_get_physical_geometry()
4439 SD_ERROR(SD_LOG_COMMON, un, in sd_get_physical_geometry()
4450 if (un->un_f_cfg_is_atapi == TRUE) { in sd_get_physical_geometry()
4490 sector_size = un->un_sys_blocksize; in sd_get_physical_geometry()
4492 sector_size &= ~(un->un_sys_blocksize - 1); in sd_get_physical_geometry()
4498 SD_INFO(SD_LOG_COMMON, un, in sd_get_physical_geometry()
4500 SD_INFO(SD_LOG_COMMON, un, in sd_get_physical_geometry()
4503 SD_INFO(SD_LOG_COMMON, un, in sd_get_physical_geometry()
4517 SD_ERROR(SD_LOG_COMMON, un, in sd_get_physical_geometry()
4528 if (un->un_f_cfg_is_atapi == TRUE) { in sd_get_physical_geometry()
4567 SD_INFO(SD_LOG_COMMON, un, in sd_get_physical_geometry()
4569 SD_INFO(SD_LOG_COMMON, un, in sd_get_physical_geometry()
4571 SD_INFO(SD_LOG_COMMON, un, in sd_get_physical_geometry()
4573 SD_INFO(SD_LOG_COMMON, un, " pgeom_p: %p; read cap: %d\n", in sd_get_physical_geometry()
4583 SD_INFO(SD_LOG_COMMON, un, in sd_get_physical_geometry()
4603 SD_INFO(SD_LOG_COMMON, un, in sd_get_physical_geometry()
4605 SD_INFO(SD_LOG_COMMON, un, in sd_get_physical_geometry()
4608 SD_INFO(SD_LOG_COMMON, un, in sd_get_physical_geometry()
4611 SD_INFO(SD_LOG_COMMON, un, in sd_get_physical_geometry()
4613 SD_INFO(SD_LOG_COMMON, un, in sd_get_physical_geometry()
4617 SD_INFO(SD_LOG_COMMON, un, in sd_get_physical_geometry()
4671 sd_get_virtual_geometry(struct sd_lun *un, cmlb_geom_t *lgeom_p, in sd_get_virtual_geometry() argument
4677 ASSERT(un != NULL); in sd_get_virtual_geometry()
4680 (void) scsi_ifsetcap(SD_ADDRESS(un), "sector-size", lbasize, 1); in sd_get_virtual_geometry()
4681 (void) scsi_ifsetcap(SD_ADDRESS(un), "total-sectors", capacity, 1); in sd_get_virtual_geometry()
4684 geombuf = (uint_t)scsi_ifgetcap(SD_ADDRESS(un), "geometry", 1); in sd_get_virtual_geometry()
4694 lgeom_p->g_secsize = un->un_sys_blocksize; in sd_get_virtual_geometry()
4719 SD_INFO(SD_LOG_COMMON, un, "sd_get_virtual_geometry: (cached)\n"); in sd_get_virtual_geometry()
4737 sd_update_block_info(struct sd_lun *un, uint32_t lbasize, uint64_t capacity) in sd_update_block_info() argument
4740 un->un_tgt_blocksize = lbasize; in sd_update_block_info()
4741 un->un_f_tgt_blocksize_is_valid = TRUE; in sd_update_block_info()
4742 if (!un->un_f_has_removable_media) { in sd_update_block_info()
4743 un->un_sys_blocksize = lbasize; in sd_update_block_info()
4748 un->un_blockcount = capacity; in sd_update_block_info()
4749 un->un_f_blockcount_is_valid = TRUE; in sd_update_block_info()
4754 if (un->un_errstats != NULL) { in sd_update_block_info()
4757 capacity *= un->un_sys_blocksize; in sd_update_block_info()
4758 stp = (struct sd_errstats *)un->un_errstats->ks_data; in sd_update_block_info()
4770 sd_parse_blk_limits_vpd(struct sd_lun *un, uchar_t *vpd_pg) in sd_parse_blk_limits_vpd() argument
4772 sd_blk_limits_t *lim = &un->un_blk_lim; in sd_parse_blk_limits_vpd()
4830 struct sd_lun *un = ssc->ssc_un; in sd_setup_blk_limits() local
4835 if (un->un_vpd_page_mask & SD_VPD_BLK_LIMITS_PG) { in sd_setup_blk_limits()
4877 struct sd_lun *un; in sd_register_devid() local
4880 un = ssc->ssc_un; in sd_register_devid()
4881 ASSERT(un != NULL); in sd_register_devid()
4882 ASSERT(mutex_owned(SD_MUTEX(un))); in sd_register_devid()
4883 ASSERT((SD_DEVINFO(un)) == devi); in sd_register_devid()
4897 if (un->un_vpd_page_mask & SD_VPD_UNIT_SERIAL_PG) { in sd_register_devid()
4899 mutex_exit(SD_MUTEX(un)); in sd_register_devid()
4911 DDI_DEV_T_NONE, SD_DEVINFO(un), in sd_register_devid()
4934 SD_DEVINFO(un), in sd_register_devid()
4939 mutex_enter(SD_MUTEX(un)); in sd_register_devid()
4943 if (un->un_vpd_page_mask & SD_VPD_DEVID_WWN_PG) { in sd_register_devid()
4944 mutex_exit(SD_MUTEX(un)); in sd_register_devid()
4956 mutex_enter(SD_MUTEX(un)); in sd_register_devid()
4969 if (ddi_devid_get(SD_DEVINFO(un), &un->un_devid) == DDI_SUCCESS) { in sd_register_devid()
4970 ASSERT(un->un_devid); in sd_register_devid()
4971 un->un_f_devid_transport_defined = TRUE; in sd_register_devid()
4982 if (un->un_f_opt_fab_devid == TRUE) { in sd_register_devid()
4998 if (un->un_devid != NULL) { in sd_register_devid()
4999 (void) ddi_devid_register(SD_DEVINFO(un), in sd_register_devid()
5000 un->un_devid); in sd_register_devid()
5001 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_register_devid()
5009 (char *)ddi_driver_name(SD_DEVINFO(un)), in sd_register_devid()
5010 (uchar_t *)SD_INQUIRY(un), sizeof (*SD_INQUIRY(un)), in sd_register_devid()
5012 inq83_resid, &un->un_devid) == DDI_SUCCESS) { in sd_register_devid()
5015 (void) ddi_devid_register(SD_DEVINFO(un), un->un_devid); in sd_register_devid()
5035 un->un_f_opt_fab_devid = TRUE; in sd_register_devid()
5038 if (un->un_devid != NULL) { in sd_register_devid()
5039 (void) ddi_devid_register(SD_DEVINFO(un), in sd_register_devid()
5040 un->un_devid); in sd_register_devid()
5041 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_register_devid()
5086 struct sd_lun *un; in sd_get_devid() local
5089 un = ssc->ssc_un; in sd_get_devid()
5090 ASSERT(un != NULL); in sd_get_devid()
5091 ASSERT(mutex_owned(SD_MUTEX(un))); in sd_get_devid()
5093 SD_TRACE(SD_LOG_ATTACH_DETACH, un, "sd_get_devid: entry: un: 0x%p\n", in sd_get_devid()
5094 un); in sd_get_devid()
5096 if (un->un_devid != NULL) { in sd_get_devid()
5100 mutex_exit(SD_MUTEX(un)); in sd_get_devid()
5101 if (cmlb_get_devid_block(un->un_cmlbhandle, &blk, in sd_get_devid()
5103 mutex_enter(SD_MUTEX(un)); in sd_get_devid()
5113 mutex_enter(SD_MUTEX(un)); in sd_get_devid()
5114 buffer_size = SD_REQBYTES2TGTBYTES(un, sizeof (struct dk_devid)); in sd_get_devid()
5115 mutex_exit(SD_MUTEX(un)); in sd_get_devid()
5158 mutex_enter(SD_MUTEX(un)); in sd_get_devid()
5160 un->un_devid = tmpid; in sd_get_devid()
5161 bcopy(&dkdevid->dkd_devid, un->un_devid, sz); in sd_get_devid()
5165 SD_TRACE(SD_LOG_ATTACH_DETACH, un, "sd_get_devid: exit: un:0x%p\n", un); in sd_get_devid()
5169 mutex_enter(SD_MUTEX(un)); in sd_get_devid()
5191 struct sd_lun *un; in sd_create_devid() local
5194 un = ssc->ssc_un; in sd_create_devid()
5195 ASSERT(un != NULL); in sd_create_devid()
5198 if (ddi_devid_init(SD_DEVINFO(un), DEVID_FAB, 0, NULL, &un->un_devid) in sd_create_devid()
5205 ddi_devid_free(un->un_devid); in sd_create_devid()
5206 un->un_devid = NULL; in sd_create_devid()
5209 return (un->un_devid); in sd_create_devid()
5236 struct sd_lun *un; in sd_write_deviceid() local
5239 un = ssc->ssc_un; in sd_write_deviceid()
5240 ASSERT(un != NULL); in sd_write_deviceid()
5241 ASSERT(mutex_owned(SD_MUTEX(un))); in sd_write_deviceid()
5243 mutex_exit(SD_MUTEX(un)); in sd_write_deviceid()
5244 if (cmlb_get_devid_block(un->un_cmlbhandle, &blk, in sd_write_deviceid()
5246 mutex_enter(SD_MUTEX(un)); in sd_write_deviceid()
5252 buf = kmem_zalloc(un->un_sys_blocksize, KM_SLEEP); in sd_write_deviceid()
5260 mutex_enter(SD_MUTEX(un)); in sd_write_deviceid()
5261 bcopy(un->un_devid, &dkdevid->dkd_devid, in sd_write_deviceid()
5262 ddi_devid_sizeof(un->un_devid)); in sd_write_deviceid()
5263 mutex_exit(SD_MUTEX(un)); in sd_write_deviceid()
5277 status = sd_send_scsi_WRITE(ssc, buf, un->un_sys_blocksize, blk, in sd_write_deviceid()
5282 kmem_free(buf, un->un_sys_blocksize); in sd_write_deviceid()
5284 mutex_enter(SD_MUTEX(un)); in sd_write_deviceid()
5315 struct sd_lun *un; in sd_check_vpd_page_support() local
5318 un = ssc->ssc_un; in sd_check_vpd_page_support()
5319 ASSERT(un != NULL); in sd_check_vpd_page_support()
5320 ASSERT(mutex_owned(SD_MUTEX(un))); in sd_check_vpd_page_support()
5322 mutex_exit(SD_MUTEX(un)); in sd_check_vpd_page_support()
5336 mutex_enter(SD_MUTEX(un)); in sd_check_vpd_page_support()
5362 un->un_vpd_page_mask |= SD_VPD_SUPPORTED_PG; in sd_check_vpd_page_support()
5365 un->un_vpd_page_mask |= SD_VPD_UNIT_SERIAL_PG; in sd_check_vpd_page_support()
5368 un->un_vpd_page_mask |= SD_VPD_OPERATING_PG; in sd_check_vpd_page_support()
5371 un->un_vpd_page_mask |= SD_VPD_ASCII_OP_PG; in sd_check_vpd_page_support()
5374 un->un_vpd_page_mask |= SD_VPD_DEVID_WWN_PG; in sd_check_vpd_page_support()
5377 un->un_vpd_page_mask |= SD_VPD_EXTENDED_DATA_PG; in sd_check_vpd_page_support()
5380 un->un_vpd_page_mask |= SD_VPD_BLK_LIMITS_PG; in sd_check_vpd_page_support()
5383 un->un_vpd_page_mask |= SD_VPD_DEV_CHARACTER_PG; in sd_check_vpd_page_support()
5392 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_check_vpd_page_support()
5417 struct sd_lun *un; in sd_setup_pm() local
5420 un = ssc->ssc_un; in sd_setup_pm()
5421 ASSERT(un != NULL); in sd_setup_pm()
5429 ASSERT(!mutex_owned(SD_MUTEX(un))); in sd_setup_pm()
5447 if (un->un_f_pm_supported) { in sd_setup_pm()
5455 un->un_f_start_stop_supported = TRUE; in sd_setup_pm()
5457 if (un->un_f_power_condition_supported) { in sd_setup_pm()
5462 un->un_f_power_condition_supported = FALSE; in sd_setup_pm()
5465 if (!un->un_f_power_condition_supported) { in sd_setup_pm()
5471 un->un_f_start_stop_supported = FALSE; in sd_setup_pm()
5478 un->un_f_pm_is_enabled = TRUE; in sd_setup_pm()
5479 (void) sd_create_pm_components(devi, un); in sd_setup_pm()
5484 if (un->un_f_log_sense_supported) { in sd_setup_pm()
5489 un->un_start_stop_cycle_page = in sd_setup_pm()
5499 un->un_f_log_sense_supported = FALSE; in sd_setup_pm()
5500 un->un_f_pm_log_sense_smart = FALSE; in sd_setup_pm()
5511 if (!un->un_f_log_sense_supported) { in sd_setup_pm()
5512 un->un_power_level = SD_SPINDLE_ON; in sd_setup_pm()
5513 un->un_f_pm_is_enabled = FALSE; in sd_setup_pm()
5538 un->un_power_level = SD_SPINDLE_ON; in sd_setup_pm()
5539 un->un_f_pm_is_enabled = FALSE; in sd_setup_pm()
5552 un->un_start_stop_cycle_page = START_STOP_CYCLE_VU_PAGE; in sd_setup_pm()
5553 un->un_f_pm_is_enabled = TRUE; in sd_setup_pm()
5559 un->un_power_level = SD_SPINDLE_ON; in sd_setup_pm()
5560 un->un_f_pm_is_enabled = FALSE; in sd_setup_pm()
5566 un->un_start_stop_cycle_page = START_STOP_CYCLE_PAGE; in sd_setup_pm()
5567 un->un_f_pm_is_enabled = TRUE; in sd_setup_pm()
5571 if (un->un_f_pm_is_enabled == TRUE) { in sd_setup_pm()
5576 log_page_size, un->un_start_stop_cycle_page, in sd_setup_pm()
5596 (void) sd_create_pm_components(devi, un); in sd_setup_pm()
5598 un->un_power_level = SD_SPINDLE_ON; in sd_setup_pm()
5599 un->un_f_pm_is_enabled = FALSE; in sd_setup_pm()
5616 sd_create_pm_components(dev_info_t *devi, struct sd_lun *un) in sd_create_pm_components() argument
5618 ASSERT(!mutex_owned(SD_MUTEX(un))); in sd_create_pm_components()
5620 if (un->un_f_power_condition_supported) { in sd_create_pm_components()
5624 un->un_power_level = SD_SPINDLE_ACTIVE; in sd_create_pm_components()
5625 un->un_f_pm_is_enabled = FALSE; in sd_create_pm_components()
5632 un->un_power_level = SD_SPINDLE_ON; in sd_create_pm_components()
5633 un->un_f_pm_is_enabled = FALSE; in sd_create_pm_components()
5649 if (un->un_f_attach_spinup && (pm_raise_power(SD_DEVINFO(un), 0, in sd_create_pm_components()
5650 SD_PM_STATE_ACTIVE(un)) == DDI_SUCCESS)) { in sd_create_pm_components()
5651 mutex_enter(SD_MUTEX(un)); in sd_create_pm_components()
5652 un->un_power_level = SD_PM_STATE_ACTIVE(un); in sd_create_pm_components()
5653 mutex_enter(&un->un_pm_mutex); in sd_create_pm_components()
5655 un->un_pm_count = 0; in sd_create_pm_components()
5657 mutex_enter(SD_MUTEX(un)); in sd_create_pm_components()
5658 un->un_power_level = SD_PM_STATE_STOPPED(un); in sd_create_pm_components()
5659 mutex_enter(&un->un_pm_mutex); in sd_create_pm_components()
5661 un->un_pm_count = -1; in sd_create_pm_components()
5663 mutex_exit(&un->un_pm_mutex); in sd_create_pm_components()
5664 mutex_exit(SD_MUTEX(un)); in sd_create_pm_components()
5685 struct sd_lun *un; in sd_ddi_suspend() local
5688 un = ddi_get_soft_state(sd_state, ddi_get_instance(devi)); in sd_ddi_suspend()
5689 if (un == NULL) { in sd_ddi_suspend()
5693 SD_TRACE(SD_LOG_IO_PM, un, "sd_ddi_suspend: entry\n"); in sd_ddi_suspend()
5695 mutex_enter(SD_MUTEX(un)); in sd_ddi_suspend()
5698 if (un->un_state == SD_STATE_SUSPENDED) { in sd_ddi_suspend()
5699 mutex_exit(SD_MUTEX(un)); in sd_ddi_suspend()
5700 SD_TRACE(SD_LOG_IO_PM, un, "sd_ddi_suspend: " in sd_ddi_suspend()
5706 if (un->un_resvd_status & in sd_ddi_suspend()
5708 mutex_exit(SD_MUTEX(un)); in sd_ddi_suspend()
5709 SD_TRACE(SD_LOG_IO_PM, un, "sd_ddi_suspend: " in sd_ddi_suspend()
5718 if ((un->un_state == SD_STATE_RWAIT) || in sd_ddi_suspend()
5719 (un->un_state == SD_STATE_PM_CHANGING)) { in sd_ddi_suspend()
5720 mutex_exit(SD_MUTEX(un)); in sd_ddi_suspend()
5721 SD_TRACE(SD_LOG_IO_PM, un, "sd_ddi_suspend: " in sd_ddi_suspend()
5727 un->un_save_state = un->un_last_state; in sd_ddi_suspend()
5728 New_state(un, SD_STATE_SUSPENDED); in sd_ddi_suspend()
5745 while (un->un_ncmds_in_transport != 0) { in sd_ddi_suspend()
5749 if (cv_timedwait(&un->un_disk_busy_cv, SD_MUTEX(un), in sd_ddi_suspend()
5755 Restore_state(un); in sd_ddi_suspend()
5756 un->un_last_state = un->un_save_state; in sd_ddi_suspend()
5758 cv_broadcast(&un->un_suspend_cv); in sd_ddi_suspend()
5759 mutex_exit(SD_MUTEX(un)); in sd_ddi_suspend()
5760 SD_ERROR(SD_LOG_IO_PM, un, in sd_ddi_suspend()
5762 SD_TRACE(SD_LOG_IO_PM, un, "sd_ddi_suspend: exiting\n"); in sd_ddi_suspend()
5771 if (SD_OK_TO_SUSPEND_SCSI_WATCHER(un)) { in sd_ddi_suspend()
5772 opaque_t temp_token = un->un_swr_token; in sd_ddi_suspend()
5773 mutex_exit(SD_MUTEX(un)); in sd_ddi_suspend()
5775 mutex_enter(SD_MUTEX(un)); in sd_ddi_suspend()
5778 if (un->un_reset_throttle_timeid != NULL) { in sd_ddi_suspend()
5779 timeout_id_t temp_id = un->un_reset_throttle_timeid; in sd_ddi_suspend()
5780 un->un_reset_throttle_timeid = NULL; in sd_ddi_suspend()
5781 mutex_exit(SD_MUTEX(un)); in sd_ddi_suspend()
5783 mutex_enter(SD_MUTEX(un)); in sd_ddi_suspend()
5786 if (un->un_dcvb_timeid != NULL) { in sd_ddi_suspend()
5787 timeout_id_t temp_id = un->un_dcvb_timeid; in sd_ddi_suspend()
5788 un->un_dcvb_timeid = NULL; in sd_ddi_suspend()
5789 mutex_exit(SD_MUTEX(un)); in sd_ddi_suspend()
5791 mutex_enter(SD_MUTEX(un)); in sd_ddi_suspend()
5794 mutex_enter(&un->un_pm_mutex); in sd_ddi_suspend()
5795 if (un->un_pm_timeid != NULL) { in sd_ddi_suspend()
5796 timeout_id_t temp_id = un->un_pm_timeid; in sd_ddi_suspend()
5797 un->un_pm_timeid = NULL; in sd_ddi_suspend()
5798 mutex_exit(&un->un_pm_mutex); in sd_ddi_suspend()
5799 mutex_exit(SD_MUTEX(un)); in sd_ddi_suspend()
5801 mutex_enter(SD_MUTEX(un)); in sd_ddi_suspend()
5803 mutex_exit(&un->un_pm_mutex); in sd_ddi_suspend()
5806 if (un->un_rmw_msg_timeid != NULL) { in sd_ddi_suspend()
5807 timeout_id_t temp_id = un->un_rmw_msg_timeid; in sd_ddi_suspend()
5808 un->un_rmw_msg_timeid = NULL; in sd_ddi_suspend()
5809 mutex_exit(SD_MUTEX(un)); in sd_ddi_suspend()
5811 mutex_enter(SD_MUTEX(un)); in sd_ddi_suspend()
5814 if (un->un_retry_timeid != NULL) { in sd_ddi_suspend()
5815 timeout_id_t temp_id = un->un_retry_timeid; in sd_ddi_suspend()
5816 un->un_retry_timeid = NULL; in sd_ddi_suspend()
5817 mutex_exit(SD_MUTEX(un)); in sd_ddi_suspend()
5819 mutex_enter(SD_MUTEX(un)); in sd_ddi_suspend()
5821 if (un->un_retry_bp != NULL) { in sd_ddi_suspend()
5822 un->un_retry_bp->av_forw = un->un_waitq_headp; in sd_ddi_suspend()
5823 un->un_waitq_headp = un->un_retry_bp; in sd_ddi_suspend()
5824 if (un->un_waitq_tailp == NULL) { in sd_ddi_suspend()
5825 un->un_waitq_tailp = un->un_retry_bp; in sd_ddi_suspend()
5827 un->un_retry_bp = NULL; in sd_ddi_suspend()
5828 un->un_retry_statp = NULL; in sd_ddi_suspend()
5832 if (un->un_direct_priority_timeid != NULL) { in sd_ddi_suspend()
5833 timeout_id_t temp_id = un->un_direct_priority_timeid; in sd_ddi_suspend()
5834 un->un_direct_priority_timeid = NULL; in sd_ddi_suspend()
5835 mutex_exit(SD_MUTEX(un)); in sd_ddi_suspend()
5837 mutex_enter(SD_MUTEX(un)); in sd_ddi_suspend()
5840 if (un->un_f_is_fibre == TRUE) { in sd_ddi_suspend()
5844 if (un->un_insert_event != NULL) { in sd_ddi_suspend()
5845 mutex_exit(SD_MUTEX(un)); in sd_ddi_suspend()
5846 (void) ddi_remove_event_handler(un->un_insert_cb_id); in sd_ddi_suspend()
5847 mutex_enter(SD_MUTEX(un)); in sd_ddi_suspend()
5848 un->un_insert_event = NULL; in sd_ddi_suspend()
5851 if (un->un_remove_event != NULL) { in sd_ddi_suspend()
5852 mutex_exit(SD_MUTEX(un)); in sd_ddi_suspend()
5853 (void) ddi_remove_event_handler(un->un_remove_cb_id); in sd_ddi_suspend()
5854 mutex_enter(SD_MUTEX(un)); in sd_ddi_suspend()
5855 un->un_remove_event = NULL; in sd_ddi_suspend()
5859 mutex_exit(SD_MUTEX(un)); in sd_ddi_suspend()
5861 SD_TRACE(SD_LOG_IO_PM, un, "sd_ddi_suspend: exit\n"); in sd_ddi_suspend()
5881 struct sd_lun *un; in sd_ddi_resume() local
5883 un = ddi_get_soft_state(sd_state, ddi_get_instance(devi)); in sd_ddi_resume()
5884 if (un == NULL) { in sd_ddi_resume()
5888 SD_TRACE(SD_LOG_IO_PM, un, "sd_ddi_resume: entry\n"); in sd_ddi_resume()
5890 mutex_enter(SD_MUTEX(un)); in sd_ddi_resume()
5891 Restore_state(un); in sd_ddi_resume()
5897 un->un_last_state = un->un_save_state; in sd_ddi_resume()
5910 un->un_throttle = un->un_saved_throttle; in sd_ddi_resume()
5921 if (un->un_f_attach_spinup) { in sd_ddi_resume()
5922 mutex_exit(SD_MUTEX(un)); in sd_ddi_resume()
5923 (void) pm_raise_power(SD_DEVINFO(un), 0, in sd_ddi_resume()
5924 SD_PM_STATE_ACTIVE(un)); in sd_ddi_resume()
5925 mutex_enter(SD_MUTEX(un)); in sd_ddi_resume()
5932 cv_broadcast(&un->un_suspend_cv); in sd_ddi_resume()
5933 cv_broadcast(&un->un_state_cv); in sd_ddi_resume()
5936 if (SD_OK_TO_RESUME_SCSI_WATCHER(un)) { in sd_ddi_resume()
5937 scsi_watch_resume(un->un_swr_token); in sd_ddi_resume()
5951 ddi_xbuf_dispatch(un->un_xbuf_attr); in sd_ddi_resume()
5953 sd_start_cmds(un, NULL); in sd_ddi_resume()
5954 mutex_exit(SD_MUTEX(un)); in sd_ddi_resume()
5956 SD_TRACE(SD_LOG_IO_PM, un, "sd_ddi_resume: exit\n"); in sd_ddi_resume()
5978 sd_pm_state_change(struct sd_lun *un, int level, int flag) in sd_pm_state_change() argument
5980 ASSERT(un != NULL); in sd_pm_state_change()
5981 SD_TRACE(SD_LOG_POWER, un, "sd_pm_state_change: entry\n"); in sd_pm_state_change()
5983 ASSERT(!mutex_owned(SD_MUTEX(un))); in sd_pm_state_change()
5984 mutex_enter(SD_MUTEX(un)); in sd_pm_state_change()
5986 if (flag == SD_PM_STATE_ROLLBACK || SD_PM_IS_IO_CAPABLE(un, level)) { in sd_pm_state_change()
5987 un->un_power_level = level; in sd_pm_state_change()
5988 ASSERT(!mutex_owned(&un->un_pm_mutex)); in sd_pm_state_change()
5989 mutex_enter(&un->un_pm_mutex); in sd_pm_state_change()
5990 if (SD_DEVICE_IS_IN_LOW_POWER(un)) { in sd_pm_state_change()
5991 un->un_pm_count++; in sd_pm_state_change()
5992 ASSERT(un->un_pm_count == 0); in sd_pm_state_change()
5994 mutex_exit(&un->un_pm_mutex); in sd_pm_state_change()
6000 if ((un->un_f_pm_is_enabled == FALSE) || (un->un_resvd_status & in sd_pm_state_change()
6002 mutex_exit(SD_MUTEX(un)); in sd_pm_state_change()
6003 SD_TRACE(SD_LOG_POWER, un, in sd_pm_state_change()
6008 SD_INFO(SD_LOG_POWER, un, "sd_pm_state_change: " in sd_pm_state_change()
6009 "un_ncmds_in_driver=%ld\n", un->un_ncmds_in_driver); in sd_pm_state_change()
6016 if ((un->un_ncmds_in_driver == 0) && in sd_pm_state_change()
6017 (un->un_state != SD_STATE_RWAIT)) { in sd_pm_state_change()
6023 mutex_enter(&un->un_pm_mutex); in sd_pm_state_change()
6024 un->un_pm_count = -1; in sd_pm_state_change()
6025 mutex_exit(&un->un_pm_mutex); in sd_pm_state_change()
6026 un->un_power_level = level; in sd_pm_state_change()
6030 mutex_exit(SD_MUTEX(un)); in sd_pm_state_change()
6032 SD_TRACE(SD_LOG_POWER, un, "sd_pm_state_change: exit\n"); in sd_pm_state_change()
6060 struct sd_lun *un = arg; in sd_pm_idletimeout_handler() local
6066 mutex_enter(SD_MUTEX(un)); in sd_pm_idletimeout_handler()
6067 mutex_enter(&un->un_pm_mutex); in sd_pm_idletimeout_handler()
6069 if (un->un_pm_idle_timeid == NULL) { in sd_pm_idletimeout_handler()
6070 mutex_exit(&un->un_pm_mutex); in sd_pm_idletimeout_handler()
6071 mutex_exit(SD_MUTEX(un)); in sd_pm_idletimeout_handler()
6074 if (((gethrtime() - un->un_pm_idle_time) > idletime) && in sd_pm_idletimeout_handler()
6075 (un->un_ncmds_in_driver == 0) && (un->un_pm_count == 0)) { in sd_pm_idletimeout_handler()
6080 if (un->un_f_non_devbsize_supported) { in sd_pm_idletimeout_handler()
6081 un->un_buf_chain_type = SD_CHAIN_INFO_RMMEDIA; in sd_pm_idletimeout_handler()
6083 un->un_buf_chain_type = SD_CHAIN_INFO_DISK; in sd_pm_idletimeout_handler()
6085 un->un_uscsi_chain_type = SD_CHAIN_INFO_USCSI_CMD; in sd_pm_idletimeout_handler()
6087 SD_TRACE(SD_LOG_IO_PM, un, in sd_pm_idletimeout_handler()
6089 (void) pm_idle_component(SD_DEVINFO(un), 0); in sd_pm_idletimeout_handler()
6090 un->un_pm_idle_timeid = NULL; in sd_pm_idletimeout_handler()
6092 un->un_pm_idle_timeid = in sd_pm_idletimeout_handler()
6093 timeout(sd_pm_idletimeout_handler, un, in sd_pm_idletimeout_handler()
6096 mutex_exit(&un->un_pm_mutex); in sd_pm_idletimeout_handler()
6097 mutex_exit(SD_MUTEX(un)); in sd_pm_idletimeout_handler()
6112 struct sd_lun *un = arg; in sd_pm_timeout_handler() local
6114 (void) pm_idle_component(SD_DEVINFO(un), 0); in sd_pm_timeout_handler()
6115 mutex_enter(&un->un_pm_mutex); in sd_pm_timeout_handler()
6116 un->un_pm_timeid = NULL; in sd_pm_timeout_handler()
6117 mutex_exit(&un->un_pm_mutex); in sd_pm_timeout_handler()
6135 struct sd_lun *un; in sdpower() local
6152 if (((un = ddi_get_soft_state(sd_state, instance)) == NULL) || in sdpower()
6153 !SD_PM_IS_LEVEL_VALID(un, level) || component != 0) { in sdpower()
6157 ssc = sd_ssc_init(un); in sdpower()
6159 SD_TRACE(SD_LOG_IO_PM, un, "sdpower: entry, level = %d\n", level); in sdpower()
6161 mutex_enter(SD_MUTEX(un)); in sdpower()
6163 SD_INFO(SD_LOG_POWER, un, "sdpower: un_ncmds_in_driver = %ld\n", in sdpower()
6164 un->un_ncmds_in_driver); in sdpower()
6173 if ((!SD_PM_IS_IO_CAPABLE(un, level)) && in sdpower()
6174 (un->un_ncmds_in_driver != 0)) { in sdpower()
6175 mutex_exit(SD_MUTEX(un)); in sdpower()
6177 SD_TRACE(SD_LOG_IO_PM, un, in sdpower()
6191 if ((un->un_state == SD_STATE_OFFLINE) || in sdpower()
6192 (un->un_state == SD_STATE_SUSPENDED)) { in sdpower()
6193 mutex_exit(SD_MUTEX(un)); in sdpower()
6195 SD_TRACE(SD_LOG_IO_PM, un, in sdpower()
6207 state_before_pm = un->un_state; in sdpower()
6208 un->un_state = SD_STATE_PM_CHANGING; in sdpower()
6210 mutex_exit(SD_MUTEX(un)); in sdpower()
6217 if (SD_PM_STOP_MOTOR_NEEDED(un, level) && in sdpower()
6218 un->un_f_log_sense_supported) { in sdpower()
6226 mutex_enter(SD_MUTEX(un)); in sdpower()
6227 log_sense_page = un->un_start_stop_cycle_page; in sdpower()
6228 mutex_exit(SD_MUTEX(un)); in sdpower()
6247 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, in sdpower()
6258 mutex_enter(SD_MUTEX(un)); in sdpower()
6259 un->un_state = state_before_pm; in sdpower()
6260 cv_broadcast(&un->un_suspend_cv); in sdpower()
6261 mutex_exit(SD_MUTEX(un)); in sdpower()
6262 SD_TRACE(SD_LOG_IO_PM, un, in sdpower()
6280 if (un->un_f_pm_log_sense_smart) { in sdpower()
6281 sd_pm_tran_data.un.smart_count.allowed = maxcycles; in sdpower()
6282 sd_pm_tran_data.un.smart_count.consumed = ncycles; in sdpower()
6283 sd_pm_tran_data.un.smart_count.flag = 0; in sdpower()
6286 sd_pm_tran_data.un.scsi_cycles.lifemax = maxcycles; in sdpower()
6287 sd_pm_tran_data.un.scsi_cycles.ncycles = ncycles; in sdpower()
6289 sd_pm_tran_data.un.scsi_cycles.svc_date[i] = in sdpower()
6292 sd_pm_tran_data.un.scsi_cycles.flag = 0; in sdpower()
6335 mutex_enter(&un->un_pm_mutex); in sdpower()
6336 if (un->un_pm_timeid == NULL) { in sdpower()
6337 un->un_pm_timeid = in sdpower()
6339 un, intvlp * drv_usectohz(1000000)); in sdpower()
6340 mutex_exit(&un->un_pm_mutex); in sdpower()
6341 (void) pm_busy_component(SD_DEVINFO(un), 0); in sdpower()
6343 mutex_exit(&un->un_pm_mutex); in sdpower()
6350 mutex_enter(SD_MUTEX(un)); in sdpower()
6351 un->un_state = state_before_pm; in sdpower()
6352 cv_broadcast(&un->un_suspend_cv); in sdpower()
6353 mutex_exit(SD_MUTEX(un)); in sdpower()
6355 SD_TRACE(SD_LOG_IO_PM, un, "sdpower: exit, " in sdpower()
6365 mutex_enter(SD_MUTEX(un)); in sdpower()
6366 un->un_state = state_before_pm; in sdpower()
6367 cv_broadcast(&un->un_suspend_cv); in sdpower()
6368 mutex_exit(SD_MUTEX(un)); in sdpower()
6369 SD_TRACE(SD_LOG_IO_PM, un, in sdpower()
6376 if (!SD_PM_IS_IO_CAPABLE(un, level)) { in sdpower()
6381 mutex_enter(SD_MUTEX(un)); in sdpower()
6382 save_state = un->un_last_state; in sdpower()
6383 last_power_level = un->un_power_level; in sdpower()
6389 ASSERT(un->un_ncmds_in_driver == 0); in sdpower()
6390 mutex_exit(SD_MUTEX(un)); in sdpower()
6396 if ((rval = sd_pm_state_change(un, level, SD_PM_STATE_CHANGE)) in sdpower()
6403 mutex_enter(SD_MUTEX(un)); in sdpower()
6404 un->un_state = state_before_pm; in sdpower()
6405 un->un_power_level = last_power_level; in sdpower()
6406 cv_broadcast(&un->un_suspend_cv); in sdpower()
6407 mutex_exit(SD_MUTEX(un)); in sdpower()
6408 SD_TRACE(SD_LOG_IO_PM, un, in sdpower()
6428 if (SD_PM_IS_IO_CAPABLE(un, level)) { in sdpower()
6435 if (un->un_f_power_condition_supported) { in sdpower()
6438 SD_TRACE(SD_LOG_IO_PM, un, in sdpower()
6444 SD_TRACE(SD_LOG_IO_PM, un, "sdpower: sending \'%s\' unit\n", in sdpower()
6458 if ((sval == ENXIO) && un->un_f_has_removable_media) { in sdpower()
6471 if (!SD_PM_IS_IO_CAPABLE(un, level)) { in sdpower()
6481 (void) sd_pm_state_change(un, last_power_level, in sdpower()
6483 mutex_enter(SD_MUTEX(un)); in sdpower()
6484 un->un_last_state = save_state; in sdpower()
6485 mutex_exit(SD_MUTEX(un)); in sdpower()
6486 } else if (un->un_f_monitor_media_state) { in sdpower()
6495 mutex_enter(SD_MUTEX(un)); in sdpower()
6496 un->un_f_watcht_stopped = FALSE; in sdpower()
6497 if (un->un_swr_token != NULL) { in sdpower()
6498 opaque_t temp_token = un->un_swr_token; in sdpower()
6499 un->un_f_watcht_stopped = TRUE; in sdpower()
6500 un->un_swr_token = NULL; in sdpower()
6501 mutex_exit(SD_MUTEX(un)); in sdpower()
6505 mutex_exit(SD_MUTEX(un)); in sdpower()
6524 (void) sd_pm_state_change(un, level, in sdpower()
6531 if (un->un_f_monitor_media_state) { in sdpower()
6532 mutex_enter(SD_MUTEX(un)); in sdpower()
6533 if (un->un_f_watcht_stopped == TRUE) { in sdpower()
6536 un->un_f_watcht_stopped = FALSE; in sdpower()
6537 mutex_exit(SD_MUTEX(un)); in sdpower()
6539 sd_watch_request_submit(un); in sdpower()
6540 mutex_enter(SD_MUTEX(un)); in sdpower()
6541 un->un_swr_token = temp_token; in sdpower()
6543 mutex_exit(SD_MUTEX(un)); in sdpower()
6553 mutex_enter(SD_MUTEX(un)); in sdpower()
6554 un->un_state = state_before_pm; in sdpower()
6555 cv_broadcast(&un->un_suspend_cv); in sdpower()
6556 mutex_exit(SD_MUTEX(un)); in sdpower()
6558 SD_TRACE(SD_LOG_IO_PM, un, "sdpower: exit, status = 0x%x\n", rval); in sdpower()
6641 sd_sync_with_callback(struct sd_lun *un) in sd_sync_with_callback() argument
6643 ASSERT(un != NULL); in sd_sync_with_callback()
6645 mutex_enter(SD_MUTEX(un)); in sd_sync_with_callback()
6647 ASSERT(un->un_in_callback >= 0); in sd_sync_with_callback()
6649 while (un->un_in_callback > 0) { in sd_sync_with_callback()
6650 mutex_exit(SD_MUTEX(un)); in sd_sync_with_callback()
6652 mutex_enter(SD_MUTEX(un)); in sd_sync_with_callback()
6655 mutex_exit(SD_MUTEX(un)); in sd_sync_with_callback()
6678 struct sd_lun *un; in sd_unit_attach() local
6790 if ((un = ddi_get_soft_state(sd_state, instance)) == NULL) { in sd_unit_attach()
6804 un->un_sd = devp; in sd_unit_attach()
6805 devp->sd_private = (opaque_t)un; in sd_unit_attach()
6811 SD_TRACE(SD_LOG_ATTACH_DETACH, un, in sd_unit_attach()
6813 ddi_driver_name(devi), un, instance); in sd_unit_attach()
6824 un->un_node_type = DDI_NT_CD_CHAN; in sd_unit_attach()
6825 un->un_ctype = CTYPE_CDROM; in sd_unit_attach()
6828 un->un_node_type = DDI_NT_BLOCK_CHAN; in sd_unit_attach()
6829 un->un_ctype = CTYPE_ROD; in sd_unit_attach()
6832 un->un_node_type = DDI_NT_BLOCK_CHAN; in sd_unit_attach()
6833 un->un_ctype = CTYPE_CCS; in sd_unit_attach()
6850 un->un_f_is_fibre = TRUE; in sd_unit_attach()
6851 switch (scsi_ifgetcap(SD_ADDRESS(un), "interconnect-type", -1)) { in sd_unit_attach()
6853 un->un_interconnect_type = SD_INTERCONNECT_SSA; in sd_unit_attach()
6854 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_unit_attach()
6855 "sd_unit_attach: un:0x%p SD_INTERCONNECT_SSA\n", un); in sd_unit_attach()
6858 un->un_f_is_fibre = FALSE; in sd_unit_attach()
6859 un->un_interconnect_type = SD_INTERCONNECT_PARALLEL; in sd_unit_attach()
6860 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_unit_attach()
6861 "sd_unit_attach: un:0x%p SD_INTERCONNECT_PARALLEL\n", un); in sd_unit_attach()
6864 un->un_f_is_fibre = FALSE; in sd_unit_attach()
6865 un->un_interconnect_type = SD_INTERCONNECT_SAS; in sd_unit_attach()
6866 un->un_node_type = DDI_NT_BLOCK_SAS; in sd_unit_attach()
6867 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_unit_attach()
6868 "sd_unit_attach: un:0x%p SD_INTERCONNECT_SAS\n", un); in sd_unit_attach()
6871 un->un_f_is_fibre = FALSE; in sd_unit_attach()
6872 un->un_interconnect_type = SD_INTERCONNECT_SATA; in sd_unit_attach()
6873 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_unit_attach()
6874 "sd_unit_attach: un:0x%p SD_INTERCONNECT_SATA\n", un); in sd_unit_attach()
6877 un->un_interconnect_type = SD_INTERCONNECT_FIBRE; in sd_unit_attach()
6878 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_unit_attach()
6879 "sd_unit_attach: un:0x%p SD_INTERCONNECT_FIBRE\n", un); in sd_unit_attach()
6882 un->un_interconnect_type = SD_INTERCONNECT_FABRIC; in sd_unit_attach()
6883 un->un_node_type = DDI_NT_BLOCK_FABRIC; in sd_unit_attach()
6884 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_unit_attach()
6885 "sd_unit_attach: un:0x%p SD_INTERCONNECT_FABRIC\n", un); in sd_unit_attach()
6900 un->un_interconnect_type = SD_DEFAULT_INTERCONNECT_TYPE; in sd_unit_attach()
6901 if (!SD_IS_PARALLEL_SCSI(un)) { in sd_unit_attach()
6902 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_unit_attach()
6904 "INTERCONNECT_FIBRE\n", un); in sd_unit_attach()
6906 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_unit_attach()
6908 "INTERCONNECT_PARALLEL\n", un); in sd_unit_attach()
6909 un->un_f_is_fibre = FALSE; in sd_unit_attach()
6914 if (un->un_f_is_fibre == TRUE) { in sd_unit_attach()
6915 if (scsi_ifgetcap(SD_ADDRESS(un), "scsi-version", 1) == in sd_unit_attach()
6917 switch (un->un_interconnect_type) { in sd_unit_attach()
6920 un->un_node_type = DDI_NT_BLOCK_WWN; in sd_unit_attach()
6931 if (sd_alloc_rqs(devp, un) != DDI_SUCCESS) { in sd_unit_attach()
6946 un->un_retry_count = un->un_f_is_fibre ? 3 : 5; in sd_unit_attach()
6953 un->un_notready_retry_count = in sd_unit_attach()
6954 ISCD(un) ? CD_NOT_READY_RETRY_COUNT(un) in sd_unit_attach()
6955 : DISK_NOT_READY_RETRY_COUNT(un); in sd_unit_attach()
6962 un->un_busy_retry_count = un->un_retry_count; in sd_unit_attach()
6970 un->un_reset_retry_count = (un->un_retry_count / 2); in sd_unit_attach()
6975 un->un_victim_retry_count = (2 * un->un_retry_count); in sd_unit_attach()
6982 un->un_reserve_release_time = 5; in sd_unit_attach()
6989 un->un_max_xfer_size = (uint_t)SD_DEFAULT_MAX_XFER_SIZE; in sd_unit_attach()
6990 un->un_partial_dma_supported = 1; in sd_unit_attach()
6999 if (un->un_f_is_fibre == TRUE) { in sd_unit_attach()
7000 un->un_f_allow_bus_device_reset = TRUE; in sd_unit_attach()
7004 un->un_f_allow_bus_device_reset = TRUE; in sd_unit_attach()
7005 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_unit_attach()
7007 "enabled\n", un); in sd_unit_attach()
7009 un->un_f_allow_bus_device_reset = FALSE; in sd_unit_attach()
7010 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_unit_attach()
7012 "disabled\n", un); in sd_unit_attach()
7028 un->un_f_cfg_is_atapi = TRUE; in sd_unit_attach()
7029 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_unit_attach()
7030 "sd_unit_attach: un:0x%p Atapi device\n", un); in sd_unit_attach()
7035 un->un_f_cfg_is_atapi = TRUE; in sd_unit_attach()
7036 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_unit_attach()
7037 "sd_unit_attach: un:0x%p Atapi device\n", un); in sd_unit_attach()
7042 un->un_cmd_timeout = SD_IO_TIME; in sd_unit_attach()
7044 un->un_busy_timeout = SD_BSY_TIMEOUT; in sd_unit_attach()
7047 un->un_state = SD_STATE_NORMAL; in sd_unit_attach()
7048 un->un_last_state = SD_STATE_NORMAL; in sd_unit_attach()
7051 un->un_throttle = sd_max_throttle; in sd_unit_attach()
7052 un->un_saved_throttle = sd_max_throttle; in sd_unit_attach()
7053 un->un_min_throttle = sd_min_throttle; in sd_unit_attach()
7055 if (un->un_f_is_fibre == TRUE) { in sd_unit_attach()
7056 un->un_f_use_adaptive_throttle = TRUE; in sd_unit_attach()
7058 un->un_f_use_adaptive_throttle = FALSE; in sd_unit_attach()
7062 cv_init(&un->un_state_cv, NULL, CV_DRIVER, NULL); in sd_unit_attach()
7063 un->un_mediastate = DKIO_NONE; in sd_unit_attach()
7064 un->un_specified_mediastate = DKIO_NONE; in sd_unit_attach()
7067 cv_init(&un->un_suspend_cv, NULL, CV_DRIVER, NULL); in sd_unit_attach()
7068 cv_init(&un->un_disk_busy_cv, NULL, CV_DRIVER, NULL); in sd_unit_attach()
7071 un->un_power_level = SD_SPINDLE_UNINIT; in sd_unit_attach()
7073 cv_init(&un->un_wcc_cv, NULL, CV_DRIVER, NULL); in sd_unit_attach()
7074 un->un_f_wcc_inprog = 0; in sd_unit_attach()
7080 un->un_f_disksort_disabled = FALSE; in sd_unit_attach()
7081 un->un_f_rmw_type = SD_RMW_TYPE_DEFAULT; in sd_unit_attach()
7082 un->un_f_enable_rmw = FALSE; in sd_unit_attach()
7088 un->un_f_mmc_gesn_polling = TRUE; in sd_unit_attach()
7095 un->un_phy_blocksize = DEV_BSIZE; in sd_unit_attach()
7105 sd_read_unit_properties(un); in sd_unit_attach()
7106 SD_TRACE(SD_LOG_ATTACH_DETACH, un, in sd_unit_attach()
7107 "sd_unit_attach: un:0x%p property configuration complete.\n", un); in sd_unit_attach()
7116 un->un_f_is_hotpluggable = TRUE; in sd_unit_attach()
7123 sd_set_unit_attributes(un, devi); in sd_unit_attach()
7131 un->un_f_blockcount_is_valid = FALSE; in sd_unit_attach()
7132 un->un_f_tgt_blocksize_is_valid = FALSE; in sd_unit_attach()
7138 un->un_tgt_blocksize = un->un_sys_blocksize = DEV_BSIZE; in sd_unit_attach()
7139 un->un_blockcount = 0; in sd_unit_attach()
7145 sd_init_cdb_limits(un); in sd_unit_attach()
7150 if (un->un_f_non_devbsize_supported) { in sd_unit_attach()
7151 un->un_buf_chain_type = SD_CHAIN_INFO_RMMEDIA; in sd_unit_attach()
7153 un->un_buf_chain_type = SD_CHAIN_INFO_DISK; in sd_unit_attach()
7155 un->un_uscsi_chain_type = SD_CHAIN_INFO_USCSI_CMD; in sd_unit_attach()
7156 un->un_direct_chain_type = SD_CHAIN_INFO_DIRECT_CMD; in sd_unit_attach()
7157 un->un_priority_chain_type = SD_CHAIN_INFO_PRIORITY_CMD; in sd_unit_attach()
7159 un->un_xbuf_attr = ddi_xbuf_attr_create(sizeof (struct sd_xbuf), in sd_unit_attach()
7160 sd_xbuf_strategy, un, sd_xbuf_active_limit, sd_xbuf_reserve_limit, in sd_unit_attach()
7162 ddi_xbuf_attr_register_devinfo(un->un_xbuf_attr, devi); in sd_unit_attach()
7165 if (ISCD(un)) { in sd_unit_attach()
7166 un->un_additional_codes = sd_additional_codes; in sd_unit_attach()
7168 un->un_additional_codes = NULL; in sd_unit_attach()
7186 un->un_stats = kstat_create(sd_label, instance, in sd_unit_attach()
7188 if (un->un_stats != NULL) { in sd_unit_attach()
7189 un->un_stats->ks_lock = SD_MUTEX(un); in sd_unit_attach()
7190 kstat_install(un->un_stats); in sd_unit_attach()
7192 SD_TRACE(SD_LOG_ATTACH_DETACH, un, in sd_unit_attach()
7193 "sd_unit_attach: un:0x%p un_stats created\n", un); in sd_unit_attach()
7195 un->un_unmapstats_ks = kstat_create(sd_label, instance, "unmapstats", in sd_unit_attach()
7196 "misc", KSTAT_TYPE_NAMED, sizeof (*un->un_unmapstats) / in sd_unit_attach()
7198 if (un->un_unmapstats_ks) { in sd_unit_attach()
7199 un->un_unmapstats = un->un_unmapstats_ks->ks_data; in sd_unit_attach()
7201 kstat_named_init(&un->un_unmapstats->us_cmds, in sd_unit_attach()
7203 kstat_named_init(&un->un_unmapstats->us_errs, in sd_unit_attach()
7205 kstat_named_init(&un->un_unmapstats->us_extents, in sd_unit_attach()
7207 kstat_named_init(&un->un_unmapstats->us_bytes, in sd_unit_attach()
7210 kstat_install(un->un_unmapstats_ks); in sd_unit_attach()
7216 sd_create_errstats(un, instance); in sd_unit_attach()
7217 if (un->un_errstats == NULL) { in sd_unit_attach()
7220 SD_TRACE(SD_LOG_ATTACH_DETACH, un, in sd_unit_attach()
7221 "sd_unit_attach: un:0x%p errstats created\n", un); in sd_unit_attach()
7229 if (SD_IS_PARALLEL_SCSI(un) || SD_IS_SERIAL(un)) { in sd_unit_attach()
7238 un->un_tagflags = 0; in sd_unit_attach()
7240 (un->un_f_arq_enabled == TRUE)) { in sd_unit_attach()
7241 if (scsi_ifsetcap(SD_ADDRESS(un), "tagged-qing", in sd_unit_attach()
7243 un->un_tagflags = FLAG_STAG; in sd_unit_attach()
7244 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_unit_attach()
7246 "enabled\n", un); in sd_unit_attach()
7247 } else if (scsi_ifgetcap(SD_ADDRESS(un), in sd_unit_attach()
7249 un->un_f_opt_queueing = TRUE; in sd_unit_attach()
7250 un->un_saved_throttle = un->un_throttle = in sd_unit_attach()
7251 min(un->un_throttle, 3); in sd_unit_attach()
7253 un->un_f_opt_queueing = FALSE; in sd_unit_attach()
7254 un->un_saved_throttle = un->un_throttle = 1; in sd_unit_attach()
7256 } else if ((scsi_ifgetcap(SD_ADDRESS(un), "untagged-qing", 0) in sd_unit_attach()
7257 == 1) && (un->un_f_arq_enabled == TRUE)) { in sd_unit_attach()
7259 un->un_f_opt_queueing = TRUE; in sd_unit_attach()
7260 un->un_saved_throttle = un->un_throttle = in sd_unit_attach()
7261 min(un->un_throttle, 3); in sd_unit_attach()
7263 un->un_f_opt_queueing = FALSE; in sd_unit_attach()
7264 un->un_saved_throttle = un->un_throttle = 1; in sd_unit_attach()
7265 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_unit_attach()
7266 "sd_unit_attach: un:0x%p no tag queueing\n", un); in sd_unit_attach()
7272 if (SD_IS_SERIAL(un)) { in sd_unit_attach()
7273 un->un_max_xfer_size = in sd_unit_attach()
7276 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_unit_attach()
7278 "size=0x%x\n", un, un->un_max_xfer_size); in sd_unit_attach()
7291 if (SD_IS_PARALLEL_SCSI(un) && in sd_unit_attach()
7294 if (scsi_ifsetcap(SD_ADDRESS(un), "wide-xfer", in sd_unit_attach()
7296 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_unit_attach()
7298 "enabled\n", un); in sd_unit_attach()
7305 if (un->un_saved_throttle == sd_max_throttle) { in sd_unit_attach()
7306 un->un_max_xfer_size = in sd_unit_attach()
7309 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_unit_attach()
7311 "size=0x%x\n", un, un->un_max_xfer_size); in sd_unit_attach()
7314 if (scsi_ifsetcap(SD_ADDRESS(un), "wide-xfer", in sd_unit_attach()
7316 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_unit_attach()
7318 "Wide Transfer disabled\n", un); in sd_unit_attach()
7322 un->un_tagflags = FLAG_STAG; in sd_unit_attach()
7323 un->un_max_xfer_size = ddi_getprop(DDI_DEV_T_ANY, in sd_unit_attach()
7330 if (un->un_f_lun_reset_enabled) { in sd_unit_attach()
7331 if (scsi_ifsetcap(SD_ADDRESS(un), "lun-reset", 1, 1) == 1) { in sd_unit_attach()
7332 SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_unit_attach: " in sd_unit_attach()
7333 "un:0x%p lun_reset capability set\n", un); in sd_unit_attach()
7335 SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_unit_attach: " in sd_unit_attach()
7336 "un:0x%p lun-reset capability not set\n", un); in sd_unit_attach()
7348 max_xfer_size = scsi_ifgetcap(SD_ADDRESS(un), "dma-max", 1); in sd_unit_attach()
7349 if ((max_xfer_size > 0) && (max_xfer_size < un->un_max_xfer_size)) { in sd_unit_attach()
7351 un->un_max_xfer_size = max_xfer_size; in sd_unit_attach()
7352 if (un->un_partial_dma_supported == 0) in sd_unit_attach()
7353 un->un_partial_dma_supported = 1; in sd_unit_attach()
7355 if (ddi_prop_get_int(DDI_DEV_T_ANY, SD_DEVINFO(un), in sd_unit_attach()
7357 if (ddi_xbuf_attr_setup_brk(un->un_xbuf_attr, in sd_unit_attach()
7358 un->un_max_xfer_size) == 1) { in sd_unit_attach()
7359 un->un_buf_breakup_supported = 1; in sd_unit_attach()
7360 SD_INFO(SD_LOG_ATTACH_DETACH, un, "sd_unit_attach: " in sd_unit_attach()
7361 "un:0x%p Buf breakup enabled\n", un); in sd_unit_attach()
7368 if (un->un_partial_dma_supported == 1) { in sd_unit_attach()
7369 un->un_pkt_flags = PKT_DMA_PARTIAL; in sd_unit_attach()
7371 un->un_pkt_flags = 0; in sd_unit_attach()
7375 ssc = sd_ssc_init(un); in sd_unit_attach()
7381 un->un_fm_private = in sd_unit_attach()
7383 sfip = (struct sd_fm_internal *)un->un_fm_private; in sd_unit_attach()
7386 sfip->fm_ssc.ssc_un = un; in sd_unit_attach()
7388 if (ISCD(un) || in sd_unit_attach()
7389 un->un_f_has_removable_media || in sd_unit_attach()
7405 fm_scsi_log = ddi_prop_get_int(DDI_DEV_T_ANY, SD_DEVINFO(un), in sd_unit_attach()
7449 if (un->un_f_descr_format_supported) { in sd_unit_attach()
7458 SD_TRACE(SD_LOG_ATTACH_DETACH, un, in sd_unit_attach()
7459 "sd_unit_attach: un:0x%p spin-up successful\n", un); in sd_unit_attach()
7497 sd_update_block_info(un, lbasize, capacity); in sd_unit_attach()
7499 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_unit_attach()
7501 "blocks; lbasize= %ld.\n", un, in sd_unit_attach()
7502 un->un_blockcount, un->un_tgt_blocksize); in sd_unit_attach()
7513 scsi_log(SD_DEVINFO(un), in sd_unit_attach()
7526 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_unit_attach()
7529 "returned reservation conflict\n", un); in sd_unit_attach()
7554 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_unit_attach()
7556 "conflict.\n", un); in sd_unit_attach()
7561 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_unit_attach()
7562 "sd_unit_attach: un:0x%p spin-up failed.", un); in sd_unit_attach()
7571 if (ISCD(un)) { in sd_unit_attach()
7592 mutex_init(&un->un_pm_mutex, NULL, MUTEX_DRIVER, NULL); in sd_unit_attach()
7593 cv_init(&un->un_pm_busy_cv, NULL, CV_DRIVER, NULL); in sd_unit_attach()
7595 if (un->un_f_pm_is_enabled == FALSE) { in sd_unit_attach()
7607 if (un->un_f_non_devbsize_supported) { in sd_unit_attach()
7608 un->un_buf_chain_type = SD_CHAIN_INFO_RMMEDIA_NO_PM; in sd_unit_attach()
7610 un->un_buf_chain_type = SD_CHAIN_INFO_DISK_NO_PM; in sd_unit_attach()
7612 un->un_uscsi_chain_type = SD_CHAIN_INFO_USCSI_CMD_NO_PM; in sd_unit_attach()
7636 (void) scsi_ifsetcap(SD_ADDRESS(un), "qfull-retries", in sd_unit_attach()
7641 (void) scsi_ifsetcap(SD_ADDRESS(un), "qfull-retry-interval", in sd_unit_attach()
7653 un->un_mediastate = DKIO_NONE; in sd_unit_attach()
7665 cmlb_alloc_handle(&un->un_cmlbhandle); in sd_unit_attach()
7671 if (!un->un_f_has_removable_media && !un->un_f_is_hotpluggable && in sd_unit_attach()
7672 (lbasize == un->un_sys_blocksize)) in sd_unit_attach()
7677 VOID2BOOLEAN(un->un_f_has_removable_media != 0), in sd_unit_attach()
7678 VOID2BOOLEAN(un->un_f_is_hotpluggable != 0), in sd_unit_attach()
7679 un->un_node_type, offbyone, un->un_cmlbhandle, in sd_unit_attach()
7691 geom_label_valid = (cmlb_validate(un->un_cmlbhandle, 0, in sd_unit_attach()
7694 mutex_enter(SD_MUTEX(un)); in sd_unit_attach()
7699 if (un->un_f_devid_supported) { in sd_unit_attach()
7702 mutex_exit(SD_MUTEX(un)); in sd_unit_attach()
7705 if (un->un_f_opt_disable_cache == TRUE) { in sd_unit_attach()
7712 SD_ERROR(SD_LOG_ATTACH_DETACH, un, in sd_unit_attach()
7714 "caching", un); in sd_unit_attach()
7726 mutex_enter(SD_MUTEX(un)); in sd_unit_attach()
7727 un->un_f_write_cache_enabled = (wc_enabled != 0); in sd_unit_attach()
7728 un->un_f_cache_mode_changeable = (wc_changeable != 0); in sd_unit_attach()
7729 mutex_exit(SD_MUTEX(un)); in sd_unit_attach()
7731 if ((un->un_f_rmw_type != SD_RMW_TYPE_RETURN_ERROR && in sd_unit_attach()
7732 un->un_tgt_blocksize != DEV_BSIZE) || in sd_unit_attach()
7733 un->un_f_enable_rmw) { in sd_unit_attach()
7734 if (!(un->un_wm_cache)) { in sd_unit_attach()
7737 ddi_driver_name(SD_DEVINFO(un)), in sd_unit_attach()
7738 ddi_get_instance(SD_DEVINFO(un))); in sd_unit_attach()
7739 un->un_wm_cache = kmem_cache_create( in sd_unit_attach()
7743 (void *)un, NULL, 0); in sd_unit_attach()
7744 if (!(un->un_wm_cache)) { in sd_unit_attach()
7766 un->un_reservation_type = SD_SCSI3_RESERVATION; in sd_unit_attach()
7767 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_unit_attach()
7768 "sd_unit_attach: un:0x%p SCSI-3 reservations\n", un); in sd_unit_attach()
7775 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_unit_attach()
7776 "sd_unit_attach: un:0x%p SCSI-2 reservations\n", un); in sd_unit_attach()
7777 un->un_reservation_type = SD_SCSI2_RESERVATION; in sd_unit_attach()
7785 SD_INFO(SD_LOG_ATTACH_DETACH, un, in sd_unit_attach()
7786 "sd_unit_attach: un:0x%p default SCSI3 reservations\n", un); in sd_unit_attach()
7787 un->un_reservation_type = SD_SCSI3_RESERVATION; in sd_unit_attach()
7806 if (un->un_f_pkstats_enabled && geom_label_valid) { in sd_unit_attach()
7807 sd_set_pstats(un); in sd_unit_attach()
7808 SD_TRACE(SD_LOG_IO_PARTITION, un, in sd_unit_attach()
7809 "sd_unit_attach: un:0x%p pstats created and set\n", un); in sd_unit_attach()
7812 sd_set_errstats(un); in sd_unit_attach()
7813 SD_TRACE(SD_LOG_ATTACH_DETACH, un, in sd_unit_attach()
7814 "sd_unit_attach: un:0x%p errstats set\n", un); in sd_unit_attach()
7824 if (SD_IS_PARALLEL_SCSI(un) && (tgt >= 0) && (tgt < NTARGETS_WIDE)) { in sd_unit_attach()
7828 SD_TRACE(SD_LOG_ATTACH_DETACH, un, in sd_unit_attach()
7829 "sd_unit_attach: un:0x%p exit success\n", un); in sd_unit_attach()
7847 (void) scsi_ifsetcap(SD_ADDRESS(un), "lun-reset", 0, 1); in sd_unit_attach()
7848 (void) scsi_ifsetcap(SD_ADDRESS(un), "wide-xfer", 0, 1); in sd_unit_attach()
7856 (void) scsi_ifsetcap(SD_ADDRESS(un), "tagged-qing", 0, 1); in sd_unit_attach()
7859 if (un->un_f_is_fibre == FALSE) { in sd_unit_attach()
7860 (void) scsi_ifsetcap(SD_ADDRESS(un), "auto-rqsense", 0, 1); in sd_unit_attach()
7868 mutex_enter(SD_MUTEX(un)); in sd_unit_attach()
7871 kmem_free(un->un_fm_private, sizeof (struct sd_fm_internal)); in sd_unit_attach()
7874 if (un->un_direct_priority_timeid != NULL) { in sd_unit_attach()
7875 timeout_id_t temp_id = un->un_direct_priority_timeid; in sd_unit_attach()
7876 un->un_direct_priority_timeid = NULL; in sd_unit_attach()
7877 mutex_exit(SD_MUTEX(un)); in sd_unit_attach()
7879 mutex_enter(SD_MUTEX(un)); in sd_unit_attach()
7883 if (un->un_startstop_timeid != NULL) { in sd_unit_attach()
7884 timeout_id_t temp_id = un->un_startstop_timeid; in sd_unit_attach()
7885 un->un_startstop_timeid = NULL; in sd_unit_attach()
7886 mutex_exit(SD_MUTEX(un)); in sd_unit_attach()
7888 mutex_enter(SD_MUTEX(un)); in sd_unit_attach()
7892 if (un->un_reset_throttle_timeid != NULL) { in sd_unit_attach()
7893 timeout_id_t temp_id = un->un_reset_throttle_timeid; in sd_unit_attach()
7894 un->un_reset_throttle_timeid = NULL; in sd_unit_attach()
7895 mutex_exit(SD_MUTEX(un)); in sd_unit_attach()
7897 mutex_enter(SD_MUTEX(un)); in sd_unit_attach()
7901 if (un->un_rmw_msg_timeid != NULL) { in sd_unit_attach()
7902 timeout_id_t temp_id = un->un_rmw_msg_timeid; in sd_unit_attach()
7903 un->un_rmw_msg_timeid = NULL; in sd_unit_attach()
7904 mutex_exit(SD_MUTEX(un)); in sd_unit_attach()
7906 mutex_enter(SD_MUTEX(un)); in sd_unit_attach()
7910 if (un->un_retry_timeid != NULL) { in sd_unit_attach()
7911 timeout_id_t temp_id = un->un_retry_timeid; in sd_unit_attach()
7912 un->un_retry_timeid = NULL; in sd_unit_attach()
7913 mutex_exit(SD_MUTEX(un)); in sd_unit_attach()
7915 mutex_enter(SD_MUTEX(un)); in sd_unit_attach()
7919 if (un->un_dcvb_timeid != NULL) { in sd_unit_attach()
7920 timeout_id_t temp_id = un->un_dcvb_timeid; in sd_unit_attach()
7921 un->un_dcvb_timeid = NULL; in sd_unit_attach()
7922 mutex_exit(SD_MUTEX(un)); in sd_unit_attach()
7924 mutex_enter(SD_MUTEX(un)); in sd_unit_attach()
7927 mutex_exit(SD_MUTEX(un)); in sd_unit_attach()
7930 ASSERT(un->un_ncmds_in_transport == 0); in sd_unit_attach()
7931 ASSERT(un->un_ncmds_in_driver == 0); in sd_unit_attach()
7934 sd_sync_with_callback(un); in sd_unit_attach()
7940 if (un->un_errstats != NULL) { in sd_unit_attach()
7941 kstat_delete(un->un_errstats); in sd_unit_attach()
7942 un->un_errstats = NULL; in sd_unit_attach()
7947 if (un->un_stats != NULL) { in sd_unit_attach()
7948 kstat_delete(un->un_stats); in sd_unit_attach()
7949 un->un_stats = NULL; in sd_unit_attach()
7952 ddi_xbuf_attr_unregister_devinfo(un->un_xbuf_attr, devi); in sd_unit_attach()
7953 ddi_xbuf_attr_destroy(un->un_xbuf_attr); in sd_unit_attach()
7956 cv_destroy(&un->un_state_cv); in sd_unit_attach()
7958 sd_free_rqs(un); in sd_unit_attach()
7963 bzero(un, sizeof (struct sd_lun)); /* Clear any stale data! */ in sd_unit_attach()
7998 struct sd_lun *un; in sd_unit_detach() local
8012 ((un = (struct sd_lun *)devp->sd_private) == NULL) || in sd_unit_detach()
8013 (un->un_ncmds_in_driver != 0)) { in sd_unit_detach()
8017 SD_TRACE(SD_LOG_ATTACH_DETACH, un, "sd_unit_detach: entry 0x%p\n", un); in sd_unit_detach()
8022 dev = sd_make_device(SD_DEVINFO(un)); in sd_unit_detach()
8028 mutex_enter(SD_MUTEX(un)); in sd_unit_detach()
8035 if (un->un_ocmap.lyropen[i] != 0) { in sd_unit_detach()
8046 if ((un->un_ncmds_in_transport != 0) || (un->un_retry_timeid != NULL) || in sd_unit_detach()
8047 (un->un_direct_priority_timeid != NULL) || in sd_unit_detach()
8048 (un->un_state == SD_STATE_RWAIT)) { in sd_unit_detach()
8049 mutex_exit(SD_MUTEX(un)); in sd_unit_detach()
8050 SD_ERROR(SD_LOG_ATTACH_DETACH, un, in sd_unit_detach()
8058 if ((un->un_resvd_status & SD_RESERVE) && in sd_unit_detach()
8059 !(un->un_resvd_status & SD_LOST_RESERVE)) { in sd_unit_detach()
8060 mutex_exit(SD_MUTEX(un)); in sd_unit_detach()
8066 SD_ERROR(SD_LOG_ATTACH_DETACH, un, in sd_unit_detach()
8070 mutex_exit(SD_MUTEX(un)); in sd_unit_detach()
8078 mutex_enter(SD_MUTEX(un)); in sd_unit_detach()
8079 if (un->un_resvd_timeid != NULL) { in sd_unit_detach()
8080 timeout_id_t temp_id = un->un_resvd_timeid; in sd_unit_detach()
8081 un->un_resvd_timeid = NULL; in sd_unit_detach()
8082 mutex_exit(SD_MUTEX(un)); in sd_unit_detach()
8084 mutex_enter(SD_MUTEX(un)); in sd_unit_detach()
8087 if (un->un_reset_throttle_timeid != NULL) { in sd_unit_detach()
8088 timeout_id_t temp_id = un->un_reset_throttle_timeid; in sd_unit_detach()
8089 un->un_reset_throttle_timeid = NULL; in sd_unit_detach()
8090 mutex_exit(SD_MUTEX(un)); in sd_unit_detach()
8092 mutex_enter(SD_MUTEX(un)); in sd_unit_detach()
8095 if (un->un_startstop_timeid != NULL) { in sd_unit_detach()
8096 timeout_id_t temp_id = un->un_startstop_timeid; in sd_unit_detach()
8097 un->un_startstop_timeid = NULL; in sd_unit_detach()
8098 mutex_exit(SD_MUTEX(un)); in sd_unit_detach()
8100 mutex_enter(SD_MUTEX(un)); in sd_unit_detach()
8103 if (un->un_rmw_msg_timeid != NULL) { in sd_unit_detach()
8104 timeout_id_t temp_id = un->un_rmw_msg_timeid; in sd_unit_detach()
8105 un->un_rmw_msg_timeid = NULL; in sd_unit_detach()
8106 mutex_exit(SD_MUTEX(un)); in sd_unit_detach()
8108 mutex_enter(SD_MUTEX(un)); in sd_unit_detach()
8111 if (un->un_dcvb_timeid != NULL) { in sd_unit_detach()
8112 timeout_id_t temp_id = un->un_dcvb_timeid; in sd_unit_detach()
8113 un->un_dcvb_timeid = NULL; in sd_unit_detach()
8114 mutex_exit(SD_MUTEX(un)); in sd_unit_detach()
8117 mutex_exit(SD_MUTEX(un)); in sd_unit_detach()
8123 mutex_enter(SD_MUTEX(un)); in sd_unit_detach()
8126 if (un->un_direct_priority_timeid != NULL) { in sd_unit_detach()
8127 timeout_id_t temp_id = un->un_direct_priority_timeid; in sd_unit_detach()
8128 un->un_direct_priority_timeid = NULL; in sd_unit_detach()
8129 mutex_exit(SD_MUTEX(un)); in sd_unit_detach()
8131 mutex_enter(SD_MUTEX(un)); in sd_unit_detach()
8135 if (un->un_mhd_token != NULL) { in sd_unit_detach()
8136 mutex_exit(SD_MUTEX(un)); in sd_unit_detach()
8138 if (scsi_watch_request_terminate(un->un_mhd_token, in sd_unit_detach()
8140 SD_ERROR(SD_LOG_ATTACH_DETACH, un, in sd_unit_detach()
8150 mutex_enter(SD_MUTEX(un)); in sd_unit_detach()
8151 un->un_mhd_token = NULL; in sd_unit_detach()
8154 if (un->un_swr_token != NULL) { in sd_unit_detach()
8155 mutex_exit(SD_MUTEX(un)); in sd_unit_detach()
8157 if (scsi_watch_request_terminate(un->un_swr_token, in sd_unit_detach()
8159 SD_ERROR(SD_LOG_ATTACH_DETACH, un, in sd_unit_detach()
8169 mutex_enter(SD_MUTEX(un)); in sd_unit_detach()
8170 un->un_swr_token = NULL; in sd_unit_detach()
8173 mutex_exit(SD_MUTEX(un)); in sd_unit_detach()
8180 (void) scsi_reset_notify(SD_ADDRESS(un), SCSI_RESET_CANCEL, in sd_unit_detach()
8181 sd_mhd_reset_notify_cb, (caddr_t)un); in sd_unit_detach()
8190 mutex_enter(&un->un_pm_mutex); in sd_unit_detach()
8191 if (un->un_pm_idle_timeid != NULL) { in sd_unit_detach()
8192 timeout_id_t temp_id = un->un_pm_idle_timeid; in sd_unit_detach()
8193 un->un_pm_idle_timeid = NULL; in sd_unit_detach()
8194 mutex_exit(&un->un_pm_mutex); in sd_unit_detach()
8203 (void) pm_idle_component(SD_DEVINFO(un), 0); in sd_unit_detach()
8204 mutex_enter(&un->un_pm_mutex); in sd_unit_detach()
8212 if (un->un_pm_timeid != NULL) { in sd_unit_detach()
8213 timeout_id_t temp_id = un->un_pm_timeid; in sd_unit_detach()
8214 un->un_pm_timeid = NULL; in sd_unit_detach()
8215 mutex_exit(&un->un_pm_mutex); in sd_unit_detach()
8223 (void) pm_idle_component(SD_DEVINFO(un), 0); in sd_unit_detach()
8226 mutex_exit(&un->un_pm_mutex); in sd_unit_detach()
8227 if ((un->un_f_pm_is_enabled == TRUE) && in sd_unit_detach()
8228 (pm_lower_power(SD_DEVINFO(un), 0, SD_PM_STATE_STOPPED(un)) in sd_unit_detach()
8230 SD_ERROR(SD_LOG_ATTACH_DETACH, un, in sd_unit_detach()
8243 mutex_enter(&un->un_pm_mutex); in sd_unit_detach()
8244 if (un->un_pm_timeid != NULL) { in sd_unit_detach()
8245 timeout_id_t temp_id = un->un_pm_timeid; in sd_unit_detach()
8246 un->un_pm_timeid = NULL; in sd_unit_detach()
8247 mutex_exit(&un->un_pm_mutex); in sd_unit_detach()
8249 (void) pm_idle_component(SD_DEVINFO(un), 0); in sd_unit_detach()
8251 mutex_exit(&un->un_pm_mutex); in sd_unit_detach()
8261 (void) scsi_ifsetcap(SD_ADDRESS(un), "lun-reset", 0, 1); in sd_unit_detach()
8262 (void) scsi_ifsetcap(SD_ADDRESS(un), "wide-xfer", 0, 1); in sd_unit_detach()
8275 (void) scsi_ifsetcap(SD_ADDRESS(un), "tagged-qing", 0, 1); in sd_unit_detach()
8278 if (un->un_f_is_fibre == FALSE) { in sd_unit_detach()
8279 (void) scsi_ifsetcap(SD_ADDRESS(un), "auto-rqsense", 0, 1); in sd_unit_detach()
8285 if (un->un_f_is_fibre == TRUE) { in sd_unit_detach()
8286 if ((un->un_insert_event != NULL) && in sd_unit_detach()
8287 (ddi_remove_event_handler(un->un_insert_cb_id) != in sd_unit_detach()
8295 SD_ERROR(SD_LOG_ATTACH_DETACH, un, in sd_unit_detach()
8299 un->un_insert_event = NULL; in sd_unit_detach()
8301 if ((un->un_remove_event != NULL) && in sd_unit_detach()
8302 (ddi_remove_event_handler(un->un_remove_cb_id) != in sd_unit_detach()
8310 SD_ERROR(SD_LOG_ATTACH_DETACH, un, in sd_unit_detach()
8314 un->un_remove_event = NULL; in sd_unit_detach()
8318 sd_sync_with_callback(un); in sd_unit_detach()
8320 cmlb_detach(un->un_cmlbhandle, (void *)SD_PATH_DIRECT); in sd_unit_detach()
8321 cmlb_free_handle(&un->un_cmlbhandle); in sd_unit_detach()
8334 kmem_free(un->un_fm_private, sizeof (struct sd_fm_internal)); in sd_unit_detach()
8340 if (un->un_f_devid_transport_defined == FALSE) in sd_unit_detach()
8347 if (un->un_devid) { in sd_unit_detach()
8348 ddi_devid_free(un->un_devid); in sd_unit_detach()
8349 un->un_devid = NULL; in sd_unit_detach()
8355 if (un->un_wm_cache != NULL) { in sd_unit_detach()
8356 kmem_cache_destroy(un->un_wm_cache); in sd_unit_detach()
8357 un->un_wm_cache = NULL; in sd_unit_detach()
8366 if (un->un_stats != NULL) { in sd_unit_detach()
8367 kstat_delete(un->un_stats); in sd_unit_detach()
8368 un->un_stats = NULL; in sd_unit_detach()
8370 if (un->un_unmapstats != NULL) { in sd_unit_detach()
8371 kstat_delete(un->un_unmapstats_ks); in sd_unit_detach()
8372 un->un_unmapstats_ks = NULL; in sd_unit_detach()
8373 un->un_unmapstats = NULL; in sd_unit_detach()
8375 if (un->un_errstats != NULL) { in sd_unit_detach()
8376 kstat_delete(un->un_errstats); in sd_unit_detach()
8377 un->un_errstats = NULL; in sd_unit_detach()
8381 if (un->un_f_pkstats_enabled) { in sd_unit_detach()
8383 if (un->un_pstats[i] != NULL) { in sd_unit_detach()
8384 kstat_delete(un->un_pstats[i]); in sd_unit_detach()
8385 un->un_pstats[i] = NULL; in sd_unit_detach()
8391 ddi_xbuf_attr_unregister_devinfo(un->un_xbuf_attr, devi); in sd_unit_detach()
8392 ddi_xbuf_attr_destroy(un->un_xbuf_attr); in sd_unit_detach()
8397 mutex_destroy(&un->un_pm_mutex); in sd_unit_detach()
8398 cv_destroy(&un->un_pm_busy_cv); in sd_unit_detach()
8400 cv_destroy(&un->un_wcc_cv); in sd_unit_detach()
8403 cv_destroy(&un->un_state_cv); in sd_unit_detach()
8406 cv_destroy(&un->un_suspend_cv); in sd_unit_detach()
8407 cv_destroy(&un->un_disk_busy_cv); in sd_unit_detach()
8409 sd_free_rqs(un); in sd_unit_detach()
8414 bzero(un, sizeof (struct sd_lun)); in sd_unit_detach()
8438 mutex_exit(SD_MUTEX(un)); in sd_unit_detach()
8444 SD_TRACE(SD_LOG_ATTACH_DETACH, un, "sd_unit_detach: exit failure\n"); in sd_unit_detach()
8467 sd_create_errstats(struct sd_lun *un, int instance) in sd_create_errstats() argument
8474 ASSERT(un != NULL); in sd_create_errstats()
8476 if (un->un_errstats != NULL) { in sd_create_errstats()
8485 un->un_errstats = kstat_create(kstatmodule_err, instance, kstatname, in sd_create_errstats()
8488 if (un->un_errstats == NULL) { in sd_create_errstats()
8489 SD_ERROR(SD_LOG_ATTACH_DETACH, un, in sd_create_errstats()
8494 stp = (struct sd_errstats *)un->un_errstats->ks_data; in sd_create_errstats()
8524 un->un_errstats->ks_private = un; in sd_create_errstats()
8525 un->un_errstats->ks_update = nulldev; in sd_create_errstats()
8527 kstat_install(un->un_errstats); in sd_create_errstats()
8549 sd_set_errstats(struct sd_lun *un) in sd_set_errstats() argument
8554 ASSERT(un != NULL); in sd_set_errstats()
8555 ASSERT(un->un_errstats != NULL); in sd_set_errstats()
8556 stp = (struct sd_errstats *)un->un_errstats->ks_data; in sd_set_errstats()
8558 (void) strncpy(stp->sd_vid.value.c, un->un_sd->sd_inq->inq_vid, 8); in sd_set_errstats()
8559 (void) strncpy(stp->sd_pid.value.c, un->un_sd->sd_inq->inq_pid, 16); in sd_set_errstats()
8561 un->un_sd->sd_inq->inq_revision, 4); in sd_set_errstats()
8569 if ((bcmp(&SD_INQUIRY(un)->inq_pid[9], "SUN", 3) != 0) || in sd_set_errstats()
8570 (bcmp(&SD_INQUIRY(un)->inq_serial, stp->sd_serial.value.c, in sd_set_errstats()
8571 sizeof (SD_INQUIRY(un)->inq_serial)) != 0)) { in sd_set_errstats()
8588 if (bcmp(&SD_INQUIRY(un)->inq_pid[9], "SUN", 3) == 0) { in sd_set_errstats()
8589 bcopy(&SD_INQUIRY(un)->inq_serial, stp->sd_serial.value.c, in sd_set_errstats()
8590 sizeof (SD_INQUIRY(un)->inq_serial)); in sd_set_errstats()
8595 if (ddi_prop_lookup_string(DDI_DEV_T_ANY, SD_DEVINFO(un), in sd_set_errstats()
8604 if (un->un_f_blockcount_is_valid != TRUE) { in sd_set_errstats()
8621 ((uint64_t)un->un_blockcount * un->un_sys_blocksize); in sd_set_errstats()
8639 sd_set_pstats(struct sd_lun *un) in sd_set_pstats() argument
8647 ASSERT(un != NULL); in sd_set_pstats()
8649 instance = ddi_get_instance(SD_DEVINFO(un)); in sd_set_pstats()
8654 if (cmlb_partinfo(un->un_cmlbhandle, i, in sd_set_pstats()
8657 mutex_enter(SD_MUTEX(un)); in sd_set_pstats()
8659 if ((un->un_pstats[i] == NULL) && in sd_set_pstats()
8666 un->un_pstats[i] = kstat_create(sd_label, in sd_set_pstats()
8669 if (un->un_pstats[i] != NULL) { in sd_set_pstats()
8670 un->un_pstats[i]->ks_lock = SD_MUTEX(un); in sd_set_pstats()
8671 kstat_install(un->un_pstats[i]); in sd_set_pstats()
8674 mutex_exit(SD_MUTEX(un)); in sd_set_pstats()
8681 #define SDC_CDB_GROUP(un) ((un->un_f_cfg_is_atapi == TRUE) ? \ argument
8683 #define SDC_HDRLEN(un) ((un->un_f_cfg_is_atapi == TRUE) ? \ argument
8689 #define SDC_BUFLEN(un) (SDC_HDRLEN(un) + MODE_BLK_DESC_LENGTH + \ argument
8696 struct sd_lun *un = ssc->ssc_un; in sd_get_caching_mode_page() local
8698 size_t buflen = SDC_BUFLEN(un); in sd_get_caching_mode_page()
8699 int hdrlen = SDC_HDRLEN(un); in sd_get_caching_mode_page()
8716 rval = sd_send_scsi_MODE_SENSE(ssc, SDC_CDB_GROUP(un), *header, buflen, in sd_get_caching_mode_page()
8719 SD_ERROR(SD_LOG_IOCTL_RMMEDIA, un, "%s: Mode Sense Failed\n", in sd_get_caching_mode_page()
8729 if (un->un_f_cfg_is_atapi == TRUE) { in sd_get_caching_mode_page()
8785 struct sd_lun *un = ssc->ssc_un; in sd_cache_control() local
8788 size_t buflen = SDC_BUFLEN(un); in sd_cache_control()
8789 int hdrlen = SDC_HDRLEN(un); in sd_cache_control()
8840 if (un->un_f_cfg_is_atapi == TRUE) { in sd_cache_control()
8853 rval = sd_send_scsi_MODE_SELECT(ssc, SDC_CDB_GROUP(un), in sd_cache_control()
8904 struct sd_lun *un = ssc->ssc_un; in sd_get_write_cache_enabled() local
8907 size_t buflen = SDC_BUFLEN(un); in sd_get_write_cache_enabled()
8908 int hdrlen = SDC_HDRLEN(un); in sd_get_write_cache_enabled()
8973 struct sd_lun *un = ssc->ssc_un; in sd_get_write_cache_changeable() local
8976 size_t buflen = SDC_BUFLEN(un); in sd_get_write_cache_changeable()
8977 int hdrlen = SDC_HDRLEN(un); in sd_get_write_cache_changeable()
9045 struct sd_lun *un; in sd_get_nv_sup() local
9048 un = ssc->ssc_un; in sd_get_nv_sup()
9049 ASSERT(un != NULL); in sd_get_nv_sup()
9051 mutex_enter(SD_MUTEX(un)); in sd_get_nv_sup()
9058 un->un_f_sync_nv_supported = FALSE; in sd_get_nv_sup()
9065 if (un->un_f_suppress_cache_flush == TRUE) { in sd_get_nv_sup()
9066 mutex_exit(SD_MUTEX(un)); in sd_get_nv_sup()
9071 un->un_vpd_page_mask & SD_VPD_EXTENDED_DATA_PG) { in sd_get_nv_sup()
9072 mutex_exit(SD_MUTEX(un)); in sd_get_nv_sup()
9080 SD_TRACE(SD_LOG_COMMON, un, in sd_get_nv_sup()
9086 mutex_enter(SD_MUTEX(un)); in sd_get_nv_sup()
9093 un->un_f_sync_nv_supported = TRUE; in sd_get_nv_sup()
9095 mutex_exit(SD_MUTEX(un)); in sd_get_nv_sup()
9102 mutex_exit(SD_MUTEX(un)); in sd_get_nv_sup()
9110 mutex_enter(SD_MUTEX(un)); in sd_get_nv_sup()
9111 if (un->un_f_sync_nv_supported) { in sd_get_nv_sup()
9112 mutex_exit(SD_MUTEX(un)); in sd_get_nv_sup()
9115 (void) sd_send_scsi_SYNCHRONIZE_CACHE(un, dkc); in sd_get_nv_sup()
9127 mutex_exit(SD_MUTEX(un)); in sd_get_nv_sup()
9130 SD_TRACE(SD_LOG_COMMON, un, "sd_get_nv_sup: \ in sd_get_nv_sup()
9132 un->un_f_suppress_cache_flush); in sd_get_nv_sup()
9178 sd_pm_entry(struct sd_lun *un) in sd_pm_entry() argument
9182 ASSERT(!mutex_owned(SD_MUTEX(un))); in sd_pm_entry()
9183 ASSERT(!mutex_owned(&un->un_pm_mutex)); in sd_pm_entry()
9185 SD_TRACE(SD_LOG_IO_PM, un, "sd_pm_entry: entry\n"); in sd_pm_entry()
9187 if (un->un_f_pm_is_enabled == FALSE) { in sd_pm_entry()
9188 SD_TRACE(SD_LOG_IO_PM, un, in sd_pm_entry()
9209 mutex_enter(&un->un_pm_mutex); in sd_pm_entry()
9210 while (un->un_pm_busy == TRUE) { in sd_pm_entry()
9211 cv_wait(&un->un_pm_busy_cv, &un->un_pm_mutex); in sd_pm_entry()
9213 un->un_pm_busy = TRUE; in sd_pm_entry()
9215 if (un->un_pm_count < 1) { in sd_pm_entry()
9217 SD_TRACE(SD_LOG_IO_PM, un, "sd_pm_entry: busy component\n"); in sd_pm_entry()
9225 mutex_exit(&un->un_pm_mutex); in sd_pm_entry()
9226 return_status = pm_busy_component(SD_DEVINFO(un), 0); in sd_pm_entry()
9229 mutex_enter(&un->un_pm_mutex); in sd_pm_entry()
9231 if (un->un_pm_count < 0) { in sd_pm_entry()
9232 mutex_exit(&un->un_pm_mutex); in sd_pm_entry()
9234 SD_TRACE(SD_LOG_IO_PM, un, in sd_pm_entry()
9243 return_status = pm_raise_power(SD_DEVINFO(un), 0, in sd_pm_entry()
9244 SD_PM_STATE_ACTIVE(un)); in sd_pm_entry()
9246 mutex_enter(&un->un_pm_mutex); in sd_pm_entry()
9255 SD_TRACE(SD_LOG_IO_PM, un, in sd_pm_entry()
9259 (void) pm_idle_component(SD_DEVINFO(un), 0); in sd_pm_entry()
9260 un->un_pm_count--; in sd_pm_entry()
9267 ASSERT(un->un_pm_count == 0); in sd_pm_entry()
9280 mutex_exit(&un->un_pm_mutex); in sd_pm_entry()
9281 mutex_enter(SD_MUTEX(un)); in sd_pm_entry()
9282 SD_TRACE(SD_LOG_IO_PM, un, in sd_pm_entry()
9284 un->un_uscsi_chain_type); in sd_pm_entry()
9286 if (un->un_f_non_devbsize_supported) { in sd_pm_entry()
9287 un->un_buf_chain_type = in sd_pm_entry()
9290 un->un_buf_chain_type = in sd_pm_entry()
9293 un->un_uscsi_chain_type = SD_CHAIN_INFO_USCSI_CMD_NO_PM; in sd_pm_entry()
9295 SD_TRACE(SD_LOG_IO_PM, un, in sd_pm_entry()
9297 un->un_uscsi_chain_type); in sd_pm_entry()
9298 mutex_exit(SD_MUTEX(un)); in sd_pm_entry()
9299 mutex_enter(&un->un_pm_mutex); in sd_pm_entry()
9301 if (un->un_pm_idle_timeid == NULL) { in sd_pm_entry()
9303 un->un_pm_idle_timeid = in sd_pm_entry()
9304 timeout(sd_pm_idletimeout_handler, un, in sd_pm_entry()
9312 (void) pm_busy_component(SD_DEVINFO(un), 0); in sd_pm_entry()
9316 un->un_pm_busy = FALSE; in sd_pm_entry()
9318 cv_signal(&un->un_pm_busy_cv); in sd_pm_entry()
9320 un->un_pm_count++; in sd_pm_entry()
9322 SD_TRACE(SD_LOG_IO_PM, un, in sd_pm_entry()
9323 "sd_pm_entry: exiting, un_pm_count = %d\n", un->un_pm_count); in sd_pm_entry()
9325 mutex_exit(&un->un_pm_mutex); in sd_pm_entry()
9342 sd_pm_exit(struct sd_lun *un) in sd_pm_exit() argument
9344 ASSERT(!mutex_owned(SD_MUTEX(un))); in sd_pm_exit()
9345 ASSERT(!mutex_owned(&un->un_pm_mutex)); in sd_pm_exit()
9347 SD_TRACE(SD_LOG_IO_PM, un, "sd_pm_exit: entry\n"); in sd_pm_exit()
9353 if (un->un_f_pm_is_enabled == TRUE) { in sd_pm_exit()
9355 mutex_enter(&un->un_pm_mutex); in sd_pm_exit()
9356 un->un_pm_count--; in sd_pm_exit()
9358 SD_TRACE(SD_LOG_IO_PM, un, in sd_pm_exit()
9359 "sd_pm_exit: un_pm_count = %d\n", un->un_pm_count); in sd_pm_exit()
9361 ASSERT(un->un_pm_count >= 0); in sd_pm_exit()
9362 if (un->un_pm_count == 0) { in sd_pm_exit()
9363 mutex_exit(&un->un_pm_mutex); in sd_pm_exit()
9365 SD_TRACE(SD_LOG_IO_PM, un, in sd_pm_exit()
9368 (void) pm_idle_component(SD_DEVINFO(un), 0); in sd_pm_exit()
9371 mutex_exit(&un->un_pm_mutex); in sd_pm_exit()
9375 SD_TRACE(SD_LOG_IO_PM, un, "sd_pm_exit: exiting\n"); in sd_pm_exit()
9401 struct sd_lun *un; in sdopen() local
9422 if ((un = ddi_get_soft_state(sd_state, instance)) == NULL) { in sdopen()
9441 mutex_enter(SD_MUTEX(un)); in sdopen()
9451 while ((un->un_state == SD_STATE_SUSPENDED) || in sdopen()
9452 (un->un_state == SD_STATE_PM_CHANGING)) { in sdopen()
9453 cv_wait(&un->un_suspend_cv, SD_MUTEX(un)); in sdopen()
9456 mutex_exit(SD_MUTEX(un)); in sdopen()
9457 if (sd_pm_entry(un) != DDI_SUCCESS) { in sdopen()
9459 SD_ERROR(SD_LOG_OPEN_CLOSE, un, in sdopen()
9463 mutex_enter(SD_MUTEX(un)); in sdopen()
9467 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.regopen[otyp]); in sdopen()
9472 if (un->un_exclopen & (partmask)) { in sdopen()
9478 if (un->un_ocmap.lyropen[part]) { in sdopen()
9482 if (un->un_ocmap.regopen[i] & (partmask)) { in sdopen()
9497 if (un->un_f_chk_wp_open) { in sdopen()
9499 mutex_exit(SD_MUTEX(un)); in sdopen()
9507 if (un->un_f_dvdram_writable_device == FALSE) { in sdopen()
9508 if (ISCD(un) || sr_check_wp(dev)) { in sdopen()
9510 mutex_enter(SD_MUTEX(un)); in sdopen()
9511 SD_ERROR(SD_LOG_OPEN_CLOSE, un, "sdopen: " in sdopen()
9516 mutex_enter(SD_MUTEX(un)); in sdopen()
9527 mutex_exit(SD_MUTEX(un)); in sdopen()
9528 ssc = sd_ssc_init(un); in sdopen()
9531 mutex_enter(SD_MUTEX(un)); in sdopen()
9539 if (rval == SD_READY_VALID && (!ISCD(un))) { in sdopen()
9541 mutex_exit(SD_MUTEX(un)); in sdopen()
9542 (void) cmlb_partinfo(un->un_cmlbhandle, part, &nblks, in sdopen()
9544 mutex_enter(SD_MUTEX(un)); in sdopen()
9548 (!ISCD(un) && nblks <= 0)) { in sdopen()
9549 rval = un->un_f_has_removable_media ? ENXIO : EIO; in sdopen()
9550 SD_ERROR(SD_LOG_OPEN_CLOSE, un, "sdopen: " in sdopen()
9562 cp = &un->un_ocmap.chkd[0]; in sdopen()
9563 while (cp < &un->un_ocmap.chkd[OCSIZE]) { in sdopen()
9569 if (cp == &un->un_ocmap.chkd[OCSIZE]) { in sdopen()
9570 mutex_exit(SD_MUTEX(un)); in sdopen()
9571 cmlb_invalidate(un->un_cmlbhandle, in sdopen()
9573 mutex_enter(SD_MUTEX(un)); in sdopen()
9580 un->un_ocmap.lyropen[part]++; in sdopen()
9582 un->un_ocmap.regopen[otyp] |= partmask; in sdopen()
9587 un->un_exclopen |= (partmask); in sdopen()
9599 mutex_exit(SD_MUTEX(un)); in sdopen()
9600 if (cmlb_efi_label_capacity(un->un_cmlbhandle, &label_cap, in sdopen()
9602 mutex_enter(SD_MUTEX(un)); in sdopen()
9603 if (un->un_f_blockcount_is_valid && in sdopen()
9604 un->un_blockcount > label_cap && in sdopen()
9605 un->un_f_expnevent == B_FALSE) { in sdopen()
9606 un->un_f_expnevent = B_TRUE; in sdopen()
9607 mutex_exit(SD_MUTEX(un)); in sdopen()
9608 sd_log_lun_expansion_event(un, in sdopen()
9610 mutex_enter(SD_MUTEX(un)); in sdopen()
9613 mutex_enter(SD_MUTEX(un)); in sdopen()
9617 SD_TRACE(SD_LOG_OPEN_CLOSE, un, "sdopen: " in sdopen()
9620 mutex_exit(SD_MUTEX(un)); in sdopen()
9622 sd_pm_exit(un); in sdopen()
9625 SD_TRACE(SD_LOG_OPEN_CLOSE, un, "sdopen: exit success\n"); in sdopen()
9629 SD_ERROR(SD_LOG_OPEN_CLOSE, un, "sdopen: fail exclusive open\n"); in sdopen()
9633 mutex_exit(SD_MUTEX(un)); in sdopen()
9639 sd_pm_exit(un); in sdopen()
9665 struct sd_lun *un; in sdclose() local
9676 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) { in sdclose()
9683 SD_TRACE(SD_LOG_OPEN_CLOSE, un, in sdclose()
9686 mutex_enter(SD_MUTEX(un)); in sdclose()
9689 while (un->un_state == SD_STATE_PM_CHANGING) { in sdclose()
9690 cv_wait(&un->un_suspend_cv, SD_MUTEX(un)); in sdclose()
9693 if (un->un_exclopen & (1 << part)) { in sdclose()
9694 un->un_exclopen &= ~(1 << part); in sdclose()
9699 un->un_ocmap.lyropen[part] -= 1; in sdclose()
9701 un->un_ocmap.regopen[otyp] &= ~(1 << part); in sdclose()
9704 cp = &un->un_ocmap.chkd[0]; in sdclose()
9705 while (cp < &un->un_ocmap.chkd[OCSIZE]) { in sdclose()
9712 if (cp == &un->un_ocmap.chkd[OCSIZE]) { in sdclose()
9713 SD_TRACE(SD_LOG_OPEN_CLOSE, un, "sdclose: last close\n"); in sdclose()
9719 un->un_throttle = un->un_saved_throttle; in sdclose()
9721 if (un->un_state == SD_STATE_OFFLINE) { in sdclose()
9722 if (un->un_f_is_fibre == FALSE) { in sdclose()
9723 scsi_log(SD_DEVINFO(un), sd_label, in sdclose()
9726 mutex_exit(SD_MUTEX(un)); in sdclose()
9727 cmlb_invalidate(un->un_cmlbhandle, in sdclose()
9729 mutex_enter(SD_MUTEX(un)); in sdclose()
9750 if ((un->un_f_sync_cache_supported && in sdclose()
9751 un->un_f_sync_cache_required) || in sdclose()
9752 un->un_f_dvdram_writable_device == TRUE) { in sdclose()
9753 mutex_exit(SD_MUTEX(un)); in sdclose()
9754 if (sd_pm_entry(un) == DDI_SUCCESS) { in sdclose()
9756 sd_send_scsi_SYNCHRONIZE_CACHE(un, in sdclose()
9764 sd_pm_exit(un); in sdclose()
9768 mutex_enter(SD_MUTEX(un)); in sdclose()
9777 if (un->un_f_doorlock_supported) { in sdclose()
9778 mutex_exit(SD_MUTEX(un)); in sdclose()
9779 if (sd_pm_entry(un) == DDI_SUCCESS) { in sdclose()
9782 ssc = sd_ssc_init(un); in sdclose()
9790 sd_pm_exit(un); in sdclose()
9791 if (ISCD(un) && (rval != 0) && in sdclose()
9798 mutex_enter(SD_MUTEX(un)); in sdclose()
9806 if (un->un_f_has_removable_media) { in sdclose()
9807 sr_ejected(un); in sdclose()
9818 if ((un->un_wm_cache != NULL) && in sdclose()
9819 (un->un_ncmds_in_driver == 0)) { in sdclose()
9820 kmem_cache_destroy(un->un_wm_cache); in sdclose()
9821 un->un_wm_cache = NULL; in sdclose()
9826 mutex_exit(SD_MUTEX(un)); in sdclose()
9856 struct sd_lun *un; in sd_ready_and_valid() local
9860 un = ssc->ssc_un; in sd_ready_and_valid()
9861 ASSERT(un != NULL); in sd_ready_and_valid()
9862 ASSERT(!mutex_owned(SD_MUTEX(un))); in sd_ready_and_valid()
9864 mutex_enter(SD_MUTEX(un)); in sd_ready_and_valid()
9869 if (un->un_f_has_removable_media) { in sd_ready_and_valid()
9870 mutex_exit(SD_MUTEX(un)); in sd_ready_and_valid()
9875 mutex_enter(SD_MUTEX(un)); in sd_ready_and_valid()
9883 is_valid = SD_IS_VALID_LABEL(un); in sd_ready_and_valid()
9884 mutex_enter(SD_MUTEX(un)); in sd_ready_and_valid()
9886 (un->un_f_blockcount_is_valid == FALSE) || in sd_ready_and_valid()
9887 (un->un_f_tgt_blocksize_is_valid == FALSE)) { in sd_ready_and_valid()
9890 mutex_exit(SD_MUTEX(un)); in sd_ready_and_valid()
9897 cmlb_invalidate(un->un_cmlbhandle, in sd_ready_and_valid()
9899 mutex_enter(SD_MUTEX(un)); in sd_ready_and_valid()
9904 mutex_enter(SD_MUTEX(un)); in sd_ready_and_valid()
9905 sd_update_block_info(un, lbasize, capacity); in sd_ready_and_valid()
9912 if (!is_valid && ISCD(un)) { in sd_ready_and_valid()
9921 mutex_exit(SD_MUTEX(un)); in sd_ready_and_valid()
9928 mutex_enter(SD_MUTEX(un)); in sd_ready_and_valid()
9938 if (((un->un_f_rmw_type != SD_RMW_TYPE_RETURN_ERROR || in sd_ready_and_valid()
9939 un->un_f_non_devbsize_supported) && in sd_ready_and_valid()
9940 un->un_tgt_blocksize != DEV_BSIZE) || in sd_ready_and_valid()
9941 un->un_f_enable_rmw) { in sd_ready_and_valid()
9942 if (!(un->un_wm_cache)) { in sd_ready_and_valid()
9945 ddi_driver_name(SD_DEVINFO(un)), in sd_ready_and_valid()
9946 ddi_get_instance(SD_DEVINFO(un))); in sd_ready_and_valid()
9947 un->un_wm_cache = kmem_cache_create( in sd_ready_and_valid()
9951 (void *)un, NULL, 0); in sd_ready_and_valid()
9952 if (!(un->un_wm_cache)) { in sd_ready_and_valid()
9959 if (un->un_state == SD_STATE_NORMAL) { in sd_ready_and_valid()
9973 mutex_exit(SD_MUTEX(un)); in sd_ready_and_valid()
9975 mutex_enter(SD_MUTEX(un)); in sd_ready_and_valid()
9978 mutex_exit(SD_MUTEX(un)); in sd_ready_and_valid()
9979 cmlb_invalidate(un->un_cmlbhandle, in sd_ready_and_valid()
9981 mutex_enter(SD_MUTEX(un)); in sd_ready_and_valid()
9983 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, in sd_ready_and_valid()
9988 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, in sd_ready_and_valid()
9997 if (un->un_f_format_in_progress == FALSE) { in sd_ready_and_valid()
9998 mutex_exit(SD_MUTEX(un)); in sd_ready_and_valid()
10000 (void) cmlb_validate(un->un_cmlbhandle, 0, in sd_ready_and_valid()
10002 if (cmlb_partinfo(un->un_cmlbhandle, part, NULL, NULL, NULL, in sd_ready_and_valid()
10005 mutex_enter(SD_MUTEX(un)); in sd_ready_and_valid()
10009 if (un->un_f_pkstats_enabled) { in sd_ready_and_valid()
10010 sd_set_pstats(un); in sd_ready_and_valid()
10011 SD_TRACE(SD_LOG_IO_PARTITION, un, in sd_ready_and_valid()
10013 "set\n", un); in sd_ready_and_valid()
10015 mutex_enter(SD_MUTEX(un)); in sd_ready_and_valid()
10023 if (un->un_f_doorlock_supported) { in sd_ready_and_valid()
10024 mutex_exit(SD_MUTEX(un)); in sd_ready_and_valid()
10028 if ((status != 0) && ISCD(un)) { in sd_ready_and_valid()
10030 mutex_enter(SD_MUTEX(un)); in sd_ready_and_valid()
10037 mutex_enter(SD_MUTEX(un)); in sd_ready_and_valid()
10041 un->un_mediastate = DKIO_INSERTED; in sd_ready_and_valid()
10042 cv_broadcast(&un->un_state_cv); in sd_ready_and_valid()
10052 if (un->un_errstats != NULL) { in sd_ready_and_valid()
10053 stp = (struct sd_errstats *)un->un_errstats->ks_data; in sd_ready_and_valid()
10055 (un->un_f_blockcount_is_valid == TRUE)) { in sd_ready_and_valid()
10057 (uint64_t)((uint64_t)un->un_blockcount * in sd_ready_and_valid()
10058 un->un_sys_blocksize); in sd_ready_and_valid()
10062 mutex_exit(SD_MUTEX(un)); in sd_ready_and_valid()
10081 struct sd_lun *un; in sdmin() local
10086 un = ddi_get_soft_state(sd_state, instance); in sdmin()
10087 ASSERT(un != NULL); in sdmin()
10093 if (un->un_buf_breakup_supported) { in sdmin()
10097 if (bp->b_bcount > un->un_max_xfer_size) { in sdmin()
10098 bp->b_bcount = un->un_max_xfer_size; in sdmin()
10124 struct sd_lun *un = NULL; in sdread() local
10129 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) { in sdread()
10133 ASSERT(!mutex_owned(SD_MUTEX(un))); in sdread()
10136 if (!SD_IS_VALID_LABEL(un) && !ISCD(un)) { in sdread()
10137 mutex_enter(SD_MUTEX(un)); in sdread()
10143 while ((un->un_state == SD_STATE_SUSPENDED) || in sdread()
10144 (un->un_state == SD_STATE_PM_CHANGING)) { in sdread()
10145 cv_wait(&un->un_suspend_cv, SD_MUTEX(un)); in sdread()
10147 un->un_ncmds_in_driver++; in sdread()
10148 mutex_exit(SD_MUTEX(un)); in sdread()
10151 ssc = sd_ssc_init(un); in sdread()
10159 mutex_enter(SD_MUTEX(un)); in sdread()
10160 un->un_ncmds_in_driver--; in sdread()
10161 ASSERT(un->un_ncmds_in_driver >= 0); in sdread()
10162 mutex_exit(SD_MUTEX(un)); in sdread()
10170 if (un->un_f_rmw_type == SD_RMW_TYPE_RETURN_ERROR && in sdread()
10171 !un->un_f_enable_rmw) in sdread()
10172 secmask = un->un_tgt_blocksize - 1; in sdread()
10177 SD_ERROR(SD_LOG_READ_WRITE, un, in sdread()
10182 SD_ERROR(SD_LOG_READ_WRITE, un, in sdread()
10215 struct sd_lun *un = NULL; in sdwrite() local
10220 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) { in sdwrite()
10224 ASSERT(!mutex_owned(SD_MUTEX(un))); in sdwrite()
10226 if (!SD_IS_VALID_LABEL(un) && !ISCD(un)) { in sdwrite()
10227 mutex_enter(SD_MUTEX(un)); in sdwrite()
10233 while ((un->un_state == SD_STATE_SUSPENDED) || in sdwrite()
10234 (un->un_state == SD_STATE_PM_CHANGING)) { in sdwrite()
10235 cv_wait(&un->un_suspend_cv, SD_MUTEX(un)); in sdwrite()
10237 un->un_ncmds_in_driver++; in sdwrite()
10238 mutex_exit(SD_MUTEX(un)); in sdwrite()
10241 ssc = sd_ssc_init(un); in sdwrite()
10249 mutex_enter(SD_MUTEX(un)); in sdwrite()
10250 un->un_ncmds_in_driver--; in sdwrite()
10251 ASSERT(un->un_ncmds_in_driver >= 0); in sdwrite()
10252 mutex_exit(SD_MUTEX(un)); in sdwrite()
10260 if (un->un_f_rmw_type == SD_RMW_TYPE_RETURN_ERROR && in sdwrite()
10261 !un->un_f_enable_rmw) in sdwrite()
10262 secmask = un->un_tgt_blocksize - 1; in sdwrite()
10267 SD_ERROR(SD_LOG_READ_WRITE, un, in sdwrite()
10272 SD_ERROR(SD_LOG_READ_WRITE, un, in sdwrite()
10304 struct sd_lun *un = NULL; in sdaread() local
10310 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) { in sdaread()
10314 ASSERT(!mutex_owned(SD_MUTEX(un))); in sdaread()
10316 if (!SD_IS_VALID_LABEL(un) && !ISCD(un)) { in sdaread()
10317 mutex_enter(SD_MUTEX(un)); in sdaread()
10323 while ((un->un_state == SD_STATE_SUSPENDED) || in sdaread()
10324 (un->un_state == SD_STATE_PM_CHANGING)) { in sdaread()
10325 cv_wait(&un->un_suspend_cv, SD_MUTEX(un)); in sdaread()
10327 un->un_ncmds_in_driver++; in sdaread()
10328 mutex_exit(SD_MUTEX(un)); in sdaread()
10331 ssc = sd_ssc_init(un); in sdaread()
10339 mutex_enter(SD_MUTEX(un)); in sdaread()
10340 un->un_ncmds_in_driver--; in sdaread()
10341 ASSERT(un->un_ncmds_in_driver >= 0); in sdaread()
10342 mutex_exit(SD_MUTEX(un)); in sdaread()
10350 if (un->un_f_rmw_type == SD_RMW_TYPE_RETURN_ERROR && in sdaread()
10351 !un->un_f_enable_rmw) in sdaread()
10352 secmask = un->un_tgt_blocksize - 1; in sdaread()
10357 SD_ERROR(SD_LOG_READ_WRITE, un, in sdaread()
10362 SD_ERROR(SD_LOG_READ_WRITE, un, in sdaread()
10394 struct sd_lun *un = NULL; in sdawrite() local
10400 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) { in sdawrite()
10404 ASSERT(!mutex_owned(SD_MUTEX(un))); in sdawrite()
10406 if (!SD_IS_VALID_LABEL(un) && !ISCD(un)) { in sdawrite()
10407 mutex_enter(SD_MUTEX(un)); in sdawrite()
10413 while ((un->un_state == SD_STATE_SUSPENDED) || in sdawrite()
10414 (un->un_state == SD_STATE_PM_CHANGING)) { in sdawrite()
10415 cv_wait(&un->un_suspend_cv, SD_MUTEX(un)); in sdawrite()
10417 un->un_ncmds_in_driver++; in sdawrite()
10418 mutex_exit(SD_MUTEX(un)); in sdawrite()
10421 ssc = sd_ssc_init(un); in sdawrite()
10429 mutex_enter(SD_MUTEX(un)); in sdawrite()
10430 un->un_ncmds_in_driver--; in sdawrite()
10431 ASSERT(un->un_ncmds_in_driver >= 0); in sdawrite()
10432 mutex_exit(SD_MUTEX(un)); in sdawrite()
10440 if (un->un_f_rmw_type == SD_RMW_TYPE_RETURN_ERROR && in sdawrite()
10441 !un->un_f_enable_rmw) in sdawrite()
10442 secmask = un->un_tgt_blocksize - 1; in sdawrite()
10447 SD_ERROR(SD_LOG_READ_WRITE, un, in sdawrite()
10452 SD_ERROR(SD_LOG_READ_WRITE, un, in sdawrite()
10671 struct sd_lun *un; in sdstrategy() local
10673 un = ddi_get_soft_state(sd_state, SD_GET_INSTANCE_FROM_BUF(bp)); in sdstrategy()
10674 if (un == NULL) { in sdstrategy()
10682 if (un->un_state == SD_STATE_DUMPING) { in sdstrategy()
10689 ASSERT(!mutex_owned(SD_MUTEX(un))); in sdstrategy()
10697 mutex_enter(SD_MUTEX(un)); in sdstrategy()
10702 while ((un->un_state == SD_STATE_SUSPENDED) || in sdstrategy()
10703 (un->un_state == SD_STATE_PM_CHANGING)) { in sdstrategy()
10704 cv_wait(&un->un_suspend_cv, SD_MUTEX(un)); in sdstrategy()
10707 un->un_ncmds_in_driver++; in sdstrategy()
10714 if (un->un_f_cfg_is_atapi == TRUE) { in sdstrategy()
10715 mutex_exit(SD_MUTEX(un)); in sdstrategy()
10717 mutex_enter(SD_MUTEX(un)); in sdstrategy()
10719 SD_INFO(SD_LOG_IO, un, "sdstrategy: un_ncmds_in_driver = %ld\n", in sdstrategy()
10720 un->un_ncmds_in_driver); in sdstrategy()
10723 un->un_f_sync_cache_required = TRUE; in sdstrategy()
10725 mutex_exit(SD_MUTEX(un)); in sdstrategy()
10733 return (ddi_xbuf_qstrategy(bp, un->un_xbuf_attr)); in sdstrategy()
10749 struct sd_lun *un = arg; in sd_xbuf_strategy() local
10753 ASSERT(un != NULL); in sd_xbuf_strategy()
10754 ASSERT(!mutex_owned(SD_MUTEX(un))); in sd_xbuf_strategy()
10760 sd_xbuf_init(un, bp, xp, SD_CHAIN_BUFIO, NULL); in sd_xbuf_strategy()
10763 SD_BEGIN_IOSTART(((struct sd_xbuf *)xp)->xb_chain_iostart, un, bp); in sd_xbuf_strategy()
10788 sd_xbuf_init(struct sd_lun *un, struct buf *bp, struct sd_xbuf *xp, in sd_xbuf_init() argument
10793 ASSERT(un != NULL); in sd_xbuf_init()
10797 SD_INFO(SD_LOG_IO, un, "sd_xbuf_init: buf:0x%p chain type:0x%x\n", in sd_xbuf_init()
10800 xp->xb_un = un; in sd_xbuf_init()
10818 index = un->un_buf_chain_type; in sd_xbuf_init()
10819 if ((!un->un_f_has_removable_media) && in sd_xbuf_init()
10820 (un->un_tgt_blocksize != 0) && in sd_xbuf_init()
10821 (un->un_tgt_blocksize != DEV_BSIZE || in sd_xbuf_init()
10822 un->un_f_enable_rmw)) { in sd_xbuf_init()
10824 if (un->un_f_enable_rmw) { in sd_xbuf_init()
10826 (un->un_phy_blocksize / DEV_BSIZE) - 1; in sd_xbuf_init()
10827 secmask = un->un_phy_blocksize - 1; in sd_xbuf_init()
10830 (un->un_tgt_blocksize / DEV_BSIZE) - 1; in sd_xbuf_init()
10831 secmask = un->un_tgt_blocksize - 1; in sd_xbuf_init()
10836 if ((un->un_f_rmw_type != in sd_xbuf_init()
10838 un->un_f_enable_rmw) { in sd_xbuf_init()
10839 if (un->un_f_pm_is_enabled == FALSE) in sd_xbuf_init()
10850 index = un->un_uscsi_chain_type; in sd_xbuf_init()
10853 index = un->un_direct_chain_type; in sd_xbuf_init()
10856 index = un->un_priority_chain_type; in sd_xbuf_init()
10891 SD_INFO(SD_LOG_IO, un, "sd_xbuf_init: done.\n"); in sd_xbuf_init()
10910 struct sd_lun *un; in sd_uscsi_strategy() local
10918 un = ddi_get_soft_state(sd_state, SD_GET_INSTANCE_FROM_BUF(bp)); in sd_uscsi_strategy()
10919 if (un == NULL) { in sd_uscsi_strategy()
10926 ASSERT(!mutex_owned(SD_MUTEX(un))); in sd_uscsi_strategy()
10928 SD_TRACE(SD_LOG_IO, un, "sd_uscsi_strategy: entry: buf:0x%p\n", bp); in sd_uscsi_strategy()
10937 mutex_enter(SD_MUTEX(un)); in sd_uscsi_strategy()
10943 if (un->un_f_cfg_is_atapi == TRUE) { in sd_uscsi_strategy()
10944 mutex_exit(SD_MUTEX(un)); in sd_uscsi_strategy()
10946 mutex_enter(SD_MUTEX(un)); in sd_uscsi_strategy()
10948 un->un_ncmds_in_driver++; in sd_uscsi_strategy()
10949 SD_INFO(SD_LOG_IO, un, "sd_uscsi_strategy: un_ncmds_in_driver = %ld\n", in sd_uscsi_strategy()
10950 un->un_ncmds_in_driver); in sd_uscsi_strategy()
10954 un->un_f_sync_cache_required = TRUE; in sd_uscsi_strategy()
10956 mutex_exit(SD_MUTEX(un)); in sd_uscsi_strategy()
10983 sd_xbuf_init(un, bp, xp, chain_type, uip->ui_cmdp); in sd_uscsi_strategy()
10986 SD_BEGIN_IOSTART(xp->xb_chain_iostart, un, bp); in sd_uscsi_strategy()
10988 SD_TRACE(SD_LOG_IO, un, "sd_uscsi_strategy: exit: buf:0x%p\n", bp); in sd_uscsi_strategy()
11025 struct sd_lun *un; in sd_send_scsi_cmd() local
11029 un = ddi_get_soft_state(sd_state, SDUNIT(dev)); in sd_send_scsi_cmd()
11030 if (un == NULL) { in sd_send_scsi_cmd()
11037 ssc = sd_ssc_init(un); in sd_send_scsi_cmd()
11109 sd_ssc_init(struct sd_lun *un) in sd_ssc_init() argument
11115 ASSERT(un != NULL); in sd_ssc_init()
11116 ASSERT(!mutex_owned(SD_MUTEX(un))); in sd_ssc_init()
11135 ssc->ssc_un = un; in sd_ssc_init()
11197 struct sd_lun *un; in sd_ssc_send() local
11204 un = ssc->ssc_un; in sd_ssc_send()
11205 ASSERT(un != NULL); in sd_ssc_send()
11208 ASSERT(!mutex_owned(SD_MUTEX(un))); in sd_ssc_send()
11218 SD_INFO(SD_LOG_SDTEST, un, in sd_ssc_send()
11240 mutex_enter(SD_MUTEX(un)); in sd_ssc_send()
11241 mutex_enter(&un->un_pm_mutex); in sd_ssc_send()
11243 SD_DEVICE_IS_IN_LOW_POWER(un)) { in sd_ssc_send()
11244 SD_TRACE(SD_LOG_IO, un, "sd_ssc_send:" in sd_ssc_send()
11245 "un:0x%p is in low power\n", un); in sd_ssc_send()
11246 mutex_exit(&un->un_pm_mutex); in sd_ssc_send()
11247 mutex_exit(SD_MUTEX(un)); in sd_ssc_send()
11250 mutex_exit(&un->un_pm_mutex); in sd_ssc_send()
11251 mutex_exit(SD_MUTEX(un)); in sd_ssc_send()
11256 SD_TRACE(SD_LOG_IO, un, in sd_ssc_send()
11257 "sd_ssc_send: entry: un:0x%p UIO_USERSPACE\n", un); in sd_ssc_send()
11260 SD_TRACE(SD_LOG_IO, un, in sd_ssc_send()
11261 "sd_ssc_send: entry: un:0x%p UIO_SYSSPACE\n", un); in sd_ssc_send()
11264 SD_TRACE(SD_LOG_IO, un, in sd_ssc_send()
11265 "sd_ssc_send: entry: un:0x%p UNEXPECTED SPACE\n", un); in sd_ssc_send()
11271 SD_ADDRESS(un), &uscmd); in sd_ssc_send()
11273 SD_TRACE(SD_LOG_IO, un, "sd_sense_scsi_cmd: " in sd_ssc_send()
11274 "scsi_uscsi_alloc_and_copyin failed\n", un); in sd_ssc_send()
11280 mutex_enter(SD_MUTEX(un)); in sd_ssc_send()
11281 un->un_f_format_in_progress = TRUE; in sd_ssc_send()
11282 mutex_exit(SD_MUTEX(un)); in sd_ssc_send()
11307 dev = SD_GET_DEV(un); in sd_ssc_send()
11318 SD_INFO(SD_LOG_IO, un, "sd_ssc_send: " in sd_ssc_send()
11322 SD_INFO(SD_LOG_IO, un, "sd_ssc_send: " in sd_ssc_send()
11326 SD_DUMP_MEMORY(un, SD_LOG_IO, in sd_ssc_send()
11334 mutex_enter(SD_MUTEX(un)); in sd_ssc_send()
11335 un->un_f_format_in_progress = FALSE; in sd_ssc_send()
11336 mutex_exit(SD_MUTEX(un)); in sd_ssc_send()
11425 struct sd_lun *un; in sd_ssc_assessment() local
11428 un = ssc->ssc_un; in sd_ssc_assessment()
11429 ASSERT(un != NULL); in sd_ssc_assessment()
11443 SD_INFO(SD_LOG_SDTEST, un, in sd_ssc_assessment()
11506 (un->un_f_arq_enabled == TRUE) && in sd_ssc_assessment()
11516 scsi_log(SD_DEVINFO(un), sd_label, CE_CONT, in sd_ssc_assessment()
11539 struct sd_lun *un; in sd_ssc_post() local
11543 un = ssc->ssc_un; in sd_ssc_post()
11544 ASSERT(un != NULL); in sd_ssc_post()
11554 if (ISCD(un) || un->un_f_has_removable_media) { in sd_ssc_post()
11650 sd_buf_iodone(int index, struct sd_lun *un, struct buf *bp) in sd_buf_iodone() argument
11654 ASSERT(un != NULL); in sd_buf_iodone()
11656 ASSERT(!mutex_owned(SD_MUTEX(un))); in sd_buf_iodone()
11658 SD_TRACE(SD_LOG_IO_CORE, un, "sd_buf_iodone: entry.\n"); in sd_buf_iodone()
11664 if (ddi_xbuf_done(bp, un->un_xbuf_attr)) { in sd_buf_iodone()
11665 mutex_enter(SD_MUTEX(un)); in sd_buf_iodone()
11674 un->un_pm_idle_time = gethrtime(); in sd_buf_iodone()
11676 un->un_ncmds_in_driver--; in sd_buf_iodone()
11677 ASSERT(un->un_ncmds_in_driver >= 0); in sd_buf_iodone()
11678 SD_INFO(SD_LOG_IO, un, in sd_buf_iodone()
11680 un->un_ncmds_in_driver); in sd_buf_iodone()
11682 mutex_exit(SD_MUTEX(un)); in sd_buf_iodone()
11687 SD_TRACE(SD_LOG_IO_CORE, un, "sd_buf_iodone: exit.\n"); in sd_buf_iodone()
11700 sd_uscsi_iodone(int index, struct sd_lun *un, struct buf *bp) in sd_uscsi_iodone() argument
11704 ASSERT(un != NULL); in sd_uscsi_iodone()
11709 ASSERT(!mutex_owned(SD_MUTEX(un))); in sd_uscsi_iodone()
11711 SD_INFO(SD_LOG_IO, un, "sd_uscsi_iodone: entry.\n"); in sd_uscsi_iodone()
11715 mutex_enter(SD_MUTEX(un)); in sd_uscsi_iodone()
11724 un->un_pm_idle_time = gethrtime(); in sd_uscsi_iodone()
11726 un->un_ncmds_in_driver--; in sd_uscsi_iodone()
11727 ASSERT(un->un_ncmds_in_driver >= 0); in sd_uscsi_iodone()
11728 SD_INFO(SD_LOG_IO, un, "sd_uscsi_iodone: un_ncmds_in_driver = %ld\n", in sd_uscsi_iodone()
11729 un->un_ncmds_in_driver); in sd_uscsi_iodone()
11731 mutex_exit(SD_MUTEX(un)); in sd_uscsi_iodone()
11743 SD_INFO(SD_LOG_IO, un, "sd_uscsi_iodone: exit.\n"); in sd_uscsi_iodone()
11781 sd_mapblockaddr_iostart(int index, struct sd_lun *un, struct buf *bp) in sd_mapblockaddr_iostart() argument
11793 ASSERT(un != NULL); in sd_mapblockaddr_iostart()
11795 ASSERT(!mutex_owned(SD_MUTEX(un))); in sd_mapblockaddr_iostart()
11797 SD_TRACE(SD_LOG_IO_PARTITION, un, in sd_mapblockaddr_iostart()
11811 if (!SD_IS_VALID_LABEL(un)) { in sd_mapblockaddr_iostart()
11818 ssc = sd_ssc_init(un); in sd_mapblockaddr_iostart()
11830 if (!un->un_f_has_removable_media) { in sd_mapblockaddr_iostart()
11831 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, in sd_mapblockaddr_iostart()
11836 SD_BEGIN_IODONE(index, un, bp); in sd_mapblockaddr_iostart()
11845 (void) cmlb_partinfo(un->un_cmlbhandle, partition, in sd_mapblockaddr_iostart()
11848 if (un->un_f_enable_rmw) { in sd_mapblockaddr_iostart()
11849 blknomask = (un->un_phy_blocksize / DEV_BSIZE) - 1; in sd_mapblockaddr_iostart()
11850 secmask = un->un_phy_blocksize - 1; in sd_mapblockaddr_iostart()
11852 blknomask = (un->un_tgt_blocksize / DEV_BSIZE) - 1; in sd_mapblockaddr_iostart()
11853 secmask = un->un_tgt_blocksize - 1; in sd_mapblockaddr_iostart()
11860 if (!(NOT_DEVBSIZE(un)) || un->un_f_enable_rmw) { in sd_mapblockaddr_iostart()
11867 xp->xb_blkno = SD_SYS2TGTBLOCK(un, xp->xb_blkno); in sd_mapblockaddr_iostart()
11875 } else if (!un->un_f_enable_rmw && in sd_mapblockaddr_iostart()
11876 un->un_f_rmw_type == SD_RMW_TYPE_RETURN_ERROR) { in sd_mapblockaddr_iostart()
11879 } else if (un->un_f_rmw_type == SD_RMW_TYPE_DEFAULT) { in sd_mapblockaddr_iostart()
11880 mutex_enter(SD_MUTEX(un)); in sd_mapblockaddr_iostart()
11881 if (!un->un_f_enable_rmw && in sd_mapblockaddr_iostart()
11882 un->un_rmw_msg_timeid == NULL) { in sd_mapblockaddr_iostart()
11883 scsi_log(SD_DEVINFO(un), sd_label, in sd_mapblockaddr_iostart()
11889 un->un_tgt_blocksize); in sd_mapblockaddr_iostart()
11890 un->un_rmw_msg_timeid = in sd_mapblockaddr_iostart()
11892 un, SD_RMW_MSG_PRINT_TIMEOUT); in sd_mapblockaddr_iostart()
11894 un->un_rmw_incre_count ++; in sd_mapblockaddr_iostart()
11896 mutex_exit(SD_MUTEX(un)); in sd_mapblockaddr_iostart()
11899 nblocks = SD_TGT2SYSBLOCK(un, nblocks); in sd_mapblockaddr_iostart()
11900 partition_offset = SD_TGT2SYSBLOCK(un, in sd_mapblockaddr_iostart()
11934 if ((!NOT_DEVBSIZE(un)) && is_aligned) { in sd_mapblockaddr_iostart()
11935 requested_nblocks = SD_BYTES2TGTBLOCKS(un, bp->b_bcount); in sd_mapblockaddr_iostart()
11954 if ((!NOT_DEVBSIZE(un)) && is_aligned) { in sd_mapblockaddr_iostart()
11955 resid = SD_TGTBLOCKS2BYTES(un, in sd_mapblockaddr_iostart()
11982 SD_NEXT_IOSTART(index, un, bp); in sd_mapblockaddr_iostart()
11984 SD_TRACE(SD_LOG_IO_PARTITION, un, in sd_mapblockaddr_iostart()
11991 SD_BEGIN_IODONE(index, un, bp); in sd_mapblockaddr_iostart()
11992 SD_TRACE(SD_LOG_IO_PARTITION, un, in sd_mapblockaddr_iostart()
12006 sd_mapblockaddr_iodone(int index, struct sd_lun *un, struct buf *bp) in sd_mapblockaddr_iodone() argument
12009 ASSERT(un != NULL); in sd_mapblockaddr_iodone()
12011 ASSERT(!mutex_owned(SD_MUTEX(un))); in sd_mapblockaddr_iodone()
12013 SD_TRACE(SD_LOG_IO_PARTITION, un, in sd_mapblockaddr_iodone()
12058 SD_NEXT_IODONE(index, un, bp); in sd_mapblockaddr_iodone()
12060 SD_TRACE(SD_LOG_IO_PARTITION, un, in sd_mapblockaddr_iodone()
12087 sd_mapblocksize_iostart(int index, struct sd_lun *un, struct buf *bp) in sd_mapblocksize_iostart() argument
12096 ASSERT(un != NULL); in sd_mapblocksize_iostart()
12098 ASSERT(!mutex_owned(SD_MUTEX(un))); in sd_mapblocksize_iostart()
12101 SD_TRACE(SD_LOG_IO_RMMEDIA, un, in sd_mapblocksize_iostart()
12107 if (ISCD(un) && ((bp->b_flags & B_READ) == 0) && in sd_mapblocksize_iostart()
12108 (un->un_f_mmc_writable_media == FALSE)) { in sd_mapblocksize_iostart()
12111 SD_BEGIN_IODONE(index, un, bp); in sd_mapblocksize_iostart()
12120 if ((un->un_tgt_blocksize == DEV_BSIZE && !un->un_f_enable_rmw) || in sd_mapblocksize_iostart()
12127 ASSERT(!ISROD(un)); in sd_mapblocksize_iostart()
12133 SD_INFO(SD_LOG_IO_RMMEDIA, un, "sd_mapblocksize_iostart: " in sd_mapblocksize_iostart()
12135 un->un_tgt_blocksize, DEV_BSIZE); in sd_mapblocksize_iostart()
12136 SD_INFO(SD_LOG_IO_RMMEDIA, un, "sd_mapblocksize_iostart: " in sd_mapblocksize_iostart()
12138 SD_INFO(SD_LOG_IO_RMMEDIA, un, "sd_mapblocksize_iostart: " in sd_mapblocksize_iostart()
12179 if (un->un_f_enable_rmw) { in sd_mapblocksize_iostart()
12181 (first_byte / un->un_phy_blocksize) * in sd_mapblocksize_iostart()
12182 (un->un_phy_blocksize / DEV_BSIZE); in sd_mapblocksize_iostart()
12184 un->un_phy_blocksize - 1) / un->un_phy_blocksize) * in sd_mapblocksize_iostart()
12185 (un->un_phy_blocksize / DEV_BSIZE); in sd_mapblocksize_iostart()
12187 start_block = xp->xb_blkno = first_byte / un->un_tgt_blocksize; in sd_mapblocksize_iostart()
12189 un->un_tgt_blocksize - 1) / un->un_tgt_blocksize; in sd_mapblocksize_iostart()
12193 request_bytes = (end_block - start_block) * un->un_tgt_blocksize; in sd_mapblocksize_iostart()
12200 if (un->un_f_enable_rmw) { in sd_mapblocksize_iostart()
12201 if (((first_byte % un->un_phy_blocksize) == 0) && in sd_mapblocksize_iostart()
12202 ((bp->b_bcount % un->un_phy_blocksize) == 0)) { in sd_mapblocksize_iostart()
12206 if (((first_byte % un->un_tgt_blocksize) == 0) && in sd_mapblocksize_iostart()
12207 ((bp->b_bcount % un->un_tgt_blocksize) == 0)) { in sd_mapblocksize_iostart()
12218 bsp->mbs_wmp = sd_range_lock(un, start_block, end_block - 1, in sd_mapblocksize_iostart()
12266 if (un->un_f_enable_rmw) { in sd_mapblocksize_iostart()
12268 ((offset_t)xp->xb_blkno * un->un_sys_blocksize)); in sd_mapblocksize_iostart()
12270 (bsp->mbs_copy_offset < un->un_phy_blocksize)); in sd_mapblocksize_iostart()
12273 ((offset_t)xp->xb_blkno * un->un_tgt_blocksize)); in sd_mapblocksize_iostart()
12275 (bsp->mbs_copy_offset < un->un_tgt_blocksize)); in sd_mapblocksize_iostart()
12294 SD_INFO(SD_LOG_IO_RMMEDIA, un, in sd_mapblocksize_iostart()
12296 SD_INFO(SD_LOG_IO_RMMEDIA, un, in sd_mapblocksize_iostart()
12299 SD_INFO(SD_LOG_IO_RMMEDIA, un, in sd_mapblocksize_iostart()
12303 SD_NEXT_IOSTART(index, un, bp); in sd_mapblocksize_iostart()
12305 SD_TRACE(SD_LOG_IO_RMMEDIA, un, in sd_mapblocksize_iostart()
12319 sd_mapblocksize_iodone(int index, struct sd_lun *un, struct buf *bp) in sd_mapblocksize_iodone() argument
12334 ASSERT(un != NULL); in sd_mapblocksize_iodone()
12337 SD_TRACE(SD_LOG_IO_RMMEDIA, un, in sd_mapblocksize_iodone()
12344 if ((un->un_tgt_blocksize == DEV_BSIZE && !un->un_f_enable_rmw) || in sd_mapblocksize_iodone()
12364 sd_range_unlock(un, bsp->mbs_wmp); in sd_mapblocksize_iodone()
12380 ASSERT(!mutex_owned(SD_MUTEX(un))); in sd_mapblocksize_iodone()
12392 sd_range_unlock(un, bsp->mbs_wmp); in sd_mapblocksize_iodone()
12411 if (un->un_f_enable_rmw) { in sd_mapblocksize_iodone()
12414 shadow_start = SD_TGTBLOCKS2BYTES(un, (offset_t)xp->xb_blkno); in sd_mapblocksize_iodone()
12426 if (un->un_f_enable_rmw) { in sd_mapblocksize_iodone()
12428 (copy_offset < un->un_phy_blocksize)); in sd_mapblocksize_iodone()
12431 (copy_offset < un->un_tgt_blocksize)); in sd_mapblocksize_iodone()
12573 SD_NEXT_IODONE(index, un, bp); in sd_mapblocksize_iodone()
12587 sd_checksum_iostart(int index, struct sd_lun *un, struct buf *bp) in sd_checksum_iostart() argument
12589 ASSERT(un != NULL); in sd_checksum_iostart()
12591 ASSERT(!mutex_owned(SD_MUTEX(un))); in sd_checksum_iostart()
12592 SD_NEXT_IOSTART(index, un, bp); in sd_checksum_iostart()
12606 sd_checksum_iodone(int index, struct sd_lun *un, struct buf *bp) in sd_checksum_iodone() argument
12608 ASSERT(un != NULL); in sd_checksum_iodone()
12610 ASSERT(!mutex_owned(SD_MUTEX(un))); in sd_checksum_iodone()
12611 SD_NEXT_IODONE(index, un, bp); in sd_checksum_iodone()
12625 sd_checksum_uscsi_iostart(int index, struct sd_lun *un, struct buf *bp) in sd_checksum_uscsi_iostart() argument
12627 ASSERT(un != NULL); in sd_checksum_uscsi_iostart()
12629 ASSERT(!mutex_owned(SD_MUTEX(un))); in sd_checksum_uscsi_iostart()
12630 SD_NEXT_IOSTART(index, un, bp); in sd_checksum_uscsi_iostart()
12644 sd_checksum_uscsi_iodone(int index, struct sd_lun *un, struct buf *bp) in sd_checksum_uscsi_iodone() argument
12646 ASSERT(un != NULL); in sd_checksum_uscsi_iodone()
12648 ASSERT(!mutex_owned(SD_MUTEX(un))); in sd_checksum_uscsi_iodone()
12649 SD_NEXT_IODONE(index, un, bp); in sd_checksum_uscsi_iodone()
12662 sd_pm_iostart(int index, struct sd_lun *un, struct buf *bp) in sd_pm_iostart() argument
12664 ASSERT(un != NULL); in sd_pm_iostart()
12666 ASSERT(!mutex_owned(SD_MUTEX(un))); in sd_pm_iostart()
12667 ASSERT(!mutex_owned(&un->un_pm_mutex)); in sd_pm_iostart()
12669 SD_TRACE(SD_LOG_IO_PM, un, "sd_pm_iostart: entry\n"); in sd_pm_iostart()
12671 if (sd_pm_entry(un) != DDI_SUCCESS) { in sd_pm_iostart()
12679 SD_BEGIN_IODONE(index, un, bp); in sd_pm_iostart()
12681 SD_TRACE(SD_LOG_IO_PM, un, "sd_pm_iostart: exit\n"); in sd_pm_iostart()
12685 SD_NEXT_IOSTART(index, un, bp); in sd_pm_iostart()
12687 SD_TRACE(SD_LOG_IO_PM, un, "sd_pm_iostart: exit\n"); in sd_pm_iostart()
12700 sd_pm_iodone(int index, struct sd_lun *un, struct buf *bp) in sd_pm_iodone() argument
12702 ASSERT(un != NULL); in sd_pm_iodone()
12704 ASSERT(!mutex_owned(&un->un_pm_mutex)); in sd_pm_iodone()
12706 SD_TRACE(SD_LOG_IO_PM, un, "sd_pm_iodone: entry\n"); in sd_pm_iodone()
12712 if (un->un_f_pm_is_enabled == TRUE) { in sd_pm_iodone()
12713 sd_pm_exit(un); in sd_pm_iodone()
12716 SD_NEXT_IODONE(index, un, bp); in sd_pm_iodone()
12718 SD_TRACE(SD_LOG_IO_PM, un, "sd_pm_iodone: exit\n"); in sd_pm_iodone()
12737 sd_core_iostart(int index, struct sd_lun *un, struct buf *bp) in sd_core_iostart() argument
12741 ASSERT(un != NULL); in sd_core_iostart()
12743 ASSERT(!mutex_owned(SD_MUTEX(un))); in sd_core_iostart()
12746 SD_TRACE(SD_LOG_IO_CORE, un, "sd_core_iostart: entry: bp:0x%p\n", bp); in sd_core_iostart()
12751 mutex_enter(SD_MUTEX(un)); in sd_core_iostart()
12758 (un->un_failfast_state == SD_FAILFAST_ACTIVE)) { in sd_core_iostart()
12759 mutex_exit(SD_MUTEX(un)); in sd_core_iostart()
12762 SD_BEGIN_IODONE(index, un, bp); in sd_core_iostart()
12774 sd_start_cmds(un, bp); in sd_core_iostart()
12780 sd_add_buf_to_waitq(un, bp); in sd_core_iostart()
12781 SD_UPDATE_KSTATS(un, kstat_waitq_enter, bp); in sd_core_iostart()
12782 sd_start_cmds(un, NULL); in sd_core_iostart()
12785 mutex_exit(SD_MUTEX(un)); in sd_core_iostart()
12787 SD_TRACE(SD_LOG_IO_CORE, un, "sd_core_iostart: exit: bp:0x%p\n", bp); in sd_core_iostart()
12817 sd_init_cdb_limits(struct sd_lun *un) in sd_init_cdb_limits() argument
12826 un->un_mincdb = SD_CDB_GROUP1; in sd_init_cdb_limits()
12827 if (!un->un_f_is_fibre && !un->un_f_cfg_is_atapi && !ISROD(un) && in sd_init_cdb_limits()
12828 !un->un_f_has_removable_media) { in sd_init_cdb_limits()
12829 un->un_mincdb = SD_CDB_GROUP0; in sd_init_cdb_limits()
12835 un->un_max_hba_cdb = scsi_ifgetcap(SD_ADDRESS(un), "max-cdb-length", 1); in sd_init_cdb_limits()
12836 if (0 >= un->un_max_hba_cdb) { in sd_init_cdb_limits()
12837 un->un_max_hba_cdb = CDB_GROUP4; in sd_init_cdb_limits()
12839 } else if (0 < un->un_max_hba_cdb && in sd_init_cdb_limits()
12840 un->un_max_hba_cdb < CDB_GROUP1) { in sd_init_cdb_limits()
12842 } else if (CDB_GROUP1 <= un->un_max_hba_cdb && in sd_init_cdb_limits()
12843 un->un_max_hba_cdb < CDB_GROUP5) { in sd_init_cdb_limits()
12845 } else if (CDB_GROUP5 <= un->un_max_hba_cdb && in sd_init_cdb_limits()
12846 un->un_max_hba_cdb < CDB_GROUP4) { in sd_init_cdb_limits()
12856 un->un_maxcdb = (un->un_f_has_removable_media) ? SD_CDB_GROUP5 : in sd_init_cdb_limits()
12859 un->un_status_len = (int)((un->un_f_arq_enabled == TRUE) in sd_init_cdb_limits()
12861 if (!ISCD(un)) in sd_init_cdb_limits()
12862 un->un_cmd_timeout = (ushort_t)sd_io_time; in sd_init_cdb_limits()
12863 un->un_uscsi_timeout = ((ISCD(un)) ? 2 : 1) * un->un_cmd_timeout; in sd_init_cdb_limits()
12894 struct sd_lun *un; in sd_initpkt_for_buf() local
12904 un = SD_GET_UN(bp); in sd_initpkt_for_buf()
12905 ASSERT(un != NULL); in sd_initpkt_for_buf()
12906 ASSERT(mutex_owned(SD_MUTEX(un))); in sd_initpkt_for_buf()
12909 SD_TRACE(SD_LOG_IO_CORE, un, in sd_initpkt_for_buf()
12912 mutex_exit(SD_MUTEX(un)); in sd_initpkt_for_buf()
12933 blockcount = SD_BYTES2TGTBLOCKS(un, bp->b_bcount); in sd_initpkt_for_buf()
12935 cmd_flags = un->un_pkt_flags | (xp->xb_pkt_flags & SD_XB_INITPKT_MASK); in sd_initpkt_for_buf()
12941 rval = sd_setup_rw_pkt(un, &pktp, bp, in sd_initpkt_for_buf()
12942 cmd_flags, sdrunout, (caddr_t)un, in sd_initpkt_for_buf()
12952 if ((un->un_pkt_flags & PKT_DMA_PARTIAL) != 0 && in sd_initpkt_for_buf()
12968 pktp->pkt_flags = un->un_tagflags; in sd_initpkt_for_buf()
12969 pktp->pkt_time = un->un_cmd_timeout; in sd_initpkt_for_buf()
12975 SD_TRACE(SD_LOG_IO_CORE, un, in sd_initpkt_for_buf()
12982 mutex_enter(SD_MUTEX(un)); in sd_initpkt_for_buf()
13000 mutex_enter(SD_MUTEX(un)); in sd_initpkt_for_buf()
13001 New_state(un, SD_STATE_RWAIT); in sd_initpkt_for_buf()
13003 SD_ERROR(SD_LOG_IO_CORE, un, in sd_initpkt_for_buf()
13017 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, in sd_initpkt_for_buf()
13020 SD_ERROR(SD_LOG_IO_CORE, un, in sd_initpkt_for_buf()
13022 mutex_enter(SD_MUTEX(un)); in sd_initpkt_for_buf()
13069 sd_setup_rw_pkt(struct sd_lun *un, in sd_setup_rw_pkt() argument
13082 for (i = un->un_mincdb; i <= un->un_maxcdb; i++) { in sd_setup_rw_pkt()
13104 return_pktp = scsi_init_pkt(SD_ADDRESS(un), *pktpp, in sd_setup_rw_pkt()
13105 bp, cp->sc_grpcode, un->un_status_len, 0, in sd_setup_rw_pkt()
13131 SD_BYTES2TGTBLOCKS(un, in sd_setup_rw_pkt()
13145 SD_FILL_SCSI1_LUN(un, return_pktp); in sd_setup_rw_pkt()
13212 sd_setup_next_rw_pkt(struct sd_lun *un, in sd_setup_next_rw_pkt() argument
13237 if (scsi_init_pkt(SD_ADDRESS(un), pktp, bp, 0, 0, 0, 0, in sd_setup_next_rw_pkt()
13242 SD_BYTES2TGTBLOCKS(un, pktp->pkt_resid); in sd_setup_next_rw_pkt()
13246 SD_FILL_SCSI1_LUN(un, pktp); in sd_setup_next_rw_pkt()
13299 struct sd_lun *un; in sd_initpkt_for_uscsi() local
13306 un = SD_GET_UN(bp); in sd_initpkt_for_uscsi()
13307 ASSERT(un != NULL); in sd_initpkt_for_uscsi()
13308 ASSERT(mutex_owned(SD_MUTEX(un))); in sd_initpkt_for_uscsi()
13314 SD_TRACE(SD_LOG_IO_CORE, un, in sd_initpkt_for_uscsi()
13336 pktp = scsi_init_pkt(SD_ADDRESS(un), NULL, in sd_initpkt_for_uscsi()
13340 (un->un_pkt_flags & ~PKT_DMA_PARTIAL) | PKT_XARQ, in sd_initpkt_for_uscsi()
13341 sdrunout, (caddr_t)un); in sd_initpkt_for_uscsi()
13343 pktp = scsi_init_pkt(SD_ADDRESS(un), NULL, in sd_initpkt_for_uscsi()
13346 (un->un_pkt_flags & ~PKT_DMA_PARTIAL), in sd_initpkt_for_uscsi()
13347 sdrunout, (caddr_t)un); in sd_initpkt_for_uscsi()
13357 New_state(un, SD_STATE_RWAIT); in sd_initpkt_for_uscsi()
13359 SD_ERROR(SD_LOG_IO_CORE, un, in sd_initpkt_for_uscsi()
13372 if ((un->un_pkt_flags & PKT_DMA_PARTIAL) && in sd_initpkt_for_uscsi()
13375 SD_ERROR(SD_LOG_IO_CORE, un, "sd_initpkt_for_uscsi: " in sd_initpkt_for_uscsi()
13384 SD_FILL_SCSI1_LUN(un, pktp); in sd_initpkt_for_uscsi()
13403 if (un->un_f_is_fibre == FALSE) { in sd_initpkt_for_uscsi()
13432 flags |= un->un_tagflags & FLAG_TAGMASK; in sd_initpkt_for_uscsi()
13449 pktp->pkt_time = un->un_uscsi_timeout; in sd_initpkt_for_uscsi()
13463 SD_TRACE(SD_LOG_IO_CORE, un, in sd_initpkt_for_uscsi()
13486 struct sd_lun *un; in sd_destroypkt_for_uscsi() local
13492 un = SD_GET_UN(bp); in sd_destroypkt_for_uscsi()
13493 ASSERT(un != NULL); in sd_destroypkt_for_uscsi()
13494 ASSERT(!mutex_owned(SD_MUTEX(un))); in sd_destroypkt_for_uscsi()
13498 SD_TRACE(SD_LOG_IO_CORE, un, in sd_destroypkt_for_uscsi()
13546 SD_TRACE(SD_LOG_IO_CORE, un, in sd_destroypkt_for_uscsi()
13574 struct sd_lun *un; in sd_bioclone_alloc() local
13582 un = SD_GET_UN(bp); in sd_bioclone_alloc()
13583 ASSERT(un != NULL); in sd_bioclone_alloc()
13584 ASSERT(!mutex_owned(SD_MUTEX(un))); in sd_bioclone_alloc()
13586 new_bp = bioclone(bp, 0, datalen, SD_GET_DEV(un), blkno, func, in sd_bioclone_alloc()
13633 struct sd_lun *un; in sd_shadow_buf_alloc() local
13641 un = SD_GET_UN(bp); in sd_shadow_buf_alloc()
13642 ASSERT(un != NULL); in sd_shadow_buf_alloc()
13643 ASSERT(!mutex_owned(SD_MUTEX(un))); in sd_shadow_buf_alloc()
13657 new_bp = scsi_alloc_consistent_buf(SD_ADDRESS(un), NULL, in sd_shadow_buf_alloc()
13787 sd_print_transport_rejected_message(struct sd_lun *un, struct sd_xbuf *xp, in sd_print_transport_rejected_message() argument
13790 ASSERT(un != NULL); in sd_print_transport_rejected_message()
13791 ASSERT(mutex_owned(SD_MUTEX(un))); in sd_print_transport_rejected_message()
13812 (SD_FM_LOG(un) == SD_FM_LOG_NSUP)) { in sd_print_transport_rejected_message()
13815 (un->un_tran_fatal_count == 1)) { in sd_print_transport_rejected_message()
13818 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, in sd_print_transport_rejected_message()
13822 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, in sd_print_transport_rejected_message()
13826 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, in sd_print_transport_rejected_message()
13854 sd_add_buf_to_waitq(struct sd_lun *un, struct buf *bp) in sd_add_buf_to_waitq() argument
13859 ASSERT(un != NULL); in sd_add_buf_to_waitq()
13860 ASSERT(mutex_owned(SD_MUTEX(un))); in sd_add_buf_to_waitq()
13863 if (un->un_waitq_headp == NULL) { in sd_add_buf_to_waitq()
13864 ASSERT(un->un_waitq_tailp == NULL); in sd_add_buf_to_waitq()
13865 un->un_waitq_headp = un->un_waitq_tailp = bp; in sd_add_buf_to_waitq()
13870 ASSERT(un->un_waitq_tailp != NULL); in sd_add_buf_to_waitq()
13876 if (un->un_f_disksort_disabled || un->un_f_enable_rmw) { in sd_add_buf_to_waitq()
13877 un->un_waitq_tailp->av_forw = bp; in sd_add_buf_to_waitq()
13878 un->un_waitq_tailp = bp; in sd_add_buf_to_waitq()
13901 ap = un->un_waitq_headp; in sd_add_buf_to_waitq()
13966 if (ap == un->un_waitq_tailp) { in sd_add_buf_to_waitq()
13967 un->un_waitq_tailp = bp; in sd_add_buf_to_waitq()
13990 sd_start_cmds(struct sd_lun *un, struct buf *immed_bp) argument
14001 ASSERT(un != NULL);
14002 ASSERT(mutex_owned(SD_MUTEX(un)));
14003 ASSERT(un->un_ncmds_in_transport >= 0);
14004 ASSERT(un->un_throttle >= 0);
14006 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, "sd_start_cmds: entry\n");
14025 if ((un->un_state == SD_STATE_DUMPING) ||
14026 (ddi_in_panic() && (un->un_in_callback > 1))) {
14027 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
14049 if (bp == un->un_retry_bp) {
14050 ASSERT((un->un_retry_statp == NULL) ||
14051 (un->un_retry_statp == kstat_waitq_enter) ||
14052 (un->un_retry_statp ==
14063 if ((un->un_retry_statp == kstat_waitq_enter) ||
14064 (un->un_retry_statp ==
14069 saved_statp = un->un_retry_statp;
14071 un->un_retry_statp = NULL;
14073 SD_TRACE(SD_LOG_IO | SD_LOG_ERROR, un,
14076 un, un->un_retry_bp, un->un_throttle,
14077 un->un_ncmds_in_transport);
14079 SD_TRACE(SD_LOG_IO_CORE, un, "sd_start_cmds: "
14083 } else if ((bp = un->un_waitq_headp) != NULL) {
14097 if (un->un_ncmds_in_transport >= un->un_throttle) {
14098 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
14103 if (un->un_retry_bp != NULL) {
14104 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
14108 if (un->un_startstop_timeid != NULL) {
14109 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
14114 if (un->un_direct_priority_timeid != NULL) {
14115 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
14122 un->un_waitq_headp = bp->av_forw;
14123 if (un->un_waitq_headp == NULL) {
14124 un->un_waitq_tailp = NULL;
14128 SD_TRACE(SD_LOG_IO_CORE, un,
14133 SD_TRACE(SD_LOG_IO_CORE, un,
14148 if ((un->un_state != SD_STATE_SUSPENDED) &&
14149 (un->un_state != SD_STATE_PM_CHANGING)) {
14150 New_state(un, SD_STATE_NORMAL);
14211 ASSERT(bp != un->un_rqs_bp);
14217 SD_TRACE(SD_LOG_IO_CORE, un,
14232 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
14253 if (bp != un->un_retry_bp) {
14285 if (un->un_retry_statp == NULL) {
14291 un->un_retry_statp =
14295 if ((un->un_startstop_timeid == NULL) &&
14296 (un->un_retry_timeid == NULL) &&
14297 (un->un_direct_priority_timeid ==
14300 un->un_retry_timeid =
14303 un, SD_RESTART_TIMEOUT);
14315 bp->av_forw = un->un_waitq_headp;
14316 un->un_waitq_headp = bp;
14317 if (un->un_waitq_tailp == NULL) {
14318 un->un_waitq_tailp = bp;
14327 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
14338 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
14348 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
14368 SD_UPDATE_KSTATS(un, kstat_waitq_exit, bp);
14370 sd_return_failed_command_no_restart(un, bp, EIO);
14383 un->un_ncmds_in_transport++;
14384 SD_UPDATE_KSTATS(un, statp, bp);
14394 SD_TRACE(SD_LOG_IO_CORE, un,
14398 mutex_exit(SD_MUTEX(un));
14400 mutex_enter(SD_MUTEX(un));
14402 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
14408 un->un_tran_fatal_count = 0;
14412 un->un_ncmds_in_transport--;
14413 ASSERT(un->un_ncmds_in_transport >= 0);
14421 if (bp == un->un_rqs_bp) {
14422 SD_UPDATE_KSTATS(un, kstat_runq_exit, bp);
14423 bp = sd_mark_rqs_idle(un, xp);
14424 sd_retry_command(un, bp, SD_RETRIES_STANDARD,
14425 NULL, NULL, EIO, un->un_busy_timeout / 500,
14437 if ((un->un_f_is_fibre == TRUE) &&
14468 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
14472 SD_UPDATE_KSTATS(un, kstat_runq_exit, bp);
14473 un->un_direct_priority_timeid =
14475 bp, un->un_busy_timeout / 500);
14484 if (bp != un->un_retry_bp) {
14485 sd_reduce_throttle(un, SD_THROTTLE_TRAN_BUSY);
14493 sd_set_retry_bp(un, bp, un->un_busy_timeout / 500,
14498 un->un_tran_fatal_count++;
14503 un->un_ncmds_in_transport--;
14504 ASSERT(un->un_ncmds_in_transport >= 0);
14512 if (bp == un->un_rqs_bp) {
14513 bp = sd_mark_rqs_idle(un, xp);
14520 SD_UPDATE_ERRSTATS(un, sd_transerrs);
14523 SD_UPDATE_KSTATS(un, kstat_runq_exit, bp);
14524 sd_print_transport_rejected_message(un, xp, rval);
14534 ASSERT(un->un_fm_private != NULL);
14535 sfip = un->un_fm_private;
14537 sd_ssc_extract_info(&sfip->fm_ssc, un,
14548 sd_return_failed_command_no_restart(un, bp, EIO);
14554 if (un->un_state == SD_STATE_SUSPENDED) {
14555 cv_broadcast(&un->un_disk_busy_cv);
14568 ASSERT(mutex_owned(SD_MUTEX(un)));
14569 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, "sd_start_cmds: exit\n");
14584 sd_return_command(struct sd_lun *un, struct buf *bp) argument
14591 ASSERT(un != NULL);
14592 ASSERT(mutex_owned(SD_MUTEX(un)));
14593 ASSERT(bp != un->un_rqs_bp);
14598 sfip = (struct sd_fm_internal *)un->un_fm_private;
14601 SD_TRACE(SD_LOG_IO_CORE, un, "sd_return_command: entry\n");
14606 if ((un->un_partial_dma_supported == 1) &&
14611 if (sd_setup_next_xfer(un, bp, pktp, xp) != 0) {
14616 sd_retry_command(un, bp, SD_RETRIES_NOCHECK,
14618 sd_start_cmds(un, NULL);
14632 if (bp == un->un_failfast_bp) {
14633 ASSERT(un->un_failfast_state == SD_FAILFAST_INACTIVE);
14634 un->un_failfast_bp = NULL;
14641 un->un_failfast_state = SD_FAILFAST_INACTIVE;
14648 sd_ssc_extract_info(&sfip->fm_ssc, un, pktp, bp, xp);
14658 sd_ssc_extract_info(&sfip->fm_ssc, un, pktp, bp, xp);
14667 if (bp == un->un_retry_bp) {
14668 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
14670 "RETURNING retry_bp:0x%p\n", un, un->un_retry_bp);
14671 un->un_retry_bp = NULL;
14672 un->un_retry_statp = NULL;
14675 SD_UPDATE_RDWR_STATS(un, bp);
14676 SD_UPDATE_PARTITION_STATS(un, bp);
14678 switch (un->un_state) {
14684 cv_broadcast(&un->un_disk_busy_cv);
14687 sd_start_cmds(un, NULL);
14692 mutex_exit(SD_MUTEX(un));
14697 SD_BEGIN_IODONE(xp->xb_chain_iodone, un, bp);
14699 ASSERT(!mutex_owned(SD_MUTEX(un)));
14700 mutex_enter(SD_MUTEX(un));
14702 SD_TRACE(SD_LOG_IO_CORE, un, "sd_return_command: exit\n");
14715 sd_return_failed_command(struct sd_lun *un, struct buf *bp, int errcode) argument
14718 ASSERT(un != NULL);
14719 ASSERT(mutex_owned(SD_MUTEX(un)));
14721 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
14730 sd_return_command(un, bp);
14731 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
14746 sd_return_failed_command_no_restart(struct sd_lun *un, struct buf *bp, argument
14752 ASSERT(un != NULL);
14753 ASSERT(mutex_owned(SD_MUTEX(un)));
14758 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
14774 if (bp == un->un_failfast_bp) {
14775 ASSERT(un->un_failfast_state == SD_FAILFAST_INACTIVE);
14776 un->un_failfast_bp = NULL;
14779 if (bp == un->un_retry_bp) {
14784 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
14786 " un:0x%p: RETURNING retry_bp:0x%p\n", un, un->un_retry_bp);
14787 un->un_retry_bp = NULL;
14788 un->un_retry_statp = NULL;
14791 SD_UPDATE_RDWR_STATS(un, bp);
14792 SD_UPDATE_PARTITION_STATS(un, bp);
14794 mutex_exit(SD_MUTEX(un));
14801 SD_BEGIN_IODONE(xp->xb_chain_iodone, un, bp);
14803 mutex_enter(SD_MUTEX(un));
14805 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
14857 sd_retry_command(struct sd_lun *un, struct buf *bp, int retry_check_flag, argument
14858 void (*user_funcp)(struct sd_lun *un, struct buf *bp, void *argp, int code), argument
14866 ASSERT(un != NULL);
14867 ASSERT(mutex_owned(SD_MUTEX(un)));
14874 sfip = (struct sd_fm_internal *)un->un_fm_private;
14877 SD_TRACE(SD_LOG_IO | SD_LOG_ERROR, un,
14893 scsi_log(SD_DEVINFO(un), sd_label, CE_NOTE,
14895 sd_dump_memory(un, SD_LOG_IO, "CDB",
14897 sd_dump_memory(un, SD_LOG_IO, "Sense Data",
14908 switch (un->un_state) {
14911 bp->av_forw = un->un_waitq_headp;
14912 un->un_waitq_headp = bp;
14913 if (un->un_waitq_tailp == NULL) {
14914 un->un_waitq_tailp = bp;
14916 if (bp == un->un_retry_bp) {
14917 un->un_retry_bp = NULL;
14918 un->un_retry_statp = NULL;
14920 SD_UPDATE_KSTATS(un, kstat_waitq_enter, bp);
14921 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, "sd_retry_command: "
14951 if (un->un_failfast_state == SD_FAILFAST_ACTIVE) {
14952 ASSERT(un->un_failfast_bp == NULL);
14971 if (un->un_failfast_bp == NULL) {
14979 un->un_failfast_bp = bp;
14981 } else if (un->un_failfast_bp == bp) {
14988 un->un_failfast_state = SD_FAILFAST_ACTIVE;
14989 un->un_failfast_bp = NULL;
14990 sd_failfast_flushq(un);
15032 un->un_failfast_state = SD_FAILFAST_INACTIVE;
15046 if (xp->xb_victim_retry_count < un->un_victim_retry_count) {
15055 if (xp->xb_retry_count >= un->un_retry_count) {
15057 SD_TRACE(SD_LOG_IO_CORE, un,
15074 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
15081 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
15087 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
15093 if (xp->xb_retry_count >= un->un_busy_retry_count) {
15095 SD_TRACE(SD_LOG_IO_CORE, un,
15100 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
15121 sd_ssc_extract_info(&sfip->fm_ssc, un, pktp, bp, xp);
15136 if (un->un_ncmds_in_transport >= un->un_throttle) {
15141 retry_delay = un->un_busy_timeout;
15143 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
15152 (*user_funcp)(un, bp, user_arg,
15155 sd_print_incomplete_msg(un, bp, user_arg,
15157 sd_print_cmd_incomplete_msg(un, bp, user_arg,
15159 sd_print_sense_failed_msg(un, bp, user_arg,
15164 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
15171 sd_start_cmds(un, bp);
15173 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
15184 (*user_funcp)(un, bp, user_arg, SD_DELAYED_RETRY_ISSUED);
15187 sd_set_retry_bp(un, bp, retry_delay, statp);
15189 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, "sd_retry_command: exit\n");
15195 (*user_funcp)(un, bp, user_arg, SD_NO_RETRY_ISSUED);
15200 SD_INFO(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
15203 sd_return_failed_command(un, bp, failure_code);
15205 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, "sd_retry_command: exit\n");
15223 sd_set_retry_bp(struct sd_lun *un, struct buf *bp, clock_t retry_delay, argument
15226 ASSERT(un != NULL);
15227 ASSERT(mutex_owned(SD_MUTEX(un)));
15230 SD_TRACE(SD_LOG_IO | SD_LOG_ERROR, un,
15231 "sd_set_retry_bp: entry: un:0x%p bp:0x%p\n", un, bp);
15245 if (un->un_retry_bp == NULL) {
15246 ASSERT(un->un_retry_statp == NULL);
15247 un->un_retry_bp = bp;
15260 un->un_retry_statp = statp;
15265 if (un->un_retry_bp == bp) {
15272 un->un_retry_statp = statp;
15288 if ((retry_delay != 0) && (un->un_startstop_timeid == NULL) &&
15289 (un->un_direct_priority_timeid == NULL)) {
15290 un->un_retry_timeid =
15291 timeout(sd_start_retry_command, un, retry_delay);
15292 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
15295 un, bp, un->un_retry_timeid);
15308 if ((un->un_failfast_bp != NULL) &&
15309 (un->un_failfast_bp == un->un_waitq_headp)) {
15314 bp->av_forw = un->un_waitq_headp->av_forw;
15315 un->un_waitq_headp->av_forw = bp;
15316 if (un->un_waitq_headp == un->un_waitq_tailp) {
15317 un->un_waitq_tailp = bp;
15321 bp->av_forw = un->un_waitq_headp;
15322 un->un_waitq_headp = bp;
15323 if (un->un_waitq_tailp == NULL) {
15324 un->un_waitq_tailp = bp;
15331 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
15332 "sd_set_retry_bp: un:0x%p already delayed retry\n", un);
15337 SD_UPDATE_KSTATS(un, statp, bp);
15340 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
15341 "sd_set_retry_bp: exit un:0x%p\n", un);
15360 struct sd_lun *un = arg; local
15362 ASSERT(un != NULL);
15363 ASSERT(!mutex_owned(SD_MUTEX(un)));
15365 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
15368 mutex_enter(SD_MUTEX(un));
15370 un->un_retry_timeid = NULL;
15372 if (un->un_retry_bp != NULL) {
15373 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
15375 un, un->un_retry_bp);
15376 sd_start_cmds(un, un->un_retry_bp);
15379 mutex_exit(SD_MUTEX(un));
15381 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
15398 struct sd_lun *un = arg; local
15400 ASSERT(un != NULL);
15401 ASSERT(!mutex_owned(SD_MUTEX(un)));
15403 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
15406 mutex_enter(SD_MUTEX(un));
15408 if (un->un_rmw_incre_count > 0) {
15409 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
15413 un->un_rmw_incre_count, un->un_tgt_blocksize,
15415 un->un_rmw_incre_count = 0;
15416 un->un_rmw_msg_timeid = timeout(sd_rmw_msg_print_handler,
15417 un, SD_RMW_MSG_PRINT_TIMEOUT);
15419 un->un_rmw_msg_timeid = NULL;
15422 mutex_exit(SD_MUTEX(un));
15424 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
15445 struct sd_lun *un; local
15448 un = SD_GET_UN(priority_bp);
15449 ASSERT(un != NULL);
15450 ASSERT(!mutex_owned(SD_MUTEX(un)));
15452 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
15455 mutex_enter(SD_MUTEX(un));
15456 un->un_direct_priority_timeid = NULL;
15457 sd_start_cmds(un, priority_bp);
15458 mutex_exit(SD_MUTEX(un));
15460 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
15474 sd_send_request_sense_command(struct sd_lun *un, struct buf *bp, argument
15478 ASSERT(un != NULL);
15479 ASSERT(mutex_owned(SD_MUTEX(un)));
15481 SD_TRACE(SD_LOG_IO | SD_LOG_ERROR, un, "sd_send_request_sense_command: "
15489 if (ddi_in_panic() || (un->un_state == SD_STATE_SUSPENDED) ||
15490 (un->un_state == SD_STATE_DUMPING)) {
15491 sd_return_failed_command(un, bp, EIO);
15492 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
15506 if ((un->un_sense_isbusy != 0) || (un->un_ncmds_in_transport > 0)) {
15509 sd_retry_command(un, bp, SD_RETRIES_NOCHECK,
15510 NULL, NULL, 0, un->un_busy_timeout,
15512 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
15516 sd_return_failed_command(un, bp, EIO);
15517 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
15524 sd_mark_rqs_busy(un, bp);
15525 sd_start_cmds(un, un->un_rqs_bp);
15527 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
15542 sd_mark_rqs_busy(struct sd_lun *un, struct buf *bp) argument
15546 ASSERT(un != NULL);
15548 ASSERT(mutex_owned(SD_MUTEX(un)));
15549 ASSERT(un->un_sense_isbusy == 0);
15551 SD_TRACE(SD_LOG_IO_CORE, un, "sd_mark_rqs_busy: entry: "
15552 "buf:0x%p xp:0x%p un:0x%p\n", bp, SD_GET_XBUF(bp), un);
15554 sense_xp = SD_GET_XBUF(un->un_rqs_bp);
15557 SD_INFO(SD_LOG_IO, un,
15564 un->un_sense_isbusy = 1;
15565 un->un_rqs_bp->b_resid = 0;
15572 bzero(un->un_rqs_bp->b_un.b_addr, SENSE_LENGTH);
15598 SD_TRACE(SD_LOG_IO_CORE, un, "sd_mark_rqs_busy: exit\n");
15615 sd_mark_rqs_idle(struct sd_lun *un, struct sd_xbuf *sense_xp) argument
15618 ASSERT(un != NULL);
15620 ASSERT(mutex_owned(SD_MUTEX(un)));
15621 ASSERT(un->un_sense_isbusy != 0);
15623 un->un_sense_isbusy = 0;
15646 sd_alloc_rqs(struct scsi_device *devp, struct sd_lun *un) argument
15650 ASSERT(un != NULL);
15651 ASSERT(!mutex_owned(SD_MUTEX(un)));
15652 ASSERT(un->un_rqs_bp == NULL);
15653 ASSERT(un->un_rqs_pktp == NULL);
15659 un->un_rqs_bp = scsi_alloc_consistent_buf(&devp->sd_address, NULL,
15661 if (un->un_rqs_bp == NULL) {
15665 un->un_rqs_pktp = scsi_init_pkt(&devp->sd_address, NULL, un->un_rqs_bp,
15668 if (un->un_rqs_pktp == NULL) {
15669 sd_free_rqs(un);
15674 (void) scsi_setup_cdb((union scsi_cdb *)un->un_rqs_pktp->pkt_cdbp,
15677 SD_FILL_SCSI1_LUN(un, un->un_rqs_pktp);
15680 un->un_rqs_pktp->pkt_comp = sdintr;
15681 un->un_rqs_pktp->pkt_time = sd_io_time;
15682 un->un_rqs_pktp->pkt_flags |=
15691 sd_xbuf_init(un, un->un_rqs_bp, xp, SD_CHAIN_NULL, NULL);
15692 xp->xb_pktp = un->un_rqs_pktp;
15693 SD_INFO(SD_LOG_ATTACH_DETACH, un,
15695 un, xp, un->un_rqs_pktp, un->un_rqs_bp);
15701 un->un_rqs_pktp->pkt_private = un->un_rqs_bp;
15702 ASSERT(un->un_rqs_bp->b_private == xp);
15721 if (un->un_f_is_fibre == TRUE) {
15722 un->un_f_arq_enabled = TRUE;
15729 (void) scsi_ifsetcap(SD_ADDRESS(un), "auto-rqsense", 1, 1);
15731 switch (scsi_ifgetcap(SD_ADDRESS(un), "auto-rqsense", 1)) {
15733 SD_INFO(SD_LOG_ATTACH_DETACH, un,
15740 if (scsi_ifsetcap(SD_ADDRESS(un), "auto-rqsense", 1, 1)
15743 SD_INFO(SD_LOG_ATTACH_DETACH, un,
15745 un->un_f_arq_enabled = TRUE;
15748 SD_INFO(SD_LOG_ATTACH_DETACH, un,
15750 un->un_f_arq_enabled = FALSE;
15758 SD_INFO(SD_LOG_ATTACH_DETACH, un,
15760 un->un_f_arq_enabled = TRUE;
15767 SD_INFO(SD_LOG_ATTACH_DETACH, un,
15769 un->un_f_arq_enabled = FALSE;
15787 sd_free_rqs(struct sd_lun *un) argument
15789 ASSERT(un != NULL);
15791 SD_TRACE(SD_LOG_IO_CORE, un, "sd_free_rqs: entry\n");
15800 if (un->un_rqs_pktp != NULL) {
15801 scsi_destroy_pkt(un->un_rqs_pktp);
15802 un->un_rqs_pktp = NULL;
15805 if (un->un_rqs_bp != NULL) {
15806 struct sd_xbuf *xp = SD_GET_XBUF(un->un_rqs_bp);
15810 scsi_free_consistent_buf(un->un_rqs_bp);
15811 un->un_rqs_bp = NULL;
15813 SD_TRACE(SD_LOG_IO_CORE, un, "sd_free_rqs: exit\n");
15835 sd_reduce_throttle(struct sd_lun *un, int throttle_type) argument
15837 ASSERT(un != NULL);
15838 ASSERT(mutex_owned(SD_MUTEX(un)));
15839 ASSERT(un->un_ncmds_in_transport >= 0);
15841 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, "sd_reduce_throttle: "
15843 un, un->un_throttle, un->un_ncmds_in_transport);
15845 if (un->un_throttle > 1) {
15846 if (un->un_f_use_adaptive_throttle == TRUE) {
15849 if (un->un_busy_throttle == 0) {
15850 un->un_busy_throttle = un->un_throttle;
15854 un->un_busy_throttle = 0;
15860 if (un->un_ncmds_in_transport > 0) {
15861 un->un_throttle = un->un_ncmds_in_transport;
15865 if (un->un_ncmds_in_transport == 0) {
15866 un->un_throttle = 1;
15868 un->un_throttle = un->un_ncmds_in_transport;
15874 if (un->un_reset_throttle_timeid == NULL) {
15875 un->un_reset_throttle_timeid = timeout(sd_restore_throttle,
15876 un, SD_THROTTLE_RESET_INTERVAL);
15877 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
15881 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, "sd_reduce_throttle: "
15882 "exit: un:0x%p un_throttle:%d\n", un, un->un_throttle);
15901 struct sd_lun *un = arg; local
15903 ASSERT(un != NULL);
15904 ASSERT(!mutex_owned(SD_MUTEX(un)));
15906 mutex_enter(SD_MUTEX(un));
15908 SD_TRACE(SD_LOG_IO | SD_LOG_ERROR, un, "sd_restore_throttle: "
15909 "entry: un:0x%p un_throttle:%d\n", un, un->un_throttle);
15911 un->un_reset_throttle_timeid = NULL;
15913 if (un->un_f_use_adaptive_throttle == TRUE) {
15923 if (un->un_busy_throttle > 0) {
15924 un->un_throttle = un->un_busy_throttle;
15925 un->un_busy_throttle = 0;
15934 throttle = un->un_throttle +
15935 max((un->un_throttle / 10), 1);
15936 un->un_throttle =
15937 (throttle < un->un_saved_throttle) ?
15938 throttle : un->un_saved_throttle;
15939 if (un->un_throttle < un->un_saved_throttle) {
15940 un->un_reset_throttle_timeid =
15942 un,
15953 if (un->un_throttle < un->un_min_throttle) {
15954 un->un_throttle = un->un_saved_throttle;
15957 SD_TRACE(SD_LOG_IO | SD_LOG_ERROR, un, "sd_restore_throttle: "
15959 un->un_throttle, un->un_saved_throttle);
15960 un->un_throttle = un->un_saved_throttle;
15963 SD_TRACE(SD_LOG_IO | SD_LOG_ERROR, un,
15966 sd_start_cmds(un, NULL);
15968 SD_TRACE(SD_LOG_IO | SD_LOG_ERROR, un,
15970 un, un->un_throttle);
15972 mutex_exit(SD_MUTEX(un));
15974 SD_TRACE(SD_LOG_IO | SD_LOG_ERROR, un, "sd_restore_throttle: exit\n");
16006 struct sd_lun *un = (struct sd_lun *)arg; local
16008 ASSERT(un != NULL);
16009 ASSERT(!mutex_owned(SD_MUTEX(un)));
16011 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, "sdrunout: entry\n");
16013 mutex_enter(SD_MUTEX(un));
16014 sd_start_cmds(un, NULL);
16015 mutex_exit(SD_MUTEX(un));
16021 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, "sdrunout: exit\n");
16040 struct sd_lun *un; local
16050 un = SD_GET_UN(bp);
16051 ASSERT(un != NULL);
16052 ASSERT(!mutex_owned(SD_MUTEX(un)));
16056 SD_INFO(SD_LOG_IOERR, un, "sdintr: sdintr calling Fault injection\n");
16062 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, "sdintr: entry: buf:0x%p,"
16063 " xp:0x%p, un:0x%p\n", bp, xp, un);
16065 mutex_enter(SD_MUTEX(un));
16067 ASSERT(un->un_fm_private != NULL);
16068 sscp = &((struct sd_fm_internal *)(un->un_fm_private))->fm_ssc;
16072 un->un_ncmds_in_transport--;
16073 ASSERT(un->un_ncmds_in_transport >= 0);
16076 un->un_in_callback++;
16078 SD_UPDATE_KSTATS(un, kstat_runq_exit, bp);
16081 if (bp == un->un_retry_bp) {
16082 SD_TRACE(SD_LOG_IO | SD_LOG_ERROR, un, "sdintr: "
16084 un, un->un_retry_bp, un->un_ncmds_in_transport);
16094 if (un->un_last_pkt_reason != CMD_DEV_GONE) {
16095 un->un_last_pkt_reason = CMD_DEV_GONE;
16096 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
16099 if (un->un_mediastate != DKIO_DEV_GONE) {
16100 un->un_mediastate = DKIO_DEV_GONE;
16101 cv_broadcast(&un->un_state_cv);
16107 if (bp == un->un_rqs_bp) {
16108 bp = sd_mark_rqs_idle(un, xp);
16110 sd_return_failed_command(un, bp, EIO);
16115 SD_TRACE(SD_LOG_COMMON, un,
16125 (un->un_f_arq_enabled == TRUE)) {
16172 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
16174 sd_return_failed_command(un, bp, EIO);
16188 if ((un->un_f_is_fibre == TRUE) &&
16196 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
16199 sd_handle_auto_request_sense(un, bp, xp, pktp);
16206 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
16208 sd_handle_request_sense(un, bp, xp, pktp);
16236 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
16241 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
16245 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
16250 sd_return_command(un, bp);
16256 un->un_in_callback--;
16257 ASSERT(un->un_in_callback >= 0);
16258 mutex_exit(SD_MUTEX(un));
16287 if ((un->un_f_is_fibre == TRUE) &&
16302 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
16311 sd_send_request_sense_command(un, bp, pktp);
16313 sd_return_failed_command(un, bp, EIO);
16330 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
16332 sd_pkt_status_good(un, bp, xp, pktp);
16337 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
16339 sd_pkt_status_check_condition(un, bp, xp, pktp);
16343 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
16345 sd_pkt_status_busy(un, bp, xp, pktp);
16349 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
16351 sd_pkt_status_reservation_conflict(un, bp, xp, pktp);
16355 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
16357 sd_pkt_status_qfull(un, bp, xp, pktp);
16365 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
16376 sd_return_failed_command(un, bp, EIO);
16380 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
16387 sd_return_failed_command(un, bp, EIO);
16394 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
16396 sd_pkt_reason_cmd_incomplete(un, bp, xp, pktp);
16399 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
16401 sd_pkt_reason_cmd_tran_err(un, bp, xp, pktp);
16404 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
16406 sd_pkt_reason_cmd_reset(un, bp, xp, pktp);
16409 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
16411 sd_pkt_reason_cmd_aborted(un, bp, xp, pktp);
16414 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
16416 sd_pkt_reason_cmd_timeout(un, bp, xp, pktp);
16419 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
16421 sd_pkt_reason_cmd_unx_bus_free(un, bp, xp, pktp);
16424 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
16426 sd_pkt_reason_cmd_tag_reject(un, bp, xp, pktp);
16429 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
16438 sd_pkt_reason_default(un, bp, xp, pktp);
16443 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, "sdintr: exit\n");
16446 un->un_in_callback--;
16447 ASSERT(un->un_in_callback >= 0);
16455 mutex_exit(SD_MUTEX(un));
16474 sd_print_incomplete_msg(struct sd_lun *un, struct buf *bp, void *arg, int code) argument
16480 ASSERT(un != NULL);
16481 ASSERT(mutex_owned(SD_MUTEX(un)));
16499 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
16515 sd_pkt_status_good(struct sd_lun *un, struct buf *bp, argument
16520 ASSERT(un != NULL);
16521 ASSERT(mutex_owned(SD_MUTEX(un)));
16529 SD_TRACE(SD_LOG_IO_CORE, un, "sd_pkt_status_good: entry\n");
16531 SD_UPDATE_ERRSTATS(un, sd_harderrs);
16541 sd_return_command(un, bp);
16542 SD_TRACE(SD_LOG_IO_CORE, un, "sd_pkt_status_good: exit\n");
16551 sd_retry_command(un, bp, SD_RETRIES_STANDARD, sd_print_incomplete_msg,
16554 SD_TRACE(SD_LOG_IO_CORE, un, "sd_pkt_status_good: exit\n");
16575 sd_handle_request_sense(struct sd_lun *un, struct buf *sense_bp, argument
16583 ASSERT(un != NULL);
16584 ASSERT(mutex_owned(SD_MUTEX(un)));
16593 ASSERT(sense_pktp == un->un_rqs_pktp);
16594 ASSERT(sense_bp == un->un_rqs_bp);
16612 SD_UPDATE_ERRSTATS(un, sd_harderrs);
16614 cmd_bp = sd_mark_rqs_idle(un, sense_xp);
16615 sd_retry_command(un, cmd_bp, SD_RETRIES_STANDARD,
16657 (void) sd_mark_rqs_idle(un, sense_xp);
16665 if (sd_validate_sense_data(un, cmd_bp, cmd_xp, actual_len) ==
16667 sd_decode_sense(un, cmd_bp, cmd_xp, cmd_pktp);
16670 SD_DUMP_MEMORY(un, SD_LOG_IO_CORE, "Failed CDB",
16672 SD_DUMP_MEMORY(un, SD_LOG_IO_CORE, "Sense Data",
16674 sd_return_failed_command(un, cmd_bp, EIO);
16695 sd_handle_auto_request_sense(struct sd_lun *un, struct buf *bp, argument
16701 ASSERT(un != NULL);
16702 ASSERT(mutex_owned(SD_MUTEX(un)));
16706 ASSERT(pktp != un->un_rqs_pktp);
16707 ASSERT(bp != un->un_rqs_bp);
16721 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
16725 sd_reset_target(un, pktp);
16727 sd_retry_command(un, bp, SD_RETRIES_STANDARD,
16763 if (sd_validate_sense_data(un, bp, xp, actual_len) ==
16765 sd_decode_sense(un, bp, xp, pktp);
16785 sd_print_sense_failed_msg(struct sd_lun *un, struct buf *bp, void *arg, argument
16790 ASSERT(un != NULL);
16791 ASSERT(mutex_owned(SD_MUTEX(un)));
16795 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, msgp);
16814 sd_validate_sense_data(struct sd_lun *un, struct buf *bp, struct sd_xbuf *xp, argument
16822 ASSERT(un != NULL);
16823 ASSERT(mutex_owned(SD_MUTEX(un)));
16825 ASSERT(bp != un->un_rqs_bp);
16827 ASSERT(un->un_fm_private != NULL);
16832 sscp = &((struct sd_fm_internal *)(un->un_fm_private))->fm_ssc;
16843 sd_pkt_status_reservation_conflict(un, bp, xp, pktp);
16847 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
16849 sd_retry_command(un, bp, SD_RETRIES_BUSY, NULL,
16850 NULL, EIO, un->un_busy_timeout / 500, kstat_waitq_enter);
16854 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
16856 sd_retry_command(un, bp, SD_RETRIES_STANDARD, NULL,
16857 NULL, EIO, un->un_busy_timeout / 500, kstat_waitq_enter);
16911 if (SD_FM_LOG(un) == SD_FM_LOG_NSUP) {
16912 scsi_log(SD_DEVINFO(un), sd_label,
16925 sd_return_failed_command(un, bp, EIO);
16959 sd_retry_command(un, bp, SD_RETRIES_STANDARD,
16961 un->un_f_is_fibre ? drv_usectohz(100000) : (clock_t)0, NULL);
16975 sd_decode_sense(struct sd_lun *un, struct buf *bp, struct sd_xbuf *xp, argument
16980 ASSERT(un != NULL);
16981 ASSERT(mutex_owned(SD_MUTEX(un)));
16983 ASSERT(bp != un->un_rqs_bp);
16991 sd_sense_key_no_sense(un, bp, xp, pktp);
16994 sd_sense_key_recoverable_error(un, xp->xb_sense_data,
16998 sd_sense_key_not_ready(un, xp->xb_sense_data,
17003 sd_sense_key_medium_or_hardware_error(un,
17007 sd_sense_key_illegal_request(un, bp, xp, pktp);
17010 sd_sense_key_unit_attention(un, xp->xb_sense_data,
17016 sd_sense_key_fail_command(un, bp, xp, pktp);
17019 sd_sense_key_blank_check(un, bp, xp, pktp);
17022 sd_sense_key_aborted_command(un, bp, xp, pktp);
17029 sd_sense_key_default(un, xp->xb_sense_data,
17062 sd_dump_memory(struct sd_lun *un, uint_t comp, char *title, uchar_t *data, argument
17144 scsi_log(SD_DEVINFO(un), sd_label, CE_NOTE, "%s", local_buf);
17164 sd_print_sense_msg(struct sd_lun *un, struct buf *bp, void *arg, int code) argument
17175 ASSERT(un != NULL);
17176 ASSERT(mutex_owned(SD_MUTEX(un)));
17229 sd_dump_memory(un, SD_LOG_IO, "Failed CDB",
17231 sd_dump_memory(un, SD_LOG_IO, "Sense Data",
17247 if (SD_FM_LOG(un) == SD_FM_LOG_NSUP ||
17250 scsi_vu_errmsg(SD_SCSI_DEVP(un), pktp, sd_label, severity,
17253 un->un_additional_codes, NULL);
17266 sd_sense_key_no_sense(struct sd_lun *un, struct buf *bp, struct sd_xbuf *xp, argument
17271 ASSERT(un != NULL);
17272 ASSERT(mutex_owned(SD_MUTEX(un)));
17280 SD_UPDATE_ERRSTATS(un, sd_softerrs);
17282 sd_retry_command(un, bp, SD_RETRIES_STANDARD, sd_print_sense_msg,
17296 sd_sense_key_recoverable_error(struct sd_lun *un, uint8_t *sense_datap, argument
17303 ASSERT(un != NULL);
17304 ASSERT(mutex_owned(SD_MUTEX(un)));
17313 sd_return_command(un, bp);
17321 SD_UPDATE_ERRSTATS(un, sd_rq_pfa_err);
17325 SD_UPDATE_ERRSTATS(un, sd_softerrs);
17326 SD_UPDATE_ERRSTATS(un, sd_rq_recov_err);
17332 sd_print_sense_msg(un, bp, &si, SD_NO_RETRY_ISSUED);
17333 sd_return_command(un, bp);
17337 sd_retry_command(un, bp, SD_RETRIES_STANDARD, sd_print_sense_msg,
17353 sd_sense_key_not_ready(struct sd_lun *un, uint8_t *sense_datap, struct buf *bp, argument
17360 ASSERT(un != NULL);
17361 ASSERT(mutex_owned(SD_MUTEX(un)));
17374 if ((ISCD(un) && (asc == 0x3A)) ||
17376 SD_UPDATE_ERRSTATS(un, sd_harderrs);
17377 SD_UPDATE_ERRSTATS(un, sd_rq_ntrdy_err);
17383 if (xp->xb_nr_retry_count >= un->un_notready_retry_count) {
17385 if (un->un_f_has_removable_media && (asc == 0x04) &&
17404 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
17434 if (un->un_f_is_fibre == TRUE) {
17437 (un->un_startstop_timeid == NULL)) {
17438 scsi_log(SD_DEVINFO(un), sd_label,
17441 sd_reset_target(un, pktp);
17446 un->un_reset_retry_count)) &&
17447 (un->un_startstop_timeid == NULL)) {
17448 scsi_log(SD_DEVINFO(un), sd_label,
17451 sd_reset_target(un, pktp);
17489 if (un->un_f_has_removable_media) {
17524 if (un->un_startstop_timeid != NULL) {
17525 SD_INFO(SD_LOG_ERROR, un,
17527 " %s%d\n", ddi_driver_name(SD_DEVINFO(un)),
17528 ddi_get_instance(SD_DEVINFO(un)));
17541 un->un_startstop_timeid = timeout(sd_start_stop_unit_callback,
17542 un, un->un_busy_timeout / 2);
17544 sd_set_retry_bp(un, bp, 0, kstat_waitq_enter);
17549 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
17556 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
17560 sr_ejected(un);
17561 un->un_mediastate = DKIO_EJECTED;
17563 cv_broadcast(&un->un_state_cv);
17569 scsi_log(SD_DEVINFO(un), sd_label, CE_NOTE,
17584 sd_retry_command(un, bp, SD_RETRIES_NOCHECK, sd_print_sense_msg,
17585 &si, EIO, un->un_busy_timeout, NULL);
17590 sd_print_sense_msg(un, bp, &si, SD_NO_RETRY_ISSUED);
17591 sd_return_failed_command(un, bp, EIO);
17606 sd_sense_key_medium_or_hardware_error(struct sd_lun *un, uint8_t *sense_datap, argument
17612 ASSERT(un != NULL);
17613 ASSERT(mutex_owned(SD_MUTEX(un)));
17622 SD_UPDATE_ERRSTATS(un, sd_rq_media_err);
17625 SD_UPDATE_ERRSTATS(un, sd_harderrs);
17627 if ((un->un_reset_retry_count != 0) &&
17628 (xp->xb_retry_count == un->un_reset_retry_count)) {
17629 mutex_exit(SD_MUTEX(un));
17631 if (un->un_f_allow_bus_device_reset == TRUE) {
17634 if (un->un_f_lun_reset_enabled == TRUE) {
17635 SD_TRACE(SD_LOG_IO_CORE, un,
17638 reset_retval = scsi_reset(SD_ADDRESS(un),
17642 SD_TRACE(SD_LOG_IO_CORE, un,
17645 (void) scsi_reset(SD_ADDRESS(un),
17649 mutex_enter(SD_MUTEX(un));
17656 sd_retry_command(un, bp, SD_RETRIES_STANDARD, sd_print_sense_msg,
17671 sd_sense_key_illegal_request(struct sd_lun *un, struct buf *bp, argument
17676 ASSERT(un != NULL);
17677 ASSERT(mutex_owned(SD_MUTEX(un)));
17682 SD_UPDATE_ERRSTATS(un, sd_rq_illrq_err);
17688 sd_print_sense_msg(un, bp, &si, SD_NO_RETRY_ISSUED);
17689 sd_return_failed_command(un, bp, EIO);
17704 sd_sense_key_unit_attention(struct sd_lun *un, uint8_t *sense_datap, argument
17718 ASSERT(un != NULL);
17719 ASSERT(mutex_owned(SD_MUTEX(un)));
17731 SD_UPDATE_ERRSTATS(un, sd_rq_pfa_err);
17740 if ((un->un_resvd_status & SD_RESERVE) == SD_RESERVE) {
17741 un->un_resvd_status |=
17744 if (un->un_blockcount + 1 > SD_GROUP1_MAX_ADDRESS) {
17746 un, KM_NOSLEEP) == TASKQID_INVALID) {
17752 SD_ERROR(SD_LOG_ERROR, un,
17761 if (!un->un_f_has_removable_media) {
17780 SD_UPDATE_ERRSTATS(un, sd_harderrs);
17781 SD_UPDATE_ERRSTATS(un, sd_rq_nodev_err);
17783 sd_print_sense_msg(un, bp, &si, SD_NO_RETRY_ISSUED);
17784 sd_return_failed_command(un, bp, EIO);
17821 if (taskq_dispatch(sd_tq, sd_target_change_task, un,
17823 SD_ERROR(SD_LOG_ERROR, un,
17833 SD_UPDATE_ERRSTATS(un, sd_harderrs);
17834 SD_UPDATE_ERRSTATS(un, sd_rq_nodev_err);
17838 sd_retry_command(un, bp, retry_check_flag, sd_print_sense_msg, &si,
17854 sd_sense_key_fail_command(struct sd_lun *un, struct buf *bp, struct sd_xbuf *xp, argument
17859 ASSERT(un != NULL);
17860 ASSERT(mutex_owned(SD_MUTEX(un)));
17868 sd_print_sense_msg(un, bp, &si, SD_NO_RETRY_ISSUED);
17869 sd_return_failed_command(un, bp, EIO);
17884 sd_sense_key_blank_check(struct sd_lun *un, struct buf *bp, struct sd_xbuf *xp, argument
17889 ASSERT(un != NULL);
17890 ASSERT(mutex_owned(SD_MUTEX(un)));
17899 si.ssi_severity = (un->un_f_has_removable_media) ? SCSI_ERR_ALL :
17903 sd_print_sense_msg(un, bp, &si, SD_NO_RETRY_ISSUED);
17904 sd_return_failed_command(un, bp, EIO);
17919 sd_sense_key_aborted_command(struct sd_lun *un, struct buf *bp, argument
17924 ASSERT(un != NULL);
17925 ASSERT(mutex_owned(SD_MUTEX(un)));
17933 SD_UPDATE_ERRSTATS(un, sd_harderrs);
17939 sd_retry_command(un, bp, SD_RETRIES_STANDARD, sd_print_sense_msg,
17955 sd_sense_key_default(struct sd_lun *un, uint8_t *sense_datap, struct buf *bp, argument
17961 ASSERT(un != NULL);
17962 ASSERT(mutex_owned(SD_MUTEX(un)));
17967 SD_UPDATE_ERRSTATS(un, sd_harderrs);
17974 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
17981 sd_retry_command(un, bp, SD_RETRIES_STANDARD, sd_print_sense_msg,
18002 sd_print_retry_msg(struct sd_lun *un, struct buf *bp, void *arg, int flag) argument
18009 ASSERT(un != NULL);
18010 ASSERT(mutex_owned(SD_MUTEX(un)));
18017 ASSERT(!mutex_owned(&un->un_pm_mutex));
18018 mutex_enter(&un->un_pm_mutex);
18019 if ((un->un_state == SD_STATE_SUSPENDED) ||
18020 (SD_DEVICE_IS_IN_LOW_POWER(un)) ||
18022 mutex_exit(&un->un_pm_mutex);
18025 mutex_exit(&un->un_pm_mutex);
18038 if (ddi_in_panic() || (un->un_state == SD_STATE_OFFLINE) ||
18039 ((pktp->pkt_reason == un->un_last_pkt_reason) &&
18052 if (SD_FM_LOG(un) == SD_FM_LOG_NSUP) {
18053 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
18066 un->un_last_pkt_reason = pktp->pkt_reason;
18086 sd_print_cmd_incomplete_msg(struct sd_lun *un, struct buf *bp, void *arg, argument
18091 ASSERT(un != NULL);
18092 ASSERT(mutex_owned(SD_MUTEX(un)));
18098 if (un->un_state != SD_STATE_OFFLINE) {
18105 dip = un->un_sd->sd_dev;
18108 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
18111 New_state(un, SD_STATE_OFFLINE);
18119 sd_print_retry_msg(un, bp, arg, code);
18134 sd_pkt_reason_cmd_incomplete(struct sd_lun *un, struct buf *bp, argument
18139 ASSERT(un != NULL);
18140 ASSERT(mutex_owned(SD_MUTEX(un)));
18148 SD_UPDATE_ERRSTATS(un, sd_transerrs);
18149 sd_reset_target(un, pktp);
18162 SD_UPDATE_RESERVATION_STATUS(un, pktp);
18164 sd_retry_command(un, bp, flag,
18179 sd_pkt_reason_cmd_tran_err(struct sd_lun *un, struct buf *bp, argument
18182 ASSERT(un != NULL);
18183 ASSERT(mutex_owned(SD_MUTEX(un)));
18192 SD_UPDATE_ERRSTATS(un, sd_harderrs);
18196 SD_UPDATE_ERRSTATS(un, sd_transerrs);
18197 sd_reset_target(un, pktp);
18200 SD_UPDATE_RESERVATION_STATUS(un, pktp);
18202 sd_retry_command(un, bp, (SD_RETRIES_STANDARD | SD_RETRIES_ISOLATE),
18217 sd_pkt_reason_cmd_reset(struct sd_lun *un, struct buf *bp, struct sd_xbuf *xp, argument
18220 ASSERT(un != NULL);
18221 ASSERT(mutex_owned(SD_MUTEX(un)));
18227 SD_UPDATE_ERRSTATS(un, sd_transerrs);
18228 sd_reset_target(un, pktp);
18230 SD_UPDATE_RESERVATION_STATUS(un, pktp);
18239 sd_retry_command(un, bp, (SD_RETRIES_VICTIM | SD_RETRIES_ISOLATE),
18255 sd_pkt_reason_cmd_aborted(struct sd_lun *un, struct buf *bp, struct sd_xbuf *xp, argument
18258 ASSERT(un != NULL);
18259 ASSERT(mutex_owned(SD_MUTEX(un)));
18265 SD_UPDATE_ERRSTATS(un, sd_transerrs);
18266 sd_reset_target(un, pktp);
18268 SD_UPDATE_RESERVATION_STATUS(un, pktp);
18277 sd_retry_command(un, bp, (SD_RETRIES_VICTIM | SD_RETRIES_ISOLATE),
18292 sd_pkt_reason_cmd_timeout(struct sd_lun *un, struct buf *bp, struct sd_xbuf *xp, argument
18295 ASSERT(un != NULL);
18296 ASSERT(mutex_owned(SD_MUTEX(un)));
18302 SD_UPDATE_ERRSTATS(un, sd_transerrs);
18303 sd_reset_target(un, pktp);
18305 SD_UPDATE_RESERVATION_STATUS(un, pktp);
18312 sd_retry_command(un, bp,
18328 sd_pkt_reason_cmd_unx_bus_free(struct sd_lun *un, struct buf *bp, argument
18331 void (*funcp)(struct sd_lun *un, struct buf *bp, void *arg, int code);
18333 ASSERT(un != NULL);
18334 ASSERT(mutex_owned(SD_MUTEX(un)));
18339 SD_UPDATE_ERRSTATS(un, sd_harderrs);
18340 SD_UPDATE_RESERVATION_STATUS(un, pktp);
18345 sd_retry_command(un, bp, (SD_RETRIES_STANDARD | SD_RETRIES_ISOLATE),
18359 sd_pkt_reason_cmd_tag_reject(struct sd_lun *un, struct buf *bp, argument
18362 ASSERT(un != NULL);
18363 ASSERT(mutex_owned(SD_MUTEX(un)));
18368 SD_UPDATE_ERRSTATS(un, sd_harderrs);
18370 un->un_tagflags = 0;
18371 if (un->un_f_opt_queueing == TRUE) {
18372 un->un_throttle = min(un->un_throttle, 3);
18374 un->un_throttle = 1;
18376 mutex_exit(SD_MUTEX(un));
18377 (void) scsi_ifsetcap(SD_ADDRESS(un), "tagged-qing", 0, 1);
18378 mutex_enter(SD_MUTEX(un));
18380 SD_UPDATE_RESERVATION_STATUS(un, pktp);
18383 sd_retry_command(un, bp, (SD_RETRIES_NOCHECK | SD_RETRIES_ISOLATE),
18398 sd_pkt_reason_default(struct sd_lun *un, struct buf *bp, struct sd_xbuf *xp, argument
18401 ASSERT(un != NULL);
18402 ASSERT(mutex_owned(SD_MUTEX(un)));
18407 SD_UPDATE_ERRSTATS(un, sd_transerrs);
18408 sd_reset_target(un, pktp);
18410 SD_UPDATE_RESERVATION_STATUS(un, pktp);
18412 sd_retry_command(un, bp, (SD_RETRIES_STANDARD | SD_RETRIES_ISOLATE),
18427 sd_pkt_status_check_condition(struct sd_lun *un, struct buf *bp, argument
18430 ASSERT(un != NULL);
18431 ASSERT(mutex_owned(SD_MUTEX(un)));
18436 SD_TRACE(SD_LOG_IO, un, "sd_pkt_status_check_condition: "
18445 if (un->un_f_arq_enabled == FALSE) {
18446 SD_INFO(SD_LOG_IO_CORE, un, "sd_pkt_status_check_condition: "
18448 sd_send_request_sense_command(un, bp, pktp);
18450 SD_INFO(SD_LOG_IO_CORE, un, "sd_pkt_status_check_condition: "
18456 sd_retry_command(un, bp, SD_RETRIES_STANDARD, NULL, NULL, EIO,
18457 un->un_f_is_fibre?drv_usectohz(100000):(clock_t)0,
18461 SD_TRACE(SD_LOG_IO_CORE, un, "sd_pkt_status_check_condition: exit\n");
18474 sd_pkt_status_busy(struct sd_lun *un, struct buf *bp, struct sd_xbuf *xp, argument
18477 ASSERT(un != NULL);
18478 ASSERT(mutex_owned(SD_MUTEX(un)));
18483 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
18487 if (xp->xb_retry_count >= un->un_busy_retry_count) {
18488 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
18490 sd_return_failed_command(un, bp, EIO);
18491 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
18505 ((un->un_reset_retry_count < 2) ? 2 : un->un_reset_retry_count)) {
18507 mutex_exit(SD_MUTEX(un));
18508 if (un->un_f_allow_bus_device_reset == TRUE) {
18513 if (un->un_f_lun_reset_enabled == TRUE) {
18514 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
18516 rval = scsi_reset(SD_ADDRESS(un), RESET_LUN);
18519 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
18521 rval = scsi_reset(SD_ADDRESS(un), RESET_TARGET);
18529 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
18531 rval = scsi_reset(SD_ADDRESS(un), RESET_ALL);
18533 mutex_enter(SD_MUTEX(un));
18539 sd_return_failed_command(un, bp, EIO);
18540 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
18550 sd_retry_command(un, bp, SD_RETRIES_NOCHECK, NULL, NULL,
18551 EIO, un->un_busy_timeout, NULL);
18553 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
18568 sd_pkt_status_reservation_conflict(struct sd_lun *un, struct buf *bp, argument
18571 ASSERT(un != NULL);
18572 ASSERT(mutex_owned(SD_MUTEX(un)));
18582 if (un->un_reservation_type == SD_SCSI3_RESERVATION) {
18586 sd_return_failed_command(un, bp, EACCES);
18591 un->un_resvd_status |= SD_RESERVATION_CONFLICT;
18593 if ((un->un_resvd_status & SD_FAILFAST) != 0) {
18596 sd_panic_for_res_conflict(un);
18599 SD_ERROR(SD_LOG_IO, un,
18601 sd_return_failed_command(un, bp, EACCES);
18615 SD_ERROR(SD_LOG_IO, un,
18617 sd_return_failed_command(un, bp, EIO);
18627 sd_retry_command(un, bp, SD_RETRIES_STANDARD, NULL, NULL, EIO,
18650 sd_pkt_status_qfull(struct sd_lun *un, struct buf *bp, struct sd_xbuf *xp, argument
18653 ASSERT(un != NULL);
18654 ASSERT(mutex_owned(SD_MUTEX(un)));
18659 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
18666 sd_reduce_throttle(un, SD_THROTTLE_QFULL);
18667 sd_retry_command(un, bp, SD_RETRIES_NOCHECK, NULL, NULL, 0,
18670 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
18685 sd_reset_target(struct sd_lun *un, struct scsi_pkt *pktp) argument
18689 ASSERT(un != NULL);
18690 ASSERT(mutex_owned(SD_MUTEX(un)));
18693 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, "sd_reset_target: entry\n");
18700 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
18705 mutex_exit(SD_MUTEX(un));
18707 if (un->un_f_allow_bus_device_reset == TRUE) {
18708 if (un->un_f_lun_reset_enabled == TRUE) {
18709 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
18711 rval = scsi_reset(SD_ADDRESS(un), RESET_LUN);
18714 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
18716 rval = scsi_reset(SD_ADDRESS(un), RESET_TARGET);
18721 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
18723 (void) scsi_reset(SD_ADDRESS(un), RESET_ALL);
18726 mutex_enter(SD_MUTEX(un));
18728 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un, "sd_reset_target: exit\n");
18741 struct sd_lun *un = arg; local
18747 ASSERT(un != NULL);
18748 ASSERT(!mutex_owned(SD_MUTEX(un)));
18750 if ((un->un_f_blockcount_is_valid == FALSE) ||
18751 (un->un_f_tgt_blocksize_is_valid == FALSE)) {
18755 ssc = sd_ssc_init(un);
18759 SD_ERROR(SD_LOG_ERROR, un,
18765 mutex_enter(SD_MUTEX(un));
18766 if (capacity <= un->un_blockcount) {
18767 mutex_exit(SD_MUTEX(un));
18771 sd_update_block_info(un, lbasize, capacity);
18772 mutex_exit(SD_MUTEX(un));
18778 if (cmlb_efi_label_capacity(un->un_cmlbhandle, &label_cap,
18780 mutex_enter(SD_MUTEX(un));
18781 if (un->un_f_blockcount_is_valid &&
18782 un->un_blockcount > label_cap) {
18783 mutex_exit(SD_MUTEX(un));
18784 sd_log_lun_expansion_event(un, KM_SLEEP);
18786 mutex_exit(SD_MUTEX(un));
18803 sd_log_dev_status_event(struct sd_lun *un, char *esc, int km_flag) argument
18813 SD_ERROR(SD_LOG_ERROR, un,
18821 SD_ERROR(SD_LOG_ERROR, un,
18827 (void) ddi_pathname(SD_DEVINFO(un), path + n);
18843 SD_ERROR(SD_LOG_ERROR, un,
18848 err = ddi_log_sysevent(SD_DEVINFO(un), SUNW_VENDOR,
18851 SD_ERROR(SD_LOG_ERROR, un,
18870 sd_log_lun_expansion_event(struct sd_lun *un, int km_flag) argument
18872 sd_log_dev_status_event(un, ESC_DEV_DLE, km_flag);
18884 sd_log_eject_request_event(struct sd_lun *un, int km_flag) argument
18886 sd_log_dev_status_event(un, ESC_DEV_EJECT_REQUEST, km_flag);
18902 struct sd_lun *un; local
18915 un = SD_GET_UN(bp);
18916 ASSERT(un != NULL);
18917 ASSERT(!mutex_owned(SD_MUTEX(un)));
18918 ASSERT(un->un_f_monitor_media_state);
18932 if ((err = sd_handle_mchange(un)) == 0) {
18949 mutex_enter(SD_MUTEX(un));
18951 SD_UPDATE_ERRSTATS(un, sd_harderrs);
18952 SD_UPDATE_ERRSTATS(un, sd_rq_nodev_err);
18954 sd_print_sense_msg(un, bp, &si, SD_NO_RETRY_ISSUED);
18955 sd_return_failed_command(un, bp, EIO);
18957 sd_retry_command(un, bp, SD_RETRIES_UA, sd_print_sense_msg,
18960 mutex_exit(SD_MUTEX(un));
18979 sd_handle_mchange(struct sd_lun *un) argument
18986 ASSERT(!mutex_owned(SD_MUTEX(un)));
18987 ASSERT(un->un_f_monitor_media_state);
18989 ssc = sd_ssc_init(un);
18996 mutex_enter(SD_MUTEX(un));
18997 sd_update_block_info(un, lbasize, capacity);
18999 if (un->un_errstats != NULL) {
19001 (struct sd_errstats *)un->un_errstats->ks_data;
19003 ((uint64_t)un->un_blockcount *
19004 (uint64_t)un->un_tgt_blocksize);
19010 if (ISCD(un)) {
19018 mutex_exit(SD_MUTEX(un));
19019 cmlb_invalidate(un->un_cmlbhandle, (void *)SD_PATH_DIRECT_PRIORITY);
19022 if (cmlb_validate(un->un_cmlbhandle, 0,
19027 if (un->un_f_pkstats_enabled) {
19028 sd_set_pstats(un);
19029 SD_TRACE(SD_LOG_IO_PARTITION, un,
19031 "set\n", un);
19076 struct sd_lun *un; local
19079 un = ssc->ssc_un;
19080 ASSERT(un != NULL);
19081 ASSERT(!mutex_owned(SD_MUTEX(un)));
19083 SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_DOORLOCK: entry: un:0x%p\n", un);
19086 if (un->un_f_doorlock_supported == FALSE) {
19096 mutex_enter(SD_MUTEX(un));
19097 if (un->un_f_ejecting == TRUE) {
19098 mutex_exit(SD_MUTEX(un));
19101 mutex_exit(SD_MUTEX(un));
19119 SD_TRACE(SD_LOG_IO, un,
19134 un->un_f_doorlock_supported = FALSE;
19186 struct sd_lun *un; local
19190 un = ssc->ssc_un;
19191 ASSERT(un != NULL);
19192 ASSERT(!mutex_owned(SD_MUTEX(un)));
19196 SD_TRACE(SD_LOG_IO, un,
19197 "sd_send_scsi_READ_CAPACITY: entry: un:0x%p\n", un);
19306 if ((un->un_f_cfg_is_atapi == TRUE) && (ISCD(un))) {
19324 if (un->un_f_has_removable_media)
19325 capacity *= (lbasize / un->un_sys_blocksize);
19336 SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_READ_CAPACITY: "
19405 struct sd_lun *un; local
19409 un = ssc->ssc_un;
19410 ASSERT(un != NULL);
19411 ASSERT(!mutex_owned(SD_MUTEX(un)));
19415 SD_TRACE(SD_LOG_IO, un,
19416 "sd_send_scsi_READ_CAPACITY: entry: un:0x%p\n", un);
19490 un->un_thin_flags = 0;
19492 un->un_thin_flags |= SD_THIN_PROV_ENABLED;
19494 un->un_thin_flags |= SD_THIN_PROV_READ_ZEROS;
19546 if ((un->un_f_cfg_is_atapi == TRUE) && (ISCD(un))) {
19564 if (un->un_f_has_removable_media)
19565 capacity *= (lbasize / un->un_sys_blocksize);
19571 SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_READ_CAPACITY_16: "
19623 struct sd_lun *un; local
19626 un = ssc->ssc_un;
19627 ASSERT(un != NULL);
19628 ASSERT(!mutex_owned(SD_MUTEX(un)));
19630 SD_TRACE(SD_LOG_IO, un,
19631 "sd_send_scsi_START_STOP_UNIT: entry: un:0x%p\n", un);
19633 if (un->un_f_check_start_stop &&
19636 (un->un_f_start_stop_supported != TRUE)) {
19646 mutex_enter(SD_MUTEX(un));
19647 if (un->un_f_ejecting == TRUE) {
19648 mutex_exit(SD_MUTEX(un));
19651 mutex_exit(SD_MUTEX(un));
19710 SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_START_STOP_UNIT: exit\n");
19730 struct sd_lun *un = arg; local
19731 ASSERT(un != NULL);
19732 ASSERT(!mutex_owned(SD_MUTEX(un)));
19734 SD_TRACE(SD_LOG_IO, un, "sd_start_stop_unit_callback: entry\n");
19736 (void) taskq_dispatch(sd_tq, sd_start_stop_unit_task, un, KM_NOSLEEP);
19753 struct sd_lun *un = arg; local
19758 ASSERT(un != NULL);
19759 ASSERT(!mutex_owned(SD_MUTEX(un)));
19761 SD_TRACE(SD_LOG_IO, un, "sd_start_stop_unit_task: entry\n");
19767 mutex_enter(SD_MUTEX(un));
19768 if (un->un_f_format_in_progress == TRUE) {
19769 mutex_exit(SD_MUTEX(un));
19772 mutex_exit(SD_MUTEX(un));
19774 ssc = sd_ssc_init(un);
19785 if (un->un_f_power_condition_supported) {
19786 mutex_enter(SD_MUTEX(un));
19787 ASSERT(SD_PM_IS_LEVEL_VALID(un, un->un_power_level));
19788 power_level = sd_pwr_pc.ran_perf[un->un_power_level]
19789 > 0 ? un->un_power_level : SD_SPINDLE_ACTIVE;
19790 mutex_exit(SD_MUTEX(un));
19824 mutex_enter(SD_MUTEX(un));
19825 SD_TRACE(SD_LOG_IO_CORE | SD_LOG_ERROR, un,
19827 un, un->un_retry_bp);
19828 un->un_startstop_timeid = NULL; /* Timeout is no longer pending */
19829 sd_start_cmds(un, un->un_retry_bp);
19830 mutex_exit(SD_MUTEX(un));
19832 SD_TRACE(SD_LOG_IO, un, "sd_start_stop_unit_task: exit\n");
19862 struct sd_lun *un; local
19865 un = ssc->ssc_un;
19866 ASSERT(un != NULL);
19867 ASSERT(!mutex_owned(SD_MUTEX(un)));
19870 SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_INQUIRY: entry: un:0x%p\n", un);
19904 SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_INQUIRY: exit\n");
19944 struct sd_lun *un; local
19947 un = ssc->ssc_un;
19948 ASSERT(un != NULL);
19949 ASSERT(!mutex_owned(SD_MUTEX(un)));
19951 SD_TRACE(SD_LOG_IO, un,
19952 "sd_send_scsi_TEST_UNIT_READY: entry: un:0x%p\n", un);
19964 if (un->un_f_cfg_tur_check == TRUE) {
19965 mutex_enter(SD_MUTEX(un));
19966 if (un->un_ncmds_in_transport != 0) {
19967 mutex_exit(SD_MUTEX(un));
19970 mutex_exit(SD_MUTEX(un));
20025 SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_TEST_UNIT_READY: exit\n");
20055 struct sd_lun *un; local
20058 un = ssc->ssc_un;
20059 ASSERT(un != NULL);
20060 ASSERT(!mutex_owned(SD_MUTEX(un)));
20063 SD_TRACE(SD_LOG_IO, un,
20064 "sd_send_scsi_PERSISTENT_RESERVE_IN: entry: un:0x%p\n", un);
20118 SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_PERSISTENT_RESERVE_IN: exit\n");
20163 struct sd_lun *un; local
20166 un = ssc->ssc_un;
20167 ASSERT(un != NULL);
20168 ASSERT(!mutex_owned(SD_MUTEX(un)));
20171 SD_TRACE(SD_LOG_IO, un,
20172 "sd_send_scsi_PERSISTENT_RESERVE_OUT: entry: un:0x%p\n", un);
20275 SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_PERSISTENT_RESERVE_OUT: exit\n");
20317 sd_send_scsi_SYNCHRONIZE_CACHE(struct sd_lun *un, struct dk_callback *dkc) argument
20326 SD_TRACE(SD_LOG_IO, un,
20327 "sd_send_scsi_SYNCHRONIZE_CACHE: entry: un:0x%p\n", un);
20329 ASSERT(un != NULL);
20330 ASSERT(!mutex_owned(SD_MUTEX(un)));
20338 mutex_enter(SD_MUTEX(un));
20340 if (un->un_f_suppress_cache_flush == TRUE) {
20341 mutex_exit(SD_MUTEX(un));
20346 SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_SYNCHRONIZE_CACHE: \
20348 un->un_f_suppress_cache_flush);
20356 mutex_exit(SD_MUTEX(un));
20365 mutex_enter(SD_MUTEX(un));
20366 if (dkc != NULL && un->un_f_sync_nv_supported &&
20374 mutex_exit(SD_MUTEX(un));
20418 bp->b_edev = SD_GET_DEV(un);
20424 mutex_enter(SD_MUTEX(un));
20425 un->un_f_sync_cache_required = FALSE;
20426 mutex_exit(SD_MUTEX(un));
20453 struct sd_lun *un; local
20466 un = ddi_get_soft_state(sd_state, SD_GET_INSTANCE_FROM_BUF(bp));
20467 ASSERT(un != NULL);
20488 mutex_enter(SD_MUTEX(un));
20489 un->un_f_sync_nv_supported = FALSE;
20490 mutex_exit(SD_MUTEX(un));
20492 SD_TRACE(SD_LOG_IO, un,
20498 mutex_enter(SD_MUTEX(un));
20499 un->un_f_sync_cache_supported = FALSE;
20500 mutex_exit(SD_MUTEX(un));
20501 SD_TRACE(SD_LOG_IO, un,
20520 mutex_enter(SD_MUTEX(un));
20521 un->un_f_sync_cache_required = TRUE;
20522 mutex_exit(SD_MUTEX(un));
20528 if (!un->un_f_has_removable_media) {
20529 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
20558 struct sd_lun *un = ssc->ssc_un; local
20584 ucmd_buf.uscsi_timeout = un->un_cmd_timeout;
20593 if (un->un_unmapstats) {
20594 atomic_inc_64(&un->un_unmapstats->us_cmds.value.ui64);
20595 atomic_add_64(&un->un_unmapstats->us_extents.value.ui64,
20597 atomic_add_64(&un->un_unmapstats->us_bytes.value.ui64,
20602 if (un->un_unmapstats)
20603 atomic_inc_64(&un->un_unmapstats->us_errs.value.ui64);
20613 if (un->un_unmapstats)
20614 atomic_inc_64(&un->un_unmapstats->us_errs.value.ui64);
20643 struct sd_lun *un = ssc->ssc_un; local
20645 sd_blk_limits_t *lim = &un->un_blk_lim;
20657 rval = cmlb_partinfo(un->un_cmlbhandle, partition, &part_len_sysblks,
20664 ASSERT(un->un_blk_lim.lim_max_unmap_lba_cnt != 0);
20665 ASSERT(un->un_blk_lim.lim_max_unmap_descr_cnt != 0);
20668 (uint64_t)lim->lim_max_unmap_lba_cnt * un->un_tgt_blocksize :
20686 bytes_issued), SD_TGTBLOCKS2BYTES(un, UINT32_MAX));
20703 ubd->ubd_lba = BE_64(SD_BYTES2TGTBLOCKS(un,
20705 ubd->ubd_lba_cnt = BE_32(SD_BYTES2TGTBLOCKS(un, len));
20749 struct sd_lun *un = ssc->ssc_un; local
20752 ASSERT(!mutex_owned(SD_MUTEX(un)));
20756 if (!(un->un_thin_flags & SD_THIN_PROV_ENABLED) ||
20757 un->un_blk_lim.lim_max_unmap_descr_cnt == 0 ||
20758 un->un_blk_lim.lim_max_unmap_lba_cnt == 0) {
20810 struct sd_lun *un; local
20813 un = ssc->ssc_un;
20814 ASSERT(un != NULL);
20815 ASSERT(!mutex_owned(SD_MUTEX(un)));
20820 SD_TRACE(SD_LOG_IO, un,
20821 "sd_send_scsi_GET_CONFIGURATION: entry: un:0x%p\n", un);
20864 SD_DUMP_MEMORY(un, SD_LOG_IO,
20869 SD_TRACE(SD_LOG_IO, un,
20902 struct sd_lun *un; local
20905 un = ssc->ssc_un;
20906 ASSERT(un != NULL);
20907 ASSERT(!mutex_owned(SD_MUTEX(un)));
20912 SD_TRACE(SD_LOG_IO, un,
20913 "sd_send_scsi_feature_GET_CONFIGURATION: entry: un:0x%p\n", un);
20957 SD_DUMP_MEMORY(un, SD_LOG_IO,
20962 SD_TRACE(SD_LOG_IO, un,
21004 struct sd_lun *un; local
21007 un = ssc->ssc_un;
21008 ASSERT(un != NULL);
21009 ASSERT(!mutex_owned(SD_MUTEX(un)));
21014 SD_TRACE(SD_LOG_IO, un,
21015 "sd_send_scsi_MODE_SENSE: entry: un:0x%p\n", un);
21035 SD_FILL_SCSI1_LUN_CDB(un, &cdb);
21078 SD_DUMP_MEMORY(un, SD_LOG_IO, "sd_send_scsi_MODE_SENSE: data",
21081 SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_MODE_SENSE: exit\n");
21121 struct sd_lun *un; local
21124 un = ssc->ssc_un;
21125 ASSERT(un != NULL);
21126 ASSERT(!mutex_owned(SD_MUTEX(un)));
21131 SD_TRACE(SD_LOG_IO, un,
21132 "sd_send_scsi_MODE_SELECT: entry: un:0x%p\n", un);
21154 SD_FILL_SCSI1_LUN_CDB(un, &cdb);
21186 SD_DUMP_MEMORY(un, SD_LOG_IO, "sd_send_scsi_MODE_SELECT: data",
21189 SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_MODE_SELECT: exit\n");
21231 struct sd_lun *un; local
21234 un = ssc->ssc_un;
21235 ASSERT(un != NULL);
21236 ASSERT(!mutex_owned(SD_MUTEX(un)));
21240 SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_RDWR: entry: un:0x%p\n", un);
21242 if (un->un_f_tgt_blocksize_is_valid != TRUE) {
21246 mutex_enter(SD_MUTEX(un));
21247 block_count = SD_BYTES2TGTBLOCKS(un, buflen);
21248 mutex_exit(SD_MUTEX(un));
21252 SD_INFO(SD_LOG_IO, un, "sd_send_scsi_RDWR: "
21264 (un->un_f_cfg_is_atapi == TRUE))
21292 SD_FILL_SCSI1_LUN_CDB(un, &cdb);
21323 SD_DUMP_MEMORY(un, SD_LOG_IO, "sd_send_scsi_RDWR: data",
21327 SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_RDWR: exit\n");
21355 struct sd_lun *un; local
21358 un = ssc->ssc_un;
21359 ASSERT(un != NULL);
21360 ASSERT(!mutex_owned(SD_MUTEX(un)));
21362 SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_LOG_SENSE: entry: un:0x%p\n", un);
21421 mutex_enter(SD_MUTEX(un));
21422 un->un_start_stop_cycle_page =
21426 un->un_start_stop_cycle_page;
21427 mutex_exit(SD_MUTEX(un));
21452 SD_DUMP_MEMORY(un, SD_LOG_IO, "sd_send_scsi_LOG_SENSE: data",
21456 SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_LOG_SENSE: exit\n");
21486 struct sd_lun *un; local
21489 un = ssc->ssc_un;
21490 ASSERT(un != NULL);
21491 ASSERT(!mutex_owned(SD_MUTEX(un)));
21494 SD_TRACE(SD_LOG_IO, un,
21495 "sd_send_scsi_GET_EVENT_STATUS_NOTIFICATION: entry: un:0x%p\n", un);
21530 SD_TRACE(SD_LOG_IO, un,
21577 struct sd_lun *un = NULL; local
21589 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
21593 ASSERT(!mutex_owned(SD_MUTEX(un)));
21596 ssc = sd_ssc_init(un);
21598 is_valid = SD_IS_VALID_LABEL(un);
21606 mutex_enter(SD_MUTEX(un));
21607 while ((un->un_state == SD_STATE_SUSPENDED) ||
21608 (un->un_state == SD_STATE_PM_CHANGING)) {
21609 cv_wait(&un->un_suspend_cv, SD_MUTEX(un));
21619 un->un_ncmds_in_driver++;
21667 if (!ISCD(un)) {
21668 un->un_ncmds_in_driver--;
21669 ASSERT(un->un_ncmds_in_driver >= 0);
21670 mutex_exit(SD_MUTEX(un));
21678 if (!un->un_f_eject_media_supported) {
21679 un->un_ncmds_in_driver--;
21680 ASSERT(un->un_ncmds_in_driver >= 0);
21681 mutex_exit(SD_MUTEX(un));
21687 mutex_exit(SD_MUTEX(un));
21690 mutex_enter(SD_MUTEX(un));
21691 un->un_ncmds_in_driver--;
21692 ASSERT(un->un_ncmds_in_driver >= 0);
21693 mutex_exit(SD_MUTEX(un));
21697 mutex_enter(SD_MUTEX(un));
21725 mutex_exit(SD_MUTEX(un));
21727 mutex_enter(SD_MUTEX(un));
21741 if (un->un_f_has_removable_media) {
21751 un->un_ncmds_in_driver--;
21752 ASSERT(un->un_ncmds_in_driver >= 0);
21753 mutex_exit(SD_MUTEX(un));
21761 mutex_exit(SD_MUTEX(un));
21765 SD_TRACE(SD_LOG_IOCTL, un, "DKIOCINFO\n");
21770 SD_TRACE(SD_LOG_IOCTL, un, "DKIOCGMEDIAINFO\n");
21775 SD_TRACE(SD_LOG_IOCTL, un, "DKIOCGMEDIAINFOEXT\n");
21799 SD_TRACE(SD_LOG_IOCTL, un, "DKIOC %d\n", cmd);
21803 if (un->un_f_has_removable_media)
21813 err = cmlb_ioctl(un->un_cmlbhandle, dev,
21818 ((un->un_f_pkstats_enabled) &&
21822 tmprval = cmlb_validate(un->un_cmlbhandle, CMLB_SILENT,
21824 if ((tmprval == 0) && un->un_f_pkstats_enabled) {
21825 sd_set_pstats(un);
21826 SD_TRACE(SD_LOG_IO_PARTITION, un,
21828 "set\n", un);
21835 mutex_enter(SD_MUTEX(un));
21836 if (un->un_f_devid_supported &&
21837 (un->un_f_opt_fab_devid == TRUE)) {
21838 if (un->un_devid == NULL) {
21839 sd_register_devid(ssc, SD_DEVINFO(un),
21850 ddi_devid_free(un->un_devid);
21851 un->un_devid = NULL;
21855 mutex_exit(SD_MUTEX(un));
21861 SD_TRACE(SD_LOG_IOCTL, un, "DKIOCLOCK\n");
21867 SD_TRACE(SD_LOG_IOCTL, un, "DKIOCUNLOCK\n");
21874 SD_TRACE(SD_LOG_IOCTL, un, "DKIOCSTATE\n");
21881 if (ddi_copyout(&un->un_mediastate, (void *)arg,
21890 SD_TRACE(SD_LOG_IOCTL, un, "DKIOCREMOVABLE\n");
21891 i = un->un_f_has_removable_media ? 1 : 0;
21900 SD_TRACE(SD_LOG_IOCTL, un, "DKIOCSOLIDSTATE\n");
21901 i = un->un_f_is_solid_state ? 1 : 0;
21910 SD_TRACE(SD_LOG_IOCTL, un, "DKIOCHOTPLUGGABLE\n");
21911 i = un->un_f_is_hotpluggable ? 1 : 0;
21920 SD_TRACE(SD_LOG_IOCTL, un, "DKIOCREADONLY\n");
21922 if ((ISCD(un) && !un->un_f_mmc_writable_media) ||
21934 SD_TRACE(SD_LOG_IOCTL, un, "DKIOCGTEMPERATURE\n");
21939 SD_TRACE(SD_LOG_IOCTL, un, "MHIOCENFAILFAST\n");
21946 SD_TRACE(SD_LOG_IOCTL, un, "MHIOCTKOWN\n");
21953 SD_TRACE(SD_LOG_IOCTL, un, "MHIOCRELEASE\n");
21960 SD_TRACE(SD_LOG_IOCTL, un, "MHIOCSTATUS\n");
21979 SD_TRACE(SD_LOG_IOCTL, un, "MHIOCQRESERVE\n");
21986 SD_TRACE(SD_LOG_IOCTL, un, "MHIOCREREGISTERDEVID\n");
21989 } else if (!un->un_f_devid_supported) {
21997 SD_TRACE(SD_LOG_IOCTL, un, "MHIOCGRP_INKEYS\n");
22000 if (un->un_reservation_type == SD_SCSI2_RESERVATION) {
22010 SD_TRACE(SD_LOG_IOCTL, un, "MHIOCGRP_INRESV\n");
22013 if (un->un_reservation_type == SD_SCSI2_RESERVATION) {
22022 SD_TRACE(SD_LOG_IOCTL, un, "MHIOCGRP_REGISTER\n");
22024 if (un->un_reservation_type == SD_SCSI2_RESERVATION) {
22044 SD_TRACE(SD_LOG_IOCTL, un, "MHIOCGRP_CLEAR\n");
22046 if (un->un_reservation_type == SD_SCSI2_RESERVATION) {
22066 SD_TRACE(SD_LOG_IOCTL, un, "MHIOCGRP_RESERVE\n");
22068 if (un->un_reservation_type == SD_SCSI2_RESERVATION) {
22088 SD_TRACE(SD_LOG_IOCTL, un, "MHIOCGRP_PREEMPTANDABORT\n");
22090 if (un->un_reservation_type == SD_SCSI2_RESERVATION) {
22111 SD_TRACE(SD_LOG_IOCTL, un, "MHIOCGRP_REGISTERANDIGNOREKEY\n");
22113 if (un->un_reservation_type == SD_SCSI2_RESERVATION) {
22134 SD_TRACE(SD_LOG_IOCTL, un, "USCSICMD\n");
22143 if (un->un_f_format_in_progress == TRUE) {
22159 SD_TRACE(SD_LOG_IOCTL, un, "USCSIMAXXFER\n");
22164 const uscsi_xfer_t xfer = un->un_max_xfer_size;
22177 SD_TRACE(SD_LOG_IOCTL, un, "PAUSE-RESUME\n");
22178 if (!ISCD(un)) {
22186 SD_TRACE(SD_LOG_IOCTL, un, "CDROMPLAYMSF\n");
22187 if (!ISCD(un)) {
22195 SD_TRACE(SD_LOG_IOCTL, un, "CDROMPLAYTRKIND\n");
22200 if (!ISCD(un) || (un->un_f_cfg_is_atapi == TRUE)) {
22202 if (!ISCD(un)) {
22211 SD_TRACE(SD_LOG_IOCTL, un, "CDROMREADTOCHDR\n");
22212 if (!ISCD(un)) {
22220 SD_TRACE(SD_LOG_IOCTL, un, "CDROMREADTOCENTRY\n");
22221 if (!ISCD(un)) {
22229 SD_TRACE(SD_LOG_IOCTL, un, "CDROMSTOP\n");
22230 if (!ISCD(un)) {
22240 SD_TRACE(SD_LOG_IOCTL, un, "CDROMSTART\n");
22241 if (!ISCD(un)) {
22251 SD_TRACE(SD_LOG_IOCTL, un, "CDROMCLOSETRAY\n");
22252 if (!ISCD(un)) {
22264 SD_TRACE(SD_LOG_IOCTL, un, "EJECT\n");
22265 if (!un->un_f_eject_media_supported) {
22273 SD_TRACE(SD_LOG_IOCTL, un, "CDROMVOLCTRL\n");
22274 if (!ISCD(un)) {
22282 SD_TRACE(SD_LOG_IOCTL, un, "CDROMSUBCHNL\n");
22283 if (!ISCD(un)) {
22291 SD_TRACE(SD_LOG_IOCTL, un, "CDROMREADMODE2\n");
22292 if (!ISCD(un)) {
22294 } else if (un->un_f_cfg_is_atapi == TRUE) {
22307 SD_TRACE(SD_LOG_IOCTL, un, "CDROMREADMODE1\n");
22308 if (!ISCD(un)) {
22316 SD_TRACE(SD_LOG_IOCTL, un, "CDROMREADOFFSET\n");
22317 if (!ISCD(un)) {
22326 SD_TRACE(SD_LOG_IOCTL, un, "CDROMSBLKMODE\n");
22331 if (!ISCD(un) || (un->un_f_cfg_is_atapi == TRUE)) {
22333 } else if (un->un_f_mmc_cap == TRUE) {
22345 mutex_enter(SD_MUTEX(un));
22346 if ((!(un->un_exclopen & (1<<SDPART(dev)))) ||
22347 (un->un_ncmds_in_transport > 0)) {
22348 mutex_exit(SD_MUTEX(un));
22351 mutex_exit(SD_MUTEX(un));
22358 SD_TRACE(SD_LOG_IOCTL, un, "CDROMGBLKMODE\n");
22359 if (!ISCD(un)) {
22361 } else if ((un->un_f_cfg_is_atapi != FALSE) &&
22362 (un->un_f_blockcount_is_valid != FALSE)) {
22369 if (ddi_copyout(&un->un_tgt_blocksize, (void *)arg,
22387 SD_TRACE(SD_LOG_IOCTL, un, "CDROMXDRVSPEED\n");
22388 if (!ISCD(un)) {
22390 } else if (un->un_f_mmc_cap == TRUE) {
22419 } else if (un->un_f_cfg_is_atapi == TRUE) {
22427 SD_TRACE(SD_LOG_IOCTL, un, "CDROMCDDA\n");
22428 if (!ISCD(un)) {
22436 SD_TRACE(SD_LOG_IOCTL, un, "CDROMCDXA\n");
22437 if (!ISCD(un)) {
22445 SD_TRACE(SD_LOG_IOCTL, un, "CDROMSUBCODE\n");
22446 if (!ISCD(un)) {
22462 SD_INFO(SD_LOG_IOCTL, un, "sdioctl: DKIOCRESET: "
22464 if (scsi_reset(SD_ADDRESS(un), reset_level)) {
22474 SD_INFO(SD_LOG_IOCTL, un, "sdioctl: DKIOCABORT:\n");
22475 if (scsi_abort(SD_ADDRESS(un), NULL)) {
22494 SD_INFO(SD_LOG_SDTEST, un, "sdioctl:"
22497 sd_faultinjection_ioctl(cmd, arg, un);
22507 mutex_enter(SD_MUTEX(un));
22508 if (!un->un_f_sync_cache_supported ||
22509 !un->un_f_write_cache_enabled) {
22510 err = un->un_f_sync_cache_supported ?
22512 mutex_exit(SD_MUTEX(un));
22526 mutex_exit(SD_MUTEX(un));
22531 err = sd_send_scsi_SYNCHRONIZE_CACHE(un, dkc);
22534 err = sd_send_scsi_SYNCHRONIZE_CACHE(un, NULL);
22556 SD_TRACE(SD_LOG_IOCTL, un, "DKIOC_CANFREE\n");
22557 i = (un->un_thin_flags & SD_THIN_PROV_ENABLED) ? 1 : 0;
22584 if (!un->un_f_cache_mode_changeable) {
22599 mutex_enter(SD_MUTEX(un));
22605 if (un->un_f_opt_disable_cache && wce) {
22606 mutex_exit(SD_MUTEX(un));
22615 while (un->un_f_wcc_inprog)
22616 cv_wait(&un->un_wcc_cv, SD_MUTEX(un));
22618 un->un_f_wcc_inprog = 1;
22620 mutex_exit(SD_MUTEX(un));
22626 mutex_enter(SD_MUTEX(un));
22627 un->un_f_wcc_inprog = 0;
22628 cv_broadcast(&un->un_wcc_cv);
22629 mutex_exit(SD_MUTEX(un));
22633 mutex_enter(SD_MUTEX(un));
22634 un->un_f_write_cache_enabled = (cur_wce != 0);
22636 if (un->un_f_write_cache_enabled && wce == 0) {
22642 sync_supported = un->un_f_sync_cache_supported;
22650 if (!un->un_f_suppress_cache_flush) {
22651 mutex_exit(SD_MUTEX(un));
22656 err = sd_send_scsi_SYNCHRONIZE_CACHE(un,
22660 mutex_exit(SD_MUTEX(un));
22663 mutex_enter(SD_MUTEX(un));
22665 un->un_f_write_cache_enabled = 0;
22668 } else if (!un->un_f_write_cache_enabled && wce != 0) {
22674 un->un_f_write_cache_enabled = 1;
22682 if (!un->un_f_suppress_cache_flush) {
22683 mutex_exit(SD_MUTEX(un));
22687 mutex_exit(SD_MUTEX(un));
22690 mutex_enter(SD_MUTEX(un));
22693 un->un_f_write_cache_enabled = 0;
22697 un->un_f_wcc_inprog = 0;
22698 cv_broadcast(&un->un_wcc_cv);
22699 mutex_exit(SD_MUTEX(un));
22707 mutex_enter(SD_MUTEX(un));
22708 un->un_ncmds_in_driver--;
22709 ASSERT(un->un_ncmds_in_driver >= 0);
22710 mutex_exit(SD_MUTEX(un));
22716 SD_TRACE(SD_LOG_IOCTL, un, "sdioctl: exit: %d\n", err);
22720 mutex_enter(SD_MUTEX(un));
22721 un->un_ncmds_in_driver--;
22722 ASSERT(un->un_ncmds_in_driver >= 0);
22723 mutex_exit(SD_MUTEX(un));
22731 SD_TRACE(SD_LOG_IOCTL, un, "sdioctl: exit: %d\n", err);
22756 struct sd_lun *un = NULL; local
22761 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
22768 switch (un->un_ctype) {
22776 pdip = ddi_get_parent(SD_DEVINFO(un));
22785 lun = ddi_prop_get_int(DDI_DEV_T_ANY, SD_DEVINFO(un),
22787 tgt = ddi_prop_get_int(DDI_DEV_T_ANY, SD_DEVINFO(un),
22791 info->dki_unit = ddi_get_instance(SD_DEVINFO(un));
22793 (void) strncpy(info->dki_dname, ddi_driver_name(SD_DEVINFO(un)),
22799 info->dki_maxtransfer = un->un_max_xfer_size / un->un_sys_blocksize;
22836 struct sd_lun *un = NULL; local
22849 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL ||
22850 (un->un_state == SD_STATE_OFFLINE)) {
22854 SD_TRACE(SD_LOG_IOCTL_DKIO, un, "sd_get_media_info_com: entry\n");
22858 ssc = sd_ssc_init(un);
22869 if (ISCD(un)) {
22873 if (un->un_f_mmc_cap == TRUE) {
22913 sinq = un->un_sd->sd_inq;
22941 if (dki_pbsize && un->un_f_descr_format_supported) {
22949 pbsize = MAX(pbsize, un->un_phy_blocksize);
22953 !un->un_f_descr_format_supported) {
22959 if (un->un_f_enable_rmw &&
22960 un->un_phy_blocksize != 0) {
22961 pbsize = un->un_phy_blocksize;
22972 if (un->un_f_has_removable_media) {
22973 media_capacity *= un->un_sys_blocksize;
22985 if (un->un_f_enable_rmw &&
22998 mutex_enter(SD_MUTEX(un));
22999 if ((un->un_f_blockcount_is_valid == TRUE) &&
23000 (un->un_f_tgt_blocksize_is_valid == TRUE) &&
23001 (capacity > un->un_blockcount)) {
23002 un->un_f_expnevent = B_FALSE;
23003 sd_update_block_info(un, lbasize, capacity);
23005 mutex_exit(SD_MUTEX(un));
23113 sd_watch_request_submit(struct sd_lun *un) argument
23118 dev = sd_make_device(SD_DEVINFO(un));
23120 if (un->un_f_mmc_cap && un->un_f_mmc_gesn_polling) {
23121 return (scsi_mmc_watch_request_submit(SD_SCSI_DEVP(un),
23125 return (scsi_watch_request_submit(SD_SCSI_DEVP(un),
23158 struct sd_lun *un = NULL; local
23164 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
23168 SD_TRACE(SD_LOG_COMMON, un, "sd_check_media: entry\n");
23170 ssc = sd_ssc_init(un);
23172 mutex_enter(SD_MUTEX(un));
23174 SD_TRACE(SD_LOG_COMMON, un, "sd_check_media: "
23175 "state=%x, mediastate=%x\n", state, un->un_mediastate);
23177 prev_state = un->un_mediastate;
23180 if (state == un->un_mediastate || un->un_mediastate == DKIO_NONE) {
23185 mutex_exit(SD_MUTEX(un));
23194 if (sd_pm_entry(un) != DDI_SUCCESS) {
23195 mutex_enter(SD_MUTEX(un));
23199 token = sd_watch_request_submit(un);
23201 sd_pm_exit(un);
23203 mutex_enter(SD_MUTEX(un));
23218 un->un_ncmds_in_driver--;
23219 ASSERT(un->un_ncmds_in_driver >= 0);
23225 un->un_swr_token = token;
23226 un->un_specified_mediastate = state;
23234 SD_TRACE(SD_LOG_COMMON, un,
23236 while (un->un_mediastate == state) {
23237 if (cv_wait_sig(&un->un_state_cv, SD_MUTEX(un)) == 0) {
23238 SD_TRACE(SD_LOG_COMMON, un,
23241 un->un_ncmds_in_driver++;
23245 SD_TRACE(SD_LOG_COMMON, un,
23247 un->un_mediastate);
23253 un->un_ncmds_in_driver++;
23257 if (prev_state == DKIO_INSERTED && un->un_mediastate == DKIO_EJECTED) {
23258 sr_ejected(un);
23261 if (un->un_mediastate == DKIO_INSERTED && prev_state != DKIO_INSERTED) {
23265 SD_TRACE(SD_LOG_COMMON, un, "sd_check_media: media inserted\n");
23266 mutex_exit(SD_MUTEX(un));
23273 if (sd_pm_entry(un) == DDI_SUCCESS) {
23277 sd_pm_exit(un);
23283 mutex_enter(SD_MUTEX(un));
23288 mutex_enter(SD_MUTEX(un));
23291 mutex_enter(SD_MUTEX(un));
23293 sd_update_block_info(un, lbasize, capacity);
23298 if (ISCD(un)) {
23302 mutex_exit(SD_MUTEX(un));
23303 cmlb_invalidate(un->un_cmlbhandle, (void *)SD_PATH_DIRECT);
23304 if ((cmlb_validate(un->un_cmlbhandle, 0,
23305 (void *)SD_PATH_DIRECT) == 0) && un->un_f_pkstats_enabled) {
23306 sd_set_pstats(un);
23307 SD_TRACE(SD_LOG_IO_PARTITION, un,
23309 "set\n", un);
23315 sd_pm_exit(un);
23324 mutex_enter(SD_MUTEX(un));
23328 un->un_f_watcht_stopped = FALSE;
23329 if (token != NULL && un->un_swr_token != NULL) {
23335 token = un->un_swr_token;
23336 mutex_exit(SD_MUTEX(un));
23340 mutex_enter(SD_MUTEX(un));
23341 un->un_swr_token = (opaque_t)NULL;
23343 mutex_enter(SD_MUTEX(un));
23352 if (un->un_errstats) {
23355 stp = (struct sd_errstats *)un->un_errstats->ks_data;
23357 (un->un_f_blockcount_is_valid == TRUE)) {
23359 (uint64_t)((uint64_t)un->un_blockcount *
23360 un->un_sys_blocksize);
23363 mutex_exit(SD_MUTEX(un));
23364 SD_TRACE(SD_LOG_COMMON, un, "sd_check_media: done\n");
23381 struct sd_lun *un = arg; local
23383 SD_TRACE(SD_LOG_COMMON, un, "sd_delayed_cv_broadcast\n");
23385 mutex_enter(SD_MUTEX(un));
23386 un->un_dcvb_timeid = NULL;
23387 cv_broadcast(&un->un_state_cv);
23388 mutex_exit(SD_MUTEX(un));
23411 struct sd_lun *un; local
23419 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
23424 mutex_enter(SD_MUTEX(un));
23425 SD_TRACE(SD_LOG_COMMON, un,
23430 un->un_mediastate = DKIO_DEV_GONE;
23431 cv_broadcast(&un->un_state_cv);
23432 mutex_exit(SD_MUTEX(un));
23437 if (un->un_f_mmc_cap && un->un_f_mmc_gesn_polling) {
23447 sd_log_eject_request_event(un, KM_NOSLEEP);
23460 SD_INFO(SD_LOG_COMMON, un,
23514 mutex_exit(SD_MUTEX(un));
23524 SD_TRACE(SD_LOG_COMMON, un,
23526 state, un->un_specified_mediastate);
23533 if (state != un->un_specified_mediastate) {
23534 un->un_mediastate = state;
23540 SD_TRACE(SD_LOG_COMMON, un,
23542 if (un->un_dcvb_timeid == NULL) {
23543 un->un_dcvb_timeid =
23544 timeout(sd_delayed_cv_broadcast, un,
23548 SD_TRACE(SD_LOG_COMMON, un,
23550 cv_broadcast(&un->un_state_cv);
23553 mutex_exit(SD_MUTEX(un));
23578 struct sd_lun *un = NULL; local
23585 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
23589 ssc = sd_ssc_init(un);
23609 ASSERT(!mutex_owned(&un->un_pm_mutex));
23610 mutex_enter(&un->un_pm_mutex);
23611 if (SD_DEVICE_IS_IN_LOW_POWER(un)) {
23617 mutex_exit(&un->un_pm_mutex);
23628 mutex_exit(&un->un_pm_mutex);
23629 if (sd_pm_entry(un) != DDI_SUCCESS) {
23685 sd_pm_exit(un);
23722 struct sd_lun *un; local
23725 un = ssc->ssc_un;
23726 ASSERT(un != NULL);
23758 SD_ERROR(SD_LOG_COMMON, un,
23800 struct sd_lun *un = NULL; local
23804 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
23812 mutex_enter(SD_MUTEX(un));
23813 un->un_resvd_status |= SD_FAILFAST;
23814 mutex_exit(SD_MUTEX(un));
23824 mutex_enter(SD_MUTEX(un));
23825 un->un_resvd_status &= ~SD_FAILFAST;
23826 mutex_exit(SD_MUTEX(un));
23853 struct sd_lun *un = NULL; local
23857 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
23872 mutex_enter(SD_MUTEX(un));
23874 un->un_resvd_status |= SD_RESERVE;
23885 if ((un->un_resvd_status & SD_FAILFAST) == 0) {
23886 mutex_exit(SD_MUTEX(un));
23889 SD_TRACE(SD_LOG_IOCTL_MHD, un,
23893 mutex_exit(SD_MUTEX(un));
23895 (void) scsi_reset_notify(SD_ADDRESS(un), SCSI_RESET_NOTIFY,
23896 sd_mhd_reset_notify_cb, (caddr_t)un);
23898 un->un_resvd_status &= ~SD_RESERVE;
23899 mutex_exit(SD_MUTEX(un));
23926 struct sd_lun *un = NULL; local
23931 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
23935 mutex_enter(SD_MUTEX(un));
23936 resvd_status_save = un->un_resvd_status;
23937 un->un_resvd_status &=
23939 if (un->un_resvd_timeid) {
23940 resvd_timeid_save = un->un_resvd_timeid;
23941 un->un_resvd_timeid = NULL;
23942 mutex_exit(SD_MUTEX(un));
23945 mutex_exit(SD_MUTEX(un));
23955 mutex_enter(SD_MUTEX(un));
23956 if ((un->un_mhd_token) &&
23957 ((un->un_resvd_status & SD_FAILFAST) == 0)) {
23958 mutex_exit(SD_MUTEX(un));
23961 mutex_exit(SD_MUTEX(un));
23963 (void) scsi_reset_notify(SD_ADDRESS(un), SCSI_RESET_CANCEL,
23964 sd_mhd_reset_notify_cb, (caddr_t)un);
23969 mutex_enter(SD_MUTEX(un));
23970 un->un_resvd_status = resvd_status_save;
23971 mutex_exit(SD_MUTEX(un));
23996 struct sd_lun *un = NULL; local
24000 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
24004 ASSERT(!mutex_owned(SD_MUTEX(un)));
24006 mutex_enter(SD_MUTEX(un));
24009 if (un->un_devid != NULL) {
24010 ddi_devid_unregister(SD_DEVINFO(un));
24014 ddi_devid_free(un->un_devid);
24015 un->un_devid = NULL;
24019 mutex_exit(SD_MUTEX(un));
24020 ssc = sd_ssc_init(un);
24022 mutex_enter(SD_MUTEX(un));
24026 sd_register_devid(ssc, SD_DEVINFO(un), SD_TARGET_IS_UNRESERVED);
24034 mutex_exit(SD_MUTEX(un));
24066 struct sd_lun *un; local
24070 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
24084 if ((rval = sd_persistent_reservation_in_read_keys(un,
24100 if ((rval = sd_persistent_reservation_in_read_keys(un,
24116 rval = sd_persistent_reservation_in_read_keys(un, &inkeys, flag);
24150 struct sd_lun *un; local
24154 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
24169 if ((rval = sd_persistent_reservation_in_read_resv(un,
24185 if ((rval = sd_persistent_reservation_in_read_resv(un,
24201 rval = sd_persistent_reservation_in_read_resv(un, &inresvs, flag);
24292 struct sd_lun *un; local
24295 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
24301 mutex_enter(SD_MUTEX(un));
24303 if (un->un_mhd_token) {
24304 token = un->un_mhd_token;
24305 un->un_mhd_token = NULL;
24306 mutex_exit(SD_MUTEX(un));
24309 mutex_enter(SD_MUTEX(un));
24311 mutex_exit(SD_MUTEX(un));
24325 if (un->un_resvd_status & SD_RESERVE) {
24329 mutex_exit(SD_MUTEX(un));
24332 mutex_exit(SD_MUTEX(un));
24347 token = scsi_watch_request_submit(SD_SCSI_DEVP(un), interval,
24356 mutex_enter(SD_MUTEX(un));
24357 un->un_mhd_token = token;
24358 mutex_exit(SD_MUTEX(un));
24387 struct sd_lun *un; local
24400 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
24404 SD_TRACE(SD_LOG_IOCTL_MHD, un,
24411 sd_mhd_watch_incomplete(un, pkt);
24421 mutex_enter(SD_MUTEX(un));
24422 if ((un->un_resvd_status & SD_FAILFAST) &&
24424 sd_panic_for_res_conflict(un);
24427 SD_INFO(SD_LOG_IOCTL_MHD, un,
24429 un->un_resvd_status |= SD_RESERVATION_CONFLICT;
24430 mutex_exit(SD_MUTEX(un));
24436 mutex_enter(SD_MUTEX(un));
24439 (un->un_resvd_status & SD_RESERVE)) {
24445 un->un_resvd_status |=
24447 SD_INFO(SD_LOG_IOCTL_MHD, un,
24454 mutex_enter(SD_MUTEX(un));
24457 if ((un->un_resvd_status & SD_RESERVE) &&
24458 (un->un_resvd_status & SD_LOST_RESERVE)) {
24459 if (un->un_resvd_status & SD_WANT_RESERVE) {
24464 if (un->un_resvd_timeid) {
24465 timeout_id_t temp_id = un->un_resvd_timeid;
24466 un->un_resvd_timeid = NULL;
24467 mutex_exit(SD_MUTEX(un));
24469 mutex_enter(SD_MUTEX(un));
24471 un->un_resvd_status &= ~SD_WANT_RESERVE;
24473 if (un->un_resvd_timeid == 0) {
24475 un->un_resvd_timeid = timeout(sd_mhd_resvd_recover,
24480 mutex_exit(SD_MUTEX(un));
24498 sd_mhd_watch_incomplete(struct sd_lun *un, struct scsi_pkt *pkt) argument
24504 ASSERT(un != NULL);
24508 mutex_enter(SD_MUTEX(un));
24509 if (un->un_state == SD_STATE_DUMPING) {
24510 mutex_exit(SD_MUTEX(un));
24539 un->un_tagflags = 0;
24541 if (un->un_f_opt_queueing == TRUE) {
24542 un->un_throttle = min(un->un_throttle, 3);
24544 un->un_throttle = 1;
24546 mutex_exit(SD_MUTEX(un));
24547 (void) scsi_ifsetcap(SD_ADDRESS(un), "tagged-qing", 0, 1);
24548 mutex_enter(SD_MUTEX(un));
24572 mutex_exit(SD_MUTEX(un));
24573 if (un->un_f_allow_bus_device_reset == TRUE) {
24574 if (un->un_f_lun_reset_enabled == TRUE) {
24576 scsi_reset(SD_ADDRESS(un),
24581 scsi_reset(SD_ADDRESS(un),
24586 (void) scsi_reset(SD_ADDRESS(un), RESET_ALL);
24588 mutex_enter(SD_MUTEX(un));
24596 if ((un->un_resvd_status & SD_RESERVE) == SD_RESERVE) {
24597 un->un_resvd_status |=
24599 SD_INFO(SD_LOG_IOCTL_MHD, un,
24610 SD_INFO(SD_LOG_IOCTL_MHD, un, "sd_mhd_watch_incomplete: "
24612 if (un->un_state != SD_STATE_OFFLINE) {
24613 New_state(un, SD_STATE_OFFLINE);
24621 if (pkt->pkt_reason != un->un_last_pkt_reason) {
24622 SD_ERROR(SD_LOG_IOCTL_MHD, un,
24628 un->un_last_pkt_reason = pkt->pkt_reason;
24629 mutex_exit(SD_MUTEX(un));
24694 struct sd_lun *un; local
24700 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
24704 mutex_enter(SD_MUTEX(un));
24705 un->un_resvd_timeid = NULL;
24706 if (un->un_resvd_status & SD_WANT_RESERVE) {
24712 mutex_exit(SD_MUTEX(un));
24715 mutex_exit(SD_MUTEX(un));
24750 SD_INFO(SD_LOG_IOCTL_MHD, un, "sd_mhd_resvd_recover: "
24785 struct sd_lun *un; local
24797 un = ddi_get_soft_state(sd_state,
24799 if (un == NULL) {
24821 mutex_enter(SD_MUTEX(un));
24822 if ((un->un_resvd_status & SD_RESERVE) == SD_RESERVE) {
24830 un->un_resvd_status &= ~SD_LOST_RESERVE;
24831 mutex_exit(SD_MUTEX(un));
24835 mutex_enter(SD_MUTEX(un));
24836 un->un_resvd_status |= SD_RESERVE;
24837 mutex_exit(SD_MUTEX(un));
24838 SD_INFO(SD_LOG_IOCTL_MHD, un,
24842 mutex_enter(SD_MUTEX(un));
24843 un->un_resvd_status |= SD_LOST_RESERVE;
24844 mutex_exit(SD_MUTEX(un));
24845 SD_INFO(SD_LOG_IOCTL_MHD, un,
24850 mutex_exit(SD_MUTEX(un));
24861 SD_TRACE(SD_LOG_IOCTL_MHD, un,
24939 struct sd_lun *un = (struct sd_lun *)arg; local
24941 mutex_enter(SD_MUTEX(un));
24942 if ((un->un_resvd_status & SD_RESERVE) == SD_RESERVE) {
24943 un->un_resvd_status |= (SD_LOST_RESERVE | SD_WANT_RESERVE);
24944 SD_INFO(SD_LOG_IOCTL_MHD, un,
24947 mutex_exit(SD_MUTEX(un));
24994 struct sd_lun *un; local
25006 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
25015 SD_ERROR(SD_LOG_IOCTL_MHD, un,
25021 mutex_enter(SD_MUTEX(un));
25022 un->un_resvd_status |= SD_RESERVE;
25023 un->un_resvd_status &=
25025 mutex_exit(SD_MUTEX(un));
25035 SD_INFO(SD_LOG_IOCTL_MHD, un,
25049 mutex_enter(SD_MUTEX(un));
25050 rval = (un->un_resvd_status &
25052 mutex_exit(SD_MUTEX(un));
25058 mutex_enter(SD_MUTEX(un));
25059 if (err || (un->un_resvd_status & SD_LOST_RESERVE)) {
25066 un->un_resvd_status |= SD_RESERVE;
25067 un->un_resvd_status &= ~(SD_LOST_RESERVE | SD_WANT_RESERVE);
25068 mutex_exit(SD_MUTEX(un));
25070 SD_INFO(SD_LOG_IOCTL_MHD, un,
25085 SD_TRACE(SD_LOG_IOCTL_MHD, un,
25108 struct sd_lun *un = NULL; local
25115 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
25123 com->uscsi_timeout = un->un_reserve_release_time;
25148 if (un->un_f_lun_reset_enabled == TRUE) {
25149 reset_retval = scsi_reset(SD_ADDRESS(un), RESET_LUN);
25153 reset_retval = scsi_reset(SD_ADDRESS(un), RESET_TARGET);
25156 (scsi_reset(SD_ADDRESS(un), RESET_ALL) == 0)) {
25198 struct sd_lun *un; local
25215 if (((un = ddi_get_soft_state(sd_state, instance)) == NULL) ||
25216 !SD_IS_VALID_LABEL(un) || ISCD(un)) {
25220 _NOTE(NOW_INVISIBLE_TO_OTHER_THREADS(*un))
25222 SD_TRACE(SD_LOG_DUMP, un, "sddump: entry\n");
25225 SD_INFO(SD_LOG_DUMP, un, "sddump: partition = %d\n", partition);
25227 if (!(NOT_DEVBSIZE(un))) {
25231 blknomask = (un->un_tgt_blocksize / DEV_BSIZE) - 1;
25232 secmask = un->un_tgt_blocksize - 1;
25235 SD_TRACE(SD_LOG_DUMP, un,
25237 un->un_tgt_blocksize);
25242 SD_TRACE(SD_LOG_DUMP, un,
25244 un->un_tgt_blocksize);
25252 (void) cmlb_partinfo(un->un_cmlbhandle, partition,
25255 if (NOT_DEVBSIZE(un)) {
25257 SD_TRACE(SD_LOG_DUMP, un,
25264 if (((blkno / (un->un_tgt_blocksize / DEV_BSIZE)) +
25265 (nblk / (un->un_tgt_blocksize / DEV_BSIZE))) > nblks) {
25266 SD_TRACE(SD_LOG_DUMP, un,
25274 mutex_enter(&un->un_pm_mutex);
25275 if (SD_DEVICE_IS_IN_LOW_POWER(un)) {
25278 mutex_exit(&un->un_pm_mutex);
25283 (void) pm_raise_power(SD_DEVINFO(un), 0,
25284 SD_PM_STATE_ACTIVE(un));
25291 SD_INFO(SD_LOG_DUMP, un, "sddump: starting device\n");
25293 start_pktp = scsi_init_pkt(SD_ADDRESS(un), NULL, NULL,
25294 CDB_GROUP0, un->un_status_len, 0, 0, NULL_FUNC, NULL);
25305 mutex_enter(SD_MUTEX(un));
25306 SD_FILL_SCSI1_LUN(un, start_pktp);
25307 mutex_exit(SD_MUTEX(un));
25312 if (sd_scsi_poll(un, start_pktp) != 0) {
25317 (void) sd_pm_state_change(un, SD_PM_STATE_ACTIVE(un),
25320 mutex_exit(&un->un_pm_mutex);
25323 mutex_enter(SD_MUTEX(un));
25324 un->un_throttle = 0;
25334 if ((un->un_state != SD_STATE_SUSPENDED) &&
25335 (un->un_state != SD_STATE_DUMPING)) {
25337 New_state(un, SD_STATE_DUMPING);
25339 if (un->un_f_is_fibre == FALSE) {
25340 mutex_exit(SD_MUTEX(un));
25354 if (scsi_reset(SD_ADDRESS(un), RESET_ALL) == 0) {
25355 mutex_enter(SD_MUTEX(un));
25356 Restore_state(un);
25357 mutex_exit(SD_MUTEX(un));
25364 if (sd_send_polled_RQS(un) == SD_FAILURE) {
25365 SD_INFO(SD_LOG_DUMP, un,
25368 mutex_enter(SD_MUTEX(un));
25376 if (NOT_DEVBSIZE(un)) {
25379 blkno = blkno / (un->un_tgt_blocksize / DEV_BSIZE);
25383 SD_INFO(SD_LOG_DUMP, un, "sddump: disk blkno = 0x%x\n", blkno);
25390 if (NOT_DEVBSIZE(un)) {
25391 tgt_byte_offset = blkno * un->un_sys_blocksize;
25392 tgt_byte_count = nblk * un->un_sys_blocksize;
25393 if ((tgt_byte_offset % un->un_tgt_blocksize) ||
25394 (tgt_byte_count % un->un_tgt_blocksize)) {
25400 tgt_blkno = tgt_byte_offset / un->un_tgt_blocksize;
25403 (un->un_tgt_blocksize - 1)) /
25404 un->un_tgt_blocksize) - tgt_blkno;
25412 err = sddump_do_read_of_rmw(un, tgt_blkno, tgt_nblk,
25415 mutex_exit(SD_MUTEX(un));
25424 ((uint64_t)(blkno * un->un_sys_blocksize)) -
25425 ((uint64_t)(tgt_blkno * un->un_tgt_blocksize));
25427 ASSERT(io_start_offset < un->un_tgt_blocksize);
25432 (size_t)nblk * un->un_sys_blocksize);
25435 tgt_blkno = tgt_byte_offset / un->un_tgt_blocksize;
25436 tgt_nblk = tgt_byte_count / un->un_tgt_blocksize;
25451 mutex_exit(SD_MUTEX(un));
25468 if (!(NOT_DEVBSIZE(un))) {
25469 nblk = nblk / (un->un_tgt_blocksize / DEV_BSIZE);
25477 if (un->un_partial_dma_supported == 1) {
25480 un->un_tgt_blocksize);
25481 nblk = dma_resid / un->un_tgt_blocksize;
25487 rval = sd_setup_next_rw_pkt(un, wr_pktp, wr_bp,
25491 rval = sd_setup_rw_pkt(un, &wr_pktp, wr_bp,
25492 un->un_pkt_flags, NULL_FUNC, NULL,
25496 rval = sd_setup_rw_pkt(un, &wr_pktp, wr_bp,
25507 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
25512 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
25517 scsi_log(SD_DEVINFO(un), sd_label, CE_CONT,
25523 scsi_log(SD_DEVINFO(un), sd_label, CE_CONT,
25528 scsi_log(SD_DEVINFO(un), sd_label, CE_CONT,
25532 mutex_enter(SD_MUTEX(un));
25533 Restore_state(un);
25534 if (NOT_DEVBSIZE(un) && (doing_rmw == TRUE)) {
25535 mutex_exit(SD_MUTEX(un));
25538 mutex_exit(SD_MUTEX(un));
25545 if (un->un_partial_dma_supported == 1) {
25551 nblk -= SD_BYTES2TGTBLOCKS(un, dma_resid);
25571 SD_TRACE(SD_LOG_DUMP, un, "sddump: sending write\n");
25573 if ((sd_scsi_poll(un, wr_pktp) == 0) &&
25583 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
25589 SD_INFO(SD_LOG_DUMP, un,
25592 (void) sd_send_polled_RQS(un);
25601 SD_INFO(SD_LOG_DUMP, un,
25604 if (un->un_f_lun_reset_enabled == TRUE) {
25605 reset_retval = scsi_reset(SD_ADDRESS(un),
25609 (void) scsi_reset(SD_ADDRESS(un), RESET_TARGET);
25611 (void) sd_send_polled_RQS(un);
25614 SD_INFO(SD_LOG_DUMP, un,
25617 mutex_enter(SD_MUTEX(un));
25618 sd_reset_target(un, wr_pktp);
25619 mutex_exit(SD_MUTEX(un));
25627 (void) scsi_reset(SD_ADDRESS(un), RESET_ALL);
25628 (void) sd_send_polled_RQS(un);
25634 mutex_enter(SD_MUTEX(un));
25635 if ((NOT_DEVBSIZE(un)) && (doing_rmw == TRUE)) {
25636 mutex_exit(SD_MUTEX(un));
25639 mutex_exit(SD_MUTEX(un));
25641 SD_TRACE(SD_LOG_DUMP, un, "sddump: exit: err = %d\n", err);
25661 sd_scsi_poll(struct sd_lun *un, struct scsi_pkt *pktp) argument
25665 ASSERT(un != NULL);
25666 ASSERT(!mutex_owned(SD_MUTEX(un)));
25672 pktp->pkt_flags |= un->un_tagflags;
25689 (void) sd_send_polled_RQS(un);
25707 sd_send_polled_RQS(struct sd_lun *un) argument
25713 ASSERT(un != NULL);
25714 ASSERT(!mutex_owned(SD_MUTEX(un)));
25718 rqs_pktp = un->un_rqs_pktp;
25719 rqs_bp = un->un_rqs_bp;
25721 mutex_enter(SD_MUTEX(un));
25723 if (un->un_sense_isbusy) {
25725 mutex_exit(SD_MUTEX(un));
25733 un->un_sense_isbusy = 1;
25739 mutex_exit(SD_MUTEX(un));
25741 SD_INFO(SD_LOG_COMMON, un, "sd_send_polled_RQS: req sense buf at"
25749 SD_INFO(SD_LOG_COMMON, un,
25753 SD_DUMP_MEMORY(un, SD_LOG_COMMON, "sd_send_polled_RQS:",
25756 mutex_enter(SD_MUTEX(un));
25757 un->un_sense_isbusy = 0;
25758 mutex_exit(SD_MUTEX(un));
25978 sd_persistent_reservation_in_read_keys(struct sd_lun *un, argument
25998 ssc = sd_ssc_init(un);
26008 SD_ERROR(SD_LOG_IOCTL_MHD, un,
26021 SD_ERROR(SD_LOG_IOCTL_MHD, un,
26033 SD_ERROR(SD_LOG_IOCTL_MHD, un,
26067 SD_ERROR(SD_LOG_IOCTL_MHD, un,
26077 SD_ERROR(SD_LOG_IOCTL_MHD, un,
26089 SD_ERROR(SD_LOG_IOCTL_MHD, un,
26101 SD_ERROR(SD_LOG_IOCTL_MHD, un,
26138 sd_persistent_reservation_in_read_resv(struct sd_lun *un, argument
26161 ssc = sd_ssc_init(un);
26171 SD_ERROR(SD_LOG_IOCTL_MHD, un,
26184 SD_ERROR(SD_LOG_IOCTL_MHD, un,
26195 SD_ERROR(SD_LOG_IOCTL_MHD, un,
26229 SD_ERROR(SD_LOG_IOCTL_MHD, un,
26239 SD_ERROR(SD_LOG_IOCTL_MHD, un,
26251 SD_ERROR(SD_LOG_IOCTL_MHD, un,
26274 SD_ERROR(SD_LOG_IOCTL_MHD, un,
26320 struct sd_lun *un = NULL; local
26331 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
26344 ssc = sd_ssc_init(un);
26349 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
26359 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
26393 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
26423 ssc = sd_ssc_init(un);
26429 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
26440 ssc = sd_ssc_init(un);
26446 ASSERT(!mutex_owned(SD_MUTEX(un)));
26447 mutex_enter(SD_MUTEX(un));
26448 sd_update_block_info(un, (uint32_t)data, 0);
26449 mutex_exit(SD_MUTEX(un));
26454 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
26506 struct sd_lun *un = NULL; local
26517 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
26527 ssc = sd_ssc_init(un);
26533 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
26543 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
26578 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
26606 ssc = sd_ssc_init(un);
26618 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
26621 ssc = sd_ssc_init(un);
26630 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
26674 struct sd_lun *un; local
26688 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
26694 ssc = sd_ssc_init(un);
26700 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
26710 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
26749 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
26785 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
26819 struct sd_lun *un; local
26824 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
26839 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, "sr_pause_resume:"
26882 struct sd_lun *un; local
26893 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
26904 if (un->un_f_cfg_playmsf_bcd == TRUE) {
27006 struct sd_lun *un = NULL; local
27022 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
27032 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
27043 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
27052 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
27064 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
27076 if (un->un_f_mmc_cap == TRUE) {
27134 struct sd_lun *un; local
27146 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL ||
27147 (un->un_state == SD_STATE_OFFLINE)) {
27198 } else if (un->un_f_cfg_readsub_bcd == TRUE) {
27253 struct sd_lun *un = NULL; local
27265 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL ||
27266 (un->un_state == SD_STATE_OFFLINE)) {
27290 if (un->un_f_cfg_read_toc_trk_bcd == TRUE) {
27321 } else if (un->un_f_cfg_read_toc_addr_bcd == TRUE) {
27428 struct sd_lun *un; local
27440 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL ||
27441 (un->un_state == SD_STATE_OFFLINE)) {
27468 if (un->un_f_cfg_read_toc_trk_bcd == TRUE) {
27520 struct sd_lun *un; local
27536 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL ||
27537 (un->un_state == SD_STATE_OFFLINE)) {
27541 SD_TRACE(SD_LOG_ATTACH_DETACH, un,
27542 "sd_read_mode1: entry: un:0x%p\n", un);
27564 ssc = sd_ssc_init(un);
27569 SD_TRACE(SD_LOG_ATTACH_DETACH, un,
27570 "sd_read_mode1: exit: un:0x%p\n", un);
27599 struct sd_lun *un; local
27616 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL ||
27617 (un->un_state == SD_STATE_OFFLINE)) {
27644 if (un->un_f_cfg_read_cd_xd4 == TRUE) {
27710 struct sd_lun *un; local
27729 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL ||
27730 (un->un_state == SD_STATE_OFFLINE)) {
27743 mutex_enter(SD_MUTEX(un));
27744 if (un->un_ncmds_in_driver != 1) {
27745 mutex_exit(SD_MUTEX(un));
27748 mutex_exit(SD_MUTEX(un));
27750 SD_TRACE(SD_LOG_ATTACH_DETACH, un,
27751 "sd_read_mode2: entry: un:0x%p\n", un);
27775 restore_blksize = un->un_tgt_blocksize;
27825 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
27837 SD_TRACE(SD_LOG_ATTACH_DETACH, un,
27838 "sd_read_mode2: exit: un:0x%p\n", un);
27864 struct sd_lun *un; local
27870 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL ||
27871 (un->un_state == SD_STATE_OFFLINE)) {
27878 ssc = sd_ssc_init(un);
27883 SD_ERROR(SD_LOG_IOCTL_RMMEDIA, un,
27900 ssc = sd_ssc_init(un);
27905 SD_ERROR(SD_LOG_IOCTL_RMMEDIA, un,
27912 mutex_enter(SD_MUTEX(un));
27913 sd_update_block_info(un, blksize, 0);
27914 mutex_exit(SD_MUTEX(un));
27948 struct sd_lun *un; local
27965 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
27975 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
27985 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
27994 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
28006 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, "sr_read_cdda: "
28027 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
28038 if (un->un_f_cfg_cdda == TRUE) {
28116 struct sd_lun *un; local
28134 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
28172 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN, "sr_read_cdxa: "
28193 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
28202 if (un->un_f_mmc_cap == TRUE) {
28255 struct sd_lun *un; local
28259 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL ||
28260 (un->un_state == SD_STATE_OFFLINE)) {
28273 mutex_enter(SD_MUTEX(un));
28274 if (un->un_f_ejecting == TRUE) {
28275 mutex_exit(SD_MUTEX(un));
28278 un->un_f_ejecting = TRUE;
28279 mutex_exit(SD_MUTEX(un));
28281 ssc = sd_ssc_init(un);
28287 mutex_enter(SD_MUTEX(un));
28288 un->un_f_ejecting = FALSE;
28289 mutex_exit(SD_MUTEX(un));
28293 ssc = sd_ssc_init(un);
28299 mutex_enter(SD_MUTEX(un));
28300 sr_ejected(un);
28301 un->un_mediastate = DKIO_EJECTED;
28302 un->un_f_ejecting = FALSE;
28303 cv_broadcast(&un->un_state_cv);
28304 mutex_exit(SD_MUTEX(un));
28306 mutex_enter(SD_MUTEX(un));
28307 un->un_f_ejecting = FALSE;
28308 mutex_exit(SD_MUTEX(un));
28325 sr_ejected(struct sd_lun *un) argument
28329 ASSERT(un != NULL);
28330 ASSERT(mutex_owned(SD_MUTEX(un)));
28332 un->un_f_blockcount_is_valid = FALSE;
28333 un->un_f_tgt_blocksize_is_valid = FALSE;
28334 mutex_exit(SD_MUTEX(un));
28335 cmlb_invalidate(un->un_cmlbhandle, (void *)SD_PATH_DIRECT_PRIORITY);
28336 mutex_enter(SD_MUTEX(un));
28338 if (un->un_errstats != NULL) {
28339 stp = (struct sd_errstats *)un->un_errstats->ks_data;
28366 struct sd_lun *un; local
28378 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
28382 if (un->un_f_cfg_is_atapi == TRUE) {
28389 ssc = sd_ssc_init(un);
28400 ssc = sd_ssc_init(un);
28446 struct sd_lun *un; local
28462 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL ||
28463 (un->un_state == SD_STATE_OFFLINE)) {
28471 if ((un->un_f_cfg_is_atapi == TRUE) || (un->un_f_mmc_cap == TRUE)) {
28481 ssc = sd_ssc_init(un);
28488 SD_ERROR(SD_LOG_IOCTL_RMMEDIA, un,
28499 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
28520 ssc = sd_ssc_init(un);
28527 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
28536 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
28577 ssc = sd_ssc_init(un);
28578 if ((un->un_f_cfg_is_atapi == TRUE) || (un->un_f_mmc_cap == TRUE)) {
28619 struct sd_lun *un; local
28630 if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL ||
28631 (un->un_state == SD_STATE_OFFLINE)) {
28667 if (un->un_tgt_blocksize == CDROM_BLK_512) {
28669 } else if (un->un_tgt_blocksize == CDROM_BLK_1024) {
28700 sd_wm_cache_constructor(void *wm, void *un, int flags) argument
28719 sd_wm_cache_destructor(void *wm, void *un) argument
28745 sd_range_lock(struct sd_lun *un, daddr_t startb, daddr_t endb, ushort_t typ) argument
28753 ASSERT(un != NULL);
28754 ASSERT(!mutex_owned(SD_MUTEX(un)));
28756 mutex_enter(SD_MUTEX(un));
28766 if (!(typ & SD_WTYPE_RMW) && !(un->un_rmw_count)) {
28774 tmp_wmp = sd_get_range(un, startb, endb);
28776 if ((wmp != NULL) && ONLIST(un, wmp)) {
28782 FREE_ONLIST_WMAP(un, wmp);
28800 ASSERT(un->un_wm_cache);
28808 wmp = kmem_cache_alloc(un->un_wm_cache,
28811 mutex_exit(SD_MUTEX(un));
28814 wmp = kmem_cache_alloc(un->un_wm_cache,
28816 mutex_enter(SD_MUTEX(un));
28833 un->un_rmw_count++;
28838 if (!ONLIST(un, wmp)) {
28839 wmp->wm_next = un->un_wm;
28843 un->un_wm = wmp;
28856 cv_wait(&sl_wmp->wm_avail, SD_MUTEX(un));
28866 CHK_N_FREEWMP(un, wmp);
28886 mutex_exit(SD_MUTEX(un));
28908 sd_get_range(struct sd_lun *un, daddr_t startb, daddr_t endb) argument
28912 ASSERT(un != NULL);
28914 for (wmp = un->un_wm; wmp != NULL; wmp = wmp->wm_next) {
28940 sd_free_inlist_wmap(struct sd_lun *un, struct sd_w_map *wmp) argument
28942 ASSERT(un != NULL);
28944 if (un->un_wm == wmp) {
28945 un->un_wm = wmp->wm_next;
28956 kmem_cache_free(un->un_wm_cache, wmp);
28971 sd_range_unlock(struct sd_lun *un, struct sd_w_map *wm) argument
28973 ASSERT(un != NULL);
28975 ASSERT(!mutex_owned(SD_MUTEX(un)));
28977 mutex_enter(SD_MUTEX(un));
28980 un->un_rmw_count--;
28993 sd_free_inlist_wmap(un, wm);
28996 mutex_exit(SD_MUTEX(un));
29018 struct sd_lun *un; local
29029 un = SD_GET_UN(bp);
29030 ASSERT(un != NULL);
29031 ASSERT(!mutex_owned(SD_MUTEX(un)));
29033 SD_TRACE(SD_LOG_IO_RMMEDIA, un,
29044 SD_NEXT_IOSTART(bsp->mbs_layer_index, un, bp);
29046 SD_TRACE(SD_LOG_IO_RMMEDIA, un,
29072 sddump_do_read_of_rmw(struct sd_lun *un, uint64_t blkno, uint64_t nblk, argument
29082 ASSERT(un != NULL);
29083 ASSERT(mutex_owned(SD_MUTEX(un)));
29085 target_blocksize = un->un_tgt_blocksize;
29087 mutex_exit(SD_MUTEX(un));
29089 bp = scsi_alloc_consistent_buf(SD_ADDRESS(un), (struct buf *)NULL,
29092 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
29098 rval = sd_setup_rw_pkt(un, &pkt, bp, 0, NULL_FUNC, NULL,
29102 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
29121 SD_TRACE(SD_LOG_DUMP, un, "sddump: sending read\n");
29123 if ((sd_scsi_poll(un, pkt) == 0) && (pkt->pkt_resid == 0)) {
29133 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
29140 SD_INFO(SD_LOG_DUMP, un,
29143 (void) sd_send_polled_RQS(un);
29152 SD_INFO(SD_LOG_DUMP, un,
29155 if (un->un_f_lun_reset_enabled == TRUE) {
29156 reset_retval = scsi_reset(SD_ADDRESS(un),
29160 (void) scsi_reset(SD_ADDRESS(un), RESET_TARGET);
29162 (void) sd_send_polled_RQS(un);
29165 SD_INFO(SD_LOG_DUMP, un,
29168 mutex_enter(SD_MUTEX(un));
29169 sd_reset_target(un, pkt);
29170 mutex_exit(SD_MUTEX(un));
29178 (void) scsi_reset(SD_ADDRESS(un), RESET_ALL);
29179 (void) sd_send_polled_RQS(un);
29193 mutex_enter(SD_MUTEX(un));
29212 sd_failfast_flushq(struct sd_lun *un) argument
29218 ASSERT(un != NULL);
29219 ASSERT(mutex_owned(SD_MUTEX(un)));
29220 ASSERT(un->un_failfast_state == SD_FAILFAST_ACTIVE);
29221 ASSERT(un->un_failfast_bp == NULL);
29223 SD_TRACE(SD_LOG_IO_FAILFAST, un,
29224 "sd_failfast_flushq: entry: un:0x%p\n", un);
29235 if (un->un_failfast_headp == NULL) {
29236 ASSERT(un->un_failfast_tailp == NULL);
29237 un->un_failfast_headp = un->un_waitq_headp;
29239 ASSERT(un->un_failfast_tailp != NULL);
29240 un->un_failfast_tailp->av_forw = un->un_waitq_headp;
29243 un->un_failfast_tailp = un->un_waitq_tailp;
29246 for (bp = un->un_waitq_headp; bp != NULL; bp = bp->av_forw) {
29247 SD_UPDATE_KSTATS(un, kstat_waitq_exit, bp);
29251 un->un_waitq_headp = un->un_waitq_tailp = NULL;
29258 for (bp = un->un_waitq_headp; bp != NULL; bp = next_waitq_bp) {
29279 if (bp == un->un_waitq_headp) {
29281 un->un_waitq_headp = next_waitq_bp;
29282 if (un->un_waitq_headp == NULL) {
29284 un->un_waitq_tailp = NULL;
29291 ASSERT(un->un_waitq_headp != NULL);
29295 if (bp == un->un_waitq_tailp) {
29298 un->un_waitq_tailp = prev_waitq_bp;
29308 SD_UPDATE_KSTATS(un, kstat_waitq_exit, bp);
29313 if (un->un_failfast_headp == NULL) {
29315 ASSERT(un->un_failfast_tailp == NULL);
29316 un->un_failfast_headp =
29317 un->un_failfast_tailp = bp;
29320 ASSERT(un->un_failfast_tailp != NULL);
29321 ASSERT(un->un_failfast_tailp->b_flags &
29323 un->un_failfast_tailp->av_forw = bp;
29324 un->un_failfast_tailp = bp;
29332 while ((bp = un->un_failfast_headp) != NULL) {
29334 un->un_failfast_headp = bp->av_forw;
29335 if (un->un_failfast_headp == NULL) {
29336 un->un_failfast_tailp = NULL;
29345 sd_return_failed_command_no_restart(un, bp, EIO);
29350 ddi_xbuf_flushq(un->un_xbuf_attr, sd_failfast_flushq_callback);
29353 SD_TRACE(SD_LOG_IO_FAILFAST, un,
29354 "sd_failfast_flushq: exit: un:0x%p\n", un);
29390 sd_setup_next_xfer(struct sd_lun *un, struct buf *bp, argument
29410 num_blks_not_xfered = SD_BYTES2TGTBLOCKS(un, bytes_not_xfered);
29416 SD_BYTES2TGTBLOCKS(un, bp->b_bcount - bytes_not_xfered);
29423 rval = sd_setup_next_rw_pkt(un, pkt, bp,
29450 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
29470 sd_panic_for_res_conflict(struct sd_lun *un) argument
29477 ddi_pathname(SD_DEVINFO(un), path_str));
29504 sd_faultinjection_ioctl(int cmd, intptr_t arg, struct sd_lun *un) argument
29509 SD_TRACE(SD_LOG_IOERR, un, "sd_faultinjection_ioctl: entry\n");
29511 mutex_enter(SD_MUTEX(un));
29516 SD_INFO(SD_LOG_SDTEST, un,
29521 SD_INFO(SD_LOG_IOERR, un,
29527 SD_INFO(SD_LOG_SDTEST, un,
29531 un->sd_injection_mask = 0xFFFFFFFF;
29533 un->sd_fi_fifo_pkt[i] = NULL;
29534 un->sd_fi_fifo_xb[i] = NULL;
29535 un->sd_fi_fifo_un[i] = NULL;
29536 un->sd_fi_fifo_arq[i] = NULL;
29538 un->sd_fi_fifo_start = 0;
29539 un->sd_fi_fifo_end = 0;
29541 mutex_enter(&(un->un_fi_mutex));
29542 un->sd_fi_log[0] = '\0';
29543 un->sd_fi_buf_len = 0;
29544 mutex_exit(&(un->un_fi_mutex));
29546 SD_INFO(SD_LOG_IOERR, un,
29552 SD_INFO(SD_LOG_SDTEST, un,
29555 un->sd_injection_mask = 0x0;
29559 if (un->sd_fi_fifo_pkt[i] != NULL) {
29560 kmem_free(un->sd_fi_fifo_pkt[i],
29563 if (un->sd_fi_fifo_xb[i] != NULL) {
29564 kmem_free(un->sd_fi_fifo_xb[i],
29567 if (un->sd_fi_fifo_un[i] != NULL) {
29568 kmem_free(un->sd_fi_fifo_un[i],
29571 if (un->sd_fi_fifo_arq[i] != NULL) {
29572 kmem_free(un->sd_fi_fifo_arq[i],
29575 un->sd_fi_fifo_pkt[i] = NULL;
29576 un->sd_fi_fifo_un[i] = NULL;
29577 un->sd_fi_fifo_xb[i] = NULL;
29578 un->sd_fi_fifo_arq[i] = NULL;
29580 un->sd_fi_fifo_start = 0;
29581 un->sd_fi_fifo_end = 0;
29583 SD_INFO(SD_LOG_IOERR, un,
29589 SD_INFO(SD_LOG_SDTEST, un,
29592 i = un->sd_fi_fifo_end % SD_FI_MAX_ERROR;
29597 if (un->sd_fi_fifo_pkt[i] != NULL) {
29598 kmem_free(un->sd_fi_fifo_pkt[i],
29602 un->sd_fi_fifo_pkt[i] =
29604 if (un->sd_fi_fifo_pkt[i] == NULL) {
29608 rval = ddi_copyin((void *)arg, un->sd_fi_fifo_pkt[i],
29611 kmem_free(un->sd_fi_fifo_pkt[i],
29613 un->sd_fi_fifo_pkt[i] = NULL;
29616 SD_INFO(SD_LOG_IOERR, un,
29623 SD_INFO(SD_LOG_SDTEST, un,
29626 i = un->sd_fi_fifo_end % SD_FI_MAX_ERROR;
29630 if (un->sd_fi_fifo_xb[i] != NULL) {
29631 kmem_free(un->sd_fi_fifo_xb[i],
29633 un->sd_fi_fifo_xb[i] = NULL;
29636 un->sd_fi_fifo_xb[i] =
29638 if (un->sd_fi_fifo_xb[i] == NULL) {
29642 rval = ddi_copyin((void *)arg, un->sd_fi_fifo_xb[i],
29646 kmem_free(un->sd_fi_fifo_xb[i],
29648 un->sd_fi_fifo_xb[i] = NULL;
29651 SD_INFO(SD_LOG_IOERR, un,
29658 SD_INFO(SD_LOG_SDTEST, un,
29661 i = un->sd_fi_fifo_end % SD_FI_MAX_ERROR;
29665 if (un->sd_fi_fifo_un[i] != NULL) {
29666 kmem_free(un->sd_fi_fifo_un[i],
29668 un->sd_fi_fifo_un[i] = NULL;
29671 un->sd_fi_fifo_un[i] =
29673 if (un->sd_fi_fifo_un[i] == NULL) {
29677 rval = ddi_copyin((void *)arg, un->sd_fi_fifo_un[i],
29680 kmem_free(un->sd_fi_fifo_un[i],
29682 un->sd_fi_fifo_un[i] = NULL;
29686 SD_INFO(SD_LOG_IOERR, un,
29694 SD_INFO(SD_LOG_SDTEST, un,
29696 i = un->sd_fi_fifo_end % SD_FI_MAX_ERROR;
29700 if (un->sd_fi_fifo_arq[i] != NULL) {
29701 kmem_free(un->sd_fi_fifo_arq[i],
29703 un->sd_fi_fifo_arq[i] = NULL;
29706 un->sd_fi_fifo_arq[i] =
29708 if (un->sd_fi_fifo_arq[i] == NULL) {
29712 rval = ddi_copyin((void *)arg, un->sd_fi_fifo_arq[i],
29715 kmem_free(un->sd_fi_fifo_arq[i],
29717 un->sd_fi_fifo_arq[i] = NULL;
29721 SD_INFO(SD_LOG_IOERR, un,
29734 un->sd_fi_fifo_end + i < SD_FI_MAX_ERROR) {
29735 un->sd_fi_fifo_end += i;
29738 SD_INFO(SD_LOG_IOERR, un,
29740 if (un->sd_fi_fifo_end + i < SD_FI_MAX_ERROR) {
29741 un->sd_fi_fifo_end++;
29744 SD_INFO(SD_LOG_IOERR, un,
29746 un->sd_fi_fifo_end);
29751 SD_INFO(SD_LOG_SDTEST, un,
29756 mutex_enter(&(un->un_fi_mutex));
29757 rval = ddi_copyout(un->sd_fi_log, (void *)arg,
29758 un->sd_fi_buf_len+1, 0);
29759 mutex_exit(&(un->un_fi_mutex));
29771 mutex_exit(SD_MUTEX(un));
29772 SD_TRACE(SD_LOG_IOERR, un, "sd_faultinjection_ioctl: exit\n");
29787 sd_injection_log(char *buf, struct sd_lun *un) argument
29791 ASSERT(un != NULL);
29794 mutex_enter(&(un->un_fi_mutex));
29798 if (len + un->sd_fi_buf_len < SD_FI_MAX_BUF) {
29799 uint_t offset = strlen((char *)un->sd_fi_log);
29800 char *destp = (char *)un->sd_fi_log + offset;
29805 un->sd_fi_buf_len += len;
29806 un->sd_fi_log[un->sd_fi_buf_len] = '\0';
29809 mutex_exit(&(un->un_fi_mutex));
29832 struct sd_lun *un; local
29839 un = SD_GET_UN(bp);
29841 ASSERT(un != NULL);
29843 mutex_enter(SD_MUTEX(un));
29845 SD_TRACE(SD_LOG_SDTEST, un,
29850 un->sd_fi_fifo_start == un->sd_fi_fifo_end) {
29851 mutex_exit(SD_MUTEX(un));
29855 SD_INFO(SD_LOG_SDTEST, un,
29859 i = un->sd_fi_fifo_start % SD_FI_MAX_ERROR;
29861 fi_pkt = un->sd_fi_fifo_pkt[i];
29862 fi_xb = un->sd_fi_fifo_xb[i];
29863 fi_un = un->sd_fi_fifo_un[i];
29864 fi_arq = un->sd_fi_fifo_arq[i];
29916 SD_CONDSET(un->un_sd->sd_inq, un, inq_rmb, "inq_rmb");
29917 SD_CONDSET(un, un, un_ctype, "un_ctype");
29918 SD_CONDSET(un, un, un_reset_retry_count,
29920 SD_CONDSET(un, un, un_reservation_type, "un_reservation_type");
29921 SD_CONDSET(un, un, un_resvd_status, "un_resvd_status");
29922 SD_CONDSET(un, un, un_f_arq_enabled, "un_f_arq_enabled");
29923 SD_CONDSET(un, un, un_f_allow_bus_device_reset,
29925 SD_CONDSET(un, un, un_f_opt_queueing, "un_f_opt_queueing");
29935 if (un->sd_fi_fifo_pkt[i] != NULL) {
29936 kmem_free(un->sd_fi_fifo_pkt[i], sizeof (struct sd_fi_pkt));
29938 if (un->sd_fi_fifo_xb[i] != NULL) {
29939 kmem_free(un->sd_fi_fifo_xb[i], sizeof (struct sd_fi_xb));
29941 if (un->sd_fi_fifo_un[i] != NULL) {
29942 kmem_free(un->sd_fi_fifo_un[i], sizeof (struct sd_fi_un));
29944 if (un->sd_fi_fifo_arq[i] != NULL) {
29945 kmem_free(un->sd_fi_fifo_arq[i], sizeof (struct sd_fi_arq));
29954 un->sd_fi_fifo_pkt[i] = NULL;
29955 un->sd_fi_fifo_un[i] = NULL;
29956 un->sd_fi_fifo_xb[i] = NULL;
29957 un->sd_fi_fifo_arq[i] = NULL;
29959 un->sd_fi_fifo_start++;
29961 mutex_exit(SD_MUTEX(un));
29963 SD_INFO(SD_LOG_SDTEST, un, "sd_faultinjection: exit\n");
30240 sd_set_unit_attributes(struct sd_lun *un, dev_info_t *devi) argument
30244 ASSERT(un->un_sd);
30245 ASSERT(un->un_sd->sd_inq);
30250 un->un_f_sync_cache_supported = TRUE;
30257 un->un_f_sync_cache_required = FALSE;
30259 if (un->un_sd->sd_inq->inq_rmb) {
30265 un->un_f_has_removable_media = TRUE;
30270 un->un_f_non_devbsize_supported = TRUE;
30275 un->un_f_doorlock_supported = TRUE;
30283 un->un_f_chk_wp_open = TRUE;
30289 un->un_f_monitor_media_state = TRUE;
30296 un->un_f_check_start_stop = TRUE;
30302 un->un_f_eject_media_supported = TRUE;
30312 un->un_f_pm_supported = TRUE;
30329 un->un_f_devid_supported = TRUE;
30334 un->un_f_attach_spinup = TRUE;
30342 if (SD_INQUIRY(un)->inq_dtype == DTYPE_DIRECT) {
30343 un->un_f_descr_format_supported = TRUE;
30352 un->un_f_pkstats_enabled = (ddi_prop_get_int(DDI_DEV_T_ANY,
30353 SD_DEVINFO(un), DDI_PROP_DONTPASS,
30374 un->un_f_log_sense_supported = TRUE;
30375 if (!un->un_f_power_condition_disabled &&
30376 SD_INQUIRY(un)->inq_ansi == 6) {
30377 un->un_f_power_condition_supported = TRUE;
30389 un->un_f_log_sense_supported = FALSE;
30392 un->un_f_pm_supported = TRUE;
30393 if (!un->un_f_power_condition_disabled &&
30395 un->un_f_power_condition_supported =
30399 un->un_f_log_sense_supported = TRUE;
30400 un->un_f_pm_log_sense_smart =
30405 SD_INFO(SD_LOG_ATTACH_DETACH, un,
30407 "property set to %d.\n", un, un->un_f_pm_supported);
30411 if (un->un_f_is_hotpluggable) {
30418 un->un_f_monitor_media_state = TRUE;
30420 un->un_f_check_start_stop = TRUE;
30435 struct sd_lun *un; local
30447 un = ddi_get_soft_state(sd_state, ddi_get_instance(devi));
30448 if (un == NULL)
30454 ssc = sd_ssc_init(un);
30455 mutex_enter(SD_MUTEX(un));
30456 if (un->un_f_tgt_blocksize_is_valid == FALSE) {
30457 mutex_exit(SD_MUTEX(un));
30462 mutex_enter(SD_MUTEX(un));
30463 sd_update_block_info(un, lbasize, cap);
30464 if ((un->un_f_tgt_blocksize_is_valid == FALSE)) {
30465 mutex_exit(SD_MUTEX(un));
30471 if (NOT_DEVBSIZE(un)) {
30477 real_addr = first_byte / un->un_tgt_blocksize;
30480 un->un_tgt_blocksize - 1) / un->un_tgt_blocksize;
30483 buffer_size = (end_block - real_addr) * un->un_tgt_blocksize;
30485 SD_TRACE(SD_LOG_IO_PARTITION, un, "sd_tg_rdwr",
30489 if (((first_byte % un->un_tgt_blocksize) != 0) ||
30490 (reqlength % un->un_tgt_blocksize) != 0)
30504 if (ISCD(un) && (cmd == TG_READ) &&
30505 (un->un_f_blockcount_is_valid == TRUE) &&
30506 ((start_block == (un->un_blockcount - 1)) ||
30507 (start_block == (un->un_blockcount - 2)))) {
30511 mutex_exit(SD_MUTEX(un));
30516 bcopy(dkl + SD_TGTBYTEOFFSET(un, start_block,
30525 bcopy(bufaddr, dkl + SD_TGTBYTEOFFSET(un, start_block,
30552 struct sd_lun *un; local
30558 un = ddi_get_soft_state(sd_state, ddi_get_instance(devi));
30559 if (un == NULL)
30567 mutex_enter(SD_MUTEX(un));
30569 if ((un->un_f_blockcount_is_valid == TRUE) &&
30570 (un->un_f_tgt_blocksize_is_valid == TRUE)) {
30571 cap = un->un_blockcount;
30572 lbasize = un->un_tgt_blocksize;
30573 mutex_exit(SD_MUTEX(un));
30576 mutex_exit(SD_MUTEX(un));
30577 ssc = sd_ssc_init(un);
30591 mutex_enter(SD_MUTEX(un));
30592 sd_update_block_info(un, lbasize, cap);
30593 if ((un->un_f_blockcount_is_valid == FALSE) ||
30594 (un->un_f_tgt_blocksize_is_valid == FALSE)) {
30595 mutex_exit(SD_MUTEX(un));
30598 mutex_exit(SD_MUTEX(un));
30612 ret = sd_get_physical_geometry(un, (cmlb_geom_t *)arg,
30616 ret = sd_get_virtual_geometry(un,
30622 mutex_enter(SD_MUTEX(un));
30624 un->un_f_mmc_writable_media;
30626 un->un_f_is_solid_state;
30628 un->un_f_is_rotational;
30629 mutex_exit(SD_MUTEX(un));
30660 struct sd_lun *un; local
30673 un = ssc->ssc_un;
30674 ASSERT(un != NULL);
30676 dip = un->un_sd->sd_dev;
30688 if (ddi_in_panic() || (un->un_state == SD_STATE_SUSPENDED) ||
30689 (un->un_state == SD_STATE_DUMPING))
30703 scsi_log(SD_DEVINFO(un), sd_label, CE_WARN,
30742 scsi_fm_ereport_post(un->un_sd, uscsi_path_instance, NULL,
30769 scsi_fm_ereport_post(un->un_sd, uscsi_path_instance,
30798 scsi_fm_ereport_post(un->un_sd, uscsi_path_instance,
30840 scsi_fm_ereport_post(un->un_sd, uscsi_path_instance, NULL,
30883 scsi_fm_ereport_post(un->un_sd,
30932 scsi_fm_ereport_post(un->un_sd,
30988 scsi_fm_ereport_post(un->un_sd, uscsi_path_instance,
31022 sd_ssc_extract_info(sd_ssc_t *ssc, struct sd_lun *un, struct scsi_pkt *pktp, argument
31033 ASSERT(un != NULL);
31038 ASSERT(mutex_owned(SD_MUTEX(un)));
31138 struct sd_lun *un; local
31141 un = ssc->ssc_un;
31142 ASSERT(un != NULL);
31143 ASSERT(!mutex_owned(SD_MUTEX(un)));
31145 mutex_enter(SD_MUTEX(un));
31146 un->un_f_is_rotational = TRUE;
31147 un->un_f_is_solid_state = FALSE;
31149 if (ISCD(un)) {
31150 mutex_exit(SD_MUTEX(un));
31155 un->un_vpd_page_mask & SD_VPD_DEV_CHARACTER_PG) {
31156 mutex_exit(SD_MUTEX(un));
31164 SD_TRACE(SD_LOG_COMMON, un,
31171 mutex_enter(SD_MUTEX(un));
31177 un->un_f_is_rotational = FALSE;
31179 un->un_f_is_rotational = FALSE;
31180 un->un_f_is_solid_state = TRUE;
31185 un->un_f_disksort_disabled = TRUE;
31188 mutex_exit(SD_MUTEX(un));
31195 mutex_exit(SD_MUTEX(un));
31218 struct sd_lun *un; local
31221 un = ssc->ssc_un;
31222 ASSERT(un != NULL);
31223 ASSERT(!mutex_owned(SD_MUTEX(un)));
31225 mutex_enter(SD_MUTEX(un));
31226 if (ISCD(un)) {
31227 mutex_exit(SD_MUTEX(un));
31231 if (un->un_f_descr_format_supported) {
31232 mutex_exit(SD_MUTEX(un));
31235 mutex_enter(SD_MUTEX(un));
31238 un->un_phy_blocksize = DEV_BSIZE;
31241 un->un_phy_blocksize = DEV_BSIZE;
31242 } else if (pbsize > un->un_phy_blocksize) {
31247 un->un_phy_blocksize = pbsize;
31254 if (sd_sdconf_id_match(un, sd_flash_dev_table[i], devid_len)
31256 un->un_phy_blocksize = SSD_SECSIZE;
31257 if (un->un_f_is_solid_state &&
31258 un->un_phy_blocksize != un->un_tgt_blocksize)
31259 un->un_f_enable_rmw = TRUE;
31263 mutex_exit(SD_MUTEX(un));