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