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 * Copyright 2018 Nexenta Systems, Inc. All rights reserved. 25 * Copyright (c) 2018, Joyent, Inc. 26 * Copyright 2018 OmniOS Community Edition (OmniOSce) Association. 27 */ 28 29 /* 30 * AHCI (Advanced Host Controller Interface) SATA HBA Driver 31 * 32 * Power Management Support 33 * ------------------------ 34 * 35 * At the moment, the ahci driver only implements suspend/resume to 36 * support Suspend to RAM on X86 feature. Device power management isn't 37 * implemented, link power management is disabled, and hot plug isn't 38 * allowed during the period from suspend to resume. 39 * 40 * For s/r support, the ahci driver only need to implement DDI_SUSPEND 41 * and DDI_RESUME entries, and don't need to take care of new requests 42 * sent down after suspend because the target driver (sd) has already 43 * handled these conditions, and blocked these requests. For the detailed 44 * information, please check with sdopen, sdclose and sdioctl routines. 45 * 46 * 47 * Enclosure Management Support 48 * ---------------------------- 49 * 50 * The ahci driver has basic support for AHCI Enclosure Management (EM) 51 * services. The AHCI specification provides an area in the primary ahci BAR for 52 * posting data to send out to the enclosure management and provides a register 53 * that provides both information and control about this. While the 54 * specification allows for multiple forms of enclosure management, the only 55 * supported, and commonly found form, is the AHCI specified LED format. The LED 56 * format is often implemented as a one-way communication mechanism. Software 57 * can write out what it cares about into the aforementioned data buffer and 58 * then we wait for the transmission to be sent. 59 * 60 * This has some drawbacks. It means that we cannot know whether or not it has 61 * succeeded. This means we cannot ask hardware what it thinks the LEDs are 62 * set to. There's also the added unfortunate reality that firmware on the 63 * microcontroller driving this will often not show the LEDs if no drive is 64 * present and that actions taken may potentially cause this to get out of sync 65 * with what we expect it to be. For example, the specification does not 66 * describe what should happen if a drive is removed from the enclosure while 67 * this is set and what should happen when it returns. We can only infer that it 68 * should be the same. 69 * 70 * Because only a single command can be sent at any time and we don't want to 71 * interfere with controller I/O, we create a taskq dedicated to this that has a 72 * single thread. Both resets (which occur on attach and resume) and normal 73 * changes to the LED state will be driven through this taskq. Because the taskq 74 * has a single thread, this guarantees serial processing. 75 * 76 * Each userland-submitted task (basically not resets) has a reference counted 77 * task structure. This allows the thread that called it to be cancelled and 78 * have the system clean itself up. The user thread in ioctl blocks on a CV that 79 * can receive signals as it waits for completion. Note, there is no guarantee 80 * provided by the kernel that the first thread to enter the kernel will be the 81 * first one to change state. 82 */ 83 84 #include <sys/note.h> 85 #include <sys/scsi/scsi.h> 86 #include <sys/pci.h> 87 #include <sys/disp.h> 88 #include <sys/sata/sata_hba.h> 89 #include <sys/sata/adapters/ahci/ahcireg.h> 90 #include <sys/sata/adapters/ahci/ahcivar.h> 91 92 /* 93 * FMA header files 94 */ 95 #include <sys/ddifm.h> 96 #include <sys/fm/protocol.h> 97 #include <sys/fm/util.h> 98 #include <sys/fm/io/ddi.h> 99 100 /* 101 * EM Control header files 102 */ 103 #include <sys/types.h> 104 #include <sys/file.h> 105 #include <sys/errno.h> 106 #include <sys/open.h> 107 #include <sys/cred.h> 108 #include <sys/ddi.h> 109 #include <sys/sunddi.h> 110 111 /* 112 * This is the string displayed by modinfo, etc. 113 */ 114 static char ahci_ident[] = "ahci driver"; 115 116 /* 117 * Function prototypes for driver entry points 118 */ 119 static int ahci_attach(dev_info_t *, ddi_attach_cmd_t); 120 static int ahci_detach(dev_info_t *, ddi_detach_cmd_t); 121 static int ahci_getinfo(dev_info_t *, ddi_info_cmd_t, void *, void **); 122 static int ahci_quiesce(dev_info_t *); 123 124 /* 125 * Function prototypes for SATA Framework interfaces 126 */ 127 static int ahci_register_sata_hba_tran(ahci_ctl_t *, uint32_t); 128 static int ahci_unregister_sata_hba_tran(ahci_ctl_t *); 129 130 static int ahci_tran_probe_port(dev_info_t *, sata_device_t *); 131 static int ahci_tran_start(dev_info_t *, sata_pkt_t *spkt); 132 static int ahci_tran_abort(dev_info_t *, sata_pkt_t *, int); 133 static int ahci_tran_reset_dport(dev_info_t *, sata_device_t *); 134 static int ahci_tran_hotplug_port_activate(dev_info_t *, sata_device_t *); 135 static int ahci_tran_hotplug_port_deactivate(dev_info_t *, sata_device_t *); 136 #if defined(__lock_lint) 137 static int ahci_selftest(dev_info_t *, sata_device_t *); 138 #endif 139 140 /* 141 * FMA Prototypes 142 */ 143 static void ahci_fm_init(ahci_ctl_t *); 144 static void ahci_fm_fini(ahci_ctl_t *); 145 static int ahci_fm_error_cb(dev_info_t *, ddi_fm_error_t *, const void*); 146 int ahci_check_acc_handle(ddi_acc_handle_t); 147 int ahci_check_dma_handle(ddi_dma_handle_t); 148 void ahci_fm_ereport(ahci_ctl_t *, char *); 149 static int ahci_check_all_handle(ahci_ctl_t *); 150 static int ahci_check_ctl_handle(ahci_ctl_t *); 151 static int ahci_check_port_handle(ahci_ctl_t *, int); 152 static int ahci_check_slot_handle(ahci_port_t *, int); 153 154 /* 155 * Local function prototypes 156 */ 157 static int ahci_setup_port_base_addresses(ahci_ctl_t *, ahci_port_t *); 158 static int ahci_alloc_ports_state(ahci_ctl_t *); 159 static void ahci_dealloc_ports_state(ahci_ctl_t *); 160 static int ahci_alloc_port_state(ahci_ctl_t *, uint8_t); 161 static void ahci_dealloc_port_state(ahci_ctl_t *, uint8_t); 162 static int ahci_alloc_rcvd_fis(ahci_ctl_t *, ahci_port_t *); 163 static void ahci_dealloc_rcvd_fis(ahci_port_t *); 164 static int ahci_alloc_cmd_list(ahci_ctl_t *, ahci_port_t *); 165 static void ahci_dealloc_cmd_list(ahci_ctl_t *, ahci_port_t *); 166 static int ahci_alloc_cmd_tables(ahci_ctl_t *, ahci_port_t *); 167 static void ahci_dealloc_cmd_tables(ahci_ctl_t *, ahci_port_t *); 168 static void ahci_alloc_pmult(ahci_ctl_t *, ahci_port_t *); 169 static void ahci_dealloc_pmult(ahci_ctl_t *, ahci_port_t *); 170 171 static int ahci_initialize_controller(ahci_ctl_t *); 172 static void ahci_uninitialize_controller(ahci_ctl_t *); 173 static int ahci_initialize_port(ahci_ctl_t *, ahci_port_t *, ahci_addr_t *); 174 static int ahci_config_space_init(ahci_ctl_t *); 175 static void ahci_staggered_spin_up(ahci_ctl_t *, uint8_t); 176 177 static void ahci_drain_ports_taskq(ahci_ctl_t *); 178 static int ahci_rdwr_pmult(ahci_ctl_t *, ahci_addr_t *, uint8_t, uint32_t *, 179 uint8_t); 180 static int ahci_read_pmult(ahci_ctl_t *, ahci_addr_t *, uint8_t, uint32_t *); 181 static int ahci_write_pmult(ahci_ctl_t *, ahci_addr_t *, uint8_t, uint32_t); 182 static int ahci_update_pmult_pscr(ahci_ctl_t *, ahci_addr_t *, 183 sata_device_t *); 184 static int ahci_update_pmult_gscr(ahci_ctl_t *, ahci_addr_t *, 185 sata_pmult_gscr_t *); 186 static int ahci_initialize_pmult(ahci_ctl_t *, ahci_port_t *, ahci_addr_t *, 187 sata_device_t *); 188 static int ahci_initialize_pmport(ahci_ctl_t *, ahci_port_t *, ahci_addr_t *); 189 static int ahci_probe_pmult(ahci_ctl_t *, ahci_port_t *, ahci_addr_t *); 190 static int ahci_probe_pmport(ahci_ctl_t *, ahci_port_t *, ahci_addr_t *, 191 sata_device_t *); 192 193 static void ahci_disable_interface_pm(ahci_ctl_t *, uint8_t); 194 static int ahci_start_port(ahci_ctl_t *, ahci_port_t *, uint8_t); 195 static void ahci_find_dev_signature(ahci_ctl_t *, ahci_port_t *, 196 ahci_addr_t *); 197 static void ahci_update_sata_registers(ahci_ctl_t *, uint8_t, sata_device_t *); 198 static int ahci_deliver_satapkt(ahci_ctl_t *, ahci_port_t *, 199 ahci_addr_t *, sata_pkt_t *); 200 static int ahci_do_sync_start(ahci_ctl_t *, ahci_port_t *, 201 ahci_addr_t *, sata_pkt_t *); 202 static int ahci_claim_free_slot(ahci_ctl_t *, ahci_port_t *, 203 ahci_addr_t *, int); 204 static void ahci_copy_err_cnxt(sata_cmd_t *, ahci_fis_d2h_register_t *); 205 static void ahci_copy_ncq_err_page(sata_cmd_t *, 206 struct sata_ncq_error_recovery_page *); 207 static void ahci_copy_out_regs(sata_cmd_t *, ahci_fis_d2h_register_t *); 208 static void ahci_add_doneq(ahci_port_t *, sata_pkt_t *, int); 209 static void ahci_flush_doneq(ahci_port_t *); 210 211 static int ahci_software_reset(ahci_ctl_t *, ahci_port_t *, ahci_addr_t *); 212 static int ahci_hba_reset(ahci_ctl_t *); 213 static int ahci_port_reset(ahci_ctl_t *, ahci_port_t *, ahci_addr_t *); 214 static int ahci_pmport_reset(ahci_ctl_t *, ahci_port_t *, ahci_addr_t *); 215 static void ahci_reject_all_abort_pkts(ahci_ctl_t *, ahci_port_t *, uint8_t); 216 static int ahci_reset_device_reject_pkts(ahci_ctl_t *, ahci_port_t *, 217 ahci_addr_t *); 218 static int ahci_reset_pmdevice_reject_pkts(ahci_ctl_t *, ahci_port_t *, 219 ahci_addr_t *); 220 static int ahci_reset_port_reject_pkts(ahci_ctl_t *, ahci_port_t *, 221 ahci_addr_t *); 222 static int ahci_reset_hba_reject_pkts(ahci_ctl_t *); 223 static int ahci_put_port_into_notrunning_state(ahci_ctl_t *, ahci_port_t *, 224 uint8_t); 225 static int ahci_restart_port_wait_till_ready(ahci_ctl_t *, ahci_port_t *, 226 uint8_t, int, int *); 227 static void ahci_mop_commands(ahci_ctl_t *, ahci_port_t *, uint32_t, 228 uint32_t, uint32_t, uint32_t, uint32_t); 229 static uint32_t ahci_get_rdlogext_data(ahci_ctl_t *, ahci_port_t *, uint8_t); 230 static void ahci_get_rqsense_data(ahci_ctl_t *, ahci_port_t *, 231 uint8_t, sata_pkt_t *); 232 static void ahci_fatal_error_recovery_handler(ahci_ctl_t *, ahci_port_t *, 233 ahci_addr_t *, uint32_t); 234 static void ahci_pmult_error_recovery_handler(ahci_ctl_t *, ahci_port_t *, 235 uint8_t, uint32_t); 236 static void ahci_timeout_pkts(ahci_ctl_t *, ahci_port_t *, 237 uint8_t, uint32_t); 238 static void ahci_events_handler(void *); 239 static void ahci_watchdog_handler(ahci_ctl_t *); 240 241 static uint_t ahci_intr(caddr_t, caddr_t); 242 static void ahci_port_intr(ahci_ctl_t *, ahci_port_t *, uint8_t); 243 static int ahci_add_intrs(ahci_ctl_t *, int); 244 static void ahci_rem_intrs(ahci_ctl_t *); 245 static void ahci_enable_all_intrs(ahci_ctl_t *); 246 static void ahci_disable_all_intrs(ahci_ctl_t *); 247 static void ahci_enable_port_intrs(ahci_ctl_t *, uint8_t); 248 static void ahci_disable_port_intrs(ahci_ctl_t *, uint8_t); 249 250 static int ahci_intr_cmd_cmplt(ahci_ctl_t *, ahci_port_t *, uint8_t); 251 static int ahci_intr_set_device_bits(ahci_ctl_t *, ahci_port_t *, uint8_t); 252 static int ahci_intr_ncq_events(ahci_ctl_t *, ahci_port_t *, ahci_addr_t *); 253 static int ahci_intr_pmult_sntf_events(ahci_ctl_t *, ahci_port_t *, uint8_t); 254 static int ahci_intr_port_connect_change(ahci_ctl_t *, ahci_port_t *, uint8_t); 255 static int ahci_intr_device_mechanical_presence_status(ahci_ctl_t *, 256 ahci_port_t *, uint8_t); 257 static int ahci_intr_phyrdy_change(ahci_ctl_t *, ahci_port_t *, uint8_t); 258 static int ahci_intr_non_fatal_error(ahci_ctl_t *, ahci_port_t *, 259 uint8_t, uint32_t); 260 static int ahci_intr_fatal_error(ahci_ctl_t *, ahci_port_t *, 261 uint8_t, uint32_t); 262 static int ahci_intr_cold_port_detect(ahci_ctl_t *, ahci_port_t *, uint8_t); 263 264 static void ahci_get_ahci_addr(ahci_ctl_t *, sata_device_t *, ahci_addr_t *); 265 static int ahci_get_num_implemented_ports(uint32_t); 266 static void ahci_log_fatal_error_message(ahci_ctl_t *, uint8_t, uint32_t); 267 static void ahci_dump_commands(ahci_ctl_t *, uint8_t, uint32_t); 268 static void ahci_log_serror_message(ahci_ctl_t *, uint8_t, uint32_t, int); 269 #if AHCI_DEBUG 270 static void ahci_log(ahci_ctl_t *, uint_t, char *, ...); 271 #endif 272 273 static boolean_t ahci_em_init(ahci_ctl_t *); 274 static void ahci_em_fini(ahci_ctl_t *); 275 static void ahci_em_suspend(ahci_ctl_t *); 276 static void ahci_em_resume(ahci_ctl_t *); 277 static int ahci_em_ioctl(dev_info_t *, int, intptr_t); 278 279 280 /* 281 * DMA attributes for the data buffer 282 * 283 * dma_attr_addr_hi will be changed to 0xffffffffull if the HBA 284 * does not support 64-bit addressing 285 */ 286 static ddi_dma_attr_t buffer_dma_attr = { 287 DMA_ATTR_V0, /* dma_attr_version */ 288 0x0ull, /* dma_attr_addr_lo: lowest bus address */ 289 0xffffffffffffffffull, /* dma_attr_addr_hi: highest bus address */ 290 0x3fffffull, /* dma_attr_count_max i.e. for one cookie */ 291 0x2ull, /* dma_attr_align: word aligned */ 292 1, /* dma_attr_burstsizes */ 293 1, /* dma_attr_minxfer */ 294 0xffffffffull, /* dma_attr_maxxfer i.e. includes all cookies */ 295 0xffffffffull, /* dma_attr_seg */ 296 AHCI_PRDT_NUMBER, /* dma_attr_sgllen */ 297 512, /* dma_attr_granular */ 298 0, /* dma_attr_flags */ 299 }; 300 301 /* 302 * DMA attributes for the rcvd FIS 303 * 304 * dma_attr_addr_hi will be changed to 0xffffffffull if the HBA 305 * does not support 64-bit addressing 306 */ 307 static ddi_dma_attr_t rcvd_fis_dma_attr = { 308 DMA_ATTR_V0, /* dma_attr_version */ 309 0x0ull, /* dma_attr_addr_lo: lowest bus address */ 310 0xffffffffffffffffull, /* dma_attr_addr_hi: highest bus address */ 311 0xffffffffull, /* dma_attr_count_max i.e. for one cookie */ 312 0x100ull, /* dma_attr_align: 256-byte aligned */ 313 1, /* dma_attr_burstsizes */ 314 1, /* dma_attr_minxfer */ 315 0xffffffffull, /* dma_attr_maxxfer i.e. includes all cookies */ 316 0xffffffffull, /* dma_attr_seg */ 317 1, /* dma_attr_sgllen */ 318 1, /* dma_attr_granular */ 319 0, /* dma_attr_flags */ 320 }; 321 322 /* 323 * DMA attributes for the command list 324 * 325 * dma_attr_addr_hi will be changed to 0xffffffffull if the HBA 326 * does not support 64-bit addressing 327 */ 328 static ddi_dma_attr_t cmd_list_dma_attr = { 329 DMA_ATTR_V0, /* dma_attr_version */ 330 0x0ull, /* dma_attr_addr_lo: lowest bus address */ 331 0xffffffffffffffffull, /* dma_attr_addr_hi: highest bus address */ 332 0xffffffffull, /* dma_attr_count_max i.e. for one cookie */ 333 0x400ull, /* dma_attr_align: 1K-byte aligned */ 334 1, /* dma_attr_burstsizes */ 335 1, /* dma_attr_minxfer */ 336 0xffffffffull, /* dma_attr_maxxfer i.e. includes all cookies */ 337 0xffffffffull, /* dma_attr_seg */ 338 1, /* dma_attr_sgllen */ 339 1, /* dma_attr_granular */ 340 0, /* dma_attr_flags */ 341 }; 342 343 /* 344 * DMA attributes for cmd tables 345 * 346 * dma_attr_addr_hi will be changed to 0xffffffffull if the HBA 347 * does not support 64-bit addressing 348 */ 349 static ddi_dma_attr_t cmd_table_dma_attr = { 350 DMA_ATTR_V0, /* dma_attr_version */ 351 0x0ull, /* dma_attr_addr_lo: lowest bus address */ 352 0xffffffffffffffffull, /* dma_attr_addr_hi: highest bus address */ 353 0xffffffffull, /* dma_attr_count_max i.e. for one cookie */ 354 0x80ull, /* dma_attr_align: 128-byte aligned */ 355 1, /* dma_attr_burstsizes */ 356 1, /* dma_attr_minxfer */ 357 0xffffffffull, /* dma_attr_maxxfer i.e. includes all cookies */ 358 0xffffffffull, /* dma_attr_seg */ 359 1, /* dma_attr_sgllen */ 360 1, /* dma_attr_granular */ 361 0, /* dma_attr_flags */ 362 }; 363 364 365 /* Device access attributes */ 366 static ddi_device_acc_attr_t accattr = { 367 DDI_DEVICE_ATTR_V1, 368 DDI_STRUCTURE_LE_ACC, 369 DDI_STRICTORDER_ACC, 370 DDI_DEFAULT_ACC 371 }; 372 373 static struct dev_ops ahcictl_dev_ops = { 374 DEVO_REV, /* devo_rev */ 375 0, /* refcnt */ 376 ahci_getinfo, /* info */ 377 nulldev, /* identify */ 378 nulldev, /* probe */ 379 ahci_attach, /* attach */ 380 ahci_detach, /* detach */ 381 nodev, /* no reset */ 382 NULL, /* driver operations */ 383 NULL, /* bus operations */ 384 NULL, /* power */ 385 ahci_quiesce, /* quiesce */ 386 }; 387 388 static sata_tran_hotplug_ops_t ahci_tran_hotplug_ops = { 389 SATA_TRAN_HOTPLUG_OPS_REV_1, 390 ahci_tran_hotplug_port_activate, 391 ahci_tran_hotplug_port_deactivate 392 }; 393 394 extern struct mod_ops mod_driverops; 395 396 static struct modldrv modldrv = { 397 &mod_driverops, /* driverops */ 398 ahci_ident, /* short description */ 399 &ahcictl_dev_ops, /* driver ops */ 400 }; 401 402 static struct modlinkage modlinkage = { 403 MODREV_1, 404 &modldrv, 405 NULL 406 }; 407 408 /* The following variables are watchdog handler related */ 409 static clock_t ahci_watchdog_timeout = 5; /* 5 seconds */ 410 static clock_t ahci_watchdog_tick; 411 412 /* 413 * This static variable indicates the size of command table, 414 * and it's changeable with prdt number, which ahci_dma_prdt_number 415 * indicates. 416 */ 417 static size_t ahci_cmd_table_size; 418 419 /* 420 * The below global variables are tunable via /etc/system 421 * 422 * ahci_dma_prdt_number 423 * ahci_msi_enabled 424 * ahci_buf_64bit_dma 425 * ahci_commu_64bit_dma 426 */ 427 428 /* The number of Physical Region Descriptor Table(PRDT) in Command Table */ 429 int ahci_dma_prdt_number = AHCI_PRDT_NUMBER; 430 431 /* AHCI MSI is tunable */ 432 boolean_t ahci_msi_enabled = B_TRUE; 433 434 /* 435 * 64-bit dma addressing for data buffer is tunable 436 * 437 * The variable controls only the below value: 438 * DBAU (upper 32-bits physical address of data block) 439 */ 440 boolean_t ahci_buf_64bit_dma = B_TRUE; 441 442 /* 443 * 64-bit dma addressing for communication system descriptors is tunable 444 * 445 * The variable controls the below three values: 446 * 447 * PxCLBU (upper 32-bits for the command list base physical address) 448 * PxFBU (upper 32-bits for the received FIS base physical address) 449 * CTBAU (upper 32-bits of command table base) 450 */ 451 boolean_t ahci_commu_64bit_dma = B_TRUE; 452 453 /* 454 * By default, 64-bit dma for data buffer will be disabled for AMD/ATI SB600 455 * chipset. If the users want to have a try with 64-bit dma, please change 456 * the below variable value to enable it. 457 */ 458 boolean_t sb600_buf_64bit_dma_disable = B_TRUE; 459 460 /* 461 * By default, 64-bit dma for command buffer will be disabled for AMD/ATI 462 * SB600/700/710/750/800. If the users want to have a try with 64-bit dma, 463 * please change the below value to enable it. 464 */ 465 boolean_t sbxxx_commu_64bit_dma_disable = B_TRUE; 466 467 /* 468 * These values control the default delay and default number of times to wait 469 * for an enclosure message to complete. 470 */ 471 uint_t ahci_em_reset_delay_ms = 1; 472 uint_t ahci_em_reset_delay_count = 1000; 473 uint_t ahci_em_tx_delay_ms = 1; 474 uint_t ahci_em_tx_delay_count = 1000; 475 476 477 /* 478 * End of global tunable variable definition 479 */ 480 481 #if AHCI_DEBUG 482 uint32_t ahci_debug_flags = 0; 483 #else 484 uint32_t ahci_debug_flags = (AHCIDBG_ERRS|AHCIDBG_TIMEOUT); 485 #endif 486 487 488 #if AHCI_DEBUG 489 /* The following is needed for ahci_log() */ 490 static kmutex_t ahci_log_mutex; 491 static char ahci_log_buf[512]; 492 #endif 493 494 /* Opaque state pointer initialized by ddi_soft_state_init() */ 495 static void *ahci_statep = NULL; 496 497 /* 498 * ahci module initialization. 499 */ 500 int 501 _init(void) 502 { 503 int ret; 504 505 ret = ddi_soft_state_init(&ahci_statep, sizeof (ahci_ctl_t), 0); 506 if (ret != 0) { 507 goto err_out; 508 } 509 510 #if AHCI_DEBUG 511 mutex_init(&ahci_log_mutex, NULL, MUTEX_DRIVER, NULL); 512 #endif 513 514 if ((ret = sata_hba_init(&modlinkage)) != 0) { 515 #if AHCI_DEBUG 516 mutex_destroy(&ahci_log_mutex); 517 #endif 518 ddi_soft_state_fini(&ahci_statep); 519 goto err_out; 520 } 521 522 /* watchdog tick */ 523 ahci_watchdog_tick = drv_usectohz( 524 (clock_t)ahci_watchdog_timeout * 1000000); 525 526 ret = mod_install(&modlinkage); 527 if (ret != 0) { 528 sata_hba_fini(&modlinkage); 529 #if AHCI_DEBUG 530 mutex_destroy(&ahci_log_mutex); 531 #endif 532 ddi_soft_state_fini(&ahci_statep); 533 goto err_out; 534 } 535 536 return (ret); 537 538 err_out: 539 cmn_err(CE_WARN, "!ahci: Module init failed"); 540 return (ret); 541 } 542 543 /* 544 * ahci module uninitialize. 545 */ 546 int 547 _fini(void) 548 { 549 int ret; 550 551 ret = mod_remove(&modlinkage); 552 if (ret != 0) { 553 return (ret); 554 } 555 556 /* Remove the resources allocated in _init(). */ 557 sata_hba_fini(&modlinkage); 558 #if AHCI_DEBUG 559 mutex_destroy(&ahci_log_mutex); 560 #endif 561 ddi_soft_state_fini(&ahci_statep); 562 563 return (ret); 564 } 565 566 /* 567 * _info entry point 568 */ 569 int 570 _info(struct modinfo *modinfop) 571 { 572 return (mod_info(&modlinkage, modinfop)); 573 } 574 575 /* 576 * The attach entry point for dev_ops. 577 */ 578 static int 579 ahci_attach(dev_info_t *dip, ddi_attach_cmd_t cmd) 580 { 581 ahci_ctl_t *ahci_ctlp = NULL; 582 int instance = ddi_get_instance(dip); 583 int status; 584 int attach_state; 585 uint32_t cap_status, ahci_version; 586 uint32_t ghc_control; 587 int intr_types; 588 int i; 589 pci_regspec_t *regs; 590 int regs_length; 591 int rnumber; 592 #if AHCI_DEBUG 593 int speed; 594 #endif 595 596 AHCIDBG(AHCIDBG_INIT|AHCIDBG_ENTRY, ahci_ctlp, "ahci_attach enter", 597 NULL); 598 599 switch (cmd) { 600 case DDI_ATTACH: 601 break; 602 603 case DDI_RESUME: 604 605 /* 606 * During DDI_RESUME, the hardware state of the device 607 * (power may have been removed from the device) must be 608 * restored, allow pending requests to continue, and 609 * service new requests. 610 */ 611 ahci_ctlp = ddi_get_soft_state(ahci_statep, instance); 612 mutex_enter(&ahci_ctlp->ahcictl_mutex); 613 614 /* 615 * GHC.AE must be set to 1 before any other AHCI register 616 * is accessed 617 */ 618 ghc_control = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 619 (uint32_t *)AHCI_GLOBAL_GHC(ahci_ctlp)); 620 ghc_control |= AHCI_HBA_GHC_AE; 621 ddi_put32(ahci_ctlp->ahcictl_ahci_acc_handle, 622 (uint32_t *)AHCI_GLOBAL_GHC(ahci_ctlp), ghc_control); 623 624 /* Restart watch thread */ 625 if (ahci_ctlp->ahcictl_timeout_id == 0) 626 ahci_ctlp->ahcictl_timeout_id = timeout( 627 (void (*)(void *))ahci_watchdog_handler, 628 (caddr_t)ahci_ctlp, ahci_watchdog_tick); 629 630 mutex_exit(&ahci_ctlp->ahcictl_mutex); 631 632 /* 633 * Re-initialize the controller and enable the interrupts and 634 * restart all the ports. 635 * 636 * Note that so far we don't support hot-plug during 637 * suspend/resume. 638 */ 639 if (ahci_initialize_controller(ahci_ctlp) != AHCI_SUCCESS) { 640 AHCIDBG(AHCIDBG_ERRS|AHCIDBG_PM, ahci_ctlp, 641 "Failed to initialize the controller " 642 "during DDI_RESUME", NULL); 643 return (DDI_FAILURE); 644 } 645 646 /* 647 * Reset the enclosure services. 648 */ 649 ahci_em_resume(ahci_ctlp); 650 651 mutex_enter(&ahci_ctlp->ahcictl_mutex); 652 ahci_ctlp->ahcictl_flags &= ~AHCI_SUSPEND; 653 mutex_exit(&ahci_ctlp->ahcictl_mutex); 654 655 return (DDI_SUCCESS); 656 657 default: 658 return (DDI_FAILURE); 659 } 660 661 attach_state = AHCI_ATTACH_STATE_NONE; 662 663 /* Allocate soft state */ 664 status = ddi_soft_state_zalloc(ahci_statep, instance); 665 if (status != DDI_SUCCESS) { 666 cmn_err(CE_WARN, "!ahci%d: Cannot allocate soft state", 667 instance); 668 goto err_out; 669 } 670 671 ahci_ctlp = ddi_get_soft_state(ahci_statep, instance); 672 ahci_ctlp->ahcictl_flags |= AHCI_ATTACH; 673 ahci_ctlp->ahcictl_dip = dip; 674 675 /* Initialize the cport/port mapping */ 676 for (i = 0; i < AHCI_MAX_PORTS; i++) { 677 ahci_ctlp->ahcictl_port_to_cport[i] = 0xff; 678 ahci_ctlp->ahcictl_cport_to_port[i] = 0xff; 679 } 680 681 attach_state |= AHCI_ATTACH_STATE_STATEP_ALLOC; 682 683 /* Initialize FMA properties */ 684 ahci_fm_init(ahci_ctlp); 685 686 attach_state |= AHCI_ATTACH_STATE_FMA; 687 688 /* 689 * Now map the AHCI base address; which includes global 690 * registers and port control registers 691 * 692 * According to the spec, the AHCI Base Address is BAR5, 693 * but BAR0-BAR4 are optional, so we need to check which 694 * rnumber is used for BAR5. 695 */ 696 697 /* 698 * search through DDI "reg" property for the AHCI register set 699 */ 700 if (ddi_prop_lookup_int_array(DDI_DEV_T_ANY, dip, 701 DDI_PROP_DONTPASS, "reg", (int **)®s, 702 (uint_t *)®s_length) != DDI_PROP_SUCCESS) { 703 cmn_err(CE_WARN, "!ahci%d: Cannot lookup reg property", 704 instance); 705 goto err_out; 706 } 707 708 /* AHCI Base Address is located at 0x24 offset */ 709 for (rnumber = 0; rnumber < regs_length; ++rnumber) { 710 if ((regs[rnumber].pci_phys_hi & PCI_REG_REG_M) 711 == AHCI_PCI_RNUM) 712 break; 713 } 714 715 ddi_prop_free(regs); 716 717 if (rnumber == regs_length) { 718 cmn_err(CE_WARN, "!ahci%d: Cannot find AHCI register set", 719 instance); 720 goto err_out; 721 } 722 723 AHCIDBG(AHCIDBG_INIT, ahci_ctlp, "rnumber = %d", rnumber); 724 725 status = ddi_regs_map_setup(dip, 726 rnumber, 727 (caddr_t *)&ahci_ctlp->ahcictl_ahci_addr, 728 0, 729 0, 730 &accattr, 731 &ahci_ctlp->ahcictl_ahci_acc_handle); 732 if (status != DDI_SUCCESS) { 733 cmn_err(CE_WARN, "!ahci%d: Cannot map register space", 734 instance); 735 goto err_out; 736 } 737 738 attach_state |= AHCI_ATTACH_STATE_REG_MAP; 739 740 /* 741 * GHC.AE must be set to 1 before any other AHCI register 742 * is accessed 743 */ 744 ghc_control = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 745 (uint32_t *)AHCI_GLOBAL_GHC(ahci_ctlp)); 746 ghc_control |= AHCI_HBA_GHC_AE; 747 ddi_put32(ahci_ctlp->ahcictl_ahci_acc_handle, 748 (uint32_t *)AHCI_GLOBAL_GHC(ahci_ctlp), ghc_control); 749 750 /* Get the AHCI version information */ 751 ahci_version = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 752 (uint32_t *)AHCI_GLOBAL_VS(ahci_ctlp)); 753 754 cmn_err(CE_NOTE, "!ahci%d: hba AHCI version = %x.%x", instance, 755 (ahci_version & 0xffff0000) >> 16, 756 ((ahci_version & 0x0000ff00) >> 4 | 757 (ahci_version & 0x000000ff))); 758 759 /* We don't support controllers whose versions are lower than 1.0 */ 760 if (!(ahci_version & 0xffff0000)) { 761 cmn_err(CE_WARN, "ahci%d: Don't support AHCI HBA with lower " 762 "than version 1.0", instance); 763 goto err_out; 764 } 765 766 /* Get the HBA capabilities information */ 767 cap_status = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 768 (uint32_t *)AHCI_GLOBAL_CAP(ahci_ctlp)); 769 770 AHCIDBG(AHCIDBG_INIT, ahci_ctlp, "hba capabilities = 0x%x", 771 cap_status); 772 773 /* CAP2 (HBA Capabilities Extended) is available since AHCI spec 1.2 */ 774 if (ahci_version >= 0x00010200) { 775 uint32_t cap2_status; 776 777 /* Get the HBA capabilities extended information */ 778 cap2_status = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 779 (uint32_t *)AHCI_GLOBAL_CAP2(ahci_ctlp)); 780 781 AHCIDBG(AHCIDBG_INIT, ahci_ctlp, 782 "hba capabilities extended = 0x%x", cap2_status); 783 } 784 785 if (cap_status & AHCI_HBA_CAP_EMS) { 786 ahci_ctlp->ahcictl_cap |= AHCI_CAP_EMS; 787 ahci_ctlp->ahcictl_em_loc = 788 ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 789 (uint32_t *)AHCI_GLOBAL_EM_LOC(ahci_ctlp)); 790 ahci_ctlp->ahcictl_em_ctl = 791 ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 792 (uint32_t *)AHCI_GLOBAL_EM_CTL(ahci_ctlp)); 793 } 794 795 #if AHCI_DEBUG 796 /* Get the interface speed supported by the HBA */ 797 speed = (cap_status & AHCI_HBA_CAP_ISS) >> AHCI_HBA_CAP_ISS_SHIFT; 798 if (speed == 0x01) { 799 AHCIDBG(AHCIDBG_INIT, ahci_ctlp, 800 "hba interface speed support: Gen 1 (1.5Gbps)", NULL); 801 } else if (speed == 0x10) { 802 AHCIDBG(AHCIDBG_INIT, ahci_ctlp, 803 "hba interface speed support: Gen 2 (3 Gbps)", NULL); 804 } else if (speed == 0x11) { 805 AHCIDBG(AHCIDBG_INIT, ahci_ctlp, 806 "hba interface speed support: Gen 3 (6 Gbps)", NULL); 807 } 808 #endif 809 810 /* Get the number of command slots supported by the HBA */ 811 ahci_ctlp->ahcictl_num_cmd_slots = 812 ((cap_status & AHCI_HBA_CAP_NCS) >> 813 AHCI_HBA_CAP_NCS_SHIFT) + 1; 814 815 AHCIDBG(AHCIDBG_INIT, ahci_ctlp, "hba number of cmd slots: %d", 816 ahci_ctlp->ahcictl_num_cmd_slots); 817 818 /* Get the bit map which indicates ports implemented by the HBA */ 819 ahci_ctlp->ahcictl_ports_implemented = 820 ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 821 (uint32_t *)AHCI_GLOBAL_PI(ahci_ctlp)); 822 823 AHCIDBG(AHCIDBG_INIT, ahci_ctlp, "hba implementation of ports: 0x%x", 824 ahci_ctlp->ahcictl_ports_implemented); 825 826 /* Max port number implemented */ 827 ahci_ctlp->ahcictl_num_ports = 828 ddi_fls(ahci_ctlp->ahcictl_ports_implemented); 829 830 AHCIDBG(AHCIDBG_INIT, ahci_ctlp, "hba number of ports: %d", 831 (cap_status & AHCI_HBA_CAP_NP) + 1); 832 833 /* Get the number of implemented ports by the HBA */ 834 ahci_ctlp->ahcictl_num_implemented_ports = 835 ahci_get_num_implemented_ports( 836 ahci_ctlp->ahcictl_ports_implemented); 837 838 AHCIDBG(AHCIDBG_INIT, ahci_ctlp, 839 "hba number of implemented ports: %d", 840 ahci_ctlp->ahcictl_num_implemented_ports); 841 842 /* Check whether HBA supports 64bit DMA addressing */ 843 if (!(cap_status & AHCI_HBA_CAP_S64A)) { 844 ahci_ctlp->ahcictl_cap |= AHCI_CAP_BUF_32BIT_DMA; 845 ahci_ctlp->ahcictl_cap |= AHCI_CAP_COMMU_32BIT_DMA; 846 AHCIDBG(AHCIDBG_INIT, ahci_ctlp, 847 "hba does not support 64-bit addressing", NULL); 848 } 849 850 /* Checking for the support of Port Multiplier */ 851 if (cap_status & AHCI_HBA_CAP_SPM) { 852 ahci_ctlp->ahcictl_cap |= AHCI_CAP_PMULT_CBSS; 853 AHCIDBG(AHCIDBG_INIT|AHCIDBG_PMULT, ahci_ctlp, 854 "hba supports port multiplier (CBSS)", NULL); 855 856 /* Support FIS-based switching ? */ 857 if (cap_status & AHCI_HBA_CAP_FBSS) { 858 ahci_ctlp->ahcictl_cap |= AHCI_CAP_PMULT_FBSS; 859 AHCIDBG(AHCIDBG_INIT|AHCIDBG_PMULT, ahci_ctlp, 860 "hba supports FIS-based switching (FBSS)", NULL); 861 } 862 } 863 864 /* Checking for Support Command List Override */ 865 if (cap_status & AHCI_HBA_CAP_SCLO) { 866 ahci_ctlp->ahcictl_cap |= AHCI_CAP_SCLO; 867 AHCIDBG(AHCIDBG_INIT|AHCIDBG_PMULT, ahci_ctlp, 868 "hba supports command list override.", NULL); 869 } 870 871 /* Checking for Asynchronous Notification */ 872 if (cap_status & AHCI_HBA_CAP_SSNTF) { 873 ahci_ctlp->ahcictl_cap |= AHCI_CAP_SNTF; 874 AHCIDBG(AHCIDBG_INIT|AHCIDBG_PMULT, ahci_ctlp, 875 "hba supports asynchronous notification.", NULL); 876 } 877 878 if (pci_config_setup(dip, &ahci_ctlp->ahcictl_pci_conf_handle) 879 != DDI_SUCCESS) { 880 cmn_err(CE_WARN, "!ahci%d: Cannot set up pci configure space", 881 instance); 882 goto err_out; 883 } 884 885 attach_state |= AHCI_ATTACH_STATE_PCICFG_SETUP; 886 887 /* 888 * Check the pci configuration space, and set caps. We also 889 * handle the hardware defect in this function. 890 * 891 * For example, force ATI SB600 to use 32-bit dma addressing 892 * since it doesn't support 64-bit dma though its CAP register 893 * declares it support. 894 */ 895 if (ahci_config_space_init(ahci_ctlp) == AHCI_FAILURE) { 896 cmn_err(CE_WARN, "!ahci%d: ahci_config_space_init failed", 897 instance); 898 goto err_out; 899 } 900 901 /* 902 * Disable the whole controller interrupts before adding 903 * interrupt handlers(s). 904 */ 905 ahci_disable_all_intrs(ahci_ctlp); 906 907 /* Get supported interrupt types */ 908 if (ddi_intr_get_supported_types(dip, &intr_types) != DDI_SUCCESS) { 909 cmn_err(CE_WARN, "!ahci%d: ddi_intr_get_supported_types failed", 910 instance); 911 goto err_out; 912 } 913 914 AHCIDBG(AHCIDBG_INIT|AHCIDBG_INTR, ahci_ctlp, 915 "ddi_intr_get_supported_types() returned: 0x%x", 916 intr_types); 917 918 if (ahci_msi_enabled && (intr_types & DDI_INTR_TYPE_MSI)) { 919 /* 920 * Try MSI first, but fall back to FIXED if failed 921 */ 922 if (ahci_add_intrs(ahci_ctlp, DDI_INTR_TYPE_MSI) == 923 DDI_SUCCESS) { 924 ahci_ctlp->ahcictl_intr_type = DDI_INTR_TYPE_MSI; 925 AHCIDBG(AHCIDBG_INIT|AHCIDBG_INTR, ahci_ctlp, 926 "Using MSI interrupt type", NULL); 927 goto intr_done; 928 } 929 930 AHCIDBG(AHCIDBG_INIT|AHCIDBG_INTR, ahci_ctlp, 931 "MSI registration failed, " 932 "trying FIXED interrupts", NULL); 933 } 934 935 if (intr_types & DDI_INTR_TYPE_FIXED) { 936 if (ahci_add_intrs(ahci_ctlp, DDI_INTR_TYPE_FIXED) == 937 DDI_SUCCESS) { 938 ahci_ctlp->ahcictl_intr_type = DDI_INTR_TYPE_FIXED; 939 AHCIDBG(AHCIDBG_INIT|AHCIDBG_INTR, ahci_ctlp, 940 "Using FIXED interrupt type", NULL); 941 goto intr_done; 942 } 943 944 AHCIDBG(AHCIDBG_INIT|AHCIDBG_INTR, ahci_ctlp, 945 "FIXED interrupt registration failed", NULL); 946 } 947 948 cmn_err(CE_WARN, "!ahci%d: Interrupt registration failed", instance); 949 950 goto err_out; 951 952 intr_done: 953 954 attach_state |= AHCI_ATTACH_STATE_INTR_ADDED; 955 956 /* Initialize the controller mutex */ 957 mutex_init(&ahci_ctlp->ahcictl_mutex, NULL, MUTEX_DRIVER, 958 (void *)(uintptr_t)ahci_ctlp->ahcictl_intr_pri); 959 960 attach_state |= AHCI_ATTACH_STATE_MUTEX_INIT; 961 962 if (ahci_dma_prdt_number < AHCI_MIN_PRDT_NUMBER) { 963 ahci_dma_prdt_number = AHCI_MIN_PRDT_NUMBER; 964 } else if (ahci_dma_prdt_number > AHCI_MAX_PRDT_NUMBER) { 965 ahci_dma_prdt_number = AHCI_MAX_PRDT_NUMBER; 966 } 967 968 ahci_cmd_table_size = (sizeof (ahci_cmd_table_t) + 969 (ahci_dma_prdt_number - AHCI_PRDT_NUMBER) * 970 sizeof (ahci_prdt_item_t)); 971 972 AHCIDBG(AHCIDBG_INIT, ahci_ctlp, 973 "ahci_attach: ahci_dma_prdt_number set by user is 0x%x," 974 " ahci_cmd_table_size is 0x%x", 975 ahci_dma_prdt_number, ahci_cmd_table_size); 976 977 if (ahci_dma_prdt_number != AHCI_PRDT_NUMBER) 978 ahci_ctlp->ahcictl_buffer_dma_attr.dma_attr_sgllen = 979 ahci_dma_prdt_number; 980 981 ahci_ctlp->ahcictl_buffer_dma_attr = buffer_dma_attr; 982 ahci_ctlp->ahcictl_rcvd_fis_dma_attr = rcvd_fis_dma_attr; 983 ahci_ctlp->ahcictl_cmd_list_dma_attr = cmd_list_dma_attr; 984 ahci_ctlp->ahcictl_cmd_table_dma_attr = cmd_table_dma_attr; 985 986 /* 987 * enable 64bit dma for data buffer for SB600 if 988 * sb600_buf_64bit_dma_disable is B_FALSE 989 */ 990 if ((ahci_buf_64bit_dma == B_FALSE) || 991 ((ahci_ctlp->ahcictl_cap & AHCI_CAP_BUF_32BIT_DMA) && 992 !(sb600_buf_64bit_dma_disable == B_FALSE && 993 ahci_ctlp->ahcictl_venid == 0x1002 && 994 ahci_ctlp->ahcictl_devid == 0x4380))) { 995 ahci_ctlp->ahcictl_buffer_dma_attr.dma_attr_addr_hi = 996 0xffffffffull; 997 } 998 999 /* 1000 * enable 64bit dma for command buffer for SB600/700/710/800 1001 * if sbxxx_commu_64bit_dma_disable is B_FALSE 1002 */ 1003 if ((ahci_commu_64bit_dma == B_FALSE) || 1004 ((ahci_ctlp->ahcictl_cap & AHCI_CAP_COMMU_32BIT_DMA) && 1005 !(sbxxx_commu_64bit_dma_disable == B_FALSE && 1006 ahci_ctlp->ahcictl_venid == 0x1002 && 1007 (ahci_ctlp->ahcictl_devid == 0x4380 || 1008 ahci_ctlp->ahcictl_devid == 0x4391)))) { 1009 ahci_ctlp->ahcictl_rcvd_fis_dma_attr.dma_attr_addr_hi = 1010 0xffffffffull; 1011 ahci_ctlp->ahcictl_cmd_list_dma_attr.dma_attr_addr_hi = 1012 0xffffffffull; 1013 ahci_ctlp->ahcictl_cmd_table_dma_attr.dma_attr_addr_hi = 1014 0xffffffffull; 1015 } 1016 1017 /* Allocate the ports structure */ 1018 status = ahci_alloc_ports_state(ahci_ctlp); 1019 if (status != AHCI_SUCCESS) { 1020 cmn_err(CE_WARN, "!ahci%d: Cannot allocate ports structure", 1021 instance); 1022 goto err_out; 1023 } 1024 1025 attach_state |= AHCI_ATTACH_STATE_PORT_ALLOC; 1026 1027 /* 1028 * Initialize the controller and ports. 1029 */ 1030 status = ahci_initialize_controller(ahci_ctlp); 1031 if (status != AHCI_SUCCESS) { 1032 cmn_err(CE_WARN, "!ahci%d: HBA initialization failed", 1033 instance); 1034 goto err_out; 1035 } 1036 1037 attach_state |= AHCI_ATTACH_STATE_HW_INIT; 1038 1039 /* Start one thread to check packet timeouts */ 1040 ahci_ctlp->ahcictl_timeout_id = timeout( 1041 (void (*)(void *))ahci_watchdog_handler, 1042 (caddr_t)ahci_ctlp, ahci_watchdog_tick); 1043 1044 attach_state |= AHCI_ATTACH_STATE_TIMEOUT_ENABLED; 1045 1046 if (!ahci_em_init(ahci_ctlp)) { 1047 cmn_err(CE_WARN, "!ahci%d: failed to initialize enclosure " 1048 "services", instance); 1049 goto err_out; 1050 } 1051 attach_state |= AHCI_ATTACH_STATE_ENCLOSURE; 1052 1053 if (ahci_register_sata_hba_tran(ahci_ctlp, cap_status)) { 1054 cmn_err(CE_WARN, "!ahci%d: sata hba tran registration failed", 1055 instance); 1056 goto err_out; 1057 } 1058 1059 /* Check all handles at the end of the attach operation. */ 1060 if (ahci_check_all_handle(ahci_ctlp) != DDI_SUCCESS) { 1061 cmn_err(CE_WARN, "!ahci%d: invalid dma/acc handles", 1062 instance); 1063 goto err_out; 1064 } 1065 1066 ahci_ctlp->ahcictl_flags &= ~AHCI_ATTACH; 1067 1068 AHCIDBG(AHCIDBG_INIT, ahci_ctlp, "ahci_attach success!", NULL); 1069 1070 return (DDI_SUCCESS); 1071 1072 err_out: 1073 /* FMA message */ 1074 ahci_fm_ereport(ahci_ctlp, DDI_FM_DEVICE_NO_RESPONSE); 1075 ddi_fm_service_impact(ahci_ctlp->ahcictl_dip, DDI_SERVICE_LOST); 1076 1077 if (attach_state & AHCI_ATTACH_STATE_ENCLOSURE) { 1078 ahci_em_fini(ahci_ctlp); 1079 } 1080 1081 if (attach_state & AHCI_ATTACH_STATE_TIMEOUT_ENABLED) { 1082 mutex_enter(&ahci_ctlp->ahcictl_mutex); 1083 (void) untimeout(ahci_ctlp->ahcictl_timeout_id); 1084 ahci_ctlp->ahcictl_timeout_id = 0; 1085 mutex_exit(&ahci_ctlp->ahcictl_mutex); 1086 } 1087 1088 if (attach_state & AHCI_ATTACH_STATE_HW_INIT) { 1089 ahci_uninitialize_controller(ahci_ctlp); 1090 } 1091 1092 if (attach_state & AHCI_ATTACH_STATE_PORT_ALLOC) { 1093 ahci_dealloc_ports_state(ahci_ctlp); 1094 } 1095 1096 if (attach_state & AHCI_ATTACH_STATE_MUTEX_INIT) { 1097 mutex_destroy(&ahci_ctlp->ahcictl_mutex); 1098 } 1099 1100 if (attach_state & AHCI_ATTACH_STATE_INTR_ADDED) { 1101 ahci_rem_intrs(ahci_ctlp); 1102 } 1103 1104 if (attach_state & AHCI_ATTACH_STATE_PCICFG_SETUP) { 1105 pci_config_teardown(&ahci_ctlp->ahcictl_pci_conf_handle); 1106 } 1107 1108 if (attach_state & AHCI_ATTACH_STATE_REG_MAP) { 1109 ddi_regs_map_free(&ahci_ctlp->ahcictl_ahci_acc_handle); 1110 } 1111 1112 if (attach_state & AHCI_ATTACH_STATE_FMA) { 1113 ahci_fm_fini(ahci_ctlp); 1114 } 1115 1116 if (attach_state & AHCI_ATTACH_STATE_STATEP_ALLOC) { 1117 ddi_soft_state_free(ahci_statep, instance); 1118 } 1119 1120 return (DDI_FAILURE); 1121 } 1122 1123 /* 1124 * The detach entry point for dev_ops. 1125 */ 1126 static int 1127 ahci_detach(dev_info_t *dip, ddi_detach_cmd_t cmd) 1128 { 1129 ahci_ctl_t *ahci_ctlp; 1130 int instance; 1131 int ret; 1132 1133 instance = ddi_get_instance(dip); 1134 ahci_ctlp = ddi_get_soft_state(ahci_statep, instance); 1135 1136 AHCIDBG(AHCIDBG_ENTRY, ahci_ctlp, "ahci_detach enter", NULL); 1137 1138 switch (cmd) { 1139 case DDI_DETACH: 1140 1141 /* disable the interrupts for an uninterrupted detach */ 1142 mutex_enter(&ahci_ctlp->ahcictl_mutex); 1143 ahci_disable_all_intrs(ahci_ctlp); 1144 mutex_exit(&ahci_ctlp->ahcictl_mutex); 1145 1146 /* unregister from the sata framework. */ 1147 ret = ahci_unregister_sata_hba_tran(ahci_ctlp); 1148 if (ret != AHCI_SUCCESS) { 1149 mutex_enter(&ahci_ctlp->ahcictl_mutex); 1150 ahci_enable_all_intrs(ahci_ctlp); 1151 mutex_exit(&ahci_ctlp->ahcictl_mutex); 1152 return (DDI_FAILURE); 1153 } 1154 1155 ahci_em_fini(ahci_ctlp); 1156 1157 mutex_enter(&ahci_ctlp->ahcictl_mutex); 1158 1159 /* stop the watchdog handler */ 1160 (void) untimeout(ahci_ctlp->ahcictl_timeout_id); 1161 ahci_ctlp->ahcictl_timeout_id = 0; 1162 1163 mutex_exit(&ahci_ctlp->ahcictl_mutex); 1164 1165 /* uninitialize the controller */ 1166 ahci_uninitialize_controller(ahci_ctlp); 1167 1168 /* remove the interrupts */ 1169 ahci_rem_intrs(ahci_ctlp); 1170 1171 /* deallocate the ports structures */ 1172 ahci_dealloc_ports_state(ahci_ctlp); 1173 1174 /* destroy mutex */ 1175 mutex_destroy(&ahci_ctlp->ahcictl_mutex); 1176 1177 /* teardown the pci config */ 1178 pci_config_teardown(&ahci_ctlp->ahcictl_pci_conf_handle); 1179 1180 /* remove the reg maps. */ 1181 ddi_regs_map_free(&ahci_ctlp->ahcictl_ahci_acc_handle); 1182 1183 /* release fma resource */ 1184 ahci_fm_fini(ahci_ctlp); 1185 1186 /* free the soft state. */ 1187 ddi_soft_state_free(ahci_statep, instance); 1188 1189 return (DDI_SUCCESS); 1190 1191 case DDI_SUSPEND: 1192 1193 /* 1194 * The steps associated with suspension must include putting 1195 * the underlying device into a quiescent state so that it 1196 * will not generate interrupts or modify or access memory. 1197 */ 1198 mutex_enter(&ahci_ctlp->ahcictl_mutex); 1199 if (ahci_ctlp->ahcictl_flags & AHCI_SUSPEND) { 1200 mutex_exit(&ahci_ctlp->ahcictl_mutex); 1201 return (DDI_SUCCESS); 1202 } 1203 1204 ahci_ctlp->ahcictl_flags |= AHCI_SUSPEND; 1205 1206 ahci_em_suspend(ahci_ctlp); 1207 1208 /* stop the watchdog handler */ 1209 if (ahci_ctlp->ahcictl_timeout_id) { 1210 (void) untimeout(ahci_ctlp->ahcictl_timeout_id); 1211 ahci_ctlp->ahcictl_timeout_id = 0; 1212 } 1213 1214 mutex_exit(&ahci_ctlp->ahcictl_mutex); 1215 1216 /* 1217 * drain the taskq 1218 */ 1219 ahci_drain_ports_taskq(ahci_ctlp); 1220 1221 /* 1222 * Disable the interrupts and stop all the ports. 1223 */ 1224 ahci_uninitialize_controller(ahci_ctlp); 1225 1226 return (DDI_SUCCESS); 1227 1228 default: 1229 return (DDI_FAILURE); 1230 } 1231 } 1232 1233 /* 1234 * The info entry point for dev_ops. 1235 * 1236 */ 1237 static int 1238 ahci_getinfo(dev_info_t *dip, ddi_info_cmd_t infocmd, 1239 void *arg, void **result) 1240 { 1241 #ifndef __lock_lint 1242 _NOTE(ARGUNUSED(dip)) 1243 #endif /* __lock_lint */ 1244 1245 ahci_ctl_t *ahci_ctlp; 1246 int instance; 1247 dev_t dev; 1248 1249 dev = (dev_t)arg; 1250 instance = getminor(dev); 1251 1252 switch (infocmd) { 1253 case DDI_INFO_DEVT2DEVINFO: 1254 ahci_ctlp = ddi_get_soft_state(ahci_statep, instance); 1255 if (ahci_ctlp != NULL) { 1256 *result = ahci_ctlp->ahcictl_dip; 1257 return (DDI_SUCCESS); 1258 } else { 1259 *result = NULL; 1260 return (DDI_FAILURE); 1261 } 1262 case DDI_INFO_DEVT2INSTANCE: 1263 *(int *)result = instance; 1264 break; 1265 default: 1266 break; 1267 } 1268 1269 return (DDI_SUCCESS); 1270 } 1271 1272 /* 1273 * Registers the ahci with sata framework. 1274 */ 1275 static int 1276 ahci_register_sata_hba_tran(ahci_ctl_t *ahci_ctlp, uint32_t cap_status) 1277 { 1278 struct sata_hba_tran *sata_hba_tran; 1279 1280 AHCIDBG(AHCIDBG_INIT|AHCIDBG_ENTRY, ahci_ctlp, 1281 "ahci_register_sata_hba_tran enter", NULL); 1282 1283 mutex_enter(&ahci_ctlp->ahcictl_mutex); 1284 1285 /* Allocate memory for the sata_hba_tran */ 1286 sata_hba_tran = kmem_zalloc(sizeof (sata_hba_tran_t), KM_SLEEP); 1287 1288 sata_hba_tran->sata_tran_hba_rev = SATA_TRAN_HBA_REV; 1289 sata_hba_tran->sata_tran_hba_dip = ahci_ctlp->ahcictl_dip; 1290 sata_hba_tran->sata_tran_hba_dma_attr = 1291 &ahci_ctlp->ahcictl_buffer_dma_attr; 1292 1293 /* Report the number of implemented ports */ 1294 sata_hba_tran->sata_tran_hba_num_cports = 1295 ahci_ctlp->ahcictl_num_implemented_ports; 1296 1297 /* Support ATAPI device */ 1298 sata_hba_tran->sata_tran_hba_features_support = SATA_CTLF_ATAPI; 1299 1300 /* Get the data transfer capability for PIO command by the HBA */ 1301 if (cap_status & AHCI_HBA_CAP_PMD) { 1302 ahci_ctlp->ahcictl_cap |= AHCI_CAP_PIO_MDRQ; 1303 AHCIDBG(AHCIDBG_INFO, ahci_ctlp, "HBA supports multiple " 1304 "DRQ block data transfer for PIO command protocol", NULL); 1305 } 1306 1307 /* 1308 * According to the AHCI spec, the ATA/ATAPI-7 queued feature set 1309 * is not supported by AHCI (including the READ QUEUED (EXT), WRITE 1310 * QUEUED (EXT), and SERVICE commands). Queued operations are 1311 * supported in AHCI using the READ FPDMA QUEUED and WRITE FPDMA 1312 * QUEUED commands when the HBA and device support native command 1313 * queuing(NCQ). 1314 * 1315 * SATA_CTLF_NCQ will be set to sata_tran_hba_features_support if the 1316 * CAP register of the HBA indicates NCQ is supported. 1317 * 1318 * SATA_CTLF_NCQ cannot be set if AHCI_CAP_NO_MCMDLIST_NONQUEUE is 1319 * set because the previous register content of PxCI can be re-written 1320 * in the register write. 1321 */ 1322 if ((cap_status & AHCI_HBA_CAP_SNCQ) && 1323 !(ahci_ctlp->ahcictl_cap & AHCI_CAP_NO_MCMDLIST_NONQUEUE)) { 1324 sata_hba_tran->sata_tran_hba_features_support |= SATA_CTLF_NCQ; 1325 ahci_ctlp->ahcictl_cap |= AHCI_CAP_NCQ; 1326 AHCIDBG(AHCIDBG_INFO, ahci_ctlp, "HBA supports Native " 1327 "Command Queuing", NULL); 1328 } 1329 1330 /* Support port multiplier? */ 1331 if (cap_status & AHCI_HBA_CAP_SPM) { 1332 sata_hba_tran->sata_tran_hba_features_support |= 1333 SATA_CTLF_PORT_MULTIPLIER; 1334 1335 /* Support FIS-based switching for port multiplier? */ 1336 if (cap_status & AHCI_HBA_CAP_FBSS) { 1337 sata_hba_tran->sata_tran_hba_features_support |= 1338 SATA_CTLF_PMULT_FBS; 1339 } 1340 } 1341 1342 /* Report the number of command slots */ 1343 sata_hba_tran->sata_tran_hba_qdepth = ahci_ctlp->ahcictl_num_cmd_slots; 1344 1345 sata_hba_tran->sata_tran_probe_port = ahci_tran_probe_port; 1346 sata_hba_tran->sata_tran_start = ahci_tran_start; 1347 sata_hba_tran->sata_tran_abort = ahci_tran_abort; 1348 sata_hba_tran->sata_tran_reset_dport = ahci_tran_reset_dport; 1349 sata_hba_tran->sata_tran_hotplug_ops = &ahci_tran_hotplug_ops; 1350 #ifdef __lock_lint 1351 sata_hba_tran->sata_tran_selftest = ahci_selftest; 1352 #endif 1353 /* 1354 * When SATA framework adds support for pwrmgt the 1355 * pwrmgt_ops needs to be updated 1356 */ 1357 sata_hba_tran->sata_tran_pwrmgt_ops = NULL; 1358 sata_hba_tran->sata_tran_ioctl = ahci_em_ioctl; 1359 1360 ahci_ctlp->ahcictl_sata_hba_tran = sata_hba_tran; 1361 1362 mutex_exit(&ahci_ctlp->ahcictl_mutex); 1363 1364 /* Attach it to SATA framework */ 1365 if (sata_hba_attach(ahci_ctlp->ahcictl_dip, sata_hba_tran, DDI_ATTACH) 1366 != DDI_SUCCESS) { 1367 kmem_free((void *)sata_hba_tran, sizeof (sata_hba_tran_t)); 1368 mutex_enter(&ahci_ctlp->ahcictl_mutex); 1369 ahci_ctlp->ahcictl_sata_hba_tran = NULL; 1370 mutex_exit(&ahci_ctlp->ahcictl_mutex); 1371 return (AHCI_FAILURE); 1372 } 1373 1374 return (AHCI_SUCCESS); 1375 } 1376 1377 /* 1378 * Unregisters the ahci with sata framework. 1379 */ 1380 static int 1381 ahci_unregister_sata_hba_tran(ahci_ctl_t *ahci_ctlp) 1382 { 1383 AHCIDBG(AHCIDBG_ENTRY, ahci_ctlp, 1384 "ahci_unregister_sata_hba_tran enter", NULL); 1385 1386 /* Detach from the SATA framework. */ 1387 if (sata_hba_detach(ahci_ctlp->ahcictl_dip, DDI_DETACH) != 1388 DDI_SUCCESS) { 1389 return (AHCI_FAILURE); 1390 } 1391 1392 /* Deallocate sata_hba_tran. */ 1393 kmem_free((void *)ahci_ctlp->ahcictl_sata_hba_tran, 1394 sizeof (sata_hba_tran_t)); 1395 1396 mutex_enter(&ahci_ctlp->ahcictl_mutex); 1397 ahci_ctlp->ahcictl_sata_hba_tran = NULL; 1398 mutex_exit(&ahci_ctlp->ahcictl_mutex); 1399 1400 return (AHCI_SUCCESS); 1401 } 1402 1403 #define SET_PORTSTR(str, addrp) \ 1404 if (AHCI_ADDR_IS_PORT(addrp)) \ 1405 (void) sprintf((str), "%d", (addrp)->aa_port); \ 1406 else if (AHCI_ADDR_IS_PMULT(addrp)) \ 1407 (void) sprintf((str), "%d (pmult)", (addrp)->aa_port); \ 1408 else \ 1409 (void) sprintf((str), "%d:%d", (addrp)->aa_port, \ 1410 (addrp)->aa_pmport); 1411 1412 /* 1413 * ahci_tran_probe_port is called by SATA framework. It returns port state, 1414 * port status registers and an attached device type via sata_device 1415 * structure. 1416 * 1417 * We return the cached information from a previous hardware probe. The 1418 * actual hardware probing itself was done either from within 1419 * ahci_initialize_controller() during the driver attach or from a phy 1420 * ready change interrupt handler. 1421 */ 1422 static int 1423 ahci_tran_probe_port(dev_info_t *dip, sata_device_t *sd) 1424 { 1425 ahci_ctl_t *ahci_ctlp; 1426 ahci_port_t *ahci_portp; 1427 ahci_addr_t addr, pmult_addr; 1428 uint8_t cport = sd->satadev_addr.cport; 1429 char portstr[10]; 1430 uint8_t device_type; 1431 uint32_t port_state; 1432 uint8_t port; 1433 int rval = SATA_SUCCESS, rval_init; 1434 1435 ahci_ctlp = ddi_get_soft_state(ahci_statep, ddi_get_instance(dip)); 1436 port = ahci_ctlp->ahcictl_cport_to_port[cport]; 1437 1438 ahci_portp = ahci_ctlp->ahcictl_ports[port]; 1439 1440 mutex_enter(&ahci_portp->ahciport_mutex); 1441 1442 ahci_get_ahci_addr(ahci_ctlp, sd, &addr); 1443 ASSERT(AHCI_ADDR_IS_VALID(&addr)); 1444 SET_PORTSTR(portstr, &addr); 1445 1446 AHCIDBG(AHCIDBG_ENTRY, ahci_ctlp, 1447 "ahci_tran_probe_port enter: port %s", portstr); 1448 1449 if ((AHCI_ADDR_IS_PMULT(&addr) || AHCI_ADDR_IS_PMPORT(&addr)) && 1450 (ahci_portp->ahciport_device_type != SATA_DTYPE_PMULT || 1451 ahci_portp->ahciport_pmult_info == NULL)) { 1452 /* port mutliplier is removed. */ 1453 AHCIDBG(AHCIDBG_PMULT, ahci_ctlp, 1454 "ahci_tran_probe_port: " 1455 "pmult is removed from port %s", portstr); 1456 mutex_exit(&ahci_portp->ahciport_mutex); 1457 return (SATA_FAILURE); 1458 } 1459 1460 /* 1461 * The sata_device may refer to 1462 * 1. A controller port. 1463 * A controller port should be ready here. 1464 * 2. A port multiplier. 1465 * SATA_ADDR_PMULT_SPEC - if it is not initialized yet, initialize 1466 * it and register the port multiplier to the framework. 1467 * SATA_ADDR_PMULT - check the status of all its device ports. 1468 * 3. A port multiplier port. 1469 * If it has not been initialized, initialized it. 1470 * 1471 * A port multiplier or a port multiplier port may require some 1472 * initialization because we cannot do these time-consuming jobs in an 1473 * interrupt context. 1474 */ 1475 if (sd->satadev_addr.qual & SATA_ADDR_PMULT_SPEC) { 1476 AHCI_ADDR_SET_PMULT(&pmult_addr, port); 1477 /* Initialize registers on a port multiplier */ 1478 rval_init = ahci_initialize_pmult(ahci_ctlp, 1479 ahci_portp, &pmult_addr, sd); 1480 if (rval_init != AHCI_SUCCESS) { 1481 AHCIDBG(AHCIDBG_PMULT, ahci_ctlp, 1482 "ahci_tran_probe_port: " 1483 "pmult initialization failed.", NULL); 1484 mutex_exit(&ahci_portp->ahciport_mutex); 1485 return (SATA_FAILURE); 1486 } 1487 } else if (sd->satadev_addr.qual & SATA_ADDR_PMULT) { 1488 /* Check pmports hotplug events */ 1489 (void) ahci_probe_pmult(ahci_ctlp, ahci_portp, &addr); 1490 } else if (sd->satadev_addr.qual & (SATA_ADDR_PMPORT | 1491 SATA_ADDR_DPMPORT)) { 1492 if (ahci_probe_pmport(ahci_ctlp, ahci_portp, 1493 &addr, sd) != AHCI_SUCCESS) { 1494 rval = SATA_FAILURE; 1495 goto out; 1496 } 1497 } 1498 1499 /* Update port state and device type */ 1500 port_state = AHCIPORT_GET_STATE(ahci_portp, &addr); 1501 1502 switch (port_state) { 1503 1504 case SATA_PSTATE_FAILED: 1505 sd->satadev_state = SATA_PSTATE_FAILED; 1506 AHCIDBG(AHCIDBG_ERRS, ahci_ctlp, 1507 "ahci_tran_probe_port: port %s PORT FAILED", portstr); 1508 goto out; 1509 1510 case SATA_PSTATE_SHUTDOWN: 1511 sd->satadev_state = SATA_PSTATE_SHUTDOWN; 1512 AHCIDBG(AHCIDBG_ERRS, ahci_ctlp, 1513 "ahci_tran_probe_port: port %s PORT SHUTDOWN", portstr); 1514 goto out; 1515 1516 case SATA_PSTATE_PWROFF: 1517 sd->satadev_state = SATA_PSTATE_PWROFF; 1518 AHCIDBG(AHCIDBG_ERRS, ahci_ctlp, 1519 "ahci_tran_probe_port: port %s PORT PWROFF", portstr); 1520 goto out; 1521 1522 case SATA_PSTATE_PWRON: 1523 sd->satadev_state = SATA_PSTATE_PWRON; 1524 AHCIDBG(AHCIDBG_INFO, ahci_ctlp, 1525 "ahci_tran_probe_port: port %s PORT PWRON", portstr); 1526 break; 1527 1528 default: 1529 sd->satadev_state = port_state; 1530 AHCIDBG(AHCIDBG_INFO, ahci_ctlp, 1531 "ahci_tran_probe_port: port %s PORT NORMAL %x", 1532 portstr, port_state); 1533 break; 1534 } 1535 1536 device_type = AHCIPORT_GET_DEV_TYPE(ahci_portp, &addr); 1537 1538 switch (device_type) { 1539 1540 case SATA_DTYPE_ATADISK: 1541 sd->satadev_type = SATA_DTYPE_ATADISK; 1542 AHCIDBG(AHCIDBG_INFO, ahci_ctlp, 1543 "ahci_tran_probe_port: port %s DISK found", portstr); 1544 break; 1545 1546 case SATA_DTYPE_ATAPI: 1547 /* 1548 * HBA driver only knows it's an ATAPI device, and don't know 1549 * it's CD/DVD, tape or ATAPI disk because the ATAPI device 1550 * type need to be determined by checking IDENTIFY PACKET 1551 * DEVICE data 1552 */ 1553 sd->satadev_type = SATA_DTYPE_ATAPI; 1554 AHCIDBG(AHCIDBG_INFO, ahci_ctlp, 1555 "ahci_tran_probe_port: port %s ATAPI found", portstr); 1556 break; 1557 1558 case SATA_DTYPE_PMULT: 1559 ASSERT(AHCI_ADDR_IS_PORT(&addr) || AHCI_ADDR_IS_PMULT(&addr)); 1560 sd->satadev_type = SATA_DTYPE_PMULT; 1561 1562 /* Update the number of pmports. */ 1563 ASSERT(ahci_portp->ahciport_pmult_info != NULL); 1564 sd->satadev_add_info = ahci_portp-> 1565 ahciport_pmult_info->ahcipmi_num_dev_ports; 1566 1567 AHCIDBG(AHCIDBG_INFO, ahci_ctlp, 1568 "ahci_tran_probe_port: port %s Port Multiplier found", 1569 portstr); 1570 break; 1571 1572 case SATA_DTYPE_UNKNOWN: 1573 sd->satadev_type = SATA_DTYPE_UNKNOWN; 1574 AHCIDBG(AHCIDBG_INFO, ahci_ctlp, 1575 "ahci_tran_probe_port: port %s Unknown device found", 1576 portstr); 1577 break; 1578 1579 default: 1580 /* we don't support any other device types */ 1581 sd->satadev_type = SATA_DTYPE_NONE; 1582 AHCIDBG(AHCIDBG_INFO, ahci_ctlp, 1583 "ahci_tran_probe_port: port %s No device found", portstr); 1584 break; 1585 } 1586 1587 out: 1588 /* Register update only fails while probing a pmult/pmport */ 1589 if (AHCI_ADDR_IS_PORT(&addr) || AHCI_ADDR_IS_PMULT(&addr)) { 1590 ahci_update_sata_registers(ahci_ctlp, port, sd); 1591 } else if (AHCI_ADDR_IS_PMPORT(&addr)) { 1592 if (port_state & SATA_STATE_READY) 1593 if (ahci_update_pmult_pscr(ahci_ctlp, 1594 &addr, sd) != AHCI_SUCCESS) 1595 rval = SATA_FAILURE; 1596 } 1597 1598 /* Check handles for the sata registers access */ 1599 if ((ahci_check_ctl_handle(ahci_ctlp) != DDI_SUCCESS) || 1600 (ahci_check_port_handle(ahci_ctlp, port) != DDI_SUCCESS)) { 1601 ddi_fm_service_impact(ahci_ctlp->ahcictl_dip, 1602 DDI_SERVICE_UNAFFECTED); 1603 rval = SATA_FAILURE; 1604 } 1605 1606 mutex_exit(&ahci_portp->ahciport_mutex); 1607 return (rval); 1608 } 1609 1610 /* 1611 * There are four operation modes in sata framework: 1612 * SATA_OPMODE_INTERRUPTS 1613 * SATA_OPMODE_POLLING 1614 * SATA_OPMODE_ASYNCH 1615 * SATA_OPMODE_SYNCH 1616 * 1617 * Their combined meanings as following: 1618 * 1619 * SATA_OPMODE_SYNCH 1620 * The command has to be completed before sata_tran_start functions returns. 1621 * Either interrupts or polling could be used - it's up to the driver. 1622 * Mode used currently for internal, sata-module initiated operations. 1623 * 1624 * SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS 1625 * It is the same as the one above. 1626 * 1627 * SATA_OPMODE_SYNCH | SATA_OPMODE_POLLING 1628 * The command has to be completed before sata_tran_start function returns. 1629 * No interrupt used, polling only. This should be the mode used for scsi 1630 * packets with FLAG_NOINTR. 1631 * 1632 * SATA_OPMODE_ASYNCH | SATA_OPMODE_INTERRUPTS 1633 * The command may be queued (callback function specified). Interrupts could 1634 * be used. It's normal operation mode. 1635 */ 1636 /* 1637 * Called by sata framework to transport a sata packet down stream. 1638 */ 1639 static int 1640 ahci_tran_start(dev_info_t *dip, sata_pkt_t *spkt) 1641 { 1642 ahci_ctl_t *ahci_ctlp; 1643 ahci_port_t *ahci_portp; 1644 ahci_addr_t addr; 1645 uint8_t cport = spkt->satapkt_device.satadev_addr.cport; 1646 uint8_t port; 1647 char portstr[10]; 1648 1649 ahci_ctlp = ddi_get_soft_state(ahci_statep, ddi_get_instance(dip)); 1650 port = ahci_ctlp->ahcictl_cport_to_port[cport]; 1651 1652 AHCIDBG(AHCIDBG_ENTRY, ahci_ctlp, 1653 "ahci_tran_start enter: cport %d satapkt 0x%p", 1654 cport, (void *)spkt); 1655 1656 ahci_portp = ahci_ctlp->ahcictl_ports[port]; 1657 1658 mutex_enter(&ahci_portp->ahciport_mutex); 1659 ahci_get_ahci_addr(ahci_ctlp, &spkt->satapkt_device, &addr); 1660 SET_PORTSTR(portstr, &addr); 1661 1662 /* Sanity check */ 1663 if (AHCI_ADDR_IS_PMPORT(&addr)) { 1664 if (ahci_portp->ahciport_device_type != SATA_DTYPE_PMULT || 1665 ahci_portp->ahciport_pmult_info == NULL) { 1666 1667 spkt->satapkt_reason = SATA_PKT_PORT_ERROR; 1668 spkt->satapkt_device.satadev_type = SATA_DTYPE_NONE; 1669 spkt->satapkt_device.satadev_state = SATA_STATE_UNKNOWN; 1670 ahci_update_sata_registers(ahci_ctlp, port, 1671 &spkt->satapkt_device); 1672 AHCIDBG(AHCIDBG_ERRS, ahci_ctlp, 1673 "ahci_tran_start returning PORT_ERROR while " 1674 "pmult removed: port: %s", portstr); 1675 mutex_exit(&ahci_portp->ahciport_mutex); 1676 return (SATA_TRAN_PORT_ERROR); 1677 } 1678 1679 if (!(AHCIPORT_GET_STATE(ahci_portp, &addr) & 1680 SATA_STATE_READY)) { 1681 if (!ddi_in_panic() || 1682 ahci_initialize_pmport(ahci_ctlp, 1683 ahci_portp, &addr) != AHCI_SUCCESS) { 1684 spkt->satapkt_reason = SATA_PKT_PORT_ERROR; 1685 spkt->satapkt_device.satadev_type = 1686 AHCIPORT_GET_DEV_TYPE(ahci_portp, &addr); 1687 spkt->satapkt_device.satadev_state = 1688 AHCIPORT_GET_STATE(ahci_portp, &addr); 1689 ahci_update_sata_registers(ahci_ctlp, port, 1690 &spkt->satapkt_device); 1691 AHCIDBG(AHCIDBG_ERRS, ahci_ctlp, 1692 "ahci_tran_start returning PORT_ERROR " 1693 "while sub-link is not initialized " 1694 "at port: %s", portstr); 1695 mutex_exit(&ahci_portp->ahciport_mutex); 1696 return (SATA_TRAN_PORT_ERROR); 1697 } 1698 } 1699 } 1700 1701 if (AHCIPORT_GET_STATE(ahci_portp, &addr) & SATA_PSTATE_FAILED || 1702 AHCIPORT_GET_STATE(ahci_portp, &addr) & SATA_PSTATE_SHUTDOWN|| 1703 AHCIPORT_GET_STATE(ahci_portp, &addr) & SATA_PSTATE_PWROFF) { 1704 /* 1705 * In case the target driver would send the packet before 1706 * sata framework can have the opportunity to process those 1707 * event reports. 1708 */ 1709 spkt->satapkt_reason = SATA_PKT_PORT_ERROR; 1710 spkt->satapkt_device.satadev_state = 1711 ahci_portp->ahciport_port_state; 1712 ahci_update_sata_registers(ahci_ctlp, port, 1713 &spkt->satapkt_device); 1714 AHCIDBG(AHCIDBG_ERRS, ahci_ctlp, 1715 "ahci_tran_start returning PORT_ERROR while " 1716 "port in FAILED/SHUTDOWN/PWROFF state: " 1717 "port: %s", portstr); 1718 mutex_exit(&ahci_portp->ahciport_mutex); 1719 return (SATA_TRAN_PORT_ERROR); 1720 } 1721 1722 if (AHCIPORT_GET_DEV_TYPE(ahci_portp, &addr) == SATA_DTYPE_NONE) { 1723 /* 1724 * ahci_intr_phyrdy_change() may have rendered it to 1725 * SATA_DTYPE_NONE. 1726 */ 1727 spkt->satapkt_reason = SATA_PKT_PORT_ERROR; 1728 spkt->satapkt_device.satadev_type = SATA_DTYPE_NONE; 1729 spkt->satapkt_device.satadev_state = 1730 ahci_portp->ahciport_port_state; 1731 ahci_update_sata_registers(ahci_ctlp, port, 1732 &spkt->satapkt_device); 1733 AHCIDBG(AHCIDBG_ERRS, ahci_ctlp, 1734 "ahci_tran_start returning PORT_ERROR while " 1735 "no device attached: port: %s", portstr); 1736 mutex_exit(&ahci_portp->ahciport_mutex); 1737 return (SATA_TRAN_PORT_ERROR); 1738 } 1739 1740 /* R/W PMULT command will occupy the whole HBA port */ 1741 if (RDWR_PMULT_CMD_IN_PROGRESS(ahci_portp)) { 1742 AHCIDBG(AHCIDBG_ERRS, ahci_ctlp, 1743 "ahci_tran_start returning BUSY while " 1744 "executing READ/WRITE PORT-MULT command: " 1745 "port: %s", portstr); 1746 spkt->satapkt_reason = SATA_PKT_BUSY; 1747 mutex_exit(&ahci_portp->ahciport_mutex); 1748 return (SATA_TRAN_BUSY); 1749 } 1750 1751 if (ahci_portp->ahciport_flags & AHCI_PORT_FLAG_HOTPLUG) { 1752 AHCIDBG(AHCIDBG_ERRS, ahci_ctlp, 1753 "ahci_tran_start returning BUSY while " 1754 "hot-plug in progress: port: %s", portstr); 1755 spkt->satapkt_reason = SATA_PKT_BUSY; 1756 mutex_exit(&ahci_portp->ahciport_mutex); 1757 return (SATA_TRAN_BUSY); 1758 } 1759 1760 /* 1761 * SATA HBA driver should remember that a device was reset and it 1762 * is supposed to reject any packets which do not specify either 1763 * SATA_IGNORE_DEV_RESET_STATE or SATA_CLEAR_DEV_RESET_STATE. 1764 * 1765 * This is to prevent a race condition when a device was arbitrarily 1766 * reset by the HBA driver (and lost it's setting) and a target 1767 * driver sending some commands to a device before the sata framework 1768 * has a chance to restore the device setting (such as cache enable/ 1769 * disable or other resettable stuff). 1770 */ 1771 /* 1772 * It is unnecessary to use specific flags to indicate 1773 * reset_in_progress for a pmport. While mopping, all command will be 1774 * mopped so that the entire HBA port is being dealt as a single 1775 * object. 1776 */ 1777 if (spkt->satapkt_cmd.satacmd_flags.sata_clear_dev_reset) { 1778 ahci_portp->ahciport_reset_in_progress = 0; 1779 AHCIDBG(AHCIDBG_ERRS, ahci_ctlp, 1780 "ahci_tran_start [CLEAR] the " 1781 "reset_in_progress for port: %d", port); 1782 } 1783 1784 if (ahci_portp->ahciport_reset_in_progress && 1785 ! spkt->satapkt_cmd.satacmd_flags.sata_ignore_dev_reset && 1786 ! ddi_in_panic()) { 1787 spkt->satapkt_reason = SATA_PKT_BUSY; 1788 AHCIDBG(AHCIDBG_ERRS, ahci_ctlp, 1789 "ahci_tran_start returning BUSY while " 1790 "reset in progress: port: %d", port); 1791 mutex_exit(&ahci_portp->ahciport_mutex); 1792 return (SATA_TRAN_BUSY); 1793 } 1794 1795 #ifdef AHCI_DEBUG 1796 if (spkt->satapkt_cmd.satacmd_flags.sata_ignore_dev_reset) { 1797 AHCIDBG(AHCIDBG_ERRS, ahci_ctlp, 1798 "ahci_tran_start: packet 0x%p [PASSTHRU] at port %d", 1799 spkt, port); 1800 } 1801 #endif 1802 1803 if (ahci_portp->ahciport_flags & AHCI_PORT_FLAG_MOPPING) { 1804 spkt->satapkt_reason = SATA_PKT_BUSY; 1805 AHCIDBG(AHCIDBG_ERRS, ahci_ctlp, 1806 "ahci_tran_start returning BUSY while " 1807 "mopping in progress: port: %d", port); 1808 mutex_exit(&ahci_portp->ahciport_mutex); 1809 return (SATA_TRAN_BUSY); 1810 } 1811 1812 if (ahci_check_ctl_handle(ahci_ctlp) != DDI_SUCCESS) { 1813 ddi_fm_service_impact(ahci_ctlp->ahcictl_dip, 1814 DDI_SERVICE_UNAFFECTED); 1815 mutex_exit(&ahci_portp->ahciport_mutex); 1816 return (SATA_TRAN_BUSY); 1817 } 1818 1819 if (spkt->satapkt_op_mode & 1820 (SATA_OPMODE_SYNCH | SATA_OPMODE_POLLING)) { 1821 /* 1822 * If a SYNC command to be executed in interrupt context, 1823 * bounce it back to sata module. 1824 */ 1825 if (!(spkt->satapkt_op_mode & SATA_OPMODE_POLLING) && 1826 servicing_interrupt()) { 1827 spkt->satapkt_reason = SATA_PKT_BUSY; 1828 AHCIDBG(AHCIDBG_ERRS, ahci_ctlp, 1829 "ahci_tran_start returning BUSY while " 1830 "sending SYNC mode under interrupt context: " 1831 "port : %d", port); 1832 mutex_exit(&ahci_portp->ahciport_mutex); 1833 return (SATA_TRAN_BUSY); 1834 } 1835 1836 /* We need to do the sync start now */ 1837 if (ahci_do_sync_start(ahci_ctlp, ahci_portp, &addr, 1838 spkt) == AHCI_FAILURE) { 1839 goto fail_out; 1840 } 1841 } else { 1842 /* Async start, using interrupt */ 1843 if (ahci_deliver_satapkt(ahci_ctlp, ahci_portp, &addr, spkt) 1844 == AHCI_FAILURE) { 1845 spkt->satapkt_reason = SATA_PKT_QUEUE_FULL; 1846 goto fail_out; 1847 } 1848 } 1849 1850 AHCIDBG(AHCIDBG_INFO, ahci_ctlp, "ahci_tran_start " 1851 "sata tran accepted: port %s", portstr); 1852 1853 mutex_exit(&ahci_portp->ahciport_mutex); 1854 return (SATA_TRAN_ACCEPTED); 1855 1856 fail_out: 1857 /* 1858 * Failed to deliver packet to the controller. 1859 * Check if it's caused by invalid handles. 1860 */ 1861 if (ahci_check_ctl_handle(ahci_ctlp) != DDI_SUCCESS || 1862 ahci_check_port_handle(ahci_ctlp, port) != DDI_SUCCESS) { 1863 spkt->satapkt_device.satadev_type = 1864 AHCIPORT_GET_DEV_TYPE(ahci_portp, &addr); 1865 spkt->satapkt_device.satadev_state = 1866 AHCIPORT_GET_STATE(ahci_portp, &addr); 1867 spkt->satapkt_reason = SATA_PKT_DEV_ERROR; 1868 mutex_exit(&ahci_portp->ahciport_mutex); 1869 return (SATA_TRAN_PORT_ERROR); 1870 } 1871 1872 AHCIDBG(AHCIDBG_ERRS, ahci_ctlp, "ahci_tran_start " 1873 "return QUEUE_FULL: port %d", port); 1874 mutex_exit(&ahci_portp->ahciport_mutex); 1875 return (SATA_TRAN_QUEUE_FULL); 1876 } 1877 1878 /* 1879 * SATA_OPMODE_SYNCH flag is set 1880 * 1881 * If SATA_OPMODE_POLLING flag is set, then we must poll the command 1882 * without interrupt, otherwise we can still use the interrupt. 1883 */ 1884 static int 1885 ahci_do_sync_start(ahci_ctl_t *ahci_ctlp, ahci_port_t *ahci_portp, 1886 ahci_addr_t *addrp, sata_pkt_t *spkt) 1887 { 1888 int pkt_timeout_ticks; 1889 uint32_t timeout_tags; 1890 int rval; 1891 int instance = ddi_get_instance(ahci_ctlp->ahcictl_dip); 1892 uint8_t port = addrp->aa_port; 1893 1894 ASSERT(MUTEX_HELD(&ahci_portp->ahciport_mutex)); 1895 1896 AHCIDBG(AHCIDBG_ENTRY, ahci_ctlp, "ahci_do_sync_start enter: " 1897 "port %d:%d spkt 0x%p", port, addrp->aa_pmport, spkt); 1898 1899 if (spkt->satapkt_op_mode & SATA_OPMODE_POLLING) { 1900 ahci_portp->ahciport_flags |= AHCI_PORT_FLAG_POLLING; 1901 if ((rval = ahci_deliver_satapkt(ahci_ctlp, ahci_portp, 1902 addrp, spkt)) == AHCI_FAILURE) { 1903 ahci_portp->ahciport_flags &= ~AHCI_PORT_FLAG_POLLING; 1904 return (rval); 1905 } 1906 1907 pkt_timeout_ticks = 1908 drv_usectohz((clock_t)spkt->satapkt_time * 1000000); 1909 1910 while (spkt->satapkt_reason == SATA_PKT_BUSY) { 1911 /* Simulate the interrupt */ 1912 mutex_exit(&ahci_portp->ahciport_mutex); 1913 ahci_port_intr(ahci_ctlp, ahci_portp, port); 1914 mutex_enter(&ahci_portp->ahciport_mutex); 1915 1916 if (spkt->satapkt_reason != SATA_PKT_BUSY) 1917 break; 1918 1919 mutex_exit(&ahci_portp->ahciport_mutex); 1920 drv_usecwait(AHCI_1MS_USECS); 1921 mutex_enter(&ahci_portp->ahciport_mutex); 1922 1923 pkt_timeout_ticks -= AHCI_1MS_TICKS; 1924 if (pkt_timeout_ticks < 0) { 1925 cmn_err(CE_WARN, "!ahci%d: ahci_do_sync_start " 1926 "port %d satapkt 0x%p timed out\n", 1927 instance, port, (void *)spkt); 1928 timeout_tags = (0x1 << rval); 1929 mutex_exit(&ahci_portp->ahciport_mutex); 1930 ahci_timeout_pkts(ahci_ctlp, ahci_portp, 1931 port, timeout_tags); 1932 mutex_enter(&ahci_portp->ahciport_mutex); 1933 } 1934 } 1935 1936 ahci_portp->ahciport_flags &= ~AHCI_PORT_FLAG_POLLING; 1937 return (AHCI_SUCCESS); 1938 1939 } else { 1940 if ((rval = ahci_deliver_satapkt(ahci_ctlp, ahci_portp, 1941 addrp, spkt)) == AHCI_FAILURE) 1942 return (rval); 1943 1944 #if AHCI_DEBUG 1945 /* 1946 * Note that the driver always uses the slot 0 to deliver 1947 * REQUEST SENSE or READ LOG EXT command 1948 */ 1949 if (ERR_RETRI_CMD_IN_PROGRESS(ahci_portp)) 1950 ASSERT(rval == 0); 1951 #endif 1952 1953 while (spkt->satapkt_reason == SATA_PKT_BUSY) 1954 cv_wait(&ahci_portp->ahciport_cv, 1955 &ahci_portp->ahciport_mutex); 1956 1957 return (AHCI_SUCCESS); 1958 } 1959 } 1960 1961 /* 1962 * Searches for and claims a free command slot. 1963 * 1964 * Returns value: 1965 * 1966 * AHCI_FAILURE returned only if 1967 * 1. No empty slot left 1968 * 2. Non-queued command requested while queued command(s) is outstanding 1969 * 3. Queued command requested while non-queued command(s) is outstanding 1970 * 4. HBA doesn't support multiple-use of command list while already a 1971 * non-queued command is oustanding 1972 * 5. Queued command requested while some queued command(s) has been 1973 * outstanding on a different port multiplier port. (AHCI spec 1.2, 1974 * 9.1.2) 1975 * 1976 * claimed slot number returned if succeeded 1977 * 1978 * NOTE: it will always return slot 0 for following commands to simplify the 1979 * algorithm. 1980 * 1. REQUEST SENSE or READ LOG EXT command during error recovery process 1981 * 2. READ/WRITE PORTMULT command 1982 */ 1983 static int 1984 ahci_claim_free_slot(ahci_ctl_t *ahci_ctlp, ahci_port_t *ahci_portp, 1985 ahci_addr_t *addrp, int command_type) 1986 { 1987 uint32_t port_cmd_issue; 1988 uint32_t free_slots; 1989 int slot; 1990 1991 ASSERT(MUTEX_HELD(&ahci_portp->ahciport_mutex)); 1992 1993 AHCIDBG(AHCIDBG_ENTRY, ahci_ctlp, "ahci_claim_free_slot enter " 1994 "ahciport_pending_tags = 0x%x " 1995 "ahciport_pending_ncq_tags = 0x%x", 1996 ahci_portp->ahciport_pending_tags, 1997 ahci_portp->ahciport_pending_ncq_tags); 1998 1999 /* 2000 * According to the AHCI spec, system software is responsible to 2001 * ensure that queued and non-queued commands are not mixed in 2002 * the command list. 2003 */ 2004 if (command_type == AHCI_NON_NCQ_CMD) { 2005 /* Non-NCQ command request */ 2006 if (NCQ_CMD_IN_PROGRESS(ahci_portp)) { 2007 AHCIDBG(AHCIDBG_INFO|AHCIDBG_NCQ, ahci_ctlp, 2008 "ahci_claim_free_slot: there is still pending " 2009 "queued command(s) in the command list, " 2010 "so no available slot for the non-queued " 2011 "command", NULL); 2012 return (AHCI_FAILURE); 2013 } 2014 if (RDWR_PMULT_CMD_IN_PROGRESS(ahci_portp)) { 2015 AHCIDBG(AHCIDBG_INFO|AHCIDBG_PMULT, ahci_ctlp, 2016 "ahci_claim_free_slot: there is still pending " 2017 "read/write port-mult command(s) in command list, " 2018 "so no available slot for the non-queued command", 2019 NULL); 2020 return (AHCI_FAILURE); 2021 } 2022 if ((ahci_ctlp->ahcictl_cap & AHCI_CAP_NO_MCMDLIST_NONQUEUE) && 2023 NON_NCQ_CMD_IN_PROGRESS(ahci_portp)) { 2024 AHCIDBG(AHCIDBG_INFO, ahci_ctlp, 2025 "ahci_claim_free_slot: HBA cannot support multiple-" 2026 "use of the command list for non-queued commands", 2027 NULL); 2028 return (AHCI_FAILURE); 2029 } 2030 free_slots = (~ahci_portp->ahciport_pending_tags) & 2031 AHCI_SLOT_MASK(ahci_ctlp); 2032 } else if (command_type == AHCI_NCQ_CMD) { 2033 /* NCQ command request */ 2034 if (NON_NCQ_CMD_IN_PROGRESS(ahci_portp)) { 2035 AHCIDBG(AHCIDBG_INFO|AHCIDBG_NCQ, ahci_ctlp, 2036 "ahci_claim_free_slot: there is still pending " 2037 "non-queued command(s) in the command list, " 2038 "so no available slot for the queued command", 2039 NULL); 2040 return (AHCI_FAILURE); 2041 } 2042 2043 /* 2044 * NCQ commands cannot be sent to different port multiplier 2045 * ports in Command-Based Switching mode 2046 */ 2047 /* 2048 * NOTE: In Command-Based Switching mode, AHCI controller 2049 * usually reports a 'Handshake Error' when multiple NCQ 2050 * commands are outstanding simultaneously. 2051 */ 2052 if (AHCIPORT_DEV_TYPE(ahci_portp, addrp) == SATA_DTYPE_PMULT) { 2053 ASSERT(ahci_portp->ahciport_pmult_info != NULL); 2054 if (!(ahci_ctlp->ahcictl_cap & AHCI_CAP_PMULT_FBSS) && 2055 NCQ_CMD_IN_PROGRESS(ahci_portp) && 2056 AHCIPORT_NCQ_PMPORT(ahci_portp) != 2057 addrp->aa_pmport) { 2058 AHCIDBG(AHCIDBG_INFO, ahci_ctlp, 2059 "ahci_claim_free_slot: there is still " 2060 "pending queued command(s) in the " 2061 "command list for another Port Multiplier " 2062 "port, so no available slot.", NULL); 2063 return (AHCI_FAILURE); 2064 } 2065 } 2066 2067 free_slots = (~ahci_portp->ahciport_pending_ncq_tags) & 2068 AHCI_NCQ_SLOT_MASK(ahci_portp); 2069 } else if (command_type == AHCI_ERR_RETRI_CMD) { 2070 /* Error retrieval command request */ 2071 AHCIDBG(AHCIDBG_ERRS, ahci_ctlp, 2072 "ahci_claim_free_slot: slot 0 is allocated for REQUEST " 2073 "SENSE or READ LOG EXT command", NULL); 2074 slot = 0; 2075 goto out; 2076 } else if (command_type == AHCI_RDWR_PMULT_CMD) { 2077 /* 2078 * An extra check on PxCI. Sometimes PxCI bits may not be 2079 * cleared during hot-plug or error recovery process. 2080 */ 2081 port_cmd_issue = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 2082 (uint32_t *)AHCI_PORT_PxCI(ahci_ctlp, addrp->aa_port)); 2083 2084 if (port_cmd_issue != 0) { 2085 AHCIDBG(AHCIDBG_INFO|AHCIDBG_PMULT, ahci_ctlp, 2086 "ahci_claim_free_slot: there is still pending " 2087 "command(s) in command list (0x%x/0x%x, PxCI %x)," 2088 "so no available slot for R/W PMULT command.", 2089 NON_NCQ_CMD_IN_PROGRESS(ahci_portp), 2090 NCQ_CMD_IN_PROGRESS(ahci_portp), 2091 port_cmd_issue); 2092 return (AHCI_FAILURE); 2093 } 2094 2095 AHCIDBG(AHCIDBG_INFO, ahci_ctlp, 2096 "ahci_claim_free_slot: slot 0 is allocated for " 2097 "READ/WRITE PORTMULT command", NULL); 2098 slot = 0; 2099 goto out; 2100 } 2101 2102 slot = ddi_ffs(free_slots) - 1; 2103 if (slot == -1) { 2104 AHCIDBG(AHCIDBG_VERBOSE, ahci_ctlp, 2105 "ahci_claim_free_slot: no empty slots", NULL); 2106 return (AHCI_FAILURE); 2107 } 2108 2109 /* 2110 * According to the AHCI spec, to allow a simple mechanism for the 2111 * HBA to map command list slots to queue entries, software must 2112 * match the tag number it uses to the slot it is placing the command 2113 * in. For example, if a queued command is placed in slot 5, the tag 2114 * for that command must be 5. 2115 */ 2116 if (command_type == AHCI_NCQ_CMD) { 2117 ahci_portp->ahciport_pending_ncq_tags |= (0x1 << slot); 2118 if (AHCI_ADDR_IS_PMPORT(addrp)) { 2119 ASSERT(ahci_portp->ahciport_pmult_info != NULL); 2120 AHCIPORT_NCQ_PMPORT(ahci_portp) = addrp->aa_pmport; 2121 } 2122 } 2123 2124 ahci_portp->ahciport_pending_tags |= (0x1 << slot); 2125 2126 out: 2127 AHCIDBG(AHCIDBG_VERBOSE, ahci_ctlp, 2128 "ahci_claim_free_slot: found slot: 0x%x", slot); 2129 2130 return (slot); 2131 } 2132 2133 /* 2134 * Builds the Command Table for the sata packet and delivers it to controller. 2135 * 2136 * Returns: 2137 * slot number if we can obtain a slot successfully 2138 * otherwise, return AHCI_FAILURE 2139 */ 2140 static int 2141 ahci_deliver_satapkt(ahci_ctl_t *ahci_ctlp, ahci_port_t *ahci_portp, 2142 ahci_addr_t *addrp, sata_pkt_t *spkt) 2143 { 2144 int cmd_slot; 2145 sata_cmd_t *scmd; 2146 ahci_fis_h2d_register_t *h2d_register_fisp; 2147 ahci_cmd_table_t *cmd_table; 2148 ahci_cmd_header_t *cmd_header; 2149 int ncookies; 2150 int i; 2151 int command_type = AHCI_NON_NCQ_CMD; 2152 int ncq_qdepth; 2153 int instance = ddi_get_instance(ahci_ctlp->ahcictl_dip); 2154 uint8_t port, pmport; 2155 #if AHCI_DEBUG 2156 uint32_t *ptr; 2157 uint8_t *ptr2; 2158 #endif 2159 2160 ASSERT(MUTEX_HELD(&ahci_portp->ahciport_mutex)); 2161 2162 port = addrp->aa_port; 2163 pmport = addrp->aa_pmport; 2164 2165 spkt->satapkt_reason = SATA_PKT_BUSY; 2166 2167 scmd = &spkt->satapkt_cmd; 2168 2169 /* Check if the command is a NCQ command */ 2170 if (scmd->satacmd_cmd_reg == SATAC_READ_FPDMA_QUEUED || 2171 scmd->satacmd_cmd_reg == SATAC_WRITE_FPDMA_QUEUED) { 2172 command_type = AHCI_NCQ_CMD; 2173 2174 /* 2175 * When NCQ is support, system software must determine the 2176 * maximum tag allowed by the device and the HBA, and it 2177 * must use a value not beyond of the lower bound of the two. 2178 * 2179 * Sata module is going to calculate the qdepth and send 2180 * down to HBA driver via sata_cmd. 2181 */ 2182 ncq_qdepth = scmd->satacmd_flags.sata_max_queue_depth + 1; 2183 2184 /* 2185 * At the moment, the driver doesn't support the dynamic 2186 * setting of the maximum ncq depth, and the value can be 2187 * set either during the attach or after hot-plug insertion. 2188 */ 2189 if (ahci_portp->ahciport_max_ncq_tags == 0) { 2190 ahci_portp->ahciport_max_ncq_tags = ncq_qdepth; 2191 AHCIDBG(AHCIDBG_NCQ, ahci_ctlp, 2192 "ahci_deliver_satapkt: port %d the max tags for " 2193 "NCQ command is %d", port, ncq_qdepth); 2194 } else { 2195 if (ncq_qdepth != ahci_portp->ahciport_max_ncq_tags) { 2196 cmn_err(CE_WARN, "!ahci%d: ahci_deliver_satapkt" 2197 " port %d the max tag for NCQ command is " 2198 "requested to change from %d to %d, at the" 2199 " moment the driver doesn't support the " 2200 "dynamic change so it's going to " 2201 "still use the previous tag value", 2202 instance, port, 2203 ahci_portp->ahciport_max_ncq_tags, 2204 ncq_qdepth); 2205 } 2206 } 2207 } 2208 2209 /* Check if the command is an error retrieval command */ 2210 if (ERR_RETRI_CMD_IN_PROGRESS(ahci_portp)) 2211 command_type = AHCI_ERR_RETRI_CMD; 2212 2213 /* Check if the command is an read/write pmult command */ 2214 if (RDWR_PMULT_CMD_IN_PROGRESS(ahci_portp)) 2215 command_type = AHCI_RDWR_PMULT_CMD; 2216 2217 /* Check if there is an empty command slot */ 2218 cmd_slot = ahci_claim_free_slot(ahci_ctlp, ahci_portp, 2219 addrp, command_type); 2220 if (cmd_slot == AHCI_FAILURE) { 2221 AHCIDBG(AHCIDBG_INFO, ahci_ctlp, "no free command slot", NULL); 2222 return (AHCI_FAILURE); 2223 } 2224 2225 AHCIDBG(AHCIDBG_ENTRY|AHCIDBG_INFO, ahci_ctlp, 2226 "ahci_deliver_satapkt enter: cmd_reg: 0x%x, cmd_slot: 0x%x, " 2227 "port: %d, satapkt: 0x%p", scmd->satacmd_cmd_reg, 2228 cmd_slot, port, (void *)spkt); 2229 2230 cmd_table = ahci_portp->ahciport_cmd_tables[cmd_slot]; 2231 bzero((void *)cmd_table, ahci_cmd_table_size); 2232 2233 /* For data transfer operations, it is the H2D Register FIS */ 2234 h2d_register_fisp = 2235 &(cmd_table->ahcict_command_fis.ahcifc_fis.ahcifc_h2d_register); 2236 2237 SET_FIS_TYPE(h2d_register_fisp, AHCI_H2D_REGISTER_FIS_TYPE); 2238 2239 /* 2240 * PMP field only make sense when target is a port multiplier or a 2241 * device behind a port multiplier. Otherwise should set it to 0. 2242 */ 2243 if (AHCI_ADDR_IS_PMULT(addrp) || AHCI_ADDR_IS_PMPORT(addrp)) 2244 SET_FIS_PMP(h2d_register_fisp, pmport); 2245 2246 SET_FIS_CDMDEVCTL(h2d_register_fisp, 1); 2247 SET_FIS_COMMAND(h2d_register_fisp, scmd->satacmd_cmd_reg); 2248 SET_FIS_FEATURES(h2d_register_fisp, scmd->satacmd_features_reg); 2249 SET_FIS_SECTOR_COUNT(h2d_register_fisp, scmd->satacmd_sec_count_lsb); 2250 2251 switch (scmd->satacmd_addr_type) { 2252 2253 case 0: 2254 /* 2255 * satacmd_addr_type will be 0 for the commands below: 2256 * ATAPI command 2257 * SATAC_IDLE_IM 2258 * SATAC_STANDBY_IM 2259 * SATAC_DOWNLOAD_MICROCODE 2260 * SATAC_FLUSH_CACHE 2261 * SATAC_SET_FEATURES 2262 * SATAC_SMART 2263 * SATAC_ID_PACKET_DEVICE 2264 * SATAC_ID_DEVICE 2265 * SATAC_READ_PORTMULT 2266 * SATAC_WRITE_PORTMULT 2267 */ 2268 /* FALLTHRU */ 2269 2270 case ATA_ADDR_LBA: 2271 /* FALLTHRU */ 2272 2273 case ATA_ADDR_LBA28: 2274 /* LBA[7:0] */ 2275 SET_FIS_SECTOR(h2d_register_fisp, scmd->satacmd_lba_low_lsb); 2276 2277 /* LBA[15:8] */ 2278 SET_FIS_CYL_LOW(h2d_register_fisp, scmd->satacmd_lba_mid_lsb); 2279 2280 /* LBA[23:16] */ 2281 SET_FIS_CYL_HI(h2d_register_fisp, scmd->satacmd_lba_high_lsb); 2282 2283 /* LBA [27:24] (also called dev_head) */ 2284 SET_FIS_DEV_HEAD(h2d_register_fisp, scmd->satacmd_device_reg); 2285 2286 break; 2287 2288 case ATA_ADDR_LBA48: 2289 /* LBA[7:0] */ 2290 SET_FIS_SECTOR(h2d_register_fisp, scmd->satacmd_lba_low_lsb); 2291 2292 /* LBA[15:8] */ 2293 SET_FIS_CYL_LOW(h2d_register_fisp, scmd->satacmd_lba_mid_lsb); 2294 2295 /* LBA[23:16] */ 2296 SET_FIS_CYL_HI(h2d_register_fisp, scmd->satacmd_lba_high_lsb); 2297 2298 /* LBA [31:24] */ 2299 SET_FIS_SECTOR_EXP(h2d_register_fisp, 2300 scmd->satacmd_lba_low_msb); 2301 2302 /* LBA [39:32] */ 2303 SET_FIS_CYL_LOW_EXP(h2d_register_fisp, 2304 scmd->satacmd_lba_mid_msb); 2305 2306 /* LBA [47:40] */ 2307 SET_FIS_CYL_HI_EXP(h2d_register_fisp, 2308 scmd->satacmd_lba_high_msb); 2309 2310 /* Set dev_head */ 2311 SET_FIS_DEV_HEAD(h2d_register_fisp, 2312 scmd->satacmd_device_reg); 2313 2314 /* Set the extended sector count and features */ 2315 SET_FIS_SECTOR_COUNT_EXP(h2d_register_fisp, 2316 scmd->satacmd_sec_count_msb); 2317 SET_FIS_FEATURES_EXP(h2d_register_fisp, 2318 scmd->satacmd_features_reg_ext); 2319 break; 2320 } 2321 2322 /* 2323 * For NCQ command (READ/WRITE FPDMA QUEUED), sector count 7:0 is 2324 * filled into features field, and sector count 8:15 is filled into 2325 * features (exp) field. The hba driver doesn't need to anything 2326 * special with regard to this, since sata framework has already 2327 * done so. 2328 * 2329 * However the driver needs to make sure TAG is filled into sector 2330 * field. 2331 */ 2332 if (command_type == AHCI_NCQ_CMD) { 2333 SET_FIS_SECTOR_COUNT(h2d_register_fisp, 2334 (cmd_slot << SATA_TAG_QUEUING_SHIFT)); 2335 } 2336 2337 ncookies = scmd->satacmd_num_dma_cookies; 2338 AHCIDBG(AHCIDBG_PRDT, ahci_ctlp, 2339 "ncookies = 0x%x, ahci_dma_prdt_number = 0x%x", 2340 ncookies, ahci_dma_prdt_number); 2341 2342 ASSERT(ncookies <= ahci_dma_prdt_number); 2343 ahci_portp->ahciport_prd_bytecounts[cmd_slot] = 0; 2344 2345 /* *** now fill the scatter gather list ******* */ 2346 for (i = 0; i < ncookies; i++) { 2347 cmd_table->ahcict_prdt[i].ahcipi_data_base_addr = 2348 scmd->satacmd_dma_cookie_list[i]._dmu._dmac_la[0]; 2349 cmd_table->ahcict_prdt[i].ahcipi_data_base_addr_upper = 2350 scmd->satacmd_dma_cookie_list[i]._dmu._dmac_la[1]; 2351 cmd_table->ahcict_prdt[i].ahcipi_descr_info = 2352 scmd->satacmd_dma_cookie_list[i].dmac_size - 1; 2353 ahci_portp->ahciport_prd_bytecounts[cmd_slot] += 2354 scmd->satacmd_dma_cookie_list[i].dmac_size; 2355 } 2356 2357 AHCIDBG(AHCIDBG_PRDT, ahci_ctlp, 2358 "ahciport_prd_bytecounts 0x%x for cmd_slot 0x%x", 2359 ahci_portp->ahciport_prd_bytecounts[cmd_slot], cmd_slot); 2360 2361 /* The ACMD field is filled in for ATAPI command */ 2362 if (scmd->satacmd_cmd_reg == SATAC_PACKET) { 2363 bcopy(scmd->satacmd_acdb, cmd_table->ahcict_atapi_cmd, 2364 SATA_ATAPI_MAX_CDB_LEN); 2365 } 2366 2367 /* Set Command Header in Command List */ 2368 cmd_header = &ahci_portp->ahciport_cmd_list[cmd_slot]; 2369 BZERO_DESCR_INFO(cmd_header); 2370 BZERO_PRD_BYTE_COUNT(cmd_header); 2371 2372 /* Set the number of entries in the PRD table */ 2373 SET_PRD_TABLE_LENGTH(cmd_header, ncookies); 2374 2375 /* Set the length of the command in the CFIS area */ 2376 SET_COMMAND_FIS_LENGTH(cmd_header, AHCI_H2D_REGISTER_FIS_LENGTH); 2377 2378 /* 2379 * PMP field only make sense when target is a port multiplier or a 2380 * device behind a port multiplier. Otherwise should set it to 0. 2381 */ 2382 if (AHCI_ADDR_IS_PMULT(addrp) || AHCI_ADDR_IS_PMPORT(addrp)) 2383 SET_PORT_MULTI_PORT(cmd_header, pmport); 2384 2385 AHCIDBG(AHCIDBG_INFO, ahci_ctlp, "command data direction is " 2386 "sata_data_direction = 0x%x", 2387 scmd->satacmd_flags.sata_data_direction); 2388 2389 /* Set A bit if it is an ATAPI command */ 2390 if (scmd->satacmd_cmd_reg == SATAC_PACKET) 2391 SET_ATAPI(cmd_header, AHCI_CMDHEAD_ATAPI); 2392 2393 /* Set W bit if data is going to the device */ 2394 if (scmd->satacmd_flags.sata_data_direction == SATA_DIR_WRITE) 2395 SET_WRITE(cmd_header, AHCI_CMDHEAD_DATA_WRITE); 2396 2397 /* 2398 * Set the prefetchable bit - this bit is only valid if the PRDTL 2399 * field is non-zero or the ATAPI 'A' bit is set in the command 2400 * header. This bit cannot be set when using native command 2401 * queuing commands or when using FIS-based switching with a Port 2402 * multiplier. 2403 */ 2404 if (command_type != AHCI_NCQ_CMD) 2405 SET_PREFETCHABLE(cmd_header, AHCI_CMDHEAD_PREFETCHABLE); 2406 2407 /* 2408 * Now remember the sata packet in ahciport_slot_pkts[]. 2409 * Error retrieval command and r/w port multiplier command will 2410 * be stored specifically for each port. 2411 */ 2412 if (!ERR_RETRI_CMD_IN_PROGRESS(ahci_portp) && 2413 !RDWR_PMULT_CMD_IN_PROGRESS(ahci_portp)) 2414 ahci_portp->ahciport_slot_pkts[cmd_slot] = spkt; 2415 2416 /* 2417 * Keep the timeout value 2418 */ 2419 ahci_portp->ahciport_slot_timeout[cmd_slot] = spkt->satapkt_time; 2420 2421 /* 2422 * If the intial timout is less than 1 tick, then make it longer by 2423 * 1 tick to avoid immediate timeout 2424 */ 2425 if (ahci_portp->ahciport_slot_timeout[cmd_slot] <= 2426 ahci_watchdog_timeout) 2427 ahci_portp->ahciport_slot_timeout[cmd_slot] += 2428 ahci_watchdog_timeout; 2429 2430 #if AHCI_DEBUG 2431 if (ahci_debug_flags & AHCIDBG_ATACMD && 2432 scmd->satacmd_cmd_reg != SATAC_PACKET || 2433 ahci_debug_flags & AHCIDBG_ATAPICMD && 2434 scmd->satacmd_cmd_reg == SATAC_PACKET) { 2435 2436 /* Dump the command header and table */ 2437 ahci_log(ahci_ctlp, CE_WARN, "\n"); 2438 ahci_log(ahci_ctlp, CE_WARN, "Command header&table for spkt " 2439 "0x%p cmd_reg 0x%x port %d", spkt, 2440 scmd->satacmd_cmd_reg, port); 2441 ptr = (uint32_t *)cmd_header; 2442 ahci_log(ahci_ctlp, CE_WARN, 2443 " Command Header:%8x %8x %8x %8x", 2444 ptr[0], ptr[1], ptr[2], ptr[3]); 2445 2446 /* Dump the H2D register FIS */ 2447 ptr = (uint32_t *)h2d_register_fisp; 2448 ahci_log(ahci_ctlp, CE_WARN, 2449 " Command FIS: %8x %8x %8x %8x", 2450 ptr[0], ptr[1], ptr[2], ptr[3]); 2451 2452 /* Dump the ACMD register FIS */ 2453 ptr2 = (uint8_t *)&(cmd_table->ahcict_atapi_cmd); 2454 for (i = 0; i < SATA_ATAPI_MAX_CDB_LEN/8; i++) 2455 if (ahci_debug_flags & AHCIDBG_ATAPICMD) 2456 ahci_log(ahci_ctlp, CE_WARN, 2457 " ATAPI command: %2x %2x %2x %2x " 2458 "%2x %2x %2x %2x", 2459 ptr2[8 * i], ptr2[8 * i + 1], 2460 ptr2[8 * i + 2], ptr2[8 * i + 3], 2461 ptr2[8 * i + 4], ptr2[8 * i + 5], 2462 ptr2[8 * i + 6], ptr2[8 * i + 7]); 2463 2464 /* Dump the PRDT */ 2465 for (i = 0; i < ncookies; i++) { 2466 ptr = (uint32_t *)&(cmd_table->ahcict_prdt[i]); 2467 ahci_log(ahci_ctlp, CE_WARN, 2468 " Cookie %d: %8x %8x %8x %8x", 2469 i, ptr[0], ptr[1], ptr[2], ptr[3]); 2470 } 2471 } 2472 #endif 2473 2474 (void) ddi_dma_sync( 2475 ahci_portp->ahciport_cmd_tables_dma_handle[cmd_slot], 2476 0, 2477 ahci_cmd_table_size, 2478 DDI_DMA_SYNC_FORDEV); 2479 2480 (void) ddi_dma_sync(ahci_portp->ahciport_cmd_list_dma_handle, 2481 cmd_slot * sizeof (ahci_cmd_header_t), 2482 sizeof (ahci_cmd_header_t), 2483 DDI_DMA_SYNC_FORDEV); 2484 2485 if ((ahci_check_dma_handle(ahci_portp-> 2486 ahciport_cmd_tables_dma_handle[cmd_slot]) != DDI_FM_OK) || 2487 ahci_check_dma_handle(ahci_portp-> 2488 ahciport_cmd_list_dma_handle) != DDI_FM_OK) { 2489 ddi_fm_service_impact(ahci_ctlp->ahcictl_dip, 2490 DDI_SERVICE_UNAFFECTED); 2491 return (AHCI_FAILURE); 2492 } 2493 2494 /* Set the corresponding bit in the PxSACT.DS for queued command */ 2495 if (command_type == AHCI_NCQ_CMD) { 2496 ddi_put32(ahci_ctlp->ahcictl_ahci_acc_handle, 2497 (uint32_t *)AHCI_PORT_PxSACT(ahci_ctlp, port), 2498 (0x1 << cmd_slot)); 2499 } 2500 2501 /* Indicate to the HBA that a command is active. */ 2502 ddi_put32(ahci_ctlp->ahcictl_ahci_acc_handle, 2503 (uint32_t *)AHCI_PORT_PxCI(ahci_ctlp, port), 2504 (0x1 << cmd_slot)); 2505 2506 AHCIDBG(AHCIDBG_INFO, ahci_ctlp, "ahci_deliver_satapkt " 2507 "exit: port %d", port); 2508 2509 /* Make sure the command is started by the PxSACT/PxCI */ 2510 if (ahci_check_acc_handle(ahci_ctlp-> 2511 ahcictl_ahci_acc_handle) != DDI_FM_OK) { 2512 ddi_fm_service_impact(ahci_ctlp->ahcictl_dip, 2513 DDI_SERVICE_UNAFFECTED); 2514 return (AHCI_FAILURE); 2515 } 2516 2517 return (cmd_slot); 2518 } 2519 2520 /* 2521 * Called by the sata framework to abort the previously sent packet(s). 2522 * 2523 * Reset device to abort commands. 2524 */ 2525 static int 2526 ahci_tran_abort(dev_info_t *dip, sata_pkt_t *spkt, int flag) 2527 { 2528 ahci_ctl_t *ahci_ctlp; 2529 ahci_port_t *ahci_portp; 2530 uint32_t slot_status = 0; 2531 uint32_t aborted_tags = 0; 2532 uint32_t finished_tags = 0; 2533 uint8_t cport = spkt->satapkt_device.satadev_addr.cport; 2534 uint8_t port; 2535 int tmp_slot; 2536 int instance = ddi_get_instance(dip); 2537 2538 ahci_ctlp = ddi_get_soft_state(ahci_statep, instance); 2539 port = ahci_ctlp->ahcictl_cport_to_port[cport]; 2540 2541 AHCIDBG(AHCIDBG_ENTRY, ahci_ctlp, 2542 "ahci_tran_abort enter: port %d", port); 2543 2544 ahci_portp = ahci_ctlp->ahcictl_ports[port]; 2545 mutex_enter(&ahci_portp->ahciport_mutex); 2546 2547 /* 2548 * If AHCI_PORT_FLAG_MOPPING flag is set, it means all the pending 2549 * commands are being mopped, therefore there is nothing else to do 2550 */ 2551 if (ahci_portp->ahciport_flags & AHCI_PORT_FLAG_MOPPING) { 2552 AHCIDBG(AHCIDBG_INFO, ahci_ctlp, 2553 "ahci_tran_abort: port %d is in " 2554 "mopping process, so just return directly ", port); 2555 mutex_exit(&ahci_portp->ahciport_mutex); 2556 return (SATA_SUCCESS); 2557 } 2558 2559 /* 2560 * If AHCI_PORT_FLAG_RDWR_PMULT flag is set, it means a R/W PMULT 2561 * command is being executed so no other commands is outstanding, 2562 * nothing to do. 2563 */ 2564 if (ahci_portp->ahciport_flags & AHCI_PORT_FLAG_RDWR_PMULT) { 2565 AHCIDBG(AHCIDBG_INFO, ahci_ctlp, 2566 "ahci_tran_abort: port %d is reading/writing " 2567 "port multiplier, so just return directly ", port); 2568 mutex_exit(&ahci_portp->ahciport_mutex); 2569 return (SATA_SUCCESS); 2570 } 2571 2572 if (ahci_portp->ahciport_port_state & SATA_PSTATE_FAILED | 2573 ahci_portp->ahciport_port_state & SATA_PSTATE_SHUTDOWN | 2574 ahci_portp->ahciport_port_state & SATA_PSTATE_PWROFF) { 2575 /* 2576 * In case the targer driver would send the request before 2577 * sata framework can have the opportunity to process those 2578 * event reports. 2579 */ 2580 spkt->satapkt_reason = SATA_PKT_PORT_ERROR; 2581 spkt->satapkt_device.satadev_state = 2582 ahci_portp->ahciport_port_state; 2583 ahci_update_sata_registers(ahci_ctlp, port, 2584 &spkt->satapkt_device); 2585 AHCIDBG(AHCIDBG_ERRS, ahci_ctlp, 2586 "ahci_tran_abort returning SATA_FAILURE while " 2587 "port in FAILED/SHUTDOWN/PWROFF state: " 2588 "port: %d", port); 2589 mutex_exit(&ahci_portp->ahciport_mutex); 2590 return (SATA_FAILURE); 2591 } 2592 2593 if (ahci_portp->ahciport_device_type == SATA_DTYPE_NONE) { 2594 /* 2595 * ahci_intr_phyrdy_change() may have rendered it to 2596 * AHCI_PORT_TYPE_NODEV. 2597 */ 2598 spkt->satapkt_reason = SATA_PKT_PORT_ERROR; 2599 spkt->satapkt_device.satadev_type = SATA_DTYPE_NONE; 2600 spkt->satapkt_device.satadev_state = 2601 ahci_portp->ahciport_port_state; 2602 ahci_update_sata_registers(ahci_ctlp, port, 2603 &spkt->satapkt_device); 2604 AHCIDBG(AHCIDBG_ERRS, ahci_ctlp, 2605 "ahci_tran_abort returning SATA_FAILURE while " 2606 "no device attached: port: %d", port); 2607 mutex_exit(&ahci_portp->ahciport_mutex); 2608 return (SATA_FAILURE); 2609 } 2610 2611 if (flag == SATA_ABORT_ALL_PACKETS) { 2612 if (NON_NCQ_CMD_IN_PROGRESS(ahci_portp)) 2613 aborted_tags = ahci_portp->ahciport_pending_tags; 2614 else if (NCQ_CMD_IN_PROGRESS(ahci_portp)) 2615 aborted_tags = ahci_portp->ahciport_pending_ncq_tags; 2616 2617 cmn_err(CE_NOTE, "!ahci%d: ahci port %d abort all packets", 2618 instance, port); 2619 } else { 2620 aborted_tags = 0xffffffff; 2621 /* 2622 * Aborting one specific packet, first search the 2623 * ahciport_slot_pkts[] list for matching spkt. 2624 */ 2625 for (tmp_slot = 0; 2626 tmp_slot < ahci_ctlp->ahcictl_num_cmd_slots; tmp_slot++) { 2627 if (ahci_portp->ahciport_slot_pkts[tmp_slot] == spkt) { 2628 aborted_tags = (0x1 << tmp_slot); 2629 break; 2630 } 2631 } 2632 2633 if (aborted_tags == 0xffffffff) { 2634 /* request packet is not on the pending list */ 2635 AHCIDBG(AHCIDBG_INFO, ahci_ctlp, 2636 "Cannot find the aborting pkt 0x%p on the " 2637 "pending list", (void *)spkt); 2638 ahci_update_sata_registers(ahci_ctlp, port, 2639 &spkt->satapkt_device); 2640 mutex_exit(&ahci_portp->ahciport_mutex); 2641 return (SATA_FAILURE); 2642 } 2643 cmn_err(CE_NOTE, "!ahci%d: ahci port %d abort satapkt 0x%p", 2644 instance, port, (void *)spkt); 2645 } 2646 2647 if (NON_NCQ_CMD_IN_PROGRESS(ahci_portp)) 2648 slot_status = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 2649 (uint32_t *)AHCI_PORT_PxCI(ahci_ctlp, port)); 2650 else if (NCQ_CMD_IN_PROGRESS(ahci_portp)) 2651 slot_status = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 2652 (uint32_t *)AHCI_PORT_PxSACT(ahci_ctlp, port)); 2653 2654 ahci_portp->ahciport_flags |= AHCI_PORT_FLAG_MOPPING; 2655 ahci_portp->ahciport_mop_in_progress++; 2656 2657 /* 2658 * To abort the packet(s), first we are trying to clear PxCMD.ST 2659 * to stop the port, and if the port can be stopped 2660 * successfully with PxTFD.STS.BSY and PxTFD.STS.DRQ cleared to '0', 2661 * then we just send back the aborted packet(s) with ABORTED flag 2662 * and then restart the port by setting PxCMD.ST and PxCMD.FRE. 2663 * If PxTFD.STS.BSY or PxTFD.STS.DRQ is set to '1', then we 2664 * perform a COMRESET. 2665 */ 2666 (void) ahci_restart_port_wait_till_ready(ahci_ctlp, 2667 ahci_portp, port, NULL, NULL); 2668 2669 /* 2670 * Compute which have finished and which need to be retried. 2671 * 2672 * The finished tags are ahciport_pending_tags/ahciport_pending_ncq_tags 2673 * minus the slot_status. The aborted_tags has to be deducted by 2674 * finished_tags since we can't possibly abort a tag which had finished 2675 * already. 2676 */ 2677 if (NON_NCQ_CMD_IN_PROGRESS(ahci_portp)) 2678 finished_tags = ahci_portp->ahciport_pending_tags & 2679 ~slot_status & AHCI_SLOT_MASK(ahci_ctlp); 2680 else if (NCQ_CMD_IN_PROGRESS(ahci_portp)) 2681 finished_tags = ahci_portp->ahciport_pending_ncq_tags & 2682 ~slot_status & AHCI_NCQ_SLOT_MASK(ahci_portp); 2683 2684 aborted_tags &= ~finished_tags; 2685 2686 ahci_mop_commands(ahci_ctlp, 2687 ahci_portp, 2688 slot_status, 2689 0, /* failed tags */ 2690 0, /* timeout tags */ 2691 aborted_tags, 2692 0); /* reset tags */ 2693 2694 ahci_update_sata_registers(ahci_ctlp, port, &spkt->satapkt_device); 2695 mutex_exit(&ahci_portp->ahciport_mutex); 2696 2697 return (SATA_SUCCESS); 2698 } 2699 2700 /* 2701 * Used to do device reset and reject all the pending packets on a device 2702 * during the reset operation. 2703 * 2704 * NOTE: ONLY called by ahci_tran_reset_dport 2705 */ 2706 static int 2707 ahci_reset_device_reject_pkts(ahci_ctl_t *ahci_ctlp, 2708 ahci_port_t *ahci_portp, ahci_addr_t *addrp) 2709 { 2710 uint32_t slot_status = 0; 2711 uint32_t reset_tags = 0; 2712 uint32_t finished_tags = 0; 2713 uint8_t port = addrp->aa_port; 2714 sata_device_t sdevice; 2715 int ret; 2716 2717 ASSERT(MUTEX_HELD(&ahci_portp->ahciport_mutex)); 2718 2719 AHCIDBG(AHCIDBG_ENTRY, ahci_ctlp, 2720 "ahci_reset_device_reject_pkts on port: %d", port); 2721 2722 /* 2723 * If AHCI_PORT_FLAG_MOPPING flag is set, it means all the pending 2724 * commands are being mopped, therefore there is nothing else to do 2725 */ 2726 if (ahci_portp->ahciport_flags & AHCI_PORT_FLAG_MOPPING) { 2727 AHCIDBG(AHCIDBG_ERRS, ahci_ctlp, 2728 "ahci_reset_device_reject_pkts: port %d is in " 2729 "mopping process, so return directly ", port); 2730 return (SATA_SUCCESS); 2731 } 2732 2733 if (NON_NCQ_CMD_IN_PROGRESS(ahci_portp)) { 2734 slot_status = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 2735 (uint32_t *)AHCI_PORT_PxCI(ahci_ctlp, port)); 2736 reset_tags = slot_status & AHCI_SLOT_MASK(ahci_ctlp); 2737 } else if (NCQ_CMD_IN_PROGRESS(ahci_portp)) { 2738 slot_status = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 2739 (uint32_t *)AHCI_PORT_PxSACT(ahci_ctlp, port)); 2740 reset_tags = slot_status & AHCI_NCQ_SLOT_MASK(ahci_portp); 2741 } 2742 2743 if (ahci_software_reset(ahci_ctlp, ahci_portp, addrp) 2744 != AHCI_SUCCESS) { 2745 AHCIDBG(AHCIDBG_ERRS, ahci_ctlp, 2746 "Try to do a port reset after software " 2747 "reset failed", port); 2748 ret = ahci_port_reset(ahci_ctlp, ahci_portp, addrp); 2749 if (ret != AHCI_SUCCESS) { 2750 AHCIDBG(AHCIDBG_ERRS, ahci_ctlp, 2751 "ahci_reset_device_reject_pkts: port %d " 2752 "failed", port); 2753 return (SATA_FAILURE); 2754 } 2755 } 2756 /* Set the reset in progress flag */ 2757 ahci_portp->ahciport_reset_in_progress = 1; 2758 2759 ahci_portp->ahciport_flags |= AHCI_PORT_FLAG_MOPPING; 2760 ahci_portp->ahciport_mop_in_progress++; 2761 2762 /* Indicate to the framework that a reset has happened */ 2763 bzero((void *)&sdevice, sizeof (sata_device_t)); 2764 sdevice.satadev_addr.cport = ahci_ctlp->ahcictl_port_to_cport[port]; 2765 sdevice.satadev_addr.pmport = 0; 2766 sdevice.satadev_addr.qual = SATA_ADDR_DCPORT; 2767 sdevice.satadev_state = SATA_DSTATE_RESET | 2768 SATA_DSTATE_PWR_ACTIVE; 2769 mutex_exit(&ahci_portp->ahciport_mutex); 2770 sata_hba_event_notify( 2771 ahci_ctlp->ahcictl_sata_hba_tran->sata_tran_hba_dip, 2772 &sdevice, 2773 SATA_EVNT_DEVICE_RESET); 2774 mutex_enter(&ahci_portp->ahciport_mutex); 2775 2776 AHCIDBG(AHCIDBG_EVENT, ahci_ctlp, 2777 "port %d sending event up: SATA_EVNT_DEVICE_RESET", port); 2778 2779 /* Next try to mop the pending commands */ 2780 if (NON_NCQ_CMD_IN_PROGRESS(ahci_portp)) 2781 finished_tags = ahci_portp->ahciport_pending_tags & 2782 ~slot_status & AHCI_SLOT_MASK(ahci_ctlp); 2783 else if (NCQ_CMD_IN_PROGRESS(ahci_portp)) 2784 finished_tags = ahci_portp->ahciport_pending_ncq_tags & 2785 ~slot_status & AHCI_NCQ_SLOT_MASK(ahci_portp); 2786 2787 reset_tags &= ~finished_tags; 2788 2789 ahci_mop_commands(ahci_ctlp, 2790 ahci_portp, 2791 slot_status, 2792 0, /* failed tags */ 2793 0, /* timeout tags */ 2794 0, /* aborted tags */ 2795 reset_tags); /* reset tags */ 2796 2797 return (SATA_SUCCESS); 2798 } 2799 2800 /* 2801 * Used to do device reset and reject all the pending packets on a device 2802 * during the reset operation. 2803 * 2804 * NOTE: ONLY called by ahci_tran_reset_dport 2805 */ 2806 static int 2807 ahci_reset_pmdevice_reject_pkts(ahci_ctl_t *ahci_ctlp, 2808 ahci_port_t *ahci_portp, ahci_addr_t *addrp) 2809 { 2810 uint32_t finished_tags = 0, reset_tags = 0, slot_status = 0; 2811 uint8_t port = addrp->aa_port; 2812 uint8_t pmport = addrp->aa_pmport; 2813 sata_device_t sdevice; 2814 2815 ASSERT(MUTEX_HELD(&ahci_portp->ahciport_mutex)); 2816 2817 AHCIDBG(AHCIDBG_ENTRY|AHCIDBG_PMULT, ahci_ctlp, 2818 "ahci_reset_pmdevice_reject_pkts at port %d:%d", port, pmport); 2819 2820 if (ahci_portp->ahciport_flags & AHCI_PORT_FLAG_MOPPING) { 2821 AHCIDBG(AHCIDBG_ERRS, ahci_ctlp, 2822 "ahci_reset_pmdevice_reject_pkts: port %d is in " 2823 "mopping process, so return directly ", port); 2824 return (SATA_SUCCESS); 2825 } 2826 2827 /* Checking for outstanding commands */ 2828 if (NON_NCQ_CMD_IN_PROGRESS(ahci_portp)) { 2829 slot_status = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 2830 (uint32_t *)AHCI_PORT_PxCI(ahci_ctlp, port)); 2831 reset_tags = slot_status & AHCI_SLOT_MASK(ahci_ctlp); 2832 } else if (NCQ_CMD_IN_PROGRESS(ahci_portp)) { 2833 slot_status = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 2834 (uint32_t *)AHCI_PORT_PxSACT(ahci_ctlp, port)); 2835 reset_tags = slot_status & AHCI_NCQ_SLOT_MASK(ahci_portp); 2836 } 2837 2838 /* Issue SOFTWARE reset command. */ 2839 if (ahci_software_reset(ahci_ctlp, ahci_portp, addrp) 2840 != AHCI_SUCCESS) { 2841 AHCIDBG(AHCIDBG_ERRS, ahci_ctlp, 2842 "Try to do a port reset after software " 2843 "reset failed", port); 2844 return (SATA_FAILURE); 2845 } 2846 2847 /* Set the reset in progress flag */ 2848 ahci_portp->ahciport_reset_in_progress = 1; 2849 2850 ahci_portp->ahciport_flags |= AHCI_PORT_FLAG_MOPPING; 2851 ahci_portp->ahciport_mop_in_progress++; 2852 2853 /* Indicate to the framework that a reset has happened */ 2854 bzero((void *)&sdevice, sizeof (sata_device_t)); 2855 sdevice.satadev_addr.cport = ahci_ctlp->ahcictl_port_to_cport[port]; 2856 sdevice.satadev_addr.pmport = pmport; 2857 if (AHCI_ADDR_IS_PMULT(addrp)) 2858 sdevice.satadev_addr.qual = SATA_ADDR_PMULT; 2859 else 2860 sdevice.satadev_addr.qual = SATA_ADDR_DPMPORT; 2861 sdevice.satadev_state = SATA_DSTATE_RESET | 2862 SATA_DSTATE_PWR_ACTIVE; 2863 mutex_exit(&ahci_portp->ahciport_mutex); 2864 sata_hba_event_notify( 2865 ahci_ctlp->ahcictl_sata_hba_tran->sata_tran_hba_dip, 2866 &sdevice, 2867 SATA_EVNT_DEVICE_RESET); 2868 mutex_enter(&ahci_portp->ahciport_mutex); 2869 2870 AHCIDBG(AHCIDBG_EVENT, ahci_ctlp, 2871 "port %d:%d sending event up: SATA_EVNT_DEVICE_RESET", 2872 port, pmport); 2873 2874 /* Next try to mop the pending commands */ 2875 if (NON_NCQ_CMD_IN_PROGRESS(ahci_portp)) 2876 finished_tags = ahci_portp->ahciport_pending_tags & 2877 ~slot_status & AHCI_SLOT_MASK(ahci_ctlp); 2878 else if (NCQ_CMD_IN_PROGRESS(ahci_portp)) 2879 finished_tags = ahci_portp->ahciport_pending_ncq_tags & 2880 ~slot_status & AHCI_NCQ_SLOT_MASK(ahci_portp); 2881 reset_tags &= ~finished_tags; 2882 2883 AHCIDBG(AHCIDBG_EVENT|AHCIDBG_PMULT, ahci_ctlp, 2884 "reset_tags = %x, finished_tags = %x, slot_status = %x", 2885 reset_tags, finished_tags, slot_status); 2886 2887 /* 2888 * NOTE: Because PxCI be only erased by unset PxCMD.ST bit, so even we 2889 * try to reset a single device behind a port multiplier will 2890 * terminate all the commands on that HBA port. We need mop these 2891 * commands as well. 2892 */ 2893 ahci_mop_commands(ahci_ctlp, 2894 ahci_portp, 2895 slot_status, 2896 0, /* failed tags */ 2897 0, /* timeout tags */ 2898 0, /* aborted tags */ 2899 reset_tags); /* reset tags */ 2900 2901 return (SATA_SUCCESS); 2902 } 2903 2904 /* 2905 * Used to do port reset and reject all the pending packets on a port during 2906 * the reset operation. 2907 */ 2908 static int 2909 ahci_reset_port_reject_pkts(ahci_ctl_t *ahci_ctlp, 2910 ahci_port_t *ahci_portp, ahci_addr_t *addrp) 2911 { 2912 uint32_t slot_status = 0; 2913 uint32_t reset_tags = 0; 2914 uint32_t finished_tags = 0; 2915 uint8_t port = addrp->aa_port; 2916 2917 ASSERT(MUTEX_HELD(&ahci_portp->ahciport_mutex)); 2918 2919 AHCIDBG(AHCIDBG_ENTRY, ahci_ctlp, 2920 "ahci_reset_port_reject_pkts at port: %d", port); 2921 2922 /* 2923 * If AHCI_PORT_FLAG_MOPPING flag is set, it means all the pending 2924 * commands are being mopped, therefore there is nothing else to do 2925 */ 2926 if (ahci_portp->ahciport_flags & AHCI_PORT_FLAG_MOPPING) { 2927 AHCIDBG(AHCIDBG_ERRS, ahci_ctlp, 2928 "ahci_reset_port_reject_pkts: port %d is in " 2929 "mopping process, so return directly ", port); 2930 return (SATA_SUCCESS); 2931 } 2932 2933 ahci_portp->ahciport_flags |= AHCI_PORT_FLAG_MOPPING; 2934 ahci_portp->ahciport_mop_in_progress++; 2935 2936 if (NON_NCQ_CMD_IN_PROGRESS(ahci_portp)) { 2937 slot_status = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 2938 (uint32_t *)AHCI_PORT_PxCI(ahci_ctlp, port)); 2939 reset_tags = slot_status & AHCI_SLOT_MASK(ahci_ctlp); 2940 } else if (NCQ_CMD_IN_PROGRESS(ahci_portp)) { 2941 slot_status = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 2942 (uint32_t *)AHCI_PORT_PxSACT(ahci_ctlp, port)); 2943 reset_tags = slot_status & AHCI_NCQ_SLOT_MASK(ahci_portp); 2944 } 2945 2946 if (ahci_restart_port_wait_till_ready(ahci_ctlp, 2947 ahci_portp, port, AHCI_PORT_RESET|AHCI_RESET_NO_EVENTS_UP, 2948 NULL) != AHCI_SUCCESS) { 2949 2950 /* Clear mop flag */ 2951 ahci_portp->ahciport_mop_in_progress--; 2952 if (ahci_portp->ahciport_mop_in_progress == 0) 2953 ahci_portp->ahciport_flags &= 2954 ~AHCI_PORT_FLAG_MOPPING; 2955 return (SATA_FAILURE); 2956 } 2957 2958 if (NON_NCQ_CMD_IN_PROGRESS(ahci_portp)) 2959 finished_tags = ahci_portp->ahciport_pending_tags & 2960 ~slot_status & AHCI_SLOT_MASK(ahci_ctlp); 2961 else if (NCQ_CMD_IN_PROGRESS(ahci_portp)) 2962 finished_tags = ahci_portp->ahciport_pending_ncq_tags & 2963 ~slot_status & AHCI_NCQ_SLOT_MASK(ahci_portp); 2964 2965 reset_tags &= ~finished_tags; 2966 2967 ahci_mop_commands(ahci_ctlp, 2968 ahci_portp, 2969 slot_status, 2970 0, /* failed tags */ 2971 0, /* timeout tags */ 2972 0, /* aborted tags */ 2973 reset_tags); /* reset tags */ 2974 2975 return (SATA_SUCCESS); 2976 } 2977 2978 /* 2979 * Used to do hba reset and reject all the pending packets on all ports 2980 * during the reset operation. 2981 */ 2982 static int 2983 ahci_reset_hba_reject_pkts(ahci_ctl_t *ahci_ctlp) 2984 { 2985 ahci_port_t *ahci_portp; 2986 uint32_t slot_status[AHCI_MAX_PORTS]; 2987 uint32_t reset_tags[AHCI_MAX_PORTS]; 2988 uint32_t finished_tags[AHCI_MAX_PORTS]; 2989 int port; 2990 int ret = SATA_SUCCESS; 2991 2992 AHCIDBG(AHCIDBG_ENTRY, ahci_ctlp, 2993 "ahci_reset_hba_reject_pkts enter", NULL); 2994 2995 bzero(slot_status, sizeof (slot_status)); 2996 bzero(reset_tags, sizeof (reset_tags)); 2997 bzero(finished_tags, sizeof (finished_tags)); 2998 2999 for (port = 0; port < ahci_ctlp->ahcictl_num_ports; port++) { 3000 if (!AHCI_PORT_IMPLEMENTED(ahci_ctlp, port)) { 3001 continue; 3002 } 3003 3004 ahci_portp = ahci_ctlp->ahcictl_ports[port]; 3005 3006 mutex_enter(&ahci_portp->ahciport_mutex); 3007 ahci_portp->ahciport_reset_in_progress = 1; 3008 if (NON_NCQ_CMD_IN_PROGRESS(ahci_portp)) { 3009 slot_status[port] = ddi_get32( 3010 ahci_ctlp->ahcictl_ahci_acc_handle, 3011 (uint32_t *)AHCI_PORT_PxCI(ahci_ctlp, port)); 3012 reset_tags[port] = slot_status[port] & 3013 AHCI_SLOT_MASK(ahci_ctlp); 3014 AHCIDBG(AHCIDBG_INIT, ahci_ctlp, 3015 "port %d: reset_tags = 0x%x pending_tags = 0x%x", 3016 port, reset_tags[port], 3017 ahci_portp->ahciport_pending_tags); 3018 } else if (NCQ_CMD_IN_PROGRESS(ahci_portp)) { 3019 slot_status[port] = ddi_get32( 3020 ahci_ctlp->ahcictl_ahci_acc_handle, 3021 (uint32_t *)AHCI_PORT_PxSACT(ahci_ctlp, port)); 3022 reset_tags[port] = slot_status[port] & 3023 AHCI_NCQ_SLOT_MASK(ahci_portp); 3024 AHCIDBG(AHCIDBG_INIT, ahci_ctlp, 3025 "port %d: reset_tags = 0x%x pending_tags = 0x%x", 3026 port, reset_tags[port], 3027 ahci_portp->ahciport_pending_tags); 3028 } 3029 mutex_exit(&ahci_portp->ahciport_mutex); 3030 } 3031 3032 if (ahci_hba_reset(ahci_ctlp) != AHCI_SUCCESS) { 3033 ret = SATA_FAILURE; 3034 } 3035 3036 for (port = 0; port < ahci_ctlp->ahcictl_num_ports; port++) { 3037 if (!AHCI_PORT_IMPLEMENTED(ahci_ctlp, port)) { 3038 continue; 3039 } 3040 3041 ahci_portp = ahci_ctlp->ahcictl_ports[port]; 3042 3043 mutex_enter(&ahci_portp->ahciport_mutex); 3044 /* 3045 * To prevent recursive enter to ahci_mop_commands, we need 3046 * check AHCI_PORT_FLAG_MOPPING flag. 3047 */ 3048 if (ahci_portp->ahciport_flags & AHCI_PORT_FLAG_MOPPING) { 3049 AHCIDBG(AHCIDBG_ERRS, ahci_ctlp, 3050 "ahci_reset_hba_reject_pkts: port %d is in " 3051 "mopping process, so return directly ", port); 3052 mutex_exit(&ahci_portp->ahciport_mutex); 3053 continue; 3054 } 3055 3056 ahci_portp->ahciport_flags |= AHCI_PORT_FLAG_MOPPING; 3057 ahci_portp->ahciport_mop_in_progress++; 3058 3059 if (NON_NCQ_CMD_IN_PROGRESS(ahci_portp)) 3060 finished_tags[port] = 3061 ahci_portp->ahciport_pending_tags & 3062 ~slot_status[port] & AHCI_SLOT_MASK(ahci_ctlp); 3063 else if (NCQ_CMD_IN_PROGRESS(ahci_portp)) 3064 finished_tags[port] = 3065 ahci_portp->ahciport_pending_ncq_tags & 3066 ~slot_status[port] & AHCI_NCQ_SLOT_MASK(ahci_portp); 3067 3068 reset_tags[port] &= ~finished_tags[port]; 3069 3070 ahci_mop_commands(ahci_ctlp, 3071 ahci_portp, 3072 slot_status[port], 3073 0, /* failed tags */ 3074 0, /* timeout tags */ 3075 0, /* aborted tags */ 3076 reset_tags[port]); /* reset tags */ 3077 mutex_exit(&ahci_portp->ahciport_mutex); 3078 } 3079 out: 3080 return (ret); 3081 } 3082 3083 /* 3084 * Called by sata framework to reset a port(s) or device. 3085 */ 3086 static int 3087 ahci_tran_reset_dport(dev_info_t *dip, sata_device_t *sd) 3088 { 3089 ahci_ctl_t *ahci_ctlp; 3090 ahci_port_t *ahci_portp; 3091 ahci_addr_t addr; 3092 uint8_t cport = sd->satadev_addr.cport; 3093 uint8_t pmport = sd->satadev_addr.pmport; 3094 uint8_t port; 3095 int ret = SATA_SUCCESS; 3096 int instance = ddi_get_instance(dip); 3097 3098 ahci_ctlp = ddi_get_soft_state(ahci_statep, instance); 3099 port = ahci_ctlp->ahcictl_cport_to_port[cport]; 3100 ahci_portp = ahci_ctlp->ahcictl_ports[port]; 3101 3102 ahci_get_ahci_addr(ahci_ctlp, sd, &addr); 3103 3104 AHCIDBG(AHCIDBG_ENTRY, ahci_ctlp, 3105 "ahci_tran_reset_dport enter: cport %d", cport); 3106 3107 switch (sd->satadev_addr.qual) { 3108 case SATA_ADDR_PMPORT: 3109 /* 3110 * If we want to issue a COMRESET on a pmport, we need to 3111 * reject the outstanding commands on that pmport. According 3112 * to AHCI spec, PxCI register could only be cleared by 3113 * clearing PxCMD.ST, which will halt the controller port - as 3114 * well as other pmports. 3115 * 3116 * Therefore we directly reset the controller port for 3117 * simplicity. ahci_tran_probe_port() will handle reset stuff 3118 * like initializing the given pmport. 3119 */ 3120 /* FALLTHRU */ 3121 case SATA_ADDR_CPORT: 3122 /* Port reset */ 3123 ahci_portp = ahci_ctlp->ahcictl_ports[port]; 3124 cmn_err(CE_NOTE, "!ahci%d: ahci_tran_reset_dport " 3125 "port %d reset port", instance, port); 3126 3127 mutex_enter(&ahci_portp->ahciport_mutex); 3128 ret = ahci_reset_port_reject_pkts(ahci_ctlp, ahci_portp, &addr); 3129 mutex_exit(&ahci_portp->ahciport_mutex); 3130 3131 break; 3132 3133 case SATA_ADDR_DPMPORT: 3134 cmn_err(CE_NOTE, "!ahci%d: ahci_tran_reset_dport " 3135 "port %d:%d reset device", instance, port, pmport); 3136 /* FALLTHRU */ 3137 case SATA_ADDR_DCPORT: 3138 /* Device reset */ 3139 if (sd->satadev_addr.qual == SATA_ADDR_DCPORT) 3140 cmn_err(CE_NOTE, "!ahci%d: ahci_tran_reset_dport " 3141 "port %d reset device", instance, port); 3142 3143 mutex_enter(&ahci_portp->ahciport_mutex); 3144 /* 3145 * software reset request must be sent to SATA_PMULT_HOSTPORT 3146 * if target is a port multiplier: 3147 */ 3148 if (sd->satadev_addr.qual == SATA_ADDR_DCPORT && 3149 ahci_portp->ahciport_device_type == SATA_DTYPE_PMULT) 3150 AHCI_ADDR_SET_PMULT(&addr, port); 3151 3152 if (ahci_portp->ahciport_port_state & SATA_PSTATE_FAILED | 3153 ahci_portp->ahciport_port_state & SATA_PSTATE_SHUTDOWN | 3154 ahci_portp->ahciport_port_state & SATA_PSTATE_PWROFF) { 3155 /* 3156 * In case the targer driver would send the request 3157 * before sata framework can have the opportunity to 3158 * process those event reports. 3159 */ 3160 sd->satadev_state = ahci_portp->ahciport_port_state; 3161 ahci_update_sata_registers(ahci_ctlp, port, sd); 3162 AHCIDBG(AHCIDBG_ERRS, ahci_ctlp, 3163 "ahci_tran_reset_dport returning SATA_FAILURE " 3164 "while port in FAILED/SHUTDOWN/PWROFF state: " 3165 "port: %d", port); 3166 mutex_exit(&ahci_portp->ahciport_mutex); 3167 ret = SATA_FAILURE; 3168 break; 3169 } 3170 3171 if (AHCIPORT_GET_DEV_TYPE(ahci_portp, &addr) == 3172 SATA_DTYPE_NONE) { 3173 /* 3174 * ahci_intr_phyrdy_change() may have rendered it to 3175 * AHCI_PORT_TYPE_NODEV. 3176 */ 3177 sd->satadev_type = SATA_DTYPE_NONE; 3178 sd->satadev_state = AHCIPORT_GET_STATE(ahci_portp, 3179 &addr); 3180 ahci_update_sata_registers(ahci_ctlp, port, sd); 3181 AHCIDBG(AHCIDBG_ERRS, ahci_ctlp, 3182 "ahci_tran_reset_dport returning SATA_FAILURE " 3183 "while no device attached: port: %d", port); 3184 mutex_exit(&ahci_portp->ahciport_mutex); 3185 ret = SATA_FAILURE; 3186 break; 3187 } 3188 3189 if (AHCI_ADDR_IS_PORT(&addr)) { 3190 ret = ahci_reset_device_reject_pkts(ahci_ctlp, 3191 ahci_portp, &addr); 3192 } else { 3193 ret = ahci_reset_pmdevice_reject_pkts(ahci_ctlp, 3194 ahci_portp, &addr); 3195 } 3196 3197 mutex_exit(&ahci_portp->ahciport_mutex); 3198 break; 3199 3200 case SATA_ADDR_CNTRL: 3201 /* Reset the whole controller */ 3202 cmn_err(CE_NOTE, "!ahci%d: ahci_tran_reset_dport " 3203 "reset the whole hba", instance); 3204 ret = ahci_reset_hba_reject_pkts(ahci_ctlp); 3205 break; 3206 3207 default: 3208 ret = SATA_FAILURE; 3209 } 3210 3211 return (ret); 3212 } 3213 3214 /* 3215 * Called by sata framework to activate a port as part of hotplug. 3216 * (cfgadm -c connect satax/y) 3217 * Support port multiplier. 3218 */ 3219 static int 3220 ahci_tran_hotplug_port_activate(dev_info_t *dip, sata_device_t *satadev) 3221 { 3222 ahci_ctl_t *ahci_ctlp; 3223 ahci_port_t *ahci_portp; 3224 ahci_addr_t addr; 3225 uint8_t cport = satadev->satadev_addr.cport; 3226 uint8_t pmport = satadev->satadev_addr.pmport; 3227 uint8_t port; 3228 int instance = ddi_get_instance(dip); 3229 3230 ahci_ctlp = ddi_get_soft_state(ahci_statep, instance); 3231 port = ahci_ctlp->ahcictl_cport_to_port[cport]; 3232 3233 AHCIDBG(AHCIDBG_ENTRY, ahci_ctlp, 3234 "ahci_tran_hotplug_port_activate enter: cport %d", cport); 3235 3236 ahci_portp = ahci_ctlp->ahcictl_ports[port]; 3237 3238 mutex_enter(&ahci_portp->ahciport_mutex); 3239 ahci_get_ahci_addr(ahci_ctlp, satadev, &addr); 3240 ASSERT(AHCI_ADDR_IS_PORT(&addr) || AHCI_ADDR_IS_PMPORT(&addr)); 3241 3242 if (AHCI_ADDR_IS_PORT(&addr)) { 3243 cmn_err(CE_NOTE, "!ahci%d: ahci port %d is activated", 3244 instance, port); 3245 3246 /* Enable the interrupts on the port */ 3247 ahci_enable_port_intrs(ahci_ctlp, port); 3248 3249 /* 3250 * Reset the port so that the PHY communication would be 3251 * re-established. But this reset is an internal operation 3252 * and the sata module doesn't need to know about it. 3253 * Moreover, the port with a device attached will be started 3254 * too. 3255 */ 3256 (void) ahci_restart_port_wait_till_ready(ahci_ctlp, 3257 ahci_portp, port, 3258 AHCI_PORT_RESET|AHCI_RESET_NO_EVENTS_UP, 3259 NULL); 3260 3261 /* 3262 * Need to check the link status and device status of the port 3263 * and consider raising power if the port was in D3 state 3264 */ 3265 ahci_portp->ahciport_port_state |= SATA_PSTATE_PWRON; 3266 ahci_portp->ahciport_port_state &= ~SATA_PSTATE_PWROFF; 3267 ahci_portp->ahciport_port_state &= ~SATA_PSTATE_SHUTDOWN; 3268 } else if (AHCI_ADDR_IS_PMPORT(&addr)) { 3269 cmn_err(CE_NOTE, "!ahci%d: ahci port %d:%d is activated", 3270 instance, port, pmport); 3271 /* AHCI_ADDR_PMPORT */ 3272 AHCIPORT_PMSTATE(ahci_portp, &addr) |= SATA_PSTATE_PWRON; 3273 AHCIPORT_PMSTATE(ahci_portp, &addr) &= 3274 ~(SATA_PSTATE_PWROFF|SATA_PSTATE_SHUTDOWN); 3275 } 3276 3277 satadev->satadev_state = ahci_portp->ahciport_port_state; 3278 3279 ahci_update_sata_registers(ahci_ctlp, port, satadev); 3280 3281 mutex_exit(&ahci_portp->ahciport_mutex); 3282 return (SATA_SUCCESS); 3283 } 3284 3285 /* 3286 * Called by sata framework to deactivate a port as part of hotplug. 3287 * (cfgadm -c disconnect satax/y) 3288 * Support port multiplier. 3289 */ 3290 static int 3291 ahci_tran_hotplug_port_deactivate(dev_info_t *dip, sata_device_t *satadev) 3292 { 3293 ahci_ctl_t *ahci_ctlp; 3294 ahci_port_t *ahci_portp; 3295 ahci_addr_t addr; 3296 uint8_t cport = satadev->satadev_addr.cport; 3297 uint8_t pmport = satadev->satadev_addr.pmport; 3298 uint8_t port; 3299 uint32_t port_scontrol; 3300 int instance = ddi_get_instance(dip); 3301 3302 ahci_ctlp = ddi_get_soft_state(ahci_statep, instance); 3303 port = ahci_ctlp->ahcictl_cport_to_port[cport]; 3304 3305 AHCIDBG(AHCIDBG_ENTRY, ahci_ctlp, 3306 "ahci_tran_hotplug_port_deactivate enter: cport %d", cport); 3307 3308 ahci_portp = ahci_ctlp->ahcictl_ports[port]; 3309 mutex_enter(&ahci_portp->ahciport_mutex); 3310 ahci_get_ahci_addr(ahci_ctlp, satadev, &addr); 3311 ASSERT(AHCI_ADDR_IS_PORT(&addr) || AHCI_ADDR_IS_PMPORT(&addr)); 3312 3313 if (AHCI_ADDR_IS_PORT(&addr)) { 3314 cmn_err(CE_NOTE, "!ahci%d: ahci port %d is deactivated", 3315 instance, port); 3316 3317 /* Disable the interrupts on the port */ 3318 ahci_disable_port_intrs(ahci_ctlp, port); 3319 3320 if (ahci_portp->ahciport_device_type != SATA_DTYPE_NONE) { 3321 3322 /* First to abort all the pending commands */ 3323 ahci_reject_all_abort_pkts(ahci_ctlp, ahci_portp, port); 3324 3325 /* Then stop the port */ 3326 (void) ahci_put_port_into_notrunning_state(ahci_ctlp, 3327 ahci_portp, port); 3328 } 3329 3330 /* Next put the PHY offline */ 3331 port_scontrol = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 3332 (uint32_t *)AHCI_PORT_PxSCTL(ahci_ctlp, port)); 3333 SCONTROL_SET_DET(port_scontrol, SCONTROL_DET_DISABLE); 3334 ddi_put32(ahci_ctlp->ahcictl_ahci_acc_handle, (uint32_t *) 3335 AHCI_PORT_PxSCTL(ahci_ctlp, port), port_scontrol); 3336 } else if (AHCI_ADDR_IS_PMPORT(&addr)) { 3337 cmn_err(CE_NOTE, "!ahci%d: ahci port %d:%d is deactivated", 3338 instance, port, pmport); 3339 3340 ahci_disable_port_intrs(ahci_ctlp, port); 3341 if (AHCIPORT_GET_DEV_TYPE(ahci_portp, &addr) 3342 != SATA_DTYPE_NONE) 3343 ahci_reject_all_abort_pkts(ahci_ctlp, ahci_portp, port); 3344 3345 /* Re-enable the interrupts for the other pmports */ 3346 ahci_enable_port_intrs(ahci_ctlp, port); 3347 } 3348 3349 /* Update port state */ 3350 AHCIPORT_SET_STATE(ahci_portp, &addr, SATA_PSTATE_SHUTDOWN); 3351 satadev->satadev_state = SATA_PSTATE_SHUTDOWN; 3352 3353 ahci_update_sata_registers(ahci_ctlp, port, satadev); 3354 3355 mutex_exit(&ahci_portp->ahciport_mutex); 3356 return (SATA_SUCCESS); 3357 } 3358 3359 /* 3360 * To be used to mark all the outstanding pkts with SATA_PKT_ABORTED 3361 * when a device is unplugged or a port is deactivated. 3362 */ 3363 static void 3364 ahci_reject_all_abort_pkts(ahci_ctl_t *ahci_ctlp, 3365 ahci_port_t *ahci_portp, uint8_t port) 3366 { 3367 uint32_t slot_status = 0; 3368 uint32_t abort_tags = 0; 3369 3370 ASSERT(MUTEX_HELD(&ahci_portp->ahciport_mutex)); 3371 3372 AHCIDBG(AHCIDBG_ENTRY|AHCIDBG_INTR, ahci_ctlp, 3373 "ahci_reject_all_abort_pkts at port: %d", port); 3374 3375 /* Read/write port multiplier command takes highest priority */ 3376 if (RDWR_PMULT_CMD_IN_PROGRESS(ahci_portp)) { 3377 slot_status = 0x1; 3378 abort_tags = 0x1; 3379 goto out; 3380 } 3381 3382 /* 3383 * When AHCI_PORT_FLAG_MOPPING is set, we need to check whether a 3384 * REQUEST SENSE command or READ LOG EXT command is delivered to HBA 3385 * to get the error data, if yes when the device is removed, the 3386 * command needs to be aborted too. 3387 */ 3388 if (ahci_portp->ahciport_flags & AHCI_PORT_FLAG_MOPPING) { 3389 if (ERR_RETRI_CMD_IN_PROGRESS(ahci_portp)) { 3390 slot_status = 0x1; 3391 abort_tags = 0x1; 3392 goto out; 3393 } else { 3394 AHCIDBG(AHCIDBG_ERRS, ahci_ctlp, 3395 "ahci_reject_all_abort_pkts return directly " 3396 "port %d no needs to reject any outstanding " 3397 "commands", port); 3398 return; 3399 } 3400 } 3401 3402 if (NON_NCQ_CMD_IN_PROGRESS(ahci_portp)) { 3403 slot_status = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 3404 (uint32_t *)AHCI_PORT_PxCI(ahci_ctlp, port)); 3405 abort_tags = slot_status & AHCI_SLOT_MASK(ahci_ctlp); 3406 } else if (NCQ_CMD_IN_PROGRESS(ahci_portp)) { 3407 slot_status = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 3408 (uint32_t *)AHCI_PORT_PxSACT(ahci_ctlp, port)); 3409 abort_tags = slot_status & AHCI_NCQ_SLOT_MASK(ahci_portp); 3410 } 3411 3412 out: 3413 /* No need to do mop when there is no outstanding commands */ 3414 if (slot_status != 0) { 3415 ahci_portp->ahciport_flags |= AHCI_PORT_FLAG_MOPPING; 3416 ahci_portp->ahciport_mop_in_progress++; 3417 3418 ahci_mop_commands(ahci_ctlp, 3419 ahci_portp, 3420 slot_status, 3421 0, /* failed tags */ 3422 0, /* timeout tags */ 3423 abort_tags, /* aborting tags */ 3424 0); /* reset tags */ 3425 } 3426 } 3427 3428 #if defined(__lock_lint) 3429 static int 3430 ahci_selftest(dev_info_t *dip, sata_device_t *device) 3431 { 3432 return (SATA_SUCCESS); 3433 } 3434 #endif 3435 3436 /* 3437 * Initialize fma capabilities and register with IO fault services. 3438 */ 3439 static void 3440 ahci_fm_init(ahci_ctl_t *ahci_ctlp) 3441 { 3442 /* 3443 * Need to change iblock to priority for new MSI intr 3444 */ 3445 ddi_iblock_cookie_t fm_ibc; 3446 3447 ahci_ctlp->ahcictl_fm_cap = ddi_getprop(DDI_DEV_T_ANY, 3448 ahci_ctlp->ahcictl_dip, 3449 DDI_PROP_CANSLEEP | DDI_PROP_DONTPASS, "fm-capable", 3450 DDI_FM_EREPORT_CAPABLE | DDI_FM_ACCCHK_CAPABLE | 3451 DDI_FM_DMACHK_CAPABLE | DDI_FM_ERRCB_CAPABLE); 3452 3453 /* Only register with IO Fault Services if we have some capability */ 3454 if (ahci_ctlp->ahcictl_fm_cap) { 3455 /* Adjust access and dma attributes for FMA */ 3456 accattr.devacc_attr_access = DDI_FLAGERR_ACC; 3457 buffer_dma_attr.dma_attr_flags |= DDI_DMA_FLAGERR; 3458 rcvd_fis_dma_attr.dma_attr_flags |= DDI_DMA_FLAGERR; 3459 cmd_list_dma_attr.dma_attr_flags |= DDI_DMA_FLAGERR; 3460 cmd_table_dma_attr.dma_attr_flags |= DDI_DMA_FLAGERR; 3461 3462 /* 3463 * Register capabilities with IO Fault Services. 3464 * ahcictl_fm_cap will be updated to indicate 3465 * capabilities actually supported (not requested.) 3466 */ 3467 ddi_fm_init(ahci_ctlp->ahcictl_dip, 3468 &ahci_ctlp->ahcictl_fm_cap, &fm_ibc); 3469 3470 if (ahci_ctlp->ahcictl_fm_cap == DDI_FM_NOT_CAPABLE) { 3471 cmn_err(CE_WARN, "!ahci%d: fma init failed.", 3472 ddi_get_instance(ahci_ctlp->ahcictl_dip)); 3473 return; 3474 } 3475 /* 3476 * Initialize pci ereport capabilities if ereport 3477 * capable (should always be.) 3478 */ 3479 if (DDI_FM_EREPORT_CAP(ahci_ctlp->ahcictl_fm_cap) || 3480 DDI_FM_ERRCB_CAP(ahci_ctlp->ahcictl_fm_cap)) { 3481 pci_ereport_setup(ahci_ctlp->ahcictl_dip); 3482 } 3483 3484 /* 3485 * Register error callback if error callback capable. 3486 */ 3487 if (DDI_FM_ERRCB_CAP(ahci_ctlp->ahcictl_fm_cap)) { 3488 ddi_fm_handler_register(ahci_ctlp->ahcictl_dip, 3489 ahci_fm_error_cb, (void *) ahci_ctlp); 3490 } 3491 3492 AHCIDBG(AHCIDBG_INIT, ahci_ctlp, 3493 "ahci_fm_fini: fma enabled.", NULL); 3494 } 3495 } 3496 3497 /* 3498 * Releases fma capabilities and un-registers with IO fault services. 3499 */ 3500 static void 3501 ahci_fm_fini(ahci_ctl_t *ahci_ctlp) 3502 { 3503 /* Only unregister FMA capabilities if registered */ 3504 if (ahci_ctlp->ahcictl_fm_cap) { 3505 /* 3506 * Un-register error callback if error callback capable. 3507 */ 3508 if (DDI_FM_ERRCB_CAP(ahci_ctlp->ahcictl_fm_cap)) { 3509 ddi_fm_handler_unregister(ahci_ctlp->ahcictl_dip); 3510 } 3511 3512 /* 3513 * Release any resources allocated by pci_ereport_setup() 3514 */ 3515 if (DDI_FM_EREPORT_CAP(ahci_ctlp->ahcictl_fm_cap) || 3516 DDI_FM_ERRCB_CAP(ahci_ctlp->ahcictl_fm_cap)) { 3517 pci_ereport_teardown(ahci_ctlp->ahcictl_dip); 3518 } 3519 3520 /* Unregister from IO Fault Services */ 3521 ddi_fm_fini(ahci_ctlp->ahcictl_dip); 3522 3523 /* Adjust access and dma attributes for FMA */ 3524 accattr.devacc_attr_access = DDI_DEFAULT_ACC; 3525 buffer_dma_attr.dma_attr_flags &= ~DDI_DMA_FLAGERR; 3526 rcvd_fis_dma_attr.dma_attr_flags &= ~DDI_DMA_FLAGERR; 3527 cmd_list_dma_attr.dma_attr_flags &= ~DDI_DMA_FLAGERR; 3528 cmd_table_dma_attr.dma_attr_flags &= ~DDI_DMA_FLAGERR; 3529 3530 AHCIDBG(AHCIDBG_INIT, ahci_ctlp, 3531 "ahci_fm_fini: fma disabled.", NULL); 3532 } 3533 } 3534 3535 /*ARGSUSED*/ 3536 static int 3537 ahci_fm_error_cb(dev_info_t *dip, ddi_fm_error_t *err, const void *impl_data) 3538 { 3539 /* 3540 * as the driver can always deal with an error in any dma or 3541 * access handle, we can just return the fme_status value. 3542 */ 3543 pci_ereport_post(dip, err, NULL); 3544 return (err->fme_status); 3545 } 3546 3547 int 3548 ahci_check_acc_handle(ddi_acc_handle_t handle) 3549 { 3550 ddi_fm_error_t de; 3551 3552 ddi_fm_acc_err_get(handle, &de, DDI_FME_VERSION); 3553 return (de.fme_status); 3554 } 3555 3556 int 3557 ahci_check_dma_handle(ddi_dma_handle_t handle) 3558 { 3559 ddi_fm_error_t de; 3560 3561 ddi_fm_dma_err_get(handle, &de, DDI_FME_VERSION); 3562 return (de.fme_status); 3563 } 3564 3565 /* 3566 * Generate an ereport 3567 */ 3568 void 3569 ahci_fm_ereport(ahci_ctl_t *ahci_ctlp, char *detail) 3570 { 3571 uint64_t ena; 3572 char buf[FM_MAX_CLASS]; 3573 3574 (void) snprintf(buf, FM_MAX_CLASS, "%s.%s", DDI_FM_DEVICE, detail); 3575 ena = fm_ena_generate(0, FM_ENA_FMT1); 3576 if (DDI_FM_EREPORT_CAP(ahci_ctlp->ahcictl_fm_cap)) { 3577 ddi_fm_ereport_post(ahci_ctlp->ahcictl_dip, buf, ena, 3578 DDI_NOSLEEP, FM_VERSION, DATA_TYPE_UINT8, 3579 FM_EREPORT_VERSION, NULL); 3580 } 3581 } 3582 3583 /* 3584 * Check if all handles are correctly allocated. 3585 */ 3586 static int 3587 ahci_check_all_handle(ahci_ctl_t *ahci_ctlp) 3588 { 3589 int port; 3590 3591 if (ahci_check_ctl_handle(ahci_ctlp) != DDI_SUCCESS) { 3592 return (DDI_FAILURE); 3593 } 3594 3595 for (port = 0; port < ahci_ctlp->ahcictl_num_ports; port++) { 3596 ahci_port_t *ahci_portp; 3597 3598 if (!AHCI_PORT_IMPLEMENTED(ahci_ctlp, port)) 3599 continue; 3600 3601 ahci_portp = ahci_ctlp->ahcictl_ports[port]; 3602 3603 mutex_enter(&ahci_portp->ahciport_mutex); 3604 if (ahci_check_port_handle(ahci_ctlp, port) != DDI_SUCCESS) { 3605 mutex_exit(&ahci_portp->ahciport_mutex); 3606 return (DDI_FAILURE); 3607 } 3608 mutex_exit(&ahci_portp->ahciport_mutex); 3609 } 3610 3611 return (DDI_SUCCESS); 3612 } 3613 3614 /* 3615 * Check the access handles for the controller. Note that 3616 * ahcictl_pci_conf_handle is only used in attach process. 3617 */ 3618 static int 3619 ahci_check_ctl_handle(ahci_ctl_t *ahci_ctlp) 3620 { 3621 if ((ahci_check_acc_handle(ahci_ctlp-> 3622 ahcictl_pci_conf_handle) != DDI_FM_OK) || 3623 (ahci_check_acc_handle(ahci_ctlp-> 3624 ahcictl_ahci_acc_handle) != DDI_FM_OK)) { 3625 return (DDI_FAILURE); 3626 } 3627 return (DDI_SUCCESS); 3628 } 3629 3630 /* 3631 * Check the DMA handles and the access handles of a controller port. 3632 */ 3633 static int 3634 ahci_check_port_handle(ahci_ctl_t *ahci_ctlp, int port) 3635 { 3636 ahci_port_t *ahci_portp = ahci_ctlp->ahcictl_ports[port]; 3637 int slot; 3638 3639 ASSERT(MUTEX_HELD(&ahci_portp->ahciport_mutex)); 3640 3641 if ((ahci_check_dma_handle(ahci_portp-> 3642 ahciport_rcvd_fis_dma_handle) != DDI_FM_OK) || 3643 (ahci_check_dma_handle(ahci_portp-> 3644 ahciport_cmd_list_dma_handle) != DDI_FM_OK) || 3645 (ahci_check_acc_handle(ahci_portp-> 3646 ahciport_rcvd_fis_acc_handle) != DDI_FM_OK) || 3647 (ahci_check_acc_handle(ahci_portp-> 3648 ahciport_cmd_list_acc_handle) != DDI_FM_OK)) { 3649 return (DDI_FAILURE); 3650 } 3651 for (slot = 0; slot < ahci_ctlp->ahcictl_num_cmd_slots; slot++) { 3652 if (ahci_check_slot_handle(ahci_portp, slot) 3653 != DDI_SUCCESS) { 3654 return (DDI_FAILURE); 3655 } 3656 } 3657 return (DDI_SUCCESS); 3658 } 3659 3660 /* 3661 * Check the DMA handles and the access handles of a cmd table slot. 3662 */ 3663 static int 3664 ahci_check_slot_handle(ahci_port_t *ahci_portp, int slot) 3665 { 3666 ASSERT(MUTEX_HELD(&ahci_portp->ahciport_mutex)); 3667 3668 if ((ahci_check_acc_handle(ahci_portp-> 3669 ahciport_cmd_tables_acc_handle[slot]) != DDI_FM_OK) || 3670 (ahci_check_dma_handle(ahci_portp-> 3671 ahciport_cmd_tables_dma_handle[slot]) != DDI_FM_OK)) { 3672 return (DDI_FAILURE); 3673 } 3674 return (DDI_SUCCESS); 3675 } 3676 3677 /* 3678 * Allocate the ports structure, only called by ahci_attach 3679 */ 3680 static int 3681 ahci_alloc_ports_state(ahci_ctl_t *ahci_ctlp) 3682 { 3683 int port, cport = 0; 3684 3685 AHCIDBG(AHCIDBG_INIT|AHCIDBG_ENTRY, ahci_ctlp, 3686 "ahci_alloc_ports_state enter", NULL); 3687 3688 mutex_enter(&ahci_ctlp->ahcictl_mutex); 3689 3690 /* Allocate structures only for the implemented ports */ 3691 for (port = 0; port < ahci_ctlp->ahcictl_num_ports; port++) { 3692 if (!AHCI_PORT_IMPLEMENTED(ahci_ctlp, port)) { 3693 AHCIDBG(AHCIDBG_INIT, ahci_ctlp, 3694 "hba port %d not implemented", port); 3695 continue; 3696 } 3697 3698 ahci_ctlp->ahcictl_cport_to_port[cport] = (uint8_t)port; 3699 ahci_ctlp->ahcictl_port_to_cport[port] = 3700 (uint8_t)cport++; 3701 3702 if (ahci_alloc_port_state(ahci_ctlp, port) != AHCI_SUCCESS) { 3703 goto err_out; 3704 } 3705 } 3706 3707 mutex_exit(&ahci_ctlp->ahcictl_mutex); 3708 return (AHCI_SUCCESS); 3709 3710 err_out: 3711 for (port--; port >= 0; port--) { 3712 if (AHCI_PORT_IMPLEMENTED(ahci_ctlp, port)) { 3713 ahci_dealloc_port_state(ahci_ctlp, port); 3714 } 3715 } 3716 3717 mutex_exit(&ahci_ctlp->ahcictl_mutex); 3718 return (AHCI_FAILURE); 3719 } 3720 3721 /* 3722 * Reverse of ahci_alloc_ports_state(), only called by ahci_detach 3723 */ 3724 static void 3725 ahci_dealloc_ports_state(ahci_ctl_t *ahci_ctlp) 3726 { 3727 int port; 3728 3729 mutex_enter(&ahci_ctlp->ahcictl_mutex); 3730 for (port = 0; port < ahci_ctlp->ahcictl_num_ports; port++) { 3731 /* if this port is implemented by the HBA */ 3732 if (AHCI_PORT_IMPLEMENTED(ahci_ctlp, port)) 3733 ahci_dealloc_port_state(ahci_ctlp, port); 3734 } 3735 mutex_exit(&ahci_ctlp->ahcictl_mutex); 3736 } 3737 3738 /* 3739 * Drain the taskq. 3740 */ 3741 static void 3742 ahci_drain_ports_taskq(ahci_ctl_t *ahci_ctlp) 3743 { 3744 ahci_port_t *ahci_portp; 3745 int port; 3746 3747 for (port = 0; port < ahci_ctlp->ahcictl_num_ports; port++) { 3748 if (!AHCI_PORT_IMPLEMENTED(ahci_ctlp, port)) { 3749 continue; 3750 } 3751 3752 ahci_portp = ahci_ctlp->ahcictl_ports[port]; 3753 3754 mutex_enter(&ahci_portp->ahciport_mutex); 3755 ddi_taskq_wait(ahci_portp->ahciport_event_taskq); 3756 mutex_exit(&ahci_portp->ahciport_mutex); 3757 } 3758 } 3759 3760 /* 3761 * Initialize the controller and all ports. And then try to start the ports 3762 * if there are devices attached. 3763 * 3764 * This routine can be called from three seperate cases: DDI_ATTACH, 3765 * PM_LEVEL_D0 and DDI_RESUME. The DDI_ATTACH case is different from 3766 * other two cases; device signature probing are attempted only during 3767 * DDI_ATTACH case. 3768 */ 3769 static int 3770 ahci_initialize_controller(ahci_ctl_t *ahci_ctlp) 3771 { 3772 ahci_port_t *ahci_portp; 3773 ahci_addr_t addr; 3774 int port; 3775 3776 AHCIDBG(AHCIDBG_INIT|AHCIDBG_ENTRY, ahci_ctlp, 3777 "ahci_initialize_controller enter", NULL); 3778 3779 /* Disable the whole controller interrupts */ 3780 mutex_enter(&ahci_ctlp->ahcictl_mutex); 3781 ahci_disable_all_intrs(ahci_ctlp); 3782 mutex_exit(&ahci_ctlp->ahcictl_mutex); 3783 3784 /* Initialize the implemented ports and structures */ 3785 for (port = 0; port < ahci_ctlp->ahcictl_num_ports; port++) { 3786 if (!AHCI_PORT_IMPLEMENTED(ahci_ctlp, port)) { 3787 continue; 3788 } 3789 3790 ahci_portp = ahci_ctlp->ahcictl_ports[port]; 3791 mutex_enter(&ahci_portp->ahciport_mutex); 3792 3793 /* 3794 * Ensure that the controller is not in the running state 3795 * by checking every implemented port's PxCMD register 3796 */ 3797 AHCI_ADDR_SET_PORT(&addr, (uint8_t)port); 3798 3799 if (ahci_initialize_port(ahci_ctlp, ahci_portp, &addr) 3800 != AHCI_SUCCESS) { 3801 AHCIDBG(AHCIDBG_ERRS, ahci_ctlp, 3802 "ahci_initialize_controller: failed to " 3803 "initialize port %d", port); 3804 /* 3805 * Set the port state to SATA_PSTATE_FAILED if 3806 * failed to initialize it. 3807 */ 3808 ahci_portp->ahciport_port_state = SATA_PSTATE_FAILED; 3809 } 3810 3811 mutex_exit(&ahci_portp->ahciport_mutex); 3812 } 3813 3814 /* Enable the whole controller interrupts */ 3815 mutex_enter(&ahci_ctlp->ahcictl_mutex); 3816 ahci_enable_all_intrs(ahci_ctlp); 3817 mutex_exit(&ahci_ctlp->ahcictl_mutex); 3818 3819 return (AHCI_SUCCESS); 3820 } 3821 3822 /* 3823 * Reverse of ahci_initialize_controller() 3824 * 3825 * We only need to stop the ports and disable the interrupt. 3826 */ 3827 static void 3828 ahci_uninitialize_controller(ahci_ctl_t *ahci_ctlp) 3829 { 3830 ahci_port_t *ahci_portp; 3831 int port; 3832 3833 AHCIDBG(AHCIDBG_INIT, ahci_ctlp, 3834 "ahci_uninitialize_controller enter", NULL); 3835 3836 /* disable all the interrupts. */ 3837 mutex_enter(&ahci_ctlp->ahcictl_mutex); 3838 ahci_disable_all_intrs(ahci_ctlp); 3839 mutex_exit(&ahci_ctlp->ahcictl_mutex); 3840 3841 for (port = 0; port < ahci_ctlp->ahcictl_num_ports; port++) { 3842 if (!AHCI_PORT_IMPLEMENTED(ahci_ctlp, port)) { 3843 continue; 3844 } 3845 3846 ahci_portp = ahci_ctlp->ahcictl_ports[port]; 3847 3848 /* Stop the port by clearing PxCMD.ST */ 3849 mutex_enter(&ahci_portp->ahciport_mutex); 3850 3851 /* 3852 * Here we must disable the port interrupt because 3853 * ahci_disable_all_intrs only clear GHC.IE, and IS 3854 * register will be still set if PxIE is enabled. 3855 * When ahci shares one IRQ with other drivers, the 3856 * intr handler may claim the intr mistakenly. 3857 */ 3858 ahci_disable_port_intrs(ahci_ctlp, port); 3859 (void) ahci_put_port_into_notrunning_state(ahci_ctlp, 3860 ahci_portp, port); 3861 mutex_exit(&ahci_portp->ahciport_mutex); 3862 } 3863 } 3864 3865 /* 3866 * ahci_alloc_pmult() 3867 * 1. Setting HBA port registers which are necessary for a port multiplier. 3868 * (Set PxCMD.PMA while PxCMD.ST is '0') 3869 * 2. Allocate ahci_pmult_info structure. 3870 * 3871 * NOTE: Must stop port before the function is called. 3872 */ 3873 static void 3874 ahci_alloc_pmult(ahci_ctl_t *ahci_ctlp, ahci_port_t *ahci_portp) 3875 { 3876 uint32_t port_cmd_status; 3877 uint8_t port = ahci_portp->ahciport_port_num; 3878 3879 ASSERT(MUTEX_HELD(&ahci_portp->ahciport_mutex)); 3880 3881 port_cmd_status = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 3882 (uint32_t *)AHCI_PORT_PxCMD(ahci_ctlp, port)); 3883 3884 /* The port must have been stopped before. */ 3885 ASSERT(!(port_cmd_status & AHCI_CMD_STATUS_ST)); 3886 3887 if (!(port_cmd_status & AHCI_CMD_STATUS_PMA)) { 3888 /* set PMA bit */ 3889 ddi_put32(ahci_ctlp->ahcictl_ahci_acc_handle, 3890 (uint32_t *)AHCI_PORT_PxCMD(ahci_ctlp, port), 3891 port_cmd_status|AHCI_CMD_STATUS_PMA); 3892 3893 AHCIDBG(AHCIDBG_INIT|AHCIDBG_PMULT, ahci_ctlp, 3894 "ahci_alloc_pmult: " 3895 "PxCMD.PMA bit set at port %d.", port); 3896 } 3897 3898 /* Allocate port multiplier information structure */ 3899 if (ahci_portp->ahciport_pmult_info == NULL) { 3900 ahci_portp->ahciport_pmult_info = (ahci_pmult_info_t *) 3901 kmem_zalloc(sizeof (ahci_pmult_info_t), KM_SLEEP); 3902 } 3903 3904 ASSERT(ahci_portp->ahciport_pmult_info != NULL); 3905 } 3906 3907 /* 3908 * ahci_dealloc_pmult() 3909 * 1. Clearing related registers when a port multiplier is detached. 3910 * (Clear PxCMD.PMA while PxCMD.ST is '0') 3911 * 2. Deallocate ahci_pmult_info structure. 3912 * 3913 * NOTE: Must stop port before the function is called. 3914 */ 3915 static void 3916 ahci_dealloc_pmult(ahci_ctl_t *ahci_ctlp, ahci_port_t *ahci_portp) 3917 { 3918 uint32_t port_cmd_status; 3919 uint8_t port = ahci_portp->ahciport_port_num; 3920 3921 ASSERT(MUTEX_HELD(&ahci_portp->ahciport_mutex)); 3922 3923 port_cmd_status = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 3924 (uint32_t *)AHCI_PORT_PxCMD(ahci_ctlp, port)); 3925 3926 if (port_cmd_status & AHCI_CMD_STATUS_PMA) { 3927 /* Clear PMA bit */ 3928 ddi_put32(ahci_ctlp->ahcictl_ahci_acc_handle, 3929 (uint32_t *)AHCI_PORT_PxCMD(ahci_ctlp, port), 3930 (port_cmd_status & (~AHCI_CMD_STATUS_PMA))); 3931 3932 AHCIDBG(AHCIDBG_INIT|AHCIDBG_PMULT, ahci_ctlp, 3933 "ahci_dealloc_pmult: " 3934 "PxCMD.PMA bit cleared at port %d.", port); 3935 } 3936 3937 /* Release port multiplier information structure */ 3938 if (ahci_portp->ahciport_pmult_info != NULL) { 3939 kmem_free(ahci_portp->ahciport_pmult_info, 3940 sizeof (ahci_pmult_info_t)); 3941 ahci_portp->ahciport_pmult_info = NULL; 3942 } 3943 } 3944 3945 /* 3946 * Staggered Spin-up. 3947 */ 3948 static void 3949 ahci_staggered_spin_up(ahci_ctl_t *ahci_ctlp, uint8_t port) 3950 { 3951 uint32_t cap_status; 3952 uint32_t port_cmd_status; 3953 3954 ASSERT(MUTEX_HELD(&ahci_ctlp->ahcictl_ports[port]->ahciport_mutex)); 3955 3956 cap_status = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 3957 (uint32_t *)AHCI_GLOBAL_CAP(ahci_ctlp)); 3958 3959 /* Check for staggered spin-up support */ 3960 if (!(cap_status & AHCI_HBA_CAP_SSS)) 3961 return; 3962 3963 port_cmd_status = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 3964 (uint32_t *)AHCI_PORT_PxCMD(ahci_ctlp, port)); 3965 3966 /* If PxCMD.SUD == 1, no staggered spin-up is needed */ 3967 if (port_cmd_status & AHCI_CMD_STATUS_SUD) 3968 return; 3969 3970 AHCIDBG(AHCIDBG_INIT, ahci_ctlp, "Spin-up at port %d", port); 3971 3972 /* Set PxCMD.SUD */ 3973 port_cmd_status |= AHCI_CMD_STATUS_SUD; 3974 ddi_put32(ahci_ctlp->ahcictl_ahci_acc_handle, 3975 (uint32_t *)AHCI_PORT_PxCMD(ahci_ctlp, port), 3976 port_cmd_status); 3977 } 3978 3979 /* 3980 * The routine is to initialize a port. First put the port in NotRunning 3981 * state, then enable port interrupt and clear Serror register. And under 3982 * AHCI_ATTACH case, find device signature and then try to start the port. 3983 * 3984 * Called by 3985 * 1. ahci_initialize_controller 3986 * 2. ahci_intr_phyrdy_change (hotplug) 3987 */ 3988 static int 3989 ahci_initialize_port(ahci_ctl_t *ahci_ctlp, ahci_port_t *ahci_portp, 3990 ahci_addr_t *addrp) 3991 { 3992 uint32_t port_sstatus, port_task_file, port_cmd_status; 3993 uint8_t port = addrp->aa_port; 3994 boolean_t resuming = B_TRUE; /* processing DDI_RESUME */ 3995 int ret; 3996 3997 ASSERT(MUTEX_HELD(&ahci_portp->ahciport_mutex)); 3998 3999 /* AHCI_ADDR_PORT: We've no idea of the attached device here. */ 4000 ASSERT(AHCI_ADDR_IS_PORT(addrp)); 4001 4002 /* 4003 * At the time being, only probe ports/devices and get the types of 4004 * attached devices during DDI_ATTACH. In fact, the device can be 4005 * changed during power state changes, but at the time being, we 4006 * don't support the situation. 4007 */ 4008 if (ahci_portp->ahciport_flags & AHCI_PORT_FLAG_HOTPLUG) { 4009 resuming = B_FALSE; 4010 } else { 4011 /* check for DDI_RESUME case */ 4012 mutex_exit(&ahci_portp->ahciport_mutex); 4013 mutex_enter(&ahci_ctlp->ahcictl_mutex); 4014 if (ahci_ctlp->ahcictl_flags & AHCI_ATTACH) 4015 resuming = B_FALSE; 4016 mutex_exit(&ahci_ctlp->ahcictl_mutex); 4017 mutex_enter(&ahci_portp->ahciport_mutex); 4018 } 4019 4020 if (resuming) { 4021 /* 4022 * During the resume, we need to set the PxCLB, PxCLBU, PxFB 4023 * and PxFBU registers in case these registers were cleared 4024 * during the suspend. 4025 */ 4026 AHCIDBG(AHCIDBG_PM, ahci_ctlp, 4027 "ahci_initialize_port: port %d " 4028 "set PxCLB, PxCLBU, PxFB and PxFBU " 4029 "during resume", port); 4030 4031 if (ahci_setup_port_base_addresses(ahci_ctlp, ahci_portp) != 4032 AHCI_SUCCESS) 4033 return (AHCI_FAILURE); 4034 } 4035 4036 port_cmd_status = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 4037 (uint32_t *)AHCI_PORT_PxCMD(ahci_ctlp, port)); 4038 4039 AHCIDBG(AHCIDBG_INIT|AHCIDBG_ENTRY, ahci_ctlp, 4040 "ahci_initialize_port: port %d ", port); 4041 4042 /* 4043 * Check whether the port is in NotRunning state, if not, 4044 * put the port in NotRunning state 4045 */ 4046 if (port_cmd_status & 4047 (AHCI_CMD_STATUS_ST | 4048 AHCI_CMD_STATUS_CR | 4049 AHCI_CMD_STATUS_FRE | 4050 AHCI_CMD_STATUS_FR)) { 4051 (void) ahci_put_port_into_notrunning_state(ahci_ctlp, 4052 ahci_portp, port); 4053 } 4054 4055 /* Make sure the drive is spun-up */ 4056 ahci_staggered_spin_up(ahci_ctlp, port); 4057 4058 /* Disable interrupt */ 4059 ahci_disable_port_intrs(ahci_ctlp, port); 4060 4061 /* Device is unknown at first */ 4062 AHCIPORT_SET_DEV_TYPE(ahci_portp, addrp, SATA_DTYPE_UNKNOWN); 4063 4064 /* Disable the interface power management */ 4065 ahci_disable_interface_pm(ahci_ctlp, port); 4066 4067 port_sstatus = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 4068 (uint32_t *)AHCI_PORT_PxSSTS(ahci_ctlp, port)); 4069 port_task_file = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 4070 (uint32_t *)AHCI_PORT_PxTFD(ahci_ctlp, port)); 4071 4072 /* Check physcial link status */ 4073 if (SSTATUS_GET_IPM(port_sstatus) == SSTATUS_IPM_NODEV_NOPHYCOM || 4074 SSTATUS_GET_DET(port_sstatus) == SSTATUS_DET_DEVPRE_NOPHYCOM || 4075 4076 /* Check interface status */ 4077 port_task_file & AHCI_TFD_STS_BSY || 4078 port_task_file & AHCI_TFD_STS_DRQ || 4079 4080 /* Check whether port reset must be executed */ 4081 ahci_ctlp->ahcictl_cap & AHCI_CAP_INIT_PORT_RESET || 4082 4083 /* Always reset port on RESUME */ 4084 resuming != B_FALSE) { 4085 4086 /* Something went wrong, we need do some reset things */ 4087 ret = ahci_port_reset(ahci_ctlp, ahci_portp, addrp); 4088 4089 /* Does port reset succeed on HBA port? */ 4090 if (ret != AHCI_SUCCESS) { 4091 AHCIDBG(AHCIDBG_INIT|AHCIDBG_ERRS, ahci_ctlp, 4092 "ahci_initialize_port:" 4093 "port reset failed at port %d", port); 4094 return (AHCI_FAILURE); 4095 } 4096 4097 /* Is port failed? */ 4098 if (AHCIPORT_GET_STATE(ahci_portp, addrp) & 4099 SATA_PSTATE_FAILED) { 4100 AHCIDBG(AHCIDBG_INIT|AHCIDBG_ERRS, ahci_ctlp, 4101 "ahci_initialize_port: port %d state 0x%x", 4102 port, ahci_portp->ahciport_port_state); 4103 return (AHCI_FAILURE); 4104 } 4105 } 4106 4107 AHCIPORT_SET_STATE(ahci_portp, addrp, SATA_STATE_READY); 4108 AHCIDBG(AHCIDBG_INIT, ahci_ctlp, "port %d is ready now.", port); 4109 4110 /* 4111 * Try to get the device signature if the port is not empty. 4112 */ 4113 if (!resuming && AHCIPORT_DEV_TYPE(ahci_portp, addrp) != 4114 SATA_DTYPE_NONE) 4115 ahci_find_dev_signature(ahci_ctlp, ahci_portp, addrp); 4116 4117 /* Return directly if no device connected */ 4118 if (AHCIPORT_DEV_TYPE(ahci_portp, addrp) == SATA_DTYPE_NONE) { 4119 AHCIDBG(AHCIDBG_INIT, ahci_ctlp, 4120 "No device connected to port %d", port); 4121 goto out; 4122 } 4123 4124 /* If this is a port multiplier, we need do some initialization */ 4125 if (AHCIPORT_DEV_TYPE(ahci_portp, addrp) == SATA_DTYPE_PMULT) { 4126 AHCIDBG(AHCIDBG_INFO|AHCIDBG_PMULT, ahci_ctlp, 4127 "Port multiplier found at port %d", port); 4128 ahci_alloc_pmult(ahci_ctlp, ahci_portp); 4129 } 4130 4131 /* Try to start the port */ 4132 if (ahci_start_port(ahci_ctlp, ahci_portp, port) 4133 != AHCI_SUCCESS) { 4134 AHCIDBG(AHCIDBG_INIT, ahci_ctlp, 4135 "failed to start port %d", port); 4136 return (AHCI_FAILURE); 4137 } 4138 out: 4139 /* Enable port interrupts */ 4140 ahci_enable_port_intrs(ahci_ctlp, port); 4141 4142 return (AHCI_SUCCESS); 4143 } 4144 4145 /* 4146 * Handle hardware defect, and check the capabilities. For example, 4147 * power management capabilty and MSI capability. 4148 */ 4149 static int 4150 ahci_config_space_init(ahci_ctl_t *ahci_ctlp) 4151 { 4152 ushort_t caps_ptr, cap_count, cap; 4153 #if AHCI_DEBUG 4154 ushort_t pmcap, pmcsr; 4155 ushort_t msimc; 4156 #endif 4157 uint8_t revision; 4158 4159 ahci_ctlp->ahcictl_venid = 4160 pci_config_get16(ahci_ctlp->ahcictl_pci_conf_handle, 4161 PCI_CONF_VENID); 4162 4163 ahci_ctlp->ahcictl_devid = 4164 pci_config_get16(ahci_ctlp->ahcictl_pci_conf_handle, 4165 PCI_CONF_DEVID); 4166 4167 /* 4168 * Modify dma_attr_align of ahcictl_buffer_dma_attr. For VT8251, those 4169 * controllers with 0x00 revision id work on 4-byte aligned buffer, 4170 * which is a bug and was fixed after 0x00 revision id controllers. 4171 * 4172 * Moreover, VT8251 cannot use multiple command slots in the command 4173 * list for non-queued commands because the previous register content 4174 * of PxCI can be re-written in the register write, so a flag will be 4175 * set to record this defect - AHCI_CAP_NO_MCMDLIST_NONQUEUE. 4176 * 4177 * For VT8251, software reset also has the same defect as the below 4178 * AMD/ATI chipset. That is, software reset will get failed if 0xf 4179 * is filled in pmport field. Therefore, another software reset need 4180 * to be done with 0 filled in pmport field. 4181 */ 4182 if (ahci_ctlp->ahcictl_venid == VIA_VENID) { 4183 revision = pci_config_get8(ahci_ctlp->ahcictl_pci_conf_handle, 4184 PCI_CONF_REVID); 4185 AHCIDBG(AHCIDBG_INIT, ahci_ctlp, 4186 "revision id = 0x%x", revision); 4187 if (revision == 0x00) { 4188 ahci_ctlp->ahcictl_buffer_dma_attr.dma_attr_align = 0x4; 4189 AHCIDBG(AHCIDBG_INIT, ahci_ctlp, 4190 "change ddi_attr_align to 0x4", NULL); 4191 } 4192 4193 ahci_ctlp->ahcictl_cap |= AHCI_CAP_NO_MCMDLIST_NONQUEUE; 4194 AHCIDBG(AHCIDBG_INIT, ahci_ctlp, 4195 "VT8251 cannot use multiple command lists for " 4196 "non-queued commands", NULL); 4197 4198 ahci_ctlp->ahcictl_cap |= AHCI_CAP_SRST_NO_HOSTPORT; 4199 } 4200 4201 /* 4202 * AMD/ATI SB600 (0x1002,0x4380) AHCI chipset doesn't support 64-bit 4203 * DMA addressing for communication memory descriptors though S64A bit 4204 * of CAP register declares it supports. Even though 64-bit DMA for 4205 * data buffer works on ASUS M2A-VM with newer BIOS, three other 4206 * motherboards are known not, so both AHCI_CAP_BUF_32BIT_DMA and 4207 * AHCI_CAP_COMMU_32BIT_DMA are set for this controller. 4208 * 4209 * Due to certain hardware issue, the chipset must do port reset during 4210 * initialization, otherwise, when retrieving device signature, 4211 * software reset will get time out. So AHCI_CAP_INIT_PORT_RESET flag 4212 * need to set. 4213 * 4214 * For this chipset software reset will get failure if the pmport of 4215 * Register FIS was set with SATA_PMULT_HOSTPORT (0xf) and no port 4216 * multiplier is connected to the port. In order to fix the issue, 4217 * AHCI_CAP_SRST_NO_HOSTPORT flag need to be set, and once software 4218 * reset got failure, the driver will try to do another software reset 4219 * with pmport 0. 4220 */ 4221 if (ahci_ctlp->ahcictl_venid == 0x1002 && 4222 ahci_ctlp->ahcictl_devid == 0x4380) { 4223 ahci_ctlp->ahcictl_cap |= AHCI_CAP_BUF_32BIT_DMA; 4224 ahci_ctlp->ahcictl_cap |= AHCI_CAP_COMMU_32BIT_DMA; 4225 ahci_ctlp->ahcictl_cap |= AHCI_CAP_INIT_PORT_RESET; 4226 ahci_ctlp->ahcictl_cap |= AHCI_CAP_SRST_NO_HOSTPORT; 4227 4228 AHCIDBG(AHCIDBG_INIT, ahci_ctlp, 4229 "ATI SB600 cannot do 64-bit DMA for both data buffer and " 4230 "communication memory descriptors though CAP indicates " 4231 "support, so force it to use 32-bit DMA", NULL); 4232 AHCIDBG(AHCIDBG_INIT, ahci_ctlp, 4233 "ATI SB600 need to do a port reset during initialization", 4234 NULL); 4235 AHCIDBG(AHCIDBG_INIT, ahci_ctlp, 4236 "ATI SB600 will get software reset failure if pmport " 4237 "is set 0xf and no port multiplier is attached", NULL); 4238 } 4239 4240 /* 4241 * AMD/ATI SB700/710/750/800 and SP5100 AHCI chipset share the same 4242 * vendor ID and device ID (0x1002,0x4391). 4243 * 4244 * SB700/750 AHCI chipset on some boards doesn't support 64-bit 4245 * DMA addressing for communication memory descriptors though S64A bit 4246 * of CAP register declares the support. However, it does support 4247 * 64-bit DMA for data buffer. So only AHCI_CAP_COMMU_32BIT_DMA is 4248 * set for this controller. 4249 * 4250 * SB710 has the same initialization issue as SB600, so it also need 4251 * a port reset. That is AHCI_CAP_INIT_PORT_RESET need to set for it. 4252 * 4253 * SB700 also has the same issue about software reset, and thus 4254 * AHCI_CAP_SRST_NO_HOSTPORT flag also is needed. 4255 */ 4256 if (ahci_ctlp->ahcictl_venid == 0x1002 && 4257 ahci_ctlp->ahcictl_devid == 0x4391) { 4258 ahci_ctlp->ahcictl_cap |= AHCI_CAP_COMMU_32BIT_DMA; 4259 ahci_ctlp->ahcictl_cap |= AHCI_CAP_INIT_PORT_RESET; 4260 ahci_ctlp->ahcictl_cap |= AHCI_CAP_SRST_NO_HOSTPORT; 4261 4262 AHCIDBG(AHCIDBG_INIT, ahci_ctlp, 4263 "ATI SB700/750 cannot do 64-bit DMA for communication " 4264 "memory descriptors though CAP indicates support, " 4265 "so force it to use 32-bit DMA", NULL); 4266 AHCIDBG(AHCIDBG_INIT, ahci_ctlp, 4267 "ATI SB710 need to do a port reset during initialization", 4268 NULL); 4269 AHCIDBG(AHCIDBG_INIT, ahci_ctlp, 4270 "ATI SB700 will get software reset failure if pmport " 4271 "is set 0xf and no port multiplier is attached", NULL); 4272 } 4273 4274 /* 4275 * Check if capabilities list is supported and if so, 4276 * get initial capabilities pointer and clear bits 0,1. 4277 */ 4278 if (pci_config_get16(ahci_ctlp->ahcictl_pci_conf_handle, 4279 PCI_CONF_STAT) & PCI_STAT_CAP) { 4280 caps_ptr = P2ALIGN(pci_config_get8( 4281 ahci_ctlp->ahcictl_pci_conf_handle, 4282 PCI_CONF_CAP_PTR), 4); 4283 } else { 4284 caps_ptr = PCI_CAP_NEXT_PTR_NULL; 4285 } 4286 4287 /* 4288 * Walk capabilities if supported. 4289 */ 4290 for (cap_count = 0; caps_ptr != PCI_CAP_NEXT_PTR_NULL; ) { 4291 4292 /* 4293 * Check that we haven't exceeded the maximum number of 4294 * capabilities and that the pointer is in a valid range. 4295 */ 4296 if (++cap_count > PCI_CAP_MAX_PTR) { 4297 AHCIDBG(AHCIDBG_ERRS, ahci_ctlp, 4298 "too many device capabilities", NULL); 4299 return (AHCI_FAILURE); 4300 } 4301 if (caps_ptr < PCI_CAP_PTR_OFF) { 4302 AHCIDBG(AHCIDBG_ERRS, ahci_ctlp, 4303 "capabilities pointer 0x%x out of range", 4304 caps_ptr); 4305 return (AHCI_FAILURE); 4306 } 4307 4308 /* 4309 * Get next capability and check that it is valid. 4310 * For now, we only support power management. 4311 */ 4312 cap = pci_config_get8(ahci_ctlp->ahcictl_pci_conf_handle, 4313 caps_ptr); 4314 switch (cap) { 4315 case PCI_CAP_ID_PM: 4316 4317 /* power management supported */ 4318 ahci_ctlp->ahcictl_cap |= AHCI_CAP_PM; 4319 4320 /* Save PMCSR offset */ 4321 ahci_ctlp->ahcictl_pmcsr_offset = caps_ptr + PCI_PMCSR; 4322 4323 #if AHCI_DEBUG 4324 pmcap = pci_config_get16( 4325 ahci_ctlp->ahcictl_pci_conf_handle, 4326 caps_ptr + PCI_PMCAP); 4327 pmcsr = pci_config_get16( 4328 ahci_ctlp->ahcictl_pci_conf_handle, 4329 ahci_ctlp->ahcictl_pmcsr_offset); 4330 AHCIDBG(AHCIDBG_PM, ahci_ctlp, 4331 "Power Management capability found PCI_PMCAP " 4332 "= 0x%x PCI_PMCSR = 0x%x", pmcap, pmcsr); 4333 if ((pmcap & 0x3) == 0x3) 4334 AHCIDBG(AHCIDBG_PM, ahci_ctlp, 4335 "PCI Power Management Interface " 4336 "spec 1.2 compliant", NULL); 4337 #endif 4338 break; 4339 4340 case PCI_CAP_ID_MSI: 4341 #if AHCI_DEBUG 4342 msimc = pci_config_get16( 4343 ahci_ctlp->ahcictl_pci_conf_handle, 4344 caps_ptr + PCI_MSI_CTRL); 4345 AHCIDBG(AHCIDBG_MSI, ahci_ctlp, 4346 "Message Signaled Interrupt capability found " 4347 "MSICAP_MC.MMC = 0x%x", (msimc & 0xe) >> 1); 4348 #endif 4349 AHCIDBG(AHCIDBG_MSI, ahci_ctlp, 4350 "MSI capability found", NULL); 4351 break; 4352 4353 case PCI_CAP_ID_PCIX: 4354 AHCIDBG(AHCIDBG_PM, ahci_ctlp, 4355 "PCI-X capability found", NULL); 4356 break; 4357 4358 case PCI_CAP_ID_PCI_E: 4359 AHCIDBG(AHCIDBG_PM, ahci_ctlp, 4360 "PCI Express capability found", NULL); 4361 break; 4362 4363 case PCI_CAP_ID_MSI_X: 4364 AHCIDBG(AHCIDBG_PM, ahci_ctlp, 4365 "MSI-X capability found", NULL); 4366 break; 4367 4368 case PCI_CAP_ID_SATA: 4369 AHCIDBG(AHCIDBG_PM, ahci_ctlp, 4370 "SATA capability found", NULL); 4371 break; 4372 4373 case PCI_CAP_ID_VS: 4374 AHCIDBG(AHCIDBG_PM, ahci_ctlp, 4375 "Vendor Specific capability found", NULL); 4376 break; 4377 4378 default: 4379 AHCIDBG(AHCIDBG_PM, ahci_ctlp, 4380 "unrecognized capability 0x%x", cap); 4381 break; 4382 } 4383 4384 /* 4385 * Get next capabilities pointer and clear bits 0,1. 4386 */ 4387 caps_ptr = P2ALIGN(pci_config_get8( 4388 ahci_ctlp->ahcictl_pci_conf_handle, 4389 (caps_ptr + PCI_CAP_NEXT_PTR)), 4); 4390 } 4391 4392 return (AHCI_SUCCESS); 4393 } 4394 4395 /* 4396 * Read/Write a register at port multiplier by SATA READ PORTMULT / SATA WRITE 4397 * PORTMULT command. SYNC & POLLING mode is used. 4398 */ 4399 static int 4400 ahci_rdwr_pmult(ahci_ctl_t *ahci_ctlp, ahci_addr_t *addrp, 4401 uint8_t regn, uint32_t *pregv, uint8_t type) 4402 { 4403 ahci_port_t *ahci_portp; 4404 ahci_addr_t pmult_addr; 4405 sata_pkt_t *spkt; 4406 sata_cmd_t *scmd; 4407 sata_device_t sata_device; 4408 uint8_t port = addrp->aa_port; 4409 uint8_t pmport = addrp->aa_pmport; 4410 uint8_t cport; 4411 uint32_t intr_mask; 4412 int rval; 4413 char portstr[10]; 4414 4415 SET_PORTSTR(portstr, addrp); 4416 cport = ahci_ctlp->ahcictl_port_to_cport[port]; 4417 ahci_portp = ahci_ctlp->ahcictl_ports[port]; 4418 4419 ASSERT(AHCI_ADDR_IS_PMPORT(addrp) || AHCI_ADDR_IS_PMULT(addrp)); 4420 ASSERT(MUTEX_HELD(&ahci_portp->ahciport_mutex)); 4421 4422 /* Check the existence of the port multiplier */ 4423 if (ahci_portp->ahciport_device_type != SATA_DTYPE_PMULT) 4424 return (AHCI_FAILURE); 4425 4426 /* Request a READ/WRITE PORTMULT sata packet. */ 4427 bzero(&sata_device, sizeof (sata_device_t)); 4428 sata_device.satadev_addr.cport = cport; 4429 sata_device.satadev_addr.pmport = pmport; 4430 sata_device.satadev_addr.qual = SATA_ADDR_PMULT; 4431 sata_device.satadev_rev = SATA_DEVICE_REV; 4432 4433 /* 4434 * Make sure no command is outstanding here. All R/W PMULT requests 4435 * come from 4436 * 4437 * 1. ahci_attach() 4438 * The port should be empty. 4439 * 4440 * 2. ahci_tran_probe_port() 4441 * Any request from SATA framework (via ahci_tran_start) should be 4442 * rejected if R/W PMULT command is outstanding. 4443 * 4444 * If we are doing mopping, do not check those flags because no 4445 * command will be actually outstanding. 4446 * 4447 * If the port has been occupied by any other commands, the probe 4448 * function will return a SATA_RETRY. SATA framework will retry 4449 * later. 4450 */ 4451 if (RDWR_PMULT_CMD_IN_PROGRESS(ahci_portp)) { 4452 AHCIDBG(AHCIDBG_ERRS|AHCIDBG_PMULT, ahci_ctlp, 4453 "R/W PMULT failed: R/W PMULT in progress at port %d.", 4454 port, ahci_portp->ahciport_flags); 4455 return (AHCI_FAILURE); 4456 } 4457 4458 if (!(ahci_portp->ahciport_flags & AHCI_PORT_FLAG_MOPPING) && ( 4459 ERR_RETRI_CMD_IN_PROGRESS(ahci_portp) || 4460 NCQ_CMD_IN_PROGRESS(ahci_portp) || 4461 NON_NCQ_CMD_IN_PROGRESS(ahci_portp))) { 4462 AHCIDBG(AHCIDBG_ERRS|AHCIDBG_PMULT, ahci_ctlp, 4463 "R/W PMULT failed: port %d is occupied (flags 0x%x).", 4464 port, ahci_portp->ahciport_flags); 4465 return (AHCI_FAILURE); 4466 } 4467 4468 /* 4469 * The port multiplier is gone. This may happen when 4470 * 1. Cutting off the power of an enclosure. The device lose the power 4471 * before port multiplier. 4472 * 2. Disconnecting the port multiplier during hot-plugging a sub-drive. 4473 * 4474 * The issued command should be aborted and the following command 4475 * should not be continued. 4476 */ 4477 if (!(ahci_portp->ahciport_port_state & SATA_STATE_READY)) { 4478 AHCIDBG(AHCIDBG_ERRS|AHCIDBG_PMULT, ahci_ctlp, 4479 "READ/WRITE PMULT failed: " 4480 "port-mult is removed from port %d", port); 4481 return (AHCI_FAILURE); 4482 } 4483 4484 ahci_portp->ahciport_flags |= AHCI_PORT_FLAG_RDWR_PMULT; 4485 4486 spkt = sata_get_rdwr_pmult_pkt(ahci_ctlp->ahcictl_dip, 4487 &sata_device, regn, *pregv, type); 4488 4489 /* 4490 * READ/WRITE PORTMULT command is intended to sent to the control port 4491 * of the port multiplier. 4492 */ 4493 AHCI_ADDR_SET_PMULT(&pmult_addr, addrp->aa_port); 4494 4495 ahci_portp->ahciport_rdwr_pmult_pkt = spkt; 4496 4497 /* No interrupt here. Store the interrupt enable mask. */ 4498 intr_mask = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 4499 (uint32_t *)AHCI_PORT_PxIE(ahci_ctlp, port)); 4500 ddi_put32(ahci_ctlp->ahcictl_ahci_acc_handle, 4501 (uint32_t *)AHCI_PORT_PxIE(ahci_ctlp, port), 0); 4502 4503 rval = ahci_do_sync_start(ahci_ctlp, ahci_portp, &pmult_addr, spkt); 4504 4505 if (rval == AHCI_SUCCESS && 4506 spkt->satapkt_reason == SATA_PKT_COMPLETED) { 4507 if (type == SATA_RDWR_PMULT_PKT_TYPE_READ) { 4508 scmd = &spkt->satapkt_cmd; 4509 *pregv = scmd->satacmd_lba_high_lsb << 24 | 4510 scmd->satacmd_lba_mid_lsb << 16 | 4511 scmd->satacmd_lba_low_lsb << 8 | 4512 scmd->satacmd_sec_count_lsb; 4513 } 4514 } else { 4515 /* Failed or not completed. */ 4516 AHCIDBG(AHCIDBG_ERRS|AHCIDBG_PMULT, ahci_ctlp, 4517 "ahci_rdwr_pmult: cannot [%s] %s[%d] at port %s", 4518 type == SATA_RDWR_PMULT_PKT_TYPE_READ?"Read":"Write", 4519 AHCI_ADDR_IS_PMULT(addrp)?"gscr":"pscr", regn, portstr); 4520 rval = AHCI_FAILURE; 4521 } 4522 out: 4523 /* Restore the interrupt mask */ 4524 ddi_put32(ahci_ctlp->ahcictl_ahci_acc_handle, 4525 (uint32_t *)AHCI_PORT_PxIE(ahci_ctlp, port), intr_mask); 4526 4527 ahci_portp->ahciport_flags &= ~AHCI_PORT_FLAG_RDWR_PMULT; 4528 ahci_portp->ahciport_rdwr_pmult_pkt = NULL; 4529 sata_free_rdwr_pmult_pkt(spkt); 4530 return (rval); 4531 } 4532 4533 static int 4534 ahci_read_pmult(ahci_ctl_t *ahci_ctlp, ahci_addr_t *addrp, 4535 uint8_t regn, uint32_t *pregv) 4536 { 4537 return ahci_rdwr_pmult(ahci_ctlp, addrp, regn, pregv, 4538 SATA_RDWR_PMULT_PKT_TYPE_READ); 4539 } 4540 4541 static int 4542 ahci_write_pmult(ahci_ctl_t *ahci_ctlp, ahci_addr_t *addrp, 4543 uint8_t regn, uint32_t regv) 4544 { 4545 return ahci_rdwr_pmult(ahci_ctlp, addrp, regn, ®v, 4546 SATA_RDWR_PMULT_PKT_TYPE_WRITE); 4547 } 4548 4549 #define READ_PMULT(addrp, r, pv, out) \ 4550 if (ahci_read_pmult(ahci_ctlp, addrp, r, pv) != AHCI_SUCCESS) \ 4551 goto out; 4552 4553 #define WRITE_PMULT(addrp, r, v, out) \ 4554 if (ahci_write_pmult(ahci_ctlp, addrp, r, v) != AHCI_SUCCESS) \ 4555 goto out; 4556 4557 /* 4558 * Update sata registers on port multiplier, including GSCR/PSCR registers. 4559 * ahci_update_pmult_gscr() 4560 * ahci_update_pmult_pscr() 4561 */ 4562 static int 4563 ahci_update_pmult_gscr(ahci_ctl_t *ahci_ctlp, ahci_addr_t *addrp, 4564 sata_pmult_gscr_t *sg) 4565 { 4566 ASSERT(MUTEX_HELD( 4567 &ahci_ctlp->ahcictl_ports[addrp->aa_port]->ahciport_mutex)); 4568 4569 READ_PMULT(addrp, SATA_PMULT_GSCR0, &sg->gscr0, err); 4570 READ_PMULT(addrp, SATA_PMULT_GSCR1, &sg->gscr1, err); 4571 READ_PMULT(addrp, SATA_PMULT_GSCR2, &sg->gscr2, err); 4572 READ_PMULT(addrp, SATA_PMULT_GSCR64, &sg->gscr64, err); 4573 4574 return (AHCI_SUCCESS); 4575 4576 err: /* R/W PMULT error */ 4577 return (AHCI_FAILURE); 4578 } 4579 4580 static int 4581 ahci_update_pmult_pscr(ahci_ctl_t *ahci_ctlp, ahci_addr_t *addrp, 4582 sata_device_t *sd) 4583 { 4584 ASSERT(AHCI_ADDR_IS_PMPORT(addrp)); 4585 ASSERT(MUTEX_HELD( 4586 &ahci_ctlp->ahcictl_ports[addrp->aa_port]->ahciport_mutex)); 4587 4588 READ_PMULT(addrp, SATA_PMULT_REG_SSTS, &sd->satadev_scr.sstatus, err); 4589 READ_PMULT(addrp, SATA_PMULT_REG_SERR, &sd->satadev_scr.serror, err); 4590 READ_PMULT(addrp, SATA_PMULT_REG_SCTL, &sd->satadev_scr.scontrol, err); 4591 READ_PMULT(addrp, SATA_PMULT_REG_SACT, &sd->satadev_scr.sactive, err); 4592 4593 return (AHCI_SUCCESS); 4594 4595 err: /* R/W PMULT error */ 4596 return (AHCI_FAILURE); 4597 } 4598 4599 /* 4600 * ahci_initialize_pmult() 4601 * 4602 * Initialize a port multiplier, including 4603 * 1. Enable FEATURES register at port multiplier. (SATA Chp.16) 4604 * 2. Redefine MASK register. (SATA Chap 16.?) 4605 */ 4606 static int 4607 ahci_initialize_pmult(ahci_ctl_t *ahci_ctlp, ahci_port_t *ahci_portp, 4608 ahci_addr_t *addrp, sata_device_t *sd) 4609 { 4610 sata_pmult_gscr_t sg; 4611 uint32_t gscr64; 4612 uint8_t port = addrp->aa_port; 4613 4614 ASSERT(MUTEX_HELD(&ahci_portp->ahciport_mutex)); 4615 4616 AHCIDBG(AHCIDBG_INFO|AHCIDBG_PMULT, ahci_ctlp, 4617 "[Initialize] Port-multiplier at port %d.", port); 4618 4619 /* 4620 * Enable features of port multiplier. Currently only 4621 * Asynchronous Notification is enabled. 4622 */ 4623 /* Check gscr64 for supported features. */ 4624 READ_PMULT(addrp, SATA_PMULT_GSCR64, &gscr64, err); 4625 4626 if (gscr64 & SATA_PMULT_CAP_SNOTIF) { 4627 AHCIDBG(AHCIDBG_INFO|AHCIDBG_PMULT, ahci_ctlp, 4628 "port %d: Port Multiplier supports " 4629 "Asynchronous Notification.", port); 4630 4631 /* Write to gscr96 to enabled features */ 4632 WRITE_PMULT(addrp, SATA_PMULT_GSCR96, 4633 SATA_PMULT_CAP_SNOTIF, err); 4634 4635 ddi_put32(ahci_ctlp->ahcictl_ahci_acc_handle, 4636 (uint32_t *)AHCI_PORT_PxSNTF(ahci_ctlp, port), 4637 AHCI_SNOTIF_CLEAR_ALL); 4638 AHCIDBG(AHCIDBG_INFO|AHCIDBG_PMULT, ahci_ctlp, 4639 "port %d: PMult PxSNTF cleared.", port); 4640 4641 } 4642 4643 /* 4644 * Now we need to update gscr33 register to enable hot-plug interrupt 4645 * for sub devices behind port multiplier. 4646 */ 4647 WRITE_PMULT(addrp, SATA_PMULT_GSCR33, (0x1ffff), err); 4648 AHCIDBG(AHCIDBG_INFO|AHCIDBG_PMULT, ahci_ctlp, 4649 "port %d: gscr33 mask set to %x.", port, (0x1ffff)); 4650 4651 /* 4652 * Fetch the number of device ports of the port multiplier 4653 */ 4654 if (ahci_update_pmult_gscr(ahci_ctlp, addrp, &sg) != AHCI_SUCCESS) 4655 return (AHCI_FAILURE); 4656 4657 /* Register the port multiplier to SATA Framework. */ 4658 mutex_exit(&ahci_portp->ahciport_mutex); 4659 sata_register_pmult(ahci_ctlp->ahcictl_dip, sd, &sg); 4660 mutex_enter(&ahci_portp->ahciport_mutex); 4661 4662 ahci_portp->ahciport_pmult_info->ahcipmi_num_dev_ports = 4663 sd->satadev_add_info & SATA_PMULT_PORTNUM_MASK; 4664 4665 AHCIDBG(AHCIDBG_INFO|AHCIDBG_PMULT, ahci_ctlp, 4666 "port %d: pmult sub-port number updated to %x.", port, 4667 ahci_portp->ahciport_pmult_info->ahcipmi_num_dev_ports); 4668 4669 /* Till now port-mult is successfully initialized */ 4670 ahci_portp->ahciport_port_state |= SATA_DSTATE_PMULT_INIT; 4671 return (AHCI_SUCCESS); 4672 4673 err: /* R/W PMULT error */ 4674 return (AHCI_FAILURE); 4675 } 4676 4677 /* 4678 * Initialize a port multiplier port. According to spec, firstly we need 4679 * issue a COMRESET, then a software reset to get its signature. 4680 * 4681 * NOTE: This function should only be called in ahci_probe_pmport() 4682 */ 4683 static int 4684 ahci_initialize_pmport(ahci_ctl_t *ahci_ctlp, ahci_port_t *ahci_portp, 4685 ahci_addr_t *addrp) 4686 { 4687 uint32_t finished_tags = 0, reset_tags = 0, slot_status = 0; 4688 uint8_t port = addrp->aa_port; 4689 uint8_t pmport = addrp->aa_pmport; 4690 int ret = AHCI_FAILURE; 4691 4692 ASSERT(MUTEX_HELD(&ahci_portp->ahciport_mutex)); 4693 ASSERT(AHCI_ADDR_IS_PMPORT(addrp)); 4694 4695 AHCIDBG(AHCIDBG_INIT|AHCIDBG_ENTRY, ahci_ctlp, 4696 "ahci_initialize_pmport: port %d:%d", port, pmport); 4697 4698 /* Check HBA port state */ 4699 if (ahci_portp->ahciport_port_state & SATA_PSTATE_FAILED) { 4700 AHCIDBG(AHCIDBG_INIT|AHCIDBG_ERRS, ahci_ctlp, 4701 "ahci_initialize_pmport:" 4702 "port %d:%d Port Multiplier is failed.", 4703 port, pmport); 4704 return (AHCI_FAILURE); 4705 } 4706 4707 if (ahci_portp->ahciport_flags & AHCI_PORT_FLAG_HOTPLUG) { 4708 return (AHCI_FAILURE); 4709 } 4710 ahci_portp->ahciport_flags |= AHCI_PORT_FLAG_HOTPLUG; 4711 4712 /* Checking for outstanding commands */ 4713 if (NON_NCQ_CMD_IN_PROGRESS(ahci_portp)) { 4714 slot_status = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 4715 (uint32_t *)AHCI_PORT_PxCI(ahci_ctlp, port)); 4716 reset_tags = slot_status & AHCI_SLOT_MASK(ahci_ctlp); 4717 } else if (NCQ_CMD_IN_PROGRESS(ahci_portp)) { 4718 slot_status = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 4719 (uint32_t *)AHCI_PORT_PxSACT(ahci_ctlp, port)); 4720 reset_tags = slot_status & AHCI_NCQ_SLOT_MASK(ahci_portp); 4721 } 4722 4723 ahci_portp->ahciport_flags |= AHCI_PORT_FLAG_MOPPING; 4724 ahci_portp->ahciport_mop_in_progress++; 4725 4726 /* Clear status */ 4727 AHCIPORT_SET_STATE(ahci_portp, addrp, SATA_STATE_UNKNOWN); 4728 4729 /* Firstly assume an unknown device */ 4730 AHCIPORT_SET_DEV_TYPE(ahci_portp, addrp, SATA_DTYPE_UNKNOWN); 4731 4732 ahci_disable_port_intrs(ahci_ctlp, port); 4733 4734 /* port reset is necessary for port multiplier port */ 4735 if (ahci_pmport_reset(ahci_ctlp, ahci_portp, addrp) != AHCI_SUCCESS) { 4736 AHCIDBG(AHCIDBG_INIT|AHCIDBG_ERRS, ahci_ctlp, 4737 "ahci_initialize_pmport:" 4738 "port reset failed at port %d:%d", 4739 port, pmport); 4740 goto out; 4741 } 4742 4743 /* Is port failed? */ 4744 if (AHCIPORT_GET_STATE(ahci_portp, addrp) & 4745 SATA_PSTATE_FAILED) { 4746 AHCIDBG(AHCIDBG_ERRS, ahci_ctlp, 4747 "ahci_initialize_pmport: port %d:%d failed. " 4748 "state = 0x%x", port, pmport, 4749 ahci_portp->ahciport_port_state); 4750 goto out; 4751 } 4752 4753 /* Is there any device attached? */ 4754 if (AHCIPORT_GET_DEV_TYPE(ahci_portp, addrp) 4755 == SATA_DTYPE_NONE) { 4756 /* Do not waste time on an empty port */ 4757 AHCIDBG(AHCIDBG_INFO, ahci_ctlp, 4758 "ahci_initialize_pmport: No device is found " 4759 "at port %d:%d", port, pmport); 4760 ret = AHCI_SUCCESS; 4761 goto out; 4762 } 4763 4764 AHCIPORT_SET_STATE(ahci_portp, addrp, SATA_STATE_READY); 4765 AHCIDBG(AHCIDBG_INIT, ahci_ctlp, 4766 "port %d:%d is ready now.", port, pmport); 4767 4768 /* 4769 * Till now we can assure a device attached to that HBA port and work 4770 * correctly. Now try to get the device signature. This is an optional 4771 * step. If failed, unknown device is assumed, then SATA module will 4772 * continue to use IDENTIFY DEVICE to get the information of the 4773 * device. 4774 */ 4775 ahci_find_dev_signature(ahci_ctlp, ahci_portp, addrp); 4776 4777 ret = AHCI_SUCCESS; 4778 4779 out: 4780 /* Next try to mop the pending commands */ 4781 if (NON_NCQ_CMD_IN_PROGRESS(ahci_portp)) 4782 finished_tags = ahci_portp->ahciport_pending_tags & 4783 ~slot_status & AHCI_SLOT_MASK(ahci_ctlp); 4784 else if (NCQ_CMD_IN_PROGRESS(ahci_portp)) 4785 finished_tags = ahci_portp->ahciport_pending_ncq_tags & 4786 ~slot_status & AHCI_NCQ_SLOT_MASK(ahci_portp); 4787 reset_tags &= ~finished_tags; 4788 4789 ahci_mop_commands(ahci_ctlp, 4790 ahci_portp, 4791 slot_status, 4792 0, /* failed tags */ 4793 0, /* timeout tags */ 4794 0, /* aborted tags */ 4795 reset_tags); /* reset tags */ 4796 4797 /* Clear PxSNTF register if supported. */ 4798 if (ahci_ctlp->ahcictl_cap & AHCI_CAP_SNTF) { 4799 ddi_put32(ahci_ctlp->ahcictl_ahci_acc_handle, 4800 (uint32_t *)AHCI_PORT_PxSNTF(ahci_ctlp, port), 4801 AHCI_SNOTIF_CLEAR_ALL); 4802 } 4803 4804 ahci_portp->ahciport_flags &= ~AHCI_PORT_FLAG_HOTPLUG; 4805 ahci_enable_port_intrs(ahci_ctlp, port); 4806 return (ret); 4807 } 4808 4809 /* 4810 * ahci_probe_pmult() 4811 * 4812 * This function will be called to probe a port multiplier, which will 4813 * handle hotplug events on port multiplier ports. 4814 * 4815 * NOTE: Only called from ahci_tran_probe_port() 4816 */ 4817 static int 4818 ahci_probe_pmult(ahci_ctl_t *ahci_ctlp, ahci_port_t *ahci_portp, 4819 ahci_addr_t *addrp) 4820 { 4821 sata_device_t sdevice; 4822 ahci_addr_t pmport_addr; 4823 uint32_t gscr32, port_hotplug_tags; 4824 uint32_t pmport_sstatus; 4825 int dev_exists_now = 0, dev_existed_previously = 0; 4826 uint8_t port = addrp->aa_port; 4827 int npmport; 4828 4829 ASSERT(MUTEX_HELD(&ahci_portp->ahciport_mutex)); 4830 4831 /* The bits in GSCR32 refers to the pmport that has a hot-plug event. */ 4832 READ_PMULT(addrp, SATA_PMULT_GSCR32, &gscr32, err); 4833 port_hotplug_tags = gscr32 & AHCI_PMPORT_MASK(ahci_portp); 4834 4835 do { 4836 npmport = ddi_ffs(port_hotplug_tags) - 1; 4837 if (npmport == -1) 4838 /* no pending hot plug events. */ 4839 return (AHCI_SUCCESS); 4840 4841 AHCIDBG(AHCIDBG_EVENT|AHCIDBG_PMULT, ahci_ctlp, 4842 "hot-plug event at port %d:%d", port, npmport); 4843 4844 AHCI_ADDR_SET_PMPORT(&pmport_addr, port, (uint8_t)npmport); 4845 4846 /* Check previous device at that port */ 4847 if (AHCIPORT_GET_DEV_TYPE(ahci_portp, &pmport_addr) 4848 != SATA_DTYPE_NONE) 4849 dev_existed_previously = 1; 4850 4851 /* PxSStatus tells the presence of device. */ 4852 READ_PMULT(&pmport_addr, SATA_PMULT_REG_SSTS, 4853 &pmport_sstatus, err); 4854 4855 if (SSTATUS_GET_DET(pmport_sstatus) == 4856 SSTATUS_DET_DEVPRE_PHYCOM) 4857 dev_exists_now = 1; 4858 4859 /* 4860 * Clear PxSERR is critical. The transition from 0 to 1 will 4861 * emit a FIS which generates an asynchronous notification 4862 * event at controller. If we fail to clear the PxSERR, the 4863 * Async Notif events will no longer be activated on this 4864 * pmport. 4865 */ 4866 WRITE_PMULT(&pmport_addr, SATA_PMULT_REG_SERR, 4867 AHCI_SERROR_CLEAR_ALL, err); 4868 4869 bzero((void *)&sdevice, sizeof (sata_device_t)); 4870 sdevice.satadev_addr.cport = ahci_ctlp-> 4871 ahcictl_port_to_cport[port]; 4872 sdevice.satadev_addr.qual = SATA_ADDR_PMPORT; 4873 sdevice.satadev_addr.pmport = (uint8_t)npmport; 4874 sdevice.satadev_state = SATA_PSTATE_PWRON; 4875 4876 AHCIDBG(AHCIDBG_EVENT|AHCIDBG_PMULT, ahci_ctlp, 4877 "[Existence] %d -> %d", dev_existed_previously, 4878 dev_exists_now); 4879 4880 if (dev_exists_now) { 4881 if (dev_existed_previously) { 4882 /* Link (may) not change: Exist -> Exist * */ 4883 AHCIDBG(AHCIDBG_EVENT, ahci_ctlp, 4884 "ahci_probe_pmult: port %d:%d " 4885 "device link lost/established", 4886 port, npmport); 4887 4888 mutex_exit(&ahci_portp->ahciport_mutex); 4889 sata_hba_event_notify( 4890 ahci_ctlp->ahcictl_sata_hba_tran-> 4891 sata_tran_hba_dip, 4892 &sdevice, 4893 SATA_EVNT_LINK_LOST| 4894 SATA_EVNT_LINK_ESTABLISHED); 4895 mutex_enter(&ahci_portp->ahciport_mutex); 4896 } else { 4897 /* Link change: None -> Exist */ 4898 AHCIDBG(AHCIDBG_EVENT|AHCIDBG_PMULT, ahci_ctlp, 4899 "ahci_probe_pmult: port %d:%d " 4900 "device link established", port, npmport); 4901 4902 /* Clear port state */ 4903 AHCIPORT_SET_STATE(ahci_portp, &pmport_addr, 4904 SATA_STATE_UNKNOWN); 4905 AHCIDBG(AHCIDBG_EVENT|AHCIDBG_PMULT, ahci_ctlp, 4906 "ahci_probe_pmult: port %d " 4907 "ahciport_port_state [Cleared].", port); 4908 4909 mutex_exit(&ahci_portp->ahciport_mutex); 4910 sata_hba_event_notify( 4911 ahci_ctlp->ahcictl_sata_hba_tran-> 4912 sata_tran_hba_dip, 4913 &sdevice, 4914 SATA_EVNT_LINK_ESTABLISHED); 4915 mutex_enter(&ahci_portp->ahciport_mutex); 4916 } 4917 } else { /* No device exists now */ 4918 if (dev_existed_previously) { 4919 4920 /* Link change: Exist -> None */ 4921 AHCIDBG(AHCIDBG_EVENT|AHCIDBG_PMULT, ahci_ctlp, 4922 "ahci_probe_pmult: port %d:%d " 4923 "device link lost", port, npmport); 4924 4925 /* An existing device is lost. */ 4926 AHCIPORT_SET_STATE(ahci_portp, &pmport_addr, 4927 SATA_STATE_UNKNOWN); 4928 AHCIPORT_SET_DEV_TYPE(ahci_portp, &pmport_addr, 4929 SATA_DTYPE_NONE); 4930 4931 mutex_exit(&ahci_portp->ahciport_mutex); 4932 sata_hba_event_notify( 4933 ahci_ctlp->ahcictl_sata_hba_tran-> 4934 sata_tran_hba_dip, 4935 &sdevice, 4936 SATA_EVNT_LINK_LOST); 4937 mutex_enter(&ahci_portp->ahciport_mutex); 4938 } 4939 } 4940 4941 CLEAR_BIT(port_hotplug_tags, npmport); 4942 } while (port_hotplug_tags != 0); 4943 4944 return (AHCI_SUCCESS); 4945 4946 err: /* R/W PMULT error */ 4947 return (AHCI_FAILURE); 4948 } 4949 4950 /* 4951 * Probe and initialize a port multiplier port. 4952 * A port multiplier port could only be initilaizer here. 4953 */ 4954 static int 4955 ahci_probe_pmport(ahci_ctl_t *ahci_ctlp, ahci_port_t *ahci_portp, 4956 ahci_addr_t *addrp, sata_device_t *sd) 4957 { 4958 uint32_t port_state; 4959 uint8_t port = addrp->aa_port; 4960 ahci_addr_t addr_pmult; 4961 4962 ASSERT(MUTEX_HELD(&ahci_portp->ahciport_mutex)); 4963 4964 /* 4965 * Check the parent - port multiplier first. 4966 */ 4967 4968 /* 4969 * Parent port multiplier might have been removed. This event will be 4970 * ignored and failure. 4971 */ 4972 if (ahci_portp->ahciport_device_type == SATA_DTYPE_NONE || 4973 ahci_portp->ahciport_device_type != SATA_DTYPE_PMULT) { 4974 AHCIDBG(AHCIDBG_ERRS|AHCIDBG_PMULT, ahci_ctlp, 4975 "ahci_tran_probe_port: " 4976 "parent device removed, ignore event.", NULL); 4977 4978 return (AHCI_FAILURE); 4979 } 4980 4981 /* The port is ready? */ 4982 port_state = ahci_portp->ahciport_port_state; 4983 if (!(port_state & SATA_STATE_READY)) { 4984 AHCIDBG(AHCIDBG_ERRS|AHCIDBG_PMULT, ahci_ctlp, 4985 "ahci_tran_probe_port: " 4986 "parent port-mult is NOT ready.", NULL); 4987 4988 if (ahci_restart_port_wait_till_ready(ahci_ctlp, 4989 ahci_portp, port, AHCI_PORT_RESET, NULL) != 4990 AHCI_SUCCESS) { 4991 AHCIDBG(AHCIDBG_ERRS|AHCIDBG_PMULT, ahci_ctlp, 4992 "ahci_tran_probe_port: " 4993 "restart port-mult failed.", NULL); 4994 return (AHCI_FAILURE); 4995 } 4996 } 4997 4998 /* 4999 * If port-mult is restarted due to some reason, we need 5000 * re-initialized the PMult. 5001 */ 5002 if (!(port_state & SATA_DSTATE_PMULT_INIT)) { 5003 /* Initialize registers on a port multiplier */ 5004 AHCI_ADDR_SET_PMULT(&addr_pmult, addrp->aa_port); 5005 if (ahci_initialize_pmult(ahci_ctlp, ahci_portp, 5006 &addr_pmult, sd) != AHCI_SUCCESS) 5007 return (AHCI_FAILURE); 5008 } 5009 5010 /* 5011 * Then we check the port-mult port 5012 */ 5013 /* Is this pmport initialized? */ 5014 port_state = AHCIPORT_GET_STATE(ahci_portp, addrp); 5015 if (!(port_state & SATA_STATE_READY)) { 5016 5017 /* ahci_initialize_pmport() will set READY state */ 5018 if (ahci_initialize_pmport(ahci_ctlp, 5019 ahci_portp, addrp) != AHCI_SUCCESS) 5020 return (AHCI_FAILURE); 5021 } 5022 5023 return (AHCI_SUCCESS); 5024 } 5025 5026 /* 5027 * AHCI device reset ...; a single device on one of the ports is reset, 5028 * but the HBA and physical communication remain intact. This is the 5029 * least intrusive. 5030 * 5031 * When issuing a software reset sequence, there should not be other 5032 * commands in the command list, so we will first clear and then re-set 5033 * PxCMD.ST to clear PxCI. And before issuing the software reset, 5034 * the port must be idle and PxTFD.STS.BSY and PxTFD.STS.DRQ must be 5035 * cleared unless command list override (PxCMD.CLO) is supported. 5036 */ 5037 static int 5038 ahci_software_reset(ahci_ctl_t *ahci_ctlp, ahci_port_t *ahci_portp, 5039 ahci_addr_t *addrp) 5040 { 5041 ahci_fis_h2d_register_t *h2d_register_fisp; 5042 ahci_cmd_table_t *cmd_table; 5043 ahci_cmd_header_t *cmd_header; 5044 uint32_t port_cmd_status, port_cmd_issue, port_task_file; 5045 int slot, loop_count; 5046 uint8_t port = addrp->aa_port; 5047 uint8_t pmport = addrp->aa_pmport; 5048 int rval = AHCI_FAILURE; 5049 5050 ASSERT(MUTEX_HELD(&ahci_portp->ahciport_mutex)); 5051 5052 AHCIDBG(AHCIDBG_ENTRY, ahci_ctlp, 5053 "port %d:%d device software resetting (FIS)", port, pmport); 5054 5055 /* First clear PxCMD.ST (AHCI v1.2 10.4.1) */ 5056 if (ahci_put_port_into_notrunning_state(ahci_ctlp, ahci_portp, 5057 port) != AHCI_SUCCESS) { 5058 AHCIDBG(AHCIDBG_ERRS, ahci_ctlp, 5059 "ahci_software_reset: cannot stop HBA port %d.", port); 5060 goto out; 5061 } 5062 5063 /* Check PxTFD.STS.BSY and PxTFD.STS.DRQ */ 5064 port_task_file = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 5065 (uint32_t *)AHCI_PORT_PxTFD(ahci_ctlp, port)); 5066 5067 if (port_task_file & AHCI_TFD_STS_BSY || 5068 port_task_file & AHCI_TFD_STS_DRQ) { 5069 if (!(ahci_ctlp->ahcictl_cap & AHCI_CAP_SCLO)) { 5070 AHCIDBG(AHCIDBG_ERRS, ahci_ctlp, 5071 "PxTFD.STS.BSY/DRQ is set (PxTFD=0x%x), " 5072 "cannot issue a software reset.", port_task_file); 5073 goto out; 5074 } 5075 5076 /* 5077 * If HBA Support CLO, as Command List Override (CAP.SCLO is 5078 * set), PxCMD.CLO bit should be set before set PxCMD.ST, in 5079 * order to clear PxTFD.STS.BSY and PxTFD.STS.DRQ. 5080 */ 5081 AHCIDBG(AHCIDBG_ERRS, ahci_ctlp, 5082 "PxTFD.STS.BSY/DRQ is set, try SCLO.", NULL) 5083 5084 port_cmd_status = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 5085 (uint32_t *)AHCI_PORT_PxCMD(ahci_ctlp, port)); 5086 ddi_put32(ahci_ctlp->ahcictl_ahci_acc_handle, 5087 (uint32_t *)AHCI_PORT_PxCMD(ahci_ctlp, port), 5088 port_cmd_status|AHCI_CMD_STATUS_CLO); 5089 5090 /* Waiting till PxCMD.SCLO bit is cleared */ 5091 loop_count = 0; 5092 do { 5093 /* Wait for 10 millisec */ 5094 drv_usecwait(AHCI_10MS_USECS); 5095 5096 /* We are effectively timing out after 1 sec. */ 5097 if (loop_count++ > 100) { 5098 AHCIDBG(AHCIDBG_ERRS, ahci_ctlp, 5099 "SCLO time out. port %d is busy.", port); 5100 goto out; 5101 } 5102 5103 port_cmd_status = 5104 ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 5105 (uint32_t *)AHCI_PORT_PxCMD(ahci_ctlp, port)); 5106 } while (port_cmd_status & AHCI_CMD_STATUS_CLO); 5107 5108 /* Re-check */ 5109 port_task_file = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 5110 (uint32_t *)AHCI_PORT_PxTFD(ahci_ctlp, port)); 5111 if (port_task_file & AHCI_TFD_STS_BSY || 5112 port_task_file & AHCI_TFD_STS_DRQ) { 5113 AHCIDBG(AHCIDBG_ERRS, ahci_ctlp, 5114 "SCLO cannot clear PxTFD.STS.BSY/DRQ (PxTFD=0x%x)", 5115 port_task_file); 5116 goto out; 5117 } 5118 } 5119 5120 /* Then start port */ 5121 if (ahci_start_port(ahci_ctlp, ahci_portp, port) 5122 != AHCI_SUCCESS) { 5123 AHCIDBG(AHCIDBG_ERRS, ahci_ctlp, 5124 "ahci_software_reset: cannot start AHCI port %d.", port); 5125 goto out; 5126 } 5127 5128 /* 5129 * When ahci_port.ahciport_mop_in_progress is set, A non-zero 5130 * ahci_port.ahciport_pending_ncq_tags may fail 5131 * ahci_claim_free_slot(). Actually according to spec, by clearing 5132 * PxCMD.ST there is no command outstanding while executing software 5133 * reseting. Hence we directly use slot 0 instead of 5134 * ahci_claim_free_slot(). 5135 */ 5136 slot = 0; 5137 5138 /* Now send the first H2D Register FIS with SRST set to 1 */ 5139 cmd_table = ahci_portp->ahciport_cmd_tables[slot]; 5140 bzero((void *)cmd_table, ahci_cmd_table_size); 5141 5142 h2d_register_fisp = 5143 &(cmd_table->ahcict_command_fis.ahcifc_fis.ahcifc_h2d_register); 5144 5145 SET_FIS_TYPE(h2d_register_fisp, AHCI_H2D_REGISTER_FIS_TYPE); 5146 SET_FIS_PMP(h2d_register_fisp, pmport); 5147 SET_FIS_DEVCTL(h2d_register_fisp, SATA_DEVCTL_SRST); 5148 5149 /* Set Command Header in Command List */ 5150 cmd_header = &ahci_portp->ahciport_cmd_list[slot]; 5151 BZERO_DESCR_INFO(cmd_header); 5152 BZERO_PRD_BYTE_COUNT(cmd_header); 5153 SET_COMMAND_FIS_LENGTH(cmd_header, 5); 5154 SET_PORT_MULTI_PORT(cmd_header, pmport); 5155 5156 SET_CLEAR_BUSY_UPON_R_OK(cmd_header, 1); 5157 SET_RESET(cmd_header, 1); 5158 SET_WRITE(cmd_header, 1); 5159 5160 (void) ddi_dma_sync(ahci_portp->ahciport_cmd_tables_dma_handle[slot], 5161 0, 5162 ahci_cmd_table_size, 5163 DDI_DMA_SYNC_FORDEV); 5164 5165 (void) ddi_dma_sync(ahci_portp->ahciport_cmd_list_dma_handle, 5166 slot * sizeof (ahci_cmd_header_t), 5167 sizeof (ahci_cmd_header_t), 5168 DDI_DMA_SYNC_FORDEV); 5169 5170 /* Indicate to the HBA that a command is active. */ 5171 ddi_put32(ahci_ctlp->ahcictl_ahci_acc_handle, 5172 (uint32_t *)AHCI_PORT_PxCI(ahci_ctlp, port), 5173 (0x1 << slot)); 5174 5175 loop_count = 0; 5176 5177 /* Loop till the first command is finished */ 5178 do { 5179 port_cmd_issue = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 5180 (uint32_t *)AHCI_PORT_PxCI(ahci_ctlp, port)); 5181 5182 /* We are effectively timing out after 1 sec. */ 5183 if (loop_count++ > AHCI_POLLRATE_PORT_SOFTRESET) { 5184 AHCIDBG(AHCIDBG_ERRS, ahci_ctlp, 5185 "the first SRST FIS is timed out, " 5186 "loop_count = %d", loop_count); 5187 goto out; 5188 } 5189 /* Wait for 10 millisec */ 5190 drv_usecwait(AHCI_10MS_USECS); 5191 } while (port_cmd_issue & AHCI_SLOT_MASK(ahci_ctlp) & (0x1 << slot)); 5192 5193 AHCIDBG(AHCIDBG_POLL_LOOP, ahci_ctlp, 5194 "ahci_software_reset: 1st loop count: %d, " 5195 "port_cmd_issue = 0x%x, slot = 0x%x", 5196 loop_count, port_cmd_issue, slot); 5197 5198 /* According to ATA spec, we need wait at least 5 microsecs here. */ 5199 drv_usecwait(AHCI_1MS_USECS); 5200 5201 /* Now send the second H2D Register FIS with SRST cleard to zero */ 5202 cmd_table = ahci_portp->ahciport_cmd_tables[slot]; 5203 bzero((void *)cmd_table, ahci_cmd_table_size); 5204 5205 h2d_register_fisp = 5206 &(cmd_table->ahcict_command_fis.ahcifc_fis.ahcifc_h2d_register); 5207 5208 SET_FIS_TYPE(h2d_register_fisp, AHCI_H2D_REGISTER_FIS_TYPE); 5209 SET_FIS_PMP(h2d_register_fisp, pmport); 5210 5211 /* Set Command Header in Command List */ 5212 cmd_header = &ahci_portp->ahciport_cmd_list[slot]; 5213 BZERO_DESCR_INFO(cmd_header); 5214 BZERO_PRD_BYTE_COUNT(cmd_header); 5215 SET_COMMAND_FIS_LENGTH(cmd_header, 5); 5216 SET_PORT_MULTI_PORT(cmd_header, pmport); 5217 5218 SET_WRITE(cmd_header, 1); 5219 5220 (void) ddi_dma_sync(ahci_portp->ahciport_cmd_tables_dma_handle[slot], 5221 0, 5222 ahci_cmd_table_size, 5223 DDI_DMA_SYNC_FORDEV); 5224 5225 (void) ddi_dma_sync(ahci_portp->ahciport_cmd_list_dma_handle, 5226 slot * sizeof (ahci_cmd_header_t), 5227 sizeof (ahci_cmd_header_t), 5228 DDI_DMA_SYNC_FORDEV); 5229 5230 /* Indicate to the HBA that a command is active. */ 5231 ddi_put32(ahci_ctlp->ahcictl_ahci_acc_handle, 5232 (uint32_t *)AHCI_PORT_PxCI(ahci_ctlp, port), 5233 (0x1 << slot)); 5234 5235 loop_count = 0; 5236 5237 /* Loop till the second command is finished */ 5238 do { 5239 port_cmd_issue = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 5240 (uint32_t *)AHCI_PORT_PxCI(ahci_ctlp, port)); 5241 5242 /* We are effectively timing out after 1 sec. */ 5243 if (loop_count++ > AHCI_POLLRATE_PORT_SOFTRESET) { 5244 AHCIDBG(AHCIDBG_ERRS, ahci_ctlp, 5245 "the second SRST FIS is timed out, " 5246 "loop_count = %d", loop_count); 5247 goto out; 5248 } 5249 5250 /* Wait for 10 millisec */ 5251 drv_usecwait(AHCI_10MS_USECS); 5252 } while (port_cmd_issue & AHCI_SLOT_MASK(ahci_ctlp) & (0x1 << slot)); 5253 5254 AHCIDBG(AHCIDBG_POLL_LOOP, ahci_ctlp, 5255 "ahci_software_reset: 2nd loop count: %d, " 5256 "port_cmd_issue = 0x%x, slot = 0x%x", 5257 loop_count, port_cmd_issue, slot); 5258 5259 if ((ahci_check_ctl_handle(ahci_ctlp) != DDI_SUCCESS) || 5260 (ahci_check_port_handle(ahci_ctlp, port) != DDI_SUCCESS)) { 5261 ddi_fm_service_impact(ahci_ctlp->ahcictl_dip, 5262 DDI_SERVICE_UNAFFECTED); 5263 goto out; 5264 } 5265 5266 rval = AHCI_SUCCESS; 5267 out: 5268 AHCIDBG(AHCIDBG_ERRS, ahci_ctlp, 5269 "ahci_software_reset: %s at port %d:%d", 5270 rval == AHCI_SUCCESS ? "succeed" : "failed", 5271 port, pmport); 5272 5273 return (rval); 5274 } 5275 5276 /* 5277 * AHCI port reset ...; the physical communication between the HBA and device 5278 * on a port are disabled. This is more intrusive. 5279 * 5280 * When an HBA or port reset occurs, Phy communication is going to 5281 * be re-established with the device through a COMRESET followed by the 5282 * normal out-of-band communication sequence defined in Serial ATA. At 5283 * the end of reset, the device, if working properly, will send a D2H 5284 * Register FIS, which contains the device signature. When the HBA receives 5285 * this FIS, it updates PxTFD.STS and PxTFD.ERR register fields, and updates 5286 * the PxSIG register with the signature. 5287 * 5288 * NOTE: It is expected both PxCMD.ST and PxCMD.CR are cleared before the 5289 * function is called. If not, it is assumed the interface is in hung 5290 * condition. 5291 */ 5292 static int 5293 ahci_port_reset(ahci_ctl_t *ahci_ctlp, ahci_port_t *ahci_portp, 5294 ahci_addr_t *addrp) 5295 { 5296 ahci_addr_t pmult_addr; 5297 uint32_t port_cmd_status; 5298 uint32_t port_scontrol, port_sstatus; 5299 uint32_t port_task_file; 5300 uint32_t port_state; 5301 uint8_t port = addrp->aa_port; 5302 5303 int loop_count; 5304 int instance = ddi_get_instance(ahci_ctlp->ahcictl_dip); 5305 5306 ASSERT(MUTEX_HELD(&ahci_portp->ahciport_mutex)); 5307 5308 /* Target is a port multiplier port? */ 5309 if (AHCI_ADDR_IS_PMPORT(addrp)) 5310 return (ahci_pmport_reset(ahci_ctlp, ahci_portp, addrp)); 5311 5312 /* Otherwise it must be an HBA port. */ 5313 ASSERT(AHCI_ADDR_IS_PORT(addrp)); 5314 5315 AHCIDBG(AHCIDBG_INIT|AHCIDBG_ENTRY, ahci_ctlp, 5316 "Port %d port resetting...", port); 5317 ahci_portp->ahciport_port_state = 0; 5318 5319 port_cmd_status = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 5320 (uint32_t *)AHCI_PORT_PxCMD(ahci_ctlp, port)); 5321 5322 /* 5323 * According to the spec, SUD bit should be set here, 5324 * but JMicron JMB363 doesn't follow it, so print 5325 * a debug message. 5326 */ 5327 if (!(port_cmd_status & AHCI_CMD_STATUS_SUD)) 5328 AHCIDBG(AHCIDBG_ERRS, ahci_ctlp, 5329 "ahci_port_reset: port %d SUD bit not set", port); 5330 5331 port_scontrol = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 5332 (uint32_t *)AHCI_PORT_PxSCTL(ahci_ctlp, port)); 5333 SCONTROL_SET_DET(port_scontrol, SCONTROL_DET_COMRESET); 5334 5335 ddi_put32(ahci_ctlp->ahcictl_ahci_acc_handle, 5336 (uint32_t *)AHCI_PORT_PxSCTL(ahci_ctlp, port), 5337 port_scontrol); 5338 5339 /* Enable PxCMD.FRE to read device */ 5340 ddi_put32(ahci_ctlp->ahcictl_ahci_acc_handle, 5341 (uint32_t *)AHCI_PORT_PxCMD(ahci_ctlp, port), 5342 port_cmd_status|AHCI_CMD_STATUS_FRE); 5343 5344 /* 5345 * The port enters P:StartComm state, and the HBA tells the link layer 5346 * to start communication, which involves sending COMRESET to the 5347 * device. And the HBA resets PxTFD.STS to 7Fh. 5348 * 5349 * Give time for COMRESET to percolate, according to the AHCI 5350 * spec, software shall wait at least 1 millisecond before 5351 * clearing PxSCTL.DET 5352 */ 5353 drv_usecwait(AHCI_1MS_USECS * 2); 5354 5355 /* Fetch the SCONTROL again and rewrite the DET part with 0 */ 5356 port_scontrol = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 5357 (uint32_t *)AHCI_PORT_PxSCTL(ahci_ctlp, port)); 5358 SCONTROL_SET_DET(port_scontrol, SCONTROL_DET_NOACTION); 5359 ddi_put32(ahci_ctlp->ahcictl_ahci_acc_handle, 5360 (uint32_t *)AHCI_PORT_PxSCTL(ahci_ctlp, port), 5361 port_scontrol); 5362 5363 /* 5364 * When a COMINIT is received from the device, then the port enters 5365 * P:ComInit state. And HBA sets PxTFD.STS to FFh or 80h. HBA sets 5366 * PxSSTS.DET to 1h to indicate a device is detected but communication 5367 * is not yet established. HBA sets PxSERR.DIAG.X to '1' to indicate 5368 * a COMINIT has been received. 5369 */ 5370 /* 5371 * The DET field is valid only if IPM field indicates 5372 * that the interface is in active state. 5373 */ 5374 loop_count = 0; 5375 for (;;) { 5376 port_sstatus = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 5377 (uint32_t *)AHCI_PORT_PxSSTS(ahci_ctlp, port)); 5378 5379 if (SSTATUS_GET_IPM(port_sstatus) != SSTATUS_IPM_ACTIVE) { 5380 /* 5381 * If the interface is not active, the DET field 5382 * is considered not accurate. So we want to 5383 * continue looping. 5384 */ 5385 SSTATUS_SET_DET(port_sstatus, SSTATUS_DET_NODEV); 5386 } 5387 5388 if (SSTATUS_GET_DET(port_sstatus) == SSTATUS_DET_DEVPRE_PHYCOM) 5389 break; 5390 5391 if (loop_count++ > AHCI_POLLRATE_PORT_SSTATUS) { 5392 /* 5393 * We are effectively timing out after 0.1 sec. 5394 */ 5395 break; 5396 } 5397 5398 /* Wait for 10 millisec */ 5399 drv_usecwait(AHCI_10MS_USECS); 5400 } 5401 5402 AHCIDBG(AHCIDBG_INIT|AHCIDBG_POLL_LOOP, ahci_ctlp, 5403 "ahci_port_reset: 1st loop count: %d, " 5404 "port_sstatus = 0x%x port %d", 5405 loop_count, port_sstatus, port); 5406 5407 if (SSTATUS_GET_DET(port_sstatus) != SSTATUS_DET_DEVPRE_PHYCOM) { 5408 /* 5409 * Either the port is not active or there 5410 * is no device present. 5411 */ 5412 AHCIPORT_SET_DEV_TYPE(ahci_portp, addrp, SATA_DTYPE_NONE); 5413 return (AHCI_SUCCESS); 5414 } 5415 5416 /* Clear port serror register for the port */ 5417 ddi_put32(ahci_ctlp->ahcictl_ahci_acc_handle, 5418 (uint32_t *)AHCI_PORT_PxSERR(ahci_ctlp, port), 5419 AHCI_SERROR_CLEAR_ALL); 5420 5421 /* 5422 * Devices should return a FIS contains its signature to HBA after 5423 * COMINIT signal. Check whether a D2H Register FIS is received by 5424 * polling PxTFD.STS. 5425 */ 5426 loop_count = 0; 5427 for (;;) { 5428 port_task_file = 5429 ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 5430 (uint32_t *)AHCI_PORT_PxTFD(ahci_ctlp, port)); 5431 5432 if ((port_task_file & (AHCI_TFD_STS_BSY | AHCI_TFD_STS_DRQ | 5433 AHCI_TFD_STS_ERR)) == 0) 5434 break; 5435 5436 if (loop_count++ > AHCI_POLLRATE_PORT_TFD_ERROR) { 5437 /* 5438 * We are effectively timing out after 11 sec. 5439 */ 5440 cmn_err(CE_WARN, "!ahci%d: ahci_port_reset port %d " 5441 "the device hardware has been initialized and " 5442 "the power-up diagnostics failed", 5443 instance, port); 5444 5445 AHCIDBG(AHCIDBG_ERRS, ahci_ctlp, "ahci_port_reset: " 5446 "port %d: some or all of BSY, DRQ and ERR in " 5447 "PxTFD.STS are not clear. We need another " 5448 "software reset.", port); 5449 5450 /* Clear port serror register for the port */ 5451 ddi_put32(ahci_ctlp->ahcictl_ahci_acc_handle, 5452 (uint32_t *)AHCI_PORT_PxSERR(ahci_ctlp, port), 5453 AHCI_SERROR_CLEAR_ALL); 5454 5455 AHCI_ADDR_SET_PMULT(&pmult_addr, port); 5456 5457 /* Try another software reset. */ 5458 if (ahci_software_reset(ahci_ctlp, ahci_portp, 5459 &pmult_addr) != AHCI_SUCCESS) { 5460 AHCIPORT_SET_STATE(ahci_portp, addrp, 5461 SATA_PSTATE_FAILED); 5462 return (AHCI_FAILURE); 5463 } 5464 break; 5465 } 5466 5467 /* Wait for 10 millisec */ 5468 drv_usecwait(AHCI_10MS_USECS); 5469 } 5470 5471 AHCIDBG(AHCIDBG_INIT|AHCIDBG_POLL_LOOP, ahci_ctlp, 5472 "ahci_port_reset: 2nd loop count: %d, " 5473 "port_task_file = 0x%x port %d", 5474 loop_count, port_task_file, port); 5475 5476 /* Clear port serror register for the port */ 5477 ddi_put32(ahci_ctlp->ahcictl_ahci_acc_handle, 5478 (uint32_t *)AHCI_PORT_PxSERR(ahci_ctlp, port), 5479 AHCI_SERROR_CLEAR_ALL); 5480 5481 /* Set port as ready */ 5482 port_state = AHCIPORT_GET_STATE(ahci_portp, addrp); 5483 AHCIPORT_SET_STATE(ahci_portp, addrp, port_state|SATA_STATE_READY); 5484 5485 AHCIDBG(AHCIDBG_INFO|AHCIDBG_ERRS, ahci_ctlp, 5486 "ahci_port_reset: succeed at port %d.", port); 5487 return (AHCI_SUCCESS); 5488 } 5489 5490 /* 5491 * COMRESET on a port multiplier port. 5492 * 5493 * NOTE: Only called in ahci_port_reset() 5494 */ 5495 static int 5496 ahci_pmport_reset(ahci_ctl_t *ahci_ctlp, ahci_port_t *ahci_portp, 5497 ahci_addr_t *addrp) 5498 { 5499 uint32_t port_scontrol, port_sstatus, port_serror; 5500 uint32_t port_cmd_status, port_intr_status; 5501 uint32_t port_state; 5502 uint8_t port = addrp->aa_port; 5503 uint8_t pmport = addrp->aa_pmport; 5504 int loop_count; 5505 int instance = ddi_get_instance(ahci_ctlp->ahcictl_dip); 5506 5507 AHCIDBG(AHCIDBG_INIT|AHCIDBG_ENTRY, ahci_ctlp, 5508 "port %d:%d: pmport resetting", port, pmport); 5509 5510 /* Initialize pmport state */ 5511 AHCIPORT_SET_STATE(ahci_portp, addrp, 0); 5512 5513 READ_PMULT(addrp, SATA_PMULT_REG_SCTL, &port_scontrol, err); 5514 SCONTROL_SET_DET(port_scontrol, SCONTROL_DET_COMRESET); 5515 WRITE_PMULT(addrp, SATA_PMULT_REG_SCTL, port_scontrol, err); 5516 5517 /* PxCMD.FRE should be set before. */ 5518 port_cmd_status = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 5519 (uint32_t *)AHCI_PORT_PxCMD(ahci_ctlp, port)); 5520 ASSERT(port_cmd_status & AHCI_CMD_STATUS_FRE); 5521 if (!(port_cmd_status & AHCI_CMD_STATUS_FRE)) 5522 return (AHCI_FAILURE); 5523 5524 /* 5525 * Give time for COMRESET to percolate, according to the AHCI 5526 * spec, software shall wait at least 1 millisecond before 5527 * clearing PxSCTL.DET 5528 */ 5529 drv_usecwait(AHCI_1MS_USECS*2); 5530 5531 /* 5532 * Fetch the SCONTROL again and rewrite the DET part with 0 5533 * This will generate an Asychronous Notification events. 5534 */ 5535 READ_PMULT(addrp, SATA_PMULT_REG_SCTL, &port_scontrol, err); 5536 SCONTROL_SET_DET(port_scontrol, SCONTROL_DET_NOACTION); 5537 WRITE_PMULT(addrp, SATA_PMULT_REG_SCTL, port_scontrol, err); 5538 5539 /* 5540 * The port enters P:StartComm state, and HBA tells link layer to 5541 * start communication, which involves sending COMRESET to device. 5542 * And the HBA resets PxTFD.STS to 7Fh. 5543 * 5544 * When a COMINIT is received from the device, then the port enters 5545 * P:ComInit state. And HBA sets PxTFD.STS to FFh or 80h. HBA sets 5546 * PxSSTS.DET to 1h to indicate a device is detected but communication 5547 * is not yet established. HBA sets PxSERR.DIAG.X to '1' to indicate 5548 * a COMINIT has been received. 5549 */ 5550 /* 5551 * The DET field is valid only if IPM field indicates 5552 * that the interface is in active state. 5553 */ 5554 loop_count = 0; 5555 do { 5556 READ_PMULT(addrp, SATA_PMULT_REG_SSTS, &port_sstatus, err); 5557 5558 if (SSTATUS_GET_IPM(port_sstatus) != SSTATUS_IPM_ACTIVE) { 5559 /* 5560 * If the interface is not active, the DET field 5561 * is considered not accurate. So we want to 5562 * continue looping. 5563 */ 5564 SSTATUS_SET_DET(port_sstatus, SSTATUS_DET_NODEV); 5565 } 5566 5567 if (loop_count++ > AHCI_POLLRATE_PORT_SSTATUS) { 5568 /* 5569 * We are effectively timing out after 0.1 sec. 5570 */ 5571 break; 5572 } 5573 5574 /* Wait for 10 millisec */ 5575 drv_usecwait(AHCI_10MS_USECS); 5576 5577 } while (SSTATUS_GET_DET(port_sstatus) != SSTATUS_DET_DEVPRE_PHYCOM); 5578 5579 AHCIDBG(AHCIDBG_POLL_LOOP, ahci_ctlp, 5580 "ahci_pmport_reset: 1st loop count: %d, " 5581 "port_sstatus = 0x%x port %d:%d", 5582 loop_count, port_sstatus, port, pmport); 5583 5584 if ((SSTATUS_GET_IPM(port_sstatus) != SSTATUS_IPM_ACTIVE) || 5585 (SSTATUS_GET_DET(port_sstatus) != SSTATUS_DET_DEVPRE_PHYCOM)) { 5586 /* 5587 * Either the port is not active or there 5588 * is no device present. 5589 */ 5590 AHCIDBG(AHCIDBG_INIT|AHCIDBG_INFO, ahci_ctlp, 5591 "ahci_pmport_reset: " 5592 "no device attached to port %d:%d", 5593 port, pmport); 5594 AHCIPORT_SET_DEV_TYPE(ahci_portp, addrp, SATA_DTYPE_NONE); 5595 return (AHCI_SUCCESS); 5596 } 5597 5598 /* Now we can make sure there is a device connected to the port */ 5599 /* COMINIT signal is supposed to be received (PxSERR.DIAG.X = '1') */ 5600 READ_PMULT(addrp, SATA_PMULT_REG_SERR, &port_serror, err); 5601 5602 if (!(port_serror & (1 << 26))) { 5603 cmn_err(CE_WARN, "!ahci%d: ahci_pmport_reset: " 5604 "COMINIT signal from the device not received port %d:%d", 5605 instance, port, pmport); 5606 5607 AHCIPORT_SET_STATE(ahci_portp, addrp, SATA_PSTATE_FAILED); 5608 return (AHCI_FAILURE); 5609 } 5610 5611 /* 5612 * After clear PxSERR register, we will receive a D2H FIS. 5613 * Normally this FIS will cause a IPMS error according to AHCI spec 5614 * v1.2 because there is no command outstanding for it. So we need 5615 * to ignore this error. 5616 */ 5617 ahci_portp->ahciport_flags |= AHCI_PORT_FLAG_IGNORE_IPMS; 5618 WRITE_PMULT(addrp, SATA_PMULT_REG_SERR, AHCI_SERROR_CLEAR_ALL, err); 5619 5620 /* Now we need to check the D2H FIS by checking IPMS error. */ 5621 loop_count = 0; 5622 do { 5623 port_intr_status = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 5624 (uint32_t *)AHCI_PORT_PxIS(ahci_ctlp, port)); 5625 5626 if (loop_count++ > AHCI_POLLRATE_PORT_TFD_ERROR) { 5627 /* 5628 * No D2H FIS received. This is possible according 5629 * to SATA 2.6 spec. 5630 */ 5631 cmn_err(CE_WARN, "ahci_port_reset: port %d:%d " 5632 "PxIS.IPMS is not set, we need another " 5633 "software reset.", port, pmport); 5634 5635 break; 5636 } 5637 5638 /* Wait for 10 millisec */ 5639 mutex_exit(&ahci_portp->ahciport_mutex); 5640 delay(AHCI_10MS_TICKS); 5641 mutex_enter(&ahci_portp->ahciport_mutex); 5642 5643 } while (!(port_intr_status & AHCI_INTR_STATUS_IPMS)); 5644 5645 AHCIDBG(AHCIDBG_POLL_LOOP, ahci_ctlp, 5646 "ahci_pmport_reset: 2st loop count: %d, " 5647 "port_sstatus = 0x%x port %d:%d", 5648 loop_count, port_sstatus, port, pmport); 5649 5650 /* Clear IPMS */ 5651 ddi_put32(ahci_ctlp->ahcictl_ahci_acc_handle, 5652 (uint32_t *)AHCI_PORT_PxIS(ahci_ctlp, port), 5653 AHCI_INTR_STATUS_IPMS); 5654 ahci_portp->ahciport_flags &= ~AHCI_PORT_FLAG_IGNORE_IPMS; 5655 5656 /* This pmport is now ready for ahci_tran_start() */ 5657 port_state = AHCIPORT_GET_STATE(ahci_portp, addrp); 5658 AHCIPORT_SET_STATE(ahci_portp, addrp, port_state|SATA_STATE_READY); 5659 5660 AHCIDBG(AHCIDBG_INFO|AHCIDBG_ERRS, ahci_ctlp, 5661 "ahci_pmport_reset: succeed at port %d:%d", port, pmport); 5662 return (AHCI_SUCCESS); 5663 5664 err: /* R/W PMULT error */ 5665 /* IPMS flags might be set before. */ 5666 ahci_portp->ahciport_flags &= ~AHCI_PORT_FLAG_IGNORE_IPMS; 5667 AHCIDBG(AHCIDBG_INFO|AHCIDBG_ERRS, ahci_ctlp, 5668 "ahci_pmport_reset: failed at port %d:%d", port, pmport); 5669 5670 return (AHCI_FAILURE); 5671 } 5672 5673 /* 5674 * AHCI HBA reset ...; the entire HBA is reset, and all ports are disabled. 5675 * This is the most intrusive. 5676 * 5677 * When an HBA reset occurs, Phy communication will be re-established with 5678 * the device through a COMRESET followed by the normal out-of-band 5679 * communication sequence defined in Serial ATA. At the end of reset, the 5680 * device, if working properly, will send a D2H Register FIS, which contains 5681 * the device signature. When the HBA receives this FIS, it updates PxTFD.STS 5682 * and PxTFD.ERR register fields, and updates the PxSIG register with the 5683 * signature. 5684 * 5685 * Remember to set GHC.AE to 1 before calling ahci_hba_reset. 5686 */ 5687 static int 5688 ahci_hba_reset(ahci_ctl_t *ahci_ctlp) 5689 { 5690 ahci_port_t *ahci_portp; 5691 uint32_t ghc_control; 5692 uint8_t port; 5693 int loop_count; 5694 int rval = AHCI_SUCCESS; 5695 5696 AHCIDBG(AHCIDBG_INIT|AHCIDBG_ENTRY, ahci_ctlp, "HBA resetting", 5697 NULL); 5698 5699 mutex_enter(&ahci_ctlp->ahcictl_mutex); 5700 5701 ghc_control = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 5702 (uint32_t *)AHCI_GLOBAL_GHC(ahci_ctlp)); 5703 5704 /* Setting GHC.HR to 1, remember GHC.AE is already set to 1 before */ 5705 ghc_control |= AHCI_HBA_GHC_HR; 5706 ddi_put32(ahci_ctlp->ahcictl_ahci_acc_handle, 5707 (uint32_t *)AHCI_GLOBAL_GHC(ahci_ctlp), ghc_control); 5708 5709 /* 5710 * Wait until HBA Reset complete or timeout 5711 */ 5712 loop_count = 0; 5713 do { 5714 ghc_control = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 5715 (uint32_t *)AHCI_GLOBAL_GHC(ahci_ctlp)); 5716 5717 if (loop_count++ > AHCI_POLLRATE_HBA_RESET) { 5718 AHCIDBG(AHCIDBG_INIT, ahci_ctlp, 5719 "ahci hba reset is timing out, " 5720 "ghc_control = 0x%x", ghc_control); 5721 /* We are effectively timing out after 1 sec. */ 5722 break; 5723 } 5724 5725 /* Wait for 10 millisec */ 5726 drv_usecwait(AHCI_10MS_USECS); 5727 } while (ghc_control & AHCI_HBA_GHC_HR); 5728 5729 AHCIDBG(AHCIDBG_POLL_LOOP, ahci_ctlp, 5730 "ahci_hba_reset: 1st loop count: %d, " 5731 "ghc_control = 0x%x", loop_count, ghc_control); 5732 5733 if (ghc_control & AHCI_HBA_GHC_HR) { 5734 /* The hba is not reset for some reasons */ 5735 AHCIDBG(AHCIDBG_INIT, ahci_ctlp, 5736 "hba reset failed: HBA in a hung or locked state", NULL); 5737 mutex_exit(&ahci_ctlp->ahcictl_mutex); 5738 return (AHCI_FAILURE); 5739 } 5740 5741 /* 5742 * HBA reset will clear (AHCI Spec v1.2 10.4.3) GHC.IE / GHC.AE 5743 */ 5744 ghc_control = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 5745 (uint32_t *)AHCI_GLOBAL_GHC(ahci_ctlp)); 5746 ghc_control |= (AHCI_HBA_GHC_AE | AHCI_HBA_GHC_IE); 5747 ddi_put32(ahci_ctlp->ahcictl_ahci_acc_handle, 5748 (uint32_t *)AHCI_GLOBAL_GHC(ahci_ctlp), ghc_control); 5749 5750 mutex_exit(&ahci_ctlp->ahcictl_mutex); 5751 5752 for (port = 0; port < ahci_ctlp->ahcictl_num_ports; port++) { 5753 /* Only check implemented ports */ 5754 if (!AHCI_PORT_IMPLEMENTED(ahci_ctlp, port)) { 5755 continue; 5756 } 5757 5758 ahci_portp = ahci_ctlp->ahcictl_ports[port]; 5759 mutex_enter(&ahci_portp->ahciport_mutex); 5760 5761 /* Make sure the drive is spun-up */ 5762 ahci_staggered_spin_up(ahci_ctlp, port); 5763 5764 if (ahci_restart_port_wait_till_ready(ahci_ctlp, ahci_portp, 5765 port, AHCI_PORT_RESET|AHCI_RESET_NO_EVENTS_UP, NULL) != 5766 AHCI_SUCCESS) { 5767 rval = AHCI_FAILURE; 5768 AHCIDBG(AHCIDBG_ERRS, ahci_ctlp, 5769 "ahci_hba_reset: port %d failed", port); 5770 /* 5771 * Set the port state to SATA_PSTATE_FAILED if 5772 * failed to initialize it. 5773 */ 5774 ahci_portp->ahciport_port_state = SATA_PSTATE_FAILED; 5775 } 5776 5777 mutex_exit(&ahci_portp->ahciport_mutex); 5778 } 5779 5780 return (rval); 5781 } 5782 5783 /* 5784 * This routine is only called from AHCI_ATTACH or phyrdy change 5785 * case. It first calls software reset, then stop the port and try to 5786 * read PxSIG register to find the type of device attached to the port. 5787 * 5788 * The caller should make sure a valid device exists on specified port and 5789 * physical communication has been established so that the signature could 5790 * be retrieved by software reset. 5791 * 5792 * NOTE: The port interrupts should be disabled before the function is called. 5793 */ 5794 static void 5795 ahci_find_dev_signature(ahci_ctl_t *ahci_ctlp, ahci_port_t *ahci_portp, 5796 ahci_addr_t *addrp) 5797 { 5798 ahci_addr_t dev_addr; 5799 uint32_t signature; 5800 uint8_t port = addrp->aa_port; 5801 uint8_t pmport = addrp->aa_pmport; 5802 int rval; 5803 5804 ASSERT(MUTEX_HELD(&ahci_portp->ahciport_mutex)); 5805 ASSERT(AHCI_ADDR_IS_VALID(addrp)); 5806 5807 /* 5808 * If the HBA doesn't support port multiplier, then the driver 5809 * doesn't need to bother to check port multiplier device. 5810 * 5811 * The second port of ICH7 on ASUS P5W DH deluxe motherboard is 5812 * connected to Silicon Image 4723, to which the two sata drives 5813 * attached can be set with RAID1, RAID0 or Spanning mode. 5814 * 5815 * We found software reset will get failure if port multiplier address 5816 * 0xf is used by software reset, so just ignore the check since 5817 * ICH7 doesn't support port multiplier device at all. 5818 */ 5819 if (AHCI_ADDR_IS_PORT(addrp) && 5820 (ahci_ctlp->ahcictl_cap & AHCI_CAP_PMULT_CBSS)) { 5821 AHCIDBG(AHCIDBG_ENTRY, ahci_ctlp, 5822 "ahci_find_dev_signature enter: port %d", port); 5823 5824 /* 5825 * NOTE: when the ahci address is a HBA port, we do not know 5826 * it is a device or a port multiplier that attached. we need 5827 * try a software reset at port multiplier address (0xf 5828 * pmport) 5829 */ 5830 AHCI_ADDR_SET_PMULT(&dev_addr, addrp->aa_port); 5831 } else { 5832 AHCIDBG(AHCIDBG_ENTRY, ahci_ctlp, 5833 "ahci_find_dev_signature enter: port %d:%d", 5834 port, pmport); 5835 dev_addr = *addrp; 5836 } 5837 5838 /* Assume it is unknown. */ 5839 AHCIPORT_SET_DEV_TYPE(ahci_portp, addrp, SATA_DTYPE_UNKNOWN); 5840 5841 /* Issue a software reset to get the signature */ 5842 rval = ahci_software_reset(ahci_ctlp, ahci_portp, &dev_addr); 5843 if (rval != AHCI_SUCCESS) { 5844 5845 /* 5846 * Try to do software reset again with pmport set with 0 if 5847 * the controller is set with AHCI_CAP_SRST_NO_HOSTPORT and 5848 * the original pmport is set with SATA_PMULT_HOSTPORT (0xf) 5849 */ 5850 if ((ahci_ctlp->ahcictl_cap & AHCI_CAP_SRST_NO_HOSTPORT) && 5851 (dev_addr.aa_pmport == SATA_PMULT_HOSTPORT)) { 5852 dev_addr.aa_pmport = 0; 5853 rval = ahci_software_reset(ahci_ctlp, ahci_portp, 5854 &dev_addr); 5855 } 5856 5857 if (rval != AHCI_SUCCESS) { 5858 AHCIDBG(AHCIDBG_ERRS, ahci_ctlp, 5859 "ahci_find_dev_signature: software reset failed " 5860 "at port %d:%d, cannot get signature.", 5861 port, pmport); 5862 5863 AHCIPORT_SET_STATE(ahci_portp, addrp, 5864 SATA_PSTATE_FAILED); 5865 return; 5866 } 5867 } 5868 5869 /* 5870 * ahci_software_reset has started the port, so we need manually stop 5871 * the port again. 5872 */ 5873 if (AHCI_ADDR_IS_PORT(addrp)) { 5874 if (ahci_put_port_into_notrunning_state(ahci_ctlp, 5875 ahci_portp, port) != AHCI_SUCCESS) { 5876 AHCIDBG(AHCIDBG_INFO, ahci_ctlp, 5877 "ahci_find_dev_signature: cannot stop port %d.", 5878 port); 5879 ahci_portp->ahciport_port_state = SATA_PSTATE_FAILED; 5880 return; 5881 } 5882 } 5883 5884 /* Now we can make sure that a valid signature is received. */ 5885 signature = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 5886 (uint32_t *)AHCI_PORT_PxSIG(ahci_ctlp, port)); 5887 5888 if (AHCI_ADDR_IS_PMPORT(addrp)) { 5889 AHCIDBG(AHCIDBG_INIT|AHCIDBG_INFO|AHCIDBG_PMULT, ahci_ctlp, 5890 "ahci_find_dev_signature: signature = 0x%x at port %d:%d", 5891 signature, port, pmport); 5892 } else { 5893 AHCIDBG(AHCIDBG_INIT|AHCIDBG_INFO, ahci_ctlp, 5894 "ahci_find_dev_signature: signature = 0x%x at port %d", 5895 signature, port); 5896 } 5897 5898 /* NOTE: Only support ATAPI device at controller port. */ 5899 if (signature == AHCI_SIGNATURE_ATAPI && !AHCI_ADDR_IS_PORT(addrp)) 5900 signature = SATA_DTYPE_UNKNOWN; 5901 5902 switch (signature) { 5903 5904 case AHCI_SIGNATURE_DISK: 5905 AHCIPORT_SET_DEV_TYPE(ahci_portp, addrp, SATA_DTYPE_ATADISK); 5906 AHCIDBG(AHCIDBG_INFO, ahci_ctlp, 5907 "Disk is found at port: %d", port); 5908 break; 5909 5910 case AHCI_SIGNATURE_ATAPI: 5911 AHCIPORT_SET_DEV_TYPE(ahci_portp, addrp, SATA_DTYPE_ATAPI); 5912 AHCIDBG(AHCIDBG_INFO, ahci_ctlp, 5913 "ATAPI device is found at port: %d", port); 5914 break; 5915 5916 case AHCI_SIGNATURE_PORT_MULTIPLIER: 5917 /* Port Multiplier cannot recursively attached. */ 5918 ASSERT(AHCI_ADDR_IS_PORT(addrp)); 5919 AHCIPORT_SET_DEV_TYPE(ahci_portp, addrp, SATA_DTYPE_PMULT); 5920 AHCIDBG(AHCIDBG_INFO, ahci_ctlp, 5921 "Port Multiplier is found at port: %d", port); 5922 break; 5923 5924 default: 5925 AHCIPORT_SET_DEV_TYPE(ahci_portp, addrp, SATA_DTYPE_UNKNOWN); 5926 AHCIDBG(AHCIDBG_INFO, ahci_ctlp, 5927 "Unknown device is found at port: %d", port); 5928 } 5929 } 5930 5931 /* 5932 * According to the spec, to reliably detect hot plug removals, software 5933 * must disable interface power management. Software should perform the 5934 * following initialization on a port after a device is attached: 5935 * Set PxSCTL.IPM to 3h to disable interface state transitions 5936 * Set PxCMD.ALPE to '0' to disable aggressive power management 5937 * Disable device initiated interface power management by SET FEATURE 5938 * 5939 * We can ignore the last item because by default the feature is disabled 5940 */ 5941 static void 5942 ahci_disable_interface_pm(ahci_ctl_t *ahci_ctlp, uint8_t port) 5943 { 5944 uint32_t port_scontrol, port_cmd_status; 5945 5946 port_scontrol = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 5947 (uint32_t *)AHCI_PORT_PxSCTL(ahci_ctlp, port)); 5948 SCONTROL_SET_IPM(port_scontrol, SCONTROL_IPM_DISABLE_BOTH); 5949 ddi_put32(ahci_ctlp->ahcictl_ahci_acc_handle, 5950 (uint32_t *)AHCI_PORT_PxSCTL(ahci_ctlp, port), port_scontrol); 5951 5952 port_cmd_status = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 5953 (uint32_t *)AHCI_PORT_PxCMD(ahci_ctlp, port)); 5954 port_cmd_status &= ~AHCI_CMD_STATUS_ALPE; 5955 ddi_put32(ahci_ctlp->ahcictl_ahci_acc_handle, 5956 (uint32_t *)AHCI_PORT_PxCMD(ahci_ctlp, port), port_cmd_status); 5957 } 5958 5959 /* 5960 * Start the port - set PxCMD.ST to 1, if PxCMD.FRE is not set 5961 * to 1, then set it firstly. 5962 * 5963 * Each port contains two major DMA engines. One DMA engine walks through 5964 * the command list, and is controlled by PxCMD.ST. The second DMA engine 5965 * copies received FISes into system memory, and is controlled by PxCMD.FRE. 5966 * 5967 * Software shall not set PxCMD.ST to '1' until it verifies that PxCMD.CR 5968 * is '0' and has set PxCMD.FRE is '1'. And software shall not clear 5969 * PxCMD.FRE while PxCMD.ST or PxCMD.CR is set '1'. 5970 * 5971 * Software shall not set PxCMD.ST to '1' unless a functional device is 5972 * present on the port(as determined by PxTFD.STS.BSY = '0', 5973 * PxTFD.STS.DRQ = '0', and PxSSTS.DET = 3h). 5974 */ 5975 static int 5976 ahci_start_port(ahci_ctl_t *ahci_ctlp, ahci_port_t *ahci_portp, uint8_t port) 5977 { 5978 uint32_t port_cmd_status; 5979 5980 ASSERT(MUTEX_HELD(&ahci_portp->ahciport_mutex)); 5981 5982 AHCIDBG(AHCIDBG_ENTRY, ahci_ctlp, "ahci_start_port: %d enter", port); 5983 5984 if (ahci_portp->ahciport_port_state & SATA_PSTATE_FAILED) { 5985 AHCIDBG(AHCIDBG_ERRS, ahci_ctlp, "ahci_start_port failed " 5986 "the state for port %d is 0x%x", 5987 port, ahci_portp->ahciport_port_state); 5988 return (AHCI_FAILURE); 5989 } 5990 5991 if (ahci_portp->ahciport_device_type == SATA_DTYPE_NONE) { 5992 AHCIDBG(AHCIDBG_ERRS, ahci_ctlp, "ahci_start_port failed " 5993 "no device is attached at port %d", port); 5994 return (AHCI_FAILURE); 5995 } 5996 5997 /* First to set PxCMD.FRE before setting PxCMD.ST. */ 5998 port_cmd_status = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 5999 (uint32_t *)AHCI_PORT_PxCMD(ahci_ctlp, port)); 6000 6001 if (!(port_cmd_status & AHCI_CMD_STATUS_FRE)) { 6002 port_cmd_status |= AHCI_CMD_STATUS_FRE; 6003 ddi_put32(ahci_ctlp->ahcictl_ahci_acc_handle, 6004 (uint32_t *)AHCI_PORT_PxCMD(ahci_ctlp, port), 6005 port_cmd_status); 6006 } 6007 6008 port_cmd_status = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 6009 (uint32_t *)AHCI_PORT_PxCMD(ahci_ctlp, port)); 6010 6011 port_cmd_status |= AHCI_CMD_STATUS_ST; 6012 6013 ddi_put32(ahci_ctlp->ahcictl_ahci_acc_handle, 6014 (uint32_t *)AHCI_PORT_PxCMD(ahci_ctlp, port), 6015 port_cmd_status); 6016 6017 ahci_portp->ahciport_flags |= AHCI_PORT_FLAG_STARTED; 6018 6019 AHCIDBG(AHCIDBG_ERRS, ahci_ctlp, "ahci_start_port: " 6020 "PxCMD.ST set to '1' at port %d", port); 6021 6022 return (AHCI_SUCCESS); 6023 } 6024 6025 /* 6026 * Setup PxCLB, PxCLBU, PxFB, and PxFBU for particular port. First, we need 6027 * to make sure PxCMD.ST, PxCMD.CR, PxCMD.FRE, and PxCMD.FR are all cleared. 6028 * Then set PxCLB, PxCLBU, PxFB, and PxFBU. 6029 */ 6030 static int 6031 ahci_setup_port_base_addresses(ahci_ctl_t *ahci_ctlp, ahci_port_t *ahci_portp) 6032 { 6033 uint8_t port = ahci_portp->ahciport_port_num; 6034 uint32_t port_cmd_status = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 6035 (uint32_t *)AHCI_PORT_PxCMD(ahci_ctlp, port)); 6036 6037 ASSERT(MUTEX_HELD(&ahci_portp->ahciport_mutex)); 6038 6039 /* Step 1: Make sure both PxCMD.ST and PxCMD.CR are cleared. */ 6040 if (port_cmd_status & (AHCI_CMD_STATUS_ST | AHCI_CMD_STATUS_CR)) { 6041 if (ahci_put_port_into_notrunning_state(ahci_ctlp, ahci_portp, 6042 port) != AHCI_SUCCESS) 6043 return (AHCI_FAILURE); 6044 6045 port_cmd_status = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 6046 (uint32_t *)AHCI_PORT_PxCMD(ahci_ctlp, port)); 6047 } 6048 6049 /* Step 2: Make sure both PxCMD.FRE and PxCMD.FR are cleared. */ 6050 if (port_cmd_status & (AHCI_CMD_STATUS_FRE | AHCI_CMD_STATUS_FR)) { 6051 int loop_count = 0; 6052 6053 /* Clear PxCMD.FRE */ 6054 port_cmd_status &= ~AHCI_CMD_STATUS_FRE; 6055 ddi_put32(ahci_ctlp->ahcictl_ahci_acc_handle, 6056 (uint32_t *)AHCI_PORT_PxCMD(ahci_ctlp, port), 6057 port_cmd_status); 6058 6059 /* Wait until PxCMD.FR is cleared */ 6060 for (;;) { 6061 port_cmd_status = 6062 ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 6063 (uint32_t *)AHCI_PORT_PxCMD(ahci_ctlp, port)); 6064 6065 if (!(port_cmd_status & AHCI_CMD_STATUS_FR)) 6066 break; 6067 6068 if (loop_count++ >= AHCI_POLLRATE_PORT_IDLE_FR) { 6069 AHCIDBG(AHCIDBG_INIT | AHCIDBG_ERRS, ahci_ctlp, 6070 "ahci_setup_port_base_addresses: cannot " 6071 "clear PxCMD.FR for port %d.", port); 6072 6073 /* 6074 * We are effectively timing out after 0.5 sec. 6075 * This value is specified in AHCI spec. 6076 */ 6077 return (AHCI_FAILURE); 6078 } 6079 6080 /* Wait for 1 millisec */ 6081 drv_usecwait(AHCI_1MS_USECS); 6082 } 6083 } 6084 6085 /* Step 3: Config Port Command List Base Address */ 6086 ddi_put32(ahci_ctlp->ahcictl_ahci_acc_handle, 6087 (uint32_t *)AHCI_PORT_PxCLB(ahci_ctlp, port), 6088 ahci_portp->ahciport_cmd_list_dma_cookie.dmac_address); 6089 6090 ddi_put32(ahci_ctlp->ahcictl_ahci_acc_handle, 6091 (uint32_t *)AHCI_PORT_PxCLBU(ahci_ctlp, port), 6092 ahci_portp->ahciport_cmd_list_dma_cookie.dmac_notused); 6093 6094 /* Step 4: Config Port Received FIS Base Address */ 6095 ddi_put32(ahci_ctlp->ahcictl_ahci_acc_handle, 6096 (uint32_t *)AHCI_PORT_PxFB(ahci_ctlp, port), 6097 ahci_portp->ahciport_rcvd_fis_dma_cookie.dmac_address); 6098 6099 ddi_put32(ahci_ctlp->ahcictl_ahci_acc_handle, 6100 (uint32_t *)AHCI_PORT_PxFBU(ahci_ctlp, port), 6101 ahci_portp->ahciport_rcvd_fis_dma_cookie.dmac_notused); 6102 6103 return (AHCI_SUCCESS); 6104 } 6105 6106 /* 6107 * Allocate the ahci_port_t including Received FIS and Command List. 6108 * The argument - port is the physical port number, and not logical 6109 * port number seen by the SATA framework. 6110 */ 6111 static int 6112 ahci_alloc_port_state(ahci_ctl_t *ahci_ctlp, uint8_t port) 6113 { 6114 dev_info_t *dip = ahci_ctlp->ahcictl_dip; 6115 ahci_port_t *ahci_portp; 6116 char taskq_name[64] = "event_handle_taskq"; 6117 6118 ASSERT(MUTEX_HELD(&ahci_ctlp->ahcictl_mutex)); 6119 6120 ahci_portp = 6121 (ahci_port_t *)kmem_zalloc(sizeof (ahci_port_t), KM_SLEEP); 6122 6123 ahci_ctlp->ahcictl_ports[port] = ahci_portp; 6124 ahci_portp->ahciport_port_num = port; 6125 6126 /* Initialize the port condition variable */ 6127 cv_init(&ahci_portp->ahciport_cv, NULL, CV_DRIVER, NULL); 6128 6129 /* Initialize the port mutex */ 6130 mutex_init(&ahci_portp->ahciport_mutex, NULL, MUTEX_DRIVER, 6131 (void *)(uintptr_t)ahci_ctlp->ahcictl_intr_pri); 6132 6133 mutex_enter(&ahci_portp->ahciport_mutex); 6134 6135 /* 6136 * Allocate memory for received FIS structure and 6137 * command list for this port 6138 */ 6139 if (ahci_alloc_rcvd_fis(ahci_ctlp, ahci_portp) != AHCI_SUCCESS) { 6140 goto err_case1; 6141 } 6142 6143 if (ahci_alloc_cmd_list(ahci_ctlp, ahci_portp) != AHCI_SUCCESS) { 6144 goto err_case2; 6145 } 6146 6147 /* Setup PxCMD.CLB, PxCMD.CLBU, PxCMD.FB, and PxCMD.FBU */ 6148 if (ahci_setup_port_base_addresses(ahci_ctlp, ahci_portp) != 6149 AHCI_SUCCESS) { 6150 goto err_case3; 6151 } 6152 6153 (void) snprintf(taskq_name + strlen(taskq_name), 6154 sizeof (taskq_name) - strlen(taskq_name), 6155 "_port%d", port); 6156 6157 /* Create the taskq for the port */ 6158 if ((ahci_portp->ahciport_event_taskq = ddi_taskq_create(dip, 6159 taskq_name, 2, TASKQ_DEFAULTPRI, 0)) == NULL) { 6160 cmn_err(CE_WARN, "!ahci%d: ddi_taskq_create failed for event " 6161 "handle", ddi_get_instance(ahci_ctlp->ahcictl_dip)); 6162 goto err_case3; 6163 } 6164 6165 /* Allocate the argument for the taskq */ 6166 ahci_portp->ahciport_event_args = 6167 kmem_zalloc(sizeof (ahci_event_arg_t), KM_SLEEP); 6168 6169 ahci_portp->ahciport_event_args->ahciea_addrp = 6170 kmem_zalloc(sizeof (ahci_addr_t), KM_SLEEP); 6171 6172 /* Initialize the done queue */ 6173 ahci_portp->ahciport_doneq = NULL; 6174 ahci_portp->ahciport_doneqtail = &ahci_portp->ahciport_doneq; 6175 ahci_portp->ahciport_doneq_len = 0; 6176 6177 mutex_exit(&ahci_portp->ahciport_mutex); 6178 6179 return (AHCI_SUCCESS); 6180 6181 err_case3: 6182 ahci_dealloc_cmd_list(ahci_ctlp, ahci_portp); 6183 6184 err_case2: 6185 ahci_dealloc_rcvd_fis(ahci_portp); 6186 6187 err_case1: 6188 mutex_exit(&ahci_portp->ahciport_mutex); 6189 mutex_destroy(&ahci_portp->ahciport_mutex); 6190 cv_destroy(&ahci_portp->ahciport_cv); 6191 6192 kmem_free(ahci_portp, sizeof (ahci_port_t)); 6193 6194 return (AHCI_FAILURE); 6195 } 6196 6197 /* 6198 * Reverse of ahci_alloc_port_state(). 6199 */ 6200 static void 6201 ahci_dealloc_port_state(ahci_ctl_t *ahci_ctlp, uint8_t port) 6202 { 6203 ahci_port_t *ahci_portp = ahci_ctlp->ahcictl_ports[port]; 6204 6205 ASSERT(MUTEX_HELD(&ahci_ctlp->ahcictl_mutex)); 6206 ASSERT(ahci_portp != NULL); 6207 6208 mutex_enter(&ahci_portp->ahciport_mutex); 6209 kmem_free(ahci_portp->ahciport_event_args->ahciea_addrp, 6210 sizeof (ahci_addr_t)); 6211 ahci_portp->ahciport_event_args->ahciea_addrp = NULL; 6212 kmem_free(ahci_portp->ahciport_event_args, sizeof (ahci_event_arg_t)); 6213 ahci_portp->ahciport_event_args = NULL; 6214 ddi_taskq_destroy(ahci_portp->ahciport_event_taskq); 6215 ahci_dealloc_cmd_list(ahci_ctlp, ahci_portp); 6216 ahci_dealloc_rcvd_fis(ahci_portp); 6217 ahci_dealloc_pmult(ahci_ctlp, ahci_portp); 6218 mutex_exit(&ahci_portp->ahciport_mutex); 6219 6220 mutex_destroy(&ahci_portp->ahciport_mutex); 6221 cv_destroy(&ahci_portp->ahciport_cv); 6222 6223 kmem_free(ahci_portp, sizeof (ahci_port_t)); 6224 6225 ahci_ctlp->ahcictl_ports[port] = NULL; 6226 } 6227 6228 /* 6229 * Allocates memory for the Received FIS Structure 6230 */ 6231 static int 6232 ahci_alloc_rcvd_fis(ahci_ctl_t *ahci_ctlp, ahci_port_t *ahci_portp) 6233 { 6234 size_t rcvd_fis_size; 6235 size_t ret_len; 6236 uint_t cookie_count; 6237 6238 ASSERT(MUTEX_HELD(&ahci_portp->ahciport_mutex)); 6239 6240 rcvd_fis_size = sizeof (ahci_rcvd_fis_t); 6241 6242 /* allocate rcvd FIS dma handle. */ 6243 if (ddi_dma_alloc_handle(ahci_ctlp->ahcictl_dip, 6244 &ahci_ctlp->ahcictl_rcvd_fis_dma_attr, 6245 DDI_DMA_SLEEP, 6246 NULL, 6247 &ahci_portp->ahciport_rcvd_fis_dma_handle) != 6248 DDI_SUCCESS) { 6249 AHCIDBG(AHCIDBG_INIT, ahci_ctlp, 6250 "rcvd FIS dma handle alloc failed", NULL); 6251 6252 return (AHCI_FAILURE); 6253 } 6254 6255 if (ddi_dma_mem_alloc(ahci_portp->ahciport_rcvd_fis_dma_handle, 6256 rcvd_fis_size, 6257 &accattr, 6258 DDI_DMA_CONSISTENT, 6259 DDI_DMA_SLEEP, 6260 NULL, 6261 (caddr_t *)&ahci_portp->ahciport_rcvd_fis, 6262 &ret_len, 6263 &ahci_portp->ahciport_rcvd_fis_acc_handle) != NULL) { 6264 6265 AHCIDBG(AHCIDBG_INIT, ahci_ctlp, 6266 "rcvd FIS dma mem alloc fail", NULL); 6267 /* error.. free the dma handle. */ 6268 ddi_dma_free_handle(&ahci_portp->ahciport_rcvd_fis_dma_handle); 6269 return (AHCI_FAILURE); 6270 } 6271 6272 if (ddi_dma_addr_bind_handle(ahci_portp->ahciport_rcvd_fis_dma_handle, 6273 NULL, 6274 (caddr_t)ahci_portp->ahciport_rcvd_fis, 6275 rcvd_fis_size, 6276 DDI_DMA_RDWR | DDI_DMA_CONSISTENT, 6277 DDI_DMA_SLEEP, 6278 NULL, 6279 &ahci_portp->ahciport_rcvd_fis_dma_cookie, 6280 &cookie_count) != DDI_DMA_MAPPED) { 6281 6282 AHCIDBG(AHCIDBG_INIT, ahci_ctlp, 6283 "rcvd FIS dma handle bind fail", NULL); 6284 /* error.. free the dma handle & free the memory. */ 6285 ddi_dma_mem_free(&ahci_portp->ahciport_rcvd_fis_acc_handle); 6286 ddi_dma_free_handle(&ahci_portp->ahciport_rcvd_fis_dma_handle); 6287 return (AHCI_FAILURE); 6288 } 6289 6290 bzero((void *)ahci_portp->ahciport_rcvd_fis, rcvd_fis_size); 6291 6292 AHCIDBG(AHCIDBG_INIT, ahci_ctlp, "64-bit, dma address: 0x%llx", 6293 ahci_portp->ahciport_rcvd_fis_dma_cookie.dmac_laddress); 6294 AHCIDBG(AHCIDBG_INIT, ahci_ctlp, "32-bit, dma address: 0x%x", 6295 ahci_portp->ahciport_rcvd_fis_dma_cookie.dmac_address); 6296 6297 return (AHCI_SUCCESS); 6298 } 6299 6300 /* 6301 * Deallocates the Received FIS Structure 6302 */ 6303 static void 6304 ahci_dealloc_rcvd_fis(ahci_port_t *ahci_portp) 6305 { 6306 ASSERT(MUTEX_HELD(&ahci_portp->ahciport_mutex)); 6307 6308 /* Unbind the cmd list dma handle first. */ 6309 (void) ddi_dma_unbind_handle(ahci_portp->ahciport_rcvd_fis_dma_handle); 6310 6311 /* Then free the underlying memory. */ 6312 ddi_dma_mem_free(&ahci_portp->ahciport_rcvd_fis_acc_handle); 6313 6314 /* Now free the handle itself. */ 6315 ddi_dma_free_handle(&ahci_portp->ahciport_rcvd_fis_dma_handle); 6316 } 6317 6318 /* 6319 * Allocates memory for the Command List, which contains up to 32 entries. 6320 * Each entry contains a command header, which is a 32-byte structure that 6321 * includes the pointer to the command table. 6322 */ 6323 static int 6324 ahci_alloc_cmd_list(ahci_ctl_t *ahci_ctlp, ahci_port_t *ahci_portp) 6325 { 6326 size_t cmd_list_size; 6327 size_t ret_len; 6328 uint_t cookie_count; 6329 6330 ASSERT(MUTEX_HELD(&ahci_portp->ahciport_mutex)); 6331 6332 cmd_list_size = 6333 ahci_ctlp->ahcictl_num_cmd_slots * sizeof (ahci_cmd_header_t); 6334 6335 /* allocate cmd list dma handle. */ 6336 if (ddi_dma_alloc_handle(ahci_ctlp->ahcictl_dip, 6337 &ahci_ctlp->ahcictl_cmd_list_dma_attr, 6338 DDI_DMA_SLEEP, 6339 NULL, 6340 &ahci_portp->ahciport_cmd_list_dma_handle) != DDI_SUCCESS) { 6341 6342 AHCIDBG(AHCIDBG_INIT, ahci_ctlp, 6343 "cmd list dma handle alloc failed", NULL); 6344 return (AHCI_FAILURE); 6345 } 6346 6347 if (ddi_dma_mem_alloc(ahci_portp->ahciport_cmd_list_dma_handle, 6348 cmd_list_size, 6349 &accattr, 6350 DDI_DMA_CONSISTENT, 6351 DDI_DMA_SLEEP, 6352 NULL, 6353 (caddr_t *)&ahci_portp->ahciport_cmd_list, 6354 &ret_len, 6355 &ahci_portp->ahciport_cmd_list_acc_handle) != NULL) { 6356 6357 AHCIDBG(AHCIDBG_INIT, ahci_ctlp, 6358 "cmd list dma mem alloc fail", NULL); 6359 /* error.. free the dma handle. */ 6360 ddi_dma_free_handle(&ahci_portp->ahciport_cmd_list_dma_handle); 6361 return (AHCI_FAILURE); 6362 } 6363 6364 if (ddi_dma_addr_bind_handle(ahci_portp->ahciport_cmd_list_dma_handle, 6365 NULL, 6366 (caddr_t)ahci_portp->ahciport_cmd_list, 6367 cmd_list_size, 6368 DDI_DMA_RDWR | DDI_DMA_CONSISTENT, 6369 DDI_DMA_SLEEP, 6370 NULL, 6371 &ahci_portp->ahciport_cmd_list_dma_cookie, 6372 &cookie_count) != DDI_DMA_MAPPED) { 6373 6374 AHCIDBG(AHCIDBG_INIT, ahci_ctlp, 6375 "cmd list dma handle bind fail", NULL); 6376 /* error.. free the dma handle & free the memory. */ 6377 ddi_dma_mem_free(&ahci_portp->ahciport_cmd_list_acc_handle); 6378 ddi_dma_free_handle(&ahci_portp->ahciport_cmd_list_dma_handle); 6379 return (AHCI_FAILURE); 6380 } 6381 6382 bzero((void *)ahci_portp->ahciport_cmd_list, cmd_list_size); 6383 6384 AHCIDBG(AHCIDBG_INIT, ahci_ctlp, "64-bit, dma address: 0x%llx", 6385 ahci_portp->ahciport_cmd_list_dma_cookie.dmac_laddress); 6386 6387 AHCIDBG(AHCIDBG_INIT, ahci_ctlp, "32-bit, dma address: 0x%x", 6388 ahci_portp->ahciport_cmd_list_dma_cookie.dmac_address); 6389 6390 if (ahci_alloc_cmd_tables(ahci_ctlp, ahci_portp) != AHCI_SUCCESS) { 6391 goto err_out; 6392 } 6393 6394 return (AHCI_SUCCESS); 6395 6396 err_out: 6397 /* Unbind the cmd list dma handle first. */ 6398 (void) ddi_dma_unbind_handle(ahci_portp->ahciport_cmd_list_dma_handle); 6399 6400 /* Then free the underlying memory. */ 6401 ddi_dma_mem_free(&ahci_portp->ahciport_cmd_list_acc_handle); 6402 6403 /* Now free the handle itself. */ 6404 ddi_dma_free_handle(&ahci_portp->ahciport_cmd_list_dma_handle); 6405 6406 return (AHCI_FAILURE); 6407 } 6408 6409 /* 6410 * Deallocates the Command List 6411 */ 6412 static void 6413 ahci_dealloc_cmd_list(ahci_ctl_t *ahci_ctlp, ahci_port_t *ahci_portp) 6414 { 6415 ASSERT(MUTEX_HELD(&ahci_portp->ahciport_mutex)); 6416 6417 /* First dealloc command table */ 6418 ahci_dealloc_cmd_tables(ahci_ctlp, ahci_portp); 6419 6420 /* Unbind the cmd list dma handle first. */ 6421 (void) ddi_dma_unbind_handle(ahci_portp->ahciport_cmd_list_dma_handle); 6422 6423 /* Then free the underlying memory. */ 6424 ddi_dma_mem_free(&ahci_portp->ahciport_cmd_list_acc_handle); 6425 6426 /* Now free the handle itself. */ 6427 ddi_dma_free_handle(&ahci_portp->ahciport_cmd_list_dma_handle); 6428 } 6429 6430 /* 6431 * Allocates memory for all Command Tables, which contains Command FIS, 6432 * ATAPI Command and Physical Region Descriptor Table. 6433 */ 6434 static int 6435 ahci_alloc_cmd_tables(ahci_ctl_t *ahci_ctlp, ahci_port_t *ahci_portp) 6436 { 6437 size_t ret_len; 6438 ddi_dma_cookie_t cmd_table_dma_cookie; 6439 uint_t cookie_count; 6440 int slot; 6441 6442 ASSERT(MUTEX_HELD(&ahci_portp->ahciport_mutex)); 6443 6444 AHCIDBG(AHCIDBG_INIT|AHCIDBG_ENTRY, ahci_ctlp, 6445 "ahci_alloc_cmd_tables: port %d enter", 6446 ahci_portp->ahciport_port_num); 6447 6448 for (slot = 0; slot < ahci_ctlp->ahcictl_num_cmd_slots; slot++) { 6449 /* Allocate cmd table dma handle. */ 6450 if (ddi_dma_alloc_handle(ahci_ctlp->ahcictl_dip, 6451 &ahci_ctlp->ahcictl_cmd_table_dma_attr, 6452 DDI_DMA_SLEEP, 6453 NULL, 6454 &ahci_portp->ahciport_cmd_tables_dma_handle[slot]) != 6455 DDI_SUCCESS) { 6456 6457 AHCIDBG(AHCIDBG_INIT, ahci_ctlp, 6458 "cmd table dma handle alloc failed", NULL); 6459 6460 goto err_out; 6461 } 6462 6463 if (ddi_dma_mem_alloc( 6464 ahci_portp->ahciport_cmd_tables_dma_handle[slot], 6465 ahci_cmd_table_size, 6466 &accattr, 6467 DDI_DMA_CONSISTENT, 6468 DDI_DMA_SLEEP, 6469 NULL, 6470 (caddr_t *)&ahci_portp->ahciport_cmd_tables[slot], 6471 &ret_len, 6472 &ahci_portp->ahciport_cmd_tables_acc_handle[slot]) != 6473 NULL) { 6474 6475 AHCIDBG(AHCIDBG_INIT, ahci_ctlp, 6476 "cmd table dma mem alloc fail", NULL); 6477 6478 /* error.. free the dma handle. */ 6479 ddi_dma_free_handle( 6480 &ahci_portp->ahciport_cmd_tables_dma_handle[slot]); 6481 goto err_out; 6482 } 6483 6484 if (ddi_dma_addr_bind_handle( 6485 ahci_portp->ahciport_cmd_tables_dma_handle[slot], 6486 NULL, 6487 (caddr_t)ahci_portp->ahciport_cmd_tables[slot], 6488 ahci_cmd_table_size, 6489 DDI_DMA_RDWR | DDI_DMA_CONSISTENT, 6490 DDI_DMA_SLEEP, 6491 NULL, 6492 &cmd_table_dma_cookie, 6493 &cookie_count) != DDI_DMA_MAPPED) { 6494 6495 AHCIDBG(AHCIDBG_INIT, ahci_ctlp, 6496 "cmd table dma handle bind fail", NULL); 6497 /* error.. free the dma handle & free the memory. */ 6498 ddi_dma_mem_free( 6499 &ahci_portp->ahciport_cmd_tables_acc_handle[slot]); 6500 ddi_dma_free_handle( 6501 &ahci_portp->ahciport_cmd_tables_dma_handle[slot]); 6502 goto err_out; 6503 } 6504 6505 bzero((void *)ahci_portp->ahciport_cmd_tables[slot], 6506 ahci_cmd_table_size); 6507 6508 /* Config Port Command Table Base Address */ 6509 SET_COMMAND_TABLE_BASE_ADDR( 6510 (&ahci_portp->ahciport_cmd_list[slot]), 6511 cmd_table_dma_cookie.dmac_laddress & 0xffffffffull); 6512 6513 #ifndef __lock_lint 6514 SET_COMMAND_TABLE_BASE_ADDR_UPPER( 6515 (&ahci_portp->ahciport_cmd_list[slot]), 6516 cmd_table_dma_cookie.dmac_laddress >> 32); 6517 #endif 6518 } 6519 6520 return (AHCI_SUCCESS); 6521 err_out: 6522 6523 for (slot--; slot >= 0; slot--) { 6524 /* Unbind the cmd table dma handle first */ 6525 (void) ddi_dma_unbind_handle( 6526 ahci_portp->ahciport_cmd_tables_dma_handle[slot]); 6527 6528 /* Then free the underlying memory */ 6529 ddi_dma_mem_free( 6530 &ahci_portp->ahciport_cmd_tables_acc_handle[slot]); 6531 6532 /* Now free the handle itself */ 6533 ddi_dma_free_handle( 6534 &ahci_portp->ahciport_cmd_tables_dma_handle[slot]); 6535 } 6536 6537 return (AHCI_FAILURE); 6538 } 6539 6540 /* 6541 * Deallocates memory for all Command Tables. 6542 */ 6543 static void 6544 ahci_dealloc_cmd_tables(ahci_ctl_t *ahci_ctlp, ahci_port_t *ahci_portp) 6545 { 6546 int slot; 6547 6548 ASSERT(MUTEX_HELD(&ahci_portp->ahciport_mutex)); 6549 6550 AHCIDBG(AHCIDBG_ENTRY, ahci_ctlp, 6551 "ahci_dealloc_cmd_tables: %d enter", 6552 ahci_portp->ahciport_port_num); 6553 6554 for (slot = 0; slot < ahci_ctlp->ahcictl_num_cmd_slots; slot++) { 6555 /* Unbind the cmd table dma handle first. */ 6556 (void) ddi_dma_unbind_handle( 6557 ahci_portp->ahciport_cmd_tables_dma_handle[slot]); 6558 6559 /* Then free the underlying memory. */ 6560 ddi_dma_mem_free( 6561 &ahci_portp->ahciport_cmd_tables_acc_handle[slot]); 6562 6563 /* Now free the handle itself. */ 6564 ddi_dma_free_handle( 6565 &ahci_portp->ahciport_cmd_tables_dma_handle[slot]); 6566 } 6567 } 6568 6569 /* 6570 * Update SATA registers at controller ports 6571 */ 6572 static void 6573 ahci_update_sata_registers(ahci_ctl_t *ahci_ctlp, uint8_t port, 6574 sata_device_t *sd) 6575 { 6576 ASSERT(MUTEX_HELD(&ahci_ctlp->ahcictl_ports[port]->ahciport_mutex)); 6577 6578 sd->satadev_scr.sstatus = 6579 ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 6580 (uint32_t *)(AHCI_PORT_PxSSTS(ahci_ctlp, port))); 6581 sd->satadev_scr.serror = 6582 ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 6583 (uint32_t *)(AHCI_PORT_PxSERR(ahci_ctlp, port))); 6584 sd->satadev_scr.scontrol = 6585 ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 6586 (uint32_t *)(AHCI_PORT_PxSCTL(ahci_ctlp, port))); 6587 sd->satadev_scr.sactive = 6588 ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 6589 (uint32_t *)(AHCI_PORT_PxSACT(ahci_ctlp, port))); 6590 } 6591 6592 /* 6593 * For poll mode, ahci_port_intr will be called to emulate the interrupt 6594 */ 6595 static void 6596 ahci_port_intr(ahci_ctl_t *ahci_ctlp, ahci_port_t *ahci_portp, uint8_t port) 6597 { 6598 uint32_t port_intr_status; 6599 uint32_t port_intr_enable; 6600 6601 AHCIDBG(AHCIDBG_INTR|AHCIDBG_ENTRY, ahci_ctlp, 6602 "ahci_port_intr enter: port %d", port); 6603 6604 mutex_enter(&ahci_portp->ahciport_mutex); 6605 if (ahci_portp->ahciport_flags & AHCI_PORT_FLAG_POLLING) { 6606 /* For SATA_OPMODE_POLLING commands */ 6607 port_intr_enable = 6608 (AHCI_INTR_STATUS_DHRS | 6609 AHCI_INTR_STATUS_PSS | 6610 AHCI_INTR_STATUS_SDBS | 6611 AHCI_INTR_STATUS_UFS | 6612 AHCI_INTR_STATUS_PCS | 6613 AHCI_INTR_STATUS_PRCS | 6614 AHCI_INTR_STATUS_OFS | 6615 AHCI_INTR_STATUS_INFS | 6616 AHCI_INTR_STATUS_IFS | 6617 AHCI_INTR_STATUS_HBDS | 6618 AHCI_INTR_STATUS_HBFS | 6619 AHCI_INTR_STATUS_TFES); 6620 } else { 6621 /* 6622 * port_intr_enable indicates that the corresponding interrrupt 6623 * reporting is enabled. 6624 */ 6625 port_intr_enable = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 6626 (uint32_t *)AHCI_PORT_PxIE(ahci_ctlp, port)); 6627 } 6628 6629 /* IPMS error in port reset should be ignored according AHCI spec. */ 6630 if (!(ahci_portp->ahciport_flags & AHCI_PORT_FLAG_IGNORE_IPMS)) 6631 port_intr_enable |= AHCI_INTR_STATUS_IPMS; 6632 mutex_exit(&ahci_portp->ahciport_mutex); 6633 6634 /* 6635 * port_intr_stats indicates that the corresponding interrupt 6636 * condition is active. 6637 */ 6638 port_intr_status = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 6639 (uint32_t *)AHCI_PORT_PxIS(ahci_ctlp, port)); 6640 6641 AHCIDBG(AHCIDBG_INTR, ahci_ctlp, 6642 "ahci_port_intr: port %d, port_intr_status = 0x%x, " 6643 "port_intr_enable = 0x%x", 6644 port, port_intr_status, port_intr_enable); 6645 6646 port_intr_status &= port_intr_enable; 6647 6648 /* 6649 * Pending interrupt events are indicated by the PxIS register. 6650 * Make sure we don't miss any event. 6651 */ 6652 if (ahci_check_ctl_handle(ahci_ctlp) != DDI_SUCCESS) { 6653 ddi_fm_service_impact(ahci_ctlp->ahcictl_dip, 6654 DDI_SERVICE_UNAFFECTED); 6655 ddi_fm_acc_err_clear(ahci_ctlp->ahcictl_ahci_acc_handle, 6656 DDI_FME_VERSION); 6657 return; 6658 } 6659 6660 /* First clear the port interrupts status */ 6661 ddi_put32(ahci_ctlp->ahcictl_ahci_acc_handle, 6662 (uint32_t *)AHCI_PORT_PxIS(ahci_ctlp, port), 6663 port_intr_status); 6664 6665 /* Check the completed non-queued commands */ 6666 if (port_intr_status & (AHCI_INTR_STATUS_DHRS | 6667 AHCI_INTR_STATUS_PSS)) { 6668 (void) ahci_intr_cmd_cmplt(ahci_ctlp, 6669 ahci_portp, port); 6670 } 6671 6672 /* Check the completed queued commands */ 6673 if (port_intr_status & AHCI_INTR_STATUS_SDBS) { 6674 (void) ahci_intr_set_device_bits(ahci_ctlp, 6675 ahci_portp, port); 6676 } 6677 6678 /* Check the port connect change status interrupt bit */ 6679 if (port_intr_status & AHCI_INTR_STATUS_PCS) { 6680 (void) ahci_intr_port_connect_change(ahci_ctlp, 6681 ahci_portp, port); 6682 } 6683 6684 /* Check the device mechanical presence status interrupt bit */ 6685 if (port_intr_status & AHCI_INTR_STATUS_DMPS) { 6686 (void) ahci_intr_device_mechanical_presence_status( 6687 ahci_ctlp, ahci_portp, port); 6688 } 6689 6690 /* Check the PhyRdy change status interrupt bit */ 6691 if (port_intr_status & AHCI_INTR_STATUS_PRCS) { 6692 (void) ahci_intr_phyrdy_change(ahci_ctlp, ahci_portp, 6693 port); 6694 } 6695 6696 /* 6697 * Check the non-fatal error interrupt bits, there are four 6698 * kinds of non-fatal errors at the time being: 6699 * 6700 * PxIS.UFS - Unknown FIS Error 6701 * PxIS.OFS - Overflow Error 6702 * PxIS.INFS - Interface Non-Fatal Error 6703 * PxIS.IPMS - Incorrect Port Multiplier Status Error 6704 * 6705 * For these non-fatal errors, the HBA can continue to operate, 6706 * so the driver just log the error messages. 6707 */ 6708 if (port_intr_status & (AHCI_INTR_STATUS_UFS | 6709 AHCI_INTR_STATUS_OFS | 6710 AHCI_INTR_STATUS_IPMS | 6711 AHCI_INTR_STATUS_INFS)) { 6712 (void) ahci_intr_non_fatal_error(ahci_ctlp, ahci_portp, 6713 port, port_intr_status); 6714 } 6715 6716 /* 6717 * Check the fatal error interrupt bits, there are four kinds 6718 * of fatal errors for AHCI controllers: 6719 * 6720 * PxIS.HBFS - Host Bus Fatal Error 6721 * PxIS.HBDS - Host Bus Data Error 6722 * PxIS.IFS - Interface Fatal Error 6723 * PxIS.TFES - Task File Error 6724 * 6725 * The fatal error means the HBA can not recover from it by 6726 * itself, and it will try to abort the transfer, and the software 6727 * must intervene to restart the port. 6728 */ 6729 if (port_intr_status & (AHCI_INTR_STATUS_IFS | 6730 AHCI_INTR_STATUS_HBDS | 6731 AHCI_INTR_STATUS_HBFS | 6732 AHCI_INTR_STATUS_TFES)) 6733 (void) ahci_intr_fatal_error(ahci_ctlp, ahci_portp, 6734 port, port_intr_status); 6735 6736 /* Check the cold port detect interrupt bit */ 6737 if (port_intr_status & AHCI_INTR_STATUS_CPDS) { 6738 (void) ahci_intr_cold_port_detect(ahci_ctlp, ahci_portp, port); 6739 } 6740 6741 /* Second clear the corresponding bit in IS.IPS */ 6742 ddi_put32(ahci_ctlp->ahcictl_ahci_acc_handle, 6743 (uint32_t *)AHCI_GLOBAL_IS(ahci_ctlp), (0x1 << port)); 6744 6745 /* Try to recover at the end of the interrupt handler. */ 6746 if (ahci_check_acc_handle(ahci_ctlp->ahcictl_ahci_acc_handle) != 6747 DDI_FM_OK) { 6748 ddi_fm_service_impact(ahci_ctlp->ahcictl_dip, 6749 DDI_SERVICE_UNAFFECTED); 6750 ddi_fm_acc_err_clear(ahci_ctlp->ahcictl_ahci_acc_handle, 6751 DDI_FME_VERSION); 6752 } 6753 } 6754 6755 /* 6756 * Interrupt service handler 6757 */ 6758 static uint_t 6759 ahci_intr(caddr_t arg1, caddr_t arg2) 6760 { 6761 #ifndef __lock_lint 6762 _NOTE(ARGUNUSED(arg2)) 6763 #endif 6764 /* LINTED */ 6765 ahci_ctl_t *ahci_ctlp = (ahci_ctl_t *)arg1; 6766 ahci_port_t *ahci_portp; 6767 int32_t global_intr_status; 6768 uint8_t port; 6769 6770 /* 6771 * global_intr_status indicates that the corresponding port has 6772 * an interrupt pending. 6773 */ 6774 global_intr_status = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 6775 (uint32_t *)AHCI_GLOBAL_IS(ahci_ctlp)); 6776 6777 if (!(global_intr_status & ahci_ctlp->ahcictl_ports_implemented)) { 6778 /* The interrupt is not ours */ 6779 return (DDI_INTR_UNCLAIMED); 6780 } 6781 6782 /* 6783 * Check the handle after reading global_intr_status - we don't want 6784 * to miss any port with pending interrupts. 6785 */ 6786 if (ahci_check_acc_handle(ahci_ctlp->ahcictl_ahci_acc_handle) != 6787 DDI_FM_OK) { 6788 ddi_fm_service_impact(ahci_ctlp->ahcictl_dip, 6789 DDI_SERVICE_UNAFFECTED); 6790 ddi_fm_acc_err_clear(ahci_ctlp->ahcictl_ahci_acc_handle, 6791 DDI_FME_VERSION); 6792 return (DDI_INTR_UNCLAIMED); 6793 } 6794 6795 /* Loop for all the ports */ 6796 for (port = 0; port < ahci_ctlp->ahcictl_num_ports; port++) { 6797 if (!AHCI_PORT_IMPLEMENTED(ahci_ctlp, port)) { 6798 continue; 6799 } 6800 if (!((0x1 << port) & global_intr_status)) { 6801 continue; 6802 } 6803 6804 ahci_portp = ahci_ctlp->ahcictl_ports[port]; 6805 6806 /* Call ahci_port_intr */ 6807 ahci_port_intr(ahci_ctlp, ahci_portp, port); 6808 } 6809 6810 return (DDI_INTR_CLAIMED); 6811 } 6812 6813 /* 6814 * For non-queued commands, when the corresponding bit in the PxCI register 6815 * is cleared, it means the command is completed successfully. And according 6816 * to the HBA state machine, there are three conditions which possibly will 6817 * try to clear the PxCI register bit. 6818 * 1. Receive one D2H Register FIS which is with 'I' bit set 6819 * 2. Update PIO Setup FIS 6820 * 3. Transmit a command and receive R_OK if CTBA.C is set (software reset) 6821 * 6822 * Process completed non-queued commands when the interrupt status bit - 6823 * AHCI_INTR_STATUS_DHRS or AHCI_INTR_STATUS_PSS is set. 6824 * 6825 * AHCI_INTR_STATUS_DHRS means a D2H Register FIS has been received 6826 * with the 'I' bit set. And the following commands will send thus 6827 * FIS with 'I' bit set upon the successful completion: 6828 * 1. Non-data commands 6829 * 2. DMA data-in command 6830 * 3. DMA data-out command 6831 * 4. PIO data-out command 6832 * 5. PACKET non-data commands 6833 * 6. PACKET PIO data-in command 6834 * 7. PACKET PIO data-out command 6835 * 8. PACKET DMA data-in command 6836 * 9. PACKET DMA data-out command 6837 * 6838 * AHCI_INTR_STATUS_PSS means a PIO Setup FIS has been received 6839 * with the 'I' bit set. And the following commands will send this 6840 * FIS upon the successful completion: 6841 * 1. PIO data-in command 6842 */ 6843 static int 6844 ahci_intr_cmd_cmplt(ahci_ctl_t *ahci_ctlp, 6845 ahci_port_t *ahci_portp, uint8_t port) 6846 { 6847 uint32_t port_cmd_issue = 0; 6848 uint32_t finished_tags; 6849 int finished_slot; 6850 sata_pkt_t *satapkt; 6851 ahci_fis_d2h_register_t *rcvd_fisp; 6852 #if AHCI_DEBUG 6853 ahci_cmd_header_t *cmd_header; 6854 uint32_t cmd_dmacount; 6855 #endif 6856 6857 mutex_enter(&ahci_portp->ahciport_mutex); 6858 6859 if (!ERR_RETRI_CMD_IN_PROGRESS(ahci_portp) && 6860 !RDWR_PMULT_CMD_IN_PROGRESS(ahci_portp) && 6861 !NON_NCQ_CMD_IN_PROGRESS(ahci_portp)) { 6862 /* 6863 * Spurious interrupt. Nothing to be done. 6864 */ 6865 mutex_exit(&ahci_portp->ahciport_mutex); 6866 return (AHCI_SUCCESS); 6867 } 6868 6869 port_cmd_issue = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 6870 (uint32_t *)AHCI_PORT_PxCI(ahci_ctlp, port)); 6871 6872 /* If the PxCI corrupts, don't complete the commmands. */ 6873 if (ahci_check_acc_handle(ahci_ctlp->ahcictl_ahci_acc_handle) 6874 != DDI_FM_OK) { 6875 mutex_exit(&ahci_portp->ahciport_mutex); 6876 return (AHCI_FAILURE); 6877 } 6878 6879 if (ERR_RETRI_CMD_IN_PROGRESS(ahci_portp)) { 6880 /* Slot 0 is always used during error recovery */ 6881 finished_tags = 0x1 & ~port_cmd_issue; 6882 AHCIDBG(AHCIDBG_ERRS, ahci_ctlp, 6883 "ahci_intr_cmd_cmplt: port %d the sata pkt for error " 6884 "retrieval is finished, and finished_tags = 0x%x", 6885 port, finished_tags); 6886 } else if (RDWR_PMULT_CMD_IN_PROGRESS(ahci_portp)) { 6887 finished_tags = 0x1 & ~port_cmd_issue; 6888 AHCIDBG(AHCIDBG_INFO, ahci_ctlp, 6889 "ahci_intr_cmd_cmplt: port %d the sata pkt for r/w " 6890 "port multiplier is finished, and finished_tags = 0x%x", 6891 port, finished_tags); 6892 6893 } else { 6894 6895 finished_tags = ahci_portp->ahciport_pending_tags & 6896 ~port_cmd_issue & AHCI_SLOT_MASK(ahci_ctlp); 6897 } 6898 6899 AHCIDBG(AHCIDBG_INTR, ahci_ctlp, 6900 "ahci_intr_cmd_cmplt: pending_tags = 0x%x, " 6901 "port_cmd_issue = 0x%x finished_tags = 0x%x", 6902 ahci_portp->ahciport_pending_tags, port_cmd_issue, 6903 finished_tags); 6904 6905 if (ERR_RETRI_CMD_IN_PROGRESS(ahci_portp) && 6906 (finished_tags == 0x1)) { 6907 satapkt = ahci_portp->ahciport_err_retri_pkt; 6908 ASSERT(satapkt != NULL); 6909 6910 AHCIDBG(AHCIDBG_INTR, ahci_ctlp, 6911 "ahci_intr_cmd_cmplt: sending up pkt 0x%p " 6912 "with SATA_PKT_COMPLETED", (void *)satapkt); 6913 6914 ahci_add_doneq(ahci_portp, satapkt, SATA_PKT_COMPLETED); 6915 goto out; 6916 } 6917 6918 if (RDWR_PMULT_CMD_IN_PROGRESS(ahci_portp) && 6919 (finished_tags == 0x1)) { 6920 satapkt = ahci_portp->ahciport_rdwr_pmult_pkt; 6921 ASSERT(satapkt != NULL); 6922 6923 AHCIDBG(AHCIDBG_INTR, ahci_ctlp, 6924 "ahci_intr_cmd_cmplt: sending up pkt 0x%p " 6925 "with SATA_PKT_COMPLETED", (void *)satapkt); 6926 6927 /* READ PORTMULT need copy out FIS content. */ 6928 if (satapkt->satapkt_cmd.satacmd_flags.sata_special_regs) { 6929 rcvd_fisp = &(ahci_portp->ahciport_rcvd_fis-> 6930 ahcirf_d2h_register_fis); 6931 satapkt->satapkt_cmd.satacmd_status_reg = 6932 GET_RFIS_STATUS(rcvd_fisp); 6933 ahci_copy_out_regs(&satapkt->satapkt_cmd, rcvd_fisp); 6934 } 6935 6936 ahci_add_doneq(ahci_portp, satapkt, SATA_PKT_COMPLETED); 6937 goto out; 6938 } 6939 6940 while (finished_tags) { 6941 finished_slot = ddi_ffs(finished_tags) - 1; 6942 if (finished_slot == -1) { 6943 goto out; 6944 } 6945 6946 satapkt = ahci_portp->ahciport_slot_pkts[finished_slot]; 6947 ASSERT(satapkt != NULL); 6948 #if AHCI_DEBUG 6949 /* 6950 * For non-native queued commands, the PRD byte count field 6951 * shall contain an accurate count of the number of bytes 6952 * transferred for the command before the PxCI bit is cleared 6953 * to '0' for the command. 6954 * 6955 * The purpose of this field is to let software know how many 6956 * bytes transferred for a given operation in order to 6957 * determine if underflow occurred. When issuing native command 6958 * queuing commands, this field should not be used and is not 6959 * required to be valid since in this case underflow is always 6960 * illegal. 6961 * 6962 * For data reads, the HBA will update its PRD byte count with 6963 * the total number of bytes received from the last FIS, and 6964 * may be able to continue normally. For data writes, the 6965 * device will detect an error, and HBA most likely will get 6966 * a fatal error. 6967 * 6968 * Therefore, here just put code to debug part. And please 6969 * refer to the comment above ahci_intr_fatal_error for the 6970 * definition of underflow error. 6971 */ 6972 cmd_dmacount = 6973 ahci_portp->ahciport_prd_bytecounts[finished_slot]; 6974 if (cmd_dmacount) { 6975 cmd_header = 6976 &ahci_portp->ahciport_cmd_list[finished_slot]; 6977 AHCIDBG(AHCIDBG_INTR|AHCIDBG_PRDT, ahci_ctlp, 6978 "ahci_intr_cmd_cmplt: port %d, " 6979 "PRD Byte Count = 0x%x, " 6980 "ahciport_prd_bytecounts = 0x%x", port, 6981 cmd_header->ahcich_prd_byte_count, 6982 cmd_dmacount); 6983 6984 if (cmd_header->ahcich_prd_byte_count != cmd_dmacount) { 6985 AHCIDBG(AHCIDBG_UNDERFLOW, ahci_ctlp, 6986 "ahci_intr_cmd_cmplt: port %d, " 6987 "an underflow occurred", port); 6988 } 6989 } 6990 #endif 6991 6992 /* 6993 * For SATAC_SMART command with SATA_SMART_RETURN_STATUS 6994 * feature, sata_special_regs flag will be set, and the 6995 * driver should copy the status and the other corresponding 6996 * register values in the D2H Register FIS received (It's 6997 * working on Non-data protocol) from the device back to 6998 * the sata_cmd. 6999 * 7000 * For every AHCI port, there is only one Received FIS 7001 * structure, which contains the FISes received from the 7002 * device, So we're trying to copy the content of D2H 7003 * Register FIS in the Received FIS structure back to 7004 * the sata_cmd. 7005 */ 7006 if (satapkt->satapkt_cmd.satacmd_flags.sata_special_regs) { 7007 rcvd_fisp = &(ahci_portp->ahciport_rcvd_fis-> 7008 ahcirf_d2h_register_fis); 7009 satapkt->satapkt_cmd.satacmd_status_reg = 7010 GET_RFIS_STATUS(rcvd_fisp); 7011 ahci_copy_out_regs(&satapkt->satapkt_cmd, rcvd_fisp); 7012 } 7013 7014 AHCIDBG(AHCIDBG_INTR, ahci_ctlp, 7015 "ahci_intr_cmd_cmplt: sending up pkt 0x%p " 7016 "with SATA_PKT_COMPLETED", (void *)satapkt); 7017 7018 CLEAR_BIT(ahci_portp->ahciport_pending_tags, finished_slot); 7019 CLEAR_BIT(finished_tags, finished_slot); 7020 ahci_portp->ahciport_slot_pkts[finished_slot] = NULL; 7021 7022 ahci_add_doneq(ahci_portp, satapkt, SATA_PKT_COMPLETED); 7023 } 7024 out: 7025 AHCIDBG(AHCIDBG_PKTCOMP, ahci_ctlp, 7026 "ahci_intr_cmd_cmplt: pending_tags = 0x%x", 7027 ahci_portp->ahciport_pending_tags); 7028 7029 ahci_flush_doneq(ahci_portp); 7030 7031 mutex_exit(&ahci_portp->ahciport_mutex); 7032 7033 return (AHCI_SUCCESS); 7034 } 7035 7036 /* 7037 * AHCI_INTR_STATUS_SDBS means a Set Device Bits FIS has been received 7038 * with the 'I' bit set and has been copied into system memory. It will 7039 * be sent under the following situations: 7040 * 7041 * 1. NCQ command is completed 7042 * 7043 * The completion of NCQ commands (READ/WRITE FPDMA QUEUED) is performed 7044 * via the Set Device Bits FIS. When such event is generated, the software 7045 * needs to read PxSACT register and compares the current value to the 7046 * list of commands previously issue by software. ahciport_pending_ncq_tags 7047 * keeps the tags of previously issued commands. 7048 * 7049 * 2. Asynchronous Notification 7050 * 7051 * Asynchronous Notification is a feature in SATA spec 2.6. 7052 * 7053 * 1) ATAPI device will send a signal to the host when media is inserted or 7054 * removed and avoids polling the device for media changes. The signal 7055 * sent to the host is a Set Device Bits FIS with the 'I' and 'N' bits 7056 * set to '1'. At the moment, it's not supported yet. 7057 * 7058 * 2) Port multiplier will send a signal to the host when a hot plug event 7059 * has occured on a port multiplier port. It is used when command based 7060 * switching is employed. This is handled by ahci_intr_pmult_sntf_events() 7061 */ 7062 static int 7063 ahci_intr_set_device_bits(ahci_ctl_t *ahci_ctlp, 7064 ahci_port_t *ahci_portp, uint8_t port) 7065 { 7066 ahci_addr_t addr; 7067 7068 AHCIDBG(AHCIDBG_ENTRY|AHCIDBG_INTR, ahci_ctlp, 7069 "ahci_intr_set_device_bits enter: port %d", port); 7070 7071 /* Initialize HBA port address */ 7072 AHCI_ADDR_SET_PORT(&addr, port); 7073 7074 /* NCQ plug handler */ 7075 (void) ahci_intr_ncq_events(ahci_ctlp, ahci_portp, &addr); 7076 7077 /* Check port multiplier's asynchronous notification events */ 7078 if (ahci_ctlp->ahcictl_cap & AHCI_CAP_SNTF) { 7079 (void) ahci_intr_pmult_sntf_events(ahci_ctlp, 7080 ahci_portp, port); 7081 } 7082 7083 /* ATAPI events is not supported yet */ 7084 7085 return (AHCI_SUCCESS); 7086 } 7087 /* 7088 * NCQ interrupt handler. Called upon a NCQ command is completed. 7089 * Only be called from ahci_intr_set_device_bits(). 7090 */ 7091 static int 7092 ahci_intr_ncq_events(ahci_ctl_t *ahci_ctlp, 7093 ahci_port_t *ahci_portp, ahci_addr_t *addrp) 7094 { 7095 uint32_t port_sactive; 7096 uint32_t port_cmd_issue; 7097 uint32_t issued_tags; 7098 int issued_slot; 7099 uint32_t finished_tags; 7100 int finished_slot; 7101 uint8_t port = addrp->aa_port; 7102 sata_pkt_t *satapkt; 7103 7104 AHCIDBG(AHCIDBG_ENTRY|AHCIDBG_INTR|AHCIDBG_NCQ, ahci_ctlp, 7105 "ahci_intr_set_device_bits enter: port %d", port); 7106 7107 mutex_enter(&ahci_portp->ahciport_mutex); 7108 if (!NCQ_CMD_IN_PROGRESS(ahci_portp)) { 7109 mutex_exit(&ahci_portp->ahciport_mutex); 7110 return (AHCI_SUCCESS); 7111 } 7112 7113 /* 7114 * First the handler got which commands are finished by checking 7115 * PxSACT register 7116 */ 7117 port_sactive = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 7118 (uint32_t *)AHCI_PORT_PxSACT(ahci_ctlp, port)); 7119 7120 finished_tags = ahci_portp->ahciport_pending_ncq_tags & 7121 ~port_sactive & AHCI_NCQ_SLOT_MASK(ahci_portp); 7122 7123 AHCIDBG(AHCIDBG_INTR|AHCIDBG_NCQ, ahci_ctlp, 7124 "ahci_intr_set_device_bits: port %d pending_ncq_tags = 0x%x " 7125 "port_sactive = 0x%x", port, 7126 ahci_portp->ahciport_pending_ncq_tags, port_sactive); 7127 7128 AHCIDBG(AHCIDBG_INTR|AHCIDBG_NCQ, ahci_ctlp, 7129 "ahci_intr_set_device_bits: finished_tags = 0x%x", finished_tags); 7130 7131 /* 7132 * For NCQ commands, the software can determine which command has 7133 * already been transmitted to the device by checking PxCI register. 7134 */ 7135 port_cmd_issue = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 7136 (uint32_t *)AHCI_PORT_PxCI(ahci_ctlp, port)); 7137 7138 issued_tags = ahci_portp->ahciport_pending_tags & 7139 ~port_cmd_issue & AHCI_SLOT_MASK(ahci_ctlp); 7140 7141 /* If the PxSACT/PxCI corrupts, don't complete the NCQ commmands. */ 7142 if (ahci_check_acc_handle(ahci_ctlp->ahcictl_ahci_acc_handle) 7143 != DDI_FM_OK) { 7144 mutex_exit(&ahci_portp->ahciport_mutex); 7145 return (AHCI_FAILURE); 7146 } 7147 7148 AHCIDBG(AHCIDBG_INTR|AHCIDBG_NCQ, ahci_ctlp, 7149 "ahci_intr_set_device_bits: port %d pending_tags = 0x%x " 7150 "port_cmd_issue = 0x%x", port, 7151 ahci_portp->ahciport_pending_tags, port_cmd_issue); 7152 7153 AHCIDBG(AHCIDBG_INTR|AHCIDBG_NCQ, ahci_ctlp, 7154 "ahci_intr_set_device_bits: issued_tags = 0x%x", issued_tags); 7155 7156 /* 7157 * Clear ahciport_pending_tags bit when the corresponding command 7158 * is already sent down to the device. 7159 */ 7160 while (issued_tags) { 7161 issued_slot = ddi_ffs(issued_tags) - 1; 7162 if (issued_slot == -1) { 7163 goto next; 7164 } 7165 CLEAR_BIT(ahci_portp->ahciport_pending_tags, issued_slot); 7166 CLEAR_BIT(issued_tags, issued_slot); 7167 } 7168 7169 next: 7170 while (finished_tags) { 7171 finished_slot = ddi_ffs(finished_tags) - 1; 7172 if (finished_slot == -1) { 7173 goto out; 7174 } 7175 7176 /* The command is certainly transmitted to the device */ 7177 ASSERT(!(ahci_portp->ahciport_pending_tags & 7178 (0x1 << finished_slot))); 7179 7180 satapkt = ahci_portp->ahciport_slot_pkts[finished_slot]; 7181 ASSERT(satapkt != NULL); 7182 7183 AHCIDBG(AHCIDBG_INTR|AHCIDBG_NCQ, ahci_ctlp, 7184 "ahci_intr_set_device_bits: sending up pkt 0x%p " 7185 "with SATA_PKT_COMPLETED", (void *)satapkt); 7186 7187 CLEAR_BIT(ahci_portp->ahciport_pending_ncq_tags, finished_slot); 7188 CLEAR_BIT(finished_tags, finished_slot); 7189 ahci_portp->ahciport_slot_pkts[finished_slot] = NULL; 7190 7191 ahci_add_doneq(ahci_portp, satapkt, SATA_PKT_COMPLETED); 7192 } 7193 out: 7194 AHCIDBG(AHCIDBG_PKTCOMP|AHCIDBG_NCQ, ahci_ctlp, 7195 "ahci_intr_set_device_bits: port %d " 7196 "pending_ncq_tags = 0x%x pending_tags = 0x%x", 7197 port, ahci_portp->ahciport_pending_ncq_tags, 7198 ahci_portp->ahciport_pending_tags); 7199 7200 ahci_flush_doneq(ahci_portp); 7201 7202 mutex_exit(&ahci_portp->ahciport_mutex); 7203 7204 return (AHCI_SUCCESS); 7205 } 7206 7207 /* 7208 * Port multiplier asynchronous notification event handler. Called upon a 7209 * device is hot plugged/pulled. 7210 * 7211 * The async-notification event will only be recorded by ahcipmi_snotif_tags 7212 * here and will be handled by ahci_probe_pmult(). 7213 * 7214 * NOTE: called only from ahci_port_intr(). 7215 */ 7216 static int 7217 ahci_intr_pmult_sntf_events(ahci_ctl_t *ahci_ctlp, ahci_port_t *ahci_portp, 7218 uint8_t port) 7219 { 7220 sata_device_t sdevice; 7221 7222 AHCIDBG(AHCIDBG_ENTRY|AHCIDBG_INTR, ahci_ctlp, 7223 "ahci_intr_pmult_sntf_events enter: port %d ", port); 7224 7225 /* no hot-plug while attaching process */ 7226 mutex_enter(&ahci_ctlp->ahcictl_mutex); 7227 if (ahci_ctlp->ahcictl_flags & AHCI_ATTACH) { 7228 mutex_exit(&ahci_ctlp->ahcictl_mutex); 7229 return (AHCI_SUCCESS); 7230 } 7231 mutex_exit(&ahci_ctlp->ahcictl_mutex); 7232 7233 mutex_enter(&ahci_portp->ahciport_mutex); 7234 if (ahci_portp->ahciport_device_type != SATA_DTYPE_PMULT) { 7235 mutex_exit(&ahci_portp->ahciport_mutex); 7236 return (AHCI_SUCCESS); 7237 } 7238 7239 ASSERT(ahci_portp->ahciport_pmult_info != NULL); 7240 7241 ahci_portp->ahciport_pmult_info->ahcipmi_snotif_tags = 7242 ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 7243 (uint32_t *)AHCI_PORT_PxSNTF(ahci_ctlp, port)); 7244 ddi_put32(ahci_ctlp->ahcictl_ahci_acc_handle, 7245 (uint32_t *)AHCI_PORT_PxSNTF(ahci_ctlp, port), 7246 AHCI_SNOTIF_CLEAR_ALL); 7247 7248 if (ahci_portp->ahciport_pmult_info->ahcipmi_snotif_tags == 0) { 7249 mutex_exit(&ahci_portp->ahciport_mutex); 7250 return (AHCI_SUCCESS); 7251 } 7252 7253 /* Port Multiplier sub-device hot-plug handler */ 7254 if (RDWR_PMULT_CMD_IN_PROGRESS(ahci_portp)) { 7255 mutex_exit(&ahci_portp->ahciport_mutex); 7256 return (AHCI_SUCCESS); 7257 } 7258 7259 if (ahci_portp->ahciport_flags & AHCI_PORT_FLAG_PMULT_SNTF) { 7260 /* Not allowed to re-enter. */ 7261 mutex_exit(&ahci_portp->ahciport_mutex); 7262 return (AHCI_SUCCESS); 7263 } 7264 7265 ahci_portp->ahciport_flags |= AHCI_PORT_FLAG_PMULT_SNTF; 7266 7267 /* 7268 * NOTE: 7269 * Even if Asynchronous Notification is supported (and enabled) by 7270 * both controller and the port multiplier, the content of PxSNTF 7271 * register is always set to 0x8000 by async notification event. We 7272 * need to check GSCR[32] on the port multiplier to find out the 7273 * owner of this event. 7274 * This is not accord with SATA spec 2.6 and needs further 7275 * clarification. 7276 */ 7277 /* hot-plug will not reported while reseting. */ 7278 if (ahci_portp->ahciport_reset_in_progress == 1) { 7279 AHCIDBG(AHCIDBG_INFO|AHCIDBG_PMULT, ahci_ctlp, 7280 "port %d snotif event ignored", port); 7281 ahci_portp->ahciport_flags &= ~AHCI_PORT_FLAG_PMULT_SNTF; 7282 mutex_exit(&ahci_portp->ahciport_mutex); 7283 return (AHCI_SUCCESS); 7284 } 7285 7286 AHCIDBG(AHCIDBG_INFO|AHCIDBG_PMULT, ahci_ctlp, 7287 "PxSNTF is set to 0x%x by port multiplier", 7288 ahci_portp->ahciport_pmult_info->ahcipmi_snotif_tags); 7289 7290 /* 7291 * Now we need do some necessary operation and inform SATA framework 7292 * that link/device events has happened. 7293 */ 7294 bzero((void *)&sdevice, sizeof (sata_device_t)); 7295 sdevice.satadev_addr.cport = ahci_ctlp-> 7296 ahcictl_port_to_cport[port]; 7297 sdevice.satadev_addr.pmport = SATA_PMULT_HOSTPORT; 7298 sdevice.satadev_addr.qual = SATA_ADDR_PMULT; 7299 sdevice.satadev_state = SATA_PSTATE_PWRON; 7300 7301 /* Just reject packets, do not stop that port. */ 7302 ahci_reject_all_abort_pkts(ahci_ctlp, ahci_portp, port); 7303 7304 mutex_exit(&ahci_portp->ahciport_mutex); 7305 sata_hba_event_notify( 7306 ahci_ctlp->ahcictl_sata_hba_tran->sata_tran_hba_dip, 7307 &sdevice, 7308 SATA_EVNT_PMULT_LINK_CHANGED); 7309 mutex_enter(&ahci_portp->ahciport_mutex); 7310 7311 ahci_portp->ahciport_flags &= ~AHCI_PORT_FLAG_PMULT_SNTF; 7312 mutex_exit(&ahci_portp->ahciport_mutex); 7313 7314 return (AHCI_SUCCESS); 7315 } 7316 7317 /* 7318 * 1=Change in Current Connect Status. 0=No change in Current Connect Status. 7319 * This bit reflects the state of PxSERR.DIAG.X. This bit is only cleared 7320 * when PxSERR.DIAG.X is cleared. When PxSERR.DIAG.X is set to one, it 7321 * indicates a COMINIT signal was received. 7322 * 7323 * Hot plug insertion is detected by reception of a COMINIT signal from the 7324 * device. On reception of unsolicited COMINIT, the HBA shall generate a 7325 * COMRESET. If the COMINIT is in responce to a COMRESET, then the HBA shall 7326 * begin the normal communication negotiation sequence as outlined in the 7327 * Serial ATA 1.0a specification. When a COMRESET is sent to the device the 7328 * PxSSTS.DET field shall be cleared to 0h. When a COMINIT is received, the 7329 * PxSSTS.DET field shall be set to 1h. When the communication negotiation 7330 * sequence is complete and PhyRdy is true the PxSSTS.DET field shall be set 7331 * to 3h. Therefore, at the moment the ahci driver is going to check PhyRdy 7332 * to handle hot plug insertion. In this interrupt handler, just do nothing 7333 * but print some log message and clear the bit. 7334 */ 7335 static int 7336 ahci_intr_port_connect_change(ahci_ctl_t *ahci_ctlp, 7337 ahci_port_t *ahci_portp, uint8_t port) 7338 { 7339 #if AHCI_DEBUG 7340 uint32_t port_serror; 7341 #endif 7342 7343 mutex_enter(&ahci_portp->ahciport_mutex); 7344 7345 #if AHCI_DEBUG 7346 port_serror = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 7347 (uint32_t *)AHCI_PORT_PxSERR(ahci_ctlp, port)); 7348 7349 AHCIDBG(AHCIDBG_INTR|AHCIDBG_ENTRY, ahci_ctlp, 7350 "ahci_intr_port_connect_change: port %d, " 7351 "port_serror = 0x%x", port, port_serror); 7352 #endif 7353 7354 /* Clear PxSERR.DIAG.X to clear the interrupt bit */ 7355 ddi_put32(ahci_ctlp->ahcictl_ahci_acc_handle, 7356 (uint32_t *)AHCI_PORT_PxSERR(ahci_ctlp, port), 7357 SERROR_EXCHANGED_ERR); 7358 7359 mutex_exit(&ahci_portp->ahciport_mutex); 7360 7361 return (AHCI_SUCCESS); 7362 } 7363 7364 /* 7365 * Hot Plug Operation for platforms that support Mechanical Presence 7366 * Switches. 7367 * 7368 * When set, it indicates that a mechanical presence switch attached to this 7369 * port has been opened or closed, which may lead to a change in the connection 7370 * state of the device. This bit is only valid if both CAP.SMPS and PxCMD.MPSP 7371 * are set to '1'. 7372 * 7373 * At the moment, this interrupt is not needed and disabled and we just log 7374 * the debug message. 7375 */ 7376 static int 7377 ahci_intr_device_mechanical_presence_status(ahci_ctl_t *ahci_ctlp, 7378 ahci_port_t *ahci_portp, uint8_t port) 7379 { 7380 uint32_t cap_status, port_cmd_status; 7381 7382 AHCIDBG(AHCIDBG_INTR|AHCIDBG_ENTRY, ahci_ctlp, 7383 "ahci_intr_device_mechanical_presence_status enter, " 7384 "port %d", port); 7385 7386 cap_status = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 7387 (uint32_t *)AHCI_GLOBAL_CAP(ahci_ctlp)); 7388 7389 mutex_enter(&ahci_portp->ahciport_mutex); 7390 port_cmd_status = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 7391 (uint32_t *)AHCI_PORT_PxCMD(ahci_ctlp, port)); 7392 7393 if (!(cap_status & AHCI_HBA_CAP_SMPS) || 7394 !(port_cmd_status & AHCI_CMD_STATUS_MPSP)) { 7395 AHCIDBG(AHCIDBG_INTR, ahci_ctlp, 7396 "CAP.SMPS or PxCMD.MPSP is not set, so just ignore " 7397 "the interrupt: cap_status = 0x%x, " 7398 "port_cmd_status = 0x%x", cap_status, port_cmd_status); 7399 mutex_exit(&ahci_portp->ahciport_mutex); 7400 7401 return (AHCI_SUCCESS); 7402 } 7403 7404 #if AHCI_DEBUG 7405 if (port_cmd_status & AHCI_CMD_STATUS_MPSS) { 7406 AHCIDBG(AHCIDBG_INTR, ahci_ctlp, 7407 "The mechanical presence switch is open: " 7408 "port %d, port_cmd_status = 0x%x", 7409 port, port_cmd_status); 7410 } else { 7411 AHCIDBG(AHCIDBG_INTR, ahci_ctlp, 7412 "The mechanical presence switch is close: " 7413 "port %d, port_cmd_status = 0x%x", 7414 port, port_cmd_status); 7415 } 7416 #endif 7417 7418 mutex_exit(&ahci_portp->ahciport_mutex); 7419 7420 return (AHCI_SUCCESS); 7421 } 7422 7423 /* 7424 * Native Hot Plug Support. 7425 * 7426 * When set, it indicates that the internal PHYRDY signal changed state. 7427 * This bit reflects the state of PxSERR.DIAG.N. 7428 * 7429 * There are three kinds of conditions to generate this interrupt event: 7430 * 1. a device is inserted 7431 * 2. a device is disconnected 7432 * 3. when the link enters/exits a Partial or Slumber interface power 7433 * management state 7434 * 7435 * If inteface power management is enabled for a port, the PxSERR.DIAG.N 7436 * bit may be set due to the link entering the Partial or Slumber power 7437 * management state, rather than due to a hot plug insertion or removal 7438 * event. So far, the interface power management is disabled, so the 7439 * driver can reliably get removal detection notification via the 7440 * PxSERR.DIAG.N bit. 7441 */ 7442 static int 7443 ahci_intr_phyrdy_change(ahci_ctl_t *ahci_ctlp, 7444 ahci_port_t *ahci_portp, uint8_t port) 7445 { 7446 uint32_t port_sstatus = 0; /* No dev present & PHY not established. */ 7447 sata_device_t sdevice; 7448 int dev_exists_now = 0; 7449 int dev_existed_previously = 0; 7450 ahci_addr_t port_addr; 7451 7452 AHCIDBG(AHCIDBG_INTR|AHCIDBG_ENTRY, ahci_ctlp, 7453 "ahci_intr_phyrdy_change enter, port %d", port); 7454 7455 /* Clear PxSERR.DIAG.N to clear the interrupt bit */ 7456 mutex_enter(&ahci_portp->ahciport_mutex); 7457 ddi_put32(ahci_ctlp->ahcictl_ahci_acc_handle, 7458 (uint32_t *)AHCI_PORT_PxSERR(ahci_ctlp, port), 7459 SERROR_PHY_RDY_CHG); 7460 mutex_exit(&ahci_portp->ahciport_mutex); 7461 7462 mutex_enter(&ahci_ctlp->ahcictl_mutex); 7463 if ((ahci_ctlp->ahcictl_sata_hba_tran == NULL) || 7464 (ahci_portp == NULL)) { 7465 /* The whole controller setup is not yet done. */ 7466 mutex_exit(&ahci_ctlp->ahcictl_mutex); 7467 return (AHCI_SUCCESS); 7468 } 7469 mutex_exit(&ahci_ctlp->ahcictl_mutex); 7470 7471 mutex_enter(&ahci_portp->ahciport_mutex); 7472 7473 /* SStatus tells the presence of device. */ 7474 port_sstatus = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 7475 (uint32_t *)AHCI_PORT_PxSSTS(ahci_ctlp, port)); 7476 7477 if (SSTATUS_GET_DET(port_sstatus) == SSTATUS_DET_DEVPRE_PHYCOM) { 7478 dev_exists_now = 1; 7479 } 7480 7481 if (ahci_portp->ahciport_device_type != SATA_DTYPE_NONE) { 7482 dev_existed_previously = 1; 7483 } 7484 7485 if (ahci_portp->ahciport_flags & AHCI_PORT_FLAG_NODEV) { 7486 ahci_portp->ahciport_flags &= ~AHCI_PORT_FLAG_NODEV; 7487 AHCIDBG(AHCIDBG_ERRS, ahci_ctlp, 7488 "ahci_intr_phyrdy_change: port %d " 7489 "AHCI_PORT_FLAG_NODEV is cleared", port); 7490 if (dev_exists_now == 0) 7491 dev_existed_previously = 1; 7492 } 7493 7494 bzero((void *)&sdevice, sizeof (sata_device_t)); 7495 sdevice.satadev_addr.cport = ahci_ctlp->ahcictl_port_to_cport[port]; 7496 sdevice.satadev_addr.qual = SATA_ADDR_CPORT; 7497 sdevice.satadev_addr.pmport = 0; 7498 sdevice.satadev_state = SATA_PSTATE_PWRON; 7499 ahci_portp->ahciport_port_state = SATA_PSTATE_PWRON; 7500 7501 AHCI_ADDR_SET_PORT(&port_addr, port); 7502 7503 ahci_portp->ahciport_flags |= AHCI_PORT_FLAG_HOTPLUG; 7504 if (dev_exists_now) { 7505 if (dev_existed_previously) { /* 1 -> 1 */ 7506 /* Things are fine now. The loss was temporary. */ 7507 AHCIDBG(AHCIDBG_EVENT, ahci_ctlp, 7508 "ahci_intr_phyrdy_change port %d " 7509 "device link lost/established", port); 7510 7511 mutex_exit(&ahci_portp->ahciport_mutex); 7512 sata_hba_event_notify( 7513 ahci_ctlp->ahcictl_sata_hba_tran->sata_tran_hba_dip, 7514 &sdevice, 7515 SATA_EVNT_LINK_LOST|SATA_EVNT_LINK_ESTABLISHED); 7516 mutex_enter(&ahci_portp->ahciport_mutex); 7517 7518 } else { /* 0 -> 1 */ 7519 AHCIDBG(AHCIDBG_EVENT, ahci_ctlp, 7520 "ahci_intr_phyrdy_change: port %d " 7521 "device link established", port); 7522 7523 /* 7524 * A new device has been detected. The new device 7525 * might be a port multiplier instead of a drive, so 7526 * we cannot update the signature directly. 7527 */ 7528 (void) ahci_initialize_port(ahci_ctlp, 7529 ahci_portp, &port_addr); 7530 7531 /* Try to start the port */ 7532 if (ahci_start_port(ahci_ctlp, ahci_portp, port) 7533 != AHCI_SUCCESS) { 7534 sdevice.satadev_state |= SATA_PSTATE_FAILED; 7535 AHCIDBG(AHCIDBG_ERRS, ahci_ctlp, 7536 "ahci_intr_phyrdy_change: port %d failed " 7537 "at start port", port); 7538 } 7539 7540 /* Clear the max queue depth for inserted device */ 7541 ahci_portp->ahciport_max_ncq_tags = 0; 7542 7543 mutex_exit(&ahci_portp->ahciport_mutex); 7544 sata_hba_event_notify( 7545 ahci_ctlp->ahcictl_sata_hba_tran->sata_tran_hba_dip, 7546 &sdevice, 7547 SATA_EVNT_LINK_ESTABLISHED); 7548 mutex_enter(&ahci_portp->ahciport_mutex); 7549 7550 } 7551 } else { /* No device exists now */ 7552 7553 if (dev_existed_previously) { /* 1 -> 0 */ 7554 AHCIDBG(AHCIDBG_EVENT, ahci_ctlp, 7555 "ahci_intr_phyrdy_change: port %d " 7556 "device link lost", port); 7557 7558 ahci_reject_all_abort_pkts(ahci_ctlp, ahci_portp, port); 7559 (void) ahci_put_port_into_notrunning_state(ahci_ctlp, 7560 ahci_portp, port); 7561 7562 if (ahci_portp->ahciport_device_type == 7563 SATA_DTYPE_PMULT) { 7564 ahci_dealloc_pmult(ahci_ctlp, ahci_portp); 7565 } 7566 7567 /* An existing device is lost. */ 7568 ahci_portp->ahciport_device_type = SATA_DTYPE_NONE; 7569 ahci_portp->ahciport_port_state = SATA_STATE_UNKNOWN; 7570 7571 mutex_exit(&ahci_portp->ahciport_mutex); 7572 sata_hba_event_notify( 7573 ahci_ctlp->ahcictl_sata_hba_tran->sata_tran_hba_dip, 7574 &sdevice, 7575 SATA_EVNT_LINK_LOST); 7576 mutex_enter(&ahci_portp->ahciport_mutex); 7577 } 7578 } 7579 ahci_portp->ahciport_flags &= ~AHCI_PORT_FLAG_HOTPLUG; 7580 7581 mutex_exit(&ahci_portp->ahciport_mutex); 7582 7583 return (AHCI_SUCCESS); 7584 } 7585 7586 /* 7587 * PxIS.UFS - Unknown FIS Error 7588 * 7589 * This interrupt event means an unknown FIS was received and has been 7590 * copied into system memory. An unknown FIS is not considered an illegal 7591 * FIS, unless the length received is more than 64 bytes. If an unknown 7592 * FIS arrives with length <= 64 bytes, it is posted and the HBA continues 7593 * normal operation. If the unknown FIS is more than 64 bytes, then it 7594 * won't be posted to memory and PxSERR.ERR.P will be set, which is then 7595 * a fatal error. 7596 * 7597 * PxIS.IPMS - Incorrect Port Multiplier Status 7598 * 7599 * IPMS Indicates that the HBA received a FIS from a device that did not 7600 * have a command outstanding. The IPMS bit may be set during enumeration 7601 * of devices on a Port Multiplier due to the normal Port Multiplier 7602 * enumeration process. It is recommended that IPMS only be used after 7603 * enumeration is complete on the Port Multiplier (copied from spec). 7604 * 7605 * PxIS.OFS - Overflow Error 7606 * 7607 * Command list overflow is defined as software building a command table 7608 * that has fewer total bytes than the transaction given to the device. 7609 * On device writes, the HBA will run out of data, and on reads, there 7610 * will be no room to put the data. 7611 * 7612 * For an overflow on data read, either PIO or DMA, the HBA will set 7613 * PxIS.OFS, and the HBA will do a best effort to continue, and it's a 7614 * non-fatal error when the HBA can continues. Sometimes, it will cause 7615 * a fatal error and need the software to do something. 7616 * 7617 * For an overflow on data write, setting PxIS.OFS is optional for both 7618 * DMA and PIO, and it's a fatal error, and a COMRESET is required by 7619 * software to clean up from this serious error. 7620 * 7621 * PxIS.INFS - Interface Non-Fatal Error 7622 * 7623 * This interrupt event indicates that the HBA encountered an error on 7624 * the Serial ATA interface but was able to continue operation. The kind 7625 * of error usually occurred during a non-Data FIS, and under this condition 7626 * the FIS will be re-transmitted by HBA automatically. 7627 * 7628 * When the FMA is implemented, there should be a stat structure to 7629 * record how many every kind of error happens. 7630 */ 7631 static int 7632 ahci_intr_non_fatal_error(ahci_ctl_t *ahci_ctlp, ahci_port_t *ahci_portp, 7633 uint8_t port, uint32_t intr_status) 7634 { 7635 uint32_t port_serror; 7636 #if AHCI_DEBUG 7637 uint32_t port_cmd_status; 7638 uint32_t port_cmd_issue; 7639 uint32_t port_sactive; 7640 int current_slot; 7641 uint32_t current_tags; 7642 sata_pkt_t *satapkt; 7643 ahci_cmd_header_t *cmd_header; 7644 uint32_t cmd_dmacount; 7645 #endif 7646 7647 mutex_enter(&ahci_portp->ahciport_mutex); 7648 7649 port_serror = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 7650 (uint32_t *)AHCI_PORT_PxSERR(ahci_ctlp, port)); 7651 7652 AHCIDBG(AHCIDBG_INTR|AHCIDBG_ENTRY|AHCIDBG_ERRS, ahci_ctlp, 7653 "ahci_intr_non_fatal_error: port %d, " 7654 "PxSERR = 0x%x, PxIS = 0x%x ", port, port_serror, intr_status); 7655 7656 ahci_log_serror_message(ahci_ctlp, port, port_serror, 1); 7657 7658 if (intr_status & AHCI_INTR_STATUS_UFS) { 7659 AHCIDBG(AHCIDBG_ERRS, ahci_ctlp, 7660 "ahci port %d has unknown FIS error", port); 7661 7662 /* Clear the interrupt bit by clearing PxSERR.DIAG.F */ 7663 ddi_put32(ahci_ctlp->ahcictl_ahci_acc_handle, 7664 (uint32_t *)AHCI_PORT_PxSERR(ahci_ctlp, port), 7665 SERROR_FIS_TYPE); 7666 } 7667 7668 #if AHCI_DEBUG 7669 if (intr_status & AHCI_INTR_STATUS_IPMS) { 7670 AHCIDBG(AHCIDBG_ERRS, ahci_ctlp, "ahci port %d " 7671 "has Incorrect Port Multiplier Status error", port); 7672 } 7673 7674 if (intr_status & AHCI_INTR_STATUS_OFS) { 7675 AHCIDBG(AHCIDBG_INTR|AHCIDBG_ERRS, ahci_ctlp, 7676 "ahci port %d has overflow error", port); 7677 } 7678 7679 if (intr_status & AHCI_INTR_STATUS_INFS) { 7680 AHCIDBG(AHCIDBG_INTR|AHCIDBG_ERRS, ahci_ctlp, 7681 "ahci port %d has interface non fatal error", port); 7682 } 7683 7684 /* 7685 * Record the error occurred command's slot. 7686 */ 7687 if (NON_NCQ_CMD_IN_PROGRESS(ahci_portp) || 7688 ERR_RETRI_CMD_IN_PROGRESS(ahci_portp)) { 7689 port_cmd_status = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 7690 (uint32_t *)AHCI_PORT_PxCMD(ahci_ctlp, port)); 7691 7692 current_slot = (port_cmd_status & AHCI_CMD_STATUS_CCS) >> 7693 AHCI_CMD_STATUS_CCS_SHIFT; 7694 7695 if (ERR_RETRI_CMD_IN_PROGRESS(ahci_portp)) { 7696 satapkt = ahci_portp->ahciport_err_retri_pkt; 7697 ASSERT(satapkt != NULL); 7698 ASSERT(current_slot == 0); 7699 } else { 7700 satapkt = ahci_portp->ahciport_slot_pkts[current_slot]; 7701 } 7702 7703 if (satapkt != NULL) { 7704 AHCIDBG(AHCIDBG_INTR|AHCIDBG_ERRS, ahci_ctlp, 7705 "ahci_intr_non_fatal_error: pending_tags = 0x%x " 7706 "cmd 0x%x", ahci_portp->ahciport_pending_tags, 7707 satapkt->satapkt_cmd.satacmd_cmd_reg); 7708 7709 AHCIDBG(AHCIDBG_INTR|AHCIDBG_ERRS, ahci_ctlp, 7710 "ahci_intr_non_fatal_error: port %d, " 7711 "satapkt 0x%p is being processed when error occurs", 7712 port, (void *)satapkt); 7713 7714 /* 7715 * PRD Byte Count field of command header is not 7716 * required to reflect the total number of bytes 7717 * transferred when an overflow occurs, so here 7718 * just log the value. 7719 */ 7720 cmd_dmacount = 7721 ahci_portp->ahciport_prd_bytecounts[current_slot]; 7722 if (cmd_dmacount) { 7723 cmd_header = &ahci_portp-> 7724 ahciport_cmd_list[current_slot]; 7725 AHCIDBG(AHCIDBG_INTR|AHCIDBG_ERRS, ahci_ctlp, 7726 "ahci_intr_non_fatal_error: port %d, " 7727 "PRD Byte Count = 0x%x, " 7728 "ahciport_prd_bytecounts = 0x%x", port, 7729 cmd_header->ahcich_prd_byte_count, 7730 cmd_dmacount); 7731 } 7732 } 7733 } else if (NCQ_CMD_IN_PROGRESS(ahci_portp)) { 7734 /* 7735 * For queued command, list those command which have already 7736 * been transmitted to the device and still not completed. 7737 */ 7738 port_sactive = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 7739 (uint32_t *)AHCI_PORT_PxSACT(ahci_ctlp, port)); 7740 7741 port_cmd_issue = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 7742 (uint32_t *)AHCI_PORT_PxCI(ahci_ctlp, port)); 7743 7744 AHCIDBG(AHCIDBG_INTR|AHCIDBG_NCQ|AHCIDBG_ERRS, ahci_ctlp, 7745 "ahci_intr_non_fatal_error: pending_ncq_tags = 0x%x " 7746 "port_sactive = 0x%x port_cmd_issue = 0x%x", 7747 ahci_portp->ahciport_pending_ncq_tags, 7748 port_sactive, port_cmd_issue); 7749 7750 current_tags = ahci_portp->ahciport_pending_ncq_tags & 7751 port_sactive & ~port_cmd_issue & 7752 AHCI_NCQ_SLOT_MASK(ahci_portp); 7753 7754 while (current_tags) { 7755 current_slot = ddi_ffs(current_tags) - 1; 7756 if (current_slot == -1) { 7757 goto out; 7758 } 7759 7760 satapkt = ahci_portp->ahciport_slot_pkts[current_slot]; 7761 AHCIDBG(AHCIDBG_INTR|AHCIDBG_NCQ|AHCIDBG_ERRS, 7762 ahci_ctlp, "ahci_intr_non_fatal_error: " 7763 "port %d, satapkt 0x%p is outstanding when " 7764 "error occurs", port, (void *)satapkt); 7765 7766 CLEAR_BIT(current_tags, current_slot); 7767 } 7768 } 7769 out: 7770 #endif 7771 mutex_exit(&ahci_portp->ahciport_mutex); 7772 7773 return (AHCI_SUCCESS); 7774 } 7775 7776 /* 7777 * According to the AHCI spec, the error types include system memory 7778 * errors, interface errors, port multiplier errors, device errors, 7779 * command list overflow, command list underflow, native command 7780 * queuing tag errors and pio data transfer errors. 7781 * 7782 * System memory errors such as target abort, master abort, and parity 7783 * may cause the host to stop, and they are serious errors and needed 7784 * to be recovered with software intervention. When system software 7785 * has given a pointer to the HBA that doesn't exist in physical memory, 7786 * a master/target abort error occurs, and PxIS.HBFS will be set. A 7787 * data error such as CRC or parity occurs, the HBA aborts the transfer 7788 * (if necessary) and PxIS.HBDS will be set. 7789 * 7790 * Interface errors are errors that occur due to electrical issues on 7791 * the interface, or protocol miscommunication between the device and 7792 * HBA, and the respective PxSERR register bit will be set. And PxIS.IFS 7793 * (fatal) or PxIS.INFS (non-fatal) will be set. The conditions that 7794 * causes PxIS.IFS/PxIS.INFS to be set are 7795 * 1. in PxSERR.ERR, P bit is set to '1' 7796 * 2. in PxSERR.DIAG, C or H bit is set to '1' 7797 * 3. PhyRdy drop unexpectly, N bit is set to '1' 7798 * If the error occurred during a non-data FIS, the FIS must be 7799 * retransmitted, and the error is non-fatal and PxIS.INFS is set. If 7800 * the error occurred during a data FIS, the transfer will stop, so 7801 * the error is fatal and PxIS.IFS is set. 7802 * 7803 * When a FIS arrives that updates the taskfile, the HBA checks to see 7804 * if PxTFD.STS.ERR is set. If yes, PxIS.TFES will be set and the HBA 7805 * stops processing any more commands. 7806 * 7807 * Command list overflow is defined as software building a command table 7808 * that has fewer total bytes than the transaction given to the device. 7809 * On device writes, the HBA will run out of data, and on reads, there 7810 * will be no room to put the data. For an overflow on data read, either 7811 * PIO or DMA, the HBA will set PxIS.OFS, and it's a non-fatal error. 7812 * For an overflow on data write, setting PxIS.OFS is optional for both 7813 * DMA and PIO, and a COMRESET is required by software to clean up from 7814 * this serious error. 7815 * 7816 * Command list underflow is defined as software building a command 7817 * table that has more total bytes than the transaction given to the 7818 * device. For data writes, both PIO and DMA, the device will detect 7819 * an error and end the transfer. And these errors are most likely going 7820 * to be fatal errors that will cause the port to be restarted. For 7821 * data reads, the HBA updates its PRD byte count, and may be 7822 * able to continue normally, but is not required to. And The HBA is 7823 * not required to detect underflow conditions for native command 7824 * queuing command. 7825 * 7826 * The HBA does not actively check incoming DMA Setup FISes to ensure 7827 * that the PxSACT register bit for that slot is set. Existing error 7828 * mechanisms, such as host bus failure, or bad protocol, are used to 7829 * recover from this case. 7830 * 7831 * In accordance with Serial ATA 1.0a, DATA FISes prior to the final 7832 * DATA FIS must be an integral number of Dwords. If the HBA receives 7833 * a request which is not an integral number of Dwords, the HBA 7834 * set PxSERR.ERR.P to '1', set PxIS.IFS to '1' and stop running until 7835 * software restarts the port. And the HBA ensures that the size 7836 * of the DATA FIS received during a PIO command matches the size in 7837 * the Transfer Cound field of the preceding PIO Setup FIS, if not, the 7838 * HBA sets PxSERR.ERR.P to '1', set PxIS.IFS to '1', and then 7839 * stop running until software restarts the port. 7840 */ 7841 /* 7842 * the fatal errors include PxIS.IFS, PxIS.HBDS, PxIS.HBFS and PxIS.TFES. 7843 * 7844 * PxIS.IFS indicates that the hba encountered an error on the serial ata 7845 * interface which caused the transfer to stop. 7846 * 7847 * PxIS.HBDS indicates that the hba encountered a data error 7848 * (uncorrectable ecc/parity) when reading from or writing to system memory. 7849 * 7850 * PxIS.HBFS indicates that the hba encountered a host bus error that it 7851 * cannot recover from, such as a bad software pointer. 7852 * 7853 * PxIS.TFES is set whenever the status register is updated by the device 7854 * and the error bit (bit 0) is set. 7855 */ 7856 static int 7857 ahci_intr_fatal_error(ahci_ctl_t *ahci_ctlp, 7858 ahci_port_t *ahci_portp, uint8_t port, uint32_t intr_status) 7859 { 7860 uint32_t port_cmd_status; 7861 uint32_t port_serror; 7862 uint32_t task_file_status; 7863 int failed_slot; 7864 sata_pkt_t *spkt = NULL; 7865 uint8_t err_byte; 7866 ahci_event_arg_t *args; 7867 int instance = ddi_get_instance(ahci_ctlp->ahcictl_dip); 7868 uint32_t failed_tags = 0; 7869 int task_fail_flag = 0, task_abort_flag = 0; 7870 uint32_t slot_status; 7871 7872 mutex_enter(&ahci_portp->ahciport_mutex); 7873 7874 /* 7875 * ahci_intr_phyrdy_change() may have rendered it to 7876 * SATA_DTYPE_NONE. 7877 */ 7878 if (ahci_portp->ahciport_device_type == SATA_DTYPE_NONE) { 7879 AHCIDBG(AHCIDBG_ENTRY|AHCIDBG_INTR, ahci_ctlp, 7880 "ahci_intr_fatal_error: port %d no device attached, " 7881 "and just return without doing anything", port); 7882 goto out0; 7883 } 7884 7885 if (intr_status & AHCI_INTR_STATUS_TFES) { 7886 task_file_status = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 7887 (uint32_t *)AHCI_PORT_PxTFD(ahci_ctlp, port)); 7888 AHCIDBG(AHCIDBG_INTR|AHCIDBG_ERRS, ahci_ctlp, 7889 "ahci_intr_fatal_error: port %d " 7890 "task_file_status = 0x%x", port, task_file_status); 7891 task_fail_flag = 1; 7892 7893 err_byte = (task_file_status & AHCI_TFD_ERR_MASK) 7894 >> AHCI_TFD_ERR_SHIFT; 7895 if (err_byte == SATA_ERROR_ABORT) 7896 task_abort_flag = 1; 7897 } 7898 7899 /* 7900 * Here we just log the fatal error info in interrupt context. 7901 * Misc recovery processing will be handled in task queue. 7902 */ 7903 if (task_fail_flag == 1) { 7904 if (NON_NCQ_CMD_IN_PROGRESS(ahci_portp)) { 7905 /* 7906 * Read PxCMD.CCS to determine the slot that the HBA 7907 * was processing when the error occurred. 7908 */ 7909 port_cmd_status = ddi_get32( 7910 ahci_ctlp->ahcictl_ahci_acc_handle, 7911 (uint32_t *)AHCI_PORT_PxCMD(ahci_ctlp, port)); 7912 failed_slot = (port_cmd_status & AHCI_CMD_STATUS_CCS) >> 7913 AHCI_CMD_STATUS_CCS_SHIFT; 7914 failed_tags = 0x1 << failed_slot; 7915 7916 spkt = ahci_portp->ahciport_slot_pkts[failed_slot]; 7917 AHCIDBG(AHCIDBG_INTR|AHCIDBG_ERRS, ahci_ctlp, 7918 "ahci_intr_fatal_error: spkt 0x%p is being " 7919 "processed when fatal error occurred for port %d", 7920 spkt, port); 7921 7922 /* 7923 * Won't emit the error message if it is an IDENTIFY 7924 * DEVICE command sent to an ATAPI device. 7925 */ 7926 if ((spkt != NULL) && 7927 (spkt->satapkt_cmd.satacmd_cmd_reg == 7928 SATAC_ID_DEVICE) && 7929 (task_abort_flag == 1)) 7930 goto out1; 7931 7932 /* 7933 * Won't emit the error message if it is an ATAPI PACKET 7934 * command 7935 */ 7936 if ((spkt != NULL) && 7937 (spkt->satapkt_cmd.satacmd_cmd_reg == SATAC_PACKET)) 7938 goto out1; 7939 7940 } else if (NCQ_CMD_IN_PROGRESS(ahci_portp)) { 7941 slot_status = ddi_get32( 7942 ahci_ctlp->ahcictl_ahci_acc_handle, 7943 (uint32_t *)AHCI_PORT_PxSACT(ahci_ctlp, port)); 7944 failed_tags = slot_status & 7945 AHCI_NCQ_SLOT_MASK(ahci_portp); 7946 } 7947 } 7948 7949 /* print the fatal error type */ 7950 ahci_log_fatal_error_message(ahci_ctlp, port, intr_status); 7951 ahci_portp->ahciport_flags |= AHCI_PORT_FLAG_ERRPRINT; 7952 7953 port_serror = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 7954 (uint32_t *)AHCI_PORT_PxSERR(ahci_ctlp, port)); 7955 7956 /* print PxSERR related error message */ 7957 ahci_log_serror_message(ahci_ctlp, port, port_serror, 0); 7958 7959 /* print task file register value */ 7960 if (task_fail_flag == 1) { 7961 cmn_err(CE_WARN, "!ahci%d: ahci port %d task_file_status " 7962 "= 0x%x", instance, port, task_file_status); 7963 if (task_abort_flag == 1) { 7964 cmn_err(CE_WARN, "!ahci%d: the below command (s) on " 7965 "port %d are aborted", instance, port); 7966 ahci_dump_commands(ahci_ctlp, port, failed_tags); 7967 } 7968 } 7969 7970 out1: 7971 /* Prepare the argument for the taskq */ 7972 args = ahci_portp->ahciport_event_args; 7973 args->ahciea_ctlp = (void *)ahci_ctlp; 7974 args->ahciea_portp = (void *)ahci_portp; 7975 args->ahciea_event = intr_status; 7976 AHCI_ADDR_SET_PORT((ahci_addr_t *)args->ahciea_addrp, port); 7977 7978 /* Start the taskq to handle error recovery */ 7979 if ((ddi_taskq_dispatch(ahci_portp->ahciport_event_taskq, 7980 ahci_events_handler, 7981 (void *)args, DDI_NOSLEEP)) != DDI_SUCCESS) { 7982 ahci_portp->ahciport_flags &= ~AHCI_PORT_FLAG_ERRPRINT; 7983 cmn_err(CE_WARN, "!ahci%d: start taskq for error recovery " 7984 "port %d failed", instance, port); 7985 } 7986 out0: 7987 mutex_exit(&ahci_portp->ahciport_mutex); 7988 7989 return (AHCI_SUCCESS); 7990 } 7991 7992 /* 7993 * Hot Plug Operation for platforms that support Cold Presence Detect. 7994 * 7995 * When set, a device status has changed as detected by the cold presence 7996 * detect logic. This bit can either be set due to a non-connected port 7997 * receiving a device, or a connected port having its device removed. 7998 * This bit is only valid if the port supports cold presence detect as 7999 * indicated by PxCMD.CPD set to '1'. 8000 * 8001 * At the moment, this interrupt is not needed and disabled and we just 8002 * log the debug message. 8003 */ 8004 static int 8005 ahci_intr_cold_port_detect(ahci_ctl_t *ahci_ctlp, 8006 ahci_port_t *ahci_portp, uint8_t port) 8007 { 8008 uint32_t port_cmd_status; 8009 sata_device_t sdevice; 8010 8011 AHCIDBG(AHCIDBG_INTR, ahci_ctlp, 8012 "ahci_intr_cold_port_detect enter, port %d", port); 8013 8014 mutex_enter(&ahci_portp->ahciport_mutex); 8015 8016 port_cmd_status = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 8017 (uint32_t *)AHCI_PORT_PxCMD(ahci_ctlp, port)); 8018 if (!(port_cmd_status & AHCI_CMD_STATUS_CPD)) { 8019 AHCIDBG(AHCIDBG_INTR, ahci_ctlp, 8020 "port %d does not support cold presence detect, so " 8021 "we just ignore this interrupt", port); 8022 mutex_exit(&ahci_portp->ahciport_mutex); 8023 return (AHCI_SUCCESS); 8024 } 8025 8026 AHCIDBG(AHCIDBG_INTR, ahci_ctlp, 8027 "port %d device status has changed", port); 8028 8029 bzero((void *)&sdevice, sizeof (sata_device_t)); 8030 sdevice.satadev_addr.cport = ahci_ctlp->ahcictl_port_to_cport[port]; 8031 sdevice.satadev_addr.qual = SATA_ADDR_CPORT; 8032 sdevice.satadev_addr.pmport = 0; 8033 sdevice.satadev_state = SATA_PSTATE_PWRON; 8034 8035 if (port_cmd_status & AHCI_CMD_STATUS_CPS) { 8036 AHCIDBG(AHCIDBG_INTR, ahci_ctlp, 8037 "port %d: a device is hot plugged", port); 8038 mutex_exit(&ahci_portp->ahciport_mutex); 8039 sata_hba_event_notify( 8040 ahci_ctlp->ahcictl_sata_hba_tran->sata_tran_hba_dip, 8041 &sdevice, 8042 SATA_EVNT_DEVICE_ATTACHED); 8043 mutex_enter(&ahci_portp->ahciport_mutex); 8044 8045 } else { 8046 AHCIDBG(AHCIDBG_INTR, ahci_ctlp, 8047 "port %d: a device is hot unplugged", port); 8048 mutex_exit(&ahci_portp->ahciport_mutex); 8049 sata_hba_event_notify( 8050 ahci_ctlp->ahcictl_sata_hba_tran->sata_tran_hba_dip, 8051 &sdevice, 8052 SATA_EVNT_DEVICE_DETACHED); 8053 mutex_enter(&ahci_portp->ahciport_mutex); 8054 } 8055 8056 mutex_exit(&ahci_portp->ahciport_mutex); 8057 8058 return (AHCI_SUCCESS); 8059 } 8060 8061 /* 8062 * Enable the interrupts for a particular port. 8063 */ 8064 static void 8065 ahci_enable_port_intrs(ahci_ctl_t *ahci_ctlp, uint8_t port) 8066 { 8067 ASSERT(MUTEX_HELD(&ahci_ctlp->ahcictl_ports[port]->ahciport_mutex)); 8068 8069 AHCIDBG(AHCIDBG_ENTRY, ahci_ctlp, 8070 "ahci_enable_port_intrs enter, port %d", port); 8071 8072 /* 8073 * Clear port interrupt status before enabling interrupt 8074 */ 8075 ddi_put32(ahci_ctlp->ahcictl_ahci_acc_handle, 8076 (uint32_t *)AHCI_PORT_PxIS(ahci_ctlp, port), 8077 AHCI_PORT_INTR_MASK); 8078 8079 /* 8080 * Clear the pending bit from IS.IPS 8081 */ 8082 ddi_put32(ahci_ctlp->ahcictl_ahci_acc_handle, 8083 (uint32_t *)AHCI_GLOBAL_IS(ahci_ctlp), (1 << port)); 8084 8085 /* 8086 * Enable the following interrupts: 8087 * Device to Host Register FIS Interrupt (DHRS) 8088 * PIO Setup FIS Interrupt (PSS) 8089 * Set Device Bits Interrupt (SDBS) 8090 * Unknown FIS Interrupt (UFS) 8091 * Port Connect Change Status (PCS) 8092 * PhyRdy Change Status (PRCS) 8093 * Overflow Status (OFS) 8094 * Interface Non-fatal Error Status (INFS) 8095 * Interface Fatal Error Status (IFS) 8096 * Host Bus Data Error Status (HBDS) 8097 * Host Bus Fatal Error Status (HBFS) 8098 * Task File Error Status (TFES) 8099 */ 8100 ddi_put32(ahci_ctlp->ahcictl_ahci_acc_handle, 8101 (uint32_t *)AHCI_PORT_PxIE(ahci_ctlp, port), 8102 (AHCI_INTR_STATUS_DHRS | 8103 AHCI_INTR_STATUS_PSS | 8104 AHCI_INTR_STATUS_SDBS | 8105 AHCI_INTR_STATUS_UFS | 8106 AHCI_INTR_STATUS_DPS | 8107 AHCI_INTR_STATUS_PCS | 8108 AHCI_INTR_STATUS_PRCS | 8109 AHCI_INTR_STATUS_OFS | 8110 AHCI_INTR_STATUS_INFS | 8111 AHCI_INTR_STATUS_IFS | 8112 AHCI_INTR_STATUS_HBDS | 8113 AHCI_INTR_STATUS_HBFS | 8114 AHCI_INTR_STATUS_TFES)); 8115 } 8116 8117 /* 8118 * Enable interrupts for all the ports. 8119 */ 8120 static void 8121 ahci_enable_all_intrs(ahci_ctl_t *ahci_ctlp) 8122 { 8123 uint32_t ghc_control; 8124 8125 ASSERT(MUTEX_HELD(&ahci_ctlp->ahcictl_mutex)); 8126 8127 AHCIDBG(AHCIDBG_ENTRY, ahci_ctlp, "ahci_enable_all_intrs enter", NULL); 8128 8129 ghc_control = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 8130 (uint32_t *)AHCI_GLOBAL_GHC(ahci_ctlp)); 8131 8132 ghc_control |= AHCI_HBA_GHC_IE; 8133 8134 ddi_put32(ahci_ctlp->ahcictl_ahci_acc_handle, 8135 (uint32_t *)AHCI_GLOBAL_GHC(ahci_ctlp), ghc_control); 8136 } 8137 8138 /* 8139 * Disable interrupts for a particular port. 8140 */ 8141 static void 8142 ahci_disable_port_intrs(ahci_ctl_t *ahci_ctlp, uint8_t port) 8143 { 8144 ASSERT(ahci_ctlp->ahcictl_flags & AHCI_QUIESCE || 8145 MUTEX_HELD(&ahci_ctlp->ahcictl_ports[port]->ahciport_mutex)); 8146 8147 AHCIDBG(AHCIDBG_ENTRY, ahci_ctlp, 8148 "ahci_disable_port_intrs enter, port %d", port); 8149 8150 ddi_put32(ahci_ctlp->ahcictl_ahci_acc_handle, 8151 (uint32_t *)AHCI_PORT_PxIE(ahci_ctlp, port), 0); 8152 } 8153 8154 /* 8155 * Disable interrupts for the whole HBA. 8156 * 8157 * The global bit is cleared, then all interrupt sources from all 8158 * ports are disabled. 8159 */ 8160 static void 8161 ahci_disable_all_intrs(ahci_ctl_t *ahci_ctlp) 8162 { 8163 uint32_t ghc_control; 8164 8165 ASSERT(ahci_ctlp->ahcictl_flags & (AHCI_ATTACH | AHCI_QUIESCE) || 8166 MUTEX_HELD(&ahci_ctlp->ahcictl_mutex)); 8167 8168 AHCIDBG(AHCIDBG_ENTRY, ahci_ctlp, "ahci_disable_all_intrs enter", 8169 NULL); 8170 8171 ghc_control = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 8172 (uint32_t *)AHCI_GLOBAL_GHC(ahci_ctlp)); 8173 8174 ghc_control &= ~AHCI_HBA_GHC_IE; 8175 8176 ddi_put32(ahci_ctlp->ahcictl_ahci_acc_handle, 8177 (uint32_t *)AHCI_GLOBAL_GHC(ahci_ctlp), ghc_control); 8178 } 8179 8180 /* 8181 * Handle FIXED or MSI interrupts. 8182 */ 8183 /* 8184 * According to AHCI spec, the HBA may support several interrupt modes: 8185 * * pin based interrupts (FIXED) 8186 * * single MSI message interrupts 8187 * * multiple MSI based message interrupts 8188 * 8189 * For pin based interrupts, the software interrupt handler need to check IS 8190 * register to find out which port has pending interrupts. And then check 8191 * PxIS register to find out which interrupt events happened on that port. 8192 * 8193 * For single MSI message interrupts, MSICAP.MC.MSIE is set with '1', and 8194 * MSICAP.MC.MME is set with '0'. This mode is similar to pin based interrupts 8195 * in that software interrupt handler need to check IS register to determine 8196 * which port triggered the interrupts since it uses a single message for all 8197 * port interrupts. 8198 * 8199 * HBA may optionally support multiple MSI message for better performance. In 8200 * this mode, each port may have its own interrupt message, and thus generation 8201 * of interrupts is no longer controlled through the IS register. MSICAP.MC.MMC 8202 * represents a power-of-2 wrapper on the number of implemented ports, and 8203 * the mapping of ports to interrupts is done in a 1-1 relationship, up to the 8204 * maximum number of assigned interrupts. When the number of MSI messages 8205 * allocated is less than the number requested, then hardware may have two 8206 * implementation behaviors: 8207 * * assign each ports its own interrupt and then force all additional 8208 * ports to share the last interrupt message, and this condition is 8209 * indicated by clearing GHC.MRSM to '0' 8210 * * revert to single MSI mode, indicated by setting GHC.MRSM to '1' 8211 * When multiple-message MSI is enabled, hardware will still set IS register 8212 * as single message case. And this IS register may be used by software when 8213 * fewer than the requested number of messages is granted in order to determine 8214 * which port had the interrupt. 8215 * 8216 * Note: The current ahci driver only supports the first two interrupt modes: 8217 * pin based interrupts and single MSI message interrupts, and the reason 8218 * is indicated in below code. 8219 */ 8220 static int 8221 ahci_add_intrs(ahci_ctl_t *ahci_ctlp, int intr_type) 8222 { 8223 dev_info_t *dip = ahci_ctlp->ahcictl_dip; 8224 int count, avail, actual; 8225 int i, rc; 8226 8227 AHCIDBG(AHCIDBG_ENTRY|AHCIDBG_INIT|AHCIDBG_INTR, ahci_ctlp, 8228 "ahci_add_intrs enter interrupt type 0x%x", intr_type); 8229 8230 /* get number of interrupts. */ 8231 rc = ddi_intr_get_nintrs(dip, intr_type, &count); 8232 if ((rc != DDI_SUCCESS) || (count == 0)) { 8233 AHCIDBG(AHCIDBG_INTR|AHCIDBG_INIT, ahci_ctlp, 8234 "ddi_intr_get_nintrs() failed, " 8235 "rc %d count %d\n", rc, count); 8236 return (DDI_FAILURE); 8237 } 8238 8239 /* get number of available interrupts. */ 8240 rc = ddi_intr_get_navail(dip, intr_type, &avail); 8241 if ((rc != DDI_SUCCESS) || (avail == 0)) { 8242 AHCIDBG(AHCIDBG_INTR|AHCIDBG_INIT, ahci_ctlp, 8243 "ddi_intr_get_navail() failed, " 8244 "rc %d avail %d\n", rc, avail); 8245 return (DDI_FAILURE); 8246 } 8247 8248 #if AHCI_DEBUG 8249 if (avail < count) { 8250 AHCIDBG(AHCIDBG_INTR|AHCIDBG_INIT, ahci_ctlp, 8251 "ddi_intr_get_nintrs returned %d, navail() returned %d", 8252 count, avail); 8253 } 8254 #endif 8255 8256 /* 8257 * Note: So far Solaris restricts the maximum number of messages for 8258 * x86 to 2, that is avail is 2, so here we set the count with 1 to 8259 * force the driver to use single MSI message interrupt. In future if 8260 * Solaris remove the restriction, then we need to delete the below 8261 * code and try to use multiple interrupt routine to gain better 8262 * performance. 8263 */ 8264 if ((intr_type == DDI_INTR_TYPE_MSI) && (count > 1)) { 8265 AHCIDBG(AHCIDBG_INTR, ahci_ctlp, 8266 "force to use one interrupt routine though the " 8267 "HBA supports %d interrupt", count); 8268 count = 1; 8269 } 8270 8271 /* Allocate an array of interrupt handles. */ 8272 ahci_ctlp->ahcictl_intr_size = count * sizeof (ddi_intr_handle_t); 8273 ahci_ctlp->ahcictl_intr_htable = 8274 kmem_alloc(ahci_ctlp->ahcictl_intr_size, KM_SLEEP); 8275 8276 /* call ddi_intr_alloc(). */ 8277 rc = ddi_intr_alloc(dip, ahci_ctlp->ahcictl_intr_htable, 8278 intr_type, 0, count, &actual, DDI_INTR_ALLOC_NORMAL); 8279 8280 if ((rc != DDI_SUCCESS) || (actual == 0)) { 8281 AHCIDBG(AHCIDBG_INTR|AHCIDBG_INIT, ahci_ctlp, 8282 "ddi_intr_alloc() failed, rc %d count %d actual %d " 8283 "avail %d\n", rc, count, actual, avail); 8284 kmem_free(ahci_ctlp->ahcictl_intr_htable, 8285 ahci_ctlp->ahcictl_intr_size); 8286 return (DDI_FAILURE); 8287 } 8288 8289 /* use interrupt count returned */ 8290 #if AHCI_DEBUG 8291 if (actual < count) { 8292 AHCIDBG(AHCIDBG_INTR|AHCIDBG_INIT, ahci_ctlp, 8293 "Requested: %d, Received: %d", count, actual); 8294 } 8295 #endif 8296 8297 ahci_ctlp->ahcictl_intr_cnt = actual; 8298 8299 /* 8300 * Get priority for first, assume remaining are all the same. 8301 */ 8302 if (ddi_intr_get_pri(ahci_ctlp->ahcictl_intr_htable[0], 8303 &ahci_ctlp->ahcictl_intr_pri) != DDI_SUCCESS) { 8304 AHCIDBG(AHCIDBG_INTR|AHCIDBG_INIT, ahci_ctlp, 8305 "ddi_intr_get_pri() failed", NULL); 8306 8307 /* Free already allocated intr. */ 8308 for (i = 0; i < actual; i++) { 8309 (void) ddi_intr_free(ahci_ctlp->ahcictl_intr_htable[i]); 8310 } 8311 8312 kmem_free(ahci_ctlp->ahcictl_intr_htable, 8313 ahci_ctlp->ahcictl_intr_size); 8314 return (DDI_FAILURE); 8315 } 8316 8317 /* Test for high level interrupt. */ 8318 if (ahci_ctlp->ahcictl_intr_pri >= ddi_intr_get_hilevel_pri()) { 8319 AHCIDBG(AHCIDBG_INTR|AHCIDBG_INIT, ahci_ctlp, 8320 "ahci_add_intrs: Hi level intr not supported", NULL); 8321 8322 /* Free already allocated intr. */ 8323 for (i = 0; i < actual; i++) { 8324 (void) ddi_intr_free(ahci_ctlp->ahcictl_intr_htable[i]); 8325 } 8326 8327 kmem_free(ahci_ctlp->ahcictl_intr_htable, 8328 sizeof (ddi_intr_handle_t)); 8329 8330 return (DDI_FAILURE); 8331 } 8332 8333 /* Call ddi_intr_add_handler(). */ 8334 for (i = 0; i < actual; i++) { 8335 if (ddi_intr_add_handler(ahci_ctlp->ahcictl_intr_htable[i], 8336 ahci_intr, (caddr_t)ahci_ctlp, NULL) != DDI_SUCCESS) { 8337 AHCIDBG(AHCIDBG_INTR|AHCIDBG_INIT, ahci_ctlp, 8338 "ddi_intr_add_handler() failed", NULL); 8339 8340 /* Free already allocated intr. */ 8341 for (i = 0; i < actual; i++) { 8342 (void) ddi_intr_free( 8343 ahci_ctlp->ahcictl_intr_htable[i]); 8344 } 8345 8346 kmem_free(ahci_ctlp->ahcictl_intr_htable, 8347 ahci_ctlp->ahcictl_intr_size); 8348 return (DDI_FAILURE); 8349 } 8350 } 8351 8352 if (ddi_intr_get_cap(ahci_ctlp->ahcictl_intr_htable[0], 8353 &ahci_ctlp->ahcictl_intr_cap) != DDI_SUCCESS) { 8354 AHCIDBG(AHCIDBG_INTR|AHCIDBG_INIT, ahci_ctlp, 8355 "ddi_intr_get_cap() failed", NULL); 8356 8357 /* Free already allocated intr. */ 8358 for (i = 0; i < actual; i++) { 8359 (void) ddi_intr_free( 8360 ahci_ctlp->ahcictl_intr_htable[i]); 8361 } 8362 8363 kmem_free(ahci_ctlp->ahcictl_intr_htable, 8364 ahci_ctlp->ahcictl_intr_size); 8365 return (DDI_FAILURE); 8366 } 8367 8368 if (ahci_ctlp->ahcictl_intr_cap & DDI_INTR_FLAG_BLOCK) { 8369 /* Call ddi_intr_block_enable() for MSI. */ 8370 (void) ddi_intr_block_enable(ahci_ctlp->ahcictl_intr_htable, 8371 ahci_ctlp->ahcictl_intr_cnt); 8372 } else { 8373 /* Call ddi_intr_enable() for FIXED or MSI non block enable. */ 8374 for (i = 0; i < ahci_ctlp->ahcictl_intr_cnt; i++) { 8375 (void) ddi_intr_enable( 8376 ahci_ctlp->ahcictl_intr_htable[i]); 8377 } 8378 } 8379 8380 return (DDI_SUCCESS); 8381 } 8382 8383 /* 8384 * Removes the registered interrupts irrespective of whether they 8385 * were legacy or MSI. 8386 * 8387 * NOTE: The controller interrupts must be disabled before calling 8388 * this routine. 8389 */ 8390 static void 8391 ahci_rem_intrs(ahci_ctl_t *ahci_ctlp) 8392 { 8393 int x; 8394 8395 AHCIDBG(AHCIDBG_ENTRY, ahci_ctlp, "ahci_rem_intrs entered", NULL); 8396 8397 /* Disable all interrupts. */ 8398 if ((ahci_ctlp->ahcictl_intr_type == DDI_INTR_TYPE_MSI) && 8399 (ahci_ctlp->ahcictl_intr_cap & DDI_INTR_FLAG_BLOCK)) { 8400 /* Call ddi_intr_block_disable(). */ 8401 (void) ddi_intr_block_disable(ahci_ctlp->ahcictl_intr_htable, 8402 ahci_ctlp->ahcictl_intr_cnt); 8403 } else { 8404 for (x = 0; x < ahci_ctlp->ahcictl_intr_cnt; x++) { 8405 (void) ddi_intr_disable( 8406 ahci_ctlp->ahcictl_intr_htable[x]); 8407 } 8408 } 8409 8410 /* Call ddi_intr_remove_handler(). */ 8411 for (x = 0; x < ahci_ctlp->ahcictl_intr_cnt; x++) { 8412 (void) ddi_intr_remove_handler( 8413 ahci_ctlp->ahcictl_intr_htable[x]); 8414 (void) ddi_intr_free(ahci_ctlp->ahcictl_intr_htable[x]); 8415 } 8416 8417 kmem_free(ahci_ctlp->ahcictl_intr_htable, ahci_ctlp->ahcictl_intr_size); 8418 } 8419 8420 /* 8421 * This routine tries to put port into P:NotRunning state by clearing 8422 * PxCMD.ST. HBA will clear PxCI to 0h, PxSACT to 0h, PxCMD.CCS to 0h 8423 * and PxCMD.CR to '0'. 8424 */ 8425 static int 8426 ahci_put_port_into_notrunning_state(ahci_ctl_t *ahci_ctlp, 8427 ahci_port_t *ahci_portp, uint8_t port) 8428 { 8429 uint32_t port_cmd_status; 8430 int loop_count; 8431 8432 ASSERT(ahci_ctlp->ahcictl_flags & AHCI_QUIESCE || 8433 MUTEX_HELD(&ahci_ctlp->ahcictl_ports[port]->ahciport_mutex)); 8434 8435 AHCIDBG(AHCIDBG_ENTRY, ahci_ctlp, 8436 "ahci_put_port_into_notrunning_state enter: port %d", port); 8437 8438 port_cmd_status = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 8439 (uint32_t *)AHCI_PORT_PxCMD(ahci_ctlp, port)); 8440 8441 port_cmd_status &= ~AHCI_CMD_STATUS_ST; 8442 ddi_put32(ahci_ctlp->ahcictl_ahci_acc_handle, 8443 (uint32_t *)AHCI_PORT_PxCMD(ahci_ctlp, port), port_cmd_status); 8444 8445 /* Wait until PxCMD.CR is cleared */ 8446 loop_count = 0; 8447 do { 8448 port_cmd_status = 8449 ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 8450 (uint32_t *)AHCI_PORT_PxCMD(ahci_ctlp, port)); 8451 8452 if (loop_count++ > AHCI_POLLRATE_PORT_IDLE) { 8453 AHCIDBG(AHCIDBG_INIT, ahci_ctlp, 8454 "clearing port %d CMD.CR timeout, " 8455 "port_cmd_status = 0x%x", port, 8456 port_cmd_status); 8457 /* 8458 * We are effectively timing out after 0.5 sec. 8459 * This value is specified in AHCI spec. 8460 */ 8461 break; 8462 } 8463 8464 /* Wait for 10 millisec */ 8465 drv_usecwait(AHCI_10MS_USECS); 8466 } while (port_cmd_status & AHCI_CMD_STATUS_CR); 8467 8468 ahci_portp->ahciport_flags &= ~AHCI_PORT_FLAG_STARTED; 8469 8470 if (port_cmd_status & AHCI_CMD_STATUS_CR) { 8471 AHCIDBG(AHCIDBG_INIT|AHCIDBG_POLL_LOOP, ahci_ctlp, 8472 "ahci_put_port_into_notrunning_state: failed to clear " 8473 "PxCMD.CR to '0' after loop count: %d, and " 8474 "port_cmd_status = 0x%x", loop_count, port_cmd_status); 8475 return (AHCI_FAILURE); 8476 } else { 8477 AHCIDBG(AHCIDBG_INIT|AHCIDBG_POLL_LOOP, ahci_ctlp, 8478 "ahci_put_port_into_notrunning_state: succeeded to clear " 8479 "PxCMD.CR to '0' after loop count: %d, and " 8480 "port_cmd_status = 0x%x", loop_count, port_cmd_status); 8481 return (AHCI_SUCCESS); 8482 } 8483 } 8484 8485 /* 8486 * First clear PxCMD.ST, and then check PxTFD. If both PxTFD.STS.BSY 8487 * and PxTFD.STS.DRQ cleared to '0', it means the device is in a 8488 * stable state, then set PxCMD.ST to '1' to start the port directly. 8489 * If PxTFD.STS.BSY or PxTFD.STS.DRQ is set to '1', then issue a 8490 * COMRESET to the device to put it in an idle state. 8491 * 8492 * The fifth argument returns whether the port reset is involved during 8493 * the process. 8494 * 8495 * The routine will be called under following scenarios: 8496 * + To reset the HBA 8497 * + To abort the packet(s) 8498 * + To reset the port 8499 * + To activate the port 8500 * + Fatal error recovery 8501 * + To abort the timeout packet(s) 8502 * 8503 * NOTES!!! During this procedure, PxSERR register will be cleared, and 8504 * according to the spec, the clearance of three bits will also clear 8505 * three interrupt status bits. 8506 * 1. PxSERR.DIAG.F will clear PxIS.UFS 8507 * 2. PxSERR.DIAG.X will clear PxIS.PCS 8508 * 3. PxSERR.DIAG.N will clear PxIS.PRCS 8509 * 8510 * Among these three interrupt events, the driver needs to take care of 8511 * PxIS.PRCS, which is the hot plug event. When the driver found out 8512 * a device was unplugged, it will call the interrupt handler. 8513 */ 8514 static int 8515 ahci_restart_port_wait_till_ready(ahci_ctl_t *ahci_ctlp, 8516 ahci_port_t *ahci_portp, uint8_t port, int flag, int *reset_flag) 8517 { 8518 uint32_t port_sstatus; 8519 uint32_t task_file_status; 8520 sata_device_t sdevice; 8521 int rval; 8522 ahci_addr_t addr_port; 8523 ahci_pmult_info_t *pminfo = NULL; 8524 int dev_exists_begin = 0; 8525 int dev_exists_end = 0; 8526 uint32_t previous_dev_type = ahci_portp->ahciport_device_type; 8527 int npmport = 0; 8528 uint8_t cport = ahci_ctlp->ahcictl_port_to_cport[port]; 8529 8530 ASSERT(MUTEX_HELD(&ahci_portp->ahciport_mutex)); 8531 8532 AHCIDBG(AHCIDBG_ENTRY, ahci_ctlp, 8533 "ahci_restart_port_wait_till_ready: port %d enter", port); 8534 8535 AHCI_ADDR_SET_PORT(&addr_port, port); 8536 8537 if (ahci_portp->ahciport_device_type != SATA_DTYPE_NONE) 8538 dev_exists_begin = 1; 8539 8540 /* First clear PxCMD.ST */ 8541 rval = ahci_put_port_into_notrunning_state(ahci_ctlp, ahci_portp, 8542 port); 8543 if (rval != AHCI_SUCCESS) 8544 /* 8545 * If PxCMD.CR does not clear within a reasonable time, it 8546 * may assume the interface is in a hung condition and may 8547 * continue with issuing the port reset. 8548 */ 8549 goto reset; 8550 8551 /* Then clear PxSERR */ 8552 ddi_put32(ahci_ctlp->ahcictl_ahci_acc_handle, 8553 (uint32_t *)AHCI_PORT_PxSERR(ahci_ctlp, port), 8554 AHCI_SERROR_CLEAR_ALL); 8555 8556 /* Then get PxTFD */ 8557 task_file_status = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 8558 (uint32_t *)AHCI_PORT_PxTFD(ahci_ctlp, port)); 8559 8560 /* 8561 * Check whether the device is in a stable status, if yes, 8562 * then start the port directly. However for ahci_tran_reset_dport, 8563 * we may have to perform a port reset. 8564 */ 8565 if (!(task_file_status & (AHCI_TFD_STS_BSY | AHCI_TFD_STS_DRQ)) && 8566 !(flag & AHCI_PORT_RESET)) 8567 goto out; 8568 8569 reset: 8570 /* 8571 * If PxTFD.STS.BSY or PxTFD.STS.DRQ is set to '1', then issue 8572 * a COMRESET to the device 8573 */ 8574 ahci_disable_port_intrs(ahci_ctlp, port); 8575 rval = ahci_port_reset(ahci_ctlp, ahci_portp, &addr_port); 8576 ahci_enable_port_intrs(ahci_ctlp, port); 8577 8578 #ifdef AHCI_DEBUG 8579 if (rval != AHCI_SUCCESS) 8580 AHCIDBG(AHCIDBG_ERRS, ahci_ctlp, 8581 "ahci_restart_port_wait_till_ready: port %d failed", 8582 port); 8583 #endif 8584 8585 if (reset_flag != NULL) 8586 *reset_flag = 1; 8587 8588 /* Indicate to the framework that a reset has happened. */ 8589 if ((ahci_portp->ahciport_device_type != SATA_DTYPE_NONE) && 8590 (ahci_portp->ahciport_device_type != SATA_DTYPE_PMULT) && 8591 !(flag & AHCI_RESET_NO_EVENTS_UP)) { 8592 /* Set the reset in progress flag */ 8593 ahci_portp->ahciport_reset_in_progress = 1; 8594 8595 bzero((void *)&sdevice, sizeof (sata_device_t)); 8596 sdevice.satadev_addr.cport = 8597 ahci_ctlp->ahcictl_port_to_cport[port]; 8598 sdevice.satadev_addr.pmport = 0; 8599 sdevice.satadev_addr.qual = SATA_ADDR_DCPORT; 8600 8601 sdevice.satadev_state = SATA_DSTATE_RESET | 8602 SATA_DSTATE_PWR_ACTIVE; 8603 if (ahci_ctlp->ahcictl_sata_hba_tran) { 8604 mutex_exit(&ahci_portp->ahciport_mutex); 8605 sata_hba_event_notify( 8606 ahci_ctlp->ahcictl_sata_hba_tran->sata_tran_hba_dip, 8607 &sdevice, 8608 SATA_EVNT_DEVICE_RESET); 8609 mutex_enter(&ahci_portp->ahciport_mutex); 8610 } 8611 8612 AHCIDBG(AHCIDBG_EVENT, ahci_ctlp, 8613 "port %d sending event up: SATA_EVNT_DEVICE_RESET", port); 8614 } else { 8615 ahci_portp->ahciport_reset_in_progress = 0; 8616 } 8617 8618 out: 8619 (void) ahci_start_port(ahci_ctlp, ahci_portp, port); 8620 8621 /* SStatus tells the presence of device. */ 8622 port_sstatus = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 8623 (uint32_t *)AHCI_PORT_PxSSTS(ahci_ctlp, port)); 8624 8625 if (SSTATUS_GET_DET(port_sstatus) == SSTATUS_DET_DEVPRE_PHYCOM) { 8626 dev_exists_end = 1; 8627 } 8628 8629 if (dev_exists_begin == 0 && dev_exists_end == 0) /* 0 -> 0 */ 8630 return (rval); 8631 8632 /* Check whether a hot plug event happened */ 8633 if (dev_exists_begin == 1 && dev_exists_end == 0) { /* 1 -> 0 */ 8634 AHCIDBG(AHCIDBG_ERRS, ahci_ctlp, 8635 "ahci_restart_port_wait_till_ready: port %d " 8636 "device is removed", port); 8637 ahci_portp->ahciport_flags |= AHCI_PORT_FLAG_NODEV; 8638 AHCIDBG(AHCIDBG_ERRS, ahci_ctlp, 8639 "ahci_restart_port_wait_till_ready: port %d " 8640 "AHCI_PORT_FLAG_NODEV flag is set", port); 8641 mutex_exit(&ahci_portp->ahciport_mutex); 8642 (void) ahci_intr_phyrdy_change(ahci_ctlp, ahci_portp, port); 8643 mutex_enter(&ahci_portp->ahciport_mutex); 8644 8645 return (rval); 8646 } 8647 8648 8649 /* 0/1 -> 1 : device may change */ 8650 /* 8651 * May be called by ahci_fatal_error_recovery_handler, so 8652 * don't issue software if the previous device is ATAPI. 8653 */ 8654 if (ahci_portp->ahciport_device_type == SATA_DTYPE_ATAPI) 8655 return (rval); 8656 8657 /* 8658 * The COMRESET will make port multiplier enter legacy mode. 8659 * Issue a software reset to make it work again. 8660 */ 8661 ahci_disable_port_intrs(ahci_ctlp, port); 8662 ahci_find_dev_signature(ahci_ctlp, ahci_portp, &addr_port); 8663 ahci_enable_port_intrs(ahci_ctlp, port); 8664 8665 /* 8666 * Following codes are specific for the port multiplier 8667 */ 8668 if (previous_dev_type != SATA_DTYPE_PMULT && 8669 ahci_portp->ahciport_device_type != SATA_DTYPE_PMULT) { 8670 /* in case previous_dev_type is corrupt */ 8671 ahci_dealloc_pmult(ahci_ctlp, ahci_portp); 8672 (void) ahci_start_port(ahci_ctlp, ahci_portp, port); 8673 return (rval); 8674 } 8675 8676 /* Device change: PMult -> Non-PMult */ 8677 if (previous_dev_type == SATA_DTYPE_PMULT && 8678 ahci_portp->ahciport_device_type != SATA_DTYPE_PMULT) { 8679 /* 8680 * This might happen because 8681 * 1. Software reset failed. Port multiplier is not correctly 8682 * enumerated. 8683 * 2. Another non-port-multiplier device is attached. Perhaps 8684 * the port multiplier was replaced by another device by 8685 * whatever reason, but AHCI driver missed hot-plug event. 8686 * 8687 * Now that the port has been initialized, we just need to 8688 * update the port structure according new device, then report 8689 * and wait SATA framework to probe new device. 8690 */ 8691 8692 /* Force to release pmult resource */ 8693 ahci_dealloc_pmult(ahci_ctlp, ahci_portp); 8694 (void) ahci_start_port(ahci_ctlp, ahci_portp, port); 8695 8696 bzero((void *)&sdevice, sizeof (sata_device_t)); 8697 sdevice.satadev_addr.cport = 8698 ahci_ctlp->ahcictl_port_to_cport[port]; 8699 sdevice.satadev_addr.pmport = 0; 8700 sdevice.satadev_addr.qual = SATA_ADDR_DCPORT; 8701 8702 sdevice.satadev_state = SATA_DSTATE_RESET | 8703 SATA_DSTATE_PWR_ACTIVE; 8704 8705 mutex_exit(&ahci_portp->ahciport_mutex); 8706 sata_hba_event_notify( 8707 ahci_ctlp->ahcictl_dip, 8708 &sdevice, 8709 SATA_EVNT_DEVICE_RESET); 8710 mutex_enter(&ahci_portp->ahciport_mutex); 8711 8712 AHCIDBG(AHCIDBG_ERRS, ahci_ctlp, 8713 "Port multiplier is [Gone] at port %d ", port); 8714 AHCIDBG(AHCIDBG_EVENT, ahci_ctlp, 8715 "port %d sending event up: SATA_EVNT_DEVICE_RESET", port); 8716 8717 return (AHCI_SUCCESS); 8718 } 8719 8720 /* Device change: Non-PMult -> PMult */ 8721 if (ahci_portp->ahciport_device_type == SATA_DTYPE_PMULT) { 8722 8723 /* NOTE: The PxCMD.PMA may be cleared by HBA reset. */ 8724 ahci_alloc_pmult(ahci_ctlp, ahci_portp); 8725 8726 (void) ahci_start_port(ahci_ctlp, ahci_portp, port); 8727 } 8728 pminfo = ahci_portp->ahciport_pmult_info; 8729 ASSERT(pminfo != NULL); 8730 8731 /* Device (may) change: PMult -> PMult */ 8732 /* 8733 * First initialize port multiplier. Set state to READY and wait for 8734 * probe entry point to initialize it 8735 */ 8736 ahci_portp->ahciport_port_state = SATA_STATE_READY; 8737 8738 /* 8739 * It's a little complicated while target is a port multiplier. we 8740 * need to COMRESET all pmports behind that PMult otherwise those 8741 * sub-links between the PMult and the sub-devices will be in an 8742 * inactive state (indicated by PSCR0/PxSSTS) and the following access 8743 * to those sub-devices will be rejected by Link-Fatal-Error. 8744 */ 8745 /* 8746 * The PxSNTF will be set soon after the pmult is plugged. While the 8747 * pmult itself is attaching, sata_hba_event_notfiy will fail. so we 8748 * simply mark every sub-port as 'unknown', then ahci_probe_pmport 8749 * will initialized it. 8750 */ 8751 for (npmport = 0; npmport < pminfo->ahcipmi_num_dev_ports; npmport++) 8752 pminfo->ahcipmi_port_state[npmport] = SATA_STATE_UNKNOWN; 8753 8754 /* Report reset event. */ 8755 ahci_portp->ahciport_reset_in_progress = 1; 8756 8757 bzero((void *)&sdevice, sizeof (sata_device_t)); 8758 sdevice.satadev_addr.cport = cport; 8759 sdevice.satadev_addr.pmport = SATA_PMULT_HOSTPORT; 8760 sdevice.satadev_addr.qual = SATA_ADDR_PMULT; 8761 sdevice.satadev_state = SATA_DSTATE_RESET | SATA_DSTATE_PWR_ACTIVE; 8762 sata_hba_event_notify(ahci_ctlp->ahcictl_dip, &sdevice, 8763 SATA_EVNT_DEVICE_RESET); 8764 8765 return (rval); 8766 } 8767 8768 /* 8769 * This routine may be called under four scenarios: 8770 * a) do the recovery from fatal error 8771 * b) or we need to timeout some commands 8772 * c) or we need to abort some commands 8773 * d) or we need reset device/port/controller 8774 * 8775 * In all these scenarios, we need to send any pending unfinished 8776 * commands up to sata framework. 8777 */ 8778 static void 8779 ahci_mop_commands(ahci_ctl_t *ahci_ctlp, 8780 ahci_port_t *ahci_portp, 8781 uint32_t slot_status, 8782 uint32_t failed_tags, 8783 uint32_t timeout_tags, 8784 uint32_t aborted_tags, 8785 uint32_t reset_tags) 8786 { 8787 uint32_t finished_tags = 0; 8788 uint32_t unfinished_tags = 0; 8789 int tmp_slot; 8790 sata_pkt_t *satapkt; 8791 int ncq_cmd_in_progress = 0; 8792 int err_retri_cmd_in_progress = 0; 8793 int rdwr_pmult_cmd_in_progress = 0; 8794 8795 ASSERT(MUTEX_HELD(&ahci_portp->ahciport_mutex)); 8796 8797 AHCIDBG(AHCIDBG_ERRS|AHCIDBG_ENTRY, ahci_ctlp, 8798 "ahci_mop_commands entered: port: %d slot_status: 0x%x", 8799 ahci_portp->ahciport_port_num, slot_status); 8800 8801 AHCIDBG(AHCIDBG_ERRS|AHCIDBG_ENTRY, ahci_ctlp, 8802 "ahci_mop_commands: failed_tags: 0x%x, " 8803 "timeout_tags: 0x%x aborted_tags: 0x%x, " 8804 "reset_tags: 0x%x", failed_tags, 8805 timeout_tags, aborted_tags, reset_tags); 8806 8807 #ifdef AHCI_DEBUG 8808 if (ahci_debug_flags & AHCIDBG_ERRS) { 8809 int i; 8810 char msg_buf[200] = {0, }; 8811 for (i = 0x1f; i >= 0; i--) { 8812 if (ahci_portp->ahciport_slot_pkts[i] != NULL) 8813 msg_buf[i] = 'X'; 8814 else 8815 msg_buf[i] = '.'; 8816 } 8817 msg_buf[0x20] = '\0'; 8818 cmn_err(CE_NOTE, "port[%d] slots: %s", 8819 ahci_portp->ahciport_port_num, msg_buf); 8820 cmn_err(CE_NOTE, "[ERR-RT] %p [RW-PM] %p ", 8821 (void *)ahci_portp->ahciport_err_retri_pkt, 8822 (void *)ahci_portp->ahciport_rdwr_pmult_pkt); 8823 } 8824 #endif 8825 8826 if (NON_NCQ_CMD_IN_PROGRESS(ahci_portp)) { 8827 finished_tags = ahci_portp->ahciport_pending_tags & 8828 ~slot_status & AHCI_SLOT_MASK(ahci_ctlp); 8829 8830 unfinished_tags = slot_status & 8831 AHCI_SLOT_MASK(ahci_ctlp) & 8832 ~failed_tags & 8833 ~aborted_tags & 8834 ~reset_tags & 8835 ~timeout_tags; 8836 } else if (NCQ_CMD_IN_PROGRESS(ahci_portp)) { 8837 ncq_cmd_in_progress = 1; 8838 finished_tags = ahci_portp->ahciport_pending_ncq_tags & 8839 ~slot_status & AHCI_NCQ_SLOT_MASK(ahci_portp); 8840 8841 unfinished_tags = slot_status & 8842 AHCI_NCQ_SLOT_MASK(ahci_portp) & 8843 ~failed_tags & 8844 ~aborted_tags & 8845 ~reset_tags & 8846 ~timeout_tags; 8847 } else if (ERR_RETRI_CMD_IN_PROGRESS(ahci_portp)) { 8848 8849 /* 8850 * When AHCI_PORT_FLAG_RQSENSE or AHCI_PORT_FLAG_RDLOGEXT is 8851 * set, it means REQUEST SENSE or READ LOG EXT command doesn't 8852 * complete successfully due to one of the following three 8853 * conditions: 8854 * 8855 * 1. Fatal error - failed_tags includes its slot 8856 * 2. Timed out - timeout_tags includes its slot 8857 * 3. Aborted when hot unplug - aborted_tags includes its 8858 * slot 8859 * 8860 * Please note that the command is always sent down in Slot 0 8861 */ 8862 err_retri_cmd_in_progress = 1; 8863 AHCIDBG(AHCIDBG_ERRS|AHCIDBG_NCQ, ahci_ctlp, 8864 "ahci_mop_commands is called for port %d while " 8865 "REQUEST SENSE or READ LOG EXT for error retrieval " 8866 "is being executed slot_status = 0x%x", 8867 ahci_portp->ahciport_port_num, slot_status); 8868 ASSERT(ahci_portp->ahciport_mop_in_progress > 1); 8869 ASSERT(slot_status == 0x1); 8870 } else if (RDWR_PMULT_CMD_IN_PROGRESS(ahci_portp)) { 8871 rdwr_pmult_cmd_in_progress = 1; 8872 AHCIDBG(AHCIDBG_ERRS|AHCIDBG_PMULT, ahci_ctlp, 8873 "ahci_mop_commands is called for port %d while " 8874 "READ/WRITE PORTMULT command is being executed", 8875 ahci_portp->ahciport_port_num); 8876 8877 ASSERT(slot_status == 0x1); 8878 } 8879 8880 #ifdef AHCI_DEBUG 8881 AHCIDBG(AHCIDBG_ERRS|AHCIDBG_ENTRY, ahci_ctlp, 8882 "ahci_mop_commands: finished_tags: 0x%x, " 8883 "unfinished_tags 0x%x", finished_tags, unfinished_tags); 8884 #endif 8885 8886 /* Send up finished packets with SATA_PKT_COMPLETED */ 8887 while (finished_tags) { 8888 tmp_slot = ddi_ffs(finished_tags) - 1; 8889 if (tmp_slot == -1) { 8890 break; 8891 } 8892 8893 satapkt = ahci_portp->ahciport_slot_pkts[tmp_slot]; 8894 ASSERT(satapkt != NULL); 8895 8896 AHCIDBG(AHCIDBG_INFO, ahci_ctlp, "ahci_mop_commands: " 8897 "sending up pkt 0x%p with SATA_PKT_COMPLETED", 8898 (void *)satapkt); 8899 8900 /* 8901 * Cannot fetch the return register content since the port 8902 * was restarted, so the corresponding tag will be set to 8903 * aborted tags. 8904 */ 8905 if (satapkt->satapkt_cmd.satacmd_flags.sata_special_regs) { 8906 CLEAR_BIT(finished_tags, tmp_slot); 8907 aborted_tags |= tmp_slot; 8908 continue; 8909 } 8910 8911 if (ncq_cmd_in_progress) 8912 CLEAR_BIT(ahci_portp->ahciport_pending_ncq_tags, 8913 tmp_slot); 8914 CLEAR_BIT(ahci_portp->ahciport_pending_tags, tmp_slot); 8915 CLEAR_BIT(finished_tags, tmp_slot); 8916 ahci_portp->ahciport_slot_pkts[tmp_slot] = NULL; 8917 8918 ahci_add_doneq(ahci_portp, satapkt, SATA_PKT_COMPLETED); 8919 } 8920 8921 /* Send up failed packets with SATA_PKT_DEV_ERROR. */ 8922 while (failed_tags) { 8923 if (err_retri_cmd_in_progress) { 8924 satapkt = ahci_portp->ahciport_err_retri_pkt; 8925 ASSERT(satapkt != NULL); 8926 ASSERT(failed_tags == 0x1); 8927 8928 AHCIDBG(AHCIDBG_ERRS, ahci_ctlp, "ahci_mop_commands: " 8929 "sending up pkt 0x%p with SATA_PKT_DEV_ERROR", 8930 (void *)satapkt); 8931 ahci_add_doneq(ahci_portp, satapkt, SATA_PKT_DEV_ERROR); 8932 break; 8933 } 8934 if (rdwr_pmult_cmd_in_progress) { 8935 satapkt = ahci_portp->ahciport_rdwr_pmult_pkt; 8936 ASSERT(satapkt != NULL); 8937 AHCIDBG(AHCIDBG_ERRS, ahci_ctlp, 8938 "ahci_mop_commands: sending up " 8939 "rdwr pmult pkt 0x%p with SATA_PKT_DEV_ERROR", 8940 (void *)satapkt); 8941 ahci_add_doneq(ahci_portp, satapkt, SATA_PKT_DEV_ERROR); 8942 break; 8943 } 8944 8945 tmp_slot = ddi_ffs(failed_tags) - 1; 8946 if (tmp_slot == -1) { 8947 break; 8948 } 8949 8950 satapkt = ahci_portp->ahciport_slot_pkts[tmp_slot]; 8951 ASSERT(satapkt != NULL); 8952 8953 AHCIDBG(AHCIDBG_ERRS, ahci_ctlp, "ahci_mop_commands: " 8954 "sending up pkt 0x%p with SATA_PKT_DEV_ERROR", 8955 (void *)satapkt); 8956 8957 if (ncq_cmd_in_progress) 8958 CLEAR_BIT(ahci_portp->ahciport_pending_ncq_tags, 8959 tmp_slot); 8960 CLEAR_BIT(ahci_portp->ahciport_pending_tags, tmp_slot); 8961 CLEAR_BIT(failed_tags, tmp_slot); 8962 ahci_portp->ahciport_slot_pkts[tmp_slot] = NULL; 8963 8964 ahci_add_doneq(ahci_portp, satapkt, SATA_PKT_DEV_ERROR); 8965 } 8966 8967 /* Send up timeout packets with SATA_PKT_TIMEOUT. */ 8968 while (timeout_tags) { 8969 if (err_retri_cmd_in_progress) { 8970 satapkt = ahci_portp->ahciport_err_retri_pkt; 8971 ASSERT(satapkt != NULL); 8972 ASSERT(timeout_tags == 0x1); 8973 8974 AHCIDBG(AHCIDBG_ERRS, ahci_ctlp, "ahci_mop_commands: " 8975 "sending up pkt 0x%p with SATA_PKT_TIMEOUT", 8976 (void *)satapkt); 8977 ahci_add_doneq(ahci_portp, satapkt, SATA_PKT_TIMEOUT); 8978 break; 8979 } 8980 if (rdwr_pmult_cmd_in_progress) { 8981 satapkt = ahci_portp->ahciport_rdwr_pmult_pkt; 8982 ASSERT(satapkt != NULL); 8983 AHCIDBG(AHCIDBG_ERRS, ahci_ctlp, 8984 "ahci_mop_commands: sending up " 8985 "rdwr pmult pkt 0x%p with SATA_PKT_TIMEOUT", 8986 (void *)satapkt); 8987 ahci_add_doneq(ahci_portp, satapkt, SATA_PKT_TIMEOUT); 8988 break; 8989 } 8990 8991 tmp_slot = ddi_ffs(timeout_tags) - 1; 8992 if (tmp_slot == -1) { 8993 break; 8994 } 8995 8996 satapkt = ahci_portp->ahciport_slot_pkts[tmp_slot]; 8997 ASSERT(satapkt != NULL); 8998 8999 AHCIDBG(AHCIDBG_ERRS, ahci_ctlp, "ahci_mop_commands: " 9000 "sending up pkt 0x%p with SATA_PKT_TIMEOUT", 9001 (void *)satapkt); 9002 9003 if (ncq_cmd_in_progress) 9004 CLEAR_BIT(ahci_portp->ahciport_pending_ncq_tags, 9005 tmp_slot); 9006 CLEAR_BIT(ahci_portp->ahciport_pending_tags, tmp_slot); 9007 CLEAR_BIT(timeout_tags, tmp_slot); 9008 ahci_portp->ahciport_slot_pkts[tmp_slot] = NULL; 9009 9010 ahci_add_doneq(ahci_portp, satapkt, SATA_PKT_TIMEOUT); 9011 } 9012 9013 /* Send up aborted packets with SATA_PKT_ABORTED */ 9014 while (aborted_tags) { 9015 if (err_retri_cmd_in_progress) { 9016 satapkt = ahci_portp->ahciport_err_retri_pkt; 9017 ASSERT(satapkt != NULL); 9018 ASSERT(aborted_tags == 0x1); 9019 9020 AHCIDBG(AHCIDBG_ERRS, ahci_ctlp, "ahci_mop_commands: " 9021 "sending up pkt 0x%p with SATA_PKT_ABORTED", 9022 (void *)satapkt); 9023 ahci_add_doneq(ahci_portp, satapkt, SATA_PKT_ABORTED); 9024 break; 9025 } 9026 if (rdwr_pmult_cmd_in_progress) { 9027 satapkt = ahci_portp->ahciport_rdwr_pmult_pkt; 9028 ASSERT(satapkt != NULL); 9029 ASSERT(aborted_tags == 0x1); 9030 AHCIDBG(AHCIDBG_ERRS, ahci_ctlp, 9031 "ahci_mop_commands: sending up " 9032 "rdwr pmult pkt 0x%p with SATA_PKT_ABORTED", 9033 (void *)satapkt); 9034 ahci_add_doneq(ahci_portp, satapkt, SATA_PKT_ABORTED); 9035 break; 9036 } 9037 9038 tmp_slot = ddi_ffs(aborted_tags) - 1; 9039 if (tmp_slot == -1) { 9040 break; 9041 } 9042 9043 satapkt = ahci_portp->ahciport_slot_pkts[tmp_slot]; 9044 ASSERT(satapkt != NULL); 9045 9046 AHCIDBG(AHCIDBG_ERRS, ahci_ctlp, "ahci_mop_commands: " 9047 "sending up pkt 0x%p with SATA_PKT_ABORTED", 9048 (void *)satapkt); 9049 9050 if (ncq_cmd_in_progress) 9051 CLEAR_BIT(ahci_portp->ahciport_pending_ncq_tags, 9052 tmp_slot); 9053 CLEAR_BIT(ahci_portp->ahciport_pending_tags, tmp_slot); 9054 CLEAR_BIT(aborted_tags, tmp_slot); 9055 ahci_portp->ahciport_slot_pkts[tmp_slot] = NULL; 9056 9057 ahci_add_doneq(ahci_portp, satapkt, SATA_PKT_ABORTED); 9058 } 9059 9060 /* Send up reset packets with SATA_PKT_RESET. */ 9061 while (reset_tags) { 9062 if (rdwr_pmult_cmd_in_progress) { 9063 satapkt = ahci_portp->ahciport_rdwr_pmult_pkt; 9064 ASSERT(satapkt != NULL); 9065 ASSERT(aborted_tags == 0x1); 9066 AHCIDBG(AHCIDBG_ERRS, ahci_ctlp, 9067 "ahci_mop_commands: sending up " 9068 "rdwr pmult pkt 0x%p with SATA_PKT_RESET", 9069 (void *)satapkt); 9070 ahci_add_doneq(ahci_portp, satapkt, SATA_PKT_RESET); 9071 break; 9072 } 9073 9074 tmp_slot = ddi_ffs(reset_tags) - 1; 9075 if (tmp_slot == -1) { 9076 break; 9077 } 9078 9079 satapkt = ahci_portp->ahciport_slot_pkts[tmp_slot]; 9080 ASSERT(satapkt != NULL); 9081 9082 AHCIDBG(AHCIDBG_ERRS, ahci_ctlp, "ahci_mop_commands: " 9083 "sending up pkt 0x%p with SATA_PKT_RESET", 9084 (void *)satapkt); 9085 9086 if (ncq_cmd_in_progress) 9087 CLEAR_BIT(ahci_portp->ahciport_pending_ncq_tags, 9088 tmp_slot); 9089 CLEAR_BIT(ahci_portp->ahciport_pending_tags, tmp_slot); 9090 CLEAR_BIT(reset_tags, tmp_slot); 9091 ahci_portp->ahciport_slot_pkts[tmp_slot] = NULL; 9092 9093 ahci_add_doneq(ahci_portp, satapkt, SATA_PKT_RESET); 9094 } 9095 9096 /* Send up unfinished packets with SATA_PKT_RESET */ 9097 while (unfinished_tags) { 9098 tmp_slot = ddi_ffs(unfinished_tags) - 1; 9099 if (tmp_slot == -1) { 9100 break; 9101 } 9102 9103 satapkt = ahci_portp->ahciport_slot_pkts[tmp_slot]; 9104 ASSERT(satapkt != NULL); 9105 9106 AHCIDBG(AHCIDBG_ERRS, ahci_ctlp, "ahci_mop_commands: " 9107 "sending up pkt 0x%p with SATA_PKT_RESET", 9108 (void *)satapkt); 9109 9110 if (ncq_cmd_in_progress) 9111 CLEAR_BIT(ahci_portp->ahciport_pending_ncq_tags, 9112 tmp_slot); 9113 CLEAR_BIT(ahci_portp->ahciport_pending_tags, tmp_slot); 9114 CLEAR_BIT(unfinished_tags, tmp_slot); 9115 ahci_portp->ahciport_slot_pkts[tmp_slot] = NULL; 9116 9117 ahci_add_doneq(ahci_portp, satapkt, SATA_PKT_RESET); 9118 } 9119 9120 ahci_portp->ahciport_mop_in_progress--; 9121 ASSERT(ahci_portp->ahciport_mop_in_progress >= 0); 9122 9123 if (ahci_portp->ahciport_mop_in_progress == 0) 9124 ahci_portp->ahciport_flags &= ~AHCI_PORT_FLAG_MOPPING; 9125 9126 ahci_flush_doneq(ahci_portp); 9127 } 9128 9129 /* 9130 * This routine is going to first request a READ LOG EXT sata pkt from sata 9131 * module, and then deliver it to the HBA to get the ncq failure context. 9132 * The return value is the exactly failed tags. 9133 */ 9134 static uint32_t 9135 ahci_get_rdlogext_data(ahci_ctl_t *ahci_ctlp, ahci_port_t *ahci_portp, 9136 uint8_t port) 9137 { 9138 sata_device_t sdevice; 9139 sata_pkt_t *rdlog_spkt, *spkt; 9140 ddi_dma_handle_t buf_dma_handle; 9141 ahci_addr_t addr; 9142 int loop_count; 9143 int rval; 9144 int failed_slot; 9145 uint32_t failed_tags = 0; 9146 struct sata_ncq_error_recovery_page *ncq_err_page; 9147 9148 AHCIDBG(AHCIDBG_ENTRY|AHCIDBG_NCQ, ahci_ctlp, 9149 "ahci_get_rdlogext_data enter: port %d", port); 9150 9151 /* Prepare the sdevice data */ 9152 bzero((void *)&sdevice, sizeof (sata_device_t)); 9153 sdevice.satadev_addr.cport = ahci_ctlp->ahcictl_port_to_cport[port]; 9154 9155 sdevice.satadev_addr.qual = SATA_ADDR_DCPORT; 9156 sdevice.satadev_addr.pmport = 0; 9157 9158 /* Translate sata_device.satadev_addr -> ahci_addr */ 9159 ahci_get_ahci_addr(ahci_ctlp, &sdevice, &addr); 9160 9161 /* 9162 * Call the sata hba interface to get a rdlog spkt 9163 */ 9164 loop_count = 0; 9165 loop: 9166 rdlog_spkt = sata_get_error_retrieval_pkt(ahci_ctlp->ahcictl_dip, 9167 &sdevice, SATA_ERR_RETR_PKT_TYPE_NCQ); 9168 if (rdlog_spkt == NULL) { 9169 if (loop_count++ < AHCI_POLLRATE_GET_SPKT) { 9170 /* Sleep for a while */ 9171 drv_usecwait(AHCI_10MS_USECS); 9172 goto loop; 9173 } 9174 /* Timed out after 1s */ 9175 AHCIDBG(AHCIDBG_ERRS, ahci_ctlp, 9176 "failed to get rdlog spkt for port %d", port); 9177 return (failed_tags); 9178 } 9179 9180 ASSERT(rdlog_spkt->satapkt_op_mode & SATA_OPMODE_SYNCH); 9181 9182 /* 9183 * This flag is used to handle the specific error recovery when the 9184 * READ LOG EXT command gets a failure (fatal error or time-out). 9185 */ 9186 ahci_portp->ahciport_flags |= AHCI_PORT_FLAG_RDLOGEXT; 9187 9188 /* 9189 * This start is not supposed to fail because after port is restarted, 9190 * the whole command list is empty. 9191 */ 9192 ahci_portp->ahciport_err_retri_pkt = rdlog_spkt; 9193 (void) ahci_do_sync_start(ahci_ctlp, ahci_portp, &addr, rdlog_spkt); 9194 ahci_portp->ahciport_err_retri_pkt = NULL; 9195 9196 /* Remove the flag after READ LOG EXT command is completed */ 9197 ahci_portp->ahciport_flags &= ~AHCI_PORT_FLAG_RDLOGEXT; 9198 9199 if (rdlog_spkt->satapkt_reason == SATA_PKT_COMPLETED) { 9200 /* Update the request log data */ 9201 buf_dma_handle = *(ddi_dma_handle_t *) 9202 (rdlog_spkt->satapkt_cmd.satacmd_err_ret_buf_handle); 9203 rval = ddi_dma_sync(buf_dma_handle, 0, 0, 9204 DDI_DMA_SYNC_FORKERNEL); 9205 if (rval == DDI_SUCCESS) { 9206 ncq_err_page = 9207 (struct sata_ncq_error_recovery_page *)rdlog_spkt-> 9208 satapkt_cmd.satacmd_bp->b_un.b_addr; 9209 9210 /* Get the failed tag */ 9211 failed_slot = ncq_err_page->ncq_tag; 9212 AHCIDBG(AHCIDBG_ERRS, ahci_ctlp, 9213 "ahci_get_rdlogext_data: port %d " 9214 "failed slot %d", port, failed_slot); 9215 if (failed_slot & NQ) { 9216 AHCIDBG(AHCIDBG_ERRS, ahci_ctlp, 9217 "the failed slot is not a valid tag", NULL); 9218 goto out; 9219 } 9220 9221 failed_slot &= NCQ_TAG_MASK; 9222 spkt = ahci_portp->ahciport_slot_pkts[failed_slot]; 9223 AHCIDBG(AHCIDBG_ERRS, ahci_ctlp, 9224 "ahci_get_rdlogext_data: failed spkt 0x%p", 9225 (void *)spkt); 9226 if (spkt == NULL) { 9227 AHCIDBG(AHCIDBG_ERRS, ahci_ctlp, 9228 "the failed slot spkt is NULL", NULL); 9229 goto out; 9230 } 9231 9232 failed_tags = 0x1 << failed_slot; 9233 9234 /* Fill out the error context */ 9235 ahci_copy_ncq_err_page(&spkt->satapkt_cmd, 9236 ncq_err_page); 9237 ahci_update_sata_registers(ahci_ctlp, port, 9238 &spkt->satapkt_device); 9239 } 9240 } 9241 out: 9242 sata_free_error_retrieval_pkt(rdlog_spkt); 9243 9244 return (failed_tags); 9245 } 9246 9247 /* 9248 * This routine is going to first request a REQUEST SENSE sata pkt from sata 9249 * module, and then deliver it to the HBA to get the sense data and copy 9250 * the sense data back to the orignal failed sata pkt, and free the REQUEST 9251 * SENSE sata pkt later. 9252 */ 9253 static void 9254 ahci_get_rqsense_data(ahci_ctl_t *ahci_ctlp, ahci_port_t *ahci_portp, 9255 uint8_t port, sata_pkt_t *spkt) 9256 { 9257 sata_device_t sdevice; 9258 sata_pkt_t *rs_spkt; 9259 sata_cmd_t *sata_cmd; 9260 ddi_dma_handle_t buf_dma_handle; 9261 ahci_addr_t addr; 9262 int loop_count; 9263 #if AHCI_DEBUG 9264 struct scsi_extended_sense *rqsense; 9265 #endif 9266 9267 AHCIDBG(AHCIDBG_ENTRY, ahci_ctlp, 9268 "ahci_get_rqsense_data enter: port %d", port); 9269 9270 /* Prepare the sdevice data */ 9271 bzero((void *)&sdevice, sizeof (sata_device_t)); 9272 sdevice.satadev_addr.cport = ahci_ctlp->ahcictl_port_to_cport[port]; 9273 9274 sdevice.satadev_addr.qual = SATA_ADDR_DCPORT; 9275 sdevice.satadev_addr.pmport = 0; 9276 9277 /* Translate sata_device.satadev_addr -> ahci_addr */ 9278 ahci_get_ahci_addr(ahci_ctlp, &sdevice, &addr); 9279 9280 sata_cmd = &spkt->satapkt_cmd; 9281 9282 /* 9283 * Call the sata hba interface to get a rs spkt 9284 */ 9285 loop_count = 0; 9286 loop: 9287 rs_spkt = sata_get_error_retrieval_pkt(ahci_ctlp->ahcictl_dip, 9288 &sdevice, SATA_ERR_RETR_PKT_TYPE_ATAPI); 9289 if (rs_spkt == NULL) { 9290 if (loop_count++ < AHCI_POLLRATE_GET_SPKT) { 9291 /* Sleep for a while */ 9292 drv_usecwait(AHCI_10MS_USECS); 9293 goto loop; 9294 9295 } 9296 /* Timed out after 1s */ 9297 AHCIDBG(AHCIDBG_ERRS, ahci_ctlp, 9298 "failed to get rs spkt for port %d", port); 9299 return; 9300 } 9301 9302 ASSERT(rs_spkt->satapkt_op_mode & SATA_OPMODE_SYNCH); 9303 9304 /* 9305 * This flag is used to handle the specific error recovery when the 9306 * REQUEST SENSE command gets a faiure (fatal error or time-out). 9307 */ 9308 ahci_portp->ahciport_flags |= AHCI_PORT_FLAG_RQSENSE; 9309 9310 /* 9311 * This start is not supposed to fail because after port is restarted, 9312 * the whole command list is empty. 9313 */ 9314 ahci_portp->ahciport_err_retri_pkt = rs_spkt; 9315 (void) ahci_do_sync_start(ahci_ctlp, ahci_portp, &addr, rs_spkt); 9316 ahci_portp->ahciport_err_retri_pkt = NULL; 9317 9318 /* Remove the flag after REQUEST SENSE command is completed */ 9319 ahci_portp->ahciport_flags &= ~AHCI_PORT_FLAG_RQSENSE; 9320 9321 if (rs_spkt->satapkt_reason == SATA_PKT_COMPLETED) { 9322 /* Update the request sense data */ 9323 buf_dma_handle = *(ddi_dma_handle_t *) 9324 (rs_spkt->satapkt_cmd.satacmd_err_ret_buf_handle); 9325 (void) ddi_dma_sync(buf_dma_handle, 0, 0, 9326 DDI_DMA_SYNC_FORKERNEL); 9327 /* Copy the request sense data */ 9328 bcopy(rs_spkt-> 9329 satapkt_cmd.satacmd_bp->b_un.b_addr, 9330 &sata_cmd->satacmd_rqsense, 9331 SATA_ATAPI_MIN_RQSENSE_LEN); 9332 #if AHCI_DEBUG 9333 rqsense = (struct scsi_extended_sense *) 9334 sata_cmd->satacmd_rqsense; 9335 9336 /* Dump the sense data */ 9337 AHCIDBG(AHCIDBG_SENSEDATA, ahci_ctlp, "\n", NULL); 9338 AHCIDBG(AHCIDBG_SENSEDATA, ahci_ctlp, 9339 "Sense data for satapkt %p ATAPI cmd 0x%x", 9340 spkt, sata_cmd->satacmd_acdb[0]); 9341 AHCIDBG(AHCIDBG_SENSEDATA, ahci_ctlp, 9342 " es_code 0x%x es_class 0x%x " 9343 "es_key 0x%x es_add_code 0x%x " 9344 "es_qual_code 0x%x", 9345 rqsense->es_code, rqsense->es_class, 9346 rqsense->es_key, rqsense->es_add_code, 9347 rqsense->es_qual_code); 9348 #endif 9349 } 9350 9351 sata_free_error_retrieval_pkt(rs_spkt); 9352 } 9353 9354 /* 9355 * Fatal errors will cause the HBA to enter the ERR: Fatal state. To recover, 9356 * the port must be restarted. When the HBA detects thus error, it may try 9357 * to abort a transfer. And if the transfer was aborted, the device is 9358 * expected to send a D2H Register FIS with PxTFD.STS.ERR set to '1' and both 9359 * PxTFD.STS.BSY and PxTFD.STS.DRQ cleared to '0'. Then system software knows 9360 * that the device is in a stable status and transfers may be restarted without 9361 * issuing a COMRESET to the device. If PxTFD.STS.BSY or PxTFD.STS.DRQ is set, 9362 * then the software will send the COMRESET to do the port reset. 9363 * 9364 * Software should perform the appropriate error recovery actions based on 9365 * whether non-queued commands were being issued or natived command queuing 9366 * commands were being issued. 9367 * 9368 * And software will complete the command that had the error with error mark 9369 * to higher level software. 9370 * 9371 * Fatal errors include the following: 9372 * PxIS.IFS - Interface Fatal Error Status 9373 * PxIS.HBDS - Host Bus Data Error Status 9374 * PxIS.HBFS - Host Bus Fatal Error Status 9375 * PxIS.TFES - Task File Error Status 9376 */ 9377 static void 9378 ahci_fatal_error_recovery_handler(ahci_ctl_t *ahci_ctlp, 9379 ahci_port_t *ahci_portp, ahci_addr_t *addrp, uint32_t intr_status) 9380 { 9381 uint32_t port_cmd_status; 9382 uint32_t slot_status = 0; 9383 uint32_t failed_tags = 0; 9384 int failed_slot; 9385 int reset_flag = 0, flag = 0; 9386 ahci_fis_d2h_register_t *ahci_rcvd_fisp; 9387 sata_cmd_t *sata_cmd = NULL; 9388 sata_pkt_t *spkt = NULL; 9389 #if AHCI_DEBUG 9390 ahci_cmd_header_t *cmd_header; 9391 #endif 9392 uint8_t port = addrp->aa_port; 9393 int instance = ddi_get_instance(ahci_ctlp->ahcictl_dip); 9394 int rval; 9395 9396 ASSERT(MUTEX_HELD(&ahci_portp->ahciport_mutex)); 9397 9398 AHCIDBG(AHCIDBG_ENTRY, ahci_ctlp, 9399 "ahci_fatal_error_recovery_handler enter: port %d", port); 9400 9401 /* Port multiplier error */ 9402 if (ahci_portp->ahciport_device_type == SATA_DTYPE_PMULT) { 9403 /* FBS code is neither completed nor tested. */ 9404 ahci_pmult_error_recovery_handler(ahci_ctlp, ahci_portp, 9405 port, intr_status); 9406 9407 /* Force a port reset */ 9408 flag = AHCI_PORT_RESET; 9409 } 9410 9411 if (NON_NCQ_CMD_IN_PROGRESS(ahci_portp) || 9412 ERR_RETRI_CMD_IN_PROGRESS(ahci_portp)) { 9413 9414 /* Read PxCI to see which commands are still outstanding */ 9415 slot_status = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 9416 (uint32_t *)AHCI_PORT_PxCI(ahci_ctlp, port)); 9417 9418 /* 9419 * Read PxCMD.CCS to determine the slot that the HBA 9420 * was processing when the error occurred. 9421 */ 9422 port_cmd_status = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 9423 (uint32_t *)AHCI_PORT_PxCMD(ahci_ctlp, port)); 9424 failed_slot = (port_cmd_status & AHCI_CMD_STATUS_CCS) >> 9425 AHCI_CMD_STATUS_CCS_SHIFT; 9426 9427 if (ERR_RETRI_CMD_IN_PROGRESS(ahci_portp)) { 9428 spkt = ahci_portp->ahciport_err_retri_pkt; 9429 ASSERT(spkt != NULL); 9430 } else { 9431 spkt = ahci_portp->ahciport_slot_pkts[failed_slot]; 9432 if (spkt == NULL) { 9433 /* May happen when interface errors occur? */ 9434 goto next; 9435 } 9436 } 9437 9438 #if AHCI_DEBUG 9439 /* 9440 * Debugging purpose... 9441 */ 9442 if (ahci_portp->ahciport_prd_bytecounts[failed_slot]) { 9443 cmd_header = 9444 &ahci_portp->ahciport_cmd_list[failed_slot]; 9445 AHCIDBG(AHCIDBG_INTR|AHCIDBG_ERRS, ahci_ctlp, 9446 "ahci_fatal_error_recovery_handler: port %d, " 9447 "PRD Byte Count = 0x%x, " 9448 "ahciport_prd_bytecounts = 0x%x", port, 9449 cmd_header->ahcich_prd_byte_count, 9450 ahci_portp->ahciport_prd_bytecounts[failed_slot]); 9451 } 9452 #endif 9453 9454 sata_cmd = &spkt->satapkt_cmd; 9455 9456 /* Fill out the status and error registers for PxIS.TFES */ 9457 if (intr_status & AHCI_INTR_STATUS_TFES) { 9458 ahci_rcvd_fisp = &(ahci_portp->ahciport_rcvd_fis-> 9459 ahcirf_d2h_register_fis); 9460 9461 /* Copy the error context back to the sata_cmd */ 9462 ahci_copy_err_cnxt(sata_cmd, ahci_rcvd_fisp); 9463 } 9464 9465 /* The failed command must be one of the outstanding commands */ 9466 failed_tags = 0x1 << failed_slot; 9467 ASSERT(failed_tags & slot_status); 9468 9469 /* Update the sata registers, especially PxSERR register */ 9470 ahci_update_sata_registers(ahci_ctlp, port, 9471 &spkt->satapkt_device); 9472 9473 } else if (NCQ_CMD_IN_PROGRESS(ahci_portp)) { 9474 /* Read PxSACT to see which commands are still outstanding */ 9475 slot_status = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 9476 (uint32_t *)AHCI_PORT_PxSACT(ahci_ctlp, port)); 9477 } 9478 next: 9479 9480 #if AHCI_DEBUG 9481 /* 9482 * When AHCI_PORT_FLAG_RQSENSE or AHCI_PORT_FLAG_RDLOGEXT flag is 9483 * set, it means a fatal error happened after REQUEST SENSE command 9484 * or READ LOG EXT command is delivered to the HBA during the error 9485 * recovery process. At this time, the only outstanding command is 9486 * supposed to be REQUEST SENSE command or READ LOG EXT command. 9487 */ 9488 if (ERR_RETRI_CMD_IN_PROGRESS(ahci_portp)) { 9489 AHCIDBG(AHCIDBG_ERRS, ahci_ctlp, 9490 "ahci_fatal_error_recovery_handler: port %d REQUEST SENSE " 9491 "command or READ LOG EXT command for error data retrieval " 9492 "failed", port); 9493 ASSERT(slot_status == 0x1); 9494 ASSERT(failed_slot == 0); 9495 ASSERT(spkt->satapkt_cmd.satacmd_acdb[0] == 9496 SCMD_REQUEST_SENSE || 9497 spkt->satapkt_cmd.satacmd_cmd_reg == 9498 SATAC_READ_LOG_EXT); 9499 } 9500 #endif 9501 9502 ahci_portp->ahciport_flags |= AHCI_PORT_FLAG_MOPPING; 9503 ahci_portp->ahciport_mop_in_progress++; 9504 9505 rval = ahci_restart_port_wait_till_ready(ahci_ctlp, ahci_portp, 9506 port, flag, &reset_flag); 9507 9508 if (ahci_portp->ahciport_flags & AHCI_PORT_FLAG_ERRPRINT) { 9509 ahci_portp->ahciport_flags &= ~AHCI_PORT_FLAG_ERRPRINT; 9510 if (rval == AHCI_SUCCESS) 9511 cmn_err(CE_WARN, "!ahci%d: error recovery for port %d " 9512 "succeed", instance, port); 9513 else 9514 cmn_err(CE_WARN, "!ahci%d: error recovery for port %d " 9515 "failed", instance, port); 9516 } 9517 9518 /* 9519 * Won't retrieve error information: 9520 * 1. Port reset was involved to recover 9521 * 2. Device is gone 9522 * 3. IDENTIFY DEVICE command sent to ATAPI device 9523 * 4. REQUEST SENSE or READ LOG EXT command during error recovery 9524 */ 9525 if (reset_flag || 9526 ahci_portp->ahciport_device_type == SATA_DTYPE_NONE || 9527 spkt && spkt->satapkt_cmd.satacmd_cmd_reg == SATAC_ID_DEVICE || 9528 ERR_RETRI_CMD_IN_PROGRESS(ahci_portp)) 9529 goto out; 9530 9531 /* 9532 * Deliver READ LOG EXT to gather information about the error when 9533 * a COMRESET has not been performed as part of the error recovery 9534 * during NCQ command processing. 9535 */ 9536 if (NCQ_CMD_IN_PROGRESS(ahci_portp)) { 9537 failed_tags = ahci_get_rdlogext_data(ahci_ctlp, 9538 ahci_portp, port); 9539 goto out; 9540 } 9541 9542 /* 9543 * Deliver REQUEST SENSE for ATAPI command to gather information about 9544 * the error when a COMRESET has not been performed as part of the 9545 * error recovery. 9546 */ 9547 if (spkt && ahci_portp->ahciport_device_type == SATA_DTYPE_ATAPI) 9548 ahci_get_rqsense_data(ahci_ctlp, ahci_portp, port, spkt); 9549 out: 9550 AHCIDBG(AHCIDBG_ERRS, ahci_ctlp, 9551 "ahci_fatal_error_recovery_handler: port %d fatal error " 9552 "occurred slot_status = 0x%x, pending_tags = 0x%x, " 9553 "pending_ncq_tags = 0x%x failed_tags = 0x%x", 9554 port, slot_status, ahci_portp->ahciport_pending_tags, 9555 ahci_portp->ahciport_pending_ncq_tags, failed_tags); 9556 9557 ahci_mop_commands(ahci_ctlp, 9558 ahci_portp, 9559 slot_status, 9560 failed_tags, /* failed tags */ 9561 0, /* timeout tags */ 9562 0, /* aborted tags */ 9563 0); /* reset tags */ 9564 } 9565 9566 /* 9567 * Used to recovery a PMULT pmport fatal error under FIS-based switching. 9568 * 1. device specific.PxFBS.SDE=1 9569 * 2. Non Device specific. 9570 * Nothing will be done when Command-based switching is employed. 9571 * 9572 * Currently code is neither completed nor tested. 9573 */ 9574 static void 9575 ahci_pmult_error_recovery_handler(ahci_ctl_t *ahci_ctlp, 9576 ahci_port_t *ahci_portp, uint8_t port, uint32_t intr_status) 9577 { 9578 #ifndef __lock_lint 9579 _NOTE(ARGUNUSED(intr_status)) 9580 #endif 9581 uint32_t port_fbs_ctrl; 9582 int loop_count = 0; 9583 ahci_addr_t addr; 9584 9585 ASSERT(MUTEX_HELD(&ahci_portp->ahciport_mutex)); 9586 9587 /* Nothing will be done under Command-based switching. */ 9588 if (!(ahci_ctlp->ahcictl_cap & AHCI_CAP_PMULT_FBSS)) 9589 return; 9590 9591 port_fbs_ctrl = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 9592 (uint32_t *)AHCI_PORT_PxFBS(ahci_ctlp, port)); 9593 9594 if (!(port_fbs_ctrl & AHCI_FBS_EN)) 9595 /* FBS is not enabled. */ 9596 return; 9597 9598 /* Problem's getting complicated now. */ 9599 /* 9600 * If FIS-based switching is used, we need to check 9601 * the PxFBS to see the error type. 9602 */ 9603 port_fbs_ctrl = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 9604 (uint32_t *)AHCI_PORT_PxFBS(ahci_ctlp, port)); 9605 9606 /* Refer to spec(v1.2) 9.3.6.1 */ 9607 if (port_fbs_ctrl & AHCI_FBS_SDE) { 9608 AHCIDBG(AHCIDBG_ERRS, ahci_ctlp, 9609 "A Device Sepcific Error: port %d", port); 9610 /* 9611 * Controller has paused commands for all other 9612 * sub-devices until PxFBS.DEC is set. 9613 */ 9614 ahci_reject_all_abort_pkts(ahci_ctlp, 9615 ahci_portp, 0); 9616 9617 ddi_put32(ahci_ctlp->ahcictl_ahci_acc_handle, 9618 (uint32_t *)AHCI_PORT_PxFBS(ahci_ctlp, port), 9619 port_fbs_ctrl | AHCI_FBS_DEC); 9620 9621 /* 9622 * Wait controller clear PxFBS.DEC, 9623 * then we can continue. 9624 */ 9625 loop_count = 0; 9626 do { 9627 port_fbs_ctrl = ddi_get32(ahci_ctlp-> 9628 ahcictl_ahci_acc_handle, (uint32_t *) 9629 AHCI_PORT_PxFBS(ahci_ctlp, port)); 9630 9631 if (loop_count++ > 1000) 9632 /* 9633 * Esclate the error. Follow 9634 * non-device specific error 9635 * procedure. 9636 */ 9637 return; 9638 9639 drv_usecwait(AHCI_100US_USECS); 9640 } while (port_fbs_ctrl & AHCI_FBS_DEC); 9641 9642 /* 9643 * Issue a software reset to ensure drive is in 9644 * a known state. 9645 */ 9646 (void) ahci_software_reset(ahci_ctlp, 9647 ahci_portp, &addr); 9648 9649 } else { 9650 9651 /* Process Non-Device Specific Error. */ 9652 /* This will be handled later on. */ 9653 cmn_err(CE_NOTE, "!FBS is not supported now."); 9654 } 9655 } 9656 /* 9657 * Handle events - fatal error recovery 9658 */ 9659 static void 9660 ahci_events_handler(void *args) 9661 { 9662 ahci_event_arg_t *ahci_event_arg; 9663 ahci_ctl_t *ahci_ctlp; 9664 ahci_port_t *ahci_portp; 9665 ahci_addr_t *addrp; 9666 uint32_t event; 9667 int instance; 9668 9669 ahci_event_arg = (ahci_event_arg_t *)args; 9670 9671 ahci_ctlp = ahci_event_arg->ahciea_ctlp; 9672 ahci_portp = ahci_event_arg->ahciea_portp; 9673 addrp = ahci_event_arg->ahciea_addrp; 9674 event = ahci_event_arg->ahciea_event; 9675 instance = ddi_get_instance(ahci_ctlp->ahcictl_dip); 9676 9677 AHCIDBG(AHCIDBG_ENTRY|AHCIDBG_INTR|AHCIDBG_ERRS, ahci_ctlp, 9678 "ahci_events_handler enter: port %d intr_status = 0x%x", 9679 ahci_portp->ahciport_port_num, event); 9680 9681 mutex_enter(&ahci_portp->ahciport_mutex); 9682 9683 /* 9684 * ahci_intr_phyrdy_change() may have rendered it to 9685 * SATA_DTYPE_NONE. 9686 */ 9687 if (ahci_portp->ahciport_device_type == SATA_DTYPE_NONE) { 9688 AHCIDBG(AHCIDBG_ENTRY|AHCIDBG_INTR, ahci_ctlp, 9689 "ahci_events_handler: port %d no device attached, " 9690 "and just return without doing anything", 9691 ahci_portp->ahciport_port_num); 9692 9693 if (ahci_portp->ahciport_flags & AHCI_PORT_FLAG_ERRPRINT) { 9694 ahci_portp->ahciport_flags &= ~AHCI_PORT_FLAG_ERRPRINT; 9695 cmn_err(CE_WARN, "!ahci%d: error recovery for port %d " 9696 "succeed", instance, ahci_portp->ahciport_port_num); 9697 } 9698 9699 goto out; 9700 } 9701 9702 if (event & (AHCI_INTR_STATUS_IFS | 9703 AHCI_INTR_STATUS_HBDS | 9704 AHCI_INTR_STATUS_HBFS | 9705 AHCI_INTR_STATUS_TFES)) 9706 ahci_fatal_error_recovery_handler(ahci_ctlp, ahci_portp, 9707 addrp, event); 9708 9709 out: 9710 mutex_exit(&ahci_portp->ahciport_mutex); 9711 } 9712 9713 /* 9714 * ahci_watchdog_handler() and ahci_do_sync_start will call us if they 9715 * detect there are some commands which are timed out. 9716 */ 9717 static void 9718 ahci_timeout_pkts(ahci_ctl_t *ahci_ctlp, ahci_port_t *ahci_portp, 9719 uint8_t port, uint32_t tmp_timeout_tags) 9720 { 9721 uint32_t slot_status = 0; 9722 uint32_t finished_tags = 0; 9723 uint32_t timeout_tags = 0; 9724 9725 AHCIDBG(AHCIDBG_TIMEOUT|AHCIDBG_ENTRY, ahci_ctlp, 9726 "ahci_timeout_pkts enter: port %d", port); 9727 9728 mutex_enter(&ahci_portp->ahciport_mutex); 9729 9730 if (NON_NCQ_CMD_IN_PROGRESS(ahci_portp) || 9731 RDWR_PMULT_CMD_IN_PROGRESS(ahci_portp) || 9732 ERR_RETRI_CMD_IN_PROGRESS(ahci_portp)) { 9733 /* Read PxCI to see which commands are still outstanding */ 9734 slot_status = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 9735 (uint32_t *)AHCI_PORT_PxCI(ahci_ctlp, port)); 9736 } else if (NCQ_CMD_IN_PROGRESS(ahci_portp)) { 9737 /* Read PxSACT to see which commands are still outstanding */ 9738 slot_status = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 9739 (uint32_t *)AHCI_PORT_PxSACT(ahci_ctlp, port)); 9740 } 9741 9742 #if AHCI_DEBUG 9743 /* 9744 * When AHCI_PORT_FLAG_RQSENSE or AHCI_PORT_FLAG_RDLOGEXT flag is 9745 * set, it means a fatal error happened after REQUEST SENSE command 9746 * or READ LOG EXT command is delivered to the HBA during the error 9747 * recovery process. At this time, the only outstanding command is 9748 * supposed to be REQUEST SENSE command or READ LOG EXT command. 9749 */ 9750 if (ERR_RETRI_CMD_IN_PROGRESS(ahci_portp)) { 9751 AHCIDBG(AHCIDBG_ERRS|AHCIDBG_TIMEOUT, ahci_ctlp, 9752 "ahci_timeout_pkts called while REQUEST SENSE " 9753 "command or READ LOG EXT command for error recovery " 9754 "timed out timeout_tags = 0x%x, slot_status = 0x%x, " 9755 "pending_tags = 0x%x, pending_ncq_tags = 0x%x", 9756 tmp_timeout_tags, slot_status, 9757 ahci_portp->ahciport_pending_tags, 9758 ahci_portp->ahciport_pending_ncq_tags); 9759 ASSERT(slot_status == 0x1); 9760 } else if (RDWR_PMULT_CMD_IN_PROGRESS(ahci_portp)) { 9761 AHCIDBG(AHCIDBG_ERRS|AHCIDBG_TIMEOUT, ahci_ctlp, 9762 "ahci_timeout_pkts called while executing R/W PMULT " 9763 "command timeout_tags = 0x%x, slot_status = 0x%x", 9764 tmp_timeout_tags, slot_status); 9765 ASSERT(slot_status == 0x1); 9766 } 9767 #endif 9768 9769 ahci_portp->ahciport_flags |= AHCI_PORT_FLAG_MOPPING; 9770 ahci_portp->ahciport_mop_in_progress++; 9771 9772 (void) ahci_restart_port_wait_till_ready(ahci_ctlp, ahci_portp, 9773 port, AHCI_PORT_RESET, NULL); 9774 9775 /* 9776 * Re-identify timeout tags because some previously checked commands 9777 * could already complete. 9778 */ 9779 if (NON_NCQ_CMD_IN_PROGRESS(ahci_portp)) { 9780 finished_tags = ahci_portp->ahciport_pending_tags & 9781 ~slot_status & AHCI_SLOT_MASK(ahci_ctlp); 9782 timeout_tags = tmp_timeout_tags & ~finished_tags; 9783 9784 AHCIDBG(AHCIDBG_TIMEOUT, ahci_ctlp, 9785 "ahci_timeout_pkts: port %d, finished_tags = 0x%x, " 9786 "timeout_tags = 0x%x, port_cmd_issue = 0x%x, " 9787 "pending_tags = 0x%x ", 9788 port, finished_tags, timeout_tags, 9789 slot_status, ahci_portp->ahciport_pending_tags); 9790 } else if (NCQ_CMD_IN_PROGRESS(ahci_portp)) { 9791 finished_tags = ahci_portp->ahciport_pending_ncq_tags & 9792 ~slot_status & AHCI_NCQ_SLOT_MASK(ahci_portp); 9793 timeout_tags = tmp_timeout_tags & ~finished_tags; 9794 9795 AHCIDBG(AHCIDBG_TIMEOUT|AHCIDBG_NCQ, ahci_ctlp, 9796 "ahci_timeout_pkts: port %d, finished_tags = 0x%x, " 9797 "timeout_tags = 0x%x, port_sactive = 0x%x, " 9798 "pending_ncq_tags = 0x%x ", 9799 port, finished_tags, timeout_tags, 9800 slot_status, ahci_portp->ahciport_pending_ncq_tags); 9801 } else if (ERR_RETRI_CMD_IN_PROGRESS(ahci_portp) || 9802 RDWR_PMULT_CMD_IN_PROGRESS(ahci_portp)) { 9803 timeout_tags = tmp_timeout_tags; 9804 } 9805 9806 ahci_mop_commands(ahci_ctlp, 9807 ahci_portp, 9808 slot_status, 9809 0, /* failed tags */ 9810 timeout_tags, /* timeout tags */ 9811 0, /* aborted tags */ 9812 0); /* reset tags */ 9813 9814 mutex_exit(&ahci_portp->ahciport_mutex); 9815 } 9816 9817 /* 9818 * Watchdog handler kicks in every 5 seconds to timeout any commands pending 9819 * for long time. 9820 */ 9821 static void 9822 ahci_watchdog_handler(ahci_ctl_t *ahci_ctlp) 9823 { 9824 ahci_port_t *ahci_portp; 9825 sata_pkt_t *spkt; 9826 uint32_t pending_tags; 9827 uint32_t timeout_tags; 9828 uint32_t port_cmd_status; 9829 uint32_t port_sactive; 9830 uint8_t port; 9831 int tmp_slot; 9832 int current_slot; 9833 uint32_t current_tags; 9834 int instance = ddi_get_instance(ahci_ctlp->ahcictl_dip); 9835 9836 mutex_enter(&ahci_ctlp->ahcictl_mutex); 9837 9838 AHCIDBG(AHCIDBG_ENTRY, ahci_ctlp, 9839 "ahci_watchdog_handler entered", NULL); 9840 9841 for (port = 0; port < ahci_ctlp->ahcictl_num_ports; port++) { 9842 if (!AHCI_PORT_IMPLEMENTED(ahci_ctlp, port)) { 9843 continue; 9844 } 9845 9846 ahci_portp = ahci_ctlp->ahcictl_ports[port]; 9847 9848 mutex_enter(&ahci_portp->ahciport_mutex); 9849 if (ahci_portp->ahciport_device_type == SATA_DTYPE_NONE) { 9850 mutex_exit(&ahci_portp->ahciport_mutex); 9851 continue; 9852 } 9853 9854 /* Skip the check for those ports in error recovery */ 9855 if ((ahci_portp->ahciport_flags & AHCI_PORT_FLAG_MOPPING) && 9856 !(ERR_RETRI_CMD_IN_PROGRESS(ahci_portp))) { 9857 mutex_exit(&ahci_portp->ahciport_mutex); 9858 continue; 9859 } 9860 9861 pending_tags = 0; 9862 port_cmd_status = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 9863 (uint32_t *)AHCI_PORT_PxCMD(ahci_ctlp, port)); 9864 9865 if (ERR_RETRI_CMD_IN_PROGRESS(ahci_portp) || 9866 RDWR_PMULT_CMD_IN_PROGRESS(ahci_portp)) { 9867 current_slot = 0; 9868 pending_tags = 0x1; 9869 } else if (NON_NCQ_CMD_IN_PROGRESS(ahci_portp)) { 9870 current_slot = 9871 (port_cmd_status & AHCI_CMD_STATUS_CCS) >> 9872 AHCI_CMD_STATUS_CCS_SHIFT; 9873 pending_tags = ahci_portp->ahciport_pending_tags; 9874 } else if (NCQ_CMD_IN_PROGRESS(ahci_portp)) { 9875 port_sactive = ddi_get32( 9876 ahci_ctlp->ahcictl_ahci_acc_handle, 9877 (uint32_t *)AHCI_PORT_PxSACT(ahci_ctlp, port)); 9878 current_tags = port_sactive & 9879 ~port_cmd_status & 9880 AHCI_NCQ_SLOT_MASK(ahci_portp); 9881 pending_tags = ahci_portp->ahciport_pending_ncq_tags; 9882 } 9883 9884 timeout_tags = 0; 9885 while (pending_tags) { 9886 tmp_slot = ddi_ffs(pending_tags) - 1; 9887 if (tmp_slot == -1) { 9888 break; 9889 } 9890 9891 if (ERR_RETRI_CMD_IN_PROGRESS(ahci_portp)) 9892 spkt = ahci_portp->ahciport_err_retri_pkt; 9893 else if (RDWR_PMULT_CMD_IN_PROGRESS(ahci_portp)) 9894 spkt = ahci_portp->ahciport_rdwr_pmult_pkt; 9895 else 9896 spkt = ahci_portp->ahciport_slot_pkts[tmp_slot]; 9897 9898 if ((spkt != NULL) && spkt->satapkt_time && 9899 !(spkt->satapkt_op_mode & SATA_OPMODE_POLLING)) { 9900 /* 9901 * If a packet has survived for more than it's 9902 * max life cycles, it is a candidate for time 9903 * out. 9904 */ 9905 ahci_portp->ahciport_slot_timeout[tmp_slot] -= 9906 ahci_watchdog_timeout; 9907 9908 if (ahci_portp->ahciport_slot_timeout[tmp_slot] 9909 > 0) 9910 goto next; 9911 9912 #if AHCI_DEBUG 9913 if (NCQ_CMD_IN_PROGRESS(ahci_portp)) { 9914 AHCIDBG(AHCIDBG_ERRS|AHCIDBG_TIMEOUT, 9915 ahci_ctlp, "watchdog: the current " 9916 "tags is 0x%x", current_tags); 9917 } else { 9918 AHCIDBG(AHCIDBG_ERRS|AHCIDBG_TIMEOUT, 9919 ahci_ctlp, "watchdog: the current " 9920 "slot is %d", current_slot); 9921 } 9922 #endif 9923 9924 /* 9925 * We need to check whether the HBA has 9926 * begun to execute the command, if not, 9927 * then re-set the timer of the command. 9928 */ 9929 if (NON_NCQ_CMD_IN_PROGRESS(ahci_portp) && 9930 (tmp_slot != current_slot) || 9931 NCQ_CMD_IN_PROGRESS(ahci_portp) && 9932 ((0x1 << tmp_slot) & current_tags)) { 9933 ahci_portp->ahciport_slot_timeout \ 9934 [tmp_slot] = spkt->satapkt_time; 9935 } else { 9936 timeout_tags |= (0x1 << tmp_slot); 9937 cmn_err(CE_WARN, "!ahci%d: watchdog " 9938 "port %d satapkt 0x%p timed out\n", 9939 instance, port, (void *)spkt); 9940 } 9941 } 9942 next: 9943 CLEAR_BIT(pending_tags, tmp_slot); 9944 } 9945 9946 if (timeout_tags) { 9947 mutex_exit(&ahci_portp->ahciport_mutex); 9948 mutex_exit(&ahci_ctlp->ahcictl_mutex); 9949 ahci_timeout_pkts(ahci_ctlp, ahci_portp, 9950 port, timeout_tags); 9951 mutex_enter(&ahci_ctlp->ahcictl_mutex); 9952 mutex_enter(&ahci_portp->ahciport_mutex); 9953 } 9954 9955 mutex_exit(&ahci_portp->ahciport_mutex); 9956 } 9957 9958 /* Re-install the watchdog timeout handler */ 9959 if (ahci_ctlp->ahcictl_timeout_id != 0) { 9960 ahci_ctlp->ahcictl_timeout_id = 9961 timeout((void (*)(void *))ahci_watchdog_handler, 9962 (caddr_t)ahci_ctlp, ahci_watchdog_tick); 9963 } 9964 9965 mutex_exit(&ahci_ctlp->ahcictl_mutex); 9966 } 9967 9968 /* 9969 * Fill the error context into sata_cmd for non-queued command error. 9970 */ 9971 static void 9972 ahci_copy_err_cnxt(sata_cmd_t *scmd, ahci_fis_d2h_register_t *rfisp) 9973 { 9974 scmd->satacmd_status_reg = GET_RFIS_STATUS(rfisp); 9975 scmd->satacmd_error_reg = GET_RFIS_ERROR(rfisp); 9976 scmd->satacmd_sec_count_lsb = GET_RFIS_SECTOR_COUNT(rfisp); 9977 scmd->satacmd_lba_low_lsb = GET_RFIS_CYL_LOW(rfisp); 9978 scmd->satacmd_lba_mid_lsb = GET_RFIS_CYL_MID(rfisp); 9979 scmd->satacmd_lba_high_lsb = GET_RFIS_CYL_HI(rfisp); 9980 scmd->satacmd_device_reg = GET_RFIS_DEV_HEAD(rfisp); 9981 9982 if (scmd->satacmd_addr_type == ATA_ADDR_LBA48) { 9983 scmd->satacmd_sec_count_msb = GET_RFIS_SECTOR_COUNT_EXP(rfisp); 9984 scmd->satacmd_lba_low_msb = GET_RFIS_CYL_LOW_EXP(rfisp); 9985 scmd->satacmd_lba_mid_msb = GET_RFIS_CYL_MID_EXP(rfisp); 9986 scmd->satacmd_lba_high_msb = GET_RFIS_CYL_HI_EXP(rfisp); 9987 } 9988 } 9989 9990 /* 9991 * Fill the ncq error page into sata_cmd for queued command error. 9992 */ 9993 static void 9994 ahci_copy_ncq_err_page(sata_cmd_t *scmd, 9995 struct sata_ncq_error_recovery_page *ncq_err_page) 9996 { 9997 scmd->satacmd_sec_count_msb = ncq_err_page->ncq_sector_count_ext; 9998 scmd->satacmd_sec_count_lsb = ncq_err_page->ncq_sector_count; 9999 scmd->satacmd_lba_low_msb = ncq_err_page->ncq_sector_number_ext; 10000 scmd->satacmd_lba_low_lsb = ncq_err_page->ncq_sector_number; 10001 scmd->satacmd_lba_mid_msb = ncq_err_page->ncq_cyl_low_ext; 10002 scmd->satacmd_lba_mid_lsb = ncq_err_page->ncq_cyl_low; 10003 scmd->satacmd_lba_high_msb = ncq_err_page->ncq_cyl_high_ext; 10004 scmd->satacmd_lba_high_lsb = ncq_err_page->ncq_cyl_high; 10005 scmd->satacmd_device_reg = ncq_err_page->ncq_dev_head; 10006 scmd->satacmd_status_reg = ncq_err_page->ncq_status; 10007 scmd->satacmd_error_reg = ncq_err_page->ncq_error; 10008 } 10009 10010 /* 10011 * Put the respective register value to sata_cmd_t for satacmd_flags. 10012 */ 10013 static void 10014 ahci_copy_out_regs(sata_cmd_t *scmd, ahci_fis_d2h_register_t *rfisp) 10015 { 10016 if (scmd->satacmd_flags.sata_copy_out_sec_count_msb) 10017 scmd->satacmd_sec_count_msb = GET_RFIS_SECTOR_COUNT_EXP(rfisp); 10018 if (scmd->satacmd_flags.sata_copy_out_lba_low_msb) 10019 scmd->satacmd_lba_low_msb = GET_RFIS_CYL_LOW_EXP(rfisp); 10020 if (scmd->satacmd_flags.sata_copy_out_lba_mid_msb) 10021 scmd->satacmd_lba_mid_msb = GET_RFIS_CYL_MID_EXP(rfisp); 10022 if (scmd->satacmd_flags.sata_copy_out_lba_high_msb) 10023 scmd->satacmd_lba_high_msb = GET_RFIS_CYL_HI_EXP(rfisp); 10024 if (scmd->satacmd_flags.sata_copy_out_sec_count_lsb) 10025 scmd->satacmd_sec_count_lsb = GET_RFIS_SECTOR_COUNT(rfisp); 10026 if (scmd->satacmd_flags.sata_copy_out_lba_low_lsb) 10027 scmd->satacmd_lba_low_lsb = GET_RFIS_CYL_LOW(rfisp); 10028 if (scmd->satacmd_flags.sata_copy_out_lba_mid_lsb) 10029 scmd->satacmd_lba_mid_lsb = GET_RFIS_CYL_MID(rfisp); 10030 if (scmd->satacmd_flags.sata_copy_out_lba_high_lsb) 10031 scmd->satacmd_lba_high_lsb = GET_RFIS_CYL_HI(rfisp); 10032 if (scmd->satacmd_flags.sata_copy_out_device_reg) 10033 scmd->satacmd_device_reg = GET_RFIS_DEV_HEAD(rfisp); 10034 if (scmd->satacmd_flags.sata_copy_out_error_reg) 10035 scmd->satacmd_error_reg = GET_RFIS_ERROR(rfisp); 10036 } 10037 10038 static void 10039 ahci_log_fatal_error_message(ahci_ctl_t *ahci_ctlp, uint8_t port, 10040 uint32_t intr_status) 10041 { 10042 int instance = ddi_get_instance(ahci_ctlp->ahcictl_dip); 10043 10044 if (intr_status & AHCI_INTR_STATUS_IFS) 10045 cmn_err(CE_WARN, "!ahci%d: ahci port %d has interface fatal " 10046 "error", instance, port); 10047 10048 if (intr_status & AHCI_INTR_STATUS_HBDS) 10049 cmn_err(CE_WARN, "!ahci%d: ahci port %d has bus data error", 10050 instance, port); 10051 10052 if (intr_status & AHCI_INTR_STATUS_HBFS) 10053 cmn_err(CE_WARN, "!ahci%d: ahci port %d has bus fatal error", 10054 instance, port); 10055 10056 if (intr_status & AHCI_INTR_STATUS_TFES) 10057 cmn_err(CE_WARN, "!ahci%d: ahci port %d has task file error", 10058 instance, port); 10059 10060 cmn_err(CE_WARN, "!ahci%d: ahci port %d is trying to do error " 10061 "recovery", instance, port); 10062 } 10063 10064 static void 10065 ahci_dump_commands(ahci_ctl_t *ahci_ctlp, uint8_t port, 10066 uint32_t slot_tags) 10067 { 10068 ahci_port_t *ahci_portp; 10069 int tmp_slot; 10070 sata_pkt_t *spkt; 10071 sata_cmd_t cmd; 10072 10073 ahci_portp = ahci_ctlp->ahcictl_ports[port]; 10074 ASSERT(ahci_portp != NULL); 10075 10076 while (slot_tags) { 10077 tmp_slot = ddi_ffs(slot_tags) - 1; 10078 if (tmp_slot == -1) { 10079 break; 10080 } 10081 10082 spkt = ahci_portp->ahciport_slot_pkts[tmp_slot]; 10083 if (spkt != NULL) { 10084 cmd = spkt->satapkt_cmd; 10085 10086 cmn_err(CE_WARN, "!satapkt 0x%p: cmd_reg = 0x%x " 10087 "features_reg = 0x%x sec_count_msb = 0x%x " 10088 "lba_low_msb = 0x%x lba_mid_msb = 0x%x " 10089 "lba_high_msb = 0x%x sec_count_lsb = 0x%x " 10090 "lba_low_lsb = 0x%x lba_mid_lsb = 0x%x " 10091 "lba_high_lsb = 0x%x device_reg = 0x%x " 10092 "addr_type = 0x%x cmd_flags = 0x%x", (void *)spkt, 10093 cmd.satacmd_cmd_reg, cmd.satacmd_features_reg, 10094 cmd.satacmd_sec_count_msb, cmd.satacmd_lba_low_msb, 10095 cmd.satacmd_lba_mid_msb, cmd.satacmd_lba_high_msb, 10096 cmd.satacmd_sec_count_lsb, cmd.satacmd_lba_low_lsb, 10097 cmd.satacmd_lba_mid_lsb, cmd.satacmd_lba_high_lsb, 10098 cmd.satacmd_device_reg, cmd.satacmd_addr_type, 10099 *((uint32_t *)&(cmd.satacmd_flags))); 10100 } 10101 10102 CLEAR_BIT(slot_tags, tmp_slot); 10103 } 10104 } 10105 10106 /* 10107 * Dump the serror message to the log. 10108 */ 10109 static void 10110 ahci_log_serror_message(ahci_ctl_t *ahci_ctlp, uint8_t port, 10111 uint32_t port_serror, int debug_only) 10112 { 10113 static char err_buf[512]; 10114 static char err_msg_header[16]; 10115 char *err_msg = err_buf; 10116 10117 *err_buf = '\0'; 10118 *err_msg_header = '\0'; 10119 10120 if (port_serror & SERROR_DATA_ERR_FIXED) { 10121 err_msg = strcat(err_msg, 10122 "\tRecovered Data Integrity Error (I)\n"); 10123 } 10124 10125 if (port_serror & SERROR_COMM_ERR_FIXED) { 10126 err_msg = strcat(err_msg, 10127 "\tRecovered Communication Error (M)\n"); 10128 } 10129 10130 if (port_serror & SERROR_DATA_ERR) { 10131 err_msg = strcat(err_msg, 10132 "\tTransient Data Integrity Error (T)\n"); 10133 } 10134 10135 if (port_serror & SERROR_PERSISTENT_ERR) { 10136 err_msg = strcat(err_msg, 10137 "\tPersistent Communication or Data Integrity Error (C)\n"); 10138 } 10139 10140 if (port_serror & SERROR_PROTOCOL_ERR) { 10141 err_msg = strcat(err_msg, "\tProtocol Error (P)\n"); 10142 } 10143 10144 if (port_serror & SERROR_INT_ERR) { 10145 err_msg = strcat(err_msg, "\tInternal Error (E)\n"); 10146 } 10147 10148 if (port_serror & SERROR_PHY_RDY_CHG) { 10149 err_msg = strcat(err_msg, "\tPhyRdy Change (N)\n"); 10150 } 10151 10152 if (port_serror & SERROR_PHY_INT_ERR) { 10153 err_msg = strcat(err_msg, "\tPhy Internal Error (I)\n"); 10154 } 10155 10156 if (port_serror & SERROR_COMM_WAKE) { 10157 err_msg = strcat(err_msg, "\tComm Wake (W)\n"); 10158 } 10159 10160 if (port_serror & SERROR_10B_TO_8B_ERR) { 10161 err_msg = strcat(err_msg, "\t10B to 8B Decode Error (B)\n"); 10162 } 10163 10164 if (port_serror & SERROR_DISPARITY_ERR) { 10165 err_msg = strcat(err_msg, "\tDisparity Error (D)\n"); 10166 } 10167 10168 if (port_serror & SERROR_CRC_ERR) { 10169 err_msg = strcat(err_msg, "\tCRC Error (C)\n"); 10170 } 10171 10172 if (port_serror & SERROR_HANDSHAKE_ERR) { 10173 err_msg = strcat(err_msg, "\tHandshake Error (H)\n"); 10174 } 10175 10176 if (port_serror & SERROR_LINK_SEQ_ERR) { 10177 err_msg = strcat(err_msg, "\tLink Sequence Error (S)\n"); 10178 } 10179 10180 if (port_serror & SERROR_TRANS_ERR) { 10181 err_msg = strcat(err_msg, 10182 "\tTransport state transition error (T)\n"); 10183 } 10184 10185 if (port_serror & SERROR_FIS_TYPE) { 10186 err_msg = strcat(err_msg, "\tUnknown FIS Type (F)\n"); 10187 } 10188 10189 if (port_serror & SERROR_EXCHANGED_ERR) { 10190 err_msg = strcat(err_msg, "\tExchanged (X)\n"); 10191 } 10192 10193 if (*err_msg == '\0') 10194 return; 10195 10196 if (debug_only) { 10197 (void) sprintf(err_msg_header, "port %d", port); 10198 AHCIDBG(AHCIDBG_ERRS, ahci_ctlp, err_msg_header, NULL); 10199 AHCIDBG(AHCIDBG_ERRS, ahci_ctlp, err_msg, NULL); 10200 } else if (ahci_ctlp) { 10201 cmn_err(CE_WARN, "!ahci%d: %s %s", 10202 ddi_get_instance(ahci_ctlp->ahcictl_dip), 10203 err_msg_header, err_msg); 10204 10205 /* sata trace debug */ 10206 sata_trace_debug(ahci_ctlp->ahcictl_dip, 10207 "ahci%d: %s %s", ddi_get_instance(ahci_ctlp->ahcictl_dip), 10208 err_msg_header, err_msg); 10209 } else { 10210 cmn_err(CE_WARN, "!ahci: %s %s", err_msg_header, err_msg); 10211 10212 /* sata trace debug */ 10213 sata_trace_debug(NULL, "ahci: %s %s", err_msg_header, err_msg); 10214 } 10215 } 10216 10217 /* 10218 * Translate the sata_address_t type into the ahci_addr_t type. 10219 * sata_device.satadev_addr structure is used as source. 10220 */ 10221 static void 10222 ahci_get_ahci_addr(ahci_ctl_t *ahci_ctlp, sata_device_t *sd, 10223 ahci_addr_t *ahci_addrp) 10224 { 10225 sata_address_t *sata_addrp = &sd->satadev_addr; 10226 ahci_addrp->aa_port = 10227 ahci_ctlp->ahcictl_cport_to_port[sata_addrp->cport]; 10228 ahci_addrp->aa_pmport = sata_addrp->pmport; 10229 10230 switch (sata_addrp->qual) { 10231 case SATA_ADDR_DCPORT: 10232 case SATA_ADDR_CPORT: 10233 ahci_addrp->aa_qual = AHCI_ADDR_PORT; 10234 break; 10235 case SATA_ADDR_PMULT: 10236 case SATA_ADDR_PMULT_SPEC: 10237 ahci_addrp->aa_qual = AHCI_ADDR_PMULT; 10238 break; 10239 case SATA_ADDR_DPMPORT: 10240 case SATA_ADDR_PMPORT: 10241 ahci_addrp->aa_qual = AHCI_ADDR_PMPORT; 10242 break; 10243 case SATA_ADDR_NULL: 10244 default: 10245 /* something went wrong */ 10246 ahci_addrp->aa_qual = AHCI_ADDR_NULL; 10247 break; 10248 } 10249 } 10250 10251 /* 10252 * This routine is to calculate the total number of ports implemented 10253 * by the HBA. 10254 */ 10255 static int 10256 ahci_get_num_implemented_ports(uint32_t ports_implemented) 10257 { 10258 uint8_t i; 10259 int num = 0; 10260 10261 for (i = 0; i < AHCI_MAX_PORTS; i++) { 10262 if (((uint32_t)0x1 << i) & ports_implemented) 10263 num++; 10264 } 10265 10266 return (num); 10267 } 10268 10269 #if AHCI_DEBUG 10270 static void 10271 ahci_log(ahci_ctl_t *ahci_ctlp, uint_t level, char *fmt, ...) 10272 { 10273 static char name[16]; 10274 va_list ap; 10275 10276 mutex_enter(&ahci_log_mutex); 10277 10278 va_start(ap, fmt); 10279 if (ahci_ctlp) { 10280 (void) sprintf(name, "ahci%d: ", 10281 ddi_get_instance(ahci_ctlp->ahcictl_dip)); 10282 } else { 10283 (void) sprintf(name, "ahci: "); 10284 } 10285 10286 (void) vsprintf(ahci_log_buf, fmt, ap); 10287 va_end(ap); 10288 10289 cmn_err(level, "%s%s", name, ahci_log_buf); 10290 10291 mutex_exit(&ahci_log_mutex); 10292 } 10293 #endif 10294 10295 /* 10296 * quiesce(9E) entry point. 10297 * 10298 * This function is called when the system is single-threaded at high 10299 * PIL with preemption disabled. Therefore, this function must not be 10300 * blocked. Because no taskqs are running, there is no need for us to 10301 * take any action for enclosure services which are running in the 10302 * taskq context, especially as no interrupts are generated by it nor 10303 * are any messages expected to come in. 10304 * 10305 * This function returns DDI_SUCCESS on success, or DDI_FAILURE on failure. 10306 * DDI_FAILURE indicates an error condition and should almost never happen. 10307 */ 10308 static int 10309 ahci_quiesce(dev_info_t *dip) 10310 { 10311 ahci_ctl_t *ahci_ctlp; 10312 ahci_port_t *ahci_portp; 10313 int instance, port; 10314 10315 instance = ddi_get_instance(dip); 10316 ahci_ctlp = ddi_get_soft_state(ahci_statep, instance); 10317 10318 if (ahci_ctlp == NULL) 10319 return (DDI_FAILURE); 10320 10321 #if AHCI_DEBUG 10322 ahci_debug_flags = 0; 10323 #endif 10324 10325 ahci_ctlp->ahcictl_flags |= AHCI_QUIESCE; 10326 10327 /* disable all the interrupts. */ 10328 ahci_disable_all_intrs(ahci_ctlp); 10329 10330 for (port = 0; port < ahci_ctlp->ahcictl_num_ports; port++) { 10331 if (!AHCI_PORT_IMPLEMENTED(ahci_ctlp, port)) { 10332 continue; 10333 } 10334 10335 ahci_portp = ahci_ctlp->ahcictl_ports[port]; 10336 10337 /* 10338 * Stop the port by clearing PxCMD.ST 10339 * 10340 * Here we must disable the port interrupt because 10341 * ahci_disable_all_intrs only clear GHC.IE, and IS 10342 * register will be still set if PxIE is enabled. 10343 * When ahci shares one IRQ with other drivers, the 10344 * intr handler may claim the intr mistakenly. 10345 */ 10346 ahci_disable_port_intrs(ahci_ctlp, port); 10347 (void) ahci_put_port_into_notrunning_state(ahci_ctlp, 10348 ahci_portp, port); 10349 } 10350 10351 ahci_ctlp->ahcictl_flags &= ~AHCI_QUIESCE; 10352 10353 return (DDI_SUCCESS); 10354 } 10355 10356 /* 10357 * The function will add a sata packet to the done queue. 10358 */ 10359 static void 10360 ahci_add_doneq(ahci_port_t *ahci_portp, sata_pkt_t *satapkt, int reason) 10361 { 10362 ASSERT(satapkt != NULL); 10363 ASSERT(MUTEX_HELD(&ahci_portp->ahciport_mutex)); 10364 10365 /* set the reason for all packets */ 10366 satapkt->satapkt_reason = reason; 10367 satapkt->satapkt_hba_driver_private = NULL; 10368 10369 if (! (satapkt->satapkt_op_mode & SATA_OPMODE_SYNCH) && 10370 satapkt->satapkt_comp) { 10371 /* 10372 * only add to queue when mode is not synch and there is 10373 * completion callback 10374 */ 10375 *ahci_portp->ahciport_doneqtail = satapkt; 10376 ahci_portp->ahciport_doneqtail = 10377 (sata_pkt_t **)&(satapkt->satapkt_hba_driver_private); 10378 ahci_portp->ahciport_doneq_len++; 10379 10380 } else if ((satapkt->satapkt_op_mode & SATA_OPMODE_SYNCH) && 10381 ! (satapkt->satapkt_op_mode & SATA_OPMODE_POLLING)) 10382 /* 10383 * for sync/non-poll mode, just call cv_broadcast 10384 */ 10385 cv_broadcast(&ahci_portp->ahciport_cv); 10386 } 10387 10388 /* 10389 * The function will call completion callback of sata packet on the 10390 * completed queue 10391 */ 10392 static void 10393 ahci_flush_doneq(ahci_port_t *ahci_portp) 10394 { 10395 sata_pkt_t *satapkt, *next; 10396 10397 ASSERT(MUTEX_HELD(&ahci_portp->ahciport_mutex)); 10398 10399 if (ahci_portp->ahciport_doneq) { 10400 satapkt = ahci_portp->ahciport_doneq; 10401 10402 ahci_portp->ahciport_doneq = NULL; 10403 ahci_portp->ahciport_doneqtail = &ahci_portp->ahciport_doneq; 10404 ahci_portp->ahciport_doneq_len = 0; 10405 10406 mutex_exit(&ahci_portp->ahciport_mutex); 10407 10408 while (satapkt != NULL) { 10409 next = satapkt->satapkt_hba_driver_private; 10410 satapkt->satapkt_hba_driver_private = NULL; 10411 10412 /* Call the callback */ 10413 (*satapkt->satapkt_comp)(satapkt); 10414 10415 satapkt = next; 10416 } 10417 10418 mutex_enter(&ahci_portp->ahciport_mutex); 10419 } 10420 } 10421 10422 /* 10423 * Sets the state for the specified port on the controller to desired state. 10424 * This must be run in the context of the enclosure taskq which ensures that 10425 * only one event is outstanding at any time. 10426 */ 10427 static boolean_t 10428 ahci_em_set_led(ahci_ctl_t *ahci_ctlp, uint8_t port, ahci_em_led_state_t desire) 10429 { 10430 ahci_em_led_msg_t msg; 10431 ahci_em_msg_hdr_t hdr; 10432 uint32_t msgval, hdrval; 10433 uint_t i, max_delay = ahci_em_tx_delay_count; 10434 10435 msg.alm_hba = port; 10436 msg.alm_pminfo = 0; 10437 msg.alm_value = 0; 10438 10439 if (desire & AHCI_EM_LED_IDENT_ENABLE) { 10440 msg.alm_value |= AHCI_LED_ON << AHCI_LED_IDENT_OFF; 10441 } 10442 10443 if (desire & AHCI_EM_LED_FAULT_ENABLE) { 10444 msg.alm_value |= AHCI_LED_ON << AHCI_LED_FAULT_OFF; 10445 } 10446 10447 if ((ahci_ctlp->ahcictl_em_ctl & AHCI_HBA_EM_CTL_ATTR_ALHD) == 0 && 10448 (desire & AHCI_EM_LED_ACTIVITY_DISABLE) == 0) { 10449 msg.alm_value |= AHCI_LED_ON << AHCI_LED_ACTIVITY_OFF; 10450 } 10451 10452 hdr.aemh_rsvd = 0; 10453 hdr.aemh_mlen = sizeof (ahci_em_led_msg_t); 10454 hdr.aemh_dlen = 0; 10455 hdr.aemh_mtype = AHCI_EM_MSG_TYPE_LED; 10456 10457 bcopy(&msg, &msgval, sizeof (msgval)); 10458 bcopy(&hdr, &hdrval, sizeof (hdrval)); 10459 10460 /* 10461 * First, make sure we can transmit. We should not have been placed in a 10462 * situation where an outstanding transmission is going on. 10463 */ 10464 for (i = 0; i < max_delay; i++) { 10465 uint32_t val; 10466 10467 val = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 10468 (uint32_t *)AHCI_GLOBAL_EM_CTL(ahci_ctlp)); 10469 if ((val & AHCI_HBA_EM_CTL_CTL_TM) == 0) 10470 break; 10471 10472 delay(drv_usectohz(ahci_em_tx_delay_ms * 1000)); 10473 } 10474 10475 if (i == max_delay) 10476 return (B_FALSE); 10477 10478 ddi_put32(ahci_ctlp->ahcictl_ahci_acc_handle, 10479 (uint32_t *)ahci_ctlp->ahcictl_em_tx_off, hdrval); 10480 ddi_put32(ahci_ctlp->ahcictl_ahci_acc_handle, 10481 (uint32_t *)(ahci_ctlp->ahcictl_em_tx_off + 4), msgval); 10482 ddi_put32(ahci_ctlp->ahcictl_ahci_acc_handle, 10483 (uint32_t *)AHCI_GLOBAL_EM_CTL(ahci_ctlp), AHCI_HBA_EM_CTL_CTL_TM); 10484 10485 for (i = 0; i < max_delay; i++) { 10486 uint32_t val; 10487 10488 val = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 10489 (uint32_t *)AHCI_GLOBAL_EM_CTL(ahci_ctlp)); 10490 if ((val & AHCI_HBA_EM_CTL_CTL_TM) == 0) 10491 break; 10492 10493 delay(drv_usectohz(ahci_em_tx_delay_ms * 1000)); 10494 } 10495 10496 if (i == max_delay) 10497 return (B_FALSE); 10498 10499 return (B_TRUE); 10500 } 10501 10502 typedef struct ahci_em_led_task_arg { 10503 ahci_ctl_t *aelta_ctl; 10504 uint8_t aelta_port; 10505 uint_t aelta_op; 10506 ahci_em_led_state_t aelta_state; 10507 uint_t aelta_ret; 10508 kcondvar_t aelta_cv; 10509 uint_t aelta_ref; 10510 } ahci_em_led_task_arg_t; 10511 10512 static void 10513 ahci_em_led_task_free(ahci_em_led_task_arg_t *task) 10514 { 10515 ASSERT3U(task->aelta_ref, ==, 0); 10516 cv_destroy(&task->aelta_cv); 10517 kmem_free(task, sizeof (*task)); 10518 } 10519 10520 static void 10521 ahci_em_led_task(void *arg) 10522 { 10523 boolean_t ret, cleanup = B_FALSE; 10524 ahci_em_led_task_arg_t *led = arg; 10525 ahci_em_led_state_t state; 10526 10527 mutex_enter(&led->aelta_ctl->ahcictl_mutex); 10528 if (led->aelta_ctl->ahcictl_em_flags != AHCI_EM_USABLE) { 10529 led->aelta_ret = EIO; 10530 mutex_exit(&led->aelta_ctl->ahcictl_mutex); 10531 return; 10532 } 10533 10534 state = led->aelta_ctl->ahcictl_em_state[led->aelta_port]; 10535 mutex_exit(&led->aelta_ctl->ahcictl_mutex); 10536 10537 switch (led->aelta_op) { 10538 case AHCI_EM_IOC_SET_OP_ADD: 10539 state |= led->aelta_state; 10540 break; 10541 case AHCI_EM_IOC_SET_OP_REM: 10542 state &= ~led->aelta_state; 10543 break; 10544 case AHCI_EM_IOC_SET_OP_SET: 10545 state = led->aelta_state; 10546 break; 10547 default: 10548 led->aelta_ret = ENOTSUP; 10549 return; 10550 } 10551 10552 ret = ahci_em_set_led(led->aelta_ctl, led->aelta_port, state); 10553 10554 mutex_enter(&led->aelta_ctl->ahcictl_mutex); 10555 if (ret) { 10556 led->aelta_ctl->ahcictl_em_state[led->aelta_port] = 10557 led->aelta_state; 10558 led->aelta_ret = 0; 10559 } else { 10560 led->aelta_ret = EIO; 10561 led->aelta_ctl->ahcictl_em_flags |= AHCI_EM_TIMEOUT; 10562 } 10563 led->aelta_ref--; 10564 if (led->aelta_ref > 0) { 10565 cv_signal(&led->aelta_cv); 10566 } else { 10567 cleanup = B_TRUE; 10568 } 10569 mutex_exit(&led->aelta_ctl->ahcictl_mutex); 10570 10571 if (cleanup) { 10572 ahci_em_led_task_free(led); 10573 } 10574 } 10575 10576 static void 10577 ahci_em_reset(void *arg) 10578 { 10579 uint_t i, max_delay = ahci_em_reset_delay_count; 10580 ahci_ctl_t *ahci_ctlp = arg; 10581 10582 /* 10583 * We've been asked to reset the device. The caller should have set the 10584 * resetting flag. Make sure that we don't have a request to quiesce. 10585 */ 10586 mutex_enter(&ahci_ctlp->ahcictl_mutex); 10587 ASSERT(ahci_ctlp->ahcictl_em_flags & AHCI_EM_RESETTING); 10588 if (ahci_ctlp->ahcictl_em_flags & AHCI_EM_QUIESCE) { 10589 ahci_ctlp->ahcictl_em_flags &= ~AHCI_EM_RESETTING; 10590 mutex_exit(&ahci_ctlp->ahcictl_mutex); 10591 return; 10592 } 10593 mutex_exit(&ahci_ctlp->ahcictl_mutex); 10594 10595 ddi_put32(ahci_ctlp->ahcictl_ahci_acc_handle, 10596 (uint32_t *)AHCI_GLOBAL_EM_CTL(ahci_ctlp), AHCI_HBA_EM_CTL_CTL_RST); 10597 for (i = 0; i < max_delay; i++) { 10598 uint32_t val; 10599 10600 val = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle, 10601 (uint32_t *)AHCI_GLOBAL_EM_CTL(ahci_ctlp)); 10602 if ((val & AHCI_HBA_EM_CTL_CTL_RST) == 0) 10603 break; 10604 10605 delay(drv_usectohz(ahci_em_reset_delay_ms * 1000)); 10606 } 10607 10608 if (i == max_delay) { 10609 mutex_enter(&ahci_ctlp->ahcictl_mutex); 10610 ahci_ctlp->ahcictl_em_flags &= ~AHCI_EM_RESETTING; 10611 ahci_ctlp->ahcictl_em_flags |= AHCI_EM_TIMEOUT; 10612 mutex_exit(&ahci_ctlp->ahcictl_mutex); 10613 cmn_err(CE_WARN, "!ahci%d: enclosure timed out resetting", 10614 ddi_get_instance(ahci_ctlp->ahcictl_dip)); 10615 return; 10616 } 10617 10618 for (i = 0; i < ahci_ctlp->ahcictl_num_ports; i++) { 10619 10620 if (!AHCI_PORT_IMPLEMENTED(ahci_ctlp, i)) 10621 continue; 10622 10623 /* 10624 * Try to flush all the LEDs as part of reset. If it fails, 10625 * drive on. 10626 */ 10627 if (!ahci_em_set_led(ahci_ctlp, i, 10628 ahci_ctlp->ahcictl_em_state[i])) { 10629 mutex_enter(&ahci_ctlp->ahcictl_mutex); 10630 ahci_ctlp->ahcictl_em_flags &= ~AHCI_EM_RESETTING; 10631 ahci_ctlp->ahcictl_em_flags |= AHCI_EM_TIMEOUT; 10632 mutex_exit(&ahci_ctlp->ahcictl_mutex); 10633 cmn_err(CE_WARN, "!ahci%d: enclosure timed out " 10634 "setting port %u", 10635 ddi_get_instance(ahci_ctlp->ahcictl_dip), i); 10636 return; 10637 } 10638 } 10639 10640 mutex_enter(&ahci_ctlp->ahcictl_mutex); 10641 ahci_ctlp->ahcictl_em_flags &= ~AHCI_EM_RESETTING; 10642 ahci_ctlp->ahcictl_em_flags |= AHCI_EM_READY; 10643 mutex_exit(&ahci_ctlp->ahcictl_mutex); 10644 } 10645 10646 static boolean_t 10647 ahci_em_init(ahci_ctl_t *ahci_ctlp) 10648 { 10649 char name[128]; 10650 10651 /* 10652 * First make sure we actually have enclosure services and if so, that 10653 * we have the hardware support that we care about for this. 10654 */ 10655 if (ahci_ctlp->ahcictl_em_loc == 0 || 10656 (ahci_ctlp->ahcictl_em_ctl & AHCI_HBA_EM_CTL_SUPP_LED) == 0) 10657 return (B_TRUE); 10658 10659 /* 10660 * Next, make sure that the buffer is large enough for us. We need two 10661 * dwords or 8 bytes. The location register is stored in dwords. 10662 */ 10663 if ((ahci_ctlp->ahcictl_em_loc & AHCI_HBA_EM_LOC_SZ_MASK) < 10664 AHCI_EM_BUFFER_MIN) { 10665 return (B_TRUE); 10666 } 10667 10668 ahci_ctlp->ahcictl_em_flags |= AHCI_EM_PRESENT; 10669 10670 ahci_ctlp->ahcictl_em_tx_off = ((ahci_ctlp->ahcictl_em_loc & 10671 AHCI_HBA_EM_LOC_OFST_MASK) >> AHCI_HBA_EM_LOC_OFST_SHIFT) * 4; 10672 ahci_ctlp->ahcictl_em_tx_off += ahci_ctlp->ahcictl_ahci_addr; 10673 10674 bzero(ahci_ctlp->ahcictl_em_state, 10675 sizeof (ahci_ctlp->ahcictl_em_state)); 10676 10677 (void) snprintf(name, sizeof (name), "ahcti_em_taskq%d", 10678 ddi_get_instance(ahci_ctlp->ahcictl_dip)); 10679 if ((ahci_ctlp->ahcictl_em_taskq = 10680 ddi_taskq_create(ahci_ctlp->ahcictl_dip, name, 1, 10681 TASKQ_DEFAULTPRI, 0)) == NULL) { 10682 cmn_err(CE_WARN, "!ahci%d: ddi_tasq_create failed for em " 10683 "services", ddi_get_instance(ahci_ctlp->ahcictl_dip)); 10684 return (B_FALSE); 10685 } 10686 10687 mutex_enter(&ahci_ctlp->ahcictl_mutex); 10688 ahci_ctlp->ahcictl_em_flags |= AHCI_EM_RESETTING; 10689 mutex_exit(&ahci_ctlp->ahcictl_mutex); 10690 (void) ddi_taskq_dispatch(ahci_ctlp->ahcictl_em_taskq, ahci_em_reset, 10691 ahci_ctlp, DDI_SLEEP); 10692 10693 return (B_TRUE); 10694 } 10695 10696 static int 10697 ahci_em_ioctl_get(ahci_ctl_t *ahci_ctlp, intptr_t arg) 10698 { 10699 int i; 10700 ahci_ioc_em_get_t get; 10701 10702 bzero(&get, sizeof (get)); 10703 get.aiemg_nports = ahci_ctlp->ahcictl_ports_implemented; 10704 if ((ahci_ctlp->ahcictl_em_ctl & AHCI_HBA_EM_CTL_ATTR_ALHD) == 0) { 10705 get.aiemg_flags |= AHCI_EM_FLAG_CONTROL_ACTIVITY; 10706 } 10707 10708 mutex_enter(&ahci_ctlp->ahcictl_mutex); 10709 for (i = 0; i < ahci_ctlp->ahcictl_num_ports; i++) { 10710 if (!AHCI_PORT_IMPLEMENTED(ahci_ctlp, i)) { 10711 continue; 10712 } 10713 get.aiemg_status[i] = ahci_ctlp->ahcictl_em_state[i]; 10714 } 10715 mutex_exit(&ahci_ctlp->ahcictl_mutex); 10716 10717 if (ddi_copyout(&get, (void *)arg, sizeof (get), 0) != 0) 10718 return (EFAULT); 10719 10720 return (0); 10721 } 10722 10723 static int 10724 ahci_em_ioctl_set(ahci_ctl_t *ahci_ctlp, intptr_t arg) 10725 { 10726 int ret; 10727 ahci_ioc_em_set_t set; 10728 ahci_em_led_task_arg_t *task; 10729 boolean_t signal, cleanup; 10730 10731 if (ddi_copyin((void *)arg, &set, sizeof (set), 0) != 0) 10732 return (EFAULT); 10733 10734 if (set.aiems_port > ahci_ctlp->ahcictl_num_ports) 10735 return (EINVAL); 10736 10737 if (!AHCI_PORT_IMPLEMENTED(ahci_ctlp, set.aiems_port)) { 10738 return (EINVAL); 10739 } 10740 10741 if ((set.aiems_leds & ~(AHCI_EM_LED_IDENT_ENABLE | 10742 AHCI_EM_LED_FAULT_ENABLE | 10743 AHCI_EM_LED_ACTIVITY_DISABLE)) != 0) { 10744 return (EINVAL); 10745 } 10746 10747 switch (set.aiems_op) { 10748 case AHCI_EM_IOC_SET_OP_ADD: 10749 case AHCI_EM_IOC_SET_OP_REM: 10750 case AHCI_EM_IOC_SET_OP_SET: 10751 break; 10752 default: 10753 return (EINVAL); 10754 } 10755 10756 if ((set.aiems_leds & AHCI_EM_LED_ACTIVITY_DISABLE) != 0 && 10757 ((ahci_ctlp->ahcictl_em_ctl & AHCI_HBA_EM_CTL_ATTR_ALHD) != 0)) { 10758 return (ENOTSUP); 10759 } 10760 10761 task = kmem_alloc(sizeof (*task), KM_NOSLEEP | KM_NORMALPRI); 10762 if (task == NULL) { 10763 return (ENOMEM); 10764 } 10765 10766 task->aelta_ctl = ahci_ctlp; 10767 task->aelta_port = (uint8_t)set.aiems_port; 10768 task->aelta_op = set.aiems_op; 10769 task->aelta_state = set.aiems_leds; 10770 10771 cv_init(&task->aelta_cv, NULL, CV_DRIVER, NULL); 10772 10773 /* 10774 * Initialize the reference count to two. One for us and one for the 10775 * taskq. This will be used in case we get canceled. 10776 */ 10777 task->aelta_ref = 2; 10778 10779 /* 10780 * Once dispatched, the task state is protected by our global mutex. 10781 */ 10782 (void) ddi_taskq_dispatch(ahci_ctlp->ahcictl_em_taskq, 10783 ahci_em_led_task, task, DDI_SLEEP); 10784 10785 signal = B_FALSE; 10786 mutex_enter(&ahci_ctlp->ahcictl_mutex); 10787 while (task->aelta_ref > 1) { 10788 if (cv_wait_sig(&task->aelta_cv, &ahci_ctlp->ahcictl_mutex) == 10789 0) { 10790 signal = B_TRUE; 10791 break; 10792 } 10793 } 10794 10795 /* 10796 * Remove our reference count. If we were woken up because of a signal 10797 * then the taskq may still be dispatched. In which case we shouldn't 10798 * free this memory until it is done. In that case, the taskq will take 10799 * care of it. 10800 */ 10801 task->aelta_ref--; 10802 cleanup = (task->aelta_ref == 0); 10803 if (signal) { 10804 ret = EINTR; 10805 } else { 10806 ret = task->aelta_ret; 10807 } 10808 mutex_exit(&ahci_ctlp->ahcictl_mutex); 10809 10810 if (cleanup) { 10811 ahci_em_led_task_free(task); 10812 } 10813 10814 return (ret); 10815 } 10816 10817 static int 10818 ahci_em_ioctl(dev_info_t *dip, int cmd, intptr_t arg) 10819 { 10820 int inst; 10821 ahci_ctl_t *ahci_ctlp; 10822 10823 inst = ddi_get_instance(dip); 10824 if ((ahci_ctlp = ddi_get_soft_state(ahci_statep, inst)) == NULL) { 10825 return (ENXIO); 10826 } 10827 10828 switch (cmd) { 10829 case AHCI_EM_IOC_GET: 10830 return (ahci_em_ioctl_get(ahci_ctlp, arg)); 10831 case AHCI_EM_IOC_SET: 10832 return (ahci_em_ioctl_set(ahci_ctlp, arg)); 10833 default: 10834 return (ENOTTY); 10835 } 10836 10837 } 10838 10839 static void 10840 ahci_em_quiesce(ahci_ctl_t *ahci_ctlp) 10841 { 10842 ASSERT(ahci_ctlp->ahcictl_em_flags & AHCI_EM_PRESENT); 10843 10844 mutex_enter(&ahci_ctlp->ahcictl_mutex); 10845 ahci_ctlp->ahcictl_em_flags |= AHCI_EM_QUIESCE; 10846 mutex_exit(&ahci_ctlp->ahcictl_mutex); 10847 10848 ddi_taskq_wait(ahci_ctlp->ahcictl_em_taskq); 10849 } 10850 10851 static void 10852 ahci_em_suspend(ahci_ctl_t *ahci_ctlp) 10853 { 10854 ahci_em_quiesce(ahci_ctlp); 10855 10856 mutex_enter(&ahci_ctlp->ahcictl_mutex); 10857 ahci_ctlp->ahcictl_em_flags &= ~AHCI_EM_READY; 10858 mutex_exit(&ahci_ctlp->ahcictl_mutex); 10859 } 10860 10861 static void 10862 ahci_em_resume(ahci_ctl_t *ahci_ctlp) 10863 { 10864 mutex_enter(&ahci_ctlp->ahcictl_mutex); 10865 ahci_ctlp->ahcictl_em_flags |= AHCI_EM_RESETTING; 10866 mutex_exit(&ahci_ctlp->ahcictl_mutex); 10867 10868 (void) ddi_taskq_dispatch(ahci_ctlp->ahcictl_em_taskq, ahci_em_reset, 10869 ahci_ctlp, DDI_SLEEP); 10870 } 10871 10872 static void 10873 ahci_em_fini(ahci_ctl_t *ahci_ctlp) 10874 { 10875 if ((ahci_ctlp->ahcictl_em_flags & AHCI_EM_PRESENT) == 0) { 10876 return; 10877 } 10878 10879 ahci_em_quiesce(ahci_ctlp); 10880 ddi_taskq_destroy(ahci_ctlp->ahcictl_em_taskq); 10881 ahci_ctlp->ahcictl_em_taskq = NULL; 10882 }