si3124.c revision 12686:a097917597fd
1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21
22/*
23 * Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
24 */
25
26
27/*
28 * SiliconImage 3124/3132 sata controller driver
29 */
30
31/*
32 *
33 *
34 * 			Few Design notes
35 *
36 *
37 * I. General notes
38 *
39 * Even though the driver is named as si3124, it is actually meant to
40 * work with both 3124 and 3132 controllers.
41 *
42 * The current file si3124.c is the main driver code. The si3124reg.h
43 * holds the register definitions from SiI 3124/3132 data sheets. The
44 * si3124var.h holds the driver specific definitions which are not
45 * directly derived from data sheets.
46 *
47 *
48 * II. Data structures
49 *
50 * si_ctl_state_t: This holds the driver private information for each
51 * 	controller instance. Each of the sata ports within a single
52 *	controller are represented by si_port_state_t. The
53 *	sictl_global_acc_handle and sictl_global_address map the
54 *	controller-wide global register space and are derived from pci
55 *	BAR 0. The sictl_port_acc_handle and sictl_port_addr map the
56 *	per-port register space and are derived from pci BAR 1.
57 *
58 * si_port_state_t: This holds the per port information. The siport_mutex
59 *	holds the per port mutex. The siport_pending_tags is the bit mask of
60 * 	commands posted to controller. The siport_slot_pkts[] holds the
61 * 	pending sata packets. The siport_port_type holds the device type
62 *	connected directly to the port while the siport_portmult_state
63 * 	holds the similar information for the devices behind a port
64 *	multiplier.
65 *
66 * si_prb_t: This contains the PRB being posted to the controller.
67 *	The two SGE entries contained within si_prb_t itself are not
68 *	really used to hold any scatter gather entries. The scatter gather
69 *	list is maintained external to PRB and is linked from one
70 * 	of the contained SGEs inside the PRB. For atapi devices, the
71 *	first contained SGE holds the PACKET and second contained
72 *	SGE holds the link to an external SGT. For non-atapi devices,
73 *	the first contained SGE works as link to external SGT while
74 *	second SGE is blank.
75 *
76 * external SGT tables: The external SGT tables pointed to from
77 *	within si_prb_t are actually abstracted as si_sgblock_t. Each
78 *	si_sgblock_t contains si_dma_sg_number number of
79 *	SGT tables linked in a chain. Currently this default value of
80 *	SGT tables per block is at 85 as  which translates
81 *	to a maximum of 256 dma cookies per single dma transfer.
82 *	This value can be changed through the global var: si_dma_sg_number
83 *	in /etc/system, the maxium is at 21844 as which translates to 65535
84 *	dma cookies per single dma transfer.
85 *
86 *
87 * III. Driver operation
88 *
89 * Command Issuing: We use the "indirect method of command issuance". The
90 *	PRB contains the command [and atapi PACKET] and a link to the
91 *	external SGT chain. We write the physical address of the PRB into
92 *	command activation register. There are 31 command slots for
93 *	each port. After posting a command, we remember the posted slot &
94 *	the sata packet in siport_pending_tags & siport_slot_pkts[]
95 *	respectively.
96 *
97 * Command completion: On a successful completion, intr_command_complete()
98 * 	receives the control. The slot_status register holds the outstanding
99 *	commands. Any reading of slot_status register automatically clears
100 *	the interrupt. By comparing the slot_status register contents with
101 *	per port siport_pending_tags, we determine which of the previously
102 *	posted commands have finished.
103 *
104 * Timeout handling: Every 5 seconds, the watchdog handler scans thru the
105 * 	pending packets. The satapkt->satapkt_hba_driver_private field is
106 * 	overloaded with the count of watchdog cycles a packet has survived.
107 *	If a packet has not completed within satapkt->satapkt_time, it is
108 *	failed with error code of SATA_PKT_TIMEOUT. There is one watchdog
109 *	handler running for each instance of controller.
110 *
111 * Error handling: For 3124, whenever any single command has encountered
112 *	an error, the whole port execution completely stalls; there is no
113 *	way of canceling or aborting the particular failed command. If
114 * 	the port is connected to a port multiplier, we can however RESUME
115 *	other non-error devices connected to the port multiplier.
116 *	The only way to recover the failed commands is to either initialize
117 *	the port or reset the port/device. Both port initialize and reset
118 *	operations result in discarding any of pending commands on the port.
119 *	All such discarded commands are sent up to framework with PKT_RESET
120 *	satapkt_reason. The assumption is that framework [and sd] would
121 *	retry these commands again. The failed command itself however is
122 *	sent up with PKT_DEV_ERROR.
123 *
124 *	Here is the implementation strategy based on SiliconImage email
125 *	regarding how they handle the errors for their Windows driver:
126 *
127 *	  a) for DEVICEERROR:
128 *		If the port is connected to port multiplier, then
129 *		 1) Resume the port
130 *		 2) Wait for all the non-failed commands to complete
131 *		 3) Perform a Port Initialize
132 *
133 *		If the port is not connected to port multiplier, issue
134 *		a Port Initialize.
135 *
136 *	  b) for SDBERROR: [SDBERROR means failed command is an NCQ command]
137 * 		Handle exactly like DEVICEERROR handling.
138 *		After the Port Initialize done, do a Read Log Extended.
139 *
140 *	  c) for SENDFISERROR:
141 *		If the port is connected to port multiplier, then
142 *		 1) Resume the port
143 *		 2) Wait for all the non-failed commands to complete
144 *		 3) Perform a Port Initialize
145 *
146 *		If the port is not connected to port multiplier, issue
147 * 		a Device Reset.
148 *
149 *	  d) for DATAFISERROR:
150 *		If the port was executing an NCQ command, issue a Device
151 *		Reset.
152 *
153 *		Otherwise, follow the same error recovery as DEVICEERROR.
154 *
155 *	  e) for any other error, simply issue a Device Reset.
156 *
157 * 	To synchronize the interactions between various control flows (e.g.
158 *	error recovery, timeout handling, si_poll_timeout, incoming flow
159 *	from framework etc.), the following precautions are taken care of:
160 *		a) During mopping_in_progress, no more commands are
161 *		accepted from the framework.
162 *
163 *		b) While draining the port multiplier commands, we should
164 *		handle the possibility of any of the other waited commands
165 *		failing (possibly with a different error code)
166 *
167 * Atapi handling: For atapi devices, we use the first SGE within the PRB
168 * 	to fill the scsi cdb while the second SGE points to external SGT.
169 *
170 * Queuing: Queue management is achieved external to the driver inside sd.
171 *	Based on sata_hba_tran->qdepth and IDENTIFY data, the framework
172 *	enables or disables the queuing. The qdepth for si3124 is 31
173 *	commands.
174 *
175 * Port Multiplier: Enumeration of port multiplier is handled during the
176 *	controller initialization and also during the a hotplug operation.
177 *	Current logic takes care of situation where a port multiplier
178 *	is hotplugged into a port which had a cdisk connected previously
179 *	and vice versa.
180 *
181 * Register poll timeouts: Currently most of poll timeouts on register
182 *	reads is set to 0.5 seconds except for a value of 10 seconds
183 *	while reading the device signature. [Such a big timeout values
184 *	for device signature were found needed during cold reboots
185 *	for devices behind port multiplier].
186 *
187 *
188 * IV. Known Issues
189 *
190 * 1) Currently the atapi packet length is hard coded to 12 bytes
191 *	This is wrong. The framework should determine it just like they
192 * 	determine ad_cdb_len in legacy atapi.c. It should even reject
193 *	init_pkt() for greater CDB lengths. See atapi.c. Revisit this
194 *	in 2nd phase of framework project.
195 *
196 * 2) Do real REQUEST SENSE command instead of faking for ATAPI case.
197 *
198 */
199
200
201#include <sys/note.h>
202#include <sys/scsi/scsi.h>
203#include <sys/pci.h>
204#include <sys/sata/sata_hba.h>
205#include <sys/sata/adapters/si3124/si3124reg.h>
206#include <sys/sata/adapters/si3124/si3124var.h>
207#include <sys/sdt.h>
208
209/*
210 * FMA header files
211 */
212#include <sys/ddifm.h>
213#include <sys/fm/protocol.h>
214#include <sys/fm/util.h>
215#include <sys/fm/io/ddi.h>
216
217/*
218 * Function prototypes for driver entry points
219 */
220static	int si_attach(dev_info_t *, ddi_attach_cmd_t);
221static	int si_detach(dev_info_t *, ddi_detach_cmd_t);
222static	int si_getinfo(dev_info_t *, ddi_info_cmd_t, void *, void **);
223static	int si_power(dev_info_t *, int, int);
224static	int si_quiesce(dev_info_t *);
225/*
226 * Function prototypes for SATA Framework interfaces
227 */
228static	int si_register_sata_hba_tran(si_ctl_state_t *);
229static	int si_unregister_sata_hba_tran(si_ctl_state_t *);
230
231static	int si_tran_probe_port(dev_info_t *, sata_device_t *);
232static	int si_tran_start(dev_info_t *, sata_pkt_t *spkt);
233static	int si_tran_abort(dev_info_t *, sata_pkt_t *, int);
234static	int si_tran_reset_dport(dev_info_t *, sata_device_t *);
235static	int si_tran_hotplug_port_activate(dev_info_t *, sata_device_t *);
236static	int si_tran_hotplug_port_deactivate(dev_info_t *, sata_device_t *);
237
238/*
239 * Local function prototypes
240 */
241
242static	int si_alloc_port_state(si_ctl_state_t *, int);
243static	void si_dealloc_port_state(si_ctl_state_t *, int);
244static	int si_alloc_sgbpool(si_ctl_state_t *, int);
245static	void si_dealloc_sgbpool(si_ctl_state_t *, int);
246static	int si_alloc_prbpool(si_ctl_state_t *, int);
247static	void si_dealloc_prbpool(si_ctl_state_t *, int);
248
249static void si_find_dev_signature(si_ctl_state_t *, si_port_state_t *,
250						int, int);
251static void si_poll_cmd(si_ctl_state_t *, si_port_state_t *, int, int,
252						sata_pkt_t *);
253static	int si_claim_free_slot(si_ctl_state_t *, si_port_state_t *, int);
254static	int si_deliver_satapkt(si_ctl_state_t *, si_port_state_t *, int,
255						sata_pkt_t *);
256
257static	int si_initialize_controller(si_ctl_state_t *);
258static	void si_deinitialize_controller(si_ctl_state_t *);
259static void si_init_port(si_ctl_state_t *, int);
260static	int si_enumerate_port_multiplier(si_ctl_state_t *,
261						si_port_state_t *, int);
262static int si_read_portmult_reg(si_ctl_state_t *, si_port_state_t *,
263						int, int, int, uint32_t *);
264static int si_write_portmult_reg(si_ctl_state_t *, si_port_state_t *,
265						int, int, int, uint32_t);
266static void si_set_sense_data(sata_pkt_t *, int);
267
268static uint_t si_intr(caddr_t, caddr_t);
269static int si_intr_command_complete(si_ctl_state_t *,
270					si_port_state_t *, int);
271static int si_intr_command_error(si_ctl_state_t *,
272					si_port_state_t *, int);
273static void si_error_recovery_DEVICEERROR(si_ctl_state_t *,
274					si_port_state_t *, int);
275static void si_error_recovery_SDBERROR(si_ctl_state_t *,
276					si_port_state_t *, int);
277static void si_error_recovery_DATAFISERROR(si_ctl_state_t *,
278					si_port_state_t *, int);
279static void si_error_recovery_SENDFISERROR(si_ctl_state_t *,
280					si_port_state_t *, int);
281static void si_error_recovery_default(si_ctl_state_t *,
282					si_port_state_t *, int);
283static uint8_t si_read_log_ext(si_ctl_state_t *,
284					si_port_state_t *si_portp, int);
285static void si_log_error_message(si_ctl_state_t *, int, uint32_t);
286static int si_intr_port_ready(si_ctl_state_t *, si_port_state_t *, int);
287static int si_intr_pwr_change(si_ctl_state_t *, si_port_state_t *, int);
288static int si_intr_phy_ready_change(si_ctl_state_t *, si_port_state_t *, int);
289static int si_intr_comwake_rcvd(si_ctl_state_t *, si_port_state_t *, int);
290static int si_intr_unrecognised_fis(si_ctl_state_t *, si_port_state_t *, int);
291static int si_intr_dev_xchanged(si_ctl_state_t *, si_port_state_t *, int);
292static int si_intr_decode_err_threshold(si_ctl_state_t *,
293					si_port_state_t *, int);
294static int si_intr_crc_err_threshold(si_ctl_state_t *, si_port_state_t *, int);
295static int si_intr_handshake_err_threshold(si_ctl_state_t *,
296					si_port_state_t *, int);
297static int si_intr_set_devbits_notify(si_ctl_state_t *, si_port_state_t *, int);
298
299static	void si_enable_port_interrupts(si_ctl_state_t *, int);
300static	void si_enable_all_interrupts(si_ctl_state_t *);
301static	void si_disable_port_interrupts(si_ctl_state_t *, int);
302static	void si_disable_all_interrupts(si_ctl_state_t *);
303static 	void fill_dev_sregisters(si_ctl_state_t *, int, sata_device_t *);
304static 	int si_add_legacy_intrs(si_ctl_state_t *);
305static 	int si_add_msi_intrs(si_ctl_state_t *);
306static 	void si_rem_intrs(si_ctl_state_t *);
307
308static	int si_reset_dport_wait_till_ready(si_ctl_state_t *,
309				si_port_state_t *, int, int);
310static int si_clear_port(si_ctl_state_t *, int);
311static	int si_initialize_port_wait_till_ready(si_ctl_state_t *, int);
312
313static void si_timeout_pkts(si_ctl_state_t *, si_port_state_t *, int, uint32_t);
314static	void si_watchdog_handler(si_ctl_state_t *);
315
316/*
317 * FMA Prototypes
318 */
319static void si_fm_init(si_ctl_state_t *);
320static void si_fm_fini(si_ctl_state_t *);
321static int si_fm_error_cb(dev_info_t *, ddi_fm_error_t *, const void *);
322static int si_check_acc_handle(ddi_acc_handle_t);
323static int si_check_dma_handle(ddi_dma_handle_t);
324static int si_check_ctl_handles(si_ctl_state_t *);
325static int si_check_port_handles(si_port_state_t *);
326static void si_fm_ereport(si_ctl_state_t *, char *, char *);
327
328#if SI_DEBUG
329static	void si_log(si_ctl_state_t *, uint_t, char *, ...);
330#endif	/* SI_DEBUG */
331
332static void si_copy_out_regs(sata_cmd_t *, si_ctl_state_t *, uint8_t, uint8_t);
333
334/*
335 * DMA attributes for the data buffer
336 */
337
338static ddi_dma_attr_t buffer_dma_attr = {
339	DMA_ATTR_V0,		/* dma_attr_version */
340	0,			/* dma_attr_addr_lo: lowest bus address */
341	0xffffffffffffffffull,	/* dma_attr_addr_hi: highest bus address */
342	0xffffffffull,		/* dma_attr_count_max i.e. for one cookie */
343	1,			/* dma_attr_align: single byte aligned */
344	1,			/* dma_attr_burstsizes */
345	1,			/* dma_attr_minxfer */
346	0xffffffffull,		/* dma_attr_maxxfer i.e. includes all cookies */
347	0xffffffffull,		/* dma_attr_seg */
348	SI_DEFAULT_SGL_LENGTH,	/* dma_attr_sgllen */
349	512,			/* dma_attr_granular */
350	0,			/* dma_attr_flags */
351};
352
353/*
354 * DMA attributes for incore RPB and SGT pool
355 */
356static ddi_dma_attr_t prb_sgt_dma_attr = {
357	DMA_ATTR_V0,		/* dma_attr_version */
358	0,			/* dma_attr_addr_lo: lowest bus address */
359	0xffffffffffffffffull,	/* dma_attr_addr_hi: highest bus address */
360	0xffffffffull,		/* dma_attr_count_max i.e. for one cookie */
361	8,			/* dma_attr_align: quad word aligned */
362	1,			/* dma_attr_burstsizes */
363	1,			/* dma_attr_minxfer */
364	0xffffffffull,		/* dma_attr_maxxfer i.e. includes all cookies */
365	0xffffffffull,		/* dma_attr_seg */
366	1,			/* dma_attr_sgllen */
367	1,			/* dma_attr_granular */
368	0,			/* dma_attr_flags */
369};
370
371/* Device access attributes */
372static ddi_device_acc_attr_t accattr = {
373    DDI_DEVICE_ATTR_V1,
374    DDI_STRUCTURE_LE_ACC,
375    DDI_STRICTORDER_ACC,
376    DDI_DEFAULT_ACC
377};
378
379
380static struct dev_ops sictl_dev_ops = {
381	DEVO_REV,		/* devo_rev */
382	0,			/* refcnt  */
383	si_getinfo,		/* info */
384	nulldev,		/* identify */
385	nulldev,		/* probe */
386	si_attach,		/* attach */
387	si_detach,		/* detach */
388	nodev,			/* no reset */
389	(struct cb_ops *)0,	/* driver operations */
390	NULL,			/* bus operations */
391	si_power,		/* power */
392	si_quiesce,		/* devo_quiesce */
393};
394
395static sata_tran_hotplug_ops_t si_tran_hotplug_ops = {
396	SATA_TRAN_HOTPLUG_OPS_REV_1,
397	si_tran_hotplug_port_activate,
398	si_tran_hotplug_port_deactivate
399};
400
401
402static int si_watchdog_timeout = 5; /* 5 seconds */
403static int si_watchdog_tick;
404
405extern struct mod_ops mod_driverops;
406
407static  struct modldrv modldrv = {
408	&mod_driverops,	/* driverops */
409	"si3124 driver",
410	&sictl_dev_ops,	/* driver ops */
411};
412
413static  struct modlinkage modlinkage = {
414	MODREV_1,
415	&modldrv,
416	NULL
417};
418
419
420/* The following are needed for si_log() */
421static kmutex_t si_log_mutex;
422#if SI_DEBUG
423static char si_log_buf[512];
424#endif	/* SI_DEBUG */
425uint32_t si_debug_flags = 0x0;
426static int is_msi_supported = 0;
427
428/*
429 * The below global variables are tunable via /etc/system
430 *
431 * si_dma_sg_number
432 */
433
434int si_dma_sg_number = SI_DEFAULT_SGT_TABLES_PER_PRB;
435
436/* Opaque state pointer to be initialized by ddi_soft_state_init() */
437static void *si_statep	= NULL;
438
439/*
440 *  si3124 module initialization.
441 *
442 */
443int
444_init(void)
445{
446	int	error;
447
448	error = ddi_soft_state_init(&si_statep, sizeof (si_ctl_state_t), 0);
449	if (error != 0) {
450		return (error);
451	}
452
453	mutex_init(&si_log_mutex, NULL, MUTEX_DRIVER, NULL);
454
455	if ((error = sata_hba_init(&modlinkage)) != 0) {
456		mutex_destroy(&si_log_mutex);
457		ddi_soft_state_fini(&si_statep);
458		return (error);
459	}
460
461	error = mod_install(&modlinkage);
462	if (error != 0) {
463		sata_hba_fini(&modlinkage);
464		mutex_destroy(&si_log_mutex);
465		ddi_soft_state_fini(&si_statep);
466		return (error);
467	}
468
469	si_watchdog_tick = drv_usectohz((clock_t)si_watchdog_timeout * 1000000);
470
471	return (error);
472}
473
474/*
475 * si3124 module uninitialize.
476 *
477 */
478int
479_fini(void)
480{
481	int	error;
482
483	error = mod_remove(&modlinkage);
484	if (error != 0) {
485		return (error);
486	}
487
488	/* Remove the resources allocated in _init(). */
489	sata_hba_fini(&modlinkage);
490	mutex_destroy(&si_log_mutex);
491	ddi_soft_state_fini(&si_statep);
492
493	return (error);
494}
495
496/*
497 * _info entry point
498 *
499 */
500int
501_info(struct modinfo *modinfop)
502{
503	return (mod_info(&modlinkage, modinfop));
504}
505
506
507/*
508 * The attach entry point for dev_ops.
509 *
510 * We initialize the controller, initialize the soft state, register
511 * the interrupt handlers and then register ourselves with sata framework.
512 */
513static int
514si_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
515{
516	si_ctl_state_t *si_ctlp;
517	int instance;
518	int status;
519	int attach_state;
520	int intr_types;
521	sata_device_t sdevice;
522
523	SIDBG0(SIDBG_INIT|SIDBG_ENTRY, NULL, "si_attach enter");
524	instance = ddi_get_instance(dip);
525	attach_state = ATTACH_PROGRESS_NONE;
526
527	switch (cmd) {
528
529	case DDI_ATTACH:
530
531		/* Allocate si_softc. */
532		status = ddi_soft_state_zalloc(si_statep, instance);
533		if (status != DDI_SUCCESS) {
534			goto err_out;
535		}
536
537		si_ctlp = ddi_get_soft_state(si_statep, instance);
538		si_ctlp->sictl_devinfop = dip;
539
540		attach_state |= ATTACH_PROGRESS_STATEP_ALLOC;
541
542		/* Initialize FMA */
543		si_ctlp->fm_capabilities = ddi_getprop(DDI_DEV_T_ANY, dip,
544		    DDI_PROP_CANSLEEP | DDI_PROP_DONTPASS, "fm-capable",
545		    DDI_FM_EREPORT_CAPABLE | DDI_FM_ACCCHK_CAPABLE |
546		    DDI_FM_DMACHK_CAPABLE | DDI_FM_ERRCB_CAPABLE);
547
548		si_fm_init(si_ctlp);
549
550		attach_state |= ATTACH_PROGRESS_INIT_FMA;
551
552		/* Configure pci config space handle. */
553		status = pci_config_setup(dip, &si_ctlp->sictl_pci_conf_handle);
554		if (status != DDI_SUCCESS) {
555			goto err_out;
556		}
557
558		si_ctlp->sictl_devid =
559		    pci_config_get16(si_ctlp->sictl_pci_conf_handle,
560		    PCI_CONF_DEVID);
561		if (si_ctlp->sictl_devid == SI3132_DEV_ID) {
562			si_ctlp->sictl_num_ports = SI3132_MAX_PORTS;
563		} else {
564			si_ctlp->sictl_num_ports = SI3124_MAX_PORTS;
565		}
566
567		attach_state |= ATTACH_PROGRESS_CONF_HANDLE;
568
569		/* Now map the bar0; the bar0 contains the global registers. */
570		status = ddi_regs_map_setup(dip,
571		    PCI_BAR0,
572		    (caddr_t *)&si_ctlp->sictl_global_addr,
573		    0,
574		    0,
575		    &accattr,
576		    &si_ctlp->sictl_global_acc_handle);
577		if (status != DDI_SUCCESS) {
578			goto err_out;
579		}
580
581		attach_state |= ATTACH_PROGRESS_BAR0_MAP;
582
583		/* Now map bar1; the bar1 contains the port registers. */
584		status = ddi_regs_map_setup(dip,
585		    PCI_BAR1,
586		    (caddr_t *)&si_ctlp->sictl_port_addr,
587		    0,
588		    0,
589		    &accattr,
590		    &si_ctlp->sictl_port_acc_handle);
591		if (status != DDI_SUCCESS) {
592			goto err_out;
593		}
594
595		attach_state |= ATTACH_PROGRESS_BAR1_MAP;
596
597		/*
598		 * Disable all the interrupts before adding interrupt
599		 * handler(s). The interrupts shall be re-enabled selectively
600		 * out of si_init_port().
601		 */
602		si_disable_all_interrupts(si_ctlp);
603
604		/* Get supported interrupt types. */
605		if (ddi_intr_get_supported_types(dip, &intr_types)
606		    != DDI_SUCCESS) {
607			SIDBG0(SIDBG_INIT, NULL,
608			    "ddi_intr_get_supported_types failed");
609			goto err_out;
610		}
611
612		SIDBG1(SIDBG_INIT, NULL,
613		    "ddi_intr_get_supported_types() returned: 0x%x",
614		    intr_types);
615
616		if (is_msi_supported && (intr_types & DDI_INTR_TYPE_MSI)) {
617			SIDBG0(SIDBG_INIT, NULL, "Using MSI interrupt type");
618
619			/*
620			 * Try MSI first, but fall back to legacy if MSI
621			 * attach fails.
622			 */
623			if (si_add_msi_intrs(si_ctlp) == DDI_SUCCESS) {
624				si_ctlp->sictl_intr_type = DDI_INTR_TYPE_MSI;
625				attach_state |= ATTACH_PROGRESS_INTR_ADDED;
626				SIDBG0(SIDBG_INIT, NULL,
627				    "MSI interrupt setup done");
628			}
629#if SI_DEBUG
630			else {
631				SIDBG0(SIDBG_INIT, NULL,
632				    "MSI registration failed "
633				    "will try Legacy interrupts");
634			}
635#endif	/* SI_DEBUG */
636		}
637
638		if (!(attach_state & ATTACH_PROGRESS_INTR_ADDED) &&
639		    (intr_types & DDI_INTR_TYPE_FIXED)) {
640			/*
641			 * Either the MSI interrupt setup has failed or only
642			 * fixed interrupts are available on the system.
643			 */
644			SIDBG0(SIDBG_INIT, NULL, "Using Legacy interrupt type");
645
646			if (si_add_legacy_intrs(si_ctlp) == DDI_SUCCESS) {
647				si_ctlp->sictl_intr_type = DDI_INTR_TYPE_FIXED;
648				attach_state |= ATTACH_PROGRESS_INTR_ADDED;
649				SIDBG0(SIDBG_INIT, NULL,
650				    "Legacy interrupt setup done");
651			} else {
652				SIDBG0(SIDBG_INIT, NULL,
653				    "legacy interrupt setup failed");
654				goto err_out;
655			}
656		}
657
658		if (!(attach_state & ATTACH_PROGRESS_INTR_ADDED)) {
659			SIDBG0(SIDBG_INIT, NULL,
660			    "si3124: No interrupts registered");
661			goto err_out;
662		}
663
664
665		/* Initialize the mutex. */
666		mutex_init(&si_ctlp->sictl_mutex, NULL, MUTEX_DRIVER,
667		    (void *)(uintptr_t)si_ctlp->sictl_intr_pri);
668
669		attach_state |= ATTACH_PROGRESS_MUTEX_INIT;
670
671		/*
672		 * Initialize the controller and driver core.
673		 */
674		si_ctlp->sictl_flags |= SI_ATTACH;
675		status = si_initialize_controller(si_ctlp);
676		si_ctlp->sictl_flags &= ~SI_ATTACH;
677		if (status) {
678			goto err_out;
679		}
680
681		attach_state |= ATTACH_PROGRESS_HW_INIT;
682
683		if (si_register_sata_hba_tran(si_ctlp)) {
684			SIDBG0(SIDBG_INIT, NULL,
685			    "si3124: setting sata hba tran failed");
686			goto err_out;
687		}
688
689		si_ctlp->sictl_timeout_id = timeout(
690		    (void (*)(void *))si_watchdog_handler,
691		    (caddr_t)si_ctlp, si_watchdog_tick);
692
693		si_ctlp->sictl_power_level = PM_LEVEL_D0;
694
695		return (DDI_SUCCESS);
696
697	case DDI_RESUME:
698		si_ctlp = ddi_get_soft_state(si_statep, instance);
699
700		status = si_initialize_controller(si_ctlp);
701		if (status) {
702			return (DDI_FAILURE);
703		}
704
705		si_ctlp->sictl_timeout_id = timeout(
706		    (void (*)(void *))si_watchdog_handler,
707		    (caddr_t)si_ctlp, si_watchdog_tick);
708
709		(void) pm_power_has_changed(dip, 0, PM_LEVEL_D0);
710
711		/* Notify SATA framework about RESUME. */
712		if (sata_hba_attach(si_ctlp->sictl_devinfop,
713		    si_ctlp->sictl_sata_hba_tran,
714		    DDI_RESUME) != DDI_SUCCESS) {
715			return (DDI_FAILURE);
716		}
717
718		/*
719		 * Notify the "framework" that it should reprobe ports to see
720		 * if any device got changed while suspended.
721		 */
722		bzero((void *)&sdevice, sizeof (sata_device_t));
723		sata_hba_event_notify(dip, &sdevice,
724		    SATA_EVNT_PWR_LEVEL_CHANGED);
725		SIDBG0(SIDBG_INIT|SIDBG_EVENT, si_ctlp,
726		    "sending event up: SATA_EVNT_PWR_LEVEL_CHANGED");
727
728		(void) pm_idle_component(si_ctlp->sictl_devinfop, 0);
729
730		si_ctlp->sictl_power_level = PM_LEVEL_D0;
731
732		return (DDI_SUCCESS);
733
734	default:
735		return (DDI_FAILURE);
736
737	}
738
739err_out:
740	if (attach_state & ATTACH_PROGRESS_HW_INIT) {
741		si_ctlp->sictl_flags |= SI_DETACH;
742		/* We want to set SI_DETACH to deallocate all memory */
743		si_deinitialize_controller(si_ctlp);
744		si_ctlp->sictl_flags &= ~SI_DETACH;
745	}
746
747	if (attach_state & ATTACH_PROGRESS_MUTEX_INIT) {
748		mutex_destroy(&si_ctlp->sictl_mutex);
749	}
750
751	if (attach_state & ATTACH_PROGRESS_INTR_ADDED) {
752		si_rem_intrs(si_ctlp);
753	}
754
755	if (attach_state & ATTACH_PROGRESS_BAR1_MAP) {
756		ddi_regs_map_free(&si_ctlp->sictl_port_acc_handle);
757	}
758
759	if (attach_state & ATTACH_PROGRESS_BAR0_MAP) {
760		ddi_regs_map_free(&si_ctlp->sictl_global_acc_handle);
761	}
762
763	if (attach_state & ATTACH_PROGRESS_CONF_HANDLE) {
764		pci_config_teardown(&si_ctlp->sictl_pci_conf_handle);
765	}
766
767	if (attach_state & ATTACH_PROGRESS_INIT_FMA) {
768		si_fm_fini(si_ctlp);
769	}
770
771	if (attach_state & ATTACH_PROGRESS_STATEP_ALLOC) {
772		ddi_soft_state_free(si_statep, instance);
773	}
774
775	return (DDI_FAILURE);
776}
777
778
779/*
780 * The detach entry point for dev_ops.
781 *
782 * We undo the things we did in si_attach().
783 */
784static int
785si_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
786{
787	si_ctl_state_t *si_ctlp;
788	int instance;
789
790	SIDBG0(SIDBG_INIT|SIDBG_ENTRY, NULL, "si_detach enter");
791	instance = ddi_get_instance(dip);
792	si_ctlp = ddi_get_soft_state(si_statep, instance);
793
794	switch (cmd) {
795
796	case DDI_DETACH:
797
798		mutex_enter(&si_ctlp->sictl_mutex);
799
800		/* disable the interrupts for an uninterrupted detach */
801		si_disable_all_interrupts(si_ctlp);
802
803		mutex_exit(&si_ctlp->sictl_mutex);
804		/* unregister from the sata framework. */
805		if (si_unregister_sata_hba_tran(si_ctlp) != SI_SUCCESS) {
806			si_enable_all_interrupts(si_ctlp);
807			return (DDI_FAILURE);
808		}
809		mutex_enter(&si_ctlp->sictl_mutex);
810
811		/* now cancel the timeout handler. */
812		si_ctlp->sictl_flags |= SI_NO_TIMEOUTS;
813		(void) untimeout(si_ctlp->sictl_timeout_id);
814		si_ctlp->sictl_flags &= ~SI_NO_TIMEOUTS;
815
816		/* de-initialize the controller. */
817		si_ctlp->sictl_flags |= SI_DETACH;
818		si_deinitialize_controller(si_ctlp);
819		si_ctlp->sictl_flags &= ~SI_DETACH;
820
821		/* destroy any mutexes */
822		mutex_exit(&si_ctlp->sictl_mutex);
823		mutex_destroy(&si_ctlp->sictl_mutex);
824
825		/* remove the interrupts */
826		si_rem_intrs(si_ctlp);
827
828		/* remove the reg maps. */
829		ddi_regs_map_free(&si_ctlp->sictl_port_acc_handle);
830		ddi_regs_map_free(&si_ctlp->sictl_global_acc_handle);
831		pci_config_teardown(&si_ctlp->sictl_pci_conf_handle);
832
833		/* deinit FMA */
834		si_fm_fini(si_ctlp);
835
836		/* free the soft state. */
837		ddi_soft_state_free(si_statep, instance);
838
839		return (DDI_SUCCESS);
840
841	case DDI_SUSPEND:
842		/* Inform SATA framework */
843		if (sata_hba_detach(dip, cmd) != DDI_SUCCESS) {
844			return (DDI_FAILURE);
845		}
846
847		mutex_enter(&si_ctlp->sictl_mutex);
848
849		/*
850		 * Device needs to be at full power in case it is needed to
851		 * handle dump(9e) to save CPR state after DDI_SUSPEND
852		 * completes.  This is OK since presumably power will be
853		 * removed anyways.  No outstanding transactions should be
854		 * on the controller since the children are already quiesced.
855		 *
856		 * If any ioctls/cfgadm support is added that touches
857		 * hardware, those entry points will need to check for
858		 * suspend and then block or return errors until resume.
859		 *
860		 */
861		if (pm_busy_component(si_ctlp->sictl_devinfop, 0) ==
862		    DDI_SUCCESS) {
863			mutex_exit(&si_ctlp->sictl_mutex);
864			(void) pm_raise_power(si_ctlp->sictl_devinfop, 0,
865			    PM_LEVEL_D0);
866			mutex_enter(&si_ctlp->sictl_mutex);
867		}
868
869		si_deinitialize_controller(si_ctlp);
870
871		si_ctlp->sictl_flags |= SI_NO_TIMEOUTS;
872		(void) untimeout(si_ctlp->sictl_timeout_id);
873		si_ctlp->sictl_flags &= ~SI_NO_TIMEOUTS;
874
875		SIDBG1(SIDBG_POWER, NULL, "si3124%d: DDI_SUSPEND", instance);
876
877		mutex_exit(&si_ctlp->sictl_mutex);
878
879		return (DDI_SUCCESS);
880
881	default:
882		return (DDI_FAILURE);
883
884	}
885
886}
887
888static int
889si_power(dev_info_t *dip, int component, int level)
890{
891#ifndef __lock_lint
892	_NOTE(ARGUNUSED(component))
893#endif /* __lock_lint */
894
895	si_ctl_state_t *si_ctlp;
896	int instance = ddi_get_instance(dip);
897	int rval = DDI_SUCCESS;
898#if SI_DEBUG
899	int old_level;
900#endif	/* SI_DEBUG */
901	sata_device_t sdevice;
902
903	si_ctlp = ddi_get_soft_state(si_statep, instance);
904
905	if (si_ctlp == NULL) {
906		return (DDI_FAILURE);
907	}
908
909	SIDBG0(SIDBG_ENTRY, NULL, "si_power enter");
910
911	mutex_enter(&si_ctlp->sictl_mutex);
912#if SI_DEBUG
913	old_level = si_ctlp->sictl_power_level;
914#endif	/* SI_DEBUG */
915
916	switch (level) {
917	case PM_LEVEL_D0: /* fully on */
918		pci_config_put16(si_ctlp->sictl_pci_conf_handle,
919		    PM_CSR(si_ctlp->sictl_devid), PCI_PMCSR_D0);
920#ifndef __lock_lint
921		delay(drv_usectohz(10000));
922#endif  /* __lock_lint */
923		si_ctlp->sictl_power_level = PM_LEVEL_D0;
924		(void) pci_restore_config_regs(si_ctlp->sictl_devinfop);
925
926		SIDBG2(SIDBG_POWER, si_ctlp,
927		    "si3124%d: turning power ON. old level %d",
928		    instance, old_level);
929		/*
930		 * If called from attach, just raise device power,
931		 * restore config registers (if they were saved
932		 * from a previous detach that lowered power),
933		 * and exit.
934		 */
935		if (si_ctlp->sictl_flags & SI_ATTACH)
936			break;
937
938		mutex_exit(&si_ctlp->sictl_mutex);
939		(void) si_initialize_controller(si_ctlp);
940		mutex_enter(&si_ctlp->sictl_mutex);
941
942		si_ctlp->sictl_timeout_id = timeout(
943		    (void (*)(void *))si_watchdog_handler,
944		    (caddr_t)si_ctlp, si_watchdog_tick);
945
946		bzero((void *)&sdevice, sizeof (sata_device_t));
947		sata_hba_event_notify(
948		    si_ctlp->sictl_sata_hba_tran->sata_tran_hba_dip,
949		    &sdevice, SATA_EVNT_PWR_LEVEL_CHANGED);
950		SIDBG0(SIDBG_EVENT|SIDBG_POWER, si_ctlp,
951		    "sending event up: PWR_LEVEL_CHANGED");
952
953		break;
954
955	case PM_LEVEL_D3: /* fully off */
956		if (!(si_ctlp->sictl_flags & SI_DETACH)) {
957			si_ctlp->sictl_flags |= SI_NO_TIMEOUTS;
958			(void) untimeout(si_ctlp->sictl_timeout_id);
959			si_ctlp->sictl_flags &= ~SI_NO_TIMEOUTS;
960
961			si_deinitialize_controller(si_ctlp);
962
963			si_ctlp->sictl_power_level = PM_LEVEL_D3;
964		}
965
966		(void) pci_save_config_regs(si_ctlp->sictl_devinfop);
967
968		pci_config_put16(si_ctlp->sictl_pci_conf_handle,
969		    PM_CSR(si_ctlp->sictl_devid), PCI_PMCSR_D3HOT);
970
971		SIDBG2(SIDBG_POWER, NULL, "si3124%d: turning power OFF. "
972		    "old level %d", instance, old_level);
973
974		break;
975
976	default:
977		SIDBG2(SIDBG_POWER, NULL, "si3124%d: turning power OFF. "
978		    "old level %d", instance, old_level);
979		rval = DDI_FAILURE;
980		break;
981	}
982
983	mutex_exit(&si_ctlp->sictl_mutex);
984
985	return (rval);
986}
987
988
989/*
990 * The info entry point for dev_ops.
991 *
992 */
993static int
994si_getinfo(dev_info_t *dip, ddi_info_cmd_t infocmd,
995		void *arg,
996		void **result)
997{
998#ifndef __lock_lint
999	_NOTE(ARGUNUSED(dip))
1000#endif /* __lock_lint */
1001	si_ctl_state_t *si_ctlp;
1002	int instance;
1003	dev_t dev;
1004
1005	dev = (dev_t)arg;
1006	instance = getminor(dev);
1007
1008	switch (infocmd) {
1009		case DDI_INFO_DEVT2DEVINFO:
1010			si_ctlp = ddi_get_soft_state(si_statep,  instance);
1011			if (si_ctlp != NULL) {
1012				*result = si_ctlp->sictl_devinfop;
1013				return (DDI_SUCCESS);
1014			} else {
1015				*result = NULL;
1016				return (DDI_FAILURE);
1017			}
1018		case DDI_INFO_DEVT2INSTANCE:
1019			*(int *)result = instance;
1020			break;
1021		default:
1022			break;
1023	}
1024	return (DDI_SUCCESS);
1025}
1026
1027
1028
1029/*
1030 * Registers the si3124 with sata framework.
1031 */
1032static int
1033si_register_sata_hba_tran(si_ctl_state_t *si_ctlp)
1034{
1035	struct 	sata_hba_tran	*sata_hba_tran;
1036
1037	SIDBG0(SIDBG_INIT|SIDBG_ENTRY, si_ctlp,
1038	    "si_register_sata_hba_tran entry");
1039
1040	mutex_enter(&si_ctlp->sictl_mutex);
1041
1042	/* Allocate memory for the sata_hba_tran  */
1043	sata_hba_tran = kmem_zalloc(sizeof (sata_hba_tran_t), KM_SLEEP);
1044
1045	sata_hba_tran->sata_tran_hba_rev = SATA_TRAN_HBA_REV;
1046	sata_hba_tran->sata_tran_hba_dip = si_ctlp->sictl_devinfop;
1047
1048	if (si_dma_sg_number > SI_MAX_SGT_TABLES_PER_PRB) {
1049		si_dma_sg_number = SI_MAX_SGT_TABLES_PER_PRB;
1050	} else if (si_dma_sg_number < SI_MIN_SGT_TABLES_PER_PRB) {
1051		si_dma_sg_number = SI_MIN_SGT_TABLES_PER_PRB;
1052	}
1053
1054	if (si_dma_sg_number != SI_DEFAULT_SGT_TABLES_PER_PRB) {
1055		buffer_dma_attr.dma_attr_sgllen = SGE_LENGTH(si_dma_sg_number);
1056	}
1057	sata_hba_tran->sata_tran_hba_dma_attr = &buffer_dma_attr;
1058
1059	sata_hba_tran->sata_tran_hba_num_cports = si_ctlp->sictl_num_ports;
1060	sata_hba_tran->sata_tran_hba_features_support = 0;
1061	sata_hba_tran->sata_tran_hba_qdepth = SI_NUM_SLOTS;
1062
1063	sata_hba_tran->sata_tran_probe_port = si_tran_probe_port;
1064	sata_hba_tran->sata_tran_start = si_tran_start;
1065	sata_hba_tran->sata_tran_abort = si_tran_abort;
1066	sata_hba_tran->sata_tran_reset_dport = si_tran_reset_dport;
1067	sata_hba_tran->sata_tran_selftest = NULL;
1068	sata_hba_tran->sata_tran_hotplug_ops = &si_tran_hotplug_ops;
1069	sata_hba_tran->sata_tran_pwrmgt_ops = NULL;
1070	sata_hba_tran->sata_tran_ioctl = NULL;
1071	mutex_exit(&si_ctlp->sictl_mutex);
1072
1073	/* Attach it to SATA framework */
1074	if (sata_hba_attach(si_ctlp->sictl_devinfop, sata_hba_tran, DDI_ATTACH)
1075	    != DDI_SUCCESS) {
1076		kmem_free((void *)sata_hba_tran, sizeof (sata_hba_tran_t));
1077		return (SI_FAILURE);
1078	}
1079
1080	mutex_enter(&si_ctlp->sictl_mutex);
1081	si_ctlp->sictl_sata_hba_tran = sata_hba_tran;
1082	mutex_exit(&si_ctlp->sictl_mutex);
1083
1084	return (SI_SUCCESS);
1085}
1086
1087
1088/*
1089 * Unregisters the si3124 with sata framework.
1090 */
1091static int
1092si_unregister_sata_hba_tran(si_ctl_state_t *si_ctlp)
1093{
1094
1095	/* Detach from the SATA framework. */
1096	if (sata_hba_detach(si_ctlp->sictl_devinfop, DDI_DETACH) !=
1097	    DDI_SUCCESS) {
1098		return (SI_FAILURE);
1099	}
1100
1101	/* Deallocate sata_hba_tran. */
1102	kmem_free((void *)si_ctlp->sictl_sata_hba_tran,
1103	    sizeof (sata_hba_tran_t));
1104
1105	si_ctlp->sictl_sata_hba_tran = NULL;
1106
1107	return (SI_SUCCESS);
1108}
1109
1110/*
1111 * Called by sata framework to probe a port. We return the
1112 * cached information from a previous hardware probe.
1113 *
1114 * The actual hardware probing itself was done either from within
1115 * si_initialize_controller() during the driver attach or
1116 * from a phy ready change interrupt handler.
1117 */
1118static int
1119si_tran_probe_port(dev_info_t *dip, sata_device_t *sd)
1120{
1121
1122	si_ctl_state_t	*si_ctlp;
1123	uint8_t cport = sd->satadev_addr.cport;
1124	uint8_t pmport = sd->satadev_addr.pmport;
1125	uint8_t qual = sd->satadev_addr.qual;
1126	uint8_t port_type;
1127	si_port_state_t *si_portp;
1128	si_portmult_state_t *si_portmultp;
1129
1130	si_ctlp = ddi_get_soft_state(si_statep, ddi_get_instance(dip));
1131
1132	SIDBG3(SIDBG_ENTRY, si_ctlp,
1133	    "si_tran_probe_port: cport: 0x%x, pmport: 0x%x, qual: 0x%x",
1134	    cport, pmport, qual);
1135
1136	if (cport >= SI_MAX_PORTS) {
1137		sd->satadev_type = SATA_DTYPE_NONE;
1138		sd->satadev_state = SATA_STATE_UNKNOWN; /* invalid port */
1139		return (SATA_FAILURE);
1140	}
1141
1142	mutex_enter(&si_ctlp->sictl_mutex);
1143	si_portp = si_ctlp->sictl_ports[cport];
1144	mutex_exit(&si_ctlp->sictl_mutex);
1145	if (si_portp == NULL) {
1146		sd->satadev_type = SATA_DTYPE_NONE;
1147		sd->satadev_state = SATA_STATE_UNKNOWN;
1148		return (SATA_FAILURE);
1149	}
1150
1151	mutex_enter(&si_portp->siport_mutex);
1152
1153	if (qual == SATA_ADDR_PMPORT) {
1154		if (pmport >= si_portp->siport_portmult_state.sipm_num_ports) {
1155			sd->satadev_type = SATA_DTYPE_NONE;
1156			sd->satadev_state = SATA_STATE_UNKNOWN;
1157			mutex_exit(&si_portp->siport_mutex);
1158			return (SATA_FAILURE);
1159		} else {
1160			si_portmultp = 	&si_portp->siport_portmult_state;
1161			port_type = si_portmultp->sipm_port_type[pmport];
1162		}
1163	} else {
1164		port_type = si_portp->siport_port_type;
1165	}
1166
1167	switch (port_type) {
1168
1169	case PORT_TYPE_DISK:
1170		sd->satadev_type = SATA_DTYPE_ATADISK;
1171		break;
1172
1173	case PORT_TYPE_ATAPI:
1174		sd->satadev_type = SATA_DTYPE_ATAPICD;
1175		break;
1176
1177	case PORT_TYPE_MULTIPLIER:
1178		sd->satadev_type = SATA_DTYPE_PMULT;
1179		sd->satadev_add_info =
1180		    si_portp->siport_portmult_state.sipm_num_ports;
1181		break;
1182
1183	case PORT_TYPE_UNKNOWN:
1184		sd->satadev_type = SATA_DTYPE_UNKNOWN;
1185		break;
1186
1187	default:
1188		/* we don't support any other device types. */
1189		sd->satadev_type = SATA_DTYPE_NONE;
1190		break;
1191	}
1192	sd->satadev_state = SATA_STATE_READY;
1193
1194	if (qual == SATA_ADDR_PMPORT) {
1195		(void) si_read_portmult_reg(si_ctlp, si_portp, cport,
1196		    pmport, PSCR_REG0, &sd->satadev_scr.sstatus);
1197		(void) si_read_portmult_reg(si_ctlp, si_portp, cport,
1198		    pmport, PSCR_REG1, &sd->satadev_scr.serror);
1199		(void) si_read_portmult_reg(si_ctlp, si_portp, cport,
1200		    pmport, PSCR_REG2, &sd->satadev_scr.scontrol);
1201		(void) si_read_portmult_reg(si_ctlp, si_portp, cport,
1202		    pmport, PSCR_REG3, &sd->satadev_scr.sactive);
1203	} else {
1204		fill_dev_sregisters(si_ctlp, cport, sd);
1205		if (!(si_portp->siport_active)) {
1206			/*
1207			 * Since we are implementing the port deactivation
1208			 * in software only, we need to fake a valid value
1209			 * for sstatus when the device is in deactivated state.
1210			 */
1211			SSTATUS_SET_DET(sd->satadev_scr.sstatus,
1212			    SSTATUS_DET_PHYOFFLINE);
1213			SSTATUS_SET_IPM(sd->satadev_scr.sstatus,
1214			    SSTATUS_IPM_NODEV_NOPHY);
1215			sd->satadev_state = SATA_PSTATE_SHUTDOWN;
1216		}
1217	}
1218
1219	mutex_exit(&si_portp->siport_mutex);
1220	return (SATA_SUCCESS);
1221}
1222
1223/*
1224 * Called by sata framework to transport a sata packet down stream.
1225 *
1226 * The actual work of building the FIS & transporting it to the hardware
1227 * is done out of the subroutine si_deliver_satapkt().
1228 */
1229static int
1230si_tran_start(dev_info_t *dip, sata_pkt_t *spkt)
1231{
1232	si_ctl_state_t *si_ctlp;
1233	uint8_t	cport;
1234	si_port_state_t *si_portp;
1235	int slot;
1236
1237	cport = spkt->satapkt_device.satadev_addr.cport;
1238	si_ctlp = ddi_get_soft_state(si_statep, ddi_get_instance(dip));
1239	mutex_enter(&si_ctlp->sictl_mutex);
1240	si_portp = si_ctlp->sictl_ports[cport];
1241	mutex_exit(&si_ctlp->sictl_mutex);
1242
1243	SIDBG1(SIDBG_ENTRY, si_ctlp,
1244	    "si_tran_start entry: port: 0x%x", cport);
1245
1246	mutex_enter(&si_portp->siport_mutex);
1247
1248	if ((si_portp->siport_port_type == PORT_TYPE_NODEV) ||
1249	    !si_portp->siport_active) {
1250		/*
1251		 * si_intr_phy_ready_change() may have rendered it to
1252		 * PORT_TYPE_NODEV. cfgadm operation may have rendered
1253		 * it inactive.
1254		 */
1255		spkt->satapkt_reason = SATA_PKT_PORT_ERROR;
1256		fill_dev_sregisters(si_ctlp, cport, &spkt->satapkt_device);
1257		mutex_exit(&si_portp->siport_mutex);
1258		return (SATA_TRAN_PORT_ERROR);
1259	}
1260
1261	if (spkt->satapkt_cmd.satacmd_flags.sata_clear_dev_reset) {
1262		si_portp->siport_reset_in_progress = 0;
1263		SIDBG1(SIDBG_ENTRY, si_ctlp,
1264		    "si_tran_start clearing the "
1265		    "reset_in_progress for port: 0x%x", cport);
1266	}
1267
1268	if (si_portp->siport_reset_in_progress &&
1269	    ! spkt->satapkt_cmd.satacmd_flags.sata_ignore_dev_reset &&
1270	    ! ddi_in_panic()) {
1271
1272		spkt->satapkt_reason = SATA_PKT_BUSY;
1273		SIDBG1(SIDBG_ERRS, si_ctlp,
1274		    "si_tran_start returning BUSY while "
1275		    "reset in progress: port: 0x%x", cport);
1276		mutex_exit(&si_portp->siport_mutex);
1277		return (SATA_TRAN_BUSY);
1278	}
1279
1280	if (si_portp->mopping_in_progress > 0) {
1281		spkt->satapkt_reason = SATA_PKT_BUSY;
1282		SIDBG1(SIDBG_ERRS, si_ctlp,
1283		    "si_tran_start returning BUSY while "
1284		    "mopping in progress: port: 0x%x", cport);
1285		mutex_exit(&si_portp->siport_mutex);
1286		return (SATA_TRAN_BUSY);
1287	}
1288
1289	if ((slot = si_deliver_satapkt(si_ctlp, si_portp, cport, spkt))
1290	    == SI_FAILURE) {
1291		spkt->satapkt_reason = SATA_PKT_QUEUE_FULL;
1292		SIDBG1(SIDBG_ERRS, si_ctlp,
1293		    "si_tran_start returning QUEUE_FULL: port: 0x%x",
1294		    cport);
1295		mutex_exit(&si_portp->siport_mutex);
1296		return (SATA_TRAN_QUEUE_FULL);
1297	}
1298
1299	if (spkt->satapkt_op_mode & (SATA_OPMODE_POLLING|SATA_OPMODE_SYNCH)) {
1300		/* we need to poll now */
1301		si_poll_cmd(si_ctlp, si_portp, cport, slot, spkt);
1302
1303	}
1304
1305	mutex_exit(&si_portp->siport_mutex);
1306	return (SATA_TRAN_ACCEPTED);
1307}
1308
1309#define	SENDUP_PACKET(si_portp, satapkt, reason)			\
1310	if (satapkt) {							\
1311		if ((satapkt->satapkt_cmd.satacmd_cmd_reg ==		\
1312					SATAC_WRITE_FPDMA_QUEUED) ||	\
1313		    (satapkt->satapkt_cmd.satacmd_cmd_reg ==		\
1314					SATAC_READ_FPDMA_QUEUED)) {	\
1315			si_portp->siport_pending_ncq_count--;		\
1316		}							\
1317		satapkt->satapkt_reason = reason;			\
1318		/*							\
1319		 * We set the satapkt_reason in both synch and		\
1320		 * non-synch cases.					\
1321		 */							\
1322		if (!(satapkt->satapkt_op_mode & SATA_OPMODE_SYNCH) &&	\
1323			satapkt->satapkt_comp) {			\
1324			mutex_exit(&si_portp->siport_mutex);		\
1325			(*satapkt->satapkt_comp)(satapkt);		\
1326			mutex_enter(&si_portp->siport_mutex);		\
1327		}							\
1328	}
1329
1330/*
1331 * Mopping is necessitated because of the si3124 hardware limitation.
1332 * The only way to recover from errors or to abort a command is to
1333 * reset the port/device but such a reset also results in throwing
1334 * away all the unfinished pending commands.
1335 *
1336 * A port or device is reset in four scenarios:
1337 *	a) some commands failed with errors
1338 *	b) or we need to timeout some commands
1339 *	c) or we need to abort some commands
1340 *	d) or we need reset the port at the request of sata framework
1341 *
1342 * In all these scenarios, we need to send any pending unfinished
1343 * commands up to sata framework.
1344 *
1345 * WARNING!!! siport_mutex should be acquired before the function is called.
1346 */
1347static void
1348si_mop_commands(si_ctl_state_t *si_ctlp,
1349		si_port_state_t *si_portp,
1350		uint8_t	port,
1351
1352		uint32_t slot_status,
1353		uint32_t failed_tags,
1354		uint32_t timedout_tags,
1355		uint32_t aborting_tags,
1356		uint32_t reset_tags)
1357{
1358	uint32_t finished_tags, unfinished_tags;
1359	int tmpslot;
1360	sata_pkt_t *satapkt;
1361	struct sata_cmd_flags *flagsp;
1362
1363	SIDBG1(SIDBG_ERRS|SIDBG_ENTRY, si_ctlp,
1364	    "si_mop_commands entered: slot_status: 0x%x",
1365	    slot_status);
1366
1367	SIDBG4(SIDBG_ERRS|SIDBG_ENTRY, si_ctlp,
1368	    "si_mop_commands: failed_tags: 0x%x, timedout_tags: 0x%x"
1369	    "aborting_tags: 0x%x, reset_tags: 0x%x",
1370	    failed_tags,
1371	    timedout_tags,
1372	    aborting_tags,
1373	    reset_tags);
1374
1375	/*
1376	 * We could be here for four reasons: abort, reset,
1377	 * timeout or error handling. Only one such mopping
1378	 * is allowed at a time.
1379	 */
1380
1381	finished_tags =  si_portp->siport_pending_tags &
1382	    ~slot_status & SI_SLOT_MASK;
1383
1384	unfinished_tags = slot_status & SI_SLOT_MASK &
1385	    ~failed_tags &
1386	    ~aborting_tags &
1387	    ~reset_tags &
1388	    ~timedout_tags;
1389
1390	/* Send up the finished_tags with SATA_PKT_COMPLETED. */
1391	while (finished_tags) {
1392		tmpslot = ddi_ffs(finished_tags) - 1;
1393		if (tmpslot == -1) {
1394			break;
1395		}
1396
1397		satapkt = si_portp->siport_slot_pkts[tmpslot];
1398		ASSERT(satapkt != NULL);
1399
1400		if (satapkt->satapkt_cmd.satacmd_flags.sata_special_regs) {
1401			si_copy_out_regs(&satapkt->satapkt_cmd, si_ctlp,
1402			    port, tmpslot);
1403		}
1404
1405		SIDBG1(SIDBG_ERRS, si_ctlp,
1406		    "si_mop_commands sending up completed satapkt: %x",
1407		    satapkt);
1408
1409		CLEAR_BIT(si_portp->siport_pending_tags, tmpslot);
1410		CLEAR_BIT(finished_tags, tmpslot);
1411		SENDUP_PACKET(si_portp, satapkt, SATA_PKT_COMPLETED);
1412	}
1413
1414	ASSERT(finished_tags == 0);
1415
1416	/* Send up failed_tags with SATA_PKT_DEV_ERROR. */
1417	while (failed_tags) {
1418		tmpslot = ddi_ffs(failed_tags) - 1;
1419		if (tmpslot == -1) {
1420			break;
1421		}
1422		SIDBG1(SIDBG_ERRS, si_ctlp, "si3124: si_mop_commands: "
1423		    "handling failed slot: 0x%x", tmpslot);
1424
1425		satapkt = si_portp->siport_slot_pkts[tmpslot];
1426		ASSERT(satapkt != NULL);
1427		if (satapkt->satapkt_device.satadev_type ==
1428		    SATA_DTYPE_ATAPICD) {
1429			si_set_sense_data(satapkt, SATA_PKT_DEV_ERROR);
1430		}
1431
1432
1433		flagsp = &satapkt->satapkt_cmd.satacmd_flags;
1434
1435		flagsp->sata_copy_out_lba_low_msb = B_TRUE;
1436		flagsp->sata_copy_out_lba_mid_msb = B_TRUE;
1437		flagsp->sata_copy_out_lba_high_msb = B_TRUE;
1438		flagsp->sata_copy_out_lba_low_lsb = B_TRUE;
1439		flagsp->sata_copy_out_lba_mid_lsb = B_TRUE;
1440		flagsp->sata_copy_out_lba_high_lsb = B_TRUE;
1441		flagsp->sata_copy_out_error_reg = B_TRUE;
1442		flagsp->sata_copy_out_sec_count_msb = B_TRUE;
1443		flagsp->sata_copy_out_sec_count_lsb = B_TRUE;
1444		flagsp->sata_copy_out_device_reg = B_TRUE;
1445
1446		si_copy_out_regs(&satapkt->satapkt_cmd, si_ctlp, port, tmpslot);
1447
1448		/*
1449		 * In the case of NCQ command failures, the error is
1450		 * overwritten by the one obtained from issuing of a
1451		 * READ LOG EXTENDED command.
1452		 */
1453		if (si_portp->siport_err_tags_SDBERROR & (1 << tmpslot)) {
1454			satapkt->satapkt_cmd.satacmd_error_reg =
1455			    si_read_log_ext(si_ctlp, si_portp, port);
1456		}
1457
1458		CLEAR_BIT(failed_tags, tmpslot);
1459		CLEAR_BIT(si_portp->siport_pending_tags, tmpslot);
1460		SENDUP_PACKET(si_portp, satapkt, SATA_PKT_DEV_ERROR);
1461	}
1462
1463	ASSERT(failed_tags == 0);
1464
1465	/* Send up timedout_tags with SATA_PKT_TIMEOUT. */
1466	while (timedout_tags) {
1467		tmpslot = ddi_ffs(timedout_tags) - 1;
1468		if (tmpslot == -1) {
1469			break;
1470		}
1471
1472		satapkt = si_portp->siport_slot_pkts[tmpslot];
1473		ASSERT(satapkt != NULL);
1474		SIDBG1(SIDBG_ERRS, si_ctlp,
1475		    "si_mop_commands sending "
1476		    "spkt up with PKT_TIMEOUT: %x",
1477		    satapkt);
1478
1479		CLEAR_BIT(si_portp->siport_pending_tags, tmpslot);
1480		CLEAR_BIT(timedout_tags, tmpslot);
1481		SENDUP_PACKET(si_portp, satapkt, SATA_PKT_TIMEOUT);
1482	}
1483
1484	ASSERT(timedout_tags == 0);
1485
1486	/* Send up aborting packets with SATA_PKT_ABORTED. */
1487	while (aborting_tags) {
1488		tmpslot = ddi_ffs(aborting_tags) - 1;
1489		if (tmpslot == -1) {
1490			break;
1491		}
1492
1493		satapkt = si_portp->siport_slot_pkts[tmpslot];
1494		ASSERT(satapkt != NULL);
1495		SIDBG1(SIDBG_ERRS, si_ctlp,
1496		    "si_mop_commands aborting spkt: %x",
1497		    satapkt);
1498		if (satapkt->satapkt_device.satadev_type ==
1499		    SATA_DTYPE_ATAPICD) {
1500			si_set_sense_data(satapkt, SATA_PKT_ABORTED);
1501		}
1502
1503		CLEAR_BIT(si_portp->siport_pending_tags, tmpslot);
1504		CLEAR_BIT(aborting_tags, tmpslot);
1505		SENDUP_PACKET(si_portp, satapkt, SATA_PKT_ABORTED);
1506
1507	}
1508
1509	ASSERT(aborting_tags == 0);
1510
1511	/* Reset tags are sent up to framework with SATA_PKT_RESET. */
1512	while (reset_tags) {
1513		tmpslot = ddi_ffs(reset_tags) - 1;
1514		if (tmpslot == -1) {
1515			break;
1516		}
1517		satapkt = si_portp->siport_slot_pkts[tmpslot];
1518		ASSERT(satapkt != NULL);
1519		SIDBG1(SIDBG_ERRS, si_ctlp,
1520		    "si_mop_commands sending PKT_RESET for "
1521		    "reset spkt: %x",
1522		    satapkt);
1523
1524		CLEAR_BIT(reset_tags, tmpslot);
1525		CLEAR_BIT(si_portp->siport_pending_tags, tmpslot);
1526		SENDUP_PACKET(si_portp, satapkt, SATA_PKT_RESET);
1527	}
1528
1529	ASSERT(reset_tags == 0);
1530
1531	/* Send up the unfinished_tags with SATA_PKT_BUSY. */
1532	while (unfinished_tags) {
1533		tmpslot = ddi_ffs(unfinished_tags) - 1;
1534		if (tmpslot == -1) {
1535			break;
1536		}
1537		satapkt = si_portp->siport_slot_pkts[tmpslot];
1538		ASSERT(satapkt != NULL);
1539		SIDBG1(SIDBG_ERRS, si_ctlp,
1540		    "si_mop_commands sending PKT_BUSY for "
1541		    "retry spkt: %x",
1542		    satapkt);
1543
1544		CLEAR_BIT(unfinished_tags, tmpslot);
1545		CLEAR_BIT(si_portp->siport_pending_tags, tmpslot);
1546		SENDUP_PACKET(si_portp, satapkt, SATA_PKT_BUSY);
1547	}
1548
1549	ASSERT(unfinished_tags == 0);
1550
1551	si_portp->mopping_in_progress--;
1552	ASSERT(si_portp->mopping_in_progress >= 0);
1553}
1554
1555/*
1556 * Called by the sata framework to abort the previously sent packet(s).
1557 *
1558 * We reset the device and mop the commands on the port.
1559 */
1560static int
1561si_tran_abort(dev_info_t *dip, sata_pkt_t *spkt, int flag)
1562{
1563	uint32_t slot_status;
1564	uint8_t	port;
1565	int tmpslot;
1566	uint32_t aborting_tags;
1567	uint32_t finished_tags;
1568	si_port_state_t *si_portp;
1569	si_ctl_state_t *si_ctlp;
1570
1571	port = spkt->satapkt_device.satadev_addr.cport;
1572	si_ctlp = ddi_get_soft_state(si_statep, ddi_get_instance(dip));
1573	mutex_enter(&si_ctlp->sictl_mutex);
1574	si_portp = si_ctlp->sictl_ports[port];
1575	mutex_exit(&si_ctlp->sictl_mutex);
1576
1577	SIDBG1(SIDBG_ENTRY, si_ctlp, "si_tran_abort on port: %x", port);
1578
1579	mutex_enter(&si_portp->siport_mutex);
1580
1581	/*
1582	 * If already mopping, then no need to abort anything.
1583	 */
1584	if (si_portp->mopping_in_progress > 0) {
1585		SIDBG1(SIDBG_INFO, si_ctlp,
1586		    "si_tran_abort: port %d mopping "
1587		    "in progress, so just return", port);
1588		mutex_exit(&si_portp->siport_mutex);
1589		return (SATA_SUCCESS);
1590	}
1591
1592	if ((si_portp->siport_port_type == PORT_TYPE_NODEV) ||
1593	    !si_portp->siport_active) {
1594		/*
1595		 * si_intr_phy_ready_change() may have rendered it to
1596		 * PORT_TYPE_NODEV. cfgadm operation may have rendered
1597		 * it inactive.
1598		 */
1599		spkt->satapkt_reason = SATA_PKT_PORT_ERROR;
1600		fill_dev_sregisters(si_ctlp, port, &spkt->satapkt_device);
1601		mutex_exit(&si_portp->siport_mutex);
1602		return (SATA_FAILURE);
1603	}
1604
1605	if (flag == SATA_ABORT_ALL_PACKETS) {
1606		aborting_tags = si_portp->siport_pending_tags;
1607	} else {
1608		/*
1609		 * Need to abort a single packet.
1610		 * Search our siport_slot_pkts[] list for matching spkt.
1611		 */
1612		aborting_tags = 0xffffffff; /* 0xffffffff is impossible tag */
1613		for (tmpslot = 0; tmpslot < SI_NUM_SLOTS; tmpslot++) {
1614			if (si_portp->siport_slot_pkts[tmpslot] == spkt) {
1615				aborting_tags = (0x1 << tmpslot);
1616				break;
1617			}
1618		}
1619
1620		if (aborting_tags == 0xffffffff) {
1621			/* requested packet is not on pending list. */
1622			fill_dev_sregisters(si_ctlp, port,
1623			    &spkt->satapkt_device);
1624			mutex_exit(&si_portp->siport_mutex);
1625			return (SATA_FAILURE);
1626		}
1627	}
1628
1629	si_portp->mopping_in_progress++;
1630
1631	slot_status = ddi_get32(si_ctlp->sictl_port_acc_handle,
1632	    (uint32_t *)(PORT_SLOT_STATUS(si_ctlp, port)));
1633	(void) si_reset_dport_wait_till_ready(si_ctlp, si_portp,
1634	    port, SI_DEVICE_RESET);
1635
1636	/*
1637	 * Compute which have finished and which need to be retried.
1638	 *
1639	 * The finished tags are siport_pending_tags minus the slot_status.
1640	 * The aborting_tags have to be reduced by finished_tags since we
1641	 * can't possibly abort a tag which had finished already.
1642	 */
1643	finished_tags =  si_portp->siport_pending_tags &
1644	    ~slot_status & SI_SLOT_MASK;
1645	aborting_tags &= ~finished_tags;
1646
1647	si_mop_commands(si_ctlp,
1648	    si_portp,
1649	    port,
1650	    slot_status,
1651	    0, /* failed_tags */
1652	    0, /* timedout_tags */
1653	    aborting_tags,
1654	    0); /* reset_tags */
1655
1656	fill_dev_sregisters(si_ctlp, port, &spkt->satapkt_device);
1657	mutex_exit(&si_portp->siport_mutex);
1658	return (SATA_SUCCESS);
1659}
1660
1661
1662/*
1663 * Used to reject all the pending packets on a port during a reset
1664 * operation.
1665 *
1666 * WARNING, WARNING: The caller is expected to obtain the siport_mutex
1667 * before calling us.
1668 */
1669static void
1670si_reject_all_reset_pkts(
1671	si_ctl_state_t *si_ctlp,
1672	si_port_state_t *si_portp,
1673	int port)
1674{
1675	uint32_t slot_status;
1676	uint32_t reset_tags;
1677
1678	_NOTE(ASSUMING_PROTECTED(si_portp))
1679
1680	SIDBG1(SIDBG_ENTRY, si_ctlp,
1681	    "si_reject_all_reset_pkts on port: %x",
1682	    port);
1683
1684	slot_status = ddi_get32(si_ctlp->sictl_port_acc_handle,
1685	    (uint32_t *)(PORT_SLOT_STATUS(si_ctlp, port)));
1686
1687	/* Compute which tags need to be sent up. */
1688	reset_tags = slot_status & SI_SLOT_MASK;
1689
1690	si_portp->mopping_in_progress++;
1691
1692	si_mop_commands(si_ctlp,
1693	    si_portp,
1694	    port,
1695	    slot_status,
1696	    0, /* failed_tags */
1697	    0, /* timedout_tags */
1698	    0, /* aborting_tags */
1699	    reset_tags);
1700}
1701
1702
1703/*
1704 * Called by sata framework to reset a port(s) or device.
1705 *
1706 */
1707static int
1708si_tran_reset_dport(dev_info_t *dip, sata_device_t *sd)
1709{
1710	si_ctl_state_t	*si_ctlp;
1711	uint8_t port = sd->satadev_addr.cport;
1712	int i;
1713	si_port_state_t *si_portp;
1714	int retval = SI_SUCCESS;
1715
1716	si_ctlp = ddi_get_soft_state(si_statep, ddi_get_instance(dip));
1717	SIDBG1(SIDBG_ENTRY, si_ctlp,
1718	    "si_tran_reset_port entry: port: 0x%x",
1719	    port);
1720
1721	switch (sd->satadev_addr.qual) {
1722	case SATA_ADDR_CPORT:
1723		mutex_enter(&si_ctlp->sictl_mutex);
1724		si_portp = si_ctlp->sictl_ports[port];
1725		mutex_exit(&si_ctlp->sictl_mutex);
1726
1727		mutex_enter(&si_portp->siport_mutex);
1728
1729		/*
1730		 * If already mopping, then no need to reset or mop again.
1731		 */
1732		if (si_portp->mopping_in_progress > 0) {
1733			SIDBG1(SIDBG_INFO, si_ctlp,
1734			    "si_tran_reset_dport: CPORT port %d mopping "
1735			    "in progress, so just return", port);
1736			mutex_exit(&si_portp->siport_mutex);
1737			retval = SI_SUCCESS;
1738			break;
1739		}
1740
1741		retval = si_reset_dport_wait_till_ready(si_ctlp, si_portp, port,
1742		    SI_PORT_RESET);
1743		si_reject_all_reset_pkts(si_ctlp,  si_portp, port);
1744		mutex_exit(&si_portp->siport_mutex);
1745
1746		break;
1747
1748	case SATA_ADDR_DCPORT:
1749		mutex_enter(&si_ctlp->sictl_mutex);
1750		si_portp = si_ctlp->sictl_ports[port];
1751		mutex_exit(&si_ctlp->sictl_mutex);
1752
1753		mutex_enter(&si_portp->siport_mutex);
1754
1755		if ((si_portp->siport_port_type == PORT_TYPE_NODEV) ||
1756		    !si_portp->siport_active) {
1757			mutex_exit(&si_portp->siport_mutex);
1758			retval = SI_FAILURE;
1759			break;
1760		}
1761
1762		/*
1763		 * If already mopping, then no need to reset or mop again.
1764		 */
1765		if (si_portp->mopping_in_progress > 0) {
1766			SIDBG1(SIDBG_INFO, si_ctlp,
1767			    "si_tran_reset_dport: DCPORT port %d mopping "
1768			    "in progress, so just return", port);
1769			mutex_exit(&si_portp->siport_mutex);
1770			retval = SI_SUCCESS;
1771			break;
1772		}
1773
1774		retval = si_reset_dport_wait_till_ready(si_ctlp, si_portp, port,
1775		    SI_DEVICE_RESET);
1776		si_reject_all_reset_pkts(si_ctlp,  si_portp, port);
1777		mutex_exit(&si_portp->siport_mutex);
1778
1779		break;
1780
1781	case SATA_ADDR_CNTRL:
1782		for (i = 0; i < si_ctlp->sictl_num_ports; i++) {
1783			mutex_enter(&si_ctlp->sictl_mutex);
1784			si_portp = si_ctlp->sictl_ports[i];
1785			mutex_exit(&si_ctlp->sictl_mutex);
1786
1787			mutex_enter(&si_portp->siport_mutex);
1788
1789			/*
1790			 * If mopping, then all the pending commands are being
1791			 * mopped, therefore there is nothing else to do.
1792			 */
1793			if (si_portp->mopping_in_progress > 0) {
1794				SIDBG1(SIDBG_INFO, si_ctlp,
1795				    "si_tran_reset_dport: CNTRL port %d mopping"
1796				    " in progress, so just return", i);
1797				mutex_exit(&si_portp->siport_mutex);
1798				retval = SI_SUCCESS;
1799				break;
1800			}
1801
1802			retval = si_reset_dport_wait_till_ready(si_ctlp,
1803			    si_portp, i, SI_PORT_RESET);
1804			if (retval) {
1805				mutex_exit(&si_portp->siport_mutex);
1806				break;
1807			}
1808			si_reject_all_reset_pkts(si_ctlp,  si_portp, i);
1809			mutex_exit(&si_portp->siport_mutex);
1810		}
1811		break;
1812
1813	case SATA_ADDR_PMPORT:
1814	case SATA_ADDR_DPMPORT:
1815		SIDBG0(SIDBG_VERBOSE, si_ctlp,
1816		    "port mult reset not implemented yet");
1817		/* FALLSTHROUGH */
1818
1819	default:
1820		retval = SI_FAILURE;
1821
1822	}
1823
1824	return (retval);
1825}
1826
1827
1828/*
1829 * Called by sata framework to activate a port as part of hotplug.
1830 *
1831 * Note: Not port-mult aware.
1832 */
1833static int
1834si_tran_hotplug_port_activate(dev_info_t *dip, sata_device_t *satadev)
1835{
1836	si_ctl_state_t *si_ctlp;
1837	si_port_state_t *si_portp;
1838	uint8_t	port;
1839
1840	si_ctlp = ddi_get_soft_state(si_statep, ddi_get_instance(dip));
1841	port = satadev->satadev_addr.cport;
1842	mutex_enter(&si_ctlp->sictl_mutex);
1843	si_portp = si_ctlp->sictl_ports[port];
1844	mutex_exit(&si_ctlp->sictl_mutex);
1845
1846	SIDBG0(SIDBG_ENTRY, si_ctlp, "si_tran_hotplug_port_activate entry");
1847
1848	mutex_enter(&si_portp->siport_mutex);
1849	si_enable_port_interrupts(si_ctlp, port);
1850
1851	/*
1852	 * Reset the device so that a si_find_dev_signature() would trigger.
1853	 * But this reset is an internal operation; the sata framework does
1854	 * not need to know about it.
1855	 */
1856	(void) si_reset_dport_wait_till_ready(si_ctlp, si_portp, port,
1857	    SI_DEVICE_RESET|SI_RESET_NO_EVENTS_UP);
1858
1859	satadev->satadev_state = SATA_STATE_READY;
1860
1861	si_portp->siport_active = PORT_ACTIVE;
1862
1863	fill_dev_sregisters(si_ctlp, port, satadev);
1864
1865	mutex_exit(&si_portp->siport_mutex);
1866	return (SATA_SUCCESS);
1867}
1868
1869/*
1870 * Called by sata framework to deactivate a port as part of hotplug.
1871 *
1872 * Note: Not port-mult aware.
1873 */
1874static int
1875si_tran_hotplug_port_deactivate(dev_info_t *dip, sata_device_t *satadev)
1876{
1877	si_ctl_state_t *si_ctlp;
1878	si_port_state_t *si_portp;
1879	uint8_t	port;
1880
1881	si_ctlp = ddi_get_soft_state(si_statep, ddi_get_instance(dip));
1882	port = satadev->satadev_addr.cport;
1883	mutex_enter(&si_ctlp->sictl_mutex);
1884	si_portp = si_ctlp->sictl_ports[port];
1885	mutex_exit(&si_ctlp->sictl_mutex);
1886
1887	SIDBG0(SIDBG_ENTRY, NULL, "si_tran_hotplug_port_deactivate entry");
1888
1889	mutex_enter(&si_portp->siport_mutex);
1890	if (si_portp->siport_pending_tags & SI_SLOT_MASK) {
1891		/*
1892		 * There are pending commands on this port.
1893		 * Fail the deactivate request.
1894		 */
1895		satadev->satadev_state = SATA_STATE_READY;
1896		mutex_exit(&si_portp->siport_mutex);
1897		return (SATA_FAILURE);
1898	}
1899
1900	/* mark the device as not accessible any more. */
1901	si_portp->siport_active = PORT_INACTIVE;
1902
1903	/* disable the interrupts on the port. */
1904	si_disable_port_interrupts(si_ctlp, port);
1905
1906	satadev->satadev_state = SATA_PSTATE_SHUTDOWN;
1907
1908	fill_dev_sregisters(si_ctlp, port, satadev);
1909	/*
1910	 * Since we are implementing the port deactivation in software only,
1911	 * we need to fake a valid value for sstatus.
1912	 */
1913	SSTATUS_SET_DET(satadev->satadev_scr.sstatus, SSTATUS_DET_PHYOFFLINE);
1914	SSTATUS_SET_IPM(satadev->satadev_scr.sstatus, SSTATUS_IPM_NODEV_NOPHY);
1915
1916	mutex_exit(&si_portp->siport_mutex);
1917	return (SATA_SUCCESS);
1918}
1919
1920
1921/*
1922 * Allocates the si_port_state_t.
1923 */
1924static int
1925si_alloc_port_state(si_ctl_state_t *si_ctlp, int port)
1926{
1927	si_port_state_t *si_portp;
1928
1929	si_ctlp->sictl_ports[port] = (si_port_state_t *)kmem_zalloc(
1930	    sizeof (si_port_state_t), KM_SLEEP);
1931
1932	si_portp = si_ctlp->sictl_ports[port];
1933	mutex_init(&si_portp->siport_mutex, NULL, MUTEX_DRIVER,
1934	    (void *)(uintptr_t)si_ctlp->sictl_intr_pri);
1935	mutex_enter(&si_portp->siport_mutex);
1936
1937	/* allocate prb & sgt pkts for this port. */
1938	if (si_alloc_prbpool(si_ctlp, port)) {
1939		mutex_exit(&si_portp->siport_mutex);
1940		kmem_free(si_ctlp->sictl_ports[port], sizeof (si_port_state_t));
1941		return (SI_FAILURE);
1942	}
1943	if (si_alloc_sgbpool(si_ctlp, port)) {
1944		si_dealloc_prbpool(si_ctlp, port);
1945		mutex_exit(&si_portp->siport_mutex);
1946		kmem_free(si_ctlp->sictl_ports[port], sizeof (si_port_state_t));
1947		return (SI_FAILURE);
1948	}
1949
1950	si_portp->siport_active = PORT_ACTIVE;
1951	mutex_exit(&si_portp->siport_mutex);
1952
1953	return (SI_SUCCESS);
1954
1955}
1956
1957/*
1958 * Deallocates the si_port_state_t.
1959 */
1960static void
1961si_dealloc_port_state(si_ctl_state_t *si_ctlp, int port)
1962{
1963	si_port_state_t *si_portp;
1964	si_portp = si_ctlp->sictl_ports[port];
1965
1966	mutex_enter(&si_portp->siport_mutex);
1967	si_dealloc_sgbpool(si_ctlp, port);
1968	si_dealloc_prbpool(si_ctlp, port);
1969	mutex_exit(&si_portp->siport_mutex);
1970
1971	mutex_destroy(&si_portp->siport_mutex);
1972
1973	kmem_free(si_ctlp->sictl_ports[port], sizeof (si_port_state_t));
1974
1975}
1976
1977/*
1978 * Allocates the SGB (Scatter Gather Block) incore buffer.
1979 */
1980static int
1981si_alloc_sgbpool(si_ctl_state_t *si_ctlp, int port)
1982{
1983	si_port_state_t *si_portp;
1984	uint_t cookie_count;
1985	size_t incore_sgbpool_size = SI_NUM_SLOTS * sizeof (si_sgblock_t)
1986	    * si_dma_sg_number;
1987	size_t ret_len;
1988	ddi_dma_cookie_t sgbpool_dma_cookie;
1989
1990	si_portp = si_ctlp->sictl_ports[port];
1991
1992	/* allocate sgbpool dma handle. */
1993	if (ddi_dma_alloc_handle(si_ctlp->sictl_devinfop,
1994	    &prb_sgt_dma_attr,
1995	    DDI_DMA_SLEEP,
1996	    NULL,
1997	    &si_portp->siport_sgbpool_dma_handle) !=
1998	    DDI_SUCCESS) {
1999
2000		return (SI_FAILURE);
2001	}
2002
2003	/* allocate the memory for sgbpool. */
2004	if (ddi_dma_mem_alloc(si_portp->siport_sgbpool_dma_handle,
2005	    incore_sgbpool_size,
2006	    &accattr,
2007	    DDI_DMA_RDWR | DDI_DMA_CONSISTENT,
2008	    DDI_DMA_SLEEP,
2009	    NULL,
2010	    (caddr_t *)&si_portp->siport_sgbpool,
2011	    &ret_len,
2012	    &si_portp->siport_sgbpool_acc_handle) != NULL) {
2013
2014		/*  error.. free the dma handle. */
2015		ddi_dma_free_handle(&si_portp->siport_sgbpool_dma_handle);
2016		return (SI_FAILURE);
2017	}
2018
2019	/* now bind it */
2020	if (ddi_dma_addr_bind_handle(si_portp->siport_sgbpool_dma_handle,
2021	    NULL,
2022	    (caddr_t)si_portp->siport_sgbpool,
2023	    incore_sgbpool_size,
2024	    DDI_DMA_CONSISTENT,
2025	    DDI_DMA_SLEEP,
2026	    NULL,
2027	    &sgbpool_dma_cookie,
2028	    &cookie_count) !=  DDI_DMA_MAPPED) {
2029		/*  error.. free the dma handle & free the memory. */
2030		ddi_dma_mem_free(&si_portp->siport_sgbpool_acc_handle);
2031		ddi_dma_free_handle(&si_portp->siport_sgbpool_dma_handle);
2032		return (SI_FAILURE);
2033	}
2034
2035	si_portp->siport_sgbpool_physaddr = sgbpool_dma_cookie.dmac_laddress;
2036	return (SI_SUCCESS);
2037}
2038
2039/*
2040 * Deallocates the SGB (Scatter Gather Block) incore buffer.
2041 */
2042static void
2043si_dealloc_sgbpool(si_ctl_state_t *si_ctlp, int port)
2044{
2045	si_port_state_t *si_portp = si_ctlp->sictl_ports[port];
2046
2047	/* Unbind the dma handle first. */
2048	(void) ddi_dma_unbind_handle(si_portp->siport_sgbpool_dma_handle);
2049
2050	/* Then free the underlying memory. */
2051	ddi_dma_mem_free(&si_portp->siport_sgbpool_acc_handle);
2052
2053	/* Now free the handle itself. */
2054	ddi_dma_free_handle(&si_portp->siport_sgbpool_dma_handle);
2055
2056}
2057
2058/*
2059 * Allocates the PRB (Port Request Block) incore packets.
2060 */
2061static int
2062si_alloc_prbpool(si_ctl_state_t *si_ctlp, int port)
2063{
2064	si_port_state_t *si_portp;
2065	uint_t cookie_count;
2066	size_t incore_pkt_size = SI_NUM_SLOTS * sizeof (si_prb_t);
2067	size_t ret_len;
2068	ddi_dma_cookie_t prbpool_dma_cookie;
2069
2070	si_portp = si_ctlp->sictl_ports[port];
2071
2072	/* allocate prb pkts. */
2073	if (ddi_dma_alloc_handle(si_ctlp->sictl_devinfop,
2074	    &prb_sgt_dma_attr,
2075	    DDI_DMA_SLEEP,
2076	    NULL,
2077	    &si_portp->siport_prbpool_dma_handle) !=
2078	    DDI_SUCCESS) {
2079
2080		return (SI_FAILURE);
2081	}
2082
2083	if (ddi_dma_mem_alloc(si_portp->siport_prbpool_dma_handle,
2084	    incore_pkt_size,
2085	    &accattr,
2086	    DDI_DMA_RDWR | DDI_DMA_CONSISTENT,
2087	    DDI_DMA_SLEEP,
2088	    NULL,
2089	    (caddr_t *)&si_portp->siport_prbpool,
2090	    &ret_len,
2091	    &si_portp->siport_prbpool_acc_handle) != NULL) {
2092
2093		/* error.. free the dma handle. */
2094		ddi_dma_free_handle(&si_portp->siport_prbpool_dma_handle);
2095		return (SI_FAILURE);
2096	}
2097
2098	if (ddi_dma_addr_bind_handle(si_portp->siport_prbpool_dma_handle,
2099	    NULL,
2100	    (caddr_t)si_portp->siport_prbpool,
2101	    incore_pkt_size,
2102	    DDI_DMA_CONSISTENT,
2103	    DDI_DMA_SLEEP,
2104	    NULL,
2105	    &prbpool_dma_cookie,
2106	    &cookie_count) !=  DDI_DMA_MAPPED) {
2107		/*  error.. free the dma handle & free the memory. */
2108		ddi_dma_mem_free(&si_portp->siport_prbpool_acc_handle);
2109		ddi_dma_free_handle(&si_portp->siport_prbpool_dma_handle);
2110		return (SI_FAILURE);
2111	}
2112
2113	si_portp->siport_prbpool_physaddr =
2114	    prbpool_dma_cookie.dmac_laddress;
2115	return (SI_SUCCESS);
2116}
2117
2118/*
2119 * Deallocates the PRB (Port Request Block) incore packets.
2120 */
2121static void
2122si_dealloc_prbpool(si_ctl_state_t *si_ctlp, int port)
2123{
2124	si_port_state_t *si_portp = si_ctlp->sictl_ports[port];
2125
2126	/* Unbind the prb dma handle first. */
2127	(void) ddi_dma_unbind_handle(si_portp->siport_prbpool_dma_handle);
2128
2129	/* Then free the underlying memory. */
2130	ddi_dma_mem_free(&si_portp->siport_prbpool_acc_handle);
2131
2132	/* Now free the handle itself. */
2133	ddi_dma_free_handle(&si_portp->siport_prbpool_dma_handle);
2134
2135}
2136
2137
2138
2139/*
2140 * Soft-reset the port to find the signature of the device connected to
2141 * the port.
2142 */
2143static void
2144si_find_dev_signature(
2145	si_ctl_state_t *si_ctlp,
2146	si_port_state_t *si_portp,
2147	int port,
2148	int pmp)
2149{
2150	si_prb_t *prb;
2151	uint32_t slot_status, signature;
2152	int slot, loop_count;
2153
2154	SIDBG2(SIDBG_ENTRY|SIDBG_INIT, si_ctlp,
2155	    "si_find_dev_signature enter: port: %x, pmp: %x",
2156	    port, pmp);
2157
2158	/* Build a Soft Reset PRB in host memory. */
2159	mutex_enter(&si_portp->siport_mutex);
2160
2161	slot = si_claim_free_slot(si_ctlp, si_portp, port);
2162	if (slot == SI_FAILURE) {
2163		/* Empty slot could not be found. */
2164		if (pmp != PORTMULT_CONTROL_PORT) {
2165			/* We are behind port multiplier. */
2166			si_portp->siport_portmult_state.sipm_port_type[pmp] =
2167			    PORT_TYPE_NODEV;
2168		} else {
2169			si_portp->siport_port_type = PORT_TYPE_NODEV;
2170		}
2171
2172		mutex_exit(&si_portp->siport_mutex);
2173		return;
2174	}
2175	prb = &si_portp->siport_prbpool[slot];
2176	bzero((void *)prb, sizeof (si_prb_t));
2177
2178	SET_FIS_PMP(prb->prb_fis, pmp);
2179	SET_PRB_CONTROL_SOFT_RESET(prb);
2180
2181#if SI_DEBUG
2182	if (si_debug_flags & SIDBG_DUMP_PRB) {
2183		char *ptr;
2184		int j;
2185
2186		ptr = (char *)prb;
2187		cmn_err(CE_WARN, "si_find_dev_signature, prb: ");
2188		for (j = 0; j < (sizeof (si_prb_t)); j++) {
2189			if (j%4 == 0) {
2190				cmn_err(CE_WARN, "----");
2191			}
2192			cmn_err(CE_WARN, "%x ", ptr[j]);
2193		}
2194
2195	}
2196#endif /* SI_DEBUG */
2197
2198	/* deliver soft reset prb to empty slot. */
2199	POST_PRB_ADDR(si_ctlp, si_portp, port, slot);
2200
2201	loop_count = 0;
2202	/* Loop till the soft reset is finished. */
2203	do {
2204		slot_status = ddi_get32(si_ctlp->sictl_port_acc_handle,
2205		    (uint32_t *)(PORT_SLOT_STATUS(si_ctlp, port)));
2206
2207		if (loop_count++ > SI_POLLRATE_SOFT_RESET) {
2208			/* We are effectively timing out after 10 sec. */
2209			break;
2210		}
2211
2212		/* Wait for 10 millisec */
2213#ifndef __lock_lint
2214		delay(SI_10MS_TICKS);
2215#endif /* __lock_lint */
2216
2217	} while (slot_status & SI_SLOT_MASK & (0x1 << slot));
2218
2219	SIDBG2(SIDBG_POLL_LOOP, si_ctlp,
2220	    "si_find_dev_signature: loop count: %d, slot_status: 0x%x",
2221	    loop_count, slot_status);
2222
2223	CLEAR_BIT(si_portp->siport_pending_tags, slot);
2224
2225	/* Read device signature from command slot. */
2226	signature = ddi_get32(si_ctlp->sictl_port_acc_handle,
2227	    (uint32_t *)(PORT_SIGNATURE_MSB(si_ctlp, port, slot)));
2228	signature <<= 8;
2229	signature |= (0xff & ddi_get32(si_ctlp->sictl_port_acc_handle,
2230	    (uint32_t *)(PORT_SIGNATURE_LSB(si_ctlp,
2231	    port, slot))));
2232
2233	SIDBG1(SIDBG_INIT, si_ctlp, "Device signature: 0x%x", signature);
2234
2235	if (signature == SI_SIGNATURE_PORT_MULTIPLIER) {
2236
2237		SIDBG2(SIDBG_INIT, si_ctlp,
2238		    "Found multiplier at cport: 0x%d, pmport: 0x%x",
2239		    port, pmp);
2240
2241		if (pmp != PORTMULT_CONTROL_PORT) {
2242			/*
2243			 * It is wrong to chain a port multiplier behind
2244			 * another port multiplier.
2245			 */
2246			si_portp->siport_portmult_state.sipm_port_type[pmp] =
2247			    PORT_TYPE_NODEV;
2248		} else {
2249			si_portp->siport_port_type = PORT_TYPE_MULTIPLIER;
2250			mutex_exit(&si_portp->siport_mutex);
2251			(void) si_enumerate_port_multiplier(si_ctlp,
2252			    si_portp, port);
2253			mutex_enter(&si_portp->siport_mutex);
2254		}
2255		si_init_port(si_ctlp, port);
2256
2257	} else if (signature == SI_SIGNATURE_ATAPI) {
2258		if (pmp != PORTMULT_CONTROL_PORT) {
2259			/* We are behind port multiplier. */
2260			si_portp->siport_portmult_state.sipm_port_type[pmp] =
2261			    PORT_TYPE_ATAPI;
2262		} else {
2263			si_portp->siport_port_type = PORT_TYPE_ATAPI;
2264			si_init_port(si_ctlp, port);
2265		}
2266		SIDBG2(SIDBG_INIT, si_ctlp,
2267		    "Found atapi at : cport: %x, pmport: %x",
2268		    port, pmp);
2269
2270	} else if (signature == SI_SIGNATURE_DISK) {
2271
2272		if (pmp != PORTMULT_CONTROL_PORT) {
2273			/* We are behind port multiplier. */
2274			si_portp->siport_portmult_state.sipm_port_type[pmp] =
2275			    PORT_TYPE_DISK;
2276		} else {
2277			si_portp->siport_port_type = PORT_TYPE_DISK;
2278			si_init_port(si_ctlp, port);
2279		}
2280		SIDBG2(SIDBG_INIT, si_ctlp,
2281		    "found disk at : cport: %x, pmport: %x",
2282		    port, pmp);
2283
2284	} else {
2285		if (pmp != PORTMULT_CONTROL_PORT) {
2286			/* We are behind port multiplier. */
2287			si_portp->siport_portmult_state.sipm_port_type[pmp] =
2288			    PORT_TYPE_UNKNOWN;
2289		} else {
2290			si_portp->siport_port_type = PORT_TYPE_UNKNOWN;
2291		}
2292		SIDBG3(SIDBG_INIT, si_ctlp,
2293		    "Found unknown signature 0x%x at: port: %x, pmp: %x",
2294		    signature, port, pmp);
2295	}
2296
2297	mutex_exit(&si_portp->siport_mutex);
2298}
2299
2300
2301/*
2302 * Polls for the completion of the command. This is safe with both
2303 * interrupts enabled or disabled.
2304 */
2305static void
2306si_poll_cmd(
2307	si_ctl_state_t *si_ctlp,
2308	si_port_state_t *si_portp,
2309	int port,
2310	int slot,
2311	sata_pkt_t *satapkt)
2312{
2313	uint32_t slot_status;
2314	int pkt_timeout_ticks;
2315	uint32_t port_intr_status;
2316	int in_panic = ddi_in_panic();
2317
2318	SIDBG1(SIDBG_ENTRY, si_ctlp, "si_poll_cmd entered: port: 0x%x", port);
2319
2320	pkt_timeout_ticks = drv_usectohz((clock_t)satapkt->satapkt_time *
2321	    1000000);
2322
2323
2324	/* we start out with SATA_PKT_COMPLETED as the satapkt_reason */
2325	satapkt->satapkt_reason = SATA_PKT_COMPLETED;
2326
2327	do {
2328		slot_status = ddi_get32(si_ctlp->sictl_port_acc_handle,
2329		    (uint32_t *)(PORT_SLOT_STATUS(si_ctlp, port)));
2330
2331		if (slot_status & SI_SLOT_MASK & (0x1 << slot)) {
2332			if (in_panic) {
2333				/*
2334				 * If we are in panic, we can't rely on
2335				 * timers; so, busy wait instead of delay().
2336				 */
2337				mutex_exit(&si_portp->siport_mutex);
2338				drv_usecwait(SI_1MS_USECS);
2339				mutex_enter(&si_portp->siport_mutex);
2340			} else {
2341				mutex_exit(&si_portp->siport_mutex);
2342#ifndef __lock_lint
2343				delay(SI_1MS_TICKS);
2344#endif /* __lock_lint */
2345				mutex_enter(&si_portp->siport_mutex);
2346			}
2347		} else {
2348			break;
2349		}
2350
2351		pkt_timeout_ticks -= SI_1MS_TICKS;
2352
2353	} while (pkt_timeout_ticks > 0);
2354
2355	if (satapkt->satapkt_reason != SATA_PKT_COMPLETED) {
2356		/* The si_mop_command() got to our packet before us */
2357
2358		return;
2359	}
2360
2361	/*
2362	 * Interrupts and timers may not be working properly in a crash dump
2363	 * situation; we may need to handle all the three conditions here:
2364	 * successful completion, packet failure and packet timeout.
2365	 */
2366	if (IS_ATTENTION_RAISED(slot_status)) { /* error seen on port */
2367
2368		port_intr_status = ddi_get32(si_ctlp->sictl_global_acc_handle,
2369		    (uint32_t *)PORT_INTERRUPT_STATUS(si_ctlp, port));
2370
2371		SIDBG2(SIDBG_VERBOSE, si_ctlp,
2372		    "si_poll_cmd: port_intr_status: 0x%x, port: %x",
2373		    port_intr_status, port);
2374
2375		if (port_intr_status & INTR_COMMAND_ERROR) {
2376			mutex_exit(&si_portp->siport_mutex);
2377			(void) si_intr_command_error(si_ctlp, si_portp, port);
2378			mutex_enter(&si_portp->siport_mutex);
2379
2380			return;
2381
2382			/*
2383			 * Why do we need to call si_intr_command_error() ?
2384			 *
2385			 * Answer: Even if the current packet is not the
2386			 * offending command, we need to restart the stalled
2387			 * port; (may be, the interrupts are not working well
2388			 * in panic condition). The call to routine
2389			 * si_intr_command_error() will achieve that.
2390			 *
2391			 * What if the interrupts are working fine and the
2392			 * si_intr_command_error() gets called once more from
2393			 * interrupt context ?
2394			 *
2395			 * Answer: The second instance of routine
2396			 * si_intr_command_error() will not mop anything
2397			 * since the first error handler has already blown
2398			 * away the hardware pending queues through reset.
2399			 *
2400			 * Will the si_intr_command_error() hurt current
2401			 * packet ?
2402			 *
2403			 * Answer: No.
2404			 */
2405		} else {
2406			/* Ignore any non-error interrupts at this stage */
2407			ddi_put32(si_ctlp->sictl_port_acc_handle,
2408			    (uint32_t *)(PORT_INTERRUPT_STATUS(si_ctlp,
2409			    port)),
2410			    port_intr_status & INTR_MASK);
2411		}
2412
2413	} else if (slot_status & SI_SLOT_MASK & (0x1 << slot)) {
2414		satapkt->satapkt_reason = SATA_PKT_TIMEOUT;
2415
2416	} /* else: the command completed successfully */
2417
2418	if (satapkt->satapkt_cmd.satacmd_flags.sata_special_regs) {
2419		si_copy_out_regs(&satapkt->satapkt_cmd, si_ctlp, port, slot);
2420	}
2421
2422	if ((satapkt->satapkt_cmd.satacmd_cmd_reg ==
2423	    SATAC_WRITE_FPDMA_QUEUED) ||
2424	    (satapkt->satapkt_cmd.satacmd_cmd_reg ==
2425	    SATAC_READ_FPDMA_QUEUED)) {
2426		si_portp->siport_pending_ncq_count--;
2427	}
2428
2429	CLEAR_BIT(si_portp->siport_pending_tags, slot);
2430
2431	/*
2432	 * tidbit: What is the interaction of abort with polling ?
2433	 * What happens if the current polled pkt is aborted in parallel ?
2434	 *
2435	 * Answer: Assuming that the si_mop_commands() completes ahead
2436	 * of polling, all it does is to set the satapkt_reason to
2437	 * SPKT_PKT_ABORTED. That would be fine with us.
2438	 *
2439	 * The same logic applies to reset interacting with polling.
2440	 */
2441}
2442
2443
2444/*
2445 * Searches for and claims a free slot.
2446 *
2447 * Returns: 	SI_FAILURE if no slots found
2448 *		claimed slot number if successful
2449 *
2450 * WARNING, WARNING: The caller is expected to obtain the siport_mutex
2451 * before calling us.
2452 */
2453/*ARGSUSED*/
2454static int
2455si_claim_free_slot(si_ctl_state_t *si_ctlp, si_port_state_t *si_portp, int port)
2456{
2457	uint32_t free_slots;
2458	int slot;
2459
2460	_NOTE(ASSUMING_PROTECTED(si_portp))
2461
2462	SIDBG1(SIDBG_ENTRY, si_ctlp,
2463	    "si_claim_free_slot entry: siport_pending_tags: %x",
2464	    si_portp->siport_pending_tags);
2465
2466	free_slots = (~si_portp->siport_pending_tags) & SI_SLOT_MASK;
2467	slot = ddi_ffs(free_slots) - 1;
2468	if (slot == -1) {
2469		SIDBG0(SIDBG_VERBOSE, si_ctlp,
2470		    "si_claim_free_slot: no empty slots");
2471		return (SI_FAILURE);
2472	}
2473
2474	si_portp->siport_pending_tags |= (0x1 << slot);
2475	SIDBG1(SIDBG_VERBOSE, si_ctlp, "si_claim_free_slot: found slot: 0x%x",
2476	    slot);
2477	return (slot);
2478}
2479
2480/*
2481 * Builds the PRB for the sata packet and delivers it to controller.
2482 *
2483 * Returns:
2484 *	slot number if we can obtain a slot successfully
2485 *	otherwise, return SI_FAILURE
2486 *
2487 * WARNING, WARNING: The caller is expected to obtain the siport_mutex
2488 * before calling us.
2489 */
2490static int
2491si_deliver_satapkt(
2492	si_ctl_state_t *si_ctlp,
2493	si_port_state_t *si_portp,
2494	int port,
2495	sata_pkt_t *spkt)
2496{
2497	int slot;
2498	si_prb_t *prb;
2499	sata_cmd_t *cmd;
2500	si_sge_t *sgep; /* scatter gather entry pointer */
2501	si_sgt_t *sgtp; /* scatter gather table pointer */
2502	si_sgblock_t *sgbp; /* scatter gather block pointer */
2503	int i, j, cookie_index;
2504	int ncookies;
2505	int is_atapi = 0;
2506	ddi_dma_cookie_t cookie;
2507
2508	_NOTE(ASSUMING_PROTECTED(si_portp))
2509
2510	slot = si_claim_free_slot(si_ctlp, si_portp, port);
2511	if (slot == SI_FAILURE) {
2512		return (SI_FAILURE);
2513	}
2514
2515	if (spkt->satapkt_device.satadev_type == SATA_DTYPE_ATAPICD) {
2516		is_atapi = 1;
2517	}
2518
2519	if ((si_portp->siport_port_type == PORT_TYPE_NODEV) ||
2520	    !si_portp->siport_active) {
2521		/*
2522		 * si_intr_phy_ready_change() may have rendered it to
2523		 * PORT_TYPE_NODEV. cfgadm operation may have rendered
2524		 * it inactive.
2525		 */
2526		spkt->satapkt_reason = SATA_PKT_PORT_ERROR;
2527		fill_dev_sregisters(si_ctlp, port, &spkt->satapkt_device);
2528
2529		return (SI_FAILURE);
2530	}
2531
2532
2533	prb =  &(si_portp->siport_prbpool[slot]);
2534	bzero((void *)prb, sizeof (si_prb_t));
2535
2536	cmd = &spkt->satapkt_cmd;
2537
2538	SIDBG4(SIDBG_ENTRY, si_ctlp,
2539	    "si_deliver_satpkt entry: cmd_reg: 0x%x, slot: 0x%x, \
2540		port: %x, satapkt: %x",
2541	    cmd->satacmd_cmd_reg, slot, port, (uint32_t)(intptr_t)spkt);
2542
2543	/* Now fill the prb. */
2544	if (is_atapi) {
2545		if (spkt->satapkt_cmd.satacmd_flags.sata_data_direction ==
2546		    SATA_DIR_READ) {
2547			SET_PRB_CONTROL_PKT_READ(prb);
2548		} else if (spkt->satapkt_cmd.satacmd_flags.sata_data_direction
2549		    == SATA_DIR_WRITE) {
2550			SET_PRB_CONTROL_PKT_WRITE(prb);
2551		}
2552	}
2553
2554	SET_FIS_TYPE(prb->prb_fis, REGISTER_FIS_H2D);
2555	if ((spkt->satapkt_device.satadev_addr.qual == SATA_ADDR_PMPORT) ||
2556	    (spkt->satapkt_device.satadev_addr.qual == SATA_ADDR_DPMPORT)) {
2557		SET_FIS_PMP(prb->prb_fis,
2558		    spkt->satapkt_device.satadev_addr.pmport);
2559	}
2560	SET_FIS_CDMDEVCTL(prb->prb_fis, 1);
2561	SET_FIS_COMMAND(prb->prb_fis, cmd->satacmd_cmd_reg);
2562	SET_FIS_FEATURES(prb->prb_fis, cmd->satacmd_features_reg);
2563	SET_FIS_SECTOR_COUNT(prb->prb_fis, cmd->satacmd_sec_count_lsb);
2564
2565	switch (cmd->satacmd_addr_type) {
2566
2567	case 0:
2568		/*
2569		 * satacmd_addr_type will be 0 for the commands below:
2570		 * 	SATAC_PACKET
2571		 * 	SATAC_IDLE_IM
2572		 * 	SATAC_STANDBY_IM
2573		 * 	SATAC_DOWNLOAD_MICROCODE
2574		 * 	SATAC_FLUSH_CACHE
2575		 * 	SATAC_SET_FEATURES
2576		 * 	SATAC_SMART
2577		 * 	SATAC_ID_PACKET_DEVICE
2578		 * 	SATAC_ID_DEVICE
2579		 * 	SATAC_READ_PORTMULT
2580		 * 	SATAC_WRITE_PORTMULT
2581		 */
2582		/* FALLTHRU */
2583
2584	case ATA_ADDR_LBA:
2585		/* FALLTHRU */
2586
2587	case ATA_ADDR_LBA28:
2588		/* LBA[7:0] */
2589		SET_FIS_SECTOR(prb->prb_fis, cmd->satacmd_lba_low_lsb);
2590
2591		/* LBA[15:8] */
2592		SET_FIS_CYL_LOW(prb->prb_fis, cmd->satacmd_lba_mid_lsb);
2593
2594		/* LBA[23:16] */
2595		SET_FIS_CYL_HI(prb->prb_fis, cmd->satacmd_lba_high_lsb);
2596
2597		/* LBA [27:24] (also called dev_head) */
2598		SET_FIS_DEV_HEAD(prb->prb_fis, cmd->satacmd_device_reg);
2599
2600		break;
2601
2602	case ATA_ADDR_LBA48:
2603		/* LBA[7:0] */
2604		SET_FIS_SECTOR(prb->prb_fis, cmd->satacmd_lba_low_lsb);
2605
2606		/* LBA[15:8] */
2607		SET_FIS_CYL_LOW(prb->prb_fis, cmd->satacmd_lba_mid_lsb);
2608
2609		/* LBA[23:16] */
2610		SET_FIS_CYL_HI(prb->prb_fis, cmd->satacmd_lba_high_lsb);
2611
2612		/* LBA [31:24] */
2613		SET_FIS_SECTOR_EXP(prb->prb_fis, cmd->satacmd_lba_low_msb);
2614
2615		/* LBA [39:32] */
2616		SET_FIS_CYL_LOW_EXP(prb->prb_fis, cmd->satacmd_lba_mid_msb);
2617
2618		/* LBA [47:40] */
2619		SET_FIS_CYL_HI_EXP(prb->prb_fis, cmd->satacmd_lba_high_msb);
2620
2621		/* Set dev_head */
2622		SET_FIS_DEV_HEAD(prb->prb_fis, cmd->satacmd_device_reg);
2623
2624		/* Set the extended sector count and features */
2625		SET_FIS_SECTOR_COUNT_EXP(prb->prb_fis,
2626		    cmd->satacmd_sec_count_msb);
2627		SET_FIS_FEATURES_EXP(prb->prb_fis,
2628		    cmd->satacmd_features_reg_ext);
2629
2630		break;
2631
2632	}
2633
2634	if (cmd->satacmd_flags.sata_queued) {
2635		/*
2636		 * For queued commands, the TAG for the sector count lsb is
2637		 * generated from current slot number.
2638		 */
2639		SET_FIS_SECTOR_COUNT(prb->prb_fis, slot << 3);
2640	}
2641
2642	if ((cmd->satacmd_cmd_reg == SATAC_WRITE_FPDMA_QUEUED) ||
2643	    (cmd->satacmd_cmd_reg == SATAC_READ_FPDMA_QUEUED)) {
2644		si_portp->siport_pending_ncq_count++;
2645	}
2646
2647	/* *** now fill the scatter gather list ******* */
2648
2649	if (is_atapi) { /* It is an ATAPI drive */
2650		/* atapi command goes into sge0 */
2651		bcopy(cmd->satacmd_acdb, &prb->prb_sge0, sizeof (si_sge_t));
2652
2653		/* Now fill sge1 with pointer to external SGT. */
2654		if (spkt->satapkt_cmd.satacmd_num_dma_cookies) {
2655			prb->prb_sge1.sge_addr =
2656			    si_portp->siport_sgbpool_physaddr +
2657			    slot * sizeof (si_sgblock_t) * si_dma_sg_number;
2658			SET_SGE_LNK(prb->prb_sge1);
2659		} else {
2660			SET_SGE_TRM(prb->prb_sge1);
2661		}
2662	} else {
2663		/* Fill the sge0 */
2664		if (spkt->satapkt_cmd.satacmd_num_dma_cookies) {
2665			prb->prb_sge0.sge_addr =
2666			    si_portp->siport_sgbpool_physaddr +
2667			    slot * sizeof (si_sgblock_t) * si_dma_sg_number;
2668			SET_SGE_LNK(prb->prb_sge0);
2669
2670		} else {
2671			SET_SGE_TRM(prb->prb_sge0);
2672		}
2673
2674		/* sge1 is left empty in non-ATAPI case */
2675	}
2676
2677	bzero(&si_portp->siport_sgbpool[slot * si_dma_sg_number],
2678	    sizeof (si_sgblock_t) * si_dma_sg_number);
2679
2680	ncookies = spkt->satapkt_cmd.satacmd_num_dma_cookies;
2681	ASSERT(ncookies <= (SGE_LENGTH(si_dma_sg_number)));
2682
2683	SIDBG1(SIDBG_COOKIES, si_ctlp, "total ncookies: %d", ncookies);
2684	if (ncookies == 0) {
2685		sgbp = &si_portp->siport_sgbpool[slot * si_dma_sg_number];
2686		sgtp = &sgbp->sgb_sgt[0];
2687		sgep = &sgtp->sgt_sge[0];
2688
2689		/* No cookies. Terminate the chain. */
2690		SIDBG0(SIDBG_COOKIES, si_ctlp, "empty cookies: terminating.");
2691
2692		sgep->sge_addr_low = 0;
2693		sgep->sge_addr_high = 0;
2694		sgep->sge_data_count = 0;
2695		SET_SGE_TRM((*sgep));
2696
2697		goto sgl_fill_done;
2698	}
2699
2700	for (i = 0, cookie_index = 0,
2701	    sgbp = &si_portp->siport_sgbpool[slot * si_dma_sg_number];
2702	    i < si_dma_sg_number; i++) {
2703
2704		sgtp = &sgbp->sgb_sgt[0] + i;
2705
2706		/* Now fill the first 3 entries of SGT in the loop below. */
2707		for (j = 0, sgep = &sgtp->sgt_sge[0];
2708		    ((j < 3) && (cookie_index < ncookies-1));
2709		    j++, cookie_index++, sgep++)  {
2710			ASSERT(cookie_index < ncookies);
2711			SIDBG2(SIDBG_COOKIES, si_ctlp,
2712			    "inner loop: cookie_index: %d, ncookies: %d",
2713			    cookie_index,
2714			    ncookies);
2715			cookie = spkt->satapkt_cmd.
2716			    satacmd_dma_cookie_list[cookie_index];
2717
2718			sgep->sge_addr_low = cookie._dmu._dmac_la[0];
2719			sgep->sge_addr_high = cookie._dmu._dmac_la[1];
2720			sgep->sge_data_count = (uint32_t)cookie.dmac_size;
2721		}
2722
2723		/*
2724		 * If this happens to be the last cookie, we terminate it here.
2725		 * Otherwise, we link to next SGT.
2726		 */
2727
2728		if (cookie_index == ncookies-1) {
2729			/* This is the last cookie. Terminate the chain. */
2730			SIDBG2(SIDBG_COOKIES, si_ctlp,
2731			    "filling the last: cookie_index: %d, "
2732			    "ncookies: %d",
2733			    cookie_index,
2734			    ncookies);
2735			cookie = spkt->satapkt_cmd.
2736			    satacmd_dma_cookie_list[cookie_index];
2737
2738			sgep->sge_addr_low = cookie._dmu._dmac_la[0];
2739			sgep->sge_addr_high = cookie._dmu._dmac_la[1];
2740			sgep->sge_data_count = (uint32_t)cookie.dmac_size;
2741			SET_SGE_TRM((*sgep));
2742
2743			break; /* we break the loop */
2744
2745		} else {
2746			/* This is not the last one. So link it. */
2747			SIDBG2(SIDBG_COOKIES, si_ctlp,
2748			    "linking SGT: cookie_index: %d, ncookies: %d",
2749			    cookie_index,
2750			    ncookies);
2751			sgep->sge_addr = si_portp->siport_sgbpool_physaddr +
2752			    slot * sizeof (si_sgblock_t) * si_dma_sg_number +
2753			    (i+1) * sizeof (si_sgt_t);
2754
2755			SET_SGE_LNK((*sgep));
2756		}
2757
2758	}
2759
2760	/* *** finished filling the scatter gather list ******* */
2761
2762sgl_fill_done:
2763	/* Now remember the sata packet in siport_slot_pkts[]. */
2764	si_portp->siport_slot_pkts[slot] = spkt;
2765
2766	/*
2767	 * We are overloading satapkt_hba_driver_private with
2768	 * watched_cycle count.
2769	 */
2770	spkt->satapkt_hba_driver_private = (void *)(intptr_t)0;
2771
2772	if (is_atapi) {
2773		/* program the packet_lenth if it is atapi device. */
2774
2775
2776#ifdef ATAPI_2nd_PHASE
2777		/*
2778		 * Framework needs to calculate the acdb_len based on
2779		 * identify packet data. This needs to be accomplished
2780		 * in second phase of the project.
2781		 */
2782		ASSERT((cmd->satacmd_acdb_len == 12) ||
2783		    (cmd->satacmd_acdb_len == 16));
2784		SIDBG1(SIDBG_VERBOSE, si_ctlp, "deliver: acdb_len: %d",
2785		    cmd->satacmd_acdb_len);
2786
2787		if (cmd->satacmd_acdb_len == 16) {
2788			ddi_put32(si_ctlp->sictl_port_acc_handle,
2789			    (uint32_t *)PORT_CONTROL_SET(si_ctlp, port),
2790			    PORT_CONTROL_SET_BITS_PACKET_LEN);
2791		} else {
2792			ddi_put32(si_ctlp->sictl_port_acc_handle,
2793			    (uint32_t *)PORT_CONTROL_CLEAR(si_ctlp, port),
2794			    PORT_CONTROL_CLEAR_BITS_PACKET_LEN);
2795		}
2796
2797#else /* ATAPI_2nd_PHASE */
2798		/* hard coding for now to 12 bytes */
2799		ddi_put32(si_ctlp->sictl_port_acc_handle,
2800		    (uint32_t *)PORT_CONTROL_CLEAR(si_ctlp, port),
2801		    PORT_CONTROL_CLEAR_BITS_PACKET_LEN);
2802#endif /* ATAPI_2nd_PHASE */
2803	}
2804
2805
2806#if SI_DEBUG
2807	if (si_debug_flags & SIDBG_DUMP_PRB) {
2808		if (!(is_atapi && (prb->prb_sge0.sge_addr_low == 0))) {
2809			/*
2810			 * Do not dump the atapi Test-Unit-Ready commands.
2811			 * The sd_media_watch spews too many of these.
2812			 */
2813			int *ptr;
2814			si_sge_t *tmpsgep;
2815			int j;
2816
2817			ptr = (int *)(void *)prb;
2818			cmn_err(CE_WARN, "si_deliver_satpkt prb: ");
2819			for (j = 0; j < (sizeof (si_prb_t)/4); j++) {
2820				cmn_err(CE_WARN, "%x ", ptr[j]);
2821			}
2822
2823			cmn_err(CE_WARN,
2824			    "si_deliver_satpkt sgt: low, high, count link");
2825			for (j = 0,
2826			    tmpsgep = (si_sge_t *)
2827			    &si_portp->siport_sgbpool[slot * si_dma_sg_number];
2828			    j < (sizeof (si_sgblock_t)/ sizeof (si_sge_t))
2829			    *si_dma_sg_number;
2830			    j++, tmpsgep++) {
2831				ptr = (int *)(void *)tmpsgep;
2832				cmn_err(CE_WARN, "%x %x %x %x",
2833				    ptr[0],
2834				    ptr[1],
2835				    ptr[2],
2836				    ptr[3]);
2837				if (IS_SGE_TRM_SET((*tmpsgep))) {
2838					break;
2839				}
2840
2841			}
2842		}
2843
2844	}
2845#endif  /* SI_DEBUG */
2846
2847	/* Deliver PRB */
2848	POST_PRB_ADDR(si_ctlp, si_portp, port, slot);
2849
2850	return (slot);
2851}
2852
2853/*
2854 * Initialize the controller and set up driver data structures.
2855 *
2856 * This routine can be called from three separate cases: DDI_ATTACH, PM_LEVEL_D0
2857 * and DDI_RESUME. The DDI_ATTACH case is different from other two cases; the
2858 * memory allocation & device signature probing are attempted only during
2859 * DDI_ATTACH case. In the case of PM_LEVEL_D0 & DDI_RESUME, we are starting
2860 * from a previously initialized state; so there is no need to allocate memory
2861 * or to attempt probing the device signatures.
2862 */
2863static int
2864si_initialize_controller(si_ctl_state_t *si_ctlp)
2865{
2866	uint32_t port_status;
2867	uint32_t SStatus;
2868	uint32_t SControl;
2869	int port;
2870	int loop_count = 0;
2871	si_port_state_t *si_portp;
2872
2873	SIDBG0(SIDBG_INIT|SIDBG_ENTRY, si_ctlp,
2874	    "si3124: si_initialize_controller entered");
2875
2876	mutex_enter(&si_ctlp->sictl_mutex);
2877
2878	/* Remove the Global Reset. */
2879	ddi_put32(si_ctlp->sictl_global_acc_handle,
2880	    (uint32_t *)GLOBAL_CONTROL_REG(si_ctlp),
2881	    GLOBAL_CONTROL_REG_BITS_CLEAR);
2882
2883	for (port = 0; port < si_ctlp->sictl_num_ports; port++) {
2884
2885		if (si_ctlp->sictl_flags & SI_ATTACH) {
2886			/*
2887			 * We allocate the port state only during attach
2888			 * sequence. We don't want to do it during
2889			 * suspend/resume sequence.
2890			 */
2891			if (si_alloc_port_state(si_ctlp, port)) {
2892				mutex_exit(&si_ctlp->sictl_mutex);
2893				return (SI_FAILURE);
2894			}
2895		}
2896
2897		si_portp = si_ctlp->sictl_ports[port];
2898		mutex_enter(&si_portp->siport_mutex);
2899
2900		/* Clear Port Reset. */
2901		ddi_put32(si_ctlp->sictl_port_acc_handle,
2902		    (uint32_t *)PORT_CONTROL_SET(si_ctlp, port),
2903		    PORT_CONTROL_SET_BITS_PORT_RESET);
2904		ddi_put32(si_ctlp->sictl_port_acc_handle,
2905		    (uint32_t *)PORT_CONTROL_CLEAR(si_ctlp, port),
2906		    PORT_CONTROL_CLEAR_BITS_PORT_RESET);
2907
2908		/*
2909		 * Arm the interrupts for: Cmd completion, Cmd error,
2910		 * Port Ready, PM Change, PhyRdyChange, Commwake,
2911		 * UnrecFIS, Devxchanged, SDBNotify.
2912		 */
2913		ddi_put32(si_ctlp->sictl_port_acc_handle,
2914		    (uint32_t *)PORT_INTERRUPT_ENABLE_SET(si_ctlp, port),
2915		    (INTR_COMMAND_COMPLETE |
2916		    INTR_COMMAND_ERROR |
2917		    INTR_PORT_READY |
2918		    INTR_POWER_CHANGE |
2919		    INTR_PHYRDY_CHANGE |
2920		    INTR_COMWAKE_RECEIVED |
2921		    INTR_UNRECOG_FIS |
2922		    INTR_DEV_XCHANGED |
2923		    INTR_SETDEVBITS_NOTIFY));
2924
2925		/* Now enable the interrupts. */
2926		si_enable_port_interrupts(si_ctlp, port);
2927
2928		/*
2929		 * The following PHY initialization is redundant in
2930		 * in x86 since the BIOS anyway does this as part of
2931		 * device enumeration during the power up. But this
2932		 * is a required step in sparc since there is no BIOS.
2933		 *
2934		 * The way to initialize the PHY is to write a 1 and then
2935		 * a 0 to DET field of SControl register.
2936		 */
2937
2938		/*
2939		 * Fetch the current SControl before writing the
2940		 * DET part with 1
2941		 */
2942		SControl = ddi_get32(si_ctlp->sictl_port_acc_handle,
2943		    (uint32_t *)PORT_SCONTROL(si_ctlp, port));
2944		SCONTROL_SET_DET(SControl, SCONTROL_DET_COMRESET);
2945		ddi_put32(si_ctlp->sictl_port_acc_handle,
2946		    (uint32_t *)(PORT_SCONTROL(si_ctlp, port)),
2947		    SControl);
2948#ifndef __lock_lint
2949		delay(SI_10MS_TICKS); /* give time for COMRESET to percolate */
2950#endif /* __lock_lint */
2951
2952		/*
2953		 * Now fetch the SControl again and rewrite the
2954		 * DET part with 0
2955		 */
2956		SControl = ddi_get32(si_ctlp->sictl_port_acc_handle,
2957		    (uint32_t *)PORT_SCONTROL(si_ctlp, port));
2958		SCONTROL_SET_DET(SControl, SCONTROL_DET_NOACTION);
2959		ddi_put32(si_ctlp->sictl_port_acc_handle,
2960		    (uint32_t *)(PORT_SCONTROL(si_ctlp, port)),
2961		    SControl);
2962
2963		/*
2964		 * PHY may be initialized by now. Check the DET field of
2965		 * SStatus to determine if there is a device present.
2966		 *
2967		 * The DET field is valid only if IPM field indicates that
2968		 * the interface is in active state.
2969		 */
2970
2971		loop_count = 0;
2972		do {
2973			SStatus = ddi_get32(si_ctlp->sictl_port_acc_handle,
2974			    (uint32_t *)PORT_SSTATUS(si_ctlp, port));
2975
2976			if (SSTATUS_GET_IPM(SStatus) !=
2977			    SSTATUS_IPM_INTERFACE_ACTIVE) {
2978				/*
2979				 * If the interface is not active, the DET field
2980				 * is considered not accurate. So we want to
2981				 * continue looping.
2982				 */
2983				SSTATUS_SET_DET(SStatus,
2984				    SSTATUS_DET_NODEV_NOPHY);
2985			}
2986
2987			if (loop_count++ > SI_POLLRATE_SSTATUS) {
2988				/*
2989				 * We are effectively timing out after 0.1 sec.
2990				 */
2991				break;
2992			}
2993
2994			/* Wait for 10 millisec */
2995#ifndef __lock_lint
2996			delay(SI_10MS_TICKS);
2997#endif /* __lock_lint */
2998
2999		} while (SSTATUS_GET_DET(SStatus) !=
3000		    SSTATUS_DET_DEVPRESENT_PHYONLINE);
3001
3002		SIDBG2(SIDBG_POLL_LOOP|SIDBG_INIT, si_ctlp,
3003		    "si_initialize_controller: 1st loop count: %d, "
3004		    "SStatus: 0x%x",
3005		    loop_count,
3006		    SStatus);
3007
3008		if ((SSTATUS_GET_IPM(SStatus) !=
3009		    SSTATUS_IPM_INTERFACE_ACTIVE) ||
3010		    (SSTATUS_GET_DET(SStatus) !=
3011		    SSTATUS_DET_DEVPRESENT_PHYONLINE)) {
3012			/*
3013			 * Either the port is not active or there
3014			 * is no device present.
3015			 */
3016			si_ctlp->sictl_ports[port]->siport_port_type =
3017			    PORT_TYPE_NODEV;
3018			mutex_exit(&si_portp->siport_mutex);
3019			continue;
3020		}
3021
3022		/* Wait until Port Ready */
3023		loop_count = 0;
3024		do {
3025			port_status = ddi_get32(si_ctlp->sictl_port_acc_handle,
3026			    (uint32_t *)PORT_STATUS(si_ctlp, port));
3027
3028			if (loop_count++ > SI_POLLRATE_PORTREADY) {
3029				/*
3030				 * We are effectively timing out after 0.5 sec.
3031				 */
3032				break;
3033			}
3034
3035			/* Wait for 10 millisec */
3036#ifndef __lock_lint
3037			delay(SI_10MS_TICKS);
3038#endif /* __lock_lint */
3039
3040		} while (!(port_status & PORT_STATUS_BITS_PORT_READY));
3041
3042		SIDBG1(SIDBG_POLL_LOOP|SIDBG_INIT, si_ctlp,
3043		    "si_initialize_controller: 2nd loop count: %d",
3044		    loop_count);
3045
3046		if (si_ctlp->sictl_flags & SI_ATTACH) {
3047			/*
3048			 * We want to probe for dev signature only during attach
3049			 * case. Don't do it during suspend/resume sequence.
3050			 */
3051			if (port_status & PORT_STATUS_BITS_PORT_READY) {
3052				mutex_exit(&si_portp->siport_mutex);
3053				si_find_dev_signature(si_ctlp, si_portp, port,
3054				    PORTMULT_CONTROL_PORT);
3055				mutex_enter(&si_portp->siport_mutex);
3056			} else {
3057				si_ctlp->sictl_ports[port]->siport_port_type =
3058				    PORT_TYPE_NODEV;
3059			}
3060		}
3061
3062		if (si_check_ctl_handles(si_ctlp) != DDI_SUCCESS ||
3063		    si_check_port_handles(si_portp) != DDI_SUCCESS) {
3064			ddi_fm_service_impact(si_ctlp->sictl_devinfop,
3065			    DDI_SERVICE_LOST);
3066			mutex_exit(&si_portp->siport_mutex);
3067			mutex_exit(&si_ctlp->sictl_mutex);
3068			return (SI_FAILURE);
3069		}
3070
3071		mutex_exit(&si_portp->siport_mutex);
3072	}
3073
3074	mutex_exit(&si_ctlp->sictl_mutex);
3075	return (SI_SUCCESS);
3076}
3077
3078/*
3079 * Reverse of si_initialize_controller().
3080 *
3081 * WARNING, WARNING: The caller is expected to obtain the sictl_mutex
3082 * before calling us.
3083 */
3084static void
3085si_deinitialize_controller(si_ctl_state_t *si_ctlp)
3086{
3087	int port;
3088
3089	_NOTE(ASSUMING_PROTECTED(si_ctlp))
3090
3091	SIDBG0(SIDBG_INIT|SIDBG_ENTRY, si_ctlp,
3092	    "si3124: si_deinitialize_controller entered");
3093
3094	/* disable all the interrupts. */
3095	si_disable_all_interrupts(si_ctlp);
3096
3097	if (si_ctlp->sictl_flags & SI_DETACH) {
3098		/*
3099		 * We want to dealloc all the memory in detach case.
3100		 */
3101		for (port = 0; port < si_ctlp->sictl_num_ports; port++) {
3102			si_dealloc_port_state(si_ctlp, port);
3103		}
3104	}
3105
3106}
3107
3108/*
3109 * Prepare the port ready for usage.
3110 *
3111 * WARNING, WARNING: The caller is expected to obtain the siport_mutex
3112 * before calling us.
3113 */
3114static void
3115si_init_port(si_ctl_state_t *si_ctlp, int port)
3116{
3117
3118	SIDBG1(SIDBG_ENTRY|SIDBG_INIT, si_ctlp,
3119	    "si_init_port entered: port: 0x%x",
3120	    port);
3121
3122	/* Initialize the port. */
3123	ddi_put32(si_ctlp->sictl_port_acc_handle,
3124	    (uint32_t *)PORT_CONTROL_SET(si_ctlp, port),
3125	    PORT_CONTROL_SET_BITS_PORT_INITIALIZE);
3126
3127	/*
3128	 * Clear the InterruptNCOR (Interrupt No Clear on Read).
3129	 * This step ensures that a mere reading of slot_status will clear
3130	 * the interrupt; no explicit clearing of interrupt condition
3131	 * will be needed for successful completion of commands.
3132	 */
3133	ddi_put32(si_ctlp->sictl_port_acc_handle,
3134	    (uint32_t *)PORT_CONTROL_CLEAR(si_ctlp, port),
3135	    PORT_CONTROL_CLEAR_BITS_INTR_NCoR);
3136
3137	/* clear any pending interrupts at this point */
3138	ddi_put32(si_ctlp->sictl_port_acc_handle,
3139	    (uint32_t *)(PORT_INTERRUPT_STATUS(si_ctlp, port)),
3140	    INTR_MASK);
3141
3142}
3143
3144
3145/*
3146 * Enumerate the devices connected to the port multiplier.
3147 * Once a device is detected, we call si_find_dev_signature()
3148 * to find the type of device connected. Even though we are
3149 * called from within si_find_dev_signature(), there is no
3150 * recursion possible.
3151 */
3152static int
3153si_enumerate_port_multiplier(
3154	si_ctl_state_t *si_ctlp,
3155	si_port_state_t *si_portp,
3156	int port)
3157{
3158	uint32_t num_dev_ports = 0;
3159	int pmport;
3160	uint32_t SControl = 0;
3161	uint32_t SStatus = 0;
3162	uint32_t SError = 0;
3163	int loop_count = 0;
3164
3165	SIDBG1(SIDBG_ENTRY|SIDBG_INIT, si_ctlp,
3166	    "si_enumerate_port_multiplier entered: port: %d",
3167	    port);
3168
3169	mutex_enter(&si_portp->siport_mutex);
3170
3171	/* Enable Port Multiplier context switching. */
3172	ddi_put32(si_ctlp->sictl_port_acc_handle,
3173	    (uint32_t *)PORT_CONTROL_SET(si_ctlp, port),
3174	    PORT_CONTROL_SET_BITS_PM_ENABLE);
3175
3176	/*
3177	 * Read the num dev ports connected.
3178	 * GSCR[2] contains the number of device ports.
3179	 */
3180	if (si_read_portmult_reg(si_ctlp, si_portp, port, PORTMULT_CONTROL_PORT,
3181	    PSCR_REG2, &num_dev_ports)) {
3182		mutex_exit(&si_portp->siport_mutex);
3183		return (SI_FAILURE);
3184	}
3185	si_portp->siport_portmult_state.sipm_num_ports = num_dev_ports;
3186
3187	SIDBG1(SIDBG_INIT, si_ctlp,
3188	    "si_enumerate_port_multiplier: ports found: %d",
3189	    num_dev_ports);
3190
3191	for (pmport = 0; pmport < num_dev_ports-1; pmport++) {
3192		/*
3193		 * Enable PHY by writing a 1, then a 0 to SControl
3194		 * (i.e. PSCR[2]) DET field.
3195		 */
3196		if (si_read_portmult_reg(si_ctlp, si_portp, port, pmport,
3197		    PSCR_REG2, &SControl)) {
3198			continue;
3199		}
3200
3201		/* First write a 1 to DET field of SControl. */
3202		SCONTROL_SET_DET(SControl, SCONTROL_DET_COMRESET);
3203		if (si_write_portmult_reg(si_ctlp, si_portp, port, pmport,
3204		    PSCR_REG2, SControl)) {
3205			continue;
3206		}
3207#ifndef __lock_lint
3208		delay(SI_10MS_TICKS); /* give time for COMRESET to percolate */
3209#endif /* __lock_lint */
3210
3211		/* Then write a 0 to the DET field of SControl. */
3212		SCONTROL_SET_DET(SControl, SCONTROL_DET_NOACTION);
3213		if (si_write_portmult_reg(si_ctlp, si_portp, port, pmport,
3214		    PSCR_REG2, SControl)) {
3215			continue;
3216		}
3217
3218		/* Wait for PHYRDY by polling SStatus (i.e. PSCR[0]). */
3219		loop_count = 0;
3220		do {
3221			if (si_read_portmult_reg(si_ctlp, si_portp, port,
3222			    pmport, PSCR_REG0, &SStatus)) {
3223				break;
3224			}
3225			SIDBG1(SIDBG_POLL_LOOP, si_ctlp,
3226			    "looping for PHYRDY: SStatus: %x",
3227			    SStatus);
3228
3229			if (SSTATUS_GET_IPM(SStatus) !=
3230			    SSTATUS_IPM_INTERFACE_ACTIVE) {
3231				/*
3232				 * If the interface is not active, the DET field
3233				 * is considered not accurate. So we want to
3234				 * continue looping.
3235				 */
3236				SSTATUS_SET_DET(SStatus,
3237				    SSTATUS_DET_NODEV_NOPHY);
3238			}
3239
3240			if (loop_count++ > SI_POLLRATE_SSTATUS) {
3241				/*
3242				 * We are effectively timing out after 0.1 sec.
3243				 */
3244				break;
3245			}
3246
3247			/* Wait for 10 millisec */
3248#ifndef __lock_lint
3249			delay(SI_10MS_TICKS);
3250#endif /* __lock_lint */
3251
3252		} while (SSTATUS_GET_DET(SStatus) !=
3253		    SSTATUS_DET_DEVPRESENT_PHYONLINE);
3254
3255		SIDBG2(SIDBG_POLL_LOOP, si_ctlp,
3256		    "si_enumerate_port_multiplier: "
3257		    "loop count: %d, SStatus: 0x%x",
3258		    loop_count,
3259		    SStatus);
3260
3261		if ((SSTATUS_GET_IPM(SStatus) ==
3262		    SSTATUS_IPM_INTERFACE_ACTIVE) &&
3263		    (SSTATUS_GET_DET(SStatus) ==
3264		    SSTATUS_DET_DEVPRESENT_PHYONLINE)) {
3265			/* The interface is active and the device is present */
3266			SIDBG1(SIDBG_INIT, si_ctlp,
3267			    "Status: %x, device exists",
3268			    SStatus);
3269			/*
3270			 * Clear error bits in SError register (i.e. PSCR[1]
3271			 * by writing back error bits.
3272			 */
3273			if (si_read_portmult_reg(si_ctlp, si_portp, port,
3274			    pmport, PSCR_REG1, &SError)) {
3275				continue;
3276			}
3277			SIDBG1(SIDBG_INIT, si_ctlp,
3278			    "SError bits are: %x", SError);
3279			if (si_write_portmult_reg(si_ctlp, si_portp, port,
3280			    pmport, PSCR_REG1, SError)) {
3281				continue;
3282			}
3283
3284			/* There exists a device. */
3285			mutex_exit(&si_portp->siport_mutex);
3286			si_find_dev_signature(si_ctlp, si_portp, port, pmport);
3287			mutex_enter(&si_portp->siport_mutex);
3288		}
3289	}
3290
3291	mutex_exit(&si_portp->siport_mutex);
3292
3293	return (SI_SUCCESS);
3294}
3295
3296
3297/*
3298 * Read a port multiplier register.
3299 *
3300 * WARNING, WARNING: The caller is expected to obtain the siport_mutex
3301 * before calling us.
3302 */
3303static int
3304si_read_portmult_reg(
3305	si_ctl_state_t *si_ctlp,
3306	si_port_state_t *si_portp,
3307	int port,
3308	int pmport,
3309	int regnum,
3310	uint32_t *regval)
3311{
3312	int slot;
3313	si_prb_t *prb;
3314	uint32_t *prb_word_ptr;
3315	int i;
3316	uint32_t slot_status;
3317	int loop_count = 0;
3318
3319	_NOTE(ASSUMING_PROTECTED(si_portp))
3320
3321	SIDBG3(SIDBG_ENTRY, si_ctlp, "si_read_portmult_reg: port: %x,"
3322	    "pmport: %x, regnum: %x",
3323	    port, pmport, regnum);
3324
3325	slot = si_claim_free_slot(si_ctlp, si_portp, port);
3326	if (slot == SI_FAILURE) {
3327		return (SI_FAILURE);
3328	}
3329
3330	prb =  &(si_portp->siport_prbpool[slot]);
3331	bzero((void *)prb, sizeof (si_prb_t));
3332
3333	/* Now fill the prb. */
3334	SET_FIS_TYPE(prb->prb_fis, REGISTER_FIS_H2D);
3335	SET_FIS_PMP(prb->prb_fis, PORTMULT_CONTROL_PORT);
3336	SET_FIS_CDMDEVCTL(prb->prb_fis, 1);
3337	SET_FIS_COMMAND(prb->prb_fis, SATAC_READ_PM_REG);
3338
3339	SET_FIS_DEV_HEAD(prb->prb_fis, pmport);
3340	SET_FIS_FEATURES(prb->prb_fis, regnum);
3341
3342	/* no real data transfer is involved. */
3343	SET_SGE_TRM(prb->prb_sge0);
3344
3345#if SI_DEBUG
3346	if (si_debug_flags & SIDBG_DUMP_PRB) {
3347		int *ptr;
3348		int j;
3349
3350		ptr = (int *)(void *)prb;
3351		cmn_err(CE_WARN, "read_port_mult_reg, prb: ");
3352		for (j = 0; j < (sizeof (si_prb_t)/4); j++) {
3353			cmn_err(CE_WARN, "%x ", ptr[j]);
3354		}
3355
3356	}
3357#endif /* SI_DEBUG */
3358
3359	/* Deliver PRB */
3360	POST_PRB_ADDR(si_ctlp, si_portp, port, slot);
3361
3362	/* Loop till the command is finished. */
3363	do {
3364		slot_status = ddi_get32(si_ctlp->sictl_port_acc_handle,
3365		    (uint32_t *)(PORT_SLOT_STATUS(si_ctlp, port)));
3366
3367		SIDBG1(SIDBG_POLL_LOOP, si_ctlp,
3368		    "looping read_pm slot_status: 0x%x",
3369		    slot_status);
3370
3371		if (loop_count++ > SI_POLLRATE_SLOTSTATUS) {
3372			/* We are effectively timing out after 0.5 sec. */
3373			break;
3374		}
3375
3376		/* Wait for 10 millisec */
3377#ifndef __lock_lint
3378		delay(SI_10MS_TICKS);
3379#endif /* __lock_lint */
3380
3381	} while (slot_status & SI_SLOT_MASK & (0x1 << slot));
3382
3383	SIDBG1(SIDBG_POLL_LOOP, si_ctlp,
3384	    "read_portmult_reg: loop count: %d",
3385	    loop_count);
3386
3387	CLEAR_BIT(si_portp->siport_pending_tags, slot);
3388
3389	/* Now inspect the port LRAM for the modified FIS. */
3390	prb_word_ptr = (uint32_t *)(void *)prb;
3391	for (i = 0; i < (sizeof (si_prb_t)/4); i++) {
3392		prb_word_ptr[i] = ddi_get32(si_ctlp->sictl_port_acc_handle,
3393		    (uint32_t *)(PORT_LRAM(si_ctlp, port, slot)+i*4));
3394	}
3395
3396	if (si_check_ctl_handles(si_ctlp) != DDI_SUCCESS ||
3397	    si_check_port_handles(si_portp) != DDI_SUCCESS) {
3398		ddi_fm_service_impact(si_ctlp->sictl_devinfop,
3399		    DDI_SERVICE_UNAFFECTED);
3400		return (SI_FAILURE);
3401	}
3402
3403	if (((GET_FIS_COMMAND(prb->prb_fis) & 0x1) != 0) ||
3404	    (GET_FIS_FEATURES(prb->prb_fis) != 0)) {
3405		/* command failed. */
3406		return (SI_FAILURE);
3407	}
3408
3409	/* command succeeded. */
3410	*regval = (GET_FIS_SECTOR_COUNT(prb->prb_fis) & 0xff) |
3411	    ((GET_FIS_SECTOR(prb->prb_fis) << 8)  & 0xff00) |
3412	    ((GET_FIS_CYL_LOW(prb->prb_fis) << 16)  & 0xff0000) |
3413	    ((GET_FIS_CYL_HI(prb->prb_fis) << 24)  & 0xff000000);
3414
3415	return (SI_SUCCESS);
3416}
3417
3418/*
3419 * Write a port multiplier register.
3420 *
3421 * WARNING, WARNING: The caller is expected to obtain the siport_mutex
3422 * before calling us.
3423 */
3424static int
3425si_write_portmult_reg(
3426	si_ctl_state_t *si_ctlp,
3427	si_port_state_t *si_portp,
3428	int port,
3429	int pmport,
3430	int regnum,
3431	uint32_t regval)
3432{
3433	int slot;
3434	si_prb_t *prb;
3435	uint32_t *prb_word_ptr;
3436	uint32_t slot_status;
3437	int i;
3438	int loop_count = 0;
3439
3440	_NOTE(ASSUMING_PROTECTED(si_portp))
3441
3442	SIDBG4(SIDBG_ENTRY, si_ctlp,
3443	    "si_write_portmult_reg: port: %x, pmport: %x,"
3444	    "regnum: %x, regval: %x",
3445	    port, pmport, regnum, regval);
3446
3447	slot = si_claim_free_slot(si_ctlp, si_portp, port);
3448	if (slot == SI_FAILURE) {
3449		return (SI_FAILURE);
3450	}
3451
3452	prb =  &(si_portp->siport_prbpool[slot]);
3453	bzero((void *)prb, sizeof (si_prb_t));
3454
3455	/* Now fill the prb. */
3456	SET_FIS_TYPE(prb->prb_fis, REGISTER_FIS_H2D);
3457	SET_FIS_PMP(prb->prb_fis, PORTMULT_CONTROL_PORT);
3458	SET_FIS_CDMDEVCTL(prb->prb_fis, 1);
3459
3460	SET_FIS_COMMAND(prb->prb_fis, SATAC_WRITE_PM_REG);
3461	SET_FIS_DEV_HEAD(prb->prb_fis, pmport);
3462	SET_FIS_FEATURES(prb->prb_fis, regnum);
3463
3464	SET_FIS_SECTOR_COUNT(prb->prb_fis, regval & 0xff);
3465	SET_FIS_SECTOR(prb->prb_fis, (regval >> 8) & 0xff);
3466	SET_FIS_CYL_LOW(prb->prb_fis, (regval >> 16) & 0xff);
3467	SET_FIS_CYL_HI(prb->prb_fis, (regval >> 24)  & 0xff);
3468
3469	/* no real data transfer is involved. */
3470	SET_SGE_TRM(prb->prb_sge0);
3471
3472#if SI_DEBUG
3473	if (si_debug_flags & SIDBG_DUMP_PRB) {
3474		int *ptr;
3475		int j;
3476
3477		ptr = (int *)(void *)prb;
3478		cmn_err(CE_WARN, "read_port_mult_reg, prb: ");
3479		for (j = 0; j < (sizeof (si_prb_t)/4); j++) {
3480			cmn_err(CE_WARN, "%x ", ptr[j]);
3481		}
3482
3483	}
3484#endif /* SI_DEBUG */
3485
3486	/* Deliver PRB */
3487	POST_PRB_ADDR(si_ctlp, si_portp, port, slot);
3488
3489	/* Loop till the command is finished. */
3490	do {
3491		slot_status = ddi_get32(si_ctlp->sictl_port_acc_handle,
3492		    (uint32_t *)(PORT_SLOT_STATUS(si_ctlp, port)));
3493
3494		SIDBG1(SIDBG_POLL_LOOP, si_ctlp,
3495		    "looping write_pmp slot_status: 0x%x",
3496		    slot_status);
3497
3498		if (loop_count++ > SI_POLLRATE_SLOTSTATUS) {
3499			/* We are effectively timing out after 0.5 sec. */
3500			break;
3501		}
3502
3503		/* Wait for 10 millisec */
3504#ifndef __lock_lint
3505		delay(SI_10MS_TICKS);
3506#endif /* __lock_lint */
3507
3508	} while (slot_status & SI_SLOT_MASK & (0x1 << slot));
3509
3510	SIDBG1(SIDBG_POLL_LOOP, si_ctlp,
3511	    "write_portmult_reg: loop count: %d",
3512	    loop_count);
3513
3514	CLEAR_BIT(si_portp->siport_pending_tags, slot);
3515
3516	/* Now inspect the port LRAM for the modified FIS. */
3517	prb_word_ptr = (uint32_t *)(void *)prb;
3518	for (i = 0; i < (sizeof (si_prb_t)/4); i++) {
3519		prb_word_ptr[i] = ddi_get32(si_ctlp->sictl_port_acc_handle,
3520		    (uint32_t *)(PORT_LRAM(si_ctlp, port, slot)+i*4));
3521	}
3522
3523	if (si_check_ctl_handles(si_ctlp) != DDI_SUCCESS ||
3524	    si_check_port_handles(si_portp) != DDI_SUCCESS) {
3525		ddi_fm_service_impact(si_ctlp->sictl_devinfop,
3526		    DDI_SERVICE_UNAFFECTED);
3527		return (SI_FAILURE);
3528	}
3529
3530	if (((GET_FIS_COMMAND(prb->prb_fis) & 0x1) != 0) ||
3531	    (GET_FIS_FEATURES(prb->prb_fis) != 0)) {
3532		/* command failed */
3533		return (SI_FAILURE);
3534	}
3535
3536	/* command succeeded */
3537	return (SI_SUCCESS);
3538}
3539
3540
3541/*
3542 * Set the auto sense data for ATAPI devices.
3543 *
3544 * Note: Currently the sense data is simulated; this code will be enhanced
3545 * in second phase to fetch the real sense data from the atapi device.
3546 */
3547static void
3548si_set_sense_data(sata_pkt_t *satapkt, int reason)
3549{
3550	struct scsi_extended_sense *sense;
3551
3552	sense = (struct scsi_extended_sense *)
3553	    satapkt->satapkt_cmd.satacmd_rqsense;
3554	bzero(sense, sizeof (struct scsi_extended_sense));
3555	sense->es_valid = 1;		/* Valid sense */
3556	sense->es_class = 7;		/* Response code 0x70 - current err */
3557	sense->es_key = 0;
3558	sense->es_info_1 = 0;
3559	sense->es_info_2 = 0;
3560	sense->es_info_3 = 0;
3561	sense->es_info_4 = 0;
3562	sense->es_add_len = 6;		/* Additional length */
3563	sense->es_cmd_info[0] = 0;
3564	sense->es_cmd_info[1] = 0;
3565	sense->es_cmd_info[2] = 0;
3566	sense->es_cmd_info[3] = 0;
3567	sense->es_add_code = 0;
3568	sense->es_qual_code = 0;
3569
3570	if ((reason == SATA_PKT_DEV_ERROR) || (reason == SATA_PKT_TIMEOUT)) {
3571		sense->es_key = KEY_HARDWARE_ERROR;
3572	}
3573}
3574
3575
3576/*
3577 * Interrupt service handler. We loop through each of the ports to find
3578 * if the interrupt belongs to any of them.
3579 *
3580 * Bulk of the interrupt handling is actually done out of subroutines
3581 * like si_intr_command_complete() etc.
3582 */
3583/*ARGSUSED*/
3584static uint_t
3585si_intr(caddr_t arg1, caddr_t arg2)
3586{
3587	si_ctl_state_t *si_ctlp = (si_ctl_state_t *)(void *)arg1;
3588	si_port_state_t *si_portp;
3589	uint32_t global_intr_status;
3590	uint32_t mask, port_intr_status;
3591	int port;
3592
3593	global_intr_status = ddi_get32(si_ctlp->sictl_global_acc_handle,
3594	    (uint32_t *)GLOBAL_INTERRUPT_STATUS(si_ctlp));
3595
3596	SIDBG1(SIDBG_INTR|SIDBG_ENTRY, si_ctlp,
3597	    "si_intr: global_int_status: 0x%x",
3598	    global_intr_status);
3599
3600	if (si_check_acc_handle(si_ctlp->sictl_global_acc_handle) !=
3601	    DDI_SUCCESS) {
3602		ddi_fm_service_impact(si_ctlp->sictl_devinfop,
3603		    DDI_SERVICE_UNAFFECTED);
3604		return (DDI_INTR_UNCLAIMED);
3605	}
3606
3607	if (!(global_intr_status & SI31xx_INTR_PORT_MASK)) {
3608		/* Sorry, the interrupt is not ours. */
3609		return (DDI_INTR_UNCLAIMED);
3610	}
3611
3612	/* Loop for all the ports. */
3613	for (port = 0; port < si_ctlp->sictl_num_ports; port++) {
3614
3615		mask = 0x1 << port;
3616		if (!(global_intr_status & mask)) {
3617			continue;
3618		}
3619
3620		mutex_enter(&si_ctlp->sictl_mutex);
3621		si_portp = si_ctlp->sictl_ports[port];
3622		mutex_exit(&si_ctlp->sictl_mutex);
3623
3624		port_intr_status = ddi_get32(si_ctlp->sictl_global_acc_handle,
3625		    (uint32_t *)PORT_INTERRUPT_STATUS(si_ctlp, port));
3626
3627		SIDBG2(SIDBG_VERBOSE, si_ctlp,
3628		    "s_intr: port_intr_status: 0x%x, port: %x",
3629		    port_intr_status,
3630		    port);
3631
3632		if (port_intr_status & INTR_COMMAND_COMPLETE) {
3633			(void) si_intr_command_complete(si_ctlp, si_portp,
3634			    port);
3635
3636			mutex_enter(&si_portp->siport_mutex);
3637			if (si_check_ctl_handles(si_ctlp) != DDI_SUCCESS ||
3638			    si_check_port_handles(si_portp) != DDI_SUCCESS) {
3639				mutex_exit(&si_portp->siport_mutex);
3640				ddi_fm_service_impact(si_ctlp->sictl_devinfop,
3641				    DDI_SERVICE_UNAFFECTED);
3642				(void) si_initialize_port_wait_till_ready(
3643				    si_ctlp, port);
3644			} else {
3645				mutex_exit(&si_portp->siport_mutex);
3646			}
3647		} else {
3648			/* Clear the interrupts */
3649			ddi_put32(si_ctlp->sictl_port_acc_handle,
3650			    (uint32_t *)(PORT_INTERRUPT_STATUS(si_ctlp, port)),
3651			    port_intr_status & INTR_MASK);
3652		}
3653
3654		/*
3655		 * Note that we did not clear the interrupt for command
3656		 * completion interrupt. Reading of slot_status takes care
3657		 * of clearing the interrupt for command completion case.
3658		 */
3659
3660		if (port_intr_status & INTR_COMMAND_ERROR) {
3661			(void) si_intr_command_error(si_ctlp, si_portp, port);
3662		}
3663
3664		if (port_intr_status & INTR_PORT_READY) {
3665			(void) si_intr_port_ready(si_ctlp, si_portp, port);
3666		}
3667
3668		if (port_intr_status & INTR_POWER_CHANGE) {
3669			(void) si_intr_pwr_change(si_ctlp, si_portp, port);
3670		}
3671
3672		if (port_intr_status & INTR_PHYRDY_CHANGE) {
3673			(void) si_intr_phy_ready_change(si_ctlp, si_portp,
3674			    port);
3675		}
3676
3677		if (port_intr_status & INTR_COMWAKE_RECEIVED) {
3678			(void) si_intr_comwake_rcvd(si_ctlp, si_portp,
3679			    port);
3680		}
3681
3682		if (port_intr_status & INTR_UNRECOG_FIS) {
3683			(void) si_intr_unrecognised_fis(si_ctlp, si_portp,
3684			    port);
3685		}
3686
3687		if (port_intr_status & INTR_DEV_XCHANGED) {
3688			(void) si_intr_dev_xchanged(si_ctlp, si_portp, port);
3689		}
3690
3691		if (port_intr_status & INTR_8B10B_DECODE_ERROR) {
3692			(void) si_intr_decode_err_threshold(si_ctlp, si_portp,
3693			    port);
3694		}
3695
3696		if (port_intr_status & INTR_CRC_ERROR) {
3697			(void) si_intr_crc_err_threshold(si_ctlp, si_portp,
3698			    port);
3699		}
3700
3701		if (port_intr_status & INTR_HANDSHAKE_ERROR) {
3702			(void) si_intr_handshake_err_threshold(si_ctlp,
3703			    si_portp, port);
3704		}
3705
3706		if (port_intr_status & INTR_SETDEVBITS_NOTIFY) {
3707			(void) si_intr_set_devbits_notify(si_ctlp, si_portp,
3708			    port);
3709		}
3710	}
3711
3712	return (DDI_INTR_CLAIMED);
3713}
3714
3715/*
3716 * Interrupt which indicates that one or more commands have successfully
3717 * completed.
3718 *
3719 * Since we disabled W1C (write-one-to-clear) previously, mere reading
3720 * of slot_status register clears the interrupt. There is no need to
3721 * explicitly clear the interrupt.
3722 */
3723static int
3724si_intr_command_complete(
3725	si_ctl_state_t *si_ctlp,
3726	si_port_state_t *si_portp,
3727	int port)
3728{
3729
3730	uint32_t slot_status;
3731	uint32_t finished_tags;
3732	int finished_slot;
3733	sata_pkt_t *satapkt;
3734
3735	SIDBG0(SIDBG_ENTRY|SIDBG_INTR, si_ctlp,
3736	    "si_intr_command_complete enter");
3737
3738	mutex_enter(&si_portp->siport_mutex);
3739
3740	slot_status = ddi_get32(si_ctlp->sictl_port_acc_handle,
3741	    (uint32_t *)(PORT_SLOT_STATUS(si_ctlp, port)));
3742
3743	if (!si_portp->siport_pending_tags) {
3744		/*
3745		 * Spurious interrupt. Nothing to be done.
3746		 * The interrupt was cleared when slot_status was read.
3747		 */
3748		mutex_exit(&si_portp->siport_mutex);
3749		return (SI_SUCCESS);
3750	}
3751
3752	SIDBG2(SIDBG_VERBOSE, si_ctlp, "si3124: si_intr_command_complete: "
3753	    "pending_tags: %x, slot_status: %x",
3754	    si_portp->siport_pending_tags,
3755	    slot_status);
3756
3757	finished_tags =  si_portp->siport_pending_tags &
3758	    ~slot_status & SI_SLOT_MASK;
3759	while (finished_tags) {
3760
3761		finished_slot = ddi_ffs(finished_tags) - 1;
3762		if (finished_slot == -1) {
3763			break;
3764		}
3765
3766		satapkt = si_portp->siport_slot_pkts[finished_slot];
3767
3768		if (satapkt->satapkt_cmd.satacmd_flags.sata_special_regs) {
3769			si_copy_out_regs(&satapkt->satapkt_cmd, si_ctlp, port,
3770			    finished_slot);
3771		}
3772
3773		CLEAR_BIT(si_portp->siport_pending_tags, finished_slot);
3774		CLEAR_BIT(finished_tags, finished_slot);
3775		SENDUP_PACKET(si_portp, satapkt, SATA_PKT_COMPLETED);
3776	}
3777
3778	SIDBG2(SIDBG_PKTCOMP, si_ctlp,
3779	    "command_complete done: pend_tags: 0x%x, slot_status: 0x%x",
3780	    si_portp->siport_pending_tags,
3781	    slot_status);
3782
3783	/*
3784	 * tidbit: no need to clear the interrupt since reading of
3785	 * slot_status automatically clears the interrupt in the case
3786	 * of a successful command completion.
3787	 */
3788
3789	mutex_exit(&si_portp->siport_mutex);
3790
3791	return (SI_SUCCESS);
3792}
3793
3794/*
3795 * Interrupt which indicates that a command did not complete successfully.
3796 *
3797 * The port halts whenever a command error interrupt is received.
3798 * The only way to restart it is to reset or reinitialize the port
3799 * but such an operation throws away all the pending commands on
3800 * the port.
3801 *
3802 * We reset the device and mop the commands on the port.
3803 */
3804static int
3805si_intr_command_error(
3806	si_ctl_state_t *si_ctlp,
3807	si_port_state_t *si_portp,
3808	int port)
3809{
3810	uint32_t command_error, slot_status;
3811	uint32_t failed_tags;
3812
3813	command_error = ddi_get32(si_ctlp->sictl_port_acc_handle,
3814	    (uint32_t *)(PORT_COMMAND_ERROR(si_ctlp, port)));
3815
3816	SIDBG1(SIDBG_INTR|SIDBG_ENTRY, si_ctlp,
3817	    "si_intr_command_error: command_error: 0x%x",
3818	    command_error);
3819
3820	mutex_enter(&si_portp->siport_mutex);
3821
3822	/*
3823	 * Remember the slot_status since any of the recovery handler
3824	 * can blow it away with reset operation.
3825	 */
3826	slot_status = ddi_get32(si_ctlp->sictl_port_acc_handle,
3827	    (uint32_t *)(PORT_SLOT_STATUS(si_ctlp, port)));
3828
3829	si_log_error_message(si_ctlp, port, command_error);
3830
3831	switch (command_error) {
3832
3833	case CMD_ERR_DEVICEERRROR:
3834		si_error_recovery_DEVICEERROR(si_ctlp, si_portp, port);
3835		break;
3836
3837	case CMD_ERR_SDBERROR:
3838		si_fm_ereport(si_ctlp, DDI_FM_DEVICE_INTERN_CORR, "SBD error");
3839		si_error_recovery_SDBERROR(si_ctlp, si_portp, port);
3840		ddi_fm_service_impact(si_ctlp->sictl_devinfop,
3841		    DDI_SERVICE_UNAFFECTED);
3842		break;
3843
3844	case CMD_ERR_DATAFISERROR:
3845		si_fm_ereport(si_ctlp, DDI_FM_DEVICE_INTERN_CORR,
3846		    "Data FIS error");
3847		si_error_recovery_DATAFISERROR(si_ctlp, si_portp, port);
3848		ddi_fm_service_impact(si_ctlp->sictl_devinfop,
3849		    DDI_SERVICE_UNAFFECTED);
3850		break;
3851
3852	case CMD_ERR_SENDFISERROR:
3853		si_fm_ereport(si_ctlp, DDI_FM_DEVICE_INTERN_CORR,
3854		    "Send FIS error");
3855		si_error_recovery_SENDFISERROR(si_ctlp, si_portp, port);
3856		ddi_fm_service_impact(si_ctlp->sictl_devinfop,
3857		    DDI_SERVICE_UNAFFECTED);
3858		break;
3859
3860	default:
3861		si_fm_ereport(si_ctlp, DDI_FM_DEVICE_INTERN_CORR,
3862		    "Unknown error");
3863		si_error_recovery_default(si_ctlp, si_portp, port);
3864		ddi_fm_service_impact(si_ctlp->sictl_devinfop,
3865		    DDI_SERVICE_UNAFFECTED);
3866		break;
3867
3868	}
3869
3870	/*
3871	 * Compute the failed_tags by adding up the error tags.
3872	 *
3873	 * The siport_err_tags_SDBERROR and siport_err_tags_nonSDBERROR
3874	 * were filled in by the si_error_recovery_* routines.
3875	 */
3876	failed_tags = si_portp->siport_pending_tags &
3877	    (si_portp->siport_err_tags_SDBERROR |
3878	    si_portp->siport_err_tags_nonSDBERROR);
3879
3880	SIDBG3(SIDBG_ERRS|SIDBG_INTR, si_ctlp, "si_intr_command_error: "
3881	    "err_tags_SDBERROR: 0x%x, "
3882	    "err_tags_nonSDBERRROR: 0x%x, "
3883	    "failed_tags: 0x%x",
3884	    si_portp->siport_err_tags_SDBERROR,
3885	    si_portp->siport_err_tags_nonSDBERROR,
3886	    failed_tags);
3887
3888	SIDBG2(SIDBG_ERRS|SIDBG_INTR, si_ctlp, "si3124: si_intr_command_error: "
3889	    "slot_status:0x%x, pending_tags: 0x%x",
3890	    slot_status,
3891	    si_portp->siport_pending_tags);
3892
3893	si_portp->mopping_in_progress++;
3894
3895	si_mop_commands(si_ctlp,
3896	    si_portp,
3897	    port,
3898	    slot_status,
3899	    failed_tags,
3900	    0, 	/* timedout_tags */
3901	    0, 	/* aborting_tags */
3902	    0); 	/* reset_tags */
3903
3904	ASSERT(si_portp->siport_pending_tags == 0);
3905
3906	si_portp->siport_err_tags_SDBERROR = 0;
3907	si_portp->siport_err_tags_nonSDBERROR = 0;
3908
3909	mutex_exit(&si_portp->siport_mutex);
3910
3911	return (SI_SUCCESS);
3912}
3913
3914/*
3915 * There is a subtle difference between errors on a normal port and
3916 * a port-mult port. When an error happens on a normal port, the port
3917 * is halted effectively until the port is reset or initialized.
3918 * However, in port-mult port errors, port does not get halted since
3919 * other non-error devices behind the port multiplier can still
3920 * continue to operate. So we wait till all the commands are drained
3921 * instead of resetting it right away.
3922 *
3923 * WARNING, WARNING: The caller is expected to obtain the siport_mutex
3924 * before calling us.
3925 */
3926static void
3927si_recover_portmult_errors(
3928	si_ctl_state_t *si_ctlp,
3929	si_port_state_t *si_portp,
3930	int port)
3931{
3932	uint32_t command_error, slot_status, port_status;
3933	int failed_slot;
3934	int loop_count = 0;
3935
3936	_NOTE(ASSUMING_PROTECTED(si_portp))
3937
3938	SIDBG1(SIDBG_ERRS|SIDBG_ENTRY, si_ctlp,
3939	    "si_recover_portmult_errors: port: 0x%x",
3940	    port);
3941
3942	/* Resume the port */
3943	ddi_put32(si_ctlp->sictl_port_acc_handle,
3944	    (uint32_t *)PORT_CONTROL_SET(si_ctlp, port),
3945	    PORT_CONTROL_SET_BITS_RESUME);
3946
3947	port_status = ddi_get32(si_ctlp->sictl_port_acc_handle,
3948	    (uint32_t *)PORT_STATUS(si_ctlp, port));
3949
3950	failed_slot = (port_status >> 16) & SI_NUM_SLOTS;
3951	command_error = ddi_get32(si_ctlp->sictl_port_acc_handle,
3952	    (uint32_t *)(PORT_COMMAND_ERROR(si_ctlp, port)));
3953
3954	if (command_error ==  CMD_ERR_SDBERROR) {
3955		si_portp->siport_err_tags_SDBERROR |= (0x1 << failed_slot);
3956	} else {
3957		si_portp->siport_err_tags_nonSDBERROR |= (0x1 << failed_slot);
3958	}
3959
3960	/* Now we drain the pending commands. */
3961	do {
3962		slot_status = ddi_get32(si_ctlp->sictl_port_acc_handle,
3963		    (uint32_t *)(PORT_SLOT_STATUS(si_ctlp, port)));
3964
3965		/*
3966		 * Since we have not yet returned DDI_INTR_CLAIMED,
3967		 * our interrupt handler is guaranteed not to be called again.
3968		 * So we need to check IS_ATTENTION_RAISED() for further
3969		 * decisions.
3970		 *
3971		 * This is a too big a delay for an interrupt context.
3972		 * But this is supposed to be a rare condition.
3973		 */
3974
3975		if (IS_ATTENTION_RAISED(slot_status)) {
3976			/* Resume again */
3977			ddi_put32(si_ctlp->sictl_port_acc_handle,
3978			    (uint32_t *)PORT_CONTROL_SET(si_ctlp, port),
3979			    PORT_CONTROL_SET_BITS_RESUME);
3980
3981			port_status = ddi_get32(si_ctlp->sictl_port_acc_handle,
3982			    (uint32_t *)PORT_STATUS(si_ctlp, port));
3983			failed_slot = (port_status >> 16) & SI_NUM_SLOTS;
3984			command_error = ddi_get32(
3985			    si_ctlp->sictl_port_acc_handle,
3986			    (uint32_t *)(PORT_COMMAND_ERROR(si_ctlp,
3987			    port)));
3988			if (command_error ==  CMD_ERR_SDBERROR) {
3989				si_portp->siport_err_tags_SDBERROR |=
3990				    (0x1 << failed_slot);
3991			} else {
3992				si_portp->siport_err_tags_nonSDBERROR |=
3993				    (0x1 << failed_slot);
3994			}
3995		}
3996
3997		if (loop_count++ > SI_POLLRATE_RECOVERPORTMULT) {
3998			/* We are effectively timing out after 10 sec. */
3999			break;
4000		}
4001
4002		/* Wait for 10 millisec */
4003#ifndef __lock_lint
4004		delay(SI_10MS_TICKS);
4005#endif /* __lock_lint */
4006
4007	} while (slot_status & SI_SLOT_MASK);
4008
4009	/*
4010	 * The above loop can be improved for 3132 since we could obtain the
4011	 * Port Multiplier Context of the device in error. Then we could
4012	 * do a better job in filtering out commands for the device in error.
4013	 * The loop could finish much earlier with such a logic.
4014	 */
4015
4016	/* Clear the RESUME bit. */
4017	ddi_put32(si_ctlp->sictl_port_acc_handle,
4018	    (uint32_t *)PORT_CONTROL_CLEAR(si_ctlp, port),
4019	    PORT_CONTROL_CLEAR_BITS_RESUME);
4020
4021}
4022
4023/*
4024 * If we are connected to port multiplier, drain the non-failed devices.
4025 * Otherwise, we initialize the port (which effectively fails all the
4026 * pending commands in the hope that sd would retry them later).
4027 *
4028 * WARNING, WARNING: The caller is expected to obtain the siport_mutex
4029 * before calling us.
4030 */
4031static void
4032si_error_recovery_DEVICEERROR(
4033	si_ctl_state_t *si_ctlp,
4034	si_port_state_t *si_portp,
4035	int port)
4036{
4037	uint32_t port_status;
4038	int failed_slot;
4039
4040	_NOTE(ASSUMING_PROTECTED(si_portp))
4041
4042	SIDBG1(SIDBG_ERRS|SIDBG_ENTRY, si_ctlp,
4043	    "si_error_recovery_DEVICEERROR: port: 0x%x",
4044	    port);
4045
4046	if (si_portp->siport_port_type == PORT_TYPE_MULTIPLIER) {
4047		si_recover_portmult_errors(si_ctlp, si_portp, port);
4048	} else {
4049		port_status = ddi_get32(si_ctlp->sictl_port_acc_handle,
4050		    (uint32_t *)PORT_STATUS(si_ctlp, port));
4051		failed_slot = (port_status >> 16) & SI_NUM_SLOTS;
4052		si_portp->siport_err_tags_nonSDBERROR |= (0x1 << failed_slot);
4053	}
4054
4055	/* In either case (port-mult or not), we reinitialize the port. */
4056	(void) si_initialize_port_wait_till_ready(si_ctlp, port);
4057}
4058
4059/*
4060 * Handle exactly like DEVICEERROR. Remember the tags with SDBERROR
4061 * to perform read_log_ext on them later. SDBERROR means that the
4062 * error was for an NCQ command.
4063 *
4064 * WARNING, WARNING: The caller is expected to obtain the siport_mutex
4065 * before calling us.
4066 */
4067static void
4068si_error_recovery_SDBERROR(
4069	si_ctl_state_t *si_ctlp,
4070	si_port_state_t *si_portp,
4071	int port)
4072{
4073	uint32_t port_status;
4074	int failed_slot;
4075
4076	_NOTE(ASSUMING_PROTECTED(si_portp))
4077
4078	SIDBG1(SIDBG_ERRS|SIDBG_ENTRY, si_ctlp,
4079	    "si3124: si_error_recovery_SDBERROR: port: 0x%x",
4080	    port);
4081
4082	if (si_portp->siport_port_type == PORT_TYPE_MULTIPLIER) {
4083		si_recover_portmult_errors(si_ctlp, si_portp, port);
4084	} else {
4085		port_status = ddi_get32(si_ctlp->sictl_port_acc_handle,
4086		    (uint32_t *)PORT_STATUS(si_ctlp, port));
4087		failed_slot = (port_status >> 16) & SI_NUM_SLOTS;
4088		si_portp->siport_err_tags_SDBERROR |= (0x1 << failed_slot);
4089	}
4090
4091	/* In either case (port-mult or not), we reinitialize the port. */
4092	(void) si_initialize_port_wait_till_ready(si_ctlp, port);
4093}
4094
4095/*
4096 * Handle exactly like DEVICEERROR except resetting the port if there was
4097 * an NCQ command on the port.
4098 *
4099 * WARNING, WARNING: The caller is expected to obtain the siport_mutex
4100 * before calling us.
4101 */
4102static void
4103si_error_recovery_DATAFISERROR(
4104	si_ctl_state_t *si_ctlp,
4105	si_port_state_t *si_portp,
4106	int port)
4107{
4108	uint32_t port_status;
4109	int failed_slot;
4110
4111	_NOTE(ASSUMING_PROTECTED(si_portp))
4112
4113	SIDBG1(SIDBG_ERRS|SIDBG_ENTRY, si_ctlp,
4114	    "si3124: si_error_recovery_DATAFISERROR: port: 0x%x",
4115	    port);
4116
4117	/* reset device if we were waiting for any ncq commands. */
4118	if (si_portp->siport_pending_ncq_count) {
4119		port_status = ddi_get32(si_ctlp->sictl_port_acc_handle,
4120		    (uint32_t *)PORT_STATUS(si_ctlp, port));
4121		failed_slot = (port_status >> 16) & SI_NUM_SLOTS;
4122		si_portp->siport_err_tags_nonSDBERROR |= (0x1 << failed_slot);
4123		(void) si_reset_dport_wait_till_ready(si_ctlp, si_portp, port,
4124		    SI_DEVICE_RESET);
4125		return;
4126	}
4127
4128	/*
4129	 * If we don't have any ncq commands pending, the rest of
4130	 * the process is similar to the one for DEVICEERROR.
4131	 */
4132	si_error_recovery_DEVICEERROR(si_ctlp, si_portp, port);
4133}
4134
4135/*
4136 * We handle just like DEVICERROR except that we reset the device instead
4137 * of initializing the port.
4138 *
4139 * WARNING, WARNING: The caller is expected to obtain the siport_mutex
4140 * before calling us.
4141 */
4142static void
4143si_error_recovery_SENDFISERROR(
4144	si_ctl_state_t *si_ctlp,
4145	si_port_state_t *si_portp,
4146	int port)
4147{
4148	uint32_t port_status;
4149	int failed_slot;
4150
4151	_NOTE(ASSUMING_PROTECTED(si_portp))
4152
4153	SIDBG1(SIDBG_ERRS|SIDBG_ENTRY, si_ctlp,
4154	    "si3124: si_error_recovery_SENDFISERROR: port: 0x%x",
4155	    port);
4156
4157	if (si_portp->siport_port_type == PORT_TYPE_MULTIPLIER) {
4158		si_recover_portmult_errors(si_ctlp, si_portp, port);
4159	} else {
4160		port_status = ddi_get32(si_ctlp->sictl_port_acc_handle,
4161		    (uint32_t *)PORT_STATUS(si_ctlp, port));
4162		failed_slot = (port_status >> 16) & SI_NUM_SLOTS;
4163		si_portp->siport_err_tags_nonSDBERROR |= (0x1 << failed_slot);
4164		(void) si_reset_dport_wait_till_ready(si_ctlp, si_portp, port,
4165		    SI_DEVICE_RESET);
4166	}
4167}
4168
4169/*
4170 * The default behavior for all other errors is to reset the device.
4171 *
4172 * WARNING, WARNING: The caller is expected to obtain the siport_mutex
4173 * before calling us.
4174 */
4175static void
4176si_error_recovery_default(
4177	si_ctl_state_t *si_ctlp,
4178	si_port_state_t *si_portp,
4179	int port)
4180{
4181	uint32_t port_status;
4182	int failed_slot;
4183
4184	_NOTE(ASSUMING_PROTECTED(si_portp))
4185
4186	SIDBG1(SIDBG_ERRS|SIDBG_ENTRY, si_ctlp,
4187	    "si3124: si_error_recovery_default: port: 0x%x",
4188	    port);
4189
4190	port_status = ddi_get32(si_ctlp->sictl_port_acc_handle,
4191	    (uint32_t *)PORT_STATUS(si_ctlp, port));
4192	failed_slot = (port_status >> 16) & SI_NUM_SLOTS;
4193	si_portp->siport_err_tags_nonSDBERROR |= (0x1 << failed_slot);
4194
4195	(void) si_reset_dport_wait_till_ready(si_ctlp, si_portp, port,
4196	    SI_DEVICE_RESET);
4197}
4198
4199/*
4200 * Read Log Ext with PAGE 10 to retrieve the error for an NCQ command.
4201 *
4202 * WARNING, WARNING: The caller is expected to obtain the siport_mutex
4203 * before calling us.
4204 */
4205static uint8_t
4206si_read_log_ext(si_ctl_state_t *si_ctlp, si_port_state_t *si_portp, int port)
4207{
4208	int slot;
4209	si_prb_t *prb;
4210	int i;
4211	uint32_t slot_status;
4212	int loop_count = 0;
4213	uint32_t *prb_word_ptr;
4214	uint8_t error;
4215
4216	_NOTE(ASSUMING_PROTECTED(si_portp))
4217
4218	SIDBG1(SIDBG_ENTRY|SIDBG_ERRS, si_ctlp,
4219	    "si_read_log_ext: port: %x", port);
4220
4221	slot = si_claim_free_slot(si_ctlp, si_portp, port);
4222	if (slot == SI_FAILURE) {
4223		return (0);
4224	}
4225
4226	prb =  &(si_portp->siport_prbpool[slot]);
4227	bzero((void *)prb, sizeof (si_prb_t));
4228
4229	/* Now fill the prb */
4230	SET_FIS_TYPE(prb->prb_fis, REGISTER_FIS_H2D);
4231	SET_FIS_PMP(prb->prb_fis, PORTMULT_CONTROL_PORT);
4232	SET_FIS_CDMDEVCTL(prb->prb_fis, 1);
4233	SET_FIS_COMMAND(prb->prb_fis, SATAC_READ_LOG_EXT);
4234	SET_FIS_SECTOR(prb->prb_fis, SATA_LOG_PAGE_10);
4235
4236	/* no real data transfer is involved */
4237	SET_SGE_TRM(prb->prb_sge0);
4238
4239#if SI_DEBUG
4240	if (si_debug_flags & SIDBG_DUMP_PRB) {
4241		int *ptr;
4242		int j;
4243
4244		ptr = (int *)(void *)prb;
4245		cmn_err(CE_WARN, "read_port_mult_reg, prb: ");
4246		for (j = 0; j < (sizeof (si_prb_t)/4); j++) {
4247			cmn_err(CE_WARN, "%x ", ptr[j]);
4248		}
4249
4250	}
4251#endif /* SI_DEBUG */
4252
4253	/* Deliver PRB */
4254	POST_PRB_ADDR(si_ctlp, si_portp, port, slot);
4255
4256	/* Loop till the command is finished. */
4257	do {
4258		slot_status = ddi_get32(si_ctlp->sictl_port_acc_handle,
4259		    (uint32_t *)(PORT_SLOT_STATUS(si_ctlp, port)));
4260
4261		SIDBG1(SIDBG_POLL_LOOP, si_ctlp,
4262		    "looping read_log_ext slot_status: 0x%x",
4263		    slot_status);
4264
4265		if (loop_count++ > SI_POLLRATE_SLOTSTATUS) {
4266			/* We are effectively timing out after 0.5 sec. */
4267			break;
4268		}
4269
4270		/* Wait for 10 millisec */
4271#ifndef __lock_lint
4272		delay(SI_10MS_TICKS);
4273#endif /* __lock_lint */
4274
4275	} while (slot_status & SI_SLOT_MASK & (0x1 << slot));
4276
4277	if (slot_status & SI_SLOT_MASK & (0x1 << slot)) {
4278		/*
4279		 * If we fail with the READ LOG EXT command, we need to
4280		 * initialize the port to clear the slot_status register.
4281		 * We don't need to worry about any other valid commands
4282		 * being thrown away because we are already in recovery
4283		 * mode and READ LOG EXT is the only pending command.
4284		 */
4285		(void) si_initialize_port_wait_till_ready(si_ctlp, port);
4286	}
4287
4288	SIDBG1(SIDBG_POLL_LOOP, si_ctlp,
4289	    "read_portmult_reg: loop count: %d",
4290	    loop_count);
4291
4292	/*
4293	 * The LRAM contains the the modified FIS.
4294	 * Read the modified FIS to obtain the Error.
4295	 */
4296	prb_word_ptr = (uint32_t *)(void *)prb;
4297	for (i = 0; i < (sizeof (si_prb_t)/4); i++) {
4298		prb_word_ptr[i] = ddi_get32(si_ctlp->sictl_port_acc_handle,
4299		    (uint32_t *)(PORT_LRAM(si_ctlp, port, slot)+i*4));
4300	}
4301
4302	if (si_check_ctl_handles(si_ctlp) != DDI_SUCCESS ||
4303	    si_check_port_handles(si_portp) != DDI_SUCCESS) {
4304		ddi_fm_service_impact(si_ctlp->sictl_devinfop,
4305		    DDI_SERVICE_UNAFFECTED);
4306		return (0);
4307	}
4308
4309	error = GET_FIS_FEATURES(prb->prb_fis);
4310
4311	CLEAR_BIT(si_portp->siport_pending_tags, slot);
4312
4313	return (error);
4314
4315}
4316
4317/*
4318 * Dump the error message to the log.
4319 */
4320static void
4321si_log_error_message(si_ctl_state_t *si_ctlp, int port, uint32_t command_error)
4322{
4323#if SI_DEBUG
4324#ifndef __lock_lint
4325	_NOTE(ARGUNUSED(si_ctlp))
4326	_NOTE(ARGUNUSED(port))
4327#endif  /* __lock_lint */
4328
4329	char *errstr;
4330
4331	switch (command_error) {
4332
4333	case CMD_ERR_DEVICEERRROR:
4334		errstr = "Standard Error: Error bit set in register - device"
4335		    " to host FIS";
4336		break;
4337
4338	case CMD_ERR_SDBERROR:
4339		errstr = "NCQ Error: Error bit set in register - device"
4340		    " to host FIS";
4341		break;
4342
4343	case CMD_ERR_DATAFISERROR:
4344		errstr = "Error in data FIS not detected by device";
4345		break;
4346
4347	case CMD_ERR_SENDFISERROR:
4348		errstr = "Initial command FIS transmission failed";
4349		break;
4350
4351	case CMD_ERR_INCONSISTENTSTATE:
4352		errstr = "Inconsistency in protocol";
4353		break;
4354
4355	case CMD_ERR_DIRECTIONERROR:
4356		errstr = "DMA direction flag does not match the command";
4357		break;
4358
4359	case CMD_ERR_UNDERRUNERROR:
4360		errstr = "Run out of scatter gather entries while writing data";
4361		break;
4362
4363	case CMD_ERR_OVERRUNERROR:
4364		errstr = "Run out of scatter gather entries while reading data";
4365		break;
4366
4367	case CMD_ERR_PACKETPROTOCOLERROR:
4368		errstr = "Packet protocol error";
4369		break;
4370
4371	case CMD_ERR_PLDSGTERRORBOUNDARY:
4372		errstr = "Scatter/gather table not on quadword boundary";
4373		break;
4374
4375	case CMD_ERR_PLDSGTERRORTARETABORT:
4376		errstr = "PCI(X) Target abort while fetching scatter/gather"
4377		    " table";
4378		break;
4379
4380	case CMD_ERR_PLDSGTERRORMASTERABORT:
4381		errstr = "PCI(X) Master abort while fetching scatter/gather"
4382		    " table";
4383		break;
4384
4385	case CMD_ERR_PLDSGTERRORPCIERR:
4386		errstr = "PCI(X) parity error while fetching scatter/gather"
4387		    " table";
4388		break;
4389
4390	case CMD_ERR_PLDCMDERRORBOUNDARY:
4391		errstr = "PRB not on quadword boundary";
4392		break;
4393
4394	case CMD_ERR_PLDCMDERRORTARGETABORT:
4395		errstr = "PCI(X) Target abort while fetching PRB";
4396		break;
4397
4398	case CMD_ERR_PLDCMDERRORMASTERABORT:
4399		errstr = "PCI(X) Master abort while fetching PRB";
4400		break;
4401
4402	case CMD_ERR_PLDCMDERORPCIERR:
4403		errstr = "PCI(X) parity error while fetching PRB";
4404		break;
4405
4406	case CMD_ERR_PSDERRORTARGETABORT:
4407		errstr = "PCI(X) Target abort during data transfer";
4408		break;
4409
4410	case CMD_ERR_PSDERRORMASTERABORT:
4411		errstr = "PCI(X) Master abort during data transfer";
4412		break;
4413
4414	case CMD_ERR_PSDERRORPCIERR:
4415		errstr = "PCI(X) parity error during data transfer";
4416		break;
4417
4418	case CMD_ERR_SENDSERVICEERROR:
4419		errstr = "FIS received while sending service FIS in"
4420		    " legacy queuing operation";
4421		break;
4422
4423	default:
4424		errstr = "Unknown Error";
4425		break;
4426
4427	}
4428
4429	SIDBG2(SIDBG_ERRS, si_ctlp,
4430	    "command error: port: 0x%x, error: %s",
4431	    port,
4432	    errstr);
4433#else
4434#ifndef __lock_lint
4435	_NOTE(ARGUNUSED(si_ctlp))
4436	_NOTE(ARGUNUSED(port))
4437	_NOTE(ARGUNUSED(command_error))
4438#endif  /* __lock_lint */
4439
4440#endif	/* SI_DEBUG */
4441}
4442
4443
4444/*
4445 * Interrupt which indicates that the Port Ready state has changed
4446 * from zero to one.
4447 *
4448 * We are not interested in this interrupt; we just log a debug message.
4449 */
4450/*ARGSUSED*/
4451static int
4452si_intr_port_ready(
4453	si_ctl_state_t *si_ctlp,
4454	si_port_state_t *si_portp,
4455	int port)
4456{
4457	SIDBG0(SIDBG_INTR|SIDBG_ENTRY, si_ctlp, "si_intr_ready");
4458	return (SI_SUCCESS);
4459}
4460
4461/*
4462 * Interrupt which indicates that the port power management state
4463 * has been modified.
4464 *
4465 * We are not interested in this interrupt; we just log a debug message.
4466 */
4467/*ARGSUSED*/
4468static int
4469si_intr_pwr_change(
4470	si_ctl_state_t *si_ctlp,
4471	si_port_state_t *si_portp,
4472	int port)
4473{
4474	SIDBG0(SIDBG_INTR|SIDBG_ENTRY, si_ctlp, "si_intr_pwr_change");
4475	return (SI_SUCCESS);
4476}
4477
4478/*
4479 * Interrupt which indicates that the PHY state has changed either from
4480 * Not-Ready to Ready or from Ready to Not-Ready.
4481 */
4482static int
4483si_intr_phy_ready_change(
4484	si_ctl_state_t *si_ctlp,
4485	si_port_state_t *si_portp,
4486	int port)
4487{
4488	sata_device_t sdevice;
4489	uint32_t SStatus = 0; /* No dev present & PHY not established. */
4490	int dev_exists_now = 0;
4491	int dev_existed_previously = 0;
4492
4493	SIDBG0(SIDBG_INTR|SIDBG_ENTRY, si_ctlp, "si_intr_phy_rdy_change");
4494
4495	mutex_enter(&si_ctlp->sictl_mutex);
4496	if ((si_ctlp->sictl_sata_hba_tran == NULL) || (si_portp == NULL)) {
4497		/* the whole controller setup is not yet done. */
4498		mutex_exit(&si_ctlp->sictl_mutex);
4499		return (SI_SUCCESS);
4500	}
4501
4502	mutex_exit(&si_ctlp->sictl_mutex);
4503
4504	mutex_enter(&si_portp->siport_mutex);
4505
4506	/* SStatus tells the presence of device. */
4507	SStatus = ddi_get32(si_ctlp->sictl_port_acc_handle,
4508	    (uint32_t *)PORT_SSTATUS(si_ctlp, port));
4509	dev_exists_now =
4510	    (SSTATUS_GET_DET(SStatus) == SSTATUS_DET_DEVPRESENT_PHYONLINE);
4511
4512	if (si_portp->siport_port_type != PORT_TYPE_NODEV) {
4513		dev_existed_previously = 1;
4514	}
4515
4516	bzero((void *)&sdevice, sizeof (sata_device_t));
4517
4518	sdevice.satadev_addr.cport = (uint8_t)port;
4519	sdevice.satadev_addr.pmport = PORTMULT_CONTROL_PORT;
4520
4521	/* we don't have a way of determining the exact port-mult port. */
4522	if (si_portp->siport_port_type == PORT_TYPE_MULTIPLIER) {
4523		sdevice.satadev_addr.qual = SATA_ADDR_PMPORT;
4524	} else {
4525		sdevice.satadev_addr.qual = SATA_ADDR_CPORT;
4526	}
4527
4528	sdevice.satadev_state = SATA_STATE_READY; /* port state */
4529
4530	if (dev_exists_now) {
4531		if (dev_existed_previously) {
4532
4533			/* Things are fine now. The loss was temporary. */
4534			SIDBG0(SIDBG_INTR, NULL,
4535			    "phyrdy: doing BOTH EVENTS TOGETHER");
4536			if (si_portp->siport_active) {
4537				SIDBG0(SIDBG_EVENT, si_ctlp,
4538				    "sending event: LINK_LOST & "
4539				    "LINK_ESTABLISHED");
4540
4541				sata_hba_event_notify(
4542				    si_ctlp->sictl_sata_hba_tran->\
4543				    sata_tran_hba_dip,
4544				    &sdevice,
4545				    SATA_EVNT_LINK_LOST|
4546				    SATA_EVNT_LINK_ESTABLISHED);
4547			}
4548
4549		} else {
4550
4551			/* A new device has been detected. */
4552			mutex_exit(&si_portp->siport_mutex);
4553			si_find_dev_signature(si_ctlp, si_portp, port,
4554			    PORTMULT_CONTROL_PORT);
4555			mutex_enter(&si_portp->siport_mutex);
4556			SIDBG0(SIDBG_INTR, NULL, "phyrdy: doing ATTACH event");
4557			if (si_portp->siport_active) {
4558				SIDBG0(SIDBG_EVENT, si_ctlp,
4559				    "sending event up: LINK_ESTABLISHED");
4560
4561				sata_hba_event_notify(
4562				    si_ctlp->sictl_sata_hba_tran->\
4563				    sata_tran_hba_dip,
4564				    &sdevice,
4565				    SATA_EVNT_LINK_ESTABLISHED);
4566			}
4567
4568		}
4569	} else { /* No device exists now */
4570
4571		if (dev_existed_previously) {
4572
4573			/* An existing device is lost. */
4574			if (si_portp->siport_active) {
4575				SIDBG0(SIDBG_EVENT, si_ctlp,
4576				    "sending event up: LINK_LOST");
4577
4578				sata_hba_event_notify(
4579				    si_ctlp->sictl_sata_hba_tran->
4580				    sata_tran_hba_dip,
4581				    &sdevice,
4582				    SATA_EVNT_LINK_LOST);
4583			}
4584			si_portp->siport_port_type = PORT_TYPE_NODEV;
4585
4586		}
4587#if SI_DEBUG
4588		else {
4589
4590			/* spurious interrupt */
4591			SIDBG0(SIDBG_INTR, NULL,
4592			    "spurious phy ready interrupt");
4593		}
4594#endif	/* SI_DEBUG */
4595	}
4596
4597	mutex_exit(&si_portp->siport_mutex);
4598	return (SI_SUCCESS);
4599}
4600
4601
4602/*
4603 * Interrupt which indicates that a COMWAKE OOB signal has been decoded
4604 * on the receiver.
4605 *
4606 * We are not interested in this interrupt; we just log a debug message.
4607 */
4608/*ARGSUSED*/
4609static int
4610si_intr_comwake_rcvd(
4611	si_ctl_state_t *si_ctlp,
4612	si_port_state_t *si_portp,
4613	int port)
4614{
4615	SIDBG0(SIDBG_INTR|SIDBG_ENTRY, si_ctlp, "si_intr_commwake_rcvd");
4616	return (SI_SUCCESS);
4617}
4618
4619/*
4620 * Interrupt which indicates that the F-bit has been set in SError
4621 * Diag field.
4622 *
4623 * We are not interested in this interrupt; we just log a debug message.
4624 */
4625/*ARGSUSED*/
4626static int
4627si_intr_unrecognised_fis(
4628	si_ctl_state_t *si_ctlp,
4629	si_port_state_t *si_portp,
4630	int port)
4631{
4632	SIDBG0(SIDBG_INTR|SIDBG_ENTRY, si_ctlp, "si_intr_unrecognised_fis");
4633	return (SI_SUCCESS);
4634}
4635
4636/*
4637 * Interrupt which indicates that the X-bit has been set in SError
4638 * Diag field.
4639 *
4640 * We are not interested in this interrupt; we just log a debug message.
4641 */
4642/*ARGSUSED*/
4643static int
4644si_intr_dev_xchanged(
4645	si_ctl_state_t *si_ctlp,
4646	si_port_state_t *si_portp,
4647	int port)
4648{
4649
4650	SIDBG0(SIDBG_INTR|SIDBG_ENTRY, si_ctlp, "si_intr_dev_xchanged");
4651	return (SI_SUCCESS);
4652}
4653
4654/*
4655 * Interrupt which indicates that the 8b/10b Decode Error counter has
4656 * exceeded the programmed non-zero threshold value.
4657 *
4658 * We are not interested in this interrupt; we just log a debug message.
4659 */
4660/*ARGSUSED*/
4661static int
4662si_intr_decode_err_threshold(
4663	si_ctl_state_t *si_ctlp,
4664	si_port_state_t *si_portp,
4665	int port)
4666{
4667	SIDBG0(SIDBG_INTR|SIDBG_ENTRY, si_ctlp, "si_intr_err_threshold");
4668	return (SI_SUCCESS);
4669}
4670
4671/*
4672 * Interrupt which indicates that the CRC Error counter has exceeded the
4673 * programmed non-zero threshold value.
4674 *
4675 * We are not interested in this interrupt; we just log a debug message.
4676 */
4677/*ARGSUSED*/
4678static int
4679si_intr_crc_err_threshold(
4680	si_ctl_state_t *si_ctlp,
4681	si_port_state_t *si_portp,
4682	int port)
4683{
4684	SIDBG0(SIDBG_INTR|SIDBG_ENTRY, si_ctlp, "si_intr_crc_threshold");
4685	return (SI_SUCCESS);
4686}
4687
4688/*
4689 * Interrupt which indicates that the Handshake Error counter has
4690 * exceeded the programmed non-zero threshold value.
4691 *
4692 * We are not interested in this interrupt; we just log a debug message.
4693 */
4694/*ARGSUSED*/
4695static int
4696si_intr_handshake_err_threshold(
4697	si_ctl_state_t *si_ctlp,
4698	si_port_state_t *si_portp,
4699	int port)
4700{
4701	SIDBG0(SIDBG_INTR|SIDBG_ENTRY, si_ctlp,
4702	    "si_intr_handshake_err_threshold");
4703	return (SI_SUCCESS);
4704}
4705
4706/*
4707 * Interrupt which indicates that a "Set Device Bits" FIS has been
4708 * received with N-bit set in the control field.
4709 *
4710 * We are not interested in this interrupt; we just log a debug message.
4711 */
4712/*ARGSUSED*/
4713static int
4714si_intr_set_devbits_notify(
4715	si_ctl_state_t *si_ctlp,
4716	si_port_state_t *si_portp,
4717	int port)
4718{
4719	SIDBG0(SIDBG_INTR|SIDBG_ENTRY, si_ctlp, "si_intr_set_devbits_notify");
4720	return (SI_SUCCESS);
4721}
4722
4723
4724/*
4725 * Enable the interrupts for a particular port.
4726 *
4727 * WARNING, WARNING: The caller is expected to obtain the siport_mutex
4728 * before calling us.
4729 */
4730static void
4731si_enable_port_interrupts(si_ctl_state_t *si_ctlp, int port)
4732{
4733	uint32_t mask;
4734
4735	/* get the current settings first. */
4736	mask = ddi_get32(si_ctlp->sictl_global_acc_handle,
4737	    (uint32_t *)GLOBAL_CONTROL_REG(si_ctlp));
4738
4739	SIDBG1(SIDBG_INIT|SIDBG_ENTRY, si_ctlp,
4740	    "si_enable_port_interrupts: current mask: 0x%x",
4741	    mask);
4742
4743	/* enable the bit for current port. */
4744	SET_BIT(mask, port);
4745
4746	/* now use this mask to enable the interrupt. */
4747	ddi_put32(si_ctlp->sictl_global_acc_handle,
4748	    (uint32_t *)GLOBAL_CONTROL_REG(si_ctlp),
4749	    mask);
4750}
4751
4752/*
4753 * Enable interrupts for all the ports.
4754 */
4755static void
4756si_enable_all_interrupts(si_ctl_state_t *si_ctlp)
4757{
4758	int port;
4759
4760	for (port = 0; port < si_ctlp->sictl_num_ports; port++) {
4761		si_enable_port_interrupts(si_ctlp, port);
4762	}
4763}
4764
4765/*
4766 * Disable interrupts for a particular port.
4767 *
4768 * WARNING, WARNING: The caller is expected to obtain the siport_mutex
4769 * before calling us.
4770 */
4771static void
4772si_disable_port_interrupts(si_ctl_state_t *si_ctlp, int port)
4773{
4774	uint32_t mask;
4775
4776	/* get the current settings first. */
4777	mask = ddi_get32(si_ctlp->sictl_global_acc_handle,
4778	    (uint32_t *)GLOBAL_CONTROL_REG(si_ctlp));
4779
4780	/* clear the bit for current port. */
4781	CLEAR_BIT(mask, port);
4782
4783	/* now use this mask to disable the interrupt. */
4784	ddi_put32(si_ctlp->sictl_global_acc_handle,
4785	    (uint32_t *)GLOBAL_CONTROL_REG(si_ctlp),
4786	    mask);
4787
4788}
4789
4790/*
4791 * Disable interrupts for all the ports.
4792 */
4793static void
4794si_disable_all_interrupts(si_ctl_state_t *si_ctlp)
4795{
4796	int port;
4797
4798	for (port = 0; port < si_ctlp->sictl_num_ports; port++) {
4799		si_disable_port_interrupts(si_ctlp, port);
4800	}
4801}
4802
4803/*
4804 * Fetches the latest sstatus, scontrol, serror, sactive registers
4805 * and stuffs them into sata_device_t structure.
4806 */
4807static void
4808fill_dev_sregisters(si_ctl_state_t *si_ctlp, int port, sata_device_t *satadev)
4809{
4810	satadev->satadev_scr.sstatus = ddi_get32(si_ctlp->sictl_port_acc_handle,
4811	    (uint32_t *)(PORT_SSTATUS(si_ctlp, port)));
4812	satadev->satadev_scr.serror = ddi_get32(si_ctlp->sictl_port_acc_handle,
4813	    (uint32_t *)(PORT_SERROR(si_ctlp, port)));
4814	satadev->satadev_scr.sactive = ddi_get32(si_ctlp->sictl_port_acc_handle,
4815	    (uint32_t *)(PORT_SACTIVE(si_ctlp, port)));
4816	satadev->satadev_scr.scontrol =
4817	    ddi_get32(si_ctlp->sictl_port_acc_handle,
4818	    (uint32_t *)(PORT_SCONTROL(si_ctlp, port)));
4819
4820}
4821
4822/*
4823 * si_add_legacy_intrs() handles INTx and legacy interrupts.
4824 */
4825static int
4826si_add_legacy_intrs(si_ctl_state_t *si_ctlp)
4827{
4828	dev_info_t	*devinfo = si_ctlp->sictl_devinfop;
4829	int		actual, count = 0;
4830	int		x, y, rc, inum = 0;
4831
4832	SIDBG0(SIDBG_ENTRY, si_ctlp, "si_add_legacy_intrs");
4833
4834	/* get number of interrupts. */
4835	rc = ddi_intr_get_nintrs(devinfo, DDI_INTR_TYPE_FIXED, &count);
4836	if ((rc != DDI_SUCCESS) || (count == 0)) {
4837		SIDBG2(SIDBG_INTR|SIDBG_INIT, si_ctlp,
4838		    "ddi_intr_get_nintrs() failed, "
4839		    "rc %d count %d\n", rc, count);
4840		return (DDI_FAILURE);
4841	}
4842
4843	/* Allocate an array of interrupt handles. */
4844	si_ctlp->sictl_intr_size = count * sizeof (ddi_intr_handle_t);
4845	si_ctlp->sictl_htable = kmem_zalloc(si_ctlp->sictl_intr_size, KM_SLEEP);
4846
4847	/* call ddi_intr_alloc(). */
4848	rc = ddi_intr_alloc(devinfo, si_ctlp->sictl_htable, DDI_INTR_TYPE_FIXED,
4849	    inum, count, &actual, DDI_INTR_ALLOC_STRICT);
4850
4851	if ((rc != DDI_SUCCESS) || (actual == 0)) {
4852		SIDBG1(SIDBG_INTR|SIDBG_INIT, si_ctlp,
4853		    "ddi_intr_alloc() failed, rc %d\n", rc);
4854		kmem_free(si_ctlp->sictl_htable, si_ctlp->sictl_intr_size);
4855		return (DDI_FAILURE);
4856	}
4857
4858	if (actual < count) {
4859		SIDBG2(SIDBG_INTR|SIDBG_INIT, si_ctlp,
4860		    "Requested: %d, Received: %d", count, actual);
4861
4862		for (x = 0; x < actual; x++) {
4863			(void) ddi_intr_free(si_ctlp->sictl_htable[x]);
4864		}
4865
4866		kmem_free(si_ctlp->sictl_htable, si_ctlp->sictl_intr_size);
4867		return (DDI_FAILURE);
4868	}
4869
4870	si_ctlp->sictl_intr_cnt = actual;
4871
4872	/* Get intr priority. */
4873	if (ddi_intr_get_pri(si_ctlp->sictl_htable[0],
4874	    &si_ctlp->sictl_intr_pri) != DDI_SUCCESS) {
4875		SIDBG0(SIDBG_INTR|SIDBG_INIT, si_ctlp,
4876		    "ddi_intr_get_pri() failed");
4877
4878		for (x = 0; x < actual; x++) {
4879			(void) ddi_intr_free(si_ctlp->sictl_htable[x]);
4880		}
4881
4882		kmem_free(si_ctlp->sictl_htable, si_ctlp->sictl_intr_size);
4883		return (DDI_FAILURE);
4884	}
4885
4886	/* Test for high level mutex. */
4887	if (si_ctlp->sictl_intr_pri >= ddi_intr_get_hilevel_pri()) {
4888		SIDBG0(SIDBG_INTR|SIDBG_INIT, si_ctlp,
4889		    "si_add_legacy_intrs: Hi level intr not supported");
4890
4891		for (x = 0; x < actual; x++) {
4892			(void) ddi_intr_free(si_ctlp->sictl_htable[x]);
4893		}
4894
4895		kmem_free(si_ctlp->sictl_htable, sizeof (ddi_intr_handle_t));
4896
4897		return (DDI_FAILURE);
4898	}
4899
4900	/* Call ddi_intr_add_handler(). */
4901	for (x = 0; x < actual; x++) {
4902		if (ddi_intr_add_handler(si_ctlp->sictl_htable[x], si_intr,
4903		    (caddr_t)si_ctlp, NULL) != DDI_SUCCESS) {
4904			SIDBG0(SIDBG_INTR|SIDBG_INIT, si_ctlp,
4905			    "ddi_intr_add_handler() failed");
4906
4907			for (y = 0; y < actual; y++) {
4908				(void) ddi_intr_free(si_ctlp->sictl_htable[y]);
4909			}
4910
4911			kmem_free(si_ctlp->sictl_htable,
4912			    si_ctlp->sictl_intr_size);
4913			return (DDI_FAILURE);
4914		}
4915	}
4916
4917	/* Call ddi_intr_enable() for legacy interrupts. */
4918	for (x = 0; x < si_ctlp->sictl_intr_cnt; x++) {
4919		(void) ddi_intr_enable(si_ctlp->sictl_htable[x]);
4920	}
4921
4922	return (DDI_SUCCESS);
4923}
4924
4925/*
4926 * si_add_msictl_intrs() handles MSI interrupts.
4927 */
4928static int
4929si_add_msi_intrs(si_ctl_state_t *si_ctlp)
4930{
4931	dev_info_t	*devinfo = si_ctlp->sictl_devinfop;
4932	int		count, avail, actual;
4933	int		x, y, rc, inum = 0;
4934
4935	SIDBG0(SIDBG_ENTRY|SIDBG_INIT, si_ctlp, "si_add_msi_intrs");
4936
4937	/* get number of interrupts. */
4938	rc = ddi_intr_get_nintrs(devinfo, DDI_INTR_TYPE_MSI, &count);
4939	if ((rc != DDI_SUCCESS) || (count == 0)) {
4940		SIDBG2(SIDBG_INIT, si_ctlp,
4941		    "ddi_intr_get_nintrs() failed, "
4942		    "rc %d count %d\n", rc, count);
4943		return (DDI_FAILURE);
4944	}
4945
4946	/* get number of available interrupts. */
4947	rc = ddi_intr_get_navail(devinfo, DDI_INTR_TYPE_MSI, &avail);
4948	if ((rc != DDI_SUCCESS) || (avail == 0)) {
4949		SIDBG2(SIDBG_INIT, si_ctlp,
4950		    "ddi_intr_get_navail() failed, "
4951		    "rc %d avail %d\n", rc, avail);
4952		return (DDI_FAILURE);
4953	}
4954
4955#if SI_DEBUG
4956	if (avail < count) {
4957		SIDBG2(SIDBG_INIT, si_ctlp,
4958		    "ddi_intr_get_nvail returned %d, navail() returned %d",
4959		    count, avail);
4960	}
4961#endif	/* SI_DEBUG */
4962
4963	/* Allocate an array of interrupt handles. */
4964	si_ctlp->sictl_intr_size = count * sizeof (ddi_intr_handle_t);
4965	si_ctlp->sictl_htable = kmem_alloc(si_ctlp->sictl_intr_size, KM_SLEEP);
4966
4967	/* call ddi_intr_alloc(). */
4968	rc = ddi_intr_alloc(devinfo, si_ctlp->sictl_htable, DDI_INTR_TYPE_MSI,
4969	    inum, count, &actual, DDI_INTR_ALLOC_NORMAL);
4970
4971	if ((rc != DDI_SUCCESS) || (actual == 0)) {
4972		SIDBG1(SIDBG_INIT, si_ctlp,
4973		    "ddi_intr_alloc() failed, rc %d\n", rc);
4974		kmem_free(si_ctlp->sictl_htable, si_ctlp->sictl_intr_size);
4975		return (DDI_FAILURE);
4976	}
4977
4978#if SI_DEBUG
4979	/* use interrupt count returned */
4980	if (actual < count) {
4981		SIDBG2(SIDBG_INIT, si_ctlp,
4982		    "Requested: %d, Received: %d", count, actual);
4983	}
4984#endif	/* SI_DEBUG */
4985
4986	si_ctlp->sictl_intr_cnt = actual;
4987
4988	/*
4989	 * Get priority for first msi, assume remaining are all the same.
4990	 */
4991	if (ddi_intr_get_pri(si_ctlp->sictl_htable[0],
4992	    &si_ctlp->sictl_intr_pri) != DDI_SUCCESS) {
4993		SIDBG0(SIDBG_INIT, si_ctlp, "ddi_intr_get_pri() failed");
4994
4995		/* Free already allocated intr. */
4996		for (y = 0; y < actual; y++) {
4997			(void) ddi_intr_free(si_ctlp->sictl_htable[y]);
4998		}
4999
5000		kmem_free(si_ctlp->sictl_htable, si_ctlp->sictl_intr_size);
5001		return (DDI_FAILURE);
5002	}
5003
5004	/* Test for high level mutex. */
5005	if (si_ctlp->sictl_intr_pri >= ddi_intr_get_hilevel_pri()) {
5006		SIDBG0(SIDBG_INIT, si_ctlp,
5007		    "si_add_msi_intrs: Hi level intr not supported");
5008
5009		/* Free already allocated intr. */
5010		for (y = 0; y < actual; y++) {
5011			(void) ddi_intr_free(si_ctlp->sictl_htable[y]);
5012		}
5013
5014		kmem_free(si_ctlp->sictl_htable, sizeof (ddi_intr_handle_t));
5015
5016		return (DDI_FAILURE);
5017	}
5018
5019	/* Call ddi_intr_add_handler(). */
5020	for (x = 0; x < actual; x++) {
5021		if (ddi_intr_add_handler(si_ctlp->sictl_htable[x], si_intr,
5022		    (caddr_t)si_ctlp, NULL) != DDI_SUCCESS) {
5023			SIDBG0(SIDBG_INIT, si_ctlp,
5024			    "ddi_intr_add_handler() failed");
5025
5026			/* Free already allocated intr. */
5027			for (y = 0; y < actual; y++) {
5028				(void) ddi_intr_free(si_ctlp->sictl_htable[y]);
5029			}
5030
5031			kmem_free(si_ctlp->sictl_htable,
5032			    si_ctlp->sictl_intr_size);
5033			return (DDI_FAILURE);
5034		}
5035	}
5036
5037	(void) ddi_intr_get_cap(si_ctlp->sictl_htable[0],
5038	    &si_ctlp->sictl_intr_cap);
5039
5040	if (si_ctlp->sictl_intr_cap & DDI_INTR_FLAG_BLOCK) {
5041		/* Call ddi_intr_block_enable() for MSI. */
5042		(void) ddi_intr_block_enable(si_ctlp->sictl_htable,
5043		    si_ctlp->sictl_intr_cnt);
5044	} else {
5045		/* Call ddi_intr_enable() for MSI non block enable. */
5046		for (x = 0; x < si_ctlp->sictl_intr_cnt; x++) {
5047			(void) ddi_intr_enable(si_ctlp->sictl_htable[x]);
5048		}
5049	}
5050
5051	return (DDI_SUCCESS);
5052}
5053
5054/*
5055 * Removes the registered interrupts irrespective of whether they
5056 * were legacy or MSI.
5057 */
5058static void
5059si_rem_intrs(si_ctl_state_t *si_ctlp)
5060{
5061	int x;
5062
5063	SIDBG0(SIDBG_ENTRY, si_ctlp, "si_rem_intrs entered");
5064
5065	/* Disable all interrupts. */
5066	if ((si_ctlp->sictl_intr_type == DDI_INTR_TYPE_MSI) &&
5067	    (si_ctlp->sictl_intr_cap & DDI_INTR_FLAG_BLOCK)) {
5068		/* Call ddi_intr_block_disable(). */
5069		(void) ddi_intr_block_disable(si_ctlp->sictl_htable,
5070		    si_ctlp->sictl_intr_cnt);
5071	} else {
5072		for (x = 0; x < si_ctlp->sictl_intr_cnt; x++) {
5073			(void) ddi_intr_disable(si_ctlp->sictl_htable[x]);
5074		}
5075	}
5076
5077	/* Call ddi_intr_remove_handler(). */
5078	for (x = 0; x < si_ctlp->sictl_intr_cnt; x++) {
5079		(void) ddi_intr_remove_handler(si_ctlp->sictl_htable[x]);
5080		(void) ddi_intr_free(si_ctlp->sictl_htable[x]);
5081	}
5082
5083	kmem_free(si_ctlp->sictl_htable, si_ctlp->sictl_intr_size);
5084}
5085
5086/*
5087 * Resets either the port or the device connected to the port based on
5088 * the flag variable.
5089 *
5090 * The reset effectively throws away all the pending commands. So, the caller
5091 * has to make provision to handle the pending commands.
5092 *
5093 * After the reset, we wait till the port is ready again.
5094 *
5095 * WARNING, WARNING: The caller is expected to obtain the siport_mutex
5096 * before calling us.
5097 *
5098 * Note: Not port-mult aware.
5099 */
5100static int
5101si_reset_dport_wait_till_ready(
5102	si_ctl_state_t *si_ctlp,
5103	si_port_state_t *si_portp,
5104	int port,
5105	int flag)
5106{
5107	uint32_t port_status;
5108	int loop_count = 0;
5109	sata_device_t sdevice;
5110	uint32_t SStatus;
5111	uint32_t SControl;
5112	uint32_t port_intr_status;
5113
5114	_NOTE(ASSUMING_PROTECTED(si_portp))
5115
5116	if (flag == SI_PORT_RESET) {
5117		ddi_put32(si_ctlp->sictl_port_acc_handle,
5118		    (uint32_t *)PORT_CONTROL_SET(si_ctlp, port),
5119		    PORT_CONTROL_SET_BITS_PORT_RESET);
5120
5121		/* Port reset is not self clearing. So clear it now. */
5122		ddi_put32(si_ctlp->sictl_port_acc_handle,
5123		    (uint32_t *)PORT_CONTROL_CLEAR(si_ctlp, port),
5124		    PORT_CONTROL_CLEAR_BITS_PORT_RESET);
5125	} else {
5126		/* Reset the device. */
5127		ddi_put32(si_ctlp->sictl_port_acc_handle,
5128		    (uint32_t *)PORT_CONTROL_SET(si_ctlp, port),
5129		    PORT_CONTROL_SET_BITS_DEV_RESET);
5130
5131		/*
5132		 * tidbit: this bit is self clearing; so there is no need
5133		 * for manual clear as we did for port reset.
5134		 */
5135	}
5136
5137	/* Set the reset in progress flag */
5138	if (!(flag & SI_RESET_NO_EVENTS_UP)) {
5139		si_portp->siport_reset_in_progress = 1;
5140	}
5141
5142
5143	/*
5144	 * Every reset needs a PHY initialization.
5145	 *
5146	 * The way to initialize the PHY is to write a 1 and then
5147	 * a 0 to DET field of SControl register.
5148	 */
5149
5150	/* Fetch the current SControl before writing the DET part with 1. */
5151	SControl = ddi_get32(si_ctlp->sictl_port_acc_handle,
5152	    (uint32_t *)PORT_SCONTROL(si_ctlp, port));
5153	SCONTROL_SET_DET(SControl, SCONTROL_DET_COMRESET);
5154	ddi_put32(si_ctlp->sictl_port_acc_handle,
5155	    (uint32_t *)(PORT_SCONTROL(si_ctlp, port)),
5156	    SControl);
5157#ifndef __lock_lint
5158	delay(SI_10MS_TICKS); /* give time for COMRESET to percolate */
5159#endif /* __lock_lint */
5160
5161	/* Now fetch the SControl again and rewrite the DET part with 0 */
5162	SControl = ddi_get32(si_ctlp->sictl_port_acc_handle,
5163	    (uint32_t *)PORT_SCONTROL(si_ctlp, port));
5164	SCONTROL_SET_DET(SControl, SCONTROL_DET_NOACTION);
5165	ddi_put32(si_ctlp->sictl_port_acc_handle,
5166	    (uint32_t *)(PORT_SCONTROL(si_ctlp, port)),
5167	    SControl);
5168
5169	/*
5170	 * PHY may be initialized by now. Check the DET field of SStatus
5171	 * to determine if there is a device present.
5172	 *
5173	 * The DET field is valid only if IPM field indicates that
5174	 * the interface is in active state.
5175	 */
5176
5177	loop_count = 0;
5178	do {
5179		SStatus = ddi_get32(si_ctlp->sictl_port_acc_handle,
5180		    (uint32_t *)PORT_SSTATUS(si_ctlp, port));
5181
5182		if (SSTATUS_GET_IPM(SStatus) !=
5183		    SSTATUS_IPM_INTERFACE_ACTIVE) {
5184			/*
5185			 * If the interface is not active, the DET field
5186			 * is considered not accurate. So we want to
5187			 * continue looping.
5188			 */
5189			SSTATUS_SET_DET(SStatus, SSTATUS_DET_NODEV_NOPHY);
5190		}
5191
5192		if (loop_count++ > SI_POLLRATE_SSTATUS) {
5193			/* We are effectively timing out after 0.1 sec. */
5194			break;
5195		}
5196
5197		/* Wait for 10 millisec */
5198#ifndef __lock_lint
5199		delay(SI_10MS_TICKS);
5200#endif /* __lock_lint */
5201
5202	} while (SSTATUS_GET_DET(SStatus) != SSTATUS_DET_DEVPRESENT_PHYONLINE);
5203
5204	SIDBG2(SIDBG_POLL_LOOP, si_ctlp,
5205	    "si_reset_dport_wait_till_ready: loop count: %d, \
5206		SStatus: 0x%x",
5207	    loop_count,
5208	    SStatus);
5209
5210	/* Now check for port readiness. */
5211	loop_count = 0;
5212	do {
5213		port_status = ddi_get32(si_ctlp->sictl_port_acc_handle,
5214		    (uint32_t *)PORT_STATUS(si_ctlp, port));
5215
5216		if (loop_count++ > SI_POLLRATE_PORTREADY) {
5217			/* We are effectively timing out after 0.5 sec. */
5218			break;
5219		}
5220
5221		/* Wait for 10 millisec */
5222#ifndef __lock_lint
5223		delay(SI_10MS_TICKS);
5224#endif /* __lock_lint */
5225
5226	} while (!(port_status & PORT_STATUS_BITS_PORT_READY));
5227
5228	SIDBG3(SIDBG_POLL_LOOP, si_ctlp,
5229	    "si_reset_dport_wait_till_ready: loop count: %d, \
5230		port_status: 0x%x, SStatus: 0x%x",
5231	    loop_count,
5232	    port_status,
5233	    SStatus);
5234
5235	/* Indicate to the framework that a reset has happened. */
5236	if (!(flag & SI_RESET_NO_EVENTS_UP)) {
5237
5238		bzero((void *)&sdevice, sizeof (sata_device_t));
5239
5240		sdevice.satadev_addr.cport = (uint8_t)port;
5241		sdevice.satadev_addr.pmport = PORTMULT_CONTROL_PORT;
5242
5243		if (si_portp->siport_port_type == PORT_TYPE_MULTIPLIER) {
5244			sdevice.satadev_addr.qual = SATA_ADDR_DPMPORT;
5245		} else {
5246			sdevice.satadev_addr.qual = SATA_ADDR_DCPORT;
5247		}
5248		sdevice.satadev_state = SATA_DSTATE_RESET |
5249		    SATA_DSTATE_PWR_ACTIVE;
5250		if (si_ctlp->sictl_sata_hba_tran) {
5251			sata_hba_event_notify(
5252			    si_ctlp->sictl_sata_hba_tran->sata_tran_hba_dip,
5253			    &sdevice,
5254			    SATA_EVNT_DEVICE_RESET);
5255		}
5256
5257		SIDBG0(SIDBG_EVENT, si_ctlp,
5258		    "sending event up: SATA_EVNT_RESET");
5259	}
5260
5261	if ((SSTATUS_GET_IPM(SStatus) == SSTATUS_IPM_INTERFACE_ACTIVE) &&
5262	    (SSTATUS_GET_DET(SStatus) ==
5263	    SSTATUS_DET_DEVPRESENT_PHYONLINE)) {
5264		/* The interface is active and the device is present */
5265		if (!(port_status & PORT_STATUS_BITS_PORT_READY)) {
5266			/* But the port is is not ready for some reason */
5267			SIDBG0(SIDBG_POLL_LOOP, si_ctlp,
5268			    "si_reset_dport_wait_till_ready failed");
5269			return (SI_FAILURE);
5270		}
5271	}
5272
5273
5274	/*
5275	 * For some reason, we are losing the interrupt enablement after
5276	 * any reset condition. So restore them back now.
5277	 */
5278
5279	SIDBG1(SIDBG_INIT, si_ctlp,
5280	    "current interrupt enable set: 0x%x",
5281	    ddi_get32(si_ctlp->sictl_port_acc_handle,
5282	    (uint32_t *)PORT_INTERRUPT_ENABLE_SET(si_ctlp, port)));
5283
5284	ddi_put32(si_ctlp->sictl_port_acc_handle,
5285	    (uint32_t *)PORT_INTERRUPT_ENABLE_SET(si_ctlp, port),
5286	    (INTR_COMMAND_COMPLETE |
5287	    INTR_COMMAND_ERROR |
5288	    INTR_PORT_READY |
5289	    INTR_POWER_CHANGE |
5290	    INTR_PHYRDY_CHANGE |
5291	    INTR_COMWAKE_RECEIVED |
5292	    INTR_UNRECOG_FIS |
5293	    INTR_DEV_XCHANGED |
5294	    INTR_SETDEVBITS_NOTIFY));
5295
5296	si_enable_port_interrupts(si_ctlp, port);
5297
5298	/*
5299	 * make sure interrupts are cleared
5300	 */
5301	port_intr_status = ddi_get32(si_ctlp->sictl_global_acc_handle,
5302	    (uint32_t *)PORT_INTERRUPT_STATUS(si_ctlp, port));
5303
5304	ddi_put32(si_ctlp->sictl_port_acc_handle,
5305	    (uint32_t *)(PORT_INTERRUPT_STATUS(si_ctlp,
5306	    port)),
5307	    port_intr_status & INTR_MASK);
5308
5309
5310	SIDBG0(SIDBG_POLL_LOOP, si_ctlp,
5311	    "si_reset_dport_wait_till_ready returning success");
5312
5313	return (SI_SUCCESS);
5314}
5315
5316/*
5317 * Initializes the port.
5318 *
5319 * Initialization effectively throws away all the pending commands on
5320 * the port. So, the caller  has to make provision to handle the pending
5321 * commands.
5322 *
5323 * After the port initialization, we wait till the port is ready again.
5324 *
5325 * WARNING, WARNING: The caller is expected to obtain the siport_mutex
5326 * before calling us.
5327 */
5328static int
5329si_initialize_port_wait_till_ready(si_ctl_state_t *si_ctlp, int port)
5330{
5331	uint32_t port_status;
5332	int loop_count = 0;
5333	uint32_t SStatus;
5334
5335	/* Initialize the port. */
5336	ddi_put32(si_ctlp->sictl_port_acc_handle,
5337	    (uint32_t *)PORT_CONTROL_SET(si_ctlp, port),
5338	    PORT_CONTROL_SET_BITS_PORT_INITIALIZE);
5339
5340	/* Wait until Port Ready */
5341	loop_count = 0;
5342	do {
5343		port_status = ddi_get32(si_ctlp->sictl_port_acc_handle,
5344		    (uint32_t *)PORT_STATUS(si_ctlp, port));
5345
5346		if (loop_count++ > SI_POLLRATE_PORTREADY) {
5347			SIDBG1(SIDBG_INTR, si_ctlp,
5348			    "si_initialize_port_wait is timing out: "
5349			    "port_status: %x",
5350			    port_status);
5351			/* We are effectively timing out after 0.5 sec. */
5352			break;
5353		}
5354
5355		/* Wait for 10 millisec */
5356#ifndef __lock_lint
5357		delay(SI_10MS_TICKS);
5358#endif /* __lock_lint */
5359
5360	} while (!(port_status & PORT_STATUS_BITS_PORT_READY));
5361
5362	SIDBG1(SIDBG_POLL_LOOP, si_ctlp,
5363	    "si_initialize_port_wait_till_ready: loop count: %d",
5364	    loop_count);
5365
5366	SStatus = ddi_get32(si_ctlp->sictl_port_acc_handle,
5367	    (uint32_t *)PORT_SSTATUS(si_ctlp, port));
5368
5369	if ((SSTATUS_GET_IPM(SStatus) == SSTATUS_IPM_INTERFACE_ACTIVE) &&
5370	    (SSTATUS_GET_DET(SStatus) ==
5371	    SSTATUS_DET_DEVPRESENT_PHYONLINE)) {
5372		/* The interface is active and the device is present */
5373		if (!(port_status & PORT_STATUS_BITS_PORT_READY)) {
5374			/* But the port is is not ready for some reason */
5375			return (SI_FAILURE);
5376		}
5377	}
5378
5379	return (SI_SUCCESS);
5380}
5381
5382
5383/*
5384 * si_watchdog_handler() calls us if it detects that there are some
5385 * commands which timed out. We recalculate the timed out commands once
5386 * again since some of them may have finished recently.
5387 */
5388static void
5389si_timeout_pkts(
5390	si_ctl_state_t *si_ctlp,
5391	si_port_state_t *si_portp,
5392	int port,
5393	uint32_t timedout_tags)
5394{
5395	uint32_t slot_status;
5396	uint32_t finished_tags;
5397
5398	SIDBG0(SIDBG_TIMEOUT|SIDBG_ENTRY, si_ctlp, "si_timeout_pkts entry");
5399
5400	mutex_enter(&si_portp->siport_mutex);
5401	slot_status = ddi_get32(si_ctlp->sictl_port_acc_handle,
5402	    (uint32_t *)(PORT_SLOT_STATUS(si_ctlp, port)));
5403
5404	si_portp->mopping_in_progress++;
5405
5406	/*
5407	 * Initialize the controller. The only way to timeout the commands
5408	 * is to reset or initialize the controller. We mop commands after
5409	 * the initialization.
5410	 */
5411	(void) si_initialize_port_wait_till_ready(si_ctlp, port);
5412
5413	/*
5414	 * Recompute the timedout tags since some of them may have finished
5415	 * meanwhile.
5416	 */
5417	finished_tags =  si_portp->siport_pending_tags &
5418	    ~slot_status & SI_SLOT_MASK;
5419	timedout_tags &= ~finished_tags;
5420
5421	SIDBG2(SIDBG_TIMEOUT, si_ctlp,
5422	    "si_timeout_pkts: finished: %x, timeout: %x",
5423	    finished_tags,
5424	    timedout_tags);
5425
5426	si_mop_commands(si_ctlp,
5427	    si_portp,
5428	    port,
5429	    slot_status,
5430	    0, /* failed_tags */
5431	    timedout_tags,
5432	    0, /* aborting_tags */
5433	    0);  /* reset_tags */
5434
5435	mutex_exit(&si_portp->siport_mutex);
5436}
5437
5438
5439
5440/*
5441 * Watchdog handler kicks in every 5 seconds to timeout any commands pending
5442 * for long time.
5443 */
5444static void
5445si_watchdog_handler(si_ctl_state_t *si_ctlp)
5446{
5447	uint32_t pending_tags = 0;
5448	uint32_t timedout_tags = 0;
5449	si_port_state_t *si_portp;
5450	int port;
5451	int tmpslot;
5452	sata_pkt_t *satapkt;
5453
5454	/* max number of cycles this packet should survive */
5455	int max_life_cycles;
5456
5457	/* how many cycles this packet survived so far */
5458	int watched_cycles;
5459
5460	mutex_enter(&si_ctlp->sictl_mutex);
5461	SIDBG0(SIDBG_TIMEOUT|SIDBG_ENTRY, si_ctlp,
5462	    "si_watchdog_handler entered");
5463
5464	for (port = 0; port < si_ctlp->sictl_num_ports; port++) {
5465
5466		si_portp = si_ctlp->sictl_ports[port];
5467		if (si_portp == NULL) {
5468			continue;
5469		}
5470
5471		mutex_enter(&si_portp->siport_mutex);
5472
5473		if (si_portp->siport_port_type == PORT_TYPE_NODEV) {
5474			mutex_exit(&si_portp->siport_mutex);
5475			continue;
5476		}
5477
5478		/* Skip the check for those ports in error recovery */
5479		if (si_portp->mopping_in_progress > 0) {
5480			SIDBG1(SIDBG_INFO, si_ctlp,
5481			    "si_watchdog_handler: port %d mopping "
5482			    "in progress, so just return", port);
5483			mutex_exit(&si_portp->siport_mutex);
5484			continue;
5485		}
5486
5487		pending_tags =  si_portp->siport_pending_tags;
5488		timedout_tags = 0;
5489		while (pending_tags) {
5490			tmpslot = ddi_ffs(pending_tags) - 1;
5491			if (tmpslot == -1) {
5492				break;
5493			}
5494			satapkt = si_portp->siport_slot_pkts[tmpslot];
5495
5496			if ((satapkt != NULL) && satapkt->satapkt_time) {
5497
5498				/*
5499				 * We are overloading satapkt_hba_driver_private
5500				 * with watched_cycle count.
5501				 *
5502				 * If a packet has survived for more than it's
5503				 * max life cycles, it is a candidate for time
5504				 * out.
5505				 */
5506				watched_cycles = (int)(intptr_t)
5507				    satapkt->satapkt_hba_driver_private;
5508				watched_cycles++;
5509				max_life_cycles = (satapkt->satapkt_time +
5510				    si_watchdog_timeout - 1) /
5511				    si_watchdog_timeout;
5512				if (watched_cycles > max_life_cycles) {
5513					timedout_tags |= (0x1 << tmpslot);
5514					SIDBG1(SIDBG_TIMEOUT|SIDBG_VERBOSE,
5515					    si_ctlp,
5516					    "watchdog: timedout_tags: 0x%x",
5517					    timedout_tags);
5518				}
5519				satapkt->satapkt_hba_driver_private =
5520				    (void *)(intptr_t)watched_cycles;
5521			}
5522
5523			CLEAR_BIT(pending_tags, tmpslot);
5524		}
5525
5526		if (timedout_tags) {
5527			mutex_exit(&si_portp->siport_mutex);
5528			mutex_exit(&si_ctlp->sictl_mutex);
5529			si_timeout_pkts(si_ctlp, si_portp, port, timedout_tags);
5530			mutex_enter(&si_ctlp->sictl_mutex);
5531			mutex_enter(&si_portp->siport_mutex);
5532		}
5533
5534		mutex_exit(&si_portp->siport_mutex);
5535	}
5536
5537	/* Reinstall the watchdog timeout handler. */
5538	if (!(si_ctlp->sictl_flags & SI_NO_TIMEOUTS)) {
5539		si_ctlp->sictl_timeout_id =
5540		    timeout((void (*)(void *))si_watchdog_handler,
5541		    (caddr_t)si_ctlp, si_watchdog_tick);
5542	}
5543	mutex_exit(&si_ctlp->sictl_mutex);
5544}
5545
5546/*
5547 * FMA Functions
5548 */
5549
5550/*
5551 * The IO fault service error handling callback function
5552 */
5553/*ARGSUSED*/
5554static int
5555si_fm_error_cb(dev_info_t *dip, ddi_fm_error_t *err, const void *impl_data)
5556{
5557	/*
5558	 * as the driver can always deal with an error in any dma or
5559	 * access handle, we can just return the fme_status value.
5560	 */
5561	pci_ereport_post(dip, err, NULL);
5562	return (err->fme_status);
5563}
5564
5565/*
5566 * si_fm_init - initialize fma capabilities and register with IO
5567 *              fault services.
5568 */
5569static void
5570si_fm_init(si_ctl_state_t *si_ctlp)
5571{
5572	/*
5573	 * Need to change iblock to priority for new MSI intr
5574	 */
5575	ddi_iblock_cookie_t fm_ibc;
5576
5577	/* Only register with IO Fault Services if we have some capability */
5578	if (si_ctlp->fm_capabilities) {
5579		/* Adjust access and dma attributes for FMA */
5580		accattr.devacc_attr_access = DDI_FLAGERR_ACC;
5581		prb_sgt_dma_attr.dma_attr_flags |= DDI_DMA_FLAGERR;
5582		buffer_dma_attr.dma_attr_flags |= DDI_DMA_FLAGERR;
5583
5584		/*
5585		 * Register capabilities with IO Fault Services.
5586		 * fm_capabilities will be updated to indicate
5587		 * capabilities actually supported (not requested.)
5588		 */
5589		ddi_fm_init(si_ctlp->sictl_devinfop, &si_ctlp->fm_capabilities,
5590		    &fm_ibc);
5591
5592		if (si_ctlp->fm_capabilities == DDI_FM_NOT_CAPABLE)
5593			cmn_err(CE_WARN, "si_fm_init: ddi_fm_init fail");
5594
5595		/*
5596		 * Initialize pci ereport capabilities if ereport
5597		 * capable (should always be.)
5598		 */
5599		if (DDI_FM_EREPORT_CAP(si_ctlp->fm_capabilities) ||
5600		    DDI_FM_ERRCB_CAP(si_ctlp->fm_capabilities)) {
5601			pci_ereport_setup(si_ctlp->sictl_devinfop);
5602		}
5603
5604		/*
5605		 * Register error callback if error callback capable.
5606		 */
5607		if (DDI_FM_ERRCB_CAP(si_ctlp->fm_capabilities)) {
5608			ddi_fm_handler_register(si_ctlp->sictl_devinfop,
5609			    si_fm_error_cb, (void *) si_ctlp);
5610		}
5611	}
5612}
5613
5614/*
5615 * si_fm_fini - Releases fma capabilities and un-registers with IO
5616 *              fault services.
5617 */
5618static void
5619si_fm_fini(si_ctl_state_t *si_ctlp)
5620{
5621	/* Only unregister FMA capabilities if registered */
5622	if (si_ctlp->fm_capabilities) {
5623		/*
5624		 * Un-register error callback if error callback capable.
5625		 */
5626		if (DDI_FM_ERRCB_CAP(si_ctlp->fm_capabilities)) {
5627			ddi_fm_handler_unregister(si_ctlp->sictl_devinfop);
5628		}
5629
5630		/*
5631		 * Release any resources allocated by pci_ereport_setup()
5632		 */
5633		if (DDI_FM_EREPORT_CAP(si_ctlp->fm_capabilities) ||
5634		    DDI_FM_ERRCB_CAP(si_ctlp->fm_capabilities)) {
5635			pci_ereport_teardown(si_ctlp->sictl_devinfop);
5636		}
5637
5638		/* Unregister from IO Fault Services */
5639		ddi_fm_fini(si_ctlp->sictl_devinfop);
5640
5641		/* Adjust access and dma attributes for FMA */
5642		accattr.devacc_attr_access = DDI_DEFAULT_ACC;
5643		prb_sgt_dma_attr.dma_attr_flags &= ~DDI_DMA_FLAGERR;
5644		buffer_dma_attr.dma_attr_flags &= ~DDI_DMA_FLAGERR;
5645	}
5646}
5647
5648static int
5649si_check_acc_handle(ddi_acc_handle_t handle)
5650{
5651	ddi_fm_error_t de;
5652
5653	ASSERT(handle != NULL);
5654	ddi_fm_acc_err_get(handle, &de, DDI_FME_VERSION);
5655	return (de.fme_status);
5656}
5657
5658static int
5659si_check_dma_handle(ddi_dma_handle_t handle)
5660{
5661	ddi_fm_error_t de;
5662
5663	ASSERT(handle != NULL);
5664	ddi_fm_dma_err_get(handle, &de, DDI_FME_VERSION);
5665	return (de.fme_status);
5666}
5667
5668static int
5669si_check_ctl_handles(si_ctl_state_t *si_ctlp)
5670{
5671	if ((si_check_acc_handle(si_ctlp->sictl_pci_conf_handle)
5672	    != DDI_SUCCESS) ||
5673	    (si_check_acc_handle(si_ctlp->sictl_global_acc_handle)
5674	    != DDI_SUCCESS) ||
5675	    (si_check_acc_handle(si_ctlp->sictl_port_acc_handle)
5676	    != DDI_SUCCESS)) {
5677		return (DDI_FAILURE);
5678	}
5679
5680	return (DDI_SUCCESS);
5681}
5682
5683/*
5684 * WARNING: The caller is expected to obtain the siport_mutex
5685 * before calling us.
5686 */
5687static int
5688si_check_port_handles(si_port_state_t *si_portp)
5689{
5690	if ((si_check_dma_handle(si_portp->siport_prbpool_dma_handle)
5691	    != DDI_SUCCESS) ||
5692	    (si_check_acc_handle(si_portp->siport_prbpool_acc_handle)
5693	    != DDI_SUCCESS) ||
5694	    (si_check_dma_handle(si_portp->siport_sgbpool_dma_handle)
5695	    != DDI_SUCCESS) ||
5696	    (si_check_acc_handle(si_portp->siport_sgbpool_acc_handle)
5697	    != DDI_SUCCESS)) {
5698		return (DDI_FAILURE);
5699	}
5700
5701	return (DDI_SUCCESS);
5702}
5703
5704static void
5705si_fm_ereport(si_ctl_state_t *si_ctlp, char *detail, char *payload)
5706{
5707	uint64_t ena;
5708	char buf[FM_MAX_CLASS];
5709
5710	(void) snprintf(buf, FM_MAX_CLASS, "%s.%s", DDI_FM_DEVICE, detail);
5711	ena = fm_ena_generate(0, FM_ENA_FMT1);
5712
5713	if (DDI_FM_EREPORT_CAP(si_ctlp->fm_capabilities)) {
5714		ddi_fm_ereport_post(si_ctlp->sictl_devinfop, buf, ena,
5715		    DDI_NOSLEEP,
5716		    FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERSION,
5717		    "detailed_err_type", DATA_TYPE_STRING, payload,
5718		    NULL);
5719	}
5720}
5721
5722#if SI_DEBUG
5723/*
5724 * Logs the message.
5725 */
5726static void
5727si_log(si_ctl_state_t *si_ctlp, uint_t level, char *fmt, ...)
5728{
5729	va_list ap;
5730
5731	mutex_enter(&si_log_mutex);
5732
5733	va_start(ap, fmt);
5734	if (si_ctlp) {
5735		(void) sprintf(si_log_buf, "%s-[%d]:",
5736		    ddi_get_name(si_ctlp->sictl_devinfop),
5737		    ddi_get_instance(si_ctlp->sictl_devinfop));
5738	} else {
5739		(void) sprintf(si_log_buf, "si3124:");
5740	}
5741	(void) vsprintf(si_log_buf, fmt, ap);
5742	va_end(ap);
5743
5744	cmn_err(level, "%s", si_log_buf);
5745
5746	mutex_exit(&si_log_mutex);
5747
5748}
5749#endif	/* SI_DEBUG */
5750
5751static void
5752si_copy_out_regs(sata_cmd_t *scmd, si_ctl_state_t *si_ctlp, uint8_t port,
5753	uint8_t slot)
5754{
5755	uint32_t *fis_word_ptr;
5756	si_prb_t *prb;
5757	int i;
5758
5759	/*
5760	 * The LRAM contains the the modified FIS after command completion, so
5761	 * first copy it back to the in-core PRB pool.  To save read cycles,
5762	 * just copy over the FIS portion of the PRB pool.
5763	 */
5764	prb =  &si_ctlp->sictl_ports[port]->siport_prbpool[slot];
5765
5766	fis_word_ptr = (uint32_t *)(void *)(&prb->prb_fis);
5767
5768	for (i = 0; i < (sizeof (fis_reg_h2d_t)/4); i++) {
5769		fis_word_ptr[i] = ddi_get32(
5770		    si_ctlp->sictl_port_acc_handle,
5771		    (uint32_t *)(PORT_LRAM(si_ctlp, port,
5772		    slot) + i * 4 + 0x08));
5773	}
5774
5775	/*
5776	 * always get the status register
5777	 */
5778	scmd->satacmd_status_reg = GET_FIS_COMMAND(prb->prb_fis);
5779
5780	DTRACE_PROBE1(satacmd_status_reg, int, scmd->satacmd_status_reg);
5781
5782	if (scmd->satacmd_flags.sata_copy_out_sec_count_msb) {
5783		scmd->satacmd_sec_count_msb =
5784		    GET_FIS_SECTOR_COUNT_EXP(prb->prb_fis);
5785		SIDBG1(SIDBG_VERBOSE, NULL,
5786		    "copyout satacmd_sec_count_msb %x\n",
5787		    scmd->satacmd_sec_count_msb);
5788	}
5789
5790	if (scmd->satacmd_flags.sata_copy_out_lba_low_msb) {
5791		scmd->satacmd_lba_low_msb = GET_FIS_SECTOR_EXP(prb->prb_fis);
5792		SIDBG1(SIDBG_VERBOSE, NULL, "copyout satacmd_lba_low_msb %x\n",
5793		    scmd->satacmd_lba_low_msb);
5794	}
5795
5796	if (scmd->satacmd_flags.sata_copy_out_lba_mid_msb) {
5797		scmd->satacmd_lba_mid_msb = GET_FIS_CYL_LOW_EXP(prb->prb_fis);
5798		SIDBG1(SIDBG_VERBOSE, NULL, "copyout satacmd_lba_mid_msb %x\n",
5799		    scmd->satacmd_lba_mid_msb);
5800	}
5801
5802	if (scmd->satacmd_flags.sata_copy_out_lba_high_msb) {
5803		scmd->satacmd_lba_high_msb = GET_FIS_CYL_HI_EXP(prb->prb_fis);
5804		SIDBG1(SIDBG_VERBOSE, NULL, "copyout satacmd_lba_high_msb %x\n",
5805		    scmd->satacmd_lba_high_msb);
5806	}
5807
5808	if (scmd->satacmd_flags.sata_copy_out_sec_count_lsb) {
5809		scmd->satacmd_sec_count_lsb =
5810		    GET_FIS_SECTOR_COUNT(prb->prb_fis);
5811		SIDBG1(SIDBG_VERBOSE, NULL,
5812		    "copyout satacmd_sec_count_lsb %x\n",
5813		    scmd->satacmd_sec_count_lsb);
5814	}
5815
5816	if (scmd->satacmd_flags.sata_copy_out_lba_low_lsb) {
5817		scmd->satacmd_lba_low_lsb = GET_FIS_SECTOR(prb->prb_fis);
5818		SIDBG1(SIDBG_VERBOSE, NULL, "copyout satacmd_lba_low_lsb %x\n",
5819		    scmd->satacmd_lba_low_lsb);
5820	}
5821
5822	if (scmd->satacmd_flags.sata_copy_out_lba_mid_lsb) {
5823		scmd->satacmd_lba_mid_lsb = GET_FIS_CYL_LOW(prb->prb_fis);
5824		SIDBG1(SIDBG_VERBOSE, NULL, "copyout satacmd_lba_mid_lsb %x\n",
5825		    scmd->satacmd_lba_mid_lsb);
5826	}
5827
5828	if (scmd->satacmd_flags.sata_copy_out_lba_high_lsb) {
5829		scmd->satacmd_lba_high_lsb = GET_FIS_CYL_HI(prb->prb_fis);
5830		SIDBG1(SIDBG_VERBOSE, NULL, "copyout satacmd_lba_high_lsb %x\n",
5831		    scmd->satacmd_lba_high_lsb);
5832	}
5833
5834	if (scmd->satacmd_flags.sata_copy_out_device_reg) {
5835		scmd->satacmd_device_reg = GET_FIS_DEV_HEAD(prb->prb_fis);
5836		SIDBG1(SIDBG_VERBOSE, NULL, "copyout satacmd_device_reg %x\n",
5837		    scmd->satacmd_device_reg);
5838	}
5839
5840	if (scmd->satacmd_flags.sata_copy_out_error_reg) {
5841		scmd->satacmd_error_reg = GET_FIS_FEATURES(prb->prb_fis);
5842		SIDBG1(SIDBG_VERBOSE, NULL, "copyout satacmd_error_reg %x\n",
5843		    scmd->satacmd_error_reg);
5844	}
5845}
5846
5847/*
5848 * This function clear the special port by send the PORT RESET
5849 * After reset was sent, all commands running on the port
5850 * is aborted
5851 */
5852static int
5853si_clear_port(si_ctl_state_t *si_ctlp, int port)
5854{
5855
5856	if (si_ctlp == NULL)
5857		return (SI_FAILURE);
5858	/*
5859	 * reset this port so that all existing command
5860	 * is clear
5861	 */
5862	ddi_put32(si_ctlp->sictl_port_acc_handle,
5863	    (uint32_t *)PORT_CONTROL_SET(si_ctlp, port),
5864	    PORT_CONTROL_SET_BITS_PORT_RESET);
5865
5866	/* Port reset is not self clearing. So clear it now. */
5867	ddi_put32(si_ctlp->sictl_port_acc_handle,
5868	    (uint32_t *)PORT_CONTROL_CLEAR(si_ctlp, port),
5869	    PORT_CONTROL_CLEAR_BITS_PORT_RESET);
5870	return (SI_SUCCESS);
5871}
5872
5873/*
5874 * quiesce(9E) entry point.
5875 * This function is called when the system is single-threaded at high
5876 * PIL with preemption disabled. Therefore, this function must not be
5877 * blocked.
5878 *
5879 * This function returns DDI_SUCCESS on success, or DDI_FAILURE on failure.
5880 * DDI_FAILURE indicates an error condition and should almost never happen.
5881 */
5882static int
5883si_quiesce(dev_info_t *dip)
5884{
5885	si_ctl_state_t *si_ctlp;
5886	int instance;
5887	int port;
5888
5889	SIDBG0(SIDBG_INIT|SIDBG_ENTRY, NULL, "si_quiesce enter");
5890	instance = ddi_get_instance(dip);
5891	si_ctlp = ddi_get_soft_state(si_statep, instance);
5892	if (si_ctlp == NULL)
5893		return (DDI_FAILURE);
5894
5895	/*
5896	 * Disable all the interrupts before quiesce
5897	 */
5898
5899	for (port = 0; port < si_ctlp->sictl_num_ports; port++) {
5900		si_disable_port_interrupts(si_ctlp, port);
5901		(void) si_clear_port(si_ctlp, port);
5902	}
5903
5904	return (DDI_SUCCESS);
5905}
5906