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 2007 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 #pragma ident	"%Z%%M%	%I%	%E% SMI"
28 
29 /*
30  * AHCI (Advanced Host Controller Interface) SATA HBA Driver
31  */
32 
33 #include <sys/scsi/scsi.h>
34 #include <sys/pci.h>
35 #include <sys/sata/sata_hba.h>
36 #include <sys/sata/adapters/ahci/ahcireg.h>
37 #include <sys/sata/adapters/ahci/ahcivar.h>
38 
39 /*
40  * Function prototypes for driver entry points
41  */
42 static	int ahci_attach(dev_info_t *, ddi_attach_cmd_t);
43 static	int ahci_detach(dev_info_t *, ddi_detach_cmd_t);
44 static	int ahci_getinfo(dev_info_t *, ddi_info_cmd_t, void *, void **);
45 
46 /*
47  * Function prototypes for SATA Framework interfaces
48  */
49 static	int ahci_register_sata_hba_tran(ahci_ctl_t *, uint32_t);
50 static	int ahci_unregister_sata_hba_tran(ahci_ctl_t *);
51 
52 static	int ahci_tran_probe_port(dev_info_t *, sata_device_t *);
53 static	int ahci_tran_start(dev_info_t *, sata_pkt_t *spkt);
54 static	int ahci_tran_abort(dev_info_t *, sata_pkt_t *, int);
55 static	int ahci_tran_reset_dport(dev_info_t *, sata_device_t *);
56 static	int ahci_tran_hotplug_port_activate(dev_info_t *, sata_device_t *);
57 static	int ahci_tran_hotplug_port_deactivate(dev_info_t *, sata_device_t *);
58 #if defined(__lock_lint)
59 static	int ahci_selftest(dev_info_t *, sata_device_t *);
60 #endif
61 
62 /*
63  * Local function prototypes
64  */
65 static	int ahci_alloc_ports_state(ahci_ctl_t *);
66 static	void ahci_dealloc_ports_state(ahci_ctl_t *);
67 static	int ahci_alloc_port_state(ahci_ctl_t *, uint8_t);
68 static	void ahci_dealloc_port_state(ahci_ctl_t *, uint8_t);
69 static	int ahci_alloc_rcvd_fis(ahci_ctl_t *, ahci_port_t *, uint8_t);
70 static	void ahci_dealloc_rcvd_fis(ahci_ctl_t *, ahci_port_t *);
71 static	int ahci_alloc_cmd_list(ahci_ctl_t *, ahci_port_t *, uint8_t);
72 static	void ahci_dealloc_cmd_list(ahci_ctl_t *, ahci_port_t *);
73 static  int ahci_alloc_cmd_tables(ahci_ctl_t *, ahci_port_t *);
74 static  void ahci_dealloc_cmd_tables(ahci_ctl_t *, ahci_port_t *);
75 
76 static	int ahci_initialize_controller(ahci_ctl_t *);
77 static	void ahci_uninitialize_controller(ahci_ctl_t *);
78 static	int ahci_initialize_port(ahci_ctl_t *, ahci_port_t *, uint8_t);
79 
80 static	int ahci_start_port(ahci_ctl_t *, ahci_port_t *, uint8_t);
81 static	void ahci_find_dev_signature(ahci_ctl_t *, ahci_port_t *, uint8_t);
82 static	void ahci_update_sata_registers(ahci_ctl_t *, uint8_t, sata_device_t *);
83 static	int ahci_deliver_satapkt(ahci_ctl_t *, ahci_port_t *,
84     uint8_t, sata_pkt_t *);
85 static	int ahci_do_sync_start(ahci_ctl_t *, ahci_port_t *,
86     uint8_t, sata_pkt_t *);
87 static	int ahci_claim_free_slot(ahci_ctl_t *, ahci_port_t *);
88 static  void ahci_copy_err_cnxt(sata_cmd_t *, ahci_fis_d2h_register_t *);
89 static	void ahci_copy_out_regs(sata_cmd_t *, ahci_fis_d2h_register_t *);
90 
91 static	int ahci_software_reset(ahci_ctl_t *, ahci_port_t *, uint8_t);
92 static	int ahci_hba_reset(ahci_ctl_t *);
93 static	int ahci_port_reset(ahci_ctl_t *, ahci_port_t *, uint8_t);
94 static	void ahci_reject_all_abort_pkts(ahci_ctl_t *, ahci_port_t *, uint8_t);
95 static	int ahci_reset_device_reject_pkts(ahci_ctl_t *, ahci_port_t *, uint8_t);
96 static	int ahci_reset_port_reject_pkts(ahci_ctl_t *, ahci_port_t *, uint8_t);
97 static	int ahci_reset_hba_reject_pkts(ahci_ctl_t *);
98 static	int ahci_put_port_into_notrunning_state(ahci_ctl_t *, ahci_port_t *,
99     uint8_t);
100 static	int ahci_restart_port_wait_till_ready(ahci_ctl_t *, ahci_port_t *,
101     uint8_t, int, int *);
102 static	void ahci_mop_commands(ahci_ctl_t *, ahci_port_t *, uint8_t,
103     uint32_t, uint32_t, uint32_t, uint32_t, uint32_t);
104 static void ahci_get_rqsense_data(ahci_ctl_t *, ahci_port_t *,
105     uint8_t, sata_pkt_t *);
106 static	void ahci_fatal_error_recovery_handler(ahci_ctl_t *, ahci_port_t *,
107     uint8_t, uint32_t, uint32_t);
108 static	void ahci_timeout_pkts(ahci_ctl_t *, ahci_port_t *,
109     uint8_t, uint32_t, uint32_t);
110 static	void ahci_events_handler(void *);
111 static	void ahci_watchdog_handler(ahci_ctl_t *);
112 
113 static	uint_t ahci_intr(caddr_t, caddr_t);
114 static	void ahci_port_intr(ahci_ctl_t *, ahci_port_t *, uint8_t, uint32_t);
115 static	int ahci_add_legacy_intrs(ahci_ctl_t *);
116 static	int ahci_add_msi_intrs(ahci_ctl_t *);
117 static	void ahci_rem_intrs(ahci_ctl_t *);
118 static	void ahci_enable_all_intrs(ahci_ctl_t *);
119 static	void ahci_disable_all_intrs(ahci_ctl_t *);
120 static	void ahci_enable_port_intrs(ahci_ctl_t *, ahci_port_t *, uint8_t);
121 static	void ahci_disable_port_intrs(ahci_ctl_t *, ahci_port_t *, uint8_t);
122 
123 static  int ahci_intr_cmd_cmplt(ahci_ctl_t *, ahci_port_t *, uint8_t,
124     uint32_t, uint32_t);
125 static	int ahci_intr_set_device_bits(ahci_ctl_t *, ahci_port_t *, uint8_t);
126 static	int ahci_intr_port_connect_change(ahci_ctl_t *, ahci_port_t *, uint8_t);
127 static	int ahci_intr_device_mechanical_presence_status(ahci_ctl_t *,
128     ahci_port_t *, uint8_t);
129 static	int ahci_intr_phyrdy_change(ahci_ctl_t *, ahci_port_t *, uint8_t);
130 static	int ahci_intr_non_fatal_error(ahci_ctl_t *, ahci_port_t *,
131     uint8_t, uint32_t);
132 static  int ahci_intr_fatal_error(ahci_ctl_t *, ahci_port_t *,
133     uint8_t, uint32_t, uint32_t);
134 static	int ahci_intr_cold_port_detect(ahci_ctl_t *, ahci_port_t *, uint8_t);
135 
136 static	int ahci_get_num_implemented_ports(uint32_t);
137 static  void ahci_log_fatal_error_message(ahci_ctl_t *, uint8_t port,
138     uint32_t);
139 static	void ahci_log_serror_message(ahci_ctl_t *, uint8_t, uint32_t);
140 static	void ahci_log(ahci_ctl_t *, uint_t, char *, ...);
141 
142 
143 /*
144  * DMA attributes for the data buffer
145  *
146  * dma_attr_addr_hi will be changed to 0xffffffffull if the HBA
147  * does not support 64-bit addressing
148  */
149 static ddi_dma_attr_t buffer_dma_attr = {
150 	DMA_ATTR_V0,		/* dma_attr_version */
151 	0x0ull,			/* dma_attr_addr_lo: lowest bus address */
152 	0xffffffffffffffffull,	/* dma_attr_addr_hi: highest bus address */
153 	0x3fffffull,		/* dma_attr_count_max i.e. for one cookie */
154 	0x2ull,			/* dma_attr_align: word aligned */
155 	1,			/* dma_attr_burstsizes */
156 	1,			/* dma_attr_minxfer */
157 	0xffffffffull,		/* dma_attr_maxxfer i.e. includes all cookies */
158 	0xffffffffull,		/* dma_attr_seg */
159 	AHCI_PRDT_NUMBER,	/* dma_attr_sgllen */
160 	512,			/* dma_attr_granular */
161 	0,			/* dma_attr_flags */
162 };
163 
164 /*
165  * DMA attributes for the rcvd FIS
166  *
167  * dma_attr_addr_hi will be changed to 0xffffffffull if the HBA
168  * does not support 64-bit addressing
169  */
170 static ddi_dma_attr_t rcvd_fis_dma_attr = {
171 	DMA_ATTR_V0,		/* dma_attr_version */
172 	0x0ull,			/* dma_attr_addr_lo: lowest bus address */
173 	0xffffffffffffffffull,	/* dma_attr_addr_hi: highest bus address */
174 	0xffffffffull,		/* dma_attr_count_max i.e. for one cookie */
175 	0x100ull,		/* dma_attr_align: 256-byte aligned */
176 	1,			/* dma_attr_burstsizes */
177 	1,			/* dma_attr_minxfer */
178 	0xffffffffull,		/* dma_attr_maxxfer i.e. includes all cookies */
179 	0xffffffffull,		/* dma_attr_seg */
180 	1,			/* dma_attr_sgllen */
181 	1,			/* dma_attr_granular */
182 	0,			/* dma_attr_flags */
183 };
184 
185 /*
186  * DMA attributes for the command list
187  *
188  * dma_attr_addr_hi will be changed to 0xffffffffull if the HBA
189  * does not support 64-bit addressing
190  */
191 static ddi_dma_attr_t cmd_list_dma_attr = {
192 	DMA_ATTR_V0,		/* dma_attr_version */
193 	0x0ull,			/* dma_attr_addr_lo: lowest bus address */
194 	0xffffffffffffffffull,	/* dma_attr_addr_hi: highest bus address */
195 	0xffffffffull,		/* dma_attr_count_max i.e. for one cookie */
196 	0x400ull,		/* dma_attr_align: 1K-byte aligned */
197 	1,			/* dma_attr_burstsizes */
198 	1,			/* dma_attr_minxfer */
199 	0xffffffffull,		/* dma_attr_maxxfer i.e. includes all cookies */
200 	0xffffffffull,		/* dma_attr_seg */
201 	1,			/* dma_attr_sgllen */
202 	1,			/* dma_attr_granular */
203 	0,			/* dma_attr_flags */
204 };
205 
206 /*
207  * DMA attributes for cmd tables
208  *
209  * dma_attr_addr_hi will be changed to 0xffffffffull if the HBA
210  * does not support 64-bit addressing
211  */
212 static ddi_dma_attr_t cmd_table_dma_attr = {
213 	DMA_ATTR_V0,		/* dma_attr_version */
214 	0x0ull,			/* dma_attr_addr_lo: lowest bus address */
215 	0xffffffffffffffffull,	/* dma_attr_addr_hi: highest bus address */
216 	0xffffffffull,		/* dma_attr_count_max i.e. for one cookie */
217 	0x80ull,		/* dma_attr_align: 128-byte aligned */
218 	1,			/* dma_attr_burstsizes */
219 	1,			/* dma_attr_minxfer */
220 	0xffffffffull,		/* dma_attr_maxxfer i.e. includes all cookies */
221 	0xffffffffull,		/* dma_attr_seg */
222 	1,			/* dma_attr_sgllen */
223 	1,			/* dma_attr_granular */
224 	0,			/* dma_attr_flags */
225 };
226 
227 
228 /* Device access attributes */
229 static ddi_device_acc_attr_t accattr = {
230 	DDI_DEVICE_ATTR_V0,
231 	DDI_STRUCTURE_LE_ACC,
232 	DDI_STRICTORDER_ACC
233 };
234 
235 
236 static struct dev_ops ahcictl_dev_ops = {
237 	DEVO_REV,		/* devo_rev */
238 	0,			/* refcnt  */
239 	ahci_getinfo,		/* info */
240 	nulldev,		/* identify */
241 	nulldev,		/* probe */
242 	ahci_attach,		/* attach */
243 	ahci_detach,		/* detach */
244 	nodev,			/* no reset */
245 	(struct cb_ops *)0,	/* driver operations */
246 	NULL,			/* bus operations */
247 	NULL			/* power */
248 };
249 
250 static sata_tran_hotplug_ops_t ahci_tran_hotplug_ops = {
251 	SATA_TRAN_HOTPLUG_OPS_REV_1,
252 	ahci_tran_hotplug_port_activate,
253 	ahci_tran_hotplug_port_deactivate
254 };
255 
256 extern struct mod_ops mod_driverops;
257 
258 static  struct modldrv modldrv = {
259 	&mod_driverops,		/* driverops */
260 	"ahci driver %I%",
261 	&ahcictl_dev_ops,	/* driver ops */
262 };
263 
264 static  struct modlinkage modlinkage = {
265 	MODREV_1,
266 	&modldrv,
267 	NULL
268 };
269 
270 static int ahci_watchdog_timeout = 5; /* 5 seconds */
271 static int ahci_watchdog_tick;
272 
273 /* The following is needed for ahci_log() */
274 static kmutex_t ahci_log_mutex;
275 static char ahci_log_buf[512];
276 
277 static size_t ahci_cmd_table_size;
278 
279 /* The number of Physical Region Descriptor Table(PRDT) in Command Table */
280 int ahci_dma_prdt_number = AHCI_PRDT_NUMBER;
281 
282 /*
283  * AHCI MSI tunable:
284  *
285  * MSI will be enabled in phase 2.
286  */
287 boolean_t ahci_msi_enabled = B_FALSE;
288 
289 #if AHCI_DEBUG
290 uint32_t ahci_debug_flags = 0;
291 #endif
292 
293 /* Opaque state pointer initialized by ddi_soft_state_init() */
294 static void *ahci_statep = NULL;
295 
296 /*
297  *  ahci module initialization.
298  */
299 int
300 _init(void)
301 {
302 	int	ret;
303 
304 	ret = ddi_soft_state_init(&ahci_statep, sizeof (ahci_ctl_t), 0);
305 	if (ret != 0) {
306 		goto err_out;
307 	}
308 
309 	mutex_init(&ahci_log_mutex, NULL, MUTEX_DRIVER, NULL);
310 
311 	if ((ret = sata_hba_init(&modlinkage)) != 0) {
312 		mutex_destroy(&ahci_log_mutex);
313 		ddi_soft_state_fini(&ahci_statep);
314 		goto err_out;
315 	}
316 
317 	ret = mod_install(&modlinkage);
318 	if (ret != 0) {
319 		sata_hba_fini(&modlinkage);
320 		mutex_destroy(&ahci_log_mutex);
321 		ddi_soft_state_fini(&ahci_statep);
322 		goto err_out;
323 	}
324 
325 	/* watchdog tick */
326 	ahci_watchdog_tick = drv_usectohz(
327 	    (clock_t)ahci_watchdog_timeout * 1000000);
328 	return (ret);
329 
330 err_out:
331 	cmn_err(CE_WARN, "!Module init failed");
332 	return (ret);
333 }
334 
335 /*
336  * ahci module uninitialize.
337  */
338 int
339 _fini(void)
340 {
341 	int	ret;
342 
343 	ret = mod_remove(&modlinkage);
344 	if (ret != 0) {
345 		return (ret);
346 	}
347 
348 	/* Remove the resources allocated in _init(). */
349 	sata_hba_fini(&modlinkage);
350 	mutex_destroy(&ahci_log_mutex);
351 	ddi_soft_state_fini(&ahci_statep);
352 
353 	return (ret);
354 }
355 
356 /*
357  * _info entry point
358  */
359 int
360 _info(struct modinfo *modinfop)
361 {
362 	return (mod_info(&modlinkage, modinfop));
363 }
364 
365 /*
366  * The attach entry point for dev_ops.
367  */
368 static int
369 ahci_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
370 {
371 	ahci_ctl_t *ahci_ctlp;
372 	int instance = ddi_get_instance(dip);
373 	int status;
374 	int attach_state;
375 	uint32_t cap_status, ahci_version;
376 	int intr_types;
377 	ushort_t venid;
378 	uint8_t revision;
379 	int i;
380 #if AHCI_DEBUG
381 	int speed;
382 #endif
383 
384 	AHCIDBG0(AHCIDBG_INIT|AHCIDBG_ENTRY, NULL, "ahci_attach enter");
385 
386 	switch (cmd) {
387 	case DDI_ATTACH:
388 		break;
389 
390 	case DDI_RESUME:
391 		/* It will be implemented in Phase 2 */
392 		return (DDI_FAILURE);
393 
394 	default:
395 		return (DDI_FAILURE);
396 	}
397 
398 	attach_state = AHCI_ATTACH_STATE_NONE;
399 
400 	/* Allocate soft state */
401 	status = ddi_soft_state_zalloc(ahci_statep, instance);
402 	if (status != DDI_SUCCESS) {
403 		cmn_err(CE_WARN, "!Cannot allocate soft state");
404 		goto err_out;
405 	}
406 
407 	ahci_ctlp = ddi_get_soft_state(ahci_statep, instance);
408 	ahci_ctlp->ahcictl_dip = dip;
409 
410 	/* Initialize the cport/port mapping */
411 	for (i = 0; i < AHCI_MAX_PORTS; i++) {
412 		ahci_ctlp->ahcictl_port_to_cport[i] = 0xff;
413 		ahci_ctlp->ahcictl_cport_to_port[i] = 0xff;
414 	}
415 
416 	attach_state |= AHCI_ATTACH_STATE_STATEP_ALLOC;
417 
418 	/*
419 	 * Now map the AHCI base address; which includes global
420 	 * registers and port control registers
421 	 */
422 	status = ddi_regs_map_setup(dip,
423 	    AHCI_BASE_REG,
424 	    (caddr_t *)&ahci_ctlp->ahcictl_ahci_addr,
425 	    0,
426 	    0,
427 	    &accattr,
428 	    &ahci_ctlp->ahcictl_ahci_acc_handle);
429 	if (status != DDI_SUCCESS) {
430 		cmn_err(CE_WARN, "!Cannot map register space");
431 		goto err_out;
432 	}
433 
434 	attach_state |= AHCI_ATTACH_STATE_REG_MAP;
435 
436 	/* Get the AHCI version information */
437 	ahci_version = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle,
438 	    (uint32_t *)AHCI_GLOBAL_VS(ahci_ctlp));
439 
440 	cmn_err(CE_NOTE, "!hba AHCI version = %x.%x",
441 	    (ahci_version & 0xffff0000) >> 16,
442 	    ((ahci_version & 0x0000ff00) >> 4 |
443 	    (ahci_version & 0x000000ff)));
444 
445 	/* We don't support controllers whose versions are lower than 1.0 */
446 	if (!(ahci_version & 0xffff0000)) {
447 		cmn_err(CE_WARN, "Don't support AHCI HBA with lower than "
448 		    "version 1.0");
449 		goto err_out;
450 	}
451 
452 	/* Get the HBA capabilities information */
453 	cap_status = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle,
454 	    (uint32_t *)AHCI_GLOBAL_CAP(ahci_ctlp));
455 
456 	AHCIDBG1(AHCIDBG_INIT, ahci_ctlp, "hba capabilites = 0x%x",
457 	    cap_status);
458 
459 #if AHCI_DEBUG
460 	/* Get the interface speed supported by the HBA */
461 	speed = (cap_status & AHCI_HBA_CAP_ISS) >> AHCI_HBA_CAP_ISS_SHIFT;
462 	if (speed == 0x01) {
463 		AHCIDBG0(AHCIDBG_INIT, ahci_ctlp,
464 		    "hba interface speed support: Gen 1 (1.5Gbps)");
465 	} else if (speed == 0x10) {
466 		AHCIDBG0(AHCIDBG_INIT, ahci_ctlp,
467 		    "hba interface speed support: Gen 2 (3 Gbps)");
468 	} else if (speed == 0x11) {
469 		AHCIDBG0(AHCIDBG_INIT, ahci_ctlp,
470 		    "hba interface speed support: Gen 3 (6 Gbps)");
471 	}
472 #endif
473 
474 	/* Get the number of command slots supported by the HBA */
475 	ahci_ctlp->ahcictl_num_cmd_slots =
476 	    ((cap_status & AHCI_HBA_CAP_NCS) >>
477 	    AHCI_HBA_CAP_NCS_SHIFT) + 1;
478 
479 	AHCIDBG1(AHCIDBG_INIT, ahci_ctlp, "hba number of cmd slots: %d",
480 	    ahci_ctlp->ahcictl_num_cmd_slots);
481 
482 	/* Get the bit map which indicates ports implemented by the HBA */
483 	ahci_ctlp->ahcictl_ports_implemented =
484 	    ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle,
485 	    (uint32_t *)AHCI_GLOBAL_PI(ahci_ctlp));
486 
487 	AHCIDBG1(AHCIDBG_INIT, ahci_ctlp, "hba implementation of ports: 0x%x",
488 	    ahci_ctlp->ahcictl_ports_implemented);
489 
490 	/*
491 	 * According to the AHCI spec, CAP.NP should indicate the maximum
492 	 * number of ports supported by the HBA silicon, but we found
493 	 * this value of ICH8 chipset only indicates the number of ports
494 	 * implemented (exposed) by it. Therefore, the driver should calculate
495 	 * the potential maximum value by checking PI register, and use
496 	 * the maximum of this value and CAP.NP.
497 	 */
498 	ahci_ctlp->ahcictl_num_ports = max(
499 	    (cap_status & AHCI_HBA_CAP_NP) + 1,
500 	    ddi_fls(ahci_ctlp->ahcictl_ports_implemented));
501 
502 	AHCIDBG1(AHCIDBG_INIT, ahci_ctlp, "hba number of ports: %d",
503 	    ahci_ctlp->ahcictl_num_ports);
504 
505 	/* Get the number of implemented ports by the HBA */
506 	ahci_ctlp->ahcictl_num_implemented_ports =
507 	    ahci_get_num_implemented_ports(
508 	    ahci_ctlp->ahcictl_ports_implemented);
509 
510 	AHCIDBG1(AHCIDBG_INIT, ahci_ctlp,
511 	    "hba number of implemented ports: %d",
512 	    ahci_ctlp->ahcictl_num_implemented_ports);
513 
514 	ahci_ctlp->ahcictl_buffer_dma_attr = buffer_dma_attr;
515 
516 	if (!(cap_status & AHCI_HBA_CAP_S64A)) {
517 		AHCIDBG0(AHCIDBG_INIT, ahci_ctlp,
518 		    "hba does not support 64-bit addressing");
519 		ahci_ctlp->ahcictl_buffer_dma_attr.dma_attr_addr_hi =
520 		    0xffffffffull;
521 	}
522 
523 	if (pci_config_setup(dip, &ahci_ctlp->ahcictl_pci_conf_handle)
524 	    != DDI_SUCCESS) {
525 		cmn_err(CE_WARN, "!Cannot set up pci configure space");
526 		goto err_out;
527 	}
528 
529 	attach_state |= AHCI_ATTACH_STATE_PCICFG_SETUP;
530 
531 	/*
532 	 * Modify dma_attr_align of ahcictl_buffer_dma_attr. For VT8251, those
533 	 * controllers with 0x00 revision id work on 4-byte aligned buffer,
534 	 * which is a bug and was fixed after 0x00 revision id controllers.
535 	 *
536 	 * And VT8251 cannot use multiple command lists for non-queued commands
537 	 * because the Command Issue register bit can be cleared by software
538 	 * set.
539 	 */
540 	venid = pci_config_get16(ahci_ctlp->ahcictl_pci_conf_handle,
541 	    PCI_CONF_VENID);
542 
543 	if (venid == VIA_VENID) {
544 		revision = pci_config_get8(ahci_ctlp->ahcictl_pci_conf_handle,
545 		    PCI_CONF_REVID);
546 		AHCIDBG1(AHCIDBG_INIT, ahci_ctlp,
547 		    "revision id = 0x%x", revision);
548 		if (revision == 0x00) {
549 			ahci_ctlp->ahcictl_buffer_dma_attr.dma_attr_align = 0x4;
550 			AHCIDBG0(AHCIDBG_INIT, ahci_ctlp,
551 			    "change ddi_attr_align to 0x4");
552 		}
553 
554 		ahci_ctlp->ahcictl_cap = AHCI_CAP_NO_MCMDLIST_NONQUEUE;
555 		AHCIDBG0(AHCIDBG_INIT, ahci_ctlp,
556 		    "VT8251 cannot use multiple command lists for "
557 		    "non-queued commands");
558 	}
559 
560 	/*
561 	 * Disable the whole controller interrupts before adding
562 	 * interrupt handlers(s).
563 	 */
564 	ahci_disable_all_intrs(ahci_ctlp);
565 
566 	/* Get supported interrupt types */
567 	if (ddi_intr_get_supported_types(dip, &intr_types) != DDI_SUCCESS) {
568 		cmn_err(CE_WARN, "!ddi_intr_get_supported_types failed");
569 		goto err_out;
570 	}
571 
572 	AHCIDBG1(AHCIDBG_INIT|AHCIDBG_INTR, ahci_ctlp,
573 	    "ddi_intr_get_supported_types() returned: 0x%x",
574 	    intr_types);
575 
576 	if (ahci_msi_enabled && (intr_types & DDI_INTR_TYPE_MSI)) {
577 		/*
578 		 * Try MSI first, but fall back to FIXED if failed
579 		 */
580 		if (ahci_add_msi_intrs(ahci_ctlp) == DDI_SUCCESS) {
581 			ahci_ctlp->ahcictl_intr_type = DDI_INTR_TYPE_MSI;
582 			AHCIDBG0(AHCIDBG_INIT|AHCIDBG_INTR, ahci_ctlp,
583 			    "Using MSI interrupt type");
584 			goto intr_done;
585 		}
586 
587 		AHCIDBG0(AHCIDBG_INIT|AHCIDBG_INTR, ahci_ctlp,
588 		    "MSI registration failed, "
589 		    "trying FIXED interrupts");
590 	}
591 
592 	if (intr_types & DDI_INTR_TYPE_FIXED) {
593 		if (ahci_add_legacy_intrs(ahci_ctlp) == DDI_SUCCESS) {
594 			ahci_ctlp->ahcictl_intr_type = DDI_INTR_TYPE_FIXED;
595 			AHCIDBG0(AHCIDBG_INIT|AHCIDBG_INTR, NULL,
596 			    "Using FIXED interrupt type");
597 			goto intr_done;
598 		}
599 
600 		AHCIDBG0(AHCIDBG_INIT|AHCIDBG_INTR, ahci_ctlp,
601 		    "FIXED interrupt registration failed");
602 	}
603 
604 	cmn_err(CE_WARN, "!Interrupt registration failed");
605 
606 	goto err_out;
607 
608 intr_done:
609 
610 	attach_state |= AHCI_ATTACH_STATE_INTR_ADDED;
611 
612 	/* Initialize the controller mutex */
613 	mutex_init(&ahci_ctlp->ahcictl_mutex, NULL, MUTEX_DRIVER,
614 	    (void *)(uintptr_t)ahci_ctlp->ahcictl_intr_pri);
615 
616 	attach_state |= AHCI_ATTACH_STATE_MUTEX_INIT;
617 
618 	if (ahci_dma_prdt_number < AHCI_MIN_PRDT_NUMBER) {
619 		ahci_dma_prdt_number = AHCI_MIN_PRDT_NUMBER;
620 	} else if (ahci_dma_prdt_number > AHCI_MAX_PRDT_NUMBER) {
621 		ahci_dma_prdt_number = AHCI_MAX_PRDT_NUMBER;
622 	}
623 
624 	ahci_cmd_table_size = (sizeof (ahci_cmd_table_t) +
625 	    (ahci_dma_prdt_number - AHCI_PRDT_NUMBER) *
626 	    sizeof (ahci_prdt_item_t));
627 
628 	AHCIDBG2(AHCIDBG_INIT, ahci_ctlp,
629 	    "ahci_attach: ahci_dma_prdt_number set by user is 0x%x,"
630 	    " ahci_cmd_table_size is 0x%x",
631 	    ahci_dma_prdt_number, ahci_cmd_table_size);
632 
633 	if (ahci_dma_prdt_number != AHCI_PRDT_NUMBER)
634 		ahci_ctlp->ahcictl_buffer_dma_attr.dma_attr_sgllen =
635 		    ahci_dma_prdt_number;
636 
637 	/* Allocate the ports structure */
638 	status = ahci_alloc_ports_state(ahci_ctlp);
639 	if (status != AHCI_SUCCESS) {
640 		cmn_err(CE_WARN, "!Cannot allocate ports structure");
641 		goto err_out;
642 	}
643 
644 	attach_state |= AHCI_ATTACH_STATE_PORT_ALLOC;
645 
646 	/*
647 	 * A taskq is created for dealing with events
648 	 */
649 	if ((ahci_ctlp->ahcictl_event_taskq = ddi_taskq_create(dip,
650 	    "ahci_event_handle_taskq", 1, TASKQ_DEFAULTPRI, 0)) == NULL) {
651 		cmn_err(CE_WARN, "!ddi_taskq_create failed for event handle");
652 		goto err_out;
653 	}
654 
655 	attach_state |= AHCI_ATTACH_STATE_ERR_RECV_TASKQ;
656 
657 	/*
658 	 * Initialize the controller and ports.
659 	 */
660 	ahci_ctlp->ahcictl_flags |= AHCI_ATTACH;
661 	status = ahci_initialize_controller(ahci_ctlp);
662 	ahci_ctlp->ahcictl_flags &= ~AHCI_ATTACH;
663 	if (status != AHCI_SUCCESS) {
664 		cmn_err(CE_WARN, "!HBA initialization failed");
665 		goto err_out;
666 	}
667 
668 	attach_state |= AHCI_ATTACH_STATE_HW_INIT;
669 
670 	/* Start one thread to check packet timeouts */
671 	ahci_ctlp->ahcictl_timeout_id = timeout(
672 	    (void (*)(void *))ahci_watchdog_handler,
673 	    (caddr_t)ahci_ctlp, ahci_watchdog_tick);
674 
675 	attach_state |= AHCI_ATTACH_STATE_TIMEOUT_ENABLED;
676 
677 	if (ahci_register_sata_hba_tran(ahci_ctlp, cap_status)) {
678 		cmn_err(CE_WARN, "!sata hba tran registration failed");
679 		goto err_out;
680 	}
681 
682 	AHCIDBG0(AHCIDBG_INIT, ahci_ctlp, "ahci_attach success!");
683 
684 	return (DDI_SUCCESS);
685 
686 err_out:
687 	if (attach_state & AHCI_ATTACH_STATE_TIMEOUT_ENABLED) {
688 		mutex_enter(&ahci_ctlp->ahcictl_mutex);
689 		(void) untimeout(ahci_ctlp->ahcictl_timeout_id);
690 		ahci_ctlp->ahcictl_timeout_id = 0;
691 		mutex_exit(&ahci_ctlp->ahcictl_mutex);
692 	}
693 
694 	if (attach_state & AHCI_ATTACH_STATE_HW_INIT) {
695 		mutex_enter(&ahci_ctlp->ahcictl_mutex);
696 		ahci_uninitialize_controller(ahci_ctlp);
697 		mutex_exit(&ahci_ctlp->ahcictl_mutex);
698 	}
699 
700 	if (attach_state & AHCI_ATTACH_STATE_ERR_RECV_TASKQ) {
701 		ddi_taskq_destroy(ahci_ctlp->ahcictl_event_taskq);
702 	}
703 
704 	if (attach_state & AHCI_ATTACH_STATE_PORT_ALLOC) {
705 		ahci_dealloc_ports_state(ahci_ctlp);
706 	}
707 
708 	if (attach_state & AHCI_ATTACH_STATE_MUTEX_INIT) {
709 		mutex_destroy(&ahci_ctlp->ahcictl_mutex);
710 	}
711 
712 	if (attach_state & AHCI_ATTACH_STATE_INTR_ADDED) {
713 		ahci_rem_intrs(ahci_ctlp);
714 	}
715 
716 	if (attach_state & AHCI_ATTACH_STATE_PCICFG_SETUP) {
717 		pci_config_teardown(&ahci_ctlp->ahcictl_pci_conf_handle);
718 	}
719 
720 	if (attach_state & AHCI_ATTACH_STATE_REG_MAP) {
721 		ddi_regs_map_free(&ahci_ctlp->ahcictl_ahci_acc_handle);
722 	}
723 
724 	if (attach_state & AHCI_ATTACH_STATE_STATEP_ALLOC) {
725 		ddi_soft_state_free(ahci_statep, instance);
726 	}
727 
728 	return (DDI_FAILURE);
729 }
730 
731 /*
732  * The detach entry point for dev_ops.
733  */
734 static int
735 ahci_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
736 {
737 	ahci_ctl_t *ahci_ctlp;
738 	int instance;
739 	int ret;
740 
741 	instance = ddi_get_instance(dip);
742 	ahci_ctlp = ddi_get_soft_state(ahci_statep, instance);
743 
744 	AHCIDBG0(AHCIDBG_ENTRY, ahci_ctlp, "ahci_detach enter");
745 
746 	switch (cmd) {
747 	case DDI_DETACH:
748 		/* disable the interrupts for an uninterrupted detach */
749 		mutex_enter(&ahci_ctlp->ahcictl_mutex);
750 		ahci_disable_all_intrs(ahci_ctlp);
751 		mutex_exit(&ahci_ctlp->ahcictl_mutex);
752 
753 		/* unregister from the sata framework. */
754 		ret = ahci_unregister_sata_hba_tran(ahci_ctlp);
755 		if (ret != AHCI_SUCCESS) {
756 			mutex_enter(&ahci_ctlp->ahcictl_mutex);
757 			ahci_enable_all_intrs(ahci_ctlp);
758 			mutex_exit(&ahci_ctlp->ahcictl_mutex);
759 			return (DDI_FAILURE);
760 		}
761 
762 		mutex_enter(&ahci_ctlp->ahcictl_mutex);
763 
764 		/* stop the watchdog handler */
765 		(void) untimeout(ahci_ctlp->ahcictl_timeout_id);
766 		ahci_ctlp->ahcictl_timeout_id = 0;
767 
768 		mutex_exit(&ahci_ctlp->ahcictl_mutex);
769 
770 		/* uninitialize the controller */
771 		ahci_ctlp->ahcictl_flags |= AHCI_DETACH;
772 		ahci_uninitialize_controller(ahci_ctlp);
773 		ahci_ctlp->ahcictl_flags &= ~AHCI_DETACH;
774 
775 		/* remove the interrupts */
776 		ahci_rem_intrs(ahci_ctlp);
777 
778 		/* destroy the taskq */
779 		ddi_taskq_destroy(ahci_ctlp->ahcictl_event_taskq);
780 
781 		/* deallocate the ports structures */
782 		ahci_dealloc_ports_state(ahci_ctlp);
783 
784 		/* destroy mutex */
785 		mutex_destroy(&ahci_ctlp->ahcictl_mutex);
786 
787 		/* teardown the pci config */
788 		pci_config_teardown(&ahci_ctlp->ahcictl_pci_conf_handle);
789 
790 		/* remove the reg maps. */
791 		ddi_regs_map_free(&ahci_ctlp->ahcictl_ahci_acc_handle);
792 
793 		/* free the soft state. */
794 		ddi_soft_state_free(ahci_statep, instance);
795 
796 		return (DDI_SUCCESS);
797 
798 	case DDI_SUSPEND:
799 		/* It will be implemented in Phase 2 */
800 		return (DDI_FAILURE);
801 
802 	default:
803 		return (DDI_FAILURE);
804 	}
805 }
806 
807 /*
808  * The info entry point for dev_ops.
809  *
810  */
811 static int
812 ahci_getinfo(dev_info_t *dip, ddi_info_cmd_t infocmd,
813 		    void *arg, void **result)
814 {
815 #ifndef __lock_lint
816 	_NOTE(ARGUNUSED(dip))
817 #endif /* __lock_lint */
818 
819 	ahci_ctl_t *ahci_ctlp;
820 	int instance;
821 	dev_t dev;
822 
823 	dev = (dev_t)arg;
824 	instance = getminor(dev);
825 
826 	switch (infocmd) {
827 		case DDI_INFO_DEVT2DEVINFO:
828 			ahci_ctlp = ddi_get_soft_state(ahci_statep,  instance);
829 			if (ahci_ctlp != NULL) {
830 				*result = ahci_ctlp->ahcictl_dip;
831 				return (DDI_SUCCESS);
832 			} else {
833 				*result = NULL;
834 				return (DDI_FAILURE);
835 			}
836 		case DDI_INFO_DEVT2INSTANCE:
837 			*(int *)result = instance;
838 			break;
839 		default:
840 			break;
841 	}
842 
843 	return (DDI_SUCCESS);
844 }
845 
846 /*
847  * Registers the ahci with sata framework.
848  */
849 static int
850 ahci_register_sata_hba_tran(ahci_ctl_t *ahci_ctlp, uint32_t cap_status)
851 {
852 	struct 	sata_hba_tran	*sata_hba_tran;
853 
854 	AHCIDBG0(AHCIDBG_INIT|AHCIDBG_ENTRY, ahci_ctlp,
855 	    "ahci_register_sata_hba_tran enter");
856 
857 	mutex_enter(&ahci_ctlp->ahcictl_mutex);
858 
859 	/* Allocate memory for the sata_hba_tran  */
860 	sata_hba_tran = kmem_zalloc(sizeof (sata_hba_tran_t), KM_SLEEP);
861 
862 	sata_hba_tran->sata_tran_hba_rev = SATA_TRAN_HBA_REV_2;
863 	sata_hba_tran->sata_tran_hba_dip = ahci_ctlp->ahcictl_dip;
864 	sata_hba_tran->sata_tran_hba_dma_attr =
865 	    &ahci_ctlp->ahcictl_buffer_dma_attr;
866 
867 	/* Report the number of implemented ports */
868 	sata_hba_tran->sata_tran_hba_num_cports =
869 	    ahci_ctlp->ahcictl_num_implemented_ports;
870 
871 	/* Support ATAPI device */
872 	sata_hba_tran->sata_tran_hba_features_support = SATA_CTLF_ATAPI;
873 
874 	/* Get the data transfer capability for PIO command by the HBA */
875 	if (cap_status & AHCI_HBA_CAP_PMD) {
876 		ahci_ctlp->ahcictl_flags |= AHCI_CAP_PIO_MDRQ;
877 		AHCIDBG0(AHCIDBG_INFO, ahci_ctlp, "HBA supports multiple "
878 		    "DRQ block data transfer for PIO command protocol");
879 	} else {
880 		AHCIDBG0(AHCIDBG_INFO, ahci_ctlp, "HBA only supports single "
881 		    "DRQ block data transfer for PIO command protocol");
882 	}
883 
884 	/* Report the number of command slots */
885 	sata_hba_tran->sata_tran_hba_qdepth = ahci_ctlp->ahcictl_num_cmd_slots;
886 
887 	sata_hba_tran->sata_tran_probe_port = ahci_tran_probe_port;
888 	sata_hba_tran->sata_tran_start = ahci_tran_start;
889 	sata_hba_tran->sata_tran_abort = ahci_tran_abort;
890 	sata_hba_tran->sata_tran_reset_dport = ahci_tran_reset_dport;
891 	sata_hba_tran->sata_tran_hotplug_ops = &ahci_tran_hotplug_ops;
892 #ifdef __lock_lint
893 	sata_hba_tran->sata_tran_selftest = ahci_selftest;
894 #endif
895 	/*
896 	 * When SATA framework adds support for pwrmgt the
897 	 * pwrmgt_ops needs to be updated
898 	 */
899 	sata_hba_tran->sata_tran_pwrmgt_ops = NULL;
900 	sata_hba_tran->sata_tran_ioctl = NULL;
901 
902 	ahci_ctlp->ahcictl_sata_hba_tran = sata_hba_tran;
903 
904 	mutex_exit(&ahci_ctlp->ahcictl_mutex);
905 
906 	/* Attach it to SATA framework */
907 	if (sata_hba_attach(ahci_ctlp->ahcictl_dip, sata_hba_tran, DDI_ATTACH)
908 	    != DDI_SUCCESS) {
909 		kmem_free((void *)sata_hba_tran, sizeof (sata_hba_tran_t));
910 		mutex_enter(&ahci_ctlp->ahcictl_mutex);
911 		ahci_ctlp->ahcictl_sata_hba_tran = NULL;
912 		mutex_exit(&ahci_ctlp->ahcictl_mutex);
913 		return (AHCI_FAILURE);
914 	}
915 
916 	return (AHCI_SUCCESS);
917 }
918 
919 /*
920  * Unregisters the ahci with sata framework.
921  */
922 static int
923 ahci_unregister_sata_hba_tran(ahci_ctl_t *ahci_ctlp)
924 {
925 	AHCIDBG0(AHCIDBG_ENTRY, ahci_ctlp,
926 	    "ahci_unregister_sata_hba_tran enter");
927 
928 	/* Detach from the SATA framework. */
929 	if (sata_hba_detach(ahci_ctlp->ahcictl_dip, DDI_DETACH) !=
930 	    DDI_SUCCESS) {
931 		return (AHCI_FAILURE);
932 	}
933 
934 	/* Deallocate sata_hba_tran. */
935 	kmem_free((void *)ahci_ctlp->ahcictl_sata_hba_tran,
936 	    sizeof (sata_hba_tran_t));
937 
938 	mutex_enter(&ahci_ctlp->ahcictl_mutex);
939 	ahci_ctlp->ahcictl_sata_hba_tran = NULL;
940 	mutex_exit(&ahci_ctlp->ahcictl_mutex);
941 
942 	return (AHCI_SUCCESS);
943 }
944 
945 /*
946  * ahci_tran_probe_port is called by SATA framework. It returns port state,
947  * port status registers and an attached device type via sata_device
948  * structure.
949  *
950  * We return the cached information from a previous hardware probe. The
951  * actual hardware probing itself was done either from within
952  * ahci_initialize_controller() during the driver attach or from a phy
953  * ready change interrupt handler.
954  */
955 static int
956 ahci_tran_probe_port(dev_info_t *dip, sata_device_t *sd)
957 {
958 	ahci_ctl_t *ahci_ctlp;
959 	ahci_port_t *ahci_portp;
960 	uint8_t	cport = sd->satadev_addr.cport;
961 	uint8_t pmport = sd->satadev_addr.pmport;
962 	uint8_t qual = sd->satadev_addr.qual;
963 	uint8_t	device_type;
964 	uint32_t port_state;
965 	uint8_t port;
966 
967 	ahci_ctlp = ddi_get_soft_state(ahci_statep, ddi_get_instance(dip));
968 	port = ahci_ctlp->ahcictl_cport_to_port[cport];
969 
970 	AHCIDBG3(AHCIDBG_ENTRY, ahci_ctlp,
971 	    "ahci_tran_probe_port enter: cport: %d, "
972 	    "pmport: %d, qual: %d", cport, pmport, qual);
973 
974 	ahci_portp = ahci_ctlp->ahcictl_ports[port];
975 
976 	mutex_enter(&ahci_portp->ahciport_mutex);
977 
978 	port_state = ahci_portp->ahciport_port_state;
979 	switch (port_state) {
980 
981 	case SATA_PSTATE_FAILED:
982 		sd->satadev_state = SATA_PSTATE_FAILED;
983 		AHCIDBG1(AHCIDBG_ERRS, ahci_ctlp,
984 		    "ahci_tran_probe_port: port %d PORT FAILED", port);
985 		goto out;
986 
987 	case SATA_PSTATE_SHUTDOWN:
988 		sd->satadev_state = SATA_PSTATE_SHUTDOWN;
989 		AHCIDBG1(AHCIDBG_ERRS, ahci_ctlp,
990 		    "ahci_tran_probe_port: port %d PORT SHUTDOWN", port);
991 		goto out;
992 
993 	case SATA_PSTATE_PWROFF:
994 		sd->satadev_state = SATA_PSTATE_PWROFF;
995 		AHCIDBG1(AHCIDBG_ERRS, ahci_ctlp,
996 		    "ahci_tran_probe_port: port %d PORT PWROFF", port);
997 		goto out;
998 
999 	case SATA_PSTATE_PWRON:
1000 		sd->satadev_state = SATA_PSTATE_PWRON;
1001 		AHCIDBG1(AHCIDBG_INFO, ahci_ctlp,
1002 		    "ahci_tran_probe_port: port %d PORT PWRON", port);
1003 		break;
1004 
1005 	default:
1006 		sd->satadev_state = port_state;
1007 		AHCIDBG2(AHCIDBG_INFO, ahci_ctlp,
1008 		    "ahci_tran_probe_port: port %d PORT NORMAL %x",
1009 		    port, port_state);
1010 		break;
1011 	}
1012 
1013 	device_type = ahci_portp->ahciport_device_type;
1014 
1015 	switch (device_type) {
1016 
1017 	case SATA_DTYPE_ATADISK:
1018 		sd->satadev_type = SATA_DTYPE_ATADISK;
1019 		AHCIDBG1(AHCIDBG_INFO, ahci_ctlp,
1020 		    "ahci_tran_probe_port: port %d DISK found", port);
1021 		break;
1022 
1023 	case SATA_DTYPE_ATAPICD:
1024 		sd->satadev_type = SATA_DTYPE_ATAPICD;
1025 		AHCIDBG1(AHCIDBG_INFO, ahci_ctlp,
1026 		    "ahci_tran_probe_port: port %d ATAPI found", port);
1027 		break;
1028 
1029 	case SATA_DTYPE_PMULT:
1030 		sd->satadev_type = SATA_DTYPE_PMULT;
1031 		AHCIDBG1(AHCIDBG_INFO, ahci_ctlp,
1032 		    "ahci_tran_probe_port: port %d Port Multiplier found",
1033 		    port);
1034 		break;
1035 
1036 	case SATA_DTYPE_UNKNOWN:
1037 		sd->satadev_type = SATA_DTYPE_UNKNOWN;
1038 		AHCIDBG1(AHCIDBG_INFO, ahci_ctlp,
1039 		    "ahci_tran_probe_port: port %d Unknown device found", port);
1040 		break;
1041 
1042 	default:
1043 		/* we don't support any other device types */
1044 		sd->satadev_type = SATA_DTYPE_NONE;
1045 		AHCIDBG1(AHCIDBG_INFO, ahci_ctlp,
1046 		    "ahci_tran_probe_port: port %d No device found", port);
1047 		break;
1048 	}
1049 
1050 out:
1051 	ahci_update_sata_registers(ahci_ctlp, port, sd);
1052 	mutex_exit(&ahci_portp->ahciport_mutex);
1053 
1054 	return (SATA_SUCCESS);
1055 }
1056 
1057 /*
1058  * There are four operation modes in sata framework:
1059  * SATA_OPMODE_INTERRUPTS
1060  * SATA_OPMODE_POLLING
1061  * SATA_OPMODE_ASYNCH
1062  * SATA_OPMODE_SYNCH
1063  *
1064  * Their combined meanings as following:
1065  *
1066  * SATA_OPMODE_SYNCH
1067  * The command has to be completed before sata_tran_start functions returns.
1068  * Either interrupts or polling could be used - it's up to the driver.
1069  * Mode used currently for internal, sata-module initiated operations.
1070  *
1071  * SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS
1072  * It is the same as the one above.
1073  *
1074  * SATA_OPMODE_SYNCH | SATA_OPMODE_POLLING
1075  * The command has to be completed before sata_tran_start function returns.
1076  * No interrupt used, polling only. This should be the mode used for scsi
1077  * packets with FLAG_NOINTR.
1078  *
1079  * SATA_OPMODE_ASYNCH | SATA_OPMODE_INTERRUPTS
1080  * The command may be queued (callback function specified). Interrupts could
1081  * be used. It's normal operation mode.
1082  */
1083 /*
1084  * Called by sata framework to transport a sata packet down stream.
1085  */
1086 static int
1087 ahci_tran_start(dev_info_t *dip, sata_pkt_t *spkt)
1088 {
1089 	ahci_ctl_t *ahci_ctlp;
1090 	ahci_port_t *ahci_portp;
1091 	uint8_t	cport = spkt->satapkt_device.satadev_addr.cport;
1092 	uint8_t port;
1093 
1094 	ahci_ctlp = ddi_get_soft_state(ahci_statep, ddi_get_instance(dip));
1095 	port = ahci_ctlp->ahcictl_cport_to_port[cport];
1096 
1097 	AHCIDBG2(AHCIDBG_ENTRY, ahci_ctlp,
1098 	    "ahci_tran_start enter: cport %d satapkt 0x%p",
1099 	    cport, (void *)spkt);
1100 
1101 	ahci_portp = ahci_ctlp->ahcictl_ports[port];
1102 
1103 	mutex_enter(&ahci_portp->ahciport_mutex);
1104 
1105 	if (ahci_portp->ahciport_port_state & SATA_PSTATE_FAILED |
1106 	    ahci_portp->ahciport_port_state & SATA_PSTATE_SHUTDOWN |
1107 	    ahci_portp->ahciport_port_state & SATA_PSTATE_PWROFF) {
1108 		/*
1109 		 * In case the targer driver would send the packet before
1110 		 * sata framework can have the opportunity to process those
1111 		 * event reports.
1112 		 */
1113 		spkt->satapkt_reason = SATA_PKT_PORT_ERROR;
1114 		spkt->satapkt_device.satadev_state =
1115 		    ahci_portp->ahciport_port_state;
1116 		ahci_update_sata_registers(ahci_ctlp, port,
1117 		    &spkt->satapkt_device);
1118 		AHCIDBG1(AHCIDBG_ERRS, ahci_ctlp,
1119 		    "ahci_tran_start returning PORT_ERROR while "
1120 		    "port in FAILED/SHUTDOWN/PWROFF state: "
1121 		    "port: %d", port);
1122 		mutex_exit(&ahci_portp->ahciport_mutex);
1123 		return (SATA_TRAN_PORT_ERROR);
1124 	}
1125 
1126 	if (ahci_portp->ahciport_device_type == SATA_DTYPE_NONE) {
1127 		/*
1128 		 * ahci_intr_phyrdy_change() may have rendered it to
1129 		 * SATA_DTYPE_NONE.
1130 		 */
1131 		spkt->satapkt_reason = SATA_PKT_PORT_ERROR;
1132 		spkt->satapkt_device.satadev_type = SATA_DTYPE_NONE;
1133 		spkt->satapkt_device.satadev_state =
1134 		    ahci_portp->ahciport_port_state;
1135 		ahci_update_sata_registers(ahci_ctlp, port,
1136 		    &spkt->satapkt_device);
1137 		AHCIDBG1(AHCIDBG_ERRS, ahci_ctlp,
1138 		    "ahci_tran_start returning PORT_ERROR while "
1139 		    "no device attached: port: %d", port);
1140 		mutex_exit(&ahci_portp->ahciport_mutex);
1141 		return (SATA_TRAN_PORT_ERROR);
1142 	}
1143 
1144 	/*
1145 	 * SATA HBA driver should remember that a device was reset and it
1146 	 * is supposed to reject any packets which do not specify either
1147 	 * SATA_IGNORE_DEV_RESET_STATE or SATA_CLEAR_DEV_RESET_STATE.
1148 	 *
1149 	 * This is to prevent a race condition when a device was arbitrarily
1150 	 * reset by the HBA driver (and lost it's setting) and a target
1151 	 * driver sending some commands to a device before the sata framework
1152 	 * has a chance to restore the device setting (such as cache enable/
1153 	 * disable or other resettable stuff).
1154 	 */
1155 	if (spkt->satapkt_cmd.satacmd_flags.sata_clear_dev_reset) {
1156 		ahci_portp->ahciport_reset_in_progress = 0;
1157 		AHCIDBG1(AHCIDBG_ERRS, ahci_ctlp,
1158 		    "ahci_tran_start clearing the "
1159 		    "reset_in_progress for port: %d", port);
1160 	}
1161 
1162 	if (ahci_portp->ahciport_reset_in_progress &&
1163 	    ! spkt->satapkt_cmd.satacmd_flags.sata_ignore_dev_reset &&
1164 	    ! ddi_in_panic()) {
1165 		spkt->satapkt_reason = SATA_PKT_BUSY;
1166 		AHCIDBG1(AHCIDBG_ERRS, ahci_ctlp,
1167 		    "ahci_tran_start returning BUSY while "
1168 		    "reset in progress: port: %d", port);
1169 		mutex_exit(&ahci_portp->ahciport_mutex);
1170 		return (SATA_TRAN_BUSY);
1171 	}
1172 
1173 	if (ahci_portp->ahciport_flags & AHCI_PORT_FLAG_MOPPING) {
1174 		spkt->satapkt_reason = SATA_PKT_BUSY;
1175 		AHCIDBG1(AHCIDBG_ERRS, ahci_ctlp,
1176 		    "ahci_tran_start returning BUSY while "
1177 		    "mopping in progress: port: %d", port);
1178 		mutex_exit(&ahci_portp->ahciport_mutex);
1179 		return (SATA_TRAN_BUSY);
1180 	}
1181 
1182 	if ((ahci_ctlp->ahcictl_cap & AHCI_CAP_NO_MCMDLIST_NONQUEUE) &&
1183 	    (ahci_portp->ahciport_pending_tags != 0)) {
1184 		AHCIDBG1(AHCIDBG_INFO, ahci_ctlp, "ahci_tran_start "
1185 		    "return QUEUE_FULL: port %d because HBA cannot "
1186 		    "use multiple command lists for non-queued commands",
1187 		    port);
1188 		mutex_exit(&ahci_portp->ahciport_mutex);
1189 		return (SATA_TRAN_QUEUE_FULL);
1190 	}
1191 
1192 	if (spkt->satapkt_op_mode &
1193 	    (SATA_OPMODE_SYNCH | SATA_OPMODE_POLLING)) {
1194 		/* We need to do the sync start now */
1195 		if (ahci_do_sync_start(ahci_ctlp, ahci_portp, port,
1196 		    spkt) == AHCI_FAILURE) {
1197 			AHCIDBG1(AHCIDBG_ERRS, ahci_ctlp, "ahci_tran_start "
1198 			    "return QUEUE_FULL: port %d", port);
1199 			mutex_exit(&ahci_portp->ahciport_mutex);
1200 			return (SATA_TRAN_QUEUE_FULL);
1201 		}
1202 	} else {
1203 		/* Async start, using interrupt */
1204 		if (ahci_deliver_satapkt(ahci_ctlp, ahci_portp, port, spkt)
1205 		    == AHCI_FAILURE) {
1206 			spkt->satapkt_reason = SATA_PKT_QUEUE_FULL;
1207 			AHCIDBG1(AHCIDBG_ERRS, ahci_ctlp, "ahci_tran_start "
1208 			    "returning QUEUE_FULL: port %d", port);
1209 			mutex_exit(&ahci_portp->ahciport_mutex);
1210 			return (SATA_TRAN_QUEUE_FULL);
1211 		}
1212 	}
1213 
1214 	AHCIDBG1(AHCIDBG_INFO, ahci_ctlp, "ahci_tran_start "
1215 	    "sata tran accepted: port %d", port);
1216 
1217 	mutex_exit(&ahci_portp->ahciport_mutex);
1218 	return (SATA_TRAN_ACCEPTED);
1219 }
1220 
1221 /*
1222  * SATA_OPMODE_SYNCH flag is set
1223  *
1224  * If SATA_OPMODE_POLLING flag is set, then we must poll the command
1225  * without interrupt, otherwise we can still use the interrupt.
1226  *
1227  * WARNING!!! ahciport_mutex should be acquired before the function
1228  * is called.
1229  */
1230 static int
1231 ahci_do_sync_start(ahci_ctl_t *ahci_ctlp, ahci_port_t *ahci_portp,
1232     uint8_t port, sata_pkt_t *spkt)
1233 {
1234 	int pkt_timeout_ticks;
1235 	uint32_t timeout_tags;
1236 	uint32_t retrieve_errinfo_slot_status = 0;
1237 	int rval;
1238 
1239 	AHCIDBG2(AHCIDBG_ENTRY, ahci_ctlp, "ahci_do_sync_start enter: "
1240 	    "port %d spkt 0x%p", port, spkt);
1241 
1242 	if (spkt->satapkt_op_mode & SATA_OPMODE_POLLING) {
1243 		/* Disable the port interrupt */
1244 		ahci_disable_port_intrs(ahci_ctlp, ahci_portp, port);
1245 		ahci_portp->ahciport_flags |= AHCI_PORT_FLAG_POLLING;
1246 
1247 		if ((rval = ahci_deliver_satapkt(ahci_ctlp, ahci_portp,
1248 		    port, spkt)) == AHCI_FAILURE) {
1249 			ahci_portp->ahciport_flags &= ~ AHCI_PORT_FLAG_POLLING;
1250 			ahci_enable_port_intrs(ahci_ctlp, ahci_portp, port);
1251 			return (rval);
1252 		}
1253 
1254 		pkt_timeout_ticks =
1255 		    drv_usectohz((clock_t)spkt->satapkt_time * 1000000);
1256 
1257 		/*
1258 		 * AHCI_PORT_FLAG_RQSENSE means the command is the REQUEST
1259 		 * SENSE which is sent down to retrieve sense data during
1260 		 * error recovery, so we need to keep the slot number of it
1261 		 * in order to handle it's completion.
1262 		 */
1263 		if (ahci_portp->ahciport_flags & AHCI_PORT_FLAG_RQSENSE) {
1264 			/* rval is the allocated command slot */
1265 			retrieve_errinfo_slot_status = 0x1 << rval;
1266 		}
1267 
1268 		while (spkt->satapkt_reason == SATA_PKT_BUSY) {
1269 			mutex_exit(&ahci_portp->ahciport_mutex);
1270 
1271 			/* Simulate the interrupt */
1272 			ahci_port_intr(ahci_ctlp, ahci_portp, port,
1273 			    retrieve_errinfo_slot_status);
1274 
1275 			drv_usecwait(AHCI_1MS_USECS);
1276 
1277 			mutex_enter(&ahci_portp->ahciport_mutex);
1278 			pkt_timeout_ticks -= AHCI_1MS_TICKS;
1279 			if (pkt_timeout_ticks < 0) {
1280 				cmn_err(CE_NOTE, "!ahci_do_sync_start: "
1281 				    "port %d satapkt 0x%p timed out\n",
1282 				    port, (void *)spkt);
1283 				timeout_tags = (0x1 << rval);
1284 				mutex_exit(&ahci_portp->ahciport_mutex);
1285 				ahci_timeout_pkts(ahci_ctlp, ahci_portp,
1286 				    port, timeout_tags,
1287 				    retrieve_errinfo_slot_status);
1288 				mutex_enter(&ahci_portp->ahciport_mutex);
1289 			}
1290 		}
1291 		ahci_portp->ahciport_flags &= ~AHCI_PORT_FLAG_POLLING;
1292 		/* Enable the port interrupt */
1293 		ahci_enable_port_intrs(ahci_ctlp, ahci_portp, port);
1294 		return (AHCI_SUCCESS);
1295 
1296 	} else {
1297 		if ((rval = ahci_deliver_satapkt(ahci_ctlp, ahci_portp,
1298 		    port, spkt)) == AHCI_FAILURE)
1299 			return (rval);
1300 
1301 		while (spkt->satapkt_reason == SATA_PKT_BUSY)
1302 			cv_wait(&ahci_portp->ahciport_cv,
1303 			    &ahci_portp->ahciport_mutex);
1304 
1305 		return (AHCI_SUCCESS);
1306 	}
1307 }
1308 
1309 #define	SENDUP_PACKET(ahci_portp, satapkt, reason)			\
1310 	if (satapkt) {							\
1311 		satapkt->satapkt_reason = reason;			\
1312 		/*							\
1313 		 * We set the satapkt_reason in both sync and		\
1314 		 * non-sync cases.					\
1315 		 */							\
1316 	}								\
1317 	if (satapkt &&							\
1318 	    ! (satapkt->satapkt_op_mode & SATA_OPMODE_SYNCH) &&		\
1319 	    satapkt->satapkt_comp) {					\
1320 		mutex_exit(&ahci_portp->ahciport_mutex);		\
1321 		(*satapkt->satapkt_comp)(satapkt);			\
1322 		mutex_enter(&ahci_portp->ahciport_mutex);		\
1323 	} else {							\
1324 		if (satapkt &&						\
1325 		    (satapkt->satapkt_op_mode & SATA_OPMODE_SYNCH) &&	\
1326 		    ! (satapkt->satapkt_op_mode & SATA_OPMODE_POLLING))	\
1327 			cv_signal(&ahci_portp->ahciport_cv);		\
1328 	}
1329 
1330 /*
1331  * Searches for and claims a free slot.
1332  *
1333  * Returns:     AHCI_FAILURE if no slots found
1334  *              claimed slot number if successful
1335  *
1336  * WARNING!!! ahciport_mutex should be acquired before the function
1337  * is called.
1338  */
1339 /*ARGSUSED*/
1340 static int
1341 ahci_claim_free_slot(ahci_ctl_t *ahci_ctlp, ahci_port_t *ahci_portp)
1342 {
1343 	uint32_t free_slots;
1344 	int slot;
1345 
1346 	AHCIDBG1(AHCIDBG_ENTRY, ahci_ctlp, "ahci_claim_free_slot enter "
1347 	    "ahciport_pending_tags = 0x%x",
1348 	    ahci_portp->ahciport_pending_tags);
1349 
1350 	free_slots = (~ahci_portp->ahciport_pending_tags)
1351 	    & AHCI_SLOT_MASK(ahci_ctlp);
1352 
1353 	slot = ddi_ffs(free_slots) - 1;
1354 	if (slot == -1) {
1355 		AHCIDBG0(AHCIDBG_VERBOSE, ahci_ctlp,
1356 		    "ahci_claim_free_slot: no empty slots");
1357 		return (AHCI_FAILURE);
1358 	}
1359 
1360 	ahci_portp->ahciport_pending_tags |= (0x1 << slot);
1361 
1362 	AHCIDBG1(AHCIDBG_VERBOSE, ahci_ctlp,
1363 	    "ahci_claim_free_slot: found slot: 0x%x", slot);
1364 
1365 	return (slot);
1366 }
1367 
1368 /*
1369  * Builds the Command Table for the sata packet and delivers it to controller.
1370  *
1371  * Returns:
1372  * 	slot number if we can obtain a slot successfully
1373  *	otherwise, return AHCI_FAILURE
1374  *
1375  * WARNING!!! ahciport_mutex should be acquired before the function is called.
1376  */
1377 static int
1378 ahci_deliver_satapkt(ahci_ctl_t *ahci_ctlp, ahci_port_t *ahci_portp,
1379     uint8_t port, sata_pkt_t *spkt)
1380 {
1381 	int cmd_slot;
1382 	sata_cmd_t *scmd;
1383 	ahci_fis_h2d_register_t *h2d_register_fisp;
1384 	ahci_cmd_table_t *cmd_table;
1385 	ahci_cmd_header_t *cmd_header;
1386 	int ncookies;
1387 	int i;
1388 #if AHCI_DEBUG
1389 	uint32_t *ptr;
1390 	uint8_t *ptr2;
1391 #endif
1392 
1393 	spkt->satapkt_reason = SATA_PKT_BUSY;
1394 
1395 	scmd = &spkt->satapkt_cmd;
1396 
1397 	/* check if there is an empty command slot */
1398 	cmd_slot = ahci_claim_free_slot(ahci_ctlp, ahci_portp);
1399 	if (cmd_slot == AHCI_FAILURE) {
1400 		AHCIDBG0(AHCIDBG_INFO, ahci_ctlp, "no free slot");
1401 		return (AHCI_FAILURE);
1402 	}
1403 
1404 	AHCIDBG4(AHCIDBG_ENTRY|AHCIDBG_INFO, ahci_ctlp,
1405 	    "ahci_deliver_satapkt enter: cmd_reg: 0x%x, cmd_slot: 0x%x, "
1406 	    "port: %d, satapkt: 0x%p", scmd->satacmd_cmd_reg,
1407 	    cmd_slot, port, (void *)spkt);
1408 
1409 	cmd_table = ahci_portp->ahciport_cmd_tables[cmd_slot];
1410 	bzero((void *)cmd_table, ahci_cmd_table_size);
1411 
1412 	/* for data transfer operations, this is the h2d register fis */
1413 	h2d_register_fisp =
1414 	    &(cmd_table->ahcict_command_fis.ahcifc_fis.ahcifc_h2d_register);
1415 
1416 	SET_FIS_TYPE(h2d_register_fisp, AHCI_H2D_REGISTER_FIS_TYPE);
1417 	if ((spkt->satapkt_device.satadev_addr.qual == SATA_ADDR_PMPORT) ||
1418 	    (spkt->satapkt_device.satadev_addr.qual == SATA_ADDR_DPMPORT)) {
1419 		SET_FIS_PMP(h2d_register_fisp,
1420 		    spkt->satapkt_device.satadev_addr.pmport);
1421 	}
1422 
1423 	SET_FIS_CDMDEVCTL(h2d_register_fisp, 1);
1424 	SET_FIS_COMMAND(h2d_register_fisp, scmd->satacmd_cmd_reg);
1425 	SET_FIS_FEATURES(h2d_register_fisp, scmd->satacmd_features_reg);
1426 	SET_FIS_SECTOR_COUNT(h2d_register_fisp, scmd->satacmd_sec_count_lsb);
1427 
1428 	switch (scmd->satacmd_addr_type) {
1429 
1430 	case ATA_ADDR_LBA:
1431 		/* fallthrough */
1432 
1433 	case ATA_ADDR_LBA28:
1434 		/* LBA[7:0] */
1435 		SET_FIS_SECTOR(h2d_register_fisp, scmd->satacmd_lba_low_lsb);
1436 
1437 		/* LBA[15:8] */
1438 		SET_FIS_CYL_LOW(h2d_register_fisp, scmd->satacmd_lba_mid_lsb);
1439 
1440 		/* LBA[23:16] */
1441 		SET_FIS_CYL_HI(h2d_register_fisp, scmd->satacmd_lba_high_lsb);
1442 
1443 		/* LBA [27:24] (also called dev_head) */
1444 		SET_FIS_DEV_HEAD(h2d_register_fisp, scmd->satacmd_device_reg);
1445 
1446 		break;
1447 
1448 	case ATA_ADDR_LBA48:
1449 		/* LBA[7:0] */
1450 		SET_FIS_SECTOR(h2d_register_fisp, scmd->satacmd_lba_low_lsb);
1451 
1452 		/* LBA[15:8] */
1453 		SET_FIS_CYL_LOW(h2d_register_fisp, scmd->satacmd_lba_mid_lsb);
1454 
1455 		/* LBA[23:16] */
1456 		SET_FIS_CYL_HI(h2d_register_fisp, scmd->satacmd_lba_high_lsb);
1457 
1458 		/* LBA [31:24] */
1459 		SET_FIS_SECTOR_EXP(h2d_register_fisp,
1460 		    scmd->satacmd_lba_low_msb);
1461 
1462 		/* LBA [39:32] */
1463 		SET_FIS_CYL_LOW_EXP(h2d_register_fisp,
1464 		    scmd->satacmd_lba_mid_msb);
1465 
1466 		/* LBA [47:40] */
1467 		SET_FIS_CYL_HI_EXP(h2d_register_fisp,
1468 		    scmd->satacmd_lba_high_msb);
1469 
1470 		/* Set dev_head */
1471 		SET_FIS_DEV_HEAD(h2d_register_fisp,
1472 		    scmd->satacmd_device_reg);
1473 
1474 		/* Set the extended sector count and features */
1475 		SET_FIS_SECTOR_COUNT_EXP(h2d_register_fisp,
1476 		    scmd->satacmd_sec_count_msb);
1477 		SET_FIS_FEATURES_EXP(h2d_register_fisp,
1478 		    scmd->satacmd_features_reg_ext);
1479 		break;
1480 	}
1481 
1482 	ncookies = scmd->satacmd_num_dma_cookies;
1483 	AHCIDBG2(AHCIDBG_INFO, ahci_ctlp,
1484 	    "ncookies = 0x%x, ahci_dma_prdt_number = 0x%x",
1485 	    ncookies, ahci_dma_prdt_number);
1486 
1487 	ASSERT(ncookies <= ahci_dma_prdt_number);
1488 
1489 	/* *** now fill the scatter gather list ******* */
1490 	for (i = 0; i < ncookies; i++) {
1491 		cmd_table->ahcict_prdt[i].ahcipi_data_base_addr =
1492 		    scmd->satacmd_dma_cookie_list[i]._dmu._dmac_la[0];
1493 		cmd_table->ahcict_prdt[i].ahcipi_data_base_addr_upper =
1494 		    scmd->satacmd_dma_cookie_list[i]._dmu._dmac_la[1];
1495 		cmd_table->ahcict_prdt[i].ahcipi_descr_info =
1496 		    scmd->satacmd_dma_cookie_list[i].dmac_size - 1;
1497 	}
1498 
1499 	/* The ACMD field is filled in for ATAPI command */
1500 	if (scmd->satacmd_cmd_reg == SATAC_PACKET) {
1501 		bcopy(scmd->satacmd_acdb, cmd_table->ahcict_atapi_cmd,
1502 		    SATA_ATAPI_MAX_CDB_LEN);
1503 		/*
1504 		 * For ATAPI command, scmd->satacmd_addr_type is 0
1505 		 */
1506 		SET_FIS_CYL_LOW(h2d_register_fisp, scmd->satacmd_lba_mid_lsb);
1507 		SET_FIS_CYL_HI(h2d_register_fisp, scmd->satacmd_lba_high_lsb);
1508 	}
1509 
1510 	/* Set Command Header in Command List */
1511 	cmd_header = &ahci_portp->ahciport_cmd_list[cmd_slot];
1512 	BZERO_DESCR_INFO(cmd_header);
1513 	BZERO_PRD_BYTE_COUNT(cmd_header);
1514 
1515 	/* Set the number of entries in the PRD table */
1516 	SET_PRD_TABLE_LENGTH(cmd_header, ncookies);
1517 
1518 	/* Set the length of the command in the CFIS area */
1519 	SET_COMMAND_FIS_LENGTH(cmd_header, AHCI_H2D_REGISTER_FIS_LENGTH);
1520 
1521 	AHCIDBG1(AHCIDBG_INFO, ahci_ctlp, "command data direction is "
1522 	    "sata_data_direction = 0x%x",
1523 	    scmd->satacmd_flags.sata_data_direction);
1524 
1525 	/* Set A bit if it is an ATAPI command */
1526 	if (scmd->satacmd_cmd_reg == SATAC_PACKET)
1527 		SET_ATAPI(cmd_header, AHCI_CMDHEAD_ATAPI);
1528 
1529 	/* Set W bit if data is going to the device */
1530 	if (scmd->satacmd_flags.sata_data_direction == SATA_DIR_WRITE)
1531 		SET_WRITE(cmd_header, AHCI_CMDHEAD_DATA_WRITE);
1532 
1533 	/*
1534 	 * Set the prefetchable bit - this bit is only valid if the PRDTL
1535 	 * field is non-zero or the ATAPI 'A' bit is set in the command
1536 	 * header. This bit cannot be set when using native command
1537 	 * queuing commands or when using FIS-based switching with a Port
1538 	 * Multiplier. At the moment, the driver doesn't support these two
1539 	 * functions, so it's always setting the 'P' bit.
1540 	 */
1541 	SET_PREFETCHABLE(cmd_header, AHCI_CMDHEAD_PREFETCHABLE);
1542 
1543 	/* Now remember the sata packet in ahciport_slot_pkts[]. */
1544 	ahci_portp->ahciport_slot_pkts[cmd_slot] = spkt;
1545 
1546 	/*
1547 	 * We are overloading satapkt_hba_driver_private with
1548 	 * watched_cycle count.
1549 	 */
1550 	spkt->satapkt_hba_driver_private = (void *)(intptr_t)0;
1551 
1552 #if AHCI_DEBUG
1553 	/* Dump the command header and table */
1554 	AHCIDBG0(AHCIDBG_COMMAND, ahci_ctlp, "\n");
1555 	AHCIDBG3(AHCIDBG_COMMAND, ahci_ctlp,
1556 	    "Command header&table for spkt 0x%p cmd_reg 0x%x port%d",
1557 	    spkt, scmd->satacmd_cmd_reg, port);
1558 	ptr = (uint32_t *)cmd_header;
1559 	AHCIDBG4(AHCIDBG_COMMAND, ahci_ctlp,
1560 	    "  Command Header:%8x %8x %8x %8x",
1561 	    ptr[0], ptr[1], ptr[2], ptr[3]);
1562 
1563 	/* Dump the H2D register FIS */
1564 	ptr = (uint32_t *)h2d_register_fisp;
1565 	AHCIDBG4(AHCIDBG_COMMAND, ahci_ctlp,
1566 	    "  Command FIS:   %8x %8x %8x %8x",
1567 	    ptr[0], ptr[1], ptr[2], ptr[3]);
1568 
1569 	/* Dump the ACMD register FIS */
1570 	ptr2 = (uint8_t *)&(cmd_table->ahcict_atapi_cmd);
1571 	for (i = 0; i < SATA_ATAPI_MAX_CDB_LEN/8; i++)
1572 		if (ahci_debug_flags & AHCIDBG_COMMAND)
1573 			ahci_log(ahci_ctlp, CE_WARN,
1574 			    "  ATAPI command: %2x %2x %2x %2x "
1575 			    "%2x %2x %2x %2x",
1576 			    ptr2[8 * i], ptr2[8 * i + 1],
1577 			    ptr2[8 * i + 2], ptr2[8 * i + 3],
1578 			    ptr2[8 * i + 4], ptr2[8 * i + 5],
1579 			    ptr2[8 * i + 6], ptr2[8 * i + 7]);
1580 
1581 	/* Dump the PRDT */
1582 	for (i = 0; i < ncookies; i++) {
1583 		ptr = (uint32_t *)&(cmd_table->ahcict_prdt[i]);
1584 		AHCIDBG5(AHCIDBG_COMMAND, ahci_ctlp,
1585 		    "  Cookie %d:      %8x %8x %8x %8x",
1586 		    i, ptr[0], ptr[1], ptr[2], ptr[3]);
1587 	}
1588 #endif
1589 
1590 	(void) ddi_dma_sync(
1591 	    ahci_portp->ahciport_cmd_tables_dma_handle[cmd_slot],
1592 	    0,
1593 	    ahci_cmd_table_size,
1594 	    DDI_DMA_SYNC_FORDEV);
1595 
1596 	(void) ddi_dma_sync(ahci_portp->ahciport_cmd_list_dma_handle,
1597 	    cmd_slot * sizeof (ahci_cmd_header_t),
1598 	    sizeof (ahci_cmd_header_t),
1599 	    DDI_DMA_SYNC_FORDEV);
1600 
1601 	/* Indicate to the HBA that a command is active. */
1602 	ddi_put32(ahci_ctlp->ahcictl_ahci_acc_handle,
1603 	    (uint32_t *)AHCI_PORT_PxCI(ahci_ctlp, port),
1604 	    (0x1 << cmd_slot));
1605 
1606 	AHCIDBG1(AHCIDBG_INFO, ahci_ctlp, "ahci_deliver_satapkt "
1607 	    "exit: port %d", port);
1608 
1609 	return (cmd_slot);
1610 }
1611 
1612 /*
1613  * Called by the sata framework to abort the previously sent packet(s).
1614  *
1615  * Reset device to abort commands.
1616  */
1617 static int
1618 ahci_tran_abort(dev_info_t *dip, sata_pkt_t *spkt, int flag)
1619 {
1620 	ahci_ctl_t *ahci_ctlp;
1621 	ahci_port_t *ahci_portp;
1622 	uint32_t slot_status;
1623 	uint32_t aborted_tags, finished_tags;
1624 	uint8_t cport = spkt->satapkt_device.satadev_addr.cport;
1625 	uint8_t port;
1626 	int tmp_slot;
1627 
1628 	ahci_ctlp = ddi_get_soft_state(ahci_statep, ddi_get_instance(dip));
1629 	port = ahci_ctlp->ahcictl_cport_to_port[cport];
1630 
1631 	AHCIDBG1(AHCIDBG_ENTRY, ahci_ctlp,
1632 	    "ahci_tran_abort enter: port %d", port);
1633 
1634 	ahci_portp = ahci_ctlp->ahcictl_ports[port];
1635 	mutex_enter(&ahci_portp->ahciport_mutex);
1636 
1637 	/*
1638 	 * If AHCI_PORT_FLAG_MOPPING flag is set, it means all the pending
1639 	 * commands are being mopped, therefore there is nothing else to do
1640 	 */
1641 	if (ahci_portp->ahciport_flags & AHCI_PORT_FLAG_MOPPING) {
1642 		AHCIDBG1(AHCIDBG_INFO, ahci_ctlp,
1643 		    "ahci_tran_abort: port %d is in "
1644 		    "mopping process, so just return directly ", port);
1645 		mutex_exit(&ahci_portp->ahciport_mutex);
1646 		return (SATA_SUCCESS);
1647 	}
1648 
1649 	if (ahci_portp->ahciport_port_state & SATA_PSTATE_FAILED |
1650 	    ahci_portp->ahciport_port_state & SATA_PSTATE_SHUTDOWN |
1651 	    ahci_portp->ahciport_port_state & SATA_PSTATE_PWROFF) {
1652 		/*
1653 		 * In case the targer driver would send the request before
1654 		 * sata framework can have the opportunity to process those
1655 		 * event reports.
1656 		 */
1657 		spkt->satapkt_reason = SATA_PKT_PORT_ERROR;
1658 		spkt->satapkt_device.satadev_state =
1659 		    ahci_portp->ahciport_port_state;
1660 		ahci_update_sata_registers(ahci_ctlp, port,
1661 		    &spkt->satapkt_device);
1662 		AHCIDBG1(AHCIDBG_ERRS, ahci_ctlp,
1663 		    "ahci_tran_abort returning SATA_FAILURE while "
1664 		    "port in FAILED/SHUTDOWN/PWROFF state: "
1665 		    "port: %d", port);
1666 		mutex_exit(&ahci_portp->ahciport_mutex);
1667 		return (SATA_FAILURE);
1668 	}
1669 
1670 	if (ahci_portp->ahciport_device_type == SATA_DTYPE_NONE) {
1671 		/*
1672 		 * ahci_intr_phyrdy_change() may have rendered it to
1673 		 * AHCI_PORT_TYPE_NODEV.
1674 		 */
1675 		spkt->satapkt_reason = SATA_PKT_PORT_ERROR;
1676 		spkt->satapkt_device.satadev_type = SATA_DTYPE_NONE;
1677 		spkt->satapkt_device.satadev_state =
1678 		    ahci_portp->ahciport_port_state;
1679 		ahci_update_sata_registers(ahci_ctlp, port,
1680 		    &spkt->satapkt_device);
1681 		AHCIDBG1(AHCIDBG_ERRS, ahci_ctlp,
1682 		    "ahci_tran_abort returning SATA_FAILURE while "
1683 		    "no device attached: port: %d", port);
1684 		mutex_exit(&ahci_portp->ahciport_mutex);
1685 		return (SATA_FAILURE);
1686 	}
1687 
1688 	if (flag == SATA_ABORT_ALL_PACKETS) {
1689 		aborted_tags = ahci_portp->ahciport_pending_tags;
1690 		cmn_err(CE_NOTE, "!ahci port %d abort all packets", port);
1691 	} else {
1692 		aborted_tags = 0xffffffff;
1693 		/*
1694 		 * Aborting one specific packet, first search our
1695 		 * ahciport_slot_pkts[] list for matching spkt.
1696 		 */
1697 		for (tmp_slot = 0;
1698 		    tmp_slot < ahci_ctlp->ahcictl_num_cmd_slots; tmp_slot++) {
1699 			if (ahci_portp->ahciport_slot_pkts[tmp_slot] == spkt) {
1700 				aborted_tags = (0x1 << tmp_slot);
1701 				break;
1702 			}
1703 		}
1704 
1705 		if (aborted_tags == 0xffffffff) {
1706 			/* request packet is not on the pending list */
1707 			AHCIDBG1(AHCIDBG_INFO, ahci_ctlp,
1708 			    "Cannot find the aborting pkt 0x%p on the "
1709 			    "pending list", (void *)spkt);
1710 			ahci_update_sata_registers(ahci_ctlp, port,
1711 			    &spkt->satapkt_device);
1712 			mutex_exit(&ahci_portp->ahciport_mutex);
1713 			return (SATA_FAILURE);
1714 		}
1715 		cmn_err(CE_NOTE, "!ahci port %d abort satapkt 0x%p",
1716 		    port, (void *)spkt);
1717 	}
1718 
1719 	slot_status = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle,
1720 	    (uint32_t *)AHCI_PORT_PxCI(ahci_ctlp, port));
1721 
1722 	ahci_portp->ahciport_flags |= AHCI_PORT_FLAG_MOPPING;
1723 	ahci_portp->ahciport_mop_in_progress++;
1724 
1725 	/*
1726 	 * To abort the packet(s), first we are trying to clear PxCMD.ST
1727 	 * to stop the port, and if the port can be stopped
1728 	 * successfully with PxTFD.STS.BSY and PxTFD.STS.DRQ cleared to '0',
1729 	 * then we just send back the aborted packet(s) with ABORTED flag
1730 	 * and then restart the port by setting PxCMD.ST and PxCMD.FRE.
1731 	 * If PxTFD.STS.BSY or PxTFD.STS.DRQ is set to '1', then we
1732 	 * perform a COMRESET.
1733 	 */
1734 	(void) ahci_restart_port_wait_till_ready(ahci_ctlp,
1735 	    ahci_portp, port, NULL, NULL);
1736 
1737 	/*
1738 	 * Compute which have finished and which need to be retried.
1739 	 *
1740 	 * The finished tags are ahciport_pending_tags minus the slot_status.
1741 	 * The aborted_tags have to be reduced by finished_tags since we
1742 	 * can't possibly abort a tag which had finished already.
1743 	 */
1744 	finished_tags = ahci_portp->ahciport_pending_tags &
1745 	    ~slot_status & AHCI_SLOT_MASK(ahci_ctlp);
1746 
1747 	aborted_tags &= ~finished_tags;
1748 
1749 	ahci_mop_commands(ahci_ctlp,
1750 	    ahci_portp,
1751 	    port,
1752 	    slot_status,
1753 	    0, /* failed tags */
1754 	    0, /* timeout tags */
1755 	    aborted_tags,
1756 	    0); /* reset tags */
1757 
1758 	ahci_update_sata_registers(ahci_ctlp, port, &spkt->satapkt_device);
1759 	mutex_exit(&ahci_portp->ahciport_mutex);
1760 
1761 	return (SATA_SUCCESS);
1762 }
1763 
1764 /*
1765  * Used to do device reset and reject all the pending packets on a device
1766  * during the reset operation.
1767  *
1768  * WARNING!!! ahciport_mutex should be acquired before the function is called.
1769  */
1770 static int
1771 ahci_reset_device_reject_pkts(ahci_ctl_t *ahci_ctlp,
1772     ahci_port_t *ahci_portp, uint8_t port)
1773 {
1774 	uint32_t slot_status;
1775 	uint32_t reset_tags, finished_tags;
1776 	sata_device_t sdevice;
1777 	int ret;
1778 
1779 	AHCIDBG1(AHCIDBG_ENTRY, ahci_ctlp,
1780 	    "ahci_reset_device_reject_pkts on port: %d", port);
1781 
1782 	/*
1783 	 * If AHCI_PORT_FLAG_MOPPING flag is set, it means all the pending
1784 	 * commands are being mopped, therefore there is nothing else to do
1785 	 */
1786 	if (ahci_portp->ahciport_flags & AHCI_PORT_FLAG_MOPPING) {
1787 		AHCIDBG1(AHCIDBG_ERRS, ahci_ctlp,
1788 		    "ahci_reset_device_reject_pkts: port %d is in "
1789 		    "mopping process, so return directly ", port);
1790 		return (SATA_SUCCESS);
1791 	}
1792 
1793 	slot_status = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle,
1794 	    (uint32_t *)AHCI_PORT_PxCI(ahci_ctlp, port));
1795 
1796 	reset_tags = slot_status & AHCI_SLOT_MASK(ahci_ctlp);
1797 
1798 	if (ahci_software_reset(ahci_ctlp, ahci_portp, port)
1799 	    != AHCI_SUCCESS) {
1800 		AHCIDBG1(AHCIDBG_ERRS, ahci_ctlp,
1801 		    "Try to do a port reset after software "
1802 		    "reset failed", port);
1803 		ret = ahci_port_reset(ahci_ctlp, ahci_portp, port);
1804 		if (ret != AHCI_SUCCESS) {
1805 			AHCIDBG1(AHCIDBG_ERRS, ahci_ctlp,
1806 			    "ahci_reset_device_reject_pkts: port %d "
1807 			    "failed", port);
1808 			return (SATA_FAILURE);
1809 		}
1810 	}
1811 	/* Set the reset in progress flag */
1812 	ahci_portp->ahciport_reset_in_progress = 1;
1813 
1814 	ahci_portp->ahciport_flags |= AHCI_PORT_FLAG_MOPPING;
1815 	ahci_portp->ahciport_mop_in_progress++;
1816 
1817 	/* Indicate to the framework that a reset has happened */
1818 	bzero((void *)&sdevice, sizeof (sata_device_t));
1819 	sdevice.satadev_addr.cport = ahci_ctlp->ahcictl_port_to_cport[port];
1820 	sdevice.satadev_addr.pmport = 0;
1821 	sdevice.satadev_addr.qual = SATA_ADDR_DCPORT;
1822 
1823 	sdevice.satadev_state = SATA_DSTATE_RESET |
1824 	    SATA_DSTATE_PWR_ACTIVE;
1825 	mutex_exit(&ahci_portp->ahciport_mutex);
1826 	sata_hba_event_notify(
1827 	    ahci_ctlp->ahcictl_sata_hba_tran->sata_tran_hba_dip,
1828 	    &sdevice,
1829 	    SATA_EVNT_DEVICE_RESET);
1830 	mutex_enter(&ahci_portp->ahciport_mutex);
1831 
1832 	AHCIDBG1(AHCIDBG_EVENT, ahci_ctlp,
1833 	    "port %d sending event up: SATA_EVNT_RESET", port);
1834 
1835 	/* Next try to mop the pending commands */
1836 	finished_tags = ahci_portp->ahciport_pending_tags &
1837 	    ~slot_status & AHCI_SLOT_MASK(ahci_ctlp);
1838 
1839 	reset_tags &= ~finished_tags;
1840 
1841 	ahci_mop_commands(ahci_ctlp,
1842 	    ahci_portp,
1843 	    port,
1844 	    slot_status,
1845 	    0, /* failed tags */
1846 	    0, /* timeout tags */
1847 	    0, /* aborted tags */
1848 	    reset_tags); /* reset tags */
1849 
1850 	return (SATA_SUCCESS);
1851 }
1852 
1853 /*
1854  * Used to do port reset and reject all the pending packets on a port during
1855  * the reset operation.
1856  *
1857  * WARNING!!! ahciport_mutex should be acquired before the function is called.
1858  */
1859 static int
1860 ahci_reset_port_reject_pkts(ahci_ctl_t *ahci_ctlp,
1861     ahci_port_t *ahci_portp, uint8_t port)
1862 {
1863 	uint32_t slot_status;
1864 	uint32_t reset_tags, finished_tags;
1865 
1866 	AHCIDBG1(AHCIDBG_ENTRY, ahci_ctlp,
1867 	    "ahci_reset_port_reject_pkts on port: %d", port);
1868 
1869 	/*
1870 	 * If AHCI_PORT_FLAG_MOPPING flag is set, it means all the pending
1871 	 * commands are being mopped, therefore there is nothing else to do
1872 	 */
1873 	if (ahci_portp->ahciport_flags & AHCI_PORT_FLAG_MOPPING) {
1874 		AHCIDBG1(AHCIDBG_ERRS, ahci_ctlp,
1875 		    "ahci_reset_port_reject_pkts: port %d is in "
1876 		    "mopping process, so return directly ", port);
1877 		return (SATA_SUCCESS);
1878 	}
1879 
1880 	ahci_portp->ahciport_flags |= AHCI_PORT_FLAG_MOPPING;
1881 	ahci_portp->ahciport_mop_in_progress++;
1882 
1883 	slot_status = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle,
1884 	    (uint32_t *)AHCI_PORT_PxCI(ahci_ctlp, port));
1885 
1886 	reset_tags = slot_status & AHCI_SLOT_MASK(ahci_ctlp);
1887 
1888 	if (ahci_restart_port_wait_till_ready(ahci_ctlp,
1889 	    ahci_portp, port, AHCI_PORT_RESET, NULL) != AHCI_SUCCESS)
1890 		return (SATA_FAILURE);
1891 
1892 	finished_tags = ahci_portp->ahciport_pending_tags &
1893 	    ~slot_status & AHCI_SLOT_MASK(ahci_ctlp);
1894 
1895 	reset_tags &= ~finished_tags;
1896 
1897 	ahci_mop_commands(ahci_ctlp,
1898 	    ahci_portp,
1899 	    port,
1900 	    slot_status,
1901 	    0, /* failed tags */
1902 	    0, /* timeout tags */
1903 	    0, /* aborted tags */
1904 	    reset_tags); /* reset tags */
1905 
1906 	return (SATA_SUCCESS);
1907 }
1908 
1909 /*
1910  * Used to do hba reset and reject all the pending packets on all ports
1911  * during the reset operation.
1912  */
1913 static int
1914 ahci_reset_hba_reject_pkts(ahci_ctl_t *ahci_ctlp)
1915 {
1916 	ahci_port_t *ahci_portp;
1917 	uint32_t slot_status[AHCI_MAX_PORTS];
1918 	uint32_t reset_tags[AHCI_MAX_PORTS];
1919 	uint32_t finished_tags[AHCI_MAX_PORTS];
1920 	sata_device_t sdevice[AHCI_MAX_PORTS];
1921 	uint8_t port;
1922 	int ret = SATA_SUCCESS;
1923 
1924 	AHCIDBG0(AHCIDBG_ENTRY, ahci_ctlp,
1925 	    "ahci_reset_hba_reject_pkts enter");
1926 
1927 	for (port = 0; port < ahci_ctlp->ahcictl_num_ports; port++) {
1928 		if (!AHCI_PORT_IMPLEMENTED(ahci_ctlp, port)) {
1929 			continue;
1930 		}
1931 
1932 		ahci_portp = ahci_ctlp->ahcictl_ports[port];
1933 
1934 		mutex_enter(&ahci_portp->ahciport_mutex);
1935 		slot_status[port] = ddi_get32(
1936 		    ahci_ctlp->ahcictl_ahci_acc_handle,
1937 		    (uint32_t *)AHCI_PORT_PxCI(ahci_ctlp, port));
1938 		reset_tags[port] = slot_status[port]
1939 		    & AHCI_SLOT_MASK(ahci_ctlp);
1940 		mutex_exit(&ahci_portp->ahciport_mutex);
1941 	}
1942 
1943 	if (ahci_hba_reset(ahci_ctlp) != AHCI_SUCCESS) {
1944 		ret = SATA_FAILURE;
1945 		goto out;
1946 	}
1947 
1948 	for (port = 0; port < ahci_ctlp->ahcictl_num_ports; port++) {
1949 		if (!AHCI_PORT_IMPLEMENTED(ahci_ctlp, port)) {
1950 			continue;
1951 		}
1952 
1953 		ahci_portp = ahci_ctlp->ahcictl_ports[port];
1954 
1955 		mutex_enter(&ahci_portp->ahciport_mutex);
1956 		/*
1957 		 * To prevent recursive enter to ahci_mop_commands, we need
1958 		 * check AHCI_PORT_FLAG_MOPPING flag.
1959 		 */
1960 		if (ahci_portp->ahciport_flags & AHCI_PORT_FLAG_MOPPING) {
1961 			AHCIDBG1(AHCIDBG_ERRS, ahci_ctlp,
1962 			    "ahci_reset_hba_reject_pkts: port %d is in "
1963 			    "mopping process, so return directly ", port);
1964 			mutex_exit(&ahci_portp->ahciport_mutex);
1965 			continue;
1966 		}
1967 
1968 		ahci_portp->ahciport_flags |= AHCI_PORT_FLAG_MOPPING;
1969 		ahci_portp->ahciport_mop_in_progress++;
1970 
1971 		/* Indicate to the framework that a reset has happened */
1972 		bzero((void *)&sdevice[port], sizeof (sata_device_t));
1973 		sdevice[port].satadev_addr.cport =
1974 		    ahci_ctlp->ahcictl_port_to_cport[port];
1975 		sdevice[port].satadev_addr.pmport = 0;
1976 		sdevice[port].satadev_addr.qual = SATA_ADDR_DCPORT;
1977 
1978 		sdevice[port].satadev_state = SATA_DSTATE_RESET |
1979 		    SATA_DSTATE_PWR_ACTIVE;
1980 		mutex_exit(&ahci_portp->ahciport_mutex);
1981 		sata_hba_event_notify(
1982 		    ahci_ctlp->ahcictl_sata_hba_tran->sata_tran_hba_dip,
1983 		    &sdevice[port],
1984 		    SATA_EVNT_DEVICE_RESET);
1985 		mutex_enter(&ahci_portp->ahciport_mutex);
1986 
1987 		AHCIDBG1(AHCIDBG_EVENT, ahci_ctlp,
1988 		    "port %d sending event up: SATA_EVNT_RESET",
1989 		    port);
1990 
1991 		finished_tags[port]  = ahci_portp->ahciport_pending_tags &
1992 		    ~slot_status[port] & AHCI_SLOT_MASK(ahci_ctlp);
1993 
1994 		reset_tags[port] &= ~finished_tags[port];
1995 
1996 		ahci_mop_commands(ahci_ctlp,
1997 		    ahci_portp,
1998 		    port,
1999 		    slot_status[port],
2000 		    0, /* failed tags */
2001 		    0, /* timeout tags */
2002 		    0, /* aborted tags */
2003 		    reset_tags[port]); /* reset tags */
2004 		mutex_exit(&ahci_portp->ahciport_mutex);
2005 	}
2006 out:
2007 	return (ret);
2008 }
2009 
2010 /*
2011  * Called by sata framework to reset a port(s) or device.
2012  */
2013 static int
2014 ahci_tran_reset_dport(dev_info_t *dip, sata_device_t *sd)
2015 {
2016 	ahci_ctl_t *ahci_ctlp;
2017 	ahci_port_t *ahci_portp;
2018 	uint8_t cport = sd->satadev_addr.cport;
2019 	uint8_t port;
2020 	int ret = SATA_SUCCESS;
2021 
2022 	ahci_ctlp = ddi_get_soft_state(ahci_statep, ddi_get_instance(dip));
2023 	port = ahci_ctlp->ahcictl_cport_to_port[cport];
2024 
2025 	AHCIDBG1(AHCIDBG_ENTRY, ahci_ctlp,
2026 	    "ahci_tran_reset_port enter: cport: %d", cport);
2027 
2028 	switch (sd->satadev_addr.qual) {
2029 	case SATA_ADDR_CPORT:
2030 		/* Port reset */
2031 		ahci_portp = ahci_ctlp->ahcictl_ports[port];
2032 		cmn_err(CE_NOTE, "!ahci_tran_reset_dport: port %d "
2033 		    "reset port", port);
2034 
2035 		mutex_enter(&ahci_portp->ahciport_mutex);
2036 		ret = ahci_reset_port_reject_pkts(ahci_ctlp, ahci_portp, port);
2037 		mutex_exit(&ahci_portp->ahciport_mutex);
2038 
2039 		break;
2040 
2041 	case SATA_ADDR_DCPORT:
2042 		/* Device reset */
2043 		ahci_portp = ahci_ctlp->ahcictl_ports[port];
2044 		cmn_err(CE_NOTE, "!ahci_tran_reset_dport: port %d "
2045 		    "reset device", port);
2046 
2047 		mutex_enter(&ahci_portp->ahciport_mutex);
2048 		if (ahci_portp->ahciport_port_state & SATA_PSTATE_FAILED |
2049 		    ahci_portp->ahciport_port_state & SATA_PSTATE_SHUTDOWN |
2050 		    ahci_portp->ahciport_port_state & SATA_PSTATE_PWROFF) {
2051 			/*
2052 			 * In case the targer driver would send the request
2053 			 * before sata framework can have the opportunity to
2054 			 * process those event reports.
2055 			 */
2056 			sd->satadev_state = ahci_portp->ahciport_port_state;
2057 			ahci_update_sata_registers(ahci_ctlp, port, sd);
2058 			AHCIDBG1(AHCIDBG_ERRS, ahci_ctlp,
2059 			    "ahci_tran_reset_dport returning SATA_FAILURE "
2060 			    "while port in FAILED/SHUTDOWN/PWROFF state: "
2061 			    "port: %d", port);
2062 			mutex_exit(&ahci_portp->ahciport_mutex);
2063 			ret = SATA_FAILURE;
2064 			break;
2065 		}
2066 
2067 		if (ahci_portp->ahciport_device_type == SATA_DTYPE_NONE) {
2068 			/*
2069 			 * ahci_intr_phyrdy_change() may have rendered it to
2070 			 * AHCI_PORT_TYPE_NODEV.
2071 			 */
2072 			sd->satadev_type = SATA_DTYPE_NONE;
2073 			sd->satadev_state = ahci_portp->ahciport_port_state;
2074 			ahci_update_sata_registers(ahci_ctlp, port, sd);
2075 			AHCIDBG1(AHCIDBG_ERRS, ahci_ctlp,
2076 			    "ahci_tran_reset_dport returning SATA_FAILURE "
2077 			    "while no device attached: port: %d", port);
2078 			mutex_exit(&ahci_portp->ahciport_mutex);
2079 			ret = SATA_FAILURE;
2080 			break;
2081 		}
2082 
2083 		ret = ahci_reset_device_reject_pkts(ahci_ctlp,
2084 		    ahci_portp, port);
2085 		mutex_exit(&ahci_portp->ahciport_mutex);
2086 		break;
2087 
2088 	case SATA_ADDR_CNTRL:
2089 		/* Reset the whole controller */
2090 		cmn_err(CE_NOTE, "!ahci_tran_reset_dport: port %d "
2091 		    "reset the whole hba", port);
2092 		ret = ahci_reset_hba_reject_pkts(ahci_ctlp);
2093 		break;
2094 
2095 	case SATA_ADDR_PMPORT:
2096 	case SATA_ADDR_DPMPORT:
2097 		AHCIDBG0(AHCIDBG_INFO, ahci_ctlp,
2098 		    "ahci_tran_reset_dport: port multiplier will be "
2099 		    "supported later");
2100 		/* FALLSTHROUGH */
2101 	default:
2102 		ret = SATA_FAILURE;
2103 	}
2104 
2105 	return (ret);
2106 }
2107 
2108 /*
2109  * Called by sata framework to activate a port as part of hotplug.
2110  * (cfgadm -c connect satax/y)
2111  * Note: Not port-mult aware.
2112  */
2113 static int
2114 ahci_tran_hotplug_port_activate(dev_info_t *dip, sata_device_t *satadev)
2115 {
2116 	ahci_ctl_t *ahci_ctlp;
2117 	ahci_port_t *ahci_portp;
2118 	uint8_t	cport = satadev->satadev_addr.cport;
2119 	uint8_t port;
2120 
2121 	ahci_ctlp = ddi_get_soft_state(ahci_statep, ddi_get_instance(dip));
2122 	port = ahci_ctlp->ahcictl_cport_to_port[cport];
2123 
2124 	AHCIDBG1(AHCIDBG_ENTRY, ahci_ctlp,
2125 	    "ahci_tran_hotplug_port_activate cport %d enter", cport);
2126 
2127 	ahci_portp = ahci_ctlp->ahcictl_ports[port];
2128 
2129 	mutex_enter(&ahci_portp->ahciport_mutex);
2130 	cmn_err(CE_NOTE, "!ahci port %d is activated", port);
2131 
2132 	/*
2133 	 * Reset the port so that the PHY communication would be re-established.
2134 	 * But this reset is an internal operation and the sata module doesn't
2135 	 * need to know about it. Moreover, the port with a device attached will
2136 	 * be started too.
2137 	 */
2138 	(void) ahci_restart_port_wait_till_ready(ahci_ctlp,
2139 	    ahci_portp, port,
2140 	    AHCI_PORT_RESET|AHCI_RESET_NO_EVENTS_UP,
2141 	    NULL);
2142 
2143 	/*
2144 	 * Need to check the link status and device status of the port
2145 	 * and consider raising power if the port was in D3 state
2146 	 */
2147 	ahci_portp->ahciport_port_state |= SATA_PSTATE_PWRON;
2148 	ahci_portp->ahciport_port_state &= ~SATA_PSTATE_PWROFF;
2149 	ahci_portp->ahciport_port_state &= ~SATA_PSTATE_SHUTDOWN;
2150 
2151 	satadev->satadev_state = ahci_portp->ahciport_port_state;
2152 
2153 	ahci_update_sata_registers(ahci_ctlp, port, satadev);
2154 
2155 	mutex_exit(&ahci_portp->ahciport_mutex);
2156 	return (SATA_SUCCESS);
2157 }
2158 
2159 /*
2160  * Called by sata framework to deactivate a port as part of hotplug.
2161  * (cfgadm -c disconnect satax/y)
2162  * Note: Not port-mult aware.
2163  */
2164 static int
2165 ahci_tran_hotplug_port_deactivate(dev_info_t *dip, sata_device_t *satadev)
2166 {
2167 	ahci_ctl_t *ahci_ctlp;
2168 	ahci_port_t *ahci_portp;
2169 	uint8_t cport = satadev->satadev_addr.cport;
2170 	uint8_t port;
2171 	uint32_t port_scontrol;
2172 
2173 	ahci_ctlp = ddi_get_soft_state(ahci_statep, ddi_get_instance(dip));
2174 	port = ahci_ctlp->ahcictl_cport_to_port[cport];
2175 
2176 	AHCIDBG1(AHCIDBG_ENTRY, ahci_ctlp,
2177 	    "ahci_tran_hotplug_port_deactivate cport %d enter", cport);
2178 
2179 	ahci_portp = ahci_ctlp->ahcictl_ports[port];
2180 
2181 	mutex_enter(&ahci_portp->ahciport_mutex);
2182 	cmn_err(CE_NOTE, "!ahci port %d is deactivated", port);
2183 
2184 	/* Disable the interrupts on the port */
2185 	ahci_disable_port_intrs(ahci_ctlp, ahci_portp, port);
2186 
2187 	if (ahci_portp->ahciport_device_type == SATA_DTYPE_NONE) {
2188 		goto phy_offline;
2189 	}
2190 
2191 	/* First to abort all the pending commands */
2192 	ahci_reject_all_abort_pkts(ahci_ctlp, ahci_portp, port);
2193 
2194 	/* Then stop the port */
2195 	(void) ahci_put_port_into_notrunning_state(ahci_ctlp,
2196 	    ahci_portp, port);
2197 
2198 	/* Next put the PHY offline */
2199 
2200 phy_offline:
2201 	port_scontrol = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle,
2202 	    (uint32_t *)AHCI_PORT_PxSCTL(ahci_ctlp, port));
2203 	AHCI_SCONTROL_SET_DET(port_scontrol, AHCI_SCONTROL_DET_PHYOFFLINE);
2204 
2205 	/* Update ahciport_port_state */
2206 	ahci_portp->ahciport_port_state = SATA_PSTATE_SHUTDOWN;
2207 	satadev->satadev_state = ahci_portp->ahciport_port_state;
2208 
2209 	ahci_update_sata_registers(ahci_ctlp, port, satadev);
2210 
2211 	mutex_exit(&ahci_portp->ahciport_mutex);
2212 	return (SATA_SUCCESS);
2213 }
2214 
2215 /*
2216  * To be used to mark all the outstanding pkts with SATA_PKT_ABORTED
2217  * when a device is unplugged or a port is deactivated.
2218  *
2219  * WARNING!!! ahciport_mutex should be acquired before the function is called.
2220  */
2221 static void
2222 ahci_reject_all_abort_pkts(ahci_ctl_t *ahci_ctlp,
2223     ahci_port_t *ahci_portp, uint8_t port)
2224 {
2225 	uint32_t slot_status;
2226 	uint32_t abort_tags;
2227 
2228 	AHCIDBG1(AHCIDBG_ENTRY|AHCIDBG_INTR, ahci_ctlp,
2229 	    "ahci_reject_all_abort_pkts on port: %d", port);
2230 
2231 	slot_status = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle,
2232 	    (uint32_t *)AHCI_PORT_PxCI(ahci_ctlp, port));
2233 	abort_tags = slot_status & AHCI_SLOT_MASK(ahci_ctlp);
2234 
2235 	/* No need to do mop when there is no outstanding commands */
2236 	if (slot_status != 0) {
2237 		/*
2238 		 * We need to do the mop even AHCI_PORT_FLAG_MOPPING is
2239 		 * already set because during error recovery process, the
2240 		 * REQUEST SENSE command can be delivered to HBA to get
2241 		 * sense data, so when the device is removed, the command
2242 		 * need to be aborted too. And for this kind of condition,
2243 		 * we can make sure the abort_tags is just the REQUEST
2244 		 * SENSE slot number.
2245 		 */
2246 		ahci_portp->ahciport_flags |= AHCI_PORT_FLAG_MOPPING;
2247 		ahci_portp->ahciport_mop_in_progress++;
2248 
2249 		ahci_mop_commands(ahci_ctlp,
2250 		    ahci_portp,
2251 		    port,
2252 		    slot_status,
2253 		    0, /* failed tags */
2254 		    0, /* timeout tags */
2255 		    abort_tags, /* aborting tags */
2256 		    0); /* reset tags */
2257 	}
2258 }
2259 
2260 #if defined(__lock_lint)
2261 static int
2262 ahci_selftest(dev_info_t *dip, sata_device_t *device)
2263 {
2264 	return (SATA_SUCCESS);
2265 }
2266 #endif
2267 
2268 /*
2269  * Allocate the ports structure, only called by ahci_attach
2270  */
2271 static int
2272 ahci_alloc_ports_state(ahci_ctl_t *ahci_ctlp)
2273 {
2274 	int port, cport = 0;
2275 
2276 	AHCIDBG0(AHCIDBG_INIT|AHCIDBG_ENTRY, ahci_ctlp,
2277 	    "ahci_alloc_ports_state enter");
2278 
2279 	mutex_enter(&ahci_ctlp->ahcictl_mutex);
2280 
2281 	/* Allocate structures only for the implemented ports */
2282 	for (port = 0; port < ahci_ctlp->ahcictl_num_ports; port++) {
2283 		if (!AHCI_PORT_IMPLEMENTED(ahci_ctlp, port)) {
2284 			AHCIDBG1(AHCIDBG_INIT, ahci_ctlp,
2285 			    "hba port %d not implemented", port);
2286 			continue;
2287 		}
2288 
2289 #ifndef __lock_lint
2290 		ahci_ctlp->ahcictl_cport_to_port[cport] = (uint8_t)port;
2291 		ahci_ctlp->ahcictl_port_to_cport[port] =
2292 		    (uint8_t)cport++;
2293 #endif /* __lock_lint */
2294 
2295 		if (ahci_alloc_port_state(ahci_ctlp, port) != AHCI_SUCCESS) {
2296 			goto err_out;
2297 		}
2298 	}
2299 
2300 	mutex_exit(&ahci_ctlp->ahcictl_mutex);
2301 	return (AHCI_SUCCESS);
2302 
2303 err_out:
2304 	for (port--; port >= 0; port--) {
2305 		if (AHCI_PORT_IMPLEMENTED(ahci_ctlp, port)) {
2306 			ahci_dealloc_port_state(ahci_ctlp, port);
2307 		}
2308 	}
2309 
2310 	mutex_exit(&ahci_ctlp->ahcictl_mutex);
2311 	return (AHCI_FAILURE);
2312 }
2313 
2314 /*
2315  * Reverse of ahci_alloc_ports_state(), only called by ahci_detach
2316  */
2317 static void
2318 ahci_dealloc_ports_state(ahci_ctl_t *ahci_ctlp)
2319 {
2320 	int port;
2321 
2322 	mutex_enter(&ahci_ctlp->ahcictl_mutex);
2323 	for (port = 0; port < ahci_ctlp->ahcictl_num_ports; port++) {
2324 		/* if this port is implemented by the HBA */
2325 		if (AHCI_PORT_IMPLEMENTED(ahci_ctlp, port))
2326 			ahci_dealloc_port_state(ahci_ctlp, port);
2327 	}
2328 	mutex_exit(&ahci_ctlp->ahcictl_mutex);
2329 }
2330 
2331 /*
2332  * Initialize the controller.
2333  *
2334  * This routine can be called from three seperate cases: DDI_ATTACH,
2335  * PM_LEVEL_D0 and DDI_RESUME. The DDI_ATTACH case is different from
2336  * other two cases; device signature probing are attempted only during
2337  * DDI_ATTACH case.
2338  *
2339  * WARNING!!! Disable the whole controller's interrupts before calling and
2340  * the interrupts will be enabled upon successfully return.
2341  */
2342 static int
2343 ahci_initialize_controller(ahci_ctl_t *ahci_ctlp)
2344 {
2345 	ahci_port_t *ahci_portp;
2346 	uint32_t ghc_control;
2347 	int port;
2348 
2349 	AHCIDBG0(AHCIDBG_INIT|AHCIDBG_ENTRY, ahci_ctlp,
2350 	    "ahci_initialize_controller enter");
2351 
2352 	mutex_enter(&ahci_ctlp->ahcictl_mutex);
2353 
2354 	/*
2355 	 * Indicate that system software is AHCI aware by setting
2356 	 * GHC.AE to 1
2357 	 */
2358 	ghc_control = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle,
2359 	    (uint32_t *)AHCI_GLOBAL_GHC(ahci_ctlp));
2360 
2361 	ghc_control |= AHCI_HBA_GHC_AE;
2362 	ddi_put32(ahci_ctlp->ahcictl_ahci_acc_handle,
2363 	    (uint32_t *)AHCI_GLOBAL_GHC(ahci_ctlp),
2364 	    ghc_control);
2365 
2366 	/* Initialize the implemented ports and structures */
2367 	for (port = 0; port < ahci_ctlp->ahcictl_num_ports; port++) {
2368 		if (!AHCI_PORT_IMPLEMENTED(ahci_ctlp, port)) {
2369 			continue;
2370 		}
2371 
2372 		ahci_portp = ahci_ctlp->ahcictl_ports[port];
2373 		mutex_enter(&ahci_portp->ahciport_mutex);
2374 
2375 		/*
2376 		 * Ensure that the controller is not in the running state
2377 		 * by checking every implemented port's PxCMD register
2378 		 */
2379 		if (ahci_initialize_port(ahci_ctlp, ahci_portp, port)
2380 		    != AHCI_SUCCESS) {
2381 			AHCIDBG1(AHCIDBG_ERRS, ahci_ctlp,
2382 			    "ahci_initialize_controller: failed to "
2383 			    "initialize port %d", port);
2384 			/*
2385 			 * Set the port state to SATA_PSTATE_FAILED if
2386 			 * failed to initialize it.
2387 			 */
2388 			ahci_portp->ahciport_port_state = SATA_PSTATE_FAILED;
2389 		}
2390 
2391 		mutex_exit(&ahci_portp->ahciport_mutex);
2392 	}
2393 
2394 	/* Enable the whole controller interrupts */
2395 	ahci_enable_all_intrs(ahci_ctlp);
2396 	mutex_exit(&ahci_ctlp->ahcictl_mutex);
2397 
2398 	return (AHCI_SUCCESS);
2399 }
2400 
2401 /*
2402  * Reverse of ahci_initialize_controller()
2403  *
2404  * WARNING!!! ahcictl_mutex should be acquired before the function is called.
2405  */
2406 static void
2407 ahci_uninitialize_controller(ahci_ctl_t *ahci_ctlp)
2408 {
2409 	AHCIDBG0(AHCIDBG_INIT, ahci_ctlp,
2410 	    "ahci_uninitialize_controller enter");
2411 
2412 	/* disable all the interrupts. */
2413 	ahci_disable_all_intrs(ahci_ctlp);
2414 }
2415 
2416 /*
2417  * The routine is to initialize the port. First put the port in NOTRunning
2418  * state, then enable port interrupt and clear Serror register. And under
2419  * AHCI_ATTACH case, find device signature and then try to start the port.
2420  *
2421  * WARNING!!! ahcictl_mutex and ahciport_mutex should be acquired before
2422  * the function is called.
2423  */
2424 static int
2425 ahci_initialize_port(ahci_ctl_t *ahci_ctlp,
2426     ahci_port_t *ahci_portp, uint8_t port)
2427 {
2428 	uint32_t port_cmd_status;
2429 
2430 	port_cmd_status = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle,
2431 	    (uint32_t *)AHCI_PORT_PxCMD(ahci_ctlp, port));
2432 
2433 	AHCIDBG2(AHCIDBG_INIT|AHCIDBG_ENTRY, ahci_ctlp,
2434 	    "ahci_initialize_port: port %d "
2435 	    "port_cmd_status = 0x%x", port, port_cmd_status);
2436 	/*
2437 	 * Check whether the port is in NotRunning state, if not,
2438 	 * put the port in NotRunning state
2439 	 */
2440 	if (!(port_cmd_status &
2441 	    (AHCI_CMD_STATUS_ST |
2442 	    AHCI_CMD_STATUS_CR |
2443 	    AHCI_CMD_STATUS_FRE |
2444 	    AHCI_CMD_STATUS_FR))) {
2445 
2446 		goto next;
2447 	}
2448 
2449 	if (ahci_restart_port_wait_till_ready(ahci_ctlp, ahci_portp,
2450 	    port, AHCI_RESET_NO_EVENTS_UP|AHCI_PORT_INIT, NULL) != AHCI_SUCCESS)
2451 		return (AHCI_FAILURE);
2452 
2453 next:
2454 	AHCIDBG1(AHCIDBG_INIT, ahci_ctlp,
2455 	    "port %d is in NotRunning state now", port);
2456 
2457 	/*
2458 	 * At the time being, only probe ports/devices and get the types of
2459 	 * attached devices during attach. In fact, the device can be changed
2460 	 * during power state changes, but I would like to postpone this part
2461 	 * when the power management is supported.
2462 	 */
2463 	if (ahci_ctlp->ahcictl_flags & AHCI_ATTACH) {
2464 		/* Try to get the device signature */
2465 		ahci_find_dev_signature(ahci_ctlp, ahci_portp, port);
2466 
2467 		/* Return directly if no device connected */
2468 		if (ahci_portp->ahciport_device_type == SATA_DTYPE_NONE) {
2469 			AHCIDBG1(AHCIDBG_INIT, ahci_ctlp,
2470 			    "No device connected to port %d", port);
2471 			goto out;
2472 		}
2473 
2474 		/* Try to start the port */
2475 		if (ahci_start_port(ahci_ctlp, ahci_portp, port)
2476 		    != AHCI_SUCCESS) {
2477 			AHCIDBG1(AHCIDBG_INIT, ahci_ctlp,
2478 			    "failed to start port %d", port);
2479 			return (AHCI_FAILURE);
2480 		}
2481 	}
2482 out:
2483 	/* Enable port interrupts */
2484 	ahci_enable_port_intrs(ahci_ctlp, ahci_portp, port);
2485 
2486 	return (AHCI_SUCCESS);
2487 }
2488 
2489 /*
2490  * AHCI device reset ...; a single device on one of the ports is reset,
2491  * but the HBA and physical communication remain intact. This is the
2492  * least intrusive.
2493  *
2494  * When issuing a software reset sequence, there should not be other
2495  * commands in the command list, so we will first clear and then re-set
2496  * PxCMD.ST to clear PxCI. And before issuing the software reset,
2497  * the port must be idle and PxTFD.STS.BSY and PxTFD.STS.DRQ must be
2498  * cleared.
2499  *
2500  * WARNING!!! ahciport_mutex should be acquired and PxCMD.FRE should be
2501  * set before the function is called.
2502  */
2503 static int
2504 ahci_software_reset(ahci_ctl_t *ahci_ctlp, ahci_port_t *ahci_portp,
2505     uint8_t port)
2506 {
2507 	ahci_fis_h2d_register_t *h2d_register_fisp;
2508 	ahci_cmd_table_t *cmd_table;
2509 	ahci_cmd_header_t *cmd_header;
2510 	uint32_t port_cmd_status, port_cmd_issue, port_task_file;
2511 	int slot, loop_count;
2512 
2513 	AHCIDBG1(AHCIDBG_ENTRY, ahci_ctlp,
2514 	    "Port %d device resetting", port);
2515 
2516 	/* First to clear PxCMD.ST */
2517 	port_cmd_status = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle,
2518 	    (uint32_t *)AHCI_PORT_PxCMD(ahci_ctlp, port));
2519 
2520 	port_cmd_status &= ~AHCI_CMD_STATUS_ST;
2521 
2522 	ddi_put32(ahci_ctlp->ahcictl_ahci_acc_handle,
2523 	    (uint32_t *)AHCI_PORT_PxCMD(ahci_ctlp, port),
2524 	    port_cmd_status|AHCI_CMD_STATUS_ST);
2525 
2526 	/* And then to re-set PxCMD.ST */
2527 	port_cmd_status = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle,
2528 	    (uint32_t *)AHCI_PORT_PxCMD(ahci_ctlp, port));
2529 
2530 	ddi_put32(ahci_ctlp->ahcictl_ahci_acc_handle,
2531 	    (uint32_t *)AHCI_PORT_PxCMD(ahci_ctlp, port),
2532 	    port_cmd_status|AHCI_CMD_STATUS_ST);
2533 
2534 	/* Check PxTFD.STS.BSY and PxTFD.STS.DRQ */
2535 	port_task_file = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle,
2536 	    (uint32_t *)AHCI_PORT_PxTFD(ahci_ctlp, port));
2537 
2538 	if (port_task_file & AHCI_TFD_STS_BSY ||
2539 	    port_task_file & AHCI_TFD_STS_DRQ) {
2540 		if (!(port_cmd_status & AHCI_CMD_STATUS_CLO)) {
2541 			AHCIDBG0(AHCIDBG_ERRS, ahci_ctlp,
2542 			    "PxTFD.STS.BSY or PxTFD.STS.DRQ is still set, "
2543 			    "but PxCMD.CLO isn't supported, so a port "
2544 			    "reset is needed.");
2545 			return (AHCI_FAILURE);
2546 		}
2547 	}
2548 
2549 	slot = ahci_claim_free_slot(ahci_ctlp, ahci_portp);
2550 	if (slot == AHCI_FAILURE) {
2551 		AHCIDBG0(AHCIDBG_INFO, ahci_ctlp,
2552 		    "ahci_software_reset: no free slot");
2553 		return (AHCI_FAILURE);
2554 	}
2555 
2556 	/* Now send the first R2H FIS with SRST set to 1 */
2557 	cmd_table = ahci_portp->ahciport_cmd_tables[slot];
2558 	bzero((void *)cmd_table, ahci_cmd_table_size);
2559 
2560 	h2d_register_fisp =
2561 	    &(cmd_table->ahcict_command_fis.ahcifc_fis.ahcifc_h2d_register);
2562 
2563 	SET_FIS_TYPE(h2d_register_fisp, AHCI_H2D_REGISTER_FIS_TYPE);
2564 	SET_FIS_PMP(h2d_register_fisp, AHCI_PORTMULT_CONTROL_PORT);
2565 	SET_FIS_DEVCTL(h2d_register_fisp, SATA_DEVCTL_SRST);
2566 
2567 	/* Set Command Header in Command List */
2568 	cmd_header = &ahci_portp->ahciport_cmd_list[slot];
2569 	BZERO_DESCR_INFO(cmd_header);
2570 	BZERO_PRD_BYTE_COUNT(cmd_header);
2571 	SET_COMMAND_FIS_LENGTH(cmd_header, 5);
2572 
2573 	SET_CLEAR_BUSY_UPON_R_OK(cmd_header, 1);
2574 	SET_RESET(cmd_header, 1);
2575 	SET_WRITE(cmd_header, 1);
2576 
2577 	(void) ddi_dma_sync(ahci_portp->ahciport_cmd_tables_dma_handle[slot],
2578 	    0,
2579 	    ahci_cmd_table_size,
2580 	    DDI_DMA_SYNC_FORDEV);
2581 
2582 	(void) ddi_dma_sync(ahci_portp->ahciport_cmd_list_dma_handle,
2583 	    slot * sizeof (ahci_cmd_header_t),
2584 	    sizeof (ahci_cmd_header_t),
2585 	    DDI_DMA_SYNC_FORDEV);
2586 
2587 	/* Indicate to the HBA that a command is active. */
2588 	ddi_put32(ahci_ctlp->ahcictl_ahci_acc_handle,
2589 	    (uint32_t *)AHCI_PORT_PxCI(ahci_ctlp, port),
2590 	    (0x1 << slot));
2591 
2592 	loop_count = 0;
2593 
2594 	/* Loop till the first command is finished */
2595 	do {
2596 		port_cmd_issue = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle,
2597 		    (uint32_t *)AHCI_PORT_PxCI(ahci_ctlp, port));
2598 
2599 		if (loop_count++ > AHCI_POLLRATE_PORT_SOFTRESET) {
2600 			/* We are effectively timing out after 0.1 sec. */
2601 			break;
2602 		}
2603 		/* Wait for 10 millisec */
2604 #ifndef __lock_lint
2605 		delay(AHCI_10MS_TICKS);
2606 #endif /* __lock_lint */
2607 	} while (port_cmd_issue	& AHCI_SLOT_MASK(ahci_ctlp) & (0x1 << slot));
2608 
2609 	AHCIDBG3(AHCIDBG_POLL_LOOP, ahci_ctlp,
2610 	    "ahci_software_reset: 1st loop count: %d, "
2611 	    "port_cmd_issue = 0x%x, slot = 0x%x",
2612 	    loop_count, port_cmd_issue, slot);
2613 
2614 	CLEAR_BIT(ahci_portp->ahciport_pending_tags, slot);
2615 	ahci_portp->ahciport_slot_pkts[slot] = NULL;
2616 
2617 	/* Now send the second R2H FIS with SRST cleard to zero */
2618 	cmd_table = ahci_portp->ahciport_cmd_tables[slot];
2619 	bzero((void *)cmd_table, ahci_cmd_table_size);
2620 
2621 	h2d_register_fisp =
2622 	    &(cmd_table->ahcict_command_fis.ahcifc_fis.ahcifc_h2d_register);
2623 
2624 	SET_FIS_TYPE(h2d_register_fisp, AHCI_H2D_REGISTER_FIS_TYPE);
2625 	SET_FIS_PMP(h2d_register_fisp, AHCI_PORTMULT_CONTROL_PORT);
2626 
2627 	/* Set Command Header in Command List */
2628 	cmd_header = &ahci_portp->ahciport_cmd_list[slot];
2629 	BZERO_DESCR_INFO(cmd_header);
2630 	BZERO_PRD_BYTE_COUNT(cmd_header);
2631 	SET_COMMAND_FIS_LENGTH(cmd_header, 5);
2632 
2633 	SET_WRITE(cmd_header, 1);
2634 
2635 	(void) ddi_dma_sync(ahci_portp->ahciport_cmd_tables_dma_handle[slot],
2636 	    0,
2637 	    ahci_cmd_table_size,
2638 	    DDI_DMA_SYNC_FORDEV);
2639 
2640 	(void) ddi_dma_sync(ahci_portp->ahciport_cmd_list_dma_handle,
2641 	    slot * sizeof (ahci_cmd_header_t),
2642 	    sizeof (ahci_cmd_header_t),
2643 	    DDI_DMA_SYNC_FORDEV);
2644 
2645 	/* Indicate to the HBA that a command is active. */
2646 	ddi_put32(ahci_ctlp->ahcictl_ahci_acc_handle,
2647 	    (uint32_t *)AHCI_PORT_PxCI(ahci_ctlp, port),
2648 	    (0x1 << slot));
2649 
2650 	loop_count = 0;
2651 
2652 	/* Loop till the second command is finished */
2653 	do {
2654 		port_cmd_issue = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle,
2655 		    (uint32_t *)AHCI_PORT_PxCI(ahci_ctlp, port));
2656 
2657 		if (loop_count++ > AHCI_POLLRATE_PORT_SOFTRESET) {
2658 			/* We are effectively timing out after 0.1 sec. */
2659 			break;
2660 		}
2661 		/* Wait for 10 millisec */
2662 #ifndef __lock_lint
2663 		delay(AHCI_10MS_TICKS);
2664 #endif /* __lock_lint */
2665 	} while (port_cmd_issue	& AHCI_SLOT_MASK(ahci_ctlp) & (0x1 << slot));
2666 
2667 	AHCIDBG3(AHCIDBG_POLL_LOOP, ahci_ctlp,
2668 	    "ahci_software_reset: 2nd loop count: %d, "
2669 	    "port_cmd_issue = 0x%x, slot = 0x%x",
2670 	    loop_count, port_cmd_issue, slot);
2671 
2672 	CLEAR_BIT(ahci_portp->ahciport_pending_tags, slot);
2673 	ahci_portp->ahciport_slot_pkts[slot] = NULL;
2674 
2675 	return (AHCI_SUCCESS);
2676 }
2677 
2678 /*
2679  * AHCI port reset ...; the physical communication between the HBA and device
2680  * on a port are disabled. This is more intrusive.
2681  *
2682  * When an HBA or port reset occurs, Phy communication is going to
2683  * be re-established with the device through a COMRESET followed by the
2684  * normal out-of-band communication sequence defined in Serial ATA. AT
2685  * the end of reset, the device, if working properly, will send a D2H
2686  * Register FIS, which contains the device signature. When the HBA receives
2687  * this FIS, it updates PxTFD.STS and PxTFD.ERR register fields, and updates
2688  * the PxSIG register with the signature.
2689  *
2690  * Staggered spin-up is an optional feature in SATA II, and it enables an HBA
2691  * to individually spin-up attached devices. Please refer to chapter 10.9 of
2692  * AHCI 1.0 spec.
2693  */
2694 /*
2695  * WARNING!!! ahciport_mutex should be acquired, intr should be disabled,
2696  * and PxCMD.ST and PxCMD.FRE should be also cleared before the function
2697  * is called.
2698  */
2699 static int
2700 ahci_port_reset(ahci_ctl_t *ahci_ctlp, ahci_port_t *ahci_portp, uint8_t port)
2701 {
2702 	uint32_t cap_status, port_cmd_status;
2703 	uint32_t port_scontrol, port_sstatus;
2704 	uint32_t port_signature, port_intr_status, port_task_file;
2705 	int loop_count;
2706 	int rval = AHCI_SUCCESS;
2707 
2708 	AHCIDBG1(AHCIDBG_INIT|AHCIDBG_ENTRY, ahci_ctlp,
2709 	    "Port %d port resetting...", port);
2710 	ahci_portp->ahciport_port_state = 0;
2711 
2712 	cap_status = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle,
2713 	    (uint32_t *)AHCI_GLOBAL_CAP(ahci_ctlp));
2714 
2715 	port_cmd_status = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle,
2716 	    (uint32_t *)AHCI_PORT_PxCMD(ahci_ctlp, port));
2717 
2718 	if (cap_status & AHCI_HBA_CAP_SSS) {
2719 		/*
2720 		 * HBA support staggered spin-up, if the port has
2721 		 * not spin up yet, then force it to do spin-up
2722 		 */
2723 		if (!(port_cmd_status & AHCI_CMD_STATUS_SUD)) {
2724 			if (!(ahci_portp->ahciport_flags
2725 			    & AHCI_PORT_FLAG_SPINUP)) {
2726 				AHCIDBG1(AHCIDBG_INIT, ahci_ctlp,
2727 				    "Port %d PxCMD.SUD is zero, force "
2728 				    "it to do spin-up", port);
2729 				ahci_portp->ahciport_flags |=
2730 				    AHCI_PORT_FLAG_SPINUP;
2731 			}
2732 		}
2733 	} else {
2734 		/*
2735 		 * HBA doesn't support stagger spin-up, force it
2736 		 * to do normal COMRESET
2737 		 */
2738 		ASSERT(port_cmd_status & AHCI_CMD_STATUS_SUD);
2739 		if (ahci_portp->ahciport_flags &
2740 		    AHCI_PORT_FLAG_SPINUP) {
2741 			AHCIDBG0(AHCIDBG_INIT, ahci_ctlp,
2742 			    "HBA does not support staggered spin-up "
2743 			    "force it to do normal COMRESET");
2744 			ahci_portp->ahciport_flags &=
2745 			    ~AHCI_PORT_FLAG_SPINUP;
2746 		}
2747 	}
2748 
2749 	if (!(ahci_portp->ahciport_flags & AHCI_PORT_FLAG_SPINUP)) {
2750 		/* Do normal COMRESET */
2751 		AHCIDBG1(AHCIDBG_INFO, ahci_ctlp,
2752 		    "ahci_port_reset: do normal COMRESET", port);
2753 
2754 		ASSERT(port_cmd_status & AHCI_CMD_STATUS_SUD);
2755 
2756 		port_scontrol = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle,
2757 		    (uint32_t *)AHCI_PORT_PxSCTL(ahci_ctlp, port));
2758 		AHCI_SCONTROL_SET_DET(port_scontrol,
2759 		    AHCI_SCONTROL_DET_COMRESET);
2760 
2761 		ddi_put32(ahci_ctlp->ahcictl_ahci_acc_handle,
2762 		    (uint32_t *)AHCI_PORT_PxSCTL(ahci_ctlp, port),
2763 		    port_scontrol);
2764 
2765 		/* Enable PxCMD.FRE to read device */
2766 		ddi_put32(ahci_ctlp->ahcictl_ahci_acc_handle,
2767 		    (uint32_t *)AHCI_PORT_PxCMD(ahci_ctlp, port),
2768 		    port_cmd_status|AHCI_CMD_STATUS_FRE);
2769 
2770 		/*
2771 		 * Give time for COMRESET to percolate, according to the AHCI
2772 		 * spec, software shall wait at least 1 millisecond before
2773 		 * clearing PxSCTL.DET
2774 		 */
2775 #ifndef __lock_lint
2776 		delay(AHCI_1MS_TICKS*2);
2777 #endif /* __lock_lint */
2778 
2779 		/* Fetch the SCONTROL again and rewrite the DET part with 0 */
2780 		port_scontrol = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle,
2781 		    (uint32_t *)AHCI_PORT_PxSCTL(ahci_ctlp, port));
2782 		AHCI_SCONTROL_SET_DET(port_scontrol,
2783 		    AHCI_SCONTROL_DET_NOACTION);
2784 		ddi_put32(ahci_ctlp->ahcictl_ahci_acc_handle,
2785 		    (uint32_t *)AHCI_PORT_PxSCTL(ahci_ctlp, port),
2786 		    port_scontrol);
2787 	} else {
2788 		/* Do staggered spin-up */
2789 		port_scontrol = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle,
2790 		    (uint32_t *)AHCI_PORT_PxSCTL(ahci_ctlp, port));
2791 		AHCI_SCONTROL_SET_DET(port_scontrol,
2792 		    AHCI_SCONTROL_DET_NOACTION);
2793 
2794 		/* PxSCTL.DET must be 0 */
2795 		ddi_put32(ahci_ctlp->ahcictl_ahci_acc_handle,
2796 		    (uint32_t *)AHCI_PORT_PxSCTL(ahci_ctlp, port),
2797 		    port_scontrol);
2798 
2799 		port_cmd_status &= ~AHCI_CMD_STATUS_SUD;
2800 		ddi_put32(ahci_ctlp->ahcictl_ahci_acc_handle,
2801 		    (uint32_t *)AHCI_PORT_PxCMD(ahci_ctlp, port),
2802 		    port_cmd_status);
2803 
2804 		/* 0 -> 1 edge */
2805 #ifndef __lock_lint
2806 		delay(AHCI_1MS_TICKS*2);
2807 #endif /* __lock_lint */
2808 
2809 		/* Set PxCMD.SUD to 1 */
2810 		port_cmd_status = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle,
2811 		    (uint32_t *)AHCI_PORT_PxCMD(ahci_ctlp, port));
2812 		port_cmd_status |= AHCI_CMD_STATUS_SUD;
2813 		ddi_put32(ahci_ctlp->ahcictl_ahci_acc_handle,
2814 		    (uint32_t *)AHCI_PORT_PxCMD(ahci_ctlp, port),
2815 		    port_cmd_status);
2816 
2817 		/* Enable PxCMD.FRE to read device */
2818 		ddi_put32(ahci_ctlp->ahcictl_ahci_acc_handle,
2819 		    (uint32_t *)AHCI_PORT_PxCMD(ahci_ctlp, port),
2820 		    port_cmd_status|AHCI_CMD_STATUS_FRE);
2821 	}
2822 
2823 	/*
2824 	 * The port enters P:StartComm state, and HBA tells link layer to
2825 	 * start communication, which involves sending COMRESET to device.
2826 	 * And the HBA resets PxTFD.STS to 7Fh.
2827 	 *
2828 	 * When a COMINIT is received from the device, then the port enters
2829 	 * P:ComInit state. And HBA sets PxTFD.STS to FFh or 80h. HBA sets
2830 	 * PxSSTS.DET to 1h to indicate a device is detected but communication
2831 	 * is not yet established. HBA sets PxSERR.DIAG.X to '1' to indicate
2832 	 * a COMINIT has been received.
2833 	 */
2834 	/*
2835 	 * The DET field is valid only if IPM field indicates
2836 	 * that the interface is in active state.
2837 	 */
2838 	loop_count = 0;
2839 	do {
2840 		port_sstatus = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle,
2841 		    (uint32_t *)AHCI_PORT_PxSSTS(ahci_ctlp, port));
2842 
2843 		if (AHCI_SSTATUS_GET_IPM(port_sstatus) !=
2844 		    AHCI_SSTATUS_IPM_INTERFACE_ACTIVE) {
2845 			/*
2846 			 * If the interface is not active, the DET field
2847 			 * is considered not accurate. So we want to
2848 			 * continue looping.
2849 			 */
2850 			AHCI_SSTATUS_SET_DET(port_sstatus,
2851 			    AHCI_SSTATUS_DET_NODEV_NOPHY);
2852 		}
2853 
2854 		if (loop_count++ > AHCI_POLLRATE_PORT_SSTATUS) {
2855 			/*
2856 			 * We are effectively timing out after 0.1 sec.
2857 			 */
2858 			break;
2859 		}
2860 
2861 		/* Wait for 10 millisec */
2862 #ifndef __lock_lint
2863 		delay(AHCI_10MS_TICKS);
2864 #endif /* __lock_lint */
2865 
2866 	} while (AHCI_SSTATUS_GET_DET(port_sstatus) !=
2867 	    AHCI_SSTATUS_DET_DEVPRESENT_PHYONLINE);
2868 
2869 	AHCIDBG3(AHCIDBG_INIT|AHCIDBG_POLL_LOOP, ahci_ctlp,
2870 	    "ahci_port_reset: 1st loop count: %d, "
2871 	    "port_sstatus = 0x%x port %d",
2872 	    loop_count, port_sstatus, port);
2873 
2874 	if ((AHCI_SSTATUS_GET_IPM(port_sstatus) !=
2875 	    AHCI_SSTATUS_IPM_INTERFACE_ACTIVE) ||
2876 	    (AHCI_SSTATUS_GET_DET(port_sstatus) !=
2877 	    AHCI_SSTATUS_DET_DEVPRESENT_PHYONLINE)) {
2878 		/*
2879 		 * Either the port is not active or there
2880 		 * is no device present.
2881 		 */
2882 		ahci_portp->ahciport_device_type = SATA_DTYPE_NONE;
2883 		goto out;
2884 	}
2885 
2886 	/* Now we can make sure there is a device connected to the port */
2887 	port_intr_status = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle,
2888 	    (uint32_t *)AHCI_PORT_PxIS(ahci_ctlp, port));
2889 
2890 	/* a COMINIT signal is supposed to be received */
2891 	if (!(port_intr_status & AHCI_INTR_STATUS_PCS)) {
2892 		cmn_err(CE_WARN, "ahci_port_reset: port %d COMINIT signal "
2893 		    "from the device not received", port);
2894 		ahci_portp->ahciport_port_state |= SATA_PSTATE_FAILED;
2895 		rval = AHCI_FAILURE;
2896 		goto out;
2897 	}
2898 
2899 	/* PxTFD.STS.BSY is supposed to be set */
2900 	port_task_file = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle,
2901 	    (uint32_t *)AHCI_PORT_PxTFD(ahci_ctlp, port));
2902 	if (!(port_task_file & AHCI_TFD_STS_BSY)) {
2903 		cmn_err(CE_WARN, "ahci_port_reset: port %d BSY bit "
2904 		    "is not set after COMINIT signal is received", port);
2905 		ahci_portp->ahciport_port_state |= SATA_PSTATE_FAILED;
2906 		rval = AHCI_FAILURE;
2907 		goto out;
2908 	}
2909 
2910 	/*
2911 	 * PxSERR.DIAG.X has to be cleared in order to update PxTFD with
2912 	 * the D2H FIS received by HBA.
2913 	 */
2914 	ddi_put32(ahci_ctlp->ahcictl_ahci_acc_handle,
2915 	    (uint32_t *)AHCI_PORT_PxSERR(ahci_ctlp, port),
2916 	    AHCI_SERROR_DIAG_X);
2917 
2918 	/*
2919 	 * Next check whether COMRESET is completed successfully
2920 	 */
2921 	loop_count = 0;
2922 	do {
2923 		port_task_file =
2924 		    ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle,
2925 		    (uint32_t *)AHCI_PORT_PxTFD(ahci_ctlp, port));
2926 
2927 		/*
2928 		 * The Error bit '1' means COMRESET is finished successfully
2929 		 * The device hardware has been initialized and the power-up
2930 		 * diagnostics successfully completed.
2931 		 */
2932 		if (((port_task_file & AHCI_TFD_ERR_MASK)
2933 		    >> AHCI_TFD_ERR_SHIFT) == 0x1) {
2934 
2935 			port_signature = ddi_get32(
2936 			    ahci_ctlp->ahcictl_ahci_acc_handle,
2937 			    (uint32_t *)AHCI_PORT_PxSIG(ahci_ctlp, port));
2938 			AHCIDBG2(AHCIDBG_INFO, ahci_ctlp,
2939 			    "COMRESET success, D2H register FIS "
2940 			    "post to received FIS structure "
2941 			    "port %d signature = 0x%x",
2942 			    port, port_signature);
2943 			goto out_check;
2944 		}
2945 
2946 		if (loop_count++ > AHCI_POLLRATE_PORT_TFD_ERROR) {
2947 			/*
2948 			 * We are effectively timing out after 11 sec.
2949 			 */
2950 			break;
2951 		}
2952 
2953 		/* Wait for 10 millisec */
2954 #ifndef __lock_lint
2955 		delay(AHCI_10MS_TICKS);
2956 #endif /* __lock_lint */
2957 
2958 	} while (((port_task_file & AHCI_TFD_ERR_MASK)
2959 	    >> AHCI_TFD_ERR_SHIFT) != 0x1);
2960 
2961 	AHCIDBG3(AHCIDBG_ERRS, ahci_ctlp, "ahci_port_reset: 2nd loop "
2962 	    "count: %d, port_task_file = 0x%x port %d",
2963 	    loop_count, port_task_file, port);
2964 
2965 	cmn_err(CE_WARN, "ahci_port_reset: port %d the device hardware "
2966 	    "has been initialized and the power-up diagnostics failed",
2967 	    port);
2968 
2969 	ahci_portp->ahciport_port_state |= SATA_PSTATE_FAILED;
2970 	rval = AHCI_FAILURE;
2971 
2972 out:
2973 	/* Clear port serror register for the port */
2974 	ddi_put32(ahci_ctlp->ahcictl_ahci_acc_handle,
2975 	    (uint32_t *)AHCI_PORT_PxSERR(ahci_ctlp, port),
2976 	    AHCI_SERROR_CLEAR_ALL);
2977 
2978 	return (rval);
2979 
2980 out_check:
2981 	/*
2982 	 * Check device status, if keep busy or COMRESET error
2983 	 * do device reset to patch some SATA disks' issue
2984 	 *
2985 	 * For VT8251, sometimes need to do the device reset
2986 	 */
2987 	if ((port_task_file & AHCI_TFD_STS_BSY) ||
2988 	    (port_task_file & AHCI_TFD_STS_DRQ)) {
2989 		AHCIDBG1(AHCIDBG_ERRS, ahci_ctlp, "port %d keep BSY/DRQ set "
2990 		    "need to do device reset", port);
2991 
2992 		(void) ahci_software_reset(ahci_ctlp, ahci_portp, port);
2993 
2994 		port_task_file =
2995 		    ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle,
2996 		    (uint32_t *)AHCI_PORT_PxTFD(ahci_ctlp, port));
2997 
2998 		if (port_task_file & AHCI_TFD_STS_BSY ||
2999 		    port_task_file & AHCI_TFD_STS_DRQ) {
3000 			cmn_err(CE_WARN, "ahci_port_reset: port %d "
3001 			    "BSY/DRQ still set after device reset "
3002 			    "port_task_file = 0x%x",
3003 			    port, port_task_file);
3004 			ahci_portp->ahciport_port_state |= SATA_PSTATE_FAILED;
3005 			rval = AHCI_FAILURE;
3006 		}
3007 	}
3008 
3009 	goto out;
3010 }
3011 
3012 /*
3013  * AHCI HBA reset ...; the entire HBA is reset, and all ports are disabled.
3014  * This is the most intrusive.
3015  *
3016  * When an HBA reset occurs, Phy communication will be re-established with
3017  * the device through a COMRESET followed by the normal out-of-band
3018  * communication sequence defined in Serial ATA. AT the end of reset, the
3019  * device, if working properly, will send a D2H Register FIS, which contains
3020  * the device signature. When the HBA receives this FIS, it updates PxTFD.STS
3021  * and PxTFD.ERR register fields, and updates the PxSIG register with the
3022  * signature.
3023  *
3024  * Remember to set GHC.AE to 1 before calling ahci_hba_reset.
3025  */
3026 static int
3027 ahci_hba_reset(ahci_ctl_t *ahci_ctlp)
3028 {
3029 	ahci_port_t *ahci_portp;
3030 	uint32_t ghc_control;
3031 	uint8_t port;
3032 	int loop_count;
3033 	int rval = AHCI_SUCCESS;
3034 
3035 	AHCIDBG0(AHCIDBG_INIT|AHCIDBG_ENTRY, ahci_ctlp, "HBA resetting");
3036 
3037 	mutex_enter(&ahci_ctlp->ahcictl_mutex);
3038 
3039 	ghc_control = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle,
3040 	    (uint32_t *)AHCI_GLOBAL_GHC(ahci_ctlp));
3041 
3042 	/* Setting GHC.HR to 1, remember GHC.AE is already set to 1 before */
3043 	ghc_control |= AHCI_HBA_GHC_HR;
3044 	ddi_put32(ahci_ctlp->ahcictl_ahci_acc_handle,
3045 	    (uint32_t *)AHCI_GLOBAL_GHC(ahci_ctlp), ghc_control);
3046 
3047 	/*
3048 	 * Wait until HBA Reset complete or timeout
3049 	 */
3050 	loop_count = 0;
3051 	do {
3052 		ghc_control = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle,
3053 		    (uint32_t *)AHCI_GLOBAL_GHC(ahci_ctlp));
3054 
3055 		if (loop_count++ > AHCI_POLLRATE_HBA_RESET) {
3056 			AHCIDBG1(AHCIDBG_INIT, ahci_ctlp,
3057 			    "ahci hba reset is timing out, "
3058 			    "ghc_control = 0x%x", ghc_control);
3059 			/* We are effectively timing out after 1 sec. */
3060 			break;
3061 		}
3062 
3063 		/* Wait for 10 millisec */
3064 #ifndef __lock_lint
3065 		delay(AHCI_10MS_TICKS);
3066 #endif /* __lock_lint */
3067 
3068 	} while (ghc_control & AHCI_HBA_GHC_HR);
3069 
3070 	AHCIDBG2(AHCIDBG_INIT|AHCIDBG_POLL_LOOP, ahci_ctlp,
3071 	    "ahci_hba_reset: 1st loop count: %d, "
3072 	    "ghc_control = 0x%x", loop_count, ghc_control);
3073 
3074 	if (ghc_control & AHCI_HBA_GHC_HR) {
3075 		/* The hba is not reset for some reasons */
3076 		AHCIDBG0(AHCIDBG_INIT, ahci_ctlp,
3077 		    "hba reset failed: HBA in a hung or locked state");
3078 		mutex_exit(&ahci_ctlp->ahcictl_mutex);
3079 		return (AHCI_FAILURE);
3080 	}
3081 
3082 	for (port = 0; port < ahci_ctlp->ahcictl_num_ports; port++) {
3083 		/* Only check implemented ports */
3084 		if (!AHCI_PORT_IMPLEMENTED(ahci_ctlp, port)) {
3085 			continue;
3086 		}
3087 
3088 		ahci_portp = ahci_ctlp->ahcictl_ports[port];
3089 		mutex_enter(&ahci_portp->ahciport_mutex);
3090 
3091 		if (ahci_port_reset(ahci_ctlp, ahci_portp, port)
3092 		    != AHCI_SUCCESS) {
3093 			rval = AHCI_FAILURE;
3094 			AHCIDBG1(AHCIDBG_ERRS, ahci_ctlp,
3095 			    "ahci_hba_reset: port %d failed", port);
3096 		}
3097 
3098 		mutex_exit(&ahci_portp->ahciport_mutex);
3099 	}
3100 
3101 	/*
3102 	 * Indicate that system software is AHCI aware by setting
3103 	 * GHC.AE to 1
3104 	 */
3105 	ghc_control = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle,
3106 	    (uint32_t *)AHCI_GLOBAL_GHC(ahci_ctlp));
3107 
3108 	ghc_control |= AHCI_HBA_GHC_AE;
3109 	ddi_put32(ahci_ctlp->ahcictl_ahci_acc_handle,
3110 	    (uint32_t *)AHCI_GLOBAL_GHC(ahci_ctlp), ghc_control);
3111 
3112 	mutex_exit(&ahci_ctlp->ahcictl_mutex);
3113 
3114 	return (rval);
3115 }
3116 
3117 /*
3118  * This routine is only called from AHCI_ATTACH or phyrdy change
3119  * case. It first calls port reset to initialize port, probe port and probe
3120  * device, then try to read PxSIG register to find the type of device
3121  * attached to the port.
3122  *
3123  * WARNING!!! ahciport_mutex should be acquired before the function
3124  * is called. And the port interrupt is disabled.
3125  */
3126 static void
3127 ahci_find_dev_signature(ahci_ctl_t *ahci_ctlp,
3128     ahci_port_t *ahci_portp, uint8_t port)
3129 {
3130 	uint32_t signature;
3131 
3132 	AHCIDBG1(AHCIDBG_INIT|AHCIDBG_ENTRY, ahci_ctlp,
3133 	    "ahci_find_dev_signature enter: port %d", port);
3134 
3135 	ahci_portp->ahciport_device_type = SATA_DTYPE_UNKNOWN;
3136 
3137 	/* Call port reset to check link status and get device signature */
3138 	(void) ahci_port_reset(ahci_ctlp, ahci_portp, port);
3139 
3140 	if (ahci_portp->ahciport_device_type == SATA_DTYPE_NONE) {
3141 		AHCIDBG1(AHCIDBG_INFO, ahci_ctlp,
3142 		    "ahci_find_dev_signature: No device is found "
3143 		    "at port %d", port);
3144 		return;
3145 	}
3146 
3147 	/* Check the port state */
3148 	if (ahci_portp->ahciport_port_state & SATA_PSTATE_FAILED) {
3149 		AHCIDBG2(AHCIDBG_ERRS, ahci_ctlp,
3150 		    "ahci_find_dev_signature: port %d state 0x%x",
3151 		    port, ahci_portp->ahciport_port_state);
3152 		return;
3153 	}
3154 
3155 	signature = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle,
3156 	    (uint32_t *)AHCI_PORT_PxSIG(ahci_ctlp, port));
3157 
3158 	AHCIDBG2(AHCIDBG_INIT|AHCIDBG_INFO, ahci_ctlp,
3159 	    "ahci_find_dev_signature: port %d signature = 0x%x",
3160 	    port, signature);
3161 
3162 	switch (signature) {
3163 
3164 	case AHCI_SIGNATURE_DISK:
3165 		ahci_portp->ahciport_device_type = SATA_DTYPE_ATADISK;
3166 		AHCIDBG1(AHCIDBG_INFO, ahci_ctlp,
3167 		    "Disk is found at port: %d", port);
3168 		break;
3169 
3170 	case AHCI_SIGNATURE_ATAPI:
3171 		ahci_portp->ahciport_device_type = SATA_DTYPE_ATAPICD;
3172 		AHCIDBG1(AHCIDBG_INFO, ahci_ctlp,
3173 		    "ATAPI device is found at port: %d", port);
3174 		break;
3175 
3176 	case AHCI_SIGNATURE_PORT_MULTIPLIER:
3177 		ahci_portp->ahciport_device_type = SATA_DTYPE_PMULT;
3178 		AHCIDBG1(AHCIDBG_INFO, ahci_ctlp,
3179 		    "Port Multiplier is found at port: %d", port);
3180 		break;
3181 
3182 	default:
3183 		ahci_portp->ahciport_device_type = SATA_DTYPE_UNKNOWN;
3184 		AHCIDBG1(AHCIDBG_INFO, ahci_ctlp,
3185 		    "Unknown device is found at port: %d", port);
3186 	}
3187 }
3188 
3189 /*
3190  * Start the port - set PxCMD.ST to 1, if PxCMD.FRE is not set
3191  * to 1, then set it firstly.
3192  *
3193  * Each port contains two major DMA engines. One DMA engine walks through
3194  * the command list, and is controlled by PxCMD.ST. The second DMA engine
3195  * copies received FISes into system memory, and is controlled by PxCMD.FRE.
3196  *
3197  * Software shall not set PxCMD.ST to '1' until it verifies that PxCMD.CR
3198  * is '0' and has set PxCMD.FRE is '1'. And software shall not clear
3199  * PxCMD.FRE while PxCMD.ST or PxCMD.CR is set '1'.
3200  *
3201  * Software shall not set PxCMD.ST to '1' unless a functional device is
3202  * present on the port(as determined by PxTFD.STS.BSY = '0',
3203  * PxTFD.STS.DRQ = '0', and PxSSTS.DET = 3h).
3204  *
3205  * WARNING!!! ahciport_mutex should be acquired before the function
3206  * is called.
3207  */
3208 static int
3209 ahci_start_port(ahci_ctl_t *ahci_ctlp, ahci_port_t *ahci_portp, uint8_t port)
3210 {
3211 	uint32_t port_cmd_status;
3212 
3213 	AHCIDBG1(AHCIDBG_ENTRY, ahci_ctlp, "ahci_start_port: %d enter", port);
3214 
3215 	if (ahci_portp->ahciport_port_state & SATA_PSTATE_FAILED) {
3216 		AHCIDBG2(AHCIDBG_ERRS, ahci_ctlp, "ahci_start_port failed "
3217 		    "the state for port %d is 0x%x",
3218 		    port, ahci_portp->ahciport_port_state);
3219 		return (AHCI_FAILURE);
3220 	}
3221 
3222 	if (ahci_portp->ahciport_device_type == SATA_DTYPE_NONE) {
3223 		AHCIDBG1(AHCIDBG_ERRS, ahci_ctlp, "ahci_start_port failed "
3224 		    "no device is attached at port %d", port);
3225 		return (AHCI_FAILURE);
3226 	}
3227 
3228 	/* First to set PxCMD.FRE before setting PxCMD.ST. */
3229 	port_cmd_status = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle,
3230 	    (uint32_t *)AHCI_PORT_PxCMD(ahci_ctlp, port));
3231 
3232 	if (!(port_cmd_status & AHCI_CMD_STATUS_FRE)) {
3233 		port_cmd_status |= AHCI_CMD_STATUS_FRE;
3234 		ddi_put32(ahci_ctlp->ahcictl_ahci_acc_handle,
3235 		    (uint32_t *)AHCI_PORT_PxCMD(ahci_ctlp, port),
3236 		    port_cmd_status);
3237 	}
3238 
3239 	port_cmd_status = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle,
3240 	    (uint32_t *)AHCI_PORT_PxCMD(ahci_ctlp, port));
3241 
3242 	port_cmd_status |= AHCI_CMD_STATUS_ST;
3243 
3244 	ddi_put32(ahci_ctlp->ahcictl_ahci_acc_handle,
3245 	    (uint32_t *)AHCI_PORT_PxCMD(ahci_ctlp, port),
3246 	    port_cmd_status);
3247 
3248 	ahci_portp->ahciport_flags |= AHCI_PORT_FLAG_STARTED;
3249 
3250 	return (AHCI_SUCCESS);
3251 }
3252 
3253 /*
3254  * Allocate the ahci_port_t including Received FIS and Command List.
3255  * The argument - port is the physical port number, and not logical
3256  * port number seen by the SATA framework.
3257  *
3258  * WARNING!!! ahcictl_mutex should be acquired before the function
3259  * is called.
3260  */
3261 static int
3262 ahci_alloc_port_state(ahci_ctl_t *ahci_ctlp, uint8_t port)
3263 {
3264 	ahci_port_t *ahci_portp;
3265 
3266 	ahci_portp =
3267 	    (ahci_port_t *)kmem_zalloc(sizeof (ahci_port_t), KM_SLEEP);
3268 
3269 #ifndef __lock_lint
3270 	ahci_ctlp->ahcictl_ports[port] = ahci_portp;
3271 #endif /* __lock_lint */
3272 
3273 	ahci_portp->ahciport_port_num = port;
3274 
3275 	/* Intialize the port condition variable */
3276 	cv_init(&ahci_portp->ahciport_cv, NULL, CV_DRIVER, NULL);
3277 
3278 	/* Initialize the port mutex */
3279 	mutex_init(&ahci_portp->ahciport_mutex, NULL, MUTEX_DRIVER,
3280 	    (void *)(uintptr_t)ahci_ctlp->ahcictl_intr_pri);
3281 
3282 	mutex_enter(&ahci_portp->ahciport_mutex);
3283 
3284 	/*
3285 	 * Allocate memory for received FIS structure and
3286 	 * command list for this port
3287 	 */
3288 	if (ahci_alloc_rcvd_fis(ahci_ctlp, ahci_portp, port) != AHCI_SUCCESS) {
3289 		goto err_case1;
3290 	}
3291 
3292 	if (ahci_alloc_cmd_list(ahci_ctlp, ahci_portp, port) != AHCI_SUCCESS) {
3293 		goto err_case2;
3294 	}
3295 
3296 	ahci_portp->ahciport_event_args =
3297 	    kmem_zalloc(sizeof (ahci_event_arg_t), KM_SLEEP);
3298 
3299 	if (ahci_portp->ahciport_event_args == NULL)
3300 		goto err_case3;
3301 
3302 	mutex_exit(&ahci_portp->ahciport_mutex);
3303 
3304 	return (AHCI_SUCCESS);
3305 
3306 err_case3:
3307 	ahci_dealloc_cmd_list(ahci_ctlp, ahci_portp);
3308 
3309 err_case2:
3310 	ahci_dealloc_rcvd_fis(ahci_ctlp, ahci_portp);
3311 
3312 err_case1:
3313 	mutex_exit(&ahci_portp->ahciport_mutex);
3314 	mutex_destroy(&ahci_portp->ahciport_mutex);
3315 	cv_destroy(&ahci_portp->ahciport_cv);
3316 
3317 	kmem_free(ahci_portp, sizeof (ahci_port_t));
3318 
3319 	return (AHCI_FAILURE);
3320 }
3321 
3322 /*
3323  * Reverse of ahci_dealloc_port_state().
3324  *
3325  * WARNING!!! ahcictl_mutex should be acquired before the function
3326  * is called.
3327  */
3328 static void
3329 ahci_dealloc_port_state(ahci_ctl_t *ahci_ctlp, uint8_t port)
3330 {
3331 	ahci_port_t *ahci_portp = ahci_ctlp->ahcictl_ports[port];
3332 
3333 	ASSERT(ahci_portp != NULL);
3334 
3335 	mutex_enter(&ahci_portp->ahciport_mutex);
3336 	kmem_free(ahci_portp->ahciport_event_args, sizeof (ahci_event_arg_t));
3337 	ahci_portp->ahciport_event_args = NULL;
3338 	ahci_dealloc_cmd_list(ahci_ctlp, ahci_portp);
3339 	ahci_dealloc_rcvd_fis(ahci_ctlp, ahci_portp);
3340 	mutex_exit(&ahci_portp->ahciport_mutex);
3341 
3342 	mutex_destroy(&ahci_portp->ahciport_mutex);
3343 	cv_destroy(&ahci_portp->ahciport_cv);
3344 
3345 	kmem_free(ahci_portp, sizeof (ahci_port_t));
3346 
3347 #ifndef __lock_lint
3348 	ahci_ctlp->ahcictl_ports[port] = NULL;
3349 #endif /* __lock_lint */
3350 }
3351 
3352 /*
3353  * Allocates memory for the Received FIS Structure
3354  *
3355  * WARNING!!! ahciport_mutex should be acquired before the function
3356  * is called.
3357  */
3358 static int
3359 ahci_alloc_rcvd_fis(ahci_ctl_t *ahci_ctlp, ahci_port_t *ahci_portp,
3360     uint8_t port)
3361 {
3362 	size_t rcvd_fis_size;
3363 	size_t ret_len;
3364 	ddi_dma_cookie_t rcvd_fis_dma_cookie;
3365 	uint_t cookie_count;
3366 	uint32_t cap_status;
3367 
3368 	rcvd_fis_size = sizeof (ahci_rcvd_fis_t);
3369 
3370 	/* Check whether the HBA can access 64-bit data structures */
3371 	cap_status = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle,
3372 	    (uint32_t *)AHCI_GLOBAL_CAP(ahci_ctlp));
3373 
3374 	ahci_ctlp->ahcictl_rcvd_fis_dma_attr = rcvd_fis_dma_attr;
3375 
3376 	/*
3377 	 * If 64-bit addressing is not supported,
3378 	 * change dma_attr_addr_hi of ahcictl_rcvd_fis_dma_attr
3379 	 */
3380 	if (!(cap_status & AHCI_HBA_CAP_S64A)) {
3381 		AHCIDBG0(AHCIDBG_INIT, ahci_ctlp,
3382 		    "hba does not support 64-bit addressing");
3383 		ahci_ctlp->ahcictl_rcvd_fis_dma_attr.dma_attr_addr_hi =
3384 		    0xffffffffull;
3385 	}
3386 
3387 	/* allocate rcvd FIS dma handle. */
3388 	if (ddi_dma_alloc_handle(ahci_ctlp->ahcictl_dip,
3389 	    &ahci_ctlp->ahcictl_rcvd_fis_dma_attr,
3390 	    DDI_DMA_SLEEP,
3391 	    NULL,
3392 	    &ahci_portp->ahciport_rcvd_fis_dma_handle) !=
3393 	    DDI_SUCCESS) {
3394 		AHCIDBG0(AHCIDBG_INIT, ahci_ctlp,
3395 		    "rcvd FIS dma handle alloc failed");
3396 
3397 		return (AHCI_FAILURE);
3398 	}
3399 
3400 	if (ddi_dma_mem_alloc(ahci_portp->ahciport_rcvd_fis_dma_handle,
3401 	    rcvd_fis_size,
3402 	    &accattr,
3403 	    DDI_DMA_RDWR | DDI_DMA_CONSISTENT,
3404 	    DDI_DMA_SLEEP,
3405 	    NULL,
3406 	    (caddr_t *)&ahci_portp->ahciport_rcvd_fis,
3407 	    &ret_len,
3408 	    &ahci_portp->ahciport_rcvd_fis_acc_handle) != NULL) {
3409 
3410 		AHCIDBG0(AHCIDBG_INIT, ahci_ctlp,
3411 		    "rcvd FIS dma mem alloc fail");
3412 		/* error.. free the dma handle. */
3413 		ddi_dma_free_handle(&ahci_portp->ahciport_rcvd_fis_dma_handle);
3414 		return (AHCI_FAILURE);
3415 	}
3416 
3417 	if (ddi_dma_addr_bind_handle(ahci_portp->ahciport_rcvd_fis_dma_handle,
3418 	    NULL,
3419 	    (caddr_t)ahci_portp->ahciport_rcvd_fis,
3420 	    rcvd_fis_size,
3421 	    DDI_DMA_CONSISTENT,
3422 	    DDI_DMA_SLEEP,
3423 	    NULL,
3424 	    &rcvd_fis_dma_cookie,
3425 	    &cookie_count) !=  DDI_DMA_MAPPED) {
3426 
3427 		AHCIDBG0(AHCIDBG_INIT, ahci_ctlp,
3428 		    "rcvd FIS dma handle bind fail");
3429 		/*  error.. free the dma handle & free the memory. */
3430 		ddi_dma_mem_free(&ahci_portp->ahciport_rcvd_fis_acc_handle);
3431 		ddi_dma_free_handle(&ahci_portp->ahciport_rcvd_fis_dma_handle);
3432 		return (AHCI_FAILURE);
3433 	}
3434 
3435 	bzero((void *)ahci_portp->ahciport_rcvd_fis, rcvd_fis_size);
3436 
3437 	/* Config Port Received FIS Base Address */
3438 	ddi_put64(ahci_ctlp->ahcictl_ahci_acc_handle,
3439 	    (uint64_t *)AHCI_PORT_PxFB(ahci_ctlp, port),
3440 	    rcvd_fis_dma_cookie.dmac_laddress);
3441 
3442 	AHCIDBG1(AHCIDBG_INIT, ahci_ctlp, "64-bit, dma address: 0x%llx",
3443 	    rcvd_fis_dma_cookie.dmac_laddress);
3444 	AHCIDBG1(AHCIDBG_INIT, ahci_ctlp, "32-bit, dma address: 0x%x",
3445 	    rcvd_fis_dma_cookie.dmac_address);
3446 
3447 	return (AHCI_SUCCESS);
3448 }
3449 
3450 /*
3451  * Deallocates the Received FIS Structure
3452  *
3453  * WARNING!!! ahciport_mutex should be acquired before the function
3454  * is called.
3455  */
3456 static void
3457 ahci_dealloc_rcvd_fis(ahci_ctl_t *ahci_ctlp, ahci_port_t *ahci_portp)
3458 {
3459 	AHCIDBG1(AHCIDBG_ENTRY, ahci_ctlp,
3460 	    "ahci_dealloc_rcvd_fis: port %d enter",
3461 	    ahci_portp->ahciport_port_num);
3462 
3463 	/* Unbind the cmd list dma handle first. */
3464 	(void) ddi_dma_unbind_handle(ahci_portp->ahciport_rcvd_fis_dma_handle);
3465 
3466 	/* Then free the underlying memory. */
3467 	ddi_dma_mem_free(&ahci_portp->ahciport_rcvd_fis_acc_handle);
3468 
3469 	/* Now free the handle itself. */
3470 	ddi_dma_free_handle(&ahci_portp->ahciport_rcvd_fis_dma_handle);
3471 }
3472 
3473 /*
3474  * Allocates memory for the Command List, which contains up to 32 entries.
3475  * Each entry contains a command header, which is a 32-byte structure that
3476  * includes the pointer to the command table.
3477  *
3478  * WARNING!!! ahciport_mutex should be acquired before the function
3479  * is called.
3480  */
3481 static int
3482 ahci_alloc_cmd_list(ahci_ctl_t *ahci_ctlp, ahci_port_t *ahci_portp,
3483     uint8_t port)
3484 {
3485 	size_t cmd_list_size;
3486 	size_t ret_len;
3487 	ddi_dma_cookie_t cmd_list_dma_cookie;
3488 	uint_t cookie_count;
3489 	uint32_t cap_status;
3490 
3491 	cmd_list_size =
3492 	    ahci_ctlp->ahcictl_num_cmd_slots * sizeof (ahci_cmd_header_t);
3493 
3494 	cap_status = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle,
3495 	    (uint32_t *)AHCI_GLOBAL_CAP(ahci_ctlp));
3496 
3497 	ahci_ctlp->ahcictl_cmd_list_dma_attr = cmd_list_dma_attr;
3498 
3499 	/*
3500 	 * If 64-bit addressing is not supported,
3501 	 * change dma_attr_addr_hi of ahcictl_cmd_list_dma_attr
3502 	 */
3503 	if (!(cap_status & AHCI_HBA_CAP_S64A)) {
3504 		AHCIDBG0(AHCIDBG_INIT, ahci_ctlp,
3505 		    "hba does not support 64-bit addressing");
3506 		ahci_ctlp->ahcictl_cmd_list_dma_attr.dma_attr_addr_hi =
3507 		    0xffffffffull;
3508 	}
3509 
3510 	/* allocate cmd list dma handle. */
3511 	if (ddi_dma_alloc_handle(ahci_ctlp->ahcictl_dip,
3512 	    &ahci_ctlp->ahcictl_cmd_list_dma_attr,
3513 	    DDI_DMA_SLEEP,
3514 	    NULL,
3515 	    &ahci_portp->ahciport_cmd_list_dma_handle) != DDI_SUCCESS) {
3516 
3517 		AHCIDBG0(AHCIDBG_INIT, ahci_ctlp,
3518 		    "cmd list dma handle alloc failed");
3519 		return (AHCI_FAILURE);
3520 	}
3521 
3522 	if (ddi_dma_mem_alloc(ahci_portp->ahciport_cmd_list_dma_handle,
3523 	    cmd_list_size,
3524 	    &accattr,
3525 	    DDI_DMA_RDWR | DDI_DMA_CONSISTENT,
3526 	    DDI_DMA_SLEEP,
3527 	    NULL,
3528 	    (caddr_t *)&ahci_portp->ahciport_cmd_list,
3529 	    &ret_len,
3530 	    &ahci_portp->ahciport_cmd_list_acc_handle) != NULL) {
3531 
3532 		AHCIDBG0(AHCIDBG_INIT, ahci_ctlp,
3533 		    "cmd list dma mem alloc fail");
3534 		/* error.. free the dma handle. */
3535 		ddi_dma_free_handle(&ahci_portp->ahciport_cmd_list_dma_handle);
3536 		return (AHCI_FAILURE);
3537 	}
3538 
3539 	if (ddi_dma_addr_bind_handle(ahci_portp->ahciport_cmd_list_dma_handle,
3540 	    NULL,
3541 	    (caddr_t)ahci_portp->ahciport_cmd_list,
3542 	    cmd_list_size,
3543 	    DDI_DMA_CONSISTENT,
3544 	    DDI_DMA_SLEEP,
3545 	    NULL,
3546 	    &cmd_list_dma_cookie,
3547 	    &cookie_count) !=  DDI_DMA_MAPPED) {
3548 
3549 		AHCIDBG0(AHCIDBG_INIT, ahci_ctlp,
3550 		    "cmd list dma handle bind fail");
3551 		/*  error.. free the dma handle & free the memory. */
3552 		ddi_dma_mem_free(&ahci_portp->ahciport_cmd_list_acc_handle);
3553 		ddi_dma_free_handle(&ahci_portp->ahciport_cmd_list_dma_handle);
3554 		return (AHCI_FAILURE);
3555 	}
3556 
3557 	bzero((void *)ahci_portp->ahciport_cmd_list, cmd_list_size);
3558 
3559 	/* Config Port Command List Base Address */
3560 	ddi_put64(ahci_ctlp->ahcictl_ahci_acc_handle,
3561 	    (uint64_t *)AHCI_PORT_PxCLB(ahci_ctlp, port),
3562 	    cmd_list_dma_cookie.dmac_laddress);
3563 
3564 	AHCIDBG1(AHCIDBG_INIT, ahci_ctlp, "64-bit, dma address: 0x%llx",
3565 	    cmd_list_dma_cookie.dmac_laddress);
3566 
3567 	AHCIDBG1(AHCIDBG_INIT, ahci_ctlp, "32-bit, dma address: 0x%x",
3568 	    cmd_list_dma_cookie.dmac_address);
3569 
3570 	if (ahci_alloc_cmd_tables(ahci_ctlp, ahci_portp) != AHCI_SUCCESS) {
3571 		ahci_dealloc_cmd_list(ahci_ctlp, ahci_portp);
3572 		return (AHCI_FAILURE);
3573 	}
3574 
3575 	return (AHCI_SUCCESS);
3576 }
3577 
3578 /*
3579  * Deallocates the Command List
3580  *
3581  * WARNING!!! ahciport_mutex should be acquired before the function
3582  * is called.
3583  */
3584 static void
3585 ahci_dealloc_cmd_list(ahci_ctl_t *ahci_ctlp, ahci_port_t *ahci_portp)
3586 {
3587 	/* First dealloc command table */
3588 	ahci_dealloc_cmd_tables(ahci_ctlp, ahci_portp);
3589 
3590 	/* Unbind the cmd list dma handle first. */
3591 	(void) ddi_dma_unbind_handle(ahci_portp->ahciport_cmd_list_dma_handle);
3592 
3593 	/* Then free the underlying memory. */
3594 	ddi_dma_mem_free(&ahci_portp->ahciport_cmd_list_acc_handle);
3595 
3596 	/* Now free the handle itself. */
3597 	ddi_dma_free_handle(&ahci_portp->ahciport_cmd_list_dma_handle);
3598 }
3599 
3600 /*
3601  * Allocates memory for all Command Tables, which contains Command FIS,
3602  * ATAPI Command and Physical Region Descriptor Table.
3603  *
3604  * WARNING!!! ahciport_mutex should be acquired before the function
3605  * is called.
3606  */
3607 static int
3608 ahci_alloc_cmd_tables(ahci_ctl_t *ahci_ctlp, ahci_port_t *ahci_portp)
3609 {
3610 	size_t ret_len;
3611 	ddi_dma_cookie_t cmd_table_dma_cookie;
3612 	uint_t cookie_count;
3613 	uint32_t cap_status;
3614 	int slot;
3615 
3616 	AHCIDBG1(AHCIDBG_INIT|AHCIDBG_ENTRY, ahci_ctlp,
3617 	    "ahci_alloc_cmd_tables: port %d enter",
3618 	    ahci_portp->ahciport_port_num);
3619 
3620 	/* Check whether the HBA can access 64-bit data structures */
3621 	cap_status = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle,
3622 	    (uint32_t *)AHCI_GLOBAL_CAP(ahci_ctlp));
3623 
3624 	ahci_ctlp->ahcictl_cmd_table_dma_attr = cmd_table_dma_attr;
3625 
3626 	/*
3627 	 * If 64-bit addressing is not supported,
3628 	 * change dma_attr_addr_hi of ahcictl_cmd_table_dma_attr
3629 	 */
3630 	if (!(cap_status & AHCI_HBA_CAP_S64A)) {
3631 		AHCIDBG0(AHCIDBG_INIT, ahci_ctlp,
3632 		    "hba does not support 64-bit addressing");
3633 		ahci_ctlp->ahcictl_cmd_table_dma_attr.dma_attr_addr_hi =
3634 		    0xffffffffull;
3635 	}
3636 
3637 	for (slot = 0; slot < ahci_ctlp->ahcictl_num_cmd_slots; slot++) {
3638 		/* Allocate cmd table dma handle. */
3639 		if (ddi_dma_alloc_handle(ahci_ctlp->ahcictl_dip,
3640 		    &ahci_ctlp->ahcictl_cmd_table_dma_attr,
3641 		    DDI_DMA_SLEEP,
3642 		    NULL,
3643 		    &ahci_portp->ahciport_cmd_tables_dma_handle[slot]) !=
3644 		    DDI_SUCCESS) {
3645 
3646 			AHCIDBG0(AHCIDBG_INIT, ahci_ctlp,
3647 			    "cmd table dma handle alloc failed");
3648 
3649 			goto err_out;
3650 		}
3651 
3652 		if (ddi_dma_mem_alloc(
3653 		    ahci_portp->ahciport_cmd_tables_dma_handle[slot],
3654 		    ahci_cmd_table_size,
3655 		    &accattr,
3656 		    DDI_DMA_RDWR | DDI_DMA_CONSISTENT,
3657 		    DDI_DMA_SLEEP,
3658 		    NULL,
3659 		    (caddr_t *)&ahci_portp->ahciport_cmd_tables[slot],
3660 		    &ret_len,
3661 		    &ahci_portp->ahciport_cmd_tables_acc_handle[slot]) !=
3662 		    NULL) {
3663 
3664 			AHCIDBG0(AHCIDBG_INIT, ahci_ctlp,
3665 			    "cmd table dma mem alloc fail");
3666 
3667 			/* error.. free the dma handle. */
3668 			ddi_dma_free_handle(
3669 			    &ahci_portp->ahciport_cmd_tables_dma_handle[slot]);
3670 			goto err_out;
3671 		}
3672 
3673 		if (ddi_dma_addr_bind_handle(
3674 		    ahci_portp->ahciport_cmd_tables_dma_handle[slot],
3675 		    NULL,
3676 		    (caddr_t)ahci_portp->ahciport_cmd_tables[slot],
3677 		    ahci_cmd_table_size,
3678 		    DDI_DMA_CONSISTENT,
3679 		    DDI_DMA_SLEEP,
3680 		    NULL,
3681 		    &cmd_table_dma_cookie,
3682 		    &cookie_count) !=  DDI_DMA_MAPPED) {
3683 
3684 			AHCIDBG0(AHCIDBG_INIT, ahci_ctlp,
3685 			    "cmd table dma handle bind fail");
3686 			/*  error.. free the dma handle & free the memory. */
3687 			ddi_dma_mem_free(
3688 			    &ahci_portp->ahciport_cmd_tables_acc_handle[slot]);
3689 			ddi_dma_free_handle(
3690 			    &ahci_portp->ahciport_cmd_tables_dma_handle[slot]);
3691 			goto err_out;
3692 		}
3693 
3694 		bzero((void *)ahci_portp->ahciport_cmd_tables[slot],
3695 		    ahci_cmd_table_size);
3696 
3697 		/* Config Port Command Table Base Address */
3698 		SET_COMMAND_TABLE_BASE_ADDR(
3699 		    (&ahci_portp->ahciport_cmd_list[slot]),
3700 		    cmd_table_dma_cookie.dmac_laddress & 0xffffffffull);
3701 
3702 #ifndef __lock_lint
3703 		SET_COMMAND_TABLE_BASE_ADDR_UPPER(
3704 		    (&ahci_portp->ahciport_cmd_list[slot]),
3705 		    cmd_table_dma_cookie.dmac_laddress >> 32);
3706 #endif /* __lock_lint */
3707 	}
3708 
3709 	return (AHCI_SUCCESS);
3710 err_out:
3711 
3712 	for (slot--; slot >= 0; slot--) {
3713 		/* Unbind the cmd table dma handle first */
3714 		(void) ddi_dma_unbind_handle(
3715 		    ahci_portp->ahciport_cmd_tables_dma_handle[slot]);
3716 
3717 		/* Then free the underlying memory */
3718 		ddi_dma_mem_free(
3719 		    &ahci_portp->ahciport_cmd_tables_acc_handle[slot]);
3720 
3721 		/* Now free the handle itself */
3722 		ddi_dma_free_handle(
3723 		    &ahci_portp->ahciport_cmd_tables_dma_handle[slot]);
3724 	}
3725 
3726 	return (AHCI_FAILURE);
3727 }
3728 
3729 /*
3730  * Deallocates memory for all Command Tables.
3731  *
3732  * WARNING!!! ahciport_mutex should be acquired before the function
3733  * is called.
3734  */
3735 static void
3736 ahci_dealloc_cmd_tables(ahci_ctl_t *ahci_ctlp, ahci_port_t *ahci_portp)
3737 {
3738 	int slot;
3739 
3740 	AHCIDBG1(AHCIDBG_ENTRY, ahci_ctlp,
3741 	    "ahci_dealloc_cmd_tables: %d enter",
3742 	    ahci_portp->ahciport_port_num);
3743 
3744 	for (slot = 0; slot < ahci_ctlp->ahcictl_num_cmd_slots; slot++) {
3745 		/* Unbind the cmd table dma handle first. */
3746 		(void) ddi_dma_unbind_handle(
3747 		    ahci_portp->ahciport_cmd_tables_dma_handle[slot]);
3748 
3749 		/* Then free the underlying memory. */
3750 		ddi_dma_mem_free(
3751 		    &ahci_portp->ahciport_cmd_tables_acc_handle[slot]);
3752 
3753 		/* Now free the handle itself. */
3754 		ddi_dma_free_handle(
3755 		    &ahci_portp->ahciport_cmd_tables_dma_handle[slot]);
3756 	}
3757 }
3758 
3759 /*
3760  * WARNING!!! ahciport_mutex should be acquired before the function
3761  * is called.
3762  */
3763 static void
3764 ahci_update_sata_registers(ahci_ctl_t *ahci_ctlp, uint8_t port,
3765     sata_device_t *sd)
3766 {
3767 	sd->satadev_scr.sstatus =
3768 	    ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle,
3769 	    (uint32_t *)(AHCI_PORT_PxSSTS(ahci_ctlp, port)));
3770 	sd->satadev_scr.serror =
3771 	    ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle,
3772 	    (uint32_t *)(AHCI_PORT_PxSERR(ahci_ctlp, port)));
3773 	sd->satadev_scr.scontrol =
3774 	    ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle,
3775 	    (uint32_t *)(AHCI_PORT_PxSCTL(ahci_ctlp, port)));
3776 	sd->satadev_scr.sactive =
3777 	    ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle,
3778 	    (uint32_t *)(AHCI_PORT_PxSACT(ahci_ctlp, port)));
3779 }
3780 
3781 /*
3782  * For poll mode, ahci_port_intr will be called to emulate the interrupt
3783  *
3784  * retrieve_errinfo_slot_status keeps the slot number of REQUEST SENSE command
3785  * which is sent down to get sense data for a failed PACKET command.
3786  */
3787 static void
3788 ahci_port_intr(ahci_ctl_t *ahci_ctlp, ahci_port_t *ahci_portp,
3789     uint8_t port, uint32_t retrieve_errinfo_slot_status)
3790 {
3791 	uint32_t port_intr_status;
3792 	uint32_t port_intr_enable;
3793 
3794 	AHCIDBG1(AHCIDBG_INTR|AHCIDBG_ENTRY, ahci_ctlp,
3795 	    "ahci_port_intr enter: port %d", port);
3796 
3797 	mutex_enter(&ahci_portp->ahciport_mutex);
3798 	if (ahci_portp->ahciport_flags & AHCI_PORT_FLAG_POLLING) {
3799 		/* For SATA_OPMODE_POLLING commands */
3800 		port_intr_enable =
3801 		    (AHCI_INTR_STATUS_DHRS |
3802 		    AHCI_INTR_STATUS_PSS |
3803 		    AHCI_INTR_STATUS_SDBS |
3804 		    AHCI_INTR_STATUS_UFS |
3805 		    AHCI_INTR_STATUS_PCS |
3806 		    AHCI_INTR_STATUS_PRCS |
3807 		    AHCI_INTR_STATUS_OFS |
3808 		    AHCI_INTR_STATUS_INFS |
3809 		    AHCI_INTR_STATUS_IFS |
3810 		    AHCI_INTR_STATUS_HBDS |
3811 		    AHCI_INTR_STATUS_HBFS |
3812 		    AHCI_INTR_STATUS_TFES);
3813 		mutex_exit(&ahci_portp->ahciport_mutex);
3814 		goto next;
3815 	}
3816 	mutex_exit(&ahci_portp->ahciport_mutex);
3817 
3818 	/*
3819 	 * port_intr_enable indicates that the corresponding interrrupt
3820 	 * reporting is enabled.
3821 	 */
3822 	port_intr_enable = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle,
3823 	    (uint32_t *)AHCI_PORT_PxIE(ahci_ctlp, port));
3824 next:
3825 	/*
3826 	 * port_intr_stats indicates that the corresponding interrupt
3827 	 * condition is active.
3828 	 */
3829 	port_intr_status = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle,
3830 	    (uint32_t *)AHCI_PORT_PxIS(ahci_ctlp, port));
3831 
3832 	AHCIDBG4(AHCIDBG_INTR, ahci_ctlp,
3833 	    "ahci_port_intr: port %d, port_intr_status = 0x%x, "
3834 	    "port_intr_enable = 0x%x, retrieve_errinfo_slot_status = 0x%x",
3835 	    port, port_intr_status, port_intr_enable,
3836 	    retrieve_errinfo_slot_status);
3837 
3838 	port_intr_status &= port_intr_enable;
3839 
3840 	/* First clear the port interrupts status */
3841 	ddi_put32(ahci_ctlp->ahcictl_ahci_acc_handle,
3842 	    (uint32_t *)AHCI_PORT_PxIS(ahci_ctlp, port),
3843 	    port_intr_status);
3844 
3845 	/* Check the completed commands */
3846 	if (port_intr_status & (AHCI_INTR_STATUS_DHRS |
3847 	    AHCI_INTR_STATUS_PSS)) {
3848 		(void) ahci_intr_cmd_cmplt(ahci_ctlp,
3849 		    ahci_portp, port, port_intr_status,
3850 		    retrieve_errinfo_slot_status);
3851 	}
3852 
3853 	/* Check the asynchronous notification */
3854 	if (port_intr_status & AHCI_INTR_STATUS_SDBS) {
3855 		(void) ahci_intr_set_device_bits(ahci_ctlp,
3856 		    ahci_portp, port);
3857 	}
3858 
3859 	/* Check the port connect change status interrupt bit */
3860 	if (port_intr_status & AHCI_INTR_STATUS_PCS) {
3861 		(void) ahci_intr_port_connect_change(ahci_ctlp,
3862 		    ahci_portp, port);
3863 	}
3864 
3865 	/* Check the device mechanical presence status interrupt bit */
3866 	if (port_intr_status & AHCI_INTR_STATUS_DMPS) {
3867 		(void) ahci_intr_device_mechanical_presence_status(
3868 		    ahci_ctlp, ahci_portp, port);
3869 	}
3870 
3871 	/* Check the PhyRdy change status interrupt bit */
3872 	if (port_intr_status & AHCI_INTR_STATUS_PRCS) {
3873 		(void) ahci_intr_phyrdy_change(ahci_ctlp, ahci_portp,
3874 		    port);
3875 	}
3876 
3877 	/*
3878 	 * Check the non-fatal error interrupt bits, there are three
3879 	 * kinds of non-fatal errors at the time being:
3880 	 *
3881 	 *    PxIS.UFS - Unknown FIS Error
3882 	 *    PxIS.OFS - Overflow Error
3883 	 *    PxIS.INFS - Interface Non-Fatal Error
3884 	 *
3885 	 * For these non-fatal errors, the HBA can continue to operate,
3886 	 * so the driver just log the error messages.
3887 	 */
3888 	if (port_intr_status & (AHCI_INTR_STATUS_UFS |
3889 	    AHCI_INTR_STATUS_OFS |
3890 	    AHCI_INTR_STATUS_INFS)) {
3891 		(void) ahci_intr_non_fatal_error(ahci_ctlp, ahci_portp,
3892 		    port, port_intr_status);
3893 	}
3894 
3895 	/*
3896 	 * Check the fatal error interrupt bits, there are four kinds
3897 	 * of fatal errors for AHCI controllers:
3898 	 *
3899 	 *    PxIS.HBFS - Host Bus Fatal Error
3900 	 *    PxIS.HBDS - Host Bus Data Error
3901 	 *    PxIS.IFS - Interface Fatal Error
3902 	 *    PxIS.TFES - Task File Error
3903 	 *
3904 	 * The fatal error means the HBA can not recover from it by
3905 	 * itself, and it will try to abort the transfer, and the software
3906 	 * must intervene to restart the port.
3907 	 */
3908 	if (port_intr_status & (AHCI_INTR_STATUS_IFS |
3909 	    AHCI_INTR_STATUS_HBDS |
3910 	    AHCI_INTR_STATUS_HBFS |
3911 	    AHCI_INTR_STATUS_TFES))
3912 		(void) ahci_intr_fatal_error(ahci_ctlp, ahci_portp,
3913 		    port, port_intr_status, retrieve_errinfo_slot_status);
3914 
3915 	/* Check the cold port detect interrupt bit */
3916 	if (port_intr_status & AHCI_INTR_STATUS_CPDS) {
3917 		(void) ahci_intr_cold_port_detect(ahci_ctlp, ahci_portp, port);
3918 	}
3919 
3920 	/* Second clear the corresponding bit in IS.IPS */
3921 	ddi_put32(ahci_ctlp->ahcictl_ahci_acc_handle,
3922 	    (uint32_t *)AHCI_GLOBAL_IS(ahci_ctlp), (0x1 << port));
3923 }
3924 
3925 /*
3926  * Interrupt service handler
3927  */
3928 /* ARGSUSED1 */
3929 static uint_t
3930 ahci_intr(caddr_t arg1, caddr_t arg2)
3931 {
3932 	ahci_ctl_t *ahci_ctlp = (ahci_ctl_t *)arg1;
3933 	ahci_port_t *ahci_portp;
3934 	int32_t global_intr_status;
3935 	uint8_t port;
3936 
3937 	/*
3938 	 * global_intr_status indicates that the corresponding port has
3939 	 * an interrupt pending.
3940 	 */
3941 	global_intr_status = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle,
3942 	    (uint32_t *)AHCI_GLOBAL_IS(ahci_ctlp));
3943 
3944 	if (!(global_intr_status & ahci_ctlp->ahcictl_ports_implemented)) {
3945 		/* The interrupt is not ours */
3946 		return (DDI_INTR_UNCLAIMED);
3947 	}
3948 
3949 	/* Loop for all the ports */
3950 	for (port = 0; port < ahci_ctlp->ahcictl_num_ports; port++) {
3951 		if (!AHCI_PORT_IMPLEMENTED(ahci_ctlp, port)) {
3952 			continue;
3953 		}
3954 		if (!((0x1 << port) & global_intr_status)) {
3955 			continue;
3956 		}
3957 
3958 		ahci_portp = ahci_ctlp->ahcictl_ports[port];
3959 
3960 		/* Call ahci_port_intr */
3961 		ahci_port_intr(ahci_ctlp, ahci_portp, port, 0);
3962 	}
3963 
3964 	return (DDI_INTR_CLAIMED);
3965 }
3966 
3967 /*
3968  * For non-queued commands, when the corresponding bit in the PxCI register
3969  * is cleared, it means the command is completed successfully. And according
3970  * to the HBA state machine, there are three conditions which possibly will
3971  * try to clear the PxCI register bit.
3972  *	1. Receive one D2H Register FIS which is with 'I' bit set
3973  *	2. Update PIO Setup FIS
3974  *	3. Transmit a command and receive R_OK if CTBA.C is set (software reset)
3975  *
3976  * Process completed commands including non-queued commands when the
3977  * interrupt status bit - AHCI_INTR_STATUS_DHRS or AHCI_INTR_STATUS_PSS
3978  * is set, and queued commands when the interrupt bit -
3979  * AHCI_INTR_STATUS_SDBS is set. Currently, the driver doesn't support
3980  * queued commands yet.
3981  *
3982  * AHCI_INTR_STATUS_DHRS means a D2H Register FIS has been received
3983  * with the 'I' bit set. And the following commands will send thus
3984  * FIS with 'I' bit set upon the successful completion:
3985  * 	1. Non-data commands
3986  * 	2. DMA data-in command
3987  * 	3. DMA data-out command
3988  * 	4. PIO data-out command
3989  *	5. PACKET non-data commands
3990  *	6. PACKET PIO data-in command
3991  *	7. PACKET PIO data-out command
3992  *	8. PACKET DMA data-in command
3993  *	9. PACKET DMA data-out command
3994  *
3995  * AHCI_INTR_STATUS_PSS means a PIO Setup FIS has been received
3996  * with the 'I' bit set. And the following commands will send this
3997  * FIS upon the successful completion:
3998  * 	1. PIO data-in command
3999  */
4000 static int
4001 ahci_intr_cmd_cmplt(ahci_ctl_t *ahci_ctlp, ahci_port_t *ahci_portp,
4002     uint8_t port, uint32_t intr_status, uint32_t retrieve_errinfo_slot_status)
4003 {
4004 	uint32_t port_cmd_issue = 0;
4005 	uint32_t finished_tags;
4006 	int finished_slot;
4007 	sata_pkt_t *satapkt;
4008 	ahci_fis_d2h_register_t *rcvd_fisp;
4009 
4010 	if (intr_status & AHCI_INTR_STATUS_DHRS)
4011 		AHCIDBG1(AHCIDBG_INTR|AHCIDBG_ENTRY, ahci_ctlp,
4012 		    "ahci_intr_cmd_cmplt enter: port %d "
4013 		    "a d2h register fis is received", port);
4014 
4015 	if (intr_status & AHCI_INTR_STATUS_PSS)
4016 		AHCIDBG1(AHCIDBG_INTR|AHCIDBG_ENTRY, ahci_ctlp,
4017 		    "ahci_intr_cmd_cmplt enter: port %d "
4018 		    "a pio setup fis is received", port);
4019 
4020 	mutex_enter(&ahci_portp->ahciport_mutex);
4021 	if (!ahci_portp->ahciport_pending_tags) {
4022 		/*
4023 		 * Spurious interrupt. Nothing to be done.
4024 		 */
4025 		mutex_exit(&ahci_portp->ahciport_mutex);
4026 		return (AHCI_SUCCESS);
4027 	}
4028 
4029 	port_cmd_issue = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle,
4030 	    (uint32_t *)AHCI_PORT_PxCI(ahci_ctlp, port));
4031 
4032 	/*
4033 	 * When AHCI_PORT_FLAG_RQSENSE is set, the port is doing error recovery,
4034 	 * and REQUEST SENSE for sense data retrieval is sent down to get the
4035 	 * sense data. At this time, the only pending command is REQUESR SENSE,
4036 	 * and retrieve_errinfo_slot_status contains the slot number of it.
4037 	 */
4038 	if (retrieve_errinfo_slot_status != 0) {
4039 		ASSERT(ahci_portp->ahciport_flags & AHCI_PORT_FLAG_RQSENSE);
4040 		finished_tags = ahci_portp->ahciport_pending_tags &
4041 		    retrieve_errinfo_slot_status &
4042 		    ~port_cmd_issue &
4043 		    AHCI_SLOT_MASK(ahci_ctlp);
4044 	} else {
4045 		finished_tags = ahci_portp->ahciport_pending_tags &
4046 		    ~port_cmd_issue & AHCI_SLOT_MASK(ahci_ctlp);
4047 	}
4048 
4049 	AHCIDBG3(AHCIDBG_INTR, ahci_ctlp,
4050 	    "ahci_intr_cmd_cmplt: pending_tags = 0x%x, port_cmd_issue = 0x%x "
4051 	    "retrieve_errinfo_slot_status = 0x%x",
4052 	    ahci_portp->ahciport_pending_tags, port_cmd_issue,
4053 	    retrieve_errinfo_slot_status);
4054 
4055 	AHCIDBG1(AHCIDBG_INTR, ahci_ctlp,
4056 	    "ahci_intr_cmd_cmplt: finished_tags = 0x%x", finished_tags);
4057 
4058 	while (finished_tags) {
4059 		finished_slot = ddi_ffs(finished_tags) - 1;
4060 		if (finished_slot == -1) {
4061 			goto out;
4062 		}
4063 
4064 		satapkt = ahci_portp->ahciport_slot_pkts[finished_slot];
4065 		ASSERT(satapkt != NULL);
4066 
4067 		/*
4068 		 * For SATAC_SMART command with SATA_SMART_RETURN_STATUS
4069 		 * feature, sata_special_regs flag will be set, and the
4070 		 * driver should copy the status and the other corresponding
4071 		 * register values in the D2H Register FIS received (It's
4072 		 * working on Non-data protocol) from the device back to
4073 		 * the sata_cmd.
4074 		 *
4075 		 * For every AHCI port, there is only one Received FIS
4076 		 * structure, which contains the FISes received from the
4077 		 * device, So we're trying to copy the content of D2H
4078 		 * Register FIS in the Received FIS structure back to
4079 		 * the sata_cmd.
4080 		 */
4081 		if (satapkt->satapkt_cmd.satacmd_flags.sata_special_regs) {
4082 			rcvd_fisp = &(ahci_portp->ahciport_rcvd_fis->
4083 			    ahcirf_d2h_register_fis);
4084 			satapkt->satapkt_cmd.satacmd_status_reg =
4085 			    GET_RFIS_STATUS(rcvd_fisp);
4086 			ahci_copy_out_regs(&satapkt->satapkt_cmd, rcvd_fisp);
4087 		}
4088 
4089 		AHCIDBG1(AHCIDBG_INTR, ahci_ctlp,
4090 		    "ahci_intr_cmd_cmplt: sending up pkt 0x%p "
4091 		    "with SATA_PKT_COMPLETED", (void *)satapkt);
4092 
4093 		CLEAR_BIT(ahci_portp->ahciport_pending_tags, finished_slot);
4094 		CLEAR_BIT(finished_tags, finished_slot);
4095 		ahci_portp->ahciport_slot_pkts[finished_slot] = NULL;
4096 
4097 		SENDUP_PACKET(ahci_portp, satapkt, SATA_PKT_COMPLETED);
4098 	}
4099 out:
4100 	AHCIDBG1(AHCIDBG_PKTCOMP, ahci_ctlp,
4101 	    "ahci_intr_cmd_cmplt: pending_tags = 0x%x",
4102 	    ahci_portp->ahciport_pending_tags);
4103 
4104 	mutex_exit(&ahci_portp->ahciport_mutex);
4105 
4106 	return (AHCI_SUCCESS);
4107 }
4108 
4109 /*
4110  * AHCI_INTR_STATUS_SDBS means a Set Device Bits FIS has been received
4111  * with the 'I' bit set and has been copied into system memory.
4112  *
4113  * Asynchronous Notification is a feature in SATA II, which allows an
4114  * ATAPI device to send a signal to the host when media is inserted or
4115  * removed and avoids polling the device for media changes. The signal
4116  * sent to the host is a Set Device Bits FIS with the 'I' and 'N' bits
4117  * set to '1'.
4118  */
4119 static int
4120 ahci_intr_set_device_bits(ahci_ctl_t *ahci_ctlp,
4121     ahci_port_t *ahci_portp, uint8_t port)
4122 {
4123 	ahci_fis_set_device_bits_t *rcvd_fisp;
4124 
4125 	AHCIDBG1(AHCIDBG_ENTRY, ahci_ctlp,
4126 	    "ahci_intr_set_device_bits enter: port %d", port);
4127 
4128 	rcvd_fisp = &(ahci_portp->ahciport_rcvd_fis->
4129 	    ahcirf_set_device_bits_fis);
4130 
4131 	if (GET_N_BIT_OF_SET_DEV_BITS(rcvd_fisp)) {
4132 		AHCIDBG1(AHCIDBG_INTR, ahci_ctlp,
4133 		    "ahci_intr_set_device_bits N bit is set for "
4134 		    "port %d", port);
4135 	}
4136 
4137 	return (AHCI_SUCCESS);
4138 }
4139 
4140 /*
4141  * 1=Change in Current Connect Status. 0=No change in Current Connect Status.
4142  * This bit reflects the state of PxSERR.DIAG.X. This bit is only cleared
4143  * when PxSERR.DIAG.X is cleared. When PxSERR.DIAG.X is set to one, it
4144  * indicates a COMINIT signal was received.
4145  *
4146  * Hot plug insertion is detected by reception of a COMINIT signal from the
4147  * device. On reception of unsolicited COMINIT, the HBA shall generate a
4148  * COMRESET. If the COMINIT is in responce to a COMRESET, then the HBA shall
4149  * begin the normal communication negotiation sequence as outlined in the
4150  * Serial ATA 1.0a specification. When a COMRESET is sent to the device the
4151  * PxSSTS.DET field shall be cleared to 0h. When a COMINIT is received, the
4152  * PxSSTS.DET field shall be set to 1h. When the communication negotiation
4153  * sequence is complete and PhyRdy is true the PxSSTS.DET field	shall be set
4154  * to 3h. Therefore, at the moment the ahci driver is going to check PhyRdy
4155  * to handle hot plug insertion. In this interrupt handler, just do nothing
4156  * but print some log message and clear the bit.
4157  */
4158 static int
4159 ahci_intr_port_connect_change(ahci_ctl_t *ahci_ctlp,
4160     ahci_port_t *ahci_portp, uint8_t port)
4161 {
4162 	uint32_t port_serror;
4163 
4164 	mutex_enter(&ahci_portp->ahciport_mutex);
4165 
4166 	port_serror = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle,
4167 	    (uint32_t *)AHCI_PORT_PxSERR(ahci_ctlp, port));
4168 
4169 	AHCIDBG2(AHCIDBG_INTR|AHCIDBG_ENTRY, ahci_ctlp,
4170 	    "ahci_intr_port_connect_change: port %d, "
4171 	    "port_serror = 0x%x", port, port_serror);
4172 
4173 	/* Clear PxSERR.DIAG.X to clear the interrupt bit */
4174 	ddi_put32(ahci_ctlp->ahcictl_ahci_acc_handle,
4175 	    (uint32_t *)AHCI_PORT_PxSERR(ahci_ctlp, port),
4176 	    AHCI_SERROR_DIAG_X);
4177 
4178 	mutex_exit(&ahci_portp->ahciport_mutex);
4179 
4180 	return (AHCI_SUCCESS);
4181 }
4182 
4183 /*
4184  * Hot Plug Operation for platforms that support Mechanical Presence
4185  * Switches.
4186  *
4187  * When set, it indicates that a mechanical presence switch attached to this
4188  * port has been opened or closed, which may lead to a change in the connection
4189  * state of the device. This bit is only valid if both CAP.SMPS and PxCMD.MPSP
4190  * are set to '1'.
4191  *
4192  * At the moment, this interrupt is not needed and disabled and we just log
4193  * the debug message.
4194  */
4195 /* ARGSUSED */
4196 static int
4197 ahci_intr_device_mechanical_presence_status(ahci_ctl_t *ahci_ctlp,
4198     ahci_port_t *ahci_portp, uint8_t port)
4199 {
4200 	uint32_t cap_status, port_cmd_status;
4201 
4202 	AHCIDBG1(AHCIDBG_INTR|AHCIDBG_ENTRY, ahci_ctlp,
4203 	    "ahci_intr_device_mechanical_presence_status enter, "
4204 	    "port %d", port);
4205 
4206 	cap_status = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle,
4207 	    (uint32_t *)AHCI_GLOBAL_CAP(ahci_ctlp));
4208 
4209 	mutex_enter(&ahci_portp->ahciport_mutex);
4210 	port_cmd_status = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle,
4211 	    (uint32_t *)AHCI_PORT_PxCMD(ahci_ctlp, port));
4212 
4213 	if (!(cap_status & AHCI_HBA_CAP_SMPS) ||
4214 	    !(port_cmd_status & AHCI_CMD_STATUS_MPSP)) {
4215 		AHCIDBG2(AHCIDBG_INTR, ahci_ctlp,
4216 		    "CAP.SMPS or PxCMD.MPSP is not set, so just ignore "
4217 		    "the interrupt: cap_status = 0x%x, "
4218 		    "port_cmd_status = 0x%x", cap_status, port_cmd_status);
4219 		mutex_exit(&ahci_portp->ahciport_mutex);
4220 
4221 		return (AHCI_SUCCESS);
4222 	}
4223 
4224 	if (port_cmd_status & AHCI_CMD_STATUS_MPSS) {
4225 		AHCIDBG2(AHCIDBG_INTR, ahci_ctlp,
4226 		    "The mechanical presence switch is open: "
4227 		    "port %d, port_cmd_status = 0x%x",
4228 		    port, port_cmd_status);
4229 	} else {
4230 		AHCIDBG2(AHCIDBG_INTR, ahci_ctlp,
4231 		    "The mechanical presence switch is close: "
4232 		    "port %d, port_cmd_status = 0x%x",
4233 		    port, port_cmd_status);
4234 	}
4235 
4236 	mutex_exit(&ahci_portp->ahciport_mutex);
4237 
4238 	return (AHCI_SUCCESS);
4239 }
4240 
4241 /*
4242  * Native Hot Plug Support.
4243  *
4244  * When set, it indicates that the internal PHYRDY signal changed state.
4245  * This bit reflects the state of PxSERR.DIAG.N.
4246  *
4247  * There are three kinds of conditions to generate this interrupt event:
4248  * 1. a device is inserted
4249  * 2. a device is disconnected
4250  * 3. when the link enters/exits a Partial or Slumber interface power
4251  *    management state
4252  *
4253  * If inteface power management is enabled for a port, the PxSERR.DIAG.N
4254  * bit may be set due to the link entering the Partial or Slumber power
4255  * management state, rather than due to a hot plug insertion or removal
4256  * event. So far, the power management is disabled, so the driver can
4257  * reliably get removal detection notification via the PxSERR.DIAG.N bit.
4258  */
4259 static int
4260 ahci_intr_phyrdy_change(ahci_ctl_t *ahci_ctlp,
4261     ahci_port_t *ahci_portp, uint8_t port)
4262 {
4263 	uint32_t port_sstatus = 0; /* No dev present & PHY not established. */
4264 	sata_device_t sdevice;
4265 	int dev_exists_now = 0;
4266 	int dev_existed_previously = 0;
4267 
4268 	AHCIDBG1(AHCIDBG_INTR|AHCIDBG_ENTRY, ahci_ctlp,
4269 	    "ahci_intr_phyrdy_change enter, port %d", port);
4270 
4271 	/* Clear PxSERR.DIAG.N to clear the interrupt bit */
4272 	mutex_enter(&ahci_portp->ahciport_mutex);
4273 	ddi_put32(ahci_ctlp->ahcictl_ahci_acc_handle,
4274 	    (uint32_t *)AHCI_PORT_PxSERR(ahci_ctlp, port),
4275 	    AHCI_SERROR_DIAG_N);
4276 	mutex_exit(&ahci_portp->ahciport_mutex);
4277 
4278 	mutex_enter(&ahci_ctlp->ahcictl_mutex);
4279 	if ((ahci_ctlp->ahcictl_sata_hba_tran == NULL) ||
4280 	    (ahci_portp == NULL)) {
4281 		/* The whole controller setup is not yet done. */
4282 		mutex_exit(&ahci_ctlp->ahcictl_mutex);
4283 		return (AHCI_SUCCESS);
4284 	}
4285 	mutex_exit(&ahci_ctlp->ahcictl_mutex);
4286 
4287 	mutex_enter(&ahci_portp->ahciport_mutex);
4288 
4289 	/* SStatus tells the presence of device. */
4290 	port_sstatus = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle,
4291 	    (uint32_t *)AHCI_PORT_PxSSTS(ahci_ctlp, port));
4292 
4293 	if (AHCI_SSTATUS_GET_DET(port_sstatus) ==
4294 	    AHCI_SSTATUS_DET_DEVPRESENT_PHYONLINE) {
4295 		dev_exists_now = 1;
4296 	}
4297 
4298 	if (ahci_portp->ahciport_device_type != SATA_DTYPE_NONE) {
4299 		dev_existed_previously = 1;
4300 	}
4301 
4302 	bzero((void *)&sdevice, sizeof (sata_device_t));
4303 	sdevice.satadev_addr.cport = ahci_ctlp->ahcictl_port_to_cport[port];
4304 	sdevice.satadev_addr.qual = SATA_ADDR_CPORT;
4305 	sdevice.satadev_addr.pmport = 0;
4306 	sdevice.satadev_state = SATA_PSTATE_PWRON;
4307 	ahci_portp->ahciport_port_state = SATA_PSTATE_PWRON;
4308 
4309 	if (dev_exists_now) {
4310 		if (dev_existed_previously) {
4311 			/* Things are fine now. The loss was temporary. */
4312 			AHCIDBG1(AHCIDBG_EVENT, ahci_ctlp,
4313 			    "ahci_intr_phyrdy_change  port %d "
4314 			    "device link lost/established", port);
4315 
4316 			mutex_exit(&ahci_portp->ahciport_mutex);
4317 			sata_hba_event_notify(
4318 			    ahci_ctlp->ahcictl_sata_hba_tran->sata_tran_hba_dip,
4319 			    &sdevice,
4320 			    SATA_EVNT_LINK_LOST|SATA_EVNT_LINK_ESTABLISHED);
4321 			mutex_enter(&ahci_portp->ahciport_mutex);
4322 
4323 		} else {
4324 			AHCIDBG1(AHCIDBG_EVENT, ahci_ctlp,
4325 			    "ahci_intr_phyrdy_change: port %d "
4326 			    "device link established", port);
4327 
4328 			ahci_disable_port_intrs(ahci_ctlp, ahci_portp, port);
4329 
4330 			/* A new device has been detected. */
4331 			ahci_find_dev_signature(ahci_ctlp, ahci_portp, port);
4332 
4333 			ahci_enable_port_intrs(ahci_ctlp, ahci_portp, port);
4334 
4335 			/* Try to start the port */
4336 			if (ahci_start_port(ahci_ctlp, ahci_portp, port)
4337 			    != AHCI_SUCCESS) {
4338 				sdevice.satadev_state |= SATA_PSTATE_FAILED;
4339 				AHCIDBG1(AHCIDBG_ERRS, ahci_ctlp,
4340 				    "ahci_intr_phyrdy_change: port %d failed "
4341 				    "at start port", port);
4342 			}
4343 
4344 			mutex_exit(&ahci_portp->ahciport_mutex);
4345 			sata_hba_event_notify(
4346 			    ahci_ctlp->ahcictl_sata_hba_tran->sata_tran_hba_dip,
4347 			    &sdevice,
4348 			    SATA_EVNT_LINK_ESTABLISHED);
4349 			mutex_enter(&ahci_portp->ahciport_mutex);
4350 
4351 		}
4352 	} else { /* No device exists now */
4353 
4354 		if (dev_existed_previously) {
4355 			AHCIDBG1(AHCIDBG_EVENT, ahci_ctlp,
4356 			    "ahci_intr_phyrdy_change: port %d "
4357 			    "device link lost", port);
4358 
4359 			ahci_reject_all_abort_pkts(ahci_ctlp, ahci_portp, port);
4360 			(void) ahci_put_port_into_notrunning_state(ahci_ctlp,
4361 			    ahci_portp, port);
4362 
4363 			/* An existing device is lost. */
4364 			ahci_portp->ahciport_device_type = SATA_DTYPE_NONE;
4365 
4366 			mutex_exit(&ahci_portp->ahciport_mutex);
4367 			sata_hba_event_notify(
4368 			    ahci_ctlp->ahcictl_sata_hba_tran->sata_tran_hba_dip,
4369 			    &sdevice,
4370 			    SATA_EVNT_LINK_LOST);
4371 			mutex_enter(&ahci_portp->ahciport_mutex);
4372 
4373 		} else {
4374 
4375 			/* Spurious interrupt */
4376 			AHCIDBG0(AHCIDBG_INTR, ahci_ctlp,
4377 			    "ahci_intr_phyrdy_change: "
4378 			    "spurious phy ready interrupt");
4379 		}
4380 	}
4381 
4382 	mutex_exit(&ahci_portp->ahciport_mutex);
4383 
4384 	return (AHCI_SUCCESS);
4385 }
4386 
4387 /*
4388  * PxIS.UFS - Unknown FIS Error
4389  *
4390  * This interrupt event means an unknown FIS was received and has been
4391  * copied into system memory. An unknown FIS is not considered an illegal
4392  * FIS, unless the length received is more than 64 bytes. If an unknown
4393  * FIS arrives with length <= 64 bytes, it is posted and the HBA continues
4394  * normal operation. If the unknown FIS is more than 64 bytes, then it
4395  * won't be posted to memory and PxSERR.ERR.P will be set, which is then
4396  * a fatal error.
4397  *
4398  * PxIS.OFS - Overflow Error
4399  *
4400  * Command list overflow is defined as software building a command table
4401  * that has fewer total bytes than the transaction given to the device.
4402  * On device writes, the HBA will run out of data, and on reads, there
4403  * will be no room to put the data.
4404  *
4405  * For an overflow on data read, either PIO or DMA, the HBA will set
4406  * PxIS.OFS, and the HBA will do a best effort to continue, and it's a
4407  * non-fatal error when the HBA can continues. Sometimes, it will cause
4408  * a fatal error and need the software to do something.
4409  *
4410  * For an overflow on data write, setting PxIS.OFS is optional for both
4411  * DMA and PIO, and it's a fatal error, and a COMRESET is required by
4412  * software to clean up from this serious error.
4413  *
4414  * PxIS.INFS - Interface Non-Fatal Error
4415  *
4416  * This interrupt event indicates that the HBA encountered an error on
4417  * the Serial ATA interface but was able to continue operation. The kind
4418  * of error usually occurred during a non-Data FIS, and under this condition
4419  * the FIS will be re-transmitted by HBA automatically.
4420  *
4421  * When the FMA is implemented, there should be a stat structure to
4422  * record how many every kind of error happens.
4423  */
4424 static int
4425 ahci_intr_non_fatal_error(ahci_ctl_t *ahci_ctlp, ahci_port_t *ahci_portp,
4426     uint8_t port, uint32_t intr_status)
4427 {
4428 	uint32_t port_serror;
4429 #if AHCI_DEBUG
4430 	uint32_t port_cmd_status;
4431 	int current_slot;
4432 	sata_pkt_t *satapkt;
4433 #endif
4434 
4435 	mutex_enter(&ahci_portp->ahciport_mutex);
4436 
4437 	port_serror = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle,
4438 	    (uint32_t *)AHCI_PORT_PxSERR(ahci_ctlp, port));
4439 
4440 	AHCIDBG2(AHCIDBG_INTR|AHCIDBG_ENTRY|AHCIDBG_ERRS, ahci_ctlp,
4441 	    "ahci_intr_non_fatal_error: port %d, "
4442 	    "port_serror = 0x%x", port, port_serror);
4443 
4444 	ahci_log_serror_message(ahci_ctlp, port, port_serror);
4445 
4446 	if (intr_status & AHCI_INTR_STATUS_UFS) {
4447 		AHCIDBG1(AHCIDBG_ERRS, ahci_ctlp,
4448 		    "ahci port %d has unknown FIS error", port);
4449 
4450 		/* Clear the interrupt bit by clearing PxSERR.DIAG.F */
4451 		ddi_put32(ahci_ctlp->ahcictl_ahci_acc_handle,
4452 		    (uint32_t *)AHCI_PORT_PxSERR(ahci_ctlp, port),
4453 		    AHCI_SERROR_DIAG_F);
4454 	}
4455 
4456 #if AHCI_DEBUG
4457 	if (intr_status & AHCI_INTR_STATUS_OFS) {
4458 		AHCIDBG1(AHCIDBG_INTR|AHCIDBG_ERRS, ahci_ctlp,
4459 		    "ahci port %d has overflow error", port);
4460 	}
4461 
4462 	if (intr_status & AHCI_INTR_STATUS_INFS) {
4463 		AHCIDBG1(AHCIDBG_INTR|AHCIDBG_ERRS, ahci_ctlp,
4464 		    "ahci port %d has interface non fatal error", port);
4465 	}
4466 
4467 	/*
4468 	 * Record the error occurred command's slot.
4469 	 */
4470 	port_cmd_status = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle,
4471 	    (uint32_t *)AHCI_PORT_PxCMD(ahci_ctlp, port));
4472 
4473 	current_slot = (port_cmd_status & AHCI_CMD_STATUS_CCS) >>
4474 	    AHCI_CMD_STATUS_CCS_SHIFT;
4475 
4476 	satapkt = ahci_portp->ahciport_slot_pkts[current_slot];
4477 	if (satapkt != NULL) {
4478 		AHCIDBG2(AHCIDBG_INTR|AHCIDBG_ERRS, ahci_ctlp,
4479 		    "ahci_intr_non_fatal_error: pending_tags 0x%x "
4480 		    "cmd 0x%x", ahci_portp->ahciport_pending_tags,
4481 		    satapkt->satapkt_cmd.satacmd_cmd_reg);
4482 
4483 		AHCIDBG2(AHCIDBG_INTR|AHCIDBG_ERRS, ahci_ctlp,
4484 		    "ahci_intr_non_fatal_error: port %d, "
4485 		    "satapkt 0x%p is being processed when error occurs",
4486 		    port, (void *)satapkt);
4487 	}
4488 #endif
4489 	mutex_exit(&ahci_portp->ahciport_mutex);
4490 
4491 	return (AHCI_SUCCESS);
4492 }
4493 
4494 /*
4495  * According to the AHCI spec, the error types include system memory
4496  * errors, interface errors, port multiplier errors, device errors,
4497  * command list overflow, command list underflow, native command
4498  * queuing tag errors and pio data transfer errors.
4499  *
4500  * System memory errors such as target abort, master abort, and parity
4501  * may cause the host to stop, and they are serious errors and needed
4502  * to be recovered with software intervention. When system software
4503  * has given a pointer to the HBA that doesn't exist in physical memory,
4504  * a master/target abort error occurs, and PxIS.HBFS will be set. A
4505  * data error such as CRC or parity occurs, the HBA aborts the transfer
4506  * (if necessary) and PxIS.HBDS will be set.
4507  *
4508  * Interface errors are errors that occur due to electrical issues on
4509  * the interface, or protocol miscommunication between the device and
4510  * HBA, and the respective PxSERR register bit will be set. And PxIS.IFS
4511  * (fatal) or PxIS.INFS (non-fatal) will be set. The conditions that
4512  * causes PxIS.IFS/PxIS.INFS to be set are
4513  * 	1. in PxSERR.ERR, P bit is set to '1'
4514  *	2. in PxSERR.DIAG, C or H bit is set to '1'
4515  *	3. PhyRdy drop unexpectly, N bit is set to '1'
4516  * If the error occurred during a non-data FIS, the FIS must be
4517  * retransmitted, and the error is non-fatal and PxIS.INFS is set. If
4518  * the error occurred during a data FIS, the transfer will stop, so
4519  * the error is fatal and PxIS.IFS is set.
4520  *
4521  * When a FIS arrives that updates the taskfile, the HBA checks to see
4522  * if PxTFD.STS.ERR is set. If yes, PxIS.TFES will be set and the HBA
4523  * stops processing any more commands.
4524  *
4525  * Command list overflow is defined as software building a command table
4526  * that has fewer total bytes than the transaction given to the device.
4527  * On device writes, the HBA will run out of data, and on reads, there
4528  * will be no room to put the data. For an overflow on data read, either
4529  * PIO or DMA, the HBA will set PxIS.OFS, and it's a non-fatal error.
4530  * For an overflow on data write, setting PxIS.OFS is optional for both
4531  * DMA and PIO, and a COMRESET is required by software to clean up from
4532  * this serious error.
4533  *
4534  * Command list underflow is defined as software building a command
4535  * table that has more total bytes than the transaction given to the
4536  * device. For data writes, both PIO and DMA, the device will detect
4537  * an error and end the transfer. And these errors are most likely going
4538  * to be fatal errors that will cause the port to be restarted. For
4539  * data reads, the HBA updates its PRD byte count, and may be
4540  * able to continue normally, but is not required to. And The HBA is
4541  * not required to detect underflow conditions for native command
4542  * queuing command.
4543  *
4544  * The HBA does not actively check incoming DMA Setup FISes to ensure
4545  * that the PxSACT register bit for that slot is set. Existing error
4546  * mechanisms, such as host bus failure, or bad protocol, are used to
4547  * recover from this case.
4548  *
4549  * In accordance with Serial ATA 1.0a, DATA FISes prior to the final
4550  * DATA FIS must be an integral number of Dwords. If the HBA receives
4551  * a request which is not an integral number of Dwords, the HBA
4552  * set PxSERR.ERR.P to '1', set PxIS.IFS to '1' and stop running until
4553  * software restarts the port. And the HBA ensures that the size
4554  * of the DATA FIS received during a PIO command matches the size in
4555  * the Transfer Cound field of the preceding PIO Setup FIS, if not, the
4556  * HBA sets PxSERR.ERR.P to '1', set PxIS.IFS to '1', and then
4557  * stop running until software restarts the port.
4558  */
4559 /*
4560  * the fatal errors include PxIS.IFS, PxIS.HBDS, PxIS.HBFS and PxIS.TFES.
4561  *
4562  * PxIS.IFS indicates that the hba encountered an error on the serial ata
4563  * interface which caused the transfer to stop.
4564  *
4565  * PxIS.HBDS indicates that the hba encountered a data error
4566  * (uncorrectable ecc/parity) when reading from or writing to system memory.
4567  *
4568  * PxIS.HBFS indicates that the hba encountered a host bus error that it
4569  * cannot recover from, such as a bad software pointer.
4570  *
4571  * PxIS.TFES is set whenever the status register is updated by the device
4572  * and the error bit (bit 0) is set.
4573  */
4574 static int
4575 ahci_intr_fatal_error(ahci_ctl_t *ahci_ctlp, ahci_port_t *ahci_portp,
4576     uint8_t port, uint32_t intr_status, uint32_t retrieve_errinfo_slot_status)
4577 {
4578 	uint32_t port_cmd_status;
4579 	uint32_t port_serror;
4580 	uint32_t task_file_status;
4581 	int failed_slot;
4582 	sata_pkt_t *spkt;
4583 	uint8_t err_byte;
4584 	ahci_event_arg_t *args;
4585 
4586 	mutex_enter(&ahci_portp->ahciport_mutex);
4587 
4588 	/*
4589 	 * ahci_intr_phyrdy_change() may have rendered it to
4590 	 * SATA_DTYPE_NONE.
4591 	 */
4592 	if (ahci_portp->ahciport_device_type == SATA_DTYPE_NONE) {
4593 		AHCIDBG1(AHCIDBG_ENTRY|AHCIDBG_INTR, ahci_ctlp,
4594 		    "ahci_intr_fatal_error: port %d no device attached, "
4595 		    "and just return without doing anything", port);
4596 		goto out0;
4597 	}
4598 
4599 	/*
4600 	 * Read PxCMD.CCS to determine the slot that the HBA
4601 	 * was processing when the error occurred.
4602 	 */
4603 	port_cmd_status = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle,
4604 	    (uint32_t *)AHCI_PORT_PxCMD(ahci_ctlp, port));
4605 	failed_slot = (port_cmd_status & AHCI_CMD_STATUS_CCS) >>
4606 	    AHCI_CMD_STATUS_CCS_SHIFT;
4607 
4608 	spkt = ahci_portp->ahciport_slot_pkts[failed_slot];
4609 	AHCIDBG2(AHCIDBG_INTR|AHCIDBG_ERRS, ahci_ctlp,
4610 	    "ahci_intr_fatal_error: spkt 0x%p is being processed when "
4611 	    "fatal error occurred for port %d", spkt, port);
4612 
4613 	if (intr_status & AHCI_INTR_STATUS_TFES) {
4614 		task_file_status = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle,
4615 		    (uint32_t *)AHCI_PORT_PxTFD(ahci_ctlp, port));
4616 		AHCIDBG2(AHCIDBG_INTR|AHCIDBG_ERRS, ahci_ctlp,
4617 		    "ahci_intr_fatal_error: port %d "
4618 		    "task_file_status = 0x%x", port, task_file_status);
4619 
4620 		err_byte = (task_file_status & AHCI_TFD_ERR_MASK)
4621 		    >> AHCI_TFD_ERR_SHIFT;
4622 
4623 		/*
4624 		 * Won't emit the error message if it is an IDENTIFY DEVICE
4625 		 * command sent to an ATAPI device.
4626 		 */
4627 		if ((spkt != NULL) &&
4628 		    (spkt->satapkt_cmd.satacmd_cmd_reg == SATAC_ID_DEVICE) &&
4629 		    (err_byte == SATA_ERROR_ABORT))
4630 			goto out1;
4631 
4632 		/*
4633 		 * Won't emit the error message if it is an ATAPI PACKET command
4634 		 */
4635 		if ((spkt != NULL) &&
4636 		    (spkt->satapkt_cmd.satacmd_cmd_reg == SATAC_PACKET))
4637 			goto out1;
4638 	}
4639 
4640 	ahci_log_fatal_error_message(ahci_ctlp, port, intr_status);
4641 
4642 out1:
4643 	port_serror = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle,
4644 	    (uint32_t *)AHCI_PORT_PxSERR(ahci_ctlp, port));
4645 	ahci_log_serror_message(ahci_ctlp, port, port_serror);
4646 
4647 	/* Prepare the argument for the taskq */
4648 	args = ahci_portp->ahciport_event_args;
4649 	args->ahciea_ctlp = (void *)ahci_ctlp;
4650 	args->ahciea_portp = (void *)ahci_portp;
4651 	args->ahciea_event = intr_status;
4652 	args->ahciea_retrierr_slot = retrieve_errinfo_slot_status;
4653 
4654 	/* Start the taskq to handle error recovery */
4655 	if ((ddi_taskq_dispatch(ahci_ctlp->ahcictl_event_taskq,
4656 	    ahci_events_handler,
4657 	    (void *)args, DDI_NOSLEEP)) != DDI_SUCCESS) {
4658 		cmn_err(CE_WARN, "ahci start taskq for event handler failed");
4659 	}
4660 out0:
4661 	mutex_exit(&ahci_portp->ahciport_mutex);
4662 
4663 	return (AHCI_SUCCESS);
4664 }
4665 
4666 /*
4667  * Hot Plug Operation for platforms that support Cold Presence Detect.
4668  *
4669  * When set, a device status has changed as detected by the cold presence
4670  * detect logic. This bit can either be set due to a non-connected port
4671  * receiving a device, or a connected port having its device removed.
4672  * This bit is only valid if the port supports cold presence detect as
4673  * indicated by PxCMD.CPD set to '1'.
4674  *
4675  * At the moment, this interrupt is not needed and disabled and we just
4676  * log the debug message.
4677  */
4678 /* ARGSUSED */
4679 static int
4680 ahci_intr_cold_port_detect(ahci_ctl_t *ahci_ctlp,
4681     ahci_port_t *ahci_portp, uint8_t port)
4682 {
4683 	uint32_t port_cmd_status;
4684 	sata_device_t sdevice;
4685 
4686 	AHCIDBG1(AHCIDBG_INTR, ahci_ctlp,
4687 	    "ahci_intr_cold_port_detect enter, port %d", port);
4688 
4689 	mutex_enter(&ahci_portp->ahciport_mutex);
4690 
4691 	port_cmd_status = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle,
4692 	    (uint32_t *)AHCI_PORT_PxCMD(ahci_ctlp, port));
4693 	if (!(port_cmd_status & AHCI_CMD_STATUS_CPD)) {
4694 		AHCIDBG1(AHCIDBG_INTR, ahci_ctlp,
4695 		    "port %d does not support cold presence detect, so "
4696 		    "we just ignore this interrupt", port);
4697 		mutex_exit(&ahci_portp->ahciport_mutex);
4698 		return (AHCI_SUCCESS);
4699 	}
4700 
4701 	AHCIDBG1(AHCIDBG_INTR, ahci_ctlp,
4702 	    "port %d device status has changed", port);
4703 
4704 	bzero((void *)&sdevice, sizeof (sata_device_t));
4705 	sdevice.satadev_addr.cport = ahci_ctlp->ahcictl_port_to_cport[port];
4706 	sdevice.satadev_addr.qual = SATA_ADDR_CPORT;
4707 	sdevice.satadev_addr.pmport = 0;
4708 	sdevice.satadev_state = SATA_PSTATE_PWRON;
4709 
4710 	if (port_cmd_status & AHCI_CMD_STATUS_CPS) {
4711 		AHCIDBG1(AHCIDBG_INTR, ahci_ctlp,
4712 		    "port %d: a device is hot plugged", port);
4713 		mutex_exit(&ahci_portp->ahciport_mutex);
4714 		sata_hba_event_notify(
4715 		    ahci_ctlp->ahcictl_sata_hba_tran->sata_tran_hba_dip,
4716 		    &sdevice,
4717 		    SATA_EVNT_DEVICE_ATTACHED);
4718 		mutex_enter(&ahci_portp->ahciport_mutex);
4719 
4720 	} else {
4721 		AHCIDBG1(AHCIDBG_INTR, ahci_ctlp,
4722 		    "port %d: a device is hot unplugged", port);
4723 		mutex_exit(&ahci_portp->ahciport_mutex);
4724 		sata_hba_event_notify(
4725 		    ahci_ctlp->ahcictl_sata_hba_tran->sata_tran_hba_dip,
4726 		    &sdevice,
4727 		    SATA_EVNT_DEVICE_DETACHED);
4728 		mutex_enter(&ahci_portp->ahciport_mutex);
4729 	}
4730 
4731 	mutex_exit(&ahci_portp->ahciport_mutex);
4732 
4733 	return (AHCI_SUCCESS);
4734 }
4735 
4736 /*
4737  * Enable the interrupts for a particular port.
4738  *
4739  * WARNING!!! ahciport_mutex should be acquired before the function
4740  * is called.
4741  */
4742 /* ARGSUSED */
4743 static void
4744 ahci_enable_port_intrs(ahci_ctl_t *ahci_ctlp,
4745     ahci_port_t *ahci_portp, uint8_t port)
4746 {
4747 	AHCIDBG1(AHCIDBG_ENTRY, ahci_ctlp,
4748 	    "ahci_enable_port_intrs enter, port %d", port);
4749 
4750 	/*
4751 	 * Clear port interrupt status before enabling interrupt
4752 	 */
4753 	ddi_put32(ahci_ctlp->ahcictl_ahci_acc_handle,
4754 	    (uint32_t *)AHCI_PORT_PxIS(ahci_ctlp, port),
4755 	    AHCI_PORT_INTR_MASK);
4756 
4757 	/*
4758 	 * Clear the pending bit from IS.IPS
4759 	 */
4760 	ddi_put32(ahci_ctlp->ahcictl_ahci_acc_handle,
4761 	    (uint32_t *)AHCI_GLOBAL_IS(ahci_ctlp), (1 << port));
4762 
4763 	/*
4764 	 * Enable the following interrupts:
4765 	 *	Device to Host Register FIS Interrupt (DHRS)
4766 	 *	PIO Setup FIS Interrupt (PSS)
4767 	 *	Unknown FIS Interrupt (UFS)
4768 	 *	Port Connect Change Status (PCS)
4769 	 *	PhyRdy Change Status (PRCS)
4770 	 *	Overflow Status (OFS)
4771 	 *	Interface Non-fatal Error Status (INFS)
4772 	 *	Interface Fatal Error Status (IFS)
4773 	 *	Host Bus Data Error Status (HBDS)
4774 	 *	Host Bus Fatal Error Status (HBFS)
4775 	 *	Task File Error Status (TFES)
4776 	 */
4777 	ddi_put32(ahci_ctlp->ahcictl_ahci_acc_handle,
4778 	    (uint32_t *)AHCI_PORT_PxIE(ahci_ctlp, port),
4779 	    (AHCI_INTR_STATUS_DHRS |
4780 	    AHCI_INTR_STATUS_PSS |
4781 	    AHCI_INTR_STATUS_UFS |
4782 	    AHCI_INTR_STATUS_DPS |
4783 	    AHCI_INTR_STATUS_PCS |
4784 	    AHCI_INTR_STATUS_PRCS |
4785 	    AHCI_INTR_STATUS_OFS |
4786 	    AHCI_INTR_STATUS_INFS |
4787 	    AHCI_INTR_STATUS_IFS |
4788 	    AHCI_INTR_STATUS_HBDS |
4789 	    AHCI_INTR_STATUS_HBFS |
4790 	    AHCI_INTR_STATUS_TFES));
4791 }
4792 
4793 /*
4794  * Enable interrupts for all the ports.
4795  *
4796  * WARNING!!! ahcictl_mutex should be acquired before the function
4797  * is called.
4798  */
4799 static void
4800 ahci_enable_all_intrs(ahci_ctl_t *ahci_ctlp)
4801 {
4802 	uint32_t ghc_control;
4803 
4804 	AHCIDBG0(AHCIDBG_ENTRY, ahci_ctlp, "ahci_enable_all_intrs enter");
4805 
4806 	ghc_control = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle,
4807 	    (uint32_t *)AHCI_GLOBAL_GHC(ahci_ctlp));
4808 
4809 	ghc_control |= AHCI_HBA_GHC_IE;
4810 
4811 	ddi_put32(ahci_ctlp->ahcictl_ahci_acc_handle,
4812 	    (uint32_t *)AHCI_GLOBAL_GHC(ahci_ctlp), ghc_control);
4813 }
4814 
4815 /*
4816  * Disable interrupts for a particular port.
4817  *
4818  * WARNING!!! ahciport_mutex should be acquired before the function
4819  * is called.
4820  */
4821 /* ARGSUSED */
4822 static void
4823 ahci_disable_port_intrs(ahci_ctl_t *ahci_ctlp,
4824     ahci_port_t *ahci_portp, uint8_t port)
4825 {
4826 	AHCIDBG1(AHCIDBG_ENTRY, ahci_ctlp,
4827 	    "ahci_disable_port_intrs enter, port %d", port);
4828 
4829 	ddi_put32(ahci_ctlp->ahcictl_ahci_acc_handle,
4830 	    (uint32_t *)AHCI_PORT_PxIE(ahci_ctlp, port), 0);
4831 }
4832 
4833 /*
4834  * Disable interrupts for the whole HBA.
4835  *
4836  * The global bit is cleared, then all interrupt sources from all
4837  * ports are disabled.
4838  *
4839  * WARNING!!! ahcictl_mutex should be acquired before the function
4840  * is called.
4841  */
4842 static void
4843 ahci_disable_all_intrs(ahci_ctl_t *ahci_ctlp)
4844 {
4845 	uint32_t ghc_control;
4846 
4847 	AHCIDBG0(AHCIDBG_ENTRY, ahci_ctlp, "ahci_disable_all_intrs enter");
4848 
4849 	ghc_control = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle,
4850 	    (uint32_t *)AHCI_GLOBAL_GHC(ahci_ctlp));
4851 
4852 	ghc_control &= ~ AHCI_HBA_GHC_IE;
4853 
4854 	ddi_put32(ahci_ctlp->ahcictl_ahci_acc_handle,
4855 	    (uint32_t *)AHCI_GLOBAL_GHC(ahci_ctlp), ghc_control);
4856 }
4857 
4858 /*
4859  * Handle INTx and legacy interrupts.
4860  */
4861 static int
4862 ahci_add_legacy_intrs(ahci_ctl_t *ahci_ctlp)
4863 {
4864 	dev_info_t	*dip = ahci_ctlp->ahcictl_dip;
4865 	int		actual, count = 0;
4866 	int		x, y, rc, inum = 0;
4867 
4868 	AHCIDBG0(AHCIDBG_ENTRY|AHCIDBG_INIT, ahci_ctlp,
4869 	    "ahci_add_legacy_intrs enter");
4870 
4871 	/* get number of interrupts. */
4872 	rc = ddi_intr_get_nintrs(dip, DDI_INTR_TYPE_FIXED, &count);
4873 	if ((rc != DDI_SUCCESS) || (count == 0)) {
4874 		AHCIDBG2(AHCIDBG_INTR|AHCIDBG_INIT, ahci_ctlp,
4875 		    "ddi_intr_get_nintrs() failed, "
4876 		    "rc %d count %d\n", rc, count);
4877 		return (DDI_FAILURE);
4878 	}
4879 
4880 	/* Allocate an array of interrupt handles. */
4881 	ahci_ctlp->ahcictl_intr_size = count * sizeof (ddi_intr_handle_t);
4882 	ahci_ctlp->ahcictl_intr_htable =
4883 	    kmem_zalloc(ahci_ctlp->ahcictl_intr_size, KM_SLEEP);
4884 
4885 	/* call ddi_intr_alloc(). */
4886 	rc = ddi_intr_alloc(dip, ahci_ctlp->ahcictl_intr_htable,
4887 	    DDI_INTR_TYPE_FIXED,
4888 	    inum, count, &actual, DDI_INTR_ALLOC_STRICT);
4889 
4890 	if ((rc != DDI_SUCCESS) || (actual == 0)) {
4891 		AHCIDBG1(AHCIDBG_INTR|AHCIDBG_INIT, ahci_ctlp,
4892 		    "ddi_intr_alloc() failed, rc %d\n", rc);
4893 		kmem_free(ahci_ctlp->ahcictl_intr_htable,
4894 		    ahci_ctlp->ahcictl_intr_size);
4895 		return (DDI_FAILURE);
4896 	}
4897 
4898 	if (actual < count) {
4899 		AHCIDBG2(AHCIDBG_INTR|AHCIDBG_INIT, ahci_ctlp,
4900 		    "Requested: %d, Received: %d", count, actual);
4901 
4902 		for (x = 0; x < actual; x++) {
4903 			(void) ddi_intr_free(ahci_ctlp->ahcictl_intr_htable[x]);
4904 		}
4905 
4906 		kmem_free(ahci_ctlp->ahcictl_intr_htable,
4907 		    ahci_ctlp->ahcictl_intr_size);
4908 		return (DDI_FAILURE);
4909 	}
4910 
4911 	ahci_ctlp->ahcictl_intr_cnt = actual;
4912 
4913 	/* Get intr priority. */
4914 	if (ddi_intr_get_pri(ahci_ctlp->ahcictl_intr_htable[0],
4915 	    &ahci_ctlp->ahcictl_intr_pri) != DDI_SUCCESS) {
4916 		AHCIDBG0(AHCIDBG_INTR|AHCIDBG_INIT, ahci_ctlp,
4917 		    "ddi_intr_get_pri() failed");
4918 
4919 		for (x = 0; x < actual; x++) {
4920 			(void) ddi_intr_free(ahci_ctlp->ahcictl_intr_htable[x]);
4921 		}
4922 
4923 		kmem_free(ahci_ctlp->ahcictl_intr_htable,
4924 		    ahci_ctlp->ahcictl_intr_size);
4925 		return (DDI_FAILURE);
4926 	}
4927 
4928 	/* Test for high level interrupt. */
4929 	if (ahci_ctlp->ahcictl_intr_pri >= ddi_intr_get_hilevel_pri()) {
4930 		AHCIDBG0(AHCIDBG_INTR|AHCIDBG_INIT, ahci_ctlp,
4931 		    "ahci_add_legacy_intrs: Hi level intr not supported");
4932 
4933 		for (x = 0; x < actual; x++) {
4934 			(void) ddi_intr_free(ahci_ctlp->ahcictl_intr_htable[x]);
4935 		}
4936 
4937 		kmem_free(ahci_ctlp->ahcictl_intr_htable,
4938 		    sizeof (ddi_intr_handle_t));
4939 
4940 		return (DDI_FAILURE);
4941 	}
4942 
4943 	/* Call ddi_intr_add_handler(). */
4944 	for (x = 0; x < actual; x++) {
4945 		if (ddi_intr_add_handler(ahci_ctlp->ahcictl_intr_htable[x],
4946 		    ahci_intr, (caddr_t)ahci_ctlp, NULL) != DDI_SUCCESS) {
4947 			AHCIDBG0(AHCIDBG_INTR|AHCIDBG_INIT, ahci_ctlp,
4948 			    "ddi_intr_add_handler() failed");
4949 
4950 			for (y = 0; y < actual; y++) {
4951 				(void) ddi_intr_free(
4952 				    ahci_ctlp->ahcictl_intr_htable[y]);
4953 			}
4954 
4955 			kmem_free(ahci_ctlp->ahcictl_intr_htable,
4956 			    ahci_ctlp->ahcictl_intr_size);
4957 			return (DDI_FAILURE);
4958 		}
4959 	}
4960 
4961 	/* Call ddi_intr_enable() for legacy interrupts. */
4962 	for (x = 0; x < ahci_ctlp->ahcictl_intr_cnt; x++) {
4963 		(void) ddi_intr_enable(ahci_ctlp->ahcictl_intr_htable[x]);
4964 	}
4965 
4966 	return (DDI_SUCCESS);
4967 }
4968 
4969 /*
4970  * Handle MSI interrupts.
4971  */
4972 static int
4973 ahci_add_msi_intrs(ahci_ctl_t *ahci_ctlp)
4974 {
4975 	dev_info_t *dip = ahci_ctlp->ahcictl_dip;
4976 	int		count, avail, actual;
4977 	int		x, y, rc, inum = 0;
4978 
4979 	AHCIDBG0(AHCIDBG_ENTRY|AHCIDBG_INIT, ahci_ctlp,
4980 	    "ahci_add_msi_intrs enter");
4981 
4982 	/* get number of interrupts. */
4983 	rc = ddi_intr_get_nintrs(dip, DDI_INTR_TYPE_MSI, &count);
4984 	if ((rc != DDI_SUCCESS) || (count == 0)) {
4985 		AHCIDBG2(AHCIDBG_INTR|AHCIDBG_INIT, ahci_ctlp,
4986 		    "ddi_intr_get_nintrs() failed, "
4987 		    "rc %d count %d\n", rc, count);
4988 		return (DDI_FAILURE);
4989 	}
4990 
4991 	/* get number of available interrupts. */
4992 	rc = ddi_intr_get_navail(dip, DDI_INTR_TYPE_MSI, &avail);
4993 	if ((rc != DDI_SUCCESS) || (avail == 0)) {
4994 		AHCIDBG2(AHCIDBG_INTR|AHCIDBG_INIT, ahci_ctlp,
4995 		    "ddi_intr_get_navail() failed, "
4996 		    "rc %d avail %d\n", rc, avail);
4997 		return (DDI_FAILURE);
4998 	}
4999 
5000 	if (avail < count) {
5001 		AHCIDBG2(AHCIDBG_INTR|AHCIDBG_INIT, ahci_ctlp,
5002 		    "ddi_intr_get_nvail returned %d, navail() returned %d",
5003 		    count, avail);
5004 	}
5005 
5006 	/* Allocate an array of interrupt handles. */
5007 	ahci_ctlp->ahcictl_intr_size = count * sizeof (ddi_intr_handle_t);
5008 	ahci_ctlp->ahcictl_intr_htable =
5009 	    kmem_alloc(ahci_ctlp->ahcictl_intr_size, KM_SLEEP);
5010 
5011 	/* call ddi_intr_alloc(). */
5012 	rc = ddi_intr_alloc(dip, ahci_ctlp->ahcictl_intr_htable,
5013 	    DDI_INTR_TYPE_MSI, inum, count, &actual, DDI_INTR_ALLOC_NORMAL);
5014 
5015 	if ((rc != DDI_SUCCESS) || (actual == 0)) {
5016 		AHCIDBG1(AHCIDBG_INTR|AHCIDBG_INIT, ahci_ctlp,
5017 		    "ddi_intr_alloc() failed, rc %d\n", rc);
5018 		kmem_free(ahci_ctlp->ahcictl_intr_htable,
5019 		    ahci_ctlp->ahcictl_intr_size);
5020 		return (DDI_FAILURE);
5021 	}
5022 
5023 	/* use interrupt count returned */
5024 	if (actual < count) {
5025 		AHCIDBG2(AHCIDBG_INTR|AHCIDBG_INIT, ahci_ctlp,
5026 		    "Requested: %d, Received: %d", count, actual);
5027 	}
5028 
5029 	ahci_ctlp->ahcictl_intr_cnt = actual;
5030 
5031 	/*
5032 	 * Get priority for first msi, assume remaining are all the same.
5033 	 */
5034 	if (ddi_intr_get_pri(ahci_ctlp->ahcictl_intr_htable[0],
5035 	    &ahci_ctlp->ahcictl_intr_pri) != DDI_SUCCESS) {
5036 		AHCIDBG0(AHCIDBG_INTR|AHCIDBG_INIT, ahci_ctlp,
5037 		    "ddi_intr_get_pri() failed");
5038 
5039 		/* Free already allocated intr. */
5040 		for (y = 0; y < actual; y++) {
5041 			(void) ddi_intr_free(ahci_ctlp->ahcictl_intr_htable[y]);
5042 		}
5043 
5044 		kmem_free(ahci_ctlp->ahcictl_intr_htable,
5045 		    ahci_ctlp->ahcictl_intr_size);
5046 		return (DDI_FAILURE);
5047 	}
5048 
5049 	/* Test for high level interrupt. */
5050 	if (ahci_ctlp->ahcictl_intr_pri >= ddi_intr_get_hilevel_pri()) {
5051 		AHCIDBG0(AHCIDBG_INTR|AHCIDBG_INIT, ahci_ctlp,
5052 		    "ahci_add_msi_intrs: Hi level intr not supported");
5053 
5054 		/* Free already allocated intr. */
5055 		for (y = 0; y < actual; y++) {
5056 			(void) ddi_intr_free(ahci_ctlp->ahcictl_intr_htable[y]);
5057 		}
5058 
5059 		kmem_free(ahci_ctlp->ahcictl_intr_htable,
5060 		    sizeof (ddi_intr_handle_t));
5061 
5062 		return (DDI_FAILURE);
5063 	}
5064 
5065 	/* Call ddi_intr_add_handler(). */
5066 	for (x = 0; x < actual; x++) {
5067 		if (ddi_intr_add_handler(ahci_ctlp->ahcictl_intr_htable[x],
5068 		    ahci_intr, (caddr_t)ahci_ctlp, NULL) != DDI_SUCCESS) {
5069 			AHCIDBG0(AHCIDBG_INTR|AHCIDBG_INIT, ahci_ctlp,
5070 			    "ddi_intr_add_handler() failed");
5071 
5072 			/* Free already allocated intr. */
5073 			for (y = 0; y < actual; y++) {
5074 				(void) ddi_intr_free(
5075 				    ahci_ctlp->ahcictl_intr_htable[y]);
5076 			}
5077 
5078 			kmem_free(ahci_ctlp->ahcictl_intr_htable,
5079 			    ahci_ctlp->ahcictl_intr_size);
5080 			return (DDI_FAILURE);
5081 		}
5082 	}
5083 
5084 
5085 	(void) ddi_intr_get_cap(ahci_ctlp->ahcictl_intr_htable[0],
5086 	    &ahci_ctlp->ahcictl_intr_cap);
5087 
5088 	if (ahci_ctlp->ahcictl_intr_cap & DDI_INTR_FLAG_BLOCK) {
5089 		/* Call ddi_intr_block_enable() for MSI. */
5090 		(void) ddi_intr_block_enable(ahci_ctlp->ahcictl_intr_htable,
5091 		    ahci_ctlp->ahcictl_intr_cnt);
5092 	} else {
5093 		/* Call ddi_intr_enable() for MSI non block enable. */
5094 		for (x = 0; x < ahci_ctlp->ahcictl_intr_cnt; x++) {
5095 			(void) ddi_intr_enable(
5096 			    ahci_ctlp->ahcictl_intr_htable[x]);
5097 		}
5098 	}
5099 
5100 	return (DDI_SUCCESS);
5101 }
5102 
5103 /*
5104  * Removes the registered interrupts irrespective of whether they
5105  * were legacy or MSI.
5106  *
5107  * WARNING!!! The controller interrupts must be disabled before calling
5108  * this routine.
5109  */
5110 static void
5111 ahci_rem_intrs(ahci_ctl_t *ahci_ctlp)
5112 {
5113 	int x;
5114 
5115 	AHCIDBG0(AHCIDBG_ENTRY, ahci_ctlp, "ahci_rem_intrs entered");
5116 
5117 	/* Disable all interrupts. */
5118 	if ((ahci_ctlp->ahcictl_intr_type == DDI_INTR_TYPE_MSI) &&
5119 	    (ahci_ctlp->ahcictl_intr_cap & DDI_INTR_FLAG_BLOCK)) {
5120 		/* Call ddi_intr_block_disable(). */
5121 		(void) ddi_intr_block_disable(ahci_ctlp->ahcictl_intr_htable,
5122 		    ahci_ctlp->ahcictl_intr_cnt);
5123 	} else {
5124 		for (x = 0; x < ahci_ctlp->ahcictl_intr_cnt; x++) {
5125 			(void) ddi_intr_disable(
5126 			    ahci_ctlp->ahcictl_intr_htable[x]);
5127 		}
5128 	}
5129 
5130 	/* Call ddi_intr_remove_handler(). */
5131 	for (x = 0; x < ahci_ctlp->ahcictl_intr_cnt; x++) {
5132 		(void) ddi_intr_remove_handler(
5133 		    ahci_ctlp->ahcictl_intr_htable[x]);
5134 		(void) ddi_intr_free(ahci_ctlp->ahcictl_intr_htable[x]);
5135 	}
5136 
5137 	kmem_free(ahci_ctlp->ahcictl_intr_htable, ahci_ctlp->ahcictl_intr_size);
5138 }
5139 
5140 /*
5141  * This routine tries to put port into P:NotRunning state by clearing
5142  * PxCMD.ST. HBA will clear PxCI to 0h, PxSACT to 0h, PxCMD.CCS to 0h
5143  * and PxCMD.CR to '0'.
5144  *
5145  * WARNING!!! ahciport_mutex should be acquired before the function
5146  * is called.
5147  */
5148 /* ARGSUSED */
5149 static int
5150 ahci_put_port_into_notrunning_state(ahci_ctl_t *ahci_ctlp,
5151     ahci_port_t *ahci_portp, uint8_t port)
5152 {
5153 	uint32_t port_cmd_status;
5154 	int loop_count;
5155 
5156 	AHCIDBG1(AHCIDBG_ENTRY, ahci_ctlp,
5157 	    "ahci_put_port_into_notrunning_state enter: port %d", port);
5158 
5159 	port_cmd_status = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle,
5160 	    (uint32_t *)AHCI_PORT_PxCMD(ahci_ctlp, port));
5161 
5162 	port_cmd_status &= ~AHCI_CMD_STATUS_ST;
5163 	ddi_put32(ahci_ctlp->ahcictl_ahci_acc_handle,
5164 	    (uint32_t *)AHCI_PORT_PxCMD(ahci_ctlp, port), port_cmd_status);
5165 
5166 	/* Wait until PxCMD.CR is cleared */
5167 	loop_count = 0;
5168 	do {
5169 		port_cmd_status =
5170 		    ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle,
5171 		    (uint32_t *)AHCI_PORT_PxCMD(ahci_ctlp, port));
5172 
5173 		if (loop_count++ > AHCI_POLLRATE_PORT_IDLE) {
5174 			AHCIDBG2(AHCIDBG_INIT, ahci_ctlp,
5175 			    "clearing port %d CMD.CR timeout, "
5176 			    "port_cmd_status = 0x%x", port,
5177 			    port_cmd_status);
5178 			/*
5179 			 * We are effectively timing out after 0.5 sec.
5180 			 * This value is specified in AHCI spec.
5181 			 */
5182 			break;
5183 		}
5184 
5185 	/* Wait for 10 millisec */
5186 #ifndef __lock_lint
5187 		delay(AHCI_10MS_TICKS);
5188 #endif /* __lock_lint */
5189 
5190 	} while (port_cmd_status & AHCI_CMD_STATUS_CR);
5191 
5192 	ahci_portp->ahciport_flags &= ~AHCI_PORT_FLAG_STARTED;
5193 
5194 	if (port_cmd_status & AHCI_CMD_STATUS_CR) {
5195 		AHCIDBG2(AHCIDBG_INIT|AHCIDBG_POLL_LOOP, ahci_ctlp,
5196 		    "ahci_put_port_into_notrunning_state: failed to clear "
5197 		    "PxCMD.CR to '0' after loop count: %d, and "
5198 		    "port_cmd_status = 0x%x", loop_count, port_cmd_status);
5199 		return (AHCI_FAILURE);
5200 	} else {
5201 		AHCIDBG2(AHCIDBG_INIT|AHCIDBG_POLL_LOOP, ahci_ctlp,
5202 		    "ahci_put_port_into_notrunning_state: succeeded to clear "
5203 		    "PxCMD.CR to '0' after loop count: %d, and "
5204 		    "port_cmd_status = 0x%x", loop_count, port_cmd_status);
5205 		return (AHCI_SUCCESS);
5206 	}
5207 }
5208 
5209 /*
5210  * First clear PxCMD.ST, and then check PxTFD. If both PxTFD.STS.BSY
5211  * and PxTFD.STS.DRQ cleared to '0', it means the device is in a
5212  * stable state, then set PxCMD.ST to '1' to start the port directly.
5213  * If PxTFD.STS.BSY or PxTFD.STS.DRQ is set to '1', then issue a
5214  * COMRESET to the device to put it in an idle state.
5215  *
5216  * The fifth argument returns whether the port reset is involved during
5217  * the process.
5218  *
5219  * The routine will be called under six scenarios:
5220  *	1. Initialize the port
5221  *	2. To abort the packet(s)
5222  *	3. To reset the port
5223  *	4. To activate the port
5224  *	5. Fatal error recovery
5225  *	6. To abort the timeout packet(s)
5226  *
5227  * WARNING!!! ahciport_mutex should be acquired before the function
5228  * is called. And ahciport_mutex will be released before the reset
5229  * event is reported to sata module by calling sata_hba_event_notify,
5230  * and then be acquired again later.
5231  */
5232 static int
5233 ahci_restart_port_wait_till_ready(ahci_ctl_t *ahci_ctlp,
5234     ahci_port_t *ahci_portp, uint8_t port, int flag, int *reset_flag)
5235 {
5236 	uint32_t task_file_status;
5237 	sata_device_t sdevice;
5238 	int rval;
5239 
5240 	AHCIDBG1(AHCIDBG_ENTRY, ahci_ctlp,
5241 	    "ahci_restart_port_wait_till_ready: port %d enter", port);
5242 
5243 	/* First disable the interrupt */
5244 	ahci_disable_port_intrs(ahci_ctlp, ahci_portp, port);
5245 
5246 	/* Then clear PxCMD.ST */
5247 	rval = ahci_put_port_into_notrunning_state(ahci_ctlp, ahci_portp,
5248 	    port);
5249 	if (rval != AHCI_SUCCESS)
5250 		/*
5251 		 * If PxCMD.CR does not clear within a reasonable time, it
5252 		 * may assume the interface is in a hung condition and may
5253 		 * continue with issuing the port reset.
5254 		 */
5255 		goto reset;
5256 
5257 	/* Then clear PxSERR */
5258 	ddi_put32(ahci_ctlp->ahcictl_ahci_acc_handle,
5259 	    (uint32_t *)AHCI_PORT_PxSERR(ahci_ctlp, port),
5260 	    AHCI_SERROR_CLEAR_ALL);
5261 
5262 	/* The get PxTFD */
5263 	task_file_status = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle,
5264 	    (uint32_t *)AHCI_PORT_PxTFD(ahci_ctlp, port));
5265 
5266 	/*
5267 	 * Check whether the device is in a stable status, if yes,
5268 	 * then start the port directly. However for ahci_tran_dport_reset,
5269 	 * we may have to perform a port reset.
5270 	 */
5271 	if (!(task_file_status & (AHCI_TFD_STS_BSY | AHCI_TFD_STS_DRQ)) &&
5272 	    !(flag & AHCI_PORT_RESET))
5273 		goto out;
5274 
5275 reset:
5276 	/* Set the reset in progress flag */
5277 	if (!(flag & AHCI_RESET_NO_EVENTS_UP)) {
5278 		ahci_portp->ahciport_reset_in_progress = 1;
5279 	}
5280 
5281 	/*
5282 	 * If PxTFD.STS.BSY or PxTFD.STS.DRQ is set to '1', then issue
5283 	 * a COMRESET to the device
5284 	 */
5285 	rval = ahci_port_reset(ahci_ctlp, ahci_portp, port);
5286 	if (rval != AHCI_SUCCESS)
5287 		AHCIDBG1(AHCIDBG_ERRS, ahci_ctlp,
5288 		    "ahci_restart_port_wait_till_ready: port %d failed",
5289 		    port);
5290 
5291 	if (reset_flag != NULL)
5292 		*reset_flag = 1;
5293 
5294 	/* Indicate to the framework that a reset has happened. */
5295 	if (!(flag & AHCI_RESET_NO_EVENTS_UP)) {
5296 
5297 		bzero((void *)&sdevice, sizeof (sata_device_t));
5298 		sdevice.satadev_addr.cport =
5299 		    ahci_ctlp->ahcictl_port_to_cport[port];
5300 		sdevice.satadev_addr.pmport = 0;
5301 		sdevice.satadev_addr.qual = SATA_ADDR_DCPORT;
5302 
5303 		sdevice.satadev_state = SATA_DSTATE_RESET |
5304 		    SATA_DSTATE_PWR_ACTIVE;
5305 		if (ahci_ctlp->ahcictl_sata_hba_tran) {
5306 			mutex_exit(&ahci_portp->ahciport_mutex);
5307 			sata_hba_event_notify(
5308 			    ahci_ctlp->ahcictl_sata_hba_tran->sata_tran_hba_dip,
5309 			    &sdevice,
5310 			    SATA_EVNT_DEVICE_RESET);
5311 			mutex_enter(&ahci_portp->ahciport_mutex);
5312 		}
5313 
5314 		AHCIDBG1(AHCIDBG_EVENT, ahci_ctlp,
5315 		    "port %d sending event up: SATA_EVNT_RESET", port);
5316 	}
5317 out:
5318 	/* Start the port */
5319 	if (!(flag & AHCI_PORT_INIT)) {
5320 		(void) ahci_start_port(ahci_ctlp, ahci_portp, port);
5321 		ahci_enable_port_intrs(ahci_ctlp, ahci_portp, port);
5322 	}
5323 
5324 	return (rval);
5325 }
5326 
5327 /*
5328  * This routine may be called under four scenarios:
5329  *	a) do the recovery from fatal error
5330  *	b) or we need to timeout some commands
5331  *	c) or we need to abort some commands
5332  *	d) or we need reset device/port/controller
5333  *
5334  * In all these scenarios, we need to send any pending unfinished
5335  * commands up to sata framework.
5336  *
5337  * WARNING!!! ahciport_mutex should be acquired before the function is called.
5338  */
5339 static void
5340 ahci_mop_commands(ahci_ctl_t *ahci_ctlp,
5341     ahci_port_t *ahci_portp,
5342     uint8_t port,
5343     uint32_t slot_status,
5344     uint32_t failed_tags,
5345     uint32_t timeout_tags,
5346     uint32_t aborted_tags,
5347     uint32_t reset_tags)
5348 {
5349 	uint32_t finished_tags, unfinished_tags;
5350 	int tmp_slot;
5351 	sata_pkt_t *satapkt;
5352 
5353 	AHCIDBG2(AHCIDBG_ERRS|AHCIDBG_ENTRY, ahci_ctlp,
5354 	    "ahci_mop_commands entered: port: %d slot_status: 0x%x",
5355 	    port, slot_status);
5356 
5357 	AHCIDBG4(AHCIDBG_ERRS|AHCIDBG_ENTRY, ahci_ctlp,
5358 	    "ahci_mop_commands: failed_tags: 0x%x, "
5359 	    "timeout_tags: 0x%x aborted_tags: 0x%x, "
5360 	    "reset_tags: 0x%x", failed_tags,
5361 	    timeout_tags, aborted_tags, reset_tags);
5362 
5363 	finished_tags = ahci_portp->ahciport_pending_tags &
5364 	    ~slot_status & AHCI_SLOT_MASK(ahci_ctlp);
5365 
5366 	unfinished_tags = slot_status &
5367 	    AHCI_SLOT_MASK(ahci_ctlp) &
5368 	    ~failed_tags &
5369 	    ~aborted_tags &
5370 	    ~reset_tags &
5371 	    ~timeout_tags;
5372 
5373 	/*
5374 	 * When AHCI_PORT_FLAG_RQSENSE is set, it means REQUEST SENSE
5375 	 * command doesn't complete successfully due to one of the
5376 	 * following three conditions:
5377 	 *
5378 	 *	1. Fatal error - failed_tags includes its slot
5379 	 *	2. Timed out - timeout_tags includes its slot
5380 	 *	3. Aborted when hot unplug - aborted_tags includes its slot
5381 	 */
5382 	if (ahci_portp->ahciport_flags & AHCI_PORT_FLAG_RQSENSE) {
5383 		AHCIDBG1(AHCIDBG_ERRS, ahci_ctlp, "ahci_mop_commands "
5384 		    "is called for port %d while REQUEST SENSE for error "
5385 		    "retrieval is being executed", port);
5386 		ASSERT(ahci_portp->ahciport_mop_in_progress > 1);
5387 		finished_tags = 0;
5388 		unfinished_tags = 0;
5389 	}
5390 
5391 	/* Send up finished packets with SATA_PKT_COMPLETED */
5392 	while (finished_tags) {
5393 		tmp_slot = ddi_ffs(finished_tags) - 1;
5394 		if (tmp_slot == -1) {
5395 			break;
5396 		}
5397 
5398 		satapkt = ahci_portp->ahciport_slot_pkts[tmp_slot];
5399 		ASSERT(satapkt != NULL);
5400 
5401 		AHCIDBG1(AHCIDBG_INFO, ahci_ctlp, "ahci_mop_commands: "
5402 		    "sending up pkt 0x%p with SATA_PKT_COMPLETED",
5403 		    (void *)satapkt);
5404 
5405 		/*
5406 		 * Cannot fetch the return register content since the port
5407 		 * was restarted, so the corresponding tag will be set to
5408 		 * aborted tags.
5409 		 */
5410 		if (satapkt->satapkt_cmd.satacmd_flags.sata_special_regs) {
5411 			CLEAR_BIT(finished_tags, tmp_slot);
5412 			aborted_tags |= tmp_slot;
5413 			continue;
5414 		}
5415 
5416 		CLEAR_BIT(ahci_portp->ahciport_pending_tags, tmp_slot);
5417 		CLEAR_BIT(finished_tags, tmp_slot);
5418 		ahci_portp->ahciport_slot_pkts[tmp_slot] = NULL;
5419 
5420 		SENDUP_PACKET(ahci_portp, satapkt, SATA_PKT_COMPLETED);
5421 	}
5422 
5423 	/* Send up failed packets with SATA_PKT_DEV_ERROR. */
5424 	while (failed_tags) {
5425 		tmp_slot = ddi_ffs(failed_tags) - 1;
5426 		if (tmp_slot == -1) {
5427 			break;
5428 		}
5429 
5430 		satapkt = ahci_portp->ahciport_slot_pkts[tmp_slot];
5431 		ASSERT(satapkt != NULL);
5432 
5433 		AHCIDBG1(AHCIDBG_ERRS, ahci_ctlp, "ahci_mop_commands: "
5434 		    "sending up pkt 0x%p with SATA_PKT_DEV_ERROR",
5435 		    (void *)satapkt);
5436 
5437 		CLEAR_BIT(ahci_portp->ahciport_pending_tags, tmp_slot);
5438 		CLEAR_BIT(failed_tags, tmp_slot);
5439 		ahci_portp->ahciport_slot_pkts[tmp_slot] = NULL;
5440 
5441 		SENDUP_PACKET(ahci_portp, satapkt, SATA_PKT_DEV_ERROR);
5442 	}
5443 
5444 	/* Send up timeout packets with SATA_PKT_TIMEOUT. */
5445 	while (timeout_tags) {
5446 		tmp_slot = ddi_ffs(timeout_tags) - 1;
5447 		if (tmp_slot == -1) {
5448 			break;
5449 		}
5450 
5451 		satapkt = ahci_portp->ahciport_slot_pkts[tmp_slot];
5452 		ASSERT(satapkt != NULL);
5453 
5454 		AHCIDBG1(AHCIDBG_ERRS, ahci_ctlp, "ahci_mop_commands: "
5455 		    "sending up pkt 0x%p with SATA_PKT_TIMEOUT",
5456 		    (void *)satapkt);
5457 
5458 		CLEAR_BIT(ahci_portp->ahciport_pending_tags, tmp_slot);
5459 		CLEAR_BIT(timeout_tags, tmp_slot);
5460 		ahci_portp->ahciport_slot_pkts[tmp_slot] = NULL;
5461 
5462 		SENDUP_PACKET(ahci_portp, satapkt, SATA_PKT_TIMEOUT);
5463 	}
5464 
5465 	/* Send up aborted packets with SATA_PKT_ABORTED */
5466 	while (aborted_tags) {
5467 		tmp_slot = ddi_ffs(aborted_tags) - 1;
5468 		if (tmp_slot == -1) {
5469 			break;
5470 		}
5471 
5472 		satapkt = ahci_portp->ahciport_slot_pkts[tmp_slot];
5473 		ASSERT(satapkt != NULL);
5474 
5475 		AHCIDBG1(AHCIDBG_ERRS, ahci_ctlp, "ahci_mop_commands: "
5476 		    "sending up pkt 0x%p with SATA_PKT_ABORTED",
5477 		    (void *)satapkt);
5478 
5479 		CLEAR_BIT(ahci_portp->ahciport_pending_tags, tmp_slot);
5480 		CLEAR_BIT(aborted_tags, tmp_slot);
5481 		ahci_portp->ahciport_slot_pkts[tmp_slot] = NULL;
5482 
5483 		SENDUP_PACKET(ahci_portp, satapkt, SATA_PKT_ABORTED);
5484 	}
5485 
5486 	/* Send up reset packets with SATA_PKT_RESET. */
5487 	while (reset_tags) {
5488 		tmp_slot = ddi_ffs(reset_tags) - 1;
5489 		if (tmp_slot == -1) {
5490 			break;
5491 		}
5492 
5493 		satapkt = ahci_portp->ahciport_slot_pkts[tmp_slot];
5494 		ASSERT(satapkt != NULL);
5495 
5496 		AHCIDBG1(AHCIDBG_ERRS, ahci_ctlp, "ahci_mop_commands: "
5497 		    "sending up pkt 0x%p with SATA_PKT_RESET",
5498 		    (void *)satapkt);
5499 
5500 		CLEAR_BIT(ahci_portp->ahciport_pending_tags, tmp_slot);
5501 		CLEAR_BIT(reset_tags, tmp_slot);
5502 		ahci_portp->ahciport_slot_pkts[tmp_slot] = NULL;
5503 
5504 		SENDUP_PACKET(ahci_portp, satapkt, SATA_PKT_RESET);
5505 	}
5506 
5507 	/* Send up unfinished packets with SATA_PKT_RESET */
5508 	while (unfinished_tags) {
5509 		tmp_slot = ddi_ffs(unfinished_tags) - 1;
5510 		if (tmp_slot == -1) {
5511 			break;
5512 		}
5513 
5514 		satapkt = ahci_portp->ahciport_slot_pkts[tmp_slot];
5515 		ASSERT(satapkt != NULL);
5516 
5517 		AHCIDBG1(AHCIDBG_ERRS, ahci_ctlp, "ahci_mop_commands: "
5518 		    "sending up pkt 0x%p with SATA_PKT_RESET",
5519 		    (void *)satapkt);
5520 
5521 		CLEAR_BIT(ahci_portp->ahciport_pending_tags, tmp_slot);
5522 		CLEAR_BIT(unfinished_tags, tmp_slot);
5523 		ahci_portp->ahciport_slot_pkts[tmp_slot] = NULL;
5524 
5525 		SENDUP_PACKET(ahci_portp, satapkt, SATA_PKT_RESET);
5526 	}
5527 
5528 	ahci_portp->ahciport_mop_in_progress--;
5529 	ASSERT(ahci_portp->ahciport_mop_in_progress >= 0);
5530 
5531 	if (ahci_portp->ahciport_mop_in_progress == 0)
5532 		ahci_portp->ahciport_flags &= ~AHCI_PORT_FLAG_MOPPING;
5533 }
5534 
5535 /*
5536  * This routine is going to first request a REQUEST SENSE sata pkt from sata
5537  * module, and then deliver it to the HBA to get the sense data and copy
5538  * the sense data back to the orignal failed sata pkt, and free the REQUEST
5539  * SENSE sata pkt later.
5540  */
5541 static void
5542 ahci_get_rqsense_data(ahci_ctl_t *ahci_ctlp, ahci_port_t *ahci_portp,
5543     uint8_t port, sata_pkt_t *spkt)
5544 {
5545 	sata_device_t	sdevice;
5546 	sata_pkt_t	*rs_spkt;
5547 	sata_cmd_t	*sata_cmd;
5548 	ddi_dma_handle_t buf_dma_handle;
5549 	int		loop_count;
5550 	int		rval;
5551 #if AHCI_DEBUG
5552 	struct scsi_extended_sense *rqsense;
5553 #endif
5554 
5555 	AHCIDBG1(AHCIDBG_ENTRY, ahci_ctlp,
5556 	    "ahci_get_rqsense_data enter: port %d", port);
5557 
5558 	/* Prepare the sdevice data */
5559 	bzero((void *)&sdevice, sizeof (sata_device_t));
5560 	sdevice.satadev_addr.cport = ahci_ctlp->ahcictl_port_to_cport[port];
5561 
5562 	sdevice.satadev_addr.qual = SATA_ADDR_DCPORT;
5563 	sdevice.satadev_addr.pmport = 0;
5564 
5565 	sata_cmd = &spkt->satapkt_cmd;
5566 
5567 	/*
5568 	 * Call the sata hba interface to get a rs spkt
5569 	 */
5570 	loop_count = 0;
5571 loop:
5572 	rs_spkt = sata_get_error_retrieval_pkt(ahci_ctlp->ahcictl_dip,
5573 	    &sdevice, SATA_ERR_RETR_PKT_TYPE_ATAPI);
5574 	if (rs_spkt == NULL) {
5575 		if (loop_count++ < AHCI_POLLRATE_GET_SPKT) {
5576 			/* Sleep for a while */
5577 			delay(AHCI_10MS_TICKS);
5578 			goto loop;
5579 
5580 		}
5581 		/* Timed out after 1s */
5582 		AHCIDBG1(AHCIDBG_INFO, ahci_ctlp,
5583 		    "failed to get rs spkt for port %d", port);
5584 		return;
5585 	}
5586 
5587 	ASSERT(rs_spkt->satapkt_op_mode & SATA_OPMODE_SYNCH);
5588 
5589 	/*
5590 	 * This flag is used to handle the specific error recovery when the
5591 	 * REQUEST SENSE command gets a faiure (failure error or time-out).
5592 	 */
5593 	ahci_portp->ahciport_flags |= AHCI_PORT_FLAG_RQSENSE;
5594 
5595 	/* The driver would like to do it in POLL mode */
5596 	rs_spkt->satapkt_op_mode |= SATA_OPMODE_POLLING;
5597 
5598 	/*
5599 	 * This start is not supposed to fail because after port is restarted,
5600 	 * the command slot is empty
5601 	 */
5602 	rval = ahci_do_sync_start(ahci_ctlp, ahci_portp, port, rs_spkt);
5603 	ASSERT(rval != AHCI_FAILURE);
5604 
5605 	/* Remove the flag after REQUEST SENSE command is completed */
5606 	ahci_portp->ahciport_flags &= ~ AHCI_PORT_FLAG_RQSENSE;
5607 
5608 	if (rs_spkt->satapkt_reason == SATA_PKT_COMPLETED) {
5609 		/* Update the request sense data */
5610 		buf_dma_handle = *(ddi_dma_handle_t *)
5611 		    (rs_spkt->satapkt_cmd.satacmd_err_ret_buf_handle);
5612 		rval = ddi_dma_sync(buf_dma_handle, 0, 0,
5613 		    DDI_DMA_SYNC_FORKERNEL);
5614 		if (rval == DDI_SUCCESS) {
5615 			/* Copy the request sense data */
5616 			bcopy(rs_spkt->
5617 			    satapkt_cmd.satacmd_bp->b_un.b_addr,
5618 			    &sata_cmd->satacmd_rqsense,
5619 			    SATA_ATAPI_MIN_RQSENSE_LEN);
5620 #if AHCI_DEBUG
5621 			rqsense = (struct scsi_extended_sense *)
5622 			    sata_cmd->satacmd_rqsense;
5623 
5624 			/* Dump the sense data */
5625 			AHCIDBG0(AHCIDBG_SENSEDATA, ahci_ctlp, "\n");
5626 			AHCIDBG2(AHCIDBG_SENSEDATA, ahci_ctlp,
5627 			    "Sense data for satapkt %p ATAPI cmd 0x%x",
5628 			    spkt, sata_cmd->satacmd_acdb[0]);
5629 			AHCIDBG5(AHCIDBG_SENSEDATA, ahci_ctlp,
5630 			    "  es_code 0x%x es_class 0x%x "
5631 			    "es_key 0x%x es_add_code 0x%x "
5632 			    "es_qual_code 0x%x",
5633 			    rqsense->es_code, rqsense->es_class,
5634 			    rqsense->es_key, rqsense->es_add_code,
5635 			    rqsense->es_qual_code);
5636 #endif
5637 		}
5638 	}
5639 
5640 	sata_free_error_retrieval_pkt(rs_spkt);
5641 }
5642 
5643 /*
5644  * Fatal errors will cause the HBA to enter the ERR: Fatal state. To recover,
5645  * the port must be restarted. When the HBA detects thus error, it may try
5646  * to abort a transfer. And if the transfer was aborted, the device is
5647  * expected to send a D2H Register FIS with PxTFD.STS.ERR set to '1' and both
5648  * PxTFD.STS.BSY and PxTFD.STS.DRQ cleared to '0'. Then system software knows
5649  * that the device is in a stable status and transfers may be restarted without
5650  * issuing a COMRESET to the device. If PxTFD.STS.BSY or PxTFD.STS.DRQ is set,
5651  * then the software will send the COMRESET to do the port reset.
5652  *
5653  * Software should perform the appropriate error recovery actions based on
5654  * whether non-queued commands were being issued or natived command queuing
5655  * commands were being issued.
5656  *
5657  * And software will complete the command that had the error with error mark
5658  * to higher level software.
5659  *
5660  * Fatal errors include the following:
5661  * 	PxIS.IFS - Interface Fatal Error Status
5662  * 	PxIS.HBDS - Host Bus Data Error Status
5663  * 	PxIS.HBFS - Host Bus Fatal Error Status
5664  *	PxIS.TFES - Task File Error Status
5665  *
5666  * WARNING!!! ahciport_mutex should be acquired before the function is called.
5667  */
5668 static void
5669 ahci_fatal_error_recovery_handler(ahci_ctl_t *ahci_ctlp,
5670     ahci_port_t *ahci_portp, uint8_t port, uint32_t intr_status,
5671     uint32_t retrieve_errinfo_slot_status)
5672 {
5673 	uint32_t	port_cmd_status, port_cmd_issue;
5674 	uint32_t	failed_tags = 0;
5675 	int		failed_slot;
5676 	int		reset_flag = 0;
5677 	ahci_fis_d2h_register_t	*ahci_rcvd_fisp;
5678 	sata_cmd_t	*sata_cmd;
5679 	sata_pkt_t	*spkt;
5680 
5681 	AHCIDBG1(AHCIDBG_ENTRY, ahci_ctlp,
5682 	    "ahci_fatal_error_recovery_handler enter: port %d", port);
5683 
5684 	/* Read PxCI to see which commands are still outstanding */
5685 	port_cmd_issue = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle,
5686 	    (uint32_t *)AHCI_PORT_PxCI(ahci_ctlp, port));
5687 
5688 	/*
5689 	 * Read PxCMD.CCS to determine the slot that the HBA
5690 	 * was processing when the error occurred.
5691 	 */
5692 	port_cmd_status = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle,
5693 	    (uint32_t *)AHCI_PORT_PxCMD(ahci_ctlp, port));
5694 	failed_slot = (port_cmd_status & AHCI_CMD_STATUS_CCS) >>
5695 	    AHCI_CMD_STATUS_CCS_SHIFT;
5696 
5697 	spkt = ahci_portp->ahciport_slot_pkts[failed_slot];
5698 	if (spkt == NULL) {
5699 		/* This may happen when interface errors occur */
5700 		goto next;
5701 	}
5702 	sata_cmd = &spkt->satapkt_cmd;
5703 
5704 	/*
5705 	 * We need to set retrieve_errinfo_slot_status to failed_slot
5706 	 * in case it's an interface error before REQUEST SENSE slot
5707 	 * is executed, that is spkt is NULL.
5708 	 */
5709 	if (retrieve_errinfo_slot_status != 0) {
5710 		failed_slot = retrieve_errinfo_slot_status;
5711 	}
5712 
5713 	/* The failed command must be one of the outstanding commands */
5714 	failed_tags = 0x1 << failed_slot;
5715 	ASSERT(failed_tags & port_cmd_issue);
5716 
5717 	/* Update the sata registers, especially PxSERR register */
5718 	ahci_update_sata_registers(ahci_ctlp, port,
5719 	    &spkt->satapkt_device);
5720 
5721 	/* Fill out the status and error registers for PxIS.TFES */
5722 	if (intr_status & AHCI_INTR_STATUS_TFES) {
5723 		ahci_rcvd_fisp = &(ahci_portp->ahciport_rcvd_fis->
5724 		    ahcirf_d2h_register_fis);
5725 
5726 		/* Copy the error context back to the sata_cmd */
5727 		ahci_copy_err_cnxt(sata_cmd, ahci_rcvd_fisp);
5728 	}
5729 
5730 next:
5731 
5732 #if AHCI_DEBUG
5733 	if (failed_tags == 0) {
5734 		AHCIDBG2(AHCIDBG_ERRS, ahci_ctlp,
5735 		    "ahci_fatal_error_recovery_handler: port %d interface "
5736 		    "error occurred while no command was processing "
5737 		    "port_cmd_issue = 0x%x", port, port_cmd_issue);
5738 	} else {
5739 		AHCIDBG3(AHCIDBG_ERRS, ahci_ctlp,
5740 		    "ahci_fatal_error_recovery_handler: port %d "
5741 		    "failed_tags = 0x%x, port_cmd_issue = 0x%x",
5742 		    port, failed_tags, port_cmd_issue);
5743 	}
5744 
5745 	/*
5746 	 * retrieve_errinfo_slot_status contains the slot number of REQUEST
5747 	 * SENSE command. If it is not 0, it means a fatal error happens after
5748 	 * REQUEST SENSE command is delivered to the HBA during the error
5749 	 * recovery process. At this time, AHCI_PORT_FLAG_RQSENSE is supposed
5750 	 * to be set, and the only outstanding command is REQUEST SENSE.
5751 	 */
5752 	if (retrieve_errinfo_slot_status != 0) {
5753 		AHCIDBG1(AHCIDBG_ERRS, ahci_ctlp,
5754 		    "ahci_fatal_error_recovery_handler: port %d REQUEST SENSE "
5755 		    "command for error retrieval failed", port);
5756 		ASSERT(ahci_portp->ahciport_flags & AHCI_PORT_FLAG_RQSENSE);
5757 		ASSERT(retrieve_errinfo_slot_status == port_cmd_issue);
5758 		ASSERT(spkt && spkt->satapkt_cmd.satacmd_acdb[0] ==
5759 		    SCMD_REQUEST_SENSE);
5760 	}
5761 #endif
5762 
5763 	ahci_portp->ahciport_flags |= AHCI_PORT_FLAG_MOPPING;
5764 	ahci_portp->ahciport_mop_in_progress++;
5765 
5766 	(void) ahci_restart_port_wait_till_ready(ahci_ctlp, ahci_portp,
5767 	    port, NULL, &reset_flag);
5768 
5769 	/*
5770 	 * Won't retrieve error information:
5771 	 * 1. Port reset was involved to recover
5772 	 * 2. No spkt is being executed
5773 	 * 3. IDENTIFY DEVICE command sent to ATAPI device
5774 	 * 4. REQUEST SENSE command during error recovery
5775 	 */
5776 	if (reset_flag || spkt == NULL ||
5777 	    spkt->satapkt_cmd.satacmd_cmd_reg == SATAC_ID_DEVICE ||
5778 	    retrieve_errinfo_slot_status != 0)
5779 		goto out;
5780 
5781 	/*
5782 	 * Deliver REQUEST SENSE for ATAPI command to gather information about
5783 	 * the error when a COMRESET has not been performed as part of the
5784 	 * error recovery.
5785 	 */
5786 	if (ahci_portp->ahciport_device_type == SATA_DTYPE_ATAPICD)
5787 		ahci_get_rqsense_data(ahci_ctlp, ahci_portp, port, spkt);
5788 
5789 out:
5790 	ahci_mop_commands(ahci_ctlp,
5791 	    ahci_portp,
5792 	    port,
5793 	    port_cmd_issue,
5794 	    failed_tags, /* failed tags */
5795 	    0, /* timeout tags */
5796 	    0, /* aborted tags */
5797 	    0); /* reset tags */
5798 }
5799 
5800 /*
5801  * Handle events - fatal error recovery
5802  */
5803 static void
5804 ahci_events_handler(void *args)
5805 {
5806 	ahci_event_arg_t *ahci_event_arg;
5807 	ahci_ctl_t *ahci_ctlp;
5808 	ahci_port_t *ahci_portp;
5809 	uint32_t event;
5810 	uint32_t retrieve_errinfo_slot_status;
5811 	uint8_t port;
5812 
5813 	ahci_event_arg = (ahci_event_arg_t *)args;
5814 	ahci_ctlp = ahci_event_arg->ahciea_ctlp;
5815 	ahci_portp = ahci_event_arg->ahciea_portp;
5816 	event = ahci_event_arg->ahciea_event;
5817 	retrieve_errinfo_slot_status = ahci_event_arg->ahciea_retrierr_slot;
5818 	port = ahci_portp->ahciport_port_num;
5819 
5820 	AHCIDBG3(AHCIDBG_ENTRY|AHCIDBG_INTR, ahci_ctlp,
5821 	    "ahci_events_handler enter: "
5822 	    "port %d intr_status = 0x%x retrieve_errinfo_slot_status = 0x%x",
5823 	    port, event, retrieve_errinfo_slot_status);
5824 
5825 	mutex_enter(&ahci_portp->ahciport_mutex);
5826 
5827 	/*
5828 	 * ahci_intr_phyrdy_change() may have rendered it to
5829 	 * SATA_DTYPE_NONE.
5830 	 */
5831 	if (ahci_portp->ahciport_device_type == SATA_DTYPE_NONE) {
5832 		AHCIDBG1(AHCIDBG_ENTRY|AHCIDBG_INTR, ahci_ctlp,
5833 		    "ahci_events_handler: port %d no device attached, "
5834 		    "and just return without doing anything", port);
5835 		goto out;
5836 	}
5837 
5838 	if (event & (AHCI_INTR_STATUS_IFS |
5839 	    AHCI_INTR_STATUS_HBDS |
5840 	    AHCI_INTR_STATUS_HBFS |
5841 	    AHCI_INTR_STATUS_TFES))
5842 		ahci_fatal_error_recovery_handler(ahci_ctlp, ahci_portp,
5843 		    port, event, retrieve_errinfo_slot_status);
5844 
5845 out:
5846 	mutex_exit(&ahci_portp->ahciport_mutex);
5847 }
5848 
5849 /*
5850  * ahci_watchdog_handler() and ahci_do_sync_start will call us if they
5851  * detect there are some commands which are timed out.
5852  */
5853 static void
5854 ahci_timeout_pkts(ahci_ctl_t *ahci_ctlp, ahci_port_t *ahci_portp,
5855     uint8_t port, uint32_t tmp_timeout_tags,
5856     uint32_t retrieve_errinfo_slot_status)
5857 {
5858 	uint32_t port_cmd_issue;
5859 	uint32_t finished_tags, timeout_tags;
5860 #ifndef __lock_lint
5861 	_NOTE(ARGUNUSED(retrieve_errinfo_slot_status))
5862 #endif
5863 
5864 	AHCIDBG1(AHCIDBG_TIMEOUT|AHCIDBG_ENTRY, ahci_ctlp,
5865 	    "ahci_timeout_pkts enter: port %d", port);
5866 
5867 	mutex_enter(&ahci_portp->ahciport_mutex);
5868 
5869 	/* Read PxCI to see which commands are still outstanding */
5870 	port_cmd_issue = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle,
5871 	    (uint32_t *)AHCI_PORT_PxCI(ahci_ctlp, port));
5872 	ASSERT(port_cmd_issue != 0);
5873 	ASSERT(tmp_timeout_tags & port_cmd_issue);
5874 
5875 #if AHCI_DEBUG
5876 	/*
5877 	 * Retrieve_errinfo_slot_status contains the slot number for
5878 	 * REQUEST SENSE, and if it is not 0, it means REQUEST SENSE
5879 	 * gets time out. At this time, AHCI_PORT_FLAG_RQSENSE is
5880 	 * supposed to be set, and REQUEST SENSE is supposed to be
5881 	 * the only outstanding command. And we can make sure the timed
5882 	 * out command must be REQUEST SENSE when AHCI_PORT_FLAG_RQSENSE
5883 	 * is set.
5884 	 */
5885 	if (retrieve_errinfo_slot_status != 0) {
5886 		AHCIDBG2(AHCIDBG_ERRS|AHCIDBG_TIMEOUT, ahci_ctlp,
5887 		    "ahci_timeout_pkts called while REQUEST SENSE "
5888 		    "command for errror recovery timed out "
5889 		    "timeout_tags = 0x%x port_cmd_issue = 0x%x",
5890 		    tmp_timeout_tags, port_cmd_issue);
5891 		ASSERT(ahci_portp->ahciport_flags & AHCI_PORT_FLAG_RQSENSE);
5892 		ASSERT(port_cmd_issue == retrieve_errinfo_slot_status);
5893 	}
5894 #endif
5895 
5896 	ahci_portp->ahciport_flags |= AHCI_PORT_FLAG_MOPPING;
5897 	ahci_portp->ahciport_mop_in_progress++;
5898 
5899 	(void) ahci_restart_port_wait_till_ready(ahci_ctlp, ahci_portp,
5900 	    port, NULL, NULL);
5901 
5902 	/*
5903 	 * Re-identify timeout tags because some previously checked commands
5904 	 * could already complete.
5905 	 */
5906 	finished_tags = ahci_portp->ahciport_pending_tags &
5907 	    ~port_cmd_issue & AHCI_SLOT_MASK(ahci_ctlp);
5908 	timeout_tags = tmp_timeout_tags & ~finished_tags;
5909 
5910 	AHCIDBG5(AHCIDBG_TIMEOUT, ahci_ctlp,
5911 	    "ahci_timeout_pkts: port %d, finished_tags = 0x%x, "
5912 	    "timeout_tags = 0x%x port_cmd_issue = 0x%x pending_tags = 0x%x ",
5913 	    port, finished_tags, timeout_tags,
5914 	    port_cmd_issue, ahci_portp->ahciport_pending_tags);
5915 
5916 	ahci_mop_commands(ahci_ctlp,
5917 	    ahci_portp,
5918 	    port,
5919 	    port_cmd_issue,
5920 	    0, /* failed tags */
5921 	    timeout_tags, /* timeout tags */
5922 	    0, /* aborted tags */
5923 	    0); /* reset tags */
5924 
5925 	mutex_exit(&ahci_portp->ahciport_mutex);
5926 }
5927 
5928 /*
5929  * Watchdog handler kicks in every 5 seconds to timeout any commands pending
5930  * for long time.
5931  */
5932 static void
5933 ahci_watchdog_handler(ahci_ctl_t *ahci_ctlp)
5934 {
5935 	ahci_port_t *ahci_portp;
5936 	sata_pkt_t *spkt;
5937 	uint32_t pending_tags = 0;
5938 	uint32_t timeout_tags = 0;
5939 	uint32_t port_cmd_status;
5940 	uint8_t port;
5941 	int tmp_slot;
5942 	int current_slot;
5943 	/* max number of cycles this packet should survive */
5944 	int max_life_cycles;
5945 
5946 	/* how many cycles this packet survived so far */
5947 	int watched_cycles;
5948 
5949 	mutex_enter(&ahci_ctlp->ahcictl_mutex);
5950 
5951 	AHCIDBG0(AHCIDBG_TIMEOUT|AHCIDBG_ENTRY, ahci_ctlp,
5952 	    "ahci_watchdog_handler entered");
5953 
5954 	for (port = 0; port < ahci_ctlp->ahcictl_num_ports; port++) {
5955 		if (!AHCI_PORT_IMPLEMENTED(ahci_ctlp, port)) {
5956 			continue;
5957 		}
5958 
5959 		ahci_portp = ahci_ctlp->ahcictl_ports[port];
5960 
5961 		mutex_enter(&ahci_portp->ahciport_mutex);
5962 		if (ahci_portp->ahciport_device_type == SATA_DTYPE_NONE) {
5963 			mutex_exit(&ahci_portp->ahciport_mutex);
5964 			continue;
5965 		}
5966 
5967 		/* Skip the check for those ports in error recovery */
5968 		if (ahci_portp->ahciport_flags & AHCI_PORT_FLAG_MOPPING) {
5969 			mutex_exit(&ahci_portp->ahciport_mutex);
5970 			continue;
5971 		}
5972 
5973 		port_cmd_status = ddi_get32(ahci_ctlp->ahcictl_ahci_acc_handle,
5974 		    (uint32_t *)AHCI_PORT_PxCMD(ahci_ctlp, port));
5975 		current_slot = (port_cmd_status & AHCI_CMD_STATUS_CCS) >>
5976 		    AHCI_CMD_STATUS_CCS_SHIFT;
5977 
5978 		pending_tags = ahci_portp->ahciport_pending_tags;
5979 		timeout_tags = 0;
5980 		while (pending_tags) {
5981 			tmp_slot = ddi_ffs(pending_tags) - 1;
5982 			if (tmp_slot == -1) {
5983 				break;
5984 			}
5985 
5986 			spkt = ahci_portp->ahciport_slot_pkts[tmp_slot];
5987 			if ((spkt != NULL) && spkt->satapkt_time &&
5988 			    !(spkt->satapkt_op_mode & SATA_OPMODE_POLLING)) {
5989 				/*
5990 				 * We are overloading satapkt_hba_driver_private
5991 				 * with watched_cycle count.
5992 				 *
5993 				 * If a packet has survived for more than it's
5994 				 * max life cycles, it is a candidate for time
5995 				 * out.
5996 				 */
5997 				watched_cycles = (int)(intptr_t)
5998 				    spkt->satapkt_hba_driver_private;
5999 				watched_cycles++;
6000 				max_life_cycles = (spkt->satapkt_time +
6001 				    ahci_watchdog_timeout - 1) /
6002 				    ahci_watchdog_timeout;
6003 
6004 				spkt->satapkt_hba_driver_private =
6005 				    (void *)(intptr_t)watched_cycles;
6006 
6007 				if (watched_cycles <= max_life_cycles)
6008 					goto next;
6009 
6010 				AHCIDBG1(AHCIDBG_ERRS, ahci_ctlp,
6011 				    "the current slot is %d", current_slot);
6012 				/*
6013 				 * We need to check whether the HBA has
6014 				 * begun to execute the command, if not,
6015 				 * then re-set the timer of the command.
6016 				 */
6017 				if (tmp_slot != current_slot) {
6018 					spkt->satapkt_hba_driver_private =
6019 					    (void *)(intptr_t)0;
6020 				} else {
6021 					timeout_tags |= (0x1 << tmp_slot);
6022 					cmn_err(CE_NOTE, "!ahci watchdog: "
6023 					    "port %d satapkt 0x%p timed out\n",
6024 					    port, (void *)spkt);
6025 				}
6026 			}
6027 next:
6028 			CLEAR_BIT(pending_tags, tmp_slot);
6029 		}
6030 
6031 		if (timeout_tags) {
6032 			mutex_exit(&ahci_portp->ahciport_mutex);
6033 			mutex_exit(&ahci_ctlp->ahcictl_mutex);
6034 			ahci_timeout_pkts(ahci_ctlp, ahci_portp,
6035 			    port, timeout_tags, 0);
6036 			mutex_enter(&ahci_ctlp->ahcictl_mutex);
6037 			mutex_enter(&ahci_portp->ahciport_mutex);
6038 		}
6039 
6040 		mutex_exit(&ahci_portp->ahciport_mutex);
6041 	}
6042 
6043 	/* Re-install the watchdog timeout handler */
6044 	if (ahci_ctlp->ahcictl_timeout_id != 0) {
6045 		ahci_ctlp->ahcictl_timeout_id =
6046 		    timeout((void (*)(void *))ahci_watchdog_handler,
6047 		    (caddr_t)ahci_ctlp, ahci_watchdog_tick);
6048 	}
6049 
6050 	mutex_exit(&ahci_ctlp->ahcictl_mutex);
6051 }
6052 
6053 /*
6054  * Fill the error context into sata_cmd for non-queued command error.
6055  */
6056 static void
6057 ahci_copy_err_cnxt(sata_cmd_t *scmd, ahci_fis_d2h_register_t *rfisp)
6058 {
6059 	scmd->satacmd_status_reg = GET_RFIS_STATUS(rfisp);
6060 	scmd->satacmd_error_reg = GET_RFIS_ERROR(rfisp);
6061 	scmd->satacmd_sec_count_lsb = GET_RFIS_SECTOR_COUNT(rfisp);
6062 	scmd->satacmd_lba_low_lsb = GET_RFIS_CYL_LOW(rfisp);
6063 	scmd->satacmd_lba_mid_lsb = GET_RFIS_CYL_MID(rfisp);
6064 	scmd->satacmd_lba_high_lsb = GET_RFIS_CYL_HI(rfisp);
6065 	scmd->satacmd_device_reg = GET_RFIS_DEV_HEAD(rfisp);
6066 
6067 	if (scmd->satacmd_addr_type == ATA_ADDR_LBA48) {
6068 		scmd->satacmd_sec_count_msb = GET_RFIS_SECTOR_COUNT_EXP(rfisp);
6069 		scmd->satacmd_lba_low_msb = GET_RFIS_CYL_LOW_EXP(rfisp);
6070 		scmd->satacmd_lba_mid_msb = GET_RFIS_CYL_MID_EXP(rfisp);
6071 		scmd->satacmd_lba_high_msb = GET_RFIS_CYL_HI_EXP(rfisp);
6072 	}
6073 }
6074 
6075 /*
6076  * Put the respective register value to sata_cmd_t for satacmd_flags.
6077  */
6078 static void
6079 ahci_copy_out_regs(sata_cmd_t *scmd, ahci_fis_d2h_register_t *rfisp)
6080 {
6081 	if (scmd->satacmd_flags.sata_copy_out_sec_count_msb)
6082 		scmd->satacmd_sec_count_msb = GET_RFIS_SECTOR_COUNT_EXP(rfisp);
6083 	if (scmd->satacmd_flags.sata_copy_out_lba_low_msb)
6084 		scmd->satacmd_lba_low_msb = GET_RFIS_CYL_LOW_EXP(rfisp);
6085 	if (scmd->satacmd_flags.sata_copy_out_lba_mid_msb)
6086 		scmd->satacmd_lba_mid_msb = GET_RFIS_CYL_MID_EXP(rfisp);
6087 	if (scmd->satacmd_flags.sata_copy_out_lba_high_msb)
6088 		scmd->satacmd_lba_high_msb = GET_RFIS_CYL_HI_EXP(rfisp);
6089 	if (scmd->satacmd_flags.sata_copy_out_sec_count_lsb)
6090 		scmd->satacmd_sec_count_lsb = GET_RFIS_SECTOR_COUNT(rfisp);
6091 	if (scmd->satacmd_flags.sata_copy_out_lba_low_lsb)
6092 		scmd->satacmd_lba_low_lsb = GET_RFIS_CYL_LOW(rfisp);
6093 	if (scmd->satacmd_flags.sata_copy_out_lba_mid_lsb)
6094 		scmd->satacmd_lba_mid_lsb = GET_RFIS_CYL_MID(rfisp);
6095 	if (scmd->satacmd_flags.sata_copy_out_lba_high_lsb)
6096 		scmd->satacmd_lba_high_lsb = GET_RFIS_CYL_HI(rfisp);
6097 	if (scmd->satacmd_flags.sata_copy_out_device_reg)
6098 		scmd->satacmd_device_reg = GET_RFIS_DEV_HEAD(rfisp);
6099 	if (scmd->satacmd_flags.sata_copy_out_error_reg)
6100 		scmd->satacmd_error_reg = GET_RFIS_ERROR(rfisp);
6101 }
6102 
6103 static void
6104 ahci_log_fatal_error_message(ahci_ctl_t *ahci_ctlp, uint8_t port,
6105     uint32_t intr_status)
6106 {
6107 #ifndef __lock_lint
6108 	_NOTE(ARGUNUSED(ahci_ctlp))
6109 #endif
6110 
6111 	if (intr_status & AHCI_INTR_STATUS_IFS)
6112 		cmn_err(CE_NOTE, "!ahci port %d has interface fatal "
6113 		    "error", port);
6114 
6115 	if (intr_status & AHCI_INTR_STATUS_HBDS)
6116 		cmn_err(CE_NOTE, "!ahci port %d has bus data error", port);
6117 
6118 	if (intr_status & AHCI_INTR_STATUS_HBFS)
6119 		cmn_err(CE_NOTE, "!ahci port %d has bus fatal error", port);
6120 
6121 	if (intr_status & AHCI_INTR_STATUS_TFES)
6122 		cmn_err(CE_NOTE, "!ahci port %d has task file error", port);
6123 
6124 	cmn_err(CE_NOTE, "!ahci port %d is trying to do error "
6125 	    "recovery", port);
6126 }
6127 
6128 /*
6129  * Dump the serror message to the log.
6130  */
6131 static void
6132 ahci_log_serror_message(ahci_ctl_t *ahci_ctlp, uint8_t port,
6133     uint32_t port_serror)
6134 {
6135 #ifndef __lock_lint
6136 	_NOTE(ARGUNUSED(ahci_ctlp))
6137 #endif
6138 	char *err_str;
6139 
6140 	if (port_serror & AHCI_SERROR_ERR_I) {
6141 		err_str = "Recovered Data Integrity Error (I)";
6142 		AHCIDBG2(AHCIDBG_ERRS, ahci_ctlp,
6143 		    "command error: port: %d, error: %s",
6144 		    port, err_str);
6145 	}
6146 
6147 	if (port_serror & AHCI_SERROR_ERR_M) {
6148 		err_str = "Recovered Communication Error (M)";
6149 		AHCIDBG2(AHCIDBG_ERRS, ahci_ctlp,
6150 		    "command error: port: %d, error: %s",
6151 		    port, err_str);
6152 	}
6153 
6154 	if (port_serror & AHCI_SERROR_ERR_T) {
6155 		err_str = "Transient Data Integrity Error (T)";
6156 		AHCIDBG2(AHCIDBG_ERRS, ahci_ctlp,
6157 		    "command error: port: %d, error: %s",
6158 		    port, err_str);
6159 	}
6160 
6161 	if (port_serror & AHCI_SERROR_ERR_C) {
6162 		err_str =
6163 		    "Persistent Communication or Data Integrity Error (C)";
6164 		AHCIDBG2(AHCIDBG_ERRS, ahci_ctlp,
6165 		    "command error: port: %d, error: %s",
6166 		    port, err_str);
6167 	}
6168 
6169 	if (port_serror & AHCI_SERROR_ERR_P) {
6170 		err_str = "Protocol Error (P)";
6171 		AHCIDBG2(AHCIDBG_ERRS, ahci_ctlp,
6172 		    "command error: port: %d, error: %s",
6173 		    port, err_str);
6174 	}
6175 
6176 	if (port_serror & AHCI_SERROR_ERR_E) {
6177 		err_str = "Internal Error (E)";
6178 		AHCIDBG2(AHCIDBG_ERRS, ahci_ctlp,
6179 		    "command error: port: %d, error: %s",
6180 		    port, err_str);
6181 	}
6182 
6183 	if (port_serror & AHCI_SERROR_DIAG_N) {
6184 		err_str = "PhyRdy Change (N)";
6185 		AHCIDBG2(AHCIDBG_ERRS, ahci_ctlp,
6186 		    "command error: port: %d, error: %s",
6187 		    port, err_str);
6188 	}
6189 
6190 	if (port_serror & AHCI_SERROR_DIAG_I) {
6191 		err_str = "Phy Internal Error (I)";
6192 		AHCIDBG2(AHCIDBG_ERRS, ahci_ctlp,
6193 		    "command error: port: %d, error: %s",
6194 		    port, err_str);
6195 	}
6196 
6197 	if (port_serror & AHCI_SERROR_DIAG_W) {
6198 		err_str = "Comm Wake (W)";
6199 		AHCIDBG2(AHCIDBG_ERRS, ahci_ctlp,
6200 		    "command error: port: %d, error: %s",
6201 		    port, err_str);
6202 	}
6203 
6204 	if (port_serror & AHCI_SERROR_DIAG_B) {
6205 		err_str = "10B to 8B Decode Error (B)";
6206 		AHCIDBG2(AHCIDBG_ERRS, ahci_ctlp,
6207 		    "command error: port: %d, error: %s",
6208 		    port, err_str);
6209 	}
6210 
6211 	if (port_serror & AHCI_SERROR_DIAG_D) {
6212 		err_str = "Disparity Error (D)";
6213 		AHCIDBG2(AHCIDBG_ERRS, ahci_ctlp,
6214 		    "command error: port: %d, error: %s",
6215 		    port, err_str);
6216 	}
6217 
6218 	if (port_serror & AHCI_SERROR_DIAG_C) {
6219 		err_str = "CRC Error (C)";
6220 		AHCIDBG2(AHCIDBG_ERRS, ahci_ctlp,
6221 		    "command error: port: %d, error: %s",
6222 		    port, err_str);
6223 	}
6224 
6225 	if (port_serror & AHCI_SERROR_DIAG_H) {
6226 		err_str = "Handshake Error (H)";
6227 		AHCIDBG2(AHCIDBG_ERRS, ahci_ctlp,
6228 		    "command error: port: %d, error: %s",
6229 		    port, err_str);
6230 	}
6231 
6232 	if (port_serror & AHCI_SERROR_DIAG_S) {
6233 		err_str = "Link Sequence Error (S)";
6234 		AHCIDBG2(AHCIDBG_ERRS, ahci_ctlp,
6235 		    "command error: port: %d, error: %s",
6236 		    port, err_str);
6237 	}
6238 
6239 	if (port_serror & AHCI_SERROR_DIAG_T) {
6240 		err_str = "Transport state transition error (T)";
6241 		AHCIDBG2(AHCIDBG_ERRS, ahci_ctlp,
6242 		    "command error: port: %d, error: %s",
6243 		    port, err_str);
6244 	}
6245 
6246 	if (port_serror & AHCI_SERROR_DIAG_F) {
6247 		err_str = "Unknown FIS Type (F)";
6248 		AHCIDBG2(AHCIDBG_ERRS, ahci_ctlp,
6249 		    "command error: port: %d, error: %s",
6250 		    port, err_str);
6251 	}
6252 
6253 	if (port_serror & AHCI_SERROR_DIAG_X) {
6254 		err_str = "Exchanged (X)";
6255 		AHCIDBG2(AHCIDBG_ERRS, ahci_ctlp,
6256 		    "command error: port: %d, error: %s",
6257 		    port, err_str);
6258 	}
6259 }
6260 
6261 /*
6262  * This routine is to calculate the total number of ports implemented
6263  * by the HBA.
6264  */
6265 static int
6266 ahci_get_num_implemented_ports(uint32_t ports_implemented)
6267 {
6268 	uint8_t i;
6269 	int num = 0;
6270 
6271 	for (i = 0; i < AHCI_MAX_PORTS; i++) {
6272 		if (((uint32_t)0x1 << i) & ports_implemented)
6273 			num++;
6274 	}
6275 
6276 	return (num);
6277 }
6278 
6279 static void
6280 ahci_log(ahci_ctl_t *ahci_ctlp, uint_t level, char *fmt, ...)
6281 {
6282 	va_list ap;
6283 
6284 	mutex_enter(&ahci_log_mutex);
6285 
6286 	va_start(ap, fmt);
6287 	if (ahci_ctlp) {
6288 		(void) sprintf(ahci_log_buf, "%s-[%d]:",
6289 		    ddi_get_name(ahci_ctlp->ahcictl_dip),
6290 		    ddi_get_instance(ahci_ctlp->ahcictl_dip));
6291 	} else {
6292 		(void) sprintf(ahci_log_buf, "ahci:");
6293 	}
6294 
6295 	(void) vsprintf(ahci_log_buf, fmt, ap);
6296 	va_end(ap);
6297 
6298 	cmn_err(level, "%s", ahci_log_buf);
6299 
6300 	mutex_exit(&ahci_log_mutex);
6301 }
6302