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) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
24  * Copyright 2011 Nexenta Systems, Inc.  All rights reserved.
25  */
26 
27 /*
28  *
29  * nv_sata is a combo SATA HBA driver for CK804/MCP04 (ck804) and
30  * MCP55/MCP51/MCP61 (mcp5x) based chipsets.
31  *
32  * NCQ
33  * ---
34  *
35  * A portion of the NCQ is in place, but is incomplete.  NCQ is disabled
36  * and is likely to be revisited in the future.
37  *
38  *
39  * Power Management
40  * ----------------
41  *
42  * Normally power management would be responsible for ensuring the device
43  * is quiescent and then changing power states to the device, such as
44  * powering down parts or all of the device.  mcp5x/ck804 is unique in
45  * that it is only available as part of a larger southbridge chipset, so
46  * removing power to the device isn't possible.  Switches to control
47  * power management states D0/D3 in the PCI configuration space appear to
48  * be supported but changes to these states are apparently are ignored.
49  * The only further PM that the driver _could_ do is shut down the PHY,
50  * but in order to deliver the first rev of the driver sooner than later,
51  * that will be deferred until some future phase.
52  *
53  * Since the driver currently will not directly change any power state to
54  * the device, no power() entry point will be required.  However, it is
55  * possible that in ACPI power state S3, aka suspend to RAM, that power
56  * can be removed to the device, and the driver cannot rely on BIOS to
57  * have reset any state.  For the time being, there is no known
58  * non-default configurations that need to be programmed.  This judgement
59  * is based on the port of the legacy ata driver not having any such
60  * functionality and based on conversations with the PM team.  If such a
61  * restoration is later deemed necessary it can be incorporated into the
62  * DDI_RESUME processing.
63  *
64  */
65 
66 #include <sys/scsi/scsi.h>
67 #include <sys/pci.h>
68 #include <sys/byteorder.h>
69 #include <sys/sunddi.h>
70 #include <sys/sata/sata_hba.h>
71 #ifdef SGPIO_SUPPORT
72 #include <sys/sata/adapters/nv_sata/nv_sgpio.h>
73 #include <sys/devctl.h>
74 #include <sys/sdt.h>
75 #endif
76 #include <sys/sata/adapters/nv_sata/nv_sata.h>
77 #include <sys/disp.h>
78 #include <sys/note.h>
79 #include <sys/promif.h>
80 
81 
82 /*
83  * Function prototypes for driver entry points
84  */
85 static int nv_attach(dev_info_t *dip, ddi_attach_cmd_t cmd);
86 static int nv_detach(dev_info_t *dip, ddi_detach_cmd_t cmd);
87 static int nv_quiesce(dev_info_t *dip);
88 static int nv_getinfo(dev_info_t *dip, ddi_info_cmd_t infocmd,
89     void *arg, void **result);
90 
91 /*
92  * Function prototypes for entry points from sata service module
93  * These functions are distinguished from other local functions
94  * by the prefix "nv_sata_"
95  */
96 static int nv_sata_start(dev_info_t *dip, sata_pkt_t *spkt);
97 static int nv_sata_abort(dev_info_t *dip, sata_pkt_t *spkt, int);
98 static int nv_sata_reset(dev_info_t *dip, sata_device_t *sd);
99 static int nv_sata_activate(dev_info_t *dip, sata_device_t *sd);
100 static int nv_sata_deactivate(dev_info_t *dip, sata_device_t *sd);
101 
102 /*
103  * Local function prototypes
104  */
105 static uint_t mcp5x_intr(caddr_t arg1, caddr_t arg2);
106 static uint_t ck804_intr(caddr_t arg1, caddr_t arg2);
107 static int nv_add_legacy_intrs(nv_ctl_t *nvc);
108 #ifdef NV_MSI_SUPPORTED
109 static int nv_add_msi_intrs(nv_ctl_t *nvc);
110 #endif
111 static void nv_rem_intrs(nv_ctl_t *nvc);
112 static int nv_start_common(nv_port_t *nvp, sata_pkt_t *spkt);
113 static int nv_start_nodata(nv_port_t *nvp, int slot);
114 static void nv_intr_nodata(nv_port_t *nvp, nv_slot_t *spkt);
115 static int nv_start_pio_in(nv_port_t *nvp, int slot);
116 static int nv_start_pio_out(nv_port_t *nvp, int slot);
117 static void nv_intr_pio_in(nv_port_t *nvp, nv_slot_t *spkt);
118 static void nv_intr_pio_out(nv_port_t *nvp, nv_slot_t *spkt);
119 static int nv_start_pkt_pio(nv_port_t *nvp, int slot);
120 static void nv_intr_pkt_pio(nv_port_t *nvp, nv_slot_t *nv_slotp);
121 static int nv_start_dma(nv_port_t *nvp, int slot);
122 static void nv_intr_dma(nv_port_t *nvp, struct nv_slot *spkt);
123 static void nv_uninit_ctl(nv_ctl_t *nvc);
124 static void mcp5x_reg_init(nv_ctl_t *nvc, ddi_acc_handle_t pci_conf_handle);
125 static void ck804_reg_init(nv_ctl_t *nvc, ddi_acc_handle_t pci_conf_handle);
126 static void nv_uninit_port(nv_port_t *nvp);
127 static void nv_init_port(nv_port_t *nvp);
128 static int nv_init_ctl(nv_ctl_t *nvc, ddi_acc_handle_t pci_conf_handle);
129 static int mcp5x_packet_complete_intr(nv_ctl_t *nvc, nv_port_t *nvp);
130 #ifdef NCQ
131 static int mcp5x_dma_setup_intr(nv_ctl_t *nvc, nv_port_t *nvp);
132 #endif
133 static void nv_start_dma_engine(nv_port_t *nvp, int slot);
134 static void nv_port_state_change(nv_port_t *nvp, int event, uint8_t addr_type,
135     int state);
136 static void nv_common_reg_init(nv_ctl_t *nvc);
137 static void ck804_intr_process(nv_ctl_t *nvc, uint8_t intr_status);
138 static void nv_reset(nv_port_t *nvp, char *reason);
139 static void nv_complete_io(nv_port_t *nvp,  sata_pkt_t *spkt, int slot);
140 static void nv_timeout(void *);
141 static int nv_poll_wait(nv_port_t *nvp, sata_pkt_t *spkt);
142 static void nv_cmn_err(int ce, nv_ctl_t *nvc, nv_port_t *nvp, char *fmt, ...);
143 static void nv_read_signature(nv_port_t *nvp);
144 static void mcp5x_set_intr(nv_port_t *nvp, int flag);
145 static void ck804_set_intr(nv_port_t *nvp, int flag);
146 static void nv_resume(nv_port_t *nvp);
147 static void nv_suspend(nv_port_t *nvp);
148 static int nv_start_sync(nv_port_t *nvp, sata_pkt_t *spkt);
149 static int nv_abort_active(nv_port_t *nvp, sata_pkt_t *spkt, int abort_reason,
150     boolean_t reset);
151 static void nv_copy_registers(nv_port_t *nvp, sata_device_t *sd,
152     sata_pkt_t *spkt);
153 static void nv_link_event(nv_port_t *nvp, int flags);
154 static int nv_start_async(nv_port_t *nvp, sata_pkt_t *spkt);
155 static int nv_wait3(nv_port_t *nvp, uchar_t onbits1, uchar_t offbits1,
156     uchar_t failure_onbits2, uchar_t failure_offbits2,
157     uchar_t failure_onbits3, uchar_t failure_offbits3,
158     uint_t timeout_usec, int type_wait);
159 static int nv_wait(nv_port_t *nvp, uchar_t onbits, uchar_t offbits,
160     uint_t timeout_usec, int type_wait);
161 static int nv_start_rqsense_pio(nv_port_t *nvp, nv_slot_t *nv_slotp);
162 static void nv_setup_timeout(nv_port_t *nvp, clock_t microseconds);
163 static clock_t nv_monitor_reset(nv_port_t *nvp);
164 static int nv_bm_status_clear(nv_port_t *nvp);
165 static void nv_log(nv_ctl_t *nvc, nv_port_t *nvp, const char *fmt, ...);
166 
167 #ifdef SGPIO_SUPPORT
168 static int nv_open(dev_t *devp, int flag, int otyp, cred_t *credp);
169 static int nv_close(dev_t dev, int flag, int otyp, cred_t *credp);
170 static int nv_ioctl(dev_t dev, int cmd, intptr_t arg, int mode,
171     cred_t *credp, int *rvalp);
172 
173 static void nv_sgp_led_init(nv_ctl_t *nvc, ddi_acc_handle_t pci_conf_handle);
174 static int nv_sgp_detect(ddi_acc_handle_t pci_conf_handle, uint16_t *csrpp,
175     uint32_t *cbpp);
176 static int nv_sgp_init(nv_ctl_t *nvc);
177 static int nv_sgp_check_set_cmn(nv_ctl_t *nvc);
178 static int nv_sgp_csr_read(nv_ctl_t *nvc);
179 static void nv_sgp_csr_write(nv_ctl_t *nvc, uint32_t val);
180 static int nv_sgp_write_data(nv_ctl_t *nvc);
181 static void nv_sgp_activity_led_ctl(void *arg);
182 static void nv_sgp_drive_connect(nv_ctl_t *nvc, int drive);
183 static void nv_sgp_drive_disconnect(nv_ctl_t *nvc, int drive);
184 static void nv_sgp_drive_active(nv_ctl_t *nvc, int drive);
185 static void nv_sgp_locate(nv_ctl_t *nvc, int drive, int value);
186 static void nv_sgp_error(nv_ctl_t *nvc, int drive, int value);
187 static void nv_sgp_cleanup(nv_ctl_t *nvc);
188 #endif
189 
190 
191 /*
192  * DMA attributes for the data buffer for x86.  dma_attr_burstsizes is unused.
193  * Verify if needed if ported to other ISA.
194  */
195 static ddi_dma_attr_t buffer_dma_attr = {
196 	DMA_ATTR_V0,		/* dma_attr_version */
197 	0,			/* dma_attr_addr_lo: lowest bus address */
198 	0xffffffffull,		/* dma_attr_addr_hi: */
199 	NV_BM_64K_BOUNDARY - 1,	/* dma_attr_count_max i.e for one cookie */
200 	4,			/* dma_attr_align */
201 	1,			/* dma_attr_burstsizes. */
202 	1,			/* dma_attr_minxfer */
203 	0xffffffffull,		/* dma_attr_maxxfer including all cookies */
204 	0xffffffffull,		/* dma_attr_seg */
205 	NV_DMA_NSEGS,		/* dma_attr_sgllen */
206 	512,			/* dma_attr_granular */
207 	0,			/* dma_attr_flags */
208 };
209 static ddi_dma_attr_t buffer_dma_40bit_attr = {
210 	DMA_ATTR_V0,		/* dma_attr_version */
211 	0,			/* dma_attr_addr_lo: lowest bus address */
212 	0xffffffffffull,	/* dma_attr_addr_hi: */
213 	NV_BM_64K_BOUNDARY - 1,	/* dma_attr_count_max i.e for one cookie */
214 	4,			/* dma_attr_align */
215 	1,			/* dma_attr_burstsizes. */
216 	1,			/* dma_attr_minxfer */
217 	0xffffffffull,		/* dma_attr_maxxfer including all cookies */
218 	0xffffffffull,		/* dma_attr_seg */
219 	NV_DMA_NSEGS,		/* dma_attr_sgllen */
220 	512,			/* dma_attr_granular */
221 	0,			/* dma_attr_flags */
222 };
223 
224 
225 /*
226  * DMA attributes for PRD tables
227  */
228 ddi_dma_attr_t nv_prd_dma_attr = {
229 	DMA_ATTR_V0,		/* dma_attr_version */
230 	0,			/* dma_attr_addr_lo */
231 	0xffffffffull,		/* dma_attr_addr_hi */
232 	NV_BM_64K_BOUNDARY - 1,	/* dma_attr_count_max */
233 	4,			/* dma_attr_align */
234 	1,			/* dma_attr_burstsizes */
235 	1,			/* dma_attr_minxfer */
236 	NV_BM_64K_BOUNDARY,	/* dma_attr_maxxfer */
237 	NV_BM_64K_BOUNDARY - 1,	/* dma_attr_seg */
238 	1,			/* dma_attr_sgllen */
239 	1,			/* dma_attr_granular */
240 	0			/* dma_attr_flags */
241 };
242 
243 /*
244  * Device access attributes
245  */
246 static ddi_device_acc_attr_t accattr = {
247     DDI_DEVICE_ATTR_V0,
248     DDI_STRUCTURE_LE_ACC,
249     DDI_STRICTORDER_ACC
250 };
251 
252 
253 #ifdef SGPIO_SUPPORT
254 static struct cb_ops nv_cb_ops = {
255 	nv_open,		/* open */
256 	nv_close,		/* close */
257 	nodev,			/* strategy (block) */
258 	nodev,			/* print (block) */
259 	nodev,			/* dump (block) */
260 	nodev,			/* read */
261 	nodev,			/* write */
262 	nv_ioctl,		/* ioctl */
263 	nodev,			/* devmap */
264 	nodev,			/* mmap */
265 	nodev,			/* segmap */
266 	nochpoll,		/* chpoll */
267 	ddi_prop_op,		/* prop_op */
268 	NULL,			/* streams */
269 	D_NEW | D_MP |
270 	D_64BIT | D_HOTPLUG,	/* flags */
271 	CB_REV			/* rev */
272 };
273 #endif  /* SGPIO_SUPPORT */
274 
275 
276 static struct dev_ops nv_dev_ops = {
277 	DEVO_REV,		/* devo_rev */
278 	0,			/* refcnt  */
279 	nv_getinfo,		/* info */
280 	nulldev,		/* identify */
281 	nulldev,		/* probe */
282 	nv_attach,		/* attach */
283 	nv_detach,		/* detach */
284 	nodev,			/* no reset */
285 #ifdef SGPIO_SUPPORT
286 	&nv_cb_ops,		/* driver operations */
287 #else
288 	(struct cb_ops *)0,	/* driver operations */
289 #endif
290 	NULL,			/* bus operations */
291 	NULL,			/* power */
292 	nv_quiesce		/* quiesce */
293 };
294 
295 
296 /*
297  * Request Sense CDB for ATAPI
298  */
299 static const uint8_t nv_rqsense_cdb[16] = {
300 	SCMD_REQUEST_SENSE,
301 	0,
302 	0,
303 	0,
304 	SATA_ATAPI_MIN_RQSENSE_LEN,
305 	0,
306 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0	/* pad out to max CDB length */
307 };
308 
309 
310 static sata_tran_hotplug_ops_t nv_hotplug_ops;
311 
312 extern struct mod_ops mod_driverops;
313 
314 static  struct modldrv modldrv = {
315 	&mod_driverops,	/* driverops */
316 	"NVIDIA CK804/MCP04/MCP51/MCP55/MCP61 HBA",
317 	&nv_dev_ops,	/* driver ops */
318 };
319 
320 static  struct modlinkage modlinkage = {
321 	MODREV_1,
322 	&modldrv,
323 	NULL
324 };
325 
326 /*
327  * Maximum number of consecutive interrupts processed in the loop in the
328  * single invocation of the port interrupt routine.
329  */
330 int nv_max_intr_loops = NV_MAX_INTR_PER_DEV;
331 
332 /*
333  * wait between checks of reg status
334  */
335 int nv_usec_delay = NV_WAIT_REG_CHECK;
336 
337 /*
338  * The following used for nv_vcmn_err() and nv_log()
339  */
340 
341 /*
342  * temp buffer to save from wasting limited stack space
343  */
344 static char nv_log_buf[NV_LOGBUF_LEN];
345 
346 /*
347  * protects nv_log_buf
348  */
349 static kmutex_t nv_log_mutex;
350 
351 /*
352  * these on-by-default flags were chosen so that the driver
353  * logs as much non-usual run-time information as possible
354  * without overflowing the ring with useless information or
355  * causing any significant performance penalty.
356  */
357 int nv_debug_flags =
358     NVDBG_HOT|NVDBG_RESET|NVDBG_ALWAYS|NVDBG_TIMEOUT|NVDBG_EVENT;
359 
360 /*
361  * normally debug information is not logged to the console
362  * but this allows it to be enabled.
363  */
364 int nv_log_to_console = B_FALSE;
365 
366 /*
367  * normally debug information is not logged to cmn_err but
368  * in some cases it may be desired.
369  */
370 int nv_log_to_cmn_err = B_FALSE;
371 
372 /*
373  * using prom print avoids using cmn_err/syslog and goes right
374  * to the console which may be desirable in some situations, but
375  * it may be synchronous, which would change timings and
376  * impact performance.  Use with caution.
377  */
378 int nv_prom_print = B_FALSE;
379 
380 /*
381  * Opaque state pointer to be initialized by ddi_soft_state_init()
382  */
383 static void *nv_statep	= NULL;
384 
385 /*
386  * Map from CBP to shared space
387  *
388  * When a MCP55/IO55 parts supports SGPIO, there is a single CBP (SGPIO
389  * Control Block Pointer as well as the corresponding Control Block) that
390  * is shared across all driver instances associated with that part.  The
391  * Control Block is used to update and query the LED state for the devices
392  * on the controllers associated with those instances.  There is also some
393  * driver state (called the 'common' area here) associated with each SGPIO
394  * Control Block.  The nv_sgp_cpb2cmn is used to map a given CBP to its
395  * control area.
396  *
397  * The driver can also use this mapping array to determine whether the
398  * common area for a given CBP has been initialized, and, if it isn't
399  * initialized, initialize it.
400  *
401  * When a driver instance with a CBP value that is already in the array is
402  * initialized, it will use the pointer to the previously initialized common
403  * area associated with that SGPIO CBP value, rather than initialize it
404  * itself.
405  *
406  * nv_sgp_c2c_mutex is used to synchronize access to this mapping array.
407  */
408 #ifdef SGPIO_SUPPORT
409 static kmutex_t nv_sgp_c2c_mutex;
410 static struct nv_sgp_cbp2cmn nv_sgp_cbp2cmn[NV_MAX_CBPS];
411 #endif
412 
413 /*
414  * control whether 40bit DMA is used or not
415  */
416 int nv_sata_40bit_dma = B_TRUE;
417 
418 static sata_tran_hotplug_ops_t nv_hotplug_ops = {
419 	SATA_TRAN_HOTPLUG_OPS_REV_1,	/* structure version */
420 	nv_sata_activate,	/* activate port. cfgadm -c connect */
421 	nv_sata_deactivate	/* deactivate port. cfgadm -c disconnect */
422 };
423 
424 
425 /*
426  *  nv module initialization
427  */
428 int
_init(void)429 _init(void)
430 {
431 	int	error;
432 #ifdef SGPIO_SUPPORT
433 	int	i;
434 #endif
435 
436 	error = ddi_soft_state_init(&nv_statep, sizeof (nv_ctl_t), 0);
437 
438 	if (error != 0) {
439 
440 		return (error);
441 	}
442 
443 	mutex_init(&nv_log_mutex, NULL, MUTEX_DRIVER, NULL);
444 #ifdef SGPIO_SUPPORT
445 	mutex_init(&nv_sgp_c2c_mutex, NULL, MUTEX_DRIVER, NULL);
446 
447 	for (i = 0; i < NV_MAX_CBPS; i++) {
448 		nv_sgp_cbp2cmn[i].c2cm_cbp = 0;
449 		nv_sgp_cbp2cmn[i].c2cm_cmn = NULL;
450 	}
451 #endif
452 
453 	if ((error = sata_hba_init(&modlinkage)) != 0) {
454 		ddi_soft_state_fini(&nv_statep);
455 		mutex_destroy(&nv_log_mutex);
456 
457 		return (error);
458 	}
459 
460 	error = mod_install(&modlinkage);
461 	if (error != 0) {
462 		sata_hba_fini(&modlinkage);
463 		ddi_soft_state_fini(&nv_statep);
464 		mutex_destroy(&nv_log_mutex);
465 
466 		return (error);
467 	}
468 
469 	return (error);
470 }
471 
472 
473 /*
474  * nv module uninitialize
475  */
476 int
_fini(void)477 _fini(void)
478 {
479 	int	error;
480 
481 	error = mod_remove(&modlinkage);
482 
483 	if (error != 0) {
484 		return (error);
485 	}
486 
487 	/*
488 	 * remove the resources allocated in _init()
489 	 */
490 	mutex_destroy(&nv_log_mutex);
491 #ifdef SGPIO_SUPPORT
492 	mutex_destroy(&nv_sgp_c2c_mutex);
493 #endif
494 	sata_hba_fini(&modlinkage);
495 	ddi_soft_state_fini(&nv_statep);
496 
497 	return (error);
498 }
499 
500 
501 /*
502  * nv _info entry point
503  */
504 int
_info(struct modinfo * modinfop)505 _info(struct modinfo *modinfop)
506 {
507 	return (mod_info(&modlinkage, modinfop));
508 }
509 
510 
511 /*
512  * these wrappers for ddi_{get,put}8 are for observability
513  * with dtrace
514  */
515 #ifdef DEBUG
516 
517 static void
nv_put8(ddi_acc_handle_t handle,uint8_t * dev_addr,uint8_t value)518 nv_put8(ddi_acc_handle_t handle, uint8_t *dev_addr, uint8_t value)
519 {
520 	ddi_put8(handle, dev_addr, value);
521 }
522 
523 static void
nv_put32(ddi_acc_handle_t handle,uint32_t * dev_addr,uint32_t value)524 nv_put32(ddi_acc_handle_t handle, uint32_t *dev_addr, uint32_t value)
525 {
526 	ddi_put32(handle, dev_addr, value);
527 }
528 
529 static uint32_t
nv_get32(ddi_acc_handle_t handle,uint32_t * dev_addr)530 nv_get32(ddi_acc_handle_t handle, uint32_t *dev_addr)
531 {
532 	return (ddi_get32(handle, dev_addr));
533 }
534 
535 static void
nv_put16(ddi_acc_handle_t handle,uint16_t * dev_addr,uint16_t value)536 nv_put16(ddi_acc_handle_t handle, uint16_t *dev_addr, uint16_t value)
537 {
538 	ddi_put16(handle, dev_addr, value);
539 }
540 
541 static uint16_t
nv_get16(ddi_acc_handle_t handle,uint16_t * dev_addr)542 nv_get16(ddi_acc_handle_t handle, uint16_t *dev_addr)
543 {
544 	return (ddi_get16(handle, dev_addr));
545 }
546 
547 static uint8_t
nv_get8(ddi_acc_handle_t handle,uint8_t * dev_addr)548 nv_get8(ddi_acc_handle_t handle, uint8_t *dev_addr)
549 {
550 	return (ddi_get8(handle, dev_addr));
551 }
552 
553 #else
554 
555 #define	nv_put8 ddi_put8
556 #define	nv_put32 ddi_put32
557 #define	nv_get32 ddi_get32
558 #define	nv_put16 ddi_put16
559 #define	nv_get16 ddi_get16
560 #define	nv_get8 ddi_get8
561 
562 #endif
563 
564 
565 /*
566  * Driver attach
567  */
568 static int
nv_attach(dev_info_t * dip,ddi_attach_cmd_t cmd)569 nv_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
570 {
571 	int status, attach_state, intr_types, bar, i, j, command;
572 	int inst = ddi_get_instance(dip);
573 	ddi_acc_handle_t pci_conf_handle;
574 	nv_ctl_t *nvc;
575 	uint8_t subclass;
576 	uint32_t reg32;
577 #ifdef SGPIO_SUPPORT
578 	pci_regspec_t *regs;
579 	int rlen;
580 #endif
581 
582 	switch (cmd) {
583 
584 	case DDI_ATTACH:
585 
586 		attach_state = ATTACH_PROGRESS_NONE;
587 
588 		status = ddi_soft_state_zalloc(nv_statep, inst);
589 
590 		if (status != DDI_SUCCESS) {
591 			break;
592 		}
593 
594 		nvc = ddi_get_soft_state(nv_statep, inst);
595 
596 		nvc->nvc_dip = dip;
597 
598 		NVLOG(NVDBG_INIT, nvc, NULL, "nv_attach(): DDI_ATTACH", NULL);
599 
600 		attach_state |= ATTACH_PROGRESS_STATEP_ALLOC;
601 
602 		if (pci_config_setup(dip, &pci_conf_handle) == DDI_SUCCESS) {
603 			nvc->nvc_devid = pci_config_get16(pci_conf_handle,
604 			    PCI_CONF_DEVID);
605 			nvc->nvc_revid = pci_config_get8(pci_conf_handle,
606 			    PCI_CONF_REVID);
607 			NVLOG(NVDBG_INIT, nvc, NULL,
608 			    "inst %d: devid is %x silicon revid is %x"
609 			    " nv_debug_flags=%x", inst, nvc->nvc_devid,
610 			    nvc->nvc_revid, nv_debug_flags);
611 		} else {
612 			break;
613 		}
614 
615 		attach_state |= ATTACH_PROGRESS_CONF_HANDLE;
616 
617 		/*
618 		 * Set the PCI command register: enable IO/MEM/Master.
619 		 */
620 		command = pci_config_get16(pci_conf_handle, PCI_CONF_COMM);
621 		pci_config_put16(pci_conf_handle, PCI_CONF_COMM,
622 		    command|PCI_COMM_IO|PCI_COMM_MAE|PCI_COMM_ME);
623 
624 		subclass = pci_config_get8(pci_conf_handle, PCI_CONF_SUBCLASS);
625 
626 		if (subclass & PCI_MASS_RAID) {
627 			cmn_err(CE_WARN,
628 			    "attach failed: RAID mode not supported");
629 
630 			break;
631 		}
632 
633 		/*
634 		 * the 6 bars of the controller are:
635 		 * 0: port 0 task file
636 		 * 1: port 0 status
637 		 * 2: port 1 task file
638 		 * 3: port 1 status
639 		 * 4: bus master for both ports
640 		 * 5: extended registers for SATA features
641 		 */
642 		for (bar = 0; bar < 6; bar++) {
643 			status = ddi_regs_map_setup(dip, bar + 1,
644 			    (caddr_t *)&nvc->nvc_bar_addr[bar], 0, 0, &accattr,
645 			    &nvc->nvc_bar_hdl[bar]);
646 
647 			if (status != DDI_SUCCESS) {
648 				NVLOG(NVDBG_INIT, nvc, NULL,
649 				    "ddi_regs_map_setup failure for bar"
650 				    " %d status = %d", bar, status);
651 				break;
652 			}
653 		}
654 
655 		attach_state |= ATTACH_PROGRESS_BARS;
656 
657 		/*
658 		 * initialize controller structures
659 		 */
660 		status = nv_init_ctl(nvc, pci_conf_handle);
661 
662 		if (status == NV_FAILURE) {
663 			NVLOG(NVDBG_INIT, nvc, NULL, "nv_init_ctl failed",
664 			    NULL);
665 
666 			break;
667 		}
668 
669 		attach_state |= ATTACH_PROGRESS_CTL_SETUP;
670 
671 		/*
672 		 * initialize mutexes
673 		 */
674 		mutex_init(&nvc->nvc_mutex, NULL, MUTEX_DRIVER,
675 		    DDI_INTR_PRI(nvc->nvc_intr_pri));
676 
677 		attach_state |= ATTACH_PROGRESS_MUTEX_INIT;
678 
679 		/*
680 		 * get supported interrupt types
681 		 */
682 		if (ddi_intr_get_supported_types(dip, &intr_types) !=
683 		    DDI_SUCCESS) {
684 			nv_cmn_err(CE_WARN, nvc, NULL,
685 			    "ddi_intr_get_supported_types failed");
686 
687 			break;
688 		}
689 
690 		NVLOG(NVDBG_INIT, nvc, NULL,
691 		    "ddi_intr_get_supported_types() returned: 0x%x",
692 		    intr_types);
693 
694 #ifdef NV_MSI_SUPPORTED
695 		if (intr_types & DDI_INTR_TYPE_MSI) {
696 			NVLOG(NVDBG_INIT, nvc, NULL,
697 			    "using MSI interrupt type", NULL);
698 
699 			/*
700 			 * Try MSI first, but fall back to legacy if MSI
701 			 * attach fails
702 			 */
703 			if (nv_add_msi_intrs(nvc) == DDI_SUCCESS) {
704 				nvc->nvc_intr_type = DDI_INTR_TYPE_MSI;
705 				attach_state |= ATTACH_PROGRESS_INTR_ADDED;
706 				NVLOG(NVDBG_INIT, nvc, NULL,
707 				    "MSI interrupt setup done", NULL);
708 			} else {
709 				nv_cmn_err(CE_CONT, nvc, NULL,
710 				    "MSI registration failed "
711 				    "will try Legacy interrupts");
712 			}
713 		}
714 #endif
715 
716 		/*
717 		 * Either the MSI interrupt setup has failed or only
718 		 * the fixed interrupts are available on the system.
719 		 */
720 		if (!(attach_state & ATTACH_PROGRESS_INTR_ADDED) &&
721 		    (intr_types & DDI_INTR_TYPE_FIXED)) {
722 
723 			NVLOG(NVDBG_INIT, nvc, NULL,
724 			    "using Legacy interrupt type", NULL);
725 
726 			if (nv_add_legacy_intrs(nvc) == DDI_SUCCESS) {
727 				nvc->nvc_intr_type = DDI_INTR_TYPE_FIXED;
728 				attach_state |= ATTACH_PROGRESS_INTR_ADDED;
729 				NVLOG(NVDBG_INIT, nvc, NULL,
730 				    "Legacy interrupt setup done", NULL);
731 			} else {
732 				nv_cmn_err(CE_WARN, nvc, NULL,
733 				    "legacy interrupt setup failed");
734 				NVLOG(NVDBG_INIT, nvc, NULL,
735 				    "legacy interrupt setup failed", NULL);
736 				break;
737 			}
738 		}
739 
740 		if (!(attach_state & ATTACH_PROGRESS_INTR_ADDED)) {
741 			NVLOG(NVDBG_INIT, nvc, NULL,
742 			    "no interrupts registered", NULL);
743 			break;
744 		}
745 
746 #ifdef SGPIO_SUPPORT
747 		/*
748 		 * save off the controller number
749 		 */
750 		(void) ddi_getlongprop(DDI_DEV_T_NONE, dip, DDI_PROP_DONTPASS,
751 		    "reg", (caddr_t)&regs, &rlen);
752 		nvc->nvc_ctlr_num = PCI_REG_FUNC_G(regs->pci_phys_hi);
753 		kmem_free(regs, rlen);
754 
755 		/*
756 		 * initialize SGPIO
757 		 */
758 		nv_sgp_led_init(nvc, pci_conf_handle);
759 #endif	/* SGPIO_SUPPORT */
760 
761 		/*
762 		 * Do initial reset so that signature can be gathered
763 		 */
764 		for (j = 0; j < NV_NUM_PORTS; j++) {
765 			ddi_acc_handle_t bar5_hdl;
766 			uint32_t sstatus;
767 			nv_port_t *nvp;
768 
769 			nvp = &(nvc->nvc_port[j]);
770 			bar5_hdl = nvp->nvp_ctlp->nvc_bar_hdl[5];
771 			sstatus = ddi_get32(bar5_hdl, nvp->nvp_sstatus);
772 
773 			if (SSTATUS_GET_DET(sstatus) ==
774 			    SSTATUS_DET_DEVPRE_PHYCOM) {
775 
776 				nvp->nvp_state |= NV_ATTACH;
777 				nvp->nvp_type = SATA_DTYPE_UNKNOWN;
778 				mutex_enter(&nvp->nvp_mutex);
779 				nv_reset(nvp, "attach");
780 
781 				while (nvp->nvp_state & NV_RESET) {
782 					cv_wait(&nvp->nvp_reset_cv,
783 					    &nvp->nvp_mutex);
784 				}
785 
786 				mutex_exit(&nvp->nvp_mutex);
787 			}
788 		}
789 
790 		/*
791 		 * attach to sata module
792 		 */
793 		if (sata_hba_attach(nvc->nvc_dip,
794 		    &nvc->nvc_sata_hba_tran,
795 		    DDI_ATTACH) != DDI_SUCCESS) {
796 			attach_state |= ATTACH_PROGRESS_SATA_MODULE;
797 
798 			break;
799 		}
800 
801 		pci_config_teardown(&pci_conf_handle);
802 
803 		NVLOG(NVDBG_INIT, nvc, NULL, "nv_attach DDI_SUCCESS", NULL);
804 
805 		return (DDI_SUCCESS);
806 
807 	case DDI_RESUME:
808 
809 		nvc = ddi_get_soft_state(nv_statep, inst);
810 
811 		NVLOG(NVDBG_INIT, nvc, NULL,
812 		    "nv_attach(): DDI_RESUME inst %d", inst);
813 
814 		if (pci_config_setup(dip, &pci_conf_handle) != DDI_SUCCESS) {
815 			return (DDI_FAILURE);
816 		}
817 
818 		/*
819 		 * Set the PCI command register: enable IO/MEM/Master.
820 		 */
821 		command = pci_config_get16(pci_conf_handle, PCI_CONF_COMM);
822 		pci_config_put16(pci_conf_handle, PCI_CONF_COMM,
823 		    command|PCI_COMM_IO|PCI_COMM_MAE|PCI_COMM_ME);
824 
825 		/*
826 		 * Need to set bit 2 to 1 at config offset 0x50
827 		 * to enable access to the bar5 registers.
828 		 */
829 		reg32 = pci_config_get32(pci_conf_handle, NV_SATA_CFG_20);
830 
831 		if ((reg32 & NV_BAR5_SPACE_EN) != NV_BAR5_SPACE_EN) {
832 			pci_config_put32(pci_conf_handle, NV_SATA_CFG_20,
833 			    reg32 | NV_BAR5_SPACE_EN);
834 		}
835 
836 		nvc->nvc_state &= ~NV_CTRL_SUSPEND;
837 
838 		for (i = 0; i < NV_MAX_PORTS(nvc); i++) {
839 			nv_resume(&(nvc->nvc_port[i]));
840 		}
841 
842 		pci_config_teardown(&pci_conf_handle);
843 
844 		return (DDI_SUCCESS);
845 
846 	default:
847 		return (DDI_FAILURE);
848 	}
849 
850 
851 	/*
852 	 * DDI_ATTACH failure path starts here
853 	 */
854 
855 	if (attach_state & ATTACH_PROGRESS_INTR_ADDED) {
856 		nv_rem_intrs(nvc);
857 	}
858 
859 	if (attach_state & ATTACH_PROGRESS_SATA_MODULE) {
860 		/*
861 		 * Remove timers
862 		 */
863 		int port = 0;
864 		nv_port_t *nvp;
865 
866 		for (; port < NV_MAX_PORTS(nvc); port++) {
867 			nvp = &(nvc->nvc_port[port]);
868 			if (nvp->nvp_timeout_id != 0) {
869 				(void) untimeout(nvp->nvp_timeout_id);
870 			}
871 		}
872 	}
873 
874 	if (attach_state & ATTACH_PROGRESS_MUTEX_INIT) {
875 		mutex_destroy(&nvc->nvc_mutex);
876 	}
877 
878 	if (attach_state & ATTACH_PROGRESS_CTL_SETUP) {
879 		nv_uninit_ctl(nvc);
880 	}
881 
882 	if (attach_state & ATTACH_PROGRESS_BARS) {
883 		while (--bar >= 0) {
884 			ddi_regs_map_free(&nvc->nvc_bar_hdl[bar]);
885 		}
886 	}
887 
888 	if (attach_state & ATTACH_PROGRESS_STATEP_ALLOC) {
889 		ddi_soft_state_free(nv_statep, inst);
890 	}
891 
892 	if (attach_state & ATTACH_PROGRESS_CONF_HANDLE) {
893 		pci_config_teardown(&pci_conf_handle);
894 	}
895 
896 	cmn_err(CE_WARN, "nv_sata%d attach failed", inst);
897 
898 	return (DDI_FAILURE);
899 }
900 
901 
902 static int
nv_detach(dev_info_t * dip,ddi_detach_cmd_t cmd)903 nv_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
904 {
905 	int i, port, inst = ddi_get_instance(dip);
906 	nv_ctl_t *nvc;
907 	nv_port_t *nvp;
908 
909 	nvc = ddi_get_soft_state(nv_statep, inst);
910 
911 	switch (cmd) {
912 
913 	case DDI_DETACH:
914 
915 		NVLOG(NVDBG_INIT, nvc, NULL, "nv_detach: DDI_DETACH", NULL);
916 
917 		/*
918 		 * Remove interrupts
919 		 */
920 		nv_rem_intrs(nvc);
921 
922 		/*
923 		 * Remove timers
924 		 */
925 		for (port = 0; port < NV_MAX_PORTS(nvc); port++) {
926 			nvp = &(nvc->nvc_port[port]);
927 			if (nvp->nvp_timeout_id != 0) {
928 				(void) untimeout(nvp->nvp_timeout_id);
929 			}
930 		}
931 
932 		/*
933 		 * Remove maps
934 		 */
935 		for (i = 0; i < 6; i++) {
936 			ddi_regs_map_free(&nvc->nvc_bar_hdl[i]);
937 		}
938 
939 		/*
940 		 * Destroy mutexes
941 		 */
942 		mutex_destroy(&nvc->nvc_mutex);
943 
944 		/*
945 		 * Uninitialize the controller structures
946 		 */
947 		nv_uninit_ctl(nvc);
948 
949 #ifdef SGPIO_SUPPORT
950 		/*
951 		 * release SGPIO resources
952 		 */
953 		nv_sgp_cleanup(nvc);
954 #endif
955 
956 		/*
957 		 * unregister from the sata module
958 		 */
959 		(void) sata_hba_detach(nvc->nvc_dip, DDI_DETACH);
960 
961 		/*
962 		 * Free soft state
963 		 */
964 		ddi_soft_state_free(nv_statep, inst);
965 
966 		return (DDI_SUCCESS);
967 
968 	case DDI_SUSPEND:
969 
970 		NVLOG(NVDBG_INIT, nvc, NULL, "nv_detach: DDI_SUSPEND", NULL);
971 
972 		for (i = 0; i < NV_MAX_PORTS(nvc); i++) {
973 			nv_suspend(&(nvc->nvc_port[i]));
974 		}
975 
976 		nvc->nvc_state |= NV_CTRL_SUSPEND;
977 
978 		return (DDI_SUCCESS);
979 
980 	default:
981 		return (DDI_FAILURE);
982 	}
983 }
984 
985 
986 /*ARGSUSED*/
987 static int
nv_getinfo(dev_info_t * dip,ddi_info_cmd_t infocmd,void * arg,void ** result)988 nv_getinfo(dev_info_t *dip, ddi_info_cmd_t infocmd, void *arg, void **result)
989 {
990 	nv_ctl_t *nvc;
991 	int instance;
992 	dev_t dev;
993 
994 	dev = (dev_t)arg;
995 	instance = getminor(dev);
996 
997 	switch (infocmd) {
998 	case DDI_INFO_DEVT2DEVINFO:
999 		nvc = ddi_get_soft_state(nv_statep,  instance);
1000 		if (nvc != NULL) {
1001 			*result = nvc->nvc_dip;
1002 			return (DDI_SUCCESS);
1003 		} else {
1004 			*result = NULL;
1005 			return (DDI_FAILURE);
1006 		}
1007 	case DDI_INFO_DEVT2INSTANCE:
1008 		*(int *)result = instance;
1009 		break;
1010 	default:
1011 		break;
1012 	}
1013 	return (DDI_SUCCESS);
1014 }
1015 
1016 
1017 #ifdef SGPIO_SUPPORT
1018 /* ARGSUSED */
1019 static int
nv_open(dev_t * devp,int flag,int otyp,cred_t * credp)1020 nv_open(dev_t *devp, int flag, int otyp, cred_t *credp)
1021 {
1022 	nv_ctl_t *nvc = ddi_get_soft_state(nv_statep, getminor(*devp));
1023 
1024 	if (nvc == NULL) {
1025 		return (ENXIO);
1026 	}
1027 
1028 	return (0);
1029 }
1030 
1031 
1032 /* ARGSUSED */
1033 static int
nv_close(dev_t dev,int flag,int otyp,cred_t * credp)1034 nv_close(dev_t dev, int flag, int otyp, cred_t *credp)
1035 {
1036 	return (0);
1037 }
1038 
1039 
1040 /* ARGSUSED */
1041 static int
nv_ioctl(dev_t dev,int cmd,intptr_t arg,int mode,cred_t * credp,int * rvalp)1042 nv_ioctl(dev_t dev, int cmd, intptr_t arg, int mode, cred_t *credp, int *rvalp)
1043 {
1044 	nv_ctl_t *nvc;
1045 	int inst;
1046 	int status;
1047 	int ctlr, port;
1048 	int drive;
1049 	uint8_t curr_led;
1050 	struct dc_led_ctl led;
1051 
1052 	inst = getminor(dev);
1053 	if (inst == -1) {
1054 		return (EBADF);
1055 	}
1056 
1057 	nvc = ddi_get_soft_state(nv_statep, inst);
1058 	if (nvc == NULL) {
1059 		return (EBADF);
1060 	}
1061 
1062 	if ((nvc->nvc_sgp_cbp == NULL) || (nvc->nvc_sgp_cmn == NULL)) {
1063 		return (EIO);
1064 	}
1065 
1066 	switch (cmd) {
1067 	case DEVCTL_SET_LED:
1068 		status = ddi_copyin((void *)arg, &led,
1069 		    sizeof (struct dc_led_ctl), mode);
1070 		if (status != 0)
1071 			return (EFAULT);
1072 
1073 		/*
1074 		 * Since only the first two controller currently support
1075 		 * SGPIO (as per NVIDIA docs), this code will as well.
1076 		 * Note that this validate the port value within led_state
1077 		 * as well.
1078 		 */
1079 
1080 		ctlr = SGP_DRV_TO_CTLR(led.led_number);
1081 		if ((ctlr != 0) && (ctlr != 1))
1082 			return (ENXIO);
1083 
1084 		if ((led.led_state & DCL_STATE_FAST_BLNK) ||
1085 		    (led.led_state & DCL_STATE_SLOW_BLNK)) {
1086 			return (EINVAL);
1087 		}
1088 
1089 		drive = led.led_number;
1090 
1091 		if ((led.led_ctl_active == DCL_CNTRL_OFF) ||
1092 		    (led.led_state == DCL_STATE_OFF)) {
1093 
1094 			if (led.led_type == DCL_TYPE_DEVICE_FAIL) {
1095 				nv_sgp_error(nvc, drive, TR_ERROR_DISABLE);
1096 			} else if (led.led_type == DCL_TYPE_DEVICE_OK2RM) {
1097 				nv_sgp_locate(nvc, drive, TR_LOCATE_DISABLE);
1098 			} else {
1099 				return (ENXIO);
1100 			}
1101 
1102 			port = SGP_DRV_TO_PORT(led.led_number);
1103 			nvc->nvc_port[port].nvp_sgp_ioctl_mod |= led.led_type;
1104 		}
1105 
1106 		if (led.led_ctl_active == DCL_CNTRL_ON) {
1107 			if (led.led_type == DCL_TYPE_DEVICE_FAIL) {
1108 				nv_sgp_error(nvc, drive, TR_ERROR_ENABLE);
1109 			} else if (led.led_type == DCL_TYPE_DEVICE_OK2RM) {
1110 				nv_sgp_locate(nvc, drive, TR_LOCATE_ENABLE);
1111 			} else {
1112 				return (ENXIO);
1113 			}
1114 
1115 			port = SGP_DRV_TO_PORT(led.led_number);
1116 			nvc->nvc_port[port].nvp_sgp_ioctl_mod |= led.led_type;
1117 		}
1118 
1119 		break;
1120 
1121 	case DEVCTL_GET_LED:
1122 		status = ddi_copyin((void *)arg, &led,
1123 		    sizeof (struct dc_led_ctl), mode);
1124 		if (status != 0)
1125 			return (EFAULT);
1126 
1127 		/*
1128 		 * Since only the first two controller currently support
1129 		 * SGPIO (as per NVIDIA docs), this code will as well.
1130 		 * Note that this validate the port value within led_state
1131 		 * as well.
1132 		 */
1133 
1134 		ctlr = SGP_DRV_TO_CTLR(led.led_number);
1135 		if ((ctlr != 0) && (ctlr != 1))
1136 			return (ENXIO);
1137 
1138 		curr_led = SGPIO0_TR_DRV(nvc->nvc_sgp_cbp->sgpio0_tr,
1139 		    led.led_number);
1140 
1141 		port = SGP_DRV_TO_PORT(led.led_number);
1142 		if (nvc->nvc_port[port].nvp_sgp_ioctl_mod & led.led_type) {
1143 			led.led_ctl_active = DCL_CNTRL_ON;
1144 
1145 			if (led.led_type == DCL_TYPE_DEVICE_FAIL) {
1146 				if (TR_ERROR(curr_led) == TR_ERROR_DISABLE)
1147 					led.led_state = DCL_STATE_OFF;
1148 				else
1149 					led.led_state = DCL_STATE_ON;
1150 			} else if (led.led_type == DCL_TYPE_DEVICE_OK2RM) {
1151 				if (TR_LOCATE(curr_led) == TR_LOCATE_DISABLE)
1152 					led.led_state = DCL_STATE_OFF;
1153 				else
1154 					led.led_state = DCL_STATE_ON;
1155 			} else {
1156 				return (ENXIO);
1157 			}
1158 		} else {
1159 			led.led_ctl_active = DCL_CNTRL_OFF;
1160 			/*
1161 			 * Not really off, but never set and no constant for
1162 			 * tri-state
1163 			 */
1164 			led.led_state = DCL_STATE_OFF;
1165 		}
1166 
1167 		status = ddi_copyout(&led, (void *)arg,
1168 		    sizeof (struct dc_led_ctl), mode);
1169 		if (status != 0)
1170 			return (EFAULT);
1171 
1172 		break;
1173 
1174 	case DEVCTL_NUM_LEDS:
1175 		led.led_number = SGPIO_DRV_CNT_VALUE;
1176 		led.led_ctl_active = 1;
1177 		led.led_type = 3;
1178 
1179 		/*
1180 		 * According to documentation, NVIDIA SGPIO is supposed to
1181 		 * support blinking, but it does not seem to work in practice.
1182 		 */
1183 		led.led_state = DCL_STATE_ON;
1184 
1185 		status = ddi_copyout(&led, (void *)arg,
1186 		    sizeof (struct dc_led_ctl), mode);
1187 		if (status != 0)
1188 			return (EFAULT);
1189 
1190 		break;
1191 
1192 	default:
1193 		return (EINVAL);
1194 	}
1195 
1196 	return (0);
1197 }
1198 #endif	/* SGPIO_SUPPORT */
1199 
1200 
1201 /*
1202  * Called by sata module to probe a port.  Port and device state
1203  * are not changed here... only reported back to the sata module.
1204  *
1205  */
1206 static int
nv_sata_probe(dev_info_t * dip,sata_device_t * sd)1207 nv_sata_probe(dev_info_t *dip, sata_device_t *sd)
1208 {
1209 	nv_ctl_t *nvc = ddi_get_soft_state(nv_statep, ddi_get_instance(dip));
1210 	uint8_t cport = sd->satadev_addr.cport;
1211 	uint8_t pmport = sd->satadev_addr.pmport;
1212 	uint8_t qual = sd->satadev_addr.qual;
1213 	uint8_t det;
1214 
1215 	nv_port_t *nvp;
1216 
1217 	if (cport >= NV_MAX_PORTS(nvc)) {
1218 		sd->satadev_type = SATA_DTYPE_NONE;
1219 		sd->satadev_state = SATA_STATE_UNKNOWN;
1220 
1221 		return (SATA_FAILURE);
1222 	}
1223 
1224 	ASSERT(nvc->nvc_port != NULL);
1225 	nvp = &(nvc->nvc_port[cport]);
1226 	ASSERT(nvp != NULL);
1227 
1228 	NVLOG(NVDBG_ENTRY, nvc, nvp,
1229 	    "nv_sata_probe: enter cport: 0x%x, pmport: 0x%x, "
1230 	    "qual: 0x%x", cport, pmport, qual);
1231 
1232 	mutex_enter(&nvp->nvp_mutex);
1233 
1234 	/*
1235 	 * This check seems to be done in the SATA module.
1236 	 * It may not be required here
1237 	 */
1238 	if (nvp->nvp_state & NV_DEACTIVATED) {
1239 		nv_cmn_err(CE_WARN, nvc, nvp,
1240 		    "port inactive.  Use cfgadm to activate");
1241 		sd->satadev_type = SATA_DTYPE_UNKNOWN;
1242 		sd->satadev_state = SATA_PSTATE_SHUTDOWN;
1243 		mutex_exit(&nvp->nvp_mutex);
1244 
1245 		return (SATA_SUCCESS);
1246 	}
1247 
1248 	if (nvp->nvp_state & NV_FAILED) {
1249 		NVLOG(NVDBG_RESET, nvp->nvp_ctlp, nvp,
1250 		    "probe: port failed", NULL);
1251 		sd->satadev_type = nvp->nvp_type;
1252 		sd->satadev_state = SATA_PSTATE_FAILED;
1253 		mutex_exit(&nvp->nvp_mutex);
1254 
1255 		return (SATA_SUCCESS);
1256 	}
1257 
1258 	if (qual == SATA_ADDR_PMPORT) {
1259 		sd->satadev_type = SATA_DTYPE_NONE;
1260 		sd->satadev_state = SATA_STATE_UNKNOWN;
1261 		mutex_exit(&nvp->nvp_mutex);
1262 		nv_cmn_err(CE_WARN, nvc, nvp,
1263 		    "controller does not support port multiplier");
1264 
1265 		return (SATA_SUCCESS);
1266 	}
1267 
1268 	sd->satadev_state = SATA_PSTATE_PWRON;
1269 
1270 	nv_copy_registers(nvp, sd, NULL);
1271 
1272 	if (nvp->nvp_state & (NV_RESET|NV_LINK_EVENT)) {
1273 		/*
1274 		 * during a reset or link event, fake the status
1275 		 * as it may be changing as a result of the reset
1276 		 * or link event.
1277 		 */
1278 		DTRACE_PROBE(state_reset_link_event_faking_status_p);
1279 		DTRACE_PROBE1(nvp_state_h, int, nvp->nvp_state);
1280 
1281 		SSTATUS_SET_IPM(sd->satadev_scr.sstatus,
1282 		    SSTATUS_IPM_ACTIVE);
1283 		SSTATUS_SET_DET(sd->satadev_scr.sstatus,
1284 		    SSTATUS_DET_DEVPRE_PHYCOM);
1285 		sd->satadev_type = nvp->nvp_type;
1286 		mutex_exit(&nvp->nvp_mutex);
1287 
1288 		return (SATA_SUCCESS);
1289 	}
1290 
1291 	det = SSTATUS_GET_DET(sd->satadev_scr.sstatus);
1292 
1293 	/*
1294 	 * determine link status
1295 	 */
1296 	if (det != SSTATUS_DET_DEVPRE_PHYCOM) {
1297 		switch (det) {
1298 
1299 		case SSTATUS_DET_NODEV:
1300 		case SSTATUS_DET_PHYOFFLINE:
1301 			sd->satadev_type = SATA_DTYPE_NONE;
1302 			break;
1303 
1304 		default:
1305 			sd->satadev_type = SATA_DTYPE_UNKNOWN;
1306 			break;
1307 		}
1308 
1309 		mutex_exit(&nvp->nvp_mutex);
1310 
1311 		return (SATA_SUCCESS);
1312 	}
1313 
1314 	/*
1315 	 * Just report the current port state
1316 	 */
1317 	sd->satadev_type = nvp->nvp_type;
1318 	DTRACE_PROBE1(nvp_type_h, int, nvp->nvp_type);
1319 
1320 	mutex_exit(&nvp->nvp_mutex);
1321 
1322 	return (SATA_SUCCESS);
1323 }
1324 
1325 
1326 /*
1327  * Called by sata module to start a new command.
1328  */
1329 static int
nv_sata_start(dev_info_t * dip,sata_pkt_t * spkt)1330 nv_sata_start(dev_info_t *dip, sata_pkt_t *spkt)
1331 {
1332 	int cport = spkt->satapkt_device.satadev_addr.cport;
1333 	nv_ctl_t *nvc = ddi_get_soft_state(nv_statep, ddi_get_instance(dip));
1334 	nv_port_t *nvp = &(nvc->nvc_port[cport]);
1335 	int ret;
1336 
1337 	NVLOG(NVDBG_ENTRY, nvc, nvp, "nv_sata_start: opmode: 0x%x cmd=%x",
1338 	    spkt->satapkt_op_mode, spkt->satapkt_cmd.satacmd_cmd_reg);
1339 
1340 	mutex_enter(&nvp->nvp_mutex);
1341 
1342 	if (nvp->nvp_state & NV_DEACTIVATED) {
1343 
1344 		NVLOG(NVDBG_ERRS, nvc, nvp,
1345 		    "nv_sata_start: NV_DEACTIVATED", NULL);
1346 		DTRACE_PROBE(nvp_state_inactive_p);
1347 
1348 		spkt->satapkt_reason = SATA_PKT_PORT_ERROR;
1349 		nv_copy_registers(nvp, &spkt->satapkt_device, NULL);
1350 		mutex_exit(&nvp->nvp_mutex);
1351 
1352 		return (SATA_TRAN_PORT_ERROR);
1353 	}
1354 
1355 	if (nvp->nvp_state & NV_FAILED) {
1356 
1357 		NVLOG(NVDBG_ERRS, nvc, nvp,
1358 		    "nv_sata_start: NV_FAILED state", NULL);
1359 		DTRACE_PROBE(nvp_state_failed_p);
1360 
1361 		spkt->satapkt_reason = SATA_PKT_PORT_ERROR;
1362 		nv_copy_registers(nvp, &spkt->satapkt_device, NULL);
1363 		mutex_exit(&nvp->nvp_mutex);
1364 
1365 		return (SATA_TRAN_PORT_ERROR);
1366 	}
1367 
1368 	if (nvp->nvp_state & NV_RESET) {
1369 
1370 		NVLOG(NVDBG_ERRS, nvc, nvp,
1371 		    "still waiting for reset completion", NULL);
1372 		DTRACE_PROBE(nvp_state_reset_p);
1373 
1374 		spkt->satapkt_reason = SATA_PKT_BUSY;
1375 
1376 		/*
1377 		 * If in panic, timeouts do not occur, so invoke
1378 		 * reset handling directly so that the signature
1379 		 * can be acquired to complete the reset handling.
1380 		 */
1381 		if (ddi_in_panic()) {
1382 			NVLOG(NVDBG_ERRS, nvc, nvp,
1383 			    "nv_sata_start: calling nv_monitor_reset "
1384 			    "synchronously", NULL);
1385 
1386 			(void) nv_monitor_reset(nvp);
1387 		}
1388 
1389 		mutex_exit(&nvp->nvp_mutex);
1390 
1391 		return (SATA_TRAN_BUSY);
1392 	}
1393 
1394 	if (nvp->nvp_state & NV_LINK_EVENT) {
1395 
1396 		NVLOG(NVDBG_ERRS, nvc, nvp,
1397 		    "nv_sata_start(): link event ret bsy", NULL);
1398 		DTRACE_PROBE(nvp_state_link_event_p);
1399 
1400 		spkt->satapkt_reason = SATA_PKT_BUSY;
1401 
1402 		if (ddi_in_panic()) {
1403 			NVLOG(NVDBG_ERRS, nvc, nvp,
1404 			    "nv_sata_start: calling nv_timeout "
1405 			    "synchronously", NULL);
1406 
1407 			nv_timeout(nvp);
1408 		}
1409 
1410 		mutex_exit(&nvp->nvp_mutex);
1411 
1412 		return (SATA_TRAN_BUSY);
1413 	}
1414 
1415 
1416 	if ((nvp->nvp_type == SATA_DTYPE_NONE) ||
1417 	    (nvp->nvp_type == SATA_DTYPE_UNKNOWN)) {
1418 
1419 		NVLOG(NVDBG_ERRS, nvc, nvp,
1420 		    "nv_sata_start: nvp_type 0x%x", nvp->nvp_type);
1421 		DTRACE_PROBE1(not_ready_nvp_type_h, int, nvp->nvp_type);
1422 
1423 		spkt->satapkt_reason = SATA_PKT_PORT_ERROR;
1424 		nv_copy_registers(nvp, &spkt->satapkt_device, NULL);
1425 		mutex_exit(&nvp->nvp_mutex);
1426 
1427 		return (SATA_TRAN_PORT_ERROR);
1428 	}
1429 
1430 	if (spkt->satapkt_device.satadev_type == SATA_DTYPE_PMULT) {
1431 
1432 		nv_cmn_err(CE_WARN, nvc, nvp,
1433 		    "port multiplier not supported by controller");
1434 
1435 		ASSERT(nvp->nvp_type == SATA_DTYPE_PMULT);
1436 		spkt->satapkt_reason = SATA_PKT_CMD_UNSUPPORTED;
1437 		mutex_exit(&nvp->nvp_mutex);
1438 
1439 		return (SATA_TRAN_CMD_UNSUPPORTED);
1440 	}
1441 
1442 	/*
1443 	 * after a device reset, and then when sata module restore processing
1444 	 * is complete, the sata module will set sata_clear_dev_reset which
1445 	 * indicates that restore processing has completed and normal
1446 	 * non-restore related commands should be processed.
1447 	 */
1448 	if (spkt->satapkt_cmd.satacmd_flags.sata_clear_dev_reset) {
1449 
1450 		NVLOG(NVDBG_RESET, nvc, nvp,
1451 		    "nv_sata_start: clearing NV_RESTORE", NULL);
1452 		DTRACE_PROBE(clearing_restore_p);
1453 		DTRACE_PROBE1(nvp_state_before_clear_h, int, nvp->nvp_state);
1454 
1455 		nvp->nvp_state &= ~NV_RESTORE;
1456 	}
1457 
1458 	/*
1459 	 * if the device was recently reset as indicated by NV_RESTORE,
1460 	 * only allow commands which restore device state.  The sata module
1461 	 * marks such commands with sata_ignore_dev_reset.
1462 	 *
1463 	 * during coredump, nv_reset is called but the restore isn't
1464 	 * processed, so ignore the wait for restore if the system
1465 	 * is panicing.
1466 	 */
1467 	if ((nvp->nvp_state & NV_RESTORE) &&
1468 	    !(spkt->satapkt_cmd.satacmd_flags.sata_ignore_dev_reset) &&
1469 	    (ddi_in_panic() == 0)) {
1470 
1471 		NVLOG(NVDBG_RESET, nvc, nvp,
1472 		    "nv_sata_start: waiting for restore ", NULL);
1473 		DTRACE_PROBE1(restore_no_ignore_reset_nvp_state_h,
1474 		    int, nvp->nvp_state);
1475 
1476 		spkt->satapkt_reason = SATA_PKT_BUSY;
1477 		mutex_exit(&nvp->nvp_mutex);
1478 
1479 		return (SATA_TRAN_BUSY);
1480 	}
1481 
1482 	if (nvp->nvp_state & NV_ABORTING) {
1483 
1484 		NVLOG(NVDBG_ERRS, nvc, nvp,
1485 		    "nv_sata_start: NV_ABORTING", NULL);
1486 		DTRACE_PROBE1(aborting_nvp_state_h, int, nvp->nvp_state);
1487 
1488 		spkt->satapkt_reason = SATA_PKT_BUSY;
1489 		mutex_exit(&nvp->nvp_mutex);
1490 
1491 		return (SATA_TRAN_BUSY);
1492 	}
1493 
1494 	/*
1495 	 * record command sequence for debugging.
1496 	 */
1497 	nvp->nvp_seq++;
1498 
1499 	DTRACE_PROBE2(command_start, int *, nvp, int,
1500 	    spkt->satapkt_cmd.satacmd_cmd_reg);
1501 
1502 	/*
1503 	 * clear SError to be able to check errors after the command failure
1504 	 */
1505 	nv_put32(nvp->nvp_ctlp->nvc_bar_hdl[5], nvp->nvp_serror, 0xffffffff);
1506 
1507 	if (spkt->satapkt_op_mode &
1508 	    (SATA_OPMODE_POLLING|SATA_OPMODE_SYNCH)) {
1509 
1510 		ret = nv_start_sync(nvp, spkt);
1511 
1512 		mutex_exit(&nvp->nvp_mutex);
1513 
1514 		return (ret);
1515 	}
1516 
1517 	/*
1518 	 * start command asynchronous command
1519 	 */
1520 	ret = nv_start_async(nvp, spkt);
1521 
1522 	mutex_exit(&nvp->nvp_mutex);
1523 
1524 	return (ret);
1525 }
1526 
1527 
1528 /*
1529  * SATA_OPMODE_POLLING implies the driver is in a
1530  * synchronous mode, and SATA_OPMODE_SYNCH is also set.
1531  * If only SATA_OPMODE_SYNCH is set, the driver can use
1532  * interrupts and sleep wait on a cv.
1533  *
1534  * If SATA_OPMODE_POLLING is set, the driver can't use
1535  * interrupts and must busy wait and simulate the
1536  * interrupts by waiting for BSY to be cleared.
1537  *
1538  * Synchronous mode has to return BUSY if there are
1539  * any other commands already on the drive.
1540  */
1541 static int
nv_start_sync(nv_port_t * nvp,sata_pkt_t * spkt)1542 nv_start_sync(nv_port_t *nvp, sata_pkt_t *spkt)
1543 {
1544 	nv_ctl_t *nvc = nvp->nvp_ctlp;
1545 	int ret;
1546 
1547 	NVLOG(NVDBG_SYNC, nvp->nvp_ctlp, nvp, "nv_sata_satapkt_sync: entry",
1548 	    NULL);
1549 
1550 	if (nvp->nvp_ncq_run != 0 || nvp->nvp_non_ncq_run != 0) {
1551 		spkt->satapkt_reason = SATA_PKT_BUSY;
1552 		NVLOG(NVDBG_SYNC, nvp->nvp_ctlp, nvp,
1553 		    "nv_sata_satapkt_sync: device is busy, sync cmd rejected"
1554 		    "ncq_run: %d non_ncq_run: %d  spkt: %p",
1555 		    nvp->nvp_ncq_run, nvp->nvp_non_ncq_run,
1556 		    (&(nvp->nvp_slot[0]))->nvslot_spkt);
1557 
1558 		return (SATA_TRAN_BUSY);
1559 	}
1560 
1561 	/*
1562 	 * if SYNC but not POLL, verify that this is not on interrupt thread.
1563 	 */
1564 	if (!(spkt->satapkt_op_mode & SATA_OPMODE_POLLING) &&
1565 	    servicing_interrupt()) {
1566 		spkt->satapkt_reason = SATA_PKT_BUSY;
1567 		NVLOG(NVDBG_SYNC, nvp->nvp_ctlp, nvp,
1568 		    "SYNC mode not allowed during interrupt", NULL);
1569 
1570 		return (SATA_TRAN_BUSY);
1571 
1572 	}
1573 
1574 	/*
1575 	 * disable interrupt generation if in polled mode
1576 	 */
1577 	if (spkt->satapkt_op_mode & SATA_OPMODE_POLLING) {
1578 		(*(nvc->nvc_set_intr))(nvp, NV_INTR_DISABLE);
1579 	}
1580 
1581 	/*
1582 	 * overload the satapkt_reason with BUSY so code below
1583 	 * will know when it's done
1584 	 */
1585 	spkt->satapkt_reason = SATA_PKT_BUSY;
1586 
1587 	if ((ret = nv_start_common(nvp, spkt)) != SATA_TRAN_ACCEPTED) {
1588 		if (spkt->satapkt_op_mode & SATA_OPMODE_POLLING) {
1589 			(*(nvc->nvc_set_intr))(nvp, NV_INTR_ENABLE);
1590 		}
1591 
1592 		return (ret);
1593 	}
1594 
1595 	if (spkt->satapkt_op_mode & SATA_OPMODE_POLLING) {
1596 		mutex_exit(&nvp->nvp_mutex);
1597 		ret = nv_poll_wait(nvp, spkt);
1598 		mutex_enter(&nvp->nvp_mutex);
1599 
1600 		(*(nvc->nvc_set_intr))(nvp, NV_INTR_ENABLE);
1601 
1602 		NVLOG(NVDBG_SYNC, nvp->nvp_ctlp, nvp, "nv_sata_satapkt_sync:"
1603 		    " done % reason %d", ret);
1604 
1605 		return (ret);
1606 	}
1607 
1608 	/*
1609 	 * non-polling synchronous mode handling.  The interrupt will signal
1610 	 * when device IO is completed.
1611 	 */
1612 	while (spkt->satapkt_reason == SATA_PKT_BUSY) {
1613 		cv_wait(&nvp->nvp_sync_cv, &nvp->nvp_mutex);
1614 	}
1615 
1616 
1617 	NVLOG(NVDBG_SYNC, nvp->nvp_ctlp, nvp, "nv_sata_satapkt_sync:"
1618 	    " done % reason %d", spkt->satapkt_reason);
1619 
1620 	return (SATA_TRAN_ACCEPTED);
1621 }
1622 
1623 
1624 static int
nv_poll_wait(nv_port_t * nvp,sata_pkt_t * spkt)1625 nv_poll_wait(nv_port_t *nvp, sata_pkt_t *spkt)
1626 {
1627 	int ret;
1628 	nv_ctl_t *nvc = nvp->nvp_ctlp;
1629 #if ! defined(__lock_lint)
1630 	nv_slot_t *nv_slotp = &(nvp->nvp_slot[0]); /* not NCQ aware */
1631 #endif
1632 
1633 	NVLOG(NVDBG_SYNC, nvc, nvp, "nv_poll_wait: enter", NULL);
1634 
1635 	for (;;) {
1636 
1637 		NV_DELAY_NSEC(400);
1638 
1639 		NVLOG(NVDBG_SYNC, nvc, nvp, "nv_poll_wait: before nv_wait",
1640 		    NULL);
1641 		if (nv_wait(nvp, 0, SATA_STATUS_BSY,
1642 		    NV_SEC2USEC(spkt->satapkt_time), NV_NOSLEEP) == B_FALSE) {
1643 			mutex_enter(&nvp->nvp_mutex);
1644 			spkt->satapkt_reason = SATA_PKT_TIMEOUT;
1645 			nv_copy_registers(nvp, &spkt->satapkt_device, spkt);
1646 			nv_reset(nvp, "poll_wait");
1647 			nv_complete_io(nvp, spkt, 0);
1648 			mutex_exit(&nvp->nvp_mutex);
1649 			NVLOG(NVDBG_SYNC, nvc, nvp, "nv_poll_wait: "
1650 			    "SATA_STATUS_BSY", NULL);
1651 
1652 			return (SATA_TRAN_ACCEPTED);
1653 		}
1654 
1655 		NVLOG(NVDBG_SYNC, nvc, nvp, "nv_poll_wait: before nvc_intr",
1656 		    NULL);
1657 
1658 		/*
1659 		 * Simulate interrupt.
1660 		 */
1661 		ret = (*(nvc->nvc_interrupt))((caddr_t)nvc, NULL);
1662 		NVLOG(NVDBG_SYNC, nvc, nvp, "nv_poll_wait: after nvc_intr",
1663 		    NULL);
1664 
1665 		if (ret != DDI_INTR_CLAIMED) {
1666 			NVLOG(NVDBG_SYNC, nvc, nvp, "nv_poll_wait:"
1667 			    " unclaimed -- resetting", NULL);
1668 			mutex_enter(&nvp->nvp_mutex);
1669 			nv_copy_registers(nvp, &spkt->satapkt_device, spkt);
1670 			nv_reset(nvp, "poll_wait intr not claimed");
1671 			spkt->satapkt_reason = SATA_PKT_TIMEOUT;
1672 			nv_complete_io(nvp, spkt, 0);
1673 			mutex_exit(&nvp->nvp_mutex);
1674 
1675 			return (SATA_TRAN_ACCEPTED);
1676 		}
1677 
1678 #if ! defined(__lock_lint)
1679 		if (nv_slotp->nvslot_flags == NVSLOT_COMPLETE) {
1680 			/*
1681 			 * packet is complete
1682 			 */
1683 			return (SATA_TRAN_ACCEPTED);
1684 		}
1685 #endif
1686 	}
1687 	/*NOTREACHED*/
1688 }
1689 
1690 
1691 /*
1692  * Called by sata module to abort outstanding packets.
1693  */
1694 /*ARGSUSED*/
1695 static int
nv_sata_abort(dev_info_t * dip,sata_pkt_t * spkt,int flag)1696 nv_sata_abort(dev_info_t *dip, sata_pkt_t *spkt, int flag)
1697 {
1698 	int cport = spkt->satapkt_device.satadev_addr.cport;
1699 	nv_ctl_t *nvc = ddi_get_soft_state(nv_statep, ddi_get_instance(dip));
1700 	nv_port_t *nvp = &(nvc->nvc_port[cport]);
1701 	int c_a, ret;
1702 
1703 	ASSERT(cport < NV_MAX_PORTS(nvc));
1704 	NVLOG(NVDBG_ENTRY, nvc, nvp, "nv_sata_abort %d %p", flag, spkt);
1705 
1706 	mutex_enter(&nvp->nvp_mutex);
1707 
1708 	if (nvp->nvp_state & NV_DEACTIVATED) {
1709 		mutex_exit(&nvp->nvp_mutex);
1710 		nv_cmn_err(CE_WARN, nvc, nvp,
1711 		    "abort request failed: port inactive");
1712 
1713 		return (SATA_FAILURE);
1714 	}
1715 
1716 	/*
1717 	 * spkt == NULL then abort all commands
1718 	 */
1719 	c_a = nv_abort_active(nvp, spkt, SATA_PKT_ABORTED, B_TRUE);
1720 
1721 	if (c_a) {
1722 		NVLOG(NVDBG_ENTRY, nvc, nvp,
1723 		    "packets aborted running=%d", c_a);
1724 		ret = SATA_SUCCESS;
1725 	} else {
1726 		if (spkt == NULL) {
1727 			NVLOG(NVDBG_ENTRY, nvc, nvp, "no spkts to abort", NULL);
1728 		} else {
1729 			NVLOG(NVDBG_ENTRY, nvc, nvp,
1730 			    "can't find spkt to abort", NULL);
1731 		}
1732 		ret = SATA_FAILURE;
1733 	}
1734 
1735 	mutex_exit(&nvp->nvp_mutex);
1736 
1737 	return (ret);
1738 }
1739 
1740 
1741 /*
1742  * if spkt == NULL abort all pkts running, otherwise
1743  * abort the requested packet.  must be called with nv_mutex
1744  * held and returns with it held.  Not NCQ aware.
1745  */
1746 static int
nv_abort_active(nv_port_t * nvp,sata_pkt_t * spkt,int abort_reason,boolean_t reset)1747 nv_abort_active(nv_port_t *nvp, sata_pkt_t *spkt, int abort_reason,
1748     boolean_t reset)
1749 {
1750 	int aborted = 0, i, reset_once = B_FALSE;
1751 	struct nv_slot *nv_slotp;
1752 	sata_pkt_t *spkt_slot;
1753 
1754 	ASSERT(MUTEX_HELD(&nvp->nvp_mutex));
1755 
1756 	NVLOG(NVDBG_ENTRY, nvp->nvp_ctlp, nvp, "nv_abort_active", NULL);
1757 
1758 	nvp->nvp_state |= NV_ABORTING;
1759 
1760 	for (i = 0; i < nvp->nvp_queue_depth; i++) {
1761 
1762 		nv_slotp = &(nvp->nvp_slot[i]);
1763 		spkt_slot = nv_slotp->nvslot_spkt;
1764 
1765 		/*
1766 		 * skip if not active command in slot
1767 		 */
1768 		if (spkt_slot == NULL) {
1769 			continue;
1770 		}
1771 
1772 		/*
1773 		 * if a specific packet was requested, skip if
1774 		 * this is not a match
1775 		 */
1776 		if ((spkt != NULL) && (spkt != spkt_slot)) {
1777 			continue;
1778 		}
1779 
1780 		/*
1781 		 * stop the hardware.  This could need reworking
1782 		 * when NCQ is enabled in the driver.
1783 		 */
1784 		if (reset_once == B_FALSE) {
1785 			ddi_acc_handle_t bmhdl = nvp->nvp_bm_hdl;
1786 
1787 			/*
1788 			 * stop DMA engine
1789 			 */
1790 			nv_put8(bmhdl, nvp->nvp_bmicx,  0);
1791 
1792 			/*
1793 			 * Reset only if explicitly specified by the arg reset
1794 			 */
1795 			if (reset == B_TRUE) {
1796 				reset_once = B_TRUE;
1797 				nv_reset(nvp, "abort_active");
1798 			}
1799 		}
1800 
1801 		spkt_slot->satapkt_reason = abort_reason;
1802 		nv_complete_io(nvp, spkt_slot, i);
1803 		aborted++;
1804 	}
1805 
1806 	nvp->nvp_state &= ~NV_ABORTING;
1807 
1808 	return (aborted);
1809 }
1810 
1811 
1812 /*
1813  * Called by sata module to reset a port, device, or the controller.
1814  */
1815 static int
nv_sata_reset(dev_info_t * dip,sata_device_t * sd)1816 nv_sata_reset(dev_info_t *dip, sata_device_t *sd)
1817 {
1818 	int cport = sd->satadev_addr.cport;
1819 	nv_ctl_t *nvc = ddi_get_soft_state(nv_statep, ddi_get_instance(dip));
1820 	nv_port_t *nvp = &(nvc->nvc_port[cport]);
1821 	int ret = SATA_FAILURE;
1822 
1823 	ASSERT(cport < NV_MAX_PORTS(nvc));
1824 
1825 	NVLOG(NVDBG_ENTRY, nvc, nvp, "nv_sata_reset", NULL);
1826 
1827 	mutex_enter(&nvp->nvp_mutex);
1828 
1829 	switch (sd->satadev_addr.qual) {
1830 
1831 	case SATA_ADDR_CPORT:
1832 		/*FALLTHROUGH*/
1833 	case SATA_ADDR_DCPORT:
1834 
1835 		ret = SATA_SUCCESS;
1836 
1837 		/*
1838 		 * If a reset is already in progress, don't disturb it
1839 		 */
1840 		if ((nvp->nvp_state & (NV_RESET|NV_RESTORE)) &&
1841 		    (ddi_in_panic() == 0)) {
1842 			NVLOG(NVDBG_RESET, nvc, nvp,
1843 			    "nv_sata_reset: reset already in progress", NULL);
1844 			DTRACE_PROBE(reset_already_in_progress_p);
1845 
1846 			break;
1847 		}
1848 
1849 		/*
1850 		 * log the pre-reset state of the driver because dumping the
1851 		 * blocks will disturb it.
1852 		 */
1853 		if (ddi_in_panic() == 1) {
1854 			NVLOG(NVDBG_RESET, nvc, nvp, "in_panic.  nvp_state: "
1855 			    "0x%x nvp_reset_time: %d nvp_last_cmd: 0x%x "
1856 			    "nvp_previous_cmd: 0x%x nvp_reset_count: %d "
1857 			    "nvp_first_reset_reason: %s "
1858 			    "nvp_reset_reason: %s nvp_seq: %d "
1859 			    "in_interrupt: %d", nvp->nvp_state,
1860 			    nvp->nvp_reset_time, nvp->nvp_last_cmd,
1861 			    nvp->nvp_previous_cmd, nvp->nvp_reset_count,
1862 			    nvp->nvp_first_reset_reason,
1863 			    nvp->nvp_reset_reason, nvp->nvp_seq,
1864 			    servicing_interrupt());
1865 		}
1866 
1867 		nv_reset(nvp, "sata_reset");
1868 
1869 		(void) nv_abort_active(nvp, NULL, SATA_PKT_RESET, B_FALSE);
1870 
1871 		/*
1872 		 * If the port is inactive, do a quiet reset and don't attempt
1873 		 * to wait for reset completion or do any post reset processing
1874 		 *
1875 		 */
1876 		if (nvp->nvp_state & NV_DEACTIVATED) {
1877 			nvp->nvp_state &= ~NV_RESET;
1878 			nvp->nvp_reset_time = 0;
1879 
1880 			break;
1881 		}
1882 
1883 		/*
1884 		 * clear the port failed flag.  It will get set again
1885 		 * if the port is still not functioning.
1886 		 */
1887 		nvp->nvp_state &= ~NV_FAILED;
1888 
1889 		/*
1890 		 * timeouts are not available while the system is
1891 		 * dropping core, so call nv_monitor_reset() directly
1892 		 */
1893 		if (ddi_in_panic() != 0) {
1894 			while (nvp->nvp_state & NV_RESET) {
1895 				drv_usecwait(1000);
1896 				(void) nv_monitor_reset(nvp);
1897 			}
1898 
1899 			break;
1900 		}
1901 
1902 		break;
1903 	case SATA_ADDR_CNTRL:
1904 		NVLOG(NVDBG_ENTRY, nvc, nvp,
1905 		    "nv_sata_reset: controller reset not supported", NULL);
1906 
1907 		break;
1908 	case SATA_ADDR_PMPORT:
1909 	case SATA_ADDR_DPMPORT:
1910 		NVLOG(NVDBG_ENTRY, nvc, nvp,
1911 		    "nv_sata_reset: port multipliers not supported", NULL);
1912 		/*FALLTHROUGH*/
1913 	default:
1914 		/*
1915 		 * unsupported case
1916 		 */
1917 		break;
1918 	}
1919 
1920 	mutex_exit(&nvp->nvp_mutex);
1921 
1922 	return (ret);
1923 }
1924 
1925 
1926 /*
1927  * Sata entry point to handle port activation.  cfgadm -c connect
1928  */
1929 static int
nv_sata_activate(dev_info_t * dip,sata_device_t * sd)1930 nv_sata_activate(dev_info_t *dip, sata_device_t *sd)
1931 {
1932 	int cport = sd->satadev_addr.cport;
1933 	nv_ctl_t *nvc = ddi_get_soft_state(nv_statep, ddi_get_instance(dip));
1934 	nv_port_t *nvp = &(nvc->nvc_port[cport]);
1935 	ddi_acc_handle_t bar5_hdl = nvp->nvp_ctlp->nvc_bar_hdl[5];
1936 	uint32_t sstatus;
1937 
1938 	ASSERT(cport < NV_MAX_PORTS(nvc));
1939 	NVLOG(NVDBG_ENTRY, nvc, nvp, "nv_sata_activate", NULL);
1940 
1941 	mutex_enter(&nvp->nvp_mutex);
1942 
1943 	sd->satadev_state = SATA_STATE_READY;
1944 
1945 	nv_copy_registers(nvp, sd, NULL);
1946 
1947 	(*(nvc->nvc_set_intr))(nvp, NV_INTR_ENABLE);
1948 
1949 	/*
1950 	 * initiate link probing and device signature acquisition
1951 	 */
1952 
1953 	bar5_hdl = nvp->nvp_ctlp->nvc_bar_hdl[5];
1954 
1955 	sstatus = ddi_get32(bar5_hdl, nvp->nvp_sstatus);
1956 
1957 	nvp->nvp_type = SATA_DTYPE_NONE;
1958 	nvp->nvp_signature = NV_NO_SIG;
1959 	nvp->nvp_state &= ~NV_DEACTIVATED;
1960 
1961 	if (SSTATUS_GET_DET(sstatus) ==
1962 	    SSTATUS_DET_DEVPRE_PHYCOM) {
1963 
1964 		nvp->nvp_state |= NV_ATTACH;
1965 		nvp->nvp_type = SATA_DTYPE_UNKNOWN;
1966 		nv_reset(nvp, "sata_activate");
1967 
1968 		while (nvp->nvp_state & NV_RESET) {
1969 			cv_wait(&nvp->nvp_reset_cv, &nvp->nvp_mutex);
1970 		}
1971 
1972 	}
1973 
1974 	mutex_exit(&nvp->nvp_mutex);
1975 
1976 	return (SATA_SUCCESS);
1977 }
1978 
1979 
1980 /*
1981  * Sata entry point to handle port deactivation.  cfgadm -c disconnect
1982  */
1983 static int
nv_sata_deactivate(dev_info_t * dip,sata_device_t * sd)1984 nv_sata_deactivate(dev_info_t *dip, sata_device_t *sd)
1985 {
1986 	int cport = sd->satadev_addr.cport;
1987 	nv_ctl_t *nvc = ddi_get_soft_state(nv_statep, ddi_get_instance(dip));
1988 	nv_port_t *nvp = &(nvc->nvc_port[cport]);
1989 
1990 	ASSERT(cport < NV_MAX_PORTS(nvc));
1991 	NVLOG(NVDBG_ENTRY, nvc, nvp, "nv_sata_deactivate", NULL);
1992 
1993 	mutex_enter(&nvp->nvp_mutex);
1994 
1995 	(void) nv_abort_active(nvp, NULL, SATA_PKT_ABORTED, B_FALSE);
1996 
1997 	/*
1998 	 * make the device inaccessible
1999 	 */
2000 	nvp->nvp_state |= NV_DEACTIVATED;
2001 
2002 	/*
2003 	 * disable the interrupts on port
2004 	 */
2005 	(*(nvc->nvc_set_intr))(nvp, NV_INTR_DISABLE);
2006 
2007 	sd->satadev_state = SATA_PSTATE_SHUTDOWN;
2008 	nv_copy_registers(nvp, sd, NULL);
2009 
2010 	mutex_exit(&nvp->nvp_mutex);
2011 
2012 	return (SATA_SUCCESS);
2013 }
2014 
2015 
2016 /*
2017  * find an empty slot in the driver's queue, increment counters,
2018  * and then invoke the appropriate PIO or DMA start routine.
2019  */
2020 static int
nv_start_common(nv_port_t * nvp,sata_pkt_t * spkt)2021 nv_start_common(nv_port_t *nvp, sata_pkt_t *spkt)
2022 {
2023 	sata_cmd_t *sata_cmdp = &spkt->satapkt_cmd;
2024 	int on_bit = 0x01, slot, sactive, ret, ncq = 0;
2025 	uint8_t cmd = spkt->satapkt_cmd.satacmd_cmd_reg;
2026 	int direction = sata_cmdp->satacmd_flags.sata_data_direction;
2027 	nv_ctl_t *nvc = nvp->nvp_ctlp;
2028 	nv_slot_t *nv_slotp;
2029 	boolean_t dma_cmd;
2030 
2031 	NVLOG(NVDBG_DELIVER, nvc, nvp, "nv_start_common  entered: cmd: 0x%x",
2032 	    sata_cmdp->satacmd_cmd_reg);
2033 
2034 	if ((cmd == SATAC_WRITE_FPDMA_QUEUED) ||
2035 	    (cmd == SATAC_READ_FPDMA_QUEUED)) {
2036 		nvp->nvp_ncq_run++;
2037 		/*
2038 		 * search for an empty NCQ slot.  by the time, it's already
2039 		 * been determined by the caller that there is room on the
2040 		 * queue.
2041 		 */
2042 		for (slot = 0; slot < nvp->nvp_queue_depth; slot++,
2043 		    on_bit <<= 1) {
2044 			if ((nvp->nvp_sactive_cache & on_bit) == 0) {
2045 				break;
2046 			}
2047 		}
2048 
2049 		/*
2050 		 * the first empty slot found, should not exceed the queue
2051 		 * depth of the drive.  if it does it's an error.
2052 		 */
2053 		ASSERT(slot != nvp->nvp_queue_depth);
2054 
2055 		sactive = nv_get32(nvc->nvc_bar_hdl[5],
2056 		    nvp->nvp_sactive);
2057 		ASSERT((sactive & on_bit) == 0);
2058 		nv_put32(nvc->nvc_bar_hdl[5], nvp->nvp_sactive, on_bit);
2059 		NVLOG(NVDBG_DELIVER, nvc, nvp, "setting SACTIVE onbit: %X",
2060 		    on_bit);
2061 		nvp->nvp_sactive_cache |= on_bit;
2062 
2063 		ncq = NVSLOT_NCQ;
2064 
2065 	} else {
2066 		nvp->nvp_non_ncq_run++;
2067 		slot = 0;
2068 	}
2069 
2070 	nv_slotp = (nv_slot_t *)&nvp->nvp_slot[slot];
2071 
2072 	ASSERT(nv_slotp->nvslot_spkt == NULL);
2073 
2074 	nv_slotp->nvslot_spkt = spkt;
2075 	nv_slotp->nvslot_flags = ncq;
2076 
2077 	/*
2078 	 * the sata module doesn't indicate which commands utilize the
2079 	 * DMA engine, so find out using this switch table.
2080 	 */
2081 	switch (spkt->satapkt_cmd.satacmd_cmd_reg) {
2082 	case SATAC_READ_DMA_EXT:
2083 	case SATAC_WRITE_DMA_EXT:
2084 	case SATAC_WRITE_DMA:
2085 	case SATAC_READ_DMA:
2086 	case SATAC_READ_DMA_QUEUED:
2087 	case SATAC_READ_DMA_QUEUED_EXT:
2088 	case SATAC_WRITE_DMA_QUEUED:
2089 	case SATAC_WRITE_DMA_QUEUED_EXT:
2090 	case SATAC_READ_FPDMA_QUEUED:
2091 	case SATAC_WRITE_FPDMA_QUEUED:
2092 	case SATAC_DSM:
2093 		dma_cmd = B_TRUE;
2094 		break;
2095 	default:
2096 		dma_cmd = B_FALSE;
2097 	}
2098 
2099 	if (sata_cmdp->satacmd_num_dma_cookies != 0 && dma_cmd == B_TRUE) {
2100 		NVLOG(NVDBG_DELIVER, nvc,  nvp, "DMA command", NULL);
2101 		nv_slotp->nvslot_start = nv_start_dma;
2102 		nv_slotp->nvslot_intr = nv_intr_dma;
2103 	} else if (spkt->satapkt_cmd.satacmd_cmd_reg == SATAC_PACKET) {
2104 		NVLOG(NVDBG_DELIVER, nvc,  nvp, "packet command", NULL);
2105 		nv_slotp->nvslot_start = nv_start_pkt_pio;
2106 		nv_slotp->nvslot_intr = nv_intr_pkt_pio;
2107 		if ((direction == SATA_DIR_READ) ||
2108 		    (direction == SATA_DIR_WRITE)) {
2109 			nv_slotp->nvslot_byte_count =
2110 			    spkt->satapkt_cmd.satacmd_bp->b_bcount;
2111 			nv_slotp->nvslot_v_addr =
2112 			    spkt->satapkt_cmd.satacmd_bp->b_un.b_addr;
2113 			/*
2114 			 * Freeing DMA resources allocated by the sata common
2115 			 * module to avoid buffer overwrite (dma sync) problems
2116 			 * when the buffer is released at command completion.
2117 			 * Primarily an issue on systems with more than
2118 			 * 4GB of memory.
2119 			 */
2120 			sata_free_dma_resources(spkt);
2121 		}
2122 	} else if (direction == SATA_DIR_NODATA_XFER) {
2123 		NVLOG(NVDBG_DELIVER, nvc, nvp, "non-data command", NULL);
2124 		nv_slotp->nvslot_start = nv_start_nodata;
2125 		nv_slotp->nvslot_intr = nv_intr_nodata;
2126 	} else if (direction == SATA_DIR_READ) {
2127 		NVLOG(NVDBG_DELIVER, nvc, nvp, "pio in command", NULL);
2128 		nv_slotp->nvslot_start = nv_start_pio_in;
2129 		nv_slotp->nvslot_intr = nv_intr_pio_in;
2130 		nv_slotp->nvslot_byte_count =
2131 		    spkt->satapkt_cmd.satacmd_bp->b_bcount;
2132 		nv_slotp->nvslot_v_addr =
2133 		    spkt->satapkt_cmd.satacmd_bp->b_un.b_addr;
2134 		/*
2135 		 * Freeing DMA resources allocated by the sata common module to
2136 		 * avoid buffer overwrite (dma sync) problems when the buffer
2137 		 * is released at command completion.  This is not an issue
2138 		 * for write because write does not update the buffer.
2139 		 * Primarily an issue on systems with more than 4GB of memory.
2140 		 */
2141 		sata_free_dma_resources(spkt);
2142 	} else if (direction == SATA_DIR_WRITE) {
2143 		NVLOG(NVDBG_DELIVER, nvc, nvp, "pio out command", NULL);
2144 		nv_slotp->nvslot_start = nv_start_pio_out;
2145 		nv_slotp->nvslot_intr = nv_intr_pio_out;
2146 		nv_slotp->nvslot_byte_count =
2147 		    spkt->satapkt_cmd.satacmd_bp->b_bcount;
2148 		nv_slotp->nvslot_v_addr =
2149 		    spkt->satapkt_cmd.satacmd_bp->b_un.b_addr;
2150 	} else {
2151 		nv_cmn_err(CE_WARN, nvc, nvp, "malformed command: direction"
2152 		    " %d cookies %d cmd %x",
2153 		    sata_cmdp->satacmd_flags.sata_data_direction,
2154 		    sata_cmdp->satacmd_num_dma_cookies,  cmd);
2155 		spkt->satapkt_reason = SATA_PKT_CMD_UNSUPPORTED;
2156 		ret = SATA_TRAN_CMD_UNSUPPORTED;
2157 
2158 		goto fail;
2159 	}
2160 
2161 	if ((ret = (*nv_slotp->nvslot_start)(nvp, slot)) ==
2162 	    SATA_TRAN_ACCEPTED) {
2163 #ifdef SGPIO_SUPPORT
2164 		nv_sgp_drive_active(nvp->nvp_ctlp,
2165 		    (nvp->nvp_ctlp->nvc_ctlr_num * 2) + nvp->nvp_port_num);
2166 #endif
2167 		nv_slotp->nvslot_stime = ddi_get_lbolt();
2168 
2169 		/*
2170 		 * start timer if it's not already running and this packet
2171 		 * is not requesting polled mode.
2172 		 */
2173 		if ((nvp->nvp_timeout_id == 0) &&
2174 		    ((spkt->satapkt_op_mode & SATA_OPMODE_POLLING) == 0)) {
2175 			nv_setup_timeout(nvp, NV_ONE_SEC);
2176 		}
2177 
2178 		nvp->nvp_previous_cmd = nvp->nvp_last_cmd;
2179 		nvp->nvp_last_cmd = spkt->satapkt_cmd.satacmd_cmd_reg;
2180 
2181 		return (SATA_TRAN_ACCEPTED);
2182 	}
2183 
2184 	fail:
2185 
2186 	spkt->satapkt_reason = SATA_TRAN_PORT_ERROR;
2187 
2188 	if (ncq == NVSLOT_NCQ) {
2189 		nvp->nvp_ncq_run--;
2190 		nvp->nvp_sactive_cache &= ~on_bit;
2191 	} else {
2192 		nvp->nvp_non_ncq_run--;
2193 	}
2194 	nv_slotp->nvslot_spkt = NULL;
2195 	nv_slotp->nvslot_flags = 0;
2196 
2197 	return (ret);
2198 }
2199 
2200 
2201 /*
2202  * Check if the signature is ready and if non-zero translate
2203  * it into a solaris sata defined type.
2204  */
2205 static void
nv_read_signature(nv_port_t * nvp)2206 nv_read_signature(nv_port_t *nvp)
2207 {
2208 	ddi_acc_handle_t cmdhdl = nvp->nvp_cmd_hdl;
2209 	int retry_count = 0;
2210 
2211 	retry:
2212 
2213 	nvp->nvp_signature = nv_get8(cmdhdl, nvp->nvp_count);
2214 	nvp->nvp_signature |= (nv_get8(cmdhdl, nvp->nvp_sect) << 8);
2215 	nvp->nvp_signature |= (nv_get8(cmdhdl, nvp->nvp_lcyl) << 16);
2216 	nvp->nvp_signature |= (nv_get8(cmdhdl, nvp->nvp_hcyl) << 24);
2217 
2218 	NVLOG(NVDBG_VERBOSE, nvp->nvp_ctlp, nvp,
2219 	    "nv_read_signature: 0x%x ", nvp->nvp_signature);
2220 
2221 	switch (nvp->nvp_signature) {
2222 
2223 	case NV_DISK_SIG:
2224 		NVLOG(NVDBG_RESET, nvp->nvp_ctlp, nvp, "drive is a disk", NULL);
2225 		DTRACE_PROBE(signature_is_disk_device_p)
2226 		nvp->nvp_type = SATA_DTYPE_ATADISK;
2227 
2228 		break;
2229 	case NV_ATAPI_SIG:
2230 		NVLOG(NVDBG_RESET, nvp->nvp_ctlp, nvp,
2231 		    "drive is an optical device", NULL);
2232 		DTRACE_PROBE(signature_is_optical_device_p)
2233 		nvp->nvp_type = SATA_DTYPE_ATAPICD;
2234 		break;
2235 	case NV_PM_SIG:
2236 		NVLOG(NVDBG_RESET, nvp->nvp_ctlp, nvp,
2237 		    "device is a port multiplier", NULL);
2238 		DTRACE_PROBE(signature_is_port_multiplier_p)
2239 		nvp->nvp_type = SATA_DTYPE_PMULT;
2240 		break;
2241 	case NV_NO_SIG:
2242 		NVLOG(NVDBG_VERBOSE, nvp->nvp_ctlp, nvp,
2243 		    "signature not available", NULL);
2244 		DTRACE_PROBE(sig_not_available_p);
2245 		nvp->nvp_type = SATA_DTYPE_UNKNOWN;
2246 		break;
2247 	default:
2248 		if (retry_count++ == 0) {
2249 			/*
2250 			 * this is a rare corner case where the controller
2251 			 * is updating the task file registers as the driver
2252 			 * is reading them.  If this happens, wait a bit and
2253 			 * retry once.
2254 			 */
2255 			NV_DELAY_NSEC(1000000);
2256 			NVLOG(NVDBG_VERBOSE, nvp->nvp_ctlp, nvp,
2257 			    "invalid signature 0x%x retry once",
2258 			    nvp->nvp_signature);
2259 			DTRACE_PROBE1(signature_invalid_retry_once_h,
2260 			    int, nvp->nvp_signature);
2261 
2262 			goto retry;
2263 		}
2264 
2265 		nv_cmn_err(CE_WARN, nvp->nvp_ctlp, nvp,
2266 		    "invalid signature 0x%x", nvp->nvp_signature);
2267 		nvp->nvp_type = SATA_DTYPE_UNKNOWN;
2268 
2269 		break;
2270 	}
2271 }
2272 
2273 
2274 /*
2275  * Set up a new timeout or complete a timeout in microseconds.
2276  * If microseconds is zero, no new timeout is scheduled.  Must be
2277  * called at the end of the timeout routine.
2278  */
2279 static void
nv_setup_timeout(nv_port_t * nvp,clock_t microseconds)2280 nv_setup_timeout(nv_port_t *nvp, clock_t microseconds)
2281 {
2282 	clock_t old_duration = nvp->nvp_timeout_duration;
2283 
2284 	if (microseconds == 0) {
2285 
2286 		return;
2287 	}
2288 
2289 	if (nvp->nvp_timeout_id != 0 && nvp->nvp_timeout_duration == 0) {
2290 		/*
2291 		 * Since we are dropping the mutex for untimeout,
2292 		 * the timeout may be executed while we are trying to
2293 		 * untimeout and setting up a new timeout.
2294 		 * If nvp_timeout_duration is 0, then this function
2295 		 * was re-entered. Just exit.
2296 		 */
2297 		cmn_err(CE_WARN, "nv_setup_timeout re-entered");
2298 
2299 		return;
2300 	}
2301 
2302 	nvp->nvp_timeout_duration = 0;
2303 
2304 	if (nvp->nvp_timeout_id == 0) {
2305 		/*
2306 		 * start new timer
2307 		 */
2308 		nvp->nvp_timeout_id = timeout(nv_timeout, (void *)nvp,
2309 		    drv_usectohz(microseconds));
2310 	} else {
2311 		/*
2312 		 * If the currently running timeout is due later than the
2313 		 * requested one, restart it with a new expiration.
2314 		 * Our timeouts do not need to be accurate - we would be just
2315 		 * checking that the specified time was exceeded.
2316 		 */
2317 		if (old_duration > microseconds) {
2318 			mutex_exit(&nvp->nvp_mutex);
2319 			(void) untimeout(nvp->nvp_timeout_id);
2320 			mutex_enter(&nvp->nvp_mutex);
2321 			nvp->nvp_timeout_id = timeout(nv_timeout, (void *)nvp,
2322 			    drv_usectohz(microseconds));
2323 		}
2324 	}
2325 
2326 	nvp->nvp_timeout_duration = microseconds;
2327 }
2328 
2329 
2330 
2331 int nv_reset_length = NV_RESET_LENGTH;
2332 
2333 /*
2334  * Reset the port
2335  */
2336 static void
nv_reset(nv_port_t * nvp,char * reason)2337 nv_reset(nv_port_t *nvp, char *reason)
2338 {
2339 	ddi_acc_handle_t bar5_hdl = nvp->nvp_ctlp->nvc_bar_hdl[5];
2340 	ddi_acc_handle_t cmdhdl = nvp->nvp_cmd_hdl;
2341 	nv_ctl_t *nvc = nvp->nvp_ctlp;
2342 	uint32_t sctrl, serr, sstatus;
2343 	uint8_t bmicx;
2344 	int i, j;
2345 	boolean_t reset_success = B_FALSE;
2346 
2347 	ASSERT(mutex_owned(&nvp->nvp_mutex));
2348 
2349 	/*
2350 	 * If the port is reset right after the controller receives
2351 	 * the DMA activate command (or possibly any other FIS),
2352 	 * controller operation freezes without any known recovery
2353 	 * procedure.  Until Nvidia advises on a recovery mechanism,
2354 	 * avoid the situation by waiting sufficiently long to
2355 	 * ensure the link is not actively transmitting any FIS.
2356 	 * 100ms was empirically determined to be large enough to
2357 	 * ensure no transaction was left in flight but not too long
2358 	 * as to cause any significant thread delay.
2359 	 */
2360 	drv_usecwait(100000);
2361 
2362 	serr = nv_get32(bar5_hdl, nvp->nvp_serror);
2363 	DTRACE_PROBE1(serror_h, int, serr);
2364 
2365 	/*
2366 	 * stop DMA engine.
2367 	 */
2368 	bmicx = nv_get8(nvp->nvp_bm_hdl, nvp->nvp_bmicx);
2369 	nv_put8(nvp->nvp_bm_hdl, nvp->nvp_bmicx,  bmicx & ~BMICX_SSBM);
2370 
2371 	/*
2372 	 * the current setting of the NV_RESET in nvp_state indicates whether
2373 	 * this is the first reset attempt or a retry.
2374 	 */
2375 	if (nvp->nvp_state & NV_RESET) {
2376 		nvp->nvp_reset_retry_count++;
2377 
2378 		NVLOG(NVDBG_RESET, nvc, nvp, "npv_reset_retry_count: %d",
2379 		    nvp->nvp_reset_retry_count);
2380 
2381 	} else {
2382 		nvp->nvp_reset_retry_count = 0;
2383 		nvp->nvp_reset_count++;
2384 		nvp->nvp_state |= NV_RESET;
2385 
2386 		NVLOG(NVDBG_RESET, nvc, nvp, "nvp_reset_count: %d reason: %s "
2387 		    "serror: 0x%x seq: %d run: %d cmd: 0x%x",
2388 		    nvp->nvp_reset_count, reason, serr, nvp->nvp_seq,
2389 		    nvp->nvp_non_ncq_run, nvp->nvp_last_cmd);
2390 	}
2391 
2392 	/*
2393 	 * a link event could have occurred slightly before excessive
2394 	 * interrupt processing invokes a reset.  Reset handling overrides
2395 	 * link event processing so it's safe to clear it here.
2396 	 */
2397 	nvp->nvp_state &= ~(NV_RESTORE|NV_LINK_EVENT);
2398 
2399 	nvp->nvp_reset_time = ddi_get_lbolt();
2400 
2401 	if ((nvp->nvp_state & (NV_ATTACH|NV_HOTPLUG)) == 0) {
2402 		nv_cmn_err(CE_NOTE, nvc, nvp, "nv_reset: reason: %s serr 0x%x"
2403 		    " nvp_state: 0x%x", reason, serr, nvp->nvp_state);
2404 		/*
2405 		 * keep a record of why the first reset occurred, for debugging
2406 		 */
2407 		if (nvp->nvp_first_reset_reason[0] == '\0') {
2408 			(void) strncpy(nvp->nvp_first_reset_reason,
2409 			    reason, NV_REASON_LEN);
2410 			nvp->nvp_first_reset_reason[NV_REASON_LEN - 1] = '\0';
2411 		}
2412 	}
2413 
2414 	(void) strncpy(nvp->nvp_reset_reason, reason, NV_REASON_LEN);
2415 
2416 	/*
2417 	 * ensure there is terminating NULL
2418 	 */
2419 	nvp->nvp_reset_reason[NV_REASON_LEN - 1] = '\0';
2420 
2421 	/*
2422 	 * Issue hardware reset; retry if necessary.
2423 	 */
2424 	for (i = 0; i < NV_COMRESET_ATTEMPTS; i++) {
2425 
2426 		/*
2427 		 * clear signature registers and the error register too
2428 		 */
2429 		nv_put8(cmdhdl, nvp->nvp_sect, 0);
2430 		nv_put8(cmdhdl, nvp->nvp_lcyl, 0);
2431 		nv_put8(cmdhdl, nvp->nvp_hcyl, 0);
2432 		nv_put8(cmdhdl, nvp->nvp_count, 0);
2433 
2434 		nv_put8(nvp->nvp_cmd_hdl, nvp->nvp_error, 0);
2435 
2436 		/*
2437 		 * assert reset in PHY by writing a 1 to bit 0 scontrol
2438 		 */
2439 		sctrl = nv_get32(bar5_hdl, nvp->nvp_sctrl);
2440 
2441 		nv_put32(bar5_hdl, nvp->nvp_sctrl,
2442 		    sctrl | SCONTROL_DET_COMRESET);
2443 
2444 		/* Wait at least 1ms, as required by the spec */
2445 		drv_usecwait(nv_reset_length);
2446 
2447 		serr = nv_get32(bar5_hdl, nvp->nvp_serror);
2448 		DTRACE_PROBE1(aftercomreset_serror_h, int, serr);
2449 
2450 		/* Reset all accumulated error bits */
2451 		nv_put32(bar5_hdl, nvp->nvp_serror, 0xffffffff);
2452 
2453 
2454 		sstatus = nv_get32(bar5_hdl, nvp->nvp_sstatus);
2455 		sctrl = nv_get32(bar5_hdl, nvp->nvp_sctrl);
2456 		NVLOG(NVDBG_RESET, nvc, nvp, "nv_reset: applied (%d); "
2457 		    "sctrl 0x%x, sstatus 0x%x", i, sctrl, sstatus);
2458 
2459 		/* de-assert reset in PHY */
2460 		nv_put32(bar5_hdl, nvp->nvp_sctrl,
2461 		    sctrl & ~SCONTROL_DET_COMRESET);
2462 
2463 		/*
2464 		 * Wait up to 10ms for COMINIT to arrive, indicating that
2465 		 * the device recognized COMRESET.
2466 		 */
2467 		for (j = 0; j < 10; j++) {
2468 			drv_usecwait(NV_ONE_MSEC);
2469 			sstatus = nv_get32(bar5_hdl, nvp->nvp_sstatus);
2470 			if ((SSTATUS_GET_IPM(sstatus) == SSTATUS_IPM_ACTIVE) &&
2471 			    (SSTATUS_GET_DET(sstatus) ==
2472 			    SSTATUS_DET_DEVPRE_PHYCOM)) {
2473 				reset_success = B_TRUE;
2474 				break;
2475 			}
2476 		}
2477 
2478 		if (reset_success == B_TRUE)
2479 			break;
2480 	}
2481 
2482 
2483 	serr = nv_get32(bar5_hdl, nvp->nvp_serror);
2484 	DTRACE_PROBE1(last_serror_h, int, serr);
2485 
2486 	if (reset_success == B_FALSE) {
2487 		NVLOG(NVDBG_RESET, nvc, nvp, "nv_reset not succeeded "
2488 		    "after %d attempts. serr: 0x%x", i, serr);
2489 	} else {
2490 		NVLOG(NVDBG_RESET, nvc, nvp, "nv_reset succeeded"
2491 		    " after %dms. serr: 0x%x", TICK_TO_MSEC(ddi_get_lbolt() -
2492 		    nvp->nvp_reset_time), serr);
2493 	}
2494 
2495 	nvp->nvp_wait_sig  = NV_WAIT_SIG;
2496 	nv_setup_timeout(nvp, nvp->nvp_wait_sig);
2497 }
2498 
2499 
2500 /*
2501  * Initialize register handling specific to mcp51/mcp55/mcp61
2502  */
2503 /* ARGSUSED */
2504 static void
mcp5x_reg_init(nv_ctl_t * nvc,ddi_acc_handle_t pci_conf_handle)2505 mcp5x_reg_init(nv_ctl_t *nvc, ddi_acc_handle_t pci_conf_handle)
2506 {
2507 	nv_port_t *nvp;
2508 	uchar_t *bar5  = nvc->nvc_bar_addr[5];
2509 	uint8_t off, port;
2510 
2511 	nvc->nvc_mcp5x_ctl = (uint32_t *)(bar5 + MCP5X_CTL);
2512 	nvc->nvc_mcp5x_ncq = (uint32_t *)(bar5 + MCP5X_NCQ);
2513 
2514 	for (port = 0, off = 0; port < NV_MAX_PORTS(nvc); port++, off += 2) {
2515 		nvp = &(nvc->nvc_port[port]);
2516 		nvp->nvp_mcp5x_int_status =
2517 		    (uint16_t *)(bar5 + MCP5X_INT_STATUS + off);
2518 		nvp->nvp_mcp5x_int_ctl =
2519 		    (uint16_t *)(bar5 + MCP5X_INT_CTL + off);
2520 
2521 		/*
2522 		 * clear any previous interrupts asserted
2523 		 */
2524 		nv_put16(nvc->nvc_bar_hdl[5], nvp->nvp_mcp5x_int_status,
2525 		    MCP5X_INT_CLEAR);
2526 
2527 		/*
2528 		 * These are the interrupts to accept for now.  The spec
2529 		 * says these are enable bits, but nvidia has indicated
2530 		 * these are masking bits.  Even though they may be masked
2531 		 * out to prevent asserting the main interrupt, they can
2532 		 * still be asserted while reading the interrupt status
2533 		 * register, so that needs to be considered in the interrupt
2534 		 * handler.
2535 		 */
2536 		nv_put16(nvc->nvc_bar_hdl[5], nvp->nvp_mcp5x_int_ctl,
2537 		    ~(MCP5X_INT_IGNORE));
2538 	}
2539 
2540 	/*
2541 	 * Allow the driver to program the BM on the first command instead
2542 	 * of waiting for an interrupt.
2543 	 */
2544 #ifdef NCQ
2545 	flags = MCP_SATA_AE_NCQ_PDEV_FIRST_CMD | MCP_SATA_AE_NCQ_SDEV_FIRST_CMD;
2546 	nv_put32(nvc->nvc_bar_hdl[5], nvc->nvc_mcp5x_ncq, flags);
2547 	flags = MCP_SATA_AE_CTL_PRI_SWNCQ | MCP_SATA_AE_CTL_SEC_SWNCQ;
2548 	nv_put32(nvc->nvc_bar_hdl[5], nvc->nvc_mcp5x_ctl, flags);
2549 #endif
2550 
2551 	/*
2552 	 * mcp55 rev A03 and above supports 40-bit physical addressing.
2553 	 * Enable DMA to take advantage of that.
2554 	 *
2555 	 */
2556 	if ((nvc->nvc_devid > 0x37f) ||
2557 	    ((nvc->nvc_devid == 0x37f) && (nvc->nvc_revid >= 0xa3))) {
2558 		if (nv_sata_40bit_dma == B_TRUE) {
2559 			uint32_t reg32;
2560 			NVLOG(NVDBG_INIT, nvp->nvp_ctlp, nvp,
2561 			    "devid is %X revid is %X. 40-bit DMA"
2562 			    " addressing enabled", nvc->nvc_devid,
2563 			    nvc->nvc_revid);
2564 			nvc->dma_40bit = B_TRUE;
2565 
2566 			reg32 = pci_config_get32(pci_conf_handle,
2567 			    NV_SATA_CFG_20);
2568 			pci_config_put32(pci_conf_handle, NV_SATA_CFG_20,
2569 			    reg32 | NV_40BIT_PRD);
2570 
2571 			/*
2572 			 * CFG_23 bits 0-7 contain the top 8 bits (of 40
2573 			 * bits) for the primary PRD table, and bits 8-15
2574 			 * contain the top 8 bits for the secondary.  Set
2575 			 * to zero because the DMA attribute table for PRD
2576 			 * allocation forces it into 32 bit address space
2577 			 * anyway.
2578 			 */
2579 			reg32 = pci_config_get32(pci_conf_handle,
2580 			    NV_SATA_CFG_23);
2581 			pci_config_put32(pci_conf_handle, NV_SATA_CFG_23,
2582 			    reg32 & 0xffff0000);
2583 		} else {
2584 			NVLOG(NVDBG_INIT, nvp->nvp_ctlp, nvp,
2585 			    "40-bit DMA disabled by nv_sata_40bit_dma", NULL);
2586 		}
2587 	} else {
2588 		nv_cmn_err(CE_NOTE, nvp->nvp_ctlp, nvp, "devid is %X revid is"
2589 		    " %X. Not capable of 40-bit DMA addressing",
2590 		    nvc->nvc_devid, nvc->nvc_revid);
2591 	}
2592 }
2593 
2594 
2595 /*
2596  * Initialize register handling specific to ck804
2597  */
2598 static void
ck804_reg_init(nv_ctl_t * nvc,ddi_acc_handle_t pci_conf_handle)2599 ck804_reg_init(nv_ctl_t *nvc, ddi_acc_handle_t pci_conf_handle)
2600 {
2601 	uchar_t *bar5  = nvc->nvc_bar_addr[5];
2602 	uint32_t reg32;
2603 	uint16_t reg16;
2604 	nv_port_t *nvp;
2605 	int j;
2606 
2607 	/*
2608 	 * delay hotplug interrupts until PHYRDY.
2609 	 */
2610 	reg32 = pci_config_get32(pci_conf_handle, NV_SATA_CFG_42);
2611 	pci_config_put32(pci_conf_handle, NV_SATA_CFG_42,
2612 	    reg32 | CK804_CFG_DELAY_HOTPLUG_INTR);
2613 
2614 	/*
2615 	 * enable hot plug interrupts for channel x and y
2616 	 */
2617 	reg16 = nv_get16(nvc->nvc_bar_hdl[5],
2618 	    (uint16_t *)(bar5 + NV_ADMACTL_X));
2619 	nv_put16(nvc->nvc_bar_hdl[5], (uint16_t *)(bar5 + NV_ADMACTL_X),
2620 	    NV_HIRQ_EN | reg16);
2621 
2622 
2623 	reg16 = nv_get16(nvc->nvc_bar_hdl[5],
2624 	    (uint16_t *)(bar5 + NV_ADMACTL_Y));
2625 	nv_put16(nvc->nvc_bar_hdl[5], (uint16_t *)(bar5 + NV_ADMACTL_Y),
2626 	    NV_HIRQ_EN | reg16);
2627 
2628 	nvc->nvc_ck804_int_status = (uint8_t *)(bar5 + CK804_SATA_INT_STATUS);
2629 
2630 	/*
2631 	 * clear any existing interrupt pending then enable
2632 	 */
2633 	for (j = 0; j < NV_MAX_PORTS(nvc); j++) {
2634 		nvp = &(nvc->nvc_port[j]);
2635 		mutex_enter(&nvp->nvp_mutex);
2636 		(*(nvp->nvp_ctlp->nvc_set_intr))(nvp,
2637 		    NV_INTR_CLEAR_ALL|NV_INTR_ENABLE);
2638 		mutex_exit(&nvp->nvp_mutex);
2639 	}
2640 }
2641 
2642 
2643 /*
2644  * Initialize the controller and set up driver data structures.
2645  * determine if ck804 or mcp5x class.
2646  */
2647 static int
nv_init_ctl(nv_ctl_t * nvc,ddi_acc_handle_t pci_conf_handle)2648 nv_init_ctl(nv_ctl_t *nvc, ddi_acc_handle_t pci_conf_handle)
2649 {
2650 	struct sata_hba_tran stran;
2651 	nv_port_t *nvp;
2652 	int j;
2653 	uchar_t *cmd_addr, *ctl_addr, *bm_addr;
2654 	ddi_acc_handle_t bar5_hdl = nvc->nvc_bar_hdl[5];
2655 	uchar_t *bar5  = nvc->nvc_bar_addr[5];
2656 	uint32_t reg32;
2657 	uint8_t reg8, reg8_save;
2658 
2659 	NVLOG(NVDBG_INIT, nvc, NULL, "nv_init_ctl entered", NULL);
2660 
2661 	nvc->nvc_mcp5x_flag = B_FALSE;
2662 
2663 	/*
2664 	 * Need to set bit 2 to 1 at config offset 0x50
2665 	 * to enable access to the bar5 registers.
2666 	 */
2667 	reg32 = pci_config_get32(pci_conf_handle, NV_SATA_CFG_20);
2668 	if (!(reg32 & NV_BAR5_SPACE_EN)) {
2669 		pci_config_put32(pci_conf_handle, NV_SATA_CFG_20,
2670 		    reg32 | NV_BAR5_SPACE_EN);
2671 	}
2672 
2673 	/*
2674 	 * Determine if this is ck804 or mcp5x.  ck804 will map in the
2675 	 * task file registers into bar5 while mcp5x won't.  The offset of
2676 	 * the task file registers in mcp5x's space is unused, so it will
2677 	 * return zero.  So check one of the task file registers to see if it is
2678 	 * writable and reads back what was written.  If it's mcp5x it will
2679 	 * return back 0xff whereas ck804 will return the value written.
2680 	 */
2681 	reg8_save = nv_get8(bar5_hdl,
2682 	    (uint8_t *)(bar5 + NV_BAR5_TRAN_LEN_CH_X));
2683 
2684 
2685 	for (j = 1; j < 3; j++) {
2686 
2687 		nv_put8(bar5_hdl, (uint8_t *)(bar5 + NV_BAR5_TRAN_LEN_CH_X), j);
2688 		reg8 = nv_get8(bar5_hdl,
2689 		    (uint8_t *)(bar5 + NV_BAR5_TRAN_LEN_CH_X));
2690 
2691 		if (reg8 != j) {
2692 			nvc->nvc_mcp5x_flag = B_TRUE;
2693 			break;
2694 		}
2695 	}
2696 
2697 	nv_put8(bar5_hdl, (uint8_t *)(bar5 + NV_BAR5_TRAN_LEN_CH_X), reg8_save);
2698 
2699 	if (nvc->nvc_mcp5x_flag == B_FALSE) {
2700 		NVLOG(NVDBG_INIT, nvc, NULL, "controller is CK804/MCP04",
2701 		    NULL);
2702 		nvc->nvc_interrupt = ck804_intr;
2703 		nvc->nvc_reg_init = ck804_reg_init;
2704 		nvc->nvc_set_intr = ck804_set_intr;
2705 	} else {
2706 		NVLOG(NVDBG_INIT, nvc, NULL, "controller is MCP51/MCP55/MCP61",
2707 		    NULL);
2708 		nvc->nvc_interrupt = mcp5x_intr;
2709 		nvc->nvc_reg_init = mcp5x_reg_init;
2710 		nvc->nvc_set_intr = mcp5x_set_intr;
2711 	}
2712 
2713 
2714 	stran.sata_tran_hba_rev = SATA_TRAN_HBA_REV;
2715 	stran.sata_tran_hba_dip = nvc->nvc_dip;
2716 	stran.sata_tran_hba_num_cports = NV_NUM_PORTS;
2717 	stran.sata_tran_hba_features_support =
2718 	    SATA_CTLF_HOTPLUG | SATA_CTLF_ASN | SATA_CTLF_ATAPI;
2719 	stran.sata_tran_hba_qdepth = NV_QUEUE_SLOTS;
2720 	stran.sata_tran_probe_port = nv_sata_probe;
2721 	stran.sata_tran_start = nv_sata_start;
2722 	stran.sata_tran_abort = nv_sata_abort;
2723 	stran.sata_tran_reset_dport = nv_sata_reset;
2724 	stran.sata_tran_selftest = NULL;
2725 	stran.sata_tran_hotplug_ops = &nv_hotplug_ops;
2726 	stran.sata_tran_pwrmgt_ops = NULL;
2727 	stran.sata_tran_ioctl = NULL;
2728 	nvc->nvc_sata_hba_tran = stran;
2729 
2730 	nvc->nvc_port = kmem_zalloc(sizeof (nv_port_t) * NV_MAX_PORTS(nvc),
2731 	    KM_SLEEP);
2732 
2733 	/*
2734 	 * initialize registers common to all chipsets
2735 	 */
2736 	nv_common_reg_init(nvc);
2737 
2738 	for (j = 0; j < NV_MAX_PORTS(nvc); j++) {
2739 		nvp = &(nvc->nvc_port[j]);
2740 
2741 		cmd_addr = nvp->nvp_cmd_addr;
2742 		ctl_addr = nvp->nvp_ctl_addr;
2743 		bm_addr = nvp->nvp_bm_addr;
2744 
2745 		mutex_init(&nvp->nvp_mutex, NULL, MUTEX_DRIVER,
2746 		    DDI_INTR_PRI(nvc->nvc_intr_pri));
2747 
2748 		cv_init(&nvp->nvp_sync_cv, NULL, CV_DRIVER, NULL);
2749 		cv_init(&nvp->nvp_reset_cv, NULL, CV_DRIVER, NULL);
2750 
2751 		nvp->nvp_data	= cmd_addr + NV_DATA;
2752 		nvp->nvp_error	= cmd_addr + NV_ERROR;
2753 		nvp->nvp_feature = cmd_addr + NV_FEATURE;
2754 		nvp->nvp_count	= cmd_addr + NV_COUNT;
2755 		nvp->nvp_sect	= cmd_addr + NV_SECT;
2756 		nvp->nvp_lcyl	= cmd_addr + NV_LCYL;
2757 		nvp->nvp_hcyl	= cmd_addr + NV_HCYL;
2758 		nvp->nvp_drvhd	= cmd_addr + NV_DRVHD;
2759 		nvp->nvp_status	= cmd_addr + NV_STATUS;
2760 		nvp->nvp_cmd	= cmd_addr + NV_CMD;
2761 		nvp->nvp_altstatus = ctl_addr + NV_ALTSTATUS;
2762 		nvp->nvp_devctl	= ctl_addr + NV_DEVCTL;
2763 
2764 		nvp->nvp_bmicx	= bm_addr + BMICX_REG;
2765 		nvp->nvp_bmisx	= bm_addr + BMISX_REG;
2766 		nvp->nvp_bmidtpx = (uint32_t *)(bm_addr + BMIDTPX_REG);
2767 
2768 		nvp->nvp_state = 0;
2769 
2770 		/*
2771 		 * Initialize dma handles, etc.
2772 		 * If it fails, the port is in inactive state.
2773 		 */
2774 		nv_init_port(nvp);
2775 	}
2776 
2777 	/*
2778 	 * initialize register by calling chip specific reg initialization
2779 	 */
2780 	(*(nvc->nvc_reg_init))(nvc, pci_conf_handle);
2781 
2782 	/* initialize the hba dma attribute */
2783 	if (nvc->dma_40bit == B_TRUE)
2784 		nvc->nvc_sata_hba_tran.sata_tran_hba_dma_attr =
2785 		    &buffer_dma_40bit_attr;
2786 	else
2787 		nvc->nvc_sata_hba_tran.sata_tran_hba_dma_attr =
2788 		    &buffer_dma_attr;
2789 
2790 	return (NV_SUCCESS);
2791 }
2792 
2793 
2794 /*
2795  * Initialize data structures with enough slots to handle queuing, if
2796  * enabled.  NV_QUEUE_SLOTS will be set to 1 or 32, depending on whether
2797  * NCQ support is built into the driver and enabled.  It might have been
2798  * better to derive the true size from the drive itself, but the sata
2799  * module only sends down that information on the first NCQ command,
2800  * which means possibly re-sizing the structures on an interrupt stack,
2801  * making error handling more messy.  The easy way is to just allocate
2802  * all 32 slots, which is what most drives support anyway.
2803  */
2804 static void
nv_init_port(nv_port_t * nvp)2805 nv_init_port(nv_port_t *nvp)
2806 {
2807 	nv_ctl_t *nvc = nvp->nvp_ctlp;
2808 	size_t	prd_size = sizeof (prde_t) * NV_DMA_NSEGS;
2809 	dev_info_t *dip = nvc->nvc_dip;
2810 	ddi_device_acc_attr_t dev_attr;
2811 	size_t buf_size;
2812 	ddi_dma_cookie_t cookie;
2813 	uint_t count;
2814 	int rc, i;
2815 
2816 	dev_attr.devacc_attr_version = DDI_DEVICE_ATTR_V0;
2817 	dev_attr.devacc_attr_endian_flags = DDI_NEVERSWAP_ACC;
2818 	dev_attr.devacc_attr_dataorder = DDI_STRICTORDER_ACC;
2819 
2820 	nvp->nvp_sg_dma_hdl = kmem_zalloc(sizeof (ddi_dma_handle_t) *
2821 	    NV_QUEUE_SLOTS, KM_SLEEP);
2822 
2823 	nvp->nvp_sg_acc_hdl = kmem_zalloc(sizeof (ddi_acc_handle_t) *
2824 	    NV_QUEUE_SLOTS, KM_SLEEP);
2825 
2826 	nvp->nvp_sg_addr = kmem_zalloc(sizeof (caddr_t) *
2827 	    NV_QUEUE_SLOTS, KM_SLEEP);
2828 
2829 	nvp->nvp_sg_paddr = kmem_zalloc(sizeof (uint32_t) *
2830 	    NV_QUEUE_SLOTS, KM_SLEEP);
2831 
2832 	nvp->nvp_slot = kmem_zalloc(sizeof (nv_slot_t) * NV_QUEUE_SLOTS,
2833 	    KM_SLEEP);
2834 
2835 	for (i = 0; i < NV_QUEUE_SLOTS; i++) {
2836 
2837 		rc = ddi_dma_alloc_handle(dip, &nv_prd_dma_attr,
2838 		    DDI_DMA_SLEEP, NULL, &(nvp->nvp_sg_dma_hdl[i]));
2839 
2840 		if (rc != DDI_SUCCESS) {
2841 			nv_uninit_port(nvp);
2842 
2843 			return;
2844 		}
2845 
2846 		rc = ddi_dma_mem_alloc(nvp->nvp_sg_dma_hdl[i], prd_size,
2847 		    &dev_attr, DDI_DMA_CONSISTENT, DDI_DMA_SLEEP,
2848 		    NULL, &(nvp->nvp_sg_addr[i]), &buf_size,
2849 		    &(nvp->nvp_sg_acc_hdl[i]));
2850 
2851 		if (rc != DDI_SUCCESS) {
2852 			nv_uninit_port(nvp);
2853 
2854 			return;
2855 		}
2856 
2857 		rc = ddi_dma_addr_bind_handle(nvp->nvp_sg_dma_hdl[i], NULL,
2858 		    nvp->nvp_sg_addr[i], buf_size,
2859 		    DDI_DMA_WRITE | DDI_DMA_CONSISTENT,
2860 		    DDI_DMA_SLEEP, NULL, &cookie, &count);
2861 
2862 		if (rc != DDI_DMA_MAPPED) {
2863 			nv_uninit_port(nvp);
2864 
2865 			return;
2866 		}
2867 
2868 		ASSERT(count == 1);
2869 		ASSERT((cookie.dmac_address & (sizeof (int) - 1)) == 0);
2870 
2871 		ASSERT(cookie.dmac_laddress <= UINT32_MAX);
2872 
2873 		nvp->nvp_sg_paddr[i] = cookie.dmac_address;
2874 	}
2875 
2876 	/*
2877 	 * nvp_queue_depth represents the actual drive queue depth, not the
2878 	 * number of slots allocated in the structures (which may be more).
2879 	 * Actual queue depth is only learned after the first NCQ command, so
2880 	 * initialize it to 1 for now.
2881 	 */
2882 	nvp->nvp_queue_depth = 1;
2883 
2884 	/*
2885 	 * Port is initialized whether the device is attached or not.
2886 	 * Link processing and device identification will be started later,
2887 	 * after interrupts are initialized.
2888 	 */
2889 	nvp->nvp_type = SATA_DTYPE_NONE;
2890 }
2891 
2892 
2893 /*
2894  * Free dynamically allocated structures for port.
2895  */
2896 static void
nv_uninit_port(nv_port_t * nvp)2897 nv_uninit_port(nv_port_t *nvp)
2898 {
2899 	int i;
2900 
2901 	NVLOG(NVDBG_INIT, nvp->nvp_ctlp, nvp,
2902 	    "nv_uninit_port uninitializing", NULL);
2903 
2904 #ifdef SGPIO_SUPPORT
2905 	if (nvp->nvp_type == SATA_DTYPE_ATADISK) {
2906 		nv_sgp_drive_disconnect(nvp->nvp_ctlp, SGP_CTLR_PORT_TO_DRV(
2907 		    nvp->nvp_ctlp->nvc_ctlr_num, nvp->nvp_port_num));
2908 	}
2909 #endif
2910 
2911 	nvp->nvp_type = SATA_DTYPE_NONE;
2912 
2913 	for (i = 0; i < NV_QUEUE_SLOTS; i++) {
2914 		if (nvp->nvp_sg_paddr[i]) {
2915 			(void) ddi_dma_unbind_handle(nvp->nvp_sg_dma_hdl[i]);
2916 		}
2917 
2918 		if (nvp->nvp_sg_acc_hdl[i] != NULL) {
2919 			ddi_dma_mem_free(&(nvp->nvp_sg_acc_hdl[i]));
2920 		}
2921 
2922 		if (nvp->nvp_sg_dma_hdl[i] != NULL) {
2923 			ddi_dma_free_handle(&(nvp->nvp_sg_dma_hdl[i]));
2924 		}
2925 	}
2926 
2927 	kmem_free(nvp->nvp_slot, sizeof (nv_slot_t) * NV_QUEUE_SLOTS);
2928 	nvp->nvp_slot = NULL;
2929 
2930 	kmem_free(nvp->nvp_sg_dma_hdl,
2931 	    sizeof (ddi_dma_handle_t) * NV_QUEUE_SLOTS);
2932 	nvp->nvp_sg_dma_hdl = NULL;
2933 
2934 	kmem_free(nvp->nvp_sg_acc_hdl,
2935 	    sizeof (ddi_acc_handle_t) * NV_QUEUE_SLOTS);
2936 	nvp->nvp_sg_acc_hdl = NULL;
2937 
2938 	kmem_free(nvp->nvp_sg_addr, sizeof (caddr_t) * NV_QUEUE_SLOTS);
2939 	nvp->nvp_sg_addr = NULL;
2940 
2941 	kmem_free(nvp->nvp_sg_paddr, sizeof (uint32_t) * NV_QUEUE_SLOTS);
2942 	nvp->nvp_sg_paddr = NULL;
2943 }
2944 
2945 
2946 /*
2947  * Cache register offsets and access handles to frequently accessed registers
2948  * which are common to either chipset.
2949  */
2950 static void
nv_common_reg_init(nv_ctl_t * nvc)2951 nv_common_reg_init(nv_ctl_t *nvc)
2952 {
2953 	uchar_t *bar5_addr = nvc->nvc_bar_addr[5];
2954 	uchar_t *bm_addr_offset, *sreg_offset;
2955 	uint8_t bar, port;
2956 	nv_port_t *nvp;
2957 
2958 	for (port = 0; port < NV_MAX_PORTS(nvc); port++) {
2959 		if (port == 0) {
2960 			bar = NV_BAR_0;
2961 			bm_addr_offset = 0;
2962 			sreg_offset = (uchar_t *)(CH0_SREG_OFFSET + bar5_addr);
2963 		} else {
2964 			bar = NV_BAR_2;
2965 			bm_addr_offset = (uchar_t *)8;
2966 			sreg_offset = (uchar_t *)(CH1_SREG_OFFSET + bar5_addr);
2967 		}
2968 
2969 		nvp = &(nvc->nvc_port[port]);
2970 		nvp->nvp_ctlp = nvc;
2971 		nvp->nvp_port_num = port;
2972 		NVLOG(NVDBG_INIT, nvc, nvp, "setting up port mappings", NULL);
2973 
2974 		nvp->nvp_cmd_hdl = nvc->nvc_bar_hdl[bar];
2975 		nvp->nvp_cmd_addr = nvc->nvc_bar_addr[bar];
2976 		nvp->nvp_ctl_hdl = nvc->nvc_bar_hdl[bar + 1];
2977 		nvp->nvp_ctl_addr = nvc->nvc_bar_addr[bar + 1];
2978 		nvp->nvp_bm_hdl = nvc->nvc_bar_hdl[NV_BAR_4];
2979 		nvp->nvp_bm_addr = nvc->nvc_bar_addr[NV_BAR_4] +
2980 		    (long)bm_addr_offset;
2981 
2982 		nvp->nvp_sstatus = (uint32_t *)(sreg_offset + NV_SSTATUS);
2983 		nvp->nvp_serror = (uint32_t *)(sreg_offset + NV_SERROR);
2984 		nvp->nvp_sactive = (uint32_t *)(sreg_offset + NV_SACTIVE);
2985 		nvp->nvp_sctrl = (uint32_t *)(sreg_offset + NV_SCTRL);
2986 	}
2987 }
2988 
2989 
2990 static void
nv_uninit_ctl(nv_ctl_t * nvc)2991 nv_uninit_ctl(nv_ctl_t *nvc)
2992 {
2993 	int port;
2994 	nv_port_t *nvp;
2995 
2996 	NVLOG(NVDBG_INIT, nvc, NULL, "nv_uninit_ctl entered", NULL);
2997 
2998 	for (port = 0; port < NV_MAX_PORTS(nvc); port++) {
2999 		nvp = &(nvc->nvc_port[port]);
3000 		mutex_enter(&nvp->nvp_mutex);
3001 		NVLOG(NVDBG_INIT, nvc, nvp, "uninitializing port", NULL);
3002 		nv_uninit_port(nvp);
3003 		mutex_exit(&nvp->nvp_mutex);
3004 		mutex_destroy(&nvp->nvp_mutex);
3005 		cv_destroy(&nvp->nvp_sync_cv);
3006 		cv_destroy(&nvp->nvp_reset_cv);
3007 	}
3008 
3009 	kmem_free(nvc->nvc_port, NV_MAX_PORTS(nvc) * sizeof (nv_port_t));
3010 	nvc->nvc_port = NULL;
3011 }
3012 
3013 
3014 /*
3015  * ck804 interrupt.  This is a wrapper around ck804_intr_process so
3016  * that interrupts from other devices can be disregarded while dtracing.
3017  */
3018 /* ARGSUSED */
3019 static uint_t
ck804_intr(caddr_t arg1,caddr_t arg2)3020 ck804_intr(caddr_t arg1, caddr_t arg2)
3021 {
3022 	nv_ctl_t *nvc = (nv_ctl_t *)arg1;
3023 	uint8_t intr_status;
3024 	ddi_acc_handle_t bar5_hdl = nvc->nvc_bar_hdl[5];
3025 
3026 	if (nvc->nvc_state & NV_CTRL_SUSPEND)
3027 		return (DDI_INTR_UNCLAIMED);
3028 
3029 	intr_status = ddi_get8(bar5_hdl, nvc->nvc_ck804_int_status);
3030 
3031 	if (intr_status == 0) {
3032 
3033 		return (DDI_INTR_UNCLAIMED);
3034 	}
3035 
3036 	ck804_intr_process(nvc, intr_status);
3037 
3038 	return (DDI_INTR_CLAIMED);
3039 }
3040 
3041 
3042 /*
3043  * Main interrupt handler for ck804.  handles normal device
3044  * interrupts and hot plug and remove interrupts.
3045  *
3046  */
3047 static void
ck804_intr_process(nv_ctl_t * nvc,uint8_t intr_status)3048 ck804_intr_process(nv_ctl_t *nvc, uint8_t intr_status)
3049 {
3050 
3051 	int port, i;
3052 	nv_port_t *nvp;
3053 	nv_slot_t *nv_slotp;
3054 	uchar_t	status;
3055 	sata_pkt_t *spkt;
3056 	uint8_t bmstatus, clear_bits;
3057 	ddi_acc_handle_t bmhdl;
3058 	int nvcleared = 0;
3059 	ddi_acc_handle_t bar5_hdl = nvc->nvc_bar_hdl[5];
3060 	uint32_t sstatus;
3061 	int port_mask_hot[] = {
3062 		CK804_INT_PDEV_HOT, CK804_INT_SDEV_HOT,
3063 	};
3064 	int port_mask_pm[] = {
3065 		CK804_INT_PDEV_PM, CK804_INT_SDEV_PM,
3066 	};
3067 
3068 	NVLOG(NVDBG_INTR, nvc, NULL,
3069 	    "ck804_intr_process entered intr_status=%x", intr_status);
3070 
3071 	/*
3072 	 * For command completion interrupt, explicit clear is not required.
3073 	 * however, for the error cases explicit clear is performed.
3074 	 */
3075 	for (port = 0; port < NV_MAX_PORTS(nvc); port++) {
3076 
3077 		int port_mask[] = {CK804_INT_PDEV_INT, CK804_INT_SDEV_INT};
3078 
3079 		if ((port_mask[port] & intr_status) == 0) {
3080 
3081 			continue;
3082 		}
3083 
3084 		NVLOG(NVDBG_INTR, nvc, NULL,
3085 		    "ck804_intr_process interrupt on port %d", port);
3086 
3087 		nvp = &(nvc->nvc_port[port]);
3088 
3089 		mutex_enter(&nvp->nvp_mutex);
3090 
3091 		/*
3092 		 * this case might be encountered when the other port
3093 		 * is active
3094 		 */
3095 		if (nvp->nvp_state & NV_DEACTIVATED) {
3096 
3097 			/*
3098 			 * clear interrupt bits
3099 			 */
3100 			nv_put8(bar5_hdl, nvc->nvc_ck804_int_status,
3101 			    port_mask[port]);
3102 
3103 			mutex_exit(&nvp->nvp_mutex);
3104 
3105 			continue;
3106 		}
3107 
3108 
3109 		if ((&(nvp->nvp_slot[0]))->nvslot_spkt == NULL)  {
3110 			status = nv_get8(nvp->nvp_ctl_hdl, nvp->nvp_status);
3111 			NVLOG(NVDBG_ALWAYS, nvc, nvp, "spurious interrupt "
3112 			    " no command in progress status=%x", status);
3113 			mutex_exit(&nvp->nvp_mutex);
3114 
3115 			/*
3116 			 * clear interrupt bits
3117 			 */
3118 			nv_put8(bar5_hdl, nvc->nvc_ck804_int_status,
3119 			    port_mask[port]);
3120 
3121 			continue;
3122 		}
3123 
3124 		bmhdl = nvp->nvp_bm_hdl;
3125 		bmstatus = nv_get8(bmhdl, nvp->nvp_bmisx);
3126 
3127 		if (!(bmstatus & BMISX_IDEINTS)) {
3128 			mutex_exit(&nvp->nvp_mutex);
3129 
3130 			continue;
3131 		}
3132 
3133 		status = nv_get8(nvp->nvp_ctl_hdl, nvp->nvp_altstatus);
3134 
3135 		if (status & SATA_STATUS_BSY) {
3136 			mutex_exit(&nvp->nvp_mutex);
3137 
3138 			continue;
3139 		}
3140 
3141 		nv_slotp = &(nvp->nvp_slot[0]);
3142 
3143 		ASSERT(nv_slotp);
3144 
3145 		spkt = nv_slotp->nvslot_spkt;
3146 
3147 		if (spkt == NULL) {
3148 			mutex_exit(&nvp->nvp_mutex);
3149 
3150 			continue;
3151 		}
3152 
3153 		(*nv_slotp->nvslot_intr)(nvp, nv_slotp);
3154 
3155 		nv_copy_registers(nvp, &spkt->satapkt_device, spkt);
3156 
3157 		if (nv_slotp->nvslot_flags == NVSLOT_COMPLETE) {
3158 
3159 			nv_complete_io(nvp, spkt, 0);
3160 		}
3161 
3162 		mutex_exit(&nvp->nvp_mutex);
3163 	}
3164 
3165 	/*
3166 	 * ck804 often doesn't correctly distinguish hot add/remove
3167 	 * interrupts.  Frequently both the ADD and the REMOVE bits
3168 	 * are asserted, whether it was a remove or add.  Use sstatus
3169 	 * to distinguish hot add from hot remove.
3170 	 */
3171 
3172 	for (port = 0; port < NV_MAX_PORTS(nvc); port++) {
3173 		clear_bits = 0;
3174 
3175 		nvp = &(nvc->nvc_port[port]);
3176 		mutex_enter(&nvp->nvp_mutex);
3177 
3178 		if ((port_mask_pm[port] & intr_status) != 0) {
3179 			clear_bits = port_mask_pm[port];
3180 			NVLOG(NVDBG_HOT, nvc, nvp,
3181 			    "clearing PM interrupt bit: %x",
3182 			    intr_status & port_mask_pm[port]);
3183 		}
3184 
3185 		if ((port_mask_hot[port] & intr_status) == 0) {
3186 			if (clear_bits != 0) {
3187 				goto clear;
3188 			} else {
3189 				mutex_exit(&nvp->nvp_mutex);
3190 				continue;
3191 			}
3192 		}
3193 
3194 		/*
3195 		 * reaching here means there was a hot add or remove.
3196 		 */
3197 		clear_bits |= port_mask_hot[port];
3198 
3199 		ASSERT(nvc->nvc_port[port].nvp_sstatus);
3200 
3201 		sstatus = nv_get32(bar5_hdl,
3202 		    nvc->nvc_port[port].nvp_sstatus);
3203 
3204 		if ((sstatus & SSTATUS_DET_DEVPRE_PHYCOM) ==
3205 		    SSTATUS_DET_DEVPRE_PHYCOM) {
3206 			nv_link_event(nvp, NV_REM_DEV);
3207 		} else {
3208 			nv_link_event(nvp, NV_ADD_DEV);
3209 		}
3210 	clear:
3211 		/*
3212 		 * clear interrupt bits.  explicit interrupt clear is
3213 		 * required for hotplug interrupts.
3214 		 */
3215 		nv_put8(bar5_hdl, nvc->nvc_ck804_int_status, clear_bits);
3216 
3217 		/*
3218 		 * make sure it's flushed and cleared.  If not try
3219 		 * again.  Sometimes it has been observed to not clear
3220 		 * on the first try.
3221 		 */
3222 		intr_status = nv_get8(bar5_hdl, nvc->nvc_ck804_int_status);
3223 
3224 		/*
3225 		 * make 10 additional attempts to clear the interrupt
3226 		 */
3227 		for (i = 0; (intr_status & clear_bits) && (i < 10); i++) {
3228 			NVLOG(NVDBG_ALWAYS, nvc, nvp, "inst_status=%x "
3229 			    "still not clear try=%d", intr_status,
3230 			    ++nvcleared);
3231 			nv_put8(bar5_hdl, nvc->nvc_ck804_int_status,
3232 			    clear_bits);
3233 			intr_status = nv_get8(bar5_hdl,
3234 			    nvc->nvc_ck804_int_status);
3235 		}
3236 
3237 		/*
3238 		 * if still not clear, log a message and disable the
3239 		 * port. highly unlikely that this path is taken, but it
3240 		 * gives protection against a wedged interrupt.
3241 		 */
3242 		if (intr_status & clear_bits) {
3243 			(*(nvc->nvc_set_intr))(nvp, NV_INTR_DISABLE);
3244 			nv_port_state_change(nvp, SATA_EVNT_PORT_FAILED,
3245 			    SATA_ADDR_CPORT, SATA_PSTATE_FAILED);
3246 			nvp->nvp_state |= NV_FAILED;
3247 			(void) nv_abort_active(nvp, NULL, SATA_PKT_DEV_ERROR,
3248 			    B_TRUE);
3249 			nv_cmn_err(CE_WARN, nvc, nvp, "unable to clear "
3250 			    "interrupt.  disabling port intr_status=%X",
3251 			    intr_status);
3252 		}
3253 
3254 		mutex_exit(&nvp->nvp_mutex);
3255 	}
3256 }
3257 
3258 
3259 /*
3260  * Interrupt handler for mcp5x.  It is invoked by the wrapper for each port
3261  * on the controller, to handle completion and hot plug and remove events.
3262  */
3263 static uint_t
mcp5x_intr_port(nv_port_t * nvp)3264 mcp5x_intr_port(nv_port_t *nvp)
3265 {
3266 	nv_ctl_t *nvc = nvp->nvp_ctlp;
3267 	ddi_acc_handle_t bar5_hdl = nvc->nvc_bar_hdl[5];
3268 	uint8_t clear = 0, intr_cycles = 0;
3269 	int ret = DDI_INTR_UNCLAIMED;
3270 	uint16_t int_status;
3271 	clock_t intr_time;
3272 	int loop_cnt = 0;
3273 
3274 	nvp->intr_start_time = ddi_get_lbolt();
3275 
3276 	NVLOG(NVDBG_INTR, nvc, nvp, "mcp55_intr_port entered", NULL);
3277 
3278 	do {
3279 		/*
3280 		 * read current interrupt status
3281 		 */
3282 		int_status = nv_get16(bar5_hdl, nvp->nvp_mcp5x_int_status);
3283 
3284 		/*
3285 		 * if the port is deactivated, just clear the interrupt and
3286 		 * return.  can get here even if interrupts were disabled
3287 		 * on this port but enabled on the other.
3288 		 */
3289 		if (nvp->nvp_state & NV_DEACTIVATED) {
3290 			nv_put16(bar5_hdl, nvp->nvp_mcp5x_int_status,
3291 			    int_status);
3292 
3293 			return (DDI_INTR_CLAIMED);
3294 		}
3295 
3296 		NVLOG(NVDBG_INTR, nvc, nvp, "int_status = %x", int_status);
3297 
3298 		DTRACE_PROBE1(int_status_before_h, int, int_status);
3299 
3300 		/*
3301 		 * MCP5X_INT_IGNORE interrupts will show up in the status,
3302 		 * but are masked out from causing an interrupt to be generated
3303 		 * to the processor.  Ignore them here by masking them out.
3304 		 */
3305 		int_status &= ~(MCP5X_INT_IGNORE);
3306 
3307 		DTRACE_PROBE1(int_status_after_h, int, int_status);
3308 
3309 		/*
3310 		 * exit the loop when no more interrupts to process
3311 		 */
3312 		if (int_status == 0) {
3313 
3314 			break;
3315 		}
3316 
3317 		if (int_status & MCP5X_INT_COMPLETE) {
3318 			NVLOG(NVDBG_INTR, nvc, nvp,
3319 			    "mcp5x_packet_complete_intr", NULL);
3320 			/*
3321 			 * since int_status was set, return DDI_INTR_CLAIMED
3322 			 * from the DDI's perspective even though the packet
3323 			 * completion may not have succeeded.  If it fails,
3324 			 * need to manually clear the interrupt, otherwise
3325 			 * clearing is implicit as a result of reading the
3326 			 * task file status register.
3327 			 */
3328 			ret = DDI_INTR_CLAIMED;
3329 			if (mcp5x_packet_complete_intr(nvc, nvp) ==
3330 			    NV_FAILURE) {
3331 				clear |= MCP5X_INT_COMPLETE;
3332 			} else {
3333 				intr_cycles = 0;
3334 			}
3335 		}
3336 
3337 		if (int_status & MCP5X_INT_DMA_SETUP) {
3338 			NVLOG(NVDBG_INTR, nvc, nvp, "mcp5x_dma_setup_intr",
3339 			    NULL);
3340 
3341 			/*
3342 			 * Needs to be cleared before starting the BM, so do it
3343 			 * now.  make sure this is still working.
3344 			 */
3345 			nv_put16(bar5_hdl, nvp->nvp_mcp5x_int_status,
3346 			    MCP5X_INT_DMA_SETUP);
3347 #ifdef NCQ
3348 			ret = mcp5x_dma_setup_intr(nvc, nvp);
3349 #endif
3350 		}
3351 
3352 		if (int_status & MCP5X_INT_REM) {
3353 			clear |= MCP5X_INT_REM;
3354 			ret = DDI_INTR_CLAIMED;
3355 
3356 			mutex_enter(&nvp->nvp_mutex);
3357 			nv_link_event(nvp, NV_REM_DEV);
3358 			mutex_exit(&nvp->nvp_mutex);
3359 
3360 		} else if (int_status & MCP5X_INT_ADD) {
3361 			clear |= MCP5X_INT_ADD;
3362 			ret = DDI_INTR_CLAIMED;
3363 
3364 			mutex_enter(&nvp->nvp_mutex);
3365 			nv_link_event(nvp, NV_ADD_DEV);
3366 			mutex_exit(&nvp->nvp_mutex);
3367 		}
3368 		if (clear) {
3369 			nv_put16(bar5_hdl, nvp->nvp_mcp5x_int_status, clear);
3370 			clear = 0;
3371 		}
3372 
3373 		/*
3374 		 * protect against a stuck interrupt
3375 		 */
3376 		if (intr_cycles++ == NV_MAX_INTR_LOOP) {
3377 
3378 			NVLOG(NVDBG_INTR, nvc, nvp, "excessive interrupt "
3379 			    "processing.  Disabling interrupts int_status=%X"
3380 			    " clear=%X", int_status, clear);
3381 			DTRACE_PROBE(excessive_interrupts_f);
3382 
3383 			mutex_enter(&nvp->nvp_mutex);
3384 			(*(nvc->nvc_set_intr))(nvp, NV_INTR_DISABLE);
3385 			/*
3386 			 * reset the device.  If it remains inaccessible
3387 			 * after a reset it will be failed then.
3388 			 */
3389 			(void) nv_abort_active(nvp, NULL, SATA_PKT_DEV_ERROR,
3390 			    B_TRUE);
3391 			mutex_exit(&nvp->nvp_mutex);
3392 		}
3393 
3394 	} while (loop_cnt++ < nv_max_intr_loops);
3395 
3396 	if (loop_cnt > nvp->intr_loop_cnt) {
3397 		NVLOG(NVDBG_INTR, nvp->nvp_ctlp, nvp,
3398 		    "Exiting with multiple intr loop count %d", loop_cnt);
3399 		nvp->intr_loop_cnt = loop_cnt;
3400 	}
3401 
3402 	if ((nv_debug_flags & (NVDBG_INTR | NVDBG_VERBOSE)) ==
3403 	    (NVDBG_INTR | NVDBG_VERBOSE)) {
3404 		uint8_t status, bmstatus;
3405 		uint16_t int_status2;
3406 
3407 		if (int_status & MCP5X_INT_COMPLETE) {
3408 			status = nv_get8(nvp->nvp_ctl_hdl, nvp->nvp_altstatus);
3409 			bmstatus = nv_get8(nvp->nvp_bm_hdl, nvp->nvp_bmisx);
3410 			int_status2 = nv_get16(nvp->nvp_ctlp->nvc_bar_hdl[5],
3411 			    nvp->nvp_mcp5x_int_status);
3412 			NVLOG(NVDBG_TIMEOUT, nvp->nvp_ctlp, nvp,
3413 			    "mcp55_intr_port: Exiting with altstatus %x, "
3414 			    "bmicx %x, int_status2 %X, int_status %X, ret %x,"
3415 			    " loop_cnt %d ", status, bmstatus, int_status2,
3416 			    int_status, ret, loop_cnt);
3417 		}
3418 	}
3419 
3420 	NVLOG(NVDBG_INTR, nvc, nvp, "mcp55_intr_port: finished ret=%d", ret);
3421 
3422 	/*
3423 	 * To facilitate debugging, keep track of the length of time spent in
3424 	 * the port interrupt routine.
3425 	 */
3426 	intr_time = ddi_get_lbolt() - nvp->intr_start_time;
3427 	if (intr_time > nvp->intr_duration)
3428 		nvp->intr_duration = intr_time;
3429 
3430 	return (ret);
3431 }
3432 
3433 
3434 /* ARGSUSED */
3435 static uint_t
mcp5x_intr(caddr_t arg1,caddr_t arg2)3436 mcp5x_intr(caddr_t arg1, caddr_t arg2)
3437 {
3438 	nv_ctl_t *nvc = (nv_ctl_t *)arg1;
3439 	int ret;
3440 
3441 	if (nvc->nvc_state & NV_CTRL_SUSPEND)
3442 		return (DDI_INTR_UNCLAIMED);
3443 
3444 	ret = mcp5x_intr_port(&(nvc->nvc_port[0]));
3445 	ret |= mcp5x_intr_port(&(nvc->nvc_port[1]));
3446 
3447 	return (ret);
3448 }
3449 
3450 
3451 #ifdef NCQ
3452 /*
3453  * with software driven NCQ on mcp5x, an interrupt occurs right
3454  * before the drive is ready to do a DMA transfer.  At this point,
3455  * the PRD table needs to be programmed and the DMA engine enabled
3456  * and ready to go.
3457  *
3458  * -- MCP_SATA_AE_INT_STATUS_SDEV_DMA_SETUP indicates the interrupt
3459  * -- MCP_SATA_AE_NCQ_PDEV_DMA_SETUP_TAG shows which command is ready
3460  * -- clear bit 0 of master command reg
3461  * -- program PRD
3462  * -- clear the interrupt status bit for the DMA Setup FIS
3463  * -- set bit 0 of the bus master command register
3464  */
3465 static int
mcp5x_dma_setup_intr(nv_ctl_t * nvc,nv_port_t * nvp)3466 mcp5x_dma_setup_intr(nv_ctl_t *nvc, nv_port_t *nvp)
3467 {
3468 	int slot;
3469 	ddi_acc_handle_t bmhdl = nvp->nvp_bm_hdl;
3470 	uint8_t bmicx;
3471 	int port = nvp->nvp_port_num;
3472 	uint8_t tag_shift[] = {MCP_SATA_AE_NCQ_PDEV_DMA_SETUP_TAG_SHIFT,
3473 	    MCP_SATA_AE_NCQ_SDEV_DMA_SETUP_TAG_SHIFT};
3474 
3475 	nv_cmn_err(CE_PANIC, nvc, nvp,
3476 	    "this is should not be executed at all until NCQ");
3477 
3478 	mutex_enter(&nvp->nvp_mutex);
3479 
3480 	slot = nv_get32(nvc->nvc_bar_hdl[5], nvc->nvc_mcp5x_ncq);
3481 
3482 	slot = (slot >> tag_shift[port]) & MCP_SATA_AE_NCQ_DMA_SETUP_TAG_MASK;
3483 
3484 	NVLOG(NVDBG_INTR, nvc, nvp, "mcp5x_dma_setup_intr slot %d"
3485 	    " nvp_slot_sactive %X", slot, nvp->nvp_sactive_cache);
3486 
3487 	/*
3488 	 * halt the DMA engine.  This step is necessary according to
3489 	 * the mcp5x spec, probably since there may have been a "first" packet
3490 	 * that already programmed the DMA engine, but may not turn out to
3491 	 * be the first one processed.
3492 	 */
3493 	bmicx = nv_get8(bmhdl, nvp->nvp_bmicx);
3494 
3495 	if (bmicx & BMICX_SSBM) {
3496 		NVLOG(NVDBG_INTR, nvc, nvp, "BM was already enabled for "
3497 		    "another packet.  Cancelling and reprogramming", NULL);
3498 		nv_put8(bmhdl, nvp->nvp_bmicx,  bmicx & ~BMICX_SSBM);
3499 	}
3500 	nv_put8(bmhdl, nvp->nvp_bmicx,  bmicx & ~BMICX_SSBM);
3501 
3502 	nv_start_dma_engine(nvp, slot);
3503 
3504 	mutex_exit(&nvp->nvp_mutex);
3505 
3506 	return (DDI_INTR_CLAIMED);
3507 }
3508 #endif /* NCQ */
3509 
3510 
3511 /*
3512  * packet completion interrupt.  If the packet is complete, invoke
3513  * the packet completion callback.
3514  */
3515 static int
mcp5x_packet_complete_intr(nv_ctl_t * nvc,nv_port_t * nvp)3516 mcp5x_packet_complete_intr(nv_ctl_t *nvc, nv_port_t *nvp)
3517 {
3518 	uint8_t status, bmstatus;
3519 	ddi_acc_handle_t bmhdl = nvp->nvp_bm_hdl;
3520 	int sactive;
3521 	int active_pkt_bit = 0, active_pkt = 0, ncq_command = B_FALSE;
3522 	sata_pkt_t *spkt;
3523 	nv_slot_t *nv_slotp;
3524 
3525 	mutex_enter(&nvp->nvp_mutex);
3526 
3527 	bmstatus = nv_get8(bmhdl, nvp->nvp_bmisx);
3528 
3529 	if (!(bmstatus & (BMISX_IDEINTS | BMISX_IDERR))) {
3530 		DTRACE_PROBE1(bmstatus_h, int, bmstatus);
3531 		NVLOG(NVDBG_INTR, nvc, nvp, "BMISX_IDEINTS not set %x",
3532 		    bmstatus);
3533 		mutex_exit(&nvp->nvp_mutex);
3534 
3535 		return (NV_FAILURE);
3536 	}
3537 
3538 	/*
3539 	 * Commands may have been processed by abort or timeout before
3540 	 * interrupt processing acquired the mutex. So we may be processing
3541 	 * an interrupt for packets that were already removed.
3542 	 * For functioning NCQ processing all slots may be checked, but
3543 	 * with NCQ disabled (current code), relying on *_run flags is OK.
3544 	 */
3545 	if (nvp->nvp_non_ncq_run) {
3546 		/*
3547 		 * If the just completed item is a non-ncq command, the busy
3548 		 * bit should not be set
3549 		 */
3550 		status = nv_get8(nvp->nvp_ctl_hdl, nvp->nvp_altstatus);
3551 		if (status & SATA_STATUS_BSY) {
3552 			nv_cmn_err(CE_WARN, nvc, nvp,
3553 			    "unexpected SATA_STATUS_BSY set");
3554 			DTRACE_PROBE(unexpected_status_bsy_p);
3555 			mutex_exit(&nvp->nvp_mutex);
3556 			/*
3557 			 * calling function will clear interrupt.  then
3558 			 * the real interrupt will either arrive or the
3559 			 * packet timeout handling will take over and
3560 			 * reset.
3561 			 */
3562 			return (NV_FAILURE);
3563 		}
3564 		ASSERT(nvp->nvp_ncq_run == 0);
3565 	} else {
3566 		ASSERT(nvp->nvp_non_ncq_run == 0);
3567 		/*
3568 		 * Pre-NCQ code!
3569 		 * Nothing to do. The packet for the command that just
3570 		 * completed is already gone. Just clear the interrupt.
3571 		 */
3572 		(void) nv_bm_status_clear(nvp);
3573 		(void) nv_get8(nvp->nvp_cmd_hdl, nvp->nvp_status);
3574 		mutex_exit(&nvp->nvp_mutex);
3575 		return (NV_SUCCESS);
3576 
3577 		/*
3578 		 * NCQ check for BSY here and wait if still bsy before
3579 		 * continuing. Rather than wait for it to be cleared
3580 		 * when starting a packet and wasting CPU time, the starting
3581 		 * thread can exit immediate, but might have to spin here
3582 		 * for a bit possibly.  Needs more work and experimentation.
3583 		 *
3584 		 */
3585 	}
3586 
3587 	/*
3588 	 * active_pkt_bit will represent the bitmap of the single completed
3589 	 * packet.  Because of the nature of sw assisted NCQ, only one
3590 	 * command will complete per interrupt.
3591 	 */
3592 
3593 	if (ncq_command == B_FALSE) {
3594 		active_pkt = 0;
3595 	} else {
3596 		/*
3597 		 * NCQ: determine which command just completed, by examining
3598 		 * which bit cleared in the register since last written.
3599 		 */
3600 		sactive = nv_get32(nvc->nvc_bar_hdl[5], nvp->nvp_sactive);
3601 
3602 		active_pkt_bit = ~sactive & nvp->nvp_sactive_cache;
3603 
3604 		ASSERT(active_pkt_bit);
3605 
3606 
3607 		/*
3608 		 * this failure path needs more work to handle the
3609 		 * error condition and recovery.
3610 		 */
3611 		if (active_pkt_bit == 0) {
3612 			ddi_acc_handle_t cmdhdl = nvp->nvp_cmd_hdl;
3613 
3614 			nv_cmn_err(CE_CONT, nvc, nvp, "ERROR sactive = %X  "
3615 			    "nvp->nvp_sactive %X", sactive,
3616 			    nvp->nvp_sactive_cache);
3617 
3618 			(void) nv_get8(cmdhdl, nvp->nvp_status);
3619 
3620 			mutex_exit(&nvp->nvp_mutex);
3621 
3622 			return (NV_FAILURE);
3623 		}
3624 
3625 		for (active_pkt = 0; (active_pkt_bit & 0x1) != 0x1;
3626 		    active_pkt++, active_pkt_bit >>= 1) {
3627 		}
3628 
3629 		/*
3630 		 * make sure only one bit is ever turned on
3631 		 */
3632 		ASSERT(active_pkt_bit == 1);
3633 
3634 		nvp->nvp_sactive_cache &= ~(0x01 << active_pkt);
3635 	}
3636 
3637 	nv_slotp = &(nvp->nvp_slot[active_pkt]);
3638 
3639 	spkt = nv_slotp->nvslot_spkt;
3640 
3641 	ASSERT(spkt != NULL);
3642 
3643 	(*nv_slotp->nvslot_intr)(nvp, nv_slotp);
3644 
3645 	nv_copy_registers(nvp, &spkt->satapkt_device, spkt);
3646 
3647 	if (nv_slotp->nvslot_flags == NVSLOT_COMPLETE) {
3648 
3649 		nv_complete_io(nvp, spkt, active_pkt);
3650 	}
3651 
3652 	mutex_exit(&nvp->nvp_mutex);
3653 
3654 	return (NV_SUCCESS);
3655 }
3656 
3657 
3658 static void
nv_complete_io(nv_port_t * nvp,sata_pkt_t * spkt,int slot)3659 nv_complete_io(nv_port_t *nvp, sata_pkt_t *spkt, int slot)
3660 {
3661 
3662 	ASSERT(MUTEX_HELD(&nvp->nvp_mutex));
3663 
3664 	if ((&(nvp->nvp_slot[slot]))->nvslot_flags & NVSLOT_NCQ) {
3665 		nvp->nvp_ncq_run--;
3666 	} else {
3667 		nvp->nvp_non_ncq_run--;
3668 	}
3669 
3670 	/*
3671 	 * mark the packet slot idle so it can be reused.  Do this before
3672 	 * calling satapkt_comp so the slot can be reused.
3673 	 */
3674 	(&(nvp->nvp_slot[slot]))->nvslot_spkt = NULL;
3675 
3676 	if (spkt->satapkt_op_mode & SATA_OPMODE_SYNCH) {
3677 		/*
3678 		 * If this is not timed polled mode cmd, which has an
3679 		 * active thread monitoring for completion, then need
3680 		 * to signal the sleeping thread that the cmd is complete.
3681 		 */
3682 		if ((spkt->satapkt_op_mode & SATA_OPMODE_POLLING) == 0) {
3683 			cv_signal(&nvp->nvp_sync_cv);
3684 		}
3685 
3686 		return;
3687 	}
3688 
3689 	if (spkt->satapkt_comp != NULL) {
3690 		mutex_exit(&nvp->nvp_mutex);
3691 		(*spkt->satapkt_comp)(spkt);
3692 		mutex_enter(&nvp->nvp_mutex);
3693 	}
3694 }
3695 
3696 
3697 /*
3698  * check whether packet is ncq command or not.  for ncq command,
3699  * start it if there is still room on queue.  for non-ncq command only
3700  * start if no other command is running.
3701  */
3702 static int
nv_start_async(nv_port_t * nvp,sata_pkt_t * spkt)3703 nv_start_async(nv_port_t *nvp, sata_pkt_t *spkt)
3704 {
3705 	uint8_t cmd, ncq;
3706 
3707 	NVLOG(NVDBG_ENTRY, nvp->nvp_ctlp, nvp, "nv_start_async: entry", NULL);
3708 
3709 	cmd = spkt->satapkt_cmd.satacmd_cmd_reg;
3710 
3711 	ncq = ((cmd == SATAC_WRITE_FPDMA_QUEUED) ||
3712 	    (cmd == SATAC_READ_FPDMA_QUEUED));
3713 
3714 	if (ncq == B_FALSE) {
3715 
3716 		if ((nvp->nvp_non_ncq_run == 1) ||
3717 		    (nvp->nvp_ncq_run > 0)) {
3718 			/*
3719 			 * next command is non-ncq which can't run
3720 			 * concurrently.  exit and return queue full.
3721 			 */
3722 			spkt->satapkt_reason = SATA_PKT_QUEUE_FULL;
3723 
3724 			return (SATA_TRAN_QUEUE_FULL);
3725 		}
3726 
3727 		return (nv_start_common(nvp, spkt));
3728 	}
3729 
3730 	/*
3731 	 * ncq == B_TRUE
3732 	 */
3733 	if (nvp->nvp_non_ncq_run == 1) {
3734 		/*
3735 		 * cannot start any NCQ commands when there
3736 		 * is a non-NCQ command running.
3737 		 */
3738 		spkt->satapkt_reason = SATA_PKT_QUEUE_FULL;
3739 
3740 		return (SATA_TRAN_QUEUE_FULL);
3741 	}
3742 
3743 #ifdef NCQ
3744 	/*
3745 	 * this is not compiled for now as satapkt_device.satadev_qdepth
3746 	 * is being pulled out until NCQ support is later addressed
3747 	 *
3748 	 * nvp_queue_depth is initialized by the first NCQ command
3749 	 * received.
3750 	 */
3751 	if (nvp->nvp_queue_depth == 1) {
3752 		nvp->nvp_queue_depth =
3753 		    spkt->satapkt_device.satadev_qdepth;
3754 
3755 		ASSERT(nvp->nvp_queue_depth > 1);
3756 
3757 		NVLOG(NVDBG_ENTRY, nvp->nvp_ctlp, nvp,
3758 		    "nv_process_queue: nvp_queue_depth set to %d",
3759 		    nvp->nvp_queue_depth);
3760 	}
3761 #endif
3762 
3763 	if (nvp->nvp_ncq_run >= nvp->nvp_queue_depth) {
3764 		/*
3765 		 * max number of NCQ commands already active
3766 		 */
3767 		spkt->satapkt_reason = SATA_PKT_QUEUE_FULL;
3768 
3769 		return (SATA_TRAN_QUEUE_FULL);
3770 	}
3771 
3772 	return (nv_start_common(nvp, spkt));
3773 }
3774 
3775 
3776 /*
3777  * configure INTx and legacy interrupts
3778  */
3779 static int
nv_add_legacy_intrs(nv_ctl_t * nvc)3780 nv_add_legacy_intrs(nv_ctl_t *nvc)
3781 {
3782 	dev_info_t	*devinfo = nvc->nvc_dip;
3783 	int		actual, count = 0;
3784 	int		x, y, rc, inum = 0;
3785 
3786 	NVLOG(NVDBG_INIT, nvc, NULL, "nv_add_legacy_intrs", NULL);
3787 
3788 	/*
3789 	 * get number of interrupts
3790 	 */
3791 	rc = ddi_intr_get_nintrs(devinfo, DDI_INTR_TYPE_FIXED, &count);
3792 	if ((rc != DDI_SUCCESS) || (count == 0)) {
3793 		NVLOG(NVDBG_INIT, nvc, NULL,
3794 		    "ddi_intr_get_nintrs() failed, "
3795 		    "rc %d count %d", rc, count);
3796 
3797 		return (DDI_FAILURE);
3798 	}
3799 
3800 	/*
3801 	 * allocate an array of interrupt handles
3802 	 */
3803 	nvc->nvc_intr_size = count * sizeof (ddi_intr_handle_t);
3804 	nvc->nvc_htable = kmem_zalloc(nvc->nvc_intr_size, KM_SLEEP);
3805 
3806 	/*
3807 	 * call ddi_intr_alloc()
3808 	 */
3809 	rc = ddi_intr_alloc(devinfo, nvc->nvc_htable, DDI_INTR_TYPE_FIXED,
3810 	    inum, count, &actual, DDI_INTR_ALLOC_STRICT);
3811 
3812 	if ((rc != DDI_SUCCESS) || (actual == 0)) {
3813 		nv_cmn_err(CE_WARN, nvc, NULL,
3814 		    "ddi_intr_alloc() failed, rc %d", rc);
3815 		kmem_free(nvc->nvc_htable, nvc->nvc_intr_size);
3816 
3817 		return (DDI_FAILURE);
3818 	}
3819 
3820 	if (actual < count) {
3821 		nv_cmn_err(CE_WARN, nvc, NULL,
3822 		    "ddi_intr_alloc: requested: %d, received: %d",
3823 		    count, actual);
3824 
3825 		goto failure;
3826 	}
3827 
3828 	nvc->nvc_intr_cnt = actual;
3829 
3830 	/*
3831 	 * get intr priority
3832 	 */
3833 	if (ddi_intr_get_pri(nvc->nvc_htable[0], &nvc->nvc_intr_pri) !=
3834 	    DDI_SUCCESS) {
3835 		nv_cmn_err(CE_WARN, nvc, NULL, "ddi_intr_get_pri() failed");
3836 
3837 		goto failure;
3838 	}
3839 
3840 	/*
3841 	 * Test for high level mutex
3842 	 */
3843 	if (nvc->nvc_intr_pri >= ddi_intr_get_hilevel_pri()) {
3844 		nv_cmn_err(CE_WARN, nvc, NULL,
3845 		    "nv_add_legacy_intrs: high level intr not supported");
3846 
3847 		goto failure;
3848 	}
3849 
3850 	for (x = 0; x < actual; x++) {
3851 		if (ddi_intr_add_handler(nvc->nvc_htable[x],
3852 		    nvc->nvc_interrupt, (caddr_t)nvc, NULL) != DDI_SUCCESS) {
3853 			nv_cmn_err(CE_WARN, nvc, NULL,
3854 			    "ddi_intr_add_handler() failed");
3855 
3856 			goto failure;
3857 		}
3858 	}
3859 
3860 	/*
3861 	 * call ddi_intr_enable() for legacy interrupts
3862 	 */
3863 	for (x = 0; x < nvc->nvc_intr_cnt; x++) {
3864 		(void) ddi_intr_enable(nvc->nvc_htable[x]);
3865 	}
3866 
3867 	return (DDI_SUCCESS);
3868 
3869 	failure:
3870 	/*
3871 	 * free allocated intr and nvc_htable
3872 	 */
3873 	for (y = 0; y < actual; y++) {
3874 		(void) ddi_intr_free(nvc->nvc_htable[y]);
3875 	}
3876 
3877 	kmem_free(nvc->nvc_htable, nvc->nvc_intr_size);
3878 
3879 	return (DDI_FAILURE);
3880 }
3881 
3882 #ifdef	NV_MSI_SUPPORTED
3883 /*
3884  * configure MSI interrupts
3885  */
3886 static int
nv_add_msi_intrs(nv_ctl_t * nvc)3887 nv_add_msi_intrs(nv_ctl_t *nvc)
3888 {
3889 	dev_info_t	*devinfo = nvc->nvc_dip;
3890 	int		count, avail, actual;
3891 	int		x, y, rc, inum = 0;
3892 
3893 	NVLOG(NVDBG_INIT, nvc, NULL, "nv_add_msi_intrs", NULL);
3894 
3895 	/*
3896 	 * get number of interrupts
3897 	 */
3898 	rc = ddi_intr_get_nintrs(devinfo, DDI_INTR_TYPE_MSI, &count);
3899 	if ((rc != DDI_SUCCESS) || (count == 0)) {
3900 		nv_cmn_err(CE_WARN, nvc, NULL,
3901 		    "ddi_intr_get_nintrs() failed, "
3902 		    "rc %d count %d", rc, count);
3903 
3904 		return (DDI_FAILURE);
3905 	}
3906 
3907 	/*
3908 	 * get number of available interrupts
3909 	 */
3910 	rc = ddi_intr_get_navail(devinfo, DDI_INTR_TYPE_MSI, &avail);
3911 	if ((rc != DDI_SUCCESS) || (avail == 0)) {
3912 		nv_cmn_err(CE_WARN, nvc, NULL,
3913 		    "ddi_intr_get_navail() failed, "
3914 		    "rc %d avail %d", rc, avail);
3915 
3916 		return (DDI_FAILURE);
3917 	}
3918 
3919 	if (avail < count) {
3920 		nv_cmn_err(CE_WARN, nvc, NULL,
3921 		    "ddi_intr_get_nvail returned %d ddi_intr_get_nintrs: %d",
3922 		    avail, count);
3923 	}
3924 
3925 	/*
3926 	 * allocate an array of interrupt handles
3927 	 */
3928 	nvc->nvc_intr_size = count * sizeof (ddi_intr_handle_t);
3929 	nvc->nvc_htable = kmem_alloc(nvc->nvc_intr_size, KM_SLEEP);
3930 
3931 	rc = ddi_intr_alloc(devinfo, nvc->nvc_htable, DDI_INTR_TYPE_MSI,
3932 	    inum, count, &actual, DDI_INTR_ALLOC_NORMAL);
3933 
3934 	if ((rc != DDI_SUCCESS) || (actual == 0)) {
3935 		nv_cmn_err(CE_WARN, nvc, NULL,
3936 		    "ddi_intr_alloc() failed, rc %d", rc);
3937 		kmem_free(nvc->nvc_htable, nvc->nvc_intr_size);
3938 
3939 		return (DDI_FAILURE);
3940 	}
3941 
3942 	/*
3943 	 * Use interrupt count returned or abort?
3944 	 */
3945 	if (actual < count) {
3946 		NVLOG(NVDBG_INIT, nvc, NULL,
3947 		    "Requested: %d, Received: %d", count, actual);
3948 	}
3949 
3950 	nvc->nvc_intr_cnt = actual;
3951 
3952 	/*
3953 	 * get priority for first msi, assume remaining are all the same
3954 	 */
3955 	if (ddi_intr_get_pri(nvc->nvc_htable[0], &nvc->nvc_intr_pri) !=
3956 	    DDI_SUCCESS) {
3957 		nv_cmn_err(CE_WARN, nvc, NULL, "ddi_intr_get_pri() failed");
3958 
3959 		goto failure;
3960 	}
3961 
3962 	/*
3963 	 * test for high level mutex
3964 	 */
3965 	if (nvc->nvc_intr_pri >= ddi_intr_get_hilevel_pri()) {
3966 		nv_cmn_err(CE_WARN, nvc, NULL,
3967 		    "nv_add_msi_intrs: high level intr not supported");
3968 
3969 		goto failure;
3970 	}
3971 
3972 	/*
3973 	 * Call ddi_intr_add_handler()
3974 	 */
3975 	for (x = 0; x < actual; x++) {
3976 		if (ddi_intr_add_handler(nvc->nvc_htable[x],
3977 		    nvc->nvc_interrupt, (caddr_t)nvc, NULL) != DDI_SUCCESS) {
3978 			nv_cmn_err(CE_WARN, nvc, NULL,
3979 			    "ddi_intr_add_handler() failed");
3980 
3981 			goto failure;
3982 		}
3983 	}
3984 
3985 	(void) ddi_intr_get_cap(nvc->nvc_htable[0], &nvc->nvc_intr_cap);
3986 
3987 	if (nvc->nvc_intr_cap & DDI_INTR_FLAG_BLOCK) {
3988 		(void) ddi_intr_block_enable(nvc->nvc_htable,
3989 		    nvc->nvc_intr_cnt);
3990 	} else {
3991 		/*
3992 		 * Call ddi_intr_enable() for MSI non block enable
3993 		 */
3994 		for (x = 0; x < nvc->nvc_intr_cnt; x++) {
3995 			(void) ddi_intr_enable(nvc->nvc_htable[x]);
3996 		}
3997 	}
3998 
3999 	return (DDI_SUCCESS);
4000 
4001 	failure:
4002 	/*
4003 	 * free allocated intr and nvc_htable
4004 	 */
4005 	for (y = 0; y < actual; y++) {
4006 		(void) ddi_intr_free(nvc->nvc_htable[y]);
4007 	}
4008 
4009 	kmem_free(nvc->nvc_htable, nvc->nvc_intr_size);
4010 
4011 	return (DDI_FAILURE);
4012 }
4013 #endif
4014 
4015 
4016 static void
nv_rem_intrs(nv_ctl_t * nvc)4017 nv_rem_intrs(nv_ctl_t *nvc)
4018 {
4019 	int x, i;
4020 	nv_port_t *nvp;
4021 
4022 	NVLOG(NVDBG_INIT, nvc, NULL, "nv_rem_intrs", NULL);
4023 
4024 	/*
4025 	 * prevent controller from generating interrupts by
4026 	 * masking them out.  This is an extra precaution.
4027 	 */
4028 	for (i = 0; i < NV_MAX_PORTS(nvc); i++) {
4029 		nvp = (&nvc->nvc_port[i]);
4030 		mutex_enter(&nvp->nvp_mutex);
4031 		(*(nvc->nvc_set_intr))(nvp, NV_INTR_DISABLE);
4032 		mutex_exit(&nvp->nvp_mutex);
4033 	}
4034 
4035 	/*
4036 	 * disable all interrupts
4037 	 */
4038 	if ((nvc->nvc_intr_type == DDI_INTR_TYPE_MSI) &&
4039 	    (nvc->nvc_intr_cap & DDI_INTR_FLAG_BLOCK)) {
4040 		(void) ddi_intr_block_disable(nvc->nvc_htable,
4041 		    nvc->nvc_intr_cnt);
4042 	} else {
4043 		for (x = 0; x < nvc->nvc_intr_cnt; x++) {
4044 			(void) ddi_intr_disable(nvc->nvc_htable[x]);
4045 		}
4046 	}
4047 
4048 	for (x = 0; x < nvc->nvc_intr_cnt; x++) {
4049 		(void) ddi_intr_remove_handler(nvc->nvc_htable[x]);
4050 		(void) ddi_intr_free(nvc->nvc_htable[x]);
4051 	}
4052 
4053 	kmem_free(nvc->nvc_htable, nvc->nvc_intr_size);
4054 }
4055 
4056 
4057 /*
4058  * variable argument wrapper for cmn_err.  prefixes the instance and port
4059  * number if possible
4060  */
4061 static void
nv_vcmn_err(int ce,nv_ctl_t * nvc,nv_port_t * nvp,const char * fmt,va_list ap,boolean_t log_to_sata_ring)4062 nv_vcmn_err(int ce, nv_ctl_t *nvc, nv_port_t *nvp, const char *fmt, va_list ap,
4063     boolean_t log_to_sata_ring)
4064 {
4065 	char port[NV_STR_LEN];
4066 	char inst[NV_STR_LEN];
4067 	dev_info_t *dip;
4068 
4069 	if (nvc) {
4070 		(void) snprintf(inst, NV_STR_LEN, "inst%d ",
4071 		    ddi_get_instance(nvc->nvc_dip));
4072 		dip = nvc->nvc_dip;
4073 	} else {
4074 		inst[0] = '\0';
4075 	}
4076 
4077 	if (nvp) {
4078 		(void) snprintf(port, NV_STR_LEN, "port%d",
4079 		    nvp->nvp_port_num);
4080 		dip = nvp->nvp_ctlp->nvc_dip;
4081 	} else {
4082 		port[0] = '\0';
4083 	}
4084 
4085 	mutex_enter(&nv_log_mutex);
4086 
4087 	(void) sprintf(nv_log_buf, "%s%s%s", inst, port,
4088 	    (inst[0]|port[0] ? ": " :""));
4089 
4090 	(void) vsnprintf(&nv_log_buf[strlen(nv_log_buf)],
4091 	    NV_LOGBUF_LEN - strlen(nv_log_buf), fmt, ap);
4092 
4093 	/*
4094 	 * Log to console or log to file, depending on
4095 	 * nv_log_to_console setting.
4096 	 */
4097 	if (nv_log_to_console) {
4098 		if (nv_prom_print) {
4099 			prom_printf("%s\n", nv_log_buf);
4100 		} else {
4101 			cmn_err(ce, "%s\n", nv_log_buf);
4102 		}
4103 	} else {
4104 		cmn_err(ce, "!%s", nv_log_buf);
4105 	}
4106 
4107 	if (log_to_sata_ring == B_TRUE) {
4108 		(void) sprintf(nv_log_buf, "%s%s", port, (port[0] ? ": " :""));
4109 
4110 		(void) vsnprintf(&nv_log_buf[strlen(nv_log_buf)],
4111 		    NV_LOGBUF_LEN - strlen(nv_log_buf), fmt, ap);
4112 
4113 		sata_trace_debug(dip, nv_log_buf);
4114 	}
4115 
4116 	mutex_exit(&nv_log_mutex);
4117 }
4118 
4119 
4120 /*
4121  * wrapper for cmn_err
4122  */
4123 static void
nv_cmn_err(int ce,nv_ctl_t * nvc,nv_port_t * nvp,char * fmt,...)4124 nv_cmn_err(int ce, nv_ctl_t *nvc, nv_port_t *nvp, char *fmt, ...)
4125 {
4126 	va_list ap;
4127 
4128 	va_start(ap, fmt);
4129 	nv_vcmn_err(ce, nvc, nvp, fmt, ap, B_TRUE);
4130 	va_end(ap);
4131 }
4132 
4133 
4134 static void
nv_log(nv_ctl_t * nvc,nv_port_t * nvp,const char * fmt,...)4135 nv_log(nv_ctl_t *nvc, nv_port_t *nvp, const char *fmt, ...)
4136 {
4137 	va_list ap;
4138 
4139 	if (nv_log_to_cmn_err == B_TRUE) {
4140 		va_start(ap, fmt);
4141 		nv_vcmn_err(CE_CONT, nvc, nvp, fmt, ap, B_FALSE);
4142 		va_end(ap);
4143 
4144 	}
4145 
4146 	va_start(ap, fmt);
4147 
4148 	if (nvp == NULL && nvc == NULL) {
4149 		sata_vtrace_debug(NULL, fmt, ap);
4150 		va_end(ap);
4151 
4152 		return;
4153 	}
4154 
4155 	if (nvp == NULL && nvc != NULL) {
4156 		sata_vtrace_debug(nvc->nvc_dip, fmt, ap);
4157 		va_end(ap);
4158 
4159 		return;
4160 	}
4161 
4162 	/*
4163 	 * nvp is not NULL, but nvc might be.  Reference nvp for both
4164 	 * port and dip, to get the port number prefixed on the
4165 	 * message.
4166 	 */
4167 	mutex_enter(&nv_log_mutex);
4168 
4169 	(void) snprintf(nv_log_buf, NV_LOGBUF_LEN, "port%d: %s",
4170 	    nvp->nvp_port_num, fmt);
4171 
4172 	sata_vtrace_debug(nvp->nvp_ctlp->nvc_dip, nv_log_buf, ap);
4173 
4174 	mutex_exit(&nv_log_mutex);
4175 
4176 	va_end(ap);
4177 }
4178 
4179 
4180 /*
4181  * program registers which are common to all commands
4182  */
4183 static void
nv_program_taskfile_regs(nv_port_t * nvp,int slot)4184 nv_program_taskfile_regs(nv_port_t *nvp, int slot)
4185 {
4186 	nv_slot_t *nv_slotp = &(nvp->nvp_slot[slot]);
4187 	sata_pkt_t *spkt;
4188 	sata_cmd_t *satacmd;
4189 	ddi_acc_handle_t cmdhdl = nvp->nvp_cmd_hdl;
4190 	uint8_t cmd, ncq = B_FALSE;
4191 
4192 	spkt = nv_slotp->nvslot_spkt;
4193 	satacmd = &spkt->satapkt_cmd;
4194 	cmd = satacmd->satacmd_cmd_reg;
4195 
4196 	ASSERT(nvp->nvp_slot);
4197 
4198 	if ((cmd == SATAC_WRITE_FPDMA_QUEUED) ||
4199 	    (cmd == SATAC_READ_FPDMA_QUEUED)) {
4200 		ncq = B_TRUE;
4201 	}
4202 
4203 	/*
4204 	 * select the drive
4205 	 */
4206 	nv_put8(cmdhdl, nvp->nvp_drvhd, satacmd->satacmd_device_reg);
4207 
4208 	/*
4209 	 * make certain the drive selected
4210 	 */
4211 	if (nv_wait(nvp, SATA_STATUS_DRDY, SATA_STATUS_BSY,
4212 	    NV_SEC2USEC(5), 0) == B_FALSE) {
4213 
4214 		return;
4215 	}
4216 
4217 	switch (spkt->satapkt_cmd.satacmd_addr_type) {
4218 
4219 	case ATA_ADDR_LBA:
4220 		NVLOG(NVDBG_DELIVER, nvp->nvp_ctlp, nvp, "ATA_ADDR_LBA mode",
4221 		    NULL);
4222 
4223 		nv_put8(cmdhdl, nvp->nvp_count, satacmd->satacmd_sec_count_lsb);
4224 		nv_put8(cmdhdl, nvp->nvp_hcyl, satacmd->satacmd_lba_high_lsb);
4225 		nv_put8(cmdhdl, nvp->nvp_lcyl, satacmd->satacmd_lba_mid_lsb);
4226 		nv_put8(cmdhdl, nvp->nvp_sect, satacmd->satacmd_lba_low_lsb);
4227 		nv_put8(cmdhdl, nvp->nvp_feature,
4228 		    satacmd->satacmd_features_reg);
4229 
4230 
4231 		break;
4232 
4233 	case ATA_ADDR_LBA28:
4234 		NVLOG(NVDBG_DELIVER, nvp->nvp_ctlp, nvp,
4235 		    "ATA_ADDR_LBA28 mode", NULL);
4236 		/*
4237 		 * NCQ only uses 48-bit addressing
4238 		 */
4239 		ASSERT(ncq != B_TRUE);
4240 
4241 		nv_put8(cmdhdl, nvp->nvp_count, satacmd->satacmd_sec_count_lsb);
4242 		nv_put8(cmdhdl, nvp->nvp_hcyl, satacmd->satacmd_lba_high_lsb);
4243 		nv_put8(cmdhdl, nvp->nvp_lcyl, satacmd->satacmd_lba_mid_lsb);
4244 		nv_put8(cmdhdl, nvp->nvp_sect, satacmd->satacmd_lba_low_lsb);
4245 		nv_put8(cmdhdl, nvp->nvp_feature,
4246 		    satacmd->satacmd_features_reg);
4247 
4248 		break;
4249 
4250 	case ATA_ADDR_LBA48:
4251 		NVLOG(NVDBG_DELIVER, nvp->nvp_ctlp, nvp,
4252 		    "ATA_ADDR_LBA48 mode", NULL);
4253 
4254 		/*
4255 		 * for NCQ, tag goes into count register and real sector count
4256 		 * into features register.  The sata module does the translation
4257 		 * in the satacmd.
4258 		 */
4259 		if (ncq == B_TRUE) {
4260 			nv_put8(cmdhdl, nvp->nvp_count, slot << 3);
4261 		} else {
4262 			nv_put8(cmdhdl, nvp->nvp_count,
4263 			    satacmd->satacmd_sec_count_msb);
4264 			nv_put8(cmdhdl, nvp->nvp_count,
4265 			    satacmd->satacmd_sec_count_lsb);
4266 		}
4267 
4268 		nv_put8(cmdhdl, nvp->nvp_feature,
4269 		    satacmd->satacmd_features_reg_ext);
4270 		nv_put8(cmdhdl, nvp->nvp_feature,
4271 		    satacmd->satacmd_features_reg);
4272 
4273 		/*
4274 		 * send the high-order half first
4275 		 */
4276 		nv_put8(cmdhdl, nvp->nvp_hcyl, satacmd->satacmd_lba_high_msb);
4277 		nv_put8(cmdhdl, nvp->nvp_lcyl, satacmd->satacmd_lba_mid_msb);
4278 		nv_put8(cmdhdl, nvp->nvp_sect, satacmd->satacmd_lba_low_msb);
4279 
4280 		/*
4281 		 * Send the low-order half
4282 		 */
4283 		nv_put8(cmdhdl, nvp->nvp_hcyl, satacmd->satacmd_lba_high_lsb);
4284 		nv_put8(cmdhdl, nvp->nvp_lcyl, satacmd->satacmd_lba_mid_lsb);
4285 		nv_put8(cmdhdl, nvp->nvp_sect, satacmd->satacmd_lba_low_lsb);
4286 
4287 		break;
4288 
4289 	case 0:
4290 		/*
4291 		 * non-media access commands such as identify and features
4292 		 * take this path.
4293 		 */
4294 		nv_put8(cmdhdl, nvp->nvp_count, satacmd->satacmd_sec_count_lsb);
4295 		nv_put8(cmdhdl, nvp->nvp_feature,
4296 		    satacmd->satacmd_features_reg);
4297 		nv_put8(cmdhdl, nvp->nvp_hcyl, satacmd->satacmd_lba_high_lsb);
4298 		nv_put8(cmdhdl, nvp->nvp_lcyl, satacmd->satacmd_lba_mid_lsb);
4299 		nv_put8(cmdhdl, nvp->nvp_sect, satacmd->satacmd_lba_low_lsb);
4300 
4301 		break;
4302 
4303 	default:
4304 		break;
4305 	}
4306 
4307 	ASSERT(nvp->nvp_slot);
4308 }
4309 
4310 
4311 /*
4312  * start a command that involves no media access
4313  */
4314 static int
nv_start_nodata(nv_port_t * nvp,int slot)4315 nv_start_nodata(nv_port_t *nvp, int slot)
4316 {
4317 	nv_slot_t *nv_slotp = &(nvp->nvp_slot[slot]);
4318 	sata_pkt_t *spkt = nv_slotp->nvslot_spkt;
4319 	sata_cmd_t *sata_cmdp = &spkt->satapkt_cmd;
4320 	ddi_acc_handle_t cmdhdl = nvp->nvp_cmd_hdl;
4321 
4322 	nv_program_taskfile_regs(nvp, slot);
4323 
4324 	/*
4325 	 * This next one sets the controller in motion
4326 	 */
4327 	nv_put8(cmdhdl, nvp->nvp_cmd, sata_cmdp->satacmd_cmd_reg);
4328 
4329 	return (SATA_TRAN_ACCEPTED);
4330 }
4331 
4332 
4333 static int
nv_bm_status_clear(nv_port_t * nvp)4334 nv_bm_status_clear(nv_port_t *nvp)
4335 {
4336 	ddi_acc_handle_t bmhdl = nvp->nvp_bm_hdl;
4337 	uchar_t	status, ret;
4338 
4339 	/*
4340 	 * Get the current BM status
4341 	 */
4342 	ret = status = nv_get8(bmhdl, nvp->nvp_bmisx);
4343 
4344 	status = (status & BMISX_MASK) | BMISX_IDERR | BMISX_IDEINTS;
4345 
4346 	/*
4347 	 * Clear the latches (and preserve the other bits)
4348 	 */
4349 	nv_put8(bmhdl, nvp->nvp_bmisx, status);
4350 
4351 	return (ret);
4352 }
4353 
4354 
4355 /*
4356  * program the bus master DMA engine with the PRD address for
4357  * the active slot command, and start the DMA engine.
4358  */
4359 static void
nv_start_dma_engine(nv_port_t * nvp,int slot)4360 nv_start_dma_engine(nv_port_t *nvp, int slot)
4361 {
4362 	nv_slot_t *nv_slotp = &(nvp->nvp_slot[slot]);
4363 	ddi_acc_handle_t bmhdl = nvp->nvp_bm_hdl;
4364 	uchar_t direction;
4365 
4366 	ASSERT(nv_slotp->nvslot_spkt != NULL);
4367 
4368 	if (nv_slotp->nvslot_spkt->satapkt_cmd.satacmd_flags.sata_data_direction
4369 	    == SATA_DIR_READ) {
4370 		direction = BMICX_RWCON_WRITE_TO_MEMORY;
4371 	} else {
4372 		direction = BMICX_RWCON_READ_FROM_MEMORY;
4373 	}
4374 
4375 	NVLOG(NVDBG_DELIVER, nvp->nvp_ctlp, nvp,
4376 	    "nv_start_dma_engine entered", NULL);
4377 
4378 #if NOT_USED
4379 	/*
4380 	 * NOT NEEDED. Left here of historical reason.
4381 	 * Reset the controller's interrupt and error status bits.
4382 	 */
4383 	(void) nv_bm_status_clear(nvp);
4384 #endif
4385 	/*
4386 	 * program the PRD table physical start address
4387 	 */
4388 	nv_put32(bmhdl, nvp->nvp_bmidtpx, nvp->nvp_sg_paddr[slot]);
4389 
4390 	/*
4391 	 * set the direction control and start the DMA controller
4392 	 */
4393 	nv_put8(bmhdl, nvp->nvp_bmicx, direction | BMICX_SSBM);
4394 }
4395 
4396 /*
4397  * start dma command, either in or out
4398  */
4399 static int
nv_start_dma(nv_port_t * nvp,int slot)4400 nv_start_dma(nv_port_t *nvp, int slot)
4401 {
4402 	nv_slot_t *nv_slotp = &(nvp->nvp_slot[slot]);
4403 	ddi_acc_handle_t cmdhdl = nvp->nvp_cmd_hdl;
4404 	sata_pkt_t *spkt = nv_slotp->nvslot_spkt;
4405 	sata_cmd_t *sata_cmdp = &spkt->satapkt_cmd;
4406 	uint8_t cmd = sata_cmdp->satacmd_cmd_reg;
4407 #ifdef NCQ
4408 	uint8_t ncq = B_FALSE;
4409 #endif
4410 	ddi_acc_handle_t sghdl = nvp->nvp_sg_acc_hdl[slot];
4411 	uint_t *dstp = (uint_t *)nvp->nvp_sg_addr[slot];
4412 	int sg_count = sata_cmdp->satacmd_num_dma_cookies, idx;
4413 	ddi_dma_cookie_t  *srcp = sata_cmdp->satacmd_dma_cookie_list;
4414 
4415 	ASSERT(sg_count != 0);
4416 
4417 	if (sata_cmdp->satacmd_num_dma_cookies > NV_DMA_NSEGS) {
4418 		nv_cmn_err(CE_WARN, nvp->nvp_ctlp, nvp, "NV_DMA_NSEGS=%d <"
4419 		    " satacmd_num_dma_cookies=%d", NV_DMA_NSEGS,
4420 		    sata_cmdp->satacmd_num_dma_cookies);
4421 
4422 		return (NV_FAILURE);
4423 	}
4424 
4425 	nv_program_taskfile_regs(nvp, slot);
4426 
4427 	/*
4428 	 * start the drive in motion
4429 	 */
4430 	nv_put8(cmdhdl, nvp->nvp_cmd, cmd);
4431 
4432 	/*
4433 	 * the drive starts processing the transaction when the cmd register
4434 	 * is written.  This is done here before programming the DMA engine to
4435 	 * parallelize and save some time.  In the event that the drive is ready
4436 	 * before DMA, it will wait.
4437 	 */
4438 #ifdef NCQ
4439 	if ((cmd == SATAC_WRITE_FPDMA_QUEUED) ||
4440 	    (cmd == SATAC_READ_FPDMA_QUEUED)) {
4441 		ncq = B_TRUE;
4442 	}
4443 #endif
4444 
4445 	/*
4446 	 * copy the PRD list to PRD table in DMA accessible memory
4447 	 * so that the controller can access it.
4448 	 */
4449 	for (idx = 0; idx < sg_count; idx++, srcp++) {
4450 		uint32_t size;
4451 
4452 		nv_put32(sghdl, dstp++, srcp->dmac_address);
4453 
4454 		/* Set the number of bytes to transfer, 0 implies 64KB */
4455 		size = srcp->dmac_size;
4456 		if (size == 0x10000)
4457 			size = 0;
4458 
4459 		/*
4460 		 * If this is a 40-bit address, copy bits 32-40 of the
4461 		 * physical address to bits 16-24 of the PRD count.
4462 		 */
4463 		if (srcp->dmac_laddress > UINT32_MAX) {
4464 			size |= ((srcp->dmac_laddress & 0xff00000000) >> 16);
4465 		}
4466 
4467 		/*
4468 		 * set the end of table flag for the last entry
4469 		 */
4470 		if (idx == (sg_count - 1)) {
4471 			size |= PRDE_EOT;
4472 		}
4473 
4474 		nv_put32(sghdl, dstp++, size);
4475 	}
4476 
4477 	(void) ddi_dma_sync(nvp->nvp_sg_dma_hdl[slot], 0,
4478 	    sizeof (prde_t) * NV_DMA_NSEGS, DDI_DMA_SYNC_FORDEV);
4479 
4480 	nv_start_dma_engine(nvp, slot);
4481 
4482 #ifdef NCQ
4483 	/*
4484 	 * optimization:  for SWNCQ, start DMA engine if this is the only
4485 	 * command running.  Preliminary NCQ efforts indicated this needs
4486 	 * more debugging.
4487 	 *
4488 	 * if (nvp->nvp_ncq_run <= 1)
4489 	 */
4490 
4491 	if (ncq == B_FALSE) {
4492 		NVLOG(NVDBG_DELIVER, nvp->nvp_ctlp, nvp,
4493 		    "NOT NCQ so starting DMA NOW non_ncq_commands=%d"
4494 		    " cmd = %X", non_ncq_commands++, cmd);
4495 		nv_start_dma_engine(nvp, slot);
4496 	} else {
4497 		NVLOG(NVDBG_DELIVER, nvp->nvp_ctlp, nvp, "NCQ, so program "
4498 		    "DMA later ncq_commands=%d cmd = %X", ncq_commands++, cmd);
4499 	}
4500 #endif /* NCQ */
4501 
4502 	return (SATA_TRAN_ACCEPTED);
4503 }
4504 
4505 
4506 /*
4507  * start a PIO data-in ATA command
4508  */
4509 static int
nv_start_pio_in(nv_port_t * nvp,int slot)4510 nv_start_pio_in(nv_port_t *nvp, int slot)
4511 {
4512 
4513 	nv_slot_t *nv_slotp = &(nvp->nvp_slot[slot]);
4514 	sata_pkt_t *spkt = nv_slotp->nvslot_spkt;
4515 	ddi_acc_handle_t cmdhdl = nvp->nvp_cmd_hdl;
4516 
4517 	nv_program_taskfile_regs(nvp, slot);
4518 
4519 	/*
4520 	 * This next one sets the drive in motion
4521 	 */
4522 	nv_put8(cmdhdl, nvp->nvp_cmd, spkt->satapkt_cmd.satacmd_cmd_reg);
4523 
4524 	return (SATA_TRAN_ACCEPTED);
4525 }
4526 
4527 
4528 /*
4529  * start a PIO data-out ATA command
4530  */
4531 static int
nv_start_pio_out(nv_port_t * nvp,int slot)4532 nv_start_pio_out(nv_port_t *nvp, int slot)
4533 {
4534 	nv_slot_t *nv_slotp = &(nvp->nvp_slot[slot]);
4535 	ddi_acc_handle_t cmdhdl = nvp->nvp_cmd_hdl;
4536 	sata_pkt_t *spkt = nv_slotp->nvslot_spkt;
4537 
4538 	nv_program_taskfile_regs(nvp, slot);
4539 
4540 	/*
4541 	 * this next one sets the drive in motion
4542 	 */
4543 	nv_put8(cmdhdl, nvp->nvp_cmd, spkt->satapkt_cmd.satacmd_cmd_reg);
4544 
4545 	/*
4546 	 * wait for the busy bit to settle
4547 	 */
4548 	NV_DELAY_NSEC(400);
4549 
4550 	/*
4551 	 * wait for the drive to assert DRQ to send the first chunk
4552 	 * of data. Have to busy wait because there's no interrupt for
4553 	 * the first chunk. This is bad... uses a lot of cycles if the
4554 	 * drive responds too slowly or if the wait loop granularity
4555 	 * is too large. It's even worse if the drive is defective and
4556 	 * the loop times out.
4557 	 */
4558 	if (nv_wait3(nvp, SATA_STATUS_DRQ, SATA_STATUS_BSY, /* okay */
4559 	    SATA_STATUS_ERR, SATA_STATUS_BSY, /* cmd failed */
4560 	    SATA_STATUS_DF, SATA_STATUS_BSY, /* drive failed */
4561 	    4000000, 0) == B_FALSE) {
4562 		spkt->satapkt_reason = SATA_PKT_TIMEOUT;
4563 
4564 		goto error;
4565 	}
4566 
4567 	/*
4568 	 * send the first block.
4569 	 */
4570 	nv_intr_pio_out(nvp, nv_slotp);
4571 
4572 	/*
4573 	 * If nvslot_flags is not set to COMPLETE yet, then processing
4574 	 * is OK so far, so return.  Otherwise, fall into error handling
4575 	 * below.
4576 	 */
4577 	if (nv_slotp->nvslot_flags != NVSLOT_COMPLETE) {
4578 
4579 		return (SATA_TRAN_ACCEPTED);
4580 	}
4581 
4582 	error:
4583 	/*
4584 	 * there was an error so reset the device and complete the packet.
4585 	 */
4586 	nv_copy_registers(nvp, &spkt->satapkt_device, spkt);
4587 	nv_complete_io(nvp, spkt, 0);
4588 	nv_reset(nvp, "pio_out");
4589 
4590 	return (SATA_TRAN_PORT_ERROR);
4591 }
4592 
4593 
4594 /*
4595  * start a ATAPI Packet command (PIO data in or out)
4596  */
4597 static int
nv_start_pkt_pio(nv_port_t * nvp,int slot)4598 nv_start_pkt_pio(nv_port_t *nvp, int slot)
4599 {
4600 	nv_slot_t *nv_slotp = &(nvp->nvp_slot[slot]);
4601 	sata_pkt_t *spkt = nv_slotp->nvslot_spkt;
4602 	ddi_acc_handle_t cmdhdl = nvp->nvp_cmd_hdl;
4603 	sata_cmd_t *satacmd = &spkt->satapkt_cmd;
4604 
4605 	NVLOG(NVDBG_ATAPI, nvp->nvp_ctlp, nvp,
4606 	    "nv_start_pkt_pio: start", NULL);
4607 
4608 	/*
4609 	 * Write the PACKET command to the command register.  Normally
4610 	 * this would be done through nv_program_taskfile_regs().  It
4611 	 * is done here because some values need to be overridden.
4612 	 */
4613 
4614 	/* select the drive */
4615 	nv_put8(cmdhdl, nvp->nvp_drvhd, satacmd->satacmd_device_reg);
4616 
4617 	/* make certain the drive selected */
4618 	if (nv_wait(nvp, SATA_STATUS_DRDY, SATA_STATUS_BSY,
4619 	    NV_SEC2USEC(5), 0) == B_FALSE) {
4620 		NVLOG(NVDBG_ATAPI, nvp->nvp_ctlp, nvp,
4621 		    "nv_start_pkt_pio: drive select failed", NULL);
4622 		return (SATA_TRAN_PORT_ERROR);
4623 	}
4624 
4625 	/*
4626 	 * The command is always sent via PIO, despite whatever the SATA
4627 	 * common module sets in the command.  Overwrite the DMA bit to do this.
4628 	 * Also, overwrite the overlay bit to be safe (it shouldn't be set).
4629 	 */
4630 	nv_put8(cmdhdl, nvp->nvp_feature, 0);	/* deassert DMA and OVL */
4631 
4632 	/* set appropriately by the sata common module */
4633 	nv_put8(cmdhdl, nvp->nvp_hcyl, satacmd->satacmd_lba_high_lsb);
4634 	nv_put8(cmdhdl, nvp->nvp_lcyl, satacmd->satacmd_lba_mid_lsb);
4635 	nv_put8(cmdhdl, nvp->nvp_sect, satacmd->satacmd_lba_low_lsb);
4636 	nv_put8(cmdhdl, nvp->nvp_count, satacmd->satacmd_sec_count_lsb);
4637 
4638 	/* initiate the command by writing the command register last */
4639 	nv_put8(cmdhdl, nvp->nvp_cmd, spkt->satapkt_cmd.satacmd_cmd_reg);
4640 
4641 	/* Give the host controller time to do its thing */
4642 	NV_DELAY_NSEC(400);
4643 
4644 	/*
4645 	 * Wait for the device to indicate that it is ready for the command
4646 	 * ATAPI protocol state - HP0: Check_Status_A
4647 	 */
4648 
4649 	if (nv_wait3(nvp, SATA_STATUS_DRQ, SATA_STATUS_BSY, /* okay */
4650 	    SATA_STATUS_ERR, SATA_STATUS_BSY, /* cmd failed */
4651 	    SATA_STATUS_DF, SATA_STATUS_BSY, /* drive failed */
4652 	    4000000, 0) == B_FALSE) {
4653 		/*
4654 		 * Either an error or device fault occurred or the wait
4655 		 * timed out.  According to the ATAPI protocol, command
4656 		 * completion is also possible.  Other implementations of
4657 		 * this protocol don't handle this last case, so neither
4658 		 * does this code.
4659 		 */
4660 
4661 		if (nv_get8(cmdhdl, nvp->nvp_status) &
4662 		    (SATA_STATUS_ERR | SATA_STATUS_DF)) {
4663 			spkt->satapkt_reason = SATA_PKT_DEV_ERROR;
4664 
4665 			NVLOG(NVDBG_ATAPI, nvp->nvp_ctlp, nvp,
4666 			    "nv_start_pkt_pio: device error (HP0)", NULL);
4667 		} else {
4668 			spkt->satapkt_reason = SATA_PKT_TIMEOUT;
4669 
4670 			NVLOG(NVDBG_ATAPI, nvp->nvp_ctlp, nvp,
4671 			    "nv_start_pkt_pio: timeout (HP0)", NULL);
4672 		}
4673 
4674 		nv_copy_registers(nvp, &spkt->satapkt_device, spkt);
4675 		nv_complete_io(nvp, spkt, 0);
4676 		nv_reset(nvp, "start_pkt_pio");
4677 
4678 		return (SATA_TRAN_PORT_ERROR);
4679 	}
4680 
4681 	/*
4682 	 * Put the ATAPI command in the data register
4683 	 * ATAPI protocol state - HP1: Send_Packet
4684 	 */
4685 
4686 	ddi_rep_put16(cmdhdl, (ushort_t *)spkt->satapkt_cmd.satacmd_acdb,
4687 	    (ushort_t *)nvp->nvp_data,
4688 	    (spkt->satapkt_cmd.satacmd_acdb_len >> 1), DDI_DEV_NO_AUTOINCR);
4689 
4690 	/*
4691 	 * See you in nv_intr_pkt_pio.
4692 	 * ATAPI protocol state - HP3: INTRQ_wait
4693 	 */
4694 
4695 	NVLOG(NVDBG_ATAPI, nvp->nvp_ctlp, nvp,
4696 	    "nv_start_pkt_pio: exiting into HP3", NULL);
4697 
4698 	return (SATA_TRAN_ACCEPTED);
4699 }
4700 
4701 
4702 /*
4703  * Interrupt processing for a non-data ATA command.
4704  */
4705 static void
nv_intr_nodata(nv_port_t * nvp,nv_slot_t * nv_slotp)4706 nv_intr_nodata(nv_port_t *nvp, nv_slot_t *nv_slotp)
4707 {
4708 	uchar_t status;
4709 	sata_pkt_t *spkt = nv_slotp->nvslot_spkt;
4710 	sata_cmd_t *sata_cmdp = &spkt->satapkt_cmd;
4711 	ddi_acc_handle_t ctlhdl = nvp->nvp_ctl_hdl;
4712 	ddi_acc_handle_t cmdhdl = nvp->nvp_cmd_hdl;
4713 
4714 	NVLOG(NVDBG_INTR, nvp->nvp_ctlp, nvp, "nv_intr_nodata entered", NULL);
4715 
4716 	status = nv_get8(cmdhdl, nvp->nvp_status);
4717 
4718 	/*
4719 	 * check for errors
4720 	 */
4721 	if (status & (SATA_STATUS_DF | SATA_STATUS_ERR)) {
4722 		spkt->satapkt_reason = SATA_PKT_DEV_ERROR;
4723 		sata_cmdp->satacmd_status_reg = nv_get8(ctlhdl,
4724 		    nvp->nvp_altstatus);
4725 		sata_cmdp->satacmd_error_reg = nv_get8(cmdhdl, nvp->nvp_error);
4726 	} else {
4727 		spkt->satapkt_reason = SATA_PKT_COMPLETED;
4728 	}
4729 
4730 	nv_slotp->nvslot_flags = NVSLOT_COMPLETE;
4731 }
4732 
4733 
4734 /*
4735  * ATA command, PIO data in
4736  */
4737 static void
nv_intr_pio_in(nv_port_t * nvp,nv_slot_t * nv_slotp)4738 nv_intr_pio_in(nv_port_t *nvp, nv_slot_t *nv_slotp)
4739 {
4740 	uchar_t	status;
4741 	sata_pkt_t *spkt = nv_slotp->nvslot_spkt;
4742 	sata_cmd_t *sata_cmdp = &spkt->satapkt_cmd;
4743 	ddi_acc_handle_t ctlhdl = nvp->nvp_ctl_hdl;
4744 	ddi_acc_handle_t cmdhdl = nvp->nvp_cmd_hdl;
4745 	int count;
4746 
4747 	status = nv_get8(cmdhdl, nvp->nvp_status);
4748 
4749 	if (status & SATA_STATUS_BSY) {
4750 		spkt->satapkt_reason = SATA_PKT_TIMEOUT;
4751 		nv_slotp->nvslot_flags = NVSLOT_COMPLETE;
4752 		sata_cmdp->satacmd_status_reg = nv_get8(ctlhdl,
4753 		    nvp->nvp_altstatus);
4754 		sata_cmdp->satacmd_error_reg = nv_get8(cmdhdl, nvp->nvp_error);
4755 		nv_reset(nvp, "intr_pio_in");
4756 
4757 		return;
4758 	}
4759 
4760 	/*
4761 	 * check for errors
4762 	 */
4763 	if ((status & (SATA_STATUS_DRQ | SATA_STATUS_DF |
4764 	    SATA_STATUS_ERR)) != SATA_STATUS_DRQ) {
4765 		nv_copy_registers(nvp, &spkt->satapkt_device, spkt);
4766 		nv_slotp->nvslot_flags = NVSLOT_COMPLETE;
4767 		spkt->satapkt_reason = SATA_PKT_DEV_ERROR;
4768 
4769 		return;
4770 	}
4771 
4772 	/*
4773 	 * read the next chunk of data (if any)
4774 	 */
4775 	count = min(nv_slotp->nvslot_byte_count, NV_BYTES_PER_SEC);
4776 
4777 	/*
4778 	 * read count bytes
4779 	 */
4780 	ASSERT(count != 0);
4781 
4782 	ddi_rep_get16(cmdhdl, (ushort_t *)nv_slotp->nvslot_v_addr,
4783 	    (ushort_t *)nvp->nvp_data, (count >> 1), DDI_DEV_NO_AUTOINCR);
4784 
4785 	nv_slotp->nvslot_v_addr += count;
4786 	nv_slotp->nvslot_byte_count -= count;
4787 
4788 
4789 	if (nv_slotp->nvslot_byte_count != 0) {
4790 		/*
4791 		 * more to transfer.  Wait for next interrupt.
4792 		 */
4793 		return;
4794 	}
4795 
4796 	/*
4797 	 * transfer is complete. wait for the busy bit to settle.
4798 	 */
4799 	NV_DELAY_NSEC(400);
4800 
4801 	spkt->satapkt_reason = SATA_PKT_COMPLETED;
4802 	nv_slotp->nvslot_flags = NVSLOT_COMPLETE;
4803 }
4804 
4805 
4806 /*
4807  * ATA command PIO data out
4808  */
4809 static void
nv_intr_pio_out(nv_port_t * nvp,nv_slot_t * nv_slotp)4810 nv_intr_pio_out(nv_port_t *nvp, nv_slot_t *nv_slotp)
4811 {
4812 	sata_pkt_t *spkt = nv_slotp->nvslot_spkt;
4813 	sata_cmd_t *sata_cmdp = &spkt->satapkt_cmd;
4814 	uchar_t status;
4815 	ddi_acc_handle_t ctlhdl = nvp->nvp_ctl_hdl;
4816 	ddi_acc_handle_t cmdhdl = nvp->nvp_cmd_hdl;
4817 	int count;
4818 
4819 	/*
4820 	 * clear the IRQ
4821 	 */
4822 	status = nv_get8(cmdhdl, nvp->nvp_status);
4823 
4824 	if (status & SATA_STATUS_BSY) {
4825 		/*
4826 		 * this should not happen
4827 		 */
4828 		spkt->satapkt_reason = SATA_PKT_TIMEOUT;
4829 		nv_slotp->nvslot_flags = NVSLOT_COMPLETE;
4830 		sata_cmdp->satacmd_status_reg = nv_get8(ctlhdl,
4831 		    nvp->nvp_altstatus);
4832 		sata_cmdp->satacmd_error_reg = nv_get8(cmdhdl, nvp->nvp_error);
4833 
4834 		return;
4835 	}
4836 
4837 	/*
4838 	 * check for errors
4839 	 */
4840 	if (status & (SATA_STATUS_DF | SATA_STATUS_ERR)) {
4841 		nv_copy_registers(nvp,  &spkt->satapkt_device, spkt);
4842 		nv_slotp->nvslot_flags = NVSLOT_COMPLETE;
4843 		spkt->satapkt_reason = SATA_PKT_DEV_ERROR;
4844 
4845 		return;
4846 	}
4847 
4848 	/*
4849 	 * this is the condition which signals the drive is
4850 	 * no longer ready to transfer.  Likely that the transfer
4851 	 * completed successfully, but check that byte_count is
4852 	 * zero.
4853 	 */
4854 	if ((status & SATA_STATUS_DRQ) == 0) {
4855 
4856 		if (nv_slotp->nvslot_byte_count == 0) {
4857 			/*
4858 			 * complete; successful transfer
4859 			 */
4860 			spkt->satapkt_reason = SATA_PKT_COMPLETED;
4861 		} else {
4862 			/*
4863 			 * error condition, incomplete transfer
4864 			 */
4865 			nv_copy_registers(nvp, &spkt->satapkt_device, spkt);
4866 			spkt->satapkt_reason = SATA_PKT_DEV_ERROR;
4867 		}
4868 		nv_slotp->nvslot_flags = NVSLOT_COMPLETE;
4869 
4870 		return;
4871 	}
4872 
4873 	/*
4874 	 * write the next chunk of data
4875 	 */
4876 	count = min(nv_slotp->nvslot_byte_count, NV_BYTES_PER_SEC);
4877 
4878 	/*
4879 	 * read or write count bytes
4880 	 */
4881 
4882 	ASSERT(count != 0);
4883 
4884 	ddi_rep_put16(cmdhdl, (ushort_t *)nv_slotp->nvslot_v_addr,
4885 	    (ushort_t *)nvp->nvp_data, (count >> 1), DDI_DEV_NO_AUTOINCR);
4886 
4887 	nv_slotp->nvslot_v_addr += count;
4888 	nv_slotp->nvslot_byte_count -= count;
4889 }
4890 
4891 
4892 /*
4893  * ATAPI PACKET command, PIO in/out interrupt
4894  *
4895  * Under normal circumstances, one of four different interrupt scenarios
4896  * will result in this function being called:
4897  *
4898  * 1. Packet command data transfer
4899  * 2. Packet command completion
4900  * 3. Request sense data transfer
4901  * 4. Request sense command completion
4902  */
4903 static void
nv_intr_pkt_pio(nv_port_t * nvp,nv_slot_t * nv_slotp)4904 nv_intr_pkt_pio(nv_port_t *nvp, nv_slot_t *nv_slotp)
4905 {
4906 	uchar_t	status;
4907 	sata_pkt_t *spkt = nv_slotp->nvslot_spkt;
4908 	sata_cmd_t *sata_cmdp = &spkt->satapkt_cmd;
4909 	int direction = sata_cmdp->satacmd_flags.sata_data_direction;
4910 	ddi_acc_handle_t ctlhdl = nvp->nvp_ctl_hdl;
4911 	ddi_acc_handle_t cmdhdl = nvp->nvp_cmd_hdl;
4912 	uint16_t ctlr_count;
4913 	int count;
4914 
4915 	/* ATAPI protocol state - HP2: Check_Status_B */
4916 
4917 	status = nv_get8(cmdhdl, nvp->nvp_status);
4918 	NVLOG(NVDBG_ATAPI, nvp->nvp_ctlp, nvp,
4919 	    "nv_intr_pkt_pio: status 0x%x", status);
4920 
4921 	if (status & SATA_STATUS_BSY) {
4922 		if ((nv_slotp->nvslot_flags & NVSLOT_RQSENSE) != 0) {
4923 			nv_slotp->nvslot_flags = NVSLOT_COMPLETE;
4924 			spkt->satapkt_reason = SATA_PKT_DEV_ERROR;
4925 		} else {
4926 			nv_slotp->nvslot_flags = NVSLOT_COMPLETE;
4927 			spkt->satapkt_reason = SATA_PKT_TIMEOUT;
4928 			nv_reset(nvp, "intr_pkt_pio");
4929 		}
4930 
4931 		NVLOG(NVDBG_ATAPI, nvp->nvp_ctlp, nvp,
4932 		    "nv_intr_pkt_pio: busy - status 0x%x", status);
4933 
4934 		return;
4935 	}
4936 
4937 	if ((status & SATA_STATUS_DF) != 0) {
4938 		/*
4939 		 * On device fault, just clean up and bail.  Request sense
4940 		 * will just default to its NO SENSE initialized value.
4941 		 */
4942 
4943 		if ((nv_slotp->nvslot_flags & NVSLOT_RQSENSE) == 0) {
4944 			nv_copy_registers(nvp, &spkt->satapkt_device, spkt);
4945 		}
4946 
4947 		nv_slotp->nvslot_flags = NVSLOT_COMPLETE;
4948 		spkt->satapkt_reason = SATA_PKT_DEV_ERROR;
4949 
4950 		sata_cmdp->satacmd_status_reg = nv_get8(ctlhdl,
4951 		    nvp->nvp_altstatus);
4952 		sata_cmdp->satacmd_error_reg = nv_get8(cmdhdl,
4953 		    nvp->nvp_error);
4954 
4955 		NVLOG(NVDBG_ATAPI, nvp->nvp_ctlp, nvp,
4956 		    "nv_intr_pkt_pio: device fault", NULL);
4957 
4958 		return;
4959 	}
4960 
4961 	if ((status & SATA_STATUS_ERR) != 0) {
4962 		/*
4963 		 * On command error, figure out whether we are processing a
4964 		 * request sense.  If so, clean up and bail.  Otherwise,
4965 		 * do a REQUEST SENSE.
4966 		 */
4967 
4968 		if ((nv_slotp->nvslot_flags & NVSLOT_RQSENSE) == 0) {
4969 			nv_slotp->nvslot_flags |= NVSLOT_RQSENSE;
4970 			if (nv_start_rqsense_pio(nvp, nv_slotp) ==
4971 			    NV_FAILURE) {
4972 				nv_copy_registers(nvp, &spkt->satapkt_device,
4973 				    spkt);
4974 				nv_slotp->nvslot_flags = NVSLOT_COMPLETE;
4975 				spkt->satapkt_reason = SATA_PKT_DEV_ERROR;
4976 			}
4977 
4978 			sata_cmdp->satacmd_status_reg = nv_get8(ctlhdl,
4979 			    nvp->nvp_altstatus);
4980 			sata_cmdp->satacmd_error_reg = nv_get8(cmdhdl,
4981 			    nvp->nvp_error);
4982 		} else {
4983 			nv_slotp->nvslot_flags = NVSLOT_COMPLETE;
4984 			spkt->satapkt_reason = SATA_PKT_DEV_ERROR;
4985 
4986 			nv_copy_registers(nvp, &spkt->satapkt_device, spkt);
4987 		}
4988 
4989 		NVLOG(NVDBG_ATAPI, nvp->nvp_ctlp, nvp,
4990 		    "nv_intr_pkt_pio: error (status 0x%x)", status);
4991 
4992 		return;
4993 	}
4994 
4995 	if ((nv_slotp->nvslot_flags & NVSLOT_RQSENSE) != 0) {
4996 		/*
4997 		 * REQUEST SENSE command processing
4998 		 */
4999 
5000 		if ((status & (SATA_STATUS_DRQ)) != 0) {
5001 			/* ATAPI state - HP4: Transfer_Data */
5002 
5003 			/* read the byte count from the controller */
5004 			ctlr_count =
5005 			    (uint16_t)nv_get8(cmdhdl, nvp->nvp_hcyl) << 8;
5006 			ctlr_count |= nv_get8(cmdhdl, nvp->nvp_lcyl);
5007 
5008 			NVLOG(NVDBG_ATAPI, nvp->nvp_ctlp, nvp,
5009 			    "nv_intr_pkt_pio: ctlr byte count - %d",
5010 			    ctlr_count);
5011 
5012 			if (ctlr_count == 0) {
5013 				/* no data to transfer - some devices do this */
5014 
5015 				spkt->satapkt_reason = SATA_PKT_DEV_ERROR;
5016 				nv_slotp->nvslot_flags = NVSLOT_COMPLETE;
5017 
5018 				NVLOG(NVDBG_ATAPI, nvp->nvp_ctlp, nvp,
5019 				    "nv_intr_pkt_pio: done (no data)", NULL);
5020 
5021 				return;
5022 			}
5023 
5024 			count = min(ctlr_count, SATA_ATAPI_RQSENSE_LEN);
5025 
5026 			/* transfer the data */
5027 			ddi_rep_get16(cmdhdl,
5028 			    (ushort_t *)nv_slotp->nvslot_rqsense_buff,
5029 			    (ushort_t *)nvp->nvp_data, (count >> 1),
5030 			    DDI_DEV_NO_AUTOINCR);
5031 
5032 			/* consume residual bytes */
5033 			ctlr_count -= count;
5034 
5035 			if (ctlr_count > 0) {
5036 				for (; ctlr_count > 0; ctlr_count -= 2)
5037 					(void) ddi_get16(cmdhdl,
5038 					    (ushort_t *)nvp->nvp_data);
5039 			}
5040 
5041 			NVLOG(NVDBG_ATAPI, nvp->nvp_ctlp, nvp,
5042 			    "nv_intr_pkt_pio: transition to HP2", NULL);
5043 		} else {
5044 			/* still in ATAPI state - HP2 */
5045 
5046 			/*
5047 			 * In order to avoid clobbering the rqsense data
5048 			 * set by the SATA common module, the sense data read
5049 			 * from the device is put in a separate buffer and
5050 			 * copied into the packet after the request sense
5051 			 * command successfully completes.
5052 			 */
5053 			bcopy(nv_slotp->nvslot_rqsense_buff,
5054 			    spkt->satapkt_cmd.satacmd_rqsense,
5055 			    SATA_ATAPI_RQSENSE_LEN);
5056 
5057 			nv_slotp->nvslot_flags = NVSLOT_COMPLETE;
5058 			spkt->satapkt_reason = SATA_PKT_DEV_ERROR;
5059 
5060 			NVLOG(NVDBG_ATAPI, nvp->nvp_ctlp, nvp,
5061 			    "nv_intr_pkt_pio: request sense done", NULL);
5062 		}
5063 
5064 		return;
5065 	}
5066 
5067 	/*
5068 	 * Normal command processing
5069 	 */
5070 
5071 	if ((status & (SATA_STATUS_DRQ)) != 0) {
5072 		/* ATAPI protocol state - HP4: Transfer_Data */
5073 
5074 		/* read the byte count from the controller */
5075 		ctlr_count = (uint16_t)nv_get8(cmdhdl, nvp->nvp_hcyl) << 8;
5076 		ctlr_count |= nv_get8(cmdhdl, nvp->nvp_lcyl);
5077 
5078 		if (ctlr_count == 0) {
5079 			/* no data to transfer - some devices do this */
5080 
5081 			spkt->satapkt_reason = SATA_PKT_COMPLETED;
5082 			nv_slotp->nvslot_flags = NVSLOT_COMPLETE;
5083 
5084 			NVLOG(NVDBG_ATAPI, nvp->nvp_ctlp, nvp,
5085 			    "nv_intr_pkt_pio: done (no data)", NULL);
5086 
5087 			return;
5088 		}
5089 
5090 		count = min(ctlr_count, nv_slotp->nvslot_byte_count);
5091 
5092 		NVLOG(NVDBG_ATAPI, nvp->nvp_ctlp, nvp,
5093 		    "nv_intr_pkt_pio: drive_bytes 0x%x", ctlr_count);
5094 
5095 		NVLOG(NVDBG_ATAPI, nvp->nvp_ctlp, nvp,
5096 		    "nv_intr_pkt_pio: byte_count 0x%x",
5097 		    nv_slotp->nvslot_byte_count);
5098 
5099 		/* transfer the data */
5100 
5101 		if (direction == SATA_DIR_READ) {
5102 			ddi_rep_get16(cmdhdl,
5103 			    (ushort_t *)nv_slotp->nvslot_v_addr,
5104 			    (ushort_t *)nvp->nvp_data, (count >> 1),
5105 			    DDI_DEV_NO_AUTOINCR);
5106 
5107 			ctlr_count -= count;
5108 
5109 			if (ctlr_count > 0) {
5110 				/* consume remaining bytes */
5111 
5112 				for (; ctlr_count > 0;
5113 				    ctlr_count -= 2)
5114 					(void) ddi_get16(cmdhdl,
5115 					    (ushort_t *)nvp->nvp_data);
5116 
5117 				NVLOG(NVDBG_ATAPI, nvp->nvp_ctlp, nvp,
5118 				    "nv_intr_pkt_pio: bytes remained", NULL);
5119 			}
5120 		} else {
5121 			ddi_rep_put16(cmdhdl,
5122 			    (ushort_t *)nv_slotp->nvslot_v_addr,
5123 			    (ushort_t *)nvp->nvp_data, (count >> 1),
5124 			    DDI_DEV_NO_AUTOINCR);
5125 		}
5126 
5127 		nv_slotp->nvslot_v_addr += count;
5128 		nv_slotp->nvslot_byte_count -= count;
5129 
5130 		NVLOG(NVDBG_ATAPI, nvp->nvp_ctlp, nvp,
5131 		    "nv_intr_pkt_pio: transition to HP2", NULL);
5132 	} else {
5133 		/* still in ATAPI state - HP2 */
5134 
5135 		spkt->satapkt_reason = SATA_PKT_COMPLETED;
5136 		nv_slotp->nvslot_flags = NVSLOT_COMPLETE;
5137 
5138 		NVLOG(NVDBG_ATAPI, nvp->nvp_ctlp, nvp,
5139 		    "nv_intr_pkt_pio: done", NULL);
5140 	}
5141 }
5142 
5143 
5144 /*
5145  * ATA command, DMA data in/out
5146  */
5147 static void
nv_intr_dma(nv_port_t * nvp,struct nv_slot * nv_slotp)5148 nv_intr_dma(nv_port_t *nvp, struct nv_slot *nv_slotp)
5149 {
5150 	uchar_t status;
5151 	sata_pkt_t *spkt = nv_slotp->nvslot_spkt;
5152 	sata_cmd_t *sata_cmdp = &spkt->satapkt_cmd;
5153 	ddi_acc_handle_t ctlhdl = nvp->nvp_ctl_hdl;
5154 	ddi_acc_handle_t cmdhdl = nvp->nvp_cmd_hdl;
5155 	ddi_acc_handle_t bmhdl = nvp->nvp_bm_hdl;
5156 	uchar_t	bmicx;
5157 	uchar_t bm_status;
5158 
5159 	nv_slotp->nvslot_flags = NVSLOT_COMPLETE;
5160 
5161 	/*
5162 	 * stop DMA engine.
5163 	 */
5164 	bmicx = nv_get8(bmhdl, nvp->nvp_bmicx);
5165 	nv_put8(bmhdl, nvp->nvp_bmicx,  bmicx & ~BMICX_SSBM);
5166 
5167 	/*
5168 	 * get the status and clear the IRQ, and check for DMA error
5169 	 */
5170 	status = nv_get8(cmdhdl, nvp->nvp_status);
5171 
5172 	/*
5173 	 * check for drive errors
5174 	 */
5175 	if (status & (SATA_STATUS_DF | SATA_STATUS_ERR)) {
5176 		nv_copy_registers(nvp, &spkt->satapkt_device, spkt);
5177 		spkt->satapkt_reason = SATA_PKT_DEV_ERROR;
5178 		(void) nv_bm_status_clear(nvp);
5179 
5180 		return;
5181 	}
5182 
5183 	bm_status = nv_bm_status_clear(nvp);
5184 
5185 	/*
5186 	 * check for bus master errors
5187 	 */
5188 
5189 	if (bm_status & BMISX_IDERR) {
5190 		spkt->satapkt_reason = SATA_PKT_PORT_ERROR;
5191 		sata_cmdp->satacmd_status_reg = nv_get8(ctlhdl,
5192 		    nvp->nvp_altstatus);
5193 		sata_cmdp->satacmd_error_reg = nv_get8(cmdhdl, nvp->nvp_error);
5194 		nv_reset(nvp, "intr_dma");
5195 
5196 		return;
5197 	}
5198 
5199 	spkt->satapkt_reason = SATA_PKT_COMPLETED;
5200 }
5201 
5202 
5203 /*
5204  * Wait for a register of a controller to achieve a specific state.
5205  * To return normally, all the bits in the first sub-mask must be ON,
5206  * all the bits in the second sub-mask must be OFF.
5207  * If timeout_usec microseconds pass without the controller achieving
5208  * the desired bit configuration, return TRUE, else FALSE.
5209  *
5210  * hybrid waiting algorithm: if not in interrupt context, busy looping will
5211  * occur for the first 250 us, then switch over to a sleeping wait.
5212  *
5213  */
5214 int
nv_wait(nv_port_t * nvp,uchar_t onbits,uchar_t offbits,uint_t timeout_usec,int type_wait)5215 nv_wait(nv_port_t *nvp, uchar_t onbits, uchar_t offbits, uint_t timeout_usec,
5216     int type_wait)
5217 {
5218 	ddi_acc_handle_t ctlhdl = nvp->nvp_ctl_hdl;
5219 	hrtime_t end, cur, start_sleep, start;
5220 	int first_time = B_TRUE;
5221 	ushort_t val;
5222 
5223 	for (;;) {
5224 		val = nv_get8(ctlhdl, nvp->nvp_altstatus);
5225 
5226 		if ((val & onbits) == onbits && (val & offbits) == 0) {
5227 
5228 			return (B_TRUE);
5229 		}
5230 
5231 		cur = gethrtime();
5232 
5233 		/*
5234 		 * store the start time and calculate the end
5235 		 * time.  also calculate "start_sleep" which is
5236 		 * the point after which the driver will stop busy
5237 		 * waiting and change to sleep waiting.
5238 		 */
5239 		if (first_time) {
5240 			first_time = B_FALSE;
5241 			/*
5242 			 * start and end are in nanoseconds
5243 			 */
5244 			start = cur;
5245 			end = start + timeout_usec * 1000;
5246 			/*
5247 			 * add 1 ms to start
5248 			 */
5249 			start_sleep =  start + 250000;
5250 
5251 			if (servicing_interrupt()) {
5252 				type_wait = NV_NOSLEEP;
5253 			}
5254 		}
5255 
5256 		if (cur > end) {
5257 
5258 			break;
5259 		}
5260 
5261 		if ((type_wait != NV_NOSLEEP) && (cur > start_sleep)) {
5262 #if ! defined(__lock_lint)
5263 			delay(1);
5264 #endif
5265 		} else {
5266 			drv_usecwait(nv_usec_delay);
5267 		}
5268 	}
5269 
5270 	return (B_FALSE);
5271 }
5272 
5273 
5274 /*
5275  * This is a slightly more complicated version that checks
5276  * for error conditions and bails-out rather than looping
5277  * until the timeout is exceeded.
5278  *
5279  * hybrid waiting algorithm: if not in interrupt context, busy looping will
5280  * occur for the first 250 us, then switch over to a sleeping wait.
5281  */
5282 int
nv_wait3(nv_port_t * nvp,uchar_t onbits1,uchar_t offbits1,uchar_t failure_onbits2,uchar_t failure_offbits2,uchar_t failure_onbits3,uchar_t failure_offbits3,uint_t timeout_usec,int type_wait)5283 nv_wait3(
5284 	nv_port_t	*nvp,
5285 	uchar_t		onbits1,
5286 	uchar_t		offbits1,
5287 	uchar_t		failure_onbits2,
5288 	uchar_t		failure_offbits2,
5289 	uchar_t		failure_onbits3,
5290 	uchar_t		failure_offbits3,
5291 	uint_t		timeout_usec,
5292 	int		type_wait)
5293 {
5294 	ddi_acc_handle_t ctlhdl = nvp->nvp_ctl_hdl;
5295 	hrtime_t end, cur, start_sleep, start;
5296 	int first_time = B_TRUE;
5297 	ushort_t val;
5298 
5299 	for (;;) {
5300 		val = nv_get8(ctlhdl, nvp->nvp_altstatus);
5301 
5302 		/*
5303 		 * check for expected condition
5304 		 */
5305 		if ((val & onbits1) == onbits1 && (val & offbits1) == 0) {
5306 
5307 			return (B_TRUE);
5308 		}
5309 
5310 		/*
5311 		 * check for error conditions
5312 		 */
5313 		if ((val & failure_onbits2) == failure_onbits2 &&
5314 		    (val & failure_offbits2) == 0) {
5315 
5316 			return (B_FALSE);
5317 		}
5318 
5319 		if ((val & failure_onbits3) == failure_onbits3 &&
5320 		    (val & failure_offbits3) == 0) {
5321 
5322 			return (B_FALSE);
5323 		}
5324 
5325 		/*
5326 		 * store the start time and calculate the end
5327 		 * time.  also calculate "start_sleep" which is
5328 		 * the point after which the driver will stop busy
5329 		 * waiting and change to sleep waiting.
5330 		 */
5331 		if (first_time) {
5332 			first_time = B_FALSE;
5333 			/*
5334 			 * start and end are in nanoseconds
5335 			 */
5336 			cur = start = gethrtime();
5337 			end = start + timeout_usec * 1000;
5338 			/*
5339 			 * add 1 ms to start
5340 			 */
5341 			start_sleep =  start + 250000;
5342 
5343 			if (servicing_interrupt()) {
5344 				type_wait = NV_NOSLEEP;
5345 			}
5346 		} else {
5347 			cur = gethrtime();
5348 		}
5349 
5350 		if (cur > end) {
5351 
5352 			break;
5353 		}
5354 
5355 		if ((type_wait != NV_NOSLEEP) && (cur > start_sleep)) {
5356 #if ! defined(__lock_lint)
5357 			delay(1);
5358 #endif
5359 		} else {
5360 			drv_usecwait(nv_usec_delay);
5361 		}
5362 	}
5363 
5364 	return (B_FALSE);
5365 }
5366 
5367 
5368 /*
5369  * nv_port_state_change() reports the state of the port to the
5370  * sata module by calling sata_hba_event_notify().  This
5371  * function is called any time the state of the port is changed
5372  */
5373 static void
nv_port_state_change(nv_port_t * nvp,int event,uint8_t addr_type,int state)5374 nv_port_state_change(nv_port_t *nvp, int event, uint8_t addr_type, int state)
5375 {
5376 	sata_device_t sd;
5377 
5378 	NVLOG(NVDBG_EVENT, nvp->nvp_ctlp, nvp,
5379 	    "nv_port_state_change: event 0x%x type 0x%x state 0x%x "
5380 	    "lbolt %ld (ticks)", event, addr_type, state, ddi_get_lbolt());
5381 
5382 	if (ddi_in_panic() != 0) {
5383 
5384 		return;
5385 	}
5386 
5387 	bzero((void *)&sd, sizeof (sata_device_t));
5388 	sd.satadev_rev = SATA_DEVICE_REV;
5389 	nv_copy_registers(nvp, &sd, NULL);
5390 
5391 	/*
5392 	 * When NCQ is implemented sactive and snotific field need to be
5393 	 * updated.
5394 	 */
5395 	sd.satadev_addr.cport = nvp->nvp_port_num;
5396 	sd.satadev_addr.qual = addr_type;
5397 	sd.satadev_state = state;
5398 
5399 	sata_hba_event_notify(nvp->nvp_ctlp->nvc_dip, &sd, event);
5400 }
5401 
5402 
5403 /*
5404  * Monitor reset progress and signature gathering.
5405  */
5406 static clock_t
nv_monitor_reset(nv_port_t * nvp)5407 nv_monitor_reset(nv_port_t *nvp)
5408 {
5409 	ddi_acc_handle_t bar5_hdl = nvp->nvp_ctlp->nvc_bar_hdl[5];
5410 	uint32_t sstatus;
5411 
5412 	ASSERT(MUTEX_HELD(&nvp->nvp_mutex));
5413 
5414 	sstatus = nv_get32(bar5_hdl, nvp->nvp_sstatus);
5415 
5416 	/*
5417 	 * Check the link status. The link needs to be active before
5418 	 * checking the link's status.
5419 	 */
5420 	if ((SSTATUS_GET_IPM(sstatus) != SSTATUS_IPM_ACTIVE) ||
5421 	    (SSTATUS_GET_DET(sstatus) != SSTATUS_DET_DEVPRE_PHYCOM)) {
5422 		/*
5423 		 * Either link is not active or there is no device
5424 		 * If the link remains down for more than NV_LINK_EVENT_DOWN
5425 		 * (milliseconds), abort signature acquisition and complete
5426 		 * reset processing.  The link will go down when COMRESET is
5427 		 * sent by nv_reset().
5428 		 */
5429 
5430 		if (TICK_TO_MSEC(ddi_get_lbolt() - nvp->nvp_reset_time) >=
5431 		    NV_LINK_EVENT_DOWN) {
5432 
5433 			nv_cmn_err(CE_NOTE, nvp->nvp_ctlp, nvp,
5434 			    "nv_monitor_reset: no link - ending signature "
5435 			    "acquisition; time after reset %ldms",
5436 			    TICK_TO_MSEC(ddi_get_lbolt() -
5437 			    nvp->nvp_reset_time));
5438 
5439 			DTRACE_PROBE(no_link_reset_giving_up_f);
5440 
5441 			/*
5442 			 * If the drive was previously present and configured
5443 			 * and then subsequently removed, then send a removal
5444 			 * event to sata common module.
5445 			 */
5446 			if (nvp->nvp_type != SATA_DTYPE_NONE) {
5447 				nv_port_state_change(nvp,
5448 				    SATA_EVNT_DEVICE_DETACHED,
5449 				    SATA_ADDR_CPORT, 0);
5450 			}
5451 
5452 			nvp->nvp_type = SATA_DTYPE_NONE;
5453 			nvp->nvp_signature = NV_NO_SIG;
5454 			nvp->nvp_state &= ~(NV_DEACTIVATED);
5455 
5456 #ifdef SGPIO_SUPPORT
5457 			nv_sgp_drive_disconnect(nvp->nvp_ctlp,
5458 			    SGP_CTLR_PORT_TO_DRV(
5459 			    nvp->nvp_ctlp->nvc_ctlr_num,
5460 			    nvp->nvp_port_num));
5461 #endif
5462 
5463 			cv_signal(&nvp->nvp_reset_cv);
5464 
5465 			return (0);
5466 		}
5467 
5468 		DTRACE_PROBE(link_lost_reset_keep_trying_p);
5469 
5470 		return (nvp->nvp_wait_sig);
5471 	}
5472 
5473 	NVLOG(NVDBG_RESET, nvp->nvp_ctlp, nvp,
5474 	    "nv_monitor_reset: link up.  time since reset %ldms",
5475 	    TICK_TO_MSEC(ddi_get_lbolt() - nvp->nvp_reset_time));
5476 
5477 	nv_read_signature(nvp);
5478 
5479 
5480 	if (nvp->nvp_signature != NV_NO_SIG) {
5481 		/*
5482 		 * signature has been acquired, send the appropriate
5483 		 * event to the sata common module.
5484 		 */
5485 		if (nvp->nvp_state & (NV_ATTACH|NV_HOTPLUG)) {
5486 			char *source;
5487 
5488 			if (nvp->nvp_state & NV_HOTPLUG) {
5489 
5490 				source = "hotplugged";
5491 				nv_port_state_change(nvp,
5492 				    SATA_EVNT_DEVICE_ATTACHED,
5493 				    SATA_ADDR_CPORT, SATA_DSTATE_PWR_ACTIVE);
5494 				DTRACE_PROBE1(got_sig_for_hotplugged_device_h,
5495 				    int, nvp->nvp_state);
5496 
5497 			} else {
5498 				source = "activated or attached";
5499 				DTRACE_PROBE1(got_sig_for_existing_device_h,
5500 				    int, nvp->nvp_state);
5501 			}
5502 
5503 			NVLOG(NVDBG_RESET, nvp->nvp_ctlp, nvp,
5504 			    "signature acquired for %s device. sig:"
5505 			    " 0x%x state: 0x%x nvp_type: 0x%x", source,
5506 			    nvp->nvp_signature, nvp->nvp_state, nvp->nvp_type);
5507 
5508 
5509 			nvp->nvp_state &= ~(NV_RESET|NV_ATTACH|NV_HOTPLUG);
5510 
5511 #ifdef SGPIO_SUPPORT
5512 			if (nvp->nvp_type == SATA_DTYPE_ATADISK) {
5513 				nv_sgp_drive_connect(nvp->nvp_ctlp,
5514 				    SGP_CTLR_PORT_TO_DRV(
5515 				    nvp->nvp_ctlp->nvc_ctlr_num,
5516 				    nvp->nvp_port_num));
5517 			} else {
5518 				nv_sgp_drive_disconnect(nvp->nvp_ctlp,
5519 				    SGP_CTLR_PORT_TO_DRV(
5520 				    nvp->nvp_ctlp->nvc_ctlr_num,
5521 				    nvp->nvp_port_num));
5522 			}
5523 #endif
5524 
5525 			cv_signal(&nvp->nvp_reset_cv);
5526 
5527 			return (0);
5528 		}
5529 
5530 		/*
5531 		 * Since this was not an attach, it was a reset of an
5532 		 * existing device
5533 		 */
5534 		nvp->nvp_state &= ~NV_RESET;
5535 		nvp->nvp_state |= NV_RESTORE;
5536 
5537 
5538 
5539 		DTRACE_PROBE(got_signature_reset_complete_p);
5540 		DTRACE_PROBE1(nvp_signature_h, int, nvp->nvp_signature);
5541 		DTRACE_PROBE1(nvp_state_h, int, nvp->nvp_state);
5542 
5543 		NVLOG(NVDBG_RESET, nvp->nvp_ctlp, nvp,
5544 		    "signature acquired reset complete. sig: 0x%x"
5545 		    " state: 0x%x", nvp->nvp_signature, nvp->nvp_state);
5546 
5547 		/*
5548 		 * interrupts may have been disabled so just make sure
5549 		 * they are cleared and re-enabled.
5550 		 */
5551 
5552 		(*(nvp->nvp_ctlp->nvc_set_intr))(nvp,
5553 		    NV_INTR_CLEAR_ALL|NV_INTR_ENABLE);
5554 
5555 		nv_port_state_change(nvp, SATA_EVNT_DEVICE_RESET,
5556 		    SATA_ADDR_DCPORT,
5557 		    SATA_DSTATE_RESET | SATA_DSTATE_PWR_ACTIVE);
5558 
5559 		return (0);
5560 	}
5561 
5562 
5563 	if (TICK_TO_MSEC(ddi_get_lbolt() - nvp->nvp_reset_time) >
5564 	    NV_RETRY_RESET_SIG) {
5565 
5566 
5567 		if (nvp->nvp_reset_retry_count >= NV_MAX_RESET_RETRY) {
5568 
5569 			nvp->nvp_state |= NV_FAILED;
5570 			nvp->nvp_state &= ~(NV_RESET|NV_ATTACH|NV_HOTPLUG);
5571 
5572 			DTRACE_PROBE(reset_exceeded_waiting_for_sig_p);
5573 			DTRACE_PROBE(reset_exceeded_waiting_for_sig_f);
5574 			DTRACE_PROBE1(nvp_state_h, int, nvp->nvp_state);
5575 			NVLOG(NVDBG_RESET, nvp->nvp_ctlp, nvp,
5576 			    "reset time exceeded waiting for sig nvp_state %x",
5577 			    nvp->nvp_state);
5578 
5579 			nv_port_state_change(nvp, SATA_EVNT_PORT_FAILED,
5580 			    SATA_ADDR_CPORT, 0);
5581 
5582 			cv_signal(&nvp->nvp_reset_cv);
5583 
5584 			return (0);
5585 		}
5586 
5587 		nv_reset(nvp, "retry");
5588 
5589 		return (nvp->nvp_wait_sig);
5590 	}
5591 
5592 	/*
5593 	 * signature not received, keep trying
5594 	 */
5595 	DTRACE_PROBE(no_sig_keep_waiting_p);
5596 
5597 	/*
5598 	 * double the wait time for sig since the last try but cap it off at
5599 	 * 1 second.
5600 	 */
5601 	nvp->nvp_wait_sig = nvp->nvp_wait_sig * 2;
5602 
5603 	return (nvp->nvp_wait_sig > NV_ONE_SEC ? NV_ONE_SEC :
5604 	    nvp->nvp_wait_sig);
5605 }
5606 
5607 
5608 /*
5609  * timeout processing:
5610  *
5611  * Check if any packets have crossed a timeout threshold.  If so,
5612  * abort the packet.  This function is not NCQ-aware.
5613  *
5614  * If reset is in progress, call reset monitoring function.
5615  *
5616  * Timeout frequency may be lower for checking packet timeout
5617  * and higher for reset monitoring.
5618  *
5619  */
5620 static void
nv_timeout(void * arg)5621 nv_timeout(void *arg)
5622 {
5623 	nv_port_t *nvp = arg;
5624 	nv_slot_t *nv_slotp;
5625 	clock_t next_timeout_us = NV_ONE_SEC;
5626 	uint16_t int_status;
5627 	uint8_t status, bmstatus;
5628 	static int intr_warn_once = 0;
5629 	uint32_t serror;
5630 
5631 
5632 	ASSERT(nvp != NULL);
5633 
5634 	mutex_enter(&nvp->nvp_mutex);
5635 	nvp->nvp_timeout_id = 0;
5636 
5637 	if (nvp->nvp_state & (NV_DEACTIVATED|NV_FAILED)) {
5638 		next_timeout_us = 0;
5639 
5640 		goto finished;
5641 	}
5642 
5643 	if (nvp->nvp_state & NV_RESET) {
5644 		next_timeout_us = nv_monitor_reset(nvp);
5645 
5646 		goto finished;
5647 	}
5648 
5649 	if (nvp->nvp_state & NV_LINK_EVENT) {
5650 		boolean_t device_present = B_FALSE;
5651 		uint32_t sstatus;
5652 		ddi_acc_handle_t bar5_hdl = nvp->nvp_ctlp->nvc_bar_hdl[5];
5653 
5654 		if (TICK_TO_USEC(ddi_get_lbolt() -
5655 		    nvp->nvp_link_event_time) < NV_LINK_EVENT_SETTLE) {
5656 
5657 			next_timeout_us = 10 * NV_ONE_MSEC;
5658 
5659 			DTRACE_PROBE(link_event_set_no_timeout_keep_waiting_p);
5660 
5661 			goto finished;
5662 		}
5663 
5664 		DTRACE_PROBE(link_event_settled_now_process_p);
5665 
5666 		nvp->nvp_state &= ~NV_LINK_EVENT;
5667 
5668 		/*
5669 		 * ck804 routinely reports the wrong hotplug/unplug event,
5670 		 * and it's been seen on mcp55 when there are signal integrity
5671 		 * issues.  Therefore need to infer the event from the
5672 		 * current link status.
5673 		 */
5674 
5675 		sstatus = nv_get32(bar5_hdl, nvp->nvp_sstatus);
5676 
5677 		if ((SSTATUS_GET_IPM(sstatus) == SSTATUS_IPM_ACTIVE) &&
5678 		    (SSTATUS_GET_DET(sstatus) ==
5679 		    SSTATUS_DET_DEVPRE_PHYCOM)) {
5680 			device_present = B_TRUE;
5681 		}
5682 
5683 		if ((nvp->nvp_signature != NV_NO_SIG) &&
5684 		    (device_present == B_FALSE)) {
5685 
5686 			NVLOG(NVDBG_HOT, nvp->nvp_ctlp, nvp,
5687 			    "nv_timeout: device detached", NULL);
5688 
5689 			DTRACE_PROBE(device_detached_p);
5690 
5691 			(void) nv_abort_active(nvp, NULL, SATA_PKT_PORT_ERROR,
5692 			    B_FALSE);
5693 
5694 			nv_port_state_change(nvp, SATA_EVNT_DEVICE_DETACHED,
5695 			    SATA_ADDR_CPORT, 0);
5696 
5697 			nvp->nvp_signature = NV_NO_SIG;
5698 			nvp->nvp_rem_time = ddi_get_lbolt();
5699 			nvp->nvp_type = SATA_DTYPE_NONE;
5700 			next_timeout_us = 0;
5701 
5702 #ifdef SGPIO_SUPPORT
5703 			nv_sgp_drive_disconnect(nvp->nvp_ctlp,
5704 			    SGP_CTLR_PORT_TO_DRV(nvp->nvp_ctlp->nvc_ctlr_num,
5705 			    nvp->nvp_port_num));
5706 #endif
5707 
5708 			goto finished;
5709 		}
5710 
5711 		/*
5712 		 * if the device was already present, and it's still present,
5713 		 * then abort any outstanding command and issue a reset.
5714 		 * This may result from transient link errors.
5715 		 */
5716 
5717 		if ((nvp->nvp_signature != NV_NO_SIG) &&
5718 		    (device_present == B_TRUE)) {
5719 
5720 			NVLOG(NVDBG_HOT, nvp->nvp_ctlp, nvp,
5721 			    "nv_timeout: spurious link event", NULL);
5722 			DTRACE_PROBE(spurious_link_event_p);
5723 
5724 			(void) nv_abort_active(nvp, NULL, SATA_PKT_PORT_ERROR,
5725 			    B_FALSE);
5726 
5727 			nvp->nvp_signature = NV_NO_SIG;
5728 			nvp->nvp_trans_link_time = ddi_get_lbolt();
5729 			nvp->nvp_trans_link_count++;
5730 			next_timeout_us = 0;
5731 
5732 			nv_reset(nvp, "transient link event");
5733 
5734 			goto finished;
5735 		}
5736 
5737 
5738 		/*
5739 		 * a new device has been inserted
5740 		 */
5741 		if ((nvp->nvp_signature == NV_NO_SIG) &&
5742 		    (device_present == B_TRUE)) {
5743 			NVLOG(NVDBG_HOT, nvp->nvp_ctlp, nvp,
5744 			    "nv_timeout: device attached", NULL);
5745 
5746 			DTRACE_PROBE(device_attached_p);
5747 			nvp->nvp_add_time = ddi_get_lbolt();
5748 			next_timeout_us = 0;
5749 			nvp->nvp_reset_count = 0;
5750 			nvp->nvp_state = NV_HOTPLUG;
5751 			nvp->nvp_type = SATA_DTYPE_UNKNOWN;
5752 			nv_reset(nvp, "hotplug");
5753 
5754 			goto finished;
5755 		}
5756 
5757 		/*
5758 		 * no link, and no prior device.  Nothing to do, but
5759 		 * log this.
5760 		 */
5761 		NVLOG(NVDBG_HOT, nvp->nvp_ctlp, nvp,
5762 		    "nv_timeout: delayed hot processing no link no prior"
5763 		    " device", NULL);
5764 		DTRACE_PROBE(delayed_hotplug_no_link_no_prior_device_p);
5765 
5766 		nvp->nvp_trans_link_time = ddi_get_lbolt();
5767 		nvp->nvp_trans_link_count++;
5768 		next_timeout_us = 0;
5769 
5770 		goto finished;
5771 	}
5772 
5773 	/*
5774 	 * Not yet NCQ-aware - there is only one command active.
5775 	 */
5776 	nv_slotp = &(nvp->nvp_slot[0]);
5777 
5778 	/*
5779 	 * perform timeout checking and processing only if there is an
5780 	 * active packet on the port
5781 	 */
5782 	if (nv_slotp != NULL && nv_slotp->nvslot_spkt != NULL)  {
5783 		sata_pkt_t *spkt = nv_slotp->nvslot_spkt;
5784 		sata_cmd_t *satacmd = &spkt->satapkt_cmd;
5785 		uint8_t cmd = satacmd->satacmd_cmd_reg;
5786 		uint64_t lba;
5787 
5788 #if ! defined(__lock_lint) && defined(DEBUG)
5789 
5790 		lba = (uint64_t)satacmd->satacmd_lba_low_lsb |
5791 		    ((uint64_t)satacmd->satacmd_lba_mid_lsb << 8) |
5792 		    ((uint64_t)satacmd->satacmd_lba_high_lsb << 16) |
5793 		    ((uint64_t)satacmd->satacmd_lba_low_msb << 24) |
5794 		    ((uint64_t)satacmd->satacmd_lba_mid_msb << 32) |
5795 		    ((uint64_t)satacmd->satacmd_lba_high_msb << 40);
5796 #endif
5797 
5798 		/*
5799 		 * timeout not needed if there is a polling thread
5800 		 */
5801 		if (spkt->satapkt_op_mode & SATA_OPMODE_POLLING) {
5802 			next_timeout_us = 0;
5803 
5804 			goto finished;
5805 		}
5806 
5807 		if (TICK_TO_SEC(ddi_get_lbolt() - nv_slotp->nvslot_stime) >
5808 		    spkt->satapkt_time) {
5809 
5810 			serror = nv_get32(nvp->nvp_ctlp->nvc_bar_hdl[5],
5811 			    nvp->nvp_serror);
5812 			status = nv_get8(nvp->nvp_ctl_hdl,
5813 			    nvp->nvp_altstatus);
5814 			bmstatus = nv_get8(nvp->nvp_bm_hdl,
5815 			    nvp->nvp_bmisx);
5816 
5817 			nv_cmn_err(CE_NOTE, nvp->nvp_ctlp, nvp,
5818 			    "nv_timeout: aborting: "
5819 			    "nvslot_stime: %ld max ticks till timeout: %ld "
5820 			    "cur_time: %ld cmd = 0x%x lba = %d seq = %d",
5821 			    nv_slotp->nvslot_stime,
5822 			    drv_usectohz(MICROSEC *
5823 			    spkt->satapkt_time), ddi_get_lbolt(),
5824 			    cmd, lba, nvp->nvp_seq);
5825 
5826 			NVLOG(NVDBG_TIMEOUT, nvp->nvp_ctlp, nvp,
5827 			    "nv_timeout: altstatus = 0x%x  bmicx = 0x%x "
5828 			    "serror = 0x%x previous_cmd = "
5829 			    "0x%x", status, bmstatus, serror,
5830 			    nvp->nvp_previous_cmd);
5831 
5832 
5833 			DTRACE_PROBE1(nv_timeout_packet_p, int, nvp);
5834 
5835 			if (nvp->nvp_mcp5x_int_status != NULL) {
5836 
5837 				int_status = nv_get16(
5838 				    nvp->nvp_ctlp->nvc_bar_hdl[5],
5839 				    nvp->nvp_mcp5x_int_status);
5840 				NVLOG(NVDBG_TIMEOUT, nvp->nvp_ctlp, nvp,
5841 				    "int_status = 0x%x", int_status);
5842 
5843 				if (int_status & MCP5X_INT_COMPLETE) {
5844 					/*
5845 					 * Completion interrupt was missed.
5846 					 * Issue warning message once.
5847 					 */
5848 					if (!intr_warn_once) {
5849 
5850 						nv_cmn_err(CE_WARN,
5851 						    nvp->nvp_ctlp,
5852 						    nvp,
5853 						    "nv_sata: missing command "
5854 						    "completion interrupt");
5855 						intr_warn_once = 1;
5856 
5857 					}
5858 
5859 					NVLOG(NVDBG_TIMEOUT, nvp->nvp_ctlp,
5860 					    nvp, "timeout detected with "
5861 					    "interrupt ready - calling "
5862 					    "int directly", NULL);
5863 
5864 					mutex_exit(&nvp->nvp_mutex);
5865 					(void) mcp5x_intr_port(nvp);
5866 					mutex_enter(&nvp->nvp_mutex);
5867 
5868 				} else {
5869 					/*
5870 					 * True timeout and not a missing
5871 					 * interrupt.
5872 					 */
5873 					DTRACE_PROBE1(timeout_abort_active_p,
5874 					    int *, nvp);
5875 					(void) nv_abort_active(nvp, spkt,
5876 					    SATA_PKT_TIMEOUT, B_TRUE);
5877 				}
5878 			} else {
5879 				(void) nv_abort_active(nvp, spkt,
5880 				    SATA_PKT_TIMEOUT, B_TRUE);
5881 			}
5882 
5883 		} else {
5884 			NVLOG(NVDBG_VERBOSE, nvp->nvp_ctlp, nvp,
5885 			    "nv_timeout:"
5886 			    " still in use so restarting timeout",
5887 			    NULL);
5888 
5889 			next_timeout_us = NV_ONE_SEC;
5890 		}
5891 	} else {
5892 		/*
5893 		 * there was no active packet, so do not re-enable timeout
5894 		 */
5895 		next_timeout_us = 0;
5896 		NVLOG(NVDBG_VERBOSE, nvp->nvp_ctlp, nvp,
5897 		    "nv_timeout: no active packet so not re-arming "
5898 		    "timeout", NULL);
5899 	}
5900 
5901 finished:
5902 
5903 	nv_setup_timeout(nvp, next_timeout_us);
5904 
5905 	mutex_exit(&nvp->nvp_mutex);
5906 }
5907 
5908 
5909 /*
5910  * enable or disable the 3 interrupt types the driver is
5911  * interested in: completion, add and remove.
5912  */
5913 static void
ck804_set_intr(nv_port_t * nvp,int flag)5914 ck804_set_intr(nv_port_t *nvp, int flag)
5915 {
5916 	nv_ctl_t *nvc = nvp->nvp_ctlp;
5917 	ddi_acc_handle_t bar5_hdl = nvc->nvc_bar_hdl[5];
5918 	uchar_t *bar5  = nvc->nvc_bar_addr[5];
5919 	uint8_t intr_bits[] = { CK804_INT_PDEV_HOT|CK804_INT_PDEV_INT,
5920 	    CK804_INT_SDEV_HOT|CK804_INT_SDEV_INT };
5921 	uint8_t clear_all_bits[] = { CK804_INT_PDEV_ALL, CK804_INT_SDEV_ALL };
5922 	uint8_t int_en, port = nvp->nvp_port_num, intr_status;
5923 
5924 	if (flag & NV_INTR_DISABLE_NON_BLOCKING) {
5925 		int_en = nv_get8(bar5_hdl,
5926 		    (uint8_t *)(bar5 + CK804_SATA_INT_EN));
5927 		int_en &= ~intr_bits[port];
5928 		nv_put8(bar5_hdl, (uint8_t *)(bar5 + CK804_SATA_INT_EN),
5929 		    int_en);
5930 		return;
5931 	}
5932 
5933 	ASSERT(mutex_owned(&nvp->nvp_mutex));
5934 
5935 	/*
5936 	 * controller level lock also required since access to an 8-bit
5937 	 * interrupt register is shared between both channels.
5938 	 */
5939 	mutex_enter(&nvc->nvc_mutex);
5940 
5941 	if (flag & NV_INTR_CLEAR_ALL) {
5942 		NVLOG(NVDBG_INTR, nvc, nvp,
5943 		    "ck804_set_intr: NV_INTR_CLEAR_ALL", NULL);
5944 
5945 		intr_status = nv_get8(nvc->nvc_bar_hdl[5],
5946 		    (uint8_t *)(nvc->nvc_ck804_int_status));
5947 
5948 		if (intr_status & clear_all_bits[port]) {
5949 
5950 			nv_put8(nvc->nvc_bar_hdl[5],
5951 			    (uint8_t *)(nvc->nvc_ck804_int_status),
5952 			    clear_all_bits[port]);
5953 
5954 			NVLOG(NVDBG_INTR, nvc, nvp,
5955 			    "interrupt bits cleared %x",
5956 			    intr_status & clear_all_bits[port]);
5957 		}
5958 	}
5959 
5960 	if (flag & NV_INTR_DISABLE) {
5961 		NVLOG(NVDBG_INTR, nvc, nvp,
5962 		    "ck804_set_intr: NV_INTR_DISABLE", NULL);
5963 		int_en = nv_get8(bar5_hdl,
5964 		    (uint8_t *)(bar5 + CK804_SATA_INT_EN));
5965 		int_en &= ~intr_bits[port];
5966 		nv_put8(bar5_hdl, (uint8_t *)(bar5 + CK804_SATA_INT_EN),
5967 		    int_en);
5968 	}
5969 
5970 	if (flag & NV_INTR_ENABLE) {
5971 		NVLOG(NVDBG_INTR, nvc, nvp, "ck804_set_intr: NV_INTR_ENABLE",
5972 		    NULL);
5973 		int_en = nv_get8(bar5_hdl,
5974 		    (uint8_t *)(bar5 + CK804_SATA_INT_EN));
5975 		int_en |= intr_bits[port];
5976 		nv_put8(bar5_hdl, (uint8_t *)(bar5 + CK804_SATA_INT_EN),
5977 		    int_en);
5978 	}
5979 
5980 	mutex_exit(&nvc->nvc_mutex);
5981 }
5982 
5983 
5984 /*
5985  * enable or disable the 3 interrupts the driver is interested in:
5986  * completion interrupt, hot add, and hot remove interrupt.
5987  */
5988 static void
mcp5x_set_intr(nv_port_t * nvp,int flag)5989 mcp5x_set_intr(nv_port_t *nvp, int flag)
5990 {
5991 	nv_ctl_t *nvc = nvp->nvp_ctlp;
5992 	ddi_acc_handle_t bar5_hdl = nvc->nvc_bar_hdl[5];
5993 	uint16_t intr_bits =
5994 	    MCP5X_INT_ADD|MCP5X_INT_REM|MCP5X_INT_COMPLETE;
5995 	uint16_t int_en;
5996 
5997 	if (flag & NV_INTR_DISABLE_NON_BLOCKING) {
5998 		int_en = nv_get16(bar5_hdl, nvp->nvp_mcp5x_int_ctl);
5999 		int_en &= ~intr_bits;
6000 		nv_put16(bar5_hdl, nvp->nvp_mcp5x_int_ctl, int_en);
6001 		return;
6002 	}
6003 
6004 	ASSERT(mutex_owned(&nvp->nvp_mutex));
6005 
6006 	NVLOG(NVDBG_INTR, nvc, nvp, "mcp055_set_intr: enter flag: %d", flag);
6007 
6008 	if (flag & NV_INTR_CLEAR_ALL) {
6009 		NVLOG(NVDBG_INTR, nvc, nvp,
6010 		    "mcp5x_set_intr: NV_INTR_CLEAR_ALL", NULL);
6011 		nv_put16(bar5_hdl, nvp->nvp_mcp5x_int_status, MCP5X_INT_CLEAR);
6012 	}
6013 
6014 	if (flag & NV_INTR_ENABLE) {
6015 		NVLOG(NVDBG_INTR, nvc, nvp, "mcp5x_set_intr: NV_INTR_ENABLE",
6016 		    NULL);
6017 		int_en = nv_get16(bar5_hdl, nvp->nvp_mcp5x_int_ctl);
6018 		int_en |= intr_bits;
6019 		nv_put16(bar5_hdl, nvp->nvp_mcp5x_int_ctl, int_en);
6020 	}
6021 
6022 	if (flag & NV_INTR_DISABLE) {
6023 		NVLOG(NVDBG_INTR, nvc, nvp,
6024 		    "mcp5x_set_intr: NV_INTR_DISABLE", NULL);
6025 		int_en = nv_get16(bar5_hdl, nvp->nvp_mcp5x_int_ctl);
6026 		int_en &= ~intr_bits;
6027 		nv_put16(bar5_hdl, nvp->nvp_mcp5x_int_ctl, int_en);
6028 	}
6029 }
6030 
6031 
6032 static void
nv_resume(nv_port_t * nvp)6033 nv_resume(nv_port_t *nvp)
6034 {
6035 	NVLOG(NVDBG_INIT, nvp->nvp_ctlp, nvp, "nv_resume()", NULL);
6036 
6037 	mutex_enter(&nvp->nvp_mutex);
6038 
6039 	if (nvp->nvp_state & NV_DEACTIVATED) {
6040 		mutex_exit(&nvp->nvp_mutex);
6041 
6042 		return;
6043 	}
6044 
6045 	/* Enable interrupt */
6046 	(*(nvp->nvp_ctlp->nvc_set_intr))(nvp, NV_INTR_CLEAR_ALL|NV_INTR_ENABLE);
6047 
6048 	/*
6049 	 * Power may have been removed to the port and the
6050 	 * drive, and/or a drive may have been added or removed.
6051 	 * Force a reset which will cause a probe and re-establish
6052 	 * any state needed on the drive.
6053 	 */
6054 	nv_reset(nvp, "resume");
6055 
6056 	mutex_exit(&nvp->nvp_mutex);
6057 }
6058 
6059 
6060 static void
nv_suspend(nv_port_t * nvp)6061 nv_suspend(nv_port_t *nvp)
6062 {
6063 	NVLOG(NVDBG_INIT, nvp->nvp_ctlp, nvp, "nv_suspend()", NULL);
6064 
6065 	mutex_enter(&nvp->nvp_mutex);
6066 
6067 #ifdef SGPIO_SUPPORT
6068 	if (nvp->nvp_type == SATA_DTYPE_ATADISK) {
6069 		nv_sgp_drive_disconnect(nvp->nvp_ctlp, SGP_CTLR_PORT_TO_DRV(
6070 		    nvp->nvp_ctlp->nvc_ctlr_num, nvp->nvp_port_num));
6071 	}
6072 #endif
6073 
6074 	if (nvp->nvp_state & NV_DEACTIVATED) {
6075 		mutex_exit(&nvp->nvp_mutex);
6076 
6077 		return;
6078 	}
6079 
6080 	/*
6081 	 * Stop the timeout handler.
6082 	 * (It will be restarted in nv_reset() during nv_resume().)
6083 	 */
6084 	if (nvp->nvp_timeout_id) {
6085 		(void) untimeout(nvp->nvp_timeout_id);
6086 		nvp->nvp_timeout_id = 0;
6087 	}
6088 
6089 	/* Disable interrupt */
6090 	(*(nvp->nvp_ctlp->nvc_set_intr))(nvp,
6091 	    NV_INTR_CLEAR_ALL|NV_INTR_DISABLE);
6092 
6093 	mutex_exit(&nvp->nvp_mutex);
6094 }
6095 
6096 
6097 static void
nv_copy_registers(nv_port_t * nvp,sata_device_t * sd,sata_pkt_t * spkt)6098 nv_copy_registers(nv_port_t *nvp, sata_device_t *sd, sata_pkt_t *spkt)
6099 {
6100 	ddi_acc_handle_t bar5_hdl = nvp->nvp_ctlp->nvc_bar_hdl[5];
6101 	sata_cmd_t *scmd = &spkt->satapkt_cmd;
6102 	ddi_acc_handle_t ctlhdl = nvp->nvp_ctl_hdl;
6103 	ddi_acc_handle_t cmdhdl = nvp->nvp_cmd_hdl;
6104 	uchar_t status;
6105 	struct sata_cmd_flags flags;
6106 
6107 	sd->satadev_scr.sstatus = nv_get32(bar5_hdl, nvp->nvp_sstatus);
6108 	sd->satadev_scr.serror = nv_get32(bar5_hdl, nvp->nvp_serror);
6109 	sd->satadev_scr.scontrol = nv_get32(bar5_hdl, nvp->nvp_sctrl);
6110 
6111 	if (spkt == NULL) {
6112 
6113 		return;
6114 	}
6115 
6116 	/*
6117 	 * in the error case, implicitly set the return of regs needed
6118 	 * for error handling.
6119 	 */
6120 	status = scmd->satacmd_status_reg = nv_get8(ctlhdl,
6121 	    nvp->nvp_altstatus);
6122 
6123 	flags = scmd->satacmd_flags;
6124 
6125 	if (status & SATA_STATUS_ERR) {
6126 		flags.sata_copy_out_lba_low_msb = B_TRUE;
6127 		flags.sata_copy_out_lba_mid_msb = B_TRUE;
6128 		flags.sata_copy_out_lba_high_msb = B_TRUE;
6129 		flags.sata_copy_out_lba_low_lsb = B_TRUE;
6130 		flags.sata_copy_out_lba_mid_lsb = B_TRUE;
6131 		flags.sata_copy_out_lba_high_lsb = B_TRUE;
6132 		flags.sata_copy_out_error_reg = B_TRUE;
6133 		flags.sata_copy_out_sec_count_msb = B_TRUE;
6134 		flags.sata_copy_out_sec_count_lsb = B_TRUE;
6135 		scmd->satacmd_status_reg = status;
6136 	}
6137 
6138 	if (scmd->satacmd_addr_type & ATA_ADDR_LBA48) {
6139 
6140 		/*
6141 		 * set HOB so that high byte will be read
6142 		 */
6143 		nv_put8(ctlhdl, nvp->nvp_devctl, ATDC_HOB|ATDC_D3);
6144 
6145 		/*
6146 		 * get the requested high bytes
6147 		 */
6148 		if (flags.sata_copy_out_sec_count_msb) {
6149 			scmd->satacmd_sec_count_msb =
6150 			    nv_get8(cmdhdl, nvp->nvp_count);
6151 		}
6152 
6153 		if (flags.sata_copy_out_lba_low_msb) {
6154 			scmd->satacmd_lba_low_msb =
6155 			    nv_get8(cmdhdl, nvp->nvp_sect);
6156 		}
6157 
6158 		if (flags.sata_copy_out_lba_mid_msb) {
6159 			scmd->satacmd_lba_mid_msb =
6160 			    nv_get8(cmdhdl, nvp->nvp_lcyl);
6161 		}
6162 
6163 		if (flags.sata_copy_out_lba_high_msb) {
6164 			scmd->satacmd_lba_high_msb =
6165 			    nv_get8(cmdhdl, nvp->nvp_hcyl);
6166 		}
6167 	}
6168 
6169 	/*
6170 	 * disable HOB so that low byte is read
6171 	 */
6172 	nv_put8(ctlhdl, nvp->nvp_devctl, ATDC_D3);
6173 
6174 	/*
6175 	 * get the requested low bytes
6176 	 */
6177 	if (flags.sata_copy_out_sec_count_lsb) {
6178 		scmd->satacmd_sec_count_lsb = nv_get8(cmdhdl, nvp->nvp_count);
6179 	}
6180 
6181 	if (flags.sata_copy_out_lba_low_lsb) {
6182 		scmd->satacmd_lba_low_lsb = nv_get8(cmdhdl, nvp->nvp_sect);
6183 	}
6184 
6185 	if (flags.sata_copy_out_lba_mid_lsb) {
6186 		scmd->satacmd_lba_mid_lsb = nv_get8(cmdhdl, nvp->nvp_lcyl);
6187 	}
6188 
6189 	if (flags.sata_copy_out_lba_high_lsb) {
6190 		scmd->satacmd_lba_high_lsb = nv_get8(cmdhdl, nvp->nvp_hcyl);
6191 	}
6192 
6193 	/*
6194 	 * get the device register if requested
6195 	 */
6196 	if (flags.sata_copy_out_device_reg) {
6197 		scmd->satacmd_device_reg =  nv_get8(cmdhdl, nvp->nvp_drvhd);
6198 	}
6199 
6200 	/*
6201 	 * get the error register if requested
6202 	 */
6203 	if (flags.sata_copy_out_error_reg) {
6204 		scmd->satacmd_error_reg = nv_get8(cmdhdl, nvp->nvp_error);
6205 	}
6206 }
6207 
6208 
6209 /*
6210  * hot plug and remove interrupts can occur when the device is reset.
6211  * Masking the interrupt doesn't always work well because if a
6212  * different interrupt arrives on the other port, the driver can still
6213  * end up checking the state of the other port and discover the hot
6214  * interrupt flag is set even though it was masked.  Also, when there are
6215  * errors on the link there can be transient link events which need to be
6216  * masked and eliminated as well.
6217  */
6218 static void
nv_link_event(nv_port_t * nvp,int flag)6219 nv_link_event(nv_port_t *nvp, int flag)
6220 {
6221 
6222 	NVLOG(NVDBG_HOT, nvp->nvp_ctlp, nvp, "nv_link_event: flag: %s",
6223 	    flag ? "add" : "remove");
6224 
6225 	ASSERT(MUTEX_HELD(&nvp->nvp_mutex));
6226 
6227 	nvp->nvp_link_event_time = ddi_get_lbolt();
6228 
6229 	/*
6230 	 * if a port has been deactivated, ignore all link events
6231 	 */
6232 	if (nvp->nvp_state & NV_DEACTIVATED) {
6233 		NVLOG(NVDBG_HOT, nvp->nvp_ctlp, nvp, "ignoring link event"
6234 		    " port deactivated", NULL);
6235 		DTRACE_PROBE(ignoring_link_port_deactivated_p);
6236 
6237 		return;
6238 	}
6239 
6240 	/*
6241 	 * if the drive has been reset, ignore any transient events.  If it's
6242 	 * a real removal event, nv_monitor_reset() will handle it.
6243 	 */
6244 	if (nvp->nvp_state & NV_RESET) {
6245 		NVLOG(NVDBG_HOT, nvp->nvp_ctlp, nvp, "ignoring link event"
6246 		    " during reset", NULL);
6247 		DTRACE_PROBE(ignoring_link_event_during_reset_p);
6248 
6249 		return;
6250 	}
6251 
6252 	/*
6253 	 * if link event processing is already enabled, nothing to
6254 	 * do.
6255 	 */
6256 	if (nvp->nvp_state & NV_LINK_EVENT) {
6257 
6258 		NVLOG(NVDBG_HOT, nvp->nvp_ctlp, nvp,
6259 		    "received link event while processing already in "
6260 		    "progress", NULL);
6261 		DTRACE_PROBE(nv_link_event_already_set_p);
6262 
6263 		return;
6264 	}
6265 
6266 	DTRACE_PROBE1(link_event_p, int, nvp);
6267 
6268 	nvp->nvp_state |= NV_LINK_EVENT;
6269 
6270 	nv_setup_timeout(nvp, NV_LINK_EVENT_SETTLE);
6271 }
6272 
6273 
6274 /*
6275  * Get request sense data and stuff it the command's sense buffer.
6276  * Start a request sense command in order to get sense data to insert
6277  * in the sata packet's rqsense buffer.  The command completion
6278  * processing is in nv_intr_pkt_pio.
6279  *
6280  * The sata common module provides a function to allocate and set-up a
6281  * request sense packet command. The reasons it is not being used here is:
6282  * a) it cannot be called in an interrupt context and this function is
6283  *    called in an interrupt context.
6284  * b) it allocates DMA resources that are not used here because this is
6285  *    implemented using PIO.
6286  *
6287  * If, in the future, this is changed to use DMA, the sata common module
6288  * should be used to allocate and set-up the error retrieval (request sense)
6289  * command.
6290  */
6291 static int
nv_start_rqsense_pio(nv_port_t * nvp,nv_slot_t * nv_slotp)6292 nv_start_rqsense_pio(nv_port_t *nvp, nv_slot_t *nv_slotp)
6293 {
6294 	sata_pkt_t *spkt = nv_slotp->nvslot_spkt;
6295 	sata_cmd_t *satacmd = &spkt->satapkt_cmd;
6296 	ddi_acc_handle_t cmdhdl = nvp->nvp_cmd_hdl;
6297 	int cdb_len = spkt->satapkt_cmd.satacmd_acdb_len;
6298 
6299 	NVLOG(NVDBG_ATAPI, nvp->nvp_ctlp, nvp,
6300 	    "nv_start_rqsense_pio: start", NULL);
6301 
6302 	/* clear the local request sense buffer before starting the command */
6303 	bzero(nv_slotp->nvslot_rqsense_buff, SATA_ATAPI_RQSENSE_LEN);
6304 
6305 	/* Write the request sense PACKET command */
6306 
6307 	/* select the drive */
6308 	nv_put8(cmdhdl, nvp->nvp_drvhd, satacmd->satacmd_device_reg);
6309 
6310 	/* make certain the drive selected */
6311 	if (nv_wait(nvp, SATA_STATUS_DRDY, SATA_STATUS_BSY,
6312 	    NV_SEC2USEC(5), 0) == B_FALSE) {
6313 		NVLOG(NVDBG_ATAPI, nvp->nvp_ctlp, nvp,
6314 		    "nv_start_rqsense_pio: drive select failed", NULL);
6315 		return (NV_FAILURE);
6316 	}
6317 
6318 	/* set up the command */
6319 	nv_put8(cmdhdl, nvp->nvp_feature, 0);	/* deassert DMA and OVL */
6320 	nv_put8(cmdhdl, nvp->nvp_hcyl, SATA_ATAPI_MAX_BYTES_PER_DRQ >> 8);
6321 	nv_put8(cmdhdl, nvp->nvp_lcyl, SATA_ATAPI_MAX_BYTES_PER_DRQ & 0xff);
6322 	nv_put8(cmdhdl, nvp->nvp_sect, 0);
6323 	nv_put8(cmdhdl, nvp->nvp_count, 0);	/* no tag */
6324 
6325 	/* initiate the command by writing the command register last */
6326 	nv_put8(cmdhdl, nvp->nvp_cmd, SATAC_PACKET);
6327 
6328 	/* Give the host ctlr time to do its thing, according to ATA/ATAPI */
6329 	NV_DELAY_NSEC(400);
6330 
6331 	/*
6332 	 * Wait for the device to indicate that it is ready for the command
6333 	 * ATAPI protocol state - HP0: Check_Status_A
6334 	 */
6335 
6336 	if (nv_wait3(nvp, SATA_STATUS_DRQ, SATA_STATUS_BSY, /* okay */
6337 	    SATA_STATUS_ERR, SATA_STATUS_BSY, /* cmd failed */
6338 	    SATA_STATUS_DF, SATA_STATUS_BSY, /* drive failed */
6339 	    4000000, 0) == B_FALSE) {
6340 		if (nv_get8(cmdhdl, nvp->nvp_status) &
6341 		    (SATA_STATUS_ERR | SATA_STATUS_DF)) {
6342 			spkt->satapkt_reason = SATA_PKT_DEV_ERROR;
6343 			NVLOG(NVDBG_ATAPI, nvp->nvp_ctlp, nvp,
6344 			    "nv_start_rqsense_pio: rqsense dev error (HP0)",
6345 			    NULL);
6346 		} else {
6347 			spkt->satapkt_reason = SATA_PKT_TIMEOUT;
6348 			NVLOG(NVDBG_ATAPI, nvp->nvp_ctlp, nvp,
6349 			    "nv_start_rqsense_pio: rqsense timeout (HP0)",
6350 			    NULL);
6351 		}
6352 
6353 		nv_copy_registers(nvp, &spkt->satapkt_device, spkt);
6354 		nv_complete_io(nvp, spkt, 0);
6355 		nv_reset(nvp, "rqsense_pio");
6356 
6357 		return (NV_FAILURE);
6358 	}
6359 
6360 	/*
6361 	 * Put the ATAPI command in the data register
6362 	 * ATAPI protocol state - HP1: Send_Packet
6363 	 */
6364 
6365 	ddi_rep_put16(cmdhdl, (ushort_t *)nv_rqsense_cdb,
6366 	    (ushort_t *)nvp->nvp_data,
6367 	    (cdb_len >> 1), DDI_DEV_NO_AUTOINCR);
6368 
6369 	NVLOG(NVDBG_ATAPI, nvp->nvp_ctlp, nvp,
6370 	    "nv_start_rqsense_pio: exiting into HP3", NULL);
6371 
6372 	return (NV_SUCCESS);
6373 }
6374 
6375 /*
6376  * quiesce(9E) entry point.
6377  *
6378  * This function is called when the system is single-threaded at high
6379  * PIL with preemption disabled. Therefore, this function must not be
6380  * blocked.
6381  *
6382  * This function returns DDI_SUCCESS on success, or DDI_FAILURE on failure.
6383  * DDI_FAILURE indicates an error condition and should almost never happen.
6384  */
6385 static int
nv_quiesce(dev_info_t * dip)6386 nv_quiesce(dev_info_t *dip)
6387 {
6388 	int port, instance = ddi_get_instance(dip);
6389 	nv_ctl_t *nvc;
6390 
6391 	if ((nvc = (nv_ctl_t *)ddi_get_soft_state(nv_statep, instance)) == NULL)
6392 		return (DDI_FAILURE);
6393 
6394 	for (port = 0; port < NV_MAX_PORTS(nvc); port++) {
6395 		nv_port_t *nvp = &(nvc->nvc_port[port]);
6396 		ddi_acc_handle_t cmdhdl = nvp->nvp_cmd_hdl;
6397 		ddi_acc_handle_t bar5_hdl = nvp->nvp_ctlp->nvc_bar_hdl[5];
6398 		uint32_t sctrl;
6399 
6400 		/*
6401 		 * Stop the controllers from generating interrupts.
6402 		 */
6403 		(*(nvc->nvc_set_intr))(nvp, NV_INTR_DISABLE_NON_BLOCKING);
6404 
6405 		/*
6406 		 * clear signature registers
6407 		 */
6408 		nv_put8(cmdhdl, nvp->nvp_sect, 0);
6409 		nv_put8(cmdhdl, nvp->nvp_lcyl, 0);
6410 		nv_put8(cmdhdl, nvp->nvp_hcyl, 0);
6411 		nv_put8(cmdhdl, nvp->nvp_count, 0);
6412 
6413 		nvp->nvp_signature = NV_NO_SIG;
6414 		nvp->nvp_type = SATA_DTYPE_NONE;
6415 		nvp->nvp_state |= NV_RESET;
6416 		nvp->nvp_reset_time = ddi_get_lbolt();
6417 
6418 		/*
6419 		 * assert reset in PHY by writing a 1 to bit 0 scontrol
6420 		 */
6421 		sctrl = nv_get32(bar5_hdl, nvp->nvp_sctrl);
6422 
6423 		nv_put32(bar5_hdl, nvp->nvp_sctrl,
6424 		    sctrl | SCONTROL_DET_COMRESET);
6425 
6426 		/*
6427 		 * wait 1ms
6428 		 */
6429 		drv_usecwait(1000);
6430 
6431 		/*
6432 		 * de-assert reset in PHY
6433 		 */
6434 		nv_put32(bar5_hdl, nvp->nvp_sctrl, sctrl);
6435 	}
6436 
6437 	return (DDI_SUCCESS);
6438 }
6439 
6440 
6441 #ifdef SGPIO_SUPPORT
6442 /*
6443  * NVIDIA specific SGPIO LED support
6444  * Please refer to the NVIDIA documentation for additional details
6445  */
6446 
6447 /*
6448  * nv_sgp_led_init
6449  * Detect SGPIO support.  If present, initialize.
6450  */
6451 static void
nv_sgp_led_init(nv_ctl_t * nvc,ddi_acc_handle_t pci_conf_handle)6452 nv_sgp_led_init(nv_ctl_t *nvc, ddi_acc_handle_t pci_conf_handle)
6453 {
6454 	uint16_t csrp;		/* SGPIO_CSRP from PCI config space */
6455 	uint32_t cbp;		/* SGPIO_CBP from PCI config space */
6456 	nv_sgp_cmn_t *cmn;	/* shared data structure */
6457 	int i;
6458 	char tqname[SGPIO_TQ_NAME_LEN];
6459 	extern caddr_t psm_map_phys_new(paddr_t, size_t, int);
6460 
6461 	/*
6462 	 * Initialize with appropriately invalid values in case this function
6463 	 * exits without initializing SGPIO (for example, there is no SGPIO
6464 	 * support).
6465 	 */
6466 	nvc->nvc_sgp_csr = 0;
6467 	nvc->nvc_sgp_cbp = NULL;
6468 	nvc->nvc_sgp_cmn = NULL;
6469 
6470 	/*
6471 	 * Only try to initialize SGPIO LED support if this property
6472 	 * indicates it should be.
6473 	 */
6474 	if (ddi_getprop(DDI_DEV_T_ANY, nvc->nvc_dip, DDI_PROP_DONTPASS,
6475 	    "enable-sgpio-leds", 0) != 1)
6476 		return;
6477 
6478 	/*
6479 	 * CK804 can pass the sgpio_detect test even though it does not support
6480 	 * SGPIO, so don't even look at a CK804.
6481 	 */
6482 	if (nvc->nvc_mcp5x_flag != B_TRUE)
6483 		return;
6484 
6485 	/*
6486 	 * The NVIDIA SGPIO support can nominally handle 6 drives.
6487 	 * However, the current implementation only supports 4 drives.
6488 	 * With two drives per controller, that means only look at the
6489 	 * first two controllers.
6490 	 */
6491 	if ((nvc->nvc_ctlr_num != 0) && (nvc->nvc_ctlr_num != 1))
6492 		return;
6493 
6494 	/* confirm that the SGPIO registers are there */
6495 	if (nv_sgp_detect(pci_conf_handle, &csrp, &cbp) != NV_SUCCESS) {
6496 		NVLOG(NVDBG_INIT, nvc, NULL,
6497 		    "SGPIO registers not detected", NULL);
6498 		return;
6499 	}
6500 
6501 	/* save off the SGPIO_CSR I/O address */
6502 	nvc->nvc_sgp_csr = csrp;
6503 
6504 	/* map in Control Block */
6505 	nvc->nvc_sgp_cbp = (nv_sgp_cb_t *)psm_map_phys_new(cbp,
6506 	    sizeof (nv_sgp_cb_t), PROT_READ | PROT_WRITE);
6507 
6508 	/* initialize the SGPIO h/w */
6509 	if (nv_sgp_init(nvc) == NV_FAILURE) {
6510 		nv_cmn_err(CE_WARN, nvc, NULL,
6511 		    "Unable to initialize SGPIO");
6512 	}
6513 
6514 	/*
6515 	 * Initialize the shared space for this instance.  This could
6516 	 * involve allocating the space, saving a pointer to the space
6517 	 * and starting the taskq that actually turns the LEDs on and off.
6518 	 * Or, it could involve just getting the pointer to the already
6519 	 * allocated space.
6520 	 */
6521 
6522 	mutex_enter(&nv_sgp_c2c_mutex);
6523 
6524 	/* try and find our CBP in the mapping table */
6525 	cmn = NULL;
6526 	for (i = 0; i < NV_MAX_CBPS; i++) {
6527 		if (nv_sgp_cbp2cmn[i].c2cm_cbp == cbp) {
6528 			cmn = nv_sgp_cbp2cmn[i].c2cm_cmn;
6529 			break;
6530 		}
6531 
6532 		if (nv_sgp_cbp2cmn[i].c2cm_cbp == 0)
6533 			break;
6534 	}
6535 
6536 	if (i >= NV_MAX_CBPS) {
6537 		/*
6538 		 * CBP to shared space mapping table is full
6539 		 */
6540 		nvc->nvc_sgp_cmn = NULL;
6541 		nv_cmn_err(CE_WARN, nvc, NULL,
6542 		    "LED handling not initialized - too many controllers");
6543 	} else if (cmn == NULL) {
6544 		/*
6545 		 * Allocate the shared space, point the SGPIO scratch register
6546 		 * at it and start the led update taskq.
6547 		 */
6548 
6549 		/* allocate shared space */
6550 		cmn = (nv_sgp_cmn_t *)kmem_zalloc(sizeof (nv_sgp_cmn_t),
6551 		    KM_SLEEP);
6552 		if (cmn == NULL) {
6553 			nv_cmn_err(CE_WARN, nvc, NULL,
6554 			    "Failed to allocate shared data");
6555 			return;
6556 		}
6557 
6558 		nvc->nvc_sgp_cmn = cmn;
6559 
6560 		/* initialize the shared data structure */
6561 		cmn->nvs_in_use = (1 << nvc->nvc_ctlr_num);
6562 		cmn->nvs_connected = 0;
6563 		cmn->nvs_activity = 0;
6564 		cmn->nvs_cbp = cbp;
6565 
6566 		mutex_init(&cmn->nvs_slock, NULL, MUTEX_DRIVER, NULL);
6567 		mutex_init(&cmn->nvs_tlock, NULL, MUTEX_DRIVER, NULL);
6568 		cv_init(&cmn->nvs_cv, NULL, CV_DRIVER, NULL);
6569 
6570 		/* put the address in the SGPIO scratch register */
6571 #if defined(__amd64)
6572 		nvc->nvc_sgp_cbp->sgpio_sr = (uint64_t)cmn;
6573 #else
6574 		nvc->nvc_sgp_cbp->sgpio_sr = (uint32_t)cmn;
6575 #endif
6576 
6577 		/* add an entry to the cbp to cmn mapping table */
6578 
6579 		/* i should be the next available table position */
6580 		nv_sgp_cbp2cmn[i].c2cm_cbp = cbp;
6581 		nv_sgp_cbp2cmn[i].c2cm_cmn = cmn;
6582 
6583 		/* start the activity LED taskq */
6584 
6585 		/*
6586 		 * The taskq name should be unique and the time
6587 		 */
6588 		(void) snprintf(tqname, SGPIO_TQ_NAME_LEN,
6589 		    "nvSataLed%x", (short)(ddi_get_lbolt() & 0xffff));
6590 		cmn->nvs_taskq = ddi_taskq_create(nvc->nvc_dip, tqname, 1,
6591 		    TASKQ_DEFAULTPRI, 0);
6592 		if (cmn->nvs_taskq == NULL) {
6593 			cmn->nvs_taskq_delay = 0;
6594 			nv_cmn_err(CE_WARN, nvc, NULL,
6595 			    "Failed to start activity LED taskq");
6596 		} else {
6597 			cmn->nvs_taskq_delay = SGPIO_LOOP_WAIT_USECS;
6598 			(void) ddi_taskq_dispatch(cmn->nvs_taskq,
6599 			    nv_sgp_activity_led_ctl, nvc, DDI_SLEEP);
6600 		}
6601 	} else {
6602 		nvc->nvc_sgp_cmn = cmn;
6603 		cmn->nvs_in_use |= (1 << nvc->nvc_ctlr_num);
6604 	}
6605 
6606 	mutex_exit(&nv_sgp_c2c_mutex);
6607 }
6608 
6609 /*
6610  * nv_sgp_detect
6611  * Read the SGPIO_CSR and SGPIO_CBP values from PCI config space and
6612  * report back whether both were readable.
6613  */
6614 static int
nv_sgp_detect(ddi_acc_handle_t pci_conf_handle,uint16_t * csrpp,uint32_t * cbpp)6615 nv_sgp_detect(ddi_acc_handle_t pci_conf_handle, uint16_t *csrpp,
6616     uint32_t *cbpp)
6617 {
6618 	/* get the SGPIO_CSRP */
6619 	*csrpp = pci_config_get16(pci_conf_handle, SGPIO_CSRP);
6620 	if (*csrpp == 0) {
6621 		return (NV_FAILURE);
6622 	}
6623 
6624 	/* SGPIO_CSRP is good, get the SGPIO_CBP */
6625 	*cbpp = pci_config_get32(pci_conf_handle, SGPIO_CBP);
6626 	if (*cbpp == 0) {
6627 		return (NV_FAILURE);
6628 	}
6629 
6630 	/* SGPIO_CBP is good, so we must support SGPIO */
6631 	return (NV_SUCCESS);
6632 }
6633 
6634 /*
6635  * nv_sgp_init
6636  * Initialize SGPIO.
6637  * The initialization process is described by NVIDIA, but the hardware does
6638  * not always behave as documented, so several steps have been changed and/or
6639  * omitted.
6640  */
6641 static int
nv_sgp_init(nv_ctl_t * nvc)6642 nv_sgp_init(nv_ctl_t *nvc)
6643 {
6644 	int seq;
6645 	int rval = NV_SUCCESS;
6646 	hrtime_t start, end;
6647 	uint32_t cmd;
6648 	uint32_t status;
6649 	int drive_count;
6650 
6651 	status = nv_sgp_csr_read(nvc);
6652 	if (SGPIO_CSR_SSTAT(status) == SGPIO_STATE_RESET) {
6653 		/* SGPIO logic is in reset state and requires initialization */
6654 
6655 		/* noting the Sequence field value */
6656 		seq = SGPIO_CSR_SEQ(status);
6657 
6658 		/* issue SGPIO_CMD_READ_PARAMS command */
6659 		cmd = SGPIO_CSR_CMD_SET(SGPIO_CMD_READ_PARAMS);
6660 		nv_sgp_csr_write(nvc, cmd);
6661 
6662 		DTRACE_PROBE2(sgpio__cmd, int, cmd, int, status);
6663 
6664 		/* poll for command completion */
6665 		start = gethrtime();
6666 		end = start + NV_SGP_CMD_TIMEOUT;
6667 		for (;;) {
6668 			status = nv_sgp_csr_read(nvc);
6669 
6670 			/* break on error */
6671 			if (SGPIO_CSR_CSTAT(status) == SGPIO_CMD_ERROR) {
6672 				NVLOG(NVDBG_VERBOSE, nvc, NULL,
6673 				    "Command error during initialization",
6674 				    NULL);
6675 				rval = NV_FAILURE;
6676 				break;
6677 			}
6678 
6679 			/* command processing is taking place */
6680 			if (SGPIO_CSR_CSTAT(status) == SGPIO_CMD_OK) {
6681 				if (SGPIO_CSR_SEQ(status) != seq) {
6682 					NVLOG(NVDBG_VERBOSE, nvc, NULL,
6683 					    "Sequence number change error",
6684 					    NULL);
6685 				}
6686 
6687 				break;
6688 			}
6689 
6690 			/* if completion not detected in 2000ms ... */
6691 
6692 			if (gethrtime() > end)
6693 				break;
6694 
6695 			/* wait 400 ns before checking again */
6696 			NV_DELAY_NSEC(400);
6697 		}
6698 	}
6699 
6700 	if (rval == NV_FAILURE)
6701 		return (rval);
6702 
6703 	if (SGPIO_CSR_SSTAT(status) != SGPIO_STATE_OPERATIONAL) {
6704 		NVLOG(NVDBG_VERBOSE, nvc, NULL,
6705 		    "SGPIO logic not operational after init - state %d",
6706 		    SGPIO_CSR_SSTAT(status));
6707 		/*
6708 		 * Should return (NV_FAILURE) but the hardware can be
6709 		 * operational even if the SGPIO Status does not indicate
6710 		 * this.
6711 		 */
6712 	}
6713 
6714 	/*
6715 	 * NVIDIA recommends reading the supported drive count even
6716 	 * though they also indicate that it is always 4 at this time.
6717 	 */
6718 	drive_count = SGP_CR0_DRV_CNT(nvc->nvc_sgp_cbp->sgpio_cr0);
6719 	if (drive_count != SGPIO_DRV_CNT_VALUE) {
6720 		NVLOG(NVDBG_INIT, nvc, NULL,
6721 		    "SGPIO reported undocumented drive count - %d",
6722 		    drive_count);
6723 	}
6724 
6725 	NVLOG(NVDBG_INIT, nvc, NULL,
6726 	    "initialized ctlr: %d csr: 0x%08x",
6727 	    nvc->nvc_ctlr_num, nvc->nvc_sgp_csr);
6728 
6729 	return (rval);
6730 }
6731 
6732 static int
nv_sgp_check_set_cmn(nv_ctl_t * nvc)6733 nv_sgp_check_set_cmn(nv_ctl_t *nvc)
6734 {
6735 	nv_sgp_cmn_t *cmn = nvc->nvc_sgp_cmn;
6736 
6737 	if (cmn == NULL)
6738 		return (NV_FAILURE);
6739 
6740 	mutex_enter(&cmn->nvs_slock);
6741 	cmn->nvs_in_use |= (1 << nvc->nvc_ctlr_num);
6742 	mutex_exit(&cmn->nvs_slock);
6743 
6744 	return (NV_SUCCESS);
6745 }
6746 
6747 /*
6748  * nv_sgp_csr_read
6749  * This is just a 32-bit port read from the value that was obtained from the
6750  * PCI config space.
6751  *
6752  * XXX It was advised to use the in[bwl] function for this, even though they
6753  * are obsolete interfaces.
6754  */
6755 static int
nv_sgp_csr_read(nv_ctl_t * nvc)6756 nv_sgp_csr_read(nv_ctl_t *nvc)
6757 {
6758 	return (inl(nvc->nvc_sgp_csr));
6759 }
6760 
6761 /*
6762  * nv_sgp_csr_write
6763  * This is just a 32-bit I/O port write.  The port number was obtained from
6764  * the PCI config space.
6765  *
6766  * XXX It was advised to use the out[bwl] function for this, even though they
6767  * are obsolete interfaces.
6768  */
6769 static void
nv_sgp_csr_write(nv_ctl_t * nvc,uint32_t val)6770 nv_sgp_csr_write(nv_ctl_t *nvc, uint32_t val)
6771 {
6772 	outl(nvc->nvc_sgp_csr, val);
6773 }
6774 
6775 /*
6776  * nv_sgp_write_data
6777  * Cause SGPIO to send Control Block data
6778  */
6779 static int
nv_sgp_write_data(nv_ctl_t * nvc)6780 nv_sgp_write_data(nv_ctl_t *nvc)
6781 {
6782 	hrtime_t start, end;
6783 	uint32_t status;
6784 	uint32_t cmd;
6785 
6786 	/* issue command */
6787 	cmd = SGPIO_CSR_CMD_SET(SGPIO_CMD_WRITE_DATA);
6788 	nv_sgp_csr_write(nvc, cmd);
6789 
6790 	/* poll for completion */
6791 	start = gethrtime();
6792 	end = start + NV_SGP_CMD_TIMEOUT;
6793 	for (;;) {
6794 		status = nv_sgp_csr_read(nvc);
6795 
6796 		/* break on error completion */
6797 		if (SGPIO_CSR_CSTAT(status) == SGPIO_CMD_ERROR)
6798 			break;
6799 
6800 		/* break on successful completion */
6801 		if (SGPIO_CSR_CSTAT(status) == SGPIO_CMD_OK)
6802 			break;
6803 
6804 		/* Wait 400 ns and try again */
6805 		NV_DELAY_NSEC(400);
6806 
6807 		if (gethrtime() > end)
6808 			break;
6809 	}
6810 
6811 	if (SGPIO_CSR_CSTAT(status) == SGPIO_CMD_OK)
6812 		return (NV_SUCCESS);
6813 
6814 	return (NV_FAILURE);
6815 }
6816 
6817 /*
6818  * nv_sgp_activity_led_ctl
6819  * This is run as a taskq.  It wakes up at a fixed interval and checks to
6820  * see if any of the activity LEDs need to be changed.
6821  */
6822 static void
nv_sgp_activity_led_ctl(void * arg)6823 nv_sgp_activity_led_ctl(void *arg)
6824 {
6825 	nv_ctl_t *nvc = (nv_ctl_t *)arg;
6826 	nv_sgp_cmn_t *cmn;
6827 	volatile nv_sgp_cb_t *cbp;
6828 	clock_t ticks;
6829 	uint8_t drv_leds;
6830 	uint32_t old_leds;
6831 	uint32_t new_led_state;
6832 	int i;
6833 
6834 	cmn = nvc->nvc_sgp_cmn;
6835 	cbp = nvc->nvc_sgp_cbp;
6836 
6837 	do {
6838 		/* save off the old state of all of the LEDs */
6839 		old_leds = cbp->sgpio0_tr;
6840 
6841 		DTRACE_PROBE3(sgpio__activity__state,
6842 		    int, cmn->nvs_connected, int, cmn->nvs_activity,
6843 		    int, old_leds);
6844 
6845 		new_led_state = 0;
6846 
6847 		/* for each drive */
6848 		for (i = 0; i < SGPIO_DRV_CNT_VALUE; i++) {
6849 
6850 			/* get the current state of the LEDs for the drive */
6851 			drv_leds = SGPIO0_TR_DRV(old_leds, i);
6852 
6853 			if ((cmn->nvs_connected & (1 << i)) == 0) {
6854 				/* if not connected, turn off activity */
6855 				drv_leds &= ~TR_ACTIVE_MASK;
6856 				drv_leds |= TR_ACTIVE_SET(TR_ACTIVE_DISABLE);
6857 
6858 				new_led_state &= SGPIO0_TR_DRV_CLR(i);
6859 				new_led_state |=
6860 				    SGPIO0_TR_DRV_SET(drv_leds, i);
6861 
6862 				continue;
6863 			}
6864 
6865 			if ((cmn->nvs_activity & (1 << i)) == 0) {
6866 				/* connected, but not active */
6867 				drv_leds &= ~TR_ACTIVE_MASK;
6868 				drv_leds |= TR_ACTIVE_SET(TR_ACTIVE_ENABLE);
6869 
6870 				new_led_state &= SGPIO0_TR_DRV_CLR(i);
6871 				new_led_state |=
6872 				    SGPIO0_TR_DRV_SET(drv_leds, i);
6873 
6874 				continue;
6875 			}
6876 
6877 			/* connected and active */
6878 			if (TR_ACTIVE(drv_leds) == TR_ACTIVE_ENABLE) {
6879 				/* was enabled, so disable */
6880 				drv_leds &= ~TR_ACTIVE_MASK;
6881 				drv_leds |=
6882 				    TR_ACTIVE_SET(TR_ACTIVE_DISABLE);
6883 
6884 				new_led_state &= SGPIO0_TR_DRV_CLR(i);
6885 				new_led_state |=
6886 				    SGPIO0_TR_DRV_SET(drv_leds, i);
6887 			} else {
6888 				/* was disabled, so enable */
6889 				drv_leds &= ~TR_ACTIVE_MASK;
6890 				drv_leds |= TR_ACTIVE_SET(TR_ACTIVE_ENABLE);
6891 
6892 				new_led_state &= SGPIO0_TR_DRV_CLR(i);
6893 				new_led_state |=
6894 				    SGPIO0_TR_DRV_SET(drv_leds, i);
6895 			}
6896 
6897 			/*
6898 			 * clear the activity bit
6899 			 * if there is drive activity again within the
6900 			 * loop interval (now 1/16 second), nvs_activity
6901 			 * will be reset and the "connected and active"
6902 			 * condition above will cause the LED to blink
6903 			 * off and on at the loop interval rate.  The
6904 			 * rate may be increased (interval shortened) as
6905 			 * long as it is not more than 1/30 second.
6906 			 */
6907 			mutex_enter(&cmn->nvs_slock);
6908 			cmn->nvs_activity &= ~(1 << i);
6909 			mutex_exit(&cmn->nvs_slock);
6910 		}
6911 
6912 		DTRACE_PROBE1(sgpio__new__led__state, int, new_led_state);
6913 
6914 		/* write out LED values */
6915 
6916 		mutex_enter(&cmn->nvs_slock);
6917 		cbp->sgpio0_tr &= ~TR_ACTIVE_MASK_ALL;
6918 		cbp->sgpio0_tr |= new_led_state;
6919 		cbp->sgpio_cr0 = SGP_CR0_ENABLE_MASK;
6920 		mutex_exit(&cmn->nvs_slock);
6921 
6922 		if (nv_sgp_write_data(nvc) == NV_FAILURE) {
6923 			NVLOG(NVDBG_VERBOSE, nvc, NULL,
6924 			    "nv_sgp_write_data failure updating active LED",
6925 			    NULL);
6926 		}
6927 
6928 		/* now rest for the interval */
6929 		mutex_enter(&cmn->nvs_tlock);
6930 		ticks = drv_usectohz(cmn->nvs_taskq_delay);
6931 		if (ticks > 0)
6932 			(void) cv_reltimedwait(&cmn->nvs_cv, &cmn->nvs_tlock,
6933 			    ticks, TR_CLOCK_TICK);
6934 		mutex_exit(&cmn->nvs_tlock);
6935 	} while (ticks > 0);
6936 }
6937 
6938 /*
6939  * nv_sgp_drive_connect
6940  * Set the flag used to indicate that the drive is attached to the HBA.
6941  * Used to let the taskq know that it should turn the Activity LED on.
6942  */
6943 static void
nv_sgp_drive_connect(nv_ctl_t * nvc,int drive)6944 nv_sgp_drive_connect(nv_ctl_t *nvc, int drive)
6945 {
6946 	nv_sgp_cmn_t *cmn;
6947 
6948 	if (nv_sgp_check_set_cmn(nvc) == NV_FAILURE)
6949 		return;
6950 	cmn = nvc->nvc_sgp_cmn;
6951 
6952 	mutex_enter(&cmn->nvs_slock);
6953 	cmn->nvs_connected |= (1 << drive);
6954 	mutex_exit(&cmn->nvs_slock);
6955 }
6956 
6957 /*
6958  * nv_sgp_drive_disconnect
6959  * Clears the flag used to indicate that the drive is no longer attached
6960  * to the HBA.  Used to let the taskq know that it should turn the
6961  * Activity LED off.  The flag that indicates that the drive is in use is
6962  * also cleared.
6963  */
6964 static void
nv_sgp_drive_disconnect(nv_ctl_t * nvc,int drive)6965 nv_sgp_drive_disconnect(nv_ctl_t *nvc, int drive)
6966 {
6967 	nv_sgp_cmn_t *cmn;
6968 
6969 	if (nv_sgp_check_set_cmn(nvc) == NV_FAILURE)
6970 		return;
6971 	cmn = nvc->nvc_sgp_cmn;
6972 
6973 	mutex_enter(&cmn->nvs_slock);
6974 	cmn->nvs_connected &= ~(1 << drive);
6975 	cmn->nvs_activity &= ~(1 << drive);
6976 	mutex_exit(&cmn->nvs_slock);
6977 }
6978 
6979 /*
6980  * nv_sgp_drive_active
6981  * Sets the flag used to indicate that the drive has been accessed and the
6982  * LED should be flicked off, then on.  It is cleared at a fixed time
6983  * interval by the LED taskq and set by the sata command start.
6984  */
6985 static void
nv_sgp_drive_active(nv_ctl_t * nvc,int drive)6986 nv_sgp_drive_active(nv_ctl_t *nvc, int drive)
6987 {
6988 	nv_sgp_cmn_t *cmn;
6989 
6990 	if (nv_sgp_check_set_cmn(nvc) == NV_FAILURE)
6991 		return;
6992 	cmn = nvc->nvc_sgp_cmn;
6993 
6994 	DTRACE_PROBE1(sgpio__active, int, drive);
6995 
6996 	mutex_enter(&cmn->nvs_slock);
6997 	cmn->nvs_activity |= (1 << drive);
6998 	mutex_exit(&cmn->nvs_slock);
6999 }
7000 
7001 
7002 /*
7003  * nv_sgp_locate
7004  * Turns the Locate/OK2RM LED off or on for a particular drive.  State is
7005  * maintained in the SGPIO Control Block.
7006  */
7007 static void
nv_sgp_locate(nv_ctl_t * nvc,int drive,int value)7008 nv_sgp_locate(nv_ctl_t *nvc, int drive, int value)
7009 {
7010 	uint8_t leds;
7011 	volatile nv_sgp_cb_t *cb = nvc->nvc_sgp_cbp;
7012 	nv_sgp_cmn_t *cmn;
7013 
7014 	if (nv_sgp_check_set_cmn(nvc) == NV_FAILURE)
7015 		return;
7016 	cmn = nvc->nvc_sgp_cmn;
7017 
7018 	if ((drive < 0) || (drive >= SGPIO_DRV_CNT_VALUE))
7019 		return;
7020 
7021 	DTRACE_PROBE2(sgpio__locate, int, drive, int, value);
7022 
7023 	mutex_enter(&cmn->nvs_slock);
7024 
7025 	leds = SGPIO0_TR_DRV(cb->sgpio0_tr, drive);
7026 
7027 	leds &= ~TR_LOCATE_MASK;
7028 	leds |= TR_LOCATE_SET(value);
7029 
7030 	cb->sgpio0_tr &= SGPIO0_TR_DRV_CLR(drive);
7031 	cb->sgpio0_tr |= SGPIO0_TR_DRV_SET(leds, drive);
7032 
7033 	cb->sgpio_cr0 = SGP_CR0_ENABLE_MASK;
7034 
7035 	mutex_exit(&cmn->nvs_slock);
7036 
7037 	if (nv_sgp_write_data(nvc) == NV_FAILURE) {
7038 		nv_cmn_err(CE_WARN, nvc, NULL,
7039 		    "nv_sgp_write_data failure updating OK2RM/Locate LED");
7040 	}
7041 }
7042 
7043 /*
7044  * nv_sgp_error
7045  * Turns the Error/Failure LED off or on for a particular drive.  State is
7046  * maintained in the SGPIO Control Block.
7047  */
7048 static void
nv_sgp_error(nv_ctl_t * nvc,int drive,int value)7049 nv_sgp_error(nv_ctl_t *nvc, int drive, int value)
7050 {
7051 	uint8_t leds;
7052 	volatile nv_sgp_cb_t *cb = nvc->nvc_sgp_cbp;
7053 	nv_sgp_cmn_t *cmn;
7054 
7055 	if (nv_sgp_check_set_cmn(nvc) == NV_FAILURE)
7056 		return;
7057 	cmn = nvc->nvc_sgp_cmn;
7058 
7059 	if ((drive < 0) || (drive >= SGPIO_DRV_CNT_VALUE))
7060 		return;
7061 
7062 	DTRACE_PROBE2(sgpio__error, int, drive, int, value);
7063 
7064 	mutex_enter(&cmn->nvs_slock);
7065 
7066 	leds = SGPIO0_TR_DRV(cb->sgpio0_tr, drive);
7067 
7068 	leds &= ~TR_ERROR_MASK;
7069 	leds |= TR_ERROR_SET(value);
7070 
7071 	cb->sgpio0_tr &= SGPIO0_TR_DRV_CLR(drive);
7072 	cb->sgpio0_tr |= SGPIO0_TR_DRV_SET(leds, drive);
7073 
7074 	cb->sgpio_cr0 = SGP_CR0_ENABLE_MASK;
7075 
7076 	mutex_exit(&cmn->nvs_slock);
7077 
7078 	if (nv_sgp_write_data(nvc) == NV_FAILURE) {
7079 		nv_cmn_err(CE_WARN, nvc, NULL,
7080 		    "nv_sgp_write_data failure updating Fail/Error LED");
7081 	}
7082 }
7083 
7084 static void
nv_sgp_cleanup(nv_ctl_t * nvc)7085 nv_sgp_cleanup(nv_ctl_t *nvc)
7086 {
7087 	int drive, i;
7088 	uint8_t drv_leds;
7089 	uint32_t led_state;
7090 	volatile nv_sgp_cb_t *cb = nvc->nvc_sgp_cbp;
7091 	nv_sgp_cmn_t *cmn = nvc->nvc_sgp_cmn;
7092 	extern void psm_unmap_phys(caddr_t, size_t);
7093 
7094 	/*
7095 	 * If the SGPIO Control Block isn't mapped or the shared data
7096 	 * structure isn't present in this instance, there isn't much that
7097 	 * can be cleaned up.
7098 	 */
7099 	if ((cb == NULL) || (cmn == NULL))
7100 		return;
7101 
7102 	/* turn off activity LEDs for this controller */
7103 	drv_leds = TR_ACTIVE_SET(TR_ACTIVE_DISABLE);
7104 
7105 	/* get the existing LED state */
7106 	led_state = cb->sgpio0_tr;
7107 
7108 	/* turn off port 0 */
7109 	drive = SGP_CTLR_PORT_TO_DRV(nvc->nvc_ctlr_num, 0);
7110 	led_state &= SGPIO0_TR_DRV_CLR(drive);
7111 	led_state |= SGPIO0_TR_DRV_SET(drv_leds, drive);
7112 
7113 	/* turn off port 1 */
7114 	drive = SGP_CTLR_PORT_TO_DRV(nvc->nvc_ctlr_num, 1);
7115 	led_state &= SGPIO0_TR_DRV_CLR(drive);
7116 	led_state |= SGPIO0_TR_DRV_SET(drv_leds, drive);
7117 
7118 	/* set the new led state, which should turn off this ctrl's LEDs */
7119 	cb->sgpio_cr0 = SGP_CR0_ENABLE_MASK;
7120 	(void) nv_sgp_write_data(nvc);
7121 
7122 	/* clear the controller's in use bit */
7123 	mutex_enter(&cmn->nvs_slock);
7124 	cmn->nvs_in_use &= ~(1 << nvc->nvc_ctlr_num);
7125 	mutex_exit(&cmn->nvs_slock);
7126 
7127 	if (cmn->nvs_in_use == 0) {
7128 		/* if all "in use" bits cleared, take everything down */
7129 
7130 		if (cmn->nvs_taskq != NULL) {
7131 			/* allow activity taskq to exit */
7132 			cmn->nvs_taskq_delay = 0;
7133 			cv_broadcast(&cmn->nvs_cv);
7134 
7135 			/* then destroy it */
7136 			ddi_taskq_destroy(cmn->nvs_taskq);
7137 		}
7138 
7139 		/* turn off all of the LEDs */
7140 		cb->sgpio0_tr = 0;
7141 		cb->sgpio_cr0 = SGP_CR0_ENABLE_MASK;
7142 		(void) nv_sgp_write_data(nvc);
7143 
7144 		cb->sgpio_sr = 0;
7145 
7146 		/* zero out the CBP to cmn mapping */
7147 		for (i = 0; i < NV_MAX_CBPS; i++) {
7148 			if (nv_sgp_cbp2cmn[i].c2cm_cbp == cmn->nvs_cbp) {
7149 				nv_sgp_cbp2cmn[i].c2cm_cmn = NULL;
7150 				break;
7151 			}
7152 
7153 			if (nv_sgp_cbp2cmn[i].c2cm_cbp == 0)
7154 				break;
7155 		}
7156 
7157 		/* free resources */
7158 		cv_destroy(&cmn->nvs_cv);
7159 		mutex_destroy(&cmn->nvs_tlock);
7160 		mutex_destroy(&cmn->nvs_slock);
7161 
7162 		kmem_free(nvc->nvc_sgp_cmn, sizeof (nv_sgp_cmn_t));
7163 	}
7164 
7165 	nvc->nvc_sgp_cmn = NULL;
7166 
7167 	/* unmap the SGPIO Control Block */
7168 	psm_unmap_phys((caddr_t)nvc->nvc_sgp_cbp, sizeof (nv_sgp_cb_t));
7169 }
7170 #endif	/* SGPIO_SUPPORT */
7171