pmcs_attach.c revision 978d7443a924cda8208d6a10e72be89383bc7bec
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * CDDL HEADER START
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * The contents of this file are subject to the terms of the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Common Development and Distribution License (the "License").
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * You may not use this file except in compliance with the License.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * See the License for the specific language governing permissions
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * and limitations under the License.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * When distributing Covered Code, include this CDDL HEADER in each
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * If applicable, add the following below this CDDL HEADER, with the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * fields enclosed by brackets "[]" replaced with your own identifying
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * information: Portions Copyright [yyyy] [name of copyright owner]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * CDDL HEADER END
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define PMCS_DRIVER_VERSION "pmcs HBA device driver"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Non-DDI Compliant stuff
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncextern char hw_serial[];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Global driver data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Tracing and Logging info
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * If pmcs_force_syslog value is non-zero, all messages put in the trace log
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * will also be sent to system log.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * External References
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Local static data
static int block_mask = 0;
#ifdef DEBUG
static int debug_mask = 0;
#ifdef DISABLE_MSIX
static int disable_msix = 0;
#ifdef DISABLE_MSI
static int disable_msi = 0;
static void pmcs_watchdog(void *);
_init(void)
int ret;
if (ret != 0) {
return (ret);
return (ret);
if (ret != 0) {
return (ret);
if (ret != 0) {
return (ret);
_fini(void)
int ret;
return (ret);
if (pmcs_tbuf) {
char *iport_ua;
char *init_port;
int hba_inst;
int inst;
return (DDI_FAILURE);
return (DDI_FAILURE);
return (DDI_FAILURE);
return (DDI_FAILURE);
goto iport_attach_fail1;
if (ua_priv) {
goto iport_attach_fail2;
goto iport_attach_fail2;
goto iport_attach_fail3;
return (DDI_SUCCESS);
return (DDI_FAILURE);
int inst, i;
int protocol = 0;
int num_phys = 0;
char *fwl_file;
switch (cmd) {
case DDI_ATTACH:
case DDI_PM_RESUME:
case DDI_RESUME:
if (!tran) {
return (DDI_FAILURE);
return (DDI_SUCCESS);
return (DDI_FAILURE);
return (DDI_SUCCESS);
return (DDI_FAILURE);
#ifdef DEBUG
return (DDI_FAILURE);
return (DDI_FAILURE);
return (DDI_FAILURE);
* Get driver.conf properties
(pmcs_tbuf_num_elems == 0)) {
pmcs_tbuf_idx = 0;
return (DDI_FAILURE);
return (DDI_FAILURE);
return (DDI_FAILURE);
return (DDI_FAILURE);
return (DDI_FAILURE);
return (DDI_FAILURE);
case PMCS_PM8001_REV_A:
case PMCS_PM8001_REV_B:
goto failure;
case PMCS_PM8001_REV_C:
goto failure;
goto failure;
B_FALSE) {
goto failure;
goto failure;
NULL, 0);
case EIO:
goto failure;
goto failure;
phyp++;
goto failure;
goto failure;
goto failure;
goto failure;
goto failure;
goto failure;
goto failure;
goto failure;
goto failure;
&sm_hba);
hw_rev);
case PMCS_FW_TYPE_RELEASED:
case PMCS_FW_TYPE_DEVELOPMENT:
case PMCS_FW_TYPE_ALPHA:
case PMCS_FW_TYPE_BETA:
fw_rev);
&num_phys);
&protocol);
return (DDI_SUCCESS);
return (DDI_FAILURE);
return (DDI_FAILURE);
return (DDI_FAILURE);
switch (cmd) {
case DDI_DETACH:
if (iport) {
return (DDI_FAILURE);
return (DDI_SUCCESS);
return (DDI_FAILURE);
return (DDI_SUCCESS);
case DDI_SUSPEND:
case DDI_PM_SUSPEND:
if (iport) {
return (DDI_SUCCESS);
return (DDI_FAILURE);
if (!tran) {
return (DDI_FAILURE);
return (DDI_FAILURE);
return (DDI_SUCCESS);
return (DDI_FAILURE);
return (DDI_FAILURE);
return (DDI_FAILURE);
return (DDI_FAILURE);
return (DDI_SUCCESS);
#ifdef DEBUG
for (i = 0; i < PMCS_NOQ; i++) {
DDI_SUCCESS) {
for (i = 0; i < PMCS_NIQ; i++) {
DDI_SUCCESS) {
return (DDI_SUCCESS);
return (DDI_SUCCESS);
return (DDI_SUCCESS);
return (DDI_SUCCESS);
int result, i;
uint16_t *a;
if (result) {
return (result);
static boolean_t
case SATA:
return (B_FALSE);
case SAS:
case EXPANDER:
return (B_TRUE);
unsigned long dl;
for (i = 0; i < PMCS_NIQ; i++) {
goto hot_reset;
goto hot_reset;
goto hot_reset;
* See pmcs_subr.c for more details.
int rval;
#ifdef DEBUG
if (rval) {
__func__);
int i, r, rslt = 0;
for (i = 0; i < icnt; i++) {
if (r == DDI_SUCCESS) {
return (rslt);
if (r != DDI_SUCCESS) {
for (i = 0; i < icnt; i++) {
for (i = 0; i < icnt; i++) {
switch (type) {
case DDI_INTR_TYPE_MSIX:
case DDI_INTR_TYPE_MSI:
case DDI_INTR_TYPE_FIXED:
return (EAGAIN);
if (disable_msix) {
if (disable_msi) {
itypes = 0;
itypes = 0;
itypes = 0;
return (EAGAIN);
return (EAGAIN);
if (r != DDI_SUCCESS) {
return (EIO);
return (EIO);
return (EAGAIN);
return (EIO);
return (EIO);
return (EAGAIN);
if (r != DDI_SUCCESS) {
return (EIO);
return (EIO);
return (EFAULT);
if (r == DDI_SUCCESS) {
return (EIO);
return (EIO);
return (EIO);
return (EAGAIN);
return (EIO);
return (EIO);
return (EIO);
return (EAGAIN);
#ifdef DEBUG
for (i = 0; i < PMCS_NIQ; i++) {
return (EIO);
return (EIO);
return (EIO);
static uint_t
return (DDI_INTR_CLAIMED);
static uint_t
return (DDI_INTR_CLAIMED);
static uint_t
return (DDI_INTR_CLAIMED);
static uint_t
return (DDI_INTR_CLAIMED);
static uint_t
return (DDI_INTR_CLAIMED);
return (DDI_INTR_CLAIMED);
static uint_t
int handled = 0;
return (DDI_INTR_CLAIMED);
handled++;
handled++;
handled++;
if (obdb) {
handled++;
handled++;
* See pmcs_subr.c for more details.
case SAS:
case EXPANDER:
case SATA:
return (B_FALSE);
return (B_FALSE);
return (B_TRUE);
unsigned int vtgt;
int written = 0;
char *ptr;
int system_log_level;
switch (level) {
case PMCS_PRT_DEBUG_DEVEL:
case PMCS_PRT_DEBUG_DEV_STATE:
case PMCS_PRT_DEBUG_UNDERFLOW:
case PMCS_PRT_DEBUG_CONFIG:
case PMCS_PRT_DEBUG_IPORT:
case PMCS_PRT_DEBUG_MAP:
case PMCS_PRT_DEBUG3:
case PMCS_PRT_DEBUG2:
case PMCS_PRT_DEBUG1:
case PMCS_PRT_DEBUG:
case PMCS_PRT_INFO:
case PMCS_PRT_WARN:
case PMCS_PRT_ERR:
pmcs_tbuf_idx = 0;
if (pmcs_force_syslog) {
if (system_log) {
switch (system_log_level) {
case CE_CONT:
case CE_NOTE:
case CE_WARN:
local[0] = 0;
int rval;
if (!wait) {
return (rval);
int ndata;
goto fail;
goto fail;
goto fail;
goto fail;
fail:
return (ret);
static boolean_t
char *cp, c;
cp = &c;
if (adr == 0) {
__func__);
for (i = 0; i < PMCS_MAX_PORTS; i++) {
return (B_TRUE);