1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 22 /* 23 * Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved. 24 */ 25 26 27 /* 28 * SATA Framework 29 * Generic SATA Host Adapter Implementation 30 */ 31 32 #include <sys/conf.h> 33 #include <sys/file.h> 34 #include <sys/ddi.h> 35 #include <sys/sunddi.h> 36 #include <sys/modctl.h> 37 #include <sys/cmn_err.h> 38 #include <sys/errno.h> 39 #include <sys/thread.h> 40 #include <sys/kstat.h> 41 #include <sys/note.h> 42 #include <sys/sysevent.h> 43 #include <sys/sysevent/eventdefs.h> 44 #include <sys/sysevent/dr.h> 45 #include <sys/taskq.h> 46 #include <sys/disp.h> 47 48 #include <sys/sata/impl/sata.h> 49 #include <sys/sata/sata_hba.h> 50 #include <sys/sata/sata_defs.h> 51 #include <sys/sata/sata_cfgadm.h> 52 #include <sys/sata/sata_blacklist.h> 53 #include <sys/sata/sata_satl.h> 54 55 #include <sys/scsi/impl/spc3_types.h> 56 57 /* 58 * FMA header files 59 */ 60 #include <sys/ddifm.h> 61 #include <sys/fm/protocol.h> 62 #include <sys/fm/util.h> 63 #include <sys/fm/io/ddi.h> 64 65 /* Debug flags - defined in sata.h */ 66 int sata_debug_flags = 0; 67 int sata_msg = 0; 68 69 /* 70 * Flags enabling selected SATA HBA framework functionality 71 */ 72 #define SATA_ENABLE_QUEUING 1 73 #define SATA_ENABLE_NCQ 2 74 #define SATA_ENABLE_PROCESS_EVENTS 4 75 #define SATA_ENABLE_PMULT_FBS 8 /* FIS-Based Switching */ 76 int sata_func_enable = 77 SATA_ENABLE_PROCESS_EVENTS | SATA_ENABLE_QUEUING | SATA_ENABLE_NCQ; 78 79 /* 80 * Global variable setting default maximum queue depth (NCQ or TCQ) 81 * Note:minimum queue depth is 1 82 */ 83 int sata_max_queue_depth = SATA_MAX_QUEUE_DEPTH; /* max NCQ/TCQ queue depth */ 84 85 /* 86 * Currently used default NCQ/TCQ queue depth. It is set-up during the driver 87 * initialization, using value from sata_max_queue_depth 88 * It is adjusted to minimum supported by the controller and by the device, 89 * if queueing is enabled. 90 */ 91 static int sata_current_max_qdepth; 92 93 /* 94 * Global variable determining the default behavior after device hotpluggin. 95 * If non-zero, the hotplugged device is onlined (if possible) without explicit 96 * IOCTL request (AP_CONFIGURE). 97 * If zero, hotplugged device is identified, but not onlined. 98 * Enabling (AP_CONNECT) device port with an attached device does not result 99 * in device onlining regardless of the flag setting 100 */ 101 int sata_auto_online = 0; 102 103 #ifdef SATA_DEBUG 104 105 #define SATA_LOG_D(args) sata_log args 106 uint64_t mbuf_count = 0; 107 uint64_t mbuffail_count = 0; 108 109 sata_atapi_cmd_t sata_atapi_trace[64]; 110 uint32_t sata_atapi_trace_index = 0; 111 int sata_atapi_trace_save = 1; 112 static void sata_save_atapi_trace(sata_pkt_txlate_t *, int); 113 #define SATAATAPITRACE(spx, count) if (sata_atapi_trace_save) \ 114 sata_save_atapi_trace(spx, count); 115 116 #else 117 #define SATA_LOG_D(args) sata_trace_log args 118 #define SATAATAPITRACE(spx, count) 119 #endif 120 121 #if 0 122 static void 123 sata_test_atapi_packet_command(sata_hba_inst_t *, int); 124 #endif 125 126 #ifdef SATA_INJECT_FAULTS 127 128 #define SATA_INJECT_PKT_FAULT 1 129 uint32_t sata_inject_fault = 0; 130 131 uint32_t sata_inject_fault_count = 0; 132 uint32_t sata_inject_fault_pause_count = 0; 133 uint32_t sata_fault_type = 0; 134 uint32_t sata_fault_cmd = 0; 135 dev_info_t *sata_fault_ctrl = NULL; 136 sata_device_t sata_fault_device; 137 138 static void sata_inject_pkt_fault(sata_pkt_t *, int *, int); 139 140 #endif 141 142 #define LEGACY_HWID_LEN 64 /* Model (40) + Serial (20) + pad */ 143 144 static char sata_rev_tag[] = {"1.46"}; 145 146 /* 147 * SATA cb_ops functions 148 */ 149 static int sata_hba_open(dev_t *, int, int, cred_t *); 150 static int sata_hba_close(dev_t, int, int, cred_t *); 151 static int sata_hba_ioctl(dev_t, int, intptr_t, int, cred_t *, int *); 152 153 /* 154 * SCSA required entry points 155 */ 156 static int sata_scsi_tgt_init(dev_info_t *, dev_info_t *, 157 scsi_hba_tran_t *, struct scsi_device *); 158 static int sata_scsi_tgt_probe(struct scsi_device *, 159 int (*callback)(void)); 160 static void sata_scsi_tgt_free(dev_info_t *, dev_info_t *, 161 scsi_hba_tran_t *, struct scsi_device *); 162 static int sata_scsi_start(struct scsi_address *, struct scsi_pkt *); 163 static int sata_scsi_abort(struct scsi_address *, struct scsi_pkt *); 164 static int sata_scsi_reset(struct scsi_address *, int); 165 static int sata_scsi_getcap(struct scsi_address *, char *, int); 166 static int sata_scsi_setcap(struct scsi_address *, char *, int, int); 167 static struct scsi_pkt *sata_scsi_init_pkt(struct scsi_address *, 168 struct scsi_pkt *, struct buf *, int, int, int, int, int (*)(caddr_t), 169 caddr_t); 170 static void sata_scsi_destroy_pkt(struct scsi_address *, struct scsi_pkt *); 171 static void sata_scsi_dmafree(struct scsi_address *, struct scsi_pkt *); 172 static void sata_scsi_sync_pkt(struct scsi_address *, struct scsi_pkt *); 173 174 /* 175 * SATA HBA interface functions are defined in sata_hba.h header file 176 */ 177 178 /* Event processing functions */ 179 static void sata_event_daemon(void *); 180 static void sata_event_thread_control(int); 181 static void sata_process_controller_events(sata_hba_inst_t *sata_hba_inst); 182 static void sata_process_pmult_events(sata_hba_inst_t *, uint8_t); 183 static void sata_process_device_reset(sata_hba_inst_t *, sata_address_t *); 184 static void sata_process_pmdevice_reset(sata_hba_inst_t *, sata_address_t *); 185 static void sata_process_port_failed_event(sata_hba_inst_t *, 186 sata_address_t *); 187 static void sata_process_port_link_events(sata_hba_inst_t *, 188 sata_address_t *); 189 static void sata_process_pmport_link_events(sata_hba_inst_t *, 190 sata_address_t *); 191 static void sata_process_device_detached(sata_hba_inst_t *, sata_address_t *); 192 static void sata_process_pmdevice_detached(sata_hba_inst_t *, 193 sata_address_t *); 194 static void sata_process_device_attached(sata_hba_inst_t *, sata_address_t *); 195 static void sata_process_pmdevice_attached(sata_hba_inst_t *, 196 sata_address_t *); 197 static void sata_process_port_pwr_change(sata_hba_inst_t *, sata_address_t *); 198 static void sata_process_cntrl_pwr_level_change(sata_hba_inst_t *); 199 static void sata_process_target_node_cleanup(sata_hba_inst_t *, 200 sata_address_t *); 201 static void sata_process_device_autoonline(sata_hba_inst_t *, 202 sata_address_t *saddr); 203 204 /* 205 * Local translation functions 206 */ 207 static int sata_txlt_inquiry(sata_pkt_txlate_t *); 208 static int sata_txlt_test_unit_ready(sata_pkt_txlate_t *); 209 static int sata_txlt_start_stop_unit(sata_pkt_txlate_t *); 210 static int sata_txlt_read_capacity(sata_pkt_txlate_t *); 211 static int sata_txlt_read_capacity16(sata_pkt_txlate_t *); 212 static int sata_txlt_unmap(sata_pkt_txlate_t *); 213 static int sata_txlt_request_sense(sata_pkt_txlate_t *); 214 static int sata_txlt_read(sata_pkt_txlate_t *); 215 static int sata_txlt_write(sata_pkt_txlate_t *); 216 static int sata_txlt_log_sense(sata_pkt_txlate_t *); 217 static int sata_txlt_log_select(sata_pkt_txlate_t *); 218 static int sata_txlt_mode_sense(sata_pkt_txlate_t *); 219 static int sata_txlt_mode_select(sata_pkt_txlate_t *); 220 static int sata_txlt_ata_pass_thru(sata_pkt_txlate_t *); 221 static int sata_txlt_synchronize_cache(sata_pkt_txlate_t *); 222 static int sata_txlt_write_buffer(sata_pkt_txlate_t *); 223 static int sata_txlt_nodata_cmd_immediate(sata_pkt_txlate_t *); 224 225 static int sata_hba_start(sata_pkt_txlate_t *, int *); 226 static int sata_txlt_invalid_command(sata_pkt_txlate_t *); 227 static int sata_txlt_check_condition(sata_pkt_txlate_t *, uchar_t, uchar_t); 228 static int sata_txlt_lba_out_of_range(sata_pkt_txlate_t *); 229 static int sata_txlt_ata_pass_thru_illegal_cmd(sata_pkt_txlate_t *); 230 static int sata_txlt_unmap_nodata_cmd(sata_pkt_txlate_t *); 231 static void sata_txlt_rw_completion(sata_pkt_t *); 232 static void sata_txlt_nodata_cmd_completion(sata_pkt_t *); 233 static void sata_txlt_apt_completion(sata_pkt_t *sata_pkt); 234 static void sata_txlt_unmap_completion(sata_pkt_t *sata_pkt); 235 static void sata_txlt_download_mcode_cmd_completion(sata_pkt_t *); 236 static int sata_emul_rw_completion(sata_pkt_txlate_t *); 237 static void sata_fill_ata_return_desc(sata_pkt_t *, uint8_t, uint8_t, 238 uint8_t); 239 static struct scsi_extended_sense *sata_immediate_error_response( 240 sata_pkt_txlate_t *, int); 241 static struct scsi_extended_sense *sata_arq_sense(sata_pkt_txlate_t *); 242 243 static int sata_txlt_atapi(sata_pkt_txlate_t *); 244 static void sata_txlt_atapi_completion(sata_pkt_t *); 245 246 /* 247 * Local functions for ioctl 248 */ 249 static int32_t sata_get_port_num(sata_hba_inst_t *, struct devctl_iocdata *); 250 static void sata_cfgadm_state(sata_hba_inst_t *, int32_t, 251 devctl_ap_state_t *); 252 static dev_info_t *sata_get_target_dip(dev_info_t *, uint8_t, uint8_t); 253 static dev_info_t *sata_get_scsi_target_dip(dev_info_t *, sata_address_t *); 254 static dev_info_t *sata_devt_to_devinfo(dev_t); 255 static int sata_ioctl_connect(sata_hba_inst_t *, sata_device_t *); 256 static int sata_ioctl_disconnect(sata_hba_inst_t *, sata_device_t *); 257 static int sata_ioctl_configure(sata_hba_inst_t *, sata_device_t *); 258 static int sata_ioctl_unconfigure(sata_hba_inst_t *, sata_device_t *); 259 static int sata_ioctl_activate(sata_hba_inst_t *, sata_device_t *); 260 static int sata_ioctl_deactivate(sata_hba_inst_t *, sata_device_t *); 261 static int sata_ioctl_reset_port(sata_hba_inst_t *, sata_device_t *); 262 static int sata_ioctl_reset_device(sata_hba_inst_t *, sata_device_t *); 263 static int sata_ioctl_reset_all(sata_hba_inst_t *); 264 static int sata_ioctl_port_self_test(sata_hba_inst_t *, sata_device_t *); 265 static int sata_ioctl_get_device_path(sata_hba_inst_t *, sata_device_t *, 266 sata_ioctl_data_t *, int mode); 267 static int sata_ioctl_get_ap_type(sata_hba_inst_t *, sata_device_t *, 268 sata_ioctl_data_t *, int mode); 269 static int sata_ioctl_get_model_info(sata_hba_inst_t *, sata_device_t *, 270 sata_ioctl_data_t *, int mode); 271 static int sata_ioctl_get_revfirmware_info(sata_hba_inst_t *, sata_device_t *, 272 sata_ioctl_data_t *, int mode); 273 static int sata_ioctl_get_serialnumber_info(sata_hba_inst_t *, 274 sata_device_t *, sata_ioctl_data_t *, int mode); 275 276 /* 277 * Local functions 278 */ 279 static void sata_remove_hba_instance(dev_info_t *); 280 static int sata_validate_sata_hba_tran(dev_info_t *, sata_hba_tran_t *); 281 static void sata_probe_ports(sata_hba_inst_t *); 282 static void sata_probe_pmports(sata_hba_inst_t *, uint8_t); 283 static int sata_reprobe_port(sata_hba_inst_t *, sata_device_t *, int); 284 static int sata_reprobe_pmult(sata_hba_inst_t *, sata_device_t *, int); 285 static int sata_reprobe_pmport(sata_hba_inst_t *, sata_device_t *, int); 286 static int sata_alloc_pmult(sata_hba_inst_t *, sata_device_t *); 287 static void sata_free_pmult(sata_hba_inst_t *, sata_device_t *); 288 static int sata_add_device(dev_info_t *, sata_hba_inst_t *, sata_device_t *); 289 static int sata_offline_device(sata_hba_inst_t *, sata_device_t *, 290 sata_drive_info_t *); 291 static dev_info_t *sata_create_target_node(dev_info_t *, sata_hba_inst_t *, 292 sata_address_t *); 293 static void sata_remove_target_node(sata_hba_inst_t *, 294 sata_address_t *); 295 static int sata_validate_scsi_address(sata_hba_inst_t *, 296 struct scsi_address *, sata_device_t *); 297 static int sata_validate_sata_address(sata_hba_inst_t *, int, int, int); 298 static sata_pkt_t *sata_pkt_alloc(sata_pkt_txlate_t *, int (*)(caddr_t)); 299 static void sata_pkt_free(sata_pkt_txlate_t *); 300 static int sata_dma_buf_setup(sata_pkt_txlate_t *, int, int (*)(caddr_t), 301 caddr_t, ddi_dma_attr_t *); 302 static void sata_common_free_dma_rsrcs(sata_pkt_txlate_t *); 303 static int sata_probe_device(sata_hba_inst_t *, sata_device_t *); 304 static sata_drive_info_t *sata_get_device_info(sata_hba_inst_t *, 305 sata_device_t *); 306 static int sata_identify_device(sata_hba_inst_t *, sata_drive_info_t *); 307 static void sata_reidentify_device(sata_pkt_txlate_t *); 308 static struct buf *sata_alloc_local_buffer(sata_pkt_txlate_t *, int); 309 static void sata_free_local_buffer(sata_pkt_txlate_t *); 310 static uint64_t sata_check_capacity(sata_drive_info_t *); 311 void sata_adjust_dma_attr(sata_drive_info_t *, ddi_dma_attr_t *, 312 ddi_dma_attr_t *); 313 static int sata_fetch_device_identify_data(sata_hba_inst_t *, 314 sata_drive_info_t *); 315 static void sata_update_port_info(sata_hba_inst_t *, sata_device_t *); 316 static void sata_update_pmport_info(sata_hba_inst_t *, sata_device_t *); 317 static void sata_update_port_scr(sata_port_scr_t *, sata_device_t *); 318 static int sata_set_dma_mode(sata_hba_inst_t *, sata_drive_info_t *); 319 static int sata_set_cache_mode(sata_hba_inst_t *, sata_drive_info_t *, int); 320 static int sata_set_rmsn(sata_hba_inst_t *, sata_drive_info_t *, int); 321 static int sata_set_drive_features(sata_hba_inst_t *, 322 sata_drive_info_t *, int flag); 323 static void sata_init_write_cache_mode(sata_drive_info_t *sdinfo); 324 static int sata_initialize_device(sata_hba_inst_t *, sata_drive_info_t *); 325 static void sata_identdev_to_inquiry(sata_hba_inst_t *, sata_drive_info_t *, 326 uint8_t *); 327 static int sata_get_atapi_inquiry_data(sata_hba_inst_t *, sata_address_t *, 328 struct scsi_inquiry *); 329 static int sata_build_msense_page_1(sata_drive_info_t *, int, uint8_t *); 330 static int sata_build_msense_page_8(sata_drive_info_t *, int, uint8_t *); 331 static int sata_build_msense_page_1a(sata_drive_info_t *, int, uint8_t *); 332 static int sata_build_msense_page_1c(sata_drive_info_t *, int, uint8_t *); 333 static int sata_build_msense_page_30(sata_drive_info_t *, int, uint8_t *); 334 static int sata_mode_select_page_8(sata_pkt_txlate_t *, 335 struct mode_cache_scsi3 *, int, int *, int *, int *); 336 static int sata_mode_select_page_1a(sata_pkt_txlate_t *, 337 struct mode_info_power_cond *, int, int *, int *, int *); 338 static int sata_mode_select_page_1c(sata_pkt_txlate_t *, 339 struct mode_info_excpt_page *, int, int *, int *, int *); 340 static int sata_mode_select_page_30(sata_pkt_txlate_t *, 341 struct mode_acoustic_management *, int, int *, int *, int *); 342 343 static int sata_build_lsense_page_0(sata_drive_info_t *, uint8_t *); 344 static int sata_build_lsense_page_10(sata_drive_info_t *, uint8_t *, 345 sata_hba_inst_t *); 346 static int sata_build_lsense_page_2f(sata_drive_info_t *, uint8_t *, 347 sata_hba_inst_t *); 348 static int sata_build_lsense_page_30(sata_drive_info_t *, uint8_t *, 349 sata_hba_inst_t *); 350 static int sata_build_lsense_page_0e(sata_drive_info_t *, uint8_t *, 351 sata_pkt_txlate_t *); 352 353 static void sata_set_arq_data(sata_pkt_t *); 354 static void sata_build_read_verify_cmd(sata_cmd_t *, uint16_t, uint64_t); 355 static void sata_build_generic_cmd(sata_cmd_t *, uint8_t); 356 static uint8_t sata_get_standby_timer(uint8_t *timer); 357 358 static void sata_save_drive_settings(sata_drive_info_t *); 359 static void sata_show_drive_info(sata_hba_inst_t *, sata_drive_info_t *); 360 static void sata_show_pmult_info(sata_hba_inst_t *, sata_device_t *); 361 static void sata_log(sata_hba_inst_t *, uint_t, char *fmt, ...); 362 static void sata_trace_log(sata_hba_inst_t *, uint_t, const char *fmt, ...); 363 static int sata_fetch_smart_return_status(sata_hba_inst_t *, 364 sata_drive_info_t *); 365 static int sata_fetch_smart_data(sata_hba_inst_t *, sata_drive_info_t *, 366 struct smart_data *); 367 static int sata_smart_selftest_log(sata_hba_inst_t *, 368 sata_drive_info_t *, 369 struct smart_selftest_log *); 370 static int sata_ext_smart_selftest_read_log(sata_hba_inst_t *, 371 sata_drive_info_t *, struct smart_ext_selftest_log *, uint16_t); 372 static int sata_smart_read_log(sata_hba_inst_t *, sata_drive_info_t *, 373 uint8_t *, uint8_t, uint8_t); 374 static int sata_read_log_ext_directory(sata_hba_inst_t *, sata_drive_info_t *, 375 struct read_log_ext_directory *); 376 static void sata_gen_sysevent(sata_hba_inst_t *, sata_address_t *, int); 377 static void sata_xlate_errors(sata_pkt_txlate_t *); 378 static void sata_decode_device_error(sata_pkt_txlate_t *, 379 struct scsi_extended_sense *); 380 static void sata_set_device_removed(dev_info_t *); 381 static boolean_t sata_check_device_removed(dev_info_t *); 382 static void sata_set_target_node_cleanup(sata_hba_inst_t *, sata_address_t *); 383 static int sata_ncq_err_ret_cmd_setup(sata_pkt_txlate_t *, 384 sata_drive_info_t *); 385 static int sata_atapi_err_ret_cmd_setup(sata_pkt_txlate_t *, 386 sata_drive_info_t *); 387 static void sata_atapi_packet_cmd_setup(sata_cmd_t *, sata_drive_info_t *); 388 static void sata_fixed_sense_data_preset(struct scsi_extended_sense *); 389 static void sata_target_devid_register(dev_info_t *, sata_drive_info_t *); 390 static int sata_check_modser(char *, int); 391 392 /* 393 * FMA 394 */ 395 static boolean_t sata_check_for_dma_error(dev_info_t *, sata_pkt_txlate_t *); 396 397 398 /* 399 * SATA Framework will ignore SATA HBA driver cb_ops structure and 400 * register following one with SCSA framework. 401 * Open & close are provided, so scsi framework will not use its own 402 */ 403 static struct cb_ops sata_cb_ops = { 404 sata_hba_open, /* open */ 405 sata_hba_close, /* close */ 406 nodev, /* strategy */ 407 nodev, /* print */ 408 nodev, /* dump */ 409 nodev, /* read */ 410 nodev, /* write */ 411 sata_hba_ioctl, /* ioctl */ 412 nodev, /* devmap */ 413 nodev, /* mmap */ 414 nodev, /* segmap */ 415 nochpoll, /* chpoll */ 416 ddi_prop_op, /* cb_prop_op */ 417 0, /* streamtab */ 418 D_NEW | D_MP, /* cb_flag */ 419 CB_REV, /* rev */ 420 nodev, /* aread */ 421 nodev /* awrite */ 422 }; 423 424 425 extern struct mod_ops mod_miscops; 426 extern uchar_t scsi_cdb_size[]; 427 428 static struct modlmisc modlmisc = { 429 &mod_miscops, /* Type of module */ 430 "SATA Module" /* module name */ 431 }; 432 433 434 static struct modlinkage modlinkage = { 435 MODREV_1, 436 (void *)&modlmisc, 437 NULL 438 }; 439 440 /* 441 * Default sata pkt timeout. Used when a target driver scsi_pkt time is zero, 442 * i.e. when scsi_pkt has not timeout specified. 443 */ 444 static int sata_default_pkt_time = 60; /* 60 seconds */ 445 446 /* 447 * Intermediate buffer device access attributes - they are required, 448 * but not necessarily used. 449 */ 450 static ddi_device_acc_attr_t sata_acc_attr = { 451 DDI_DEVICE_ATTR_V0, 452 DDI_STRUCTURE_LE_ACC, 453 DDI_STRICTORDER_ACC 454 }; 455 456 457 /* 458 * Mutexes protecting structures in multithreaded operations. 459 * Because events are relatively rare, a single global mutex protecting 460 * data structures should be sufficient. To increase performance, add 461 * separate mutex per each sata port and use global mutex only to protect 462 * common data structures. 463 */ 464 static kmutex_t sata_mutex; /* protects sata_hba_list */ 465 static kmutex_t sata_log_mutex; /* protects log */ 466 467 static char sata_log_buf[256]; 468 469 /* 470 * sata trace debug 471 */ 472 static sata_trace_rbuf_t *sata_debug_rbuf; 473 static sata_trace_dmsg_t *sata_trace_dmsg_alloc(void); 474 static void sata_trace_dmsg_free(void); 475 static void sata_trace_rbuf_alloc(void); 476 static void sata_trace_rbuf_free(void); 477 478 int dmsg_ring_size = DMSG_RING_SIZE; 479 480 /* Default write cache setting for SATA hard disks */ 481 int sata_write_cache = 1; /* enabled */ 482 483 /* Default write cache setting for SATA ATAPI CD/DVD */ 484 int sata_atapicdvd_write_cache = 1; /* enabled */ 485 486 /* Default write cache setting for SATA ATAPI tape */ 487 int sata_atapitape_write_cache = 1; /* enabled */ 488 489 /* Default write cache setting for SATA ATAPI disk */ 490 int sata_atapidisk_write_cache = 1; /* enabled */ 491 492 /* 493 * Linked list of HBA instances 494 */ 495 static sata_hba_inst_t *sata_hba_list = NULL; 496 static sata_hba_inst_t *sata_hba_list_tail = NULL; 497 /* 498 * Pointer to per-instance SATA HBA soft structure is stored in sata_hba_tran 499 * structure and in sata soft state. 500 */ 501 502 /* 503 * Event daemon related variables 504 */ 505 static kmutex_t sata_event_mutex; 506 static kcondvar_t sata_event_cv; 507 static kthread_t *sata_event_thread = NULL; 508 static int sata_event_thread_terminate = 0; 509 static int sata_event_pending = 0; 510 static int sata_event_thread_active = 0; 511 extern pri_t minclsyspri; 512 513 /* 514 * NCQ error recovery command 515 */ 516 static const sata_cmd_t sata_rle_cmd = { 517 SATA_CMD_REV, 518 NULL, 519 { 520 SATA_DIR_READ 521 }, 522 ATA_ADDR_LBA48, 523 0, 524 0, 525 0, 526 0, 527 0, 528 1, 529 READ_LOG_EXT_NCQ_ERROR_RECOVERY, 530 0, 531 0, 532 0, 533 SATAC_READ_LOG_EXT, 534 0, 535 0, 536 0, 537 }; 538 539 /* 540 * ATAPI error recovery CDB 541 */ 542 static const uint8_t sata_rqsense_cdb[SATA_ATAPI_RQSENSE_CDB_LEN] = { 543 SCMD_REQUEST_SENSE, 544 0, /* Only fixed RQ format is supported */ 545 0, 546 0, 547 SATA_ATAPI_MIN_RQSENSE_LEN, /* Less data may be returned */ 548 0 549 }; 550 551 552 /* Warlock directives */ 553 554 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", scsi_hba_tran)) 555 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", scsi_device)) 556 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", dev_ops)) 557 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", scsi_extended_sense)) 558 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", scsi_arq_status)) 559 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", ddi_dma_attr)) 560 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", ddi_dma_cookie_t)) 561 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", devctl_ap_state)) 562 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", dev_info::devi_state)) 563 _NOTE(MUTEX_PROTECTS_DATA(sata_mutex, sata_hba_list)) 564 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_hba_list)) 565 _NOTE(MUTEX_PROTECTS_DATA(sata_mutex, sata_hba_inst::satahba_next)) 566 _NOTE(MUTEX_PROTECTS_DATA(sata_mutex, sata_hba_inst::satahba_prev)) 567 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", \ 568 sata_hba_inst::satahba_scsi_tran)) 569 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", sata_hba_inst::satahba_tran)) 570 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", sata_hba_inst::satahba_dip)) 571 _NOTE(SCHEME_PROTECTS_DATA("Scheme", sata_hba_inst::satahba_attached)) 572 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_hba_inst::satahba_dev_port)) 573 _NOTE(MUTEX_PROTECTS_DATA(sata_hba_inst::satahba_mutex, 574 sata_hba_inst::satahba_event_flags)) 575 _NOTE(MUTEX_PROTECTS_DATA(sata_cport_info::cport_mutex, \ 576 sata_cport_info::cport_devp)) 577 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_cport_info::cport_devp)) 578 _NOTE(SCHEME_PROTECTS_DATA("Scheme", sata_cport_info::cport_addr)) 579 _NOTE(MUTEX_PROTECTS_DATA(sata_cport_info::cport_mutex, \ 580 sata_cport_info::cport_dev_type)) 581 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_cport_info::cport_dev_type)) 582 _NOTE(MUTEX_PROTECTS_DATA(sata_cport_info::cport_mutex, \ 583 sata_cport_info::cport_state)) 584 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_cport_info::cport_state)) 585 _NOTE(MUTEX_PROTECTS_DATA(sata_pmport_info::pmport_mutex, \ 586 sata_pmport_info::pmport_state)) 587 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_pmport_info::pmport_state)) 588 _NOTE(MUTEX_PROTECTS_DATA(sata_pmport_info::pmport_mutex, \ 589 sata_pmport_info::pmport_dev_type)) 590 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_pmport_info::pmport_dev_type)) 591 _NOTE(MUTEX_PROTECTS_DATA(sata_pmport_info::pmport_mutex, \ 592 sata_pmport_info::pmport_sata_drive)) 593 _NOTE(MUTEX_PROTECTS_DATA(sata_pmport_info::pmport_mutex, \ 594 sata_pmport_info::pmport_tgtnode_clean)) 595 _NOTE(MUTEX_PROTECTS_DATA(sata_pmport_info::pmport_mutex, \ 596 sata_pmport_info::pmport_event_flags)) 597 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_pmport_info::pmport_sata_drive)) 598 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_pmult_info::pmult_dev_port)) 599 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_pmult_info::pmult_num_dev_ports)) 600 #ifdef SATA_DEBUG 601 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", mbuf_count)) 602 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", mbuffail_count)) 603 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", sata_atapi_trace)) 604 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", sata_atapi_trace_index)) 605 #endif 606 607 /* End of warlock directives */ 608 609 /* ************** loadable module configuration functions ************** */ 610 611 int 612 _init() 613 { 614 int rval; 615 616 mutex_init(&sata_mutex, NULL, MUTEX_DRIVER, NULL); 617 mutex_init(&sata_event_mutex, NULL, MUTEX_DRIVER, NULL); 618 mutex_init(&sata_log_mutex, NULL, MUTEX_DRIVER, NULL); 619 cv_init(&sata_event_cv, NULL, CV_DRIVER, NULL); 620 sata_trace_rbuf_alloc(); 621 if ((rval = mod_install(&modlinkage)) != 0) { 622 #ifdef SATA_DEBUG 623 cmn_err(CE_WARN, "sata: _init: mod_install failed\n"); 624 #endif 625 sata_trace_rbuf_free(); 626 mutex_destroy(&sata_log_mutex); 627 cv_destroy(&sata_event_cv); 628 mutex_destroy(&sata_event_mutex); 629 mutex_destroy(&sata_mutex); 630 } 631 return (rval); 632 } 633 634 int 635 _fini() 636 { 637 int rval; 638 639 if ((rval = mod_remove(&modlinkage)) != 0) 640 return (rval); 641 642 sata_trace_rbuf_free(); 643 mutex_destroy(&sata_log_mutex); 644 cv_destroy(&sata_event_cv); 645 mutex_destroy(&sata_event_mutex); 646 mutex_destroy(&sata_mutex); 647 return (rval); 648 } 649 650 int 651 _info(struct modinfo *modinfop) 652 { 653 return (mod_info(&modlinkage, modinfop)); 654 } 655 656 657 658 /* ********************* SATA HBA entry points ********************* */ 659 660 661 /* 662 * Called by SATA HBA from _init(). 663 * Registers HBA driver instance/sata framework pair with scsi framework, by 664 * calling scsi_hba_init(). 665 * 666 * SATA HBA driver cb_ops are ignored - SATA HBA framework cb_ops are used 667 * instead. SATA HBA framework cb_ops pointer overwrites SATA HBA driver 668 * cb_ops pointer in SATA HBA driver dev_ops structure. 669 * SATA HBA framework cb_ops supplies cb_open cb_close and cb_ioctl vectors. 670 * 671 * Return status of the scsi_hba_init() is returned to a calling SATA HBA 672 * driver. 673 */ 674 int 675 sata_hba_init(struct modlinkage *modlp) 676 { 677 int rval; 678 struct dev_ops *hba_ops; 679 680 SATADBG1(SATA_DBG_HBA_IF, NULL, 681 "sata_hba_init: name %s \n", 682 ((struct modldrv *)(modlp->ml_linkage[0]))->drv_linkinfo); 683 /* 684 * Fill-up cb_ops and dev_ops when necessary 685 */ 686 hba_ops = ((struct modldrv *)(modlp->ml_linkage[0]))->drv_dev_ops; 687 /* 688 * Provide pointer to SATA dev_ops 689 */ 690 hba_ops->devo_cb_ops = &sata_cb_ops; 691 692 /* 693 * Register SATA HBA with SCSI framework 694 */ 695 if ((rval = scsi_hba_init(modlp)) != 0) { 696 SATADBG1(SATA_DBG_HBA_IF, NULL, 697 "sata_hba_init: scsi hba init failed\n", NULL); 698 return (rval); 699 } 700 701 return (0); 702 } 703 704 705 /* HBA attach stages */ 706 #define HBA_ATTACH_STAGE_SATA_HBA_INST 1 707 #define HBA_ATTACH_STAGE_SCSI_ATTACHED 2 708 #define HBA_ATTACH_STAGE_SETUP 4 709 #define HBA_ATTACH_STAGE_LINKED 8 710 711 712 /* 713 * 714 * Called from SATA HBA driver's attach routine to attach an instance of 715 * the HBA. 716 * 717 * For DDI_ATTACH command: 718 * sata_hba_inst structure is allocated here and initialized with pointers to 719 * SATA framework implementation of required scsi tran functions. 720 * The scsi_tran's tran_hba_private field is used by SATA Framework to point 721 * to the soft structure (sata_hba_inst) allocated by SATA framework for 722 * SATA HBA instance related data. 723 * The scsi_tran's tran_hba_private field is used by SATA framework to 724 * store a pointer to per-HBA-instance of sata_hba_inst structure. 725 * The sata_hba_inst structure is cross-linked to scsi tran structure. 726 * Among other info, a pointer to sata_hba_tran structure is stored in 727 * sata_hba_inst. The sata_hba_inst structures for different HBA instances are 728 * linked together into the list, pointed to by sata_hba_list. 729 * On the first HBA instance attach the sata event thread is initialized. 730 * Attachment points are created for all SATA ports of the HBA being attached. 731 * All HBA instance's SATA ports are probed and type of plugged devices is 732 * determined. For each device of a supported type, a target node is created. 733 * 734 * DDI_SUCCESS is returned when attachment process is successful, 735 * DDI_FAILURE is returned otherwise. 736 * 737 * For DDI_RESUME command: 738 * Not implemented at this time (postponed until phase 2 of the development). 739 */ 740 int 741 sata_hba_attach(dev_info_t *dip, sata_hba_tran_t *sata_tran, 742 ddi_attach_cmd_t cmd) 743 { 744 sata_hba_inst_t *sata_hba_inst; 745 scsi_hba_tran_t *scsi_tran = NULL; 746 int hba_attach_state = 0; 747 char taskq_name[MAXPATHLEN]; 748 749 SATADBG3(SATA_DBG_HBA_IF, NULL, 750 "sata_hba_attach: node %s (%s%d)\n", 751 ddi_node_name(dip), ddi_driver_name(dip), 752 ddi_get_instance(dip)); 753 754 if (cmd == DDI_RESUME) { 755 /* 756 * Postponed until phase 2 of the development 757 */ 758 return (DDI_FAILURE); 759 } 760 761 if (cmd != DDI_ATTACH) { 762 return (DDI_FAILURE); 763 } 764 765 /* cmd == DDI_ATTACH */ 766 767 if (sata_validate_sata_hba_tran(dip, sata_tran) != SATA_SUCCESS) { 768 SATA_LOG_D((NULL, CE_WARN, 769 "sata_hba_attach: invalid sata_hba_tran")); 770 return (DDI_FAILURE); 771 } 772 /* 773 * Allocate and initialize SCSI tran structure. 774 * SATA copy of tran_bus_config is provided to create port nodes. 775 */ 776 scsi_tran = scsi_hba_tran_alloc(dip, SCSI_HBA_CANSLEEP); 777 if (scsi_tran == NULL) 778 return (DDI_FAILURE); 779 /* 780 * Allocate soft structure for SATA HBA instance. 781 * There is a separate softstate for each HBA instance. 782 */ 783 sata_hba_inst = kmem_zalloc(sizeof (struct sata_hba_inst), KM_SLEEP); 784 ASSERT(sata_hba_inst != NULL); /* this should not fail */ 785 mutex_init(&sata_hba_inst->satahba_mutex, NULL, MUTEX_DRIVER, NULL); 786 hba_attach_state |= HBA_ATTACH_STAGE_SATA_HBA_INST; 787 788 /* 789 * scsi_trans's tran_hba_private is used by SATA Framework to point to 790 * soft structure allocated by SATA framework for 791 * SATA HBA instance related data. 792 */ 793 scsi_tran->tran_hba_private = sata_hba_inst; 794 scsi_tran->tran_tgt_private = NULL; 795 796 scsi_tran->tran_tgt_init = sata_scsi_tgt_init; 797 scsi_tran->tran_tgt_probe = sata_scsi_tgt_probe; 798 scsi_tran->tran_tgt_free = sata_scsi_tgt_free; 799 800 scsi_tran->tran_start = sata_scsi_start; 801 scsi_tran->tran_reset = sata_scsi_reset; 802 scsi_tran->tran_abort = sata_scsi_abort; 803 scsi_tran->tran_getcap = sata_scsi_getcap; 804 scsi_tran->tran_setcap = sata_scsi_setcap; 805 scsi_tran->tran_init_pkt = sata_scsi_init_pkt; 806 scsi_tran->tran_destroy_pkt = sata_scsi_destroy_pkt; 807 808 scsi_tran->tran_dmafree = sata_scsi_dmafree; 809 scsi_tran->tran_sync_pkt = sata_scsi_sync_pkt; 810 811 scsi_tran->tran_reset_notify = NULL; 812 scsi_tran->tran_get_bus_addr = NULL; 813 scsi_tran->tran_quiesce = NULL; 814 scsi_tran->tran_unquiesce = NULL; 815 scsi_tran->tran_bus_reset = NULL; 816 817 if (scsi_hba_attach_setup(dip, sata_tran->sata_tran_hba_dma_attr, 818 scsi_tran, 0) != DDI_SUCCESS) { 819 #ifdef SATA_DEBUG 820 cmn_err(CE_WARN, "?SATA: %s%d hba scsi attach failed", 821 ddi_driver_name(dip), ddi_get_instance(dip)); 822 #endif 823 goto fail; 824 } 825 hba_attach_state |= HBA_ATTACH_STAGE_SCSI_ATTACHED; 826 827 if (!ddi_prop_exists(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS, "sata")) { 828 if (ddi_prop_update_int(DDI_DEV_T_NONE, dip, 829 "sata", 1) != DDI_PROP_SUCCESS) { 830 SATA_LOG_D((NULL, CE_WARN, "sata_hba_attach: " 831 "failed to create hba sata prop")); 832 goto fail; 833 } 834 } 835 836 /* 837 * Save pointers in hba instance soft state. 838 */ 839 sata_hba_inst->satahba_scsi_tran = scsi_tran; 840 sata_hba_inst->satahba_tran = sata_tran; 841 sata_hba_inst->satahba_dip = dip; 842 843 /* 844 * Create a task queue to handle emulated commands completion 845 * Use node name, dash, instance number as the queue name. 846 */ 847 taskq_name[0] = '\0'; 848 (void) strlcat(taskq_name, DEVI(dip)->devi_node_name, 849 sizeof (taskq_name)); 850 (void) snprintf(taskq_name + strlen(taskq_name), 851 sizeof (taskq_name) - strlen(taskq_name), 852 "-%d", DEVI(dip)->devi_instance); 853 sata_hba_inst->satahba_taskq = taskq_create(taskq_name, 1, 854 minclsyspri, 1, sata_tran->sata_tran_hba_num_cports * 4, 855 TASKQ_DYNAMIC); 856 857 hba_attach_state |= HBA_ATTACH_STAGE_SETUP; 858 859 /* 860 * Create events thread if not created yet. 861 */ 862 sata_event_thread_control(1); 863 864 /* 865 * Link this hba instance into the list. 866 */ 867 mutex_enter(&sata_mutex); 868 869 if (sata_hba_list == NULL) { 870 /* 871 * The first instance of HBA is attached. 872 * Set current/active default maximum NCQ/TCQ queue depth for 873 * all SATA devices. It is done here and now, to eliminate the 874 * possibility of the dynamic, programatic modification of the 875 * queue depth via global (and public) sata_max_queue_depth 876 * variable (this would require special handling in HBA drivers) 877 */ 878 sata_current_max_qdepth = sata_max_queue_depth; 879 if (sata_current_max_qdepth > 32) 880 sata_current_max_qdepth = 32; 881 else if (sata_current_max_qdepth < 1) 882 sata_current_max_qdepth = 1; 883 } 884 885 sata_hba_inst->satahba_next = NULL; 886 sata_hba_inst->satahba_prev = sata_hba_list_tail; 887 if (sata_hba_list == NULL) { 888 sata_hba_list = sata_hba_inst; 889 } 890 if (sata_hba_list_tail != NULL) { 891 sata_hba_list_tail->satahba_next = sata_hba_inst; 892 } 893 sata_hba_list_tail = sata_hba_inst; 894 mutex_exit(&sata_mutex); 895 hba_attach_state |= HBA_ATTACH_STAGE_LINKED; 896 897 /* 898 * Create SATA HBA devctl minor node for sata_hba_open, close, ioctl 899 * SATA HBA driver should not use its own open/close entry points. 900 * 901 * Make sure that instance number doesn't overflow 902 * when forming minor numbers. 903 */ 904 ASSERT(ddi_get_instance(dip) <= (L_MAXMIN >> INST_MINOR_SHIFT)); 905 if (ddi_create_minor_node(dip, "devctl", S_IFCHR, 906 INST2DEVCTL(ddi_get_instance(dip)), 907 DDI_NT_SATA_NEXUS, 0) != DDI_SUCCESS) { 908 #ifdef SATA_DEBUG 909 cmn_err(CE_WARN, "sata_hba_attach: " 910 "cannot create devctl minor node"); 911 #endif 912 goto fail; 913 } 914 915 916 /* 917 * Set-up kstats here, if necessary. 918 * (postponed until future phase of the development). 919 */ 920 921 /* 922 * Indicate that HBA is attached. This will enable events processing 923 * for this HBA. 924 */ 925 sata_hba_inst->satahba_attached = 1; 926 /* 927 * Probe controller ports. This operation will describe a current 928 * controller/port/multipliers/device configuration and will create 929 * attachment points. 930 * We may end-up with just a controller with no devices attached. 931 * For the ports with a supported device attached, device target nodes 932 * are created and devices are initialized. 933 */ 934 sata_probe_ports(sata_hba_inst); 935 936 return (DDI_SUCCESS); 937 938 fail: 939 if (hba_attach_state & HBA_ATTACH_STAGE_LINKED) { 940 (void) sata_remove_hba_instance(dip); 941 if (sata_hba_list == NULL) 942 sata_event_thread_control(0); 943 } 944 945 if (hba_attach_state & HBA_ATTACH_STAGE_SETUP) { 946 (void) ddi_prop_remove(DDI_DEV_T_ANY, dip, "sata"); 947 taskq_destroy(sata_hba_inst->satahba_taskq); 948 } 949 950 if (hba_attach_state & HBA_ATTACH_STAGE_SCSI_ATTACHED) 951 (void) scsi_hba_detach(dip); 952 953 if (hba_attach_state & HBA_ATTACH_STAGE_SATA_HBA_INST) { 954 mutex_destroy(&sata_hba_inst->satahba_mutex); 955 kmem_free((void *)sata_hba_inst, 956 sizeof (struct sata_hba_inst)); 957 scsi_hba_tran_free(scsi_tran); 958 } 959 960 sata_log(NULL, CE_WARN, "?SATA: %s%d hba attach failed", 961 ddi_driver_name(dip), ddi_get_instance(dip)); 962 963 return (DDI_FAILURE); 964 } 965 966 967 /* 968 * Called by SATA HBA from to detach an instance of the driver. 969 * 970 * For DDI_DETACH command: 971 * Free local structures allocated for SATA HBA instance during 972 * sata_hba_attach processing. 973 * 974 * Returns DDI_SUCCESS when HBA was detached, DDI_FAILURE otherwise. 975 * 976 * For DDI_SUSPEND command: 977 * Not implemented at this time (postponed until phase 2 of the development) 978 * Returnd DDI_SUCCESS. 979 * 980 * When the last HBA instance is detached, the event daemon is terminated. 981 * 982 * NOTE: Port multiplier is supported. 983 */ 984 int 985 sata_hba_detach(dev_info_t *dip, ddi_detach_cmd_t cmd) 986 { 987 dev_info_t *tdip; 988 sata_hba_inst_t *sata_hba_inst; 989 scsi_hba_tran_t *scsi_hba_tran; 990 sata_cport_info_t *cportinfo; 991 sata_pmult_info_t *pminfo; 992 sata_drive_info_t *sdinfo; 993 sata_device_t sdevice; 994 int ncport, npmport; 995 996 SATADBG3(SATA_DBG_HBA_IF, NULL, "sata_hba_detach: node %s (%s%d)\n", 997 ddi_node_name(dip), ddi_driver_name(dip), ddi_get_instance(dip)); 998 999 switch (cmd) { 1000 case DDI_DETACH: 1001 1002 if ((scsi_hba_tran = ddi_get_driver_private(dip)) == NULL) 1003 return (DDI_FAILURE); 1004 1005 sata_hba_inst = scsi_hba_tran->tran_hba_private; 1006 if (sata_hba_inst == NULL) 1007 return (DDI_FAILURE); 1008 1009 if (scsi_hba_detach(dip) == DDI_FAILURE) { 1010 sata_hba_inst->satahba_attached = 1; 1011 return (DDI_FAILURE); 1012 } 1013 1014 /* 1015 * Free all target nodes - at this point 1016 * devices should be at least offlined 1017 * otherwise scsi_hba_detach() should not be called. 1018 */ 1019 for (ncport = 0; ncport < SATA_NUM_CPORTS(sata_hba_inst); 1020 ncport++) { 1021 cportinfo = SATA_CPORT_INFO(sata_hba_inst, ncport); 1022 if (cportinfo->cport_dev_type != SATA_DTYPE_PMULT) { 1023 sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo); 1024 if (sdinfo != NULL) { 1025 tdip = sata_get_target_dip(dip, 1026 ncport, 0); 1027 if (tdip != NULL) { 1028 if (ndi_devi_offline(tdip, 1029 NDI_DEVI_REMOVE) != 1030 NDI_SUCCESS) { 1031 SATA_LOG_D(( 1032 sata_hba_inst, 1033 CE_WARN, 1034 "sata_hba_detach: " 1035 "Target node not " 1036 "removed !")); 1037 return (DDI_FAILURE); 1038 } 1039 } 1040 } 1041 } else { /* SATA_DTYPE_PMULT */ 1042 mutex_enter(&cportinfo->cport_mutex); 1043 pminfo = SATA_CPORTINFO_PMULT_INFO(cportinfo); 1044 1045 if (pminfo == NULL) { 1046 SATA_LOG_D((sata_hba_inst, CE_WARN, 1047 "sata_hba_detach: Port multiplier " 1048 "not ready yet!")); 1049 mutex_exit(&cportinfo->cport_mutex); 1050 return (DDI_FAILURE); 1051 } 1052 1053 /* 1054 * Detach would fail if removal of any of the 1055 * target nodes is failed - albeit in that 1056 * case some of them may have been removed. 1057 */ 1058 for (npmport = 0; npmport < SATA_NUM_PMPORTS( 1059 sata_hba_inst, ncport); npmport++) { 1060 tdip = sata_get_target_dip(dip, ncport, 1061 npmport); 1062 if (tdip != NULL) { 1063 if (ndi_devi_offline(tdip, 1064 NDI_DEVI_REMOVE) != 1065 NDI_SUCCESS) { 1066 SATA_LOG_D(( 1067 sata_hba_inst, 1068 CE_WARN, 1069 "sata_hba_detach: " 1070 "Target node not " 1071 "removed !")); 1072 mutex_exit(&cportinfo-> 1073 cport_mutex); 1074 return (DDI_FAILURE); 1075 } 1076 } 1077 } 1078 mutex_exit(&cportinfo->cport_mutex); 1079 } 1080 } 1081 /* 1082 * Disable sata event daemon processing for this HBA 1083 */ 1084 sata_hba_inst->satahba_attached = 0; 1085 1086 /* 1087 * Remove event daemon thread, if it is last HBA instance. 1088 */ 1089 1090 mutex_enter(&sata_mutex); 1091 if (sata_hba_list->satahba_next == NULL) { 1092 mutex_exit(&sata_mutex); 1093 sata_event_thread_control(0); 1094 mutex_enter(&sata_mutex); 1095 } 1096 mutex_exit(&sata_mutex); 1097 1098 /* Remove this HBA instance from the HBA list */ 1099 sata_remove_hba_instance(dip); 1100 1101 /* 1102 * At this point there should be no target nodes attached. 1103 * Detach and destroy device and port info structures. 1104 */ 1105 for (ncport = 0; ncport < SATA_NUM_CPORTS(sata_hba_inst); 1106 ncport++) { 1107 cportinfo = SATA_CPORT_INFO(sata_hba_inst, ncport); 1108 if (cportinfo->cport_dev_type != SATA_DTYPE_PMULT) { 1109 sdinfo = 1110 cportinfo->cport_devp.cport_sata_drive; 1111 if (sdinfo != NULL) { 1112 /* Release device structure */ 1113 kmem_free(sdinfo, 1114 sizeof (sata_drive_info_t)); 1115 } 1116 /* Release cport info */ 1117 mutex_destroy(&cportinfo->cport_mutex); 1118 kmem_free(cportinfo, 1119 sizeof (sata_cport_info_t)); 1120 } else { /* SATA_DTYPE_PMULT */ 1121 sdevice.satadev_addr.cport = (uint8_t)ncport; 1122 sdevice.satadev_addr.qual = SATA_ADDR_PMULT; 1123 sata_free_pmult(sata_hba_inst, &sdevice); 1124 } 1125 } 1126 1127 scsi_hba_tran_free(sata_hba_inst->satahba_scsi_tran); 1128 1129 (void) ddi_prop_remove(DDI_DEV_T_ANY, dip, "sata"); 1130 1131 taskq_destroy(sata_hba_inst->satahba_taskq); 1132 1133 mutex_destroy(&sata_hba_inst->satahba_mutex); 1134 kmem_free((void *)sata_hba_inst, 1135 sizeof (struct sata_hba_inst)); 1136 1137 return (DDI_SUCCESS); 1138 1139 case DDI_SUSPEND: 1140 /* 1141 * Postponed until phase 2 1142 */ 1143 return (DDI_FAILURE); 1144 1145 default: 1146 return (DDI_FAILURE); 1147 } 1148 } 1149 1150 1151 /* 1152 * Called by an HBA drive from _fini() routine. 1153 * Unregisters SATA HBA instance/SATA framework pair from the scsi framework. 1154 */ 1155 void 1156 sata_hba_fini(struct modlinkage *modlp) 1157 { 1158 SATADBG1(SATA_DBG_HBA_IF, NULL, 1159 "sata_hba_fini: name %s\n", 1160 ((struct modldrv *)(modlp->ml_linkage[0]))->drv_linkinfo); 1161 1162 scsi_hba_fini(modlp); 1163 } 1164 1165 1166 /* 1167 * Default open and close routine for sata_hba framework. 1168 * 1169 */ 1170 /* 1171 * Open devctl node. 1172 * 1173 * Returns: 1174 * 0 if node was open successfully, error code otherwise. 1175 * 1176 * 1177 */ 1178 1179 static int 1180 sata_hba_open(dev_t *devp, int flags, int otyp, cred_t *credp) 1181 { 1182 #ifndef __lock_lint 1183 _NOTE(ARGUNUSED(credp)) 1184 #endif 1185 int rv = 0; 1186 dev_info_t *dip; 1187 scsi_hba_tran_t *scsi_hba_tran; 1188 sata_hba_inst_t *sata_hba_inst; 1189 1190 SATADBG1(SATA_DBG_IOCTL_IF, NULL, "sata_hba_open: entered", NULL); 1191 1192 if (otyp != OTYP_CHR) 1193 return (EINVAL); 1194 1195 dip = sata_devt_to_devinfo(*devp); 1196 if (dip == NULL) 1197 return (ENXIO); 1198 1199 if ((scsi_hba_tran = ddi_get_driver_private(dip)) == NULL) 1200 return (ENXIO); 1201 1202 sata_hba_inst = scsi_hba_tran->tran_hba_private; 1203 if (sata_hba_inst == NULL || sata_hba_inst->satahba_attached == 0) 1204 return (ENXIO); 1205 1206 mutex_enter(&sata_mutex); 1207 if (flags & FEXCL) { 1208 if (sata_hba_inst->satahba_open_flag != 0) { 1209 rv = EBUSY; 1210 } else { 1211 sata_hba_inst->satahba_open_flag = 1212 SATA_DEVCTL_EXOPENED; 1213 } 1214 } else { 1215 if (sata_hba_inst->satahba_open_flag == SATA_DEVCTL_EXOPENED) { 1216 rv = EBUSY; 1217 } else { 1218 sata_hba_inst->satahba_open_flag = 1219 SATA_DEVCTL_SOPENED; 1220 } 1221 } 1222 mutex_exit(&sata_mutex); 1223 1224 return (rv); 1225 } 1226 1227 1228 /* 1229 * Close devctl node. 1230 * Returns: 1231 * 0 if node was closed successfully, error code otherwise. 1232 * 1233 */ 1234 1235 static int 1236 sata_hba_close(dev_t dev, int flag, int otyp, cred_t *credp) 1237 { 1238 #ifndef __lock_lint 1239 _NOTE(ARGUNUSED(credp)) 1240 _NOTE(ARGUNUSED(flag)) 1241 #endif 1242 dev_info_t *dip; 1243 scsi_hba_tran_t *scsi_hba_tran; 1244 sata_hba_inst_t *sata_hba_inst; 1245 1246 SATADBG1(SATA_DBG_IOCTL_IF, NULL, "sata_hba_close: entered", NULL); 1247 1248 if (otyp != OTYP_CHR) 1249 return (EINVAL); 1250 1251 dip = sata_devt_to_devinfo(dev); 1252 if (dip == NULL) 1253 return (ENXIO); 1254 1255 if ((scsi_hba_tran = ddi_get_driver_private(dip)) == NULL) 1256 return (ENXIO); 1257 1258 sata_hba_inst = scsi_hba_tran->tran_hba_private; 1259 if (sata_hba_inst == NULL || sata_hba_inst->satahba_attached == 0) 1260 return (ENXIO); 1261 1262 mutex_enter(&sata_mutex); 1263 sata_hba_inst->satahba_open_flag = 0; 1264 mutex_exit(&sata_mutex); 1265 return (0); 1266 } 1267 1268 1269 1270 /* 1271 * Standard IOCTL commands for SATA hotplugging. 1272 * Implemented DEVCTL_AP commands: 1273 * DEVCTL_AP_CONNECT 1274 * DEVCTL_AP_DISCONNECT 1275 * DEVCTL_AP_CONFIGURE 1276 * DEVCTL_UNCONFIGURE 1277 * DEVCTL_AP_CONTROL 1278 * 1279 * Commands passed to default ndi ioctl handler: 1280 * DEVCTL_DEVICE_GETSTATE 1281 * DEVCTL_DEVICE_ONLINE 1282 * DEVCTL_DEVICE_OFFLINE 1283 * DEVCTL_DEVICE_REMOVE 1284 * DEVCTL_DEVICE_INSERT 1285 * DEVCTL_BUS_GETSTATE 1286 * 1287 * All other cmds are passed to HBA if it provide ioctl handler, or failed 1288 * if not. 1289 * 1290 * Returns: 1291 * 0 if successful, 1292 * error code if operation failed. 1293 * 1294 * Port Multiplier support is supported now. 1295 * 1296 * NOTE: qual should be SATA_ADDR_DCPORT or SATA_ADDR_DPMPORT 1297 */ 1298 1299 static int 1300 sata_hba_ioctl(dev_t dev, int cmd, intptr_t arg, int mode, cred_t *credp, 1301 int *rvalp) 1302 { 1303 #ifndef __lock_lint 1304 _NOTE(ARGUNUSED(credp)) 1305 _NOTE(ARGUNUSED(rvalp)) 1306 #endif 1307 int rv = 0; 1308 int32_t comp_port = -1; 1309 dev_info_t *dip; 1310 devctl_ap_state_t ap_state; 1311 struct devctl_iocdata *dcp = NULL; 1312 scsi_hba_tran_t *scsi_hba_tran; 1313 sata_hba_inst_t *sata_hba_inst; 1314 sata_device_t sata_device; 1315 sata_cport_info_t *cportinfo; 1316 int cport, pmport, qual; 1317 int rval = SATA_SUCCESS; 1318 1319 dip = sata_devt_to_devinfo(dev); 1320 if (dip == NULL) 1321 return (ENXIO); 1322 1323 if ((scsi_hba_tran = ddi_get_driver_private(dip)) == NULL) 1324 return (ENXIO); 1325 1326 sata_hba_inst = scsi_hba_tran->tran_hba_private; 1327 if (sata_hba_inst == NULL) 1328 return (ENXIO); 1329 1330 if (sata_hba_inst->satahba_tran == NULL) 1331 return (ENXIO); 1332 1333 switch (cmd) { 1334 1335 case DEVCTL_DEVICE_GETSTATE: 1336 case DEVCTL_DEVICE_ONLINE: 1337 case DEVCTL_DEVICE_OFFLINE: 1338 case DEVCTL_DEVICE_REMOVE: 1339 case DEVCTL_BUS_GETSTATE: 1340 /* 1341 * There may be more cases that we want to pass to default 1342 * handler rather than fail them. 1343 */ 1344 return (ndi_devctl_ioctl(dip, cmd, arg, mode, 0)); 1345 } 1346 1347 /* read devctl ioctl data */ 1348 if (cmd != DEVCTL_AP_CONTROL) { 1349 if (ndi_dc_allochdl((void *)arg, &dcp) != NDI_SUCCESS) 1350 return (EFAULT); 1351 1352 if ((comp_port = sata_get_port_num(sata_hba_inst, dcp)) == 1353 -1) { 1354 if (dcp) 1355 ndi_dc_freehdl(dcp); 1356 return (EINVAL); 1357 } 1358 1359 /* 1360 * According to SCSI_TO_SATA_ADDR_QUAL, qual should be either 1361 * SATA_ADDR_DCPORT or SATA_ADDR_DPMPORT. 1362 */ 1363 cport = SCSI_TO_SATA_CPORT(comp_port); 1364 pmport = SCSI_TO_SATA_PMPORT(comp_port); 1365 qual = SCSI_TO_SATA_ADDR_QUAL(comp_port); 1366 1367 if (sata_validate_sata_address(sata_hba_inst, cport, pmport, 1368 qual) != 0) { 1369 ndi_dc_freehdl(dcp); 1370 return (EINVAL); 1371 } 1372 1373 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport); 1374 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)-> 1375 cport_mutex); 1376 if (cportinfo->cport_event_flags & SATA_EVNT_LOCK_PORT_BUSY) { 1377 /* 1378 * Cannot process ioctl request now. Come back later. 1379 */ 1380 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)-> 1381 cport_mutex); 1382 ndi_dc_freehdl(dcp); 1383 return (EBUSY); 1384 } 1385 /* Block event processing for this port */ 1386 cportinfo->cport_event_flags |= SATA_APCTL_LOCK_PORT_BUSY; 1387 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex); 1388 1389 sata_device.satadev_addr.cport = cport; 1390 sata_device.satadev_addr.pmport = pmport; 1391 sata_device.satadev_addr.qual = qual; 1392 sata_device.satadev_rev = SATA_DEVICE_REV; 1393 } 1394 1395 switch (cmd) { 1396 1397 case DEVCTL_AP_DISCONNECT: 1398 1399 /* 1400 * Normally, cfgadm sata plugin will try to offline 1401 * (unconfigure) device before this request. Nevertheless, 1402 * if a device is still configured, we need to 1403 * attempt to offline and unconfigure device first, and we will 1404 * deactivate the port regardless of the unconfigure 1405 * operation results. 1406 * 1407 */ 1408 rv = sata_ioctl_disconnect(sata_hba_inst, &sata_device); 1409 1410 break; 1411 1412 case DEVCTL_AP_UNCONFIGURE: 1413 1414 /* 1415 * The unconfigure operation uses generic nexus operation to 1416 * offline a device. It leaves a target device node attached. 1417 * and obviously sata_drive_info attached as well, because 1418 * from the hardware point of view nothing has changed. 1419 */ 1420 rv = sata_ioctl_unconfigure(sata_hba_inst, &sata_device); 1421 break; 1422 1423 case DEVCTL_AP_CONNECT: 1424 { 1425 /* 1426 * The sata cfgadm pluging will invoke this operation only if 1427 * port was found in the disconnect state (failed state 1428 * is also treated as the disconnected state). 1429 * If port activation is successful and a device is found 1430 * attached to the port, the initialization sequence is 1431 * executed to probe the port and attach 1432 * a device structure to a port structure. The device is not 1433 * set in configured state (system-wise) by this operation. 1434 */ 1435 1436 rv = sata_ioctl_connect(sata_hba_inst, &sata_device); 1437 1438 break; 1439 } 1440 1441 case DEVCTL_AP_CONFIGURE: 1442 { 1443 /* 1444 * A port may be in an active or shutdown state. 1445 * If port is in a failed state, operation is aborted. 1446 * If a port is in a shutdown state, sata_tran_port_activate() 1447 * is invoked prior to any other operation. 1448 * 1449 * Onlining the device involves creating a new target node. 1450 * If there is an old target node present (belonging to 1451 * previously removed device), the operation is aborted - the 1452 * old node has to be released and removed before configure 1453 * operation is attempted. 1454 */ 1455 1456 rv = sata_ioctl_configure(sata_hba_inst, &sata_device); 1457 1458 break; 1459 } 1460 1461 case DEVCTL_AP_GETSTATE: 1462 1463 sata_cfgadm_state(sata_hba_inst, comp_port, &ap_state); 1464 1465 ap_state.ap_last_change = (time_t)-1; 1466 ap_state.ap_error_code = 0; 1467 ap_state.ap_in_transition = 0; 1468 1469 /* Copy the return AP-state information to the user space */ 1470 if (ndi_dc_return_ap_state(&ap_state, dcp) != NDI_SUCCESS) { 1471 rv = EFAULT; 1472 } 1473 break; 1474 1475 case DEVCTL_AP_CONTROL: 1476 { 1477 /* 1478 * Generic devctl for hardware specific functionality 1479 */ 1480 sata_ioctl_data_t ioc; 1481 1482 ASSERT(dcp == NULL); 1483 1484 /* Copy in user ioctl data first */ 1485 #ifdef _MULTI_DATAMODEL 1486 if (ddi_model_convert_from(mode & FMODELS) == 1487 DDI_MODEL_ILP32) { 1488 1489 sata_ioctl_data_32_t ioc32; 1490 1491 if (ddi_copyin((void *)arg, (void *)&ioc32, 1492 sizeof (ioc32), mode) != 0) { 1493 rv = EFAULT; 1494 break; 1495 } 1496 ioc.cmd = (uint_t)ioc32.cmd; 1497 ioc.port = (uint_t)ioc32.port; 1498 ioc.get_size = (uint_t)ioc32.get_size; 1499 ioc.buf = (caddr_t)(uintptr_t)ioc32.buf; 1500 ioc.bufsiz = (uint_t)ioc32.bufsiz; 1501 ioc.misc_arg = (uint_t)ioc32.misc_arg; 1502 } else 1503 #endif /* _MULTI_DATAMODEL */ 1504 if (ddi_copyin((void *)arg, (void *)&ioc, sizeof (ioc), 1505 mode) != 0) { 1506 return (EFAULT); 1507 } 1508 1509 SATADBG2(SATA_DBG_IOCTL_IF, sata_hba_inst, 1510 "sata_hba_ioctl: DEVCTL_AP_CONTROL " 1511 "cmd 0x%x, port 0x%x", ioc.cmd, ioc.port); 1512 1513 /* 1514 * To avoid BE/LE and 32/64 issues, a get_size always returns 1515 * a 32-bit number. 1516 */ 1517 if (ioc.get_size != 0 && ioc.bufsiz != (sizeof (uint32_t))) { 1518 return (EINVAL); 1519 } 1520 /* validate address */ 1521 cport = SCSI_TO_SATA_CPORT(ioc.port); 1522 pmport = SCSI_TO_SATA_PMPORT(ioc.port); 1523 qual = SCSI_TO_SATA_ADDR_QUAL(ioc.port); 1524 1525 SATADBG3(SATA_DBG_IOCTL_IF, sata_hba_inst, 1526 "sata_hba_ioctl: target port is %d:%d (%d)", 1527 cport, pmport, qual); 1528 1529 if (sata_validate_sata_address(sata_hba_inst, cport, 1530 pmport, qual) != 0) 1531 return (EINVAL); 1532 1533 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport); 1534 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)-> 1535 cport_mutex); 1536 /* Is the port locked by event processing daemon ? */ 1537 if (cportinfo->cport_event_flags & SATA_EVNT_LOCK_PORT_BUSY) { 1538 /* 1539 * Cannot process ioctl request now. Come back later 1540 */ 1541 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)-> 1542 cport_mutex); 1543 return (EBUSY); 1544 } 1545 /* Block event processing for this port */ 1546 cportinfo->cport_event_flags |= SATA_APCTL_LOCK_PORT_BUSY; 1547 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex); 1548 1549 1550 sata_device.satadev_addr.cport = cport; 1551 sata_device.satadev_addr.pmport = pmport; 1552 sata_device.satadev_addr.qual = qual; 1553 sata_device.satadev_rev = SATA_DEVICE_REV; 1554 1555 switch (ioc.cmd) { 1556 1557 case SATA_CFGA_RESET_PORT: 1558 /* 1559 * There is no protection for configured device. 1560 */ 1561 rv = sata_ioctl_reset_port(sata_hba_inst, &sata_device); 1562 break; 1563 1564 case SATA_CFGA_RESET_DEVICE: 1565 /* 1566 * There is no protection for configured device. 1567 */ 1568 rv = sata_ioctl_reset_device(sata_hba_inst, 1569 &sata_device); 1570 break; 1571 1572 case SATA_CFGA_RESET_ALL: 1573 /* 1574 * There is no protection for configured devices. 1575 */ 1576 rv = sata_ioctl_reset_all(sata_hba_inst); 1577 /* 1578 * We return here, because common return is for 1579 * a single port operation - we have already unlocked 1580 * all ports and no dc handle was allocated. 1581 */ 1582 return (rv); 1583 1584 case SATA_CFGA_PORT_DEACTIVATE: 1585 /* 1586 * Arbitrarily unconfigure attached device, if any. 1587 * Even if the unconfigure fails, proceed with the 1588 * port deactivation. 1589 */ 1590 rv = sata_ioctl_deactivate(sata_hba_inst, &sata_device); 1591 1592 break; 1593 1594 case SATA_CFGA_PORT_ACTIVATE: 1595 1596 rv = sata_ioctl_activate(sata_hba_inst, &sata_device); 1597 break; 1598 1599 case SATA_CFGA_PORT_SELF_TEST: 1600 1601 rv = sata_ioctl_port_self_test(sata_hba_inst, 1602 &sata_device); 1603 break; 1604 1605 case SATA_CFGA_GET_DEVICE_PATH: 1606 1607 rv = sata_ioctl_get_device_path(sata_hba_inst, 1608 &sata_device, &ioc, mode); 1609 break; 1610 1611 case SATA_CFGA_GET_AP_TYPE: 1612 1613 rv = sata_ioctl_get_ap_type(sata_hba_inst, 1614 &sata_device, &ioc, mode); 1615 break; 1616 1617 case SATA_CFGA_GET_MODEL_INFO: 1618 1619 rv = sata_ioctl_get_model_info(sata_hba_inst, 1620 &sata_device, &ioc, mode); 1621 break; 1622 1623 case SATA_CFGA_GET_REVFIRMWARE_INFO: 1624 1625 rv = sata_ioctl_get_revfirmware_info(sata_hba_inst, 1626 &sata_device, &ioc, mode); 1627 break; 1628 1629 case SATA_CFGA_GET_SERIALNUMBER_INFO: 1630 1631 rv = sata_ioctl_get_serialnumber_info(sata_hba_inst, 1632 &sata_device, &ioc, mode); 1633 break; 1634 1635 default: 1636 rv = EINVAL; 1637 break; 1638 1639 } /* End of DEVCTL_AP_CONTROL cmd switch */ 1640 1641 break; 1642 } 1643 1644 default: 1645 { 1646 /* 1647 * If we got here, we got an IOCTL that SATA HBA Framework 1648 * does not recognize. Pass ioctl to HBA driver, in case 1649 * it could process it. 1650 */ 1651 sata_hba_tran_t *sata_tran = sata_hba_inst->satahba_tran; 1652 dev_info_t *mydip = SATA_DIP(sata_hba_inst); 1653 1654 SATADBG1(SATA_DBG_IOCTL_IF, sata_hba_inst, 1655 "IOCTL 0x%2x not supported in SATA framework, " 1656 "passthrough to HBA", cmd); 1657 1658 if (sata_tran->sata_tran_ioctl == NULL) { 1659 rv = EINVAL; 1660 break; 1661 } 1662 rval = (*sata_tran->sata_tran_ioctl)(mydip, cmd, arg); 1663 if (rval != 0) { 1664 SATADBG1(SATA_DBG_IOCTL_IF, sata_hba_inst, 1665 "IOCTL 0x%2x failed in HBA", cmd); 1666 rv = rval; 1667 } 1668 break; 1669 } 1670 1671 } /* End of main IOCTL switch */ 1672 1673 if (dcp) { 1674 ndi_dc_freehdl(dcp); 1675 } 1676 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex); 1677 cportinfo->cport_event_flags &= ~SATA_APCTL_LOCK_PORT_BUSY; 1678 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex); 1679 1680 return (rv); 1681 } 1682 1683 1684 /* 1685 * Create error retrieval sata packet 1686 * 1687 * A sata packet is allocated and set-up to contain specified error retrieval 1688 * command and appropriate dma-able data buffer. 1689 * No association with any scsi packet is made and no callback routine is 1690 * specified. 1691 * 1692 * Returns a pointer to sata packet upon successful packet creation. 1693 * Returns NULL, if packet cannot be created. 1694 */ 1695 sata_pkt_t * 1696 sata_get_error_retrieval_pkt(dev_info_t *dip, sata_device_t *sata_device, 1697 int pkt_type) 1698 { 1699 sata_hba_inst_t *sata_hba_inst; 1700 sata_pkt_txlate_t *spx; 1701 sata_pkt_t *spkt; 1702 sata_drive_info_t *sdinfo; 1703 1704 mutex_enter(&sata_mutex); 1705 for (sata_hba_inst = sata_hba_list; sata_hba_inst != NULL; 1706 sata_hba_inst = sata_hba_inst->satahba_next) { 1707 if (SATA_DIP(sata_hba_inst) == dip) 1708 break; 1709 } 1710 mutex_exit(&sata_mutex); 1711 ASSERT(sata_hba_inst != NULL); 1712 1713 sdinfo = sata_get_device_info(sata_hba_inst, sata_device); 1714 if (sdinfo == NULL) { 1715 sata_log(sata_hba_inst, CE_WARN, 1716 "sata: error recovery request for non-attached device at " 1717 "cport %d", sata_device->satadev_addr.cport); 1718 return (NULL); 1719 } 1720 1721 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP); 1722 spx->txlt_sata_hba_inst = sata_hba_inst; 1723 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */ 1724 spkt = sata_pkt_alloc(spx, NULL); 1725 if (spkt == NULL) { 1726 kmem_free(spx, sizeof (sata_pkt_txlate_t)); 1727 return (NULL); 1728 } 1729 /* address is needed now */ 1730 spkt->satapkt_device.satadev_addr = sata_device->satadev_addr; 1731 1732 switch (pkt_type) { 1733 case SATA_ERR_RETR_PKT_TYPE_NCQ: 1734 if (sata_ncq_err_ret_cmd_setup(spx, sdinfo) == SATA_SUCCESS) { 1735 if (sata_check_for_dma_error(dip, spx)) { 1736 ddi_fm_service_impact(dip, 1737 DDI_SERVICE_UNAFFECTED); 1738 break; 1739 } 1740 return (spkt); 1741 } 1742 break; 1743 1744 case SATA_ERR_RETR_PKT_TYPE_ATAPI: 1745 if (sata_atapi_err_ret_cmd_setup(spx, sdinfo) == SATA_SUCCESS) { 1746 if (sata_check_for_dma_error(dip, spx)) { 1747 ddi_fm_service_impact(dip, 1748 DDI_SERVICE_UNAFFECTED); 1749 break; 1750 } 1751 return (spkt); 1752 } 1753 break; 1754 1755 default: 1756 break; 1757 } 1758 1759 sata_pkt_free(spx); 1760 kmem_free(spx, sizeof (sata_pkt_txlate_t)); 1761 return (NULL); 1762 1763 } 1764 1765 1766 /* 1767 * Free error retrieval sata packet 1768 * 1769 * Free sata packet and any associated resources allocated previously by 1770 * sata_get_error_retrieval_pkt(). 1771 * 1772 * Void return. 1773 */ 1774 void 1775 sata_free_error_retrieval_pkt(sata_pkt_t *sata_pkt) 1776 { 1777 sata_pkt_txlate_t *spx = 1778 (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private; 1779 1780 ASSERT(sata_pkt != NULL); 1781 1782 sata_free_local_buffer(spx); 1783 sata_pkt_free(spx); 1784 kmem_free(spx, sizeof (sata_pkt_txlate_t)); 1785 1786 } 1787 1788 /* 1789 * Create READ PORT MULTIPLIER and WRITE PORT MULTIPLIER sata packet 1790 * 1791 * No association with any scsi packet is made and no callback routine is 1792 * specified. 1793 * 1794 * Returns a pointer to sata packet upon successful packet creation. 1795 * Returns NULL, if packet cannot be created. 1796 * 1797 * NOTE: Input/Output value includes 64 bits accoring to SATA Spec 2.6, 1798 * only lower 32 bits are available currently. 1799 */ 1800 sata_pkt_t * 1801 sata_get_rdwr_pmult_pkt(dev_info_t *dip, sata_device_t *sd, 1802 uint8_t regn, uint32_t regv, uint32_t type) 1803 { 1804 sata_hba_inst_t *sata_hba_inst; 1805 sata_pkt_txlate_t *spx; 1806 sata_pkt_t *spkt; 1807 sata_cmd_t *scmd; 1808 1809 /* Only READ/WRITE commands are accepted. */ 1810 ASSERT(type == SATA_RDWR_PMULT_PKT_TYPE_READ || 1811 type == SATA_RDWR_PMULT_PKT_TYPE_WRITE); 1812 1813 mutex_enter(&sata_mutex); 1814 for (sata_hba_inst = sata_hba_list; sata_hba_inst != NULL; 1815 sata_hba_inst = sata_hba_inst->satahba_next) { 1816 if (SATA_DIP(sata_hba_inst) == dip) 1817 break; 1818 } 1819 mutex_exit(&sata_mutex); 1820 ASSERT(sata_hba_inst != NULL); 1821 1822 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP); 1823 spx->txlt_sata_hba_inst = sata_hba_inst; 1824 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */ 1825 spkt = sata_pkt_alloc(spx, SLEEP_FUNC); 1826 if (spkt == NULL) { 1827 kmem_free(spx, sizeof (sata_pkt_txlate_t)); 1828 return (NULL); 1829 } 1830 1831 /* 1832 * NOTE: We need to send this command to the port multiplier, 1833 * that means send to SATA_PMULT_HOSTPORT(0xf) pmport 1834 * 1835 * sata_device contains the address of actual target device, and the 1836 * pmport number in the command comes from the sata_device structure. 1837 */ 1838 spkt->satapkt_device.satadev_addr = sd->satadev_addr; 1839 spkt->satapkt_device.satadev_addr.pmport = SATA_PMULT_HOSTPORT; 1840 spkt->satapkt_device.satadev_addr.qual = SATA_ADDR_PMULT; 1841 1842 /* Fill sata_pkt */ 1843 spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_POLLING; 1844 spkt->satapkt_comp = NULL; /* Synchronous mode, no callback */ 1845 spkt->satapkt_time = 10; /* Timeout 10s */ 1846 1847 /* Build READ PORT MULTIPLIER cmd in the sata_pkt */ 1848 scmd = &spkt->satapkt_cmd; 1849 scmd->satacmd_features_reg = regn & 0xff; 1850 scmd->satacmd_features_reg_ext = (regn >> 8) & 0xff; 1851 scmd->satacmd_device_reg = sd->satadev_addr.pmport; 1852 scmd->satacmd_addr_type = 0; /* N/A */ 1853 1854 scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE; 1855 1856 if (type == SATA_RDWR_PMULT_PKT_TYPE_READ) { 1857 scmd->satacmd_cmd_reg = SATAC_READ_PORTMULT; 1858 scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ; 1859 scmd->satacmd_flags.sata_special_regs = 1; 1860 scmd->satacmd_flags.sata_copy_out_lba_high_lsb = 1; 1861 scmd->satacmd_flags.sata_copy_out_lba_mid_lsb = 1; 1862 scmd->satacmd_flags.sata_copy_out_lba_low_lsb = 1; 1863 scmd->satacmd_flags.sata_copy_out_sec_count_lsb = 1; 1864 } else if (type == SATA_RDWR_PMULT_PKT_TYPE_WRITE) { 1865 scmd->satacmd_cmd_reg = SATAC_WRITE_PORTMULT; 1866 scmd->satacmd_flags.sata_data_direction = SATA_DIR_WRITE; 1867 scmd->satacmd_sec_count_lsb = regv & 0xff; 1868 scmd->satacmd_lba_low_lsb = regv >> 8 & 0xff; 1869 scmd->satacmd_lba_mid_lsb = regv >> 16 & 0xff; 1870 scmd->satacmd_lba_high_lsb = regv >> 24 & 0xff; 1871 } 1872 1873 return (spkt); 1874 } 1875 1876 /* 1877 * Free sata packet and any associated resources allocated previously by 1878 * sata_get_rdwr_pmult_pkt(). 1879 * 1880 * Void return. 1881 */ 1882 void 1883 sata_free_rdwr_pmult_pkt(sata_pkt_t *sata_pkt) 1884 { 1885 sata_pkt_txlate_t *spx = 1886 (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private; 1887 1888 /* Free allocated resources */ 1889 sata_pkt_free(spx); 1890 kmem_free(spx, sizeof (sata_pkt_txlate_t)); 1891 } 1892 1893 /* 1894 * Register a port multiplier to framework. 1895 * 1) Store the GSCR values in the previous allocated pmult_info strctures. 1896 * 2) Search in the blacklist and update the number of the device ports of the 1897 * port multiplier. 1898 * 1899 * Void return. 1900 */ 1901 void 1902 sata_register_pmult(dev_info_t *dip, sata_device_t *sd, sata_pmult_gscr_t *sg) 1903 { 1904 sata_hba_inst_t *sata_hba_inst = NULL; 1905 sata_pmult_info_t *pmultinfo; 1906 sata_pmult_bl_t *blp; 1907 int cport = sd->satadev_addr.cport; 1908 1909 mutex_enter(&sata_mutex); 1910 for (sata_hba_inst = sata_hba_list; sata_hba_inst != NULL; 1911 sata_hba_inst = sata_hba_inst->satahba_next) { 1912 if (SATA_DIP(sata_hba_inst) == dip) 1913 if (sata_hba_inst->satahba_attached == 1) 1914 break; 1915 } 1916 mutex_exit(&sata_mutex); 1917 /* HBA not attached? */ 1918 if (sata_hba_inst == NULL) 1919 return; 1920 1921 /* Number of pmports */ 1922 sd->satadev_add_info = sg->gscr2 & SATA_PMULT_PORTNUM_MASK; 1923 1924 /* Check the blacklist */ 1925 for (blp = sata_pmult_blacklist; blp->bl_gscr0; blp++) { 1926 if (sg->gscr0 != blp->bl_gscr0 && blp->bl_gscr0) 1927 continue; 1928 if (sg->gscr1 != blp->bl_gscr1 && blp->bl_gscr1) 1929 continue; 1930 if (sg->gscr2 != blp->bl_gscr2 && blp->bl_gscr2) 1931 continue; 1932 1933 cmn_err(CE_WARN, "!Port multiplier is on the blacklist."); 1934 sd->satadev_add_info = blp->bl_flags; 1935 break; 1936 } 1937 1938 /* Register the port multiplier GSCR */ 1939 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport))); 1940 pmultinfo = SATA_PMULT_INFO(sata_hba_inst, cport); 1941 if (pmultinfo != NULL) { 1942 pmultinfo->pmult_gscr = *sg; 1943 pmultinfo->pmult_num_dev_ports = 1944 sd->satadev_add_info & SATA_PMULT_PORTNUM_MASK; 1945 SATADBG1(SATA_DBG_PMULT, sata_hba_inst, 1946 "Port multiplier registered at port %d", cport); 1947 } 1948 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport))); 1949 } 1950 1951 /* 1952 * sata_name_child is for composing the name of the node 1953 * the format of the name is "target,0". 1954 */ 1955 static int 1956 sata_name_child(dev_info_t *dip, char *name, int namelen) 1957 { 1958 int target; 1959 1960 target = ddi_prop_get_int(DDI_DEV_T_ANY, dip, 1961 DDI_PROP_DONTPASS, "target", -1); 1962 if (target == -1) 1963 return (DDI_FAILURE); 1964 (void) snprintf(name, namelen, "%x,0", target); 1965 return (DDI_SUCCESS); 1966 } 1967 1968 1969 1970 /* ****************** SCSA required entry points *********************** */ 1971 1972 /* 1973 * Implementation of scsi tran_tgt_init. 1974 * sata_scsi_tgt_init() initializes scsi_device structure 1975 * 1976 * If successful, DDI_SUCCESS is returned. 1977 * DDI_FAILURE is returned if addressed device does not exist 1978 */ 1979 1980 static int 1981 sata_scsi_tgt_init(dev_info_t *hba_dip, dev_info_t *tgt_dip, 1982 scsi_hba_tran_t *hba_tran, struct scsi_device *sd) 1983 { 1984 #ifndef __lock_lint 1985 _NOTE(ARGUNUSED(hba_dip)) 1986 _NOTE(ARGUNUSED(tgt_dip)) 1987 #endif 1988 sata_device_t sata_device; 1989 sata_drive_info_t *sdinfo; 1990 struct sata_id *sid; 1991 sata_hba_inst_t *sata_hba_inst; 1992 char model[SATA_ID_MODEL_LEN + 1]; 1993 char fw[SATA_ID_FW_LEN + 1]; 1994 char *vid, *pid; 1995 int i; 1996 1997 /* 1998 * Fail tran_tgt_init for .conf stub node 1999 */ 2000 if (ndi_dev_is_persistent_node(tgt_dip) == 0) { 2001 (void) ndi_merge_node(tgt_dip, sata_name_child); 2002 ddi_set_name_addr(tgt_dip, NULL); 2003 return (DDI_FAILURE); 2004 } 2005 2006 sata_hba_inst = (sata_hba_inst_t *)(hba_tran->tran_hba_private); 2007 2008 /* Validate scsi device address */ 2009 if (sata_validate_scsi_address(sata_hba_inst, &sd->sd_address, 2010 &sata_device) != 0) 2011 return (DDI_FAILURE); 2012 2013 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, 2014 sata_device.satadev_addr.cport))); 2015 2016 /* sata_device now contains a valid sata address */ 2017 sdinfo = sata_get_device_info(sata_hba_inst, &sata_device); 2018 if (sdinfo == NULL) { 2019 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, 2020 sata_device.satadev_addr.cport))); 2021 return (DDI_FAILURE); 2022 } 2023 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, 2024 sata_device.satadev_addr.cport))); 2025 2026 /* 2027 * Check if we need to create a legacy devid (i.e cmdk style) for 2028 * the target disks. 2029 * 2030 * HBA devinfo node will have the property "use-cmdk-devid-format" 2031 * if we need to create cmdk-style devid for all the disk devices 2032 * attached to this controller. This property may have been set 2033 * from HBA driver's .conf file or by the HBA driver in its 2034 * attach(9F) function. 2035 */ 2036 if ((sdinfo->satadrv_type == SATA_DTYPE_ATADISK) && 2037 (ddi_getprop(DDI_DEV_T_ANY, hba_dip, DDI_PROP_DONTPASS, 2038 "use-cmdk-devid-format", 0) == 1)) { 2039 /* register a legacy devid for this target node */ 2040 sata_target_devid_register(tgt_dip, sdinfo); 2041 } 2042 2043 2044 /* 2045 * 'Identify Device Data' does not always fit in standard SCSI 2046 * INQUIRY data, so establish INQUIRY_* properties with full-form 2047 * of information. 2048 */ 2049 sid = &sdinfo->satadrv_id; 2050 #ifdef _LITTLE_ENDIAN 2051 swab(sid->ai_model, model, SATA_ID_MODEL_LEN); 2052 swab(sid->ai_fw, fw, SATA_ID_FW_LEN); 2053 #else /* _LITTLE_ENDIAN */ 2054 bcopy(sid->ai_model, model, SATA_ID_MODEL_LEN); 2055 bcopy(sid->ai_fw, fw, SATA_ID_FW_LEN); 2056 #endif /* _LITTLE_ENDIAN */ 2057 model[SATA_ID_MODEL_LEN] = 0; 2058 fw[SATA_ID_FW_LEN] = 0; 2059 2060 /* split model into into vid/pid */ 2061 for (i = 0, pid = model; i < SATA_ID_MODEL_LEN; i++, pid++) 2062 if ((*pid == ' ') || (*pid == '\t')) 2063 break; 2064 if (i < SATA_ID_MODEL_LEN) { 2065 vid = model; 2066 *pid++ = 0; /* terminate vid, establish pid */ 2067 } else { 2068 vid = NULL; /* vid will stay "ATA " */ 2069 pid = model; /* model is all pid */ 2070 } 2071 2072 if (vid) 2073 (void) scsi_device_prop_update_inqstring(sd, INQUIRY_VENDOR_ID, 2074 vid, strlen(vid)); 2075 if (pid) 2076 (void) scsi_device_prop_update_inqstring(sd, INQUIRY_PRODUCT_ID, 2077 pid, strlen(pid)); 2078 (void) scsi_device_prop_update_inqstring(sd, INQUIRY_REVISION_ID, 2079 fw, strlen(fw)); 2080 2081 return (DDI_SUCCESS); 2082 } 2083 2084 /* 2085 * Implementation of scsi tran_tgt_probe. 2086 * Probe target, by calling default scsi routine scsi_hba_probe() 2087 */ 2088 static int 2089 sata_scsi_tgt_probe(struct scsi_device *sd, int (*callback)(void)) 2090 { 2091 sata_hba_inst_t *sata_hba_inst = 2092 (sata_hba_inst_t *)(sd->sd_address.a_hba_tran->tran_hba_private); 2093 int rval; 2094 uint32_t pm_cap; 2095 2096 rval = scsi_hba_probe(sd, callback); 2097 pm_cap = SATA_CAP_POWER_CONDITON | SATA_CAP_SMART_PAGE | 2098 SATA_CAP_LOG_SENSE; 2099 2100 if (rval == SCSIPROBE_EXISTS) { 2101 /* 2102 * Set property "pm-capable" on the target device node, so that 2103 * the target driver will not try to fetch scsi cycle counters 2104 * before enabling device power-management. 2105 */ 2106 if ((ddi_prop_update_int(DDI_DEV_T_NONE, sd->sd_dev, 2107 "pm-capable", pm_cap)) != DDI_PROP_SUCCESS) { 2108 sata_log(sata_hba_inst, CE_WARN, 2109 "SATA device at port %d: " 2110 "will not be power-managed ", 2111 SCSI_TO_SATA_CPORT(sd->sd_address.a_target)); 2112 SATA_LOG_D((sata_hba_inst, CE_WARN, 2113 "failure updating pm-capable property")); 2114 } 2115 } 2116 return (rval); 2117 } 2118 2119 /* 2120 * Implementation of scsi tran_tgt_free. 2121 * Release all resources allocated for scsi_device 2122 */ 2123 static void 2124 sata_scsi_tgt_free(dev_info_t *hba_dip, dev_info_t *tgt_dip, 2125 scsi_hba_tran_t *hba_tran, struct scsi_device *sd) 2126 { 2127 #ifndef __lock_lint 2128 _NOTE(ARGUNUSED(hba_dip)) 2129 #endif 2130 sata_device_t sata_device; 2131 sata_drive_info_t *sdinfo; 2132 sata_hba_inst_t *sata_hba_inst; 2133 ddi_devid_t devid; 2134 2135 sata_hba_inst = (sata_hba_inst_t *)(hba_tran->tran_hba_private); 2136 2137 /* Validate scsi device address */ 2138 /* 2139 * Note: tgt_free relates to the SCSA view of a device. If called, there 2140 * was a device at this address, so even if the sata framework internal 2141 * resources were alredy released because a device was detached, 2142 * this function should be executed as long as its actions do 2143 * not require the internal sata view of a device and the address 2144 * refers to a valid sata address. 2145 * Validating the address here means that we do not trust SCSA... 2146 */ 2147 if (sata_validate_scsi_address(sata_hba_inst, &sd->sd_address, 2148 &sata_device) == -1) 2149 return; 2150 2151 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, 2152 sata_device.satadev_addr.cport))); 2153 2154 /* sata_device now should contain a valid sata address */ 2155 sdinfo = sata_get_device_info(sata_hba_inst, &sata_device); 2156 if (sdinfo == NULL) { 2157 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, 2158 sata_device.satadev_addr.cport))); 2159 return; 2160 } 2161 /* 2162 * We did not allocate any resources in sata_scsi_tgt_init() 2163 * other than few properties. 2164 * Free them. 2165 */ 2166 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, 2167 sata_device.satadev_addr.cport))); 2168 (void) ndi_prop_remove(DDI_DEV_T_NONE, tgt_dip, "pm-capable"); 2169 2170 /* 2171 * If devid was previously created but not freed up from 2172 * sd(7D) driver (i.e during detach(9F)) then do it here. 2173 */ 2174 if ((sdinfo->satadrv_type == SATA_DTYPE_ATADISK) && 2175 (ddi_getprop(DDI_DEV_T_ANY, hba_dip, DDI_PROP_DONTPASS, 2176 "use-cmdk-devid-format", 0) == 1) && 2177 (ddi_devid_get(tgt_dip, &devid) == DDI_SUCCESS)) { 2178 ddi_devid_unregister(tgt_dip); 2179 ddi_devid_free(devid); 2180 } 2181 } 2182 2183 /* 2184 * Implementation of scsi tran_init_pkt 2185 * Upon successful return, scsi pkt buffer has DMA resources allocated. 2186 * 2187 * It seems that we should always allocate pkt, even if the address is 2188 * for non-existing device - just use some default for dma_attr. 2189 * The reason is that there is no way to communicate this to a caller here. 2190 * Subsequent call to sata_scsi_start may fail appropriately. 2191 * Simply returning NULL does not seem to discourage a target driver... 2192 * 2193 * Returns a pointer to initialized scsi_pkt, or NULL otherwise. 2194 */ 2195 static struct scsi_pkt * 2196 sata_scsi_init_pkt(struct scsi_address *ap, struct scsi_pkt *pkt, 2197 struct buf *bp, int cmdlen, int statuslen, int tgtlen, int flags, 2198 int (*callback)(caddr_t), caddr_t arg) 2199 { 2200 sata_hba_inst_t *sata_hba_inst = 2201 (sata_hba_inst_t *)(ap->a_hba_tran->tran_hba_private); 2202 dev_info_t *dip = SATA_DIP(sata_hba_inst); 2203 sata_device_t sata_device; 2204 sata_drive_info_t *sdinfo; 2205 sata_pkt_txlate_t *spx; 2206 ddi_dma_attr_t cur_dma_attr; 2207 int rval; 2208 boolean_t new_pkt = B_TRUE; 2209 2210 ASSERT(ap->a_hba_tran->tran_hba_dip == dip); 2211 2212 /* 2213 * We need to translate the address, even if it could be 2214 * a bogus one, for a non-existing device 2215 */ 2216 sata_device.satadev_addr.qual = SCSI_TO_SATA_ADDR_QUAL(ap->a_target); 2217 sata_device.satadev_addr.cport = SCSI_TO_SATA_CPORT(ap->a_target); 2218 sata_device.satadev_addr.pmport = SCSI_TO_SATA_PMPORT(ap->a_target); 2219 sata_device.satadev_rev = SATA_DEVICE_REV; 2220 2221 if (pkt == NULL) { 2222 /* 2223 * Have to allocate a brand new scsi packet. 2224 * We need to operate with auto request sense enabled. 2225 */ 2226 pkt = scsi_hba_pkt_alloc(dip, ap, cmdlen, 2227 MAX(statuslen, SATA_MAX_SENSE_LEN), 2228 tgtlen, sizeof (sata_pkt_txlate_t), callback, arg); 2229 2230 if (pkt == NULL) 2231 return (NULL); 2232 2233 /* Fill scsi packet structure */ 2234 pkt->pkt_comp = (void (*)())NULL; 2235 pkt->pkt_time = 0; 2236 pkt->pkt_resid = 0; 2237 pkt->pkt_statistics = 0; 2238 pkt->pkt_reason = 0; 2239 2240 /* 2241 * pkt_hba_private will point to sata pkt txlate structure 2242 */ 2243 spx = (sata_pkt_txlate_t *)pkt->pkt_ha_private; 2244 bzero(spx, sizeof (sata_pkt_txlate_t)); 2245 2246 spx->txlt_scsi_pkt = pkt; 2247 spx->txlt_sata_hba_inst = sata_hba_inst; 2248 2249 /* Allocate sata_pkt */ 2250 spx->txlt_sata_pkt = sata_pkt_alloc(spx, callback); 2251 if (spx->txlt_sata_pkt == NULL) { 2252 /* Could not allocate sata pkt */ 2253 scsi_hba_pkt_free(ap, pkt); 2254 return (NULL); 2255 } 2256 /* Set sata address */ 2257 spx->txlt_sata_pkt->satapkt_device.satadev_addr = 2258 sata_device.satadev_addr; 2259 spx->txlt_sata_pkt->satapkt_device.satadev_rev = 2260 sata_device.satadev_rev; 2261 2262 if ((bp == NULL) || (bp->b_bcount == 0)) 2263 return (pkt); 2264 2265 spx->txlt_total_residue = bp->b_bcount; 2266 } else { 2267 new_pkt = B_FALSE; 2268 /* 2269 * Packet was preallocated/initialized by previous call 2270 */ 2271 spx = (sata_pkt_txlate_t *)pkt->pkt_ha_private; 2272 2273 if ((bp == NULL) || (bp->b_bcount == 0)) { 2274 return (pkt); 2275 } 2276 2277 /* Pkt is available already: spx->txlt_scsi_pkt == pkt; */ 2278 } 2279 2280 spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp = bp; 2281 2282 /* 2283 * We use an adjusted version of the dma_attr, to account 2284 * for device addressing limitations. 2285 * sata_adjust_dma_attr() will handle sdinfo == NULL which may 2286 * happen when a device is not yet configured. 2287 */ 2288 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, 2289 sata_device.satadev_addr.cport))); 2290 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst, 2291 &spx->txlt_sata_pkt->satapkt_device); 2292 /* NULL sdinfo may be passsed to sata_adjust_dma_attr() */ 2293 sata_adjust_dma_attr(sdinfo, 2294 SATA_DMA_ATTR(spx->txlt_sata_hba_inst), &cur_dma_attr); 2295 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, 2296 sata_device.satadev_addr.cport))); 2297 /* 2298 * Allocate necessary DMA resources for the packet's data buffer 2299 * NOTE: 2300 * In case of read/write commands, DMA resource allocation here is 2301 * based on the premise that the transfer length specified in 2302 * the read/write scsi cdb will match exactly DMA resources - 2303 * returning correct packet residue is crucial. 2304 */ 2305 if ((rval = sata_dma_buf_setup(spx, flags, callback, arg, 2306 &cur_dma_attr)) != DDI_SUCCESS) { 2307 /* 2308 * If a DMA allocation request fails with 2309 * DDI_DMA_NOMAPPING, indicate the error by calling 2310 * bioerror(9F) with bp and an error code of EFAULT. 2311 * If a DMA allocation request fails with 2312 * DDI_DMA_TOOBIG, indicate the error by calling 2313 * bioerror(9F) with bp and an error code of EINVAL. 2314 * For DDI_DMA_NORESOURCES, we may have some of them allocated. 2315 * Request may be repeated later - there is no real error. 2316 */ 2317 switch (rval) { 2318 case DDI_DMA_NORESOURCES: 2319 bioerror(bp, 0); 2320 break; 2321 case DDI_DMA_NOMAPPING: 2322 case DDI_DMA_BADATTR: 2323 bioerror(bp, EFAULT); 2324 break; 2325 case DDI_DMA_TOOBIG: 2326 default: 2327 bioerror(bp, EINVAL); 2328 break; 2329 } 2330 goto fail; 2331 } 2332 2333 if (sata_check_for_dma_error(dip, spx)) { 2334 ddi_fm_service_impact(dip, DDI_SERVICE_UNAFFECTED); 2335 bioerror(bp, EFAULT); 2336 goto fail; 2337 } 2338 2339 success: 2340 /* Set number of bytes that are not yet accounted for */ 2341 pkt->pkt_resid = spx->txlt_total_residue; 2342 ASSERT(pkt->pkt_resid >= 0); 2343 2344 return (pkt); 2345 2346 fail: 2347 if (new_pkt == B_TRUE) { 2348 /* 2349 * Since this is a new packet, we can clean-up 2350 * everything 2351 */ 2352 sata_scsi_destroy_pkt(ap, pkt); 2353 } else { 2354 /* 2355 * This is a re-used packet. It will be target driver's 2356 * responsibility to eventually destroy it (which 2357 * will free allocated resources). 2358 * Here, we just "complete" the request, leaving 2359 * allocated resources intact, so the request may 2360 * be retried. 2361 */ 2362 spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp = NULL; 2363 sata_pkt_free(spx); 2364 } 2365 return (NULL); 2366 } 2367 2368 /* 2369 * Implementation of scsi tran_start. 2370 * Translate scsi cmd into sata operation and return status. 2371 * ATAPI CDBs are passed to ATAPI devices - the device determines what commands 2372 * are supported. 2373 * For SATA hard disks, supported scsi commands: 2374 * SCMD_INQUIRY 2375 * SCMD_TEST_UNIT_READY 2376 * SCMD_START_STOP 2377 * SCMD_READ_CAPACITY 2378 * SCMD_SVC_ACTION_IN_G4 (READ CAPACITY (16)) 2379 * SCMD_REQUEST_SENSE 2380 * SCMD_LOG_SENSE_G1 2381 * SCMD_LOG_SELECT_G1 2382 * SCMD_MODE_SENSE (specific pages) 2383 * SCMD_MODE_SENSE_G1 (specific pages) 2384 * SCMD_MODE_SELECT (specific pages) 2385 * SCMD_MODE_SELECT_G1 (specific pages) 2386 * SCMD_SYNCHRONIZE_CACHE 2387 * SCMD_SYNCHRONIZE_CACHE_G1 2388 * SCMD_READ 2389 * SCMD_READ_G1 2390 * SCMD_READ_G4 2391 * SCMD_READ_G5 2392 * SCMD_WRITE 2393 * SCMD_WRITE_BUFFER 2394 * SCMD_WRITE_G1 2395 * SCMD_WRITE_G4 2396 * SCMD_WRITE_G5 2397 * SCMD_SEEK (noop) 2398 * SCMD_SDIAG 2399 * 2400 * All other commands are rejected as unsupported. 2401 * 2402 * Returns: 2403 * TRAN_ACCEPT if command was executed successfully or accepted by HBA driver 2404 * for execution. TRAN_ACCEPT may be returned also if device was removed but 2405 * a callback could be scheduled. 2406 * TRAN_BADPKT if cmd was directed to invalid address. 2407 * TRAN_FATAL_ERROR is command was rejected due to hardware error, including 2408 * some unspecified error. TRAN_FATAL_ERROR may be also returned if a device 2409 * was removed and there was no callback specified in scsi pkt. 2410 * TRAN_BUSY if command could not be executed becasue HBA driver or SATA 2411 * framework was busy performing some other operation(s). 2412 * 2413 */ 2414 static int 2415 sata_scsi_start(struct scsi_address *ap, struct scsi_pkt *pkt) 2416 { 2417 sata_hba_inst_t *sata_hba_inst = 2418 (sata_hba_inst_t *)(ap->a_hba_tran->tran_hba_private); 2419 sata_pkt_txlate_t *spx = (sata_pkt_txlate_t *)pkt->pkt_ha_private; 2420 sata_device_t *sdevice = &spx->txlt_sata_pkt->satapkt_device; 2421 sata_drive_info_t *sdinfo; 2422 struct buf *bp; 2423 uint8_t cport, pmport; 2424 boolean_t dev_gone = B_FALSE; 2425 int rval; 2426 2427 SATADBG1(SATA_DBG_SCSI_IF, sata_hba_inst, 2428 "sata_scsi_start: cmd 0x%02x\n", pkt->pkt_cdbp[0]); 2429 2430 ASSERT(spx != NULL && 2431 spx->txlt_scsi_pkt == pkt && spx->txlt_sata_pkt != NULL); 2432 2433 cport = SCSI_TO_SATA_CPORT(ap->a_target); 2434 pmport = SCSI_TO_SATA_PMPORT(ap->a_target); 2435 2436 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport))); 2437 2438 if (sdevice->satadev_addr.qual == SATA_ADDR_DCPORT) { 2439 sdinfo = sata_get_device_info(sata_hba_inst, sdevice); 2440 if (sdinfo == NULL || 2441 SATA_CPORT_INFO(sata_hba_inst, cport)-> 2442 cport_tgtnode_clean == B_FALSE || 2443 (sdinfo->satadrv_state & SATA_DSTATE_FAILED) != 0) { 2444 dev_gone = B_TRUE; 2445 } 2446 } else if (sdevice->satadev_addr.qual == SATA_ADDR_DPMPORT) { 2447 if (SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) != 2448 SATA_DTYPE_PMULT || SATA_PMULT_INFO(sata_hba_inst, 2449 cport) == NULL) { 2450 dev_gone = B_TRUE; 2451 } else if (SATA_PMPORT_INFO(sata_hba_inst, cport, 2452 pmport) == NULL) { 2453 dev_gone = B_TRUE; 2454 } else { 2455 mutex_enter(&(SATA_PMPORT_MUTEX(sata_hba_inst, 2456 cport, pmport))); 2457 sdinfo = sata_get_device_info(sata_hba_inst, sdevice); 2458 if (sdinfo == NULL || 2459 SATA_PMPORT_INFO(sata_hba_inst, cport, pmport)-> 2460 pmport_tgtnode_clean == B_FALSE || 2461 (sdinfo->satadrv_state & SATA_DSTATE_FAILED) != 0) { 2462 dev_gone = B_TRUE; 2463 } 2464 mutex_exit(&(SATA_PMPORT_MUTEX(sata_hba_inst, 2465 cport, pmport))); 2466 } 2467 } 2468 2469 if (dev_gone == B_TRUE) { 2470 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport))); 2471 pkt->pkt_reason = CMD_DEV_GONE; 2472 /* 2473 * The sd target driver is checking CMD_DEV_GONE pkt_reason 2474 * only in callback function (for normal requests) and 2475 * in the dump code path. 2476 * So, if the callback is available, we need to do 2477 * the callback rather than returning TRAN_FATAL_ERROR here. 2478 */ 2479 if (pkt->pkt_comp != NULL) { 2480 /* scsi callback required */ 2481 if (servicing_interrupt()) { 2482 if (taskq_dispatch(SATA_TXLT_TASKQ(spx), 2483 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp, 2484 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) == 2485 NULL) { 2486 return (TRAN_BUSY); 2487 } 2488 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx), 2489 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp, 2490 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) { 2491 /* Scheduling the callback failed */ 2492 return (TRAN_BUSY); 2493 } 2494 return (TRAN_ACCEPT); 2495 } 2496 /* No callback available */ 2497 return (TRAN_FATAL_ERROR); 2498 } 2499 2500 if (sdinfo->satadrv_type & SATA_DTYPE_ATAPI) { 2501 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport))); 2502 rval = sata_txlt_atapi(spx); 2503 SATADBG1(SATA_DBG_SCSI_IF, sata_hba_inst, 2504 "sata_scsi_start atapi: rval %d\n", rval); 2505 return (rval); 2506 } 2507 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport))); 2508 2509 /* 2510 * Checking for power state, if it was on 2511 * STOPPED state, then the drive is not capable 2512 * of processing media access command. And 2513 * TEST_UNIT_READY, REQUEST_SENSE has special handling 2514 * in the function for different power state. 2515 */ 2516 if (((sdinfo->satadrv_power_level == SATA_POWER_STANDBY) || 2517 (sdinfo->satadrv_power_level == SATA_POWER_STOPPED)) && 2518 (SATA_IS_MEDIUM_ACCESS_CMD(pkt->pkt_cdbp[0]))) { 2519 return (sata_txlt_check_condition(spx, KEY_NOT_READY, 2520 SD_SCSI_ASC_LU_NOT_READY)); 2521 } 2522 2523 /* ATA Disk commands processing starts here */ 2524 2525 bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp; 2526 2527 switch (pkt->pkt_cdbp[0]) { 2528 2529 case SCMD_INQUIRY: 2530 /* Mapped to identify device */ 2531 if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO))) 2532 bp_mapin(bp); 2533 rval = sata_txlt_inquiry(spx); 2534 break; 2535 2536 case SCMD_TEST_UNIT_READY: 2537 /* 2538 * SAT "SATA to ATA Translation" doc specifies translation 2539 * to ATA CHECK POWER MODE. 2540 */ 2541 rval = sata_txlt_test_unit_ready(spx); 2542 break; 2543 2544 case SCMD_START_STOP: 2545 /* Mapping depends on the command */ 2546 rval = sata_txlt_start_stop_unit(spx); 2547 break; 2548 2549 case SCMD_READ_CAPACITY: 2550 if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO))) 2551 bp_mapin(bp); 2552 rval = sata_txlt_read_capacity(spx); 2553 break; 2554 2555 case SCMD_SVC_ACTION_IN_G4: /* READ CAPACITY (16) */ 2556 if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO))) 2557 bp_mapin(bp); 2558 rval = sata_txlt_read_capacity16(spx); 2559 break; 2560 2561 case SCMD_REQUEST_SENSE: 2562 /* 2563 * Always No Sense, since we force ARQ 2564 */ 2565 if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO))) 2566 bp_mapin(bp); 2567 rval = sata_txlt_request_sense(spx); 2568 break; 2569 2570 case SCMD_LOG_SENSE_G1: 2571 if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO))) 2572 bp_mapin(bp); 2573 rval = sata_txlt_log_sense(spx); 2574 break; 2575 2576 case SCMD_LOG_SELECT_G1: 2577 if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO))) 2578 bp_mapin(bp); 2579 rval = sata_txlt_log_select(spx); 2580 break; 2581 2582 case SCMD_MODE_SENSE: 2583 case SCMD_MODE_SENSE_G1: 2584 if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO))) 2585 bp_mapin(bp); 2586 rval = sata_txlt_mode_sense(spx); 2587 break; 2588 2589 2590 case SCMD_MODE_SELECT: 2591 case SCMD_MODE_SELECT_G1: 2592 if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO))) 2593 bp_mapin(bp); 2594 rval = sata_txlt_mode_select(spx); 2595 break; 2596 2597 case SCMD_SYNCHRONIZE_CACHE: 2598 case SCMD_SYNCHRONIZE_CACHE_G1: 2599 rval = sata_txlt_synchronize_cache(spx); 2600 break; 2601 2602 case SCMD_READ: 2603 case SCMD_READ_G1: 2604 case SCMD_READ_G4: 2605 case SCMD_READ_G5: 2606 rval = sata_txlt_read(spx); 2607 break; 2608 case SCMD_WRITE_BUFFER: 2609 if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO))) 2610 bp_mapin(bp); 2611 rval = sata_txlt_write_buffer(spx); 2612 break; 2613 2614 case SCMD_WRITE: 2615 case SCMD_WRITE_G1: 2616 case SCMD_WRITE_G4: 2617 case SCMD_WRITE_G5: 2618 rval = sata_txlt_write(spx); 2619 break; 2620 2621 case SCMD_SEEK: 2622 rval = sata_txlt_nodata_cmd_immediate(spx); 2623 break; 2624 2625 case SPC3_CMD_ATA_COMMAND_PASS_THROUGH12: 2626 case SPC3_CMD_ATA_COMMAND_PASS_THROUGH16: 2627 if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO))) 2628 bp_mapin(bp); 2629 rval = sata_txlt_ata_pass_thru(spx); 2630 break; 2631 2632 /* Other cases will be filed later */ 2633 /* postponed until phase 2 of the development */ 2634 case SPC3_CMD_UNMAP: 2635 if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO))) 2636 bp_mapin(bp); 2637 rval = sata_txlt_unmap(spx); 2638 break; 2639 default: 2640 rval = sata_txlt_invalid_command(spx); 2641 break; 2642 } 2643 2644 SATADBG1(SATA_DBG_SCSI_IF, sata_hba_inst, 2645 "sata_scsi_start: rval %d\n", rval); 2646 2647 return (rval); 2648 } 2649 2650 /* 2651 * Implementation of scsi tran_abort. 2652 * Abort specific pkt or all packets. 2653 * 2654 * Returns 1 if one or more packets were aborted, returns 0 otherwise 2655 * 2656 * May be called from an interrupt level. 2657 */ 2658 static int 2659 sata_scsi_abort(struct scsi_address *ap, struct scsi_pkt *scsi_pkt) 2660 { 2661 sata_hba_inst_t *sata_hba_inst = 2662 (sata_hba_inst_t *)(ap->a_hba_tran->tran_hba_private); 2663 sata_device_t sata_device; 2664 sata_pkt_t *sata_pkt; 2665 2666 SATADBG2(SATA_DBG_SCSI_IF, sata_hba_inst, 2667 "sata_scsi_abort: %s at target: 0x%x\n", 2668 scsi_pkt == NULL ? "all packets" : "one pkt", ap->a_target); 2669 2670 /* Validate address */ 2671 if (sata_validate_scsi_address(sata_hba_inst, ap, &sata_device) != 0) 2672 /* Invalid address */ 2673 return (0); 2674 2675 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, 2676 sata_device.satadev_addr.cport))); 2677 if (sata_get_device_info(sata_hba_inst, &sata_device) == NULL) { 2678 /* invalid address */ 2679 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, 2680 sata_device.satadev_addr.cport))); 2681 return (0); 2682 } 2683 if (scsi_pkt == NULL) { 2684 /* 2685 * Abort all packets. 2686 * Although we do not have specific packet, we still need 2687 * dummy packet structure to pass device address to HBA. 2688 * Allocate one, without sleeping. Fail if pkt cannot be 2689 * allocated. 2690 */ 2691 sata_pkt = kmem_zalloc(sizeof (sata_pkt_t), KM_NOSLEEP); 2692 if (sata_pkt == NULL) { 2693 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, 2694 sata_device.satadev_addr.cport))); 2695 SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_pkt_abort: " 2696 "could not allocate sata_pkt")); 2697 return (0); 2698 } 2699 sata_pkt->satapkt_rev = SATA_PKT_REV; 2700 sata_pkt->satapkt_device = sata_device; 2701 sata_pkt->satapkt_device.satadev_rev = SATA_DEVICE_REV; 2702 } else { 2703 if (scsi_pkt->pkt_ha_private == NULL) { 2704 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, 2705 sata_device.satadev_addr.cport))); 2706 return (0); /* Bad scsi pkt */ 2707 } 2708 /* extract pointer to sata pkt */ 2709 sata_pkt = ((sata_pkt_txlate_t *)scsi_pkt->pkt_ha_private)-> 2710 txlt_sata_pkt; 2711 } 2712 2713 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, 2714 sata_device.satadev_addr.cport))); 2715 /* Send abort request to HBA */ 2716 if ((*SATA_ABORT_FUNC(sata_hba_inst)) 2717 (SATA_DIP(sata_hba_inst), sata_pkt, 2718 scsi_pkt == NULL ? SATA_ABORT_ALL_PACKETS : SATA_ABORT_PACKET) == 2719 SATA_SUCCESS) { 2720 if (scsi_pkt == NULL) 2721 kmem_free(sata_pkt, sizeof (sata_pkt_t)); 2722 /* Success */ 2723 return (1); 2724 } 2725 /* Else, something did not go right */ 2726 if (scsi_pkt == NULL) 2727 kmem_free(sata_pkt, sizeof (sata_pkt_t)); 2728 /* Failure */ 2729 return (0); 2730 } 2731 2732 2733 /* 2734 * Implementation of scsi tran_reset. 2735 * RESET_ALL request is translated into port reset. 2736 * RESET_TARGET requests is translated into a device reset, 2737 * RESET_LUN request is accepted only for LUN 0 and translated into 2738 * device reset. 2739 * The target reset should cause all HBA active and queued packets to 2740 * be terminated and returned with pkt reason SATA_PKT_RESET prior to 2741 * the return. HBA should report reset event for the device. 2742 * 2743 * Returns 1 upon success, 0 upon failure. 2744 */ 2745 static int 2746 sata_scsi_reset(struct scsi_address *ap, int level) 2747 { 2748 sata_hba_inst_t *sata_hba_inst = 2749 (sata_hba_inst_t *)(ap->a_hba_tran->tran_hba_private); 2750 sata_device_t sata_device; 2751 int val; 2752 2753 SATADBG2(SATA_DBG_SCSI_IF, sata_hba_inst, 2754 "sata_scsi_reset: level %d target: 0x%x\n", 2755 level, ap->a_target); 2756 2757 /* Validate address */ 2758 val = sata_validate_scsi_address(sata_hba_inst, ap, &sata_device); 2759 if (val == -1) 2760 /* Invalid address */ 2761 return (0); 2762 2763 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, 2764 sata_device.satadev_addr.cport))); 2765 if (sata_get_device_info(sata_hba_inst, &sata_device) == NULL) { 2766 /* invalid address */ 2767 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, 2768 sata_device.satadev_addr.cport))); 2769 return (0); 2770 } 2771 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, 2772 sata_device.satadev_addr.cport))); 2773 if (level == RESET_ALL) { 2774 /* port reset */ 2775 if (sata_device.satadev_addr.qual == SATA_ADDR_DCPORT) 2776 sata_device.satadev_addr.qual = SATA_ADDR_CPORT; 2777 else 2778 sata_device.satadev_addr.qual = SATA_ADDR_PMPORT; 2779 2780 if ((*SATA_RESET_DPORT_FUNC(sata_hba_inst)) 2781 (SATA_DIP(sata_hba_inst), &sata_device) == SATA_SUCCESS) 2782 return (1); 2783 else 2784 return (0); 2785 2786 } else if (val == 0 && 2787 (level == RESET_TARGET || level == RESET_LUN)) { 2788 /* reset device (device attached) */ 2789 if ((*SATA_RESET_DPORT_FUNC(sata_hba_inst)) 2790 (SATA_DIP(sata_hba_inst), &sata_device) == SATA_SUCCESS) 2791 return (1); 2792 else 2793 return (0); 2794 } 2795 return (0); 2796 } 2797 2798 2799 /* 2800 * Implementation of scsi tran_getcap (get transport/device capabilities). 2801 * Supported capabilities for SATA hard disks: 2802 * auto-rqsense (always supported) 2803 * tagged-qing (supported if HBA supports it) 2804 * untagged-qing (could be supported if disk supports it, but because 2805 * caching behavior allowing untagged queuing actually 2806 * results in reduced performance. sd tries to throttle 2807 * back to only 3 outstanding commands, which may 2808 * work for real SCSI disks, but with read ahead 2809 * caching, having more than 1 outstanding command 2810 * results in cache thrashing.) 2811 * sector_size 2812 * dma_max 2813 * interconnect-type (INTERCONNECT_SATA) 2814 * 2815 * Supported capabilities for ATAPI CD/DVD devices: 2816 * auto-rqsense (always supported) 2817 * sector_size 2818 * dma_max 2819 * max-cdb-length 2820 * interconnect-type (INTERCONNECT_SATA) 2821 * 2822 * Supported capabilities for ATAPI TAPE devices: 2823 * auto-rqsense (always supported) 2824 * dma_max 2825 * max-cdb-length 2826 * 2827 * Supported capabilities for SATA ATAPI hard disks: 2828 * auto-rqsense (always supported) 2829 * interconnect-type (INTERCONNECT_SATA) 2830 * max-cdb-length 2831 * 2832 * Request for other capabilities is rejected as unsupported. 2833 * 2834 * Returns supported capability value, or -1 if capability is unsuppported or 2835 * the address is invalid - no device. 2836 */ 2837 2838 static int 2839 sata_scsi_getcap(struct scsi_address *ap, char *cap, int whom) 2840 { 2841 2842 sata_hba_inst_t *sata_hba_inst = 2843 (sata_hba_inst_t *)(ap->a_hba_tran->tran_hba_private); 2844 sata_device_t sata_device; 2845 sata_drive_info_t *sdinfo; 2846 ddi_dma_attr_t adj_dma_attr; 2847 int rval; 2848 2849 SATADBG2(SATA_DBG_SCSI_IF, sata_hba_inst, 2850 "sata_scsi_getcap: target: 0x%x, cap: %s\n", 2851 ap->a_target, cap); 2852 2853 /* 2854 * We want to process the capabilities on per port granularity. 2855 * So, we are specifically restricting ourselves to whom != 0 2856 * to exclude the controller wide handling. 2857 */ 2858 if (cap == NULL || whom == 0) 2859 return (-1); 2860 2861 if (sata_validate_scsi_address(sata_hba_inst, ap, &sata_device) != 0) { 2862 /* Invalid address */ 2863 return (-1); 2864 } 2865 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, 2866 sata_device.satadev_addr.cport))); 2867 if ((sdinfo = sata_get_device_info(sata_hba_inst, &sata_device)) == 2868 NULL) { 2869 /* invalid address */ 2870 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, 2871 sata_device.satadev_addr.cport))); 2872 return (-1); 2873 } 2874 2875 switch (scsi_hba_lookup_capstr(cap)) { 2876 case SCSI_CAP_ARQ: 2877 rval = 1; /* ARQ supported, turned on */ 2878 break; 2879 2880 case SCSI_CAP_SECTOR_SIZE: 2881 if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) 2882 rval = SATA_DISK_SECTOR_SIZE; /* fixed size */ 2883 else if (sdinfo->satadrv_type == SATA_DTYPE_ATAPICD) 2884 rval = SATA_ATAPI_SECTOR_SIZE; 2885 else rval = -1; 2886 break; 2887 2888 /* 2889 * untagged queuing cause a performance inversion because of 2890 * the way sd operates. Because of this reason we do not 2891 * use it when available. 2892 */ 2893 case SCSI_CAP_UNTAGGED_QING: 2894 if (sdinfo->satadrv_features_enabled & 2895 SATA_DEV_F_E_UNTAGGED_QING) 2896 rval = 1; /* Untagged queuing available */ 2897 else 2898 rval = -1; /* Untagged queuing not available */ 2899 break; 2900 2901 case SCSI_CAP_TAGGED_QING: 2902 if ((sdinfo->satadrv_features_enabled & 2903 SATA_DEV_F_E_TAGGED_QING) && 2904 (sdinfo->satadrv_max_queue_depth > 1)) 2905 rval = 1; /* Tagged queuing available */ 2906 else 2907 rval = -1; /* Tagged queuing not available */ 2908 break; 2909 2910 case SCSI_CAP_DMA_MAX: 2911 sata_adjust_dma_attr(sdinfo, SATA_DMA_ATTR(sata_hba_inst), 2912 &adj_dma_attr); 2913 rval = (int)adj_dma_attr.dma_attr_maxxfer; 2914 /* We rely on the fact that dma_attr_maxxfer < 0x80000000 */ 2915 break; 2916 2917 case SCSI_CAP_INTERCONNECT_TYPE: 2918 rval = INTERCONNECT_SATA; /* SATA interconnect type */ 2919 break; 2920 2921 case SCSI_CAP_CDB_LEN: 2922 if (sdinfo->satadrv_type & SATA_DTYPE_ATAPI) 2923 rval = sdinfo->satadrv_atapi_cdb_len; 2924 else 2925 rval = -1; 2926 break; 2927 2928 default: 2929 rval = -1; 2930 break; 2931 } 2932 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, 2933 sata_device.satadev_addr.cport))); 2934 return (rval); 2935 } 2936 2937 /* 2938 * Implementation of scsi tran_setcap 2939 * 2940 * Only SCSI_CAP_UNTAGGED_QING and SCSI_CAP_TAGGED_QING are changeable. 2941 * 2942 */ 2943 static int 2944 sata_scsi_setcap(struct scsi_address *ap, char *cap, int value, int whom) 2945 { 2946 sata_hba_inst_t *sata_hba_inst = 2947 (sata_hba_inst_t *)(ap->a_hba_tran->tran_hba_private); 2948 sata_device_t sata_device; 2949 sata_drive_info_t *sdinfo; 2950 int rval; 2951 2952 SATADBG2(SATA_DBG_SCSI_IF, sata_hba_inst, 2953 "sata_scsi_setcap: target: 0x%x, cap: %s\n", ap->a_target, cap); 2954 2955 /* 2956 * We want to process the capabilities on per port granularity. 2957 * So, we are specifically restricting ourselves to whom != 0 2958 * to exclude the controller wide handling. 2959 */ 2960 if (cap == NULL || whom == 0) { 2961 return (-1); 2962 } 2963 2964 if (sata_validate_scsi_address(sata_hba_inst, ap, &sata_device) != 0) { 2965 /* Invalid address */ 2966 return (-1); 2967 } 2968 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, 2969 sata_device.satadev_addr.cport))); 2970 if ((sdinfo = sata_get_device_info(sata_hba_inst, 2971 &sata_device)) == NULL) { 2972 /* invalid address */ 2973 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, 2974 sata_device.satadev_addr.cport))); 2975 return (-1); 2976 } 2977 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, 2978 sata_device.satadev_addr.cport))); 2979 2980 switch (scsi_hba_lookup_capstr(cap)) { 2981 case SCSI_CAP_ARQ: 2982 case SCSI_CAP_SECTOR_SIZE: 2983 case SCSI_CAP_DMA_MAX: 2984 case SCSI_CAP_INTERCONNECT_TYPE: 2985 rval = 0; 2986 break; 2987 case SCSI_CAP_UNTAGGED_QING: 2988 if (SATA_QDEPTH(sata_hba_inst) > 1) { 2989 rval = 1; 2990 if (value == 1) { 2991 sdinfo->satadrv_features_enabled |= 2992 SATA_DEV_F_E_UNTAGGED_QING; 2993 } else if (value == 0) { 2994 sdinfo->satadrv_features_enabled &= 2995 ~SATA_DEV_F_E_UNTAGGED_QING; 2996 } else { 2997 rval = -1; 2998 } 2999 } else { 3000 rval = 0; 3001 } 3002 break; 3003 case SCSI_CAP_TAGGED_QING: 3004 /* This can TCQ or NCQ */ 3005 if (sata_func_enable & SATA_ENABLE_QUEUING && 3006 ((sdinfo->satadrv_features_support & SATA_DEV_F_TCQ && 3007 SATA_FEATURES(sata_hba_inst) & SATA_CTLF_QCMD) || 3008 (sata_func_enable & SATA_ENABLE_NCQ && 3009 sdinfo->satadrv_features_support & SATA_DEV_F_NCQ && 3010 SATA_FEATURES(sata_hba_inst) & SATA_CTLF_NCQ)) && 3011 (sdinfo->satadrv_max_queue_depth > 1)) { 3012 rval = 1; 3013 if (value == 1) { 3014 sdinfo->satadrv_features_enabled |= 3015 SATA_DEV_F_E_TAGGED_QING; 3016 } else if (value == 0) { 3017 sdinfo->satadrv_features_enabled &= 3018 ~SATA_DEV_F_E_TAGGED_QING; 3019 } else { 3020 rval = -1; 3021 } 3022 } else { 3023 rval = 0; 3024 } 3025 break; 3026 default: 3027 rval = -1; 3028 break; 3029 } 3030 return (rval); 3031 } 3032 3033 /* 3034 * Implementations of scsi tran_destroy_pkt. 3035 * Free resources allocated by sata_scsi_init_pkt() 3036 */ 3037 static void 3038 sata_scsi_destroy_pkt(struct scsi_address *ap, struct scsi_pkt *pkt) 3039 { 3040 sata_pkt_txlate_t *spx; 3041 3042 spx = (sata_pkt_txlate_t *)pkt->pkt_ha_private; 3043 3044 sata_common_free_dma_rsrcs(spx); 3045 3046 spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp = NULL; 3047 sata_pkt_free(spx); 3048 3049 scsi_hba_pkt_free(ap, pkt); 3050 } 3051 3052 /* 3053 * Implementation of scsi tran_dmafree. 3054 * Free DMA resources allocated by sata_scsi_init_pkt() 3055 */ 3056 3057 static void 3058 sata_scsi_dmafree(struct scsi_address *ap, struct scsi_pkt *pkt) 3059 { 3060 #ifndef __lock_lint 3061 _NOTE(ARGUNUSED(ap)) 3062 #endif 3063 sata_pkt_txlate_t *spx; 3064 3065 ASSERT(pkt != NULL); 3066 spx = (sata_pkt_txlate_t *)pkt->pkt_ha_private; 3067 3068 sata_common_free_dma_rsrcs(spx); 3069 } 3070 3071 /* 3072 * Implementation of scsi tran_sync_pkt. 3073 * 3074 * The assumption below is that pkt is unique - there is no need to check ap 3075 * 3076 * Synchronize DMA buffer and, if the intermediate buffer is used, copy data 3077 * into/from the real buffer. 3078 */ 3079 static void 3080 sata_scsi_sync_pkt(struct scsi_address *ap, struct scsi_pkt *pkt) 3081 { 3082 #ifndef __lock_lint 3083 _NOTE(ARGUNUSED(ap)) 3084 #endif 3085 int rval; 3086 sata_pkt_txlate_t *spx = (sata_pkt_txlate_t *)pkt->pkt_ha_private; 3087 struct buf *bp; 3088 int direction; 3089 3090 ASSERT(spx != NULL); 3091 if (spx->txlt_buf_dma_handle != NULL) { 3092 direction = spx->txlt_sata_pkt-> 3093 satapkt_cmd.satacmd_flags.sata_data_direction; 3094 if (spx->txlt_sata_pkt != NULL && 3095 direction != SATA_DIR_NODATA_XFER) { 3096 if (spx->txlt_tmp_buf != NULL) { 3097 /* Intermediate DMA buffer used */ 3098 bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp; 3099 3100 if (direction & SATA_DIR_WRITE) { 3101 bcopy(bp->b_un.b_addr, 3102 spx->txlt_tmp_buf, bp->b_bcount); 3103 } 3104 } 3105 /* Sync the buffer for device or for CPU */ 3106 rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0, 3107 (direction & SATA_DIR_WRITE) ? 3108 DDI_DMA_SYNC_FORDEV : DDI_DMA_SYNC_FORCPU); 3109 ASSERT(rval == DDI_SUCCESS); 3110 if (spx->txlt_tmp_buf != NULL && 3111 !(direction & SATA_DIR_WRITE)) { 3112 /* Intermediate DMA buffer used for read */ 3113 bcopy(spx->txlt_tmp_buf, 3114 bp->b_un.b_addr, bp->b_bcount); 3115 } 3116 3117 } 3118 } 3119 } 3120 3121 3122 3123 /* ******************* SATA - SCSI Translation functions **************** */ 3124 /* 3125 * SCSI to SATA pkt and command translation and SATA to SCSI status/error 3126 * translation. 3127 */ 3128 3129 /* 3130 * Checks if a device exists and can be access and translates common 3131 * scsi_pkt data to sata_pkt data. 3132 * 3133 * Flag argument indicates that a non-read/write ATA command may be sent 3134 * to HBA in arbitrary SYNC mode to execute this packet. 3135 * 3136 * Returns TRAN_ACCEPT and scsi pkt_reason CMD_CMPLT if device exists and 3137 * sata_pkt was set-up. 3138 * Returns TRAN_ACCEPT and scsi pkt_reason CMD_DEV_GONE if device does not 3139 * exist and pkt_comp callback was scheduled. 3140 * Returns other TRAN_XXXXX values when error occured and command should be 3141 * rejected with the returned TRAN_XXXXX value. 3142 * 3143 * This function should be called with port mutex held. 3144 */ 3145 static int 3146 sata_txlt_generic_pkt_info(sata_pkt_txlate_t *spx, int *reason, int flag) 3147 { 3148 sata_drive_info_t *sdinfo; 3149 sata_device_t sata_device; 3150 const struct sata_cmd_flags sata_initial_cmd_flags = { 3151 SATA_DIR_NODATA_XFER, 3152 /* all other values to 0/FALSE */ 3153 }; 3154 /* 3155 * Pkt_reason has to be set if the pkt_comp callback is invoked, 3156 * and that implies TRAN_ACCEPT return value. Any other returned value 3157 * indicates that the scsi packet was not accepted (the reason will not 3158 * be checked by the scsi target driver). 3159 * To make debugging easier, we set pkt_reason to know value here. 3160 * It may be changed later when different completion reason is 3161 * determined. 3162 */ 3163 spx->txlt_scsi_pkt->pkt_reason = CMD_TRAN_ERR; 3164 *reason = CMD_TRAN_ERR; 3165 3166 /* Validate address */ 3167 switch (sata_validate_scsi_address(spx->txlt_sata_hba_inst, 3168 &spx->txlt_scsi_pkt->pkt_address, &sata_device)) { 3169 3170 case -1: 3171 /* Invalid address or invalid device type */ 3172 return (TRAN_BADPKT); 3173 case 2: 3174 /* 3175 * Valid address but device type is unknown - Chack if it is 3176 * in the reset state and therefore in an indeterminate state. 3177 */ 3178 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst, 3179 &spx->txlt_sata_pkt->satapkt_device); 3180 if (sdinfo != NULL && (sdinfo->satadrv_event_flags & 3181 (SATA_EVNT_DEVICE_RESET | 3182 SATA_EVNT_INPROC_DEVICE_RESET)) != 0) { 3183 if (!ddi_in_panic()) { 3184 spx->txlt_scsi_pkt->pkt_reason = CMD_INCOMPLETE; 3185 *reason = CMD_INCOMPLETE; 3186 SATADBG1(SATA_DBG_SCSI_IF, 3187 spx->txlt_sata_hba_inst, 3188 "sata_scsi_start: rejecting command " 3189 "because of device reset state\n", NULL); 3190 return (TRAN_BUSY); 3191 } 3192 } 3193 /* FALLTHROUGH */ 3194 case 1: 3195 /* valid address but no valid device - it has disappeared */ 3196 spx->txlt_scsi_pkt->pkt_reason = CMD_DEV_GONE; 3197 *reason = CMD_DEV_GONE; 3198 /* 3199 * The sd target driver is checking CMD_DEV_GONE pkt_reason 3200 * only in callback function (for normal requests) and 3201 * in the dump code path. 3202 * So, if the callback is available, we need to do 3203 * the callback rather than returning TRAN_FATAL_ERROR here. 3204 */ 3205 if (spx->txlt_scsi_pkt->pkt_comp != NULL) { 3206 /* scsi callback required */ 3207 if (servicing_interrupt()) { 3208 if (taskq_dispatch(SATA_TXLT_TASKQ(spx), 3209 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp, 3210 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) == 3211 NULL) { 3212 return (TRAN_BUSY); 3213 } 3214 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx), 3215 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp, 3216 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) { 3217 /* Scheduling the callback failed */ 3218 return (TRAN_BUSY); 3219 } 3220 3221 return (TRAN_ACCEPT); 3222 } 3223 return (TRAN_FATAL_ERROR); 3224 default: 3225 /* all OK; pkt reason will be overwritten later */ 3226 break; 3227 } 3228 /* 3229 * If pkt is to be executed in polling mode and a command will not be 3230 * emulated in SATA module (requires sending a non-read/write ATA 3231 * command to HBA driver in arbitrary SYNC mode) and we are in the 3232 * interrupt context and not in the panic dump, then reject the packet 3233 * to avoid a possible interrupt stack overrun or hang caused by 3234 * a potentially blocked interrupt. 3235 */ 3236 if (((spx->txlt_scsi_pkt->pkt_flags & FLAG_NOINTR) != 0 || flag != 0) && 3237 servicing_interrupt() && !ddi_in_panic()) { 3238 SATADBG1(SATA_DBG_INTR_CTX, spx->txlt_sata_hba_inst, 3239 "sata_scsi_start: rejecting synchronous command because " 3240 "of interrupt context\n", NULL); 3241 return (TRAN_BUSY); 3242 } 3243 3244 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst, 3245 &spx->txlt_sata_pkt->satapkt_device); 3246 3247 /* 3248 * If device is in reset condition, reject the packet with 3249 * TRAN_BUSY, unless: 3250 * 1. system is panicking (dumping) 3251 * In such case only one thread is running and there is no way to 3252 * process reset. 3253 * 2. cfgadm operation is is progress (internal APCTL lock is set) 3254 * Some cfgadm operations involve drive commands, so reset condition 3255 * needs to be ignored for IOCTL operations. 3256 */ 3257 if ((sdinfo->satadrv_event_flags & 3258 (SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET)) != 0) { 3259 3260 if (!ddi_in_panic() && 3261 ((SATA_CPORT_EVENT_FLAGS(spx->txlt_sata_hba_inst, 3262 sata_device.satadev_addr.cport) & 3263 SATA_APCTL_LOCK_PORT_BUSY) == 0)) { 3264 spx->txlt_scsi_pkt->pkt_reason = CMD_INCOMPLETE; 3265 *reason = CMD_INCOMPLETE; 3266 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst, 3267 "sata_scsi_start: rejecting command because " 3268 "of device reset state\n", NULL); 3269 return (TRAN_BUSY); 3270 } 3271 } 3272 3273 /* 3274 * Fix the dev_type in the sata_pkt->satapkt_device. It was not set by 3275 * sata_scsi_pkt_init() because pkt init had to work also with 3276 * non-existing devices. 3277 * Now we know that the packet was set-up for a real device, so its 3278 * type is known. 3279 */ 3280 spx->txlt_sata_pkt->satapkt_device.satadev_type = sdinfo->satadrv_type; 3281 3282 spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags = sata_initial_cmd_flags; 3283 if ((SATA_CPORT_INFO(spx->txlt_sata_hba_inst, 3284 sata_device.satadev_addr.cport)->cport_event_flags & 3285 SATA_APCTL_LOCK_PORT_BUSY) != 0) { 3286 spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags. 3287 sata_ignore_dev_reset = B_TRUE; 3288 } 3289 /* 3290 * At this point the generic translation routine determined that the 3291 * scsi packet should be accepted. Packet completion reason may be 3292 * changed later when a different completion reason is determined. 3293 */ 3294 spx->txlt_scsi_pkt->pkt_reason = CMD_CMPLT; 3295 *reason = CMD_CMPLT; 3296 3297 if ((spx->txlt_scsi_pkt->pkt_flags & FLAG_NOINTR) != 0) { 3298 /* Synchronous execution */ 3299 spx->txlt_sata_pkt->satapkt_op_mode = SATA_OPMODE_SYNCH | 3300 SATA_OPMODE_POLLING; 3301 spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags. 3302 sata_ignore_dev_reset = ddi_in_panic(); 3303 } else { 3304 /* Asynchronous execution */ 3305 spx->txlt_sata_pkt->satapkt_op_mode = SATA_OPMODE_ASYNCH | 3306 SATA_OPMODE_INTERRUPTS; 3307 } 3308 /* Convert queuing information */ 3309 if (spx->txlt_scsi_pkt->pkt_flags & FLAG_STAG) 3310 spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags.sata_queue_stag = 3311 B_TRUE; 3312 else if (spx->txlt_scsi_pkt->pkt_flags & 3313 (FLAG_OTAG | FLAG_HTAG | FLAG_HEAD)) 3314 spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags.sata_queue_otag = 3315 B_TRUE; 3316 3317 /* Always limit pkt time */ 3318 if (spx->txlt_scsi_pkt->pkt_time == 0) 3319 spx->txlt_sata_pkt->satapkt_time = sata_default_pkt_time; 3320 else 3321 /* Pass on scsi_pkt time */ 3322 spx->txlt_sata_pkt->satapkt_time = 3323 spx->txlt_scsi_pkt->pkt_time; 3324 3325 return (TRAN_ACCEPT); 3326 } 3327 3328 3329 /* 3330 * Translate ATA Identify Device data to SCSI Inquiry data. 3331 * This function may be called only for ATA devices. 3332 * This function should not be called for ATAPI devices - they 3333 * respond directly to SCSI Inquiry command. 3334 * 3335 * SATA Identify Device data has to be valid in sata_drive_info. 3336 * Buffer has to accomodate the inquiry length (36 bytes). 3337 * 3338 * This function should be called with a port mutex held. 3339 */ 3340 static void 3341 sata_identdev_to_inquiry(sata_hba_inst_t *sata_hba_inst, 3342 sata_drive_info_t *sdinfo, uint8_t *buf) 3343 { 3344 3345 struct scsi_inquiry *inq = (struct scsi_inquiry *)buf; 3346 struct sata_id *sid = &sdinfo->satadrv_id; 3347 3348 /* Start with a nice clean slate */ 3349 bzero((void *)inq, sizeof (struct scsi_inquiry)); 3350 3351 /* 3352 * Rely on the dev_type for setting paripheral qualifier. 3353 * Assume that DTYPE_RODIRECT applies to CD/DVD R/W devices. 3354 * It could be that DTYPE_OPTICAL could also qualify in the future. 3355 * ATAPI Inquiry may provide more data to the target driver. 3356 */ 3357 inq->inq_dtype = sdinfo->satadrv_type == SATA_DTYPE_ATADISK ? 3358 DTYPE_DIRECT : DTYPE_RODIRECT; /* DTYPE_UNKNOWN; */ 3359 3360 /* CFA type device is not a removable media device */ 3361 inq->inq_rmb = ((sid->ai_config != SATA_CFA_TYPE) && 3362 (sid->ai_config & SATA_REM_MEDIA)) ? 1 : 0; 3363 inq->inq_qual = 0; /* Device type qualifier (obsolete in SCSI3? */ 3364 inq->inq_iso = 0; /* ISO version */ 3365 inq->inq_ecma = 0; /* ECMA version */ 3366 inq->inq_ansi = 3; /* ANSI version - SCSI 3 */ 3367 inq->inq_aenc = 0; /* Async event notification cap. */ 3368 inq->inq_trmiop = 0; /* Supports TERMINATE I/O PROC msg - NO */ 3369 inq->inq_normaca = 0; /* setting NACA bit supported - NO */ 3370 inq->inq_rdf = RDF_SCSI2; /* Response data format- SPC-3 */ 3371 inq->inq_len = 31; /* Additional length */ 3372 inq->inq_dualp = 0; /* dual port device - NO */ 3373 inq->inq_reladdr = 0; /* Supports relative addressing - NO */ 3374 inq->inq_sync = 0; /* Supports synchronous data xfers - NO */ 3375 inq->inq_linked = 0; /* Supports linked commands - NO */ 3376 /* 3377 * Queuing support - controller has to 3378 * support some sort of command queuing. 3379 */ 3380 if (SATA_QDEPTH(sata_hba_inst) > 1) 3381 inq->inq_cmdque = 1; /* Supports command queueing - YES */ 3382 else 3383 inq->inq_cmdque = 0; /* Supports command queueing - NO */ 3384 inq->inq_sftre = 0; /* Supports Soft Reset option - NO ??? */ 3385 inq->inq_wbus32 = 0; /* Supports 32 bit wide data xfers - NO */ 3386 inq->inq_wbus16 = 0; /* Supports 16 bit wide data xfers - NO */ 3387 3388 #ifdef _LITTLE_ENDIAN 3389 /* Swap text fields to match SCSI format */ 3390 bcopy("ATA ", inq->inq_vid, 8); /* Vendor ID */ 3391 swab(sid->ai_model, inq->inq_pid, 16); /* Product ID */ 3392 if (strncmp(&sid->ai_fw[4], " ", 4) == 0) 3393 swab(sid->ai_fw, inq->inq_revision, 4); /* Revision level */ 3394 else 3395 swab(&sid->ai_fw[4], inq->inq_revision, 4); /* Rev. level */ 3396 #else /* _LITTLE_ENDIAN */ 3397 bcopy("ATA ", inq->inq_vid, 8); /* Vendor ID */ 3398 bcopy(sid->ai_model, inq->inq_pid, 16); /* Product ID */ 3399 if (strncmp(&sid->ai_fw[4], " ", 4) == 0) 3400 bcopy(sid->ai_fw, inq->inq_revision, 4); /* Revision level */ 3401 else 3402 bcopy(&sid->ai_fw[4], inq->inq_revision, 4); /* Rev. level */ 3403 #endif /* _LITTLE_ENDIAN */ 3404 } 3405 3406 3407 /* 3408 * Scsi response set up for invalid command (command not supported) 3409 * 3410 * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields. 3411 */ 3412 static int 3413 sata_txlt_invalid_command(sata_pkt_txlate_t *spx) 3414 { 3415 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt; 3416 struct scsi_extended_sense *sense; 3417 3418 scsipkt->pkt_reason = CMD_CMPLT; 3419 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET | 3420 STATE_SENT_CMD | STATE_GOT_STATUS; 3421 3422 *scsipkt->pkt_scbp = STATUS_CHECK; 3423 3424 sense = sata_arq_sense(spx); 3425 sense->es_key = KEY_ILLEGAL_REQUEST; 3426 sense->es_add_code = SD_SCSI_ASC_INVALID_COMMAND_CODE; 3427 3428 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst, 3429 "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason); 3430 3431 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 && 3432 scsipkt->pkt_comp != NULL) { 3433 /* scsi callback required */ 3434 if (servicing_interrupt()) { 3435 if (taskq_dispatch(SATA_TXLT_TASKQ(spx), 3436 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp, 3437 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) == NULL) { 3438 return (TRAN_BUSY); 3439 } 3440 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx), 3441 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp, 3442 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) { 3443 /* Scheduling the callback failed */ 3444 return (TRAN_BUSY); 3445 } 3446 } 3447 return (TRAN_ACCEPT); 3448 } 3449 3450 /* 3451 * Scsi response set up for check condition with special sense key 3452 * and additional sense code. 3453 * 3454 * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields. 3455 */ 3456 static int 3457 sata_txlt_check_condition(sata_pkt_txlate_t *spx, uchar_t key, uchar_t code) 3458 { 3459 sata_hba_inst_t *shi = SATA_TXLT_HBA_INST(spx); 3460 int cport = SATA_TXLT_CPORT(spx); 3461 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt; 3462 struct scsi_extended_sense *sense; 3463 3464 mutex_enter(&SATA_CPORT_MUTEX(shi, cport)); 3465 scsipkt->pkt_reason = CMD_CMPLT; 3466 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET | 3467 STATE_SENT_CMD | STATE_GOT_STATUS; 3468 3469 *scsipkt->pkt_scbp = STATUS_CHECK; 3470 3471 sense = sata_arq_sense(spx); 3472 sense->es_key = key; 3473 sense->es_add_code = code; 3474 3475 mutex_exit(&SATA_CPORT_MUTEX(shi, cport)); 3476 3477 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst, 3478 "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason); 3479 3480 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 && 3481 scsipkt->pkt_comp != NULL) { 3482 /* scsi callback required */ 3483 if (servicing_interrupt()) { 3484 if (taskq_dispatch(SATA_TXLT_TASKQ(spx), 3485 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp, 3486 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) == NULL) { 3487 return (TRAN_BUSY); 3488 } 3489 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx), 3490 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp, 3491 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) { 3492 /* Scheduling the callback failed */ 3493 return (TRAN_BUSY); 3494 } 3495 } 3496 return (TRAN_ACCEPT); 3497 } 3498 3499 /* 3500 * Scsi response setup for 3501 * emulated non-data command that requires no action/return data 3502 * 3503 * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields. 3504 */ 3505 static int 3506 sata_txlt_nodata_cmd_immediate(sata_pkt_txlate_t *spx) 3507 { 3508 int rval; 3509 int reason; 3510 3511 mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx))); 3512 3513 if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 0)) != 3514 TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) { 3515 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); 3516 return (rval); 3517 } 3518 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); 3519 3520 spx->txlt_scsi_pkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET | 3521 STATE_SENT_CMD | STATE_GOT_STATUS; 3522 spx->txlt_scsi_pkt->pkt_reason = CMD_CMPLT; 3523 *(spx->txlt_scsi_pkt->pkt_scbp) = STATUS_GOOD; 3524 3525 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst, 3526 "Scsi_pkt completion reason %x\n", 3527 spx->txlt_scsi_pkt->pkt_reason); 3528 3529 if ((spx->txlt_scsi_pkt->pkt_flags & FLAG_NOINTR) == 0 && 3530 spx->txlt_scsi_pkt->pkt_comp != NULL) { 3531 /* scsi callback required */ 3532 if (servicing_interrupt()) { 3533 if (taskq_dispatch(SATA_TXLT_TASKQ(spx), 3534 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp, 3535 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) == NULL) { 3536 return (TRAN_BUSY); 3537 } 3538 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx), 3539 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp, 3540 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) { 3541 /* Scheduling the callback failed */ 3542 return (TRAN_BUSY); 3543 } 3544 } 3545 return (TRAN_ACCEPT); 3546 } 3547 3548 3549 /* 3550 * SATA translate command: Inquiry / Identify Device 3551 * Use cached Identify Device data for now, rather than issuing actual 3552 * Device Identify cmd request. If device is detached and re-attached, 3553 * asynchronous event processing should fetch and refresh Identify Device 3554 * data. 3555 * Two VPD pages are supported now: 3556 * Vital Product Data page 3557 * Unit Serial Number page 3558 * 3559 * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields. 3560 */ 3561 3562 #define EVPD 1 /* Extended Vital Product Data flag */ 3563 #define CMDDT 2 /* Command Support Data - Obsolete */ 3564 #define INQUIRY_SUP_VPD_PAGE 0 /* Supported VPD Pages Page Code */ 3565 #define INQUIRY_USN_PAGE 0x80 /* Unit Serial Number Page Code */ 3566 #define INQUIRY_BDC_PAGE 0xB1 /* Block Device Characteristics Page */ 3567 /* Code */ 3568 #define INQUIRY_DEV_IDENTIFICATION_PAGE 0x83 /* Not needed yet */ 3569 3570 static int 3571 sata_txlt_inquiry(sata_pkt_txlate_t *spx) 3572 { 3573 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt; 3574 struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp; 3575 sata_drive_info_t *sdinfo; 3576 struct scsi_extended_sense *sense; 3577 int count; 3578 uint8_t *p; 3579 int i, j; 3580 uint8_t page_buf[0xff]; /* Max length */ 3581 int rval, reason; 3582 ushort_t rate; 3583 3584 mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx))); 3585 3586 if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 0)) != 3587 TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) { 3588 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); 3589 return (rval); 3590 } 3591 3592 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst, 3593 &spx->txlt_sata_pkt->satapkt_device); 3594 3595 ASSERT(sdinfo != NULL); 3596 3597 scsipkt->pkt_reason = CMD_CMPLT; 3598 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET | 3599 STATE_SENT_CMD | STATE_GOT_STATUS; 3600 3601 /* Reject not supported request */ 3602 if (scsipkt->pkt_cdbp[1] & CMDDT) { /* No support for this bit */ 3603 *scsipkt->pkt_scbp = STATUS_CHECK; 3604 sense = sata_arq_sense(spx); 3605 sense->es_key = KEY_ILLEGAL_REQUEST; 3606 sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB; 3607 goto done; 3608 } 3609 3610 /* Valid Inquiry request */ 3611 *scsipkt->pkt_scbp = STATUS_GOOD; 3612 3613 if (bp != NULL && bp->b_un.b_addr && bp->b_bcount) { 3614 3615 /* 3616 * Because it is fully emulated command storing data 3617 * programatically in the specified buffer, release 3618 * preallocated DMA resources before storing data in the buffer, 3619 * so no unwanted DMA sync would take place. 3620 */ 3621 sata_scsi_dmafree(NULL, scsipkt); 3622 3623 if (!(scsipkt->pkt_cdbp[1] & EVPD)) { 3624 /* Standard Inquiry Data request */ 3625 struct scsi_inquiry inq; 3626 unsigned int bufsize; 3627 3628 sata_identdev_to_inquiry(spx->txlt_sata_hba_inst, 3629 sdinfo, (uint8_t *)&inq); 3630 /* Copy no more than requested */ 3631 count = MIN(bp->b_bcount, 3632 sizeof (struct scsi_inquiry)); 3633 bufsize = scsipkt->pkt_cdbp[4]; 3634 bufsize |= scsipkt->pkt_cdbp[3] << 8; 3635 count = MIN(count, bufsize); 3636 bcopy(&inq, bp->b_un.b_addr, count); 3637 3638 scsipkt->pkt_state |= STATE_XFERRED_DATA; 3639 scsipkt->pkt_resid = scsipkt->pkt_cdbp[4] > count ? 3640 bufsize - count : 0; 3641 } else { 3642 /* 3643 * peripheral_qualifier = 0; 3644 * 3645 * We are dealing only with HD and will be 3646 * dealing with CD/DVD devices soon 3647 */ 3648 uint8_t peripheral_device_type = 3649 sdinfo->satadrv_type == SATA_DTYPE_ATADISK ? 3650 DTYPE_DIRECT : DTYPE_RODIRECT; 3651 3652 switch ((uint_t)scsipkt->pkt_cdbp[2]) { 3653 case INQUIRY_SUP_VPD_PAGE: 3654 /* 3655 * Request for suported Vital Product Data 3656 * pages - assuming only 2 page codes 3657 * supported. 3658 */ 3659 page_buf[0] = peripheral_device_type; 3660 page_buf[1] = INQUIRY_SUP_VPD_PAGE; 3661 page_buf[2] = 0; 3662 page_buf[3] = 3; /* page length */ 3663 page_buf[4] = INQUIRY_SUP_VPD_PAGE; 3664 page_buf[5] = INQUIRY_USN_PAGE; 3665 page_buf[6] = INQUIRY_BDC_PAGE; 3666 /* Copy no more than requested */ 3667 count = MIN(bp->b_bcount, 7); 3668 bcopy(page_buf, bp->b_un.b_addr, count); 3669 break; 3670 3671 case INQUIRY_USN_PAGE: 3672 /* 3673 * Request for Unit Serial Number page. 3674 * Set-up the page. 3675 */ 3676 page_buf[0] = peripheral_device_type; 3677 page_buf[1] = INQUIRY_USN_PAGE; 3678 page_buf[2] = 0; 3679 /* remaining page length */ 3680 page_buf[3] = SATA_ID_SERIAL_LEN; 3681 3682 /* 3683 * Copy serial number from Identify Device data 3684 * words into the inquiry page and swap bytes 3685 * when necessary. 3686 */ 3687 p = (uint8_t *)(sdinfo->satadrv_id.ai_drvser); 3688 #ifdef _LITTLE_ENDIAN 3689 swab(p, &page_buf[4], SATA_ID_SERIAL_LEN); 3690 #else 3691 bcopy(p, &page_buf[4], SATA_ID_SERIAL_LEN); 3692 #endif 3693 /* 3694 * Least significant character of the serial 3695 * number shall appear as the last byte, 3696 * according to SBC-3 spec. 3697 * Count trailing spaces to determine the 3698 * necessary shift length. 3699 */ 3700 p = &page_buf[SATA_ID_SERIAL_LEN + 4 - 1]; 3701 for (j = 0; j < SATA_ID_SERIAL_LEN; j++) { 3702 if (*(p - j) != '\0' && 3703 *(p - j) != '\040') 3704 break; 3705 } 3706 3707 /* 3708 * Shift SN string right, so that the last 3709 * non-blank character would appear in last 3710 * byte of SN field in the page. 3711 * 'j' is the shift length. 3712 */ 3713 for (i = 0; 3714 i < (SATA_ID_SERIAL_LEN - j) && j != 0; 3715 i++, p--) 3716 *p = *(p - j); 3717 3718 /* 3719 * Add leading spaces - same number as the 3720 * shift size 3721 */ 3722 for (; j > 0; j--) 3723 page_buf[4 + j - 1] = '\040'; 3724 3725 count = MIN(bp->b_bcount, 3726 SATA_ID_SERIAL_LEN + 4); 3727 bcopy(page_buf, bp->b_un.b_addr, count); 3728 break; 3729 3730 case INQUIRY_BDC_PAGE: 3731 /* 3732 * Request for Block Device Characteristics 3733 * page. Set-up the page. 3734 */ 3735 page_buf[0] = peripheral_device_type; 3736 page_buf[1] = INQUIRY_BDC_PAGE; 3737 page_buf[2] = 0; 3738 /* remaining page length */ 3739 page_buf[3] = SATA_ID_BDC_LEN; 3740 3741 rate = sdinfo->satadrv_id.ai_medrotrate; 3742 page_buf[4] = (rate >> 8) & 0xff; 3743 page_buf[5] = rate & 0xff; 3744 page_buf[6] = 0; 3745 page_buf[7] = sdinfo->satadrv_id. 3746 ai_nomformfactor & 0xf; 3747 3748 count = MIN(bp->b_bcount, 3749 SATA_ID_BDC_LEN + 4); 3750 bcopy(page_buf, bp->b_un.b_addr, count); 3751 break; 3752 3753 case INQUIRY_DEV_IDENTIFICATION_PAGE: 3754 /* 3755 * We may want to implement this page, when 3756 * identifiers are common for SATA devices 3757 * But not now. 3758 */ 3759 /*FALLTHROUGH*/ 3760 3761 default: 3762 /* Request for unsupported VPD page */ 3763 *scsipkt->pkt_scbp = STATUS_CHECK; 3764 sense = sata_arq_sense(spx); 3765 sense->es_key = KEY_ILLEGAL_REQUEST; 3766 sense->es_add_code = 3767 SD_SCSI_ASC_INVALID_FIELD_IN_CDB; 3768 goto done; 3769 } 3770 } 3771 scsipkt->pkt_state |= STATE_XFERRED_DATA; 3772 scsipkt->pkt_resid = scsipkt->pkt_cdbp[4] > count ? 3773 scsipkt->pkt_cdbp[4] - count : 0; 3774 } 3775 done: 3776 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); 3777 3778 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst, 3779 "Scsi_pkt completion reason %x\n", 3780 scsipkt->pkt_reason); 3781 3782 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 && 3783 scsipkt->pkt_comp != NULL) { 3784 /* scsi callback required */ 3785 if (servicing_interrupt()) { 3786 if (taskq_dispatch(SATA_TXLT_TASKQ(spx), 3787 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp, 3788 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) == NULL) { 3789 return (TRAN_BUSY); 3790 } 3791 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx), 3792 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp, 3793 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) { 3794 /* Scheduling the callback failed */ 3795 return (TRAN_BUSY); 3796 } 3797 } 3798 return (TRAN_ACCEPT); 3799 } 3800 3801 /* 3802 * SATA translate command: Request Sense. 3803 * 3804 * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields. 3805 * At the moment this is an emulated command (ATA version for SATA hard disks). 3806 * May be translated into Check Power Mode command in the future. 3807 * 3808 * Note: There is a mismatch between already implemented Informational 3809 * Exception Mode Select page 0x1C and this function. 3810 * When MRIE bit is set in page 0x1C, Request Sense is supposed to return 3811 * NO SENSE and set additional sense code to the exception code - this is not 3812 * implemented here. 3813 */ 3814 static int 3815 sata_txlt_request_sense(sata_pkt_txlate_t *spx) 3816 { 3817 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt; 3818 struct scsi_extended_sense sense; 3819 struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp; 3820 sata_drive_info_t *sdinfo; 3821 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd; 3822 int rval, reason, power_state = 0; 3823 3824 mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx))); 3825 3826 if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 1)) != 3827 TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) { 3828 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); 3829 return (rval); 3830 } 3831 3832 scsipkt->pkt_reason = CMD_CMPLT; 3833 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET | 3834 STATE_SENT_CMD | STATE_GOT_STATUS; 3835 *scsipkt->pkt_scbp = STATUS_GOOD; 3836 3837 /* 3838 * when CONTROL field's NACA bit == 1 3839 * return ILLEGAL_REQUEST 3840 */ 3841 if (scsipkt->pkt_cdbp[5] & CTL_BYTE_NACA_MASK) { 3842 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); 3843 return (sata_txlt_check_condition(spx, KEY_ILLEGAL_REQUEST, 3844 SD_SCSI_ASC_CMD_SEQUENCE_ERR)); 3845 } 3846 3847 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst, 3848 &spx->txlt_sata_pkt->satapkt_device); 3849 ASSERT(sdinfo != NULL); 3850 3851 spx->txlt_sata_pkt->satapkt_op_mode |= SATA_OPMODE_SYNCH; 3852 3853 sata_build_generic_cmd(scmd, SATAC_CHECK_POWER_MODE); 3854 scmd->satacmd_flags.sata_copy_out_sec_count_lsb = B_TRUE; 3855 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE; 3856 if (sata_hba_start(spx, &rval) != 0) { 3857 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); 3858 return (rval); 3859 } else { 3860 if (scmd->satacmd_error_reg != 0) { 3861 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); 3862 return (sata_txlt_check_condition(spx, KEY_NO_SENSE, 3863 SD_SCSI_ASC_NO_ADD_SENSE)); 3864 } 3865 } 3866 3867 switch (scmd->satacmd_sec_count_lsb) { 3868 case SATA_PWRMODE_STANDBY: /* device in standby mode */ 3869 if (sdinfo->satadrv_power_level == SATA_POWER_STOPPED) 3870 power_state = SATA_POWER_STOPPED; 3871 else { 3872 power_state = SATA_POWER_STANDBY; 3873 sdinfo->satadrv_power_level = SATA_POWER_STANDBY; 3874 } 3875 break; 3876 case SATA_PWRMODE_IDLE: /* device in idle mode */ 3877 power_state = SATA_POWER_IDLE; 3878 sdinfo->satadrv_power_level = SATA_POWER_IDLE; 3879 break; 3880 case SATA_PWRMODE_ACTIVE: /* device in active or idle mode */ 3881 default: /* 0x40, 0x41 active mode */ 3882 if (sdinfo->satadrv_power_level == SATA_POWER_IDLE) 3883 power_state = SATA_POWER_IDLE; 3884 else { 3885 power_state = SATA_POWER_ACTIVE; 3886 sdinfo->satadrv_power_level = SATA_POWER_ACTIVE; 3887 } 3888 break; 3889 } 3890 3891 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); 3892 3893 if (bp != NULL && bp->b_un.b_addr && bp->b_bcount) { 3894 /* 3895 * Because it is fully emulated command storing data 3896 * programatically in the specified buffer, release 3897 * preallocated DMA resources before storing data in the buffer, 3898 * so no unwanted DMA sync would take place. 3899 */ 3900 int count = MIN(bp->b_bcount, 3901 sizeof (struct scsi_extended_sense)); 3902 sata_scsi_dmafree(NULL, scsipkt); 3903 bzero(&sense, sizeof (struct scsi_extended_sense)); 3904 sense.es_valid = 0; /* Valid LBA */ 3905 sense.es_class = 7; /* Response code 0x70 - current err */ 3906 sense.es_key = KEY_NO_SENSE; 3907 sense.es_add_len = 6; /* Additional length */ 3908 /* Copy no more than requested */ 3909 bcopy(&sense, bp->b_un.b_addr, count); 3910 scsipkt->pkt_state |= STATE_XFERRED_DATA; 3911 scsipkt->pkt_resid = 0; 3912 switch (power_state) { 3913 case SATA_POWER_IDLE: 3914 case SATA_POWER_STANDBY: 3915 sense.es_add_code = 3916 SD_SCSI_ASC_LOW_POWER_CONDITION_ON; 3917 break; 3918 case SATA_POWER_STOPPED: 3919 sense.es_add_code = SD_SCSI_ASC_NO_ADD_SENSE; 3920 break; 3921 case SATA_POWER_ACTIVE: 3922 default: 3923 break; 3924 } 3925 } 3926 3927 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst, 3928 "Scsi_pkt completion reason %x\n", 3929 scsipkt->pkt_reason); 3930 3931 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 && 3932 scsipkt->pkt_comp != NULL) { 3933 /* scsi callback required */ 3934 if (servicing_interrupt()) { 3935 if (taskq_dispatch(SATA_TXLT_TASKQ(spx), 3936 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp, 3937 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) == NULL) { 3938 return (TRAN_BUSY); 3939 } 3940 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx), 3941 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp, 3942 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) { 3943 /* Scheduling the callback failed */ 3944 return (TRAN_BUSY); 3945 } 3946 } 3947 return (TRAN_ACCEPT); 3948 } 3949 3950 /* 3951 * SATA translate command: Test Unit Ready 3952 * (ATA version for SATA hard disks). 3953 * It is translated into the Check Power Mode command. 3954 * 3955 * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields. 3956 */ 3957 static int 3958 sata_txlt_test_unit_ready(sata_pkt_txlate_t *spx) 3959 { 3960 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt; 3961 struct scsi_extended_sense *sense; 3962 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd; 3963 sata_drive_info_t *sdinfo; 3964 int power_state; 3965 int rval, reason; 3966 3967 mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx))); 3968 3969 if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 1)) != 3970 TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) { 3971 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); 3972 return (rval); 3973 } 3974 3975 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst, 3976 &spx->txlt_sata_pkt->satapkt_device); 3977 ASSERT(sdinfo != NULL); 3978 3979 spx->txlt_sata_pkt->satapkt_op_mode |= SATA_OPMODE_SYNCH; 3980 3981 /* send CHECK POWER MODE command */ 3982 sata_build_generic_cmd(scmd, SATAC_CHECK_POWER_MODE); 3983 scmd->satacmd_flags.sata_copy_out_sec_count_lsb = B_TRUE; 3984 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE; 3985 if (sata_hba_start(spx, &rval) != 0) { 3986 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); 3987 return (rval); 3988 } else { 3989 if (scmd->satacmd_error_reg != 0) { 3990 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); 3991 return (sata_txlt_check_condition(spx, KEY_NOT_READY, 3992 SD_SCSI_ASC_LU_NOT_RESPONSE)); 3993 } 3994 } 3995 3996 power_state = scmd->satacmd_sec_count_lsb; 3997 3998 /* 3999 * return NOT READY when device in STOPPED mode 4000 */ 4001 if (power_state == SATA_PWRMODE_STANDBY && 4002 sdinfo->satadrv_power_level == SATA_POWER_STOPPED) { 4003 *scsipkt->pkt_scbp = STATUS_CHECK; 4004 sense = sata_arq_sense(spx); 4005 sense->es_key = KEY_NOT_READY; 4006 sense->es_add_code = SD_SCSI_ASC_LU_NOT_READY; 4007 } else { 4008 /* 4009 * For other power mode, return GOOD status 4010 */ 4011 *scsipkt->pkt_scbp = STATUS_GOOD; 4012 } 4013 4014 scsipkt->pkt_reason = CMD_CMPLT; 4015 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET | 4016 STATE_SENT_CMD | STATE_GOT_STATUS; 4017 4018 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); 4019 4020 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst, 4021 "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason); 4022 4023 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 && 4024 scsipkt->pkt_comp != NULL) { 4025 /* scsi callback required */ 4026 if (servicing_interrupt()) { 4027 if (taskq_dispatch(SATA_TXLT_TASKQ(spx), 4028 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp, 4029 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) == NULL) { 4030 return (TRAN_BUSY); 4031 } 4032 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx), 4033 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp, 4034 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) { 4035 /* Scheduling the callback failed */ 4036 return (TRAN_BUSY); 4037 } 4038 } 4039 4040 return (TRAN_ACCEPT); 4041 } 4042 4043 /* 4044 * SATA translate command: Start Stop Unit 4045 * Translation depends on a command: 4046 * 4047 * Power condition bits will be supported 4048 * and the power level should be maintained by SATL, 4049 * When SATL received a command, it will check the 4050 * power level firstly, and return the status according 4051 * to SAT2 v2.6 and SAT-2 Standby Modifications 4052 * 4053 * SPC-4/SBC-3 SATL ATA power condition SATL SPC/SBC 4054 * ----------------------------------------------------------------------- 4055 * SSU_PC1 Active <==> ATA Active <==> SSU:start_bit =1 4056 * SSU_PC2 Idle <==> ATA Idle <==> N/A 4057 * SSU_PC3 Standby <==> ATA Standby <==> N/A 4058 * SSU_PC4 Stopped <==> ATA Standby <==> SSU:start_bit = 0 4059 * 4060 * Unload Media / NOT SUPPORTED YET 4061 * Load Media / NOT SUPPROTED YET 4062 * Immediate bit / NOT SUPPORTED YET (deferred error) 4063 * 4064 * Returns TRAN_ACCEPT or code returned by sata_hba_start() and 4065 * appropriate values in scsi_pkt fields. 4066 */ 4067 static int 4068 sata_txlt_start_stop_unit(sata_pkt_txlate_t *spx) 4069 { 4070 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt; 4071 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd; 4072 sata_hba_inst_t *shi = SATA_TXLT_HBA_INST(spx); 4073 int cport = SATA_TXLT_CPORT(spx); 4074 int rval, reason; 4075 sata_drive_info_t *sdinfo; 4076 sata_id_t *sata_id; 4077 4078 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst, 4079 "sata_txlt_start_stop_unit: %d\n", scsipkt->pkt_scbp[4] & 1); 4080 4081 mutex_enter(&SATA_CPORT_MUTEX(shi, cport)); 4082 4083 if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 1)) != 4084 TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) { 4085 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); 4086 return (rval); 4087 } 4088 4089 if (scsipkt->pkt_cdbp[1] & START_STOP_IMMED_MASK) { 4090 /* IMMED bit - not supported */ 4091 mutex_exit(&SATA_CPORT_MUTEX(shi, cport)); 4092 return (sata_txlt_check_condition(spx, KEY_ILLEGAL_REQUEST, 4093 SD_SCSI_ASC_INVALID_FIELD_IN_CDB)); 4094 } 4095 4096 spx->txlt_sata_pkt->satapkt_op_mode |= SATA_OPMODE_SYNCH; 4097 spx->txlt_sata_pkt->satapkt_comp = NULL; 4098 4099 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst, 4100 &spx->txlt_sata_pkt->satapkt_device); 4101 ASSERT(sdinfo != NULL); 4102 sata_id = &sdinfo->satadrv_id; 4103 4104 switch ((scsipkt->pkt_cdbp[4] & START_STOP_POWER_COND_MASK) >> 4) { 4105 case 0: 4106 if (scsipkt->pkt_cdbp[4] & START_STOP_LOEJ_MASK) { 4107 /* Load/Unload Media - invalid request */ 4108 goto err_out; 4109 } 4110 if (scsipkt->pkt_cdbp[4] & START_STOP_START_MASK) { 4111 /* Start Unit */ 4112 sata_build_read_verify_cmd(scmd, 1, 5); 4113 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE; 4114 /* Transfer command to HBA */ 4115 if (sata_hba_start(spx, &rval) != 0) { 4116 /* Pkt not accepted for execution */ 4117 mutex_exit(&SATA_CPORT_MUTEX(shi, cport)); 4118 return (rval); 4119 } else { 4120 if (scmd->satacmd_error_reg != 0) { 4121 goto err_out; 4122 } 4123 } 4124 sdinfo->satadrv_power_level = SATA_POWER_ACTIVE; 4125 } else { 4126 /* Stop Unit */ 4127 sata_build_generic_cmd(scmd, SATAC_FLUSH_CACHE); 4128 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE; 4129 if (sata_hba_start(spx, &rval) != 0) { 4130 mutex_exit(&SATA_CPORT_MUTEX(shi, cport)); 4131 return (rval); 4132 } else { 4133 if (scmd->satacmd_error_reg != 0) { 4134 goto err_out; 4135 } 4136 } 4137 /* ata standby immediate command */ 4138 sata_build_generic_cmd(scmd, SATAC_STANDBY_IM); 4139 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE; 4140 if (sata_hba_start(spx, &rval) != 0) { 4141 mutex_exit(&SATA_CPORT_MUTEX(shi, cport)); 4142 return (rval); 4143 } else { 4144 if (scmd->satacmd_error_reg != 0) { 4145 goto err_out; 4146 } 4147 } 4148 sdinfo->satadrv_power_level = SATA_POWER_STOPPED; 4149 } 4150 break; 4151 case 0x1: 4152 sata_build_generic_cmd(scmd, SATAC_IDLE); 4153 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE; 4154 if (sata_hba_start(spx, &rval) != 0) { 4155 mutex_exit(&SATA_CPORT_MUTEX(shi, cport)); 4156 return (rval); 4157 } else { 4158 if (scmd->satacmd_error_reg != 0) { 4159 goto err_out; 4160 } 4161 } 4162 sata_build_read_verify_cmd(scmd, 1, 5); 4163 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE; 4164 /* Transfer command to HBA */ 4165 if (sata_hba_start(spx, &rval) != 0) { 4166 /* Pkt not accepted for execution */ 4167 mutex_exit(&SATA_CPORT_MUTEX(shi, cport)); 4168 return (rval); 4169 } else { 4170 if (scmd->satacmd_error_reg != 0) { 4171 goto err_out; 4172 } 4173 } 4174 sdinfo->satadrv_power_level = SATA_POWER_ACTIVE; 4175 break; 4176 case 0x2: 4177 sata_build_generic_cmd(scmd, SATAC_FLUSH_CACHE); 4178 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE; 4179 if (!(scsipkt->pkt_cdbp[4] & START_STOP_NOFLUSH_MASK)) { 4180 if (sata_hba_start(spx, &rval) != 0) { 4181 mutex_exit(&SATA_CPORT_MUTEX(shi, cport)); 4182 return (rval); 4183 } else { 4184 if (scmd->satacmd_error_reg != 0) { 4185 goto err_out; 4186 } 4187 } 4188 } 4189 sata_build_generic_cmd(scmd, SATAC_IDLE); 4190 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE; 4191 if (sata_hba_start(spx, &rval) != 0) { 4192 mutex_exit(&SATA_CPORT_MUTEX(shi, cport)); 4193 return (rval); 4194 } else { 4195 if (scmd->satacmd_error_reg != 0) { 4196 goto err_out; 4197 } 4198 } 4199 if ((scsipkt->pkt_cdbp[3] & START_STOP_MODIFIER_MASK)) { 4200 /* 4201 * POWER CONDITION MODIFIER bit set 4202 * to 0x1 or larger it will be handled 4203 * on the same way as bit = 0x1 4204 */ 4205 if (!(sata_id->ai_cmdset84 & 4206 SATA_IDLE_UNLOAD_SUPPORTED)) { 4207 sdinfo->satadrv_power_level = SATA_POWER_IDLE; 4208 break; 4209 } 4210 sata_build_generic_cmd(scmd, SATAC_IDLE_IM); 4211 scmd->satacmd_features_reg = 0x44; 4212 scmd->satacmd_lba_low_lsb = 0x4c; 4213 scmd->satacmd_lba_mid_lsb = 0x4e; 4214 scmd->satacmd_lba_high_lsb = 0x55; 4215 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE; 4216 if (sata_hba_start(spx, &rval) != 0) { 4217 mutex_exit(&SATA_CPORT_MUTEX(shi, cport)); 4218 return (rval); 4219 } else { 4220 if (scmd->satacmd_error_reg != 0) { 4221 goto err_out; 4222 } 4223 } 4224 } 4225 sdinfo->satadrv_power_level = SATA_POWER_IDLE; 4226 break; 4227 case 0x3: 4228 sata_build_generic_cmd(scmd, SATAC_FLUSH_CACHE); 4229 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE; 4230 if (!(scsipkt->pkt_cdbp[4] & START_STOP_NOFLUSH_MASK)) { 4231 if (sata_hba_start(spx, &rval) != 0) { 4232 mutex_exit(&SATA_CPORT_MUTEX(shi, cport)); 4233 return (rval); 4234 } else { 4235 if (scmd->satacmd_error_reg != 0) { 4236 goto err_out; 4237 } 4238 } 4239 } 4240 sata_build_generic_cmd(scmd, SATAC_STANDBY); 4241 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE; 4242 if (sata_hba_start(spx, &rval) != 0) { 4243 mutex_exit(&SATA_CPORT_MUTEX(shi, cport)); 4244 return (rval); 4245 } else { 4246 if (scmd->satacmd_error_reg != 0) { 4247 goto err_out; 4248 } 4249 } 4250 sdinfo->satadrv_power_level = SATA_POWER_STANDBY; 4251 break; 4252 case 0x7: 4253 sata_build_generic_cmd(scmd, SATAC_CHECK_POWER_MODE); 4254 scmd->satacmd_flags.sata_copy_out_sec_count_lsb = B_TRUE; 4255 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE; 4256 if (sata_hba_start(spx, &rval) != 0) { 4257 mutex_exit(&SATA_CPORT_MUTEX(shi, cport)); 4258 return (rval); 4259 } else { 4260 if (scmd->satacmd_error_reg != 0) { 4261 goto err_out; 4262 } 4263 } 4264 switch (scmd->satacmd_sec_count_lsb) { 4265 case SATA_PWRMODE_STANDBY: 4266 sata_build_generic_cmd(scmd, SATAC_STANDBY); 4267 scmd->satacmd_sec_count_msb = sata_get_standby_timer( 4268 sdinfo->satadrv_standby_timer); 4269 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE; 4270 if (sata_hba_start(spx, &rval) != 0) { 4271 mutex_exit(&SATA_CPORT_MUTEX(shi, cport)); 4272 return (rval); 4273 } else { 4274 if (scmd->satacmd_error_reg != 0) { 4275 goto err_out; 4276 } 4277 } 4278 break; 4279 case SATA_PWRMODE_IDLE: 4280 sata_build_generic_cmd(scmd, SATAC_IDLE); 4281 scmd->satacmd_sec_count_msb = sata_get_standby_timer( 4282 sdinfo->satadrv_standby_timer); 4283 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE; 4284 if (sata_hba_start(spx, &rval) != 0) { 4285 mutex_exit(&SATA_CPORT_MUTEX(shi, cport)); 4286 return (rval); 4287 } else { 4288 if (scmd->satacmd_error_reg != 0) { 4289 goto err_out; 4290 } 4291 } 4292 break; 4293 case SATA_PWRMODE_ACTIVE_SPINDOWN: 4294 case SATA_PWRMODE_ACTIVE_SPINUP: 4295 case SATA_PWRMODE_ACTIVE: 4296 sata_build_generic_cmd(scmd, SATAC_IDLE); 4297 scmd->satacmd_sec_count_msb = sata_get_standby_timer( 4298 sdinfo->satadrv_standby_timer); 4299 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE; 4300 if (sata_hba_start(spx, &rval) != 0) { 4301 mutex_exit(&SATA_CPORT_MUTEX(shi, cport)); 4302 return (rval); 4303 } else { 4304 if (scmd->satacmd_error_reg != 0) { 4305 goto err_out; 4306 } 4307 } 4308 sata_build_read_verify_cmd(scmd, 1, 5); 4309 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE; 4310 if (sata_hba_start(spx, &rval) != 0) { 4311 mutex_exit(&SATA_CPORT_MUTEX(shi, cport)); 4312 return (rval); 4313 } else { 4314 if (scmd->satacmd_error_reg != 0) { 4315 goto err_out; 4316 } 4317 } 4318 break; 4319 default: 4320 goto err_out; 4321 } 4322 break; 4323 case 0xb: 4324 if ((sata_get_standby_timer(sdinfo->satadrv_standby_timer) == 4325 0) || (!(sata_id->ai_cap & SATA_STANDBYTIMER))) { 4326 mutex_exit(&SATA_CPORT_MUTEX(shi, cport)); 4327 return (sata_txlt_check_condition(spx, 4328 KEY_ILLEGAL_REQUEST, 4329 SD_SCSI_ASC_INVALID_FIELD_IN_CDB)); 4330 } 4331 sata_build_generic_cmd(scmd, SATAC_FLUSH_CACHE); 4332 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE; 4333 if (!(scsipkt->pkt_cdbp[4] & START_STOP_NOFLUSH_MASK)) { 4334 if (sata_hba_start(spx, &rval) != 0) { 4335 mutex_exit(&SATA_CPORT_MUTEX(shi, cport)); 4336 return (rval); 4337 } else { 4338 if (scmd->satacmd_error_reg != 0) { 4339 goto err_out; 4340 } 4341 } 4342 sata_build_generic_cmd(scmd, SATAC_STANDBY_IM); 4343 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE; 4344 if (sata_hba_start(spx, &rval) != 0) { 4345 mutex_exit(&SATA_CPORT_MUTEX(shi, cport)); 4346 return (rval); 4347 } else { 4348 if (scmd->satacmd_error_reg != 0) { 4349 goto err_out; 4350 } 4351 } 4352 } 4353 bzero(sdinfo->satadrv_standby_timer, sizeof (uchar_t) * 4); 4354 break; 4355 default: 4356 err_out: 4357 mutex_exit(&SATA_CPORT_MUTEX(shi, cport)); 4358 return (sata_txlt_check_condition(spx, KEY_ILLEGAL_REQUEST, 4359 SD_SCSI_ASC_INVALID_FIELD_IN_CDB)); 4360 } 4361 4362 /* 4363 * Since it was a synchronous command, 4364 * a callback function will be called directly. 4365 */ 4366 mutex_exit(&SATA_CPORT_MUTEX(shi, cport)); 4367 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst, 4368 "synchronous execution status %x\n", 4369 spx->txlt_sata_pkt->satapkt_reason); 4370 4371 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 && 4372 scsipkt->pkt_comp != NULL) { 4373 sata_set_arq_data(spx->txlt_sata_pkt); 4374 if (servicing_interrupt()) { 4375 if (taskq_dispatch(SATA_TXLT_TASKQ(spx), 4376 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp, 4377 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) == NULL) { 4378 return (TRAN_BUSY); 4379 } 4380 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx), 4381 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp, 4382 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) { 4383 /* Scheduling the callback failed */ 4384 return (TRAN_BUSY); 4385 } 4386 } 4387 else 4388 4389 sata_txlt_nodata_cmd_completion(spx->txlt_sata_pkt); 4390 4391 return (TRAN_ACCEPT); 4392 4393 } 4394 4395 /* 4396 * SATA translate command: Read Capacity. 4397 * Emulated command for SATA disks. 4398 * Capacity is retrieved from cached Idenifty Device data. 4399 * Identify Device data shows effective disk capacity, not the native 4400 * capacity, which may be limitted by Set Max Address command. 4401 * This is ATA version for SATA hard disks. 4402 * 4403 * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields. 4404 */ 4405 static int 4406 sata_txlt_read_capacity(sata_pkt_txlate_t *spx) 4407 { 4408 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt; 4409 struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp; 4410 sata_drive_info_t *sdinfo; 4411 uint64_t val; 4412 uchar_t *rbuf; 4413 int rval, reason; 4414 4415 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst, 4416 "sata_txlt_read_capacity: ", NULL); 4417 4418 mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx))); 4419 4420 if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 0)) != 4421 TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) { 4422 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); 4423 return (rval); 4424 } 4425 4426 scsipkt->pkt_reason = CMD_CMPLT; 4427 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET | 4428 STATE_SENT_CMD | STATE_GOT_STATUS; 4429 *scsipkt->pkt_scbp = STATUS_GOOD; 4430 if (bp != NULL && bp->b_un.b_addr && bp->b_bcount) { 4431 /* 4432 * Because it is fully emulated command storing data 4433 * programatically in the specified buffer, release 4434 * preallocated DMA resources before storing data in the buffer, 4435 * so no unwanted DMA sync would take place. 4436 */ 4437 sata_scsi_dmafree(NULL, scsipkt); 4438 4439 sdinfo = sata_get_device_info( 4440 spx->txlt_sata_hba_inst, 4441 &spx->txlt_sata_pkt->satapkt_device); 4442 4443 /* 4444 * As per SBC-3, the "returned LBA" is either the highest 4445 * addressable LBA or 0xffffffff, whichever is smaller. 4446 */ 4447 val = MIN(sdinfo->satadrv_capacity - 1, UINT32_MAX); 4448 4449 rbuf = (uchar_t *)bp->b_un.b_addr; 4450 /* Need to swap endians to match scsi format */ 4451 rbuf[0] = (val >> 24) & 0xff; 4452 rbuf[1] = (val >> 16) & 0xff; 4453 rbuf[2] = (val >> 8) & 0xff; 4454 rbuf[3] = val & 0xff; 4455 /* block size - always 512 bytes, for now */ 4456 rbuf[4] = 0; 4457 rbuf[5] = 0; 4458 rbuf[6] = 0x02; 4459 rbuf[7] = 0; 4460 scsipkt->pkt_state |= STATE_XFERRED_DATA; 4461 scsipkt->pkt_resid = 0; 4462 4463 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst, "%d\n", 4464 sdinfo->satadrv_capacity -1); 4465 } 4466 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); 4467 /* 4468 * If a callback was requested, do it now. 4469 */ 4470 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst, 4471 "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason); 4472 4473 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 && 4474 scsipkt->pkt_comp != NULL) { 4475 /* scsi callback required */ 4476 if (servicing_interrupt()) { 4477 if (taskq_dispatch(SATA_TXLT_TASKQ(spx), 4478 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp, 4479 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) == NULL) { 4480 return (TRAN_BUSY); 4481 } 4482 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx), 4483 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp, 4484 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) { 4485 /* Scheduling the callback failed */ 4486 return (TRAN_BUSY); 4487 } 4488 } 4489 4490 return (TRAN_ACCEPT); 4491 } 4492 4493 /* 4494 * SATA translate command: Read Capacity (16). 4495 * Emulated command for SATA disks. 4496 * Info is retrieved from cached Identify Device data. 4497 * Implemented to SBC-3 (draft 21) and SAT-2 (final) specifications. 4498 * 4499 * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields. 4500 */ 4501 static int 4502 sata_txlt_read_capacity16(sata_pkt_txlate_t *spx) 4503 { 4504 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt; 4505 struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp; 4506 sata_drive_info_t *sdinfo; 4507 uint64_t val; 4508 uint16_t l2p_exp; 4509 uchar_t *rbuf; 4510 int rval, reason; 4511 #define TPE 0x80 4512 #define TPRZ 0x40 4513 4514 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst, 4515 "sata_txlt_read_capacity: ", NULL); 4516 4517 mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx))); 4518 4519 if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 0)) != 4520 TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) { 4521 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); 4522 return (rval); 4523 } 4524 4525 scsipkt->pkt_reason = CMD_CMPLT; 4526 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET | 4527 STATE_SENT_CMD | STATE_GOT_STATUS; 4528 if (bp != NULL && bp->b_un.b_addr && bp->b_bcount) { 4529 /* 4530 * Because it is fully emulated command storing data 4531 * programatically in the specified buffer, release 4532 * preallocated DMA resources before storing data in the buffer, 4533 * so no unwanted DMA sync would take place. 4534 */ 4535 sata_scsi_dmafree(NULL, scsipkt); 4536 4537 /* Check SERVICE ACTION field */ 4538 if ((scsipkt->pkt_cdbp[1] & 0x1f) != 4539 SSVC_ACTION_READ_CAPACITY_G4) { 4540 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); 4541 return (sata_txlt_check_condition(spx, 4542 KEY_ILLEGAL_REQUEST, 4543 SD_SCSI_ASC_INVALID_FIELD_IN_CDB)); 4544 } 4545 4546 /* Check LBA field */ 4547 if ((scsipkt->pkt_cdbp[2] != 0) || 4548 (scsipkt->pkt_cdbp[3] != 0) || 4549 (scsipkt->pkt_cdbp[4] != 0) || 4550 (scsipkt->pkt_cdbp[5] != 0) || 4551 (scsipkt->pkt_cdbp[6] != 0) || 4552 (scsipkt->pkt_cdbp[7] != 0) || 4553 (scsipkt->pkt_cdbp[8] != 0) || 4554 (scsipkt->pkt_cdbp[9] != 0)) { 4555 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); 4556 return (sata_txlt_check_condition(spx, 4557 KEY_ILLEGAL_REQUEST, 4558 SD_SCSI_ASC_INVALID_FIELD_IN_CDB)); 4559 } 4560 4561 /* Check PMI bit */ 4562 if (scsipkt->pkt_cdbp[14] & 0x1) { 4563 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); 4564 return (sata_txlt_check_condition(spx, 4565 KEY_ILLEGAL_REQUEST, 4566 SD_SCSI_ASC_INVALID_FIELD_IN_CDB)); 4567 } 4568 4569 *scsipkt->pkt_scbp = STATUS_GOOD; 4570 4571 sdinfo = sata_get_device_info( 4572 spx->txlt_sata_hba_inst, 4573 &spx->txlt_sata_pkt->satapkt_device); 4574 4575 /* last logical block address */ 4576 val = MIN(sdinfo->satadrv_capacity - 1, 4577 SCSI_READ_CAPACITY16_MAX_LBA); 4578 4579 /* logical to physical block size exponent */ 4580 l2p_exp = 0; 4581 if (sdinfo->satadrv_id.ai_phys_sect_sz & SATA_L2PS_CHECK_BIT) { 4582 /* physical/logical sector size word is valid */ 4583 4584 if (sdinfo->satadrv_id.ai_phys_sect_sz & 4585 SATA_L2PS_HAS_MULT) { 4586 /* multiple logical sectors per phys sectors */ 4587 l2p_exp = 4588 sdinfo->satadrv_id.ai_phys_sect_sz & 4589 SATA_L2PS_EXP_MASK; 4590 } 4591 } 4592 4593 rbuf = (uchar_t *)bp->b_un.b_addr; 4594 bzero(rbuf, bp->b_bcount); 4595 4596 /* returned logical block address */ 4597 rbuf[0] = (val >> 56) & 0xff; 4598 rbuf[1] = (val >> 48) & 0xff; 4599 rbuf[2] = (val >> 40) & 0xff; 4600 rbuf[3] = (val >> 32) & 0xff; 4601 rbuf[4] = (val >> 24) & 0xff; 4602 rbuf[5] = (val >> 16) & 0xff; 4603 rbuf[6] = (val >> 8) & 0xff; 4604 rbuf[7] = val & 0xff; 4605 4606 /* logical block length in bytes = 512 (for now) */ 4607 /* rbuf[8] = 0; */ 4608 /* rbuf[9] = 0; */ 4609 rbuf[10] = 0x02; 4610 /* rbuf[11] = 0; */ 4611 4612 /* p_type, prot_en, unspecified by SAT-2 */ 4613 /* rbuf[12] = 0; */ 4614 4615 /* p_i_exponent, undefined by SAT-2 */ 4616 /* logical blocks per physical block exponent */ 4617 rbuf[13] = l2p_exp; 4618 4619 /* lowest aligned logical block address = 0 (for now) */ 4620 /* tpe and tprz as defined in T10/10-079 r0 */ 4621 if (sdinfo->satadrv_id.ai_addsupported & 4622 SATA_DETERMINISTIC_READ) { 4623 if (sdinfo->satadrv_id.ai_addsupported & 4624 SATA_READ_ZERO) { 4625 rbuf[14] |= TPRZ; 4626 } else { 4627 rbuf[14] |= TPE; 4628 } 4629 } 4630 /* rbuf[15] = 0; */ 4631 4632 scsipkt->pkt_state |= STATE_XFERRED_DATA; 4633 scsipkt->pkt_resid = 0; 4634 4635 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst, "%llu\n", 4636 sdinfo->satadrv_capacity -1); 4637 } 4638 4639 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); 4640 4641 /* 4642 * If a callback was requested, do it now. 4643 */ 4644 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst, 4645 "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason); 4646 4647 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 && 4648 scsipkt->pkt_comp != NULL) { 4649 /* scsi callback required */ 4650 if (servicing_interrupt()) { 4651 if (taskq_dispatch(SATA_TXLT_TASKQ(spx), 4652 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp, 4653 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) == NULL) { 4654 return (TRAN_BUSY); 4655 } 4656 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx), 4657 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp, 4658 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) { 4659 /* Scheduling the callback failed */ 4660 return (TRAN_BUSY); 4661 } 4662 } 4663 4664 return (TRAN_ACCEPT); 4665 } 4666 4667 /* 4668 * Translate command: UNMAP 4669 * 4670 * The function cannot be called in interrupt context since it may sleep. 4671 */ 4672 static int 4673 sata_txlt_unmap(sata_pkt_txlate_t *spx) 4674 { 4675 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt; 4676 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd; 4677 struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp; 4678 uint16_t count = 0; 4679 int synch; 4680 int rval, reason; 4681 int i, x; 4682 int bdlen = 0; 4683 int ranges = 0; 4684 int paramlen = 8; 4685 uint8_t *data, *tmpbd; 4686 sata_drive_info_t *sdinfo; 4687 #define TRIM 0x1 4688 4689 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst, 4690 "sata_txlt_unmap: ", NULL); 4691 4692 mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx))); 4693 4694 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst, 4695 &spx->txlt_sata_pkt->satapkt_device); 4696 if (sdinfo != NULL) { 4697 SATADBG2(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst, 4698 "DSM support 0x%x, max number of 512 byte blocks of LBA " 4699 "range entries 0x%x\n", sdinfo->satadrv_id.ai_dsm, 4700 sdinfo->satadrv_id.ai_maxcount); 4701 } 4702 4703 rval = sata_txlt_generic_pkt_info(spx, &reason, 1); 4704 if ((rval != TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) { 4705 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); 4706 return (rval); 4707 } 4708 4709 /* 4710 * Need to modify bp to have TRIM data instead of UNMAP data. 4711 * Start by getting the block descriptor data length by subtracting 4712 * the 8 byte parameter list header from the parameter list length. 4713 * The block descriptor size has to be a multiple of 16 bytes. 4714 */ 4715 bdlen = scsipkt->pkt_cdbp[7]; 4716 bdlen = (bdlen << 8) + scsipkt->pkt_cdbp[8] - paramlen; 4717 if ((bdlen < 0) || ((bdlen % 16) != 0) || 4718 (bdlen > (bp->b_bcount - paramlen))) { 4719 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst, 4720 "sata_txlt_unmap: invalid block descriptor length", NULL); 4721 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); 4722 return ((sata_txlt_check_condition(spx, KEY_ILLEGAL_REQUEST, 4723 SD_SCSI_ASC_INVALID_FIELD_IN_CDB))); 4724 } 4725 /* 4726 * If there are no parameter data or block descriptors, it is not 4727 * considered an error so just complete the command without sending 4728 * TRIM. 4729 */ 4730 if ((bdlen == 0) || (bp == NULL) || (bp->b_un.b_addr == NULL) || 4731 (bp->b_bcount == 0)) { 4732 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst, 4733 "sata_txlt_unmap: no parameter data or block descriptors", 4734 NULL); 4735 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); 4736 return (sata_txlt_unmap_nodata_cmd(spx)); 4737 } 4738 tmpbd = (uint8_t *)bp->b_un.b_addr + paramlen; 4739 data = kmem_zalloc(bdlen, KM_SLEEP); 4740 4741 /* 4742 * Loop through all the UNMAP block descriptors and convert the data 4743 * into TRIM format. 4744 */ 4745 for (i = 0, x = 0; i < bdlen; i += 16, x += 8) { 4746 /* get range length */ 4747 data[x] = tmpbd[i+7]; 4748 data[x+1] = tmpbd[i+6]; 4749 /* get LBA */ 4750 data[x+2] = tmpbd[i+5]; 4751 data[x+3] = tmpbd[i+4]; 4752 data[x+4] = tmpbd[i+3]; 4753 data[x+5] = tmpbd[i+2]; 4754 data[x+6] = tmpbd[i+11]; 4755 data[x+7] = tmpbd[i+10]; 4756 4757 ranges++; 4758 } 4759 4760 /* 4761 * The TRIM command expects the data buffer to be a multiple of 4762 * 512-byte blocks of range entries. This means that the UNMAP buffer 4763 * may be too small. Free the original DMA resources and create a 4764 * local buffer. 4765 */ 4766 sata_common_free_dma_rsrcs(spx); 4767 4768 /* 4769 * Get count of 512-byte blocks of range entries. The length 4770 * of a range entry is 8 bytes which means one count has 64 range 4771 * entries. 4772 */ 4773 count = (ranges + 63)/64; 4774 4775 /* Allocate a buffer that is a multiple of 512 bytes. */ 4776 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); 4777 bp = sata_alloc_local_buffer(spx, count * 512); 4778 if (bp == NULL) { 4779 SATADBG1(SATA_DBG_ATAPI, spx->txlt_sata_hba_inst, 4780 "sata_txlt_unmap: " 4781 "cannot allocate buffer for TRIM command", NULL); 4782 kmem_free(data, bdlen); 4783 return (TRAN_BUSY); 4784 } 4785 bp_mapin(bp); /* make data buffer accessible */ 4786 mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx))); 4787 4788 bzero(bp->b_un.b_addr, bp->b_bcount); 4789 bcopy(data, bp->b_un.b_addr, x); 4790 kmem_free(data, bdlen); 4791 rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0, 4792 DDI_DMA_SYNC_FORDEV); 4793 ASSERT(rval == DDI_SUCCESS); 4794 4795 scmd->satacmd_flags.sata_data_direction = SATA_DIR_WRITE; 4796 scmd->satacmd_addr_type = ATA_ADDR_LBA48; 4797 scmd->satacmd_cmd_reg = SATAC_DSM; 4798 scmd->satacmd_sec_count_msb = (count >> 8) & 0xff; 4799 scmd->satacmd_sec_count_lsb = count & 0xff; 4800 scmd->satacmd_features_reg = TRIM; 4801 scmd->satacmd_device_reg = SATA_ADH_LBA; 4802 scmd->satacmd_status_reg = 0; 4803 scmd->satacmd_error_reg = 0; 4804 4805 /* Start processing command */ 4806 if (!(spx->txlt_sata_pkt->satapkt_op_mode & SATA_OPMODE_SYNCH)) { 4807 spx->txlt_sata_pkt->satapkt_comp = 4808 sata_txlt_unmap_completion; 4809 synch = FALSE; 4810 } else { 4811 synch = TRUE; 4812 } 4813 4814 if (sata_hba_start(spx, &rval) != 0) { 4815 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); 4816 return (rval); 4817 } 4818 4819 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); 4820 4821 if (synch) { 4822 sata_txlt_unmap_completion(spx->txlt_sata_pkt); 4823 } 4824 4825 return (TRAN_ACCEPT); 4826 } 4827 4828 /* 4829 * SATA translate command: Mode Sense. 4830 * Translated into appropriate SATA command or emulated. 4831 * Saved Values Page Control (03) are not supported. 4832 * 4833 * NOTE: only caching mode sense page is currently implemented. 4834 * 4835 * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields. 4836 */ 4837 4838 #define LLBAA 0x10 /* Long LBA Accepted */ 4839 4840 static int 4841 sata_txlt_mode_sense(sata_pkt_txlate_t *spx) 4842 { 4843 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt; 4844 struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp; 4845 sata_drive_info_t *sdinfo; 4846 sata_id_t *sata_id; 4847 struct scsi_extended_sense *sense; 4848 int len, bdlen, count, alc_len; 4849 int pc; /* Page Control code */ 4850 uint8_t *buf; /* mode sense buffer */ 4851 int rval, reason; 4852 4853 SATADBG2(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst, 4854 "sata_txlt_mode_sense, pc %x page code 0x%02x\n", 4855 spx->txlt_scsi_pkt->pkt_cdbp[2] >> 6, 4856 spx->txlt_scsi_pkt->pkt_cdbp[2] & 0x3f); 4857 4858 if (servicing_interrupt()) { 4859 buf = kmem_zalloc(1024, KM_NOSLEEP); 4860 if (buf == NULL) { 4861 return (TRAN_BUSY); 4862 } 4863 } else { 4864 buf = kmem_zalloc(1024, KM_SLEEP); 4865 } 4866 4867 mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx))); 4868 4869 if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 0)) != 4870 TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) { 4871 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); 4872 kmem_free(buf, 1024); 4873 return (rval); 4874 } 4875 4876 scsipkt->pkt_reason = CMD_CMPLT; 4877 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET | 4878 STATE_SENT_CMD | STATE_GOT_STATUS; 4879 4880 pc = scsipkt->pkt_cdbp[2] >> 6; 4881 4882 if (bp != NULL && bp->b_un.b_addr && bp->b_bcount) { 4883 /* 4884 * Because it is fully emulated command storing data 4885 * programatically in the specified buffer, release 4886 * preallocated DMA resources before storing data in the buffer, 4887 * so no unwanted DMA sync would take place. 4888 */ 4889 sata_scsi_dmafree(NULL, scsipkt); 4890 4891 len = 0; 4892 bdlen = 0; 4893 if (!(scsipkt->pkt_cdbp[1] & 8)) { 4894 if (scsipkt->pkt_cdbp[0] == SCMD_MODE_SENSE_G1 && 4895 (scsipkt->pkt_cdbp[1] & LLBAA)) 4896 bdlen = 16; 4897 else 4898 bdlen = 8; 4899 } 4900 /* Build mode parameter header */ 4901 if (spx->txlt_scsi_pkt->pkt_cdbp[0] == SCMD_MODE_SENSE) { 4902 /* 4-byte mode parameter header */ 4903 buf[len++] = 0; /* mode data length */ 4904 buf[len++] = 0; /* medium type */ 4905 buf[len++] = 0; /* dev-specific param */ 4906 buf[len++] = bdlen; /* Block Descriptor length */ 4907 } else { 4908 /* 8-byte mode parameter header */ 4909 buf[len++] = 0; /* mode data length */ 4910 buf[len++] = 0; 4911 buf[len++] = 0; /* medium type */ 4912 buf[len++] = 0; /* dev-specific param */ 4913 if (bdlen == 16) 4914 buf[len++] = 1; /* long lba descriptor */ 4915 else 4916 buf[len++] = 0; 4917 buf[len++] = 0; 4918 buf[len++] = 0; /* Block Descriptor length */ 4919 buf[len++] = bdlen; 4920 } 4921 4922 sdinfo = sata_get_device_info( 4923 spx->txlt_sata_hba_inst, 4924 &spx->txlt_sata_pkt->satapkt_device); 4925 4926 /* Build block descriptor only if not disabled (DBD) */ 4927 if ((scsipkt->pkt_cdbp[1] & 0x08) == 0) { 4928 /* Block descriptor - direct-access device format */ 4929 if (bdlen == 8) { 4930 /* build regular block descriptor */ 4931 buf[len++] = 4932 (sdinfo->satadrv_capacity >> 24) & 0xff; 4933 buf[len++] = 4934 (sdinfo->satadrv_capacity >> 16) & 0xff; 4935 buf[len++] = 4936 (sdinfo->satadrv_capacity >> 8) & 0xff; 4937 buf[len++] = sdinfo->satadrv_capacity & 0xff; 4938 buf[len++] = 0; /* density code */ 4939 buf[len++] = 0; 4940 if (sdinfo->satadrv_type == 4941 SATA_DTYPE_ATADISK) 4942 buf[len++] = 2; 4943 else 4944 /* ATAPI */ 4945 buf[len++] = 8; 4946 buf[len++] = 0; 4947 } else if (bdlen == 16) { 4948 /* Long LBA Accepted */ 4949 /* build long lba block descriptor */ 4950 #ifndef __lock_lint 4951 buf[len++] = 4952 (sdinfo->satadrv_capacity >> 56) & 0xff; 4953 buf[len++] = 4954 (sdinfo->satadrv_capacity >> 48) & 0xff; 4955 buf[len++] = 4956 (sdinfo->satadrv_capacity >> 40) & 0xff; 4957 buf[len++] = 4958 (sdinfo->satadrv_capacity >> 32) & 0xff; 4959 #endif 4960 buf[len++] = 4961 (sdinfo->satadrv_capacity >> 24) & 0xff; 4962 buf[len++] = 4963 (sdinfo->satadrv_capacity >> 16) & 0xff; 4964 buf[len++] = 4965 (sdinfo->satadrv_capacity >> 8) & 0xff; 4966 buf[len++] = sdinfo->satadrv_capacity & 0xff; 4967 buf[len++] = 0; 4968 buf[len++] = 0; /* density code */ 4969 buf[len++] = 0; 4970 buf[len++] = 0; 4971 if (sdinfo->satadrv_type == 4972 SATA_DTYPE_ATADISK) 4973 buf[len++] = 2; 4974 else 4975 /* ATAPI */ 4976 buf[len++] = 8; 4977 buf[len++] = 0; 4978 } 4979 } 4980 4981 sata_id = &sdinfo->satadrv_id; 4982 4983 /* 4984 * Add requested pages. 4985 * Page 3 and 4 are obsolete and we are not supporting them. 4986 * We deal now with: 4987 * caching (read/write cache control). 4988 * We should eventually deal with following mode pages: 4989 * error recovery (0x01), 4990 * power condition (0x1a), 4991 * exception control page (enables SMART) (0x1c), 4992 * enclosure management (ses), 4993 * protocol-specific port mode (port control). 4994 */ 4995 switch (scsipkt->pkt_cdbp[2] & 0x3f) { 4996 case MODEPAGE_RW_ERRRECOV: 4997 /* DAD_MODE_ERR_RECOV */ 4998 /* R/W recovery */ 4999 len += sata_build_msense_page_1(sdinfo, pc, buf+len); 5000 break; 5001 case MODEPAGE_CACHING: 5002 /* DAD_MODE_CACHE */ 5003 /* Reject not supported request for saved parameters */ 5004 if (pc == 3) { 5005 *scsipkt->pkt_scbp = STATUS_CHECK; 5006 sense = sata_arq_sense(spx); 5007 sense->es_key = KEY_ILLEGAL_REQUEST; 5008 sense->es_add_code = 5009 SD_SCSI_ASC_SAVING_PARAMS_NOT_SUPPORTED; 5010 goto done; 5011 } 5012 5013 /* caching */ 5014 len += sata_build_msense_page_8(sdinfo, pc, buf+len); 5015 break; 5016 case MODEPAGE_INFO_EXCPT: 5017 /* exception cntrl */ 5018 if (sata_id->ai_cmdset82 & SATA_SMART_SUPPORTED) { 5019 len += sata_build_msense_page_1c(sdinfo, pc, 5020 buf+len); 5021 } 5022 else 5023 goto err; 5024 break; 5025 case MODEPAGE_POWER_COND: 5026 /* DAD_MODE_POWER_COND */ 5027 /* power condition */ 5028 len += sata_build_msense_page_1a(sdinfo, pc, buf+len); 5029 break; 5030 5031 case MODEPAGE_ACOUSTIC_MANAG: 5032 /* acoustic management */ 5033 len += sata_build_msense_page_30(sdinfo, pc, buf+len); 5034 break; 5035 case MODEPAGE_ALLPAGES: 5036 /* all pages */ 5037 len += sata_build_msense_page_1(sdinfo, pc, buf+len); 5038 len += sata_build_msense_page_8(sdinfo, pc, buf+len); 5039 len += sata_build_msense_page_1a(sdinfo, pc, buf+len); 5040 if (sata_id->ai_cmdset82 & SATA_SMART_SUPPORTED) { 5041 len += sata_build_msense_page_1c(sdinfo, pc, 5042 buf+len); 5043 } 5044 len += sata_build_msense_page_30(sdinfo, pc, buf+len); 5045 break; 5046 default: 5047 err: 5048 /* Invalid request */ 5049 *scsipkt->pkt_scbp = STATUS_CHECK; 5050 sense = sata_arq_sense(spx); 5051 sense->es_key = KEY_ILLEGAL_REQUEST; 5052 sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB; 5053 goto done; 5054 } 5055 5056 /* fix total mode data length */ 5057 if (spx->txlt_scsi_pkt->pkt_cdbp[0] == SCMD_MODE_SENSE) { 5058 /* 4-byte mode parameter header */ 5059 buf[0] = len - 1; /* mode data length */ 5060 } else { 5061 buf[0] = (len -2) >> 8; 5062 buf[1] = (len -2) & 0xff; 5063 } 5064 5065 5066 /* Check allocation length */ 5067 if (scsipkt->pkt_cdbp[0] == SCMD_MODE_SENSE) { 5068 alc_len = scsipkt->pkt_cdbp[4]; 5069 } else { 5070 alc_len = scsipkt->pkt_cdbp[7]; 5071 alc_len = (len << 8) | scsipkt->pkt_cdbp[8]; 5072 } 5073 /* 5074 * We do not check for possible parameters truncation 5075 * (alc_len < len) assuming that the target driver works 5076 * correctly. Just avoiding overrun. 5077 * Copy no more than requested and possible, buffer-wise. 5078 */ 5079 count = MIN(alc_len, len); 5080 count = MIN(bp->b_bcount, count); 5081 bcopy(buf, bp->b_un.b_addr, count); 5082 5083 scsipkt->pkt_state |= STATE_XFERRED_DATA; 5084 scsipkt->pkt_resid = alc_len > count ? alc_len - count : 0; 5085 } 5086 *scsipkt->pkt_scbp = STATUS_GOOD; 5087 done: 5088 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); 5089 (void) kmem_free(buf, 1024); 5090 5091 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst, 5092 "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason); 5093 5094 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 && 5095 scsipkt->pkt_comp != NULL) { 5096 /* scsi callback required */ 5097 if (servicing_interrupt()) { 5098 if (taskq_dispatch(SATA_TXLT_TASKQ(spx), 5099 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp, 5100 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) == NULL) { 5101 return (TRAN_BUSY); 5102 } 5103 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx), 5104 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp, 5105 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) { 5106 /* Scheduling the callback failed */ 5107 return (TRAN_BUSY); 5108 } 5109 } 5110 5111 return (TRAN_ACCEPT); 5112 } 5113 5114 5115 /* 5116 * SATA translate command: Mode Select. 5117 * Translated into appropriate SATA command or emulated. 5118 * Saving parameters is not supported. 5119 * Changing device capacity is not supported (although theoretically 5120 * possible by executing SET FEATURES/SET MAX ADDRESS) 5121 * 5122 * Assumption is that the target driver is working correctly. 5123 * 5124 * More than one SATA command may be executed to perform operations specified 5125 * by mode select pages. The first error terminates further execution. 5126 * Operations performed successully are not backed-up in such case. 5127 * 5128 * NOTE: Implemented pages: 5129 * - caching page 5130 * - informational exception page 5131 * - acoustic management page 5132 * - power condition page 5133 * Caching setup is remembered so it could be re-stored in case of 5134 * an unexpected device reset. 5135 * 5136 * Returns TRAN_XXXX. 5137 * If TRAN_ACCEPT is returned, appropriate values are set in scsi_pkt fields. 5138 */ 5139 5140 static int 5141 sata_txlt_mode_select(sata_pkt_txlate_t *spx) 5142 { 5143 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt; 5144 struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp; 5145 struct scsi_extended_sense *sense; 5146 int len, pagelen, count, pllen; 5147 uint8_t *buf; /* mode select buffer */ 5148 int rval, stat, reason; 5149 uint_t nointr_flag; 5150 int dmod = 0; 5151 5152 SATADBG2(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst, 5153 "sata_txlt_mode_select, pc %x page code 0x%02x\n", 5154 spx->txlt_scsi_pkt->pkt_cdbp[2] >> 6, 5155 spx->txlt_scsi_pkt->pkt_cdbp[2] & 0x3f); 5156 5157 mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx))); 5158 5159 if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 1)) != 5160 TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) { 5161 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); 5162 return (rval); 5163 } 5164 5165 rval = TRAN_ACCEPT; 5166 5167 scsipkt->pkt_reason = CMD_CMPLT; 5168 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET | 5169 STATE_SENT_CMD | STATE_GOT_STATUS; 5170 nointr_flag = scsipkt->pkt_flags & FLAG_NOINTR; 5171 5172 /* Reject not supported request */ 5173 if (! (scsipkt->pkt_cdbp[1] & 0x10)) { /* No support for PF bit = 0 */ 5174 *scsipkt->pkt_scbp = STATUS_CHECK; 5175 sense = sata_arq_sense(spx); 5176 sense->es_key = KEY_ILLEGAL_REQUEST; 5177 sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB; 5178 goto done; 5179 } 5180 5181 if (scsipkt->pkt_cdbp[0] == SCMD_MODE_SELECT) { 5182 pllen = scsipkt->pkt_cdbp[4]; 5183 } else { 5184 pllen = scsipkt->pkt_cdbp[7]; 5185 pllen = (pllen << 8) | scsipkt->pkt_cdbp[7]; 5186 } 5187 5188 *scsipkt->pkt_scbp = STATUS_GOOD; /* Presumed outcome */ 5189 5190 if (bp != NULL && bp->b_un.b_addr && bp->b_bcount && pllen != 0) { 5191 buf = (uint8_t *)bp->b_un.b_addr; 5192 count = MIN(bp->b_bcount, pllen); 5193 scsipkt->pkt_state |= STATE_XFERRED_DATA; 5194 scsipkt->pkt_resid = 0; 5195 pllen = count; 5196 5197 /* 5198 * Check the header to skip the block descriptor(s) - we 5199 * do not support setting device capacity. 5200 * Existing macros do not recognize long LBA dscriptor, 5201 * hence manual calculation. 5202 */ 5203 if (scsipkt->pkt_cdbp[0] == SCMD_MODE_SELECT) { 5204 /* 6-bytes CMD, 4 bytes header */ 5205 if (count <= 4) 5206 goto done; /* header only */ 5207 len = buf[3] + 4; 5208 } else { 5209 /* 10-bytes CMD, 8 bytes header */ 5210 if (count <= 8) 5211 goto done; /* header only */ 5212 len = buf[6]; 5213 len = (len << 8) + buf[7] + 8; 5214 } 5215 if (len >= count) 5216 goto done; /* header + descriptor(s) only */ 5217 5218 pllen -= len; /* remaining data length */ 5219 5220 /* 5221 * We may be executing SATA command and want to execute it 5222 * in SYNCH mode, regardless of scsi_pkt setting. 5223 * Save scsi_pkt setting and indicate SYNCH mode 5224 */ 5225 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 && 5226 scsipkt->pkt_comp != NULL) { 5227 scsipkt->pkt_flags |= FLAG_NOINTR; 5228 } 5229 spx->txlt_sata_pkt->satapkt_op_mode = SATA_OPMODE_SYNCH; 5230 5231 /* 5232 * len is now the offset to a first mode select page 5233 * Process all pages 5234 */ 5235 while (pllen > 0) { 5236 switch ((int)buf[len]) { 5237 case MODEPAGE_CACHING: 5238 /* No support for SP (saving) */ 5239 if (scsipkt->pkt_cdbp[1] & 0x01) { 5240 *scsipkt->pkt_scbp = STATUS_CHECK; 5241 sense = sata_arq_sense(spx); 5242 sense->es_key = KEY_ILLEGAL_REQUEST; 5243 sense->es_add_code = 5244 SD_SCSI_ASC_INVALID_FIELD_IN_CDB; 5245 goto done; 5246 } 5247 stat = sata_mode_select_page_8(spx, 5248 (struct mode_cache_scsi3 *)&buf[len], 5249 pllen, &pagelen, &rval, &dmod); 5250 /* 5251 * The pagelen value indicates the number of 5252 * parameter bytes already processed. 5253 * The rval is the return value from 5254 * sata_tran_start(). 5255 * The stat indicates the overall status of 5256 * the operation(s). 5257 */ 5258 if (stat != SATA_SUCCESS) 5259 /* 5260 * Page processing did not succeed - 5261 * all error info is already set-up, 5262 * just return 5263 */ 5264 pllen = 0; /* this breaks the loop */ 5265 else { 5266 len += pagelen; 5267 pllen -= pagelen; 5268 } 5269 break; 5270 5271 case MODEPAGE_INFO_EXCPT: 5272 stat = sata_mode_select_page_1c(spx, 5273 (struct mode_info_excpt_page *)&buf[len], 5274 pllen, &pagelen, &rval, &dmod); 5275 /* 5276 * The pagelen value indicates the number of 5277 * parameter bytes already processed. 5278 * The rval is the return value from 5279 * sata_tran_start(). 5280 * The stat indicates the overall status of 5281 * the operation(s). 5282 */ 5283 if (stat != SATA_SUCCESS) 5284 /* 5285 * Page processing did not succeed - 5286 * all error info is already set-up, 5287 * just return 5288 */ 5289 pllen = 0; /* this breaks the loop */ 5290 else { 5291 len += pagelen; 5292 pllen -= pagelen; 5293 } 5294 break; 5295 5296 case MODEPAGE_ACOUSTIC_MANAG: 5297 stat = sata_mode_select_page_30(spx, 5298 (struct mode_acoustic_management *) 5299 &buf[len], pllen, &pagelen, &rval, &dmod); 5300 /* 5301 * The pagelen value indicates the number of 5302 * parameter bytes already processed. 5303 * The rval is the return value from 5304 * sata_tran_start(). 5305 * The stat indicates the overall status of 5306 * the operation(s). 5307 */ 5308 if (stat != SATA_SUCCESS) 5309 /* 5310 * Page processing did not succeed - 5311 * all error info is already set-up, 5312 * just return 5313 */ 5314 pllen = 0; /* this breaks the loop */ 5315 else { 5316 len += pagelen; 5317 pllen -= pagelen; 5318 } 5319 5320 break; 5321 case MODEPAGE_POWER_COND: 5322 stat = sata_mode_select_page_1a(spx, 5323 (struct mode_info_power_cond *)&buf[len], 5324 pllen, &pagelen, &rval, &dmod); 5325 /* 5326 * The pagelen value indicates the number of 5327 * parameter bytes already processed. 5328 * The rval is the return value from 5329 * sata_tran_start(). 5330 * The stat indicates the overall status of 5331 * the operation(s). 5332 */ 5333 if (stat != SATA_SUCCESS) 5334 /* 5335 * Page processing did not succeed - 5336 * all error info is already set-up, 5337 * just return 5338 */ 5339 pllen = 0; /* this breaks the loop */ 5340 else { 5341 len += pagelen; 5342 pllen -= pagelen; 5343 } 5344 break; 5345 default: 5346 *scsipkt->pkt_scbp = STATUS_CHECK; 5347 sense = sata_arq_sense(spx); 5348 sense->es_key = KEY_ILLEGAL_REQUEST; 5349 sense->es_add_code = 5350 SD_SCSI_ASC_INVALID_FIELD_IN_PARAMS_LIST; 5351 goto done; 5352 } 5353 } 5354 } 5355 done: 5356 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); 5357 /* 5358 * If device parameters were modified, fetch and store the new 5359 * Identify Device data. Since port mutex could have been released 5360 * for accessing HBA driver, we need to re-check device existence. 5361 */ 5362 if (dmod != 0) { 5363 sata_drive_info_t new_sdinfo, *sdinfo; 5364 int rv = 0; 5365 5366 /* 5367 * Following statement has to be changed if this function is 5368 * used for devices other than SATA hard disks. 5369 */ 5370 new_sdinfo.satadrv_type = SATA_DTYPE_ATADISK; 5371 5372 new_sdinfo.satadrv_addr = 5373 spx->txlt_sata_pkt->satapkt_device.satadev_addr; 5374 rv = sata_fetch_device_identify_data(spx->txlt_sata_hba_inst, 5375 &new_sdinfo); 5376 5377 mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx))); 5378 /* 5379 * Since port mutex could have been released when 5380 * accessing HBA driver, we need to re-check that the 5381 * framework still holds the device info structure. 5382 */ 5383 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst, 5384 &spx->txlt_sata_pkt->satapkt_device); 5385 if (sdinfo != NULL) { 5386 /* 5387 * Device still has info structure in the 5388 * sata framework. Copy newly fetched info 5389 */ 5390 if (rv == 0) { 5391 sdinfo->satadrv_id = new_sdinfo.satadrv_id; 5392 sata_save_drive_settings(sdinfo); 5393 } else { 5394 /* 5395 * Could not fetch new data - invalidate 5396 * sata_drive_info. That makes device 5397 * unusable. 5398 */ 5399 sdinfo->satadrv_type = SATA_DTYPE_UNKNOWN; 5400 sdinfo->satadrv_state = SATA_STATE_UNKNOWN; 5401 } 5402 } 5403 if (rv != 0 || sdinfo == NULL) { 5404 /* 5405 * This changes the overall mode select completion 5406 * reason to a failed one !!!!! 5407 */ 5408 *scsipkt->pkt_scbp = STATUS_CHECK; 5409 sense = sata_arq_sense(spx); 5410 scsipkt->pkt_reason = CMD_INCOMPLETE; 5411 rval = TRAN_ACCEPT; 5412 } 5413 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); 5414 } 5415 /* Restore the scsi pkt flags */ 5416 scsipkt->pkt_flags &= ~FLAG_NOINTR; 5417 scsipkt->pkt_flags |= nointr_flag; 5418 5419 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst, 5420 "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason); 5421 5422 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 && 5423 scsipkt->pkt_comp != NULL) { 5424 /* scsi callback required */ 5425 if (servicing_interrupt()) { 5426 if (taskq_dispatch(SATA_TXLT_TASKQ(spx), 5427 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp, 5428 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) == NULL) { 5429 return (TRAN_BUSY); 5430 } 5431 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx), 5432 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp, 5433 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) { 5434 /* Scheduling the callback failed */ 5435 return (TRAN_BUSY); 5436 } 5437 } 5438 5439 return (rval); 5440 } 5441 5442 /* 5443 * Translate command: ATA Pass Through 5444 * Incomplete implementation. Only supports No-Data, PIO Data-In, and 5445 * PIO Data-Out protocols. Also supports CK_COND bit. 5446 * 5447 * Mapping of the incoming CDB bytes to the outgoing satacmd bytes is 5448 * described in Table 111 of SAT-2 (Draft 9). 5449 */ 5450 static int 5451 sata_txlt_ata_pass_thru(sata_pkt_txlate_t *spx) 5452 { 5453 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt; 5454 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd; 5455 struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp; 5456 int extend; 5457 uint64_t lba; 5458 uint16_t feature, sec_count; 5459 int t_len, synch; 5460 int rval, reason; 5461 5462 mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx))); 5463 5464 rval = sata_txlt_generic_pkt_info(spx, &reason, 1); 5465 if ((rval != TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) { 5466 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); 5467 return (rval); 5468 } 5469 5470 /* T_DIR bit */ 5471 if (scsipkt->pkt_cdbp[2] & SATL_APT_BM_T_DIR) 5472 scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ; 5473 else 5474 scmd->satacmd_flags.sata_data_direction = SATA_DIR_WRITE; 5475 5476 /* MULTIPLE_COUNT field. If non-zero, invalid command (for now). */ 5477 if (((scsipkt->pkt_cdbp[1] >> 5) & 0x7) != 0) { 5478 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); 5479 return (sata_txlt_ata_pass_thru_illegal_cmd(spx)); 5480 } 5481 5482 /* OFFLINE field. If non-zero, invalid command (for now). */ 5483 if (((scsipkt->pkt_cdbp[2] >> 6) & 0x3) != 0) { 5484 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); 5485 return (sata_txlt_ata_pass_thru_illegal_cmd(spx)); 5486 } 5487 5488 /* PROTOCOL field */ 5489 switch ((scsipkt->pkt_cdbp[1] >> 1) & 0xf) { 5490 case SATL_APT_P_HW_RESET: 5491 case SATL_APT_P_SRST: 5492 case SATL_APT_P_DMA: 5493 case SATL_APT_P_DMA_QUEUED: 5494 case SATL_APT_P_DEV_DIAG: 5495 case SATL_APT_P_DEV_RESET: 5496 case SATL_APT_P_UDMA_IN: 5497 case SATL_APT_P_UDMA_OUT: 5498 case SATL_APT_P_FPDMA: 5499 case SATL_APT_P_RET_RESP: 5500 /* Not yet implemented */ 5501 default: 5502 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); 5503 return (sata_txlt_ata_pass_thru_illegal_cmd(spx)); 5504 5505 case SATL_APT_P_NON_DATA: 5506 scmd->satacmd_flags.sata_data_direction = SATA_DIR_NODATA_XFER; 5507 break; 5508 5509 case SATL_APT_P_PIO_DATA_IN: 5510 /* If PROTOCOL disagrees with T_DIR, invalid command */ 5511 if (scmd->satacmd_flags.sata_data_direction == SATA_DIR_WRITE) { 5512 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); 5513 return (sata_txlt_ata_pass_thru_illegal_cmd(spx)); 5514 } 5515 5516 /* if there is a buffer, release its DMA resources */ 5517 if ((bp != NULL) && bp->b_un.b_addr && bp->b_bcount) { 5518 sata_scsi_dmafree(NULL, scsipkt); 5519 } else { 5520 /* if there is no buffer, how do you PIO in? */ 5521 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); 5522 return (sata_txlt_ata_pass_thru_illegal_cmd(spx)); 5523 } 5524 5525 break; 5526 5527 case SATL_APT_P_PIO_DATA_OUT: 5528 /* If PROTOCOL disagrees with T_DIR, invalid command */ 5529 if (scmd->satacmd_flags.sata_data_direction == SATA_DIR_READ) { 5530 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); 5531 return (sata_txlt_ata_pass_thru_illegal_cmd(spx)); 5532 } 5533 5534 /* if there is a buffer, release its DMA resources */ 5535 if ((bp != NULL) && bp->b_un.b_addr && bp->b_bcount) { 5536 sata_scsi_dmafree(NULL, scsipkt); 5537 } else { 5538 /* if there is no buffer, how do you PIO out? */ 5539 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); 5540 return (sata_txlt_ata_pass_thru_illegal_cmd(spx)); 5541 } 5542 5543 break; 5544 } 5545 5546 /* Parse the ATA cmd fields, transfer some straight to the satacmd */ 5547 switch ((uint_t)scsipkt->pkt_cdbp[0]) { 5548 case SPC3_CMD_ATA_COMMAND_PASS_THROUGH12: 5549 feature = scsipkt->pkt_cdbp[3]; 5550 5551 sec_count = scsipkt->pkt_cdbp[4]; 5552 5553 lba = scsipkt->pkt_cdbp[8] & 0xf; 5554 lba = (lba << 8) | scsipkt->pkt_cdbp[7]; 5555 lba = (lba << 8) | scsipkt->pkt_cdbp[6]; 5556 lba = (lba << 8) | scsipkt->pkt_cdbp[5]; 5557 5558 scmd->satacmd_device_reg = scsipkt->pkt_cdbp[13] & 0xf0; 5559 scmd->satacmd_cmd_reg = scsipkt->pkt_cdbp[9]; 5560 5561 break; 5562 5563 case SPC3_CMD_ATA_COMMAND_PASS_THROUGH16: 5564 if (scsipkt->pkt_cdbp[1] & SATL_APT_BM_EXTEND) { 5565 extend = 1; 5566 5567 feature = scsipkt->pkt_cdbp[3]; 5568 feature = (feature << 8) | scsipkt->pkt_cdbp[4]; 5569 5570 sec_count = scsipkt->pkt_cdbp[5]; 5571 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[6]; 5572 5573 lba = scsipkt->pkt_cdbp[11]; 5574 lba = (lba << 8) | scsipkt->pkt_cdbp[12]; 5575 lba = (lba << 8) | scsipkt->pkt_cdbp[9]; 5576 lba = (lba << 8) | scsipkt->pkt_cdbp[10]; 5577 lba = (lba << 8) | scsipkt->pkt_cdbp[7]; 5578 lba = (lba << 8) | scsipkt->pkt_cdbp[8]; 5579 5580 scmd->satacmd_device_reg = scsipkt->pkt_cdbp[13]; 5581 scmd->satacmd_cmd_reg = scsipkt->pkt_cdbp[14]; 5582 } else { 5583 feature = scsipkt->pkt_cdbp[3]; 5584 5585 sec_count = scsipkt->pkt_cdbp[5]; 5586 5587 lba = scsipkt->pkt_cdbp[13] & 0xf; 5588 lba = (lba << 8) | scsipkt->pkt_cdbp[12]; 5589 lba = (lba << 8) | scsipkt->pkt_cdbp[10]; 5590 lba = (lba << 8) | scsipkt->pkt_cdbp[8]; 5591 5592 scmd->satacmd_device_reg = scsipkt->pkt_cdbp[13] & 5593 0xf0; 5594 scmd->satacmd_cmd_reg = scsipkt->pkt_cdbp[14]; 5595 } 5596 5597 break; 5598 } 5599 5600 /* CK_COND bit */ 5601 if (scsipkt->pkt_cdbp[2] & SATL_APT_BM_CK_COND) { 5602 if (extend) { 5603 scmd->satacmd_flags.sata_copy_out_sec_count_msb = 1; 5604 scmd->satacmd_flags.sata_copy_out_lba_low_msb = 1; 5605 scmd->satacmd_flags.sata_copy_out_lba_mid_msb = 1; 5606 scmd->satacmd_flags.sata_copy_out_lba_high_msb = 1; 5607 } 5608 5609 scmd->satacmd_flags.sata_copy_out_sec_count_lsb = 1; 5610 scmd->satacmd_flags.sata_copy_out_lba_low_lsb = 1; 5611 scmd->satacmd_flags.sata_copy_out_lba_mid_lsb = 1; 5612 scmd->satacmd_flags.sata_copy_out_lba_high_lsb = 1; 5613 scmd->satacmd_flags.sata_copy_out_device_reg = 1; 5614 scmd->satacmd_flags.sata_copy_out_error_reg = 1; 5615 } 5616 5617 /* Transfer remaining parsed ATA cmd values to the satacmd */ 5618 if (extend) { 5619 scmd->satacmd_addr_type = ATA_ADDR_LBA48; 5620 5621 scmd->satacmd_features_reg_ext = (feature >> 8) & 0xff; 5622 scmd->satacmd_sec_count_msb = (sec_count >> 8) & 0xff; 5623 scmd->satacmd_lba_low_msb = (lba >> 8) & 0xff; 5624 scmd->satacmd_lba_mid_msb = (lba >> 8) & 0xff; 5625 scmd->satacmd_lba_high_msb = lba >> 40; 5626 } else { 5627 scmd->satacmd_addr_type = ATA_ADDR_LBA28; 5628 5629 scmd->satacmd_features_reg_ext = 0; 5630 scmd->satacmd_sec_count_msb = 0; 5631 scmd->satacmd_lba_low_msb = 0; 5632 scmd->satacmd_lba_mid_msb = 0; 5633 scmd->satacmd_lba_high_msb = 0; 5634 } 5635 5636 scmd->satacmd_features_reg = feature & 0xff; 5637 scmd->satacmd_sec_count_lsb = sec_count & 0xff; 5638 scmd->satacmd_lba_low_lsb = lba & 0xff; 5639 scmd->satacmd_lba_mid_lsb = (lba >> 8) & 0xff; 5640 scmd->satacmd_lba_high_lsb = (lba >> 16) & 0xff; 5641 5642 /* Determine transfer length */ 5643 switch (scsipkt->pkt_cdbp[2] & 0x3) { /* T_LENGTH field */ 5644 case 1: 5645 t_len = feature; 5646 break; 5647 case 2: 5648 t_len = sec_count; 5649 break; 5650 default: 5651 t_len = 0; 5652 break; 5653 } 5654 5655 /* Adjust transfer length for the Byte Block bit */ 5656 if ((scsipkt->pkt_cdbp[2] >> 2) & 1) 5657 t_len *= SATA_DISK_SECTOR_SIZE; 5658 5659 /* Start processing command */ 5660 if (!(spx->txlt_sata_pkt->satapkt_op_mode & SATA_OPMODE_SYNCH)) { 5661 spx->txlt_sata_pkt->satapkt_comp = sata_txlt_apt_completion; 5662 synch = FALSE; 5663 } else { 5664 synch = TRUE; 5665 } 5666 5667 if (sata_hba_start(spx, &rval) != 0) { 5668 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); 5669 return (rval); 5670 } 5671 5672 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); 5673 5674 if (synch) { 5675 sata_txlt_apt_completion(spx->txlt_sata_pkt); 5676 } 5677 5678 return (TRAN_ACCEPT); 5679 } 5680 5681 /* 5682 * Translate command: Log Sense 5683 */ 5684 static int 5685 sata_txlt_log_sense(sata_pkt_txlate_t *spx) 5686 { 5687 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt; 5688 struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp; 5689 sata_drive_info_t *sdinfo; 5690 struct scsi_extended_sense *sense; 5691 int len, count, alc_len; 5692 int pc; /* Page Control code */ 5693 int page_code; /* Page code */ 5694 uint8_t *buf; /* log sense buffer */ 5695 int rval, reason; 5696 #define MAX_LOG_SENSE_PAGE_SIZE 512 5697 5698 SATADBG2(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst, 5699 "sata_txlt_log_sense, pc 0x%x, page code 0x%x\n", 5700 spx->txlt_scsi_pkt->pkt_cdbp[2] >> 6, 5701 spx->txlt_scsi_pkt->pkt_cdbp[2] & 0x3f); 5702 5703 if (servicing_interrupt()) { 5704 buf = kmem_zalloc(MAX_LOG_SENSE_PAGE_SIZE, KM_NOSLEEP); 5705 if (buf == NULL) { 5706 return (TRAN_BUSY); 5707 } 5708 } else { 5709 buf = kmem_zalloc(MAX_LOG_SENSE_PAGE_SIZE, KM_SLEEP); 5710 } 5711 5712 mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx))); 5713 5714 if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 1)) != 5715 TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) { 5716 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); 5717 kmem_free(buf, MAX_LOG_SENSE_PAGE_SIZE); 5718 return (rval); 5719 } 5720 5721 scsipkt->pkt_reason = CMD_CMPLT; 5722 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET | 5723 STATE_SENT_CMD | STATE_GOT_STATUS; 5724 5725 pc = scsipkt->pkt_cdbp[2] >> 6; 5726 page_code = scsipkt->pkt_cdbp[2] & 0x3f; 5727 5728 /* Reject not supported request for all but cumulative values */ 5729 switch (pc) { 5730 case PC_CUMULATIVE_VALUES: 5731 break; 5732 default: 5733 *scsipkt->pkt_scbp = STATUS_CHECK; 5734 sense = sata_arq_sense(spx); 5735 sense->es_key = KEY_ILLEGAL_REQUEST; 5736 sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB; 5737 goto done; 5738 } 5739 5740 switch (page_code) { 5741 case PAGE_CODE_GET_SUPPORTED_LOG_PAGES: 5742 case PAGE_CODE_SELF_TEST_RESULTS: 5743 case PAGE_CODE_INFORMATION_EXCEPTIONS: 5744 case PAGE_CODE_SMART_READ_DATA: 5745 case PAGE_CODE_START_STOP_CYCLE_COUNTER: 5746 break; 5747 default: 5748 *scsipkt->pkt_scbp = STATUS_CHECK; 5749 sense = sata_arq_sense(spx); 5750 sense->es_key = KEY_ILLEGAL_REQUEST; 5751 sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB; 5752 goto done; 5753 } 5754 5755 if (bp != NULL && bp->b_un.b_addr && bp->b_bcount) { 5756 /* 5757 * Because log sense uses local buffers for data retrieval from 5758 * the devices and sets the data programatically in the 5759 * original specified buffer, release preallocated DMA 5760 * resources before storing data in the original buffer, 5761 * so no unwanted DMA sync would take place. 5762 */ 5763 sata_id_t *sata_id; 5764 5765 sata_scsi_dmafree(NULL, scsipkt); 5766 5767 len = 0; 5768 5769 /* Build log parameter header */ 5770 buf[len++] = page_code; /* page code as in the CDB */ 5771 buf[len++] = 0; /* reserved */ 5772 buf[len++] = 0; /* Zero out page length for now (MSB) */ 5773 buf[len++] = 0; /* (LSB) */ 5774 5775 sdinfo = sata_get_device_info( 5776 spx->txlt_sata_hba_inst, 5777 &spx->txlt_sata_pkt->satapkt_device); 5778 5779 /* 5780 * Add requested pages. 5781 */ 5782 switch (page_code) { 5783 case PAGE_CODE_GET_SUPPORTED_LOG_PAGES: 5784 len = sata_build_lsense_page_0(sdinfo, buf + len); 5785 break; 5786 case PAGE_CODE_SELF_TEST_RESULTS: 5787 sata_id = &sdinfo->satadrv_id; 5788 if ((! (sata_id->ai_cmdset84 & 5789 SATA_SMART_SELF_TEST_SUPPORTED)) || 5790 (! (sata_id->ai_features87 & 5791 SATA_SMART_SELF_TEST_SUPPORTED))) { 5792 *scsipkt->pkt_scbp = STATUS_CHECK; 5793 sense = sata_arq_sense(spx); 5794 sense->es_key = KEY_ILLEGAL_REQUEST; 5795 sense->es_add_code = 5796 SD_SCSI_ASC_INVALID_FIELD_IN_CDB; 5797 5798 goto done; 5799 } 5800 len = sata_build_lsense_page_10(sdinfo, buf + len, 5801 spx->txlt_sata_hba_inst); 5802 break; 5803 case PAGE_CODE_INFORMATION_EXCEPTIONS: 5804 sata_id = &sdinfo->satadrv_id; 5805 if (! (sata_id->ai_cmdset82 & SATA_SMART_SUPPORTED)) { 5806 *scsipkt->pkt_scbp = STATUS_CHECK; 5807 sense = sata_arq_sense(spx); 5808 sense->es_key = KEY_ILLEGAL_REQUEST; 5809 sense->es_add_code = 5810 SD_SCSI_ASC_INVALID_FIELD_IN_CDB; 5811 5812 goto done; 5813 } 5814 if (! (sata_id->ai_features85 & SATA_SMART_ENABLED)) { 5815 *scsipkt->pkt_scbp = STATUS_CHECK; 5816 sense = sata_arq_sense(spx); 5817 sense->es_key = KEY_ABORTED_COMMAND; 5818 sense->es_add_code = 5819 SCSI_ASC_ATA_DEV_FEAT_NOT_ENABLED; 5820 sense->es_qual_code = 5821 SCSI_ASCQ_ATA_DEV_FEAT_NOT_ENABLED; 5822 5823 goto done; 5824 } 5825 5826 len = sata_build_lsense_page_2f(sdinfo, buf + len, 5827 spx->txlt_sata_hba_inst); 5828 break; 5829 case PAGE_CODE_SMART_READ_DATA: 5830 sata_id = &sdinfo->satadrv_id; 5831 if (! (sata_id->ai_cmdset82 & SATA_SMART_SUPPORTED)) { 5832 *scsipkt->pkt_scbp = STATUS_CHECK; 5833 sense = sata_arq_sense(spx); 5834 sense->es_key = KEY_ILLEGAL_REQUEST; 5835 sense->es_add_code = 5836 SD_SCSI_ASC_INVALID_FIELD_IN_CDB; 5837 5838 goto done; 5839 } 5840 if (! (sata_id->ai_features85 & SATA_SMART_ENABLED)) { 5841 *scsipkt->pkt_scbp = STATUS_CHECK; 5842 sense = sata_arq_sense(spx); 5843 sense->es_key = KEY_ABORTED_COMMAND; 5844 sense->es_add_code = 5845 SCSI_ASC_ATA_DEV_FEAT_NOT_ENABLED; 5846 sense->es_qual_code = 5847 SCSI_ASCQ_ATA_DEV_FEAT_NOT_ENABLED; 5848 5849 goto done; 5850 } 5851 5852 /* This page doesn't include a page header */ 5853 len = sata_build_lsense_page_30(sdinfo, buf, 5854 spx->txlt_sata_hba_inst); 5855 goto no_header; 5856 case PAGE_CODE_START_STOP_CYCLE_COUNTER: 5857 sata_id = &sdinfo->satadrv_id; 5858 if (! (sata_id->ai_cmdset82 & SATA_SMART_SUPPORTED)) { 5859 *scsipkt->pkt_scbp = STATUS_CHECK; 5860 sense = sata_arq_sense(spx); 5861 sense->es_key = KEY_ILLEGAL_REQUEST; 5862 sense->es_add_code = 5863 SD_SCSI_ASC_INVALID_FIELD_IN_CDB; 5864 5865 goto done; 5866 } 5867 if (! (sata_id->ai_features85 & SATA_SMART_ENABLED)) { 5868 *scsipkt->pkt_scbp = STATUS_CHECK; 5869 sense = sata_arq_sense(spx); 5870 sense->es_key = KEY_ABORTED_COMMAND; 5871 sense->es_add_code = 5872 SCSI_ASC_ATA_DEV_FEAT_NOT_ENABLED; 5873 sense->es_qual_code = 5874 SCSI_ASCQ_ATA_DEV_FEAT_NOT_ENABLED; 5875 5876 goto done; 5877 } 5878 len = sata_build_lsense_page_0e(sdinfo, buf, spx); 5879 goto no_header; 5880 default: 5881 /* Invalid request */ 5882 *scsipkt->pkt_scbp = STATUS_CHECK; 5883 sense = sata_arq_sense(spx); 5884 sense->es_key = KEY_ILLEGAL_REQUEST; 5885 sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB; 5886 goto done; 5887 } 5888 5889 /* set parameter log sense data length */ 5890 buf[2] = len >> 8; /* log sense length (MSB) */ 5891 buf[3] = len & 0xff; /* log sense length (LSB) */ 5892 5893 len += SCSI_LOG_PAGE_HDR_LEN; 5894 ASSERT(len <= MAX_LOG_SENSE_PAGE_SIZE); 5895 5896 no_header: 5897 /* Check allocation length */ 5898 alc_len = scsipkt->pkt_cdbp[7]; 5899 alc_len = (len << 8) | scsipkt->pkt_cdbp[8]; 5900 5901 /* 5902 * We do not check for possible parameters truncation 5903 * (alc_len < len) assuming that the target driver works 5904 * correctly. Just avoiding overrun. 5905 * Copy no more than requested and possible, buffer-wise. 5906 */ 5907 count = MIN(alc_len, len); 5908 count = MIN(bp->b_bcount, count); 5909 bcopy(buf, bp->b_un.b_addr, count); 5910 5911 scsipkt->pkt_state |= STATE_XFERRED_DATA; 5912 scsipkt->pkt_resid = alc_len > count ? alc_len - count : 0; 5913 } 5914 *scsipkt->pkt_scbp = STATUS_GOOD; 5915 done: 5916 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); 5917 (void) kmem_free(buf, MAX_LOG_SENSE_PAGE_SIZE); 5918 5919 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst, 5920 "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason); 5921 5922 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 && 5923 scsipkt->pkt_comp != NULL) { 5924 /* scsi callback required */ 5925 if (servicing_interrupt()) { 5926 if (taskq_dispatch(SATA_TXLT_TASKQ(spx), 5927 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp, 5928 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) == NULL) { 5929 return (TRAN_BUSY); 5930 } 5931 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx), 5932 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp, 5933 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) { 5934 /* Scheduling the callback failed */ 5935 return (TRAN_BUSY); 5936 } 5937 } 5938 5939 return (TRAN_ACCEPT); 5940 } 5941 5942 /* 5943 * Translate command: Log Select 5944 * Not implemented at this time - returns invalid command response. 5945 */ 5946 static int 5947 sata_txlt_log_select(sata_pkt_txlate_t *spx) 5948 { 5949 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst, 5950 "sata_txlt_log_select\n", NULL); 5951 5952 return (sata_txlt_invalid_command(spx)); 5953 } 5954 5955 5956 /* 5957 * Translate command: Read (various types). 5958 * Translated into appropriate type of ATA READ command 5959 * for SATA hard disks. 5960 * Both the device capabilities and requested operation mode are 5961 * considered. 5962 * 5963 * Following scsi cdb fields are ignored: 5964 * rdprotect, dpo, fua, fua_nv, group_number. 5965 * 5966 * If SATA_ENABLE_QUEUING flag is set (in the global SATA HBA framework 5967 * enable variable sata_func_enable), the capability of the controller and 5968 * capability of a device are checked and if both support queueing, read 5969 * request will be translated to READ_DMA_QUEUEING or READ_DMA_QUEUEING_EXT 5970 * command rather than plain READ_XXX command. 5971 * If SATA_ENABLE_NCQ flag is set in addition to SATA_ENABLE_QUEUING flag and 5972 * both the controller and device suport such functionality, the read 5973 * request will be translated to READ_FPDMA_QUEUED command. 5974 * In both cases the maximum queue depth is derived as minimum of: 5975 * HBA capability,device capability and sata_max_queue_depth variable setting. 5976 * The value passed to HBA driver is decremented by 1, because only 5 bits are 5977 * used to pass max queue depth value, and the maximum possible queue depth 5978 * is 32. 5979 * 5980 * Returns TRAN_ACCEPT or code returned by sata_hba_start() and 5981 * appropriate values in scsi_pkt fields. 5982 */ 5983 static int 5984 sata_txlt_read(sata_pkt_txlate_t *spx) 5985 { 5986 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt; 5987 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd; 5988 sata_drive_info_t *sdinfo; 5989 sata_hba_inst_t *shi = SATA_TXLT_HBA_INST(spx); 5990 int cport = SATA_TXLT_CPORT(spx); 5991 uint16_t sec_count; 5992 uint64_t lba; 5993 int rval, reason; 5994 int synch; 5995 5996 mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx))); 5997 5998 if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 0)) != 5999 TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) { 6000 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); 6001 return (rval); 6002 } 6003 6004 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst, 6005 &spx->txlt_sata_pkt->satapkt_device); 6006 6007 scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ; 6008 /* 6009 * Extract LBA and sector count from scsi CDB. 6010 */ 6011 switch ((uint_t)scsipkt->pkt_cdbp[0]) { 6012 case SCMD_READ: 6013 /* 6-byte scsi read cmd : 0x08 */ 6014 lba = (scsipkt->pkt_cdbp[1] & 0x1f); 6015 lba = (lba << 8) | scsipkt->pkt_cdbp[2]; 6016 lba = (lba << 8) | scsipkt->pkt_cdbp[3]; 6017 sec_count = scsipkt->pkt_cdbp[4]; 6018 /* sec_count 0 will be interpreted as 256 by a device */ 6019 break; 6020 case SCMD_READ_G1: 6021 /* 10-bytes scsi read command : 0x28 */ 6022 lba = scsipkt->pkt_cdbp[2]; 6023 lba = (lba << 8) | scsipkt->pkt_cdbp[3]; 6024 lba = (lba << 8) | scsipkt->pkt_cdbp[4]; 6025 lba = (lba << 8) | scsipkt->pkt_cdbp[5]; 6026 sec_count = scsipkt->pkt_cdbp[7]; 6027 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[8]; 6028 break; 6029 case SCMD_READ_G5: 6030 /* 12-bytes scsi read command : 0xA8 */ 6031 lba = scsipkt->pkt_cdbp[2]; 6032 lba = (lba << 8) | scsipkt->pkt_cdbp[3]; 6033 lba = (lba << 8) | scsipkt->pkt_cdbp[4]; 6034 lba = (lba << 8) | scsipkt->pkt_cdbp[5]; 6035 sec_count = scsipkt->pkt_cdbp[6]; 6036 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[7]; 6037 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[8]; 6038 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[9]; 6039 break; 6040 case SCMD_READ_G4: 6041 /* 16-bytes scsi read command : 0x88 */ 6042 lba = scsipkt->pkt_cdbp[2]; 6043 lba = (lba << 8) | scsipkt->pkt_cdbp[3]; 6044 lba = (lba << 8) | scsipkt->pkt_cdbp[4]; 6045 lba = (lba << 8) | scsipkt->pkt_cdbp[5]; 6046 lba = (lba << 8) | scsipkt->pkt_cdbp[6]; 6047 lba = (lba << 8) | scsipkt->pkt_cdbp[7]; 6048 lba = (lba << 8) | scsipkt->pkt_cdbp[8]; 6049 lba = (lba << 8) | scsipkt->pkt_cdbp[9]; 6050 sec_count = scsipkt->pkt_cdbp[10]; 6051 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[11]; 6052 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[12]; 6053 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[13]; 6054 break; 6055 default: 6056 /* Unsupported command */ 6057 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); 6058 return (sata_txlt_invalid_command(spx)); 6059 } 6060 6061 /* 6062 * Check if specified address exceeds device capacity 6063 */ 6064 if ((lba >= sdinfo->satadrv_capacity) || 6065 ((lba + sec_count) > sdinfo->satadrv_capacity)) { 6066 /* LBA out of range */ 6067 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); 6068 return (sata_txlt_lba_out_of_range(spx)); 6069 } 6070 6071 /* 6072 * For zero-length transfer, emulate good completion of the command 6073 * (reasons for rejecting the command were already checked). 6074 * No DMA resources were allocated. 6075 */ 6076 if (spx->txlt_dma_cookie_list == NULL) { 6077 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); 6078 return (sata_emul_rw_completion(spx)); 6079 } 6080 6081 /* 6082 * Build cmd block depending on the device capability and 6083 * requested operation mode. 6084 * Do not bother with non-dma mode - we are working only with 6085 * devices supporting DMA. 6086 */ 6087 scmd->satacmd_addr_type = ATA_ADDR_LBA; 6088 scmd->satacmd_device_reg = SATA_ADH_LBA; 6089 scmd->satacmd_cmd_reg = SATAC_READ_DMA; 6090 if (sdinfo->satadrv_features_support & SATA_DEV_F_LBA48) { 6091 scmd->satacmd_addr_type = ATA_ADDR_LBA48; 6092 scmd->satacmd_cmd_reg = SATAC_READ_DMA_EXT; 6093 scmd->satacmd_sec_count_msb = sec_count >> 8; 6094 #ifndef __lock_lint 6095 scmd->satacmd_lba_low_msb = (lba >> 24) & 0xff; 6096 scmd->satacmd_lba_mid_msb = (lba >> 32) & 0xff; 6097 scmd->satacmd_lba_high_msb = lba >> 40; 6098 #endif 6099 } else if (sdinfo->satadrv_features_support & SATA_DEV_F_LBA28) { 6100 scmd->satacmd_addr_type = ATA_ADDR_LBA28; 6101 scmd->satacmd_device_reg = SATA_ADH_LBA | ((lba >> 24) & 0xf); 6102 } 6103 scmd->satacmd_sec_count_lsb = sec_count & 0xff; 6104 scmd->satacmd_lba_low_lsb = lba & 0xff; 6105 scmd->satacmd_lba_mid_lsb = (lba >> 8) & 0xff; 6106 scmd->satacmd_lba_high_lsb = (lba >> 16) & 0xff; 6107 scmd->satacmd_features_reg = 0; 6108 scmd->satacmd_status_reg = 0; 6109 scmd->satacmd_error_reg = 0; 6110 6111 /* 6112 * Check if queueing commands should be used and switch 6113 * to appropriate command if possible 6114 */ 6115 if (sata_func_enable & SATA_ENABLE_QUEUING) { 6116 boolean_t using_queuing; 6117 6118 /* Queuing supported by controller and device? */ 6119 if ((sata_func_enable & SATA_ENABLE_NCQ) && 6120 (sdinfo->satadrv_features_support & 6121 SATA_DEV_F_NCQ) && 6122 (SATA_FEATURES(spx->txlt_sata_hba_inst) & 6123 SATA_CTLF_NCQ)) { 6124 using_queuing = B_TRUE; 6125 6126 /* NCQ supported - use FPDMA READ */ 6127 scmd->satacmd_cmd_reg = 6128 SATAC_READ_FPDMA_QUEUED; 6129 scmd->satacmd_features_reg_ext = 6130 scmd->satacmd_sec_count_msb; 6131 scmd->satacmd_sec_count_msb = 0; 6132 } else if ((sdinfo->satadrv_features_support & 6133 SATA_DEV_F_TCQ) && 6134 (SATA_FEATURES(spx->txlt_sata_hba_inst) & 6135 SATA_CTLF_QCMD)) { 6136 using_queuing = B_TRUE; 6137 6138 /* Legacy queueing */ 6139 if (sdinfo->satadrv_features_support & 6140 SATA_DEV_F_LBA48) { 6141 scmd->satacmd_cmd_reg = 6142 SATAC_READ_DMA_QUEUED_EXT; 6143 scmd->satacmd_features_reg_ext = 6144 scmd->satacmd_sec_count_msb; 6145 scmd->satacmd_sec_count_msb = 0; 6146 } else { 6147 scmd->satacmd_cmd_reg = 6148 SATAC_READ_DMA_QUEUED; 6149 } 6150 } else /* NCQ nor legacy queuing not supported */ 6151 using_queuing = B_FALSE; 6152 6153 /* 6154 * If queuing, the sector count goes in the features register 6155 * and the secount count will contain the tag. 6156 */ 6157 if (using_queuing) { 6158 scmd->satacmd_features_reg = 6159 scmd->satacmd_sec_count_lsb; 6160 scmd->satacmd_sec_count_lsb = 0; 6161 scmd->satacmd_flags.sata_queued = B_TRUE; 6162 6163 /* Set-up maximum queue depth */ 6164 scmd->satacmd_flags.sata_max_queue_depth = 6165 sdinfo->satadrv_max_queue_depth - 1; 6166 } else if (sdinfo->satadrv_features_enabled & 6167 SATA_DEV_F_E_UNTAGGED_QING) { 6168 /* 6169 * Although NCQ/TCQ is not enabled, untagged queuing 6170 * may be still used. 6171 * Set-up the maximum untagged queue depth. 6172 * Use controller's queue depth from sata_hba_tran. 6173 * SATA HBA drivers may ignore this value and rely on 6174 * the internal limits.For drivers that do not 6175 * ignore untaged queue depth, limit the value to 6176 * SATA_MAX_QUEUE_DEPTH (32), as this is the 6177 * largest value that can be passed via 6178 * satacmd_flags.sata_max_queue_depth. 6179 */ 6180 scmd->satacmd_flags.sata_max_queue_depth = 6181 SATA_QDEPTH(shi) <= SATA_MAX_QUEUE_DEPTH ? 6182 SATA_QDEPTH(shi) - 1: SATA_MAX_QUEUE_DEPTH - 1; 6183 6184 } else { 6185 scmd->satacmd_flags.sata_max_queue_depth = 0; 6186 } 6187 } else 6188 scmd->satacmd_flags.sata_max_queue_depth = 0; 6189 6190 SATADBG3(SATA_DBG_HBA_IF, spx->txlt_sata_hba_inst, 6191 "sata_txlt_read cmd 0x%2x, lba %llx, sec count %x\n", 6192 scmd->satacmd_cmd_reg, lba, sec_count); 6193 6194 if (!(spx->txlt_sata_pkt->satapkt_op_mode & SATA_OPMODE_SYNCH)) { 6195 /* Need callback function */ 6196 spx->txlt_sata_pkt->satapkt_comp = sata_txlt_rw_completion; 6197 synch = FALSE; 6198 } else 6199 synch = TRUE; 6200 6201 /* Transfer command to HBA */ 6202 if (sata_hba_start(spx, &rval) != 0) { 6203 /* Pkt not accepted for execution */ 6204 mutex_exit(&SATA_CPORT_MUTEX(shi, cport)); 6205 return (rval); 6206 } 6207 mutex_exit(&SATA_CPORT_MUTEX(shi, cport)); 6208 /* 6209 * If execution is non-synchronous, 6210 * a callback function will handle potential errors, translate 6211 * the response and will do a callback to a target driver. 6212 * If it was synchronous, check execution status using the same 6213 * framework callback. 6214 */ 6215 if (synch) { 6216 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst, 6217 "synchronous execution status %x\n", 6218 spx->txlt_sata_pkt->satapkt_reason); 6219 sata_txlt_rw_completion(spx->txlt_sata_pkt); 6220 } 6221 return (TRAN_ACCEPT); 6222 } 6223 6224 6225 /* 6226 * SATA translate command: Write (various types) 6227 * Translated into appropriate type of ATA WRITE command 6228 * for SATA hard disks. 6229 * Both the device capabilities and requested operation mode are 6230 * considered. 6231 * 6232 * Following scsi cdb fields are ignored: 6233 * rwprotect, dpo, fua, fua_nv, group_number. 6234 * 6235 * If SATA_ENABLE_QUEUING flag is set (in the global SATA HBA framework 6236 * enable variable sata_func_enable), the capability of the controller and 6237 * capability of a device are checked and if both support queueing, write 6238 * request will be translated to WRITE_DMA_QUEUEING or WRITE_DMA_QUEUEING_EXT 6239 * command rather than plain WRITE_XXX command. 6240 * If SATA_ENABLE_NCQ flag is set in addition to SATA_ENABLE_QUEUING flag and 6241 * both the controller and device suport such functionality, the write 6242 * request will be translated to WRITE_FPDMA_QUEUED command. 6243 * In both cases the maximum queue depth is derived as minimum of: 6244 * HBA capability,device capability and sata_max_queue_depth variable setting. 6245 * The value passed to HBA driver is decremented by 1, because only 5 bits are 6246 * used to pass max queue depth value, and the maximum possible queue depth 6247 * is 32. 6248 * 6249 * Returns TRAN_ACCEPT or code returned by sata_hba_start() and 6250 * appropriate values in scsi_pkt fields. 6251 */ 6252 static int 6253 sata_txlt_write(sata_pkt_txlate_t *spx) 6254 { 6255 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt; 6256 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd; 6257 sata_drive_info_t *sdinfo; 6258 sata_hba_inst_t *shi = SATA_TXLT_HBA_INST(spx); 6259 int cport = SATA_TXLT_CPORT(spx); 6260 uint16_t sec_count; 6261 uint64_t lba; 6262 int rval, reason; 6263 int synch; 6264 6265 mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx))); 6266 6267 if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 0)) != 6268 TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) { 6269 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); 6270 return (rval); 6271 } 6272 6273 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst, 6274 &spx->txlt_sata_pkt->satapkt_device); 6275 6276 scmd->satacmd_flags.sata_data_direction = SATA_DIR_WRITE; 6277 /* 6278 * Extract LBA and sector count from scsi CDB 6279 */ 6280 switch ((uint_t)scsipkt->pkt_cdbp[0]) { 6281 case SCMD_WRITE: 6282 /* 6-byte scsi read cmd : 0x0A */ 6283 lba = (scsipkt->pkt_cdbp[1] & 0x1f); 6284 lba = (lba << 8) | scsipkt->pkt_cdbp[2]; 6285 lba = (lba << 8) | scsipkt->pkt_cdbp[3]; 6286 sec_count = scsipkt->pkt_cdbp[4]; 6287 /* sec_count 0 will be interpreted as 256 by a device */ 6288 break; 6289 case SCMD_WRITE_G1: 6290 /* 10-bytes scsi write command : 0x2A */ 6291 lba = scsipkt->pkt_cdbp[2]; 6292 lba = (lba << 8) | scsipkt->pkt_cdbp[3]; 6293 lba = (lba << 8) | scsipkt->pkt_cdbp[4]; 6294 lba = (lba << 8) | scsipkt->pkt_cdbp[5]; 6295 sec_count = scsipkt->pkt_cdbp[7]; 6296 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[8]; 6297 break; 6298 case SCMD_WRITE_G5: 6299 /* 12-bytes scsi read command : 0xAA */ 6300 lba = scsipkt->pkt_cdbp[2]; 6301 lba = (lba << 8) | scsipkt->pkt_cdbp[3]; 6302 lba = (lba << 8) | scsipkt->pkt_cdbp[4]; 6303 lba = (lba << 8) | scsipkt->pkt_cdbp[5]; 6304 sec_count = scsipkt->pkt_cdbp[6]; 6305 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[7]; 6306 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[8]; 6307 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[9]; 6308 break; 6309 case SCMD_WRITE_G4: 6310 /* 16-bytes scsi write command : 0x8A */ 6311 lba = scsipkt->pkt_cdbp[2]; 6312 lba = (lba << 8) | scsipkt->pkt_cdbp[3]; 6313 lba = (lba << 8) | scsipkt->pkt_cdbp[4]; 6314 lba = (lba << 8) | scsipkt->pkt_cdbp[5]; 6315 lba = (lba << 8) | scsipkt->pkt_cdbp[6]; 6316 lba = (lba << 8) | scsipkt->pkt_cdbp[7]; 6317 lba = (lba << 8) | scsipkt->pkt_cdbp[8]; 6318 lba = (lba << 8) | scsipkt->pkt_cdbp[9]; 6319 sec_count = scsipkt->pkt_cdbp[10]; 6320 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[11]; 6321 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[12]; 6322 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[13]; 6323 break; 6324 default: 6325 /* Unsupported command */ 6326 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); 6327 return (sata_txlt_invalid_command(spx)); 6328 } 6329 6330 /* 6331 * Check if specified address and length exceeds device capacity 6332 */ 6333 if ((lba >= sdinfo->satadrv_capacity) || 6334 ((lba + sec_count) > sdinfo->satadrv_capacity)) { 6335 /* LBA out of range */ 6336 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); 6337 return (sata_txlt_lba_out_of_range(spx)); 6338 } 6339 6340 /* 6341 * For zero-length transfer, emulate good completion of the command 6342 * (reasons for rejecting the command were already checked). 6343 * No DMA resources were allocated. 6344 */ 6345 if (spx->txlt_dma_cookie_list == NULL) { 6346 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); 6347 return (sata_emul_rw_completion(spx)); 6348 } 6349 6350 /* 6351 * Build cmd block depending on the device capability and 6352 * requested operation mode. 6353 * Do not bother with non-dma mode- we are working only with 6354 * devices supporting DMA. 6355 */ 6356 scmd->satacmd_addr_type = ATA_ADDR_LBA; 6357 scmd->satacmd_device_reg = SATA_ADH_LBA; 6358 scmd->satacmd_cmd_reg = SATAC_WRITE_DMA; 6359 if (sdinfo->satadrv_features_support & SATA_DEV_F_LBA48) { 6360 scmd->satacmd_addr_type = ATA_ADDR_LBA48; 6361 scmd->satacmd_cmd_reg = SATAC_WRITE_DMA_EXT; 6362 scmd->satacmd_sec_count_msb = sec_count >> 8; 6363 scmd->satacmd_lba_low_msb = (lba >> 24) & 0xff; 6364 #ifndef __lock_lint 6365 scmd->satacmd_lba_mid_msb = (lba >> 32) & 0xff; 6366 scmd->satacmd_lba_high_msb = lba >> 40; 6367 #endif 6368 } else if (sdinfo->satadrv_features_support & SATA_DEV_F_LBA28) { 6369 scmd->satacmd_addr_type = ATA_ADDR_LBA28; 6370 scmd->satacmd_device_reg = SATA_ADH_LBA | ((lba >> 24) & 0xf); 6371 } 6372 scmd->satacmd_sec_count_lsb = sec_count & 0xff; 6373 scmd->satacmd_lba_low_lsb = lba & 0xff; 6374 scmd->satacmd_lba_mid_lsb = (lba >> 8) & 0xff; 6375 scmd->satacmd_lba_high_lsb = (lba >> 16) & 0xff; 6376 scmd->satacmd_features_reg = 0; 6377 scmd->satacmd_status_reg = 0; 6378 scmd->satacmd_error_reg = 0; 6379 6380 /* 6381 * Check if queueing commands should be used and switch 6382 * to appropriate command if possible 6383 */ 6384 if (sata_func_enable & SATA_ENABLE_QUEUING) { 6385 boolean_t using_queuing; 6386 6387 /* Queuing supported by controller and device? */ 6388 if ((sata_func_enable & SATA_ENABLE_NCQ) && 6389 (sdinfo->satadrv_features_support & 6390 SATA_DEV_F_NCQ) && 6391 (SATA_FEATURES(spx->txlt_sata_hba_inst) & 6392 SATA_CTLF_NCQ)) { 6393 using_queuing = B_TRUE; 6394 6395 /* NCQ supported - use FPDMA WRITE */ 6396 scmd->satacmd_cmd_reg = 6397 SATAC_WRITE_FPDMA_QUEUED; 6398 scmd->satacmd_features_reg_ext = 6399 scmd->satacmd_sec_count_msb; 6400 scmd->satacmd_sec_count_msb = 0; 6401 } else if ((sdinfo->satadrv_features_support & 6402 SATA_DEV_F_TCQ) && 6403 (SATA_FEATURES(spx->txlt_sata_hba_inst) & 6404 SATA_CTLF_QCMD)) { 6405 using_queuing = B_TRUE; 6406 6407 /* Legacy queueing */ 6408 if (sdinfo->satadrv_features_support & 6409 SATA_DEV_F_LBA48) { 6410 scmd->satacmd_cmd_reg = 6411 SATAC_WRITE_DMA_QUEUED_EXT; 6412 scmd->satacmd_features_reg_ext = 6413 scmd->satacmd_sec_count_msb; 6414 scmd->satacmd_sec_count_msb = 0; 6415 } else { 6416 scmd->satacmd_cmd_reg = 6417 SATAC_WRITE_DMA_QUEUED; 6418 } 6419 } else /* NCQ nor legacy queuing not supported */ 6420 using_queuing = B_FALSE; 6421 6422 if (using_queuing) { 6423 scmd->satacmd_features_reg = 6424 scmd->satacmd_sec_count_lsb; 6425 scmd->satacmd_sec_count_lsb = 0; 6426 scmd->satacmd_flags.sata_queued = B_TRUE; 6427 /* Set-up maximum queue depth */ 6428 scmd->satacmd_flags.sata_max_queue_depth = 6429 sdinfo->satadrv_max_queue_depth - 1; 6430 } else if (sdinfo->satadrv_features_enabled & 6431 SATA_DEV_F_E_UNTAGGED_QING) { 6432 /* 6433 * Although NCQ/TCQ is not enabled, untagged queuing 6434 * may be still used. 6435 * Set-up the maximum untagged queue depth. 6436 * Use controller's queue depth from sata_hba_tran. 6437 * SATA HBA drivers may ignore this value and rely on 6438 * the internal limits. For drivera that do not 6439 * ignore untaged queue depth, limit the value to 6440 * SATA_MAX_QUEUE_DEPTH (32), as this is the 6441 * largest value that can be passed via 6442 * satacmd_flags.sata_max_queue_depth. 6443 */ 6444 scmd->satacmd_flags.sata_max_queue_depth = 6445 SATA_QDEPTH(shi) <= SATA_MAX_QUEUE_DEPTH ? 6446 SATA_QDEPTH(shi) - 1: SATA_MAX_QUEUE_DEPTH - 1; 6447 6448 } else { 6449 scmd->satacmd_flags.sata_max_queue_depth = 0; 6450 } 6451 } else 6452 scmd->satacmd_flags.sata_max_queue_depth = 0; 6453 6454 SATADBG3(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst, 6455 "sata_txlt_write cmd 0x%2x, lba %llx, sec count %x\n", 6456 scmd->satacmd_cmd_reg, lba, sec_count); 6457 6458 if (!(spx->txlt_sata_pkt->satapkt_op_mode & SATA_OPMODE_SYNCH)) { 6459 /* Need callback function */ 6460 spx->txlt_sata_pkt->satapkt_comp = sata_txlt_rw_completion; 6461 synch = FALSE; 6462 } else 6463 synch = TRUE; 6464 6465 /* Transfer command to HBA */ 6466 if (sata_hba_start(spx, &rval) != 0) { 6467 /* Pkt not accepted for execution */ 6468 mutex_exit(&SATA_CPORT_MUTEX(shi, cport)); 6469 return (rval); 6470 } 6471 mutex_exit(&SATA_CPORT_MUTEX(shi, cport)); 6472 6473 /* 6474 * If execution is non-synchronous, 6475 * a callback function will handle potential errors, translate 6476 * the response and will do a callback to a target driver. 6477 * If it was synchronous, check execution status using the same 6478 * framework callback. 6479 */ 6480 if (synch) { 6481 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst, 6482 "synchronous execution status %x\n", 6483 spx->txlt_sata_pkt->satapkt_reason); 6484 sata_txlt_rw_completion(spx->txlt_sata_pkt); 6485 } 6486 return (TRAN_ACCEPT); 6487 } 6488 6489 6490 /* 6491 * Implements SCSI SBC WRITE BUFFER command download microcode option 6492 */ 6493 static int 6494 sata_txlt_write_buffer(sata_pkt_txlate_t *spx) 6495 { 6496 #define WB_DOWNLOAD_MICROCODE_AND_REVERT_MODE 4 6497 #define WB_DOWNLOAD_MICROCODE_AND_SAVE_MODE 5 6498 6499 sata_hba_inst_t *sata_hba_inst = SATA_TXLT_HBA_INST(spx); 6500 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt; 6501 struct sata_pkt *sata_pkt = spx->txlt_sata_pkt; 6502 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd; 6503 6504 struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp; 6505 struct scsi_extended_sense *sense; 6506 int rval, mode, sector_count, reason; 6507 int cport = SATA_TXLT_CPORT(spx); 6508 6509 mode = scsipkt->pkt_cdbp[1] & 0x1f; 6510 6511 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst, 6512 "sata_txlt_write_buffer, mode 0x%x\n", mode); 6513 6514 mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx))); 6515 6516 if ((rval = sata_txlt_generic_pkt_info(spx, &reason, 1)) != 6517 TRAN_ACCEPT) { 6518 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); 6519 return (rval); 6520 } 6521 6522 /* Use synchronous mode */ 6523 spx->txlt_sata_pkt->satapkt_op_mode 6524 |= SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS; 6525 6526 scmd->satacmd_flags.sata_data_direction = SATA_DIR_WRITE; 6527 6528 scsipkt->pkt_reason = CMD_CMPLT; 6529 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET | 6530 STATE_SENT_CMD | STATE_GOT_STATUS; 6531 6532 /* 6533 * The SCSI to ATA translation specification only calls 6534 * for WB_DOWNLOAD_MICROCODE_AND_SAVE_MODE. 6535 * WB_DOWNLOAD_MICROC_AND_REVERT_MODE is implemented, but 6536 * ATA 8 (draft) got rid of download microcode for temp 6537 * and it is even optional for ATA 7, so it may be aborted. 6538 * WB_DOWNLOAD_MICROCODE_WITH_OFFSET is not implemented as 6539 * it is not specified and the buffer offset for SCSI is a 16-bit 6540 * value in bytes, but for ATA it is a 16-bit offset in 512 byte 6541 * sectors. Thus the offset really doesn't buy us anything. 6542 * If and when ATA 8 is stabilized and the SCSI to ATA specification 6543 * is revised, this can be revisisted. 6544 */ 6545 /* Reject not supported request */ 6546 switch (mode) { 6547 case WB_DOWNLOAD_MICROCODE_AND_REVERT_MODE: 6548 scmd->satacmd_features_reg = SATA_DOWNLOAD_MCODE_TEMP; 6549 break; 6550 case WB_DOWNLOAD_MICROCODE_AND_SAVE_MODE: 6551 scmd->satacmd_features_reg = SATA_DOWNLOAD_MCODE_SAVE; 6552 break; 6553 default: 6554 goto bad_param; 6555 } 6556 6557 *scsipkt->pkt_scbp = STATUS_GOOD; /* Presumed outcome */ 6558 6559 scmd->satacmd_cmd_reg = SATAC_DOWNLOAD_MICROCODE; 6560 if ((bp->b_bcount % SATA_DISK_SECTOR_SIZE) != 0) 6561 goto bad_param; 6562 sector_count = bp->b_bcount / SATA_DISK_SECTOR_SIZE; 6563 scmd->satacmd_sec_count_lsb = (uint8_t)sector_count; 6564 scmd->satacmd_lba_low_lsb = ((uint16_t)sector_count) >> 8; 6565 scmd->satacmd_lba_mid_lsb = 0; 6566 scmd->satacmd_lba_high_lsb = 0; 6567 scmd->satacmd_device_reg = 0; 6568 spx->txlt_sata_pkt->satapkt_comp = NULL; 6569 scmd->satacmd_addr_type = 0; 6570 6571 /* Transfer command to HBA */ 6572 if (sata_hba_start(spx, &rval) != 0) { 6573 /* Pkt not accepted for execution */ 6574 mutex_exit(&SATA_CPORT_MUTEX(sata_hba_inst, cport)); 6575 return (rval); 6576 } 6577 6578 mutex_exit(&SATA_CPORT_MUTEX(sata_hba_inst, cport)); 6579 6580 /* Then we need synchronous check the status of the disk */ 6581 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET | 6582 STATE_SENT_CMD | STATE_XFERRED_DATA | STATE_GOT_STATUS; 6583 if (sata_pkt->satapkt_reason == SATA_PKT_COMPLETED) { 6584 scsipkt->pkt_reason = CMD_CMPLT; 6585 6586 /* Download commmand succeed, so probe and identify device */ 6587 sata_reidentify_device(spx); 6588 } else { 6589 /* Something went wrong, microcode download command failed */ 6590 scsipkt->pkt_reason = CMD_INCOMPLETE; 6591 *scsipkt->pkt_scbp = STATUS_CHECK; 6592 sense = sata_arq_sense(spx); 6593 switch (sata_pkt->satapkt_reason) { 6594 case SATA_PKT_PORT_ERROR: 6595 /* 6596 * We have no device data. Assume no data transfered. 6597 */ 6598 sense->es_key = KEY_HARDWARE_ERROR; 6599 break; 6600 6601 case SATA_PKT_DEV_ERROR: 6602 if (sata_pkt->satapkt_cmd.satacmd_status_reg & 6603 SATA_STATUS_ERR) { 6604 /* 6605 * determine dev error reason from error 6606 * reg content 6607 */ 6608 sata_decode_device_error(spx, sense); 6609 break; 6610 } 6611 /* No extended sense key - no info available */ 6612 break; 6613 6614 case SATA_PKT_TIMEOUT: 6615 scsipkt->pkt_reason = CMD_TIMEOUT; 6616 scsipkt->pkt_statistics |= 6617 STAT_TIMEOUT | STAT_DEV_RESET; 6618 /* No extended sense key ? */ 6619 break; 6620 6621 case SATA_PKT_ABORTED: 6622 scsipkt->pkt_reason = CMD_ABORTED; 6623 scsipkt->pkt_statistics |= STAT_ABORTED; 6624 /* No extended sense key ? */ 6625 break; 6626 6627 case SATA_PKT_RESET: 6628 /* pkt aborted by an explicit reset from a host */ 6629 scsipkt->pkt_reason = CMD_RESET; 6630 scsipkt->pkt_statistics |= STAT_DEV_RESET; 6631 break; 6632 6633 default: 6634 SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN, 6635 "sata_txlt_nodata_cmd_completion: " 6636 "invalid packet completion reason %d", 6637 sata_pkt->satapkt_reason)); 6638 scsipkt->pkt_reason = CMD_TRAN_ERR; 6639 break; 6640 } 6641 6642 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst, 6643 "scsi_pkt completion reason %x\n", scsipkt->pkt_reason); 6644 6645 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0) 6646 /* scsi callback required */ 6647 scsi_hba_pkt_comp(scsipkt); 6648 } 6649 return (TRAN_ACCEPT); 6650 6651 bad_param: 6652 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); 6653 *scsipkt->pkt_scbp = STATUS_CHECK; 6654 sense = sata_arq_sense(spx); 6655 sense->es_key = KEY_ILLEGAL_REQUEST; 6656 sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB; 6657 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 && 6658 scsipkt->pkt_comp != NULL) { 6659 /* scsi callback required */ 6660 if (servicing_interrupt()) { 6661 if (taskq_dispatch(SATA_TXLT_TASKQ(spx), 6662 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp, 6663 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) == NULL) { 6664 return (TRAN_BUSY); 6665 } 6666 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx), 6667 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp, 6668 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) { 6669 /* Scheduling the callback failed */ 6670 return (TRAN_BUSY); 6671 } 6672 } 6673 return (rval); 6674 } 6675 6676 /* 6677 * Re-identify device after doing a firmware download. 6678 */ 6679 static void 6680 sata_reidentify_device(sata_pkt_txlate_t *spx) 6681 { 6682 #define DOWNLOAD_WAIT_TIME_SECS 60 6683 #define DOWNLOAD_WAIT_INTERVAL_SECS 1 6684 int rval; 6685 int retry_cnt; 6686 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt; 6687 sata_hba_inst_t *sata_hba_inst = spx->txlt_sata_hba_inst; 6688 sata_device_t sata_device = spx->txlt_sata_pkt->satapkt_device; 6689 sata_drive_info_t *sdinfo; 6690 6691 /* 6692 * Before returning good status, probe device. 6693 * Device probing will get IDENTIFY DEVICE data, if possible. 6694 * The assumption is that the new microcode is applied by the 6695 * device. It is a caller responsibility to verify this. 6696 */ 6697 for (retry_cnt = 0; 6698 retry_cnt < DOWNLOAD_WAIT_TIME_SECS / DOWNLOAD_WAIT_INTERVAL_SECS; 6699 retry_cnt++) { 6700 rval = sata_probe_device(sata_hba_inst, &sata_device); 6701 6702 if (rval == SATA_SUCCESS) { /* Set default features */ 6703 sdinfo = sata_get_device_info(sata_hba_inst, 6704 &sata_device); 6705 if (sata_initialize_device(sata_hba_inst, sdinfo) != 6706 SATA_SUCCESS) { 6707 /* retry */ 6708 rval = sata_initialize_device(sata_hba_inst, 6709 sdinfo); 6710 if (rval == SATA_RETRY) 6711 sata_log(sata_hba_inst, CE_WARN, 6712 "SATA device at port %d pmport %d -" 6713 " default device features could not" 6714 " be set. Device may not operate " 6715 "as expected.", 6716 sata_device.satadev_addr.cport, 6717 sata_device.satadev_addr.pmport); 6718 } 6719 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0) 6720 scsi_hba_pkt_comp(scsipkt); 6721 return; 6722 } else if (rval == SATA_RETRY) { 6723 delay(drv_usectohz(1000000 * 6724 DOWNLOAD_WAIT_INTERVAL_SECS)); 6725 continue; 6726 } else /* failed - no reason to retry */ 6727 break; 6728 } 6729 6730 /* 6731 * Something went wrong, device probing failed. 6732 */ 6733 SATA_LOG_D((sata_hba_inst, CE_WARN, 6734 "Cannot probe device after downloading microcode\n")); 6735 6736 /* Reset device to force retrying the probe. */ 6737 (void) (*SATA_RESET_DPORT_FUNC(sata_hba_inst)) 6738 (SATA_DIP(sata_hba_inst), &sata_device); 6739 6740 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0) 6741 scsi_hba_pkt_comp(scsipkt); 6742 } 6743 6744 6745 /* 6746 * Translate command: Synchronize Cache. 6747 * Translates into Flush Cache command for SATA hard disks. 6748 * 6749 * Returns TRAN_ACCEPT or code returned by sata_hba_start() and 6750 * appropriate values in scsi_pkt fields. 6751 */ 6752 static int 6753 sata_txlt_synchronize_cache(sata_pkt_txlate_t *spx) 6754 { 6755 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd; 6756 sata_hba_inst_t *shi = SATA_TXLT_HBA_INST(spx); 6757 int cport = SATA_TXLT_CPORT(spx); 6758 int rval, reason; 6759 int synch; 6760 6761 mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx))); 6762 6763 if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 1)) != 6764 TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) { 6765 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); 6766 return (rval); 6767 } 6768 6769 scmd->satacmd_addr_type = 0; 6770 scmd->satacmd_cmd_reg = SATAC_FLUSH_CACHE; 6771 scmd->satacmd_device_reg = 0; 6772 scmd->satacmd_sec_count_lsb = 0; 6773 scmd->satacmd_lba_low_lsb = 0; 6774 scmd->satacmd_lba_mid_lsb = 0; 6775 scmd->satacmd_lba_high_lsb = 0; 6776 scmd->satacmd_features_reg = 0; 6777 scmd->satacmd_status_reg = 0; 6778 scmd->satacmd_error_reg = 0; 6779 6780 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst, 6781 "sata_txlt_synchronize_cache\n", NULL); 6782 6783 if (!(spx->txlt_sata_pkt->satapkt_op_mode & SATA_OPMODE_SYNCH)) { 6784 /* Need to set-up a callback function */ 6785 spx->txlt_sata_pkt->satapkt_comp = 6786 sata_txlt_nodata_cmd_completion; 6787 synch = FALSE; 6788 } else 6789 synch = TRUE; 6790 6791 /* Transfer command to HBA */ 6792 if (sata_hba_start(spx, &rval) != 0) { 6793 /* Pkt not accepted for execution */ 6794 mutex_exit(&SATA_CPORT_MUTEX(shi, cport)); 6795 return (rval); 6796 } 6797 mutex_exit(&SATA_CPORT_MUTEX(shi, cport)); 6798 6799 /* 6800 * If execution non-synchronous, it had to be completed 6801 * a callback function will handle potential errors, translate 6802 * the response and will do a callback to a target driver. 6803 * If it was synchronous, check status, using the same 6804 * framework callback. 6805 */ 6806 if (synch) { 6807 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst, 6808 "synchronous execution status %x\n", 6809 spx->txlt_sata_pkt->satapkt_reason); 6810 sata_txlt_nodata_cmd_completion(spx->txlt_sata_pkt); 6811 } 6812 return (TRAN_ACCEPT); 6813 } 6814 6815 6816 /* 6817 * Send pkt to SATA HBA driver 6818 * 6819 * This function may be called only if the operation is requested by scsi_pkt, 6820 * i.e. scsi_pkt is not NULL. 6821 * 6822 * This function has to be called with cport mutex held. It does release 6823 * the mutex when it calls HBA driver sata_tran_start function and 6824 * re-acquires it afterwards. 6825 * 6826 * If return value is 0, pkt was accepted, -1 otherwise 6827 * rval is set to appropriate sata_scsi_start return value. 6828 * 6829 * Note 1:If HBA driver returns value other than TRAN_ACCEPT, it should not 6830 * have called the sata_pkt callback function for this packet. 6831 * 6832 * The scsi callback has to be performed by the caller of this routine. 6833 */ 6834 static int 6835 sata_hba_start(sata_pkt_txlate_t *spx, int *rval) 6836 { 6837 int stat; 6838 uint8_t cport = SATA_TXLT_CPORT(spx); 6839 uint8_t pmport = SATA_TXLT_PMPORT(spx); 6840 sata_hba_inst_t *sata_hba_inst = spx->txlt_sata_hba_inst; 6841 sata_drive_info_t *sdinfo; 6842 sata_pmult_info_t *pminfo; 6843 sata_pmport_info_t *pmportinfo = NULL; 6844 sata_device_t *sata_device = NULL; 6845 uint8_t cmd; 6846 struct sata_cmd_flags cmd_flags; 6847 6848 ASSERT(spx->txlt_sata_pkt != NULL); 6849 6850 ASSERT(mutex_owned(&SATA_CPORT_MUTEX(sata_hba_inst, cport))); 6851 6852 sdinfo = sata_get_device_info(sata_hba_inst, 6853 &spx->txlt_sata_pkt->satapkt_device); 6854 ASSERT(sdinfo != NULL); 6855 6856 /* Clear device reset state? */ 6857 /* qual should be XXX_DPMPORT, but add XXX_PMPORT in case */ 6858 if (sdinfo->satadrv_addr.qual == SATA_ADDR_DPMPORT || 6859 sdinfo->satadrv_addr.qual == SATA_ADDR_PMPORT) { 6860 6861 /* 6862 * Get the pmult_info of the its parent port multiplier, all 6863 * sub-devices share a common device reset flags on in 6864 * pmult_info. 6865 */ 6866 pminfo = SATA_PMULT_INFO(sata_hba_inst, cport); 6867 pmportinfo = pminfo->pmult_dev_port[pmport]; 6868 ASSERT(pminfo != NULL); 6869 if (pminfo->pmult_event_flags & SATA_EVNT_CLEAR_DEVICE_RESET) { 6870 spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags. 6871 sata_clear_dev_reset = B_TRUE; 6872 pminfo->pmult_event_flags &= 6873 ~SATA_EVNT_CLEAR_DEVICE_RESET; 6874 SATADBG1(SATA_DBG_EVENTS, sata_hba_inst, 6875 "sata_hba_start: clearing device reset state" 6876 "on pmult.\n", NULL); 6877 } 6878 } else { 6879 if (sdinfo->satadrv_event_flags & 6880 SATA_EVNT_CLEAR_DEVICE_RESET) { 6881 spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags. 6882 sata_clear_dev_reset = B_TRUE; 6883 sdinfo->satadrv_event_flags &= 6884 ~SATA_EVNT_CLEAR_DEVICE_RESET; 6885 SATADBG1(SATA_DBG_EVENTS, sata_hba_inst, 6886 "sata_hba_start: clearing device reset state\n", 6887 NULL); 6888 } 6889 } 6890 6891 cmd = spx->txlt_sata_pkt->satapkt_cmd.satacmd_cmd_reg; 6892 cmd_flags = spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags; 6893 sata_device = &spx->txlt_sata_pkt->satapkt_device; 6894 6895 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport))); 6896 6897 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst, 6898 "Sata cmd 0x%2x\n", cmd); 6899 6900 stat = (*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst), 6901 spx->txlt_sata_pkt); 6902 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport))); 6903 /* 6904 * If sata pkt was accepted and executed in asynchronous mode, i.e. 6905 * with the sata callback, the sata_pkt could be already destroyed 6906 * by the time we check ther return status from the hba_start() 6907 * function, because sata_scsi_destroy_pkt() could have been already 6908 * called (perhaps in the interrupt context). So, in such case, there 6909 * should be no references to it. In other cases, sata_pkt still 6910 * exists. 6911 */ 6912 if (stat == SATA_TRAN_ACCEPTED) { 6913 /* 6914 * pkt accepted for execution. 6915 * If it was executed synchronously, it is already completed 6916 * and pkt completion_reason indicates completion status. 6917 */ 6918 *rval = TRAN_ACCEPT; 6919 return (0); 6920 } 6921 6922 sdinfo = sata_get_device_info(sata_hba_inst, sata_device); 6923 switch (stat) { 6924 case SATA_TRAN_QUEUE_FULL: 6925 /* 6926 * Controller detected queue full condition. 6927 */ 6928 SATADBG1(SATA_DBG_HBA_IF, sata_hba_inst, 6929 "sata_hba_start: queue full\n", NULL); 6930 6931 spx->txlt_scsi_pkt->pkt_reason = CMD_INCOMPLETE; 6932 *spx->txlt_scsi_pkt->pkt_scbp = STATUS_QFULL; 6933 6934 *rval = TRAN_BUSY; 6935 break; 6936 6937 case SATA_TRAN_PORT_ERROR: 6938 /* 6939 * Communication/link with device or general port error 6940 * detected before pkt execution begun. 6941 */ 6942 if (spx->txlt_sata_pkt->satapkt_device.satadev_addr.qual == 6943 SATA_ADDR_CPORT || 6944 spx->txlt_sata_pkt->satapkt_device.satadev_addr.qual == 6945 SATA_ADDR_DCPORT) 6946 sata_log(sata_hba_inst, CE_CONT, 6947 "SATA port %d error", 6948 sata_device->satadev_addr.cport); 6949 else 6950 sata_log(sata_hba_inst, CE_CONT, 6951 "SATA port %d:%d error\n", 6952 sata_device->satadev_addr.cport, 6953 sata_device->satadev_addr.pmport); 6954 6955 /* 6956 * Update the port/device structure. 6957 * sata_pkt should be still valid. Since port error is 6958 * returned, sata_device content should reflect port 6959 * state - it means, that sata address have been changed, 6960 * because original packet's sata address refered to a device 6961 * attached to some port. 6962 */ 6963 if (sata_device->satadev_addr.qual == SATA_ADDR_DPMPORT || 6964 sata_device->satadev_addr.qual == SATA_ADDR_PMPORT) { 6965 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport))); 6966 mutex_enter(&pmportinfo->pmport_mutex); 6967 sata_update_pmport_info(sata_hba_inst, sata_device); 6968 mutex_exit(&pmportinfo->pmport_mutex); 6969 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport))); 6970 } else { 6971 sata_update_port_info(sata_hba_inst, sata_device); 6972 } 6973 6974 spx->txlt_scsi_pkt->pkt_reason = CMD_TRAN_ERR; 6975 *rval = TRAN_FATAL_ERROR; 6976 break; 6977 6978 case SATA_TRAN_CMD_UNSUPPORTED: 6979 /* 6980 * Command rejected by HBA as unsupported. It was HBA driver 6981 * that rejected the command, command was not sent to 6982 * an attached device. 6983 */ 6984 if ((sdinfo != NULL) && 6985 (sdinfo->satadrv_state & SATA_DSTATE_RESET)) 6986 SATADBG1(SATA_DBG_EVENTS, sata_hba_inst, 6987 "sat_hba_start: cmd 0x%2x rejected " 6988 "with SATA_TRAN_CMD_UNSUPPORTED status\n", cmd); 6989 6990 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport))); 6991 (void) sata_txlt_invalid_command(spx); 6992 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport))); 6993 6994 *rval = TRAN_ACCEPT; 6995 break; 6996 6997 case SATA_TRAN_BUSY: 6998 /* 6999 * Command rejected by HBA because other operation prevents 7000 * accepting the packet, or device is in RESET condition. 7001 */ 7002 if (sdinfo != NULL) { 7003 sdinfo->satadrv_state = 7004 spx->txlt_sata_pkt->satapkt_device.satadev_state; 7005 7006 if (sdinfo->satadrv_state & SATA_DSTATE_RESET) { 7007 SATADBG1(SATA_DBG_EVENTS, sata_hba_inst, 7008 "sata_hba_start: cmd 0x%2x rejected " 7009 "because of device reset condition\n", 7010 cmd); 7011 } else { 7012 SATADBG1(SATA_DBG_EVENTS, sata_hba_inst, 7013 "sata_hba_start: cmd 0x%2x rejected " 7014 "with SATA_TRAN_BUSY status\n", 7015 cmd); 7016 } 7017 } 7018 spx->txlt_scsi_pkt->pkt_reason = CMD_INCOMPLETE; 7019 *rval = TRAN_BUSY; 7020 break; 7021 7022 default: 7023 /* Unrecognized HBA response */ 7024 SATA_LOG_D((sata_hba_inst, CE_WARN, 7025 "sata_hba_start: unrecognized HBA response " 7026 "to cmd : 0x%2x resp 0x%x", cmd, rval)); 7027 spx->txlt_scsi_pkt->pkt_reason = CMD_TRAN_ERR; 7028 *rval = TRAN_FATAL_ERROR; 7029 break; 7030 } 7031 7032 /* 7033 * If we got here, the packet was rejected. 7034 * Check if we need to remember reset state clearing request 7035 */ 7036 if (cmd_flags.sata_clear_dev_reset) { 7037 /* 7038 * Check if device is still configured - it may have 7039 * disapeared from the configuration 7040 */ 7041 sdinfo = sata_get_device_info(sata_hba_inst, sata_device); 7042 if (sdinfo != NULL) { 7043 /* 7044 * Restore the flag that requests clearing of 7045 * the device reset state, 7046 * so the next sata packet may carry it to HBA. 7047 */ 7048 if (sdinfo->satadrv_addr.qual == SATA_ADDR_PMPORT || 7049 sdinfo->satadrv_addr.qual == SATA_ADDR_DPMPORT) { 7050 pminfo->pmult_event_flags |= 7051 SATA_EVNT_CLEAR_DEVICE_RESET; 7052 } else { 7053 sdinfo->satadrv_event_flags |= 7054 SATA_EVNT_CLEAR_DEVICE_RESET; 7055 } 7056 } 7057 } 7058 return (-1); 7059 } 7060 7061 /* 7062 * Scsi response setup for invalid LBA 7063 * 7064 * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields. 7065 */ 7066 static int 7067 sata_txlt_lba_out_of_range(sata_pkt_txlate_t *spx) 7068 { 7069 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt; 7070 struct scsi_extended_sense *sense; 7071 7072 scsipkt->pkt_reason = CMD_CMPLT; 7073 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET | 7074 STATE_SENT_CMD | STATE_GOT_STATUS; 7075 *scsipkt->pkt_scbp = STATUS_CHECK; 7076 7077 *scsipkt->pkt_scbp = STATUS_CHECK; 7078 sense = sata_arq_sense(spx); 7079 sense->es_key = KEY_ILLEGAL_REQUEST; 7080 sense->es_add_code = SD_SCSI_ASC_LBA_OUT_OF_RANGE; 7081 7082 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst, 7083 "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason); 7084 7085 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 && 7086 scsipkt->pkt_comp != NULL) { 7087 /* scsi callback required */ 7088 if (servicing_interrupt()) { 7089 if (taskq_dispatch(SATA_TXLT_TASKQ(spx), 7090 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp, 7091 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) == NULL) { 7092 return (TRAN_BUSY); 7093 } 7094 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx), 7095 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp, 7096 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) { 7097 /* Scheduling the callback failed */ 7098 return (TRAN_BUSY); 7099 } 7100 } 7101 return (TRAN_ACCEPT); 7102 } 7103 7104 7105 /* 7106 * Analyze device status and error registers and translate them into 7107 * appropriate scsi sense codes. 7108 * NOTE: non-packet commands only for now 7109 */ 7110 static void 7111 sata_decode_device_error(sata_pkt_txlate_t *spx, 7112 struct scsi_extended_sense *sense) 7113 { 7114 uint8_t err_reg = spx->txlt_sata_pkt->satapkt_cmd.satacmd_error_reg; 7115 7116 ASSERT(sense != NULL); 7117 ASSERT(spx->txlt_sata_pkt->satapkt_cmd.satacmd_status_reg & 7118 SATA_STATUS_ERR); 7119 7120 7121 if (err_reg & SATA_ERROR_ICRC) { 7122 sense->es_key = KEY_ABORTED_COMMAND; 7123 sense->es_add_code = 0x08; /* Communication failure */ 7124 return; 7125 } 7126 7127 if (err_reg & SATA_ERROR_UNC) { 7128 sense->es_key = KEY_MEDIUM_ERROR; 7129 /* Information bytes (LBA) need to be set by a caller */ 7130 return; 7131 } 7132 7133 /* ADD HERE: MC error bit handling for ATAPI CD/DVD */ 7134 if (err_reg & (SATA_ERROR_MCR | SATA_ERROR_NM)) { 7135 sense->es_key = KEY_UNIT_ATTENTION; 7136 sense->es_add_code = 0x3a; /* No media present */ 7137 return; 7138 } 7139 7140 if (err_reg & SATA_ERROR_IDNF) { 7141 if (err_reg & SATA_ERROR_ABORT) { 7142 sense->es_key = KEY_ABORTED_COMMAND; 7143 } else { 7144 sense->es_key = KEY_ILLEGAL_REQUEST; 7145 sense->es_add_code = 0x21; /* LBA out of range */ 7146 } 7147 return; 7148 } 7149 7150 if (err_reg & SATA_ERROR_ABORT) { 7151 ASSERT(spx->txlt_sata_pkt != NULL); 7152 sense->es_key = KEY_ABORTED_COMMAND; 7153 return; 7154 } 7155 } 7156 7157 /* 7158 * Extract error LBA from sata_pkt.satapkt_cmd register fields 7159 */ 7160 static void 7161 sata_extract_error_lba(sata_pkt_txlate_t *spx, uint64_t *lba) 7162 { 7163 sata_cmd_t *sata_cmd = &spx->txlt_sata_pkt->satapkt_cmd; 7164 7165 *lba = 0; 7166 if (sata_cmd->satacmd_addr_type == ATA_ADDR_LBA48) { 7167 *lba = sata_cmd->satacmd_lba_high_msb; 7168 *lba = (*lba << 8) | sata_cmd->satacmd_lba_mid_msb; 7169 *lba = (*lba << 8) | sata_cmd->satacmd_lba_low_msb; 7170 } else if (sata_cmd->satacmd_addr_type == ATA_ADDR_LBA28) { 7171 *lba = sata_cmd->satacmd_device_reg & 0xf; 7172 } 7173 *lba = (*lba << 8) | sata_cmd->satacmd_lba_high_lsb; 7174 *lba = (*lba << 8) | sata_cmd->satacmd_lba_mid_lsb; 7175 *lba = (*lba << 8) | sata_cmd->satacmd_lba_low_lsb; 7176 } 7177 7178 /* 7179 * This is fixed sense format - if LBA exceeds the info field size, 7180 * no valid info will be returned (valid bit in extended sense will 7181 * be set to 0). 7182 */ 7183 static struct scsi_extended_sense * 7184 sata_arq_sense(sata_pkt_txlate_t *spx) 7185 { 7186 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt; 7187 struct scsi_arq_status *arqs; 7188 struct scsi_extended_sense *sense; 7189 7190 /* Fill ARQ sense data */ 7191 scsipkt->pkt_state |= STATE_ARQ_DONE; 7192 arqs = (struct scsi_arq_status *)scsipkt->pkt_scbp; 7193 *(uchar_t *)&arqs->sts_status = STATUS_CHECK; 7194 *(uchar_t *)&arqs->sts_rqpkt_status = STATUS_GOOD; 7195 arqs->sts_rqpkt_reason = CMD_CMPLT; 7196 arqs->sts_rqpkt_state = STATE_GOT_BUS | STATE_GOT_TARGET | 7197 STATE_XFERRED_DATA | STATE_SENT_CMD | STATE_GOT_STATUS; 7198 arqs->sts_rqpkt_resid = 0; 7199 sense = &arqs->sts_sensedata; 7200 bzero(sense, sizeof (struct scsi_extended_sense)); 7201 sata_fixed_sense_data_preset(sense); 7202 return (sense); 7203 } 7204 7205 /* 7206 * ATA Pass Through support 7207 * Sets flags indicating that an invalid value was found in some 7208 * field in the command. It could be something illegal according to 7209 * the SAT-2 spec or it could be a feature that is not (yet?) 7210 * supported. 7211 */ 7212 static int 7213 sata_txlt_ata_pass_thru_illegal_cmd(sata_pkt_txlate_t *spx) 7214 { 7215 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt; 7216 struct scsi_extended_sense *sense = sata_arq_sense(spx); 7217 7218 scsipkt->pkt_reason = CMD_CMPLT; 7219 *scsipkt->pkt_scbp = STATUS_CHECK; 7220 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET | 7221 STATE_SENT_CMD | STATE_GOT_STATUS; 7222 7223 sense = sata_arq_sense(spx); 7224 sense->es_key = KEY_ILLEGAL_REQUEST; 7225 sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB; 7226 7227 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 && 7228 scsipkt->pkt_comp != NULL) { 7229 /* scsi callback required */ 7230 if (servicing_interrupt()) { 7231 if (taskq_dispatch(SATA_TXLT_TASKQ(spx), 7232 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp, 7233 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) == NULL) { 7234 return (TRAN_BUSY); 7235 } 7236 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx), 7237 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp, 7238 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) { 7239 /* Scheduling the callback failed */ 7240 return (TRAN_BUSY); 7241 } 7242 } 7243 7244 return (TRAN_ACCEPT); 7245 } 7246 7247 /* 7248 * The UNMAP command considers it not to be an error if the parameter length 7249 * or block descriptor length is 0. For this case, there is nothing for TRIM 7250 * to do so just complete the command. 7251 */ 7252 static int 7253 sata_txlt_unmap_nodata_cmd(sata_pkt_txlate_t *spx) 7254 { 7255 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt; 7256 7257 scsipkt->pkt_reason = CMD_CMPLT; 7258 *scsipkt->pkt_scbp = STATUS_GOOD; 7259 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET | 7260 STATE_SENT_CMD | STATE_GOT_STATUS; 7261 7262 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 && 7263 scsipkt->pkt_comp != NULL) { 7264 /* scsi callback required */ 7265 if (taskq_dispatch(SATA_TXLT_TASKQ(spx), 7266 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp, 7267 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) { 7268 /* Scheduling the callback failed */ 7269 return (TRAN_BUSY); 7270 } 7271 } 7272 7273 return (TRAN_ACCEPT); 7274 } 7275 7276 /* 7277 * Emulated SATA Read/Write command completion for zero-length requests. 7278 * This request always succedes, so in synchronous mode it always returns 7279 * TRAN_ACCEPT, and in non-synchronous mode it may return TRAN_BUSY if the 7280 * callback cannot be scheduled. 7281 */ 7282 static int 7283 sata_emul_rw_completion(sata_pkt_txlate_t *spx) 7284 { 7285 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt; 7286 7287 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET | 7288 STATE_SENT_CMD | STATE_GOT_STATUS; 7289 scsipkt->pkt_reason = CMD_CMPLT; 7290 *scsipkt->pkt_scbp = STATUS_GOOD; 7291 if (!(spx->txlt_sata_pkt->satapkt_op_mode & SATA_OPMODE_SYNCH)) { 7292 /* scsi callback required - have to schedule it */ 7293 if (servicing_interrupt()) { 7294 if (taskq_dispatch(SATA_TXLT_TASKQ(spx), 7295 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp, 7296 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) == NULL) { 7297 return (TRAN_BUSY); 7298 } 7299 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx), 7300 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp, 7301 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) { 7302 /* Scheduling the callback failed */ 7303 return (TRAN_BUSY); 7304 } 7305 } 7306 return (TRAN_ACCEPT); 7307 } 7308 7309 7310 /* 7311 * Translate completion status of SATA read/write commands into scsi response. 7312 * pkt completion_reason is checked to determine the completion status. 7313 * Do scsi callback if necessary. 7314 * 7315 * Note: this function may be called also for synchronously executed 7316 * commands. 7317 * This function may be used only if scsi_pkt is non-NULL. 7318 */ 7319 static void 7320 sata_txlt_rw_completion(sata_pkt_t *sata_pkt) 7321 { 7322 sata_pkt_txlate_t *spx = 7323 (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private; 7324 sata_cmd_t *scmd = &sata_pkt->satapkt_cmd; 7325 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt; 7326 struct scsi_extended_sense *sense; 7327 uint64_t lba; 7328 struct buf *bp; 7329 int rval; 7330 if (sata_pkt->satapkt_reason == SATA_PKT_COMPLETED) { 7331 /* Normal completion */ 7332 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET | 7333 STATE_SENT_CMD | STATE_XFERRED_DATA | STATE_GOT_STATUS; 7334 scsipkt->pkt_reason = CMD_CMPLT; 7335 *scsipkt->pkt_scbp = STATUS_GOOD; 7336 if (spx->txlt_tmp_buf != NULL) { 7337 /* Temporary buffer was used */ 7338 bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp; 7339 if (bp->b_flags & B_READ) { 7340 rval = ddi_dma_sync( 7341 spx->txlt_buf_dma_handle, 0, 0, 7342 DDI_DMA_SYNC_FORCPU); 7343 ASSERT(rval == DDI_SUCCESS); 7344 bcopy(spx->txlt_tmp_buf, bp->b_un.b_addr, 7345 bp->b_bcount); 7346 } 7347 } 7348 } else { 7349 /* 7350 * Something went wrong - analyze return 7351 */ 7352 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET | 7353 STATE_SENT_CMD | STATE_GOT_STATUS; 7354 scsipkt->pkt_reason = CMD_INCOMPLETE; 7355 *scsipkt->pkt_scbp = STATUS_CHECK; 7356 sense = sata_arq_sense(spx); 7357 ASSERT(sense != NULL); 7358 7359 /* 7360 * SATA_PKT_DEV_ERROR is the only case where we may be able to 7361 * extract from device registers the failing LBA. 7362 */ 7363 if (sata_pkt->satapkt_reason == SATA_PKT_DEV_ERROR) { 7364 if ((scmd->satacmd_addr_type == ATA_ADDR_LBA48) && 7365 (scmd->satacmd_lba_mid_msb != 0 || 7366 scmd->satacmd_lba_high_msb != 0)) { 7367 /* 7368 * We have problem reporting this cmd LBA 7369 * in fixed sense data format, because of 7370 * the size of the scsi LBA fields. 7371 */ 7372 sense->es_valid = 0; 7373 } else { 7374 sata_extract_error_lba(spx, &lba); 7375 sense->es_info_1 = (lba & 0xFF000000) >> 24; 7376 sense->es_info_2 = (lba & 0xFF0000) >> 16; 7377 sense->es_info_3 = (lba & 0xFF00) >> 8; 7378 sense->es_info_4 = lba & 0xFF; 7379 } 7380 } else { 7381 /* Invalid extended sense info */ 7382 sense->es_valid = 0; 7383 } 7384 7385 switch (sata_pkt->satapkt_reason) { 7386 case SATA_PKT_PORT_ERROR: 7387 /* We may want to handle DEV GONE state as well */ 7388 /* 7389 * We have no device data. Assume no data transfered. 7390 */ 7391 sense->es_key = KEY_HARDWARE_ERROR; 7392 break; 7393 7394 case SATA_PKT_DEV_ERROR: 7395 if (sata_pkt->satapkt_cmd.satacmd_status_reg & 7396 SATA_STATUS_ERR) { 7397 /* 7398 * determine dev error reason from error 7399 * reg content 7400 */ 7401 sata_decode_device_error(spx, sense); 7402 if (sense->es_key == KEY_MEDIUM_ERROR) { 7403 switch (scmd->satacmd_cmd_reg) { 7404 case SATAC_READ_DMA: 7405 case SATAC_READ_DMA_EXT: 7406 case SATAC_READ_DMA_QUEUED: 7407 case SATAC_READ_DMA_QUEUED_EXT: 7408 case SATAC_READ_FPDMA_QUEUED: 7409 /* Unrecovered read error */ 7410 sense->es_add_code = 7411 SD_SCSI_ASC_UNREC_READ_ERR; 7412 break; 7413 case SATAC_WRITE_DMA: 7414 case SATAC_WRITE_DMA_EXT: 7415 case SATAC_WRITE_DMA_QUEUED: 7416 case SATAC_WRITE_DMA_QUEUED_EXT: 7417 case SATAC_WRITE_FPDMA_QUEUED: 7418 /* Write error */ 7419 sense->es_add_code = 7420 SD_SCSI_ASC_WRITE_ERR; 7421 break; 7422 default: 7423 /* Internal error */ 7424 SATA_LOG_D(( 7425 spx->txlt_sata_hba_inst, 7426 CE_WARN, 7427 "sata_txlt_rw_completion :" 7428 "internal error - invalid " 7429 "command 0x%2x", 7430 scmd->satacmd_cmd_reg)); 7431 break; 7432 } 7433 } 7434 break; 7435 } 7436 /* No extended sense key - no info available */ 7437 scsipkt->pkt_reason = CMD_INCOMPLETE; 7438 break; 7439 7440 case SATA_PKT_TIMEOUT: 7441 scsipkt->pkt_reason = CMD_TIMEOUT; 7442 scsipkt->pkt_statistics |= 7443 STAT_TIMEOUT | STAT_DEV_RESET; 7444 sense->es_key = KEY_ABORTED_COMMAND; 7445 break; 7446 7447 case SATA_PKT_ABORTED: 7448 scsipkt->pkt_reason = CMD_ABORTED; 7449 scsipkt->pkt_statistics |= STAT_ABORTED; 7450 sense->es_key = KEY_ABORTED_COMMAND; 7451 break; 7452 7453 case SATA_PKT_RESET: 7454 scsipkt->pkt_reason = CMD_RESET; 7455 scsipkt->pkt_statistics |= STAT_DEV_RESET; 7456 sense->es_key = KEY_ABORTED_COMMAND; 7457 break; 7458 7459 default: 7460 SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN, 7461 "sata_txlt_rw_completion: " 7462 "invalid packet completion reason")); 7463 scsipkt->pkt_reason = CMD_TRAN_ERR; 7464 break; 7465 } 7466 } 7467 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst, 7468 "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason); 7469 7470 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0) 7471 /* scsi callback required */ 7472 scsi_hba_pkt_comp(scsipkt); 7473 } 7474 7475 7476 /* 7477 * Translate completion status of non-data commands (i.e. commands returning 7478 * no data). 7479 * pkt completion_reason is checked to determine the completion status. 7480 * Do scsi callback if necessary (FLAG_NOINTR == 0) 7481 * 7482 * Note: this function may be called also for synchronously executed 7483 * commands. 7484 * This function may be used only if scsi_pkt is non-NULL. 7485 */ 7486 7487 static void 7488 sata_txlt_nodata_cmd_completion(sata_pkt_t *sata_pkt) 7489 { 7490 sata_pkt_txlate_t *spx = 7491 (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private; 7492 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt; 7493 7494 sata_set_arq_data(sata_pkt); 7495 7496 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0) 7497 /* scsi callback required */ 7498 scsi_hba_pkt_comp(scsipkt); 7499 } 7500 7501 /* 7502 * Completion handler for ATA Pass Through command 7503 */ 7504 static void 7505 sata_txlt_apt_completion(sata_pkt_t *sata_pkt) 7506 { 7507 sata_pkt_txlate_t *spx = 7508 (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private; 7509 sata_cmd_t *scmd = &sata_pkt->satapkt_cmd; 7510 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt; 7511 struct buf *bp; 7512 uint8_t sense_key = 0, addl_sense_code = 0, addl_sense_qual = 0; 7513 7514 if (sata_pkt->satapkt_reason == SATA_PKT_COMPLETED) { 7515 /* Normal completion */ 7516 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET | 7517 STATE_SENT_CMD | STATE_XFERRED_DATA | STATE_GOT_STATUS; 7518 scsipkt->pkt_reason = CMD_CMPLT; 7519 *scsipkt->pkt_scbp = STATUS_GOOD; 7520 7521 /* 7522 * If the command has CK_COND set 7523 */ 7524 if (scsipkt->pkt_cdbp[2] & SATL_APT_BM_CK_COND) { 7525 *scsipkt->pkt_scbp = STATUS_CHECK; 7526 sata_fill_ata_return_desc(sata_pkt, 7527 KEY_RECOVERABLE_ERROR, 7528 SD_SCSI_ASC_ATP_INFO_AVAIL, 0); 7529 } 7530 7531 if (spx->txlt_tmp_buf != NULL) { 7532 /* Temporary buffer was used */ 7533 bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp; 7534 if (bp->b_flags & B_READ) { 7535 bcopy(spx->txlt_tmp_buf, bp->b_un.b_addr, 7536 bp->b_bcount); 7537 } 7538 } 7539 } else { 7540 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET | 7541 STATE_SENT_CMD | STATE_GOT_STATUS; 7542 scsipkt->pkt_reason = CMD_INCOMPLETE; 7543 *scsipkt->pkt_scbp = STATUS_CHECK; 7544 7545 /* 7546 * If DF or ERR was set, the HBA should have copied out the 7547 * status and error registers to the satacmd structure. 7548 */ 7549 if (scmd->satacmd_status_reg & SATA_STATUS_DF) { 7550 sense_key = KEY_HARDWARE_ERROR; 7551 addl_sense_code = SD_SCSI_ASC_INTERNAL_TARGET_FAILURE; 7552 addl_sense_qual = 0; 7553 } else if (scmd->satacmd_status_reg & SATA_STATUS_ERR) { 7554 if (scmd->satacmd_error_reg & SATA_ERROR_NM) { 7555 sense_key = KEY_NOT_READY; 7556 addl_sense_code = 7557 SD_SCSI_ASC_MEDIUM_NOT_PRESENT; 7558 addl_sense_qual = 0; 7559 } else if (scmd->satacmd_error_reg & SATA_ERROR_UNC) { 7560 sense_key = KEY_MEDIUM_ERROR; 7561 addl_sense_code = SD_SCSI_ASC_UNREC_READ_ERR; 7562 addl_sense_qual = 0; 7563 } else if (scmd->satacmd_error_reg & SATA_ERROR_ILI) { 7564 sense_key = KEY_DATA_PROTECT; 7565 addl_sense_code = SD_SCSI_ASC_WRITE_PROTECTED; 7566 addl_sense_qual = 0; 7567 } else if (scmd->satacmd_error_reg & SATA_ERROR_IDNF) { 7568 sense_key = KEY_ILLEGAL_REQUEST; 7569 addl_sense_code = SD_SCSI_ASC_LBA_OUT_OF_RANGE; 7570 addl_sense_qual = 0; 7571 } else if (scmd->satacmd_error_reg & SATA_ERROR_ABORT) { 7572 sense_key = KEY_ABORTED_COMMAND; 7573 addl_sense_code = SD_SCSI_ASC_NO_ADD_SENSE; 7574 addl_sense_qual = 0; 7575 } else if (scmd->satacmd_error_reg & SATA_ERROR_MC) { 7576 sense_key = KEY_UNIT_ATTENTION; 7577 addl_sense_code = 7578 SD_SCSI_ASC_MEDIUM_MAY_HAVE_CHANGED; 7579 addl_sense_qual = 0; 7580 } else if (scmd->satacmd_error_reg & SATA_ERROR_MCR) { 7581 sense_key = KEY_UNIT_ATTENTION; 7582 addl_sense_code = SD_SCSI_ASC_OP_MEDIUM_REM_REQ; 7583 addl_sense_qual = 0; 7584 } else if (scmd->satacmd_error_reg & SATA_ERROR_ICRC) { 7585 sense_key = KEY_ABORTED_COMMAND; 7586 addl_sense_code = 7587 SD_SCSI_ASC_INFO_UNIT_IUCRC_ERR; 7588 addl_sense_qual = 0; 7589 } 7590 } 7591 7592 sata_fill_ata_return_desc(sata_pkt, sense_key, addl_sense_code, 7593 addl_sense_qual); 7594 } 7595 7596 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0) 7597 /* scsi callback required */ 7598 scsi_hba_pkt_comp(scsipkt); 7599 } 7600 7601 /* 7602 * Completion handler for unmap translation command 7603 */ 7604 static void 7605 sata_txlt_unmap_completion(sata_pkt_t *sata_pkt) 7606 { 7607 sata_pkt_txlate_t *spx = 7608 (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private; 7609 sata_cmd_t *scmd = &sata_pkt->satapkt_cmd; 7610 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt; 7611 struct buf *bp; 7612 uint8_t sense_key = 0, addl_sense_code = 0, addl_sense_qual = 0; 7613 7614 if (sata_pkt->satapkt_reason == SATA_PKT_COMPLETED) { 7615 /* Normal completion */ 7616 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET | 7617 STATE_SENT_CMD | STATE_XFERRED_DATA | STATE_GOT_STATUS; 7618 scsipkt->pkt_reason = CMD_CMPLT; 7619 *scsipkt->pkt_scbp = STATUS_GOOD; 7620 7621 if (spx->txlt_tmp_buf != NULL) { 7622 /* Temporary buffer was used */ 7623 bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp; 7624 if (bp->b_flags & B_READ) { 7625 bcopy(spx->txlt_tmp_buf, bp->b_un.b_addr, 7626 bp->b_bcount); 7627 } 7628 } 7629 } else { 7630 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET | 7631 STATE_SENT_CMD | STATE_GOT_STATUS; 7632 scsipkt->pkt_reason = CMD_INCOMPLETE; 7633 *scsipkt->pkt_scbp = STATUS_CHECK; 7634 7635 /* 7636 * If DF or ERR was set, the HBA should have copied out the 7637 * status and error registers to the satacmd structure. 7638 */ 7639 if (scmd->satacmd_status_reg & SATA_STATUS_DF) { 7640 sense_key = KEY_HARDWARE_ERROR; 7641 addl_sense_code = SD_SCSI_ASC_INTERNAL_TARGET_FAILURE; 7642 addl_sense_qual = 0; 7643 } else if (scmd->satacmd_status_reg & SATA_STATUS_ERR) { 7644 if (scmd->satacmd_error_reg & SATA_ERROR_NM) { 7645 sense_key = KEY_NOT_READY; 7646 addl_sense_code = 7647 SD_SCSI_ASC_MEDIUM_NOT_PRESENT; 7648 addl_sense_qual = 0; 7649 } else if (scmd->satacmd_error_reg & SATA_ERROR_UNC) { 7650 sense_key = KEY_MEDIUM_ERROR; 7651 addl_sense_code = SD_SCSI_ASC_WRITE_ERR; 7652 addl_sense_qual = 0; 7653 } else if (scmd->satacmd_error_reg & SATA_ERROR_ILI) { 7654 sense_key = KEY_DATA_PROTECT; 7655 addl_sense_code = SD_SCSI_ASC_WRITE_PROTECTED; 7656 addl_sense_qual = 0; 7657 } else if (scmd->satacmd_error_reg & SATA_ERROR_IDNF) { 7658 sense_key = KEY_ILLEGAL_REQUEST; 7659 addl_sense_code = SD_SCSI_ASC_LBA_OUT_OF_RANGE; 7660 addl_sense_qual = 0; 7661 } else if (scmd->satacmd_error_reg & SATA_ERROR_ABORT) { 7662 sense_key = KEY_ABORTED_COMMAND; 7663 addl_sense_code = SD_SCSI_ASC_NO_ADD_SENSE; 7664 addl_sense_qual = 0; 7665 } else if (scmd->satacmd_error_reg & SATA_ERROR_MC) { 7666 sense_key = KEY_UNIT_ATTENTION; 7667 addl_sense_code = 7668 SD_SCSI_ASC_MEDIUM_MAY_HAVE_CHANGED; 7669 addl_sense_qual = 0; 7670 } else if (scmd->satacmd_error_reg & SATA_ERROR_MCR) { 7671 sense_key = KEY_UNIT_ATTENTION; 7672 addl_sense_code = SD_SCSI_ASC_OP_MEDIUM_REM_REQ; 7673 addl_sense_qual = 0; 7674 } else if (scmd->satacmd_error_reg & SATA_ERROR_ICRC) { 7675 sense_key = KEY_ABORTED_COMMAND; 7676 addl_sense_code = 7677 SD_SCSI_ASC_INFO_UNIT_IUCRC_ERR; 7678 addl_sense_qual = 0; 7679 } 7680 } 7681 7682 sata_fill_ata_return_desc(sata_pkt, sense_key, addl_sense_code, 7683 addl_sense_qual); 7684 } 7685 7686 sata_free_local_buffer(spx); 7687 7688 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0) 7689 /* scsi callback required */ 7690 scsi_hba_pkt_comp(scsipkt); 7691 } 7692 7693 /* 7694 * 7695 */ 7696 static void 7697 sata_fill_ata_return_desc(sata_pkt_t *sata_pkt, uint8_t sense_key, 7698 uint8_t addl_sense_code, uint8_t addl_sense_qual) 7699 { 7700 sata_pkt_txlate_t *spx = 7701 (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private; 7702 sata_cmd_t *scmd = &sata_pkt->satapkt_cmd; 7703 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt; 7704 struct sata_apt_sense_data *apt_sd = 7705 (struct sata_apt_sense_data *)scsipkt->pkt_scbp; 7706 struct scsi_descr_sense_hdr *sds = &(apt_sd->apt_sd_hdr); 7707 struct scsi_ata_status_ret_sense_descr *ata_ret_desc = 7708 &(apt_sd->apt_sd_sense); 7709 int extend = 0; 7710 7711 if ((scsipkt->pkt_cdbp[0] == SPC3_CMD_ATA_COMMAND_PASS_THROUGH16) && 7712 (scsipkt->pkt_cdbp[2] & SATL_APT_BM_EXTEND)) 7713 extend = 1; 7714 7715 scsipkt->pkt_state |= STATE_ARQ_DONE; 7716 7717 /* update the residual count */ 7718 *(uchar_t *)&apt_sd->apt_status = STATUS_CHECK; 7719 *(uchar_t *)&apt_sd->apt_rqpkt_status = STATUS_GOOD; 7720 apt_sd->apt_rqpkt_reason = CMD_CMPLT; 7721 apt_sd->apt_rqpkt_state = STATE_GOT_BUS | STATE_GOT_TARGET | 7722 STATE_XFERRED_DATA | STATE_SENT_CMD | STATE_GOT_STATUS; 7723 apt_sd->apt_rqpkt_resid = scsipkt->pkt_scblen - 7724 sizeof (struct sata_apt_sense_data); 7725 7726 /* 7727 * Fill in the Descriptor sense header 7728 */ 7729 bzero(sds, sizeof (struct scsi_descr_sense_hdr)); 7730 sds->ds_code = CODE_FMT_DESCR_CURRENT; 7731 sds->ds_class = CLASS_EXTENDED_SENSE; 7732 sds->ds_key = sense_key & 0xf; 7733 sds->ds_add_code = addl_sense_code; 7734 sds->ds_qual_code = addl_sense_qual; 7735 sds->ds_addl_sense_length = 7736 sizeof (struct scsi_ata_status_ret_sense_descr); 7737 7738 /* 7739 * Fill in the ATA Return descriptor sense data 7740 */ 7741 bzero(ata_ret_desc, sizeof (struct scsi_ata_status_ret_sense_descr)); 7742 ata_ret_desc->ars_descr_type = DESCR_ATA_STATUS_RETURN; 7743 ata_ret_desc->ars_addl_length = 0xc; 7744 ata_ret_desc->ars_error = scmd->satacmd_error_reg; 7745 ata_ret_desc->ars_sec_count_lsb = scmd->satacmd_sec_count_lsb; 7746 ata_ret_desc->ars_lba_low_lsb = scmd->satacmd_lba_low_lsb; 7747 ata_ret_desc->ars_lba_mid_lsb = scmd->satacmd_lba_mid_lsb; 7748 ata_ret_desc->ars_lba_high_lsb = scmd->satacmd_lba_high_lsb; 7749 ata_ret_desc->ars_device = scmd->satacmd_device_reg; 7750 ata_ret_desc->ars_status = scmd->satacmd_status_reg; 7751 7752 if (extend == 1) { 7753 ata_ret_desc->ars_extend = 1; 7754 ata_ret_desc->ars_sec_count_msb = scmd->satacmd_sec_count_msb; 7755 ata_ret_desc->ars_lba_low_msb = scmd->satacmd_lba_low_msb; 7756 ata_ret_desc->ars_lba_mid_msb = scmd->satacmd_lba_mid_msb; 7757 ata_ret_desc->ars_lba_high_msb = scmd->satacmd_lba_high_msb; 7758 } else { 7759 ata_ret_desc->ars_extend = 0; 7760 ata_ret_desc->ars_sec_count_msb = 0; 7761 ata_ret_desc->ars_lba_low_msb = 0; 7762 ata_ret_desc->ars_lba_mid_msb = 0; 7763 ata_ret_desc->ars_lba_high_msb = 0; 7764 } 7765 } 7766 7767 static void 7768 sata_set_arq_data(sata_pkt_t *sata_pkt) 7769 { 7770 sata_pkt_txlate_t *spx = 7771 (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private; 7772 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt; 7773 struct scsi_extended_sense *sense; 7774 7775 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET | 7776 STATE_SENT_CMD | STATE_GOT_STATUS; 7777 if (sata_pkt->satapkt_reason == SATA_PKT_COMPLETED) { 7778 /* Normal completion */ 7779 scsipkt->pkt_reason = CMD_CMPLT; 7780 *scsipkt->pkt_scbp = STATUS_GOOD; 7781 } else { 7782 /* Something went wrong */ 7783 scsipkt->pkt_reason = CMD_INCOMPLETE; 7784 *scsipkt->pkt_scbp = STATUS_CHECK; 7785 sense = sata_arq_sense(spx); 7786 switch (sata_pkt->satapkt_reason) { 7787 case SATA_PKT_PORT_ERROR: 7788 /* 7789 * We have no device data. Assume no data transfered. 7790 */ 7791 sense->es_key = KEY_HARDWARE_ERROR; 7792 break; 7793 7794 case SATA_PKT_DEV_ERROR: 7795 if (sata_pkt->satapkt_cmd.satacmd_status_reg & 7796 SATA_STATUS_ERR) { 7797 /* 7798 * determine dev error reason from error 7799 * reg content 7800 */ 7801 sata_decode_device_error(spx, sense); 7802 break; 7803 } 7804 /* No extended sense key - no info available */ 7805 break; 7806 7807 case SATA_PKT_TIMEOUT: 7808 scsipkt->pkt_reason = CMD_TIMEOUT; 7809 scsipkt->pkt_statistics |= 7810 STAT_TIMEOUT | STAT_DEV_RESET; 7811 /* No extended sense key ? */ 7812 break; 7813 7814 case SATA_PKT_ABORTED: 7815 scsipkt->pkt_reason = CMD_ABORTED; 7816 scsipkt->pkt_statistics |= STAT_ABORTED; 7817 /* No extended sense key ? */ 7818 break; 7819 7820 case SATA_PKT_RESET: 7821 /* pkt aborted by an explicit reset from a host */ 7822 scsipkt->pkt_reason = CMD_RESET; 7823 scsipkt->pkt_statistics |= STAT_DEV_RESET; 7824 break; 7825 7826 default: 7827 SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN, 7828 "sata_txlt_nodata_cmd_completion: " 7829 "invalid packet completion reason %d", 7830 sata_pkt->satapkt_reason)); 7831 scsipkt->pkt_reason = CMD_TRAN_ERR; 7832 break; 7833 } 7834 7835 } 7836 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst, 7837 "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason); 7838 } 7839 7840 7841 /* 7842 * Build Mode sense R/W recovery page 7843 * NOT IMPLEMENTED 7844 */ 7845 7846 static int 7847 sata_build_msense_page_1(sata_drive_info_t *sdinfo, int pcntrl, uint8_t *buf) 7848 { 7849 #ifndef __lock_lint 7850 _NOTE(ARGUNUSED(sdinfo)) 7851 _NOTE(ARGUNUSED(pcntrl)) 7852 _NOTE(ARGUNUSED(buf)) 7853 #endif 7854 return (0); 7855 } 7856 7857 /* 7858 * Build Mode sense caching page - scsi-3 implementation. 7859 * Page length distinguishes previous format from scsi-3 format. 7860 * buf must have space for 0x12 bytes. 7861 * Only DRA (disable read ahead ) and WCE (write cache enable) are changeable. 7862 * 7863 */ 7864 static int 7865 sata_build_msense_page_8(sata_drive_info_t *sdinfo, int pcntrl, uint8_t *buf) 7866 { 7867 struct mode_cache_scsi3 *page = (struct mode_cache_scsi3 *)buf; 7868 sata_id_t *sata_id = &sdinfo->satadrv_id; 7869 7870 /* 7871 * Most of the fields are set to 0, being not supported and/or disabled 7872 */ 7873 bzero(buf, PAGELENGTH_DAD_MODE_CACHE_SCSI3); 7874 7875 /* Saved paramters not supported */ 7876 if (pcntrl == 3) 7877 return (0); 7878 if (pcntrl == 0 || pcntrl == 2) { 7879 /* 7880 * For now treat current and default parameters as same 7881 * That may have to change, if target driver will complain 7882 */ 7883 page->mode_page.code = MODEPAGE_CACHING; /* PS = 0 */ 7884 page->mode_page.length = PAGELENGTH_DAD_MODE_CACHE_SCSI3; 7885 7886 if (SATA_READ_AHEAD_SUPPORTED(*sata_id) && 7887 !SATA_READ_AHEAD_ENABLED(*sata_id)) { 7888 page->dra = 1; /* Read Ahead disabled */ 7889 page->rcd = 1; /* Read Cache disabled */ 7890 } 7891 if (SATA_WRITE_CACHE_SUPPORTED(*sata_id) && 7892 SATA_WRITE_CACHE_ENABLED(*sata_id)) 7893 page->wce = 1; /* Write Cache enabled */ 7894 } else { 7895 /* Changeable parameters */ 7896 page->mode_page.code = MODEPAGE_CACHING; 7897 page->mode_page.length = PAGELENGTH_DAD_MODE_CACHE_SCSI3; 7898 if (SATA_READ_AHEAD_SUPPORTED(*sata_id)) { 7899 page->dra = 1; 7900 page->rcd = 1; 7901 } 7902 if (SATA_WRITE_CACHE_SUPPORTED(*sata_id)) 7903 page->wce = 1; 7904 } 7905 return (PAGELENGTH_DAD_MODE_CACHE_SCSI3 + 7906 sizeof (struct mode_page)); 7907 } 7908 7909 /* 7910 * Build Mode sense exception cntrl page 7911 */ 7912 static int 7913 sata_build_msense_page_1c(sata_drive_info_t *sdinfo, int pcntrl, uint8_t *buf) 7914 { 7915 struct mode_info_excpt_page *page = (struct mode_info_excpt_page *)buf; 7916 sata_id_t *sata_id = &sdinfo->satadrv_id; 7917 7918 /* 7919 * Most of the fields are set to 0, being not supported and/or disabled 7920 */ 7921 bzero(buf, PAGELENGTH_INFO_EXCPT); 7922 7923 page->mode_page.code = MODEPAGE_INFO_EXCPT; 7924 page->mode_page.length = PAGELENGTH_INFO_EXCPT; 7925 7926 /* Indicate that this is page is saveable */ 7927 page->mode_page.ps = 1; 7928 7929 /* 7930 * We will return the same data for default, current and saved page. 7931 * The only changeable bit is dexcpt and that bit is required 7932 * by the ATA specification to be preserved across power cycles. 7933 */ 7934 if (pcntrl != 1) { 7935 page->dexcpt = !(sata_id->ai_features85 & SATA_SMART_SUPPORTED); 7936 page->mrie = MRIE_ONLY_ON_REQUEST; 7937 } 7938 else 7939 page->dexcpt = 1; /* Only changeable parameter */ 7940 7941 return (PAGELENGTH_INFO_EXCPT + sizeof (struct mode_page)); 7942 } 7943 7944 7945 static int 7946 sata_build_msense_page_30(sata_drive_info_t *sdinfo, int pcntrl, uint8_t *buf) 7947 { 7948 struct mode_acoustic_management *page = 7949 (struct mode_acoustic_management *)buf; 7950 sata_id_t *sata_id = &sdinfo->satadrv_id; 7951 7952 /* 7953 * Most of the fields are set to 0, being not supported and/or disabled 7954 */ 7955 bzero(buf, PAGELENGTH_DAD_MODE_ACOUSTIC_MANAGEMENT); 7956 7957 switch (pcntrl) { 7958 case P_CNTRL_DEFAULT: 7959 /* default paramters not supported */ 7960 return (0); 7961 7962 case P_CNTRL_CURRENT: 7963 case P_CNTRL_SAVED: 7964 /* Saved and current are supported and are identical */ 7965 page->mode_page.code = MODEPAGE_ACOUSTIC_MANAG; 7966 page->mode_page.length = 7967 PAGELENGTH_DAD_MODE_ACOUSTIC_MANAGEMENT; 7968 page->mode_page.ps = 1; 7969 7970 /* Word 83 indicates if feature is supported */ 7971 /* If feature is not supported */ 7972 if (!(sata_id->ai_cmdset83 & SATA_ACOUSTIC_MGMT)) { 7973 page->acoustic_manag_enable = 7974 ACOUSTIC_DISABLED; 7975 } else { 7976 page->acoustic_manag_enable = 7977 ((sata_id->ai_features86 & SATA_ACOUSTIC_MGMT) 7978 != 0); 7979 /* Word 94 inidicates the value */ 7980 #ifdef _LITTLE_ENDIAN 7981 page->acoustic_manag_level = 7982 (uchar_t)sata_id->ai_acoustic; 7983 page->vendor_recommended_value = 7984 sata_id->ai_acoustic >> 8; 7985 #else 7986 page->acoustic_manag_level = 7987 sata_id->ai_acoustic >> 8; 7988 page->vendor_recommended_value = 7989 (uchar_t)sata_id->ai_acoustic; 7990 #endif 7991 } 7992 break; 7993 7994 case P_CNTRL_CHANGEABLE: 7995 page->mode_page.code = MODEPAGE_ACOUSTIC_MANAG; 7996 page->mode_page.length = 7997 PAGELENGTH_DAD_MODE_ACOUSTIC_MANAGEMENT; 7998 page->mode_page.ps = 1; 7999 8000 /* Word 83 indicates if the feature is supported */ 8001 if (sata_id->ai_cmdset83 & SATA_ACOUSTIC_MGMT) { 8002 page->acoustic_manag_enable = 8003 ACOUSTIC_ENABLED; 8004 page->acoustic_manag_level = 0xff; 8005 } 8006 break; 8007 } 8008 return (PAGELENGTH_DAD_MODE_ACOUSTIC_MANAGEMENT + 8009 sizeof (struct mode_page)); 8010 } 8011 8012 8013 /* 8014 * Build Mode sense power condition page. 8015 */ 8016 static int 8017 sata_build_msense_page_1a(sata_drive_info_t *sdinfo, int pcntrl, uint8_t *buf) 8018 { 8019 struct mode_info_power_cond *page = (struct mode_info_power_cond *)buf; 8020 sata_id_t *sata_id = &sdinfo->satadrv_id; 8021 8022 /* 8023 * Most of the fields are set to 0, being not supported and/or disabled 8024 * power condition page length was 0x0a 8025 */ 8026 bzero(buf, sizeof (struct mode_info_power_cond)); 8027 8028 if (pcntrl == P_CNTRL_DEFAULT) { 8029 /* default paramters not supported */ 8030 return (0); 8031 } 8032 8033 page->mode_page.code = MODEPAGE_POWER_COND; 8034 page->mode_page.length = sizeof (struct mode_info_power_cond); 8035 8036 if (sata_id->ai_cap && SATA_STANDBYTIMER) { 8037 page->standby = 1; 8038 bcopy(sdinfo->satadrv_standby_timer, page->standby_cond_timer, 8039 sizeof (uchar_t) * 4); 8040 } 8041 8042 return (sizeof (struct mode_info_power_cond)); 8043 } 8044 8045 /* 8046 * Process mode select caching page 8 (scsi3 format only). 8047 * Read Ahead (same as read cache) and Write Cache may be turned on and off 8048 * if these features are supported by the device. If these features are not 8049 * supported, the command will be terminated with STATUS_CHECK. 8050 * This function fails only if the SET FEATURE command sent to 8051 * the device fails. The page format is not verified, assuming that the 8052 * target driver operates correctly - if parameters length is too short, 8053 * we just drop the page. 8054 * Two command may be sent if both Read Cache/Read Ahead and Write Cache 8055 * setting have to be changed. 8056 * SET FEATURE command is executed synchronously, i.e. we wait here until 8057 * it is completed, regardless of the scsi pkt directives. 8058 * 8059 * Note: Mode Select Caching page RCD and DRA bits are tied together, i.e. 8060 * changing DRA will change RCD. 8061 * 8062 * More than one SATA command may be executed to perform operations specified 8063 * by mode select pages. The first error terminates further execution. 8064 * Operations performed successully are not backed-up in such case. 8065 * 8066 * Return SATA_SUCCESS if operation succeeded, SATA_FAILURE otherwise. 8067 * If operation resulted in changing device setup, dmod flag should be set to 8068 * one (1). If parameters were not changed, dmod flag should be set to 0. 8069 * Upon return, if operation required sending command to the device, the rval 8070 * should be set to the value returned by sata_hba_start. If operation 8071 * did not require device access, rval should be set to TRAN_ACCEPT. 8072 * The pagelen should be set to the length of the page. 8073 * 8074 * This function has to be called with a port mutex held. 8075 * 8076 * Returns SATA_SUCCESS if operation was successful, SATA_FAILURE otherwise. 8077 */ 8078 int 8079 sata_mode_select_page_8(sata_pkt_txlate_t *spx, struct mode_cache_scsi3 *page, 8080 int parmlen, int *pagelen, int *rval, int *dmod) 8081 { 8082 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt; 8083 sata_drive_info_t *sdinfo; 8084 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd; 8085 sata_id_t *sata_id; 8086 struct scsi_extended_sense *sense; 8087 int wce, dra; /* Current settings */ 8088 8089 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst, 8090 &spx->txlt_sata_pkt->satapkt_device); 8091 sata_id = &sdinfo->satadrv_id; 8092 *dmod = 0; 8093 8094 /* Verify parameters length. If too short, drop it */ 8095 if ((PAGELENGTH_DAD_MODE_CACHE_SCSI3 + 8096 sizeof (struct mode_page)) > parmlen) { 8097 *scsipkt->pkt_scbp = STATUS_CHECK; 8098 sense = sata_arq_sense(spx); 8099 sense->es_key = KEY_ILLEGAL_REQUEST; 8100 sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_PARAMS_LIST; 8101 *pagelen = parmlen; 8102 *rval = TRAN_ACCEPT; 8103 return (SATA_FAILURE); 8104 } 8105 8106 *pagelen = PAGELENGTH_DAD_MODE_CACHE_SCSI3 + sizeof (struct mode_page); 8107 8108 /* Current setting of Read Ahead (and Read Cache) */ 8109 if (SATA_READ_AHEAD_ENABLED(*sata_id)) 8110 dra = 0; /* 0 == not disabled */ 8111 else 8112 dra = 1; 8113 /* Current setting of Write Cache */ 8114 if (SATA_WRITE_CACHE_ENABLED(*sata_id)) 8115 wce = 1; 8116 else 8117 wce = 0; 8118 8119 if (page->dra == dra && page->wce == wce && page->rcd == dra) { 8120 /* nothing to do */ 8121 *rval = TRAN_ACCEPT; 8122 return (SATA_SUCCESS); 8123 } 8124 8125 /* 8126 * Need to flip some setting 8127 * Set-up Internal SET FEATURES command(s) 8128 */ 8129 scmd->satacmd_flags.sata_data_direction = SATA_DIR_NODATA_XFER; 8130 scmd->satacmd_addr_type = 0; 8131 scmd->satacmd_device_reg = 0; 8132 scmd->satacmd_status_reg = 0; 8133 scmd->satacmd_error_reg = 0; 8134 scmd->satacmd_cmd_reg = SATAC_SET_FEATURES; 8135 if (page->dra != dra || page->rcd != dra) { 8136 if (SATA_READ_AHEAD_SUPPORTED(*sata_id)) { 8137 /* Need to flip read ahead setting */ 8138 if (dra == 0) 8139 /* Disable read ahead / read cache */ 8140 scmd->satacmd_features_reg = 8141 SATAC_SF_DISABLE_READ_AHEAD; 8142 else 8143 /* Enable read ahead / read cache */ 8144 scmd->satacmd_features_reg = 8145 SATAC_SF_ENABLE_READ_AHEAD; 8146 8147 /* Transfer command to HBA */ 8148 if (sata_hba_start(spx, rval) != 0) 8149 /* 8150 * Pkt not accepted for execution. 8151 */ 8152 return (SATA_FAILURE); 8153 8154 *dmod = 1; 8155 8156 /* Now process return */ 8157 if (spx->txlt_sata_pkt->satapkt_reason != 8158 SATA_PKT_COMPLETED) { 8159 goto failure; /* Terminate */ 8160 } 8161 } else { 8162 *scsipkt->pkt_scbp = STATUS_CHECK; 8163 sense = sata_arq_sense(spx); 8164 sense->es_key = KEY_ILLEGAL_REQUEST; 8165 sense->es_add_code = 8166 SD_SCSI_ASC_INVALID_FIELD_IN_PARAMS_LIST; 8167 *pagelen = parmlen; 8168 *rval = TRAN_ACCEPT; 8169 return (SATA_FAILURE); 8170 } 8171 } 8172 8173 /* Note that the packet is not removed, so it could be re-used */ 8174 if (page->wce != wce) { 8175 if (SATA_WRITE_CACHE_SUPPORTED(*sata_id)) { 8176 /* Need to flip Write Cache setting */ 8177 if (page->wce == 1) 8178 /* Enable write cache */ 8179 scmd->satacmd_features_reg = 8180 SATAC_SF_ENABLE_WRITE_CACHE; 8181 else 8182 /* Disable write cache */ 8183 scmd->satacmd_features_reg = 8184 SATAC_SF_DISABLE_WRITE_CACHE; 8185 8186 /* Transfer command to HBA */ 8187 if (sata_hba_start(spx, rval) != 0) 8188 /* 8189 * Pkt not accepted for execution. 8190 */ 8191 return (SATA_FAILURE); 8192 8193 *dmod = 1; 8194 8195 /* Now process return */ 8196 if (spx->txlt_sata_pkt->satapkt_reason != 8197 SATA_PKT_COMPLETED) { 8198 goto failure; 8199 } 8200 } else { 8201 *scsipkt->pkt_scbp = STATUS_CHECK; 8202 sense = sata_arq_sense(spx); 8203 sense->es_key = KEY_ILLEGAL_REQUEST; 8204 sense->es_add_code = 8205 SD_SCSI_ASC_INVALID_FIELD_IN_PARAMS_LIST; 8206 *pagelen = parmlen; 8207 *rval = TRAN_ACCEPT; 8208 return (SATA_FAILURE); 8209 } 8210 } 8211 return (SATA_SUCCESS); 8212 8213 failure: 8214 sata_xlate_errors(spx); 8215 8216 return (SATA_FAILURE); 8217 } 8218 8219 /* 8220 * Process mode select informational exceptions control page 0x1c 8221 * 8222 * The only changeable bit is dexcpt (disable exceptions). 8223 * MRIE (method of reporting informational exceptions) must be 8224 * "only on request". 8225 * This page applies to informational exceptions that report 8226 * additional sense codes with the ADDITIONAL SENSE CODE field set to 5Dh 8227 * (e.g.,FAILURE PREDICTION THRESHOLD EXCEEDED) or 0Bh (e.g., WARNING_). 8228 * Informational exception conditions occur as the result of background scan 8229 * errors, background self-test errors, or vendor specific events within a 8230 * logical unit. An informational exception condition may occur asynchronous 8231 * to any commands. 8232 * 8233 * Returns: SATA_SUCCESS if operation succeeded, SATA_FAILURE otherwise. 8234 * If operation resulted in changing device setup, dmod flag should be set to 8235 * one (1). If parameters were not changed, dmod flag should be set to 0. 8236 * Upon return, if operation required sending command to the device, the rval 8237 * should be set to the value returned by sata_hba_start. If operation 8238 * did not require device access, rval should be set to TRAN_ACCEPT. 8239 * The pagelen should be set to the length of the page. 8240 * 8241 * This function has to be called with a port mutex held. 8242 * 8243 * Returns SATA_SUCCESS if operation was successful, SATA_FAILURE otherwise. 8244 * 8245 * Cannot be called in the interrupt context. 8246 */ 8247 static int 8248 sata_mode_select_page_1c( 8249 sata_pkt_txlate_t *spx, 8250 struct mode_info_excpt_page *page, 8251 int parmlen, 8252 int *pagelen, 8253 int *rval, 8254 int *dmod) 8255 { 8256 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt; 8257 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd; 8258 sata_drive_info_t *sdinfo; 8259 sata_id_t *sata_id; 8260 struct scsi_extended_sense *sense; 8261 8262 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst, 8263 &spx->txlt_sata_pkt->satapkt_device); 8264 sata_id = &sdinfo->satadrv_id; 8265 8266 *dmod = 0; 8267 8268 /* Verify parameters length. If too short, drop it */ 8269 if (((PAGELENGTH_INFO_EXCPT + sizeof (struct mode_page)) > parmlen) || 8270 page->perf || page->test || (page->mrie != MRIE_ONLY_ON_REQUEST)) { 8271 *scsipkt->pkt_scbp = STATUS_CHECK; 8272 sense = sata_arq_sense(spx); 8273 sense->es_key = KEY_ILLEGAL_REQUEST; 8274 sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_PARAMS_LIST; 8275 *pagelen = parmlen; 8276 *rval = TRAN_ACCEPT; 8277 return (SATA_FAILURE); 8278 } 8279 8280 *pagelen = PAGELENGTH_INFO_EXCPT + sizeof (struct mode_page); 8281 8282 if (! (sata_id->ai_cmdset82 & SATA_SMART_SUPPORTED)) { 8283 *scsipkt->pkt_scbp = STATUS_CHECK; 8284 sense = sata_arq_sense(spx); 8285 sense->es_key = KEY_ILLEGAL_REQUEST; 8286 sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB; 8287 *pagelen = parmlen; 8288 *rval = TRAN_ACCEPT; 8289 return (SATA_FAILURE); 8290 } 8291 8292 /* If already in the state requested, we are done */ 8293 if (page->dexcpt == ! (sata_id->ai_features85 & SATA_SMART_ENABLED)) { 8294 /* nothing to do */ 8295 *rval = TRAN_ACCEPT; 8296 return (SATA_SUCCESS); 8297 } 8298 8299 scmd->satacmd_flags.sata_data_direction = SATA_DIR_NODATA_XFER; 8300 8301 /* Build SMART_ENABLE or SMART_DISABLE command */ 8302 scmd->satacmd_addr_type = 0; /* N/A */ 8303 scmd->satacmd_lba_mid_lsb = SMART_MAGIC_VAL_1; 8304 scmd->satacmd_lba_high_lsb = SMART_MAGIC_VAL_2; 8305 scmd->satacmd_features_reg = page->dexcpt ? 8306 SATA_SMART_DISABLE_OPS : SATA_SMART_ENABLE_OPS; 8307 scmd->satacmd_device_reg = 0; /* Always device 0 */ 8308 scmd->satacmd_cmd_reg = SATAC_SMART; 8309 8310 /* Transfer command to HBA */ 8311 if (sata_hba_start(spx, rval) != 0) 8312 /* 8313 * Pkt not accepted for execution. 8314 */ 8315 return (SATA_FAILURE); 8316 8317 *dmod = 1; /* At least may have been modified */ 8318 8319 /* Now process return */ 8320 if (spx->txlt_sata_pkt->satapkt_reason == SATA_PKT_COMPLETED) 8321 return (SATA_SUCCESS); 8322 8323 /* Packet did not complete successfully */ 8324 sata_xlate_errors(spx); 8325 8326 return (SATA_FAILURE); 8327 } 8328 8329 /* 8330 * Process mode select acoustic management control page 0x30 8331 * 8332 * 8333 * This function has to be called with a port mutex held. 8334 * 8335 * Returns SATA_SUCCESS if operation was successful, SATA_FAILURE otherwise. 8336 * 8337 * Cannot be called in the interrupt context. 8338 */ 8339 int 8340 sata_mode_select_page_30(sata_pkt_txlate_t *spx, struct 8341 mode_acoustic_management *page, int parmlen, int *pagelen, 8342 int *rval, int *dmod) 8343 { 8344 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt; 8345 sata_drive_info_t *sdinfo; 8346 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd; 8347 sata_id_t *sata_id; 8348 struct scsi_extended_sense *sense; 8349 8350 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst, 8351 &spx->txlt_sata_pkt->satapkt_device); 8352 sata_id = &sdinfo->satadrv_id; 8353 *dmod = 0; 8354 8355 /* If parmlen is too short or the feature is not supported, drop it */ 8356 if (((PAGELENGTH_DAD_MODE_ACOUSTIC_MANAGEMENT + 8357 sizeof (struct mode_page)) > parmlen) || 8358 (! (sata_id->ai_cmdset83 & SATA_ACOUSTIC_MGMT))) { 8359 *scsipkt->pkt_scbp = STATUS_CHECK; 8360 sense = sata_arq_sense(spx); 8361 sense->es_key = KEY_ILLEGAL_REQUEST; 8362 sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_PARAMS_LIST; 8363 *pagelen = parmlen; 8364 *rval = TRAN_ACCEPT; 8365 return (SATA_FAILURE); 8366 } 8367 8368 *pagelen = PAGELENGTH_DAD_MODE_ACOUSTIC_MANAGEMENT + 8369 sizeof (struct mode_page); 8370 8371 /* 8372 * We can enable and disable acoustice management and 8373 * set the acoustic management level. 8374 */ 8375 8376 /* 8377 * Set-up Internal SET FEATURES command(s) 8378 */ 8379 scmd->satacmd_flags.sata_data_direction = SATA_DIR_NODATA_XFER; 8380 scmd->satacmd_addr_type = 0; 8381 scmd->satacmd_device_reg = 0; 8382 scmd->satacmd_status_reg = 0; 8383 scmd->satacmd_error_reg = 0; 8384 scmd->satacmd_cmd_reg = SATAC_SET_FEATURES; 8385 if (page->acoustic_manag_enable) { 8386 scmd->satacmd_features_reg = SATAC_SF_ENABLE_ACOUSTIC; 8387 scmd->satacmd_sec_count_lsb = page->acoustic_manag_level; 8388 } else { /* disabling acoustic management */ 8389 scmd->satacmd_features_reg = SATAC_SF_DISABLE_ACOUSTIC; 8390 } 8391 8392 /* Transfer command to HBA */ 8393 if (sata_hba_start(spx, rval) != 0) 8394 /* 8395 * Pkt not accepted for execution. 8396 */ 8397 return (SATA_FAILURE); 8398 8399 /* Now process return */ 8400 if (spx->txlt_sata_pkt->satapkt_reason != SATA_PKT_COMPLETED) { 8401 sata_xlate_errors(spx); 8402 return (SATA_FAILURE); 8403 } 8404 8405 *dmod = 1; 8406 8407 return (SATA_SUCCESS); 8408 } 8409 8410 /* 8411 * Process mode select power condition page 0x1a 8412 * 8413 * This function has to be called with a port mutex held. 8414 * 8415 * Returns SATA_SUCCESS if operation was successful, SATA_FAILURE otherwise. 8416 * 8417 * Cannot be called in the interrupt context. 8418 */ 8419 int 8420 sata_mode_select_page_1a(sata_pkt_txlate_t *spx, struct 8421 mode_info_power_cond *page, int parmlen, int *pagelen, 8422 int *rval, int *dmod) 8423 { 8424 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt; 8425 sata_drive_info_t *sdinfo; 8426 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd; 8427 sata_id_t *sata_id; 8428 struct scsi_extended_sense *sense; 8429 uint8_t ata_count; 8430 int i, len; 8431 8432 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst, 8433 &spx->txlt_sata_pkt->satapkt_device); 8434 sata_id = &sdinfo->satadrv_id; 8435 *dmod = 0; 8436 8437 len = sizeof (struct mode_info_power_cond); 8438 len += sizeof (struct mode_page); 8439 8440 /* If parmlen is too short or the feature is not supported, drop it */ 8441 if ((len < parmlen) || (page->idle == 1) || 8442 (!(sata_id->ai_cap && SATA_STANDBYTIMER) && page->standby == 1)) { 8443 *scsipkt->pkt_scbp = STATUS_CHECK; 8444 sense = sata_arq_sense(spx); 8445 sense->es_key = KEY_ILLEGAL_REQUEST; 8446 sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_PARAMS_LIST; 8447 *pagelen = parmlen; 8448 *rval = TRAN_ACCEPT; 8449 return (SATA_FAILURE); 8450 } 8451 8452 *pagelen = len; 8453 8454 /* 8455 * Set-up Internal STANDBY command(s) 8456 */ 8457 if (page->standby == 0) 8458 goto out; 8459 8460 ata_count = sata_get_standby_timer(page->standby_cond_timer); 8461 8462 scmd->satacmd_addr_type = 0; 8463 scmd->satacmd_sec_count_lsb = ata_count; 8464 scmd->satacmd_lba_low_lsb = 0; 8465 scmd->satacmd_lba_mid_lsb = 0; 8466 scmd->satacmd_lba_high_lsb = 0; 8467 scmd->satacmd_features_reg = 0; 8468 scmd->satacmd_device_reg = 0; 8469 scmd->satacmd_status_reg = 0; 8470 scmd->satacmd_cmd_reg = SATAC_STANDBY; 8471 scmd->satacmd_flags.sata_special_regs = B_TRUE; 8472 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE; 8473 8474 /* Transfer command to HBA */ 8475 if (sata_hba_start(spx, rval) != 0) { 8476 return (SATA_FAILURE); 8477 } else { 8478 if ((scmd->satacmd_error_reg != 0) || 8479 (spx->txlt_sata_pkt->satapkt_reason != 8480 SATA_PKT_COMPLETED)) { 8481 sata_xlate_errors(spx); 8482 return (SATA_FAILURE); 8483 } 8484 } 8485 8486 for (i = 0; i < 4; i++) { 8487 sdinfo->satadrv_standby_timer[i] = page->standby_cond_timer[i]; 8488 } 8489 out: 8490 *dmod = 1; 8491 return (SATA_SUCCESS); 8492 } 8493 8494 /* 8495 * sata_build_lsense_page0() is used to create the 8496 * SCSI LOG SENSE page 0 (supported log pages) 8497 * 8498 * Currently supported pages are 0, 0x10, 0x2f, 0x30 and 0x0e 8499 * (supported log pages, self-test results, informational exceptions 8500 * Sun vendor specific ATA SMART data, and start stop cycle counter). 8501 * 8502 * Takes a sata_drive_info t * and the address of a buffer 8503 * in which to create the page information. 8504 * 8505 * Returns the number of bytes valid in the buffer. 8506 */ 8507 static int 8508 sata_build_lsense_page_0(sata_drive_info_t *sdinfo, uint8_t *buf) 8509 { 8510 struct log_parameter *lpp = (struct log_parameter *)buf; 8511 uint8_t *page_ptr = (uint8_t *)lpp->param_values; 8512 int num_pages_supported = 1; /* Always have GET_SUPPORTED_LOG_PAGES */ 8513 sata_id_t *sata_id = &sdinfo->satadrv_id; 8514 8515 lpp->param_code[0] = 0; 8516 lpp->param_code[1] = 0; 8517 lpp->param_ctrl_flags = LOG_CTRL_LP | LOG_CTRL_LBIN; 8518 *page_ptr++ = PAGE_CODE_GET_SUPPORTED_LOG_PAGES; 8519 8520 if (sata_id->ai_cmdset82 & SATA_SMART_SUPPORTED) { 8521 if (sata_id->ai_cmdset84 & SATA_SMART_SELF_TEST_SUPPORTED) { 8522 *page_ptr++ = PAGE_CODE_SELF_TEST_RESULTS; 8523 ++num_pages_supported; 8524 } 8525 *page_ptr++ = PAGE_CODE_INFORMATION_EXCEPTIONS; 8526 ++num_pages_supported; 8527 *page_ptr++ = PAGE_CODE_SMART_READ_DATA; 8528 ++num_pages_supported; 8529 *page_ptr++ = PAGE_CODE_START_STOP_CYCLE_COUNTER; 8530 ++num_pages_supported; 8531 } 8532 8533 lpp->param_len = num_pages_supported; 8534 8535 return ((&lpp->param_values[0] - (uint8_t *)lpp) + 8536 num_pages_supported); 8537 } 8538 8539 /* 8540 * sata_build_lsense_page_10() is used to create the 8541 * SCSI LOG SENSE page 0x10 (self-test results) 8542 * 8543 * Takes a sata_drive_info t * and the address of a buffer 8544 * in which to create the page information as well as a sata_hba_inst_t *. 8545 * 8546 * Returns the number of bytes valid in the buffer. 8547 * 8548 * Note: Self test and SMART data is accessible in device log pages. 8549 * The log pages can be accessed by SMART READ/WRITE LOG (up to 255 sectors 8550 * of data can be transferred by a single command), or by the General Purpose 8551 * Logging commands (GPL) READ LOG EXT and WRITE LOG EXT (up to 65,535 sectors 8552 * - approximately 33MB - can be transferred by a single command. 8553 * The SCT Command response (either error or command) is the same for both 8554 * the SMART and GPL methods of issuing commands. 8555 * This function uses READ LOG EXT command when drive supports LBA48, and 8556 * SMART READ command otherwise. 8557 * 8558 * Since above commands are executed in a synchronous mode, this function 8559 * should not be called in an interrupt context. 8560 */ 8561 static int 8562 sata_build_lsense_page_10( 8563 sata_drive_info_t *sdinfo, 8564 uint8_t *buf, 8565 sata_hba_inst_t *sata_hba_inst) 8566 { 8567 struct log_parameter *lpp = (struct log_parameter *)buf; 8568 int rval; 8569 8570 if (sdinfo->satadrv_features_support & SATA_DEV_F_LBA48) { 8571 struct smart_ext_selftest_log *ext_selftest_log; 8572 8573 ext_selftest_log = kmem_zalloc( 8574 sizeof (struct smart_ext_selftest_log), KM_SLEEP); 8575 8576 rval = sata_ext_smart_selftest_read_log(sata_hba_inst, sdinfo, 8577 ext_selftest_log, 0); 8578 if (rval == 0) { 8579 int index, start_index; 8580 struct smart_ext_selftest_log_entry *entry; 8581 static const struct smart_ext_selftest_log_entry empty = 8582 {0}; 8583 uint16_t block_num; 8584 int count; 8585 boolean_t only_one_block = B_FALSE; 8586 8587 index = ext_selftest_log-> 8588 smart_ext_selftest_log_index[0]; 8589 index |= ext_selftest_log-> 8590 smart_ext_selftest_log_index[1] << 8; 8591 if (index == 0) 8592 goto out; 8593 8594 --index; /* Correct for 0 origin */ 8595 start_index = index; /* remember where we started */ 8596 block_num = index / ENTRIES_PER_EXT_SELFTEST_LOG_BLK; 8597 if (block_num != 0) { 8598 rval = sata_ext_smart_selftest_read_log( 8599 sata_hba_inst, sdinfo, ext_selftest_log, 8600 block_num); 8601 if (rval != 0) 8602 goto out; 8603 } 8604 index %= ENTRIES_PER_EXT_SELFTEST_LOG_BLK; 8605 entry = 8606 &ext_selftest_log-> 8607 smart_ext_selftest_log_entries[index]; 8608 8609 for (count = 1; 8610 count <= SCSI_ENTRIES_IN_LOG_SENSE_SELFTEST_RESULTS; 8611 ++count) { 8612 uint8_t status; 8613 uint8_t code; 8614 uint8_t sense_key; 8615 uint8_t add_sense_code; 8616 uint8_t add_sense_code_qual; 8617 8618 /* If this is an unused entry, we are done */ 8619 if (bcmp(entry, &empty, sizeof (empty)) == 0) { 8620 /* Broken firmware on some disks */ 8621 if (index + 1 == 8622 ENTRIES_PER_EXT_SELFTEST_LOG_BLK) { 8623 --entry; 8624 --index; 8625 if (bcmp(entry, &empty, 8626 sizeof (empty)) == 0) 8627 goto out; 8628 } else 8629 goto out; 8630 } 8631 8632 if (only_one_block && 8633 start_index == index) 8634 goto out; 8635 8636 lpp->param_code[0] = 0; 8637 lpp->param_code[1] = count; 8638 lpp->param_ctrl_flags = 8639 LOG_CTRL_LP | LOG_CTRL_LBIN; 8640 lpp->param_len = 8641 SCSI_LOG_SENSE_SELFTEST_PARAM_LEN; 8642 8643 status = entry->smart_ext_selftest_log_status; 8644 status >>= 4; 8645 switch (status) { 8646 case 0: 8647 default: 8648 sense_key = KEY_NO_SENSE; 8649 add_sense_code = 8650 SD_SCSI_ASC_NO_ADD_SENSE; 8651 add_sense_code_qual = 0; 8652 break; 8653 case 1: 8654 sense_key = KEY_ABORTED_COMMAND; 8655 add_sense_code = 8656 DIAGNOSTIC_FAILURE_ON_COMPONENT; 8657 add_sense_code_qual = SCSI_COMPONENT_81; 8658 break; 8659 case 2: 8660 sense_key = KEY_ABORTED_COMMAND; 8661 add_sense_code = 8662 DIAGNOSTIC_FAILURE_ON_COMPONENT; 8663 add_sense_code_qual = SCSI_COMPONENT_82; 8664 break; 8665 case 3: 8666 sense_key = KEY_ABORTED_COMMAND; 8667 add_sense_code = 8668 DIAGNOSTIC_FAILURE_ON_COMPONENT; 8669 add_sense_code_qual = SCSI_COMPONENT_83; 8670 break; 8671 case 4: 8672 sense_key = KEY_HARDWARE_ERROR; 8673 add_sense_code = 8674 DIAGNOSTIC_FAILURE_ON_COMPONENT; 8675 add_sense_code_qual = SCSI_COMPONENT_84; 8676 break; 8677 case 5: 8678 sense_key = KEY_HARDWARE_ERROR; 8679 add_sense_code = 8680 DIAGNOSTIC_FAILURE_ON_COMPONENT; 8681 add_sense_code_qual = SCSI_COMPONENT_85; 8682 break; 8683 case 6: 8684 sense_key = KEY_HARDWARE_ERROR; 8685 add_sense_code = 8686 DIAGNOSTIC_FAILURE_ON_COMPONENT; 8687 add_sense_code_qual = SCSI_COMPONENT_86; 8688 break; 8689 case 7: 8690 sense_key = KEY_MEDIUM_ERROR; 8691 add_sense_code = 8692 DIAGNOSTIC_FAILURE_ON_COMPONENT; 8693 add_sense_code_qual = SCSI_COMPONENT_87; 8694 break; 8695 case 8: 8696 sense_key = KEY_HARDWARE_ERROR; 8697 add_sense_code = 8698 DIAGNOSTIC_FAILURE_ON_COMPONENT; 8699 add_sense_code_qual = SCSI_COMPONENT_88; 8700 break; 8701 } 8702 code = 0; /* unspecified */ 8703 status |= (code << 4); 8704 lpp->param_values[0] = status; 8705 lpp->param_values[1] = 0; /* unspecified */ 8706 lpp->param_values[2] = entry-> 8707 smart_ext_selftest_log_timestamp[1]; 8708 lpp->param_values[3] = entry-> 8709 smart_ext_selftest_log_timestamp[0]; 8710 if (status != 0) { 8711 lpp->param_values[4] = 0; 8712 lpp->param_values[5] = 0; 8713 lpp->param_values[6] = entry-> 8714 smart_ext_selftest_log_failing_lba 8715 [5]; 8716 lpp->param_values[7] = entry-> 8717 smart_ext_selftest_log_failing_lba 8718 [4]; 8719 lpp->param_values[8] = entry-> 8720 smart_ext_selftest_log_failing_lba 8721 [3]; 8722 lpp->param_values[9] = entry-> 8723 smart_ext_selftest_log_failing_lba 8724 [2]; 8725 lpp->param_values[10] = entry-> 8726 smart_ext_selftest_log_failing_lba 8727 [1]; 8728 lpp->param_values[11] = entry-> 8729 smart_ext_selftest_log_failing_lba 8730 [0]; 8731 } else { /* No bad block address */ 8732 lpp->param_values[4] = 0xff; 8733 lpp->param_values[5] = 0xff; 8734 lpp->param_values[6] = 0xff; 8735 lpp->param_values[7] = 0xff; 8736 lpp->param_values[8] = 0xff; 8737 lpp->param_values[9] = 0xff; 8738 lpp->param_values[10] = 0xff; 8739 lpp->param_values[11] = 0xff; 8740 } 8741 8742 lpp->param_values[12] = sense_key; 8743 lpp->param_values[13] = add_sense_code; 8744 lpp->param_values[14] = add_sense_code_qual; 8745 lpp->param_values[15] = 0; /* undefined */ 8746 8747 lpp = (struct log_parameter *) 8748 (((uint8_t *)lpp) + 8749 SCSI_LOG_PARAM_HDR_LEN + 8750 SCSI_LOG_SENSE_SELFTEST_PARAM_LEN); 8751 8752 --index; /* Back up to previous entry */ 8753 if (index < 0) { 8754 if (block_num > 0) { 8755 --block_num; 8756 } else { 8757 struct read_log_ext_directory 8758 logdir; 8759 8760 rval = 8761 sata_read_log_ext_directory( 8762 sata_hba_inst, sdinfo, 8763 &logdir); 8764 if (rval == -1) 8765 goto out; 8766 if ((logdir.read_log_ext_vers 8767 [0] == 0) && 8768 (logdir.read_log_ext_vers 8769 [1] == 0)) 8770 goto out; 8771 block_num = 8772 logdir.read_log_ext_nblks 8773 [EXT_SMART_SELFTEST_LOG_PAGE 8774 - 1][0]; 8775 block_num |= logdir. 8776 read_log_ext_nblks 8777 [EXT_SMART_SELFTEST_LOG_PAGE 8778 - 1][1] << 8; 8779 --block_num; 8780 only_one_block = 8781 (block_num == 0); 8782 } 8783 rval = sata_ext_smart_selftest_read_log( 8784 sata_hba_inst, sdinfo, 8785 ext_selftest_log, block_num); 8786 if (rval != 0) 8787 goto out; 8788 8789 index = 8790 ENTRIES_PER_EXT_SELFTEST_LOG_BLK - 8791 1; 8792 } 8793 index %= ENTRIES_PER_EXT_SELFTEST_LOG_BLK; 8794 entry = &ext_selftest_log-> 8795 smart_ext_selftest_log_entries[index]; 8796 } 8797 } 8798 out: 8799 kmem_free(ext_selftest_log, 8800 sizeof (struct smart_ext_selftest_log)); 8801 } else { 8802 struct smart_selftest_log *selftest_log; 8803 8804 selftest_log = kmem_zalloc(sizeof (struct smart_selftest_log), 8805 KM_SLEEP); 8806 8807 rval = sata_smart_selftest_log(sata_hba_inst, sdinfo, 8808 selftest_log); 8809 8810 if (rval == 0) { 8811 int index; 8812 int count; 8813 struct smart_selftest_log_entry *entry; 8814 static const struct smart_selftest_log_entry empty = 8815 { 0 }; 8816 8817 index = selftest_log->smart_selftest_log_index; 8818 if (index == 0) 8819 goto done; 8820 --index; /* Correct for 0 origin */ 8821 entry = &selftest_log-> 8822 smart_selftest_log_entries[index]; 8823 for (count = 1; 8824 count <= SCSI_ENTRIES_IN_LOG_SENSE_SELFTEST_RESULTS; 8825 ++count) { 8826 uint8_t status; 8827 uint8_t code; 8828 uint8_t sense_key; 8829 uint8_t add_sense_code; 8830 uint8_t add_sense_code_qual; 8831 8832 if (bcmp(entry, &empty, sizeof (empty)) == 0) 8833 goto done; 8834 8835 lpp->param_code[0] = 0; 8836 lpp->param_code[1] = count; 8837 lpp->param_ctrl_flags = 8838 LOG_CTRL_LP | LOG_CTRL_LBIN; 8839 lpp->param_len = 8840 SCSI_LOG_SENSE_SELFTEST_PARAM_LEN; 8841 8842 status = entry->smart_selftest_log_status; 8843 status >>= 4; 8844 switch (status) { 8845 case 0: 8846 default: 8847 sense_key = KEY_NO_SENSE; 8848 add_sense_code = 8849 SD_SCSI_ASC_NO_ADD_SENSE; 8850 break; 8851 case 1: 8852 sense_key = KEY_ABORTED_COMMAND; 8853 add_sense_code = 8854 DIAGNOSTIC_FAILURE_ON_COMPONENT; 8855 add_sense_code_qual = SCSI_COMPONENT_81; 8856 break; 8857 case 2: 8858 sense_key = KEY_ABORTED_COMMAND; 8859 add_sense_code = 8860 DIAGNOSTIC_FAILURE_ON_COMPONENT; 8861 add_sense_code_qual = SCSI_COMPONENT_82; 8862 break; 8863 case 3: 8864 sense_key = KEY_ABORTED_COMMAND; 8865 add_sense_code = 8866 DIAGNOSTIC_FAILURE_ON_COMPONENT; 8867 add_sense_code_qual = SCSI_COMPONENT_83; 8868 break; 8869 case 4: 8870 sense_key = KEY_HARDWARE_ERROR; 8871 add_sense_code = 8872 DIAGNOSTIC_FAILURE_ON_COMPONENT; 8873 add_sense_code_qual = SCSI_COMPONENT_84; 8874 break; 8875 case 5: 8876 sense_key = KEY_HARDWARE_ERROR; 8877 add_sense_code = 8878 DIAGNOSTIC_FAILURE_ON_COMPONENT; 8879 add_sense_code_qual = SCSI_COMPONENT_85; 8880 break; 8881 case 6: 8882 sense_key = KEY_HARDWARE_ERROR; 8883 add_sense_code = 8884 DIAGNOSTIC_FAILURE_ON_COMPONENT; 8885 add_sense_code_qual = SCSI_COMPONENT_86; 8886 break; 8887 case 7: 8888 sense_key = KEY_MEDIUM_ERROR; 8889 add_sense_code = 8890 DIAGNOSTIC_FAILURE_ON_COMPONENT; 8891 add_sense_code_qual = SCSI_COMPONENT_87; 8892 break; 8893 case 8: 8894 sense_key = KEY_HARDWARE_ERROR; 8895 add_sense_code = 8896 DIAGNOSTIC_FAILURE_ON_COMPONENT; 8897 add_sense_code_qual = SCSI_COMPONENT_88; 8898 break; 8899 } 8900 code = 0; /* unspecified */ 8901 status |= (code << 4); 8902 lpp->param_values[0] = status; 8903 lpp->param_values[1] = 0; /* unspecified */ 8904 lpp->param_values[2] = entry-> 8905 smart_selftest_log_timestamp[1]; 8906 lpp->param_values[3] = entry-> 8907 smart_selftest_log_timestamp[0]; 8908 if (status != 0) { 8909 lpp->param_values[4] = 0; 8910 lpp->param_values[5] = 0; 8911 lpp->param_values[6] = 0; 8912 lpp->param_values[7] = 0; 8913 lpp->param_values[8] = entry-> 8914 smart_selftest_log_failing_lba[3]; 8915 lpp->param_values[9] = entry-> 8916 smart_selftest_log_failing_lba[2]; 8917 lpp->param_values[10] = entry-> 8918 smart_selftest_log_failing_lba[1]; 8919 lpp->param_values[11] = entry-> 8920 smart_selftest_log_failing_lba[0]; 8921 } else { /* No block address */ 8922 lpp->param_values[4] = 0xff; 8923 lpp->param_values[5] = 0xff; 8924 lpp->param_values[6] = 0xff; 8925 lpp->param_values[7] = 0xff; 8926 lpp->param_values[8] = 0xff; 8927 lpp->param_values[9] = 0xff; 8928 lpp->param_values[10] = 0xff; 8929 lpp->param_values[11] = 0xff; 8930 } 8931 lpp->param_values[12] = sense_key; 8932 lpp->param_values[13] = add_sense_code; 8933 lpp->param_values[14] = add_sense_code_qual; 8934 lpp->param_values[15] = 0; /* undefined */ 8935 8936 lpp = (struct log_parameter *) 8937 (((uint8_t *)lpp) + 8938 SCSI_LOG_PARAM_HDR_LEN + 8939 SCSI_LOG_SENSE_SELFTEST_PARAM_LEN); 8940 --index; /* back up to previous entry */ 8941 if (index < 0) { 8942 index = 8943 NUM_SMART_SELFTEST_LOG_ENTRIES - 1; 8944 } 8945 entry = &selftest_log-> 8946 smart_selftest_log_entries[index]; 8947 } 8948 } 8949 done: 8950 kmem_free(selftest_log, sizeof (struct smart_selftest_log)); 8951 } 8952 8953 return ((SCSI_LOG_PARAM_HDR_LEN + SCSI_LOG_SENSE_SELFTEST_PARAM_LEN) * 8954 SCSI_ENTRIES_IN_LOG_SENSE_SELFTEST_RESULTS); 8955 } 8956 8957 /* 8958 * sata_build_lsense_page_2f() is used to create the 8959 * SCSI LOG SENSE page 0x2f (informational exceptions) 8960 * 8961 * Takes a sata_drive_info t * and the address of a buffer 8962 * in which to create the page information as well as a sata_hba_inst_t *. 8963 * 8964 * Returns the number of bytes valid in the buffer. 8965 * 8966 * Because it invokes function(s) that send synchronously executed command 8967 * to the HBA, it cannot be called in the interrupt context. 8968 */ 8969 static int 8970 sata_build_lsense_page_2f( 8971 sata_drive_info_t *sdinfo, 8972 uint8_t *buf, 8973 sata_hba_inst_t *sata_hba_inst) 8974 { 8975 struct log_parameter *lpp = (struct log_parameter *)buf; 8976 int rval; 8977 uint8_t *smart_data; 8978 uint8_t temp; 8979 sata_id_t *sata_id; 8980 #define SMART_NO_TEMP 0xff 8981 8982 lpp->param_code[0] = 0; 8983 lpp->param_code[1] = 0; 8984 lpp->param_ctrl_flags = LOG_CTRL_LP | LOG_CTRL_LBIN; 8985 8986 /* Now get the SMART status w.r.t. threshold exceeded */ 8987 rval = sata_fetch_smart_return_status(sata_hba_inst, sdinfo); 8988 switch (rval) { 8989 case 1: 8990 lpp->param_values[0] = SCSI_PREDICTED_FAILURE; 8991 lpp->param_values[1] = SCSI_GENERAL_HD_FAILURE; 8992 break; 8993 case 0: 8994 case -1: /* failed to get data */ 8995 lpp->param_values[0] = 0; /* No failure predicted */ 8996 lpp->param_values[1] = 0; 8997 break; 8998 #if defined(SATA_DEBUG) 8999 default: 9000 cmn_err(CE_PANIC, "sata_build_lsense_page_2f bad return value"); 9001 /* NOTREACHED */ 9002 #endif 9003 } 9004 9005 sata_id = &sdinfo->satadrv_id; 9006 if (! (sata_id->ai_sctsupport & SATA_SCT_CMD_TRANS_SUP)) 9007 temp = SMART_NO_TEMP; 9008 else { 9009 /* Now get the temperature */ 9010 smart_data = kmem_zalloc(512, KM_SLEEP); 9011 rval = sata_smart_read_log(sata_hba_inst, sdinfo, smart_data, 9012 SCT_STATUS_LOG_PAGE, 1); 9013 if (rval == -1) 9014 temp = SMART_NO_TEMP; 9015 else { 9016 temp = smart_data[200]; 9017 if (temp & 0x80) { 9018 if (temp & 0x7f) 9019 temp = 0; 9020 else 9021 temp = SMART_NO_TEMP; 9022 } 9023 } 9024 kmem_free(smart_data, 512); 9025 } 9026 9027 lpp->param_values[2] = temp; /* most recent temperature */ 9028 lpp->param_values[3] = 0; /* required vendor specific byte */ 9029 9030 lpp->param_len = SCSI_INFO_EXCEPTIONS_PARAM_LEN; 9031 9032 9033 return (SCSI_INFO_EXCEPTIONS_PARAM_LEN + SCSI_LOG_PARAM_HDR_LEN); 9034 } 9035 9036 /* 9037 * sata_build_lsense_page_30() is used to create the 9038 * SCSI LOG SENSE page 0x30 (Sun's vendor specific page for ATA SMART data). 9039 * 9040 * Takes a sata_drive_info t * and the address of a buffer 9041 * in which to create the page information as well as a sata_hba_inst_t *. 9042 * 9043 * Returns the number of bytes valid in the buffer. 9044 */ 9045 static int 9046 sata_build_lsense_page_30( 9047 sata_drive_info_t *sdinfo, 9048 uint8_t *buf, 9049 sata_hba_inst_t *sata_hba_inst) 9050 { 9051 struct smart_data *smart_data = (struct smart_data *)buf; 9052 int rval; 9053 9054 /* Now do the SMART READ DATA */ 9055 rval = sata_fetch_smart_data(sata_hba_inst, sdinfo, smart_data); 9056 if (rval == -1) 9057 return (0); 9058 9059 return (sizeof (struct smart_data)); 9060 } 9061 9062 /* 9063 * sata_build_lsense_page_0e() is used to create the 9064 * SCSI LOG SENSE page 0e (start-stop cycle counter page) 9065 * 9066 * Date of Manufacture (0x0001) 9067 * YEAR = "0000" 9068 * WEEK = "00" 9069 * Accounting Date (0x0002) 9070 * 6 ASCII space character(20h) 9071 * Specified cycle count over device lifetime 9072 * VALUE - THRESH - the delta between max and min; 9073 * Accumulated start-stop cycles 9074 * VALUE - WORST - the accumulated cycles; 9075 * 9076 * ID FLAG THRESH VALUE WORST RAW on start/stop counter attribute 9077 * 9078 * Takes a sata_drive_info t * and the address of a buffer 9079 * in which to create the page information as well as a sata_hba_inst_t *. 9080 * 9081 * Returns the number of bytes valid in the buffer. 9082 */ 9083 static int 9084 sata_build_lsense_page_0e(sata_drive_info_t *sdinfo, uint8_t *buf, 9085 sata_pkt_txlate_t *spx) 9086 { 9087 struct start_stop_cycle_counter_log *log_page; 9088 int i, rval, index; 9089 uint8_t smart_data[512], id, value, worst, thresh; 9090 uint32_t max_count, cycles; 9091 9092 /* Now do the SMART READ DATA */ 9093 rval = sata_fetch_smart_data(spx->txlt_sata_hba_inst, sdinfo, 9094 (struct smart_data *)smart_data); 9095 if (rval == -1) 9096 return (0); 9097 for (i = 0, id = 0; i < SMART_START_STOP_COUNT_ID * 2; i++) { 9098 index = (i * 12) + 2; 9099 id = smart_data[index]; 9100 if (id != SMART_START_STOP_COUNT_ID) 9101 continue; 9102 else { 9103 thresh = smart_data[index + 2]; 9104 value = smart_data[index + 3]; 9105 worst = smart_data[index + 4]; 9106 break; 9107 } 9108 } 9109 if (id != SMART_START_STOP_COUNT_ID) 9110 return (0); 9111 max_count = value - thresh; 9112 cycles = value - worst; 9113 9114 log_page = (struct start_stop_cycle_counter_log *)buf; 9115 bzero(log_page, sizeof (struct start_stop_cycle_counter_log)); 9116 log_page->code = 0x0e; 9117 log_page->page_len_low = 0x24; 9118 9119 log_page->manufactor_date_low = 0x1; 9120 log_page->param_1.fmt_link = 0x1; /* 01b */ 9121 log_page->param_len_1 = 0x06; 9122 for (i = 0; i < 4; i++) { 9123 log_page->year_manu[i] = 0x30; 9124 if (i < 2) 9125 log_page->week_manu[i] = 0x30; 9126 } 9127 9128 log_page->account_date_low = 0x02; 9129 log_page->param_2.fmt_link = 0x01; /* 01b */ 9130 log_page->param_len_2 = 0x06; 9131 for (i = 0; i < 4; i++) { 9132 log_page->year_account[i] = 0x20; 9133 if (i < 2) 9134 log_page->week_account[i] = 0x20; 9135 } 9136 9137 log_page->lifetime_code_low = 0x03; 9138 log_page->param_3.fmt_link = 0x03; /* 11b */ 9139 log_page->param_len_3 = 0x04; 9140 /* VALUE - THRESH - the delta between max and min */ 9141 log_page->cycle_code_low = 0x04; 9142 log_page->param_4.fmt_link = 0x03; /* 11b */ 9143 log_page->param_len_4 = 0x04; 9144 /* WORST - THRESH - the distance from 'now' to min */ 9145 9146 for (i = 0; i < 4; i++) { 9147 log_page->cycle_lifetime[i] = 9148 (max_count >> (8 * (3 - i))) & 0xff; 9149 log_page->cycle_accumulated[i] = 9150 (cycles >> (8 * (3 - i))) & 0xff; 9151 } 9152 9153 return (sizeof (struct start_stop_cycle_counter_log)); 9154 } 9155 9156 /* 9157 * This function was used for build a ATA read verify sector command 9158 */ 9159 static void 9160 sata_build_read_verify_cmd(sata_cmd_t *scmd, uint16_t sec, uint64_t lba) 9161 { 9162 scmd->satacmd_cmd_reg = SATAC_RDVER; 9163 scmd->satacmd_addr_type = ATA_ADDR_LBA28; 9164 scmd->satacmd_flags.sata_special_regs = B_TRUE; 9165 9166 scmd->satacmd_sec_count_lsb = sec & 0xff; 9167 scmd->satacmd_lba_low_lsb = lba & 0xff; 9168 scmd->satacmd_lba_mid_lsb = (lba >> 8) & 0xff; 9169 scmd->satacmd_lba_high_lsb = (lba >> 16) & 0xff; 9170 scmd->satacmd_device_reg = (SATA_ADH_LBA | (lba >> 24) & 0xf); 9171 scmd->satacmd_features_reg = 0; 9172 scmd->satacmd_status_reg = 0; 9173 scmd->satacmd_error_reg = 0; 9174 } 9175 9176 /* 9177 * This function was used for building an ATA 9178 * command, and only command register need to 9179 * be defined, other register will be zero or na. 9180 */ 9181 static void 9182 sata_build_generic_cmd(sata_cmd_t *scmd, uint8_t cmd) 9183 { 9184 scmd->satacmd_addr_type = 0; 9185 scmd->satacmd_cmd_reg = cmd; 9186 scmd->satacmd_device_reg = 0; 9187 scmd->satacmd_sec_count_lsb = 0; 9188 scmd->satacmd_lba_low_lsb = 0; 9189 scmd->satacmd_lba_mid_lsb = 0; 9190 scmd->satacmd_lba_high_lsb = 0; 9191 scmd->satacmd_features_reg = 0; 9192 scmd->satacmd_status_reg = 0; 9193 scmd->satacmd_error_reg = 0; 9194 scmd->satacmd_flags.sata_special_regs = B_TRUE; 9195 } 9196 9197 /* 9198 * This function was used for changing the standby 9199 * timer format from SCSI to ATA. 9200 */ 9201 static uint8_t 9202 sata_get_standby_timer(uint8_t *timer) 9203 { 9204 uint32_t i = 0, count = 0; 9205 uint8_t ata_count; 9206 9207 for (i = 0; i < 4; i++) { 9208 count = count << 8 | timer[i]; 9209 } 9210 9211 if (count == 0) 9212 return (0); 9213 9214 if (count >= 1 && count <= 12000) 9215 ata_count = (count -1) / 50 + 1; 9216 else if (count > 12000 && count <= 12600) 9217 ata_count = 0xfc; 9218 else if (count > 12601 && count <= 12750) 9219 ata_count = 0xff; 9220 else if (count > 12750 && count <= 17999) 9221 ata_count = 0xf1; 9222 else if (count > 18000 && count <= 198000) 9223 ata_count = count / 18000 + 240; 9224 else 9225 ata_count = 0xfd; 9226 return (ata_count); 9227 } 9228 9229 /* ************************** ATAPI-SPECIFIC FUNCTIONS ********************** */ 9230 9231 /* 9232 * Start command for ATAPI device. 9233 * This function processes scsi_pkt requests. 9234 * Now CD/DVD, tape and ATAPI disk devices are supported. 9235 * Most commands are packet without any translation into Packet Command. 9236 * Some may be trapped and executed as SATA commands (not clear which one). 9237 * 9238 * Returns TRAN_ACCEPT if command is accepted for execution (or completed 9239 * execution). 9240 * Returns other TRAN_XXXX codes if command is not accepted or completed 9241 * (see return values for sata_hba_start()). 9242 * 9243 * Note: 9244 * Inquiry cdb format differs between transport version 2 and 3. 9245 * However, the transport version 3 devices that were checked did not adhere 9246 * to the specification (ignored MSB of the allocation length). Therefore, 9247 * the transport version is not checked, but Inquiry allocation length is 9248 * truncated to 255 bytes if the original allocation length set-up by the 9249 * target driver is greater than 255 bytes. 9250 */ 9251 static int 9252 sata_txlt_atapi(sata_pkt_txlate_t *spx) 9253 { 9254 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt; 9255 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd; 9256 struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp; 9257 sata_hba_inst_t *sata_hba = SATA_TXLT_HBA_INST(spx); 9258 sata_drive_info_t *sdinfo = sata_get_device_info(sata_hba, 9259 &spx->txlt_sata_pkt->satapkt_device); 9260 int cport = SATA_TXLT_CPORT(spx); 9261 int cdblen; 9262 int rval, reason; 9263 int synch; 9264 union scsi_cdb *cdbp = (union scsi_cdb *)scsipkt->pkt_cdbp; 9265 9266 mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx))); 9267 9268 if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 0)) != 9269 TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) { 9270 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); 9271 return (rval); 9272 } 9273 9274 /* 9275 * ATAPI device executes some ATA commands in addition to those 9276 * commands sent via PACKET command. These ATA commands may be 9277 * executed by the regular SATA translation functions. None needs 9278 * to be captured now. 9279 * 9280 * Commands sent via PACKET command include: 9281 * MMC command set for ATAPI CD/DVD device 9282 * SSC command set for ATAPI TAPE device 9283 * SBC command set for ATAPI disk device 9284 * 9285 */ 9286 9287 /* Check the size of cdb */ 9288 9289 switch (GETGROUP(cdbp)) { 9290 case CDB_GROUPID_3: /* Reserved, per SPC-4 */ 9291 /* 9292 * opcodes 0x7e and 0x7f identify variable-length CDBs and 9293 * therefore require special handling. Return failure, for now. 9294 */ 9295 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); 9296 return (TRAN_BADPKT); 9297 9298 case CDB_GROUPID_6: /* Vendor-specific, per SPC-4 */ 9299 case CDB_GROUPID_7: /* Vendor-specific, per SPC-4 */ 9300 /* obtain length from the scsi_pkt */ 9301 cdblen = scsipkt->pkt_cdblen; 9302 break; 9303 9304 default: 9305 /* CDB's length is statically known, per SPC-4 */ 9306 cdblen = scsi_cdb_size[GETGROUP(cdbp)]; 9307 break; 9308 } 9309 9310 if (cdblen <= 0 || cdblen > sdinfo->satadrv_atapi_cdb_len) { 9311 sata_log(NULL, CE_WARN, 9312 "sata: invalid ATAPI cdb length %d", 9313 cdblen); 9314 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); 9315 return (TRAN_BADPKT); 9316 } 9317 9318 SATAATAPITRACE(spx, cdblen); 9319 9320 /* 9321 * For non-read/write commands we need to 9322 * map buffer 9323 */ 9324 switch ((uint_t)scsipkt->pkt_cdbp[0]) { 9325 case SCMD_READ: 9326 case SCMD_READ_G1: 9327 case SCMD_READ_G5: 9328 case SCMD_READ_G4: 9329 case SCMD_WRITE: 9330 case SCMD_WRITE_G1: 9331 case SCMD_WRITE_G5: 9332 case SCMD_WRITE_G4: 9333 break; 9334 default: 9335 if (bp != NULL) { 9336 if (bp->b_flags & (B_PHYS | B_PAGEIO)) 9337 bp_mapin(bp); 9338 } 9339 break; 9340 } 9341 /* 9342 * scmd->satacmd_flags.sata_data_direction default - 9343 * SATA_DIR_NODATA_XFER - is set by 9344 * sata_txlt_generic_pkt_info(). 9345 */ 9346 if (scmd->satacmd_bp) { 9347 if (scmd->satacmd_bp->b_flags & B_READ) { 9348 scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ; 9349 } else { 9350 scmd->satacmd_flags.sata_data_direction = 9351 SATA_DIR_WRITE; 9352 } 9353 } 9354 9355 /* 9356 * Set up ATAPI packet command. 9357 */ 9358 9359 sata_atapi_packet_cmd_setup(scmd, sdinfo); 9360 9361 /* Copy cdb into sata_cmd */ 9362 scmd->satacmd_acdb_len = sdinfo->satadrv_atapi_cdb_len; 9363 bzero(scmd->satacmd_acdb, SATA_ATAPI_MAX_CDB_LEN); 9364 bcopy(cdbp, scmd->satacmd_acdb, cdblen); 9365 9366 /* See note in the command header */ 9367 if (scmd->satacmd_acdb[0] == SCMD_INQUIRY) { 9368 if (scmd->satacmd_acdb[3] != 0) 9369 scmd->satacmd_acdb[4] = 255; 9370 } 9371 9372 #ifdef SATA_DEBUG 9373 if (sata_debug_flags & SATA_DBG_ATAPI) { 9374 uint8_t *p = scmd->satacmd_acdb; 9375 char buf[3 * SATA_ATAPI_MAX_CDB_LEN]; 9376 9377 (void) snprintf(buf, SATA_ATAPI_MAX_CDB_LEN, 9378 "%02x %02x %02x %02x %02x %02x %02x %02x " 9379 "%2x %02x %02x %02x %02x %02x %02x %02x", 9380 p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7], 9381 p[8], p[9], p[10], p[11], p[12], p[13], p[14], p[15]); 9382 buf[(3 * SATA_ATAPI_MAX_CDB_LEN) - 1] = '\0'; 9383 cmn_err(CE_NOTE, "ATAPI cdb: %s\n", buf); 9384 } 9385 #endif 9386 9387 /* 9388 * Preset request sense data to NO SENSE. 9389 * If there is no way to get error information via Request Sense, 9390 * the packet request sense data would not have to be modified by HBA, 9391 * but it could be returned as is. 9392 */ 9393 bzero(scmd->satacmd_rqsense, SATA_ATAPI_RQSENSE_LEN); 9394 sata_fixed_sense_data_preset( 9395 (struct scsi_extended_sense *)scmd->satacmd_rqsense); 9396 9397 if (!(spx->txlt_sata_pkt->satapkt_op_mode & SATA_OPMODE_SYNCH)) { 9398 /* Need callback function */ 9399 spx->txlt_sata_pkt->satapkt_comp = sata_txlt_atapi_completion; 9400 synch = FALSE; 9401 } else 9402 synch = TRUE; 9403 9404 /* Transfer command to HBA */ 9405 if (sata_hba_start(spx, &rval) != 0) { 9406 /* Pkt not accepted for execution */ 9407 mutex_exit(&SATA_CPORT_MUTEX(sata_hba, cport)); 9408 return (rval); 9409 } 9410 mutex_exit(&SATA_CPORT_MUTEX(sata_hba, cport)); 9411 /* 9412 * If execution is non-synchronous, 9413 * a callback function will handle potential errors, translate 9414 * the response and will do a callback to a target driver. 9415 * If it was synchronous, use the same framework callback to check 9416 * an execution status. 9417 */ 9418 if (synch) { 9419 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst, 9420 "synchronous execution status %x\n", 9421 spx->txlt_sata_pkt->satapkt_reason); 9422 sata_txlt_atapi_completion(spx->txlt_sata_pkt); 9423 } 9424 return (TRAN_ACCEPT); 9425 } 9426 9427 9428 /* 9429 * ATAPI Packet command completion. 9430 * 9431 * Failure of the command passed via Packet command are considered device 9432 * error. SATA HBA driver would have to retrieve error data (via Request 9433 * Sense command delivered via error retrieval sata packet) and copy it 9434 * to satacmd_rqsense array. From there, it is moved into scsi pkt sense data. 9435 */ 9436 static void 9437 sata_txlt_atapi_completion(sata_pkt_t *sata_pkt) 9438 { 9439 sata_pkt_txlate_t *spx = 9440 (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private; 9441 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt; 9442 struct scsi_extended_sense *sense; 9443 struct buf *bp; 9444 int rval; 9445 9446 #ifdef SATA_DEBUG 9447 uint8_t *rqsp = sata_pkt->satapkt_cmd.satacmd_rqsense; 9448 #endif 9449 9450 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET | 9451 STATE_SENT_CMD | STATE_GOT_STATUS; 9452 9453 if (sata_pkt->satapkt_reason == SATA_PKT_COMPLETED) { 9454 /* Normal completion */ 9455 if (sata_pkt->satapkt_cmd.satacmd_bp != NULL) 9456 scsipkt->pkt_state |= STATE_XFERRED_DATA; 9457 scsipkt->pkt_reason = CMD_CMPLT; 9458 *scsipkt->pkt_scbp = STATUS_GOOD; 9459 if (spx->txlt_tmp_buf != NULL) { 9460 /* Temporary buffer was used */ 9461 bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp; 9462 if (bp->b_flags & B_READ) { 9463 rval = ddi_dma_sync( 9464 spx->txlt_buf_dma_handle, 0, 0, 9465 DDI_DMA_SYNC_FORCPU); 9466 ASSERT(rval == DDI_SUCCESS); 9467 bcopy(spx->txlt_tmp_buf, bp->b_un.b_addr, 9468 bp->b_bcount); 9469 } 9470 } 9471 } else { 9472 /* 9473 * Something went wrong - analyze return 9474 */ 9475 *scsipkt->pkt_scbp = STATUS_CHECK; 9476 sense = sata_arq_sense(spx); 9477 9478 if (sata_pkt->satapkt_reason == SATA_PKT_DEV_ERROR) { 9479 /* 9480 * pkt_reason should be CMD_CMPLT for DEVICE ERROR. 9481 * Under this condition ERR bit is set for ATA command, 9482 * and CHK bit set for ATAPI command. 9483 * 9484 * Please check st_intr & sdintr about how pkt_reason 9485 * is used. 9486 */ 9487 scsipkt->pkt_reason = CMD_CMPLT; 9488 9489 /* 9490 * We may not have ARQ data if there was a double 9491 * error. But sense data in sata packet was pre-set 9492 * with NO SENSE so it is valid even if HBA could 9493 * not retrieve a real sense data. 9494 * Just copy this sense data into scsi pkt sense area. 9495 */ 9496 bcopy(sata_pkt->satapkt_cmd.satacmd_rqsense, sense, 9497 SATA_ATAPI_MIN_RQSENSE_LEN); 9498 #ifdef SATA_DEBUG 9499 if (sata_debug_flags & SATA_DBG_SCSI_IF) { 9500 sata_log(spx->txlt_sata_hba_inst, CE_WARN, 9501 "sata_txlt_atapi_completion: %02x\n" 9502 "RQSENSE: %02x %02x %02x %02x %02x %02x " 9503 " %02x %02x %02x %02x %02x %02x " 9504 " %02x %02x %02x %02x %02x %02x\n", 9505 scsipkt->pkt_reason, 9506 rqsp[0], rqsp[1], rqsp[2], rqsp[3], 9507 rqsp[4], rqsp[5], rqsp[6], rqsp[7], 9508 rqsp[8], rqsp[9], rqsp[10], rqsp[11], 9509 rqsp[12], rqsp[13], rqsp[14], rqsp[15], 9510 rqsp[16], rqsp[17]); 9511 } 9512 #endif 9513 } else { 9514 switch (sata_pkt->satapkt_reason) { 9515 case SATA_PKT_PORT_ERROR: 9516 /* 9517 * We have no device data. 9518 */ 9519 scsipkt->pkt_reason = CMD_INCOMPLETE; 9520 scsipkt->pkt_state &= ~(STATE_GOT_BUS | 9521 STATE_GOT_TARGET | STATE_SENT_CMD | 9522 STATE_GOT_STATUS); 9523 sense->es_key = KEY_HARDWARE_ERROR; 9524 break; 9525 9526 case SATA_PKT_TIMEOUT: 9527 scsipkt->pkt_reason = CMD_TIMEOUT; 9528 scsipkt->pkt_statistics |= 9529 STAT_TIMEOUT | STAT_DEV_RESET; 9530 /* 9531 * Need to check if HARDWARE_ERROR/ 9532 * TIMEOUT_ON_LOGICAL_UNIT 4/3E/2 would be more 9533 * appropriate. 9534 */ 9535 break; 9536 9537 case SATA_PKT_ABORTED: 9538 scsipkt->pkt_reason = CMD_ABORTED; 9539 scsipkt->pkt_statistics |= STAT_ABORTED; 9540 /* Should we set key COMMAND_ABPRTED? */ 9541 break; 9542 9543 case SATA_PKT_RESET: 9544 scsipkt->pkt_reason = CMD_RESET; 9545 scsipkt->pkt_statistics |= STAT_DEV_RESET; 9546 /* 9547 * May be we should set Unit Attention / 9548 * Reset. Perhaps the same should be 9549 * returned for disks.... 9550 */ 9551 sense->es_key = KEY_UNIT_ATTENTION; 9552 sense->es_add_code = SD_SCSI_ASC_RESET; 9553 break; 9554 9555 default: 9556 SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN, 9557 "sata_txlt_atapi_completion: " 9558 "invalid packet completion reason")); 9559 scsipkt->pkt_reason = CMD_TRAN_ERR; 9560 scsipkt->pkt_state &= ~(STATE_GOT_BUS | 9561 STATE_GOT_TARGET | STATE_SENT_CMD | 9562 STATE_GOT_STATUS); 9563 break; 9564 } 9565 } 9566 } 9567 9568 SATAATAPITRACE(spx, 0); 9569 9570 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 && 9571 scsipkt->pkt_comp != NULL) { 9572 /* scsi callback required */ 9573 (*scsipkt->pkt_comp)(scsipkt); 9574 } 9575 } 9576 9577 /* 9578 * Set up error retrieval sata command for ATAPI Packet Command error data 9579 * recovery. 9580 * 9581 * Returns SATA_SUCCESS when data buffer is allocated and packet set-up, 9582 * returns SATA_FAILURE otherwise. 9583 */ 9584 9585 static int 9586 sata_atapi_err_ret_cmd_setup(sata_pkt_txlate_t *spx, sata_drive_info_t *sdinfo) 9587 { 9588 sata_pkt_t *spkt = spx->txlt_sata_pkt; 9589 sata_cmd_t *scmd; 9590 struct buf *bp; 9591 9592 /* 9593 * Allocate dma-able buffer error data. 9594 * Buffer allocation will take care of buffer alignment and other DMA 9595 * attributes. 9596 */ 9597 bp = sata_alloc_local_buffer(spx, SATA_ATAPI_MIN_RQSENSE_LEN); 9598 if (bp == NULL) { 9599 SATADBG1(SATA_DBG_ATAPI, spx->txlt_sata_hba_inst, 9600 "sata_get_err_retrieval_pkt: " 9601 "cannot allocate buffer for error data", NULL); 9602 return (SATA_FAILURE); 9603 } 9604 bp_mapin(bp); /* make data buffer accessible */ 9605 9606 /* Operation modes are up to the caller */ 9607 spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS; 9608 9609 /* Synchronous mode, no callback - may be changed by the caller */ 9610 spkt->satapkt_comp = NULL; 9611 spkt->satapkt_time = sata_default_pkt_time; 9612 9613 scmd = &spkt->satapkt_cmd; 9614 scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ; 9615 scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE; 9616 9617 sata_atapi_packet_cmd_setup(scmd, sdinfo); 9618 9619 /* 9620 * Set-up acdb. Request Sense CDB (packet command content) is 9621 * not in DMA-able buffer. Its handling is HBA-specific (how 9622 * it is transfered into packet FIS). 9623 */ 9624 scmd->satacmd_acdb_len = sdinfo->satadrv_atapi_cdb_len; 9625 bcopy(sata_rqsense_cdb, scmd->satacmd_acdb, SATA_ATAPI_RQSENSE_CDB_LEN); 9626 /* Following zeroing of pad bytes may not be necessary */ 9627 bzero(&scmd->satacmd_acdb[SATA_ATAPI_RQSENSE_CDB_LEN], 9628 sdinfo->satadrv_atapi_cdb_len - SATA_ATAPI_RQSENSE_CDB_LEN); 9629 9630 /* 9631 * Set-up pointer to the buffer handle, so HBA can sync buffer 9632 * before accessing it. Handle is in usual place in translate struct. 9633 */ 9634 scmd->satacmd_err_ret_buf_handle = &spx->txlt_buf_dma_handle; 9635 9636 /* 9637 * Preset request sense data to NO SENSE. 9638 * Here it is redundant, only for a symetry with scsi-originated 9639 * packets. It should not be used for anything but debugging. 9640 */ 9641 bzero(scmd->satacmd_rqsense, SATA_ATAPI_RQSENSE_LEN); 9642 sata_fixed_sense_data_preset( 9643 (struct scsi_extended_sense *)scmd->satacmd_rqsense); 9644 9645 ASSERT(scmd->satacmd_num_dma_cookies != 0); 9646 ASSERT(scmd->satacmd_dma_cookie_list != NULL); 9647 9648 return (SATA_SUCCESS); 9649 } 9650 9651 /* 9652 * Set-up ATAPI packet command. 9653 * Data transfer direction has to be set-up in sata_cmd structure prior to 9654 * calling this function. 9655 * 9656 * Returns void 9657 */ 9658 9659 static void 9660 sata_atapi_packet_cmd_setup(sata_cmd_t *scmd, sata_drive_info_t *sdinfo) 9661 { 9662 scmd->satacmd_addr_type = 0; /* N/A */ 9663 scmd->satacmd_sec_count_lsb = 0; /* no tag */ 9664 scmd->satacmd_lba_low_lsb = 0; /* N/A */ 9665 scmd->satacmd_lba_mid_lsb = (uint8_t)SATA_ATAPI_MAX_BYTES_PER_DRQ; 9666 scmd->satacmd_lba_high_lsb = 9667 (uint8_t)(SATA_ATAPI_MAX_BYTES_PER_DRQ >> 8); 9668 scmd->satacmd_cmd_reg = SATAC_PACKET; /* Command */ 9669 9670 /* 9671 * We want all data to be transfered via DMA. 9672 * But specify it only if drive supports DMA and DMA mode is 9673 * selected - some drives are sensitive about it. 9674 * Hopefully it wil work for all drives.... 9675 */ 9676 if (sdinfo->satadrv_settings & SATA_DEV_DMA) 9677 scmd->satacmd_features_reg = SATA_ATAPI_F_DMA; 9678 9679 /* 9680 * Features register requires special care for devices that use 9681 * Serial ATA bridge - they need an explicit specification of 9682 * the data transfer direction for Packet DMA commands. 9683 * Setting this bit is harmless if DMA is not used. 9684 * 9685 * Many drives do not implement word 80, specifying what ATA/ATAPI 9686 * spec they follow. 9687 * We are arbitrarily following the latest SerialATA 2.6 spec, 9688 * which uses ATA/ATAPI 6 specification for Identify Data, unless 9689 * ATA/ATAPI-7 support is explicitly indicated. 9690 */ 9691 if (sdinfo->satadrv_id.ai_majorversion != 0 && 9692 sdinfo->satadrv_id.ai_majorversion != 0xffff && 9693 (sdinfo->satadrv_id.ai_majorversion & SATA_MAJVER_7) != 0) { 9694 /* 9695 * Specification of major version is valid and version 7 9696 * is supported. It does automatically imply that all 9697 * spec features are supported. For now, we assume that 9698 * DMADIR setting is valid. ATA/ATAPI7 spec is incomplete. 9699 */ 9700 if ((sdinfo->satadrv_id.ai_dirdma & 9701 SATA_ATAPI_ID_DMADIR_REQ) != 0) { 9702 if (scmd->satacmd_flags.sata_data_direction == 9703 SATA_DIR_READ) 9704 scmd->satacmd_features_reg |= 9705 SATA_ATAPI_F_DATA_DIR_READ; 9706 } 9707 } 9708 } 9709 9710 9711 #ifdef SATA_DEBUG 9712 9713 /* Display 18 bytes of Inquiry data */ 9714 static void 9715 sata_show_inqry_data(uint8_t *buf) 9716 { 9717 struct scsi_inquiry *inq = (struct scsi_inquiry *)buf; 9718 uint8_t *p; 9719 9720 cmn_err(CE_NOTE, "Inquiry data:"); 9721 cmn_err(CE_NOTE, "device type %x", inq->inq_dtype); 9722 cmn_err(CE_NOTE, "removable media %x", inq->inq_rmb); 9723 cmn_err(CE_NOTE, "version %x", inq->inq_ansi); 9724 cmn_err(CE_NOTE, "ATAPI transport version %d", 9725 SATA_ATAPI_TRANS_VERSION(inq)); 9726 cmn_err(CE_NOTE, "response data format %d, aenc %d", 9727 inq->inq_rdf, inq->inq_aenc); 9728 cmn_err(CE_NOTE, " additional length %d", inq->inq_len); 9729 cmn_err(CE_NOTE, "tpgs %d", inq->inq_tpgs); 9730 p = (uint8_t *)inq->inq_vid; 9731 cmn_err(CE_NOTE, "vendor id (binary): %02x %02x %02x %02x " 9732 "%02x %02x %02x %02x", 9733 p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7]); 9734 p = (uint8_t *)inq->inq_vid; 9735 cmn_err(CE_NOTE, "vendor id: %c %c %c %c %c %c %c %c", 9736 p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7]); 9737 9738 p = (uint8_t *)inq->inq_pid; 9739 cmn_err(CE_NOTE, "product id (binary): %02x %02x %02x %02x " 9740 "%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x", 9741 p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7], 9742 p[8], p[9], p[10], p[11], p[12], p[13], p[14], p[15]); 9743 p = (uint8_t *)inq->inq_pid; 9744 cmn_err(CE_NOTE, "product id: %c %c %c %c %c %c %c %c " 9745 "%c %c %c %c %c %c %c %c", 9746 p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7], 9747 p[8], p[9], p[10], p[11], p[12], p[13], p[14], p[15]); 9748 9749 p = (uint8_t *)inq->inq_revision; 9750 cmn_err(CE_NOTE, "revision (binary): %02x %02x %02x %02x", 9751 p[0], p[1], p[2], p[3]); 9752 p = (uint8_t *)inq->inq_revision; 9753 cmn_err(CE_NOTE, "revision: %c %c %c %c", 9754 p[0], p[1], p[2], p[3]); 9755 9756 } 9757 9758 9759 static void 9760 sata_save_atapi_trace(sata_pkt_txlate_t *spx, int count) 9761 { 9762 struct scsi_pkt *scsi_pkt = spx->txlt_scsi_pkt; 9763 9764 if (scsi_pkt == NULL) 9765 return; 9766 if (count != 0) { 9767 /* saving cdb */ 9768 bzero(sata_atapi_trace[sata_atapi_trace_index].acdb, 9769 SATA_ATAPI_MAX_CDB_LEN); 9770 bcopy(scsi_pkt->pkt_cdbp, 9771 sata_atapi_trace[sata_atapi_trace_index].acdb, count); 9772 } else { 9773 bcopy(&((struct scsi_arq_status *)scsi_pkt->pkt_scbp)-> 9774 sts_sensedata, 9775 sata_atapi_trace[sata_atapi_trace_index].arqs, 9776 SATA_ATAPI_MIN_RQSENSE_LEN); 9777 sata_atapi_trace[sata_atapi_trace_index].scsi_pkt_reason = 9778 scsi_pkt->pkt_reason; 9779 sata_atapi_trace[sata_atapi_trace_index].sata_pkt_reason = 9780 spx->txlt_sata_pkt->satapkt_reason; 9781 9782 if (++sata_atapi_trace_index >= 64) 9783 sata_atapi_trace_index = 0; 9784 } 9785 } 9786 9787 #endif 9788 9789 /* 9790 * Fetch inquiry data from ATAPI device 9791 * Returns SATA_SUCCESS if operation was successful, SATA_FAILURE otherwise. 9792 * 9793 * Note: 9794 * inqb pointer does not point to a DMA-able buffer. It is a local buffer 9795 * where the caller expects to see the inquiry data. 9796 * 9797 */ 9798 9799 static int 9800 sata_get_atapi_inquiry_data(sata_hba_inst_t *sata_hba, 9801 sata_address_t *saddr, struct scsi_inquiry *inq) 9802 { 9803 sata_pkt_txlate_t *spx; 9804 sata_pkt_t *spkt; 9805 struct buf *bp; 9806 sata_drive_info_t *sdinfo; 9807 sata_cmd_t *scmd; 9808 int rval; 9809 uint8_t *rqsp; 9810 dev_info_t *dip = SATA_DIP(sata_hba); 9811 #ifdef SATA_DEBUG 9812 char msg_buf[MAXPATHLEN]; 9813 #endif 9814 9815 ASSERT(sata_hba != NULL); 9816 9817 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP); 9818 spx->txlt_sata_hba_inst = sata_hba; 9819 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */ 9820 spkt = sata_pkt_alloc(spx, NULL); 9821 if (spkt == NULL) { 9822 kmem_free(spx, sizeof (sata_pkt_txlate_t)); 9823 return (SATA_FAILURE); 9824 } 9825 /* address is needed now */ 9826 spkt->satapkt_device.satadev_addr = *saddr; 9827 9828 /* scsi_inquiry size buffer */ 9829 bp = sata_alloc_local_buffer(spx, sizeof (struct scsi_inquiry)); 9830 if (bp == NULL) { 9831 sata_pkt_free(spx); 9832 kmem_free(spx, sizeof (sata_pkt_txlate_t)); 9833 SATA_LOG_D((sata_hba, CE_WARN, 9834 "sata_get_atapi_inquiry_data: " 9835 "cannot allocate data buffer")); 9836 return (SATA_FAILURE); 9837 } 9838 bp_mapin(bp); /* make data buffer accessible */ 9839 9840 scmd = &spkt->satapkt_cmd; 9841 ASSERT(scmd->satacmd_num_dma_cookies != 0); 9842 ASSERT(scmd->satacmd_dma_cookie_list != NULL); 9843 9844 /* Use synchronous mode */ 9845 spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS; 9846 spkt->satapkt_comp = NULL; 9847 spkt->satapkt_time = sata_default_pkt_time; 9848 9849 /* Issue inquiry command - 6 bytes cdb, data transfer, read */ 9850 9851 scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ; 9852 scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE; 9853 9854 mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx))); 9855 sdinfo = sata_get_device_info(sata_hba, 9856 &spx->txlt_sata_pkt->satapkt_device); 9857 if (sdinfo == NULL) { 9858 /* we have to be carefull about the disapearing device */ 9859 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); 9860 rval = SATA_FAILURE; 9861 goto cleanup; 9862 } 9863 sata_atapi_packet_cmd_setup(scmd, sdinfo); 9864 9865 /* 9866 * Set-up acdb. This works for atapi transport version 2 and later. 9867 */ 9868 scmd->satacmd_acdb_len = sdinfo->satadrv_atapi_cdb_len; 9869 bzero(scmd->satacmd_acdb, SATA_ATAPI_MAX_CDB_LEN); 9870 scmd->satacmd_acdb[0] = 0x12; /* Inquiry */ 9871 scmd->satacmd_acdb[1] = 0x00; 9872 scmd->satacmd_acdb[2] = 0x00; 9873 scmd->satacmd_acdb[3] = 0x00; 9874 scmd->satacmd_acdb[4] = sizeof (struct scsi_inquiry); 9875 scmd->satacmd_acdb[5] = 0x00; 9876 9877 sata_fixed_sense_data_preset( 9878 (struct scsi_extended_sense *)scmd->satacmd_rqsense); 9879 9880 /* Transfer command to HBA */ 9881 if (sata_hba_start(spx, &rval) != 0) { 9882 /* Pkt not accepted for execution */ 9883 SATADBG1(SATA_DBG_ATAPI, sata_hba, 9884 "sata_get_atapi_inquiry_data: " 9885 "Packet not accepted for execution - ret: %02x", rval); 9886 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); 9887 rval = SATA_FAILURE; 9888 goto cleanup; 9889 } 9890 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); 9891 9892 if (spkt->satapkt_reason == SATA_PKT_COMPLETED) { 9893 SATADBG1(SATA_DBG_ATAPI, sata_hba, 9894 "sata_get_atapi_inquiry_data: " 9895 "Packet completed successfully - ret: %02x", rval); 9896 if (spx->txlt_buf_dma_handle != NULL) { 9897 /* 9898 * Sync buffer. Handle is in usual place in translate 9899 * struct. 9900 */ 9901 rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0, 9902 DDI_DMA_SYNC_FORCPU); 9903 ASSERT(rval == DDI_SUCCESS); 9904 } 9905 9906 if (sata_check_for_dma_error(dip, spx)) { 9907 ddi_fm_service_impact(dip, DDI_SERVICE_UNAFFECTED); 9908 rval = SATA_FAILURE; 9909 } else { 9910 /* 9911 * Normal completion - copy data into caller's buffer 9912 */ 9913 bcopy(bp->b_un.b_addr, (uint8_t *)inq, 9914 sizeof (struct scsi_inquiry)); 9915 #ifdef SATA_DEBUG 9916 if (sata_debug_flags & SATA_DBG_ATAPI) { 9917 sata_show_inqry_data((uint8_t *)inq); 9918 } 9919 #endif 9920 rval = SATA_SUCCESS; 9921 } 9922 } else { 9923 /* 9924 * Something went wrong - analyze return - check rqsense data 9925 */ 9926 rval = SATA_FAILURE; 9927 if (spkt->satapkt_reason == SATA_PKT_DEV_ERROR) { 9928 /* 9929 * ARQ data hopefull show something other than NO SENSE 9930 */ 9931 rqsp = scmd->satacmd_rqsense; 9932 #ifdef SATA_DEBUG 9933 if (sata_debug_flags & SATA_DBG_ATAPI) { 9934 msg_buf[0] = '\0'; 9935 (void) snprintf(msg_buf, MAXPATHLEN, 9936 "ATAPI packet completion reason: %02x\n" 9937 "RQSENSE: %02x %02x %02x %02x %02x %02x\n" 9938 " %02x %02x %02x %02x %02x %02x\n" 9939 " %02x %02x %02x %02x %02x %02x", 9940 spkt->satapkt_reason, 9941 rqsp[0], rqsp[1], rqsp[2], rqsp[3], 9942 rqsp[4], rqsp[5], rqsp[6], rqsp[7], 9943 rqsp[8], rqsp[9], rqsp[10], rqsp[11], 9944 rqsp[12], rqsp[13], rqsp[14], rqsp[15], 9945 rqsp[16], rqsp[17]); 9946 sata_log(spx->txlt_sata_hba_inst, CE_WARN, 9947 "%s", msg_buf); 9948 } 9949 #endif 9950 } else { 9951 switch (spkt->satapkt_reason) { 9952 case SATA_PKT_PORT_ERROR: 9953 SATADBG1(SATA_DBG_ATAPI, sata_hba, 9954 "sata_get_atapi_inquiry_data: " 9955 "packet reason: port error", NULL); 9956 break; 9957 9958 case SATA_PKT_TIMEOUT: 9959 SATADBG1(SATA_DBG_ATAPI, sata_hba, 9960 "sata_get_atapi_inquiry_data: " 9961 "packet reason: timeout", NULL); 9962 break; 9963 9964 case SATA_PKT_ABORTED: 9965 SATADBG1(SATA_DBG_ATAPI, sata_hba, 9966 "sata_get_atapi_inquiry_data: " 9967 "packet reason: aborted", NULL); 9968 break; 9969 9970 case SATA_PKT_RESET: 9971 SATADBG1(SATA_DBG_ATAPI, sata_hba, 9972 "sata_get_atapi_inquiry_data: " 9973 "packet reason: reset\n", NULL); 9974 break; 9975 default: 9976 SATADBG1(SATA_DBG_ATAPI, sata_hba, 9977 "sata_get_atapi_inquiry_data: " 9978 "invalid packet reason: %02x\n", 9979 spkt->satapkt_reason); 9980 break; 9981 } 9982 } 9983 } 9984 cleanup: 9985 sata_free_local_buffer(spx); 9986 sata_pkt_free(spx); 9987 kmem_free(spx, sizeof (sata_pkt_txlate_t)); 9988 return (rval); 9989 } 9990 9991 9992 9993 9994 9995 #if 0 9996 #ifdef SATA_DEBUG 9997 9998 /* 9999 * Test ATAPI packet command. 10000 * Single threaded test: send packet command in synch mode, process completion 10001 * 10002 */ 10003 static void 10004 sata_test_atapi_packet_command(sata_hba_inst_t *sata_hba_inst, int cport) 10005 { 10006 sata_pkt_txlate_t *spx; 10007 sata_pkt_t *spkt; 10008 struct buf *bp; 10009 sata_device_t sata_device; 10010 sata_drive_info_t *sdinfo; 10011 sata_cmd_t *scmd; 10012 int rval; 10013 uint8_t *rqsp; 10014 10015 ASSERT(sata_hba_inst != NULL); 10016 sata_device.satadev_addr.cport = cport; 10017 sata_device.satadev_addr.pmport = 0; 10018 sata_device.satadev_addr.qual = SATA_ADDR_DCPORT; 10019 sata_device.satadev_rev = SATA_DEVICE_REV; 10020 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex); 10021 sdinfo = sata_get_device_info(sata_hba_inst, &sata_device); 10022 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex); 10023 if (sdinfo == NULL) { 10024 sata_log(sata_hba_inst, CE_WARN, 10025 "sata_test_atapi_packet_command: " 10026 "no device info for cport %d", 10027 sata_device.satadev_addr.cport); 10028 return; 10029 } 10030 10031 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP); 10032 spx->txlt_sata_hba_inst = sata_hba_inst; 10033 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */ 10034 spkt = sata_pkt_alloc(spx, NULL); 10035 if (spkt == NULL) { 10036 kmem_free(spx, sizeof (sata_pkt_txlate_t)); 10037 return; 10038 } 10039 /* address is needed now */ 10040 spkt->satapkt_device.satadev_addr = sata_device.satadev_addr; 10041 10042 /* 1024k buffer */ 10043 bp = sata_alloc_local_buffer(spx, 1024); 10044 if (bp == NULL) { 10045 sata_pkt_free(spx); 10046 kmem_free(spx, sizeof (sata_pkt_txlate_t)); 10047 sata_log(sata_hba_inst, CE_WARN, 10048 "sata_test_atapi_packet_command: " 10049 "cannot allocate data buffer"); 10050 return; 10051 } 10052 bp_mapin(bp); /* make data buffer accessible */ 10053 10054 scmd = &spkt->satapkt_cmd; 10055 ASSERT(scmd->satacmd_num_dma_cookies != 0); 10056 ASSERT(scmd->satacmd_dma_cookie_list != NULL); 10057 10058 /* Use synchronous mode */ 10059 spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS; 10060 10061 /* Synchronous mode, no callback - may be changed by the caller */ 10062 spkt->satapkt_comp = NULL; 10063 spkt->satapkt_time = sata_default_pkt_time; 10064 10065 /* Issue inquiry command - 6 bytes cdb, data transfer, read */ 10066 10067 scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ; 10068 scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE; 10069 10070 sata_atapi_packet_cmd_setup(scmd, sdinfo); 10071 10072 /* Set-up acdb. */ 10073 scmd->satacmd_acdb_len = sdinfo->satadrv_atapi_cdb_len; 10074 bzero(scmd->satacmd_acdb, SATA_ATAPI_MAX_CDB_LEN); 10075 scmd->satacmd_acdb[0] = 0x12; /* Inquiry */ 10076 scmd->satacmd_acdb[1] = 0x00; 10077 scmd->satacmd_acdb[2] = 0x00; 10078 scmd->satacmd_acdb[3] = 0x00; 10079 scmd->satacmd_acdb[4] = sizeof (struct scsi_inquiry); 10080 scmd->satacmd_acdb[5] = 0x00; 10081 10082 sata_fixed_sense_data_preset( 10083 (struct scsi_extended_sense *)scmd->satacmd_rqsense); 10084 10085 /* Transfer command to HBA */ 10086 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex); 10087 if (sata_hba_start(spx, &rval) != 0) { 10088 /* Pkt not accepted for execution */ 10089 sata_log(sata_hba_inst, CE_WARN, 10090 "sata_test_atapi_packet_command: " 10091 "Packet not accepted for execution - ret: %02x", rval); 10092 mutex_exit( 10093 &SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex); 10094 goto cleanup; 10095 } 10096 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex); 10097 10098 if (spx->txlt_buf_dma_handle != NULL) { 10099 /* 10100 * Sync buffer. Handle is in usual place in translate struct. 10101 */ 10102 rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0, 10103 DDI_DMA_SYNC_FORCPU); 10104 ASSERT(rval == DDI_SUCCESS); 10105 } 10106 if (spkt->satapkt_reason == SATA_PKT_COMPLETED) { 10107 sata_log(sata_hba_inst, CE_WARN, 10108 "sata_test_atapi_packet_command: " 10109 "Packet completed successfully"); 10110 /* 10111 * Normal completion - show inquiry data 10112 */ 10113 sata_show_inqry_data((uint8_t *)bp->b_un.b_addr); 10114 } else { 10115 /* 10116 * Something went wrong - analyze return - check rqsense data 10117 */ 10118 if (spkt->satapkt_reason == SATA_PKT_DEV_ERROR) { 10119 /* 10120 * ARQ data hopefull show something other than NO SENSE 10121 */ 10122 rqsp = scmd->satacmd_rqsense; 10123 sata_log(spx->txlt_sata_hba_inst, CE_WARN, 10124 "ATAPI packet completion reason: %02x\n" 10125 "RQSENSE: %02x %02x %02x %02x %02x %02x " 10126 " %02x %02x %02x %02x %02x %02x " 10127 " %02x %02x %02x %02x %02x %02x\n", 10128 spkt->satapkt_reason, 10129 rqsp[0], rqsp[1], rqsp[2], rqsp[3], 10130 rqsp[4], rqsp[5], rqsp[6], rqsp[7], 10131 rqsp[8], rqsp[9], rqsp[10], rqsp[11], 10132 rqsp[12], rqsp[13], rqsp[14], rqsp[15], 10133 rqsp[16], rqsp[17]); 10134 } else { 10135 switch (spkt->satapkt_reason) { 10136 case SATA_PKT_PORT_ERROR: 10137 sata_log(sata_hba_inst, CE_WARN, 10138 "sata_test_atapi_packet_command: " 10139 "packet reason: port error\n"); 10140 break; 10141 10142 case SATA_PKT_TIMEOUT: 10143 sata_log(sata_hba_inst, CE_WARN, 10144 "sata_test_atapi_packet_command: " 10145 "packet reason: timeout\n"); 10146 break; 10147 10148 case SATA_PKT_ABORTED: 10149 sata_log(sata_hba_inst, CE_WARN, 10150 "sata_test_atapi_packet_command: " 10151 "packet reason: aborted\n"); 10152 break; 10153 10154 case SATA_PKT_RESET: 10155 sata_log(sata_hba_inst, CE_WARN, 10156 "sata_test_atapi_packet_command: " 10157 "packet reason: reset\n"); 10158 break; 10159 default: 10160 sata_log(sata_hba_inst, CE_WARN, 10161 "sata_test_atapi_packet_command: " 10162 "invalid packet reason: %02x\n", 10163 spkt->satapkt_reason); 10164 break; 10165 } 10166 } 10167 } 10168 cleanup: 10169 sata_free_local_buffer(spx); 10170 sata_pkt_free(spx); 10171 kmem_free(spx, sizeof (sata_pkt_txlate_t)); 10172 } 10173 10174 #endif /* SATA_DEBUG */ 10175 #endif /* 1 */ 10176 10177 10178 /* ************************** LOCAL HELPER FUNCTIONS *********************** */ 10179 10180 /* 10181 * Validate sata_tran info 10182 * SATA_FAILURE returns if structure is inconsistent or structure revision 10183 * does not match one used by the framework. 10184 * 10185 * Returns SATA_SUCCESS if sata_hba_tran has matching revision and contains 10186 * required function pointers. 10187 * Returns SATA_FAILURE otherwise. 10188 */ 10189 static int 10190 sata_validate_sata_hba_tran(dev_info_t *dip, sata_hba_tran_t *sata_tran) 10191 { 10192 /* 10193 * SATA_TRAN_HBA_REV is the current (highest) revision number 10194 * of the SATA interface. 10195 */ 10196 if (sata_tran->sata_tran_hba_rev > SATA_TRAN_HBA_REV) { 10197 sata_log(NULL, CE_WARN, 10198 "sata: invalid sata_hba_tran version %d for driver %s", 10199 sata_tran->sata_tran_hba_rev, ddi_driver_name(dip)); 10200 return (SATA_FAILURE); 10201 } 10202 10203 if (dip != sata_tran->sata_tran_hba_dip) { 10204 SATA_LOG_D((NULL, CE_WARN, 10205 "sata: inconsistent sata_tran_hba_dip " 10206 "%p / %p", sata_tran->sata_tran_hba_dip, dip)); 10207 return (SATA_FAILURE); 10208 } 10209 10210 if (sata_tran->sata_tran_probe_port == NULL || 10211 sata_tran->sata_tran_start == NULL || 10212 sata_tran->sata_tran_abort == NULL || 10213 sata_tran->sata_tran_reset_dport == NULL || 10214 sata_tran->sata_tran_hotplug_ops == NULL || 10215 sata_tran->sata_tran_hotplug_ops->sata_tran_port_activate == NULL || 10216 sata_tran->sata_tran_hotplug_ops->sata_tran_port_deactivate == 10217 NULL) { 10218 SATA_LOG_D((NULL, CE_WARN, "sata: sata_hba_tran missing " 10219 "required functions")); 10220 } 10221 return (SATA_SUCCESS); 10222 } 10223 10224 /* 10225 * Remove HBA instance from sata_hba_list. 10226 */ 10227 static void 10228 sata_remove_hba_instance(dev_info_t *dip) 10229 { 10230 sata_hba_inst_t *sata_hba_inst; 10231 10232 mutex_enter(&sata_mutex); 10233 for (sata_hba_inst = sata_hba_list; 10234 sata_hba_inst != (struct sata_hba_inst *)NULL; 10235 sata_hba_inst = sata_hba_inst->satahba_next) { 10236 if (sata_hba_inst->satahba_dip == dip) 10237 break; 10238 } 10239 10240 if (sata_hba_inst == (struct sata_hba_inst *)NULL) { 10241 #ifdef SATA_DEBUG 10242 cmn_err(CE_WARN, "sata_remove_hba_instance: " 10243 "unknown HBA instance\n"); 10244 #endif 10245 ASSERT(FALSE); 10246 } 10247 if (sata_hba_inst == sata_hba_list) { 10248 sata_hba_list = sata_hba_inst->satahba_next; 10249 if (sata_hba_list) { 10250 sata_hba_list->satahba_prev = 10251 (struct sata_hba_inst *)NULL; 10252 } 10253 if (sata_hba_inst == sata_hba_list_tail) { 10254 sata_hba_list_tail = NULL; 10255 } 10256 } else if (sata_hba_inst == sata_hba_list_tail) { 10257 sata_hba_list_tail = sata_hba_inst->satahba_prev; 10258 if (sata_hba_list_tail) { 10259 sata_hba_list_tail->satahba_next = 10260 (struct sata_hba_inst *)NULL; 10261 } 10262 } else { 10263 sata_hba_inst->satahba_prev->satahba_next = 10264 sata_hba_inst->satahba_next; 10265 sata_hba_inst->satahba_next->satahba_prev = 10266 sata_hba_inst->satahba_prev; 10267 } 10268 mutex_exit(&sata_mutex); 10269 } 10270 10271 /* 10272 * Probe all SATA ports of the specified HBA instance. 10273 * The assumption is that there are no target and attachment point minor nodes 10274 * created by the boot subsystems, so we do not need to prune device tree. 10275 * 10276 * This function is called only from sata_hba_attach(). It does not have to 10277 * be protected by controller mutex, because the hba_attached flag is not set 10278 * yet and no one would be touching this HBA instance other than this thread. 10279 * Determines if port is active and what type of the device is attached 10280 * (if any). Allocates necessary structures for each port. 10281 * 10282 * An AP (Attachement Point) node is created for each SATA device port even 10283 * when there is no device attached. 10284 */ 10285 10286 static void 10287 sata_probe_ports(sata_hba_inst_t *sata_hba_inst) 10288 { 10289 dev_info_t *dip = SATA_DIP(sata_hba_inst); 10290 int ncport; 10291 sata_cport_info_t *cportinfo; 10292 sata_drive_info_t *drive; 10293 sata_device_t sata_device; 10294 int rval; 10295 dev_t minor_number; 10296 char name[16]; 10297 clock_t start_time, cur_time; 10298 10299 /* 10300 * Probe controller ports first, to find port status and 10301 * any port multiplier attached. 10302 */ 10303 for (ncport = 0; ncport < SATA_NUM_CPORTS(sata_hba_inst); ncport++) { 10304 /* allocate cport structure */ 10305 cportinfo = kmem_zalloc(sizeof (sata_cport_info_t), KM_SLEEP); 10306 ASSERT(cportinfo != NULL); 10307 mutex_init(&cportinfo->cport_mutex, NULL, MUTEX_DRIVER, NULL); 10308 10309 mutex_enter(&cportinfo->cport_mutex); 10310 10311 cportinfo->cport_addr.cport = ncport; 10312 cportinfo->cport_addr.pmport = 0; 10313 cportinfo->cport_addr.qual = SATA_ADDR_CPORT; 10314 cportinfo->cport_state &= ~SATA_PORT_STATE_CLEAR_MASK; 10315 cportinfo->cport_state |= SATA_STATE_PROBING; 10316 SATA_CPORT_INFO(sata_hba_inst, ncport) = cportinfo; 10317 10318 /* 10319 * Regardless if a port is usable or not, create 10320 * an attachment point 10321 */ 10322 mutex_exit(&cportinfo->cport_mutex); 10323 minor_number = SATA_MAKE_AP_MINOR(ddi_get_instance(dip), 10324 ncport, 0, SATA_ADDR_CPORT); 10325 (void) sprintf(name, "%d", ncport); 10326 if (ddi_create_minor_node(dip, name, S_IFCHR, 10327 minor_number, DDI_NT_SATA_ATTACHMENT_POINT, 0) != 10328 DDI_SUCCESS) { 10329 sata_log(sata_hba_inst, CE_WARN, "sata_hba_attach: " 10330 "cannot create SATA attachment point for port %d", 10331 ncport); 10332 } 10333 10334 /* Probe port */ 10335 start_time = ddi_get_lbolt(); 10336 reprobe_cport: 10337 sata_device.satadev_addr.cport = ncport; 10338 sata_device.satadev_addr.pmport = 0; 10339 sata_device.satadev_addr.qual = SATA_ADDR_CPORT; 10340 sata_device.satadev_rev = SATA_DEVICE_REV; 10341 10342 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst)) 10343 (dip, &sata_device); 10344 10345 mutex_enter(&cportinfo->cport_mutex); 10346 cportinfo->cport_scr = sata_device.satadev_scr; 10347 if (rval != SATA_SUCCESS) { 10348 /* Something went wrong? Fail the port */ 10349 cportinfo->cport_state = SATA_PSTATE_FAILED; 10350 mutex_exit(&cportinfo->cport_mutex); 10351 continue; 10352 } 10353 cportinfo->cport_state &= ~SATA_STATE_PROBING; 10354 cportinfo->cport_state |= SATA_STATE_PROBED; 10355 cportinfo->cport_dev_type = sata_device.satadev_type; 10356 10357 cportinfo->cport_state |= SATA_STATE_READY; 10358 if (cportinfo->cport_dev_type == SATA_DTYPE_NONE) { 10359 mutex_exit(&cportinfo->cport_mutex); 10360 continue; 10361 } 10362 if (cportinfo->cport_dev_type != SATA_DTYPE_PMULT) { 10363 /* 10364 * There is some device attached. 10365 * Allocate device info structure 10366 */ 10367 if (SATA_CPORTINFO_DRV_INFO(cportinfo) == NULL) { 10368 mutex_exit(&cportinfo->cport_mutex); 10369 SATA_CPORTINFO_DRV_INFO(cportinfo) = 10370 kmem_zalloc(sizeof (sata_drive_info_t), 10371 KM_SLEEP); 10372 mutex_enter(&cportinfo->cport_mutex); 10373 } 10374 drive = SATA_CPORTINFO_DRV_INFO(cportinfo); 10375 drive->satadrv_addr = cportinfo->cport_addr; 10376 drive->satadrv_addr.qual = SATA_ADDR_DCPORT; 10377 drive->satadrv_type = cportinfo->cport_dev_type; 10378 drive->satadrv_state = SATA_STATE_UNKNOWN; 10379 10380 mutex_exit(&cportinfo->cport_mutex); 10381 if (sata_add_device(dip, sata_hba_inst, &sata_device) != 10382 SATA_SUCCESS) { 10383 /* 10384 * Plugged device was not correctly identified. 10385 * Retry, within a SATA_DEV_IDENTIFY_TIMEOUT 10386 */ 10387 cur_time = ddi_get_lbolt(); 10388 if ((cur_time - start_time) < 10389 drv_usectohz(SATA_DEV_IDENTIFY_TIMEOUT)) { 10390 /* sleep for a while */ 10391 delay(drv_usectohz( 10392 SATA_DEV_RETRY_DLY)); 10393 goto reprobe_cport; 10394 } 10395 } 10396 } else { /* SATA_DTYPE_PMULT */ 10397 mutex_exit(&cportinfo->cport_mutex); 10398 10399 /* Allocate sata_pmult_info and sata_pmport_info */ 10400 if (sata_alloc_pmult(sata_hba_inst, &sata_device) != 10401 SATA_SUCCESS) 10402 continue; 10403 10404 /* Log the information of the port multiplier */ 10405 sata_show_pmult_info(sata_hba_inst, &sata_device); 10406 10407 /* Probe its pmports */ 10408 sata_probe_pmports(sata_hba_inst, ncport); 10409 } 10410 } 10411 } 10412 10413 /* 10414 * Probe all device ports behind a port multiplier. 10415 * 10416 * PMult-related structure should be allocated before by sata_alloc_pmult(). 10417 * 10418 * NOTE1: Only called from sata_probe_ports() 10419 * NOTE2: No mutex should be hold. 10420 */ 10421 static void 10422 sata_probe_pmports(sata_hba_inst_t *sata_hba_inst, uint8_t ncport) 10423 { 10424 dev_info_t *dip = SATA_DIP(sata_hba_inst); 10425 sata_pmult_info_t *pmultinfo = NULL; 10426 sata_pmport_info_t *pmportinfo = NULL; 10427 sata_drive_info_t *drive = NULL; 10428 sata_device_t sata_device; 10429 10430 clock_t start_time, cur_time; 10431 int npmport; 10432 int rval; 10433 10434 pmultinfo = SATA_PMULT_INFO(sata_hba_inst, ncport); 10435 10436 /* Probe Port Multiplier ports */ 10437 for (npmport = 0; npmport < pmultinfo->pmult_num_dev_ports; npmport++) { 10438 pmportinfo = pmultinfo->pmult_dev_port[npmport]; 10439 start_time = ddi_get_lbolt(); 10440 reprobe_pmport: 10441 sata_device.satadev_addr.cport = ncport; 10442 sata_device.satadev_addr.pmport = npmport; 10443 sata_device.satadev_addr.qual = SATA_ADDR_PMPORT; 10444 sata_device.satadev_rev = SATA_DEVICE_REV; 10445 10446 /* Let HBA driver probe it. */ 10447 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst)) 10448 (dip, &sata_device); 10449 mutex_enter(&pmportinfo->pmport_mutex); 10450 10451 pmportinfo->pmport_scr = sata_device.satadev_scr; 10452 10453 if (rval != SATA_SUCCESS) { 10454 pmportinfo->pmport_state = 10455 SATA_PSTATE_FAILED; 10456 mutex_exit(&pmportinfo->pmport_mutex); 10457 continue; 10458 } 10459 pmportinfo->pmport_state &= ~SATA_STATE_PROBING; 10460 pmportinfo->pmport_state |= SATA_STATE_PROBED; 10461 pmportinfo->pmport_dev_type = sata_device.satadev_type; 10462 10463 pmportinfo->pmport_state |= SATA_STATE_READY; 10464 if (pmportinfo->pmport_dev_type == 10465 SATA_DTYPE_NONE) { 10466 SATADBG2(SATA_DBG_PMULT, sata_hba_inst, 10467 "no device found at port %d:%d", ncport, npmport); 10468 mutex_exit(&pmportinfo->pmport_mutex); 10469 continue; 10470 } 10471 /* Port multipliers cannot be chained */ 10472 ASSERT(pmportinfo->pmport_dev_type != SATA_DTYPE_PMULT); 10473 /* 10474 * There is something attached to Port 10475 * Multiplier device port 10476 * Allocate device info structure 10477 */ 10478 if (pmportinfo->pmport_sata_drive == NULL) { 10479 mutex_exit(&pmportinfo->pmport_mutex); 10480 pmportinfo->pmport_sata_drive = 10481 kmem_zalloc(sizeof (sata_drive_info_t), KM_SLEEP); 10482 mutex_enter(&pmportinfo->pmport_mutex); 10483 } 10484 drive = pmportinfo->pmport_sata_drive; 10485 drive->satadrv_addr.cport = pmportinfo->pmport_addr.cport; 10486 drive->satadrv_addr.pmport = npmport; 10487 drive->satadrv_addr.qual = SATA_ADDR_DPMPORT; 10488 drive->satadrv_type = pmportinfo-> pmport_dev_type; 10489 drive->satadrv_state = SATA_STATE_UNKNOWN; 10490 10491 mutex_exit(&pmportinfo->pmport_mutex); 10492 rval = sata_add_device(dip, sata_hba_inst, &sata_device); 10493 10494 if (rval != SATA_SUCCESS) { 10495 /* 10496 * Plugged device was not correctly identified. 10497 * Retry, within the SATA_DEV_IDENTIFY_TIMEOUT 10498 */ 10499 cur_time = ddi_get_lbolt(); 10500 if ((cur_time - start_time) < drv_usectohz( 10501 SATA_DEV_IDENTIFY_TIMEOUT)) { 10502 /* sleep for a while */ 10503 delay(drv_usectohz(SATA_DEV_RETRY_DLY)); 10504 goto reprobe_pmport; 10505 } 10506 } 10507 } 10508 } 10509 10510 /* 10511 * Add SATA device for specified HBA instance & port (SCSI target 10512 * device nodes). 10513 * This function is called (indirectly) only from sata_hba_attach(). 10514 * A target node is created when there is a supported type device attached, 10515 * but may be removed if it cannot be put online. 10516 * 10517 * This function cannot be called from an interrupt context. 10518 * 10519 * Create target nodes for disk, CD/DVD, Tape and ATAPI disk devices 10520 * 10521 * Returns SATA_SUCCESS when port/device was fully processed, SATA_FAILURE when 10522 * device identification failed - adding a device could be retried. 10523 * 10524 */ 10525 static int 10526 sata_add_device(dev_info_t *pdip, sata_hba_inst_t *sata_hba_inst, 10527 sata_device_t *sata_device) 10528 { 10529 sata_cport_info_t *cportinfo; 10530 sata_pmult_info_t *pminfo; 10531 sata_pmport_info_t *pmportinfo; 10532 dev_info_t *cdip; /* child dip */ 10533 sata_address_t *saddr = &sata_device->satadev_addr; 10534 uint8_t cport, pmport; 10535 int rval; 10536 10537 cport = saddr->cport; 10538 pmport = saddr->pmport; 10539 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport); 10540 ASSERT(cportinfo->cport_dev_type != SATA_DTYPE_NONE); 10541 10542 /* 10543 * Some device is attached to a controller port. 10544 * We rely on controllers distinquishing between no-device, 10545 * attached port multiplier and other kind of attached device. 10546 * We need to get Identify Device data and determine 10547 * positively the dev type before trying to attach 10548 * the target driver. 10549 */ 10550 sata_device->satadev_rev = SATA_DEVICE_REV; 10551 switch (saddr->qual) { 10552 case SATA_ADDR_CPORT: 10553 /* 10554 * Add a non-port-multiplier device at controller port. 10555 */ 10556 saddr->qual = SATA_ADDR_DCPORT; 10557 10558 rval = sata_probe_device(sata_hba_inst, sata_device); 10559 if (rval != SATA_SUCCESS || 10560 sata_device->satadev_type == SATA_DTYPE_UNKNOWN) 10561 return (SATA_FAILURE); 10562 10563 mutex_enter(&cportinfo->cport_mutex); 10564 sata_show_drive_info(sata_hba_inst, 10565 SATA_CPORTINFO_DRV_INFO(cportinfo)); 10566 10567 if ((sata_device->satadev_type & SATA_VALID_DEV_TYPE) == 0) { 10568 /* 10569 * Could not determine device type or 10570 * a device is not supported. 10571 * Degrade this device to unknown. 10572 */ 10573 cportinfo->cport_dev_type = SATA_DTYPE_UNKNOWN; 10574 mutex_exit(&cportinfo->cport_mutex); 10575 return (SATA_SUCCESS); 10576 } 10577 cportinfo->cport_dev_type = sata_device->satadev_type; 10578 cportinfo->cport_tgtnode_clean = B_TRUE; 10579 mutex_exit(&cportinfo->cport_mutex); 10580 10581 /* 10582 * Initialize device to the desired state. Even if it 10583 * fails, the device will still attach but syslog 10584 * will show the warning. 10585 */ 10586 if (sata_initialize_device(sata_hba_inst, 10587 SATA_CPORTINFO_DRV_INFO(cportinfo)) != SATA_SUCCESS) { 10588 /* Retry */ 10589 rval = sata_initialize_device(sata_hba_inst, 10590 SATA_CPORTINFO_DRV_INFO(cportinfo)); 10591 10592 if (rval == SATA_RETRY) 10593 sata_log(sata_hba_inst, CE_WARN, 10594 "SATA device at port %d - " 10595 "default device features could not be set." 10596 " Device may not operate as expected.", 10597 cport); 10598 } 10599 10600 cdip = sata_create_target_node(pdip, sata_hba_inst, saddr); 10601 if (cdip == NULL) { 10602 /* 10603 * Attaching target node failed. 10604 * We retain sata_drive_info structure... 10605 */ 10606 return (SATA_SUCCESS); 10607 } 10608 10609 mutex_enter(&cportinfo->cport_mutex); 10610 (SATA_CPORTINFO_DRV_INFO(cportinfo))-> 10611 satadrv_state = SATA_STATE_READY; 10612 mutex_exit(&cportinfo->cport_mutex); 10613 10614 break; 10615 10616 case SATA_ADDR_PMPORT: 10617 saddr->qual = SATA_ADDR_DPMPORT; 10618 10619 mutex_enter(&cportinfo->cport_mutex); 10620 /* It must be a Port Multiplier at the controller port */ 10621 ASSERT(cportinfo->cport_dev_type == SATA_DTYPE_PMULT); 10622 10623 pminfo = SATA_CPORTINFO_PMULT_INFO(cportinfo); 10624 pmportinfo = pminfo->pmult_dev_port[saddr->pmport]; 10625 mutex_exit(&cportinfo->cport_mutex); 10626 10627 rval = sata_probe_device(sata_hba_inst, sata_device); 10628 if (rval != SATA_SUCCESS || 10629 sata_device->satadev_type == SATA_DTYPE_UNKNOWN) { 10630 return (SATA_FAILURE); 10631 } 10632 10633 mutex_enter(&pmportinfo->pmport_mutex); 10634 sata_show_drive_info(sata_hba_inst, 10635 SATA_PMPORTINFO_DRV_INFO(pmportinfo)); 10636 10637 if ((sata_device->satadev_type & SATA_VALID_DEV_TYPE) == 0) { 10638 /* 10639 * Could not determine device type. 10640 * Degrade this device to unknown. 10641 */ 10642 pmportinfo->pmport_dev_type = SATA_DTYPE_UNKNOWN; 10643 mutex_exit(&pmportinfo->pmport_mutex); 10644 return (SATA_SUCCESS); 10645 } 10646 pmportinfo->pmport_dev_type = sata_device->satadev_type; 10647 pmportinfo->pmport_tgtnode_clean = B_TRUE; 10648 mutex_exit(&pmportinfo->pmport_mutex); 10649 10650 /* 10651 * Initialize device to the desired state. 10652 * Even if it fails, the device will still 10653 * attach but syslog will show the warning. 10654 */ 10655 if (sata_initialize_device(sata_hba_inst, 10656 pmportinfo->pmport_sata_drive) != SATA_SUCCESS) { 10657 /* Retry */ 10658 rval = sata_initialize_device(sata_hba_inst, 10659 pmportinfo->pmport_sata_drive); 10660 10661 if (rval == SATA_RETRY) 10662 sata_log(sata_hba_inst, CE_WARN, 10663 "SATA device at port %d:%d - " 10664 "default device features could not be set." 10665 " Device may not operate as expected.", 10666 cport, pmport); 10667 } 10668 10669 cdip = sata_create_target_node(pdip, sata_hba_inst, saddr); 10670 if (cdip == NULL) { 10671 /* 10672 * Attaching target node failed. 10673 * We retain sata_drive_info structure... 10674 */ 10675 return (SATA_SUCCESS); 10676 } 10677 mutex_enter(&pmportinfo->pmport_mutex); 10678 pmportinfo->pmport_sata_drive->satadrv_state |= 10679 SATA_STATE_READY; 10680 mutex_exit(&pmportinfo->pmport_mutex); 10681 10682 break; 10683 10684 default: 10685 return (SATA_FAILURE); 10686 } 10687 10688 return (SATA_SUCCESS); 10689 } 10690 10691 /* 10692 * Clean up target node at specific address. 10693 * 10694 * NOTE: No Mutex should be hold. 10695 */ 10696 static int 10697 sata_offline_device(sata_hba_inst_t *sata_hba_inst, 10698 sata_device_t *sata_device, sata_drive_info_t *sdinfo) 10699 { 10700 uint8_t cport, pmport, qual; 10701 dev_info_t *tdip; 10702 10703 cport = sata_device->satadev_addr.cport; 10704 pmport = sata_device->satadev_addr.pmport; 10705 qual = sata_device->satadev_addr.qual; 10706 10707 if (qual == SATA_ADDR_DCPORT) { 10708 SATA_LOG_D((sata_hba_inst, CE_WARN, 10709 "sata_hba_ioctl: disconnect device at port %d", cport)); 10710 } else { 10711 SATA_LOG_D((sata_hba_inst, CE_WARN, 10712 "sata_hba_ioctl: disconnect device at port %d:%d", 10713 cport, pmport)); 10714 } 10715 10716 /* We are addressing attached device, not a port */ 10717 sata_device->satadev_addr.qual = 10718 sdinfo->satadrv_addr.qual; 10719 tdip = sata_get_scsi_target_dip(SATA_DIP(sata_hba_inst), 10720 &sata_device->satadev_addr); 10721 if (tdip != NULL && ndi_devi_offline(tdip, 10722 NDI_DEVI_REMOVE) != NDI_SUCCESS) { 10723 /* 10724 * Problem : 10725 * The target node remained attached. 10726 * This happens when the device file was open 10727 * or a node was waiting for resources. 10728 * Cannot do anything about it. 10729 */ 10730 if (qual == SATA_ADDR_DCPORT) { 10731 SATA_LOG_D((sata_hba_inst, CE_WARN, 10732 "sata_hba_ioctl: disconnect: could " 10733 "not unconfigure device before " 10734 "disconnecting the SATA port %d", 10735 cport)); 10736 } else { 10737 SATA_LOG_D((sata_hba_inst, CE_WARN, 10738 "sata_hba_ioctl: disconnect: could " 10739 "not unconfigure device before " 10740 "disconnecting the SATA port %d:%d", 10741 cport, pmport)); 10742 } 10743 /* 10744 * Set DEVICE REMOVED state in the target 10745 * node. It will prevent access to the device 10746 * even when a new device is attached, until 10747 * the old target node is released, removed and 10748 * recreated for a new device. 10749 */ 10750 sata_set_device_removed(tdip); 10751 10752 /* 10753 * Instruct event daemon to try the target 10754 * node cleanup later. 10755 */ 10756 sata_set_target_node_cleanup( 10757 sata_hba_inst, &sata_device->satadev_addr); 10758 } 10759 10760 10761 return (SATA_SUCCESS); 10762 } 10763 10764 10765 /* 10766 * Create scsi target node for attached device, create node properties and 10767 * attach the node. 10768 * The node could be removed if the device onlining fails. 10769 * 10770 * A dev_info_t pointer is returned if operation is successful, NULL is 10771 * returned otherwise. 10772 */ 10773 10774 static dev_info_t * 10775 sata_create_target_node(dev_info_t *dip, sata_hba_inst_t *sata_hba_inst, 10776 sata_address_t *sata_addr) 10777 { 10778 dev_info_t *cdip = NULL; 10779 int rval; 10780 char *nname = NULL; 10781 char **compatible = NULL; 10782 int ncompatible; 10783 struct scsi_inquiry inq; 10784 sata_device_t sata_device; 10785 sata_drive_info_t *sdinfo; 10786 int target; 10787 int i; 10788 10789 sata_device.satadev_rev = SATA_DEVICE_REV; 10790 sata_device.satadev_addr = *sata_addr; 10791 10792 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, sata_addr->cport))); 10793 10794 sdinfo = sata_get_device_info(sata_hba_inst, &sata_device); 10795 10796 target = SATA_TO_SCSI_TARGET(sata_addr->cport, 10797 sata_addr->pmport, sata_addr->qual); 10798 10799 if (sdinfo == NULL) { 10800 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, 10801 sata_addr->cport))); 10802 SATA_LOG_D((sata_hba_inst, CE_WARN, 10803 "sata_create_target_node: no sdinfo for target %x", 10804 target)); 10805 return (NULL); 10806 } 10807 10808 /* 10809 * create or get scsi inquiry data, expected by 10810 * scsi_hba_nodename_compatible_get() 10811 * SATA hard disks get Identify Data translated into Inguiry Data. 10812 * ATAPI devices respond directly to Inquiry request. 10813 */ 10814 if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) { 10815 sata_identdev_to_inquiry(sata_hba_inst, sdinfo, 10816 (uint8_t *)&inq); 10817 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, 10818 sata_addr->cport))); 10819 } else { /* Assume supported ATAPI device */ 10820 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, 10821 sata_addr->cport))); 10822 if (sata_get_atapi_inquiry_data(sata_hba_inst, sata_addr, 10823 &inq) == SATA_FAILURE) 10824 return (NULL); 10825 /* 10826 * Save supported ATAPI transport version 10827 */ 10828 sdinfo->satadrv_atapi_trans_ver = 10829 SATA_ATAPI_TRANS_VERSION(&inq); 10830 } 10831 10832 /* determine the node name and compatible */ 10833 scsi_hba_nodename_compatible_get(&inq, NULL, 10834 inq.inq_dtype, NULL, &nname, &compatible, &ncompatible); 10835 10836 #ifdef SATA_DEBUG 10837 if (sata_debug_flags & SATA_DBG_NODES) { 10838 if (nname == NULL) { 10839 cmn_err(CE_NOTE, "sata_create_target_node: " 10840 "cannot determine nodename for target %d\n", 10841 target); 10842 } else { 10843 cmn_err(CE_WARN, "sata_create_target_node: " 10844 "target %d nodename: %s\n", target, nname); 10845 } 10846 if (compatible == NULL) { 10847 cmn_err(CE_WARN, 10848 "sata_create_target_node: no compatible name\n"); 10849 } else { 10850 for (i = 0; i < ncompatible; i++) { 10851 cmn_err(CE_WARN, "sata_create_target_node: " 10852 "compatible name: %s\n", compatible[i]); 10853 } 10854 } 10855 } 10856 #endif 10857 10858 /* if nodename can't be determined, log error and exit */ 10859 if (nname == NULL) { 10860 SATA_LOG_D((sata_hba_inst, CE_WARN, 10861 "sata_create_target_node: cannot determine nodename " 10862 "for target %d\n", target)); 10863 scsi_hba_nodename_compatible_free(nname, compatible); 10864 return (NULL); 10865 } 10866 /* 10867 * Create scsi target node 10868 */ 10869 ndi_devi_alloc_sleep(dip, nname, (pnode_t)DEVI_SID_NODEID, &cdip); 10870 rval = ndi_prop_update_string(DDI_DEV_T_NONE, cdip, 10871 "device-type", "scsi"); 10872 10873 if (rval != DDI_PROP_SUCCESS) { 10874 SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_create_target_node: " 10875 "updating device_type prop failed %d", rval)); 10876 goto fail; 10877 } 10878 10879 /* 10880 * Create target node properties: target & lun 10881 */ 10882 rval = ndi_prop_update_int(DDI_DEV_T_NONE, cdip, "target", target); 10883 if (rval != DDI_PROP_SUCCESS) { 10884 SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_create_target_node: " 10885 "updating target prop failed %d", rval)); 10886 goto fail; 10887 } 10888 rval = ndi_prop_update_int(DDI_DEV_T_NONE, cdip, "lun", 0); 10889 if (rval != DDI_PROP_SUCCESS) { 10890 SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_create_target_node: " 10891 "updating target prop failed %d", rval)); 10892 goto fail; 10893 } 10894 10895 if (sdinfo->satadrv_type & SATA_DTYPE_ATAPI) { 10896 /* 10897 * Add "variant" property 10898 */ 10899 rval = ndi_prop_update_string(DDI_DEV_T_NONE, cdip, 10900 "variant", "atapi"); 10901 if (rval != DDI_PROP_SUCCESS) { 10902 SATA_LOG_D((sata_hba_inst, CE_WARN, 10903 "sata_create_target_node: variant atapi " 10904 "property could not be created: %d", rval)); 10905 goto fail; 10906 } 10907 } 10908 /* decorate the node with compatible */ 10909 if (ndi_prop_update_string_array(DDI_DEV_T_NONE, cdip, "compatible", 10910 compatible, ncompatible) != DDI_PROP_SUCCESS) { 10911 SATA_LOG_D((sata_hba_inst, CE_WARN, 10912 "sata_create_target_node: FAIL compatible props cdip 0x%p", 10913 (void *)cdip)); 10914 goto fail; 10915 } 10916 10917 if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) { 10918 /* 10919 * Add "sata-phy" property 10920 */ 10921 if (ndi_prop_update_int(DDI_DEV_T_NONE, cdip, "sata-phy", 10922 (int)sata_addr->cport) != DDI_PROP_SUCCESS) { 10923 SATA_LOG_D((sata_hba_inst, CE_WARN, 10924 "sata_create_target_node: failed to create " 10925 "\"sata-phy\" property: port %d", 10926 sata_addr->cport)); 10927 } 10928 } 10929 10930 10931 /* 10932 * Now, try to attach the driver. If probing of the device fails, 10933 * the target node may be removed 10934 */ 10935 rval = ndi_devi_online(cdip, NDI_ONLINE_ATTACH); 10936 10937 scsi_hba_nodename_compatible_free(nname, compatible); 10938 10939 if (rval == NDI_SUCCESS) 10940 return (cdip); 10941 10942 /* target node was removed - are we sure? */ 10943 return (NULL); 10944 10945 fail: 10946 scsi_hba_nodename_compatible_free(nname, compatible); 10947 ddi_prop_remove_all(cdip); 10948 rval = ndi_devi_free(cdip); 10949 if (rval != NDI_SUCCESS) { 10950 SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_create_target_node: " 10951 "node removal failed %d", rval)); 10952 } 10953 sata_log(sata_hba_inst, CE_WARN, "sata_create_target_node: " 10954 "cannot create target node for SATA device at port %d", 10955 sata_addr->cport); 10956 return (NULL); 10957 } 10958 10959 /* 10960 * Remove a target node. 10961 */ 10962 static void 10963 sata_remove_target_node(sata_hba_inst_t *sata_hba_inst, 10964 sata_address_t *sata_addr) 10965 { 10966 dev_info_t *tdip; 10967 uint8_t cport = sata_addr->cport; 10968 uint8_t pmport = sata_addr->pmport; 10969 uint8_t qual = sata_addr->qual; 10970 10971 /* Note the sata daemon uses the address of the port/pmport */ 10972 ASSERT(qual == SATA_ADDR_CPORT || qual == SATA_ADDR_PMPORT); 10973 10974 /* Remove target node */ 10975 tdip = sata_get_target_dip(SATA_DIP(sata_hba_inst), cport, pmport); 10976 if (tdip != NULL) { 10977 /* 10978 * Target node exists. Unconfigure device 10979 * then remove the target node (one ndi 10980 * operation). 10981 */ 10982 if (ndi_devi_offline(tdip, NDI_DEVI_REMOVE) != NDI_SUCCESS) { 10983 /* 10984 * PROBLEM - no device, but target node remained. This 10985 * happens when the file was open or node was waiting 10986 * for resources. 10987 */ 10988 SATA_LOG_D((sata_hba_inst, CE_WARN, 10989 "sata_remove_target_node: " 10990 "Failed to remove target node for " 10991 "detached SATA device.")); 10992 /* 10993 * Set target node state to DEVI_DEVICE_REMOVED. But 10994 * re-check first that the node still exists. 10995 */ 10996 tdip = sata_get_target_dip(SATA_DIP(sata_hba_inst), 10997 cport, pmport); 10998 if (tdip != NULL) { 10999 sata_set_device_removed(tdip); 11000 /* 11001 * Instruct event daemon to retry the cleanup 11002 * later. 11003 */ 11004 sata_set_target_node_cleanup(sata_hba_inst, 11005 sata_addr); 11006 } 11007 } 11008 11009 if (qual == SATA_ADDR_CPORT) 11010 sata_log(sata_hba_inst, CE_WARN, 11011 "SATA device detached at port %d", cport); 11012 else 11013 sata_log(sata_hba_inst, CE_WARN, 11014 "SATA device detached at port %d:%d", 11015 cport, pmport); 11016 } 11017 #ifdef SATA_DEBUG 11018 else { 11019 if (qual == SATA_ADDR_CPORT) 11020 sata_log(sata_hba_inst, CE_WARN, 11021 "target node not found at port %d", cport); 11022 else 11023 sata_log(sata_hba_inst, CE_WARN, 11024 "target node not found at port %d:%d", 11025 cport, pmport); 11026 } 11027 #endif 11028 } 11029 11030 11031 /* 11032 * Re-probe sata port, check for a device and attach info 11033 * structures when necessary. Identify Device data is fetched, if possible. 11034 * Assumption: sata address is already validated. 11035 * SATA_SUCCESS is returned if port is re-probed sucessfully, regardless of 11036 * the presence of a device and its type. 11037 * 11038 * flag arg specifies that the function should try multiple times to identify 11039 * device type and to initialize it, or it should return immediately on failure. 11040 * SATA_DEV_IDENTIFY_RETRY - retry 11041 * SATA_DEV_IDENTIFY_NORETRY - no retry 11042 * 11043 * SATA_FAILURE is returned if one of the operations failed. 11044 * 11045 * This function cannot be called in interrupt context - it may sleep. 11046 * 11047 * Note: Port multiplier is supported. 11048 */ 11049 static int 11050 sata_reprobe_port(sata_hba_inst_t *sata_hba_inst, sata_device_t *sata_device, 11051 int flag) 11052 { 11053 sata_cport_info_t *cportinfo; 11054 sata_pmult_info_t *pmultinfo; 11055 sata_drive_info_t *sdinfo, *osdinfo; 11056 boolean_t init_device = B_FALSE; 11057 int prev_device_type = SATA_DTYPE_NONE; 11058 int prev_device_settings = 0; 11059 int prev_device_state = 0; 11060 clock_t start_time; 11061 int retry = B_FALSE; 11062 uint8_t cport = sata_device->satadev_addr.cport; 11063 int rval_probe, rval_init; 11064 11065 /* 11066 * If target is pmport, sata_reprobe_pmport() will handle it. 11067 */ 11068 if (sata_device->satadev_addr.qual == SATA_ADDR_PMPORT || 11069 sata_device->satadev_addr.qual == SATA_ADDR_DPMPORT) 11070 return (sata_reprobe_pmport(sata_hba_inst, sata_device, flag)); 11071 11072 /* We only care about host sata cport for now */ 11073 cportinfo = SATA_CPORT_INFO(sata_hba_inst, 11074 sata_device->satadev_addr.cport); 11075 11076 /* 11077 * If a port multiplier was previously attached (we have no idea it 11078 * still there or not), sata_reprobe_pmult() will handle it. 11079 */ 11080 if (cportinfo->cport_dev_type == SATA_DTYPE_PMULT) 11081 return (sata_reprobe_pmult(sata_hba_inst, sata_device, flag)); 11082 11083 /* Store sata_drive_info when a non-pmult device was attached. */ 11084 osdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo); 11085 if (osdinfo != NULL) { 11086 /* 11087 * We are re-probing port with a previously attached device. 11088 * Save previous device type and settings. 11089 */ 11090 prev_device_type = cportinfo->cport_dev_type; 11091 prev_device_settings = osdinfo->satadrv_settings; 11092 prev_device_state = osdinfo->satadrv_state; 11093 } 11094 if (flag == SATA_DEV_IDENTIFY_RETRY) { 11095 start_time = ddi_get_lbolt(); 11096 retry = B_TRUE; 11097 } 11098 retry_probe: 11099 11100 /* probe port */ 11101 mutex_enter(&cportinfo->cport_mutex); 11102 cportinfo->cport_state &= ~SATA_PORT_STATE_CLEAR_MASK; 11103 cportinfo->cport_state |= SATA_STATE_PROBING; 11104 mutex_exit(&cportinfo->cport_mutex); 11105 11106 rval_probe = (*SATA_PROBE_PORT_FUNC(sata_hba_inst)) 11107 (SATA_DIP(sata_hba_inst), sata_device); 11108 11109 mutex_enter(&cportinfo->cport_mutex); 11110 if (rval_probe != SATA_SUCCESS) { 11111 cportinfo->cport_state = SATA_PSTATE_FAILED; 11112 mutex_exit(&cportinfo->cport_mutex); 11113 SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_reprobe_port: " 11114 "SATA port %d probing failed", 11115 cportinfo->cport_addr.cport)); 11116 return (SATA_FAILURE); 11117 } 11118 11119 /* 11120 * update sata port state and set device type 11121 */ 11122 sata_update_port_info(sata_hba_inst, sata_device); 11123 cportinfo->cport_state &= ~SATA_STATE_PROBING; 11124 11125 /* 11126 * Sanity check - Port is active? Is the link active? 11127 * Is there any device attached? 11128 */ 11129 if ((cportinfo->cport_state & 11130 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) || 11131 (cportinfo->cport_scr.sstatus & SATA_PORT_DEVLINK_UP_MASK) != 11132 SATA_PORT_DEVLINK_UP) { 11133 /* 11134 * Port in non-usable state or no link active/no device. 11135 * Free info structure if necessary (direct attached drive 11136 * only, for now! 11137 */ 11138 sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo); 11139 SATA_CPORTINFO_DRV_INFO(cportinfo) = NULL; 11140 /* Add here differentiation for device attached or not */ 11141 cportinfo->cport_dev_type = SATA_DTYPE_NONE; 11142 mutex_exit(&cportinfo->cport_mutex); 11143 if (sdinfo != NULL) 11144 kmem_free(sdinfo, sizeof (sata_drive_info_t)); 11145 return (SATA_SUCCESS); 11146 } 11147 11148 cportinfo->cport_state |= SATA_STATE_READY; 11149 cportinfo->cport_state |= SATA_STATE_PROBED; 11150 11151 cportinfo->cport_dev_type = sata_device->satadev_type; 11152 sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo); 11153 11154 /* 11155 * If we are re-probing the port, there may be 11156 * sata_drive_info structure attached 11157 */ 11158 if (sata_device->satadev_type == SATA_DTYPE_NONE) { 11159 11160 /* 11161 * There is no device, so remove device info structure, 11162 * if necessary. 11163 */ 11164 /* Device change: Drive -> None */ 11165 SATA_CPORTINFO_DRV_INFO(cportinfo) = NULL; 11166 cportinfo->cport_dev_type = SATA_DTYPE_NONE; 11167 if (sdinfo != NULL) { 11168 kmem_free(sdinfo, sizeof (sata_drive_info_t)); 11169 sata_log(sata_hba_inst, CE_WARN, 11170 "SATA device detached " 11171 "from port %d", cportinfo->cport_addr.cport); 11172 } 11173 mutex_exit(&cportinfo->cport_mutex); 11174 return (SATA_SUCCESS); 11175 11176 } 11177 11178 if (sata_device->satadev_type != SATA_DTYPE_PMULT) { 11179 11180 /* Device (may) change: Drive -> Drive */ 11181 if (sdinfo == NULL) { 11182 /* 11183 * There is some device attached, but there is 11184 * no sata_drive_info structure - allocate one 11185 */ 11186 mutex_exit(&cportinfo->cport_mutex); 11187 sdinfo = kmem_zalloc( 11188 sizeof (sata_drive_info_t), KM_SLEEP); 11189 mutex_enter(&cportinfo->cport_mutex); 11190 /* 11191 * Recheck, that the port state did not change when we 11192 * released mutex. 11193 */ 11194 if (cportinfo->cport_state & SATA_STATE_READY) { 11195 SATA_CPORTINFO_DRV_INFO(cportinfo) = sdinfo; 11196 sdinfo->satadrv_addr = cportinfo->cport_addr; 11197 sdinfo->satadrv_addr.qual = SATA_ADDR_DCPORT; 11198 sdinfo->satadrv_type = SATA_DTYPE_UNKNOWN; 11199 sdinfo->satadrv_state = SATA_STATE_UNKNOWN; 11200 } else { 11201 /* 11202 * Port is not in ready state, we 11203 * cannot attach a device. 11204 */ 11205 mutex_exit(&cportinfo->cport_mutex); 11206 kmem_free(sdinfo, sizeof (sata_drive_info_t)); 11207 return (SATA_SUCCESS); 11208 } 11209 /* 11210 * Since we are adding device, presumably new one, 11211 * indicate that it should be initalized, 11212 * as well as some internal framework states). 11213 */ 11214 init_device = B_TRUE; 11215 } 11216 cportinfo->cport_dev_type = SATA_DTYPE_UNKNOWN; 11217 sata_device->satadev_addr.qual = sdinfo->satadrv_addr.qual; 11218 } else { 11219 /* Device change: Drive -> PMult */ 11220 SATA_CPORTINFO_DRV_INFO(cportinfo) = NULL; 11221 if (sdinfo != NULL) { 11222 kmem_free(sdinfo, sizeof (sata_drive_info_t)); 11223 sata_log(sata_hba_inst, CE_WARN, 11224 "SATA device detached " 11225 "from port %d", cportinfo->cport_addr.cport); 11226 } 11227 11228 sata_log(sata_hba_inst, CE_WARN, 11229 "SATA port multiplier detected at port %d", 11230 cportinfo->cport_addr.cport); 11231 11232 mutex_exit(&cportinfo->cport_mutex); 11233 if (sata_alloc_pmult(sata_hba_inst, sata_device) != 11234 SATA_SUCCESS) 11235 return (SATA_FAILURE); 11236 sata_show_pmult_info(sata_hba_inst, sata_device); 11237 mutex_enter(&cportinfo->cport_mutex); 11238 11239 /* 11240 * Mark all the port multiplier port behind the port 11241 * multiplier behind with link events, so that the sata daemon 11242 * will update their status. 11243 */ 11244 pmultinfo = SATA_PMULT_INFO(sata_hba_inst, cport); 11245 pmultinfo->pmult_event_flags |= SATA_EVNT_DEVICE_RESET; 11246 mutex_exit(&cportinfo->cport_mutex); 11247 return (SATA_SUCCESS); 11248 } 11249 mutex_exit(&cportinfo->cport_mutex); 11250 11251 /* 11252 * Figure out what kind of device we are really 11253 * dealing with. Failure of identifying device does not fail this 11254 * function. 11255 */ 11256 rval_probe = sata_probe_device(sata_hba_inst, sata_device); 11257 rval_init = SATA_FAILURE; 11258 mutex_enter(&cportinfo->cport_mutex); 11259 if (rval_probe == SATA_SUCCESS) { 11260 /* 11261 * If we are dealing with the same type of a device as before, 11262 * restore its settings flags. 11263 */ 11264 if (osdinfo != NULL && 11265 sata_device->satadev_type == prev_device_type) 11266 sdinfo->satadrv_settings = prev_device_settings; 11267 11268 mutex_exit(&cportinfo->cport_mutex); 11269 rval_init = SATA_SUCCESS; 11270 /* Set initial device features, if necessary */ 11271 if (init_device == B_TRUE) { 11272 rval_init = sata_initialize_device(sata_hba_inst, 11273 sdinfo); 11274 } 11275 if (rval_init == SATA_SUCCESS) 11276 return (rval_init); 11277 /* else we will retry if retry was asked for */ 11278 11279 } else { 11280 /* 11281 * If there was some device info before we probe the device, 11282 * restore previous device setting, so we can retry from scratch 11283 * later. Providing, of course, that device has not disapear 11284 * during probing process. 11285 */ 11286 if (sata_device->satadev_type != SATA_DTYPE_NONE) { 11287 if (osdinfo != NULL) { 11288 cportinfo->cport_dev_type = prev_device_type; 11289 sdinfo->satadrv_type = prev_device_type; 11290 sdinfo->satadrv_state = prev_device_state; 11291 } 11292 } else { 11293 /* device is gone */ 11294 kmem_free(sdinfo, sizeof (sata_drive_info_t)); 11295 cportinfo->cport_dev_type = SATA_DTYPE_NONE; 11296 SATA_CPORTINFO_DRV_INFO(cportinfo) = NULL; 11297 mutex_exit(&cportinfo->cport_mutex); 11298 return (SATA_SUCCESS); 11299 } 11300 mutex_exit(&cportinfo->cport_mutex); 11301 } 11302 11303 if (retry) { 11304 clock_t cur_time = ddi_get_lbolt(); 11305 /* 11306 * A device was not successfully identified or initialized. 11307 * Track retry time for device identification. 11308 */ 11309 if ((cur_time - start_time) < 11310 drv_usectohz(SATA_DEV_REPROBE_TIMEOUT)) { 11311 /* sleep for a while */ 11312 delay(drv_usectohz(SATA_DEV_RETRY_DLY)); 11313 goto retry_probe; 11314 } 11315 /* else no more retries */ 11316 mutex_enter(&cportinfo->cport_mutex); 11317 if (SATA_CPORTINFO_DRV_INFO(cportinfo) != NULL) { 11318 if (rval_init == SATA_RETRY) { 11319 /* 11320 * Setting drive features have failed, but 11321 * because the drive is still accessible, 11322 * keep it and emit a warning message. 11323 */ 11324 sata_log(sata_hba_inst, CE_WARN, 11325 "SATA device at port %d - desired " 11326 "drive features could not be set. " 11327 "Device may not operate as expected.", 11328 cportinfo->cport_addr.cport); 11329 } else { 11330 SATA_CPORTINFO_DRV_INFO(cportinfo)-> 11331 satadrv_state = SATA_DSTATE_FAILED; 11332 } 11333 } 11334 mutex_exit(&cportinfo->cport_mutex); 11335 } 11336 return (SATA_SUCCESS); 11337 } 11338 11339 /* 11340 * Reprobe a controller port that connected to a port multiplier. 11341 * 11342 * NOTE: No Mutex should be hold. 11343 */ 11344 static int 11345 sata_reprobe_pmult(sata_hba_inst_t *sata_hba_inst, sata_device_t *sata_device, 11346 int flag) 11347 { 11348 _NOTE(ARGUNUSED(flag)) 11349 sata_cport_info_t *cportinfo; 11350 sata_pmult_info_t *pmultinfo; 11351 uint8_t cport = sata_device->satadev_addr.cport; 11352 int rval_probe; 11353 11354 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport); 11355 pmultinfo = SATA_PMULT_INFO(sata_hba_inst, cport); 11356 11357 /* probe port */ 11358 mutex_enter(&cportinfo->cport_mutex); 11359 cportinfo->cport_state &= ~SATA_PORT_STATE_CLEAR_MASK; 11360 cportinfo->cport_state |= SATA_STATE_PROBING; 11361 mutex_exit(&cportinfo->cport_mutex); 11362 11363 rval_probe = (*SATA_PROBE_PORT_FUNC(sata_hba_inst)) 11364 (SATA_DIP(sata_hba_inst), sata_device); 11365 11366 mutex_enter(&cportinfo->cport_mutex); 11367 if (rval_probe != SATA_SUCCESS) { 11368 cportinfo->cport_state = SATA_PSTATE_FAILED; 11369 SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_reprobe_pmult: " 11370 "SATA port %d probing failed", cport)); 11371 sata_log(sata_hba_inst, CE_WARN, 11372 "SATA port multiplier detached at port %d", cport); 11373 mutex_exit(&cportinfo->cport_mutex); 11374 sata_free_pmult(sata_hba_inst, sata_device); 11375 return (SATA_FAILURE); 11376 } 11377 11378 /* 11379 * update sata port state and set device type 11380 */ 11381 sata_update_port_info(sata_hba_inst, sata_device); 11382 cportinfo->cport_state &= ~SATA_STATE_PROBING; 11383 cportinfo->cport_state |= SATA_STATE_PROBED; 11384 11385 /* 11386 * Sanity check - Port is active? Is the link active? 11387 * Is there any device attached? 11388 */ 11389 if ((cportinfo->cport_state & 11390 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) || 11391 (cportinfo->cport_scr.sstatus & SATA_PORT_DEVLINK_UP_MASK) != 11392 SATA_PORT_DEVLINK_UP || 11393 (sata_device->satadev_type == SATA_DTYPE_NONE)) { 11394 cportinfo->cport_dev_type = SATA_DTYPE_NONE; 11395 mutex_exit(&cportinfo->cport_mutex); 11396 sata_free_pmult(sata_hba_inst, sata_device); 11397 sata_log(sata_hba_inst, CE_WARN, 11398 "SATA port multiplier detached at port %d", cport); 11399 return (SATA_SUCCESS); 11400 } 11401 11402 /* 11403 * Device changed: PMult -> Non-PMult 11404 * 11405 * This situation is uncommon, most possibly being caused by errors 11406 * after which the port multiplier is not correct initialized and 11407 * recognized. In that case the new device will be marked as unknown 11408 * and will not be automatically probed in this routine. Instead 11409 * system administrator could manually restart it via cfgadm(1M). 11410 */ 11411 if (sata_device->satadev_type != SATA_DTYPE_PMULT) { 11412 cportinfo->cport_dev_type = SATA_DTYPE_UNKNOWN; 11413 mutex_exit(&cportinfo->cport_mutex); 11414 sata_free_pmult(sata_hba_inst, sata_device); 11415 sata_log(sata_hba_inst, CE_WARN, 11416 "SATA port multiplier detached at port %d", cport); 11417 return (SATA_FAILURE); 11418 } 11419 11420 /* 11421 * Now we know it is a port multiplier. However, if this is not the 11422 * previously attached port multiplier - they may have different 11423 * pmport numbers - we need to re-allocate data structures for every 11424 * pmport and drive. 11425 * 11426 * Port multipliers of the same model have identical values in these 11427 * registers, so it is still necessary to update the information of 11428 * all drives attached to the previous port multiplier afterwards. 11429 */ 11430 /* Device changed: PMult -> another PMult */ 11431 mutex_exit(&cportinfo->cport_mutex); 11432 sata_free_pmult(sata_hba_inst, sata_device); 11433 if (sata_alloc_pmult(sata_hba_inst, sata_device) != SATA_SUCCESS) 11434 return (SATA_FAILURE); 11435 mutex_enter(&cportinfo->cport_mutex); 11436 11437 SATADBG1(SATA_DBG_PMULT, sata_hba_inst, 11438 "SATA port multiplier [changed] at port %d", cport); 11439 sata_log(sata_hba_inst, CE_WARN, 11440 "SATA port multiplier detected at port %d", cport); 11441 11442 /* 11443 * Mark all the port multiplier port behind the port 11444 * multiplier behind with link events, so that the sata daemon 11445 * will update their status. 11446 */ 11447 pmultinfo->pmult_event_flags |= SATA_EVNT_DEVICE_RESET; 11448 mutex_exit(&cportinfo->cport_mutex); 11449 11450 return (SATA_SUCCESS); 11451 } 11452 11453 /* 11454 * Re-probe a port multiplier port, check for a device and attach info 11455 * structures when necessary. Identify Device data is fetched, if possible. 11456 * Assumption: sata address is already validated as port multiplier port. 11457 * SATA_SUCCESS is returned if port is re-probed sucessfully, regardless of 11458 * the presence of a device and its type. 11459 * 11460 * flag arg specifies that the function should try multiple times to identify 11461 * device type and to initialize it, or it should return immediately on failure. 11462 * SATA_DEV_IDENTIFY_RETRY - retry 11463 * SATA_DEV_IDENTIFY_NORETRY - no retry 11464 * 11465 * SATA_FAILURE is returned if one of the operations failed. 11466 * 11467 * This function cannot be called in interrupt context - it may sleep. 11468 * 11469 * NOTE: Should be only called by sata_probe_port() in case target port is a 11470 * port multiplier port. 11471 * NOTE: No Mutex should be hold. 11472 */ 11473 static int 11474 sata_reprobe_pmport(sata_hba_inst_t *sata_hba_inst, sata_device_t *sata_device, 11475 int flag) 11476 { 11477 sata_cport_info_t *cportinfo = NULL; 11478 sata_pmport_info_t *pmportinfo = NULL; 11479 sata_drive_info_t *sdinfo, *osdinfo; 11480 sata_device_t sdevice; 11481 boolean_t init_device = B_FALSE; 11482 int prev_device_type = SATA_DTYPE_NONE; 11483 int prev_device_settings = 0; 11484 int prev_device_state = 0; 11485 clock_t start_time; 11486 uint8_t cport = sata_device->satadev_addr.cport; 11487 uint8_t pmport = sata_device->satadev_addr.pmport; 11488 int rval; 11489 11490 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport); 11491 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, pmport); 11492 osdinfo = SATA_PMPORTINFO_DRV_INFO(pmportinfo); 11493 11494 if (osdinfo != NULL) { 11495 /* 11496 * We are re-probing port with a previously attached device. 11497 * Save previous device type and settings. 11498 */ 11499 prev_device_type = pmportinfo->pmport_dev_type; 11500 prev_device_settings = osdinfo->satadrv_settings; 11501 prev_device_state = osdinfo->satadrv_state; 11502 } 11503 11504 start_time = ddi_get_lbolt(); 11505 11506 /* check parent status */ 11507 mutex_enter(&cportinfo->cport_mutex); 11508 if ((cportinfo->cport_state & 11509 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) || 11510 (cportinfo->cport_scr.sstatus & SATA_PORT_DEVLINK_UP_MASK) != 11511 SATA_PORT_DEVLINK_UP) { 11512 mutex_exit(&cportinfo->cport_mutex); 11513 return (SATA_FAILURE); 11514 } 11515 mutex_exit(&cportinfo->cport_mutex); 11516 11517 retry_probe_pmport: 11518 11519 /* probe port */ 11520 mutex_enter(&pmportinfo->pmport_mutex); 11521 pmportinfo->pmport_state &= ~SATA_PORT_STATE_CLEAR_MASK; 11522 pmportinfo->pmport_state |= SATA_STATE_PROBING; 11523 mutex_exit(&pmportinfo->pmport_mutex); 11524 11525 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst)) 11526 (SATA_DIP(sata_hba_inst), sata_device); 11527 11528 /* might need retry because we cannot touch registers. */ 11529 if (rval == SATA_FAILURE) { 11530 mutex_enter(&pmportinfo->pmport_mutex); 11531 pmportinfo->pmport_state = SATA_PSTATE_FAILED; 11532 mutex_exit(&pmportinfo->pmport_mutex); 11533 SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_reprobe_pmport: " 11534 "SATA port %d:%d probing failed", 11535 cport, pmport)); 11536 return (SATA_FAILURE); 11537 } else if (rval == SATA_RETRY) { 11538 SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_reprobe_pmport: " 11539 "SATA port %d:%d probing failed, retrying...", 11540 cport, pmport)); 11541 clock_t cur_time = ddi_get_lbolt(); 11542 /* 11543 * A device was not successfully identified or initialized. 11544 * Track retry time for device identification. 11545 */ 11546 if ((cur_time - start_time) < 11547 drv_usectohz(SATA_DEV_REPROBE_TIMEOUT)) { 11548 /* sleep for a while */ 11549 delay(drv_usectohz(SATA_DEV_RETRY_DLY)); 11550 goto retry_probe_pmport; 11551 } else { 11552 mutex_enter(&pmportinfo->pmport_mutex); 11553 if (SATA_PMPORTINFO_DRV_INFO(pmportinfo) != NULL) 11554 SATA_PMPORTINFO_DRV_INFO(pmportinfo)-> 11555 satadrv_state = SATA_DSTATE_FAILED; 11556 mutex_exit(&pmportinfo->pmport_mutex); 11557 return (SATA_SUCCESS); 11558 } 11559 } 11560 11561 /* 11562 * Sanity check - Controller port is active? Is the link active? 11563 * Is it still a port multiplier? 11564 */ 11565 if ((cportinfo->cport_state & 11566 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) || 11567 (cportinfo->cport_scr.sstatus & SATA_PORT_DEVLINK_UP_MASK) != 11568 SATA_PORT_DEVLINK_UP || 11569 (cportinfo->cport_dev_type != SATA_DTYPE_PMULT)) { 11570 /* 11571 * Port in non-usable state or no link active/no 11572 * device. Free info structure. 11573 */ 11574 cportinfo->cport_dev_type = SATA_DTYPE_UNKNOWN; 11575 11576 sdevice.satadev_addr.cport = cport; 11577 sdevice.satadev_addr.pmport = pmport; 11578 sdevice.satadev_addr.qual = SATA_ADDR_PMULT; 11579 mutex_exit(&cportinfo->cport_mutex); 11580 11581 sata_free_pmult(sata_hba_inst, &sdevice); 11582 return (SATA_FAILURE); 11583 } 11584 11585 /* SATA_SUCCESS NOW */ 11586 /* 11587 * update sata port state and set device type 11588 */ 11589 mutex_enter(&pmportinfo->pmport_mutex); 11590 sata_update_pmport_info(sata_hba_inst, sata_device); 11591 pmportinfo->pmport_state &= ~SATA_STATE_PROBING; 11592 11593 /* 11594 * Sanity check - Port is active? Is the link active? 11595 * Is there any device attached? 11596 */ 11597 if ((pmportinfo->pmport_state & 11598 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) || 11599 (pmportinfo->pmport_scr.sstatus & SATA_PORT_DEVLINK_UP_MASK) != 11600 SATA_PORT_DEVLINK_UP) { 11601 /* 11602 * Port in non-usable state or no link active/no device. 11603 * Free info structure if necessary (direct attached drive 11604 * only, for now! 11605 */ 11606 sdinfo = SATA_PMPORTINFO_DRV_INFO(pmportinfo); 11607 SATA_PMPORTINFO_DRV_INFO(pmportinfo) = NULL; 11608 /* Add here differentiation for device attached or not */ 11609 pmportinfo->pmport_dev_type = SATA_DTYPE_NONE; 11610 mutex_exit(&pmportinfo->pmport_mutex); 11611 if (sdinfo != NULL) 11612 kmem_free(sdinfo, sizeof (sata_drive_info_t)); 11613 return (SATA_SUCCESS); 11614 } 11615 11616 pmportinfo->pmport_state |= SATA_STATE_READY; 11617 pmportinfo->pmport_dev_type = sata_device->satadev_type; 11618 sdinfo = SATA_PMPORTINFO_DRV_INFO(pmportinfo); 11619 11620 /* 11621 * If we are re-probing the port, there may be 11622 * sata_drive_info structure attached 11623 * (or sata_pm_info, if PMult is supported). 11624 */ 11625 if (sata_device->satadev_type == SATA_DTYPE_NONE) { 11626 /* 11627 * There is no device, so remove device info structure, 11628 * if necessary. 11629 */ 11630 SATA_PMPORTINFO_DRV_INFO(pmportinfo) = NULL; 11631 pmportinfo->pmport_dev_type = SATA_DTYPE_NONE; 11632 if (sdinfo != NULL) { 11633 kmem_free(sdinfo, sizeof (sata_drive_info_t)); 11634 sata_log(sata_hba_inst, CE_WARN, 11635 "SATA device detached from port %d:%d", 11636 cport, pmport); 11637 } 11638 mutex_exit(&pmportinfo->pmport_mutex); 11639 return (SATA_SUCCESS); 11640 } 11641 11642 /* this should not be a pmult */ 11643 ASSERT(sata_device->satadev_type != SATA_DTYPE_PMULT); 11644 if (sdinfo == NULL) { 11645 /* 11646 * There is some device attached, but there is 11647 * no sata_drive_info structure - allocate one 11648 */ 11649 mutex_exit(&pmportinfo->pmport_mutex); 11650 sdinfo = kmem_zalloc(sizeof (sata_drive_info_t), 11651 KM_SLEEP); 11652 mutex_enter(&pmportinfo->pmport_mutex); 11653 /* 11654 * Recheck, that the port state did not change when we 11655 * released mutex. 11656 */ 11657 if (pmportinfo->pmport_state & SATA_STATE_READY) { 11658 SATA_PMPORTINFO_DRV_INFO(pmportinfo) = sdinfo; 11659 sdinfo->satadrv_addr = pmportinfo->pmport_addr; 11660 sdinfo->satadrv_addr.qual = SATA_ADDR_DPMPORT; 11661 sdinfo->satadrv_type = SATA_DTYPE_UNKNOWN; 11662 sdinfo->satadrv_state = SATA_STATE_UNKNOWN; 11663 } else { 11664 /* 11665 * Port is not in ready state, we 11666 * cannot attach a device. 11667 */ 11668 mutex_exit(&pmportinfo->pmport_mutex); 11669 kmem_free(sdinfo, sizeof (sata_drive_info_t)); 11670 return (SATA_SUCCESS); 11671 } 11672 /* 11673 * Since we are adding device, presumably new one, 11674 * indicate that it should be initalized, 11675 * as well as some internal framework states). 11676 */ 11677 init_device = B_TRUE; 11678 } 11679 11680 pmportinfo->pmport_dev_type = SATA_DTYPE_UNKNOWN; 11681 sata_device->satadev_addr.qual = sdinfo->satadrv_addr.qual; 11682 11683 mutex_exit(&pmportinfo->pmport_mutex); 11684 /* 11685 * Figure out what kind of device we are really 11686 * dealing with. 11687 */ 11688 rval = sata_probe_device(sata_hba_inst, sata_device); 11689 11690 mutex_enter(&pmportinfo->pmport_mutex); 11691 if (rval == SATA_SUCCESS) { 11692 /* 11693 * If we are dealing with the same type of a device as before, 11694 * restore its settings flags. 11695 */ 11696 if (osdinfo != NULL && 11697 sata_device->satadev_type == prev_device_type) 11698 sdinfo->satadrv_settings = prev_device_settings; 11699 11700 mutex_exit(&pmportinfo->pmport_mutex); 11701 /* Set initial device features, if necessary */ 11702 if (init_device == B_TRUE) { 11703 rval = sata_initialize_device(sata_hba_inst, sdinfo); 11704 } 11705 if (rval == SATA_SUCCESS) 11706 return (rval); 11707 } else { 11708 /* 11709 * If there was some device info before we probe the device, 11710 * restore previous device setting, so we can retry from scratch 11711 * later. Providing, of course, that device has not disappeared 11712 * during probing process. 11713 */ 11714 if (sata_device->satadev_type != SATA_DTYPE_NONE) { 11715 if (osdinfo != NULL) { 11716 pmportinfo->pmport_dev_type = prev_device_type; 11717 sdinfo->satadrv_type = prev_device_type; 11718 sdinfo->satadrv_state = prev_device_state; 11719 } 11720 } else { 11721 /* device is gone */ 11722 kmem_free(sdinfo, sizeof (sata_drive_info_t)); 11723 pmportinfo->pmport_dev_type = SATA_DTYPE_NONE; 11724 SATA_PMPORTINFO_DRV_INFO(pmportinfo) = NULL; 11725 mutex_exit(&pmportinfo->pmport_mutex); 11726 return (SATA_SUCCESS); 11727 } 11728 mutex_exit(&pmportinfo->pmport_mutex); 11729 } 11730 11731 if (flag == SATA_DEV_IDENTIFY_RETRY) { 11732 clock_t cur_time = ddi_get_lbolt(); 11733 /* 11734 * A device was not successfully identified or initialized. 11735 * Track retry time for device identification. 11736 */ 11737 if ((cur_time - start_time) < 11738 drv_usectohz(SATA_DEV_REPROBE_TIMEOUT)) { 11739 /* sleep for a while */ 11740 delay(drv_usectohz(SATA_DEV_RETRY_DLY)); 11741 goto retry_probe_pmport; 11742 } else { 11743 mutex_enter(&pmportinfo->pmport_mutex); 11744 if (SATA_PMPORTINFO_DRV_INFO(pmportinfo) != NULL) 11745 SATA_PMPORTINFO_DRV_INFO(pmportinfo)-> 11746 satadrv_state = SATA_DSTATE_FAILED; 11747 mutex_exit(&pmportinfo->pmport_mutex); 11748 } 11749 } 11750 return (SATA_SUCCESS); 11751 } 11752 11753 /* 11754 * Allocated related structure for a port multiplier and its device ports 11755 * 11756 * Port multiplier should be ready and probed, and related information like 11757 * the number of the device ports should be store in sata_device_t. 11758 * 11759 * NOTE: No Mutex should be hold. 11760 */ 11761 static int 11762 sata_alloc_pmult(sata_hba_inst_t *sata_hba_inst, sata_device_t *sata_device) 11763 { 11764 dev_info_t *dip = SATA_DIP(sata_hba_inst); 11765 sata_cport_info_t *cportinfo = NULL; 11766 sata_pmult_info_t *pmultinfo = NULL; 11767 sata_pmport_info_t *pmportinfo = NULL; 11768 sata_device_t sd; 11769 dev_t minor_number; 11770 char name[16]; 11771 uint8_t cport = sata_device->satadev_addr.cport; 11772 int rval; 11773 int npmport; 11774 11775 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport); 11776 11777 /* This function might be called while a port-mult is hot-plugged. */ 11778 mutex_enter(&cportinfo->cport_mutex); 11779 11780 /* dev_type's not updated when get called from sata_reprobe_port() */ 11781 if (SATA_CPORTINFO_PMULT_INFO(cportinfo) == NULL) { 11782 /* Create a pmult_info structure */ 11783 SATA_CPORTINFO_PMULT_INFO(cportinfo) = 11784 kmem_zalloc(sizeof (sata_pmult_info_t), KM_SLEEP); 11785 } 11786 pmultinfo = SATA_CPORTINFO_PMULT_INFO(cportinfo); 11787 11788 pmultinfo->pmult_addr = sata_device->satadev_addr; 11789 pmultinfo->pmult_addr.qual = SATA_ADDR_PMULT; 11790 pmultinfo->pmult_state = SATA_STATE_PROBING; 11791 11792 /* 11793 * Probe the port multiplier with qualifier SATA_ADDR_PMULT_SPEC, 11794 * The HBA driver should initialize and register the port multiplier, 11795 * sata_register_pmult() will fill following fields, 11796 * + sata_pmult_info.pmult_gscr 11797 * + sata_pmult_info.pmult_num_dev_ports 11798 */ 11799 sd.satadev_addr = sata_device->satadev_addr; 11800 sd.satadev_addr.qual = SATA_ADDR_PMULT_SPEC; 11801 mutex_exit(&cportinfo->cport_mutex); 11802 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst)) 11803 (SATA_DIP(sata_hba_inst), &sd); 11804 mutex_enter(&cportinfo->cport_mutex); 11805 11806 if (rval != SATA_SUCCESS || 11807 (sd.satadev_type != SATA_DTYPE_PMULT) || 11808 !(sd.satadev_state & SATA_DSTATE_PMULT_INIT)) { 11809 SATA_CPORTINFO_PMULT_INFO(cportinfo) = NULL; 11810 kmem_free(pmultinfo, sizeof (sata_pmult_info_t)); 11811 cportinfo->cport_state = SATA_PSTATE_FAILED; 11812 cportinfo->cport_dev_type = SATA_DTYPE_UNKNOWN; 11813 mutex_exit(&cportinfo->cport_mutex); 11814 SATADBG1(SATA_DBG_PMULT, sata_hba_inst, 11815 "sata_alloc_pmult: failed to initialize pmult " 11816 "at port %d.", cport) 11817 return (SATA_FAILURE); 11818 } 11819 11820 /* Initialize pmport_info structure */ 11821 for (npmport = 0; npmport < pmultinfo->pmult_num_dev_ports; 11822 npmport++) { 11823 11824 /* if everything is allocated, skip */ 11825 if (SATA_PMPORT_INFO(sata_hba_inst, cport, npmport) != NULL) 11826 continue; 11827 11828 pmportinfo = kmem_zalloc(sizeof (sata_pmport_info_t), KM_SLEEP); 11829 mutex_init(&pmportinfo->pmport_mutex, NULL, MUTEX_DRIVER, NULL); 11830 mutex_exit(&cportinfo->cport_mutex); 11831 11832 mutex_enter(&pmportinfo->pmport_mutex); 11833 pmportinfo->pmport_addr.cport = cport; 11834 pmportinfo->pmport_addr.pmport = (uint8_t)npmport; 11835 pmportinfo->pmport_addr.qual = SATA_ADDR_PMPORT; 11836 pmportinfo->pmport_state &= ~SATA_PORT_STATE_CLEAR_MASK; 11837 mutex_exit(&pmportinfo->pmport_mutex); 11838 11839 mutex_enter(&cportinfo->cport_mutex); 11840 SATA_PMPORT_INFO(sata_hba_inst, cport, npmport) = pmportinfo; 11841 11842 /* Create an attachment point */ 11843 minor_number = SATA_MAKE_AP_MINOR(ddi_get_instance(dip), 11844 cport, (uint8_t)npmport, SATA_ADDR_PMPORT); 11845 (void) sprintf(name, "%d.%d", cport, npmport); 11846 11847 if (ddi_create_minor_node(dip, name, S_IFCHR, minor_number, 11848 DDI_NT_SATA_ATTACHMENT_POINT, 0) != DDI_SUCCESS) { 11849 sata_log(sata_hba_inst, CE_WARN, "sata_hba_attach: " 11850 "cannot create SATA attachment point for " 11851 "port %d:%d", cport, npmport); 11852 } 11853 } 11854 11855 pmultinfo->pmult_state &= ~SATA_STATE_PROBING; 11856 pmultinfo->pmult_state |= (SATA_STATE_PROBED|SATA_STATE_READY); 11857 cportinfo->cport_dev_type = SATA_DTYPE_PMULT; 11858 11859 mutex_exit(&cportinfo->cport_mutex); 11860 return (SATA_SUCCESS); 11861 } 11862 11863 /* 11864 * Free data structures when a port multiplier is removed. 11865 * 11866 * NOTE: No Mutex should be hold. 11867 */ 11868 static void 11869 sata_free_pmult(sata_hba_inst_t *sata_hba_inst, sata_device_t *sata_device) 11870 { 11871 sata_cport_info_t *cportinfo; 11872 sata_pmult_info_t *pmultinfo; 11873 sata_pmport_info_t *pmportinfo; 11874 sata_device_t pmport_device; 11875 sata_drive_info_t *sdinfo; 11876 dev_info_t *tdip; 11877 char name[16]; 11878 uint8_t cport = sata_device->satadev_addr.cport; 11879 int npmport; 11880 11881 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport); 11882 11883 /* This function might be called while port-mult is hot plugged. */ 11884 mutex_enter(&cportinfo->cport_mutex); 11885 11886 cportinfo->cport_dev_type = SATA_DTYPE_NONE; 11887 pmultinfo = SATA_CPORTINFO_PMULT_INFO(cportinfo); 11888 ASSERT(pmultinfo != NULL); 11889 11890 /* Free pmport_info structure */ 11891 for (npmport = 0; npmport < pmultinfo->pmult_num_dev_ports; 11892 npmport++) { 11893 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, npmport); 11894 if (pmportinfo == NULL) 11895 continue; 11896 mutex_exit(&cportinfo->cport_mutex); 11897 11898 mutex_enter(&pmportinfo->pmport_mutex); 11899 sdinfo = pmportinfo->pmport_sata_drive; 11900 SATA_PMPORTINFO_DRV_INFO(pmportinfo) = NULL; 11901 mutex_exit(&pmportinfo->pmport_mutex); 11902 11903 /* Remove attachment point. */ 11904 name[0] = '\0'; 11905 (void) sprintf(name, "%d.%d", cport, npmport); 11906 ddi_remove_minor_node(SATA_DIP(sata_hba_inst), name); 11907 sata_log(sata_hba_inst, CE_NOTE, 11908 "Remove attachment point of port %d:%d", 11909 cport, npmport); 11910 11911 /* 11912 * Rumove target node 11913 */ 11914 bzero(&pmport_device, sizeof (sata_device_t)); 11915 pmport_device.satadev_rev = SATA_DEVICE_REV; 11916 pmport_device.satadev_addr.cport = cport; 11917 pmport_device.satadev_addr.pmport = (uint8_t)npmport; 11918 pmport_device.satadev_addr.qual = SATA_ADDR_DPMPORT; 11919 11920 tdip = sata_get_scsi_target_dip(SATA_DIP(sata_hba_inst), 11921 &(pmport_device.satadev_addr)); 11922 if (tdip != NULL && ndi_devi_offline(tdip, 11923 NDI_DEVI_REMOVE) != NDI_SUCCESS) { 11924 /* 11925 * Problem : 11926 * The target node remained attached. 11927 * This happens when the device file was open 11928 * or a node was waiting for resources. 11929 * Cannot do anything about it. 11930 */ 11931 SATA_LOG_D((sata_hba_inst, CE_WARN, 11932 "sata_free_pmult: could not unconfigure device " 11933 "before disconnecting the SATA port %d:%d", 11934 cport, npmport)); 11935 11936 /* 11937 * Set DEVICE REMOVED state in the target 11938 * node. It will prevent access to the device 11939 * even when a new device is attached, until 11940 * the old target node is released, removed and 11941 * recreated for a new device. 11942 */ 11943 sata_set_device_removed(tdip); 11944 11945 /* 11946 * Instruct event daemon to try the target 11947 * node cleanup later. 11948 */ 11949 sata_set_target_node_cleanup( 11950 sata_hba_inst, &(pmport_device.satadev_addr)); 11951 11952 } 11953 mutex_enter(&cportinfo->cport_mutex); 11954 11955 /* 11956 * Add here differentiation for device attached or not 11957 */ 11958 if (sdinfo != NULL) { 11959 sata_log(sata_hba_inst, CE_WARN, 11960 "SATA device detached from port %d:%d", 11961 cport, npmport); 11962 kmem_free(sdinfo, sizeof (sata_drive_info_t)); 11963 } 11964 11965 mutex_destroy(&pmportinfo->pmport_mutex); 11966 kmem_free(pmportinfo, sizeof (sata_pmport_info_t)); 11967 } 11968 11969 kmem_free(pmultinfo, sizeof (sata_pmult_info_t)); 11970 11971 cportinfo->cport_devp.cport_sata_pmult = NULL; 11972 11973 sata_log(sata_hba_inst, CE_WARN, 11974 "SATA port multiplier detached at port %d", cport); 11975 11976 mutex_exit(&cportinfo->cport_mutex); 11977 } 11978 11979 /* 11980 * Initialize device 11981 * Specified device is initialized to a default state. 11982 * 11983 * Returns SATA_SUCCESS if all device features are set successfully, 11984 * SATA_RETRY if device is accessible but device features were not set 11985 * successfully, and SATA_FAILURE otherwise. 11986 */ 11987 static int 11988 sata_initialize_device(sata_hba_inst_t *sata_hba_inst, 11989 sata_drive_info_t *sdinfo) 11990 { 11991 int rval; 11992 11993 sata_save_drive_settings(sdinfo); 11994 11995 sdinfo->satadrv_settings |= SATA_DEV_READ_AHEAD; 11996 11997 sata_init_write_cache_mode(sdinfo); 11998 11999 rval = sata_set_drive_features(sata_hba_inst, sdinfo, 0); 12000 12001 /* Determine current data transfer mode */ 12002 if ((sdinfo->satadrv_id.ai_cap & SATA_DMA_SUPPORT) == 0) { 12003 sdinfo->satadrv_settings &= ~SATA_DEV_DMA; 12004 } else if ((sdinfo->satadrv_id.ai_validinfo & 12005 SATA_VALIDINFO_88) != 0 && 12006 (sdinfo->satadrv_id.ai_ultradma & SATA_UDMA_SEL_MASK) != 0) { 12007 sdinfo->satadrv_settings |= SATA_DEV_DMA; 12008 } else if ((sdinfo->satadrv_id.ai_dworddma & 12009 SATA_MDMA_SEL_MASK) != 0) { 12010 sdinfo->satadrv_settings |= SATA_DEV_DMA; 12011 } else 12012 /* DMA supported, not no DMA transfer mode is selected !? */ 12013 sdinfo->satadrv_settings &= ~SATA_DEV_DMA; 12014 12015 if ((sdinfo->satadrv_id.ai_cmdset83 & 0x20) && 12016 (sdinfo->satadrv_id.ai_features86 & 0x20)) 12017 sdinfo->satadrv_power_level = SATA_POWER_STANDBY; 12018 else 12019 sdinfo->satadrv_power_level = SATA_POWER_ACTIVE; 12020 12021 return (rval); 12022 } 12023 12024 12025 /* 12026 * Initialize write cache mode. 12027 * 12028 * The default write cache setting for SATA HDD is provided by sata_write_cache 12029 * static variable. ATAPI CD/DVDs devices have write cache default is 12030 * determined by sata_atapicdvd_write_cache static variable. 12031 * ATAPI tape devices have write cache default is determined by 12032 * sata_atapitape_write_cache static variable. 12033 * ATAPI disk devices have write cache default is determined by 12034 * sata_atapidisk_write_cache static variable. 12035 * 1 - enable 12036 * 0 - disable 12037 * any other value - current drive setting 12038 * 12039 * Although there is not reason to disable write cache on CD/DVD devices, 12040 * tape devices and ATAPI disk devices, the default setting control is provided 12041 * for the maximun flexibility. 12042 * 12043 * In the future, it may be overridden by the 12044 * disk-write-cache-enable property setting, if it is defined. 12045 * Returns SATA_SUCCESS if all device features are set successfully, 12046 * SATA_FAILURE otherwise. 12047 */ 12048 static void 12049 sata_init_write_cache_mode(sata_drive_info_t *sdinfo) 12050 { 12051 switch (sdinfo->satadrv_type) { 12052 case SATA_DTYPE_ATADISK: 12053 if (sata_write_cache == 1) 12054 sdinfo->satadrv_settings |= SATA_DEV_WRITE_CACHE; 12055 else if (sata_write_cache == 0) 12056 sdinfo->satadrv_settings &= ~SATA_DEV_WRITE_CACHE; 12057 /* 12058 * When sata_write_cache value is not 0 or 1, 12059 * a current setting of the drive's write cache is used. 12060 */ 12061 break; 12062 case SATA_DTYPE_ATAPICD: 12063 if (sata_atapicdvd_write_cache == 1) 12064 sdinfo->satadrv_settings |= SATA_DEV_WRITE_CACHE; 12065 else if (sata_atapicdvd_write_cache == 0) 12066 sdinfo->satadrv_settings &= ~SATA_DEV_WRITE_CACHE; 12067 /* 12068 * When sata_atapicdvd_write_cache value is not 0 or 1, 12069 * a current setting of the drive's write cache is used. 12070 */ 12071 break; 12072 case SATA_DTYPE_ATAPITAPE: 12073 if (sata_atapitape_write_cache == 1) 12074 sdinfo->satadrv_settings |= SATA_DEV_WRITE_CACHE; 12075 else if (sata_atapitape_write_cache == 0) 12076 sdinfo->satadrv_settings &= ~SATA_DEV_WRITE_CACHE; 12077 /* 12078 * When sata_atapitape_write_cache value is not 0 or 1, 12079 * a current setting of the drive's write cache is used. 12080 */ 12081 break; 12082 case SATA_DTYPE_ATAPIDISK: 12083 if (sata_atapidisk_write_cache == 1) 12084 sdinfo->satadrv_settings |= SATA_DEV_WRITE_CACHE; 12085 else if (sata_atapidisk_write_cache == 0) 12086 sdinfo->satadrv_settings &= ~SATA_DEV_WRITE_CACHE; 12087 /* 12088 * When sata_atapidisk_write_cache value is not 0 or 1, 12089 * a current setting of the drive's write cache is used. 12090 */ 12091 break; 12092 } 12093 } 12094 12095 12096 /* 12097 * Validate sata address. 12098 * Specified cport, pmport and qualifier has to match 12099 * passed sata_scsi configuration info. 12100 * The presence of an attached device is not verified. 12101 * 12102 * Returns 0 when address is valid, -1 otherwise. 12103 */ 12104 static int 12105 sata_validate_sata_address(sata_hba_inst_t *sata_hba_inst, int cport, 12106 int pmport, int qual) 12107 { 12108 if (qual == SATA_ADDR_DCPORT && pmport != 0) 12109 goto invalid_address; 12110 if (cport >= SATA_NUM_CPORTS(sata_hba_inst)) 12111 goto invalid_address; 12112 if ((qual == SATA_ADDR_DPMPORT || qual == SATA_ADDR_PMPORT) && 12113 ((SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) != SATA_DTYPE_PMULT) || 12114 (SATA_PMULT_INFO(sata_hba_inst, cport) == NULL) || 12115 (pmport >= SATA_NUM_PMPORTS(sata_hba_inst, cport)))) 12116 goto invalid_address; 12117 12118 return (0); 12119 12120 invalid_address: 12121 return (-1); 12122 12123 } 12124 12125 /* 12126 * Validate scsi address 12127 * SCSI target address is translated into SATA cport/pmport and compared 12128 * with a controller port/device configuration. LUN has to be 0. 12129 * Returns 0 if a scsi target refers to an attached device, 12130 * returns 1 if address is valid but no valid device is attached, 12131 * returns 2 if address is valid but device type is unknown (not valid device), 12132 * returns -1 if bad address or device is of an unsupported type. 12133 * Upon return sata_device argument is set. 12134 * 12135 * Port multiplier is supported now. 12136 */ 12137 static int 12138 sata_validate_scsi_address(sata_hba_inst_t *sata_hba_inst, 12139 struct scsi_address *ap, sata_device_t *sata_device) 12140 { 12141 int cport, pmport, qual, rval; 12142 12143 rval = -1; /* Invalid address */ 12144 if (ap->a_lun != 0) 12145 goto out; 12146 12147 qual = SCSI_TO_SATA_ADDR_QUAL(ap->a_target); 12148 cport = SCSI_TO_SATA_CPORT(ap->a_target); 12149 pmport = SCSI_TO_SATA_PMPORT(ap->a_target); 12150 12151 if (qual != SATA_ADDR_DCPORT && qual != SATA_ADDR_DPMPORT) 12152 goto out; 12153 12154 if (sata_validate_sata_address(sata_hba_inst, cport, pmport, qual) == 12155 0) { 12156 12157 sata_cport_info_t *cportinfo; 12158 sata_pmult_info_t *pmultinfo; 12159 sata_drive_info_t *sdinfo = NULL; 12160 12161 sata_device->satadev_addr.qual = qual; 12162 sata_device->satadev_addr.cport = cport; 12163 sata_device->satadev_addr.pmport = pmport; 12164 sata_device->satadev_rev = SATA_DEVICE_REV_1; 12165 12166 rval = 1; /* Valid sata address */ 12167 12168 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport); 12169 if (qual == SATA_ADDR_DCPORT) { 12170 if (cportinfo == NULL || 12171 cportinfo->cport_dev_type == SATA_DTYPE_NONE) 12172 goto out; 12173 12174 sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo); 12175 if (cportinfo->cport_dev_type == SATA_DTYPE_UNKNOWN && 12176 sdinfo != NULL) { 12177 rval = 2; 12178 goto out; 12179 } 12180 12181 if ((cportinfo->cport_dev_type & 12182 SATA_VALID_DEV_TYPE) == 0) { 12183 rval = -1; 12184 goto out; 12185 } 12186 12187 } else if (qual == SATA_ADDR_DPMPORT) { 12188 pmultinfo = SATA_CPORTINFO_PMULT_INFO(cportinfo); 12189 if (pmultinfo == NULL) { 12190 rval = -1; 12191 goto out; 12192 } 12193 if (SATA_PMPORT_INFO(sata_hba_inst, cport, pmport) == 12194 NULL || 12195 SATA_PMPORT_DEV_TYPE(sata_hba_inst, cport, 12196 pmport) == SATA_DTYPE_NONE) 12197 goto out; 12198 12199 sdinfo = SATA_PMPORT_DRV_INFO(sata_hba_inst, cport, 12200 pmport); 12201 if (SATA_PMPORT_DEV_TYPE(sata_hba_inst, cport, 12202 pmport) == SATA_DTYPE_UNKNOWN && sdinfo != NULL) { 12203 rval = 2; 12204 goto out; 12205 } 12206 12207 if ((SATA_PMPORT_DEV_TYPE(sata_hba_inst, cport, 12208 pmport) && SATA_VALID_DEV_TYPE) == 0) { 12209 rval = -1; 12210 goto out; 12211 } 12212 12213 } else { 12214 rval = -1; 12215 goto out; 12216 } 12217 if ((sdinfo == NULL) || 12218 (sdinfo->satadrv_type & SATA_VALID_DEV_TYPE) == 0) 12219 goto out; 12220 12221 sata_device->satadev_type = sdinfo->satadrv_type; 12222 12223 return (0); 12224 } 12225 out: 12226 if (rval > 0) { 12227 SATADBG2(SATA_DBG_SCSI_IF, sata_hba_inst, 12228 "sata_validate_scsi_address: no valid target %x lun %x", 12229 ap->a_target, ap->a_lun); 12230 } 12231 return (rval); 12232 } 12233 12234 /* 12235 * Find dip corresponding to passed device number 12236 * 12237 * Returns NULL if invalid device number is passed or device cannot be found, 12238 * Returns dip is device is found. 12239 */ 12240 static dev_info_t * 12241 sata_devt_to_devinfo(dev_t dev) 12242 { 12243 dev_info_t *dip; 12244 #ifndef __lock_lint 12245 struct devnames *dnp; 12246 major_t major = getmajor(dev); 12247 int instance = SATA_MINOR2INSTANCE(getminor(dev)); 12248 12249 if (major >= devcnt) 12250 return (NULL); 12251 12252 dnp = &devnamesp[major]; 12253 LOCK_DEV_OPS(&(dnp->dn_lock)); 12254 dip = dnp->dn_head; 12255 while (dip && (ddi_get_instance(dip) != instance)) { 12256 dip = ddi_get_next(dip); 12257 } 12258 UNLOCK_DEV_OPS(&(dnp->dn_lock)); 12259 #endif 12260 12261 return (dip); 12262 } 12263 12264 12265 /* 12266 * Probe device. 12267 * This function issues Identify Device command and initializes local 12268 * sata_drive_info structure if the device can be identified. 12269 * The device type is determined by examining Identify Device 12270 * command response. 12271 * If the sata_hba_inst has linked drive info structure for this 12272 * device address, the Identify Device data is stored into sata_drive_info 12273 * structure linked to the port info structure. 12274 * 12275 * sata_device has to refer to the valid sata port(s) for HBA described 12276 * by sata_hba_inst structure. 12277 * 12278 * Returns: 12279 * SATA_SUCCESS if device type was successfully probed and port-linked 12280 * drive info structure was updated; 12281 * SATA_FAILURE if there is no device, or device was not probed 12282 * successully; 12283 * SATA_RETRY if device probe can be retried later. 12284 * If a device cannot be identified, sata_device's dev_state and dev_type 12285 * fields are set to unknown. 12286 * There are no retries in this function. Any retries should be managed by 12287 * the caller. 12288 */ 12289 12290 12291 static int 12292 sata_probe_device(sata_hba_inst_t *sata_hba_inst, sata_device_t *sata_device) 12293 { 12294 sata_pmport_info_t *pmportinfo; 12295 sata_drive_info_t *sdinfo; 12296 sata_drive_info_t new_sdinfo; /* local drive info struct */ 12297 int rval; 12298 12299 ASSERT((SATA_CPORT_STATE(sata_hba_inst, 12300 sata_device->satadev_addr.cport) & 12301 (SATA_STATE_PROBED | SATA_STATE_READY)) != 0); 12302 12303 sata_device->satadev_type = SATA_DTYPE_NONE; 12304 12305 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, 12306 sata_device->satadev_addr.cport))); 12307 12308 if (sata_device->satadev_addr.qual == SATA_ADDR_DPMPORT) { 12309 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, 12310 sata_device->satadev_addr.cport, 12311 sata_device->satadev_addr.pmport); 12312 ASSERT(pmportinfo != NULL); 12313 } 12314 12315 /* Get pointer to port-linked sata device info structure */ 12316 sdinfo = sata_get_device_info(sata_hba_inst, sata_device); 12317 if (sdinfo != NULL) { 12318 sdinfo->satadrv_state &= 12319 ~(SATA_STATE_PROBED | SATA_STATE_READY); 12320 sdinfo->satadrv_state |= SATA_STATE_PROBING; 12321 } else { 12322 /* No device to probe */ 12323 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, 12324 sata_device->satadev_addr.cport))); 12325 sata_device->satadev_type = SATA_DTYPE_NONE; 12326 sata_device->satadev_state = SATA_STATE_UNKNOWN; 12327 return (SATA_FAILURE); 12328 } 12329 /* 12330 * Need to issue both types of identify device command and 12331 * determine device type by examining retreived data/status. 12332 * First, ATA Identify Device. 12333 */ 12334 bzero(&new_sdinfo, sizeof (sata_drive_info_t)); 12335 new_sdinfo.satadrv_addr = sata_device->satadev_addr; 12336 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, 12337 sata_device->satadev_addr.cport))); 12338 new_sdinfo.satadrv_type = SATA_DTYPE_ATADISK; 12339 rval = sata_identify_device(sata_hba_inst, &new_sdinfo); 12340 if (rval == SATA_RETRY) { 12341 /* We may try to check for ATAPI device */ 12342 if (SATA_FEATURES(sata_hba_inst) & SATA_CTLF_ATAPI) { 12343 /* 12344 * HBA supports ATAPI - try to issue Identify Packet 12345 * Device command. 12346 */ 12347 new_sdinfo.satadrv_type = SATA_DTYPE_ATAPI; 12348 rval = sata_identify_device(sata_hba_inst, &new_sdinfo); 12349 } 12350 } 12351 if (rval == SATA_SUCCESS) { 12352 /* 12353 * Got something responding positively to ATA Identify Device 12354 * or to Identify Packet Device cmd. 12355 * Save last used device type. 12356 */ 12357 sata_device->satadev_type = new_sdinfo.satadrv_type; 12358 12359 /* save device info, if possible */ 12360 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, 12361 sata_device->satadev_addr.cport))); 12362 sdinfo = sata_get_device_info(sata_hba_inst, sata_device); 12363 if (sdinfo == NULL) { 12364 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, 12365 sata_device->satadev_addr.cport))); 12366 return (SATA_FAILURE); 12367 } 12368 /* 12369 * Copy drive info into the port-linked drive info structure. 12370 */ 12371 *sdinfo = new_sdinfo; 12372 sdinfo->satadrv_state &= ~SATA_STATE_PROBING; 12373 sdinfo->satadrv_state |= SATA_STATE_PROBED; 12374 if (sata_device->satadev_addr.qual == SATA_ADDR_DCPORT) 12375 SATA_CPORT_DEV_TYPE(sata_hba_inst, 12376 sata_device->satadev_addr.cport) = 12377 sdinfo->satadrv_type; 12378 else { /* SATA_ADDR_DPMPORT */ 12379 mutex_enter(&pmportinfo->pmport_mutex); 12380 SATA_PMPORT_DEV_TYPE(sata_hba_inst, 12381 sata_device->satadev_addr.cport, 12382 sata_device->satadev_addr.pmport) = 12383 sdinfo->satadrv_type; 12384 mutex_exit(&pmportinfo->pmport_mutex); 12385 } 12386 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, 12387 sata_device->satadev_addr.cport))); 12388 return (SATA_SUCCESS); 12389 } 12390 12391 /* 12392 * It may be SATA_RETRY or SATA_FAILURE return. 12393 * Looks like we cannot determine the device type at this time. 12394 */ 12395 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, 12396 sata_device->satadev_addr.cport))); 12397 sdinfo = sata_get_device_info(sata_hba_inst, sata_device); 12398 if (sdinfo != NULL) { 12399 sata_device->satadev_type = SATA_DTYPE_UNKNOWN; 12400 sdinfo->satadrv_type = SATA_DTYPE_UNKNOWN; 12401 sdinfo->satadrv_state &= ~SATA_STATE_PROBING; 12402 sdinfo->satadrv_state |= SATA_STATE_PROBED; 12403 if (sata_device->satadev_addr.qual == SATA_ADDR_DCPORT) 12404 SATA_CPORT_DEV_TYPE(sata_hba_inst, 12405 sata_device->satadev_addr.cport) = 12406 SATA_DTYPE_UNKNOWN; 12407 else { 12408 /* SATA_ADDR_DPMPORT */ 12409 mutex_enter(&pmportinfo->pmport_mutex); 12410 if ((SATA_PMULT_INFO(sata_hba_inst, 12411 sata_device->satadev_addr.cport) != NULL) && 12412 (SATA_PMPORT_INFO(sata_hba_inst, 12413 sata_device->satadev_addr.cport, 12414 sata_device->satadev_addr.pmport) != NULL)) 12415 SATA_PMPORT_DEV_TYPE(sata_hba_inst, 12416 sata_device->satadev_addr.cport, 12417 sata_device->satadev_addr.pmport) = 12418 SATA_DTYPE_UNKNOWN; 12419 mutex_exit(&pmportinfo->pmport_mutex); 12420 } 12421 } 12422 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, 12423 sata_device->satadev_addr.cport))); 12424 return (rval); 12425 } 12426 12427 12428 /* 12429 * Get pointer to sata_drive_info structure. 12430 * 12431 * The sata_device has to contain address (cport, pmport and qualifier) for 12432 * specified sata_scsi structure. 12433 * 12434 * Returns NULL if device address is not valid for this HBA configuration. 12435 * Otherwise, returns a pointer to sata_drive_info structure. 12436 * 12437 * This function should be called with a port mutex held. 12438 */ 12439 static sata_drive_info_t * 12440 sata_get_device_info(sata_hba_inst_t *sata_hba_inst, 12441 sata_device_t *sata_device) 12442 { 12443 uint8_t cport = sata_device->satadev_addr.cport; 12444 uint8_t pmport = sata_device->satadev_addr.pmport; 12445 uint8_t qual = sata_device->satadev_addr.qual; 12446 12447 if (cport >= SATA_NUM_CPORTS(sata_hba_inst)) 12448 return (NULL); 12449 12450 if (!(SATA_CPORT_STATE(sata_hba_inst, cport) & 12451 (SATA_STATE_PROBED | SATA_STATE_READY))) 12452 /* Port not probed yet */ 12453 return (NULL); 12454 12455 if (SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) == SATA_DTYPE_NONE) 12456 return (NULL); 12457 12458 if (qual == SATA_ADDR_DCPORT) { 12459 /* Request for a device on a controller port */ 12460 if (SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) == 12461 SATA_DTYPE_PMULT) 12462 /* Port multiplier attached */ 12463 return (NULL); 12464 return (SATA_CPORT_DRV_INFO(sata_hba_inst, cport)); 12465 } 12466 if (qual == SATA_ADDR_DPMPORT) { 12467 if (SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) != 12468 SATA_DTYPE_PMULT) 12469 return (NULL); 12470 12471 if (pmport > SATA_NUM_PMPORTS(sata_hba_inst, cport)) 12472 return (NULL); 12473 12474 if (!(SATA_PMPORT_STATE(sata_hba_inst, cport, pmport) & 12475 (SATA_STATE_PROBED | SATA_STATE_READY))) 12476 /* Port multiplier port not probed yet */ 12477 return (NULL); 12478 12479 return (SATA_PMPORT_DRV_INFO(sata_hba_inst, cport, pmport)); 12480 } 12481 12482 /* we should not get here */ 12483 return (NULL); 12484 } 12485 12486 12487 /* 12488 * sata_identify_device. 12489 * Send Identify Device command to SATA HBA driver. 12490 * If command executes successfully, update sata_drive_info structure pointed 12491 * to by sdinfo argument, including Identify Device data. 12492 * If command fails, invalidate data in sata_drive_info. 12493 * 12494 * Cannot be called from interrupt level. 12495 * 12496 * Returns: 12497 * SATA_SUCCESS if the device was identified as a supported device, 12498 * SATA_RETRY if the device was not identified but could be retried, 12499 * SATA_FAILURE if the device was not identified and identify attempt 12500 * should not be retried. 12501 */ 12502 static int 12503 sata_identify_device(sata_hba_inst_t *sata_hba_inst, 12504 sata_drive_info_t *sdinfo) 12505 { 12506 uint16_t cfg_word; 12507 int rval; 12508 12509 /* fetch device identify data */ 12510 if ((rval = sata_fetch_device_identify_data(sata_hba_inst, 12511 sdinfo)) != SATA_SUCCESS) 12512 goto fail_unknown; 12513 12514 cfg_word = sdinfo->satadrv_id.ai_config; 12515 12516 /* Set the correct device type */ 12517 if ((cfg_word & SATA_ATA_TYPE_MASK) == SATA_ATA_TYPE) { 12518 sdinfo->satadrv_type = SATA_DTYPE_ATADISK; 12519 } else if (cfg_word == SATA_CFA_TYPE) { 12520 /* It's a Compact Flash media via CF-to-SATA HDD adapter */ 12521 sdinfo->satadrv_type = SATA_DTYPE_ATADISK; 12522 } else if ((cfg_word & SATA_ATAPI_TYPE_MASK) == SATA_ATAPI_TYPE) { 12523 switch (cfg_word & SATA_ATAPI_ID_DEV_TYPE) { 12524 case SATA_ATAPI_CDROM_DEV: 12525 sdinfo->satadrv_type = SATA_DTYPE_ATAPICD; 12526 break; 12527 case SATA_ATAPI_SQACC_DEV: 12528 sdinfo->satadrv_type = SATA_DTYPE_ATAPITAPE; 12529 break; 12530 case SATA_ATAPI_DIRACC_DEV: 12531 sdinfo->satadrv_type = SATA_DTYPE_ATAPIDISK; 12532 break; 12533 default: 12534 sdinfo->satadrv_type = SATA_DTYPE_UNKNOWN; 12535 } 12536 } else { 12537 sdinfo->satadrv_type = SATA_DTYPE_UNKNOWN; 12538 } 12539 12540 if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) { 12541 if (sdinfo->satadrv_capacity == 0) { 12542 /* Non-LBA disk. Too bad... */ 12543 sata_log(sata_hba_inst, CE_WARN, 12544 "SATA disk device at port %d does not support LBA", 12545 sdinfo->satadrv_addr.cport); 12546 rval = SATA_FAILURE; 12547 goto fail_unknown; 12548 } 12549 } 12550 #if 0 12551 /* Left for historical reason */ 12552 /* 12553 * Some initial version of SATA spec indicated that at least 12554 * UDMA mode 4 has to be supported. It is not metioned in 12555 * SerialATA 2.6, so this restriction is removed. 12556 */ 12557 /* Check for Ultra DMA modes 6 through 0 being supported */ 12558 for (i = 6; i >= 0; --i) { 12559 if (sdinfo->satadrv_id.ai_ultradma & (1 << i)) 12560 break; 12561 } 12562 12563 /* 12564 * At least UDMA 4 mode has to be supported. If mode 4 or 12565 * higher are not supported by the device, fail this 12566 * device. 12567 */ 12568 if (i < 4) { 12569 /* No required Ultra DMA mode supported */ 12570 sata_log(sata_hba_inst, CE_WARN, 12571 "SATA disk device at port %d does not support UDMA " 12572 "mode 4 or higher", sdinfo->satadrv_addr.cport); 12573 SATA_LOG_D((sata_hba_inst, CE_WARN, 12574 "mode 4 or higher required, %d supported", i)); 12575 rval = SATA_FAILURE; 12576 goto fail_unknown; 12577 } 12578 #endif 12579 12580 /* 12581 * For Disk devices, if it doesn't support UDMA mode, we would 12582 * like to return failure directly. 12583 */ 12584 if ((sdinfo->satadrv_type == SATA_DTYPE_ATADISK) && 12585 !((sdinfo->satadrv_id.ai_validinfo & SATA_VALIDINFO_88) != 0 && 12586 (sdinfo->satadrv_id.ai_ultradma & SATA_UDMA_SUP_MASK) != 0)) { 12587 sata_log(sata_hba_inst, CE_WARN, 12588 "SATA disk device at port %d does not support UDMA", 12589 sdinfo->satadrv_addr.cport); 12590 rval = SATA_FAILURE; 12591 goto fail_unknown; 12592 } 12593 12594 return (SATA_SUCCESS); 12595 12596 fail_unknown: 12597 /* Invalidate sata_drive_info ? */ 12598 sdinfo->satadrv_type = SATA_DTYPE_UNKNOWN; 12599 sdinfo->satadrv_state = SATA_STATE_UNKNOWN; 12600 return (rval); 12601 } 12602 12603 /* 12604 * Log/display device information 12605 */ 12606 static void 12607 sata_show_drive_info(sata_hba_inst_t *sata_hba_inst, 12608 sata_drive_info_t *sdinfo) 12609 { 12610 int valid_version; 12611 char msg_buf[MAXPATHLEN]; 12612 int i; 12613 12614 /* Show HBA path */ 12615 (void) ddi_pathname(SATA_DIP(sata_hba_inst), msg_buf); 12616 12617 cmn_err(CE_CONT, "?%s :\n", msg_buf); 12618 12619 switch (sdinfo->satadrv_type) { 12620 case SATA_DTYPE_ATADISK: 12621 (void) sprintf(msg_buf, "SATA disk device at"); 12622 break; 12623 12624 case SATA_DTYPE_ATAPICD: 12625 (void) sprintf(msg_buf, "SATA CD/DVD (ATAPI) device at"); 12626 break; 12627 12628 case SATA_DTYPE_ATAPITAPE: 12629 (void) sprintf(msg_buf, "SATA tape (ATAPI) device at"); 12630 break; 12631 12632 case SATA_DTYPE_ATAPIDISK: 12633 (void) sprintf(msg_buf, "SATA disk (ATAPI) device at"); 12634 break; 12635 12636 case SATA_DTYPE_UNKNOWN: 12637 (void) sprintf(msg_buf, 12638 "Unsupported SATA device type (cfg 0x%x) at ", 12639 sdinfo->satadrv_id.ai_config); 12640 break; 12641 } 12642 12643 if (sdinfo->satadrv_addr.qual == SATA_ADDR_DCPORT) 12644 cmn_err(CE_CONT, "?\t%s port %d\n", 12645 msg_buf, sdinfo->satadrv_addr.cport); 12646 else 12647 cmn_err(CE_CONT, "?\t%s port %d:%d\n", 12648 msg_buf, sdinfo->satadrv_addr.cport, 12649 sdinfo->satadrv_addr.pmport); 12650 12651 bcopy(&sdinfo->satadrv_id.ai_model, msg_buf, 12652 sizeof (sdinfo->satadrv_id.ai_model)); 12653 swab(msg_buf, msg_buf, sizeof (sdinfo->satadrv_id.ai_model)); 12654 msg_buf[sizeof (sdinfo->satadrv_id.ai_model)] = '\0'; 12655 cmn_err(CE_CONT, "?\tmodel %s\n", msg_buf); 12656 12657 bcopy(&sdinfo->satadrv_id.ai_fw, msg_buf, 12658 sizeof (sdinfo->satadrv_id.ai_fw)); 12659 swab(msg_buf, msg_buf, sizeof (sdinfo->satadrv_id.ai_fw)); 12660 msg_buf[sizeof (sdinfo->satadrv_id.ai_fw)] = '\0'; 12661 cmn_err(CE_CONT, "?\tfirmware %s\n", msg_buf); 12662 12663 bcopy(&sdinfo->satadrv_id.ai_drvser, msg_buf, 12664 sizeof (sdinfo->satadrv_id.ai_drvser)); 12665 swab(msg_buf, msg_buf, sizeof (sdinfo->satadrv_id.ai_drvser)); 12666 msg_buf[sizeof (sdinfo->satadrv_id.ai_drvser)] = '\0'; 12667 if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) { 12668 cmn_err(CE_CONT, "?\tserial number %s\n", msg_buf); 12669 } else { 12670 /* 12671 * Some drives do not implement serial number and may 12672 * violate the spec by providing spaces rather than zeros 12673 * in serial number field. Scan the buffer to detect it. 12674 */ 12675 for (i = 0; i < sizeof (sdinfo->satadrv_id.ai_drvser); i++) { 12676 if (msg_buf[i] != '\0' && msg_buf[i] != ' ') 12677 break; 12678 } 12679 if (i == sizeof (sdinfo->satadrv_id.ai_drvser)) { 12680 cmn_err(CE_CONT, "?\tserial number - none\n"); 12681 } else { 12682 cmn_err(CE_CONT, "?\tserial number %s\n", msg_buf); 12683 } 12684 } 12685 12686 #ifdef SATA_DEBUG 12687 if (sdinfo->satadrv_id.ai_majorversion != 0 && 12688 sdinfo->satadrv_id.ai_majorversion != 0xffff) { 12689 int i; 12690 for (i = 14; i >= 2; i--) { 12691 if (sdinfo->satadrv_id.ai_majorversion & (1 << i)) { 12692 valid_version = i; 12693 break; 12694 } 12695 } 12696 cmn_err(CE_CONT, 12697 "?\tATA/ATAPI-%d supported, majver 0x%x minver 0x%x\n", 12698 valid_version, 12699 sdinfo->satadrv_id.ai_majorversion, 12700 sdinfo->satadrv_id.ai_minorversion); 12701 } 12702 #endif 12703 /* Log some info */ 12704 cmn_err(CE_CONT, "?\tsupported features:\n"); 12705 msg_buf[0] = '\0'; 12706 if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) { 12707 if (sdinfo->satadrv_features_support & SATA_DEV_F_LBA48) 12708 (void) strlcat(msg_buf, "48-bit LBA, ", MAXPATHLEN); 12709 else if (sdinfo->satadrv_features_support & SATA_DEV_F_LBA28) 12710 (void) strlcat(msg_buf, "28-bit LBA, ", MAXPATHLEN); 12711 } 12712 if (sdinfo->satadrv_features_support & SATA_DEV_F_DMA) 12713 (void) strlcat(msg_buf, "DMA", MAXPATHLEN); 12714 if (sdinfo->satadrv_features_support & SATA_DEV_F_NCQ) 12715 (void) strlcat(msg_buf, ", Native Command Queueing", 12716 MAXPATHLEN); 12717 if (sdinfo->satadrv_features_support & SATA_DEV_F_TCQ) 12718 (void) strlcat(msg_buf, ", Legacy Tagged Queuing", MAXPATHLEN); 12719 if ((sdinfo->satadrv_id.ai_cmdset82 & SATA_SMART_SUPPORTED) && 12720 (sdinfo->satadrv_id.ai_features85 & SATA_SMART_ENABLED)) 12721 (void) strlcat(msg_buf, ", SMART", MAXPATHLEN); 12722 if ((sdinfo->satadrv_id.ai_cmdset84 & SATA_SMART_SELF_TEST_SUPPORTED) && 12723 (sdinfo->satadrv_id.ai_features87 & SATA_SMART_SELF_TEST_SUPPORTED)) 12724 (void) strlcat(msg_buf, ", SMART self-test", MAXPATHLEN); 12725 cmn_err(CE_CONT, "?\t %s\n", msg_buf); 12726 if (sdinfo->satadrv_features_support & SATA_DEV_F_SATA2) 12727 cmn_err(CE_CONT, "?\tSATA Gen2 signaling speed (3.0Gbps)\n"); 12728 else if (sdinfo->satadrv_features_support & SATA_DEV_F_SATA1) 12729 cmn_err(CE_CONT, "?\tSATA Gen1 signaling speed (1.5Gbps)\n"); 12730 if (sdinfo->satadrv_features_support & 12731 (SATA_DEV_F_TCQ | SATA_DEV_F_NCQ)) { 12732 msg_buf[0] = '\0'; 12733 (void) snprintf(msg_buf, MAXPATHLEN, 12734 "Supported queue depth %d", 12735 sdinfo->satadrv_queue_depth); 12736 if (!(sata_func_enable & 12737 (SATA_ENABLE_QUEUING | SATA_ENABLE_NCQ))) 12738 (void) strlcat(msg_buf, 12739 " - queueing disabled globally", MAXPATHLEN); 12740 else if (sdinfo->satadrv_queue_depth > 12741 sdinfo->satadrv_max_queue_depth) { 12742 (void) snprintf(&msg_buf[strlen(msg_buf)], 12743 MAXPATHLEN - strlen(msg_buf), ", limited to %d", 12744 (int)sdinfo->satadrv_max_queue_depth); 12745 } 12746 cmn_err(CE_CONT, "?\t%s\n", msg_buf); 12747 } 12748 12749 if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) { 12750 #ifdef __i386 12751 (void) sprintf(msg_buf, "\tcapacity = %llu sectors\n", 12752 sdinfo->satadrv_capacity); 12753 #else 12754 (void) sprintf(msg_buf, "\tcapacity = %lu sectors\n", 12755 sdinfo->satadrv_capacity); 12756 #endif 12757 cmn_err(CE_CONT, "?%s", msg_buf); 12758 } 12759 } 12760 12761 /* 12762 * Log/display port multiplier information 12763 * No Mutex should be hold. 12764 */ 12765 static void 12766 sata_show_pmult_info(sata_hba_inst_t *sata_hba_inst, 12767 sata_device_t *sata_device) 12768 { 12769 _NOTE(ARGUNUSED(sata_hba_inst)) 12770 12771 int cport = sata_device->satadev_addr.cport; 12772 sata_pmult_info_t *pmultinfo; 12773 char msg_buf[MAXPATHLEN]; 12774 uint32_t gscr0, gscr1, gscr2, gscr64; 12775 12776 mutex_enter(&SATA_CPORT_MUTEX(sata_hba_inst, cport)); 12777 pmultinfo = SATA_PMULT_INFO(sata_hba_inst, cport); 12778 if (pmultinfo == NULL) { 12779 mutex_exit(&SATA_CPORT_MUTEX(sata_hba_inst, cport)); 12780 return; 12781 } 12782 12783 gscr0 = pmultinfo->pmult_gscr.gscr0; 12784 gscr1 = pmultinfo->pmult_gscr.gscr1; 12785 gscr2 = pmultinfo->pmult_gscr.gscr2; 12786 gscr64 = pmultinfo->pmult_gscr.gscr64; 12787 mutex_exit(&SATA_CPORT_MUTEX(sata_hba_inst, cport)); 12788 12789 cmn_err(CE_CONT, "?Port Multiplier %d device-ports found at port %d", 12790 sata_device->satadev_add_info, sata_device->satadev_addr.cport); 12791 12792 (void) sprintf(msg_buf, "\tVendor_ID 0x%04x, Module_ID 0x%04x", 12793 gscr0 & 0xffff, (gscr0 >> 16) & 0xffff); 12794 cmn_err(CE_CONT, "?%s", msg_buf); 12795 12796 (void) strcpy(msg_buf, "\tSupport SATA PMP Spec "); 12797 if (gscr1 & (1 << 3)) 12798 (void) strlcat(msg_buf, "1.2", MAXPATHLEN); 12799 else if (gscr1 & (1 << 2)) 12800 (void) strlcat(msg_buf, "1.1", MAXPATHLEN); 12801 else if (gscr1 & (1 << 1)) 12802 (void) strlcat(msg_buf, "1.0", MAXPATHLEN); 12803 else 12804 (void) strlcat(msg_buf, "unknown", MAXPATHLEN); 12805 cmn_err(CE_CONT, "?%s", msg_buf); 12806 12807 (void) strcpy(msg_buf, "\tSupport "); 12808 if (gscr64 & (1 << 3)) 12809 (void) strlcat(msg_buf, "Asy-Notif, ", 12810 MAXPATHLEN); 12811 if (gscr64 & (1 << 2)) 12812 (void) strlcat(msg_buf, "Dyn-SSC, ", MAXPATHLEN); 12813 if (gscr64 & (1 << 1)) 12814 (void) strlcat(msg_buf, "Iss-PMREQ, ", MAXPATHLEN); 12815 if (gscr64 & (1 << 0)) 12816 (void) strlcat(msg_buf, "BIST", MAXPATHLEN); 12817 if ((gscr64 & 0xf) == 0) 12818 (void) strlcat(msg_buf, "nothing", MAXPATHLEN); 12819 cmn_err(CE_CONT, "?%s", msg_buf); 12820 12821 (void) sprintf(msg_buf, "\tNumber of exposed device fan-out ports: %d", 12822 gscr2 & SATA_PMULT_PORTNUM_MASK); 12823 cmn_err(CE_CONT, "?%s", msg_buf); 12824 } 12825 12826 /* 12827 * sata_save_drive_settings extracts current setting of the device and stores 12828 * it for future reference, in case the device setup would need to be restored 12829 * after the device reset. 12830 * 12831 * For all devices read ahead and write cache settings are saved, if the 12832 * device supports these features at all. 12833 * For ATAPI devices the Removable Media Status Notification setting is saved. 12834 */ 12835 static void 12836 sata_save_drive_settings(sata_drive_info_t *sdinfo) 12837 { 12838 if (SATA_READ_AHEAD_SUPPORTED(sdinfo->satadrv_id) || 12839 SATA_WRITE_CACHE_SUPPORTED(sdinfo->satadrv_id)) { 12840 12841 /* Current setting of Read Ahead (and Read Cache) */ 12842 if (SATA_READ_AHEAD_ENABLED(sdinfo->satadrv_id)) 12843 sdinfo->satadrv_settings |= SATA_DEV_READ_AHEAD; 12844 else 12845 sdinfo->satadrv_settings &= ~SATA_DEV_READ_AHEAD; 12846 12847 /* Current setting of Write Cache */ 12848 if (SATA_WRITE_CACHE_ENABLED(sdinfo->satadrv_id)) 12849 sdinfo->satadrv_settings |= SATA_DEV_WRITE_CACHE; 12850 else 12851 sdinfo->satadrv_settings &= ~SATA_DEV_WRITE_CACHE; 12852 } 12853 12854 if (sdinfo->satadrv_type == SATA_DTYPE_ATAPICD) { 12855 if (SATA_RM_NOTIFIC_SUPPORTED(sdinfo->satadrv_id)) 12856 sdinfo->satadrv_settings |= SATA_DEV_RMSN; 12857 else 12858 sdinfo->satadrv_settings &= ~SATA_DEV_RMSN; 12859 } 12860 } 12861 12862 12863 /* 12864 * sata_check_capacity function determines a disk capacity 12865 * and addressing mode (LBA28/LBA48) by examining a disk identify device data. 12866 * 12867 * NOTE: CHS mode is not supported! If a device does not support LBA, 12868 * this function is not called. 12869 * 12870 * Returns device capacity in number of blocks, i.e. largest addressable LBA+1 12871 */ 12872 static uint64_t 12873 sata_check_capacity(sata_drive_info_t *sdinfo) 12874 { 12875 uint64_t capacity = 0; 12876 int i; 12877 12878 if (sdinfo->satadrv_type != SATA_DTYPE_ATADISK || 12879 !sdinfo->satadrv_id.ai_cap & SATA_LBA_SUPPORT) 12880 /* Capacity valid only for LBA-addressable disk devices */ 12881 return (0); 12882 12883 if ((sdinfo->satadrv_id.ai_validinfo & SATA_VALIDINFO_88) && 12884 (sdinfo->satadrv_id.ai_cmdset83 & SATA_EXT48) && 12885 (sdinfo->satadrv_id.ai_features86 & SATA_EXT48)) { 12886 /* LBA48 mode supported and enabled */ 12887 sdinfo->satadrv_features_support |= SATA_DEV_F_LBA48 | 12888 SATA_DEV_F_LBA28; 12889 for (i = 3; i >= 0; --i) { 12890 capacity <<= 16; 12891 capacity += sdinfo->satadrv_id.ai_addrsecxt[i]; 12892 } 12893 } else { 12894 capacity = sdinfo->satadrv_id.ai_addrsec[1]; 12895 capacity <<= 16; 12896 capacity += sdinfo->satadrv_id.ai_addrsec[0]; 12897 if (capacity >= 0x1000000) 12898 /* LBA28 mode */ 12899 sdinfo->satadrv_features_support |= SATA_DEV_F_LBA28; 12900 } 12901 return (capacity); 12902 } 12903 12904 12905 /* 12906 * Allocate consistent buffer for DMA transfer 12907 * 12908 * Cannot be called from interrupt level or with mutex held - it may sleep. 12909 * 12910 * Returns pointer to allocated buffer structure, or NULL if allocation failed. 12911 */ 12912 static struct buf * 12913 sata_alloc_local_buffer(sata_pkt_txlate_t *spx, int len) 12914 { 12915 struct scsi_address ap; 12916 struct buf *bp; 12917 ddi_dma_attr_t cur_dma_attr; 12918 12919 ASSERT(spx->txlt_sata_pkt != NULL); 12920 ap.a_hba_tran = spx->txlt_sata_hba_inst->satahba_scsi_tran; 12921 ap.a_target = SATA_TO_SCSI_TARGET( 12922 spx->txlt_sata_pkt->satapkt_device.satadev_addr.cport, 12923 spx->txlt_sata_pkt->satapkt_device.satadev_addr.pmport, 12924 spx->txlt_sata_pkt->satapkt_device.satadev_addr.qual); 12925 ap.a_lun = 0; 12926 12927 bp = scsi_alloc_consistent_buf(&ap, NULL, len, 12928 B_READ, SLEEP_FUNC, NULL); 12929 12930 if (bp != NULL) { 12931 /* Allocate DMA resources for this buffer */ 12932 spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp = bp; 12933 /* 12934 * We use a local version of the dma_attr, to account 12935 * for a device addressing limitations. 12936 * sata_adjust_dma_attr() will handle sdinfo == NULL which 12937 * will cause dma attributes to be adjusted to a lowest 12938 * acceptable level. 12939 */ 12940 sata_adjust_dma_attr(NULL, 12941 SATA_DMA_ATTR(spx->txlt_sata_hba_inst), &cur_dma_attr); 12942 12943 if (sata_dma_buf_setup(spx, PKT_CONSISTENT, 12944 SLEEP_FUNC, NULL, &cur_dma_attr) != DDI_SUCCESS) { 12945 scsi_free_consistent_buf(bp); 12946 spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp = NULL; 12947 bp = NULL; 12948 } 12949 } 12950 return (bp); 12951 } 12952 12953 /* 12954 * Release local buffer (consistent buffer for DMA transfer) allocated 12955 * via sata_alloc_local_buffer(). 12956 */ 12957 static void 12958 sata_free_local_buffer(sata_pkt_txlate_t *spx) 12959 { 12960 ASSERT(spx->txlt_sata_pkt != NULL); 12961 ASSERT(spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp != NULL); 12962 12963 spx->txlt_sata_pkt->satapkt_cmd.satacmd_num_dma_cookies = 0; 12964 spx->txlt_sata_pkt->satapkt_cmd.satacmd_dma_cookie_list = NULL; 12965 12966 sata_common_free_dma_rsrcs(spx); 12967 12968 /* Free buffer */ 12969 scsi_free_consistent_buf(spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp); 12970 spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp = NULL; 12971 } 12972 12973 /* 12974 * Allocate sata_pkt 12975 * Pkt structure version and embedded strcutures version are initialized. 12976 * sata_pkt and sata_pkt_txlate structures are cross-linked. 12977 * 12978 * Since this may be called in interrupt context by sata_scsi_init_pkt, 12979 * callback argument determines if it can sleep or not. 12980 * Hence, it should not be called from interrupt context. 12981 * 12982 * If successful, non-NULL pointer to a sata pkt is returned. 12983 * Upon failure, NULL pointer is returned. 12984 */ 12985 static sata_pkt_t * 12986 sata_pkt_alloc(sata_pkt_txlate_t *spx, int (*callback)(caddr_t)) 12987 { 12988 sata_pkt_t *spkt; 12989 int kmsflag; 12990 12991 kmsflag = (callback == SLEEP_FUNC) ? KM_SLEEP : KM_NOSLEEP; 12992 spkt = kmem_zalloc(sizeof (sata_pkt_t), kmsflag); 12993 if (spkt == NULL) { 12994 SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN, 12995 "sata_pkt_alloc: failed")); 12996 return (NULL); 12997 } 12998 spkt->satapkt_rev = SATA_PKT_REV; 12999 spkt->satapkt_cmd.satacmd_rev = SATA_CMD_REV; 13000 spkt->satapkt_device.satadev_rev = SATA_DEVICE_REV; 13001 spkt->satapkt_framework_private = spx; 13002 spx->txlt_sata_pkt = spkt; 13003 return (spkt); 13004 } 13005 13006 /* 13007 * Free sata pkt allocated via sata_pkt_alloc() 13008 */ 13009 static void 13010 sata_pkt_free(sata_pkt_txlate_t *spx) 13011 { 13012 ASSERT(spx->txlt_sata_pkt != NULL); 13013 ASSERT(spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp == NULL); 13014 kmem_free(spx->txlt_sata_pkt, sizeof (sata_pkt_t)); 13015 spx->txlt_sata_pkt = NULL; 13016 } 13017 13018 13019 /* 13020 * Adjust DMA attributes. 13021 * SCSI cmds block count is up to 24 bits, SATA cmd block count vary 13022 * from 8 bits to 16 bits, depending on a command being used. 13023 * Limiting max block count arbitrarily to 256 for all read/write 13024 * commands may affects performance, so check both the device and 13025 * controller capability before adjusting dma attributes. 13026 */ 13027 void 13028 sata_adjust_dma_attr(sata_drive_info_t *sdinfo, ddi_dma_attr_t *dma_attr, 13029 ddi_dma_attr_t *adj_dma_attr) 13030 { 13031 uint32_t count_max; 13032 13033 /* Copy original attributes */ 13034 *adj_dma_attr = *dma_attr; 13035 /* 13036 * Things to consider: device addressing capability, 13037 * "excessive" controller DMA capabilities. 13038 * If a device is being probed/initialized, there are 13039 * no device info - use default limits then. 13040 */ 13041 if (sdinfo == NULL) { 13042 count_max = dma_attr->dma_attr_granular * 0x100; 13043 if (dma_attr->dma_attr_count_max > count_max) 13044 adj_dma_attr->dma_attr_count_max = count_max; 13045 if (dma_attr->dma_attr_maxxfer > count_max) 13046 adj_dma_attr->dma_attr_maxxfer = count_max; 13047 return; 13048 } 13049 13050 if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) { 13051 if (sdinfo->satadrv_features_support & (SATA_DEV_F_LBA48)) { 13052 /* 13053 * 16-bit sector count may be used - we rely on 13054 * the assumption that only read and write cmds 13055 * will request more than 256 sectors worth of data 13056 */ 13057 count_max = adj_dma_attr->dma_attr_granular * 0x10000; 13058 } else { 13059 /* 13060 * 8-bit sector count will be used - default limits 13061 * for dma attributes 13062 */ 13063 count_max = adj_dma_attr->dma_attr_granular * 0x100; 13064 } 13065 /* 13066 * Adjust controler dma attributes, if necessary 13067 */ 13068 if (dma_attr->dma_attr_count_max > count_max) 13069 adj_dma_attr->dma_attr_count_max = count_max; 13070 if (dma_attr->dma_attr_maxxfer > count_max) 13071 adj_dma_attr->dma_attr_maxxfer = count_max; 13072 } 13073 } 13074 13075 13076 /* 13077 * Allocate DMA resources for the buffer 13078 * This function handles initial DMA resource allocation as well as 13079 * DMA window shift and may be called repeatedly for the same DMA window 13080 * until all DMA cookies in the DMA window are processed. 13081 * To guarantee that there is always a coherent set of cookies to process 13082 * by SATA HBA driver (observing alignment, device granularity, etc.), 13083 * the number of slots for DMA cookies is equal to lesser of a number of 13084 * cookies in a DMA window and a max number of scatter/gather entries. 13085 * 13086 * Returns DDI_SUCCESS upon successful operation. 13087 * Return failure code of a failing command or DDI_FAILURE when 13088 * internal cleanup failed. 13089 */ 13090 static int 13091 sata_dma_buf_setup(sata_pkt_txlate_t *spx, int flags, 13092 int (*callback)(caddr_t), caddr_t arg, 13093 ddi_dma_attr_t *cur_dma_attr) 13094 { 13095 int rval; 13096 off_t offset; 13097 size_t size; 13098 int max_sg_len, req_len, i; 13099 uint_t dma_flags; 13100 struct buf *bp; 13101 uint64_t cur_txfer_len; 13102 13103 13104 ASSERT(spx->txlt_sata_pkt != NULL); 13105 bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp; 13106 ASSERT(bp != NULL); 13107 13108 13109 if (spx->txlt_buf_dma_handle == NULL) { 13110 /* 13111 * No DMA resources allocated so far - this is a first call 13112 * for this sata pkt. 13113 */ 13114 rval = ddi_dma_alloc_handle(SATA_DIP(spx->txlt_sata_hba_inst), 13115 cur_dma_attr, callback, arg, &spx->txlt_buf_dma_handle); 13116 13117 if (rval != DDI_SUCCESS) { 13118 SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN, 13119 "sata_dma_buf_setup: no buf DMA resources %x", 13120 rval)); 13121 return (rval); 13122 } 13123 13124 if (bp->b_flags & B_READ) 13125 dma_flags = DDI_DMA_READ; 13126 else 13127 dma_flags = DDI_DMA_WRITE; 13128 13129 if (flags & PKT_CONSISTENT) 13130 dma_flags |= DDI_DMA_CONSISTENT; 13131 13132 if (flags & PKT_DMA_PARTIAL) 13133 dma_flags |= DDI_DMA_PARTIAL; 13134 13135 /* 13136 * Check buffer alignment and size against dma attributes 13137 * Consider dma_attr_align only. There may be requests 13138 * with the size lower than device granularity, but they 13139 * will not read/write from/to the device, so no adjustment 13140 * is necessary. The dma_attr_minxfer theoretically should 13141 * be considered, but no HBA driver is checking it. 13142 */ 13143 if (IS_P2ALIGNED(bp->b_un.b_addr, 13144 cur_dma_attr->dma_attr_align)) { 13145 rval = ddi_dma_buf_bind_handle( 13146 spx->txlt_buf_dma_handle, 13147 bp, dma_flags, callback, arg, 13148 &spx->txlt_dma_cookie, 13149 &spx->txlt_curwin_num_dma_cookies); 13150 } else { /* Buffer is not aligned */ 13151 13152 int (*ddicallback)(caddr_t); 13153 size_t bufsz; 13154 13155 /* Check id sleeping is allowed */ 13156 ddicallback = (callback == NULL_FUNC) ? 13157 DDI_DMA_DONTWAIT : DDI_DMA_SLEEP; 13158 13159 SATADBG2(SATA_DBG_DMA_SETUP, spx->txlt_sata_hba_inst, 13160 "mis-aligned buffer: addr=0x%p, cnt=%lu", 13161 (void *)bp->b_un.b_addr, bp->b_bcount); 13162 13163 if (bp->b_flags & (B_PAGEIO|B_PHYS)) 13164 /* 13165 * CPU will need to access data in the buffer 13166 * (for copying) so map it. 13167 */ 13168 bp_mapin(bp); 13169 13170 ASSERT(spx->txlt_tmp_buf == NULL); 13171 13172 /* Buffer may be padded by ddi_dma_mem_alloc()! */ 13173 rval = ddi_dma_mem_alloc( 13174 spx->txlt_buf_dma_handle, 13175 bp->b_bcount, 13176 &sata_acc_attr, 13177 DDI_DMA_STREAMING, 13178 ddicallback, NULL, 13179 &spx->txlt_tmp_buf, 13180 &bufsz, 13181 &spx->txlt_tmp_buf_handle); 13182 13183 if (rval != DDI_SUCCESS) { 13184 /* DMA mapping failed */ 13185 (void) ddi_dma_free_handle( 13186 &spx->txlt_buf_dma_handle); 13187 spx->txlt_buf_dma_handle = NULL; 13188 #ifdef SATA_DEBUG 13189 mbuffail_count++; 13190 #endif 13191 SATADBG1(SATA_DBG_DMA_SETUP, 13192 spx->txlt_sata_hba_inst, 13193 "sata_dma_buf_setup: " 13194 "buf dma mem alloc failed %x\n", rval); 13195 return (rval); 13196 } 13197 ASSERT(IS_P2ALIGNED(spx->txlt_tmp_buf, 13198 cur_dma_attr->dma_attr_align)); 13199 13200 #ifdef SATA_DEBUG 13201 mbuf_count++; 13202 13203 if (bp->b_bcount != bufsz) 13204 /* 13205 * This will require special handling, because 13206 * DMA cookies will be based on the temporary 13207 * buffer size, not the original buffer 13208 * b_bcount, so the residue may have to 13209 * be counted differently. 13210 */ 13211 SATADBG2(SATA_DBG_DMA_SETUP, 13212 spx->txlt_sata_hba_inst, 13213 "sata_dma_buf_setup: bp size %x != " 13214 "bufsz %x\n", bp->b_bcount, bufsz); 13215 #endif 13216 if (dma_flags & DDI_DMA_WRITE) { 13217 /* 13218 * Write operation - copy data into 13219 * an aligned temporary buffer. Buffer will be 13220 * synced for device by ddi_dma_addr_bind_handle 13221 */ 13222 bcopy(bp->b_un.b_addr, spx->txlt_tmp_buf, 13223 bp->b_bcount); 13224 } 13225 13226 rval = ddi_dma_addr_bind_handle( 13227 spx->txlt_buf_dma_handle, 13228 NULL, 13229 spx->txlt_tmp_buf, 13230 bufsz, dma_flags, ddicallback, 0, 13231 &spx->txlt_dma_cookie, 13232 &spx->txlt_curwin_num_dma_cookies); 13233 } 13234 13235 switch (rval) { 13236 case DDI_DMA_PARTIAL_MAP: 13237 SATADBG1(SATA_DBG_DMA_SETUP, spx->txlt_sata_hba_inst, 13238 "sata_dma_buf_setup: DMA Partial Map\n", NULL); 13239 /* 13240 * Partial DMA mapping. 13241 * Retrieve number of DMA windows for this request. 13242 */ 13243 if (ddi_dma_numwin(spx->txlt_buf_dma_handle, 13244 &spx->txlt_num_dma_win) != DDI_SUCCESS) { 13245 if (spx->txlt_tmp_buf != NULL) { 13246 ddi_dma_mem_free( 13247 &spx->txlt_tmp_buf_handle); 13248 spx->txlt_tmp_buf = NULL; 13249 } 13250 (void) ddi_dma_unbind_handle( 13251 spx->txlt_buf_dma_handle); 13252 (void) ddi_dma_free_handle( 13253 &spx->txlt_buf_dma_handle); 13254 spx->txlt_buf_dma_handle = NULL; 13255 SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN, 13256 "sata_dma_buf_setup: numwin failed\n")); 13257 return (DDI_FAILURE); 13258 } 13259 SATADBG2(SATA_DBG_DMA_SETUP, 13260 spx->txlt_sata_hba_inst, 13261 "sata_dma_buf_setup: windows: %d, cookies: %d\n", 13262 spx->txlt_num_dma_win, 13263 spx->txlt_curwin_num_dma_cookies); 13264 spx->txlt_cur_dma_win = 0; 13265 break; 13266 13267 case DDI_DMA_MAPPED: 13268 /* DMA fully mapped */ 13269 spx->txlt_num_dma_win = 1; 13270 spx->txlt_cur_dma_win = 0; 13271 SATADBG1(SATA_DBG_DMA_SETUP, 13272 spx->txlt_sata_hba_inst, 13273 "sata_dma_buf_setup: windows: 1 " 13274 "cookies: %d\n", spx->txlt_curwin_num_dma_cookies); 13275 break; 13276 13277 default: 13278 /* DMA mapping failed */ 13279 if (spx->txlt_tmp_buf != NULL) { 13280 ddi_dma_mem_free( 13281 &spx->txlt_tmp_buf_handle); 13282 spx->txlt_tmp_buf = NULL; 13283 } 13284 (void) ddi_dma_free_handle(&spx->txlt_buf_dma_handle); 13285 spx->txlt_buf_dma_handle = NULL; 13286 SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN, 13287 "sata_dma_buf_setup: buf dma handle binding " 13288 "failed %x\n", rval)); 13289 return (rval); 13290 } 13291 spx->txlt_curwin_processed_dma_cookies = 0; 13292 spx->txlt_dma_cookie_list = NULL; 13293 } else { 13294 /* 13295 * DMA setup is reused. Check if we need to process more 13296 * cookies in current window, or to get next window, if any. 13297 */ 13298 13299 ASSERT(spx->txlt_curwin_processed_dma_cookies <= 13300 spx->txlt_curwin_num_dma_cookies); 13301 13302 if (spx->txlt_curwin_processed_dma_cookies == 13303 spx->txlt_curwin_num_dma_cookies) { 13304 /* 13305 * All cookies from current DMA window were processed. 13306 * Get next DMA window. 13307 */ 13308 spx->txlt_cur_dma_win++; 13309 if (spx->txlt_cur_dma_win < spx->txlt_num_dma_win) { 13310 (void) ddi_dma_getwin(spx->txlt_buf_dma_handle, 13311 spx->txlt_cur_dma_win, &offset, &size, 13312 &spx->txlt_dma_cookie, 13313 &spx->txlt_curwin_num_dma_cookies); 13314 spx->txlt_curwin_processed_dma_cookies = 0; 13315 } else { 13316 /* No more windows! End of request! */ 13317 /* What to do? - panic for now */ 13318 ASSERT(spx->txlt_cur_dma_win >= 13319 spx->txlt_num_dma_win); 13320 13321 spx->txlt_curwin_num_dma_cookies = 0; 13322 spx->txlt_curwin_processed_dma_cookies = 0; 13323 spx->txlt_sata_pkt-> 13324 satapkt_cmd.satacmd_num_dma_cookies = 0; 13325 return (DDI_SUCCESS); 13326 } 13327 } 13328 } 13329 /* There better be at least one DMA cookie outstanding */ 13330 ASSERT((spx->txlt_curwin_num_dma_cookies - 13331 spx->txlt_curwin_processed_dma_cookies) > 0); 13332 13333 if (spx->txlt_dma_cookie_list == &spx->txlt_dma_cookie) { 13334 /* The default cookie slot was used in previous run */ 13335 ASSERT(spx->txlt_curwin_processed_dma_cookies == 0); 13336 spx->txlt_dma_cookie_list = NULL; 13337 spx->txlt_dma_cookie_list_len = 0; 13338 } 13339 if (spx->txlt_curwin_processed_dma_cookies == 0) { 13340 /* 13341 * Processing a new DMA window - set-up dma cookies list. 13342 * We may reuse previously allocated cookie array if it is 13343 * possible. 13344 */ 13345 if (spx->txlt_dma_cookie_list != NULL && 13346 spx->txlt_dma_cookie_list_len < 13347 spx->txlt_curwin_num_dma_cookies) { 13348 /* 13349 * New DMA window contains more cookies than 13350 * the previous one. We need larger cookie list - free 13351 * the old one. 13352 */ 13353 (void) kmem_free(spx->txlt_dma_cookie_list, 13354 spx->txlt_dma_cookie_list_len * 13355 sizeof (ddi_dma_cookie_t)); 13356 spx->txlt_dma_cookie_list = NULL; 13357 spx->txlt_dma_cookie_list_len = 0; 13358 } 13359 if (spx->txlt_dma_cookie_list == NULL) { 13360 /* 13361 * Calculate lesser of number of cookies in this 13362 * DMA window and number of s/g entries. 13363 */ 13364 max_sg_len = cur_dma_attr->dma_attr_sgllen; 13365 req_len = MIN(max_sg_len, 13366 spx->txlt_curwin_num_dma_cookies); 13367 13368 /* Allocate new dma cookie array if necessary */ 13369 if (req_len == 1) { 13370 /* Only one cookie - no need for a list */ 13371 spx->txlt_dma_cookie_list = 13372 &spx->txlt_dma_cookie; 13373 spx->txlt_dma_cookie_list_len = 1; 13374 } else { 13375 /* 13376 * More than one cookie - try to allocate space. 13377 */ 13378 spx->txlt_dma_cookie_list = kmem_zalloc( 13379 sizeof (ddi_dma_cookie_t) * req_len, 13380 callback == NULL_FUNC ? KM_NOSLEEP : 13381 KM_SLEEP); 13382 if (spx->txlt_dma_cookie_list == NULL) { 13383 SATADBG1(SATA_DBG_DMA_SETUP, 13384 spx->txlt_sata_hba_inst, 13385 "sata_dma_buf_setup: cookie list " 13386 "allocation failed\n", NULL); 13387 /* 13388 * We could not allocate space for 13389 * neccessary number of dma cookies in 13390 * this window, so we fail this request. 13391 * Next invocation would try again to 13392 * allocate space for cookie list. 13393 * Note:Packet residue was not modified. 13394 */ 13395 return (DDI_DMA_NORESOURCES); 13396 } else { 13397 spx->txlt_dma_cookie_list_len = req_len; 13398 } 13399 } 13400 } 13401 /* 13402 * Fetch DMA cookies into cookie list in sata_pkt_txlate. 13403 * First cookie was already fetched. 13404 */ 13405 *(&spx->txlt_dma_cookie_list[0]) = spx->txlt_dma_cookie; 13406 cur_txfer_len = 13407 (uint64_t)spx->txlt_dma_cookie_list[0].dmac_size; 13408 spx->txlt_sata_pkt->satapkt_cmd.satacmd_num_dma_cookies = 1; 13409 spx->txlt_curwin_processed_dma_cookies++; 13410 for (i = 1; (i < spx->txlt_dma_cookie_list_len) && 13411 (i < spx->txlt_curwin_num_dma_cookies); i++) { 13412 ddi_dma_nextcookie(spx->txlt_buf_dma_handle, 13413 &spx->txlt_dma_cookie_list[i]); 13414 cur_txfer_len += 13415 (uint64_t)spx->txlt_dma_cookie_list[i].dmac_size; 13416 spx->txlt_curwin_processed_dma_cookies++; 13417 spx->txlt_sata_pkt-> 13418 satapkt_cmd.satacmd_num_dma_cookies += 1; 13419 } 13420 } else { 13421 SATADBG2(SATA_DBG_DMA_SETUP, spx->txlt_sata_hba_inst, 13422 "sata_dma_buf_setup: sliding within DMA window, " 13423 "cur cookie %d, total cookies %d\n", 13424 spx->txlt_curwin_processed_dma_cookies, 13425 spx->txlt_curwin_num_dma_cookies); 13426 13427 /* 13428 * Not all cookies from the current dma window were used because 13429 * of s/g limitation. 13430 * There is no need to re-size the list - it was set at 13431 * optimal size, or only default entry is used (s/g = 1). 13432 */ 13433 if (spx->txlt_dma_cookie_list == NULL) { 13434 spx->txlt_dma_cookie_list = &spx->txlt_dma_cookie; 13435 spx->txlt_dma_cookie_list_len = 1; 13436 } 13437 /* 13438 * Since we are processing remaining cookies in a DMA window, 13439 * there may be less of them than the number of entries in the 13440 * current dma cookie list. 13441 */ 13442 req_len = MIN(spx->txlt_dma_cookie_list_len, 13443 (spx->txlt_curwin_num_dma_cookies - 13444 spx->txlt_curwin_processed_dma_cookies)); 13445 13446 /* Fetch the next batch of cookies */ 13447 for (i = 0, cur_txfer_len = 0; i < req_len; i++) { 13448 ddi_dma_nextcookie(spx->txlt_buf_dma_handle, 13449 &spx->txlt_dma_cookie_list[i]); 13450 cur_txfer_len += 13451 (uint64_t)spx->txlt_dma_cookie_list[i].dmac_size; 13452 spx->txlt_sata_pkt-> 13453 satapkt_cmd.satacmd_num_dma_cookies++; 13454 spx->txlt_curwin_processed_dma_cookies++; 13455 } 13456 } 13457 13458 ASSERT(spx->txlt_sata_pkt->satapkt_cmd.satacmd_num_dma_cookies > 0); 13459 13460 /* Point sata_cmd to the cookie list */ 13461 spx->txlt_sata_pkt->satapkt_cmd.satacmd_dma_cookie_list = 13462 &spx->txlt_dma_cookie_list[0]; 13463 13464 /* Remember number of DMA cookies passed in sata packet */ 13465 spx->txlt_num_dma_cookies = 13466 spx->txlt_sata_pkt->satapkt_cmd.satacmd_num_dma_cookies; 13467 13468 ASSERT(cur_txfer_len != 0); 13469 if (cur_txfer_len <= bp->b_bcount) 13470 spx->txlt_total_residue -= cur_txfer_len; 13471 else { 13472 /* 13473 * Temporary DMA buffer has been padded by 13474 * ddi_dma_mem_alloc()! 13475 * This requires special handling, because DMA cookies are 13476 * based on the temporary buffer size, not the b_bcount, 13477 * and we have extra bytes to transfer - but the packet 13478 * residue has to stay correct because we will copy only 13479 * the requested number of bytes. 13480 */ 13481 spx->txlt_total_residue -= bp->b_bcount; 13482 } 13483 13484 return (DDI_SUCCESS); 13485 } 13486 13487 /* 13488 * Common routine for releasing DMA resources 13489 */ 13490 static void 13491 sata_common_free_dma_rsrcs(sata_pkt_txlate_t *spx) 13492 { 13493 if (spx->txlt_buf_dma_handle != NULL) { 13494 if (spx->txlt_tmp_buf != NULL) { 13495 /* 13496 * Intermediate DMA buffer was allocated. 13497 * Free allocated buffer and associated access handle. 13498 */ 13499 ddi_dma_mem_free(&spx->txlt_tmp_buf_handle); 13500 spx->txlt_tmp_buf = NULL; 13501 } 13502 /* 13503 * Free DMA resources - cookies and handles 13504 */ 13505 /* ASSERT(spx->txlt_dma_cookie_list != NULL); */ 13506 if (spx->txlt_dma_cookie_list != NULL) { 13507 if (spx->txlt_dma_cookie_list != 13508 &spx->txlt_dma_cookie) { 13509 (void) kmem_free(spx->txlt_dma_cookie_list, 13510 spx->txlt_dma_cookie_list_len * 13511 sizeof (ddi_dma_cookie_t)); 13512 spx->txlt_dma_cookie_list = NULL; 13513 } 13514 } 13515 (void) ddi_dma_unbind_handle(spx->txlt_buf_dma_handle); 13516 (void) ddi_dma_free_handle(&spx->txlt_buf_dma_handle); 13517 spx->txlt_buf_dma_handle = NULL; 13518 } 13519 } 13520 13521 /* 13522 * Free DMA resources 13523 * Used by the HBA driver to release DMA resources that it does not use. 13524 * 13525 * Returns Void 13526 */ 13527 void 13528 sata_free_dma_resources(sata_pkt_t *sata_pkt) 13529 { 13530 sata_pkt_txlate_t *spx; 13531 13532 if (sata_pkt == NULL) 13533 return; 13534 13535 spx = (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private; 13536 13537 sata_common_free_dma_rsrcs(spx); 13538 } 13539 13540 /* 13541 * Fetch Device Identify data. 13542 * Send DEVICE IDENTIFY or IDENTIFY PACKET DEVICE (depending on a device type) 13543 * command to a device and get the device identify data. 13544 * The device_info structure has to be set to device type (for selecting proper 13545 * device identify command). 13546 * 13547 * Returns: 13548 * SATA_SUCCESS if cmd succeeded 13549 * SATA_RETRY if cmd was rejected and could be retried, 13550 * SATA_FAILURE if cmd failed and should not be retried (port error) 13551 * 13552 * Cannot be called in an interrupt context. 13553 */ 13554 13555 static int 13556 sata_fetch_device_identify_data(sata_hba_inst_t *sata_hba_inst, 13557 sata_drive_info_t *sdinfo) 13558 { 13559 struct buf *bp; 13560 sata_pkt_t *spkt; 13561 sata_cmd_t *scmd; 13562 sata_pkt_txlate_t *spx; 13563 int rval; 13564 dev_info_t *dip = SATA_DIP(sata_hba_inst); 13565 13566 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP); 13567 spx->txlt_sata_hba_inst = sata_hba_inst; 13568 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */ 13569 spkt = sata_pkt_alloc(spx, SLEEP_FUNC); 13570 if (spkt == NULL) { 13571 kmem_free(spx, sizeof (sata_pkt_txlate_t)); 13572 return (SATA_RETRY); /* may retry later */ 13573 } 13574 /* address is needed now */ 13575 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr; 13576 13577 /* 13578 * Allocate buffer for Identify Data return data 13579 */ 13580 bp = sata_alloc_local_buffer(spx, sizeof (sata_id_t)); 13581 if (bp == NULL) { 13582 sata_pkt_free(spx); 13583 kmem_free(spx, sizeof (sata_pkt_txlate_t)); 13584 SATA_LOG_D((sata_hba_inst, CE_WARN, 13585 "sata_fetch_device_identify_data: " 13586 "cannot allocate buffer for ID")); 13587 return (SATA_RETRY); /* may retry later */ 13588 } 13589 13590 /* Fill sata_pkt */ 13591 sdinfo->satadrv_state = SATA_STATE_PROBING; 13592 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr; 13593 spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS; 13594 /* Synchronous mode, no callback */ 13595 spkt->satapkt_comp = NULL; 13596 /* Timeout 30s */ 13597 spkt->satapkt_time = sata_default_pkt_time; 13598 13599 scmd = &spkt->satapkt_cmd; 13600 scmd->satacmd_bp = bp; 13601 scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ; 13602 scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE; 13603 13604 /* Build Identify Device cmd in the sata_pkt */ 13605 scmd->satacmd_addr_type = 0; /* N/A */ 13606 scmd->satacmd_sec_count_lsb = 0; /* N/A */ 13607 scmd->satacmd_lba_low_lsb = 0; /* N/A */ 13608 scmd->satacmd_lba_mid_lsb = 0; /* N/A */ 13609 scmd->satacmd_lba_high_lsb = 0; /* N/A */ 13610 scmd->satacmd_features_reg = 0; /* N/A */ 13611 scmd->satacmd_device_reg = 0; /* Always device 0 */ 13612 if (sdinfo->satadrv_type & SATA_DTYPE_ATAPI) { 13613 /* Identify Packet Device cmd */ 13614 scmd->satacmd_cmd_reg = SATAC_ID_PACKET_DEVICE; 13615 } else { 13616 /* Identify Device cmd - mandatory for all other devices */ 13617 scmd->satacmd_cmd_reg = SATAC_ID_DEVICE; 13618 } 13619 13620 /* Send pkt to SATA HBA driver */ 13621 rval = (*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst), spkt); 13622 13623 #ifdef SATA_INJECT_FAULTS 13624 sata_inject_pkt_fault(spkt, &rval, sata_fault_type); 13625 #endif 13626 13627 if (rval == SATA_TRAN_ACCEPTED && 13628 spkt->satapkt_reason == SATA_PKT_COMPLETED) { 13629 if (spx->txlt_buf_dma_handle != NULL) { 13630 rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0, 13631 DDI_DMA_SYNC_FORKERNEL); 13632 ASSERT(rval == DDI_SUCCESS); 13633 if (sata_check_for_dma_error(dip, spx)) { 13634 ddi_fm_service_impact(dip, 13635 DDI_SERVICE_UNAFFECTED); 13636 rval = SATA_RETRY; 13637 goto fail; 13638 } 13639 13640 } 13641 if ((((sata_id_t *)(bp->b_un.b_addr))->ai_config & 13642 SATA_INCOMPLETE_DATA) == SATA_INCOMPLETE_DATA) { 13643 SATA_LOG_D((sata_hba_inst, CE_WARN, 13644 "SATA disk device at port %d - " 13645 "partial Identify Data", 13646 sdinfo->satadrv_addr.cport)); 13647 rval = SATA_RETRY; /* may retry later */ 13648 goto fail; 13649 } 13650 /* Update sata_drive_info */ 13651 bcopy(bp->b_un.b_addr, &sdinfo->satadrv_id, 13652 sizeof (sata_id_t)); 13653 13654 sdinfo->satadrv_features_support = 0; 13655 if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) { 13656 /* 13657 * Retrieve capacity (disks only) and addressing mode 13658 */ 13659 sdinfo->satadrv_capacity = sata_check_capacity(sdinfo); 13660 } else { 13661 /* 13662 * For ATAPI devices one would have to issue 13663 * Get Capacity cmd for media capacity. Not here. 13664 */ 13665 sdinfo->satadrv_capacity = 0; 13666 /* 13667 * Check what cdb length is supported 13668 */ 13669 if ((sdinfo->satadrv_id.ai_config & 13670 SATA_ATAPI_ID_PKT_SZ) == SATA_ATAPI_ID_PKT_16B) 13671 sdinfo->satadrv_atapi_cdb_len = 16; 13672 else 13673 sdinfo->satadrv_atapi_cdb_len = 12; 13674 } 13675 /* Setup supported features flags */ 13676 if (sdinfo->satadrv_id.ai_cap & SATA_DMA_SUPPORT) 13677 sdinfo->satadrv_features_support |= SATA_DEV_F_DMA; 13678 13679 /* Check for SATA GEN and NCQ support */ 13680 if (sdinfo->satadrv_id.ai_satacap != 0 && 13681 sdinfo->satadrv_id.ai_satacap != 0xffff) { 13682 /* SATA compliance */ 13683 if (sdinfo->satadrv_id.ai_satacap & SATA_NCQ) 13684 sdinfo->satadrv_features_support |= 13685 SATA_DEV_F_NCQ; 13686 if (sdinfo->satadrv_id.ai_satacap & 13687 (SATA_1_SPEED | SATA_2_SPEED)) { 13688 if (sdinfo->satadrv_id.ai_satacap & 13689 SATA_2_SPEED) 13690 sdinfo->satadrv_features_support |= 13691 SATA_DEV_F_SATA2; 13692 if (sdinfo->satadrv_id.ai_satacap & 13693 SATA_1_SPEED) 13694 sdinfo->satadrv_features_support |= 13695 SATA_DEV_F_SATA1; 13696 } else { 13697 sdinfo->satadrv_features_support |= 13698 SATA_DEV_F_SATA1; 13699 } 13700 } 13701 if ((sdinfo->satadrv_id.ai_cmdset83 & SATA_RW_DMA_QUEUED_CMD) && 13702 (sdinfo->satadrv_id.ai_features86 & SATA_RW_DMA_QUEUED_CMD)) 13703 sdinfo->satadrv_features_support |= SATA_DEV_F_TCQ; 13704 13705 sdinfo->satadrv_queue_depth = sdinfo->satadrv_id.ai_qdepth; 13706 if ((sdinfo->satadrv_features_support & SATA_DEV_F_NCQ) || 13707 (sdinfo->satadrv_features_support & SATA_DEV_F_TCQ)) { 13708 ++sdinfo->satadrv_queue_depth; 13709 /* Adjust according to controller capabilities */ 13710 sdinfo->satadrv_max_queue_depth = MIN( 13711 sdinfo->satadrv_queue_depth, 13712 SATA_QDEPTH(sata_hba_inst)); 13713 /* Adjust according to global queue depth limit */ 13714 sdinfo->satadrv_max_queue_depth = MIN( 13715 sdinfo->satadrv_max_queue_depth, 13716 sata_current_max_qdepth); 13717 if (sdinfo->satadrv_max_queue_depth == 0) 13718 sdinfo->satadrv_max_queue_depth = 1; 13719 } else 13720 sdinfo->satadrv_max_queue_depth = 1; 13721 13722 rval = SATA_SUCCESS; 13723 } else { 13724 /* 13725 * Woops, no Identify Data. 13726 */ 13727 if (rval == SATA_TRAN_BUSY || rval == SATA_TRAN_QUEUE_FULL) { 13728 rval = SATA_RETRY; /* may retry later */ 13729 } else if (rval == SATA_TRAN_ACCEPTED) { 13730 if (spkt->satapkt_reason == SATA_PKT_DEV_ERROR || 13731 spkt->satapkt_reason == SATA_PKT_ABORTED || 13732 spkt->satapkt_reason == SATA_PKT_TIMEOUT || 13733 spkt->satapkt_reason == SATA_PKT_RESET) 13734 rval = SATA_RETRY; /* may retry later */ 13735 else 13736 rval = SATA_FAILURE; 13737 } else { 13738 rval = SATA_FAILURE; 13739 } 13740 } 13741 fail: 13742 /* Free allocated resources */ 13743 sata_free_local_buffer(spx); 13744 sata_pkt_free(spx); 13745 kmem_free(spx, sizeof (sata_pkt_txlate_t)); 13746 13747 return (rval); 13748 } 13749 13750 13751 /* 13752 * Some devices may not come-up with default DMA mode (UDMA or MWDMA). 13753 * UDMA mode is checked first, followed by MWDMA mode. 13754 * set correctly, so this function is setting it to the highest supported level. 13755 * Older SATA spec required that the device supports at least DMA 4 mode and 13756 * UDMA mode is selected. It is not mentioned in SerialATA 2.6, so this 13757 * restriction has been removed. 13758 * 13759 * Returns SATA_SUCCESS if proper DMA mode is selected or no DMA is supported. 13760 * Returns SATA_FAILURE if proper DMA mode could not be selected. 13761 * 13762 * NOTE: This function should be called only if DMA mode is supported. 13763 */ 13764 static int 13765 sata_set_dma_mode(sata_hba_inst_t *sata_hba_inst, sata_drive_info_t *sdinfo) 13766 { 13767 sata_pkt_t *spkt; 13768 sata_cmd_t *scmd; 13769 sata_pkt_txlate_t *spx; 13770 int i, mode; 13771 uint8_t subcmd; 13772 int rval = SATA_SUCCESS; 13773 13774 ASSERT(sdinfo != NULL); 13775 ASSERT(sata_hba_inst != NULL); 13776 13777 if ((sdinfo->satadrv_id.ai_validinfo & SATA_VALIDINFO_88) != 0 && 13778 (sdinfo->satadrv_id.ai_ultradma & SATA_UDMA_SUP_MASK) != 0) { 13779 /* Find highest Ultra DMA mode supported */ 13780 for (mode = 6; mode >= 0; --mode) { 13781 if (sdinfo->satadrv_id.ai_ultradma & (1 << mode)) 13782 break; 13783 } 13784 #if 0 13785 /* Left for historical reasons */ 13786 /* 13787 * Some initial version of SATA spec indicated that at least 13788 * UDMA mode 4 has to be supported. It is not mentioned in 13789 * SerialATA 2.6, so this restriction is removed. 13790 */ 13791 if (mode < 4) 13792 return (SATA_FAILURE); 13793 #endif 13794 13795 /* 13796 * For disk, we're still going to set DMA mode whatever is 13797 * selected by default 13798 * 13799 * We saw an old maxtor sata drive will select Ultra DMA and 13800 * Multi-Word DMA simultaneouly by default, which is going 13801 * to cause DMA command timed out, so we need to select DMA 13802 * mode even when it's already done by default 13803 */ 13804 if (sdinfo->satadrv_type != SATA_DTYPE_ATADISK) { 13805 13806 /* Find UDMA mode currently selected */ 13807 for (i = 6; i >= 0; --i) { 13808 if (sdinfo->satadrv_id.ai_ultradma & 13809 (1 << (i + 8))) 13810 break; 13811 } 13812 if (i >= mode) 13813 /* Nothing to do */ 13814 return (SATA_SUCCESS); 13815 } 13816 13817 subcmd = SATAC_TRANSFER_MODE_ULTRA_DMA; 13818 13819 } else if ((sdinfo->satadrv_id.ai_dworddma & SATA_MDMA_SUP_MASK) != 0) { 13820 /* Find highest MultiWord DMA mode supported */ 13821 for (mode = 2; mode >= 0; --mode) { 13822 if (sdinfo->satadrv_id.ai_dworddma & (1 << mode)) 13823 break; 13824 } 13825 13826 /* 13827 * For disk, We're still going to set DMA mode whatever is 13828 * selected by default 13829 * 13830 * We saw an old maxtor sata drive will select Ultra DMA and 13831 * Multi-Word DMA simultaneouly by default, which is going 13832 * to cause DMA command timed out, so we need to select DMA 13833 * mode even when it's already done by default 13834 */ 13835 if (sdinfo->satadrv_type != SATA_DTYPE_ATADISK) { 13836 13837 /* Find highest MultiWord DMA mode selected */ 13838 for (i = 2; i >= 0; --i) { 13839 if (sdinfo->satadrv_id.ai_dworddma & 13840 (1 << (i + 8))) 13841 break; 13842 } 13843 if (i >= mode) 13844 /* Nothing to do */ 13845 return (SATA_SUCCESS); 13846 } 13847 13848 subcmd = SATAC_TRANSFER_MODE_MULTI_WORD_DMA; 13849 } else 13850 return (SATA_SUCCESS); 13851 13852 /* 13853 * Set DMA mode via SET FEATURES COMMAND. 13854 * Prepare packet for SET FEATURES COMMAND. 13855 */ 13856 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP); 13857 spx->txlt_sata_hba_inst = sata_hba_inst; 13858 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */ 13859 spkt = sata_pkt_alloc(spx, SLEEP_FUNC); 13860 if (spkt == NULL) { 13861 SATA_LOG_D((sata_hba_inst, CE_WARN, 13862 "sata_set_dma_mode: could not set DMA mode %d", mode)); 13863 rval = SATA_FAILURE; 13864 goto done; 13865 } 13866 /* Fill sata_pkt */ 13867 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr; 13868 /* Timeout 30s */ 13869 spkt->satapkt_time = sata_default_pkt_time; 13870 /* Synchronous mode, no callback, interrupts */ 13871 spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS; 13872 spkt->satapkt_comp = NULL; 13873 scmd = &spkt->satapkt_cmd; 13874 scmd->satacmd_flags.sata_data_direction = SATA_DIR_NODATA_XFER; 13875 scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE; 13876 scmd->satacmd_addr_type = 0; 13877 scmd->satacmd_device_reg = 0; 13878 scmd->satacmd_status_reg = 0; 13879 scmd->satacmd_error_reg = 0; 13880 scmd->satacmd_cmd_reg = SATAC_SET_FEATURES; 13881 scmd->satacmd_features_reg = SATAC_SF_TRANSFER_MODE; 13882 scmd->satacmd_sec_count_lsb = subcmd | mode; 13883 13884 /* Transfer command to HBA */ 13885 if ((*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst), 13886 spkt) != SATA_TRAN_ACCEPTED || 13887 spkt->satapkt_reason != SATA_PKT_COMPLETED) { 13888 /* Pkt execution failed */ 13889 rval = SATA_FAILURE; 13890 } 13891 done: 13892 13893 /* Free allocated resources */ 13894 if (spkt != NULL) 13895 sata_pkt_free(spx); 13896 (void) kmem_free(spx, sizeof (sata_pkt_txlate_t)); 13897 13898 return (rval); 13899 } 13900 13901 13902 /* 13903 * Set device caching mode. 13904 * One of the following operations should be specified: 13905 * SATAC_SF_ENABLE_READ_AHEAD 13906 * SATAC_SF_DISABLE_READ_AHEAD 13907 * SATAC_SF_ENABLE_WRITE_CACHE 13908 * SATAC_SF_DISABLE_WRITE_CACHE 13909 * 13910 * If operation fails, system log messgage is emitted. 13911 * Returns SATA_SUCCESS when the operation succeeds, SATA_RETRY if 13912 * command was sent but did not succeed, and SATA_FAILURE otherwise. 13913 */ 13914 13915 static int 13916 sata_set_cache_mode(sata_hba_inst_t *sata_hba_inst, sata_drive_info_t *sdinfo, 13917 int cache_op) 13918 { 13919 sata_pkt_t *spkt; 13920 sata_cmd_t *scmd; 13921 sata_pkt_txlate_t *spx; 13922 int rval = SATA_SUCCESS; 13923 int hba_rval; 13924 char *infop; 13925 13926 ASSERT(sdinfo != NULL); 13927 ASSERT(sata_hba_inst != NULL); 13928 ASSERT(cache_op == SATAC_SF_ENABLE_READ_AHEAD || 13929 cache_op == SATAC_SF_DISABLE_READ_AHEAD || 13930 cache_op == SATAC_SF_ENABLE_WRITE_CACHE || 13931 cache_op == SATAC_SF_DISABLE_WRITE_CACHE); 13932 13933 13934 /* Prepare packet for SET FEATURES COMMAND */ 13935 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP); 13936 spx->txlt_sata_hba_inst = sata_hba_inst; 13937 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */ 13938 spkt = sata_pkt_alloc(spx, SLEEP_FUNC); 13939 if (spkt == NULL) { 13940 rval = SATA_FAILURE; 13941 goto failure; 13942 } 13943 /* Fill sata_pkt */ 13944 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr; 13945 /* Timeout 30s */ 13946 spkt->satapkt_time = sata_default_pkt_time; 13947 /* Synchronous mode, no callback, interrupts */ 13948 spkt->satapkt_op_mode = 13949 SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS; 13950 spkt->satapkt_comp = NULL; 13951 scmd = &spkt->satapkt_cmd; 13952 scmd->satacmd_flags.sata_data_direction = SATA_DIR_NODATA_XFER; 13953 scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE; 13954 scmd->satacmd_addr_type = 0; 13955 scmd->satacmd_device_reg = 0; 13956 scmd->satacmd_status_reg = 0; 13957 scmd->satacmd_error_reg = 0; 13958 scmd->satacmd_cmd_reg = SATAC_SET_FEATURES; 13959 scmd->satacmd_features_reg = cache_op; 13960 13961 /* Transfer command to HBA */ 13962 hba_rval = (*SATA_START_FUNC(sata_hba_inst))( 13963 SATA_DIP(sata_hba_inst), spkt); 13964 13965 #ifdef SATA_INJECT_FAULTS 13966 sata_inject_pkt_fault(spkt, &rval, sata_fault_type); 13967 #endif 13968 13969 if ((hba_rval != SATA_TRAN_ACCEPTED) || 13970 (spkt->satapkt_reason != SATA_PKT_COMPLETED)) { 13971 /* Pkt execution failed */ 13972 switch (cache_op) { 13973 case SATAC_SF_ENABLE_READ_AHEAD: 13974 infop = "enabling read ahead failed"; 13975 break; 13976 case SATAC_SF_DISABLE_READ_AHEAD: 13977 infop = "disabling read ahead failed"; 13978 break; 13979 case SATAC_SF_ENABLE_WRITE_CACHE: 13980 infop = "enabling write cache failed"; 13981 break; 13982 case SATAC_SF_DISABLE_WRITE_CACHE: 13983 infop = "disabling write cache failed"; 13984 break; 13985 } 13986 SATA_LOG_D((sata_hba_inst, CE_WARN, "%s", infop)); 13987 rval = SATA_RETRY; 13988 } 13989 failure: 13990 /* Free allocated resources */ 13991 if (spkt != NULL) 13992 sata_pkt_free(spx); 13993 (void) kmem_free(spx, sizeof (sata_pkt_txlate_t)); 13994 return (rval); 13995 } 13996 13997 /* 13998 * Set Removable Media Status Notification (enable/disable) 13999 * state == 0 , disable 14000 * state != 0 , enable 14001 * 14002 * If operation fails, system log messgage is emitted. 14003 * Returns SATA_SUCCESS when the operation succeeds, SATA_FAILURE otherwise. 14004 */ 14005 14006 static int 14007 sata_set_rmsn(sata_hba_inst_t *sata_hba_inst, sata_drive_info_t *sdinfo, 14008 int state) 14009 { 14010 sata_pkt_t *spkt; 14011 sata_cmd_t *scmd; 14012 sata_pkt_txlate_t *spx; 14013 int rval = SATA_SUCCESS; 14014 char *infop; 14015 14016 ASSERT(sdinfo != NULL); 14017 ASSERT(sata_hba_inst != NULL); 14018 14019 /* Prepare packet for SET FEATURES COMMAND */ 14020 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP); 14021 spx->txlt_sata_hba_inst = sata_hba_inst; 14022 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */ 14023 spkt = sata_pkt_alloc(spx, SLEEP_FUNC); 14024 if (spkt == NULL) { 14025 rval = SATA_FAILURE; 14026 goto failure; 14027 } 14028 /* Fill sata_pkt */ 14029 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr; 14030 /* Timeout 30s */ 14031 spkt->satapkt_time = sata_default_pkt_time; 14032 /* Synchronous mode, no callback, interrupts */ 14033 spkt->satapkt_op_mode = 14034 SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS; 14035 spkt->satapkt_comp = NULL; 14036 scmd = &spkt->satapkt_cmd; 14037 scmd->satacmd_flags.sata_data_direction = SATA_DIR_NODATA_XFER; 14038 scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE; 14039 scmd->satacmd_addr_type = 0; 14040 scmd->satacmd_device_reg = 0; 14041 scmd->satacmd_status_reg = 0; 14042 scmd->satacmd_error_reg = 0; 14043 scmd->satacmd_cmd_reg = SATAC_SET_FEATURES; 14044 if (state == 0) 14045 scmd->satacmd_features_reg = SATAC_SF_DISABLE_RMSN; 14046 else 14047 scmd->satacmd_features_reg = SATAC_SF_ENABLE_RMSN; 14048 14049 /* Transfer command to HBA */ 14050 if (((*SATA_START_FUNC(sata_hba_inst))( 14051 SATA_DIP(sata_hba_inst), spkt) != SATA_TRAN_ACCEPTED) || 14052 (spkt->satapkt_reason != SATA_PKT_COMPLETED)) { 14053 /* Pkt execution failed */ 14054 if (state == 0) 14055 infop = "disabling Removable Media Status " 14056 "Notification failed"; 14057 else 14058 infop = "enabling Removable Media Status " 14059 "Notification failed"; 14060 14061 SATA_LOG_D((sata_hba_inst, CE_WARN, "%s", infop)); 14062 rval = SATA_FAILURE; 14063 } 14064 failure: 14065 /* Free allocated resources */ 14066 if (spkt != NULL) 14067 sata_pkt_free(spx); 14068 (void) kmem_free(spx, sizeof (sata_pkt_txlate_t)); 14069 return (rval); 14070 } 14071 14072 14073 /* 14074 * Update state and copy port ss* values from passed sata_device structure. 14075 * sata_address is validated - if not valid, nothing is changed in sata_scsi 14076 * configuration struct. 14077 * 14078 * SATA_PSTATE_SHUTDOWN in port state is not reset to 0 by this function 14079 * regardless of the state in device argument. 14080 * 14081 * Port mutex should be held while calling this function. 14082 */ 14083 static void 14084 sata_update_port_info(sata_hba_inst_t *sata_hba_inst, 14085 sata_device_t *sata_device) 14086 { 14087 sata_cport_info_t *cportinfo; 14088 14089 if (sata_device->satadev_addr.qual == SATA_ADDR_CPORT || 14090 sata_device->satadev_addr.qual == SATA_ADDR_DCPORT) { 14091 if (SATA_NUM_CPORTS(sata_hba_inst) <= 14092 sata_device->satadev_addr.cport) 14093 return; 14094 14095 cportinfo = SATA_CPORT_INFO(sata_hba_inst, 14096 sata_device->satadev_addr.cport); 14097 14098 ASSERT(mutex_owned(&cportinfo->cport_mutex)); 14099 cportinfo->cport_scr = sata_device->satadev_scr; 14100 14101 /* Preserve SATA_PSTATE_SHUTDOWN flag */ 14102 cportinfo->cport_state &= ~(SATA_PSTATE_PWRON | 14103 SATA_PSTATE_PWROFF | SATA_PSTATE_FAILED); 14104 cportinfo->cport_state |= 14105 sata_device->satadev_state & SATA_PSTATE_VALID; 14106 } 14107 } 14108 14109 void 14110 sata_update_pmport_info(sata_hba_inst_t *sata_hba_inst, 14111 sata_device_t *sata_device) 14112 { 14113 sata_pmport_info_t *pmportinfo; 14114 14115 if ((sata_device->satadev_addr.qual != SATA_ADDR_PMPORT && 14116 sata_device->satadev_addr.qual != SATA_ADDR_DPMPORT) || 14117 SATA_NUM_PMPORTS(sata_hba_inst, 14118 sata_device->satadev_addr.cport) < 14119 sata_device->satadev_addr.pmport) { 14120 SATADBG1(SATA_DBG_PMULT, sata_hba_inst, 14121 "sata_update_port_info: error address %p.", 14122 &sata_device->satadev_addr); 14123 return; 14124 } 14125 14126 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, 14127 sata_device->satadev_addr.cport, 14128 sata_device->satadev_addr.pmport); 14129 14130 ASSERT(mutex_owned(&pmportinfo->pmport_mutex)); 14131 pmportinfo->pmport_scr = sata_device->satadev_scr; 14132 14133 /* Preserve SATA_PSTATE_SHUTDOWN flag */ 14134 pmportinfo->pmport_state &= 14135 ~(SATA_PSTATE_PWRON | SATA_PSTATE_PWROFF | SATA_PSTATE_FAILED); 14136 pmportinfo->pmport_state |= 14137 sata_device->satadev_state & SATA_PSTATE_VALID; 14138 } 14139 14140 /* 14141 * Extract SATA port specification from an IOCTL argument. 14142 * 14143 * This function return the port the user land send us as is, unless it 14144 * cannot retrieve port spec, then -1 is returned. 14145 * 14146 * Support port multiplier. 14147 */ 14148 static int32_t 14149 sata_get_port_num(sata_hba_inst_t *sata_hba_inst, struct devctl_iocdata *dcp) 14150 { 14151 int32_t port; 14152 14153 /* Extract port number from nvpair in dca structure */ 14154 if (nvlist_lookup_int32(ndi_dc_get_ap_data(dcp), "port", &port) != 0) { 14155 SATA_LOG_D((sata_hba_inst, CE_NOTE, 14156 "sata_get_port_num: invalid port spec 0x%x in ioctl", 14157 port)); 14158 port = -1; 14159 } 14160 14161 return (port); 14162 } 14163 14164 /* 14165 * Get dev_info_t pointer to the device node pointed to by port argument. 14166 * NOTE: target argument is a value used in ioctls to identify 14167 * the AP - it is not a sata_address. 14168 * It is a combination of cport, pmport and address qualifier, encodded same 14169 * way as a scsi target number. 14170 * At this moment it carries only cport number. 14171 * 14172 * PMult hotplug is supported now. 14173 * 14174 * Returns dev_info_t pointer if target device was found, NULL otherwise. 14175 */ 14176 14177 static dev_info_t * 14178 sata_get_target_dip(dev_info_t *dip, uint8_t cport, uint8_t pmport) 14179 { 14180 dev_info_t *cdip = NULL; 14181 int target, tgt; 14182 int circ; 14183 uint8_t qual; 14184 14185 sata_hba_inst_t *sata_hba_inst; 14186 scsi_hba_tran_t *scsi_hba_tran; 14187 14188 /* Get target id */ 14189 scsi_hba_tran = ddi_get_driver_private(dip); 14190 if (scsi_hba_tran == NULL) 14191 return (NULL); 14192 14193 sata_hba_inst = scsi_hba_tran->tran_hba_private; 14194 14195 if (sata_hba_inst == NULL) 14196 return (NULL); 14197 14198 /* Identify a port-mult by cport_info.cport_dev_type */ 14199 if (SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) == SATA_DTYPE_PMULT) 14200 qual = SATA_ADDR_DPMPORT; 14201 else 14202 qual = SATA_ADDR_DCPORT; 14203 14204 target = SATA_TO_SCSI_TARGET(cport, pmport, qual); 14205 14206 /* Retrieve target dip */ 14207 ndi_devi_enter(dip, &circ); 14208 for (cdip = ddi_get_child(dip); cdip != NULL; ) { 14209 dev_info_t *next = ddi_get_next_sibling(cdip); 14210 14211 tgt = ddi_prop_get_int(DDI_DEV_T_ANY, cdip, 14212 DDI_PROP_DONTPASS, "target", -1); 14213 if (tgt == -1) { 14214 /* 14215 * This is actually an error condition, but not 14216 * a fatal one. Just continue the search. 14217 */ 14218 cdip = next; 14219 continue; 14220 } 14221 14222 if (tgt == target) 14223 break; 14224 14225 cdip = next; 14226 } 14227 ndi_devi_exit(dip, circ); 14228 14229 return (cdip); 14230 } 14231 14232 /* 14233 * Get dev_info_t pointer to the device node pointed to by port argument. 14234 * NOTE: target argument is a value used in ioctls to identify 14235 * the AP - it is not a sata_address. 14236 * It is a combination of cport, pmport and address qualifier, encoded same 14237 * way as a scsi target number. 14238 * 14239 * Returns dev_info_t pointer if target device was found, NULL otherwise. 14240 */ 14241 14242 static dev_info_t * 14243 sata_get_scsi_target_dip(dev_info_t *dip, sata_address_t *saddr) 14244 { 14245 dev_info_t *cdip = NULL; 14246 int target, tgt; 14247 int circ; 14248 14249 target = SATA_TO_SCSI_TARGET(saddr->cport, saddr->pmport, saddr->qual); 14250 14251 ndi_devi_enter(dip, &circ); 14252 for (cdip = ddi_get_child(dip); cdip != NULL; ) { 14253 dev_info_t *next = ddi_get_next_sibling(cdip); 14254 14255 tgt = ddi_prop_get_int(DDI_DEV_T_ANY, cdip, 14256 DDI_PROP_DONTPASS, "target", -1); 14257 if (tgt == -1) { 14258 /* 14259 * This is actually an error condition, but not 14260 * a fatal one. Just continue the search. 14261 */ 14262 cdip = next; 14263 continue; 14264 } 14265 14266 if (tgt == target) 14267 break; 14268 14269 cdip = next; 14270 } 14271 ndi_devi_exit(dip, circ); 14272 14273 return (cdip); 14274 } 14275 14276 /* 14277 * Process sata port disconnect request. 14278 * Normally, cfgadm sata plugin will try to offline (unconfigure) the device 14279 * before this request. Nevertheless, if a device is still configured, 14280 * we need to attempt to offline and unconfigure device. 14281 * Regardless of the unconfigure operation results the port is marked as 14282 * deactivated and no access to the attached device is possible. 14283 * If the target node remains because unconfigure operation failed, its state 14284 * will be set to DEVICE_REMOVED, preventing it to be used again when a device 14285 * is inserted/re-inserted. The event daemon will repeatedly try to unconfigure 14286 * the device and remove old target node. 14287 * 14288 * This function invokes sata_hba_inst->satahba_tran-> 14289 * sata_tran_hotplug_ops->sata_tran_port_deactivate(). 14290 * If successful, the device structure (if any) attached to the specified port 14291 * is removed and state of the port marked appropriately. 14292 * Failure of the port_deactivate may keep port in the physically active state, 14293 * or may fail the port. 14294 * 14295 * NOTE: Port multiplier is supported. 14296 */ 14297 14298 static int 14299 sata_ioctl_disconnect(sata_hba_inst_t *sata_hba_inst, 14300 sata_device_t *sata_device) 14301 { 14302 sata_drive_info_t *sdinfo = NULL, *subsdinfo = NULL; 14303 sata_cport_info_t *cportinfo = NULL; 14304 sata_pmport_info_t *pmportinfo = NULL; 14305 sata_pmult_info_t *pmultinfo = NULL; 14306 sata_device_t subsdevice; 14307 int cport, pmport, qual; 14308 int rval = SATA_SUCCESS; 14309 int npmport = 0; 14310 int rv = 0; 14311 14312 cport = sata_device->satadev_addr.cport; 14313 pmport = sata_device->satadev_addr.pmport; 14314 qual = sata_device->satadev_addr.qual; 14315 14316 ASSERT(qual == SATA_ADDR_DCPORT || qual == SATA_ADDR_DPMPORT); 14317 if (qual == SATA_ADDR_DCPORT) 14318 qual = SATA_ADDR_CPORT; 14319 else 14320 qual = SATA_ADDR_PMPORT; 14321 14322 /* 14323 * DEVCTL_AP_DISCONNECT invokes sata_hba_inst->satahba_tran-> 14324 * sata_tran_hotplug_ops->sata_tran_port_deactivate(). 14325 * Do the sanity check. 14326 */ 14327 if (SATA_PORT_DEACTIVATE_FUNC(sata_hba_inst) == NULL) { 14328 /* No physical port deactivation supported. */ 14329 return (EINVAL); 14330 } 14331 14332 /* Check the current state of the port */ 14333 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst)) 14334 (SATA_DIP(sata_hba_inst), sata_device); 14335 14336 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport); 14337 14338 /* 14339 * Processing port mulitiplier 14340 */ 14341 if (qual == SATA_ADDR_CPORT && 14342 SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) == SATA_DTYPE_PMULT) { 14343 mutex_enter(&cportinfo->cport_mutex); 14344 14345 /* Check controller port status */ 14346 sata_update_port_info(sata_hba_inst, sata_device); 14347 if (rval != SATA_SUCCESS || 14348 (sata_device->satadev_state & SATA_PSTATE_FAILED) != 0) { 14349 /* 14350 * Device port status is unknown or it is in failed 14351 * state 14352 */ 14353 SATA_CPORT_STATE(sata_hba_inst, cport) = 14354 SATA_PSTATE_FAILED; 14355 SATADBG1(SATA_DBG_IOCTL_IF, sata_hba_inst, 14356 "sata_hba_ioctl: connect: failed to deactivate " 14357 "SATA port %d", cport); 14358 mutex_exit(&cportinfo->cport_mutex); 14359 return (EIO); 14360 } 14361 14362 /* Disconnect all sub-devices. */ 14363 pmultinfo = SATA_CPORTINFO_PMULT_INFO(cportinfo); 14364 if (pmultinfo != NULL) { 14365 14366 for (npmport = 0; npmport < SATA_NUM_PMPORTS( 14367 sata_hba_inst, cport); npmport ++) { 14368 subsdinfo = SATA_PMPORT_DRV_INFO( 14369 sata_hba_inst, cport, npmport); 14370 if (subsdinfo == NULL) 14371 continue; 14372 14373 subsdevice.satadev_addr = subsdinfo-> 14374 satadrv_addr; 14375 14376 mutex_exit(&cportinfo->cport_mutex); 14377 if (sata_ioctl_disconnect(sata_hba_inst, 14378 &subsdevice) == SATA_SUCCESS) { 14379 SATADBG2(SATA_DBG_PMULT, sata_hba_inst, 14380 "[Remove] device at port %d:%d " 14381 "successfully.", cport, npmport); 14382 } 14383 mutex_enter(&cportinfo->cport_mutex); 14384 } 14385 } 14386 14387 /* Disconnect the port multiplier */ 14388 cportinfo->cport_state &= ~SATA_STATE_READY; 14389 mutex_exit(&cportinfo->cport_mutex); 14390 14391 sata_device->satadev_addr.qual = qual; 14392 rval = (*SATA_PORT_DEACTIVATE_FUNC(sata_hba_inst)) 14393 (SATA_DIP(sata_hba_inst), sata_device); 14394 14395 sata_gen_sysevent(sata_hba_inst, &sata_device->satadev_addr, 14396 SE_NO_HINT); 14397 14398 mutex_enter(&cportinfo->cport_mutex); 14399 sata_update_port_info(sata_hba_inst, sata_device); 14400 if (rval != SATA_SUCCESS && 14401 sata_device->satadev_state & SATA_PSTATE_FAILED) { 14402 cportinfo->cport_state = SATA_PSTATE_FAILED; 14403 rv = EIO; 14404 } else { 14405 cportinfo->cport_state |= SATA_PSTATE_SHUTDOWN; 14406 } 14407 mutex_exit(&cportinfo->cport_mutex); 14408 14409 return (rv); 14410 } 14411 14412 /* 14413 * Process non-port-multiplier device - it could be a drive connected 14414 * to a port multiplier port or a controller port. 14415 */ 14416 if (qual == SATA_ADDR_PMPORT) { 14417 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, pmport); 14418 mutex_enter(&pmportinfo->pmport_mutex); 14419 sata_update_pmport_info(sata_hba_inst, sata_device); 14420 if (rval != SATA_SUCCESS || 14421 (sata_device->satadev_state & SATA_PSTATE_FAILED) != 0) { 14422 SATA_PMPORT_STATE(sata_hba_inst, cport, pmport) = 14423 SATA_PSTATE_FAILED; 14424 SATADBG2(SATA_DBG_IOCTL_IF, sata_hba_inst, 14425 "sata_hba_ioctl: connect: failed to deactivate " 14426 "SATA port %d:%d", cport, pmport); 14427 mutex_exit(&pmportinfo->pmport_mutex); 14428 return (EIO); 14429 } 14430 14431 if (pmportinfo->pmport_dev_type != SATA_DTYPE_NONE) { 14432 sdinfo = pmportinfo->pmport_sata_drive; 14433 ASSERT(sdinfo != NULL); 14434 } 14435 14436 /* 14437 * Set port's dev_state to not ready - this will disable 14438 * an access to a potentially attached device. 14439 */ 14440 pmportinfo->pmport_state &= ~SATA_STATE_READY; 14441 14442 /* Remove and release sata_drive info structure. */ 14443 if (sdinfo != NULL) { 14444 if ((sdinfo->satadrv_type & 14445 SATA_VALID_DEV_TYPE) != 0) { 14446 /* 14447 * If a target node exists, try to offline 14448 * a device and remove target node. 14449 */ 14450 mutex_exit(&pmportinfo->pmport_mutex); 14451 (void) sata_offline_device(sata_hba_inst, 14452 sata_device, sdinfo); 14453 mutex_enter(&pmportinfo->pmport_mutex); 14454 } 14455 14456 SATA_PMPORTINFO_DRV_INFO(pmportinfo) = NULL; 14457 pmportinfo->pmport_dev_type = SATA_DTYPE_NONE; 14458 (void) kmem_free((void *)sdinfo, 14459 sizeof (sata_drive_info_t)); 14460 } 14461 mutex_exit(&pmportinfo->pmport_mutex); 14462 14463 } else if (qual == SATA_ADDR_CPORT) { 14464 mutex_enter(&cportinfo->cport_mutex); 14465 sata_update_port_info(sata_hba_inst, sata_device); 14466 if (rval != SATA_SUCCESS || 14467 (sata_device->satadev_state & SATA_PSTATE_FAILED) != 0) { 14468 /* 14469 * Device port status is unknown or it is in failed 14470 * state 14471 */ 14472 SATA_CPORT_STATE(sata_hba_inst, cport) = 14473 SATA_PSTATE_FAILED; 14474 SATADBG1(SATA_DBG_IOCTL_IF, sata_hba_inst, 14475 "sata_hba_ioctl: connect: failed to deactivate " 14476 "SATA port %d", cport); 14477 mutex_exit(&cportinfo->cport_mutex); 14478 return (EIO); 14479 } 14480 14481 if (cportinfo->cport_dev_type == SATA_DTYPE_PMULT) { 14482 pmultinfo = SATA_CPORTINFO_PMULT_INFO(cportinfo); 14483 ASSERT(pmultinfo != NULL); 14484 } else if (cportinfo->cport_dev_type != SATA_DTYPE_NONE) { 14485 sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo); 14486 ASSERT(sdinfo != NULL); 14487 } 14488 cportinfo->cport_state &= ~SATA_STATE_READY; 14489 14490 if (sdinfo != NULL) { 14491 if ((sdinfo->satadrv_type & 14492 SATA_VALID_DEV_TYPE) != 0) { 14493 /* 14494 * If a target node exists, try to offline 14495 * a device and remove target node. 14496 */ 14497 mutex_exit(&cportinfo->cport_mutex); 14498 (void) sata_offline_device(sata_hba_inst, 14499 sata_device, sdinfo); 14500 mutex_enter(&cportinfo->cport_mutex); 14501 } 14502 14503 SATA_CPORTINFO_DRV_INFO(cportinfo) = NULL; 14504 cportinfo->cport_dev_type = SATA_DTYPE_NONE; 14505 (void) kmem_free((void *)sdinfo, 14506 sizeof (sata_drive_info_t)); 14507 } 14508 mutex_exit(&cportinfo->cport_mutex); 14509 } 14510 14511 /* Just ask HBA driver to deactivate port */ 14512 sata_device->satadev_addr.qual = qual; 14513 14514 rval = (*SATA_PORT_DEACTIVATE_FUNC(sata_hba_inst)) 14515 (SATA_DIP(sata_hba_inst), sata_device); 14516 14517 /* 14518 * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE 14519 * without the hint (to force listener to investivate the state). 14520 */ 14521 sata_gen_sysevent(sata_hba_inst, &sata_device->satadev_addr, 14522 SE_NO_HINT); 14523 14524 if (qual == SATA_ADDR_PMPORT) { 14525 mutex_enter(&pmportinfo->pmport_mutex); 14526 sata_update_pmport_info(sata_hba_inst, sata_device); 14527 14528 if (rval != SATA_SUCCESS && 14529 sata_device->satadev_state & SATA_PSTATE_FAILED) { 14530 /* 14531 * Port deactivation failure - do not change port 14532 * state unless the state returned by HBA indicates a 14533 * port failure. 14534 * 14535 * NOTE: device structures were released, so devices 14536 * now are invisible! Port reset is needed to 14537 * re-enumerate devices. 14538 */ 14539 pmportinfo->pmport_state = SATA_PSTATE_FAILED; 14540 rv = EIO; 14541 } else { 14542 /* 14543 * Deactivation succeded. From now on the sata framework 14544 * will not care what is happening to the device, until 14545 * the port is activated again. 14546 */ 14547 pmportinfo->pmport_state |= SATA_PSTATE_SHUTDOWN; 14548 } 14549 mutex_exit(&pmportinfo->pmport_mutex); 14550 } else if (qual == SATA_ADDR_CPORT) { 14551 mutex_enter(&cportinfo->cport_mutex); 14552 sata_update_port_info(sata_hba_inst, sata_device); 14553 14554 if (rval != SATA_SUCCESS && 14555 sata_device->satadev_state & SATA_PSTATE_FAILED) { 14556 cportinfo->cport_state = SATA_PSTATE_FAILED; 14557 rv = EIO; 14558 } else { 14559 cportinfo->cport_state |= SATA_PSTATE_SHUTDOWN; 14560 } 14561 mutex_exit(&cportinfo->cport_mutex); 14562 } 14563 14564 return (rv); 14565 } 14566 14567 14568 14569 /* 14570 * Process sata port connect request 14571 * The sata cfgadm pluging will invoke this operation only if port was found 14572 * in the disconnect state (failed state is also treated as the disconnected 14573 * state). 14574 * DEVCTL_AP_CONNECT would invoke sata_hba_inst->satahba_tran-> 14575 * sata_tran_hotplug_ops->sata_tran_port_activate(). 14576 * If successful and a device is found attached to the port, 14577 * the initialization sequence is executed to attach a device structure to 14578 * a port structure. The state of the port and a device would be set 14579 * appropriately. 14580 * The device is not set in configured state (system-wise) by this operation. 14581 * 14582 * Note, that activating the port may generate link events, 14583 * so it is important that following processing and the 14584 * event processing does not interfere with each other! 14585 * 14586 * This operation may remove port failed state and will 14587 * try to make port active and in good standing. 14588 * 14589 * NOTE: Port multiplier is supported. 14590 */ 14591 14592 static int 14593 sata_ioctl_connect(sata_hba_inst_t *sata_hba_inst, 14594 sata_device_t *sata_device) 14595 { 14596 sata_pmport_info_t *pmportinfo = NULL; 14597 uint8_t cport, pmport, qual; 14598 int rv = 0; 14599 14600 cport = sata_device->satadev_addr.cport; 14601 pmport = sata_device->satadev_addr.pmport; 14602 qual = sata_device->satadev_addr.qual; 14603 14604 ASSERT(qual == SATA_ADDR_DCPORT || qual == SATA_ADDR_DPMPORT); 14605 if (qual == SATA_ADDR_DCPORT) 14606 qual = SATA_ADDR_CPORT; 14607 else 14608 qual = SATA_ADDR_PMPORT; 14609 14610 if (qual == SATA_ADDR_PMPORT) 14611 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, pmport); 14612 14613 /* 14614 * DEVCTL_AP_CONNECT would invoke sata_hba_inst-> 14615 * satahba_tran->sata_tran_hotplug_ops->sata_tran_port_activate(). 14616 * Perform sanity check now. 14617 */ 14618 if (SATA_PORT_ACTIVATE_FUNC(sata_hba_inst) == NULL) { 14619 /* No physical port activation supported. */ 14620 return (EINVAL); 14621 } 14622 14623 /* Just ask HBA driver to activate port */ 14624 if ((*SATA_PORT_ACTIVATE_FUNC(sata_hba_inst)) 14625 (SATA_DIP(sata_hba_inst), sata_device) != SATA_SUCCESS) { 14626 /* 14627 * Port activation failure. 14628 */ 14629 if (qual == SATA_ADDR_CPORT) { 14630 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, 14631 cport)->cport_mutex); 14632 sata_update_port_info(sata_hba_inst, sata_device); 14633 if (sata_device->satadev_state & SATA_PSTATE_FAILED) { 14634 SATA_CPORT_STATE(sata_hba_inst, cport) = 14635 SATA_PSTATE_FAILED; 14636 SATADBG1(SATA_DBG_IOCTL_IF, sata_hba_inst, 14637 "sata_hba_ioctl: connect: failed to " 14638 "activate SATA port %d", cport); 14639 } 14640 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, 14641 cport)->cport_mutex); 14642 } else { /* port multiplier device port */ 14643 mutex_enter(&pmportinfo->pmport_mutex); 14644 sata_update_pmport_info(sata_hba_inst, sata_device); 14645 if (sata_device->satadev_state & SATA_PSTATE_FAILED) { 14646 SATA_PMPORT_STATE(sata_hba_inst, cport, 14647 pmport) = SATA_PSTATE_FAILED; 14648 SATADBG2(SATA_DBG_IOCTL_IF, sata_hba_inst, 14649 "sata_hba_ioctl: connect: failed to " 14650 "activate SATA port %d:%d", cport, pmport); 14651 } 14652 mutex_exit(&pmportinfo->pmport_mutex); 14653 } 14654 return (EIO); 14655 } 14656 14657 /* Virgin port state - will be updated by the port re-probe. */ 14658 if (qual == SATA_ADDR_CPORT) { 14659 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, 14660 cport)->cport_mutex); 14661 SATA_CPORT_STATE(sata_hba_inst, cport) = 0; 14662 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, 14663 cport)->cport_mutex); 14664 } else { /* port multiplier device port */ 14665 mutex_enter(&pmportinfo->pmport_mutex); 14666 SATA_PMPORT_STATE(sata_hba_inst, cport, pmport) = 0; 14667 mutex_exit(&pmportinfo->pmport_mutex); 14668 } 14669 14670 /* 14671 * Probe the port to find its state and attached device. 14672 */ 14673 if (sata_reprobe_port(sata_hba_inst, sata_device, 14674 SATA_DEV_IDENTIFY_RETRY) == SATA_FAILURE) 14675 rv = EIO; 14676 14677 /* 14678 * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE 14679 * without the hint 14680 */ 14681 sata_gen_sysevent(sata_hba_inst, &sata_device->satadev_addr, 14682 SE_NO_HINT); 14683 14684 /* 14685 * If there is a device attached to the port, emit 14686 * a message. 14687 */ 14688 if (sata_device->satadev_type != SATA_DTYPE_NONE) { 14689 14690 if (qual == SATA_ADDR_CPORT) { 14691 if (sata_device->satadev_type == SATA_DTYPE_PMULT) { 14692 sata_log(sata_hba_inst, CE_WARN, 14693 "SATA port multiplier detected " 14694 "at port %d", cport); 14695 } else { 14696 sata_log(sata_hba_inst, CE_WARN, 14697 "SATA device detected at port %d", cport); 14698 if (sata_device->satadev_type == 14699 SATA_DTYPE_UNKNOWN) { 14700 /* 14701 * A device was not successfully identified 14702 */ 14703 sata_log(sata_hba_inst, CE_WARN, 14704 "Could not identify SATA " 14705 "device at port %d", cport); 14706 } 14707 } 14708 } else { /* port multiplier device port */ 14709 sata_log(sata_hba_inst, CE_WARN, 14710 "SATA device detected at port %d:%d", 14711 cport, pmport); 14712 if (sata_device->satadev_type == SATA_DTYPE_UNKNOWN) { 14713 /* 14714 * A device was not successfully identified 14715 */ 14716 sata_log(sata_hba_inst, CE_WARN, 14717 "Could not identify SATA " 14718 "device at port %d:%d", cport, pmport); 14719 } 14720 } 14721 } 14722 14723 return (rv); 14724 } 14725 14726 14727 /* 14728 * Process sata device unconfigure request. 14729 * The unconfigure operation uses generic nexus operation to 14730 * offline a device. It leaves a target device node attached. 14731 * and obviously sata_drive_info attached as well, because 14732 * from the hardware point of view nothing has changed. 14733 */ 14734 static int 14735 sata_ioctl_unconfigure(sata_hba_inst_t *sata_hba_inst, 14736 sata_device_t *sata_device) 14737 { 14738 int rv = 0; 14739 dev_info_t *tdip; 14740 14741 /* We are addressing attached device, not a port */ 14742 if (sata_device->satadev_addr.qual == SATA_ADDR_CPORT) 14743 sata_device->satadev_addr.qual = SATA_ADDR_DCPORT; 14744 else if (sata_device->satadev_addr.qual == SATA_ADDR_PMPORT) 14745 sata_device->satadev_addr.qual = SATA_ADDR_DPMPORT; 14746 14747 if ((tdip = sata_get_scsi_target_dip(SATA_DIP(sata_hba_inst), 14748 &sata_device->satadev_addr)) != NULL) { 14749 14750 if (ndi_devi_offline(tdip, NDI_UNCONFIG) != NDI_SUCCESS) { 14751 SATA_LOG_D((sata_hba_inst, CE_WARN, 14752 "sata_hba_ioctl: unconfigure: " 14753 "failed to unconfigure device at SATA port %d:%d", 14754 sata_device->satadev_addr.cport, 14755 sata_device->satadev_addr.pmport)); 14756 rv = EIO; 14757 } 14758 /* 14759 * The target node devi_state should be marked with 14760 * DEVI_DEVICE_OFFLINE by ndi_devi_offline(). 14761 * This would be the indication for cfgadm that 14762 * the AP node occupant state is 'unconfigured'. 14763 */ 14764 14765 } else { 14766 /* 14767 * This would indicate a failure on the part of cfgadm 14768 * to detect correct state of the node prior to this 14769 * call - one cannot unconfigure non-existing device. 14770 */ 14771 SATA_LOG_D((sata_hba_inst, CE_WARN, 14772 "sata_hba_ioctl: unconfigure: " 14773 "attempt to unconfigure non-existing device " 14774 "at SATA port %d:%d", 14775 sata_device->satadev_addr.cport, 14776 sata_device->satadev_addr.pmport)); 14777 rv = ENXIO; 14778 } 14779 return (rv); 14780 } 14781 14782 /* 14783 * Process sata device configure request 14784 * If port is in a failed state, operation is aborted - one has to use 14785 * an explicit connect or port activate request to try to get a port into 14786 * non-failed mode. Port reset wil also work in such situation. 14787 * If the port is in disconnected (shutdown) state, the connect operation is 14788 * attempted prior to any other action. 14789 * When port is in the active state, there is a device attached and the target 14790 * node exists, a device was most likely offlined. 14791 * If target node does not exist, a new target node is created. In both cases 14792 * an attempt is made to online (configure) the device. 14793 * 14794 * NOTE: Port multiplier is supported. 14795 */ 14796 static int 14797 sata_ioctl_configure(sata_hba_inst_t *sata_hba_inst, 14798 sata_device_t *sata_device) 14799 { 14800 int cport, pmport, qual; 14801 int rval; 14802 boolean_t target = B_TRUE; 14803 sata_cport_info_t *cportinfo; 14804 sata_pmport_info_t *pmportinfo = NULL; 14805 dev_info_t *tdip; 14806 sata_drive_info_t *sdinfo; 14807 14808 cport = sata_device->satadev_addr.cport; 14809 pmport = sata_device->satadev_addr.pmport; 14810 qual = sata_device->satadev_addr.qual; 14811 14812 /* Get current port state */ 14813 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst)) 14814 (SATA_DIP(sata_hba_inst), sata_device); 14815 14816 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport); 14817 if (qual == SATA_ADDR_DPMPORT) { 14818 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, pmport); 14819 mutex_enter(&pmportinfo->pmport_mutex); 14820 sata_update_pmport_info(sata_hba_inst, sata_device); 14821 if (rval != SATA_SUCCESS || 14822 (sata_device->satadev_state & SATA_PSTATE_FAILED) != 0) { 14823 /* 14824 * Obviously, device on a failed port is not visible 14825 */ 14826 mutex_exit(&pmportinfo->pmport_mutex); 14827 return (ENXIO); 14828 } 14829 mutex_exit(&pmportinfo->pmport_mutex); 14830 } else { 14831 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, 14832 cport)->cport_mutex); 14833 sata_update_port_info(sata_hba_inst, sata_device); 14834 if (rval != SATA_SUCCESS || 14835 (sata_device->satadev_state & SATA_PSTATE_FAILED) != 0) { 14836 /* 14837 * Obviously, device on a failed port is not visible 14838 */ 14839 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, 14840 cport)->cport_mutex); 14841 return (ENXIO); 14842 } 14843 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, 14844 cport)->cport_mutex); 14845 } 14846 14847 if ((sata_device->satadev_state & SATA_PSTATE_SHUTDOWN) != 0) { 14848 /* need to activate port */ 14849 target = B_FALSE; 14850 14851 /* Sanity check */ 14852 if (SATA_PORT_ACTIVATE_FUNC(sata_hba_inst) == NULL) 14853 return (ENXIO); 14854 14855 /* Just let HBA driver to activate port */ 14856 if ((*SATA_PORT_ACTIVATE_FUNC(sata_hba_inst)) 14857 (SATA_DIP(sata_hba_inst), sata_device) != SATA_SUCCESS) { 14858 /* 14859 * Port activation failure - do not change port state 14860 * unless the state returned by HBA indicates a port 14861 * failure. 14862 */ 14863 if (qual == SATA_ADDR_DPMPORT) { 14864 mutex_enter(&pmportinfo->pmport_mutex); 14865 sata_update_pmport_info(sata_hba_inst, 14866 sata_device); 14867 if (sata_device->satadev_state & 14868 SATA_PSTATE_FAILED) 14869 pmportinfo->pmport_state = 14870 SATA_PSTATE_FAILED; 14871 mutex_exit(&pmportinfo->pmport_mutex); 14872 } else { 14873 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, 14874 cport)->cport_mutex); 14875 sata_update_port_info(sata_hba_inst, 14876 sata_device); 14877 if (sata_device->satadev_state & 14878 SATA_PSTATE_FAILED) 14879 cportinfo->cport_state = 14880 SATA_PSTATE_FAILED; 14881 mutex_exit(&SATA_CPORT_INFO( 14882 sata_hba_inst, cport)->cport_mutex); 14883 } 14884 } 14885 SATA_LOG_D((sata_hba_inst, CE_WARN, 14886 "sata_hba_ioctl: configure: " 14887 "failed to activate SATA port %d:%d", 14888 cport, pmport)); 14889 return (EIO); 14890 } 14891 /* 14892 * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE 14893 * without the hint. 14894 */ 14895 sata_gen_sysevent(sata_hba_inst, 14896 &sata_device->satadev_addr, SE_NO_HINT); 14897 14898 /* Virgin port state */ 14899 if (qual == SATA_ADDR_DPMPORT) { 14900 mutex_enter(&pmportinfo->pmport_mutex); 14901 pmportinfo->pmport_state = 0; 14902 mutex_exit(&pmportinfo->pmport_mutex); 14903 } else { 14904 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, 14905 cport)-> cport_mutex); 14906 cportinfo->cport_state = 0; 14907 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, 14908 cport)->cport_mutex); 14909 } 14910 /* 14911 * Always reprobe port, to get current device info. 14912 */ 14913 if (sata_reprobe_port(sata_hba_inst, sata_device, 14914 SATA_DEV_IDENTIFY_RETRY) != SATA_SUCCESS) 14915 return (EIO); 14916 14917 if (sata_device->satadev_type != SATA_DTYPE_NONE && target == B_FALSE) { 14918 if (qual == SATA_ADDR_DPMPORT) { 14919 /* 14920 * That's the transition from "inactive" port 14921 * to active one with device attached. 14922 */ 14923 sata_log(sata_hba_inst, CE_WARN, 14924 "SATA device detected at port %d:%d", 14925 cport, pmport); 14926 } else { 14927 /* 14928 * When PM is attached to the cport and cport is 14929 * activated, every PM device port needs to be reprobed. 14930 * We need to emit message for all devices detected 14931 * at port multiplier's device ports. 14932 * Add such code here. 14933 * For now, just inform about device attached to 14934 * cport. 14935 */ 14936 sata_log(sata_hba_inst, CE_WARN, 14937 "SATA device detected at port %d", cport); 14938 } 14939 } 14940 14941 /* 14942 * This is where real configuration operation starts. 14943 * 14944 * When PM is attached to the cport and cport is activated, 14945 * devices attached PM device ports may have to be configured 14946 * explicitly. This may change when port multiplier is supported. 14947 * For now, configure only disks and other valid target devices. 14948 */ 14949 if (!(sata_device->satadev_type & SATA_VALID_DEV_TYPE)) { 14950 if (qual == SATA_ADDR_DCPORT) { 14951 if (sata_device->satadev_type == SATA_DTYPE_UNKNOWN) { 14952 /* 14953 * A device was not successfully identified 14954 */ 14955 sata_log(sata_hba_inst, CE_WARN, 14956 "Could not identify SATA " 14957 "device at port %d", cport); 14958 } 14959 } else { /* port multiplier device port */ 14960 if (sata_device->satadev_type == SATA_DTYPE_UNKNOWN) { 14961 /* 14962 * A device was not successfully identified 14963 */ 14964 sata_log(sata_hba_inst, CE_WARN, 14965 "Could not identify SATA " 14966 "device at port %d:%d", cport, pmport); 14967 } 14968 } 14969 return (ENXIO); /* No device to configure */ 14970 } 14971 14972 /* 14973 * Here we may have a device in reset condition, 14974 * but because we are just configuring it, there is 14975 * no need to process the reset other than just 14976 * to clear device reset condition in the HBA driver. 14977 * Setting the flag SATA_EVNT_CLEAR_DEVICE_RESET will 14978 * cause a first command sent the HBA driver with the request 14979 * to clear device reset condition. 14980 */ 14981 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex); 14982 if (qual == SATA_ADDR_DPMPORT) 14983 sata_device->satadev_addr.qual = SATA_ADDR_DPMPORT; 14984 else 14985 sata_device->satadev_addr.qual = SATA_ADDR_DCPORT; 14986 sdinfo = sata_get_device_info(sata_hba_inst, sata_device); 14987 if (sdinfo == NULL) { 14988 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex); 14989 return (ENXIO); 14990 } 14991 if (sdinfo->satadrv_event_flags & 14992 (SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET)) { 14993 sdinfo->satadrv_event_flags = 0; 14994 } 14995 sdinfo->satadrv_event_flags |= SATA_EVNT_CLEAR_DEVICE_RESET; 14996 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex); 14997 14998 if ((tdip = sata_get_scsi_target_dip(SATA_DIP(sata_hba_inst), 14999 &sata_device->satadev_addr)) != NULL) { 15000 /* 15001 * Target node exists. Verify, that it belongs 15002 * to existing, attached device and not to 15003 * a removed device. 15004 */ 15005 if (sata_check_device_removed(tdip) == B_TRUE) { 15006 if (qual == SATA_ADDR_DPMPORT) 15007 sata_log(sata_hba_inst, CE_WARN, 15008 "SATA device at port %d cannot be " 15009 "configured. " 15010 "Application(s) accessing " 15011 "previously attached device " 15012 "have to release it before newly " 15013 "inserted device can be made accessible.", 15014 cport); 15015 else 15016 sata_log(sata_hba_inst, CE_WARN, 15017 "SATA device at port %d:%d cannot be" 15018 "configured. " 15019 "Application(s) accessing " 15020 "previously attached device " 15021 "have to release it before newly " 15022 "inserted device can be made accessible.", 15023 cport, pmport); 15024 return (EIO); 15025 } 15026 /* 15027 * Device was not removed and re-inserted. 15028 * Try to online it. 15029 */ 15030 if (ndi_devi_online(tdip, 0) != NDI_SUCCESS) { 15031 SATA_LOG_D((sata_hba_inst, CE_WARN, 15032 "sata_hba_ioctl: configure: " 15033 "onlining device at SATA port " 15034 "%d:%d failed", cport, pmport)); 15035 return (EIO); 15036 } 15037 15038 if (qual == SATA_ADDR_DPMPORT) { 15039 mutex_enter(&pmportinfo->pmport_mutex); 15040 pmportinfo->pmport_tgtnode_clean = B_TRUE; 15041 mutex_exit(&pmportinfo->pmport_mutex); 15042 } else { 15043 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, 15044 cport)->cport_mutex); 15045 cportinfo-> cport_tgtnode_clean = B_TRUE; 15046 mutex_exit(&SATA_CPORT_INFO( 15047 sata_hba_inst, cport)->cport_mutex); 15048 } 15049 } else { 15050 /* 15051 * No target node - need to create a new target node. 15052 */ 15053 if (qual == SATA_ADDR_DPMPORT) { 15054 mutex_enter(&pmportinfo->pmport_mutex); 15055 pmportinfo->pmport_tgtnode_clean = B_TRUE; 15056 mutex_exit(&pmportinfo->pmport_mutex); 15057 } else { 15058 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)-> 15059 cport_mutex); 15060 cportinfo-> cport_tgtnode_clean = B_TRUE; 15061 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)-> 15062 cport_mutex); 15063 } 15064 15065 tdip = sata_create_target_node(SATA_DIP(sata_hba_inst), 15066 sata_hba_inst, &sata_device->satadev_addr); 15067 if (tdip == NULL) { 15068 /* Configure operation failed */ 15069 SATA_LOG_D((sata_hba_inst, CE_WARN, 15070 "sata_hba_ioctl: configure: " 15071 "configuring SATA device at port %d:%d " 15072 "failed", cport, pmport)); 15073 return (EIO); 15074 } 15075 } 15076 return (0); 15077 } 15078 15079 15080 /* 15081 * Process ioctl deactivate port request. 15082 * Arbitrarily unconfigure attached device, if any. 15083 * Even if the unconfigure fails, proceed with the 15084 * port deactivation. 15085 * 15086 * NOTE: Port Multiplier is supported now. 15087 */ 15088 15089 static int 15090 sata_ioctl_deactivate(sata_hba_inst_t *sata_hba_inst, 15091 sata_device_t *sata_device) 15092 { 15093 int cport, pmport, qual; 15094 int rval, rv = 0; 15095 int npmport; 15096 sata_cport_info_t *cportinfo; 15097 sata_pmport_info_t *pmportinfo; 15098 sata_pmult_info_t *pmultinfo; 15099 dev_info_t *tdip; 15100 sata_drive_info_t *sdinfo = NULL; 15101 sata_device_t subsdevice; 15102 15103 /* Sanity check */ 15104 if (SATA_PORT_DEACTIVATE_FUNC(sata_hba_inst) == NULL) 15105 return (ENOTSUP); 15106 15107 cport = sata_device->satadev_addr.cport; 15108 pmport = sata_device->satadev_addr.pmport; 15109 qual = sata_device->satadev_addr.qual; 15110 15111 /* SCSI_TO_SATA_ADDR_QUAL() translate ap_id into a device qualifier */ 15112 ASSERT(qual == SATA_ADDR_DCPORT || qual == SATA_ADDR_DPMPORT); 15113 if (qual == SATA_ADDR_DCPORT) 15114 qual = SATA_ADDR_CPORT; 15115 else 15116 qual = SATA_ADDR_PMPORT; 15117 15118 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport); 15119 if (qual == SATA_ADDR_PMPORT) 15120 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, pmport); 15121 15122 /* 15123 * Processing port multiplier 15124 */ 15125 if (qual == SATA_ADDR_CPORT && 15126 SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) == SATA_DTYPE_PMULT) { 15127 mutex_enter(&cportinfo->cport_mutex); 15128 15129 /* Deactivate all sub-deices */ 15130 pmultinfo = SATA_CPORTINFO_PMULT_INFO(cportinfo); 15131 if (pmultinfo != NULL) { 15132 for (npmport = 0; npmport < SATA_NUM_PMPORTS( 15133 sata_hba_inst, cport); npmport++) { 15134 15135 subsdevice.satadev_addr.cport = cport; 15136 subsdevice.satadev_addr.pmport = 15137 (uint8_t)npmport; 15138 subsdevice.satadev_addr.qual = 15139 SATA_ADDR_DPMPORT; 15140 15141 SATADBG2(SATA_DBG_PMULT, sata_hba_inst, 15142 "sata_hba_ioctl: deactivate: trying to " 15143 "deactivate SATA port %d:%d", 15144 cport, npmport); 15145 15146 mutex_exit(&cportinfo->cport_mutex); 15147 if (sata_ioctl_deactivate(sata_hba_inst, 15148 &subsdevice) == SATA_SUCCESS) { 15149 SATADBG2(SATA_DBG_PMULT, sata_hba_inst, 15150 "[Deactivate] device at port %d:%d " 15151 "successfully.", cport, npmport); 15152 } 15153 mutex_enter(&cportinfo->cport_mutex); 15154 } 15155 } 15156 15157 /* Deactivate the port multiplier now. */ 15158 cportinfo->cport_state &= ~SATA_STATE_READY; 15159 mutex_exit(&cportinfo->cport_mutex); 15160 15161 sata_device->satadev_addr.qual = qual; 15162 rval = (*SATA_PORT_DEACTIVATE_FUNC(sata_hba_inst)) 15163 (SATA_DIP(sata_hba_inst), sata_device); 15164 15165 sata_gen_sysevent(sata_hba_inst, &sata_device->satadev_addr, 15166 SE_NO_HINT); 15167 15168 mutex_enter(&cportinfo->cport_mutex); 15169 sata_update_port_info(sata_hba_inst, sata_device); 15170 if (rval != SATA_SUCCESS) { 15171 if (sata_device->satadev_state & SATA_PSTATE_FAILED) { 15172 cportinfo->cport_state = SATA_PSTATE_FAILED; 15173 } 15174 rv = EIO; 15175 } else { 15176 cportinfo->cport_state |= SATA_PSTATE_SHUTDOWN; 15177 } 15178 mutex_exit(&cportinfo->cport_mutex); 15179 15180 return (rv); 15181 } 15182 15183 /* 15184 * Process non-port-multiplier device - it could be a drive connected 15185 * to a port multiplier port or a controller port. 15186 */ 15187 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex); 15188 if (qual == SATA_ADDR_CPORT) { 15189 sata_device->satadev_addr.qual = SATA_ADDR_DCPORT; 15190 if (cportinfo->cport_dev_type != SATA_DTYPE_NONE) { 15191 /* deal only with valid devices */ 15192 if ((cportinfo->cport_dev_type & 15193 SATA_VALID_DEV_TYPE) != 0) 15194 sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo); 15195 } 15196 cportinfo->cport_state &= ~SATA_STATE_READY; 15197 } else { 15198 /* Port multiplier device port */ 15199 mutex_enter(&pmportinfo->pmport_mutex); 15200 sata_device->satadev_addr.qual = SATA_ADDR_DPMPORT; 15201 if (pmportinfo->pmport_dev_type != SATA_DTYPE_NONE && 15202 (pmportinfo->pmport_dev_type & SATA_VALID_DEV_TYPE) != 0) 15203 sdinfo = SATA_PMPORTINFO_DRV_INFO(pmportinfo); 15204 pmportinfo->pmport_state &= ~SATA_STATE_READY; 15205 mutex_exit(&pmportinfo->pmport_mutex); 15206 } 15207 15208 if (sdinfo != NULL) { 15209 /* 15210 * If a target node exists, try to offline a device and 15211 * to remove a target node. 15212 */ 15213 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)-> 15214 cport_mutex); 15215 tdip = sata_get_scsi_target_dip(SATA_DIP(sata_hba_inst), 15216 &sata_device->satadev_addr); 15217 if (tdip != NULL) { 15218 /* target node exist */ 15219 SATADBG1(SATA_DBG_IOCTL_IF, sata_hba_inst, 15220 "sata_hba_ioctl: port deactivate: " 15221 "target node exists.", NULL); 15222 15223 if (ndi_devi_offline(tdip, NDI_DEVI_REMOVE) != 15224 NDI_SUCCESS) { 15225 SATA_LOG_D((sata_hba_inst, CE_WARN, 15226 "sata_hba_ioctl: port deactivate: " 15227 "failed to unconfigure device at port " 15228 "%d:%d before deactivating the port", 15229 cport, pmport)); 15230 /* 15231 * Set DEVICE REMOVED state in the target 15232 * node. It will prevent an access to 15233 * the device even when a new device is 15234 * attached, until the old target node is 15235 * released, removed and recreated for a new 15236 * device. 15237 */ 15238 sata_set_device_removed(tdip); 15239 15240 /* 15241 * Instruct the event daemon to try the 15242 * target node cleanup later. 15243 */ 15244 sata_set_target_node_cleanup(sata_hba_inst, 15245 &sata_device->satadev_addr); 15246 } 15247 } 15248 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)-> 15249 cport_mutex); 15250 /* 15251 * In any case, remove and release sata_drive_info 15252 * structure. 15253 */ 15254 if (qual == SATA_ADDR_CPORT) { 15255 SATA_CPORTINFO_DRV_INFO(cportinfo) = NULL; 15256 cportinfo->cport_dev_type = SATA_DTYPE_NONE; 15257 } else { /* port multiplier device port */ 15258 mutex_enter(&pmportinfo->pmport_mutex); 15259 SATA_PMPORTINFO_DRV_INFO(pmportinfo) = NULL; 15260 pmportinfo->pmport_dev_type = SATA_DTYPE_NONE; 15261 mutex_exit(&pmportinfo->pmport_mutex); 15262 } 15263 (void) kmem_free((void *)sdinfo, sizeof (sata_drive_info_t)); 15264 } 15265 15266 if (qual == SATA_ADDR_CPORT) { 15267 cportinfo->cport_state &= ~(SATA_STATE_PROBED | 15268 SATA_STATE_PROBING); 15269 } else if (qual == SATA_ADDR_PMPORT) { 15270 mutex_enter(&pmportinfo->pmport_mutex); 15271 pmportinfo->pmport_state &= ~(SATA_STATE_PROBED | 15272 SATA_STATE_PROBING); 15273 mutex_exit(&pmportinfo->pmport_mutex); 15274 } 15275 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex); 15276 15277 /* Just let HBA driver to deactivate port */ 15278 sata_device->satadev_addr.qual = qual; 15279 rval = (*SATA_PORT_DEACTIVATE_FUNC(sata_hba_inst)) 15280 (SATA_DIP(sata_hba_inst), sata_device); 15281 15282 /* 15283 * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE 15284 * without the hint 15285 */ 15286 sata_gen_sysevent(sata_hba_inst, &sata_device->satadev_addr, 15287 SE_NO_HINT); 15288 15289 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex); 15290 sata_update_port_info(sata_hba_inst, sata_device); 15291 if (qual == SATA_ADDR_CPORT) { 15292 if (rval != SATA_SUCCESS) { 15293 /* 15294 * Port deactivation failure - do not change port state 15295 * unless the state returned by HBA indicates a port 15296 * failure. 15297 */ 15298 if (sata_device->satadev_state & SATA_PSTATE_FAILED) { 15299 SATA_CPORT_STATE(sata_hba_inst, cport) = 15300 SATA_PSTATE_FAILED; 15301 } 15302 SATA_LOG_D((sata_hba_inst, CE_WARN, 15303 "sata_hba_ioctl: port deactivate: " 15304 "cannot deactivate SATA port %d", cport)); 15305 rv = EIO; 15306 } else { 15307 cportinfo->cport_state |= SATA_PSTATE_SHUTDOWN; 15308 } 15309 } else { 15310 mutex_enter(&pmportinfo->pmport_mutex); 15311 if (rval != SATA_SUCCESS) { 15312 if (sata_device->satadev_state & SATA_PSTATE_FAILED) { 15313 SATA_PMPORT_STATE(sata_hba_inst, cport, 15314 pmport) = SATA_PSTATE_FAILED; 15315 } 15316 SATA_LOG_D((sata_hba_inst, CE_WARN, 15317 "sata_hba_ioctl: port deactivate: " 15318 "cannot deactivate SATA port %d:%d", 15319 cport, pmport)); 15320 rv = EIO; 15321 } else { 15322 pmportinfo->pmport_state |= SATA_PSTATE_SHUTDOWN; 15323 } 15324 mutex_exit(&pmportinfo->pmport_mutex); 15325 } 15326 15327 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex); 15328 15329 return (rv); 15330 } 15331 15332 /* 15333 * Process ioctl port activate request. 15334 * 15335 * NOTE: Port multiplier is supported now. 15336 */ 15337 static int 15338 sata_ioctl_activate(sata_hba_inst_t *sata_hba_inst, 15339 sata_device_t *sata_device) 15340 { 15341 int cport, pmport, qual; 15342 sata_cport_info_t *cportinfo; 15343 sata_pmport_info_t *pmportinfo = NULL; 15344 boolean_t dev_existed = B_TRUE; 15345 15346 /* Sanity check */ 15347 if (SATA_PORT_ACTIVATE_FUNC(sata_hba_inst) == NULL) 15348 return (ENOTSUP); 15349 15350 cport = sata_device->satadev_addr.cport; 15351 pmport = sata_device->satadev_addr.pmport; 15352 qual = sata_device->satadev_addr.qual; 15353 15354 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport); 15355 15356 /* 15357 * The qual translate from ap_id (by SCSI_TO_SATA_ADDR_QUAL()) 15358 * is a device. But what we are dealing with is port/pmport. 15359 */ 15360 ASSERT(qual == SATA_ADDR_DCPORT || qual == SATA_ADDR_DPMPORT); 15361 if (qual == SATA_ADDR_DCPORT) 15362 sata_device->satadev_addr.qual = qual = SATA_ADDR_CPORT; 15363 else 15364 sata_device->satadev_addr.qual = qual = SATA_ADDR_PMPORT; 15365 15366 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex); 15367 if (qual == SATA_ADDR_PMPORT) { 15368 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, pmport); 15369 if (pmportinfo->pmport_state & SATA_PSTATE_SHUTDOWN || 15370 pmportinfo->pmport_dev_type == SATA_DTYPE_NONE) 15371 dev_existed = B_FALSE; 15372 } else { /* cport */ 15373 if (cportinfo->cport_state & SATA_PSTATE_SHUTDOWN || 15374 cportinfo->cport_dev_type == SATA_DTYPE_NONE) 15375 dev_existed = B_FALSE; 15376 } 15377 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex); 15378 15379 /* Just let HBA driver to activate port, if necessary */ 15380 if ((*SATA_PORT_ACTIVATE_FUNC(sata_hba_inst)) 15381 (SATA_DIP(sata_hba_inst), sata_device) != SATA_SUCCESS) { 15382 /* 15383 * Port activation failure - do not change port state unless 15384 * the state returned by HBA indicates a port failure. 15385 */ 15386 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, 15387 cport)->cport_mutex); 15388 sata_update_port_info(sata_hba_inst, sata_device); 15389 if (sata_device->satadev_state & SATA_PSTATE_FAILED) { 15390 if (qual == SATA_ADDR_PMPORT) { 15391 mutex_enter(&pmportinfo->pmport_mutex); 15392 pmportinfo->pmport_state = SATA_PSTATE_FAILED; 15393 mutex_exit(&pmportinfo->pmport_mutex); 15394 } else 15395 cportinfo->cport_state = SATA_PSTATE_FAILED; 15396 15397 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, 15398 cport)->cport_mutex); 15399 SATA_LOG_D((sata_hba_inst, CE_WARN, 15400 "sata_hba_ioctl: port activate: cannot activate " 15401 "SATA port %d:%d", cport, pmport)); 15402 return (EIO); 15403 } 15404 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex); 15405 } 15406 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex); 15407 if (qual == SATA_ADDR_PMPORT) { 15408 mutex_enter(&pmportinfo->pmport_mutex); 15409 pmportinfo->pmport_state &= ~SATA_PSTATE_SHUTDOWN; 15410 mutex_exit(&pmportinfo->pmport_mutex); 15411 } else 15412 cportinfo->cport_state &= ~SATA_PSTATE_SHUTDOWN; 15413 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex); 15414 15415 /* 15416 * Re-probe port to find its current state and possibly attached device. 15417 * Port re-probing may change the cportinfo device type if device is 15418 * found attached. 15419 * If port probing failed, the device type would be set to 15420 * SATA_DTYPE_NONE. 15421 */ 15422 (void) sata_reprobe_port(sata_hba_inst, sata_device, 15423 SATA_DEV_IDENTIFY_RETRY); 15424 15425 /* 15426 * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE 15427 * without the hint. 15428 */ 15429 sata_gen_sysevent(sata_hba_inst, &sata_device->satadev_addr, 15430 SE_NO_HINT); 15431 15432 if (dev_existed == B_FALSE) { 15433 if (qual == SATA_ADDR_PMPORT && 15434 pmportinfo->pmport_dev_type != SATA_DTYPE_NONE) { 15435 /* 15436 * That's the transition from the "inactive" port state 15437 * or the active port without a device attached to the 15438 * active port state with a device attached. 15439 */ 15440 sata_log(sata_hba_inst, CE_WARN, 15441 "SATA device detected at port %d:%d", 15442 cport, pmport); 15443 } else if (qual == SATA_ADDR_CPORT && 15444 cportinfo->cport_dev_type != SATA_DTYPE_NONE) { 15445 /* 15446 * That's the transition from the "inactive" port state 15447 * or the active port without a device attached to the 15448 * active port state with a device attached. 15449 */ 15450 if (cportinfo->cport_dev_type != SATA_DTYPE_PMULT) { 15451 sata_log(sata_hba_inst, CE_WARN, 15452 "SATA device detected at port %d", cport); 15453 } else { 15454 sata_log(sata_hba_inst, CE_WARN, 15455 "SATA port multiplier detected at port %d", 15456 cport); 15457 } 15458 } 15459 } 15460 return (0); 15461 } 15462 15463 15464 15465 /* 15466 * Process ioctl reset port request. 15467 * 15468 * NOTE: Port-Multiplier is supported. 15469 */ 15470 static int 15471 sata_ioctl_reset_port(sata_hba_inst_t *sata_hba_inst, 15472 sata_device_t *sata_device) 15473 { 15474 int cport, pmport, qual; 15475 int rv = 0; 15476 15477 cport = sata_device->satadev_addr.cport; 15478 pmport = sata_device->satadev_addr.pmport; 15479 qual = sata_device->satadev_addr.qual; 15480 15481 /* 15482 * The qual translate from ap_id (by SCSI_TO_SATA_ADDR_QUAL()) 15483 * is a device. But what we are dealing with is port/pmport. 15484 */ 15485 if (qual == SATA_ADDR_DCPORT) 15486 sata_device->satadev_addr.qual = qual = SATA_ADDR_CPORT; 15487 else 15488 sata_device->satadev_addr.qual = qual = SATA_ADDR_PMPORT; 15489 ASSERT(qual == SATA_ADDR_CPORT || qual == SATA_ADDR_PMPORT); 15490 15491 /* Sanity check */ 15492 if (SATA_RESET_DPORT_FUNC(sata_hba_inst) == NULL) { 15493 SATA_LOG_D((sata_hba_inst, CE_WARN, 15494 "sata_hba_ioctl: sata_hba_tran missing required " 15495 "function sata_tran_reset_dport")); 15496 return (ENOTSUP); 15497 } 15498 15499 /* Ask HBA to reset port */ 15500 if ((*SATA_RESET_DPORT_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst), 15501 sata_device) != SATA_SUCCESS) { 15502 SATA_LOG_D((sata_hba_inst, CE_WARN, 15503 "sata_hba_ioctl: reset port: failed %d:%d", 15504 cport, pmport)); 15505 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)-> 15506 cport_mutex); 15507 sata_update_port_info(sata_hba_inst, sata_device); 15508 if (qual == SATA_ADDR_CPORT) 15509 SATA_CPORT_STATE(sata_hba_inst, cport) = 15510 SATA_PSTATE_FAILED; 15511 else { 15512 mutex_enter(&SATA_PMPORT_MUTEX(sata_hba_inst, cport, 15513 pmport)); 15514 SATA_PMPORT_STATE(sata_hba_inst, cport, pmport) = 15515 SATA_PSTATE_FAILED; 15516 mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst, cport, 15517 pmport)); 15518 } 15519 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)-> 15520 cport_mutex); 15521 rv = EIO; 15522 } 15523 /* 15524 * Beacuse the port was reset, it should be probed and 15525 * attached device reinitialized. At this point the 15526 * port state is unknown - it's state is HBA-specific. 15527 * Re-probe port to get its state. 15528 */ 15529 if (sata_reprobe_port(sata_hba_inst, sata_device, 15530 SATA_DEV_IDENTIFY_RETRY) != SATA_SUCCESS) { 15531 rv = EIO; 15532 } 15533 return (rv); 15534 } 15535 15536 /* 15537 * Process ioctl reset device request. 15538 * 15539 * NOTE: Port multiplier is supported. 15540 */ 15541 static int 15542 sata_ioctl_reset_device(sata_hba_inst_t *sata_hba_inst, 15543 sata_device_t *sata_device) 15544 { 15545 sata_drive_info_t *sdinfo = NULL; 15546 sata_pmult_info_t *pmultinfo = NULL; 15547 int cport, pmport; 15548 int rv = 0; 15549 15550 /* Sanity check */ 15551 if (SATA_RESET_DPORT_FUNC(sata_hba_inst) == NULL) { 15552 SATA_LOG_D((sata_hba_inst, CE_WARN, 15553 "sata_hba_ioctl: sata_hba_tran missing required " 15554 "function sata_tran_reset_dport")); 15555 return (ENOTSUP); 15556 } 15557 15558 cport = sata_device->satadev_addr.cport; 15559 pmport = sata_device->satadev_addr.pmport; 15560 15561 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex); 15562 if (sata_device->satadev_addr.qual == SATA_ADDR_DCPORT) { 15563 if (SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) == 15564 SATA_DTYPE_PMULT) 15565 pmultinfo = SATA_CPORT_INFO(sata_hba_inst, cport)-> 15566 cport_devp.cport_sata_pmult; 15567 else 15568 sdinfo = SATA_CPORT_DRV_INFO(sata_hba_inst, 15569 sata_device->satadev_addr.cport); 15570 } else { /* port multiplier */ 15571 sata_device->satadev_addr.qual = SATA_ADDR_DPMPORT; 15572 sdinfo = SATA_PMPORT_DRV_INFO(sata_hba_inst, 15573 sata_device->satadev_addr.cport, 15574 sata_device->satadev_addr.pmport); 15575 } 15576 if (sdinfo == NULL && pmultinfo == NULL) { 15577 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex); 15578 return (EINVAL); 15579 } 15580 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex); 15581 15582 /* Ask HBA to reset device */ 15583 if ((*SATA_RESET_DPORT_FUNC(sata_hba_inst)) 15584 (SATA_DIP(sata_hba_inst), sata_device) != SATA_SUCCESS) { 15585 SATA_LOG_D((sata_hba_inst, CE_WARN, 15586 "sata_hba_ioctl: reset device: failed at port %d:%d", 15587 cport, pmport)); 15588 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)-> 15589 cport_mutex); 15590 sata_update_port_info(sata_hba_inst, sata_device); 15591 /* 15592 * Device info structure remains attached. Another device reset 15593 * or port disconnect/connect and re-probing is 15594 * needed to change it's state 15595 */ 15596 if (sdinfo != NULL) { 15597 sdinfo->satadrv_state &= ~SATA_STATE_READY; 15598 sdinfo->satadrv_state |= SATA_DSTATE_FAILED; 15599 } else if (pmultinfo != NULL) { 15600 pmultinfo->pmult_state &= ~SATA_STATE_READY; 15601 pmultinfo->pmult_state |= SATA_DSTATE_FAILED; 15602 } 15603 15604 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex); 15605 rv = EIO; 15606 } 15607 /* 15608 * If attached device was a port multiplier, some extra processing 15609 * may be needed to bring it back. SATA specification requies a 15610 * mandatory software reset on host port to reliably enumerate a port 15611 * multiplier, the HBA driver should handle that after reset 15612 * operation. 15613 */ 15614 return (rv); 15615 } 15616 15617 15618 /* 15619 * Process ioctl reset all request. 15620 */ 15621 static int 15622 sata_ioctl_reset_all(sata_hba_inst_t *sata_hba_inst) 15623 { 15624 sata_device_t sata_device; 15625 int rv = 0; 15626 int tcport; 15627 int tpmport = 0; 15628 15629 sata_device.satadev_rev = SATA_DEVICE_REV; 15630 15631 /* 15632 * There is no protection here for configured devices. 15633 */ 15634 /* Sanity check */ 15635 if (SATA_RESET_DPORT_FUNC(sata_hba_inst) == NULL) { 15636 SATA_LOG_D((sata_hba_inst, CE_WARN, 15637 "sata_hba_ioctl: sata_hba_tran missing required " 15638 "function sata_tran_reset_dport")); 15639 return (ENOTSUP); 15640 } 15641 15642 /* 15643 * Need to lock all ports, not just one. 15644 * If any port is locked by event processing, fail the whole operation. 15645 * One port is already locked, but for simplicity lock it again. 15646 */ 15647 for (tcport = 0; tcport < SATA_NUM_CPORTS(sata_hba_inst); tcport++) { 15648 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, tcport)-> 15649 cport_mutex); 15650 if (((SATA_CPORT_INFO(sata_hba_inst, tcport)-> 15651 cport_event_flags) & SATA_EVNT_LOCK_PORT_BUSY) != 0) { 15652 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, tcport)-> 15653 cport_mutex); 15654 rv = EBUSY; 15655 break; 15656 } else { 15657 /* 15658 * It is enough to lock cport in command-based 15659 * switching mode. 15660 */ 15661 SATA_CPORT_INFO(sata_hba_inst, tcport)-> 15662 cport_event_flags |= SATA_APCTL_LOCK_PORT_BUSY; 15663 } 15664 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, tcport)-> 15665 cport_mutex); 15666 } 15667 15668 if (rv == 0) { 15669 /* 15670 * All cports were successfully locked. 15671 * Reset main SATA controller. 15672 * Set the device address to port 0, to have a valid device 15673 * address. 15674 */ 15675 sata_device.satadev_addr.qual = SATA_ADDR_CNTRL; 15676 sata_device.satadev_addr.cport = 0; 15677 sata_device.satadev_addr.pmport = 0; 15678 15679 if ((*SATA_RESET_DPORT_FUNC(sata_hba_inst)) 15680 (SATA_DIP(sata_hba_inst), &sata_device) != SATA_SUCCESS) { 15681 SATA_LOG_D((sata_hba_inst, CE_WARN, 15682 "sata_hba_ioctl: reset controller failed")); 15683 return (EIO); 15684 } 15685 /* 15686 * Because ports were reset, port states are unknown. 15687 * They should be re-probed to get their state and 15688 * attached devices should be reinitialized. 15689 */ 15690 for (tcport = 0; tcport < SATA_NUM_CPORTS(sata_hba_inst); 15691 tcport++) { 15692 sata_device.satadev_addr.cport = tcport; 15693 sata_device.satadev_addr.pmport = tpmport; 15694 sata_device.satadev_addr.qual = SATA_ADDR_CPORT; 15695 15696 /* 15697 * The sata_reprobe_port() will mark a 15698 * SATA_EVNT_DEVICE_RESET event on the port 15699 * multiplier, all its sub-ports will be probed by 15700 * sata daemon afterwards. 15701 */ 15702 if (sata_reprobe_port(sata_hba_inst, &sata_device, 15703 SATA_DEV_IDENTIFY_RETRY) != SATA_SUCCESS) 15704 rv = EIO; 15705 } 15706 } 15707 /* 15708 * Unlock all ports 15709 */ 15710 for (tcport = 0; tcport < SATA_NUM_CPORTS(sata_hba_inst); tcport++) { 15711 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, tcport)-> 15712 cport_mutex); 15713 SATA_CPORT_INFO(sata_hba_inst, tcport)-> 15714 cport_event_flags &= ~SATA_APCTL_LOCK_PORT_BUSY; 15715 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, tcport)-> 15716 cport_mutex); 15717 } 15718 15719 /* 15720 * This operation returns EFAULT if either reset 15721 * controller failed or a re-probing of any port failed. 15722 */ 15723 return (rv); 15724 } 15725 15726 15727 /* 15728 * Process ioctl port self test request. 15729 * 15730 * NOTE: Port multiplier code is not completed nor tested. 15731 */ 15732 static int 15733 sata_ioctl_port_self_test(sata_hba_inst_t *sata_hba_inst, 15734 sata_device_t *sata_device) 15735 { 15736 int cport, pmport, qual; 15737 int rv = 0; 15738 15739 /* Sanity check */ 15740 if (SATA_SELFTEST_FUNC(sata_hba_inst) == NULL) 15741 return (ENOTSUP); 15742 15743 cport = sata_device->satadev_addr.cport; 15744 pmport = sata_device->satadev_addr.pmport; 15745 qual = sata_device->satadev_addr.qual; 15746 15747 /* 15748 * There is no protection here for a configured 15749 * device attached to this port. 15750 */ 15751 15752 if ((*SATA_SELFTEST_FUNC(sata_hba_inst)) 15753 (SATA_DIP(sata_hba_inst), sata_device) != SATA_SUCCESS) { 15754 SATA_LOG_D((sata_hba_inst, CE_WARN, 15755 "sata_hba_ioctl: port selftest: " 15756 "failed port %d:%d", cport, pmport)); 15757 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)-> 15758 cport_mutex); 15759 sata_update_port_info(sata_hba_inst, sata_device); 15760 if (qual == SATA_ADDR_CPORT) 15761 SATA_CPORT_STATE(sata_hba_inst, cport) = 15762 SATA_PSTATE_FAILED; 15763 else { /* port multiplier device port */ 15764 mutex_enter(&SATA_PMPORT_MUTEX(sata_hba_inst, 15765 cport, pmport)); 15766 SATA_PMPORT_STATE(sata_hba_inst, cport, pmport) = 15767 SATA_PSTATE_FAILED; 15768 mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst, 15769 cport, pmport)); 15770 } 15771 15772 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)-> 15773 cport_mutex); 15774 return (EIO); 15775 } 15776 /* 15777 * Beacuse the port was reset in the course of testing, it should be 15778 * re-probed and attached device state should be restored. At this 15779 * point the port state is unknown - it's state is HBA-specific. 15780 * Force port re-probing to get it into a known state. 15781 */ 15782 if (sata_reprobe_port(sata_hba_inst, sata_device, 15783 SATA_DEV_IDENTIFY_RETRY) != SATA_SUCCESS) 15784 rv = EIO; 15785 return (rv); 15786 } 15787 15788 15789 /* 15790 * sata_cfgadm_state: 15791 * Use the sata port state and state of the target node to figure out 15792 * the cfgadm_state. 15793 * 15794 * The port argument is a value with encoded cport, 15795 * pmport and address qualifier, in the same manner as a scsi target number. 15796 * SCSI_TO_SATA_CPORT macro extracts cport number, 15797 * SCSI_TO_SATA_PMPORT extracts pmport number and 15798 * SCSI_TO_SATA_ADDR_QUAL extracts port mulitplier qualifier flag. 15799 * 15800 * Port multiplier is supported. 15801 */ 15802 15803 static void 15804 sata_cfgadm_state(sata_hba_inst_t *sata_hba_inst, int32_t port, 15805 devctl_ap_state_t *ap_state) 15806 { 15807 uint8_t cport, pmport, qual; 15808 uint32_t port_state, pmult_state; 15809 uint32_t dev_type; 15810 sata_drive_info_t *sdinfo; 15811 15812 cport = SCSI_TO_SATA_CPORT(port); 15813 pmport = SCSI_TO_SATA_PMPORT(port); 15814 qual = SCSI_TO_SATA_ADDR_QUAL(port); 15815 15816 /* Check cport state */ 15817 port_state = SATA_CPORT_STATE(sata_hba_inst, cport); 15818 if (port_state & SATA_PSTATE_SHUTDOWN || 15819 port_state & SATA_PSTATE_FAILED) { 15820 ap_state->ap_rstate = AP_RSTATE_DISCONNECTED; 15821 ap_state->ap_ostate = AP_OSTATE_UNCONFIGURED; 15822 if (port_state & SATA_PSTATE_FAILED) 15823 ap_state->ap_condition = AP_COND_FAILED; 15824 else 15825 ap_state->ap_condition = AP_COND_UNKNOWN; 15826 15827 return; 15828 } 15829 15830 /* cport state is okay. Now check pmport state */ 15831 if (qual == SATA_ADDR_DPMPORT || qual == SATA_ADDR_PMPORT) { 15832 /* Sanity check */ 15833 if (SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) != 15834 SATA_DTYPE_PMULT || SATA_PMPORT_INFO(sata_hba_inst, 15835 cport, pmport) == NULL) 15836 return; 15837 port_state = SATA_PMPORT_STATE(sata_hba_inst, cport, pmport); 15838 if (port_state & SATA_PSTATE_SHUTDOWN || 15839 port_state & SATA_PSTATE_FAILED) { 15840 ap_state->ap_rstate = AP_RSTATE_DISCONNECTED; 15841 ap_state->ap_ostate = AP_OSTATE_UNCONFIGURED; 15842 if (port_state & SATA_PSTATE_FAILED) 15843 ap_state->ap_condition = AP_COND_FAILED; 15844 else 15845 ap_state->ap_condition = AP_COND_UNKNOWN; 15846 15847 return; 15848 } 15849 } 15850 15851 /* Port is enabled and ready */ 15852 if (qual == SATA_ADDR_DCPORT || qual == SATA_ADDR_CPORT) 15853 dev_type = SATA_CPORT_DEV_TYPE(sata_hba_inst, cport); 15854 else 15855 dev_type = SATA_PMPORT_DEV_TYPE(sata_hba_inst, cport, pmport); 15856 15857 switch (dev_type) { 15858 case SATA_DTYPE_NONE: 15859 { 15860 ap_state->ap_ostate = AP_OSTATE_UNCONFIGURED; 15861 ap_state->ap_condition = AP_COND_OK; 15862 /* No device attached */ 15863 ap_state->ap_rstate = AP_RSTATE_EMPTY; 15864 break; 15865 } 15866 case SATA_DTYPE_PMULT: 15867 { 15868 /* Need to check port multiplier state */ 15869 ASSERT(qual == SATA_ADDR_DCPORT); 15870 pmult_state = SATA_PMULT_INFO(sata_hba_inst, cport)-> 15871 pmult_state; 15872 if (pmult_state & (SATA_PSTATE_SHUTDOWN|SATA_PSTATE_FAILED)) { 15873 ap_state->ap_rstate = AP_RSTATE_DISCONNECTED; 15874 ap_state->ap_ostate = AP_OSTATE_UNCONFIGURED; 15875 if (pmult_state & SATA_PSTATE_FAILED) 15876 ap_state->ap_condition = AP_COND_FAILED; 15877 else 15878 ap_state->ap_condition = AP_COND_UNKNOWN; 15879 15880 return; 15881 } 15882 15883 /* Port multiplier is not configurable */ 15884 ap_state->ap_ostate = AP_OSTATE_CONFIGURED; 15885 ap_state->ap_rstate = AP_RSTATE_CONNECTED; 15886 ap_state->ap_condition = AP_COND_OK; 15887 break; 15888 } 15889 15890 case SATA_DTYPE_ATADISK: 15891 case SATA_DTYPE_ATAPICD: 15892 case SATA_DTYPE_ATAPITAPE: 15893 case SATA_DTYPE_ATAPIDISK: 15894 { 15895 dev_info_t *tdip = NULL; 15896 dev_info_t *dip = NULL; 15897 int circ; 15898 15899 dip = SATA_DIP(sata_hba_inst); 15900 tdip = sata_get_target_dip(dip, cport, pmport); 15901 ap_state->ap_rstate = AP_RSTATE_CONNECTED; 15902 if (tdip != NULL) { 15903 ndi_devi_enter(dip, &circ); 15904 mutex_enter(&(DEVI(tdip)->devi_lock)); 15905 if (DEVI_IS_DEVICE_REMOVED(tdip)) { 15906 /* 15907 * There could be the case where previously 15908 * configured and opened device was removed 15909 * and unknown device was plugged. 15910 * In such case we want to show a device, and 15911 * its configured or unconfigured state but 15912 * indicate unusable condition untill the 15913 * old target node is released and removed. 15914 */ 15915 ap_state->ap_condition = AP_COND_UNUSABLE; 15916 } else { 15917 mutex_enter(&SATA_CPORT_MUTEX(sata_hba_inst, 15918 cport)); 15919 sdinfo = SATA_CPORT_DRV_INFO(sata_hba_inst, 15920 cport); 15921 if (sdinfo != NULL) { 15922 if ((sdinfo->satadrv_state & 15923 SATA_DSTATE_FAILED) != 0) 15924 ap_state->ap_condition = 15925 AP_COND_FAILED; 15926 else 15927 ap_state->ap_condition = 15928 AP_COND_OK; 15929 } else { 15930 ap_state->ap_condition = 15931 AP_COND_UNKNOWN; 15932 } 15933 mutex_exit(&SATA_CPORT_MUTEX(sata_hba_inst, 15934 cport)); 15935 } 15936 if ((DEVI_IS_DEVICE_OFFLINE(tdip)) || 15937 (DEVI_IS_DEVICE_DOWN(tdip))) { 15938 ap_state->ap_ostate = 15939 AP_OSTATE_UNCONFIGURED; 15940 } else { 15941 ap_state->ap_ostate = 15942 AP_OSTATE_CONFIGURED; 15943 } 15944 mutex_exit(&(DEVI(tdip)->devi_lock)); 15945 ndi_devi_exit(dip, circ); 15946 } else { 15947 ap_state->ap_ostate = AP_OSTATE_UNCONFIGURED; 15948 ap_state->ap_condition = AP_COND_UNKNOWN; 15949 } 15950 break; 15951 } 15952 default: 15953 ap_state->ap_rstate = AP_RSTATE_CONNECTED; 15954 ap_state->ap_ostate = AP_OSTATE_UNCONFIGURED; 15955 ap_state->ap_condition = AP_COND_UNKNOWN; 15956 /* 15957 * This is actually internal error condition (non fatal), 15958 * because we have already checked all defined device types. 15959 */ 15960 SATA_LOG_D((sata_hba_inst, CE_WARN, 15961 "sata_cfgadm_state: Internal error: " 15962 "unknown device type")); 15963 break; 15964 } 15965 } 15966 15967 15968 /* 15969 * Process ioctl get device path request. 15970 * 15971 * NOTE: Port multiplier has no target dip. Devices connected to port 15972 * multiplier have target node attached to the HBA node. The only difference 15973 * between them and the directly-attached device node is a target address. 15974 */ 15975 static int 15976 sata_ioctl_get_device_path(sata_hba_inst_t *sata_hba_inst, 15977 sata_device_t *sata_device, sata_ioctl_data_t *ioc, int mode) 15978 { 15979 char path[MAXPATHLEN]; 15980 uint32_t size; 15981 dev_info_t *tdip; 15982 15983 (void) strcpy(path, "/devices"); 15984 if ((tdip = sata_get_scsi_target_dip(SATA_DIP(sata_hba_inst), 15985 &sata_device->satadev_addr)) == NULL) { 15986 /* 15987 * No such device. If this is a request for a size, do not 15988 * return EINVAL for non-existing target, because cfgadm 15989 * will then indicate a meaningless ioctl failure. 15990 * If this is a request for a path, indicate invalid 15991 * argument. 15992 */ 15993 if (ioc->get_size == 0) 15994 return (EINVAL); 15995 } else { 15996 (void) ddi_pathname(tdip, path + strlen(path)); 15997 } 15998 size = strlen(path) + 1; 15999 16000 if (ioc->get_size != 0) { 16001 if (ddi_copyout((void *)&size, ioc->buf, ioc->bufsiz, 16002 mode) != 0) 16003 return (EFAULT); 16004 } else { 16005 if (ioc->bufsiz != size) 16006 return (EINVAL); 16007 16008 else if (ddi_copyout((void *)&path, ioc->buf, ioc->bufsiz, 16009 mode) != 0) 16010 return (EFAULT); 16011 } 16012 return (0); 16013 } 16014 16015 /* 16016 * Process ioctl get attachment point type request. 16017 * 16018 * NOTE: Port multiplier is supported. 16019 */ 16020 static int 16021 sata_ioctl_get_ap_type(sata_hba_inst_t *sata_hba_inst, 16022 sata_device_t *sata_device, sata_ioctl_data_t *ioc, int mode) 16023 { 16024 uint32_t type_len; 16025 const char *ap_type; 16026 int dev_type; 16027 16028 if (sata_device->satadev_addr.qual == SATA_ADDR_DCPORT) 16029 dev_type = SATA_CPORT_DEV_TYPE(sata_hba_inst, 16030 sata_device->satadev_addr.cport); 16031 else /* pmport */ 16032 dev_type = SATA_PMPORT_DEV_TYPE(sata_hba_inst, 16033 sata_device->satadev_addr.cport, 16034 sata_device->satadev_addr.pmport); 16035 16036 switch (dev_type) { 16037 case SATA_DTYPE_NONE: 16038 ap_type = "port"; 16039 break; 16040 16041 case SATA_DTYPE_ATADISK: 16042 case SATA_DTYPE_ATAPIDISK: 16043 ap_type = "disk"; 16044 break; 16045 16046 case SATA_DTYPE_ATAPICD: 16047 ap_type = "cd/dvd"; 16048 break; 16049 16050 case SATA_DTYPE_ATAPITAPE: 16051 ap_type = "tape"; 16052 break; 16053 16054 case SATA_DTYPE_PMULT: 16055 ap_type = "sata-pmult"; 16056 break; 16057 16058 case SATA_DTYPE_UNKNOWN: 16059 ap_type = "unknown"; 16060 break; 16061 16062 default: 16063 ap_type = "unsupported"; 16064 break; 16065 16066 } /* end of dev_type switch */ 16067 16068 type_len = strlen(ap_type) + 1; 16069 16070 if (ioc->get_size) { 16071 if (ddi_copyout((void *)&type_len, ioc->buf, ioc->bufsiz, 16072 mode) != 0) 16073 return (EFAULT); 16074 } else { 16075 if (ioc->bufsiz != type_len) 16076 return (EINVAL); 16077 16078 if (ddi_copyout((void *)ap_type, ioc->buf, 16079 ioc->bufsiz, mode) != 0) 16080 return (EFAULT); 16081 } 16082 return (0); 16083 16084 } 16085 16086 /* 16087 * Process ioctl get device model info request. 16088 * This operation should return to cfgadm the device model 16089 * information string 16090 * 16091 * NOTE: Port multiplier is supported. 16092 */ 16093 static int 16094 sata_ioctl_get_model_info(sata_hba_inst_t *sata_hba_inst, 16095 sata_device_t *sata_device, sata_ioctl_data_t *ioc, int mode) 16096 { 16097 sata_drive_info_t *sdinfo; 16098 uint32_t info_len; 16099 char ap_info[SATA_ID_MODEL_LEN + 1]; 16100 16101 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, 16102 sata_device->satadev_addr.cport)->cport_mutex); 16103 if (sata_device->satadev_addr.qual == SATA_ADDR_DCPORT) 16104 sdinfo = SATA_CPORT_DRV_INFO(sata_hba_inst, 16105 sata_device->satadev_addr.cport); 16106 else /* port multiplier */ 16107 sdinfo = SATA_PMPORT_DRV_INFO(sata_hba_inst, 16108 sata_device->satadev_addr.cport, 16109 sata_device->satadev_addr.pmport); 16110 if (sdinfo == NULL) { 16111 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, 16112 sata_device->satadev_addr.cport)->cport_mutex); 16113 return (EINVAL); 16114 } 16115 16116 #ifdef _LITTLE_ENDIAN 16117 swab(sdinfo->satadrv_id.ai_model, ap_info, SATA_ID_MODEL_LEN); 16118 #else /* _LITTLE_ENDIAN */ 16119 bcopy(sdinfo->satadrv_id.ai_model, ap_info, SATA_ID_MODEL_LEN); 16120 #endif /* _LITTLE_ENDIAN */ 16121 16122 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, 16123 sata_device->satadev_addr.cport)->cport_mutex); 16124 16125 ap_info[SATA_ID_MODEL_LEN] = '\0'; 16126 16127 info_len = strlen(ap_info) + 1; 16128 16129 if (ioc->get_size) { 16130 if (ddi_copyout((void *)&info_len, ioc->buf, ioc->bufsiz, 16131 mode) != 0) 16132 return (EFAULT); 16133 } else { 16134 if (ioc->bufsiz < info_len) 16135 return (EINVAL); 16136 if (ddi_copyout((void *)ap_info, ioc->buf, ioc->bufsiz, 16137 mode) != 0) 16138 return (EFAULT); 16139 } 16140 return (0); 16141 } 16142 16143 16144 /* 16145 * Process ioctl get device firmware revision info request. 16146 * This operation should return to cfgadm the device firmware revision 16147 * information string 16148 * 16149 * Port multiplier is supported. 16150 */ 16151 static int 16152 sata_ioctl_get_revfirmware_info(sata_hba_inst_t *sata_hba_inst, 16153 sata_device_t *sata_device, sata_ioctl_data_t *ioc, int mode) 16154 { 16155 sata_drive_info_t *sdinfo; 16156 uint32_t info_len; 16157 char ap_info[SATA_ID_FW_LEN + 1]; 16158 16159 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, 16160 sata_device->satadev_addr.cport)->cport_mutex); 16161 if (sata_device->satadev_addr.qual == SATA_ADDR_DCPORT) 16162 sdinfo = SATA_CPORT_DRV_INFO(sata_hba_inst, 16163 sata_device->satadev_addr.cport); 16164 else /* port multiplier */ 16165 sdinfo = SATA_PMPORT_DRV_INFO(sata_hba_inst, 16166 sata_device->satadev_addr.cport, 16167 sata_device->satadev_addr.pmport); 16168 if (sdinfo == NULL) { 16169 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, 16170 sata_device->satadev_addr.cport)->cport_mutex); 16171 return (EINVAL); 16172 } 16173 16174 #ifdef _LITTLE_ENDIAN 16175 swab(sdinfo->satadrv_id.ai_fw, ap_info, SATA_ID_FW_LEN); 16176 #else /* _LITTLE_ENDIAN */ 16177 bcopy(sdinfo->satadrv_id.ai_fw, ap_info, SATA_ID_FW_LEN); 16178 #endif /* _LITTLE_ENDIAN */ 16179 16180 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, 16181 sata_device->satadev_addr.cport)->cport_mutex); 16182 16183 ap_info[SATA_ID_FW_LEN] = '\0'; 16184 16185 info_len = strlen(ap_info) + 1; 16186 16187 if (ioc->get_size) { 16188 if (ddi_copyout((void *)&info_len, ioc->buf, ioc->bufsiz, 16189 mode) != 0) 16190 return (EFAULT); 16191 } else { 16192 if (ioc->bufsiz < info_len) 16193 return (EINVAL); 16194 if (ddi_copyout((void *)ap_info, ioc->buf, ioc->bufsiz, 16195 mode) != 0) 16196 return (EFAULT); 16197 } 16198 return (0); 16199 } 16200 16201 16202 /* 16203 * Process ioctl get device serial number info request. 16204 * This operation should return to cfgadm the device serial number string. 16205 * 16206 * NOTE: Port multiplier is supported. 16207 */ 16208 static int 16209 sata_ioctl_get_serialnumber_info(sata_hba_inst_t *sata_hba_inst, 16210 sata_device_t *sata_device, sata_ioctl_data_t *ioc, int mode) 16211 { 16212 sata_drive_info_t *sdinfo; 16213 uint32_t info_len; 16214 char ap_info[SATA_ID_SERIAL_LEN + 1]; 16215 16216 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, 16217 sata_device->satadev_addr.cport)->cport_mutex); 16218 if (sata_device->satadev_addr.qual == SATA_ADDR_DCPORT) 16219 sdinfo = SATA_CPORT_DRV_INFO(sata_hba_inst, 16220 sata_device->satadev_addr.cport); 16221 else /* port multiplier */ 16222 sdinfo = SATA_PMPORT_DRV_INFO(sata_hba_inst, 16223 sata_device->satadev_addr.cport, 16224 sata_device->satadev_addr.pmport); 16225 if (sdinfo == NULL) { 16226 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, 16227 sata_device->satadev_addr.cport)->cport_mutex); 16228 return (EINVAL); 16229 } 16230 16231 #ifdef _LITTLE_ENDIAN 16232 swab(sdinfo->satadrv_id.ai_drvser, ap_info, SATA_ID_SERIAL_LEN); 16233 #else /* _LITTLE_ENDIAN */ 16234 bcopy(sdinfo->satadrv_id.ai_drvser, ap_info, SATA_ID_SERIAL_LEN); 16235 #endif /* _LITTLE_ENDIAN */ 16236 16237 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, 16238 sata_device->satadev_addr.cport)->cport_mutex); 16239 16240 ap_info[SATA_ID_SERIAL_LEN] = '\0'; 16241 16242 info_len = strlen(ap_info) + 1; 16243 16244 if (ioc->get_size) { 16245 if (ddi_copyout((void *)&info_len, ioc->buf, ioc->bufsiz, 16246 mode) != 0) 16247 return (EFAULT); 16248 } else { 16249 if (ioc->bufsiz < info_len) 16250 return (EINVAL); 16251 if (ddi_copyout((void *)ap_info, ioc->buf, ioc->bufsiz, 16252 mode) != 0) 16253 return (EFAULT); 16254 } 16255 return (0); 16256 } 16257 16258 16259 /* 16260 * Preset scsi extended sense data (to NO SENSE) 16261 * First 18 bytes of the sense data are preset to current valid sense 16262 * with a key NO SENSE data. 16263 * 16264 * Returns void 16265 */ 16266 static void 16267 sata_fixed_sense_data_preset(struct scsi_extended_sense *sense) 16268 { 16269 sense->es_valid = 1; /* Valid sense */ 16270 sense->es_class = CLASS_EXTENDED_SENSE; /* 0x70 - current err */ 16271 sense->es_key = KEY_NO_SENSE; 16272 sense->es_info_1 = 0; 16273 sense->es_info_2 = 0; 16274 sense->es_info_3 = 0; 16275 sense->es_info_4 = 0; 16276 sense->es_add_len = 10; /* Additional length - replace with a def */ 16277 sense->es_cmd_info[0] = 0; 16278 sense->es_cmd_info[1] = 0; 16279 sense->es_cmd_info[2] = 0; 16280 sense->es_cmd_info[3] = 0; 16281 sense->es_add_code = 0; 16282 sense->es_qual_code = 0; 16283 } 16284 16285 /* 16286 * Register a legacy cmdk-style devid for the target (disk) device. 16287 * 16288 * Note: This function is called only when the HBA devinfo node has the 16289 * property "use-cmdk-devid-format" set. This property indicates that 16290 * devid compatible with old cmdk (target) driver is to be generated 16291 * for any target device attached to this controller. This will take 16292 * precedence over the devid generated by sd (target) driver. 16293 * This function is derived from cmdk_devid_setup() function in cmdk.c. 16294 */ 16295 static void 16296 sata_target_devid_register(dev_info_t *dip, sata_drive_info_t *sdinfo) 16297 { 16298 char *hwid; 16299 int modlen; 16300 int serlen; 16301 int rval; 16302 ddi_devid_t devid; 16303 16304 /* 16305 * device ID is a concatanation of model number, "=", serial number. 16306 */ 16307 hwid = kmem_zalloc(LEGACY_HWID_LEN, KM_SLEEP); 16308 bcopy(&sdinfo->satadrv_id.ai_model, hwid, 16309 sizeof (sdinfo->satadrv_id.ai_model)); 16310 swab(hwid, hwid, sizeof (sdinfo->satadrv_id.ai_model)); 16311 modlen = sata_check_modser(hwid, sizeof (sdinfo->satadrv_id.ai_model)); 16312 if (modlen == 0) 16313 goto err; 16314 hwid[modlen++] = '='; 16315 bcopy(&sdinfo->satadrv_id.ai_drvser, &hwid[modlen], 16316 sizeof (sdinfo->satadrv_id.ai_drvser)); 16317 swab(&hwid[modlen], &hwid[modlen], 16318 sizeof (sdinfo->satadrv_id.ai_drvser)); 16319 serlen = sata_check_modser(&hwid[modlen], 16320 sizeof (sdinfo->satadrv_id.ai_drvser)); 16321 if (serlen == 0) 16322 goto err; 16323 hwid[modlen + serlen] = 0; /* terminate the hwid string */ 16324 16325 /* initialize/register devid */ 16326 if ((rval = ddi_devid_init(dip, DEVID_ATA_SERIAL, 16327 (ushort_t)(modlen + serlen), hwid, &devid)) == DDI_SUCCESS) { 16328 rval = ddi_devid_register(dip, devid); 16329 /* 16330 * Free up the allocated devid buffer. 16331 * NOTE: This doesn't mean unregistering devid. 16332 */ 16333 ddi_devid_free(devid); 16334 } 16335 16336 if (rval != DDI_SUCCESS) 16337 cmn_err(CE_WARN, "sata: failed to create devid for the disk" 16338 " on port %d", sdinfo->satadrv_addr.cport); 16339 err: 16340 kmem_free(hwid, LEGACY_HWID_LEN); 16341 } 16342 16343 /* 16344 * valid model/serial string must contain a non-zero non-space characters. 16345 * trim trailing spaces/NULLs. 16346 */ 16347 static int 16348 sata_check_modser(char *buf, int buf_len) 16349 { 16350 boolean_t ret; 16351 char *s; 16352 int i; 16353 int tb; 16354 char ch; 16355 16356 ret = B_FALSE; 16357 s = buf; 16358 for (i = 0; i < buf_len; i++) { 16359 ch = *s++; 16360 if (ch != ' ' && ch != '\0') 16361 tb = i + 1; 16362 if (ch != ' ' && ch != '\0' && ch != '0') 16363 ret = B_TRUE; 16364 } 16365 16366 if (ret == B_FALSE) 16367 return (0); /* invalid string */ 16368 16369 return (tb); /* return length */ 16370 } 16371 16372 /* 16373 * sata_set_drive_features function compares current device features setting 16374 * with the saved device features settings and, if there is a difference, 16375 * it restores device features setting to the previously saved state. 16376 * It also arbitrarily tries to select the highest supported DMA mode. 16377 * Device Identify or Identify Packet Device data has to be current. 16378 * At the moment read ahead and write cache are considered for all devices. 16379 * For atapi devices, Removable Media Status Notification is set in addition 16380 * to common features. 16381 * 16382 * This function cannot be called in the interrupt context (it may sleep). 16383 * 16384 * The input argument sdinfo should point to the drive info structure 16385 * to be updated after features are set. Note, that only 16386 * device (packet) identify data is updated, not the flags indicating the 16387 * supported features. 16388 * 16389 * Returns SATA_SUCCESS if successful or there was nothing to do. 16390 * Device Identify data in the drive info structure pointed to by the sdinfo 16391 * arguments is updated even when no features were set or changed. 16392 * 16393 * Returns SATA_FAILURE if device features could not be set or DMA mode 16394 * for a disk cannot be set and device identify data cannot be fetched. 16395 * 16396 * Returns SATA_RETRY if device features could not be set (other than disk 16397 * DMA mode) but the device identify data was fetched successfully. 16398 * 16399 * Note: This function may fail the port, making it inaccessible. 16400 * In such case the explicit port disconnect/connect or physical device 16401 * detach/attach is required to re-evaluate port state again. 16402 */ 16403 16404 static int 16405 sata_set_drive_features(sata_hba_inst_t *sata_hba_inst, 16406 sata_drive_info_t *sdinfo, int restore) 16407 { 16408 int rval = SATA_SUCCESS; 16409 int rval_set; 16410 sata_drive_info_t new_sdinfo; 16411 char *finfo = "sata_set_drive_features: cannot"; 16412 char *finfox; 16413 int cache_op; 16414 16415 bzero(&new_sdinfo, sizeof (sata_drive_info_t)); 16416 new_sdinfo.satadrv_addr = sdinfo->satadrv_addr; 16417 new_sdinfo.satadrv_type = sdinfo->satadrv_type; 16418 if (sata_fetch_device_identify_data(sata_hba_inst, &new_sdinfo) != 0) { 16419 /* 16420 * Cannot get device identification - caller may retry later 16421 */ 16422 SATADBG1(SATA_DBG_DEV_SETTINGS, sata_hba_inst, 16423 "%s fetch device identify data\n", finfo); 16424 return (SATA_FAILURE); 16425 } 16426 finfox = (restore != 0) ? " restore device features" : 16427 " initialize device features\n"; 16428 16429 switch (sdinfo->satadrv_type) { 16430 case SATA_DTYPE_ATADISK: 16431 /* Arbitrarily set UDMA mode */ 16432 if (sata_set_dma_mode(sata_hba_inst, &new_sdinfo) != 16433 SATA_SUCCESS) { 16434 SATA_LOG_D((sata_hba_inst, CE_WARN, 16435 "%s set UDMA mode\n", finfo)); 16436 return (SATA_FAILURE); 16437 } 16438 break; 16439 case SATA_DTYPE_ATAPICD: 16440 case SATA_DTYPE_ATAPITAPE: 16441 case SATA_DTYPE_ATAPIDISK: 16442 /* Set Removable Media Status Notification, if necessary */ 16443 if (SATA_RM_NOTIFIC_SUPPORTED(new_sdinfo.satadrv_id) && 16444 restore != 0) { 16445 if (((sdinfo->satadrv_settings & SATA_DEV_RMSN) && 16446 (!SATA_RM_NOTIFIC_ENABLED(new_sdinfo.satadrv_id)))|| 16447 ((!(sdinfo->satadrv_settings & SATA_DEV_RMSN)) && 16448 SATA_RM_NOTIFIC_ENABLED(new_sdinfo.satadrv_id))) { 16449 /* Current setting does not match saved one */ 16450 if (sata_set_rmsn(sata_hba_inst, sdinfo, 16451 sdinfo->satadrv_settings & 16452 SATA_DEV_RMSN) != SATA_SUCCESS) 16453 rval = SATA_FAILURE; 16454 } 16455 } 16456 /* 16457 * We have to set Multiword DMA or UDMA, if it is supported, as 16458 * we want to use DMA transfer mode whenever possible. 16459 * Some devices require explicit setting of the DMA mode. 16460 */ 16461 if (new_sdinfo.satadrv_id.ai_cap & SATA_DMA_SUPPORT) { 16462 /* Set highest supported DMA mode */ 16463 if (sata_set_dma_mode(sata_hba_inst, &new_sdinfo) != 16464 SATA_SUCCESS) { 16465 SATA_LOG_D((sata_hba_inst, CE_WARN, 16466 "%s set UDMA mode\n", finfo)); 16467 rval = SATA_FAILURE; 16468 } 16469 } 16470 break; 16471 } 16472 16473 if (!SATA_READ_AHEAD_SUPPORTED(new_sdinfo.satadrv_id) && 16474 !SATA_WRITE_CACHE_SUPPORTED(new_sdinfo.satadrv_id)) { 16475 /* 16476 * neither READ AHEAD nor WRITE CACHE is supported 16477 * - do nothing 16478 */ 16479 SATADBG1(SATA_DBG_DEV_SETTINGS, sata_hba_inst, 16480 "settable features not supported\n", NULL); 16481 goto update_sdinfo; 16482 } 16483 16484 if ((SATA_READ_AHEAD_ENABLED(new_sdinfo.satadrv_id) && 16485 (sdinfo->satadrv_settings & SATA_DEV_READ_AHEAD)) && 16486 (SATA_WRITE_CACHE_ENABLED(new_sdinfo.satadrv_id) && 16487 (sdinfo->satadrv_settings & SATA_DEV_WRITE_CACHE))) { 16488 /* 16489 * both READ AHEAD and WRITE CACHE are enabled 16490 * - Nothing to do 16491 */ 16492 SATADBG1(SATA_DBG_DEV_SETTINGS, sata_hba_inst, 16493 "no device features to set\n", NULL); 16494 goto update_sdinfo; 16495 } 16496 16497 cache_op = 0; 16498 16499 if (SATA_READ_AHEAD_SUPPORTED(new_sdinfo.satadrv_id)) { 16500 if ((sdinfo->satadrv_settings & SATA_DEV_READ_AHEAD) && 16501 !SATA_READ_AHEAD_ENABLED(new_sdinfo.satadrv_id)) { 16502 /* Enable read ahead / read cache */ 16503 cache_op = SATAC_SF_ENABLE_READ_AHEAD; 16504 SATADBG1(SATA_DBG_DEV_SETTINGS, sata_hba_inst, 16505 "enabling read cache\n", NULL); 16506 } else if (!(sdinfo->satadrv_settings & SATA_DEV_READ_AHEAD) && 16507 SATA_READ_AHEAD_ENABLED(new_sdinfo.satadrv_id)) { 16508 /* Disable read ahead / read cache */ 16509 cache_op = SATAC_SF_DISABLE_READ_AHEAD; 16510 SATADBG1(SATA_DBG_DEV_SETTINGS, sata_hba_inst, 16511 "disabling read cache\n", NULL); 16512 } 16513 16514 if (cache_op != 0) { 16515 /* Try to set read cache mode */ 16516 rval_set = sata_set_cache_mode(sata_hba_inst, 16517 &new_sdinfo, cache_op); 16518 if (rval != SATA_FAILURE && rval_set != SATA_SUCCESS) 16519 rval = rval_set; 16520 } 16521 } 16522 16523 cache_op = 0; 16524 16525 if (SATA_WRITE_CACHE_SUPPORTED(new_sdinfo.satadrv_id)) { 16526 if ((sdinfo->satadrv_settings & SATA_DEV_WRITE_CACHE) && 16527 !SATA_WRITE_CACHE_ENABLED(new_sdinfo.satadrv_id)) { 16528 /* Enable write cache */ 16529 cache_op = SATAC_SF_ENABLE_WRITE_CACHE; 16530 SATADBG1(SATA_DBG_DEV_SETTINGS, sata_hba_inst, 16531 "enabling write cache\n", NULL); 16532 } else if (!(sdinfo->satadrv_settings & SATA_DEV_WRITE_CACHE) && 16533 SATA_WRITE_CACHE_ENABLED(new_sdinfo.satadrv_id)) { 16534 /* Disable write cache */ 16535 cache_op = SATAC_SF_DISABLE_WRITE_CACHE; 16536 SATADBG1(SATA_DBG_DEV_SETTINGS, sata_hba_inst, 16537 "disabling write cache\n", NULL); 16538 } 16539 16540 if (cache_op != 0) { 16541 /* Try to set write cache mode */ 16542 rval_set = sata_set_cache_mode(sata_hba_inst, 16543 &new_sdinfo, cache_op); 16544 if (rval != SATA_FAILURE && rval_set != SATA_SUCCESS) 16545 rval = rval_set; 16546 } 16547 } 16548 if (rval != SATA_SUCCESS) 16549 SATA_LOG_D((sata_hba_inst, CE_WARN, 16550 "%s %s", finfo, finfox)); 16551 16552 update_sdinfo: 16553 /* 16554 * We need to fetch Device Identify data again 16555 */ 16556 if (sata_fetch_device_identify_data(sata_hba_inst, &new_sdinfo) != 0) { 16557 /* 16558 * Cannot get device identification - retry later 16559 */ 16560 SATA_LOG_D((sata_hba_inst, CE_WARN, 16561 "%s re-fetch device identify data\n", finfo)); 16562 rval = SATA_FAILURE; 16563 } 16564 /* Copy device sata info. */ 16565 sdinfo->satadrv_id = new_sdinfo.satadrv_id; 16566 16567 return (rval); 16568 } 16569 16570 16571 /* 16572 * 16573 * Returns 1 if threshold exceeded, 0 if threshold not exceeded, -1 if 16574 * unable to determine. 16575 * 16576 * Cannot be called in an interrupt context. 16577 * 16578 * Called by sata_build_lsense_page_2f() 16579 */ 16580 16581 static int 16582 sata_fetch_smart_return_status(sata_hba_inst_t *sata_hba_inst, 16583 sata_drive_info_t *sdinfo) 16584 { 16585 sata_pkt_t *spkt; 16586 sata_cmd_t *scmd; 16587 sata_pkt_txlate_t *spx; 16588 int rval; 16589 16590 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP); 16591 spx->txlt_sata_hba_inst = sata_hba_inst; 16592 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */ 16593 spkt = sata_pkt_alloc(spx, SLEEP_FUNC); 16594 if (spkt == NULL) { 16595 kmem_free(spx, sizeof (sata_pkt_txlate_t)); 16596 return (-1); 16597 } 16598 /* address is needed now */ 16599 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr; 16600 16601 16602 /* Fill sata_pkt */ 16603 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr; 16604 spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS; 16605 /* Synchronous mode, no callback */ 16606 spkt->satapkt_comp = NULL; 16607 /* Timeout 30s */ 16608 spkt->satapkt_time = sata_default_pkt_time; 16609 16610 scmd = &spkt->satapkt_cmd; 16611 scmd->satacmd_flags.sata_special_regs = B_TRUE; 16612 scmd->satacmd_flags.sata_data_direction = SATA_DIR_NODATA_XFER; 16613 16614 /* Set up which registers need to be returned */ 16615 scmd->satacmd_flags.sata_copy_out_lba_mid_lsb = B_TRUE; 16616 scmd->satacmd_flags.sata_copy_out_lba_high_lsb = B_TRUE; 16617 16618 /* Build SMART_RETURN_STATUS cmd in the sata_pkt */ 16619 scmd->satacmd_addr_type = 0; /* N/A */ 16620 scmd->satacmd_sec_count_lsb = 0; /* N/A */ 16621 scmd->satacmd_lba_low_lsb = 0; /* N/A */ 16622 scmd->satacmd_lba_mid_lsb = SMART_MAGIC_VAL_1; 16623 scmd->satacmd_lba_high_lsb = SMART_MAGIC_VAL_2; 16624 scmd->satacmd_features_reg = SATA_SMART_RETURN_STATUS; 16625 scmd->satacmd_device_reg = 0; /* Always device 0 */ 16626 scmd->satacmd_cmd_reg = SATAC_SMART; 16627 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, 16628 sdinfo->satadrv_addr.cport))); 16629 16630 16631 /* Send pkt to SATA HBA driver */ 16632 if ((*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst), spkt) != 16633 SATA_TRAN_ACCEPTED || 16634 spkt->satapkt_reason != SATA_PKT_COMPLETED) { 16635 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, 16636 sdinfo->satadrv_addr.cport))); 16637 /* 16638 * Whoops, no SMART RETURN STATUS 16639 */ 16640 rval = -1; 16641 } else { 16642 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, 16643 sdinfo->satadrv_addr.cport))); 16644 if (scmd->satacmd_error_reg & SATA_ERROR_ABORT) { 16645 rval = -1; 16646 goto fail; 16647 } 16648 if (scmd->satacmd_status_reg & SATA_STATUS_ERR) { 16649 rval = -1; 16650 goto fail; 16651 } 16652 if ((scmd->satacmd_lba_mid_lsb == SMART_MAGIC_VAL_1) && 16653 (scmd->satacmd_lba_high_lsb == SMART_MAGIC_VAL_2)) 16654 rval = 0; 16655 else if ((scmd->satacmd_lba_mid_lsb == SMART_MAGIC_VAL_3) && 16656 (scmd->satacmd_lba_high_lsb == SMART_MAGIC_VAL_4)) 16657 rval = 1; 16658 else { 16659 rval = -1; 16660 goto fail; 16661 } 16662 } 16663 fail: 16664 /* Free allocated resources */ 16665 sata_pkt_free(spx); 16666 kmem_free(spx, sizeof (sata_pkt_txlate_t)); 16667 16668 return (rval); 16669 } 16670 16671 /* 16672 * 16673 * Returns 0 if succeeded, -1 otherwise 16674 * 16675 * Cannot be called in an interrupt context. 16676 * 16677 */ 16678 static int 16679 sata_fetch_smart_data( 16680 sata_hba_inst_t *sata_hba_inst, 16681 sata_drive_info_t *sdinfo, 16682 struct smart_data *smart_data) 16683 { 16684 sata_pkt_t *spkt; 16685 sata_cmd_t *scmd; 16686 sata_pkt_txlate_t *spx; 16687 int rval; 16688 dev_info_t *dip = SATA_DIP(sata_hba_inst); 16689 16690 #if ! defined(lint) 16691 ASSERT(sizeof (struct smart_data) == 512); 16692 #endif 16693 16694 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP); 16695 spx->txlt_sata_hba_inst = sata_hba_inst; 16696 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */ 16697 spkt = sata_pkt_alloc(spx, SLEEP_FUNC); 16698 if (spkt == NULL) { 16699 kmem_free(spx, sizeof (sata_pkt_txlate_t)); 16700 return (-1); 16701 } 16702 /* address is needed now */ 16703 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr; 16704 16705 16706 /* Fill sata_pkt */ 16707 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr; 16708 spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS; 16709 /* Synchronous mode, no callback */ 16710 spkt->satapkt_comp = NULL; 16711 /* Timeout 30s */ 16712 spkt->satapkt_time = sata_default_pkt_time; 16713 16714 scmd = &spkt->satapkt_cmd; 16715 scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ; 16716 16717 /* 16718 * Allocate buffer for SMART data 16719 */ 16720 scmd->satacmd_bp = sata_alloc_local_buffer(spx, 16721 sizeof (struct smart_data)); 16722 if (scmd->satacmd_bp == NULL) { 16723 sata_pkt_free(spx); 16724 kmem_free(spx, sizeof (sata_pkt_txlate_t)); 16725 SATA_LOG_D((sata_hba_inst, CE_WARN, 16726 "sata_fetch_smart_data: " 16727 "cannot allocate buffer")); 16728 return (-1); 16729 } 16730 16731 16732 /* Build SMART_READ_DATA cmd in the sata_pkt */ 16733 scmd->satacmd_addr_type = 0; /* N/A */ 16734 scmd->satacmd_sec_count_lsb = 0; /* N/A */ 16735 scmd->satacmd_lba_low_lsb = 0; /* N/A */ 16736 scmd->satacmd_lba_mid_lsb = SMART_MAGIC_VAL_1; 16737 scmd->satacmd_lba_high_lsb = SMART_MAGIC_VAL_2; 16738 scmd->satacmd_features_reg = SATA_SMART_READ_DATA; 16739 scmd->satacmd_device_reg = 0; /* Always device 0 */ 16740 scmd->satacmd_cmd_reg = SATAC_SMART; 16741 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, 16742 sdinfo->satadrv_addr.cport))); 16743 16744 /* Send pkt to SATA HBA driver */ 16745 if ((*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst), spkt) != 16746 SATA_TRAN_ACCEPTED || 16747 spkt->satapkt_reason != SATA_PKT_COMPLETED) { 16748 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, 16749 sdinfo->satadrv_addr.cport))); 16750 /* 16751 * Whoops, no SMART DATA available 16752 */ 16753 rval = -1; 16754 goto fail; 16755 } else { 16756 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, 16757 sdinfo->satadrv_addr.cport))); 16758 if (spx->txlt_buf_dma_handle != NULL) { 16759 rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0, 16760 DDI_DMA_SYNC_FORKERNEL); 16761 ASSERT(rval == DDI_SUCCESS); 16762 if (sata_check_for_dma_error(dip, spx)) { 16763 ddi_fm_service_impact(dip, 16764 DDI_SERVICE_UNAFFECTED); 16765 rval = -1; 16766 goto fail; 16767 } 16768 } 16769 bcopy(scmd->satacmd_bp->b_un.b_addr, (uint8_t *)smart_data, 16770 sizeof (struct smart_data)); 16771 } 16772 16773 fail: 16774 /* Free allocated resources */ 16775 sata_free_local_buffer(spx); 16776 sata_pkt_free(spx); 16777 kmem_free(spx, sizeof (sata_pkt_txlate_t)); 16778 16779 return (rval); 16780 } 16781 16782 /* 16783 * Used by LOG SENSE page 0x10 16784 * Reads (in synchronous mode) the self test log data using Read Log Ext cmd. 16785 * Note: cannot be called in the interrupt context. 16786 * 16787 * return 0 for success, -1 otherwise 16788 * 16789 */ 16790 static int 16791 sata_ext_smart_selftest_read_log( 16792 sata_hba_inst_t *sata_hba_inst, 16793 sata_drive_info_t *sdinfo, 16794 struct smart_ext_selftest_log *ext_selftest_log, 16795 uint16_t block_num) 16796 { 16797 sata_pkt_txlate_t *spx; 16798 sata_pkt_t *spkt; 16799 sata_cmd_t *scmd; 16800 int rval; 16801 dev_info_t *dip = SATA_DIP(sata_hba_inst); 16802 16803 #if ! defined(lint) 16804 ASSERT(sizeof (struct smart_ext_selftest_log) == 512); 16805 #endif 16806 16807 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP); 16808 spx->txlt_sata_hba_inst = sata_hba_inst; 16809 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */ 16810 spkt = sata_pkt_alloc(spx, SLEEP_FUNC); 16811 if (spkt == NULL) { 16812 kmem_free(spx, sizeof (sata_pkt_txlate_t)); 16813 return (-1); 16814 } 16815 /* address is needed now */ 16816 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr; 16817 16818 16819 /* Fill sata_pkt */ 16820 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr; 16821 spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS; 16822 /* Synchronous mode, no callback */ 16823 spkt->satapkt_comp = NULL; 16824 /* Timeout 30s */ 16825 spkt->satapkt_time = sata_default_pkt_time; 16826 16827 scmd = &spkt->satapkt_cmd; 16828 scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ; 16829 16830 /* 16831 * Allocate buffer for SMART extended self-test log 16832 */ 16833 scmd->satacmd_bp = sata_alloc_local_buffer(spx, 16834 sizeof (struct smart_ext_selftest_log)); 16835 if (scmd->satacmd_bp == NULL) { 16836 sata_pkt_free(spx); 16837 kmem_free(spx, sizeof (sata_pkt_txlate_t)); 16838 SATA_LOG_D((sata_hba_inst, CE_WARN, 16839 "sata_ext_smart_selftest_log: " 16840 "cannot allocate buffer")); 16841 return (-1); 16842 } 16843 16844 /* Build READ LOG EXT w/ extended self-test log cmd in the sata_pkt */ 16845 scmd->satacmd_addr_type = ATA_ADDR_LBA48; 16846 scmd->satacmd_sec_count_lsb = 1; /* One sector of selftest log */ 16847 scmd->satacmd_sec_count_msb = 0; /* One sector of selftest log */ 16848 scmd->satacmd_lba_low_lsb = EXT_SMART_SELFTEST_LOG_PAGE; 16849 scmd->satacmd_lba_low_msb = 0; 16850 scmd->satacmd_lba_mid_lsb = block_num & 0xff; 16851 scmd->satacmd_lba_mid_msb = block_num >> 8; 16852 scmd->satacmd_device_reg = 0; /* Always device 0 */ 16853 scmd->satacmd_cmd_reg = SATAC_READ_LOG_EXT; 16854 16855 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, 16856 sdinfo->satadrv_addr.cport))); 16857 16858 /* Send pkt to SATA HBA driver */ 16859 if ((*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst), spkt) != 16860 SATA_TRAN_ACCEPTED || 16861 spkt->satapkt_reason != SATA_PKT_COMPLETED) { 16862 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, 16863 sdinfo->satadrv_addr.cport))); 16864 16865 /* 16866 * Whoops, no SMART selftest log info available 16867 */ 16868 rval = -1; 16869 goto fail; 16870 } else { 16871 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, 16872 sdinfo->satadrv_addr.cport))); 16873 16874 if (spx->txlt_buf_dma_handle != NULL) { 16875 rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0, 16876 DDI_DMA_SYNC_FORKERNEL); 16877 ASSERT(rval == DDI_SUCCESS); 16878 if (sata_check_for_dma_error(dip, spx)) { 16879 ddi_fm_service_impact(dip, 16880 DDI_SERVICE_UNAFFECTED); 16881 rval = -1; 16882 goto fail; 16883 } 16884 } 16885 bcopy(scmd->satacmd_bp->b_un.b_addr, 16886 (uint8_t *)ext_selftest_log, 16887 sizeof (struct smart_ext_selftest_log)); 16888 rval = 0; 16889 } 16890 16891 fail: 16892 /* Free allocated resources */ 16893 sata_free_local_buffer(spx); 16894 sata_pkt_free(spx); 16895 kmem_free(spx, sizeof (sata_pkt_txlate_t)); 16896 16897 return (rval); 16898 } 16899 16900 /* 16901 * Returns 0 for success, -1 otherwise 16902 * 16903 * SMART self-test log data is returned in buffer pointed to by selftest_log 16904 */ 16905 static int 16906 sata_smart_selftest_log( 16907 sata_hba_inst_t *sata_hba_inst, 16908 sata_drive_info_t *sdinfo, 16909 struct smart_selftest_log *selftest_log) 16910 { 16911 sata_pkt_t *spkt; 16912 sata_cmd_t *scmd; 16913 sata_pkt_txlate_t *spx; 16914 int rval; 16915 dev_info_t *dip = SATA_DIP(sata_hba_inst); 16916 16917 #if ! defined(lint) 16918 ASSERT(sizeof (struct smart_selftest_log) == 512); 16919 #endif 16920 16921 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP); 16922 spx->txlt_sata_hba_inst = sata_hba_inst; 16923 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */ 16924 spkt = sata_pkt_alloc(spx, SLEEP_FUNC); 16925 if (spkt == NULL) { 16926 kmem_free(spx, sizeof (sata_pkt_txlate_t)); 16927 return (-1); 16928 } 16929 /* address is needed now */ 16930 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr; 16931 16932 16933 /* Fill sata_pkt */ 16934 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr; 16935 spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS; 16936 /* Synchronous mode, no callback */ 16937 spkt->satapkt_comp = NULL; 16938 /* Timeout 30s */ 16939 spkt->satapkt_time = sata_default_pkt_time; 16940 16941 scmd = &spkt->satapkt_cmd; 16942 scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ; 16943 16944 /* 16945 * Allocate buffer for SMART SELFTEST LOG 16946 */ 16947 scmd->satacmd_bp = sata_alloc_local_buffer(spx, 16948 sizeof (struct smart_selftest_log)); 16949 if (scmd->satacmd_bp == NULL) { 16950 sata_pkt_free(spx); 16951 kmem_free(spx, sizeof (sata_pkt_txlate_t)); 16952 SATA_LOG_D((sata_hba_inst, CE_WARN, 16953 "sata_smart_selftest_log: " 16954 "cannot allocate buffer")); 16955 return (-1); 16956 } 16957 16958 /* Build SMART_READ_LOG cmd in the sata_pkt */ 16959 scmd->satacmd_addr_type = 0; /* N/A */ 16960 scmd->satacmd_sec_count_lsb = 1; /* One sector of SMART log */ 16961 scmd->satacmd_lba_low_lsb = SMART_SELFTEST_LOG_PAGE; 16962 scmd->satacmd_lba_mid_lsb = SMART_MAGIC_VAL_1; 16963 scmd->satacmd_lba_high_lsb = SMART_MAGIC_VAL_2; 16964 scmd->satacmd_features_reg = SATA_SMART_READ_LOG; 16965 scmd->satacmd_device_reg = 0; /* Always device 0 */ 16966 scmd->satacmd_cmd_reg = SATAC_SMART; 16967 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, 16968 sdinfo->satadrv_addr.cport))); 16969 16970 /* Send pkt to SATA HBA driver */ 16971 if ((*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst), spkt) != 16972 SATA_TRAN_ACCEPTED || 16973 spkt->satapkt_reason != SATA_PKT_COMPLETED) { 16974 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, 16975 sdinfo->satadrv_addr.cport))); 16976 /* 16977 * Whoops, no SMART DATA available 16978 */ 16979 rval = -1; 16980 goto fail; 16981 } else { 16982 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, 16983 sdinfo->satadrv_addr.cport))); 16984 if (spx->txlt_buf_dma_handle != NULL) { 16985 rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0, 16986 DDI_DMA_SYNC_FORKERNEL); 16987 ASSERT(rval == DDI_SUCCESS); 16988 if (sata_check_for_dma_error(dip, spx)) { 16989 ddi_fm_service_impact(dip, 16990 DDI_SERVICE_UNAFFECTED); 16991 rval = -1; 16992 goto fail; 16993 } 16994 } 16995 bcopy(scmd->satacmd_bp->b_un.b_addr, (uint8_t *)selftest_log, 16996 sizeof (struct smart_selftest_log)); 16997 rval = 0; 16998 } 16999 17000 fail: 17001 /* Free allocated resources */ 17002 sata_free_local_buffer(spx); 17003 sata_pkt_free(spx); 17004 kmem_free(spx, sizeof (sata_pkt_txlate_t)); 17005 17006 return (rval); 17007 } 17008 17009 17010 /* 17011 * Returns 0 for success, -1 otherwise 17012 * 17013 * SMART READ LOG data is returned in buffer pointed to by smart_log 17014 */ 17015 static int 17016 sata_smart_read_log( 17017 sata_hba_inst_t *sata_hba_inst, 17018 sata_drive_info_t *sdinfo, 17019 uint8_t *smart_log, /* where the data should be returned */ 17020 uint8_t which_log, /* which log should be returned */ 17021 uint8_t log_size) /* # of 512 bytes in log */ 17022 { 17023 sata_pkt_t *spkt; 17024 sata_cmd_t *scmd; 17025 sata_pkt_txlate_t *spx; 17026 int rval; 17027 dev_info_t *dip = SATA_DIP(sata_hba_inst); 17028 17029 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP); 17030 spx->txlt_sata_hba_inst = sata_hba_inst; 17031 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */ 17032 spkt = sata_pkt_alloc(spx, SLEEP_FUNC); 17033 if (spkt == NULL) { 17034 kmem_free(spx, sizeof (sata_pkt_txlate_t)); 17035 return (-1); 17036 } 17037 /* address is needed now */ 17038 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr; 17039 17040 17041 /* Fill sata_pkt */ 17042 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr; 17043 spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS; 17044 /* Synchronous mode, no callback */ 17045 spkt->satapkt_comp = NULL; 17046 /* Timeout 30s */ 17047 spkt->satapkt_time = sata_default_pkt_time; 17048 17049 scmd = &spkt->satapkt_cmd; 17050 scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ; 17051 17052 /* 17053 * Allocate buffer for SMART READ LOG 17054 */ 17055 scmd->satacmd_bp = sata_alloc_local_buffer(spx, log_size * 512); 17056 if (scmd->satacmd_bp == NULL) { 17057 sata_pkt_free(spx); 17058 kmem_free(spx, sizeof (sata_pkt_txlate_t)); 17059 SATA_LOG_D((sata_hba_inst, CE_WARN, 17060 "sata_smart_read_log: " "cannot allocate buffer")); 17061 return (-1); 17062 } 17063 17064 /* Build SMART_READ_LOG cmd in the sata_pkt */ 17065 scmd->satacmd_addr_type = 0; /* N/A */ 17066 scmd->satacmd_sec_count_lsb = log_size; /* what the caller asked for */ 17067 scmd->satacmd_lba_low_lsb = which_log; /* which log page */ 17068 scmd->satacmd_lba_mid_lsb = SMART_MAGIC_VAL_1; 17069 scmd->satacmd_lba_high_lsb = SMART_MAGIC_VAL_2; 17070 scmd->satacmd_features_reg = SATA_SMART_READ_LOG; 17071 scmd->satacmd_device_reg = 0; /* Always device 0 */ 17072 scmd->satacmd_cmd_reg = SATAC_SMART; 17073 17074 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, 17075 sdinfo->satadrv_addr.cport))); 17076 17077 /* Send pkt to SATA HBA driver */ 17078 if ((*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst), spkt) != 17079 SATA_TRAN_ACCEPTED || 17080 spkt->satapkt_reason != SATA_PKT_COMPLETED) { 17081 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, 17082 sdinfo->satadrv_addr.cport))); 17083 17084 /* 17085 * Whoops, no SMART DATA available 17086 */ 17087 rval = -1; 17088 goto fail; 17089 } else { 17090 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, 17091 sdinfo->satadrv_addr.cport))); 17092 17093 if (spx->txlt_buf_dma_handle != NULL) { 17094 rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0, 17095 DDI_DMA_SYNC_FORKERNEL); 17096 ASSERT(rval == DDI_SUCCESS); 17097 if (sata_check_for_dma_error(dip, spx)) { 17098 ddi_fm_service_impact(dip, 17099 DDI_SERVICE_UNAFFECTED); 17100 rval = -1; 17101 goto fail; 17102 } 17103 } 17104 bcopy(scmd->satacmd_bp->b_un.b_addr, smart_log, log_size * 512); 17105 rval = 0; 17106 } 17107 17108 fail: 17109 /* Free allocated resources */ 17110 sata_free_local_buffer(spx); 17111 sata_pkt_free(spx); 17112 kmem_free(spx, sizeof (sata_pkt_txlate_t)); 17113 17114 return (rval); 17115 } 17116 17117 /* 17118 * Used by LOG SENSE page 0x10 17119 * 17120 * return 0 for success, -1 otherwise 17121 * 17122 */ 17123 static int 17124 sata_read_log_ext_directory( 17125 sata_hba_inst_t *sata_hba_inst, 17126 sata_drive_info_t *sdinfo, 17127 struct read_log_ext_directory *logdir) 17128 { 17129 sata_pkt_txlate_t *spx; 17130 sata_pkt_t *spkt; 17131 sata_cmd_t *scmd; 17132 int rval; 17133 dev_info_t *dip = SATA_DIP(sata_hba_inst); 17134 17135 #if ! defined(lint) 17136 ASSERT(sizeof (struct read_log_ext_directory) == 512); 17137 #endif 17138 17139 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP); 17140 spx->txlt_sata_hba_inst = sata_hba_inst; 17141 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */ 17142 spkt = sata_pkt_alloc(spx, SLEEP_FUNC); 17143 if (spkt == NULL) { 17144 kmem_free(spx, sizeof (sata_pkt_txlate_t)); 17145 return (-1); 17146 } 17147 17148 /* Fill sata_pkt */ 17149 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr; 17150 spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS; 17151 /* Synchronous mode, no callback */ 17152 spkt->satapkt_comp = NULL; 17153 /* Timeout 30s */ 17154 spkt->satapkt_time = sata_default_pkt_time; 17155 17156 scmd = &spkt->satapkt_cmd; 17157 scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ; 17158 17159 /* 17160 * Allocate buffer for SMART READ LOG EXTENDED command 17161 */ 17162 scmd->satacmd_bp = sata_alloc_local_buffer(spx, 17163 sizeof (struct read_log_ext_directory)); 17164 if (scmd->satacmd_bp == NULL) { 17165 sata_pkt_free(spx); 17166 kmem_free(spx, sizeof (sata_pkt_txlate_t)); 17167 SATA_LOG_D((sata_hba_inst, CE_WARN, 17168 "sata_read_log_ext_directory: " 17169 "cannot allocate buffer")); 17170 return (-1); 17171 } 17172 17173 /* Build READ LOG EXT w/ log directory cmd in the sata_pkt */ 17174 scmd->satacmd_addr_type = ATA_ADDR_LBA48; 17175 scmd->satacmd_sec_count_lsb = 1; /* One sector of directory */ 17176 scmd->satacmd_sec_count_msb = 0; /* One sector of directory */ 17177 scmd->satacmd_lba_low_lsb = READ_LOG_EXT_LOG_DIRECTORY; 17178 scmd->satacmd_lba_low_msb = 0; 17179 scmd->satacmd_lba_mid_lsb = 0; 17180 scmd->satacmd_lba_mid_msb = 0; 17181 scmd->satacmd_device_reg = 0; /* Always device 0 */ 17182 scmd->satacmd_cmd_reg = SATAC_READ_LOG_EXT; 17183 17184 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, 17185 sdinfo->satadrv_addr.cport))); 17186 17187 /* Send pkt to SATA HBA driver */ 17188 if ((*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst), spkt) != 17189 SATA_TRAN_ACCEPTED || 17190 spkt->satapkt_reason != SATA_PKT_COMPLETED) { 17191 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, 17192 sdinfo->satadrv_addr.cport))); 17193 /* 17194 * Whoops, no SMART selftest log info available 17195 */ 17196 rval = -1; 17197 goto fail; 17198 } else { 17199 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, 17200 sdinfo->satadrv_addr.cport))); 17201 if (spx->txlt_buf_dma_handle != NULL) { 17202 rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0, 17203 DDI_DMA_SYNC_FORKERNEL); 17204 ASSERT(rval == DDI_SUCCESS); 17205 if (sata_check_for_dma_error(dip, spx)) { 17206 ddi_fm_service_impact(dip, 17207 DDI_SERVICE_UNAFFECTED); 17208 rval = -1; 17209 goto fail; 17210 } 17211 } 17212 bcopy(scmd->satacmd_bp->b_un.b_addr, (uint8_t *)logdir, 17213 sizeof (struct read_log_ext_directory)); 17214 rval = 0; 17215 } 17216 17217 fail: 17218 /* Free allocated resources */ 17219 sata_free_local_buffer(spx); 17220 sata_pkt_free(spx); 17221 kmem_free(spx, sizeof (sata_pkt_txlate_t)); 17222 17223 return (rval); 17224 } 17225 17226 /* 17227 * Set up error retrieval sata command for NCQ command error data 17228 * recovery. 17229 * 17230 * Returns SATA_SUCCESS when data buffer is allocated and packet set-up, 17231 * returns SATA_FAILURE otherwise. 17232 */ 17233 static int 17234 sata_ncq_err_ret_cmd_setup(sata_pkt_txlate_t *spx, sata_drive_info_t *sdinfo) 17235 { 17236 #ifndef __lock_lint 17237 _NOTE(ARGUNUSED(sdinfo)) 17238 #endif 17239 17240 sata_pkt_t *spkt = spx->txlt_sata_pkt; 17241 sata_cmd_t *scmd; 17242 struct buf *bp; 17243 17244 /* Operation modes are up to the caller */ 17245 spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS; 17246 17247 /* Synchronous mode, no callback - may be changed by the caller */ 17248 spkt->satapkt_comp = NULL; 17249 spkt->satapkt_time = sata_default_pkt_time; 17250 17251 scmd = &spkt->satapkt_cmd; 17252 bcopy(&sata_rle_cmd, scmd, sizeof (sata_cmd_t)); 17253 scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE; 17254 17255 /* 17256 * Allocate dma_able buffer error data. 17257 * Buffer allocation will take care of buffer alignment and other DMA 17258 * attributes. 17259 */ 17260 bp = sata_alloc_local_buffer(spx, 17261 sizeof (struct sata_ncq_error_recovery_page)); 17262 if (bp == NULL) 17263 return (SATA_FAILURE); 17264 17265 bp_mapin(bp); /* make data buffer accessible */ 17266 scmd->satacmd_bp = bp; 17267 17268 /* 17269 * Set-up pointer to the buffer handle, so HBA can sync buffer 17270 * before accessing it. Handle is in usual place in translate struct. 17271 */ 17272 scmd->satacmd_err_ret_buf_handle = &spx->txlt_buf_dma_handle; 17273 17274 ASSERT(scmd->satacmd_num_dma_cookies != 0); 17275 ASSERT(scmd->satacmd_dma_cookie_list != NULL); 17276 17277 return (SATA_SUCCESS); 17278 } 17279 17280 /* 17281 * sata_xlate_errors() is used to translate (S)ATA error 17282 * information to SCSI information returned in the SCSI 17283 * packet. 17284 */ 17285 static void 17286 sata_xlate_errors(sata_pkt_txlate_t *spx) 17287 { 17288 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt; 17289 struct scsi_extended_sense *sense; 17290 17291 scsipkt->pkt_reason = CMD_INCOMPLETE; 17292 *scsipkt->pkt_scbp = STATUS_CHECK; 17293 sense = sata_arq_sense(spx); 17294 17295 switch (spx->txlt_sata_pkt->satapkt_reason) { 17296 case SATA_PKT_PORT_ERROR: 17297 /* 17298 * We have no device data. Assume no data transfered. 17299 */ 17300 sense->es_key = KEY_HARDWARE_ERROR; 17301 break; 17302 17303 case SATA_PKT_DEV_ERROR: 17304 if (spx->txlt_sata_pkt->satapkt_cmd.satacmd_status_reg & 17305 SATA_STATUS_ERR) { 17306 /* 17307 * determine dev error reason from error 17308 * reg content 17309 */ 17310 sata_decode_device_error(spx, sense); 17311 break; 17312 } 17313 /* No extended sense key - no info available */ 17314 break; 17315 17316 case SATA_PKT_TIMEOUT: 17317 scsipkt->pkt_reason = CMD_TIMEOUT; 17318 scsipkt->pkt_statistics |= STAT_TIMEOUT | STAT_DEV_RESET; 17319 /* No extended sense key */ 17320 break; 17321 17322 case SATA_PKT_ABORTED: 17323 scsipkt->pkt_reason = CMD_ABORTED; 17324 scsipkt->pkt_statistics |= STAT_ABORTED; 17325 /* No extended sense key */ 17326 break; 17327 17328 case SATA_PKT_RESET: 17329 /* 17330 * pkt aborted either by an explicit reset request from 17331 * a host, or due to error recovery 17332 */ 17333 scsipkt->pkt_reason = CMD_RESET; 17334 scsipkt->pkt_statistics |= STAT_DEV_RESET; 17335 break; 17336 17337 default: 17338 scsipkt->pkt_reason = CMD_TRAN_ERR; 17339 break; 17340 } 17341 } 17342 17343 17344 17345 17346 /* 17347 * Log sata message 17348 * dev pathname msg line preceeds the logged message. 17349 */ 17350 17351 static void 17352 sata_log(sata_hba_inst_t *sata_hba_inst, uint_t level, char *fmt, ...) 17353 { 17354 char pathname[128]; 17355 dev_info_t *dip = NULL; 17356 va_list ap; 17357 17358 mutex_enter(&sata_log_mutex); 17359 17360 va_start(ap, fmt); 17361 (void) vsprintf(sata_log_buf, fmt, ap); 17362 va_end(ap); 17363 17364 if (sata_hba_inst != NULL) { 17365 dip = SATA_DIP(sata_hba_inst); 17366 (void) ddi_pathname(dip, pathname); 17367 } else { 17368 pathname[0] = 0; 17369 } 17370 if (level == CE_CONT) { 17371 if (sata_debug_flags == 0) 17372 cmn_err(level, "?%s:\n %s\n", pathname, sata_log_buf); 17373 else 17374 cmn_err(level, "%s:\n %s\n", pathname, sata_log_buf); 17375 } else { 17376 if (level != CE_NOTE) { 17377 cmn_err(level, "%s:\n %s", pathname, sata_log_buf); 17378 } else if (sata_msg) { 17379 cmn_err(level, "%s:\n %s", pathname, 17380 sata_log_buf); 17381 } 17382 } 17383 17384 /* sata trace debug */ 17385 sata_trace_debug(dip, sata_log_buf); 17386 17387 mutex_exit(&sata_log_mutex); 17388 } 17389 17390 17391 /* ******** Asynchronous HBA events handling & hotplugging support ******** */ 17392 17393 /* 17394 * Start or terminate the thread, depending on flag arg and current state 17395 */ 17396 static void 17397 sata_event_thread_control(int startstop) 17398 { 17399 static int sata_event_thread_terminating = 0; 17400 static int sata_event_thread_starting = 0; 17401 int i; 17402 17403 mutex_enter(&sata_event_mutex); 17404 17405 if (startstop == 0 && (sata_event_thread_starting == 1 || 17406 sata_event_thread_terminating == 1)) { 17407 mutex_exit(&sata_event_mutex); 17408 return; 17409 } 17410 if (startstop == 1 && sata_event_thread_starting == 1) { 17411 mutex_exit(&sata_event_mutex); 17412 return; 17413 } 17414 if (startstop == 1 && sata_event_thread_terminating == 1) { 17415 sata_event_thread_starting = 1; 17416 /* wait til terminate operation completes */ 17417 i = SATA_EVNT_DAEMON_TERM_WAIT/SATA_EVNT_DAEMON_TERM_TIMEOUT; 17418 while (sata_event_thread_terminating == 1) { 17419 if (i-- <= 0) { 17420 sata_event_thread_starting = 0; 17421 mutex_exit(&sata_event_mutex); 17422 #ifdef SATA_DEBUG 17423 cmn_err(CE_WARN, "sata_event_thread_control: " 17424 "timeout waiting for thread to terminate"); 17425 #endif 17426 return; 17427 } 17428 mutex_exit(&sata_event_mutex); 17429 delay(drv_usectohz(SATA_EVNT_DAEMON_TERM_TIMEOUT)); 17430 mutex_enter(&sata_event_mutex); 17431 } 17432 } 17433 if (startstop == 1) { 17434 if (sata_event_thread == NULL) { 17435 sata_event_thread = thread_create(NULL, 0, 17436 (void (*)())sata_event_daemon, 17437 &sata_hba_list, 0, &p0, TS_RUN, minclsyspri); 17438 } 17439 sata_event_thread_starting = 0; 17440 mutex_exit(&sata_event_mutex); 17441 return; 17442 } 17443 17444 /* 17445 * If we got here, thread may need to be terminated 17446 */ 17447 if (sata_event_thread != NULL) { 17448 int i; 17449 /* Signal event thread to go away */ 17450 sata_event_thread_terminating = 1; 17451 sata_event_thread_terminate = 1; 17452 cv_signal(&sata_event_cv); 17453 /* 17454 * Wait til daemon terminates. 17455 */ 17456 i = SATA_EVNT_DAEMON_TERM_WAIT/SATA_EVNT_DAEMON_TERM_TIMEOUT; 17457 while (sata_event_thread_terminate == 1) { 17458 mutex_exit(&sata_event_mutex); 17459 if (i-- <= 0) { 17460 /* Daemon did not go away !!! */ 17461 #ifdef SATA_DEBUG 17462 cmn_err(CE_WARN, "sata_event_thread_control: " 17463 "cannot terminate event daemon thread"); 17464 #endif 17465 mutex_enter(&sata_event_mutex); 17466 break; 17467 } 17468 delay(drv_usectohz(SATA_EVNT_DAEMON_TERM_TIMEOUT)); 17469 mutex_enter(&sata_event_mutex); 17470 } 17471 sata_event_thread_terminating = 0; 17472 } 17473 ASSERT(sata_event_thread_terminating == 0); 17474 ASSERT(sata_event_thread_starting == 0); 17475 mutex_exit(&sata_event_mutex); 17476 } 17477 17478 17479 /* 17480 * SATA HBA event notification function. 17481 * Events reported by SATA HBA drivers per HBA instance relate to a change in 17482 * a port and/or device state or a controller itself. 17483 * Events for different addresses/addr types cannot be combined. 17484 * A warning message is generated for each event type. 17485 * Events are not processed by this function, so only the 17486 * event flag(s)is set for an affected entity and the event thread is 17487 * waken up. Event daemon thread processes all events. 17488 * 17489 * NOTE: Since more than one event may be reported at the same time, one 17490 * cannot determine a sequence of events when opposite event are reported, eg. 17491 * LINK_LOST and LINK_ESTABLISHED. Actual port status during event processing 17492 * is taking precedence over reported events, i.e. may cause ignoring some 17493 * events. 17494 */ 17495 #define SATA_EVENT_MAX_MSG_LENGTH 79 17496 17497 void 17498 sata_hba_event_notify(dev_info_t *dip, sata_device_t *sata_device, int event) 17499 { 17500 sata_hba_inst_t *sata_hba_inst = NULL; 17501 sata_address_t *saddr; 17502 sata_pmult_info_t *pmultinfo; 17503 sata_drive_info_t *sdinfo; 17504 sata_port_stats_t *pstats; 17505 sata_cport_info_t *cportinfo; 17506 sata_pmport_info_t *pmportinfo; 17507 int cport, pmport; 17508 char buf1[SATA_EVENT_MAX_MSG_LENGTH + 1]; 17509 char buf2[SATA_EVENT_MAX_MSG_LENGTH + 1]; 17510 char *lcp; 17511 static char *err_msg_evnt_1 = 17512 "sata_hba_event_notify: invalid port event 0x%x "; 17513 static char *err_msg_evnt_2 = 17514 "sata_hba_event_notify: invalid device event 0x%x "; 17515 int linkevent; 17516 17517 /* 17518 * There is a possibility that an event will be generated on HBA 17519 * that has not completed attachment or is detaching. We still want 17520 * to process events until HBA is detached. 17521 */ 17522 mutex_enter(&sata_mutex); 17523 for (sata_hba_inst = sata_hba_list; sata_hba_inst != NULL; 17524 sata_hba_inst = sata_hba_inst->satahba_next) { 17525 if (SATA_DIP(sata_hba_inst) == dip) 17526 if (sata_hba_inst->satahba_attached == 1) 17527 break; 17528 } 17529 mutex_exit(&sata_mutex); 17530 if (sata_hba_inst == NULL) 17531 /* HBA not attached */ 17532 return; 17533 17534 ASSERT(sata_device != NULL); 17535 17536 /* 17537 * Validate address before - do not proceed with invalid address. 17538 */ 17539 saddr = &sata_device->satadev_addr; 17540 if (saddr->cport >= SATA_NUM_CPORTS(sata_hba_inst)) 17541 return; 17542 17543 cport = saddr->cport; 17544 pmport = saddr->pmport; 17545 17546 buf1[0] = buf2[0] = '\0'; 17547 17548 /* 17549 * If event relates to port or device, check port state. 17550 * Port has to be initialized, or we cannot accept an event. 17551 */ 17552 if ((saddr->qual & (SATA_ADDR_CPORT | SATA_ADDR_PMPORT | 17553 SATA_ADDR_DCPORT | SATA_ADDR_DPMPORT | SATA_ADDR_PMULT)) != 0) { 17554 mutex_enter(&sata_hba_inst->satahba_mutex); 17555 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport); 17556 mutex_exit(&sata_hba_inst->satahba_mutex); 17557 if (cportinfo == NULL || cportinfo->cport_state == 0) 17558 return; 17559 } 17560 17561 if ((saddr->qual & (SATA_ADDR_PMULT | SATA_ADDR_PMPORT | 17562 SATA_ADDR_DPMPORT)) != 0) { 17563 if (cportinfo->cport_dev_type != SATA_DTYPE_PMULT) { 17564 SATA_LOG_D((sata_hba_inst, CE_WARN, 17565 "sata_hba_event_notify: Non-pmult device (0x%x)" 17566 "is attached to port %d, ignore pmult/pmport " 17567 "event 0x%x", cportinfo->cport_dev_type, 17568 cport, event)); 17569 return; 17570 } 17571 17572 mutex_enter(&cportinfo->cport_mutex); 17573 pmultinfo = SATA_PMULT_INFO(sata_hba_inst, cport); 17574 mutex_exit(&cportinfo->cport_mutex); 17575 17576 /* 17577 * The daemon might be processing attachment of port 17578 * multiplier, in that case we should ignore events on its 17579 * sub-devices. 17580 * 17581 * NOTE: Only pmult_state is checked in sata_hba_event_notify. 17582 * The pmport_state is checked by sata daemon. 17583 */ 17584 if (pmultinfo == NULL || 17585 pmultinfo->pmult_state == SATA_STATE_UNKNOWN) { 17586 SATA_LOG_D((sata_hba_inst, CE_WARN, 17587 "sata_hba_event_notify: pmult is not" 17588 "available at port %d:%d, ignore event 0x%x", 17589 cport, pmport, event)); 17590 return; 17591 } 17592 } 17593 17594 if ((saddr->qual & 17595 (SATA_ADDR_PMPORT | SATA_ADDR_DPMPORT)) != 0) { 17596 17597 mutex_enter(&cportinfo->cport_mutex); 17598 if (pmport > SATA_NUM_PMPORTS(sata_hba_inst, cport)) { 17599 SATA_LOG_D((sata_hba_inst, CE_WARN, 17600 "sata_hba_event_notify: invalid/" 17601 "un-implemented port %d:%d (%d ports), " 17602 "ignore event 0x%x", cport, pmport, 17603 SATA_NUM_PMPORTS(sata_hba_inst, cport), event)); 17604 mutex_exit(&cportinfo->cport_mutex); 17605 return; 17606 } 17607 mutex_exit(&cportinfo->cport_mutex); 17608 17609 mutex_enter(&sata_hba_inst->satahba_mutex); 17610 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, 17611 cport, pmport); 17612 mutex_exit(&sata_hba_inst->satahba_mutex); 17613 17614 /* pmport is implemented/valid? */ 17615 if (pmportinfo == NULL) { 17616 SATA_LOG_D((sata_hba_inst, CE_WARN, 17617 "sata_hba_event_notify: invalid/" 17618 "un-implemented port %d:%d, ignore " 17619 "event 0x%x", cport, pmport, event)); 17620 return; 17621 } 17622 } 17623 17624 /* 17625 * Events refer to devices, ports and controllers - each has 17626 * unique address. Events for different addresses cannot be combined. 17627 */ 17628 if (saddr->qual & (SATA_ADDR_CPORT | SATA_ADDR_PMPORT)) { 17629 17630 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport))); 17631 17632 /* qualify this event(s) */ 17633 if ((event & SATA_EVNT_PORT_EVENTS) == 0) { 17634 /* Invalid event for the device port */ 17635 (void) sprintf(buf2, err_msg_evnt_1, 17636 event & SATA_EVNT_PORT_EVENTS); 17637 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport))); 17638 goto event_info; 17639 } 17640 if (saddr->qual == SATA_ADDR_CPORT) { 17641 /* Controller's device port event */ 17642 17643 (SATA_CPORT_INFO(sata_hba_inst, cport))-> 17644 cport_event_flags |= 17645 event & SATA_EVNT_PORT_EVENTS; 17646 pstats = 17647 &(SATA_CPORT_INFO(sata_hba_inst, cport))-> 17648 cport_stats; 17649 } else { 17650 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport))); 17651 mutex_enter(&pmportinfo->pmport_mutex); 17652 /* Port multiplier's device port event */ 17653 (SATA_PMPORT_INFO(sata_hba_inst, cport, pmport))-> 17654 pmport_event_flags |= 17655 event & SATA_EVNT_PORT_EVENTS; 17656 pstats = 17657 &(SATA_PMPORT_INFO(sata_hba_inst, cport, pmport))-> 17658 pmport_stats; 17659 mutex_exit(&pmportinfo->pmport_mutex); 17660 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport))); 17661 } 17662 17663 /* 17664 * Add to statistics and log the message. We have to do it 17665 * here rather than in the event daemon, because there may be 17666 * multiple events occuring before they are processed. 17667 */ 17668 linkevent = event & 17669 (SATA_EVNT_LINK_LOST | SATA_EVNT_LINK_ESTABLISHED); 17670 if (linkevent) { 17671 if (linkevent == (SATA_EVNT_LINK_LOST | 17672 SATA_EVNT_LINK_ESTABLISHED)) { 17673 /* This is likely event combination */ 17674 (void) strlcat(buf1, "link lost/established, ", 17675 SATA_EVENT_MAX_MSG_LENGTH); 17676 17677 if (pstats->link_lost < 0xffffffffffffffffULL) 17678 pstats->link_lost++; 17679 if (pstats->link_established < 17680 0xffffffffffffffffULL) 17681 pstats->link_established++; 17682 linkevent = 0; 17683 } else if (linkevent & SATA_EVNT_LINK_LOST) { 17684 (void) strlcat(buf1, "link lost, ", 17685 SATA_EVENT_MAX_MSG_LENGTH); 17686 17687 if (pstats->link_lost < 0xffffffffffffffffULL) 17688 pstats->link_lost++; 17689 } else { 17690 (void) strlcat(buf1, "link established, ", 17691 SATA_EVENT_MAX_MSG_LENGTH); 17692 if (pstats->link_established < 17693 0xffffffffffffffffULL) 17694 pstats->link_established++; 17695 } 17696 } 17697 if (event & SATA_EVNT_DEVICE_ATTACHED) { 17698 (void) strlcat(buf1, "device attached, ", 17699 SATA_EVENT_MAX_MSG_LENGTH); 17700 if (pstats->device_attached < 0xffffffffffffffffULL) 17701 pstats->device_attached++; 17702 } 17703 if (event & SATA_EVNT_DEVICE_DETACHED) { 17704 (void) strlcat(buf1, "device detached, ", 17705 SATA_EVENT_MAX_MSG_LENGTH); 17706 if (pstats->device_detached < 0xffffffffffffffffULL) 17707 pstats->device_detached++; 17708 } 17709 if (event & SATA_EVNT_PWR_LEVEL_CHANGED) { 17710 SATADBG1(SATA_DBG_EVENTS, sata_hba_inst, 17711 "port %d power level changed", cport); 17712 if (pstats->port_pwr_changed < 0xffffffffffffffffULL) 17713 pstats->port_pwr_changed++; 17714 } 17715 17716 if ((event & ~SATA_EVNT_PORT_EVENTS) != 0) { 17717 /* There should be no other events for this address */ 17718 (void) sprintf(buf2, err_msg_evnt_1, 17719 event & ~SATA_EVNT_PORT_EVENTS); 17720 } 17721 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport))); 17722 17723 } else if (saddr->qual & (SATA_ADDR_DCPORT | SATA_ADDR_DPMPORT)) { 17724 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport))); 17725 17726 /* qualify this event */ 17727 if ((event & SATA_EVNT_DEVICE_RESET) == 0) { 17728 /* Invalid event for a device */ 17729 (void) sprintf(buf2, err_msg_evnt_2, 17730 event & SATA_EVNT_DEVICE_RESET); 17731 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport))); 17732 goto event_info; 17733 } 17734 /* drive event */ 17735 sdinfo = sata_get_device_info(sata_hba_inst, sata_device); 17736 if (sdinfo != NULL) { 17737 if (event & SATA_EVNT_DEVICE_RESET) { 17738 (void) strlcat(buf1, "device reset, ", 17739 SATA_EVENT_MAX_MSG_LENGTH); 17740 if (sdinfo->satadrv_stats.drive_reset < 17741 0xffffffffffffffffULL) 17742 sdinfo->satadrv_stats.drive_reset++; 17743 sdinfo->satadrv_event_flags |= 17744 SATA_EVNT_DEVICE_RESET; 17745 } 17746 } 17747 if ((event & ~SATA_EVNT_DEVICE_RESET) != 0) { 17748 /* Invalid event for a device */ 17749 (void) sprintf(buf2, err_msg_evnt_2, 17750 event & ~SATA_EVNT_DRIVE_EVENTS); 17751 } 17752 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport))); 17753 } else if (saddr->qual == SATA_ADDR_PMULT) { 17754 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport))); 17755 17756 /* qualify this event */ 17757 if ((event & (SATA_EVNT_DEVICE_RESET | 17758 SATA_EVNT_PMULT_LINK_CHANGED)) == 0) { 17759 /* Invalid event for a port multiplier */ 17760 (void) sprintf(buf2, err_msg_evnt_2, 17761 event & SATA_EVNT_DEVICE_RESET); 17762 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport))); 17763 goto event_info; 17764 } 17765 17766 pmultinfo = SATA_PMULT_INFO(sata_hba_inst, cport); 17767 17768 if (event & SATA_EVNT_DEVICE_RESET) { 17769 17770 SATADBG1(SATA_DBG_PMULT, sata_hba_inst, 17771 "[Reset] port-mult on cport %d", cport); 17772 pmultinfo->pmult_event_flags |= 17773 SATA_EVNT_DEVICE_RESET; 17774 (void) strlcat(buf1, "pmult reset, ", 17775 SATA_EVENT_MAX_MSG_LENGTH); 17776 } 17777 17778 if (event & SATA_EVNT_PMULT_LINK_CHANGED) { 17779 17780 SATADBG1(SATA_DBG_PMULT, sata_hba_inst, 17781 "pmult link changed on cport %d", cport); 17782 pmultinfo->pmult_event_flags |= 17783 SATA_EVNT_PMULT_LINK_CHANGED; 17784 (void) strlcat(buf1, "pmult link changed, ", 17785 SATA_EVENT_MAX_MSG_LENGTH); 17786 } 17787 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport))); 17788 17789 } else { 17790 if (saddr->qual != SATA_ADDR_NULL) { 17791 /* Wrong address qualifier */ 17792 SATA_LOG_D((sata_hba_inst, CE_WARN, 17793 "sata_hba_event_notify: invalid address 0x%x", 17794 *(uint32_t *)saddr)); 17795 return; 17796 } 17797 if ((event & SATA_EVNT_CONTROLLER_EVENTS) == 0 || 17798 (event & ~SATA_EVNT_CONTROLLER_EVENTS) != 0) { 17799 /* Invalid event for the controller */ 17800 SATA_LOG_D((sata_hba_inst, CE_WARN, 17801 "sata_hba_event_notify: invalid event 0x%x for " 17802 "controller", 17803 event & SATA_EVNT_CONTROLLER_EVENTS)); 17804 return; 17805 } 17806 buf1[0] = '\0'; 17807 /* This may be a frequent and not interesting event */ 17808 SATADBG1(SATA_DBG_EVENTS, sata_hba_inst, 17809 "controller power level changed\n", NULL); 17810 17811 mutex_enter(&sata_hba_inst->satahba_mutex); 17812 if (sata_hba_inst->satahba_stats.ctrl_pwr_change < 17813 0xffffffffffffffffULL) 17814 sata_hba_inst->satahba_stats.ctrl_pwr_change++; 17815 17816 sata_hba_inst->satahba_event_flags |= 17817 SATA_EVNT_PWR_LEVEL_CHANGED; 17818 mutex_exit(&sata_hba_inst->satahba_mutex); 17819 } 17820 /* 17821 * If we got here, there is something to do with this HBA 17822 * instance. 17823 */ 17824 mutex_enter(&sata_hba_inst->satahba_mutex); 17825 sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN; 17826 mutex_exit(&sata_hba_inst->satahba_mutex); 17827 mutex_enter(&sata_mutex); 17828 sata_event_pending |= SATA_EVNT_MAIN; /* global event indicator */ 17829 mutex_exit(&sata_mutex); 17830 17831 /* Tickle event thread */ 17832 mutex_enter(&sata_event_mutex); 17833 if (sata_event_thread_active == 0) 17834 cv_signal(&sata_event_cv); 17835 mutex_exit(&sata_event_mutex); 17836 17837 event_info: 17838 if (buf1[0] != '\0') { 17839 lcp = strrchr(buf1, ','); 17840 if (lcp != NULL) 17841 *lcp = '\0'; 17842 } 17843 if (saddr->qual == SATA_ADDR_CPORT || 17844 saddr->qual == SATA_ADDR_DCPORT) { 17845 if (buf1[0] != '\0') { 17846 sata_log(sata_hba_inst, CE_NOTE, "port %d: %s\n", 17847 cport, buf1); 17848 } 17849 if (buf2[0] != '\0') { 17850 sata_log(sata_hba_inst, CE_NOTE, "port %d: %s\n", 17851 cport, buf2); 17852 } 17853 } else if (saddr->qual == SATA_ADDR_PMPORT || 17854 saddr->qual == SATA_ADDR_DPMPORT) { 17855 if (buf1[0] != '\0') { 17856 sata_log(sata_hba_inst, CE_NOTE, 17857 "port %d pmport %d: %s\n", cport, pmport, buf1); 17858 } 17859 if (buf2[0] != '\0') { 17860 sata_log(sata_hba_inst, CE_NOTE, 17861 "port %d pmport %d: %s\n", cport, pmport, buf2); 17862 } 17863 } 17864 } 17865 17866 17867 /* 17868 * Event processing thread. 17869 * Arg is a pointer to the sata_hba_list pointer. 17870 * It is not really needed, because sata_hba_list is global and static 17871 */ 17872 static void 17873 sata_event_daemon(void *arg) 17874 { 17875 #ifndef __lock_lint 17876 _NOTE(ARGUNUSED(arg)) 17877 #endif 17878 sata_hba_inst_t *sata_hba_inst; 17879 clock_t delta; 17880 17881 SATADBG1(SATA_DBG_EVENTS_DAEMON, NULL, 17882 "SATA event daemon started\n", NULL); 17883 loop: 17884 /* 17885 * Process events here. Walk through all registered HBAs 17886 */ 17887 mutex_enter(&sata_mutex); 17888 for (sata_hba_inst = sata_hba_list; sata_hba_inst != NULL; 17889 sata_hba_inst = sata_hba_inst->satahba_next) { 17890 ASSERT(sata_hba_inst != NULL); 17891 mutex_enter(&sata_hba_inst->satahba_mutex); 17892 if (sata_hba_inst->satahba_attached == 0 || 17893 (sata_hba_inst->satahba_event_flags & 17894 SATA_EVNT_SKIP) != 0) { 17895 mutex_exit(&sata_hba_inst->satahba_mutex); 17896 continue; 17897 } 17898 if (sata_hba_inst->satahba_event_flags & SATA_EVNT_MAIN) { 17899 sata_hba_inst->satahba_event_flags |= SATA_EVNT_SKIP; 17900 mutex_exit(&sata_hba_inst->satahba_mutex); 17901 mutex_exit(&sata_mutex); 17902 /* Got the controller with pending event */ 17903 sata_process_controller_events(sata_hba_inst); 17904 /* 17905 * Since global mutex was released, there is a 17906 * possibility that HBA list has changed, so start 17907 * over from the top. Just processed controller 17908 * will be passed-over because of the SKIP flag. 17909 */ 17910 goto loop; 17911 } 17912 mutex_exit(&sata_hba_inst->satahba_mutex); 17913 } 17914 /* Clear SKIP flag in all controllers */ 17915 for (sata_hba_inst = sata_hba_list; sata_hba_inst != NULL; 17916 sata_hba_inst = sata_hba_inst->satahba_next) { 17917 mutex_enter(&sata_hba_inst->satahba_mutex); 17918 sata_hba_inst->satahba_event_flags &= ~SATA_EVNT_SKIP; 17919 mutex_exit(&sata_hba_inst->satahba_mutex); 17920 } 17921 mutex_exit(&sata_mutex); 17922 17923 SATADBG1(SATA_DBG_EVENTS_DAEMON, NULL, 17924 "SATA EVENT DAEMON suspending itself", NULL); 17925 17926 #ifdef SATA_DEBUG 17927 if ((sata_func_enable & SATA_ENABLE_PROCESS_EVENTS) == 0) { 17928 sata_log(sata_hba_inst, CE_WARN, 17929 "SATA EVENTS PROCESSING DISABLED\n"); 17930 thread_exit(); /* Daemon will not run again */ 17931 } 17932 #endif 17933 mutex_enter(&sata_event_mutex); 17934 sata_event_thread_active = 0; 17935 mutex_exit(&sata_event_mutex); 17936 /* 17937 * Go to sleep/suspend itself and wake up either because new event or 17938 * wait timeout. Exit if there is a termination request (driver 17939 * unload). 17940 */ 17941 delta = drv_usectohz(SATA_EVNT_DAEMON_SLEEP_TIME); 17942 do { 17943 mutex_enter(&sata_event_mutex); 17944 (void) cv_reltimedwait(&sata_event_cv, &sata_event_mutex, 17945 delta, TR_CLOCK_TICK); 17946 17947 if (sata_event_thread_active != 0) { 17948 mutex_exit(&sata_event_mutex); 17949 continue; 17950 } 17951 17952 /* Check if it is time to go away */ 17953 if (sata_event_thread_terminate == 1) { 17954 /* 17955 * It is up to the thread setting above flag to make 17956 * sure that this thread is not killed prematurely. 17957 */ 17958 sata_event_thread_terminate = 0; 17959 sata_event_thread = NULL; 17960 mutex_exit(&sata_event_mutex); 17961 SATADBG1(SATA_DBG_EVENTS_DAEMON, NULL, 17962 "SATA_EVENT_DAEMON_TERMINATING", NULL); 17963 thread_exit(); { _NOTE(NOT_REACHED) } 17964 } 17965 mutex_exit(&sata_event_mutex); 17966 } while (!(sata_event_pending & SATA_EVNT_MAIN)); 17967 17968 mutex_enter(&sata_event_mutex); 17969 sata_event_thread_active = 1; 17970 mutex_exit(&sata_event_mutex); 17971 17972 mutex_enter(&sata_mutex); 17973 sata_event_pending &= ~SATA_EVNT_MAIN; 17974 mutex_exit(&sata_mutex); 17975 17976 SATADBG1(SATA_DBG_EVENTS_DAEMON, NULL, 17977 "SATA EVENT DAEMON READY TO PROCESS EVENT", NULL); 17978 17979 goto loop; 17980 } 17981 17982 /* 17983 * Specific HBA instance event processing. 17984 * 17985 * NOTE: At the moment, device event processing is limited to hard disks 17986 * only. 17987 * Port multiplier is supported now. 17988 */ 17989 static void 17990 sata_process_controller_events(sata_hba_inst_t *sata_hba_inst) 17991 { 17992 int ncport; 17993 uint32_t event_flags; 17994 sata_address_t *saddr; 17995 sata_cport_info_t *cportinfo; 17996 sata_pmult_info_t *pmultinfo; 17997 17998 SATADBG1(SATA_DBG_EVENTS_CNTRL, sata_hba_inst, 17999 "Processing controller %d event(s)", 18000 ddi_get_instance(SATA_DIP(sata_hba_inst))); 18001 18002 mutex_enter(&sata_hba_inst->satahba_mutex); 18003 sata_hba_inst->satahba_event_flags &= ~SATA_EVNT_MAIN; 18004 event_flags = sata_hba_inst->satahba_event_flags; 18005 mutex_exit(&sata_hba_inst->satahba_mutex); 18006 /* 18007 * Process controller power change first 18008 * HERE 18009 */ 18010 if (event_flags & SATA_EVNT_PWR_LEVEL_CHANGED) 18011 sata_process_cntrl_pwr_level_change(sata_hba_inst); 18012 18013 /* 18014 * Search through ports/devices to identify affected port/device. 18015 * We may have to process events for more than one port/device. 18016 */ 18017 for (ncport = 0; ncport < SATA_NUM_CPORTS(sata_hba_inst); ncport++) { 18018 /* 18019 * Not all ports may be processed in attach by the time we 18020 * get an event. Check if port info is initialized. 18021 */ 18022 mutex_enter(&sata_hba_inst->satahba_mutex); 18023 cportinfo = SATA_CPORT_INFO(sata_hba_inst, ncport); 18024 mutex_exit(&sata_hba_inst->satahba_mutex); 18025 if (cportinfo == NULL || cportinfo->cport_state == NULL) 18026 continue; 18027 18028 /* We have initialized controller port info */ 18029 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, ncport))); 18030 event_flags = (SATA_CPORT_INFO(sata_hba_inst, ncport))-> 18031 cport_event_flags; 18032 /* Check if port was locked by IOCTL processing */ 18033 if (event_flags & SATA_APCTL_LOCK_PORT_BUSY) { 18034 /* 18035 * We ignore port events because port is busy 18036 * with AP control processing. Set again 18037 * controller and main event flag, so that 18038 * events may be processed by the next daemon 18039 * run. 18040 */ 18041 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, ncport))); 18042 mutex_enter(&sata_hba_inst->satahba_mutex); 18043 sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN; 18044 mutex_exit(&sata_hba_inst->satahba_mutex); 18045 mutex_enter(&sata_mutex); 18046 sata_event_pending |= SATA_EVNT_MAIN; 18047 mutex_exit(&sata_mutex); 18048 SATADBG1(SATA_DBG_EVENTS_PROCPST, sata_hba_inst, 18049 "Event processing postponed until " 18050 "AP control processing completes", 18051 NULL); 18052 /* Check other ports */ 18053 continue; 18054 } else { 18055 /* 18056 * Set BSY flag so that AP control would not 18057 * interfere with events processing for 18058 * this port. 18059 */ 18060 (SATA_CPORT_INFO(sata_hba_inst, ncport))-> 18061 cport_event_flags |= SATA_EVNT_LOCK_PORT_BUSY; 18062 } 18063 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, ncport))); 18064 18065 saddr = &(SATA_CPORT_INFO(sata_hba_inst, ncport))->cport_addr; 18066 18067 if ((event_flags & 18068 (SATA_EVNT_PORT_EVENTS | SATA_EVNT_DRIVE_EVENTS)) != 0) { 18069 /* 18070 * Got port event. 18071 * We need some hierarchy of event processing as they 18072 * are affecting each other: 18073 * 1. port failed 18074 * 2. device detached/attached 18075 * 3. link events - link events may trigger device 18076 * detached or device attached events in some 18077 * circumstances. 18078 * 4. port power level changed 18079 */ 18080 if (event_flags & SATA_EVNT_PORT_FAILED) { 18081 sata_process_port_failed_event(sata_hba_inst, 18082 saddr); 18083 } 18084 if (event_flags & SATA_EVNT_DEVICE_DETACHED) { 18085 sata_process_device_detached(sata_hba_inst, 18086 saddr); 18087 } 18088 if (event_flags & SATA_EVNT_DEVICE_ATTACHED) { 18089 sata_process_device_attached(sata_hba_inst, 18090 saddr); 18091 } 18092 if (event_flags & 18093 (SATA_EVNT_LINK_ESTABLISHED | 18094 SATA_EVNT_LINK_LOST)) { 18095 sata_process_port_link_events(sata_hba_inst, 18096 saddr); 18097 } 18098 if (event_flags & SATA_EVNT_PWR_LEVEL_CHANGED) { 18099 sata_process_port_pwr_change(sata_hba_inst, 18100 saddr); 18101 } 18102 if (event_flags & SATA_EVNT_TARGET_NODE_CLEANUP) { 18103 sata_process_target_node_cleanup( 18104 sata_hba_inst, saddr); 18105 } 18106 if (event_flags & SATA_EVNT_AUTOONLINE_DEVICE) { 18107 sata_process_device_autoonline( 18108 sata_hba_inst, saddr); 18109 } 18110 } 18111 18112 18113 /* 18114 * Scan port multiplier and all its sub-ports event flags. 18115 * The events are marked by 18116 * (1) sata_pmult_info.pmult_event_flags 18117 * (2) sata_pmport_info.pmport_event_flags 18118 */ 18119 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, ncport))); 18120 if (cportinfo->cport_dev_type == SATA_DTYPE_PMULT) { 18121 /* 18122 * There should be another extra check: this 18123 * port multiplier still exists? 18124 */ 18125 pmultinfo = SATA_PMULT_INFO(sata_hba_inst, 18126 ncport); 18127 18128 if (pmultinfo != NULL) { 18129 mutex_exit(&(SATA_CPORT_MUTEX( 18130 sata_hba_inst, ncport))); 18131 sata_process_pmult_events( 18132 sata_hba_inst, ncport); 18133 mutex_enter(&(SATA_CPORT_MUTEX( 18134 sata_hba_inst, ncport))); 18135 } else { 18136 SATADBG1(SATA_DBG_PMULT, sata_hba_inst, 18137 "Port-multiplier is gone. " 18138 "Ignore all sub-device events " 18139 "at port %d.", ncport); 18140 } 18141 } 18142 18143 if ((SATA_CPORT_DEV_TYPE(sata_hba_inst, ncport) != 18144 SATA_DTYPE_NONE) && 18145 (SATA_CPORT_DRV_INFO(sata_hba_inst, ncport) != NULL)) { 18146 if (SATA_CPORT_DRV_INFO(sata_hba_inst, ncport)-> 18147 satadrv_event_flags & 18148 (SATA_EVNT_DEVICE_RESET | 18149 SATA_EVNT_INPROC_DEVICE_RESET)) { 18150 /* Have device event */ 18151 sata_process_device_reset(sata_hba_inst, 18152 saddr); 18153 } 18154 } 18155 /* Release PORT_BUSY flag */ 18156 (SATA_CPORT_INFO(sata_hba_inst, ncport))-> 18157 cport_event_flags &= ~SATA_EVNT_LOCK_PORT_BUSY; 18158 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, ncport))); 18159 18160 } /* End of loop through the controller SATA ports */ 18161 } 18162 18163 /* 18164 * Specific port multiplier instance event processing. At the moment, device 18165 * event processing is limited to link/attach event only. 18166 * 18167 * NOTE: power management event is not supported yet. 18168 */ 18169 static void 18170 sata_process_pmult_events(sata_hba_inst_t *sata_hba_inst, uint8_t cport) 18171 { 18172 sata_cport_info_t *cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport); 18173 sata_pmult_info_t *pmultinfo; 18174 sata_pmport_info_t *pmportinfo; 18175 sata_address_t *saddr; 18176 sata_device_t sata_device; 18177 uint32_t event_flags; 18178 int npmport; 18179 int rval; 18180 18181 SATADBG2(SATA_DBG_EVENTS_CNTRL|SATA_DBG_PMULT, sata_hba_inst, 18182 "Processing pmult event(s) on cport %d of controller %d", 18183 cport, ddi_get_instance(SATA_DIP(sata_hba_inst))); 18184 18185 /* First process events on port multiplier */ 18186 mutex_enter(&cportinfo->cport_mutex); 18187 pmultinfo = SATA_PMULT_INFO(sata_hba_inst, cport); 18188 event_flags = pmultinfo->pmult_event_flags; 18189 18190 /* 18191 * Reset event (of port multiplier) has higher priority because the 18192 * port multiplier itself might be failed or removed after reset. 18193 */ 18194 if (event_flags & SATA_EVNT_DEVICE_RESET) { 18195 /* 18196 * The status of the sub-links are uncertain, 18197 * so mark all sub-ports as RESET 18198 */ 18199 for (npmport = 0; npmport < SATA_NUM_PMPORTS( 18200 sata_hba_inst, cport); npmport ++) { 18201 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, 18202 cport, npmport); 18203 if (pmportinfo == NULL) { 18204 /* That's weird. */ 18205 SATA_LOG_D((sata_hba_inst, CE_WARN, 18206 "sata_hba_event_notify: " 18207 "invalid/un-implemented " 18208 "port %d:%d (%d ports), ", 18209 cport, npmport, SATA_NUM_PMPORTS( 18210 sata_hba_inst, cport))); 18211 continue; 18212 } 18213 18214 mutex_enter(&pmportinfo->pmport_mutex); 18215 18216 /* Mark all pmport to unknow state. */ 18217 pmportinfo->pmport_state = SATA_STATE_UNKNOWN; 18218 /* Mark all pmports with link events. */ 18219 pmportinfo->pmport_event_flags = 18220 (SATA_EVNT_LINK_ESTABLISHED|SATA_EVNT_LINK_LOST); 18221 mutex_exit(&pmportinfo->pmport_mutex); 18222 } 18223 18224 } else if (event_flags & SATA_EVNT_PMULT_LINK_CHANGED) { 18225 /* 18226 * We need probe the port multiplier to know what has 18227 * happened. 18228 */ 18229 bzero(&sata_device, sizeof (sata_device_t)); 18230 sata_device.satadev_rev = SATA_DEVICE_REV; 18231 sata_device.satadev_addr.cport = cport; 18232 sata_device.satadev_addr.pmport = SATA_PMULT_HOSTPORT; 18233 sata_device.satadev_addr.qual = SATA_ADDR_PMULT; 18234 18235 mutex_exit(&cportinfo->cport_mutex); 18236 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst)) 18237 (SATA_DIP(sata_hba_inst), &sata_device); 18238 mutex_enter(&cportinfo->cport_mutex); 18239 if (rval != SATA_SUCCESS) { 18240 /* Something went wrong? Fail the port */ 18241 cportinfo->cport_state = SATA_PSTATE_FAILED; 18242 mutex_exit(&cportinfo->cport_mutex); 18243 SATA_LOG_D((sata_hba_inst, CE_WARN, 18244 "SATA port %d probing failed", cport)); 18245 18246 /* PMult structure must be released. */ 18247 sata_free_pmult(sata_hba_inst, &sata_device); 18248 return; 18249 } 18250 18251 sata_update_port_info(sata_hba_inst, &sata_device); 18252 18253 /* 18254 * Sanity check - Port is active? Is the link active? 18255 * The device is still a port multiplier? 18256 */ 18257 if ((cportinfo->cport_state & 18258 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) || 18259 ((cportinfo->cport_scr.sstatus & 18260 SATA_PORT_DEVLINK_UP_MASK) != SATA_PORT_DEVLINK_UP) || 18261 (cportinfo->cport_dev_type != SATA_DTYPE_PMULT)) { 18262 mutex_exit(&cportinfo->cport_mutex); 18263 18264 /* PMult structure must be released. */ 18265 sata_free_pmult(sata_hba_inst, &sata_device); 18266 return; 18267 } 18268 18269 /* Probed succeed, set port ready. */ 18270 cportinfo->cport_state |= 18271 SATA_STATE_PROBED | SATA_STATE_READY; 18272 } 18273 18274 /* Release port multiplier event flags. */ 18275 pmultinfo->pmult_event_flags &= 18276 ~(SATA_EVNT_DEVICE_RESET|SATA_EVNT_PMULT_LINK_CHANGED); 18277 mutex_exit(&cportinfo->cport_mutex); 18278 18279 /* 18280 * Check all sub-links. 18281 */ 18282 for (npmport = 0; npmport < SATA_NUM_PMPORTS(sata_hba_inst, cport); 18283 npmport ++) { 18284 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, npmport); 18285 mutex_enter(&pmportinfo->pmport_mutex); 18286 event_flags = pmportinfo->pmport_event_flags; 18287 mutex_exit(&pmportinfo->pmport_mutex); 18288 saddr = &pmportinfo->pmport_addr; 18289 18290 if ((event_flags & 18291 (SATA_EVNT_PORT_EVENTS | SATA_EVNT_DRIVE_EVENTS)) != 0) { 18292 /* 18293 * Got port multiplier port event. 18294 * We need some hierarchy of event processing as they 18295 * are affecting each other: 18296 * 1. device detached/attached 18297 * 2. link events - link events may trigger device 18298 * detached or device attached events in some 18299 * circumstances. 18300 */ 18301 if (event_flags & SATA_EVNT_DEVICE_DETACHED) { 18302 sata_process_pmdevice_detached(sata_hba_inst, 18303 saddr); 18304 } 18305 if (event_flags & SATA_EVNT_DEVICE_ATTACHED) { 18306 sata_process_pmdevice_attached(sata_hba_inst, 18307 saddr); 18308 } 18309 if (event_flags & SATA_EVNT_LINK_ESTABLISHED || 18310 event_flags & SATA_EVNT_LINK_LOST) { 18311 sata_process_pmport_link_events(sata_hba_inst, 18312 saddr); 18313 } 18314 if (event_flags & SATA_EVNT_TARGET_NODE_CLEANUP) { 18315 sata_process_target_node_cleanup( 18316 sata_hba_inst, saddr); 18317 } 18318 } 18319 18320 /* Checking drive event(s). */ 18321 mutex_enter(&pmportinfo->pmport_mutex); 18322 if (pmportinfo->pmport_dev_type != SATA_DTYPE_NONE && 18323 pmportinfo->pmport_sata_drive != NULL) { 18324 event_flags = pmportinfo->pmport_sata_drive-> 18325 satadrv_event_flags; 18326 if (event_flags & (SATA_EVNT_DEVICE_RESET | 18327 SATA_EVNT_INPROC_DEVICE_RESET)) { 18328 18329 /* Have device event */ 18330 sata_process_pmdevice_reset(sata_hba_inst, 18331 saddr); 18332 } 18333 } 18334 mutex_exit(&pmportinfo->pmport_mutex); 18335 18336 /* Release PORT_BUSY flag */ 18337 mutex_enter(&cportinfo->cport_mutex); 18338 cportinfo->cport_event_flags &= ~SATA_EVNT_LOCK_PORT_BUSY; 18339 mutex_exit(&cportinfo->cport_mutex); 18340 } 18341 18342 SATADBG2(SATA_DBG_EVENTS_CNTRL|SATA_DBG_PMULT, sata_hba_inst, 18343 "[DONE] pmult event(s) on cport %d of controller %d", 18344 cport, ddi_get_instance(SATA_DIP(sata_hba_inst))); 18345 } 18346 18347 /* 18348 * Process HBA power level change reported by HBA driver. 18349 * Not implemented at this time - event is ignored. 18350 */ 18351 static void 18352 sata_process_cntrl_pwr_level_change(sata_hba_inst_t *sata_hba_inst) 18353 { 18354 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst, 18355 "Processing controller power level change", NULL); 18356 18357 /* Ignoring it for now */ 18358 mutex_enter(&sata_hba_inst->satahba_mutex); 18359 sata_hba_inst->satahba_event_flags &= ~SATA_EVNT_PWR_LEVEL_CHANGED; 18360 mutex_exit(&sata_hba_inst->satahba_mutex); 18361 } 18362 18363 /* 18364 * Process port power level change reported by HBA driver. 18365 * Not implemented at this time - event is ignored. 18366 */ 18367 static void 18368 sata_process_port_pwr_change(sata_hba_inst_t *sata_hba_inst, 18369 sata_address_t *saddr) 18370 { 18371 sata_cport_info_t *cportinfo; 18372 18373 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst, 18374 "Processing port power level change", NULL); 18375 18376 cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport); 18377 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex); 18378 /* Reset event flag */ 18379 cportinfo->cport_event_flags &= ~SATA_EVNT_PWR_LEVEL_CHANGED; 18380 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex); 18381 } 18382 18383 /* 18384 * Process port failure reported by HBA driver. 18385 * cports support only - no pmports. 18386 */ 18387 static void 18388 sata_process_port_failed_event(sata_hba_inst_t *sata_hba_inst, 18389 sata_address_t *saddr) 18390 { 18391 sata_cport_info_t *cportinfo; 18392 18393 cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport); 18394 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex); 18395 /* Reset event flag first */ 18396 cportinfo->cport_event_flags &= ~SATA_EVNT_PORT_FAILED; 18397 /* If the port is in SHUTDOWN or FAILED state, ignore this event. */ 18398 if ((cportinfo->cport_state & 18399 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) == 0) { 18400 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)-> 18401 cport_mutex); 18402 return; 18403 } 18404 /* Fail the port */ 18405 cportinfo->cport_state = SATA_PSTATE_FAILED; 18406 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex); 18407 sata_log(sata_hba_inst, CE_WARN, "SATA port %d failed", saddr->cport); 18408 } 18409 18410 /* 18411 * Device Reset Event processing. 18412 * The seqeunce is managed by 3 stage flags: 18413 * - reset event reported, 18414 * - reset event being processed, 18415 * - request to clear device reset state. 18416 * 18417 * NOTE: This function has to be entered with cport mutex held. It exits with 18418 * mutex held as well, but can release mutex during the processing. 18419 */ 18420 static void 18421 sata_process_device_reset(sata_hba_inst_t *sata_hba_inst, 18422 sata_address_t *saddr) 18423 { 18424 sata_drive_info_t old_sdinfo; /* local copy of the drive info */ 18425 sata_drive_info_t *sdinfo; 18426 sata_cport_info_t *cportinfo; 18427 sata_device_t sata_device; 18428 int rval_probe, rval_set; 18429 18430 /* We only care about host sata cport for now */ 18431 cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport); 18432 sdinfo = SATA_CPORT_DRV_INFO(sata_hba_inst, saddr->cport); 18433 /* 18434 * If the port is in SHUTDOWN or FAILED state, or device is in FAILED 18435 * state, ignore reset event. 18436 */ 18437 if (((cportinfo->cport_state & 18438 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) != 0) || 18439 (sdinfo->satadrv_state & SATA_DSTATE_FAILED) != 0) { 18440 sdinfo->satadrv_event_flags &= 18441 ~(SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET); 18442 return; 18443 } 18444 18445 if ((SATA_CPORT_DEV_TYPE(sata_hba_inst, saddr->cport) == 18446 SATA_DTYPE_PMULT)) { 18447 /* 18448 * Should not happened: this is already handled in 18449 * sata_hba_event_notify() 18450 */ 18451 mutex_exit(&cportinfo->cport_mutex); 18452 goto done; 18453 } 18454 18455 if ((SATA_CPORT_DEV_TYPE(sata_hba_inst, saddr->cport) & 18456 SATA_VALID_DEV_TYPE) == 0) { 18457 /* 18458 * This should not happen - coding error. 18459 * But we can recover, so do not panic, just clean up 18460 * and if in debug mode, log the message. 18461 */ 18462 #ifdef SATA_DEBUG 18463 sata_log(sata_hba_inst, CE_WARN, 18464 "sata_process_device_reset: " 18465 "Invalid device type with sdinfo!", NULL); 18466 #endif 18467 sdinfo->satadrv_event_flags = 0; 18468 return; 18469 } 18470 18471 #ifdef SATA_DEBUG 18472 if ((sdinfo->satadrv_event_flags & 18473 (SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET)) == 0) { 18474 /* Nothing to do */ 18475 /* Something is weird - why we are processing dev reset? */ 18476 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst, 18477 "No device reset event!!!!", NULL); 18478 18479 return; 18480 } 18481 if ((sdinfo->satadrv_event_flags & 18482 (SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET)) == 18483 (SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET)) { 18484 /* Something is weird - new device reset event */ 18485 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst, 18486 "Overlapping device reset events!", NULL); 18487 } 18488 #endif 18489 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst, 18490 "Processing port %d device reset", saddr->cport); 18491 18492 /* Clear event flag */ 18493 sdinfo->satadrv_event_flags &= ~SATA_EVNT_DEVICE_RESET; 18494 18495 /* It seems that we always need to check the port state first */ 18496 sata_device.satadev_rev = SATA_DEVICE_REV; 18497 sata_device.satadev_addr = *saddr; 18498 /* 18499 * We have to exit mutex, because the HBA probe port function may 18500 * block on its own mutex. 18501 */ 18502 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex); 18503 rval_probe = (*SATA_PROBE_PORT_FUNC(sata_hba_inst)) 18504 (SATA_DIP(sata_hba_inst), &sata_device); 18505 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex); 18506 sata_update_port_info(sata_hba_inst, &sata_device); 18507 if (rval_probe != SATA_SUCCESS) { 18508 /* Something went wrong? Fail the port */ 18509 cportinfo->cport_state = SATA_PSTATE_FAILED; 18510 sdinfo = SATA_CPORT_DRV_INFO(sata_hba_inst, saddr->cport); 18511 if (sdinfo != NULL) 18512 sdinfo->satadrv_event_flags = 0; 18513 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)-> 18514 cport_mutex); 18515 SATA_LOG_D((sata_hba_inst, CE_WARN, 18516 "SATA port %d probing failed", 18517 saddr->cport)); 18518 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, 18519 saddr->cport)->cport_mutex); 18520 return; 18521 } 18522 if ((sata_device.satadev_scr.sstatus & 18523 SATA_PORT_DEVLINK_UP_MASK) != 18524 SATA_PORT_DEVLINK_UP || 18525 sata_device.satadev_type == SATA_DTYPE_NONE) { 18526 /* 18527 * No device to process, anymore. Some other event processing 18528 * would or have already performed port info cleanup. 18529 * To be safe (HBA may need it), request clearing device 18530 * reset condition. 18531 */ 18532 sdinfo = SATA_CPORT_DRV_INFO(sata_hba_inst, saddr->cport); 18533 if (sdinfo != NULL) { 18534 sdinfo->satadrv_event_flags &= 18535 ~SATA_EVNT_INPROC_DEVICE_RESET; 18536 sdinfo->satadrv_event_flags |= 18537 SATA_EVNT_CLEAR_DEVICE_RESET; 18538 } 18539 return; 18540 } 18541 18542 sdinfo = SATA_CPORT_DRV_INFO(sata_hba_inst, saddr->cport); 18543 if (sdinfo == NULL) { 18544 return; 18545 } 18546 if ((sdinfo->satadrv_event_flags & 18547 SATA_EVNT_INPROC_DEVICE_RESET) == 0) { 18548 /* 18549 * Start tracking time for device feature restoration and 18550 * identification. Save current time (lbolt value). 18551 */ 18552 sdinfo->satadrv_reset_time = ddi_get_lbolt(); 18553 } 18554 /* Mark device reset processing as active */ 18555 sdinfo->satadrv_event_flags |= SATA_EVNT_INPROC_DEVICE_RESET; 18556 18557 old_sdinfo = *sdinfo; /* local copy of the drive info */ 18558 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex); 18559 18560 rval_set = sata_set_drive_features(sata_hba_inst, &old_sdinfo, 1); 18561 18562 if (rval_set != SATA_SUCCESS) { 18563 /* 18564 * Restoring drive setting failed. 18565 * Probe the port first, to check if the port state has changed 18566 */ 18567 sata_device.satadev_rev = SATA_DEVICE_REV; 18568 sata_device.satadev_addr = *saddr; 18569 sata_device.satadev_addr.qual = SATA_ADDR_CPORT; 18570 /* probe port */ 18571 rval_probe = (*SATA_PROBE_PORT_FUNC(sata_hba_inst)) 18572 (SATA_DIP(sata_hba_inst), &sata_device); 18573 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)-> 18574 cport_mutex); 18575 if (rval_probe == SATA_SUCCESS && 18576 (sata_device.satadev_state & 18577 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) == 0 && 18578 (sata_device.satadev_scr.sstatus & 18579 SATA_PORT_DEVLINK_UP_MASK) == SATA_PORT_DEVLINK_UP && 18580 sata_device.satadev_type != SATA_DTYPE_NONE) { 18581 /* 18582 * We may retry this a bit later - in-process reset 18583 * condition should be already set. 18584 * Track retry time for device identification. 18585 */ 18586 if ((cportinfo->cport_dev_type & 18587 SATA_VALID_DEV_TYPE) != 0 && 18588 SATA_CPORTINFO_DRV_INFO(cportinfo) != NULL && 18589 sdinfo->satadrv_reset_time != 0) { 18590 clock_t cur_time = ddi_get_lbolt(); 18591 /* 18592 * If the retry time limit was not 18593 * exceeded, retry. 18594 */ 18595 if ((cur_time - sdinfo->satadrv_reset_time) < 18596 drv_usectohz(SATA_DEV_REPROBE_TIMEOUT)) { 18597 mutex_enter( 18598 &sata_hba_inst->satahba_mutex); 18599 sata_hba_inst->satahba_event_flags |= 18600 SATA_EVNT_MAIN; 18601 mutex_exit( 18602 &sata_hba_inst->satahba_mutex); 18603 mutex_enter(&sata_mutex); 18604 sata_event_pending |= SATA_EVNT_MAIN; 18605 mutex_exit(&sata_mutex); 18606 return; 18607 } 18608 if (rval_set == SATA_RETRY) { 18609 /* 18610 * Setting drive features failed, but 18611 * the drive is still accessible, 18612 * so emit a warning message before 18613 * return. 18614 */ 18615 mutex_exit(&SATA_CPORT_INFO( 18616 sata_hba_inst, 18617 saddr->cport)->cport_mutex); 18618 goto done; 18619 } 18620 } 18621 /* Fail the drive */ 18622 sdinfo->satadrv_state = SATA_DSTATE_FAILED; 18623 18624 sata_log(sata_hba_inst, CE_WARN, 18625 "SATA device at port %d - device failed", 18626 saddr->cport); 18627 } 18628 /* 18629 * No point of retrying - device failed or some other event 18630 * processing or already did or will do port info cleanup. 18631 * To be safe (HBA may need it), 18632 * request clearing device reset condition. 18633 */ 18634 sdinfo->satadrv_event_flags |= SATA_EVNT_CLEAR_DEVICE_RESET; 18635 sdinfo->satadrv_event_flags &= ~SATA_EVNT_INPROC_DEVICE_RESET; 18636 sdinfo->satadrv_reset_time = 0; 18637 return; 18638 } 18639 done: 18640 /* 18641 * If setting of drive features failed, but the drive is still 18642 * accessible, emit a warning message. 18643 */ 18644 if (rval_set == SATA_RETRY) { 18645 sata_log(sata_hba_inst, CE_WARN, 18646 "SATA device at port %d - desired setting could not be " 18647 "restored after reset. Device may not operate as expected.", 18648 saddr->cport); 18649 } 18650 /* 18651 * Raise the flag indicating that the next sata command could 18652 * be sent with SATA_CLEAR_DEV_RESET_STATE flag, if no new device 18653 * reset is reported. 18654 */ 18655 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex); 18656 if (SATA_CPORTINFO_DRV_INFO(cportinfo) != NULL) { 18657 sdinfo->satadrv_reset_time = 0; 18658 if ((cportinfo->cport_dev_type & SATA_VALID_DEV_TYPE) != 0) { 18659 sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo); 18660 sdinfo->satadrv_event_flags &= 18661 ~SATA_EVNT_INPROC_DEVICE_RESET; 18662 sdinfo->satadrv_event_flags |= 18663 SATA_EVNT_CLEAR_DEVICE_RESET; 18664 } 18665 } 18666 } 18667 18668 18669 /* 18670 * Port Multiplier Port Device Reset Event processing. 18671 * 18672 * NOTE: This function has to be entered with pmport mutex held. It exits with 18673 * mutex held as well, but can release mutex during the processing. 18674 */ 18675 static void 18676 sata_process_pmdevice_reset(sata_hba_inst_t *sata_hba_inst, 18677 sata_address_t *saddr) 18678 { 18679 sata_drive_info_t old_sdinfo; /* local copy of the drive info */ 18680 sata_drive_info_t *sdinfo = NULL; 18681 sata_cport_info_t *cportinfo = NULL; 18682 sata_pmport_info_t *pmportinfo = NULL; 18683 sata_pmult_info_t *pminfo = NULL; 18684 sata_device_t sata_device; 18685 uint8_t cport = saddr->cport; 18686 uint8_t pmport = saddr->pmport; 18687 int rval; 18688 18689 SATADBG2(SATA_DBG_EVENTS_PROC, sata_hba_inst, 18690 "Processing drive reset at port %d:%d", cport, pmport); 18691 18692 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport); 18693 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, pmport); 18694 sdinfo = SATA_PMPORT_DRV_INFO(sata_hba_inst, cport, pmport); 18695 18696 /* 18697 * If the port is in SHUTDOWN or FAILED state, or device is in FAILED 18698 * state, ignore reset event. 18699 */ 18700 if (((cportinfo->cport_state & 18701 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) != 0) || 18702 (sdinfo->satadrv_state & SATA_DSTATE_FAILED) != 0) { 18703 sdinfo->satadrv_event_flags &= 18704 ~(SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET); 18705 return; 18706 } 18707 18708 if ((pmportinfo->pmport_dev_type & SATA_VALID_DEV_TYPE) == 0) { 18709 /* 18710 * This should not happen - coding error. 18711 * But we can recover, so do not panic, just clean up 18712 * and if in debug mode, log the message. 18713 */ 18714 #ifdef SATA_DEBUG 18715 sata_log(sata_hba_inst, CE_WARN, 18716 "sata_process_pmdevice_reset: " 18717 "Invalid device type with sdinfo!", NULL); 18718 #endif 18719 sdinfo->satadrv_event_flags = 0; 18720 return; 18721 } 18722 18723 #ifdef SATA_DEBUG 18724 if ((sdinfo->satadrv_event_flags & 18725 (SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET)) == 0) { 18726 /* Nothing to do */ 18727 /* Something is weird - why we are processing dev reset? */ 18728 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst, 18729 "No device reset event!!!!", NULL); 18730 18731 return; 18732 } 18733 if ((sdinfo->satadrv_event_flags & 18734 (SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET)) == 18735 (SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET)) { 18736 /* Something is weird - new device reset event */ 18737 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst, 18738 "Overlapping device reset events!", NULL); 18739 } 18740 #endif 18741 SATADBG2(SATA_DBG_EVENTS_PROC, sata_hba_inst, 18742 "Processing port %d:%d device reset", cport, pmport); 18743 18744 /* Clear event flag */ 18745 sdinfo->satadrv_event_flags &= ~SATA_EVNT_DEVICE_RESET; 18746 18747 /* It seems that we always need to check the port state first */ 18748 sata_device.satadev_rev = SATA_DEVICE_REV; 18749 sata_device.satadev_addr = *saddr; 18750 /* 18751 * We have to exit mutex, because the HBA probe port function may 18752 * block on its own mutex. 18753 */ 18754 mutex_exit(&pmportinfo->pmport_mutex); 18755 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst)) 18756 (SATA_DIP(sata_hba_inst), &sata_device); 18757 mutex_enter(&pmportinfo->pmport_mutex); 18758 18759 sata_update_pmport_info(sata_hba_inst, &sata_device); 18760 if (rval != SATA_SUCCESS) { 18761 /* Something went wrong? Fail the port */ 18762 pmportinfo->pmport_state = SATA_PSTATE_FAILED; 18763 sdinfo = SATA_PMPORT_DRV_INFO(sata_hba_inst, saddr->cport, 18764 saddr->pmport); 18765 if (sdinfo != NULL) 18766 sdinfo->satadrv_event_flags = 0; 18767 mutex_exit(&pmportinfo->pmport_mutex); 18768 SATA_LOG_D((sata_hba_inst, CE_WARN, 18769 "SATA port %d:%d probing failed", 18770 saddr->cport, saddr->pmport)); 18771 mutex_enter(&pmportinfo->pmport_mutex); 18772 return; 18773 } 18774 if ((sata_device.satadev_scr.sstatus & 18775 SATA_PORT_DEVLINK_UP_MASK) != 18776 SATA_PORT_DEVLINK_UP || 18777 sata_device.satadev_type == SATA_DTYPE_NONE) { 18778 /* 18779 * No device to process, anymore. Some other event processing 18780 * would or have already performed port info cleanup. 18781 * To be safe (HBA may need it), request clearing device 18782 * reset condition. 18783 */ 18784 sdinfo = SATA_PMPORT_DRV_INFO(sata_hba_inst, saddr->cport, 18785 saddr->pmport); 18786 if (sdinfo != NULL) { 18787 sdinfo->satadrv_event_flags &= 18788 ~SATA_EVNT_INPROC_DEVICE_RESET; 18789 /* must clear flags on cport */ 18790 pminfo = SATA_PMULT_INFO(sata_hba_inst, 18791 saddr->cport); 18792 pminfo->pmult_event_flags |= 18793 SATA_EVNT_CLEAR_DEVICE_RESET; 18794 } 18795 return; 18796 } 18797 18798 sdinfo = SATA_PMPORT_DRV_INFO(sata_hba_inst, saddr->cport, 18799 saddr->pmport); 18800 if (sdinfo == NULL) { 18801 return; 18802 } 18803 if ((sdinfo->satadrv_event_flags & 18804 SATA_EVNT_INPROC_DEVICE_RESET) == 0) { 18805 /* 18806 * Start tracking time for device feature restoration and 18807 * identification. Save current time (lbolt value). 18808 */ 18809 sdinfo->satadrv_reset_time = ddi_get_lbolt(); 18810 } 18811 /* Mark device reset processing as active */ 18812 sdinfo->satadrv_event_flags |= SATA_EVNT_INPROC_DEVICE_RESET; 18813 18814 old_sdinfo = *sdinfo; /* local copy of the drive info */ 18815 mutex_exit(&pmportinfo->pmport_mutex); 18816 18817 if (sata_set_drive_features(sata_hba_inst, &old_sdinfo, 1) == 18818 SATA_FAILURE) { 18819 /* 18820 * Restoring drive setting failed. 18821 * Probe the port first, to check if the port state has changed 18822 */ 18823 sata_device.satadev_rev = SATA_DEVICE_REV; 18824 sata_device.satadev_addr = *saddr; 18825 sata_device.satadev_addr.qual = SATA_ADDR_PMPORT; 18826 18827 /* probe port */ 18828 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst)) 18829 (SATA_DIP(sata_hba_inst), &sata_device); 18830 mutex_enter(&pmportinfo->pmport_mutex); 18831 if (rval == SATA_SUCCESS && 18832 (sata_device.satadev_state & 18833 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) == 0 && 18834 (sata_device.satadev_scr.sstatus & 18835 SATA_PORT_DEVLINK_UP_MASK) == SATA_PORT_DEVLINK_UP && 18836 sata_device.satadev_type != SATA_DTYPE_NONE) { 18837 /* 18838 * We may retry this a bit later - in-process reset 18839 * condition should be already set. 18840 * Track retry time for device identification. 18841 */ 18842 if ((pmportinfo->pmport_dev_type & 18843 SATA_VALID_DEV_TYPE) != 0 && 18844 SATA_PMPORTINFO_DRV_INFO(pmportinfo) != NULL && 18845 sdinfo->satadrv_reset_time != 0) { 18846 clock_t cur_time = ddi_get_lbolt(); 18847 /* 18848 * If the retry time limit was not 18849 * exceeded, retry. 18850 */ 18851 if ((cur_time - sdinfo->satadrv_reset_time) < 18852 drv_usectohz(SATA_DEV_REPROBE_TIMEOUT)) { 18853 mutex_enter( 18854 &sata_hba_inst->satahba_mutex); 18855 sata_hba_inst->satahba_event_flags |= 18856 SATA_EVNT_MAIN; 18857 mutex_exit( 18858 &sata_hba_inst->satahba_mutex); 18859 mutex_enter(&sata_mutex); 18860 sata_event_pending |= SATA_EVNT_MAIN; 18861 mutex_exit(&sata_mutex); 18862 return; 18863 } 18864 } 18865 /* Fail the drive */ 18866 sdinfo->satadrv_state = SATA_DSTATE_FAILED; 18867 18868 sata_log(sata_hba_inst, CE_WARN, 18869 "SATA device at port %d:%d - device failed", 18870 saddr->cport, saddr->pmport); 18871 } else { 18872 /* 18873 * No point of retrying - some other event processing 18874 * would or already did port info cleanup. 18875 * To be safe (HBA may need it), 18876 * request clearing device reset condition. 18877 */ 18878 sdinfo->satadrv_event_flags |= 18879 SATA_EVNT_CLEAR_DEVICE_RESET; 18880 } 18881 sdinfo->satadrv_event_flags &= ~SATA_EVNT_INPROC_DEVICE_RESET; 18882 sdinfo->satadrv_reset_time = 0; 18883 return; 18884 } 18885 /* 18886 * Raise the flag indicating that the next sata command could 18887 * be sent with SATA_CLEAR_DEV_RESET_STATE flag, if no new device 18888 * reset is reported. 18889 */ 18890 mutex_enter(&pmportinfo->pmport_mutex); 18891 if (SATA_PMPORTINFO_DRV_INFO(pmportinfo) != NULL) { 18892 sdinfo->satadrv_reset_time = 0; 18893 if (pmportinfo->pmport_dev_type & SATA_VALID_DEV_TYPE) { 18894 sdinfo = SATA_PMPORTINFO_DRV_INFO(pmportinfo); 18895 sdinfo->satadrv_event_flags &= 18896 ~SATA_EVNT_INPROC_DEVICE_RESET; 18897 /* must clear flags on cport */ 18898 pminfo = SATA_PMULT_INFO(sata_hba_inst, 18899 saddr->cport); 18900 pminfo->pmult_event_flags |= 18901 SATA_EVNT_CLEAR_DEVICE_RESET; 18902 } 18903 } 18904 } 18905 18906 /* 18907 * Port Link Events processing. 18908 * Every link established event may involve device reset (due to 18909 * COMRESET signal, equivalent of the hard reset) so arbitrarily 18910 * set device reset event for an attached device (if any). 18911 * If the port is in SHUTDOWN or FAILED state, ignore link events. 18912 * 18913 * The link established event processing varies, depending on the state 18914 * of the target node, HBA hotplugging capabilities, state of the port. 18915 * If the link is not active, the link established event is ignored. 18916 * If HBA cannot detect device attachment and there is no target node, 18917 * the link established event triggers device attach event processing. 18918 * Else, link established event triggers device reset event processing. 18919 * 18920 * The link lost event processing varies, depending on a HBA hotplugging 18921 * capability and the state of the port (link active or not active). 18922 * If the link is active, the lost link event is ignored. 18923 * If HBA cannot detect device removal, the lost link event triggers 18924 * device detached event processing after link lost timeout. 18925 * Else, the event is ignored. 18926 * 18927 * NOTE: Port multiplier ports events are handled by 18928 * sata_process_pmport_link_events(); 18929 */ 18930 static void 18931 sata_process_port_link_events(sata_hba_inst_t *sata_hba_inst, 18932 sata_address_t *saddr) 18933 { 18934 sata_device_t sata_device; 18935 sata_cport_info_t *cportinfo; 18936 sata_drive_info_t *sdinfo; 18937 uint32_t event_flags; 18938 int rval; 18939 18940 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst, 18941 "Processing port %d link event(s)", saddr->cport); 18942 18943 cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport); 18944 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex); 18945 event_flags = cportinfo->cport_event_flags; 18946 18947 /* Reset event flags first */ 18948 cportinfo->cport_event_flags &= 18949 ~(SATA_EVNT_LINK_ESTABLISHED | SATA_EVNT_LINK_LOST); 18950 18951 /* If the port is in SHUTDOWN or FAILED state, ignore link events. */ 18952 if ((cportinfo->cport_state & 18953 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) != 0) { 18954 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)-> 18955 cport_mutex); 18956 return; 18957 } 18958 18959 /* 18960 * For the sanity sake get current port state. 18961 * Set device address only. Other sata_device fields should be 18962 * set by HBA driver. 18963 */ 18964 sata_device.satadev_rev = SATA_DEVICE_REV; 18965 sata_device.satadev_addr = *saddr; 18966 /* 18967 * We have to exit mutex, because the HBA probe port function may 18968 * block on its own mutex. 18969 */ 18970 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex); 18971 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst)) 18972 (SATA_DIP(sata_hba_inst), &sata_device); 18973 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex); 18974 sata_update_port_info(sata_hba_inst, &sata_device); 18975 if (rval != SATA_SUCCESS) { 18976 /* Something went wrong? Fail the port */ 18977 cportinfo->cport_state = SATA_PSTATE_FAILED; 18978 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)-> 18979 cport_mutex); 18980 SATA_LOG_D((sata_hba_inst, CE_WARN, 18981 "SATA port %d probing failed", 18982 saddr->cport)); 18983 /* 18984 * We may want to release device info structure, but 18985 * it is not necessary. 18986 */ 18987 return; 18988 } else { 18989 /* port probed successfully */ 18990 cportinfo->cport_state |= SATA_STATE_PROBED | SATA_STATE_READY; 18991 } 18992 if (event_flags & SATA_EVNT_LINK_ESTABLISHED) { 18993 18994 if ((sata_device.satadev_scr.sstatus & 18995 SATA_PORT_DEVLINK_UP_MASK) != SATA_PORT_DEVLINK_UP) { 18996 /* Ignore event */ 18997 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst, 18998 "Ignoring port %d link established event - " 18999 "link down", 19000 saddr->cport); 19001 goto linklost; 19002 } 19003 19004 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst, 19005 "Processing port %d link established event", 19006 saddr->cport); 19007 19008 /* 19009 * For the sanity sake check if a device is attached - check 19010 * return state of a port probing. 19011 */ 19012 if (sata_device.satadev_type != SATA_DTYPE_NONE) { 19013 /* 19014 * HBA port probe indicated that there is a device 19015 * attached. Check if the framework had device info 19016 * structure attached for this device. 19017 */ 19018 if (cportinfo->cport_dev_type != SATA_DTYPE_NONE) { 19019 ASSERT(SATA_CPORTINFO_DRV_INFO(cportinfo) != 19020 NULL); 19021 19022 sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo); 19023 if ((sdinfo->satadrv_type & 19024 SATA_VALID_DEV_TYPE) != 0) { 19025 /* 19026 * Dev info structure is present. 19027 * If dev_type is set to known type in 19028 * the framework's drive info struct 19029 * then the device existed before and 19030 * the link was probably lost 19031 * momentarily - in such case 19032 * we may want to check device 19033 * identity. 19034 * Identity check is not supported now. 19035 * 19036 * Link established event 19037 * triggers device reset event. 19038 */ 19039 (SATA_CPORTINFO_DRV_INFO(cportinfo))-> 19040 satadrv_event_flags |= 19041 SATA_EVNT_DEVICE_RESET; 19042 } 19043 } else if (cportinfo->cport_dev_type == 19044 SATA_DTYPE_NONE) { 19045 /* 19046 * We got new device attached! If HBA does not 19047 * generate device attached events, trigger it 19048 * here. 19049 */ 19050 if (!(SATA_FEATURES(sata_hba_inst) & 19051 SATA_CTLF_HOTPLUG)) { 19052 cportinfo->cport_event_flags |= 19053 SATA_EVNT_DEVICE_ATTACHED; 19054 } 19055 } 19056 /* Reset link lost timeout */ 19057 cportinfo->cport_link_lost_time = 0; 19058 } 19059 } 19060 linklost: 19061 if (event_flags & SATA_EVNT_LINK_LOST) { 19062 if ((sata_device.satadev_scr.sstatus & 19063 SATA_PORT_DEVLINK_UP_MASK) == SATA_PORT_DEVLINK_UP) { 19064 /* Ignore event */ 19065 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst, 19066 "Ignoring port %d link lost event - link is up", 19067 saddr->cport); 19068 goto done; 19069 } 19070 #ifdef SATA_DEBUG 19071 if (cportinfo->cport_link_lost_time == 0) { 19072 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst, 19073 "Processing port %d link lost event", 19074 saddr->cport); 19075 } 19076 #endif 19077 /* 19078 * When HBA cannot generate device attached/detached events, 19079 * we need to track link lost time and eventually generate 19080 * device detach event. 19081 */ 19082 if (!(SATA_FEATURES(sata_hba_inst) & SATA_CTLF_HOTPLUG)) { 19083 /* We are tracking link lost time */ 19084 if (cportinfo->cport_link_lost_time == 0) { 19085 /* save current time (lbolt value) */ 19086 cportinfo->cport_link_lost_time = 19087 ddi_get_lbolt(); 19088 /* just keep link lost event */ 19089 cportinfo->cport_event_flags |= 19090 SATA_EVNT_LINK_LOST; 19091 } else { 19092 clock_t cur_time = ddi_get_lbolt(); 19093 if ((cur_time - 19094 cportinfo->cport_link_lost_time) >= 19095 drv_usectohz( 19096 SATA_EVNT_LINK_LOST_TIMEOUT)) { 19097 /* trigger device detach event */ 19098 cportinfo->cport_event_flags |= 19099 SATA_EVNT_DEVICE_DETACHED; 19100 cportinfo->cport_link_lost_time = 0; 19101 SATADBG1(SATA_DBG_EVENTS, 19102 sata_hba_inst, 19103 "Triggering port %d " 19104 "device detached event", 19105 saddr->cport); 19106 } else { 19107 /* keep link lost event */ 19108 cportinfo->cport_event_flags |= 19109 SATA_EVNT_LINK_LOST; 19110 } 19111 } 19112 } 19113 /* 19114 * We could change port state to disable/delay access to 19115 * the attached device until the link is recovered. 19116 */ 19117 } 19118 done: 19119 event_flags = cportinfo->cport_event_flags; 19120 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex); 19121 if (event_flags != 0) { 19122 mutex_enter(&sata_hba_inst->satahba_mutex); 19123 sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN; 19124 mutex_exit(&sata_hba_inst->satahba_mutex); 19125 mutex_enter(&sata_mutex); 19126 sata_event_pending |= SATA_EVNT_MAIN; 19127 mutex_exit(&sata_mutex); 19128 } 19129 } 19130 19131 /* 19132 * Port Multiplier Port Link Events processing. 19133 */ 19134 static void 19135 sata_process_pmport_link_events(sata_hba_inst_t *sata_hba_inst, 19136 sata_address_t *saddr) 19137 { 19138 sata_device_t sata_device; 19139 sata_pmport_info_t *pmportinfo = NULL; 19140 sata_drive_info_t *sdinfo = NULL; 19141 uint32_t event_flags; 19142 uint8_t cport = saddr->cport; 19143 uint8_t pmport = saddr->pmport; 19144 int rval; 19145 19146 SATADBG2(SATA_DBG_EVENTS_PROC, sata_hba_inst, 19147 "Processing port %d:%d link event(s)", 19148 cport, pmport); 19149 19150 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, pmport); 19151 mutex_enter(&pmportinfo->pmport_mutex); 19152 event_flags = pmportinfo->pmport_event_flags; 19153 19154 /* Reset event flags first */ 19155 pmportinfo->pmport_event_flags &= 19156 ~(SATA_EVNT_LINK_ESTABLISHED | SATA_EVNT_LINK_LOST); 19157 19158 /* If the port is in SHUTDOWN or FAILED state, ignore link events. */ 19159 if ((pmportinfo->pmport_state & 19160 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) != 0) { 19161 mutex_exit(&pmportinfo->pmport_mutex); 19162 return; 19163 } 19164 19165 /* 19166 * For the sanity sake get current port state. 19167 * Set device address only. Other sata_device fields should be 19168 * set by HBA driver. 19169 */ 19170 sata_device.satadev_rev = SATA_DEVICE_REV; 19171 sata_device.satadev_addr = *saddr; 19172 /* 19173 * We have to exit mutex, because the HBA probe port function may 19174 * block on its own mutex. 19175 */ 19176 mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst, saddr->cport, 19177 saddr->pmport)); 19178 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst)) 19179 (SATA_DIP(sata_hba_inst), &sata_device); 19180 mutex_enter(&SATA_PMPORT_MUTEX(sata_hba_inst, saddr->cport, 19181 saddr->pmport)); 19182 sata_update_pmport_info(sata_hba_inst, &sata_device); 19183 if (rval != SATA_SUCCESS) { 19184 /* Something went wrong? Fail the port */ 19185 pmportinfo->pmport_state = SATA_PSTATE_FAILED; 19186 mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst, saddr->cport, 19187 saddr->pmport)); 19188 SATA_LOG_D((sata_hba_inst, CE_WARN, 19189 "SATA port %d:%d probing failed", 19190 saddr->cport, saddr->pmport)); 19191 /* 19192 * We may want to release device info structure, but 19193 * it is not necessary. 19194 */ 19195 return; 19196 } else { 19197 /* port probed successfully */ 19198 pmportinfo->pmport_state |= 19199 SATA_STATE_PROBED | SATA_STATE_READY; 19200 } 19201 mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst, 19202 saddr->cport, saddr->pmport)); 19203 mutex_enter(&SATA_PMPORT_MUTEX(sata_hba_inst, 19204 saddr->cport, saddr->pmport)); 19205 if (event_flags & SATA_EVNT_LINK_ESTABLISHED) { 19206 19207 if ((sata_device.satadev_scr.sstatus & 19208 SATA_PORT_DEVLINK_UP_MASK) != SATA_PORT_DEVLINK_UP) { 19209 /* Ignore event */ 19210 SATADBG2(SATA_DBG_EVENTS_PROC, sata_hba_inst, 19211 "Ignoring port %d:%d link established event - " 19212 "link down", 19213 saddr->cport, saddr->pmport); 19214 goto linklost; 19215 } 19216 19217 SATADBG2(SATA_DBG_EVENTS_PROC, sata_hba_inst, 19218 "Processing port %d:%d link established event", 19219 cport, pmport); 19220 19221 /* 19222 * For the sanity sake check if a device is attached - check 19223 * return state of a port probing. 19224 */ 19225 if (sata_device.satadev_type != SATA_DTYPE_NONE && 19226 sata_device.satadev_type != SATA_DTYPE_PMULT) { 19227 /* 19228 * HBA port probe indicated that there is a device 19229 * attached. Check if the framework had device info 19230 * structure attached for this device. 19231 */ 19232 if (pmportinfo->pmport_dev_type != SATA_DTYPE_NONE) { 19233 ASSERT(SATA_PMPORTINFO_DRV_INFO(pmportinfo) != 19234 NULL); 19235 19236 sdinfo = SATA_PMPORTINFO_DRV_INFO(pmportinfo); 19237 if ((sdinfo->satadrv_type & 19238 SATA_VALID_DEV_TYPE) != 0) { 19239 /* 19240 * Dev info structure is present. 19241 * If dev_type is set to known type in 19242 * the framework's drive info struct 19243 * then the device existed before and 19244 * the link was probably lost 19245 * momentarily - in such case 19246 * we may want to check device 19247 * identity. 19248 * Identity check is not supported now. 19249 * 19250 * Link established event 19251 * triggers device reset event. 19252 */ 19253 (SATA_PMPORTINFO_DRV_INFO(pmportinfo))-> 19254 satadrv_event_flags |= 19255 SATA_EVNT_DEVICE_RESET; 19256 } 19257 } else if (pmportinfo->pmport_dev_type == 19258 SATA_DTYPE_NONE) { 19259 /* 19260 * We got new device attached! If HBA does not 19261 * generate device attached events, trigger it 19262 * here. 19263 */ 19264 if (!(SATA_FEATURES(sata_hba_inst) & 19265 SATA_CTLF_HOTPLUG)) { 19266 pmportinfo->pmport_event_flags |= 19267 SATA_EVNT_DEVICE_ATTACHED; 19268 } 19269 } 19270 /* Reset link lost timeout */ 19271 pmportinfo->pmport_link_lost_time = 0; 19272 } 19273 } 19274 linklost: 19275 if (event_flags & SATA_EVNT_LINK_LOST) { 19276 #ifdef SATA_DEBUG 19277 if (pmportinfo->pmport_link_lost_time == 0) { 19278 SATADBG2(SATA_DBG_EVENTS_PROC, sata_hba_inst, 19279 "Processing port %d:%d link lost event", 19280 saddr->cport, saddr->pmport); 19281 } 19282 #endif 19283 if ((sata_device.satadev_scr.sstatus & 19284 SATA_PORT_DEVLINK_UP_MASK) == SATA_PORT_DEVLINK_UP) { 19285 /* Ignore event */ 19286 SATADBG2(SATA_DBG_EVENTS_PROC, sata_hba_inst, 19287 "Ignoring port %d:%d link lost event - link is up", 19288 saddr->cport, saddr->pmport); 19289 goto done; 19290 } 19291 /* 19292 * When HBA cannot generate device attached/detached events, 19293 * we need to track link lost time and eventually generate 19294 * device detach event. 19295 */ 19296 if (!(SATA_FEATURES(sata_hba_inst) & SATA_CTLF_HOTPLUG)) { 19297 /* We are tracking link lost time */ 19298 if (pmportinfo->pmport_link_lost_time == 0) { 19299 /* save current time (lbolt value) */ 19300 pmportinfo->pmport_link_lost_time = 19301 ddi_get_lbolt(); 19302 /* just keep link lost event */ 19303 pmportinfo->pmport_event_flags |= 19304 SATA_EVNT_LINK_LOST; 19305 } else { 19306 clock_t cur_time = ddi_get_lbolt(); 19307 if ((cur_time - 19308 pmportinfo->pmport_link_lost_time) >= 19309 drv_usectohz( 19310 SATA_EVNT_LINK_LOST_TIMEOUT)) { 19311 /* trigger device detach event */ 19312 pmportinfo->pmport_event_flags |= 19313 SATA_EVNT_DEVICE_DETACHED; 19314 pmportinfo->pmport_link_lost_time = 0; 19315 SATADBG2(SATA_DBG_EVENTS, 19316 sata_hba_inst, 19317 "Triggering port %d:%d " 19318 "device detached event", 19319 saddr->cport, saddr->pmport); 19320 } else { 19321 /* keep link lost event */ 19322 pmportinfo->pmport_event_flags |= 19323 SATA_EVNT_LINK_LOST; 19324 } 19325 } 19326 } 19327 /* 19328 * We could change port state to disable/delay access to 19329 * the attached device until the link is recovered. 19330 */ 19331 } 19332 done: 19333 event_flags = pmportinfo->pmport_event_flags; 19334 mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst, saddr->cport, 19335 saddr->pmport)); 19336 if (event_flags != 0) { 19337 mutex_enter(&sata_hba_inst->satahba_mutex); 19338 sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN; 19339 mutex_exit(&sata_hba_inst->satahba_mutex); 19340 mutex_enter(&sata_mutex); 19341 sata_event_pending |= SATA_EVNT_MAIN; 19342 mutex_exit(&sata_mutex); 19343 } 19344 } 19345 19346 /* 19347 * Device Detached Event processing. 19348 * Port is probed to find if a device is really gone. If so, 19349 * the device info structure is detached from the SATA port info structure 19350 * and released. 19351 * Port status is updated. 19352 * 19353 * NOTE: Port multiplier ports events are handled by 19354 * sata_process_pmdevice_detached() 19355 */ 19356 static void 19357 sata_process_device_detached(sata_hba_inst_t *sata_hba_inst, 19358 sata_address_t *saddr) 19359 { 19360 sata_cport_info_t *cportinfo; 19361 sata_pmport_info_t *pmportinfo; 19362 sata_drive_info_t *sdevinfo; 19363 sata_device_t sata_device; 19364 sata_address_t pmport_addr; 19365 char name[16]; 19366 uint8_t cport = saddr->cport; 19367 int npmport; 19368 int rval; 19369 19370 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst, 19371 "Processing port %d device detached", saddr->cport); 19372 19373 cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport); 19374 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex); 19375 /* Clear event flag */ 19376 cportinfo->cport_event_flags &= ~SATA_EVNT_DEVICE_DETACHED; 19377 19378 /* If the port is in SHUTDOWN or FAILED state, ignore detach event. */ 19379 if ((cportinfo->cport_state & 19380 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) != 0) { 19381 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)-> 19382 cport_mutex); 19383 return; 19384 } 19385 /* For sanity, re-probe the port */ 19386 sata_device.satadev_rev = SATA_DEVICE_REV; 19387 sata_device.satadev_addr = *saddr; 19388 19389 /* 19390 * We have to exit mutex, because the HBA probe port function may 19391 * block on its own mutex. 19392 */ 19393 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex); 19394 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst)) 19395 (SATA_DIP(sata_hba_inst), &sata_device); 19396 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex); 19397 sata_update_port_info(sata_hba_inst, &sata_device); 19398 if (rval != SATA_SUCCESS) { 19399 /* Something went wrong? Fail the port */ 19400 cportinfo->cport_state = SATA_PSTATE_FAILED; 19401 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)-> 19402 cport_mutex); 19403 SATA_LOG_D((sata_hba_inst, CE_WARN, 19404 "SATA port %d probing failed", 19405 saddr->cport)); 19406 /* 19407 * We may want to release device info structure, but 19408 * it is not necessary. 19409 */ 19410 return; 19411 } else { 19412 /* port probed successfully */ 19413 cportinfo->cport_state |= SATA_STATE_PROBED | SATA_STATE_READY; 19414 } 19415 /* 19416 * Check if a device is still attached. For sanity, check also 19417 * link status - if no link, there is no device. 19418 */ 19419 if ((sata_device.satadev_scr.sstatus & SATA_PORT_DEVLINK_UP_MASK) == 19420 SATA_PORT_DEVLINK_UP && sata_device.satadev_type != 19421 SATA_DTYPE_NONE) { 19422 /* 19423 * Device is still attached - ignore detach event. 19424 */ 19425 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)-> 19426 cport_mutex); 19427 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst, 19428 "Ignoring detach - device still attached to port %d", 19429 sata_device.satadev_addr.cport); 19430 return; 19431 } 19432 /* 19433 * We need to detach and release device info structure here 19434 */ 19435 if (cportinfo->cport_dev_type == SATA_DTYPE_PMULT) { 19436 /* 19437 * A port-multiplier is removed. 19438 * 19439 * Calling sata_process_pmdevice_detached() does not work 19440 * here. The port multiplier is gone, so we cannot probe 19441 * sub-port any more and all pmult-related data structure must 19442 * be de-allocated immediately. Following structure of every 19443 * implemented sub-port behind the pmult are required to 19444 * released. 19445 * 19446 * - attachment point 19447 * - target node 19448 * - sata_drive_info 19449 * - sata_pmport_info 19450 */ 19451 for (npmport = 0; npmport < SATA_NUM_PMPORTS(sata_hba_inst, 19452 cport); npmport ++) { 19453 SATADBG2(SATA_DBG_PMULT|SATA_DBG_EVENTS_PROC, 19454 sata_hba_inst, 19455 "Detaching target node at port %d:%d", 19456 cport, npmport); 19457 19458 mutex_exit(&SATA_CPORT_MUTEX(sata_hba_inst, cport)); 19459 19460 /* Remove attachment point. */ 19461 name[0] = '\0'; 19462 (void) sprintf(name, "%d.%d", cport, npmport); 19463 ddi_remove_minor_node(SATA_DIP(sata_hba_inst), name); 19464 sata_log(sata_hba_inst, CE_NOTE, 19465 "Remove attachment point of port %d:%d", 19466 cport, npmport); 19467 19468 /* Remove target node */ 19469 pmport_addr.cport = cport; 19470 pmport_addr.pmport = (uint8_t)npmport; 19471 pmport_addr.qual = SATA_ADDR_PMPORT; 19472 sata_remove_target_node(sata_hba_inst, &pmport_addr); 19473 19474 mutex_enter(&SATA_CPORT_MUTEX(sata_hba_inst, cport)); 19475 19476 /* Release sata_pmport_info & sata_drive_info. */ 19477 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, 19478 cport, npmport); 19479 ASSERT(pmportinfo != NULL); 19480 19481 sdevinfo = SATA_PMPORTINFO_DRV_INFO(pmportinfo); 19482 if (sdevinfo != NULL) { 19483 (void) kmem_free((void *) sdevinfo, 19484 sizeof (sata_drive_info_t)); 19485 } 19486 19487 /* Release sata_pmport_info at last */ 19488 (void) kmem_free((void *) pmportinfo, 19489 sizeof (sata_pmport_info_t)); 19490 } 19491 19492 /* Finally, release sata_pmult_info */ 19493 (void) kmem_free((void *) 19494 SATA_CPORTINFO_PMULT_INFO(cportinfo), 19495 sizeof (sata_pmult_info_t)); 19496 SATA_CPORTINFO_PMULT_INFO(cportinfo) = NULL; 19497 19498 sata_log(sata_hba_inst, CE_WARN, 19499 "SATA port-multiplier detached at port %d", cport); 19500 19501 cportinfo->cport_dev_type = SATA_DTYPE_NONE; 19502 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, 19503 saddr->cport)->cport_mutex); 19504 } else { 19505 if (SATA_CPORTINFO_DRV_INFO(cportinfo) != NULL) { 19506 sdevinfo = SATA_CPORTINFO_DRV_INFO(cportinfo); 19507 SATA_CPORTINFO_DRV_INFO(cportinfo) = NULL; 19508 (void) kmem_free((void *)sdevinfo, 19509 sizeof (sata_drive_info_t)); 19510 } 19511 sata_log(sata_hba_inst, CE_WARN, 19512 "SATA device detached at port %d", cport); 19513 19514 cportinfo->cport_dev_type = SATA_DTYPE_NONE; 19515 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, 19516 saddr->cport)->cport_mutex); 19517 19518 /* 19519 * Try to offline a device and remove target node 19520 * if it still exists 19521 */ 19522 sata_remove_target_node(sata_hba_inst, saddr); 19523 } 19524 19525 19526 /* 19527 * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE 19528 * with the hint: SE_HINT_REMOVE 19529 */ 19530 sata_gen_sysevent(sata_hba_inst, saddr, SE_HINT_REMOVE); 19531 } 19532 19533 /* 19534 * Port Multiplier Port Device Deattached Event processing. 19535 * 19536 * NOTE: No Mutex should be hold. 19537 */ 19538 static void 19539 sata_process_pmdevice_detached(sata_hba_inst_t *sata_hba_inst, 19540 sata_address_t *saddr) 19541 { 19542 sata_pmport_info_t *pmportinfo; 19543 sata_drive_info_t *sdevinfo; 19544 sata_device_t sata_device; 19545 int rval; 19546 uint8_t cport, pmport; 19547 19548 cport = saddr->cport; 19549 pmport = saddr->pmport; 19550 19551 SATADBG2(SATA_DBG_EVENTS_PROC, sata_hba_inst, 19552 "Processing port %d:%d device detached", 19553 cport, pmport); 19554 19555 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, pmport); 19556 mutex_enter(&SATA_PMPORT_MUTEX(sata_hba_inst, cport, pmport)); 19557 19558 /* Clear event flag */ 19559 pmportinfo->pmport_event_flags &= ~SATA_EVNT_DEVICE_DETACHED; 19560 19561 /* If the port is in SHUTDOWN or FAILED state, ignore detach event. */ 19562 if ((pmportinfo->pmport_state & 19563 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) != 0) { 19564 mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst, cport, pmport)); 19565 return; 19566 } 19567 /* For sanity, re-probe the port */ 19568 sata_device.satadev_rev = SATA_DEVICE_REV; 19569 sata_device.satadev_addr = *saddr; 19570 19571 /* 19572 * We have to exit mutex, because the HBA probe port function may 19573 * block on its own mutex. 19574 */ 19575 mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst, cport, pmport)); 19576 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst)) 19577 (SATA_DIP(sata_hba_inst), &sata_device); 19578 mutex_enter(&SATA_PMPORT_MUTEX(sata_hba_inst, cport, pmport)); 19579 sata_update_pmport_info(sata_hba_inst, &sata_device); 19580 if (rval != SATA_SUCCESS) { 19581 /* Something went wrong? Fail the port */ 19582 pmportinfo->pmport_state = SATA_PSTATE_FAILED; 19583 mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst, cport, pmport)); 19584 SATA_LOG_D((sata_hba_inst, CE_WARN, 19585 "SATA port %d:%d probing failed", 19586 saddr->pmport)); 19587 /* 19588 * We may want to release device info structure, but 19589 * it is not necessary. 19590 */ 19591 return; 19592 } else { 19593 /* port probed successfully */ 19594 pmportinfo->pmport_state |= 19595 SATA_STATE_PROBED | SATA_STATE_READY; 19596 } 19597 /* 19598 * Check if a device is still attached. For sanity, check also 19599 * link status - if no link, there is no device. 19600 */ 19601 if ((sata_device.satadev_scr.sstatus & SATA_PORT_DEVLINK_UP_MASK) == 19602 SATA_PORT_DEVLINK_UP && sata_device.satadev_type != 19603 SATA_DTYPE_NONE) { 19604 /* 19605 * Device is still attached - ignore detach event. 19606 */ 19607 mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst, cport, pmport)); 19608 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst, 19609 "Ignoring detach - device still attached to port %d", 19610 sata_device.satadev_addr.pmport); 19611 return; 19612 } 19613 /* 19614 * We need to detach and release device info structure here 19615 */ 19616 if (SATA_PMPORTINFO_DRV_INFO(pmportinfo) != NULL) { 19617 sdevinfo = SATA_PMPORTINFO_DRV_INFO(pmportinfo); 19618 SATA_PMPORTINFO_DRV_INFO(pmportinfo) = NULL; 19619 (void) kmem_free((void *)sdevinfo, 19620 sizeof (sata_drive_info_t)); 19621 } 19622 pmportinfo->pmport_dev_type = SATA_DTYPE_NONE; 19623 /* 19624 * Device cannot be reached anymore, even if the target node may be 19625 * still present. 19626 */ 19627 mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst, cport, pmport)); 19628 19629 /* 19630 * Try to offline a device and remove target node if it still exists 19631 */ 19632 sata_remove_target_node(sata_hba_inst, saddr); 19633 19634 /* 19635 * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE 19636 * with the hint: SE_HINT_REMOVE 19637 */ 19638 sata_gen_sysevent(sata_hba_inst, saddr, SE_HINT_REMOVE); 19639 } 19640 19641 19642 /* 19643 * Device Attached Event processing. 19644 * Port state is checked to verify that a device is really attached. If so, 19645 * the device info structure is created and attached to the SATA port info 19646 * structure. 19647 * 19648 * If attached device cannot be identified or set-up, the retry for the 19649 * attach processing is set-up. Subsequent daemon run would try again to 19650 * identify the device, until the time limit is reached 19651 * (SATA_DEV_IDENTIFY_TIMEOUT). 19652 * 19653 * This function cannot be called in interrupt context (it may sleep). 19654 * 19655 * NOTE: Port multiplier ports events are handled by 19656 * sata_process_pmdevice_attached() 19657 */ 19658 static void 19659 sata_process_device_attached(sata_hba_inst_t *sata_hba_inst, 19660 sata_address_t *saddr) 19661 { 19662 sata_cport_info_t *cportinfo = NULL; 19663 sata_drive_info_t *sdevinfo = NULL; 19664 sata_pmult_info_t *pmultinfo = NULL; 19665 sata_pmport_info_t *pmportinfo = NULL; 19666 sata_device_t sata_device; 19667 dev_info_t *tdip; 19668 uint32_t event_flags = 0, pmult_event_flags = 0; 19669 int rval; 19670 int npmport; 19671 19672 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst, 19673 "Processing port %d device attached", saddr->cport); 19674 19675 cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport); 19676 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex); 19677 19678 /* Clear attach event flag first */ 19679 cportinfo->cport_event_flags &= ~SATA_EVNT_DEVICE_ATTACHED; 19680 19681 /* If the port is in SHUTDOWN or FAILED state, ignore event. */ 19682 if ((cportinfo->cport_state & 19683 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) != 0) { 19684 cportinfo->cport_dev_attach_time = 0; 19685 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)-> 19686 cport_mutex); 19687 return; 19688 } 19689 19690 /* 19691 * If the sata_drive_info structure is found attached to the port info, 19692 * despite the fact the device was removed and now it is re-attached, 19693 * the old drive info structure was not removed. 19694 * Arbitrarily release device info structure. 19695 */ 19696 if (SATA_CPORTINFO_DRV_INFO(cportinfo) != NULL) { 19697 sdevinfo = SATA_CPORTINFO_DRV_INFO(cportinfo); 19698 SATA_CPORTINFO_DRV_INFO(cportinfo) = NULL; 19699 (void) kmem_free((void *)sdevinfo, 19700 sizeof (sata_drive_info_t)); 19701 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst, 19702 "Arbitrarily detaching old device info.", NULL); 19703 } 19704 cportinfo->cport_dev_type = SATA_DTYPE_NONE; 19705 19706 /* For sanity, re-probe the port */ 19707 sata_device.satadev_rev = SATA_DEVICE_REV; 19708 sata_device.satadev_addr = *saddr; 19709 19710 /* 19711 * We have to exit mutex, because the HBA probe port function may 19712 * block on its own mutex. 19713 */ 19714 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex); 19715 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst)) 19716 (SATA_DIP(sata_hba_inst), &sata_device); 19717 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex); 19718 sata_update_port_info(sata_hba_inst, &sata_device); 19719 if (rval != SATA_SUCCESS) { 19720 /* Something went wrong? Fail the port */ 19721 cportinfo->cport_state = SATA_PSTATE_FAILED; 19722 cportinfo->cport_dev_attach_time = 0; 19723 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)-> 19724 cport_mutex); 19725 SATA_LOG_D((sata_hba_inst, CE_WARN, 19726 "SATA port %d probing failed", 19727 saddr->cport)); 19728 return; 19729 } else { 19730 /* port probed successfully */ 19731 cportinfo->cport_state |= SATA_STATE_PROBED | SATA_STATE_READY; 19732 } 19733 /* 19734 * Check if a device is still attached. For sanity, check also 19735 * link status - if no link, there is no device. 19736 */ 19737 if ((sata_device.satadev_scr.sstatus & SATA_PORT_DEVLINK_UP_MASK) != 19738 SATA_PORT_DEVLINK_UP || sata_device.satadev_type == 19739 SATA_DTYPE_NONE) { 19740 /* 19741 * No device - ignore attach event. 19742 */ 19743 cportinfo->cport_dev_attach_time = 0; 19744 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)-> 19745 cport_mutex); 19746 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst, 19747 "Ignoring attach - no device connected to port %d", 19748 sata_device.satadev_addr.cport); 19749 return; 19750 } 19751 19752 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex); 19753 /* 19754 * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE 19755 * with the hint: SE_HINT_INSERT 19756 */ 19757 sata_gen_sysevent(sata_hba_inst, saddr, SE_HINT_INSERT); 19758 19759 /* 19760 * Port reprobing will take care of the creation of the device 19761 * info structure and determination of the device type. 19762 */ 19763 sata_device.satadev_addr = *saddr; 19764 (void) sata_reprobe_port(sata_hba_inst, &sata_device, 19765 SATA_DEV_IDENTIFY_NORETRY); 19766 19767 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)-> 19768 cport_mutex); 19769 if ((cportinfo->cport_state & SATA_STATE_READY) && 19770 (cportinfo->cport_dev_type != SATA_DTYPE_NONE)) { 19771 /* Some device is attached to the port */ 19772 if (cportinfo->cport_dev_type == SATA_DTYPE_UNKNOWN) { 19773 /* 19774 * A device was not successfully attached. 19775 * Track retry time for device identification. 19776 */ 19777 if (cportinfo->cport_dev_attach_time != 0) { 19778 clock_t cur_time = ddi_get_lbolt(); 19779 /* 19780 * If the retry time limit was not exceeded, 19781 * reinstate attach event. 19782 */ 19783 if ((cur_time - 19784 cportinfo->cport_dev_attach_time) < 19785 drv_usectohz( 19786 SATA_DEV_IDENTIFY_TIMEOUT)) { 19787 /* OK, restore attach event */ 19788 cportinfo->cport_event_flags |= 19789 SATA_EVNT_DEVICE_ATTACHED; 19790 } else { 19791 /* Timeout - cannot identify device */ 19792 cportinfo->cport_dev_attach_time = 0; 19793 sata_log(sata_hba_inst, 19794 CE_WARN, 19795 "Could not identify SATA device " 19796 "at port %d", 19797 saddr->cport); 19798 } 19799 } else { 19800 /* 19801 * Start tracking time for device 19802 * identification. 19803 * Save current time (lbolt value). 19804 */ 19805 cportinfo->cport_dev_attach_time = 19806 ddi_get_lbolt(); 19807 /* Restore attach event */ 19808 cportinfo->cport_event_flags |= 19809 SATA_EVNT_DEVICE_ATTACHED; 19810 } 19811 } else if (cportinfo->cport_dev_type == SATA_DTYPE_PMULT) { 19812 cportinfo->cport_dev_attach_time = 0; 19813 sata_log(sata_hba_inst, CE_NOTE, 19814 "SATA port-multiplier detected at port %d", 19815 saddr->cport); 19816 19817 if (SATA_CPORTINFO_PMULT_INFO(cportinfo) != NULL) { 19818 /* Log the info of new port multiplier */ 19819 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, 19820 saddr->cport)->cport_mutex); 19821 sata_show_pmult_info(sata_hba_inst, 19822 &sata_device); 19823 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, 19824 saddr->cport)->cport_mutex); 19825 } 19826 19827 ASSERT(SATA_CPORTINFO_PMULT_INFO(cportinfo) != NULL); 19828 pmultinfo = SATA_CPORTINFO_PMULT_INFO(cportinfo); 19829 for (npmport = 0; npmport < 19830 pmultinfo->pmult_num_dev_ports; npmport++) { 19831 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, 19832 saddr->cport, npmport); 19833 ASSERT(pmportinfo != NULL); 19834 19835 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, 19836 saddr->cport)->cport_mutex); 19837 mutex_enter(&pmportinfo->pmport_mutex); 19838 /* Marked all pmports with link events. */ 19839 pmportinfo->pmport_event_flags = 19840 SATA_EVNT_LINK_ESTABLISHED; 19841 pmult_event_flags |= 19842 pmportinfo->pmport_event_flags; 19843 mutex_exit(&pmportinfo->pmport_mutex); 19844 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, 19845 saddr->cport)->cport_mutex); 19846 } 19847 /* Auto-online is not available for PMult now. */ 19848 19849 } else { 19850 /* 19851 * If device was successfully attached, the subsequent 19852 * action depends on a state of the 19853 * sata_auto_online variable. If it is set to zero. 19854 * an explicit 'configure' command will be needed to 19855 * configure it. If its value is non-zero, we will 19856 * attempt to online (configure) the device. 19857 * First, log the message indicating that a device 19858 * was attached. 19859 */ 19860 cportinfo->cport_dev_attach_time = 0; 19861 sata_log(sata_hba_inst, CE_WARN, 19862 "SATA device detected at port %d", saddr->cport); 19863 19864 if (SATA_CPORTINFO_DRV_INFO(cportinfo) != NULL) { 19865 sata_drive_info_t new_sdinfo; 19866 19867 /* Log device info data */ 19868 new_sdinfo = *(SATA_CPORTINFO_DRV_INFO( 19869 cportinfo)); 19870 sata_show_drive_info(sata_hba_inst, 19871 &new_sdinfo); 19872 } 19873 19874 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, 19875 saddr->cport)->cport_mutex); 19876 19877 /* 19878 * Make sure that there is no target node for that 19879 * device. If so, release it. It should not happen, 19880 * unless we had problem removing the node when 19881 * device was detached. 19882 */ 19883 tdip = sata_get_target_dip(SATA_DIP(sata_hba_inst), 19884 saddr->cport, saddr->pmport); 19885 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, 19886 saddr->cport)->cport_mutex); 19887 if (tdip != NULL) { 19888 19889 #ifdef SATA_DEBUG 19890 if ((cportinfo->cport_event_flags & 19891 SATA_EVNT_TARGET_NODE_CLEANUP) == 0) 19892 sata_log(sata_hba_inst, CE_WARN, 19893 "sata_process_device_attached: " 19894 "old device target node exists!"); 19895 #endif 19896 /* 19897 * target node exists - try to unconfigure 19898 * device and remove the node. 19899 */ 19900 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, 19901 saddr->cport)->cport_mutex); 19902 rval = ndi_devi_offline(tdip, 19903 NDI_DEVI_REMOVE); 19904 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, 19905 saddr->cport)->cport_mutex); 19906 19907 if (rval == NDI_SUCCESS) { 19908 cportinfo->cport_event_flags &= 19909 ~SATA_EVNT_TARGET_NODE_CLEANUP; 19910 cportinfo->cport_tgtnode_clean = B_TRUE; 19911 } else { 19912 /* 19913 * PROBLEM - the target node remained 19914 * and it belongs to a previously 19915 * attached device. 19916 * This happens when the file was open 19917 * or the node was waiting for 19918 * resources at the time the 19919 * associated device was removed. 19920 * Instruct event daemon to retry the 19921 * cleanup later. 19922 */ 19923 sata_log(sata_hba_inst, 19924 CE_WARN, 19925 "Application(s) accessing " 19926 "previously attached SATA " 19927 "device have to release " 19928 "it before newly inserted " 19929 "device can be made accessible.", 19930 saddr->cport); 19931 cportinfo->cport_event_flags |= 19932 SATA_EVNT_TARGET_NODE_CLEANUP; 19933 cportinfo->cport_tgtnode_clean = 19934 B_FALSE; 19935 } 19936 } 19937 if (sata_auto_online != 0) { 19938 cportinfo->cport_event_flags |= 19939 SATA_EVNT_AUTOONLINE_DEVICE; 19940 } 19941 19942 } 19943 } else { 19944 cportinfo->cport_dev_attach_time = 0; 19945 } 19946 19947 event_flags = cportinfo->cport_event_flags; 19948 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex); 19949 if (event_flags != 0 || pmult_event_flags != 0) { 19950 mutex_enter(&sata_hba_inst->satahba_mutex); 19951 sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN; 19952 mutex_exit(&sata_hba_inst->satahba_mutex); 19953 mutex_enter(&sata_mutex); 19954 sata_event_pending |= SATA_EVNT_MAIN; 19955 mutex_exit(&sata_mutex); 19956 } 19957 } 19958 19959 /* 19960 * Port Multiplier Port Device Attached Event processing. 19961 * 19962 * NOTE: No Mutex should be hold. 19963 */ 19964 static void 19965 sata_process_pmdevice_attached(sata_hba_inst_t *sata_hba_inst, 19966 sata_address_t *saddr) 19967 { 19968 sata_pmport_info_t *pmportinfo; 19969 sata_drive_info_t *sdinfo; 19970 sata_device_t sata_device; 19971 dev_info_t *tdip; 19972 uint32_t event_flags; 19973 uint8_t cport = saddr->cport; 19974 uint8_t pmport = saddr->pmport; 19975 int rval; 19976 19977 SATADBG2(SATA_DBG_EVENTS_PROC, sata_hba_inst, 19978 "Processing port %d:%d device attached", cport, pmport); 19979 19980 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, pmport); 19981 19982 mutex_enter(&pmportinfo->pmport_mutex); 19983 19984 /* Clear attach event flag first */ 19985 pmportinfo->pmport_event_flags &= ~SATA_EVNT_DEVICE_ATTACHED; 19986 19987 /* If the port is in SHUTDOWN or FAILED state, ignore event. */ 19988 if ((pmportinfo->pmport_state & 19989 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) != 0) { 19990 pmportinfo->pmport_dev_attach_time = 0; 19991 mutex_exit(&pmportinfo->pmport_mutex); 19992 return; 19993 } 19994 19995 /* 19996 * If the sata_drive_info structure is found attached to the port info, 19997 * despite the fact the device was removed and now it is re-attached, 19998 * the old drive info structure was not removed. 19999 * Arbitrarily release device info structure. 20000 */ 20001 if (SATA_PMPORTINFO_DRV_INFO(pmportinfo) != NULL) { 20002 sdinfo = SATA_PMPORTINFO_DRV_INFO(pmportinfo); 20003 SATA_PMPORTINFO_DRV_INFO(pmportinfo) = NULL; 20004 (void) kmem_free((void *)sdinfo, 20005 sizeof (sata_drive_info_t)); 20006 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst, 20007 "Arbitrarily detaching old device info.", NULL); 20008 } 20009 pmportinfo->pmport_dev_type = SATA_DTYPE_NONE; 20010 20011 /* For sanity, re-probe the port */ 20012 sata_device.satadev_rev = SATA_DEVICE_REV; 20013 sata_device.satadev_addr = *saddr; 20014 20015 /* 20016 * We have to exit mutex, because the HBA probe port function may 20017 * block on its own mutex. 20018 */ 20019 mutex_exit(&pmportinfo->pmport_mutex); 20020 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst)) 20021 (SATA_DIP(sata_hba_inst), &sata_device); 20022 mutex_enter(&pmportinfo->pmport_mutex); 20023 20024 sata_update_pmport_info(sata_hba_inst, &sata_device); 20025 if (rval != SATA_SUCCESS) { 20026 /* Something went wrong? Fail the port */ 20027 pmportinfo->pmport_state = SATA_PSTATE_FAILED; 20028 pmportinfo->pmport_dev_attach_time = 0; 20029 mutex_exit(&pmportinfo->pmport_mutex); 20030 SATA_LOG_D((sata_hba_inst, CE_WARN, 20031 "SATA port %d:%d probing failed", cport, pmport)); 20032 return; 20033 } else { 20034 /* pmport probed successfully */ 20035 pmportinfo->pmport_state |= 20036 SATA_STATE_PROBED | SATA_STATE_READY; 20037 } 20038 /* 20039 * Check if a device is still attached. For sanity, check also 20040 * link status - if no link, there is no device. 20041 */ 20042 if ((sata_device.satadev_scr.sstatus & SATA_PORT_DEVLINK_UP_MASK) != 20043 SATA_PORT_DEVLINK_UP || sata_device.satadev_type == 20044 SATA_DTYPE_NONE) { 20045 /* 20046 * No device - ignore attach event. 20047 */ 20048 pmportinfo->pmport_dev_attach_time = 0; 20049 mutex_exit(&pmportinfo->pmport_mutex); 20050 SATADBG2(SATA_DBG_EVENTS_PROC, sata_hba_inst, 20051 "Ignoring attach - no device connected to port %d:%d", 20052 cport, pmport); 20053 return; 20054 } 20055 20056 mutex_exit(&pmportinfo->pmport_mutex); 20057 /* 20058 * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE 20059 * with the hint: SE_HINT_INSERT 20060 */ 20061 sata_gen_sysevent(sata_hba_inst, saddr, SE_HINT_INSERT); 20062 20063 /* 20064 * Port reprobing will take care of the creation of the device 20065 * info structure and determination of the device type. 20066 */ 20067 sata_device.satadev_addr = *saddr; 20068 (void) sata_reprobe_port(sata_hba_inst, &sata_device, 20069 SATA_DEV_IDENTIFY_NORETRY); 20070 20071 mutex_enter(&pmportinfo->pmport_mutex); 20072 if ((pmportinfo->pmport_state & SATA_STATE_READY) && 20073 (pmportinfo->pmport_dev_type != SATA_DTYPE_NONE)) { 20074 /* Some device is attached to the port */ 20075 if (pmportinfo->pmport_dev_type == SATA_DTYPE_UNKNOWN) { 20076 /* 20077 * A device was not successfully attached. 20078 * Track retry time for device identification. 20079 */ 20080 if (pmportinfo->pmport_dev_attach_time != 0) { 20081 clock_t cur_time = ddi_get_lbolt(); 20082 /* 20083 * If the retry time limit was not exceeded, 20084 * reinstate attach event. 20085 */ 20086 if ((cur_time - 20087 pmportinfo->pmport_dev_attach_time) < 20088 drv_usectohz( 20089 SATA_DEV_IDENTIFY_TIMEOUT)) { 20090 /* OK, restore attach event */ 20091 pmportinfo->pmport_event_flags |= 20092 SATA_EVNT_DEVICE_ATTACHED; 20093 } else { 20094 /* Timeout - cannot identify device */ 20095 pmportinfo->pmport_dev_attach_time = 0; 20096 sata_log(sata_hba_inst, CE_WARN, 20097 "Could not identify SATA device " 20098 "at port %d:%d", 20099 cport, pmport); 20100 } 20101 } else { 20102 /* 20103 * Start tracking time for device 20104 * identification. 20105 * Save current time (lbolt value). 20106 */ 20107 pmportinfo->pmport_dev_attach_time = 20108 ddi_get_lbolt(); 20109 /* Restore attach event */ 20110 pmportinfo->pmport_event_flags |= 20111 SATA_EVNT_DEVICE_ATTACHED; 20112 } 20113 } else { 20114 /* 20115 * If device was successfully attached, the subsequent 20116 * action depends on a state of the 20117 * sata_auto_online variable. If it is set to zero. 20118 * an explicit 'configure' command will be needed to 20119 * configure it. If its value is non-zero, we will 20120 * attempt to online (configure) the device. 20121 * First, log the message indicating that a device 20122 * was attached. 20123 */ 20124 pmportinfo->pmport_dev_attach_time = 0; 20125 sata_log(sata_hba_inst, CE_WARN, 20126 "SATA device detected at port %d:%d", 20127 cport, pmport); 20128 20129 if (SATA_PMPORTINFO_DRV_INFO(pmportinfo) != NULL) { 20130 sata_drive_info_t new_sdinfo; 20131 20132 /* Log device info data */ 20133 new_sdinfo = *(SATA_PMPORTINFO_DRV_INFO( 20134 pmportinfo)); 20135 sata_show_drive_info(sata_hba_inst, 20136 &new_sdinfo); 20137 } 20138 20139 mutex_exit(&pmportinfo->pmport_mutex); 20140 20141 /* 20142 * Make sure that there is no target node for that 20143 * device. If so, release it. It should not happen, 20144 * unless we had problem removing the node when 20145 * device was detached. 20146 */ 20147 tdip = sata_get_target_dip(SATA_DIP(sata_hba_inst), 20148 saddr->cport, saddr->pmport); 20149 mutex_enter(&pmportinfo->pmport_mutex); 20150 if (tdip != NULL) { 20151 20152 #ifdef SATA_DEBUG 20153 if ((pmportinfo->pmport_event_flags & 20154 SATA_EVNT_TARGET_NODE_CLEANUP) == 0) 20155 sata_log(sata_hba_inst, CE_WARN, 20156 "sata_process_device_attached: " 20157 "old device target node exists!"); 20158 #endif 20159 /* 20160 * target node exists - try to unconfigure 20161 * device and remove the node. 20162 */ 20163 mutex_exit(&pmportinfo->pmport_mutex); 20164 rval = ndi_devi_offline(tdip, 20165 NDI_DEVI_REMOVE); 20166 mutex_enter(&pmportinfo->pmport_mutex); 20167 20168 if (rval == NDI_SUCCESS) { 20169 pmportinfo->pmport_event_flags &= 20170 ~SATA_EVNT_TARGET_NODE_CLEANUP; 20171 pmportinfo->pmport_tgtnode_clean = 20172 B_TRUE; 20173 } else { 20174 /* 20175 * PROBLEM - the target node remained 20176 * and it belongs to a previously 20177 * attached device. 20178 * This happens when the file was open 20179 * or the node was waiting for 20180 * resources at the time the 20181 * associated device was removed. 20182 * Instruct event daemon to retry the 20183 * cleanup later. 20184 */ 20185 sata_log(sata_hba_inst, 20186 CE_WARN, 20187 "Application(s) accessing " 20188 "previously attached SATA " 20189 "device have to release " 20190 "it before newly inserted " 20191 "device can be made accessible." 20192 "at port %d:%d", 20193 cport, pmport); 20194 pmportinfo->pmport_event_flags |= 20195 SATA_EVNT_TARGET_NODE_CLEANUP; 20196 pmportinfo->pmport_tgtnode_clean = 20197 B_FALSE; 20198 } 20199 } 20200 if (sata_auto_online != 0) { 20201 pmportinfo->pmport_event_flags |= 20202 SATA_EVNT_AUTOONLINE_DEVICE; 20203 } 20204 20205 } 20206 } else { 20207 pmportinfo->pmport_dev_attach_time = 0; 20208 } 20209 20210 event_flags = pmportinfo->pmport_event_flags; 20211 mutex_exit(&pmportinfo->pmport_mutex); 20212 if (event_flags != 0) { 20213 mutex_enter(&sata_hba_inst->satahba_mutex); 20214 sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN; 20215 mutex_exit(&sata_hba_inst->satahba_mutex); 20216 mutex_enter(&sata_mutex); 20217 sata_event_pending |= SATA_EVNT_MAIN; 20218 mutex_exit(&sata_mutex); 20219 } 20220 20221 /* clear the reset_in_progress events */ 20222 if (SATA_PMPORTINFO_DRV_INFO(pmportinfo) != NULL) { 20223 if (pmportinfo->pmport_dev_type & SATA_VALID_DEV_TYPE) { 20224 /* must clear flags on cport */ 20225 sata_pmult_info_t *pminfo = 20226 SATA_PMULT_INFO(sata_hba_inst, 20227 saddr->cport); 20228 pminfo->pmult_event_flags |= 20229 SATA_EVNT_CLEAR_DEVICE_RESET; 20230 } 20231 } 20232 } 20233 20234 /* 20235 * Device Target Node Cleanup Event processing. 20236 * If the target node associated with a sata port device is in 20237 * DEVI_DEVICE_REMOVED state, an attempt is made to remove it. 20238 * If the target node cannot be removed, the event flag is left intact, 20239 * so that event daemon may re-run this function later. 20240 * 20241 * This function cannot be called in interrupt context (it may sleep). 20242 * 20243 * NOTE: Processes cport events only, not port multiplier ports. 20244 */ 20245 static void 20246 sata_process_target_node_cleanup(sata_hba_inst_t *sata_hba_inst, 20247 sata_address_t *saddr) 20248 { 20249 sata_cport_info_t *cportinfo; 20250 dev_info_t *tdip; 20251 20252 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst, 20253 "Processing port %d device target node cleanup", saddr->cport); 20254 20255 cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport); 20256 20257 /* 20258 * Check if there is target node for that device and it is in the 20259 * DEVI_DEVICE_REMOVED state. If so, release it. 20260 */ 20261 tdip = sata_get_target_dip(SATA_DIP(sata_hba_inst), saddr->cport, 20262 saddr->pmport); 20263 if (tdip != NULL) { 20264 /* 20265 * target node exists - check if it is target node of 20266 * a removed device. 20267 */ 20268 if (sata_check_device_removed(tdip) == B_TRUE) { 20269 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst, 20270 "sata_process_target_node_cleanup: " 20271 "old device target node exists!", NULL); 20272 /* 20273 * Unconfigure and remove the target node 20274 */ 20275 if (ndi_devi_offline(tdip, NDI_DEVI_REMOVE) == 20276 NDI_SUCCESS) { 20277 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, 20278 saddr->cport)->cport_mutex); 20279 cportinfo->cport_event_flags &= 20280 ~SATA_EVNT_TARGET_NODE_CLEANUP; 20281 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, 20282 saddr->cport)->cport_mutex); 20283 return; 20284 } 20285 /* 20286 * Event daemon will retry the cleanup later. 20287 */ 20288 mutex_enter(&sata_hba_inst->satahba_mutex); 20289 sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN; 20290 mutex_exit(&sata_hba_inst->satahba_mutex); 20291 mutex_enter(&sata_mutex); 20292 sata_event_pending |= SATA_EVNT_MAIN; 20293 mutex_exit(&sata_mutex); 20294 } 20295 } else { 20296 if (saddr->qual == SATA_ADDR_CPORT || 20297 saddr->qual == SATA_ADDR_DCPORT) { 20298 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, 20299 saddr->cport)->cport_mutex); 20300 cportinfo->cport_event_flags &= 20301 ~SATA_EVNT_TARGET_NODE_CLEANUP; 20302 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, 20303 saddr->cport)->cport_mutex); 20304 } else { 20305 /* sanity check */ 20306 if (SATA_CPORT_DEV_TYPE(sata_hba_inst, saddr->cport) != 20307 SATA_DTYPE_PMULT || SATA_PMULT_INFO(sata_hba_inst, 20308 saddr->cport) == NULL) 20309 return; 20310 if (SATA_PMPORT_INFO(sata_hba_inst, saddr->cport, 20311 saddr->pmport) == NULL) 20312 return; 20313 20314 mutex_enter(&SATA_PMPORT_INFO(sata_hba_inst, 20315 saddr->cport, saddr->pmport)->pmport_mutex); 20316 SATA_PMPORT_INFO(sata_hba_inst, saddr->cport, 20317 saddr->pmport)->pmport_event_flags &= 20318 ~SATA_EVNT_TARGET_NODE_CLEANUP; 20319 mutex_exit(&SATA_PMPORT_INFO(sata_hba_inst, 20320 saddr->cport, saddr->pmport)->pmport_mutex); 20321 } 20322 } 20323 } 20324 20325 /* 20326 * Device AutoOnline Event processing. 20327 * If attached device is to be onlined, an attempt is made to online this 20328 * device, but only if there is no lingering (old) target node present. 20329 * If the device cannot be onlined, the event flag is left intact, 20330 * so that event daemon may re-run this function later. 20331 * 20332 * This function cannot be called in interrupt context (it may sleep). 20333 * 20334 * NOTE: Processes cport events only, not port multiplier ports. 20335 */ 20336 static void 20337 sata_process_device_autoonline(sata_hba_inst_t *sata_hba_inst, 20338 sata_address_t *saddr) 20339 { 20340 sata_cport_info_t *cportinfo; 20341 sata_drive_info_t *sdinfo; 20342 sata_device_t sata_device; 20343 dev_info_t *tdip; 20344 20345 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst, 20346 "Processing port %d attached device auto-onlining", saddr->cport); 20347 20348 cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport); 20349 20350 /* 20351 * Check if device is present and recognized. If not, reset event. 20352 */ 20353 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex); 20354 if ((cportinfo->cport_dev_type & SATA_VALID_DEV_TYPE) == 0) { 20355 /* Nothing to online */ 20356 cportinfo->cport_event_flags &= ~SATA_EVNT_AUTOONLINE_DEVICE; 20357 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, 20358 saddr->cport)->cport_mutex); 20359 return; 20360 } 20361 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex); 20362 20363 /* 20364 * Check if there is target node for this device and if it is in the 20365 * DEVI_DEVICE_REMOVED state. If so, abort onlining but keep 20366 * the event for later processing. 20367 */ 20368 tdip = sata_get_target_dip(SATA_DIP(sata_hba_inst), saddr->cport, 20369 saddr->pmport); 20370 if (tdip != NULL) { 20371 /* 20372 * target node exists - check if it is target node of 20373 * a removed device. 20374 */ 20375 if (sata_check_device_removed(tdip) == B_TRUE) { 20376 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst, 20377 "sata_process_device_autoonline: " 20378 "old device target node exists!", NULL); 20379 /* 20380 * Event daemon will retry device onlining later. 20381 */ 20382 mutex_enter(&sata_hba_inst->satahba_mutex); 20383 sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN; 20384 mutex_exit(&sata_hba_inst->satahba_mutex); 20385 mutex_enter(&sata_mutex); 20386 sata_event_pending |= SATA_EVNT_MAIN; 20387 mutex_exit(&sata_mutex); 20388 return; 20389 } 20390 /* 20391 * If the target node is not in the 'removed" state, assume 20392 * that it belongs to this device. There is nothing more to do, 20393 * but reset the event. 20394 */ 20395 } else { 20396 20397 /* 20398 * Try to online the device 20399 * If there is any reset-related event, remove it. We are 20400 * configuring the device and no state restoring is needed. 20401 */ 20402 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, 20403 saddr->cport)->cport_mutex); 20404 sata_device.satadev_addr = *saddr; 20405 if (saddr->qual == SATA_ADDR_CPORT) 20406 sata_device.satadev_addr.qual = SATA_ADDR_DCPORT; 20407 else 20408 sata_device.satadev_addr.qual = SATA_ADDR_DPMPORT; 20409 sdinfo = sata_get_device_info(sata_hba_inst, &sata_device); 20410 if (sdinfo != NULL) { 20411 if (sdinfo->satadrv_event_flags & 20412 (SATA_EVNT_DEVICE_RESET | 20413 SATA_EVNT_INPROC_DEVICE_RESET)) 20414 sdinfo->satadrv_event_flags = 0; 20415 sdinfo->satadrv_event_flags |= 20416 SATA_EVNT_CLEAR_DEVICE_RESET; 20417 20418 /* Need to create a new target node. */ 20419 cportinfo->cport_tgtnode_clean = B_TRUE; 20420 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, 20421 saddr->cport)->cport_mutex); 20422 tdip = sata_create_target_node(SATA_DIP(sata_hba_inst), 20423 sata_hba_inst, &sata_device.satadev_addr); 20424 if (tdip == NULL) { 20425 /* 20426 * Configure (onlining) failed. 20427 * We will NOT retry 20428 */ 20429 SATA_LOG_D((sata_hba_inst, CE_WARN, 20430 "sata_process_device_autoonline: " 20431 "configuring SATA device at port %d failed", 20432 saddr->cport)); 20433 } 20434 } else { 20435 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, 20436 saddr->cport)->cport_mutex); 20437 } 20438 20439 } 20440 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex); 20441 cportinfo->cport_event_flags &= ~SATA_EVNT_AUTOONLINE_DEVICE; 20442 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, 20443 saddr->cport)->cport_mutex); 20444 } 20445 20446 20447 static void 20448 sata_gen_sysevent(sata_hba_inst_t *sata_hba_inst, sata_address_t *saddr, 20449 int hint) 20450 { 20451 char ap[MAXPATHLEN]; 20452 nvlist_t *ev_attr_list = NULL; 20453 int err; 20454 20455 /* Allocate and build sysevent attribute list */ 20456 err = nvlist_alloc(&ev_attr_list, NV_UNIQUE_NAME_TYPE, DDI_NOSLEEP); 20457 if (err != 0) { 20458 SATA_LOG_D((sata_hba_inst, CE_WARN, 20459 "sata_gen_sysevent: " 20460 "cannot allocate memory for sysevent attributes\n")); 20461 return; 20462 } 20463 /* Add hint attribute */ 20464 err = nvlist_add_string(ev_attr_list, DR_HINT, SE_HINT2STR(hint)); 20465 if (err != 0) { 20466 SATA_LOG_D((sata_hba_inst, CE_WARN, 20467 "sata_gen_sysevent: " 20468 "failed to add DR_HINT attr for sysevent")); 20469 nvlist_free(ev_attr_list); 20470 return; 20471 } 20472 /* 20473 * Add AP attribute. 20474 * Get controller pathname and convert it into AP pathname by adding 20475 * a target number. 20476 */ 20477 (void) snprintf(ap, MAXPATHLEN, "/devices"); 20478 (void) ddi_pathname(SATA_DIP(sata_hba_inst), ap + strlen(ap)); 20479 (void) snprintf(ap + strlen(ap), MAXPATHLEN - strlen(ap), ":%d", 20480 SATA_MAKE_AP_NUMBER(saddr->cport, saddr->pmport, saddr->qual)); 20481 20482 err = nvlist_add_string(ev_attr_list, DR_AP_ID, ap); 20483 if (err != 0) { 20484 SATA_LOG_D((sata_hba_inst, CE_WARN, 20485 "sata_gen_sysevent: " 20486 "failed to add DR_AP_ID attr for sysevent")); 20487 nvlist_free(ev_attr_list); 20488 return; 20489 } 20490 20491 /* Generate/log sysevent */ 20492 err = ddi_log_sysevent(SATA_DIP(sata_hba_inst), DDI_VENDOR_SUNW, EC_DR, 20493 ESC_DR_AP_STATE_CHANGE, ev_attr_list, NULL, DDI_NOSLEEP); 20494 if (err != DDI_SUCCESS) { 20495 SATA_LOG_D((sata_hba_inst, CE_WARN, 20496 "sata_gen_sysevent: " 20497 "cannot log sysevent, err code %x\n", err)); 20498 } 20499 20500 nvlist_free(ev_attr_list); 20501 } 20502 20503 20504 20505 20506 /* 20507 * Set DEVI_DEVICE_REMOVED state in the SATA device target node. 20508 */ 20509 static void 20510 sata_set_device_removed(dev_info_t *tdip) 20511 { 20512 int circ; 20513 20514 ASSERT(tdip != NULL); 20515 20516 ndi_devi_enter(tdip, &circ); 20517 mutex_enter(&DEVI(tdip)->devi_lock); 20518 DEVI_SET_DEVICE_REMOVED(tdip); 20519 mutex_exit(&DEVI(tdip)->devi_lock); 20520 ndi_devi_exit(tdip, circ); 20521 } 20522 20523 20524 /* 20525 * Set internal event instructing event daemon to try 20526 * to perform the target node cleanup. 20527 */ 20528 static void 20529 sata_set_target_node_cleanup(sata_hba_inst_t *sata_hba_inst, 20530 sata_address_t *saddr) 20531 { 20532 if (saddr->qual == SATA_ADDR_CPORT || 20533 saddr->qual == SATA_ADDR_DCPORT) { 20534 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, 20535 saddr->cport)->cport_mutex); 20536 SATA_CPORT_EVENT_FLAGS(sata_hba_inst, saddr->cport) |= 20537 SATA_EVNT_TARGET_NODE_CLEANUP; 20538 SATA_CPORT_INFO(sata_hba_inst, saddr->cport)-> 20539 cport_tgtnode_clean = B_FALSE; 20540 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, 20541 saddr->cport)->cport_mutex); 20542 } else { 20543 mutex_enter(&SATA_PMPORT_INFO(sata_hba_inst, 20544 saddr->cport, saddr->pmport)->pmport_mutex); 20545 SATA_PMPORT_EVENT_FLAGS(sata_hba_inst, saddr->cport, 20546 saddr->pmport) |= SATA_EVNT_TARGET_NODE_CLEANUP; 20547 SATA_PMPORT_INFO(sata_hba_inst, saddr->cport, saddr->pmport)-> 20548 pmport_tgtnode_clean = B_FALSE; 20549 mutex_exit(&SATA_PMPORT_INFO(sata_hba_inst, 20550 saddr->cport, saddr->pmport)->pmport_mutex); 20551 } 20552 mutex_enter(&sata_hba_inst->satahba_mutex); 20553 sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN; 20554 mutex_exit(&sata_hba_inst->satahba_mutex); 20555 mutex_enter(&sata_mutex); 20556 sata_event_pending |= SATA_EVNT_MAIN; 20557 mutex_exit(&sata_mutex); 20558 } 20559 20560 20561 /* 20562 * Check if the SATA device target node is in DEVI_DEVICE_REMOVED state, 20563 * i.e. check if the target node state indicates that it belongs to a removed 20564 * device. 20565 * 20566 * Returns B_TRUE if the target node is in DEVI_DEVICE_REMOVED state, 20567 * B_FALSE otherwise. 20568 */ 20569 static boolean_t 20570 sata_check_device_removed(dev_info_t *tdip) 20571 { 20572 ASSERT(tdip != NULL); 20573 20574 if (DEVI_IS_DEVICE_REMOVED(tdip)) 20575 return (B_TRUE); 20576 else 20577 return (B_FALSE); 20578 } 20579 20580 20581 /* 20582 * Check for DMA error. Return B_TRUE if error, B_FALSE otherwise. 20583 */ 20584 static boolean_t 20585 sata_check_for_dma_error(dev_info_t *dip, sata_pkt_txlate_t *spx) 20586 { 20587 int fm_capability = ddi_fm_capable(dip); 20588 ddi_fm_error_t de; 20589 20590 if (fm_capability & DDI_FM_DMACHK_CAPABLE) { 20591 if (spx->txlt_buf_dma_handle != NULL) { 20592 ddi_fm_dma_err_get(spx->txlt_buf_dma_handle, &de, 20593 DDI_FME_VERSION); 20594 if (de.fme_status != DDI_SUCCESS) 20595 return (B_TRUE); 20596 } 20597 } 20598 return (B_FALSE); 20599 } 20600 20601 20602 /* ************************ FAULT INJECTTION **************************** */ 20603 20604 #ifdef SATA_INJECT_FAULTS 20605 20606 static uint32_t sata_fault_count = 0; 20607 static uint32_t sata_fault_suspend_count = 0; 20608 20609 /* 20610 * Inject sata pkt fault 20611 * It modifies returned values of the sata packet. 20612 * It returns immediately if: 20613 * pkt fault injection is not enabled (via sata_inject_fault, 20614 * sata_inject_fault_count), or invalid fault is specified (sata_fault_type), 20615 * or pkt does not contain command to be faulted (set in sata_fault_cmd), or 20616 * pkt is not directed to specified fault controller/device 20617 * (sata_fault_ctrl_dev and sata_fault_device). 20618 * If fault controller is not specified, fault injection applies to all 20619 * controllers and devices. 20620 * 20621 * First argument is the pointer to the executed sata packet. 20622 * Second argument is a pointer to a value returned by the HBA tran_start 20623 * function. 20624 * Third argument specifies injected error. Injected sata packet faults 20625 * are the satapkt_reason values. 20626 * SATA_PKT_BUSY -1 Not completed, busy 20627 * SATA_PKT_DEV_ERROR 1 Device reported error 20628 * SATA_PKT_QUEUE_FULL 2 Not accepted, queue full 20629 * SATA_PKT_PORT_ERROR 3 Not completed, port error 20630 * SATA_PKT_CMD_UNSUPPORTED 4 Cmd unsupported 20631 * SATA_PKT_ABORTED 5 Aborted by request 20632 * SATA_PKT_TIMEOUT 6 Operation timeut 20633 * SATA_PKT_RESET 7 Aborted by reset request 20634 * 20635 * Additional global variables affecting the execution: 20636 * 20637 * sata_inject_fault_count variable specifies number of times in row the 20638 * error is injected. Value of -1 specifies permanent fault, ie. every time 20639 * the fault injection point is reached, the fault is injected and a pause 20640 * between fault injection specified by sata_inject_fault_pause_count is 20641 * ignored). Fault injection routine decrements sata_inject_fault_count 20642 * (if greater than zero) until it reaches 0. No fault is injected when 20643 * sata_inject_fault_count is 0 (zero). 20644 * 20645 * sata_inject_fault_pause_count variable specifies number of times a fault 20646 * injection is bypassed (pause between fault injections). 20647 * If set to 0, a fault is injected only a number of times specified by 20648 * sata_inject_fault_count. 20649 * 20650 * The fault counts are static, so for periodic errors they have to be manually 20651 * reset to start repetition sequence from scratch. 20652 * If the original value returned by the HBA tran_start function is not 20653 * SATA_TRAN_ACCEPTED and pkt reason is not SATA_PKT_COMPLETED, no error 20654 * is injected (to avoid masking real problems); 20655 * 20656 * NOTE: In its current incarnation, this function should be invoked only for 20657 * commands executed in SYNCHRONOUS mode. 20658 */ 20659 20660 20661 static void 20662 sata_inject_pkt_fault(sata_pkt_t *spkt, int *rval, int fault) 20663 { 20664 20665 if (sata_inject_fault != SATA_INJECT_PKT_FAULT) 20666 return; 20667 20668 if (sata_inject_fault_count == 0) 20669 return; 20670 20671 if (fault == 0) 20672 return; 20673 20674 if (sata_fault_cmd != spkt->satapkt_cmd.satacmd_cmd_reg) 20675 return; 20676 20677 if (sata_fault_ctrl != NULL) { 20678 sata_pkt_txlate_t *spx = 20679 (sata_pkt_txlate_t *)spkt->satapkt_framework_private; 20680 20681 if (sata_fault_ctrl != NULL && sata_fault_ctrl != 20682 spx->txlt_sata_hba_inst->satahba_dip) 20683 return; 20684 20685 if (sata_fault_device.satadev_addr.cport != 20686 spkt->satapkt_device.satadev_addr.cport || 20687 sata_fault_device.satadev_addr.pmport != 20688 spkt->satapkt_device.satadev_addr.pmport || 20689 sata_fault_device.satadev_addr.qual != 20690 spkt->satapkt_device.satadev_addr.qual) 20691 return; 20692 } 20693 20694 /* Modify pkt return parameters */ 20695 if (*rval != SATA_TRAN_ACCEPTED || 20696 spkt->satapkt_reason != SATA_PKT_COMPLETED) { 20697 sata_fault_count = 0; 20698 sata_fault_suspend_count = 0; 20699 return; 20700 } 20701 if (sata_fault_count == 0 && sata_fault_suspend_count != 0) { 20702 /* Pause in the injection */ 20703 sata_fault_suspend_count -= 1; 20704 return; 20705 } 20706 20707 if (sata_fault_count == 0 && sata_fault_suspend_count == 0) { 20708 /* 20709 * Init inject fault cycle. If fault count is set to -1, 20710 * it is a permanent fault. 20711 */ 20712 if (sata_inject_fault_count != -1) { 20713 sata_fault_count = sata_inject_fault_count; 20714 sata_fault_suspend_count = 20715 sata_inject_fault_pause_count; 20716 if (sata_fault_suspend_count == 0) 20717 sata_inject_fault_count = 0; 20718 } 20719 } 20720 20721 if (sata_fault_count != 0) 20722 sata_fault_count -= 1; 20723 20724 switch (fault) { 20725 case SATA_PKT_BUSY: 20726 *rval = SATA_TRAN_BUSY; 20727 spkt->satapkt_reason = SATA_PKT_BUSY; 20728 break; 20729 20730 case SATA_PKT_QUEUE_FULL: 20731 *rval = SATA_TRAN_QUEUE_FULL; 20732 spkt->satapkt_reason = SATA_PKT_QUEUE_FULL; 20733 break; 20734 20735 case SATA_PKT_CMD_UNSUPPORTED: 20736 *rval = SATA_TRAN_CMD_UNSUPPORTED; 20737 spkt->satapkt_reason = SATA_PKT_CMD_UNSUPPORTED; 20738 break; 20739 20740 case SATA_PKT_PORT_ERROR: 20741 /* This is "rejected" command */ 20742 *rval = SATA_TRAN_PORT_ERROR; 20743 spkt->satapkt_reason = SATA_PKT_PORT_ERROR; 20744 /* Additional error setup could be done here - port state */ 20745 break; 20746 20747 case SATA_PKT_DEV_ERROR: 20748 spkt->satapkt_reason = SATA_PKT_DEV_ERROR; 20749 /* 20750 * Additional error setup could be done here 20751 */ 20752 break; 20753 20754 case SATA_PKT_ABORTED: 20755 spkt->satapkt_reason = SATA_PKT_ABORTED; 20756 break; 20757 20758 case SATA_PKT_TIMEOUT: 20759 spkt->satapkt_reason = SATA_PKT_TIMEOUT; 20760 /* Additional error setup could be done here */ 20761 break; 20762 20763 case SATA_PKT_RESET: 20764 spkt->satapkt_reason = SATA_PKT_RESET; 20765 /* 20766 * Additional error setup could be done here - device reset 20767 */ 20768 break; 20769 20770 default: 20771 break; 20772 } 20773 } 20774 20775 #endif 20776 20777 /* 20778 * SATA Trace Ring Buffer 20779 * ---------------------- 20780 * 20781 * Overview 20782 * 20783 * The SATA trace ring buffer is a ring buffer created and managed by 20784 * the SATA framework module that can be used by any module or driver 20785 * within the SATA framework to store debug messages. 20786 * 20787 * Ring Buffer Interfaces: 20788 * 20789 * sata_vtrace_debug() <-- Adds debug message to ring buffer 20790 * sata_trace_debug() <-- Wraps varargs into sata_vtrace_debug() 20791 * 20792 * Note that the sata_trace_debug() interface was created to give 20793 * consumers the flexibilty of sending debug messages to ring buffer 20794 * as variable arguments. Consumers can send type va_list debug 20795 * messages directly to sata_vtrace_debug(). The sata_trace_debug() 20796 * and sata_vtrace_debug() relationship is similar to that of 20797 * cmn_err(9F) and vcmn_err(9F). 20798 * 20799 * Below is a diagram of the SATA trace ring buffer interfaces and 20800 * sample consumers: 20801 * 20802 * +---------------------------------+ 20803 * | o o SATA Framework Module | 20804 * | o SATA o +------------------+ +------------------+ 20805 * |o Trace o <--|sata_vtrace_debug/|<-----|SATA HBA Driver #1| 20806 * |o R-Buf o |sata_trace_debug |<--+ +------------------+ 20807 * | o o +------------------+ | +------------------+ 20808 * | o o ^ | +--|SATA HBA Driver #2| 20809 * | | | +------------------+ 20810 * | +------------------+ | 20811 * | |SATA Debug Message| | 20812 * | +------------------+ | 20813 * +---------------------------------+ 20814 * 20815 * Supporting Routines: 20816 * 20817 * sata_trace_rbuf_alloc() <-- Initializes ring buffer 20818 * sata_trace_rbuf_free() <-- Destroys ring buffer 20819 * sata_trace_dmsg_alloc() <-- Creates or reuses buffer in ring buffer 20820 * sata_trace_dmsg_free() <-- Destroys content of ring buffer 20821 * 20822 * The default SATA trace ring buffer size is defined by DMSG_RING_SIZE. 20823 * The ring buffer size can be adjusted by setting dmsg_ring_size in 20824 * /etc/system to desired size in unit of bytes. 20825 * 20826 * The individual debug message size in the ring buffer is restricted 20827 * to DMSG_BUF_SIZE. 20828 */ 20829 void 20830 sata_vtrace_debug(dev_info_t *dip, const char *fmt, va_list ap) 20831 { 20832 sata_trace_dmsg_t *dmsg; 20833 20834 if (sata_debug_rbuf == NULL) { 20835 return; 20836 } 20837 20838 /* 20839 * If max size of ring buffer is smaller than size 20840 * required for one debug message then just return 20841 * since we have no room for the debug message. 20842 */ 20843 if (sata_debug_rbuf->maxsize < (sizeof (sata_trace_dmsg_t))) { 20844 return; 20845 } 20846 20847 mutex_enter(&sata_debug_rbuf->lock); 20848 20849 /* alloc or reuse on ring buffer */ 20850 dmsg = sata_trace_dmsg_alloc(); 20851 20852 if (dmsg == NULL) { 20853 /* resource allocation failed */ 20854 mutex_exit(&sata_debug_rbuf->lock); 20855 return; 20856 } 20857 20858 dmsg->dip = dip; 20859 gethrestime(&dmsg->timestamp); 20860 20861 (void) vsnprintf(dmsg->buf, sizeof (dmsg->buf), fmt, ap); 20862 20863 mutex_exit(&sata_debug_rbuf->lock); 20864 } 20865 20866 void 20867 sata_trace_debug(dev_info_t *dip, const char *fmt, ...) 20868 { 20869 va_list ap; 20870 20871 va_start(ap, fmt); 20872 sata_vtrace_debug(dip, fmt, ap); 20873 va_end(ap); 20874 } 20875 20876 /* 20877 * This routine is used to manage debug messages 20878 * on ring buffer. 20879 */ 20880 static sata_trace_dmsg_t * 20881 sata_trace_dmsg_alloc(void) 20882 { 20883 sata_trace_dmsg_t *dmsg_alloc, *dmsg = sata_debug_rbuf->dmsgp; 20884 20885 if (sata_debug_rbuf->looped == TRUE) { 20886 sata_debug_rbuf->dmsgp = dmsg->next; 20887 return (sata_debug_rbuf->dmsgp); 20888 } 20889 20890 /* 20891 * If we're looping for the first time, 20892 * connect the ring. 20893 */ 20894 if (((sata_debug_rbuf->size + (sizeof (sata_trace_dmsg_t))) > 20895 sata_debug_rbuf->maxsize) && (sata_debug_rbuf->dmsgh != NULL)) { 20896 dmsg->next = sata_debug_rbuf->dmsgh; 20897 sata_debug_rbuf->dmsgp = sata_debug_rbuf->dmsgh; 20898 sata_debug_rbuf->looped = TRUE; 20899 return (sata_debug_rbuf->dmsgp); 20900 } 20901 20902 /* If we've gotten this far then memory allocation is needed */ 20903 dmsg_alloc = kmem_zalloc(sizeof (sata_trace_dmsg_t), KM_NOSLEEP); 20904 if (dmsg_alloc == NULL) { 20905 sata_debug_rbuf->allocfailed++; 20906 return (dmsg_alloc); 20907 } else { 20908 sata_debug_rbuf->size += sizeof (sata_trace_dmsg_t); 20909 } 20910 20911 if (sata_debug_rbuf->dmsgp != NULL) { 20912 dmsg->next = dmsg_alloc; 20913 sata_debug_rbuf->dmsgp = dmsg->next; 20914 return (sata_debug_rbuf->dmsgp); 20915 } else { 20916 /* 20917 * We should only be here if we're initializing 20918 * the ring buffer. 20919 */ 20920 if (sata_debug_rbuf->dmsgh == NULL) { 20921 sata_debug_rbuf->dmsgh = dmsg_alloc; 20922 } else { 20923 /* Something is wrong */ 20924 kmem_free(dmsg_alloc, sizeof (sata_trace_dmsg_t)); 20925 return (NULL); 20926 } 20927 20928 sata_debug_rbuf->dmsgp = dmsg_alloc; 20929 return (sata_debug_rbuf->dmsgp); 20930 } 20931 } 20932 20933 20934 /* 20935 * Free all messages on debug ring buffer. 20936 */ 20937 static void 20938 sata_trace_dmsg_free(void) 20939 { 20940 sata_trace_dmsg_t *dmsg_next, *dmsg = sata_debug_rbuf->dmsgh; 20941 20942 while (dmsg != NULL) { 20943 dmsg_next = dmsg->next; 20944 kmem_free(dmsg, sizeof (sata_trace_dmsg_t)); 20945 20946 /* 20947 * If we've looped around the ring than we're done. 20948 */ 20949 if (dmsg_next == sata_debug_rbuf->dmsgh) { 20950 break; 20951 } else { 20952 dmsg = dmsg_next; 20953 } 20954 } 20955 } 20956 20957 20958 /* 20959 * This function can block 20960 */ 20961 static void 20962 sata_trace_rbuf_alloc(void) 20963 { 20964 sata_debug_rbuf = kmem_zalloc(sizeof (sata_trace_rbuf_t), KM_SLEEP); 20965 20966 mutex_init(&sata_debug_rbuf->lock, NULL, MUTEX_DRIVER, NULL); 20967 20968 if (dmsg_ring_size > 0) { 20969 sata_debug_rbuf->maxsize = (size_t)dmsg_ring_size; 20970 } 20971 } 20972 20973 20974 static void 20975 sata_trace_rbuf_free(void) 20976 { 20977 sata_trace_dmsg_free(); 20978 mutex_destroy(&sata_debug_rbuf->lock); 20979 kmem_free(sata_debug_rbuf, sizeof (sata_trace_rbuf_t)); 20980 } 20981 20982 /* 20983 * If SATA_DEBUG is not defined then this routine is called instead 20984 * of sata_log() via the SATA_LOG_D macro. 20985 */ 20986 static void 20987 sata_trace_log(sata_hba_inst_t *sata_hba_inst, uint_t level, 20988 const char *fmt, ...) 20989 { 20990 #ifndef __lock_lint 20991 _NOTE(ARGUNUSED(level)) 20992 #endif 20993 20994 dev_info_t *dip = NULL; 20995 va_list ap; 20996 20997 if (sata_hba_inst != NULL) { 20998 dip = SATA_DIP(sata_hba_inst); 20999 } 21000 21001 va_start(ap, fmt); 21002 sata_vtrace_debug(dip, fmt, ap); 21003 va_end(ap); 21004 } 21005