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
 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
 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
 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
 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
 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
 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
 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
 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
 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
 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)&regs, &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
 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
 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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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 */