f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China/*
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China * CDDL HEADER START
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China *
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China * The contents of this file are subject to the terms of the
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China * Common Development and Distribution License (the "License").
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China * You may not use this file except in compliance with the License.
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China *
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China * or http://www.opensolaris.org/os/licensing.
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China * See the License for the specific language governing permissions
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China * and limitations under the License.
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China *
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China * When distributing Covered Code, include this CDDL HEADER in each
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China * If applicable, add the following below this CDDL HEADER, with the
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China * fields enclosed by brackets "[]" replaced with your own identifying
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China * information: Portions Copyright [yyyy] [name of copyright owner]
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China *
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China * CDDL HEADER END
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China */
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China/*
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
8b1f072cdb7c7ae7c166fc48e2f1988fc5fbb3f4Hans Rosenfeld * Copyright 2013 Nexenta Systems, Inc. All rights reserved.
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China */
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China/*
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China * This file contains SM-HBA support for MPT SAS driver
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China */
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China#if defined(lint) || defined(DEBUG)
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China#define MPTSAS_DEBUG
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China#endif
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China/*
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China * standard header files
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China */
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China#include <sys/note.h>
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China#include <sys/scsi/scsi.h>
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China#include <sys/pci.h>
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada#include <sys/scsi/generic/sas.h>
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada#include <sys/scsi/impl/scsi_sas.h>
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China#pragma pack(1)
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China#include <sys/scsi/adapters/mpt_sas/mpi/mpi2_type.h>
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China#include <sys/scsi/adapters/mpt_sas/mpi/mpi2.h>
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China#include <sys/scsi/adapters/mpt_sas/mpi/mpi2_cnfg.h>
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China#include <sys/scsi/adapters/mpt_sas/mpi/mpi2_init.h>
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China#include <sys/scsi/adapters/mpt_sas/mpi/mpi2_ioc.h>
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China#include <sys/scsi/adapters/mpt_sas/mpi/mpi2_sas.h>
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China#pragma pack()
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China/*
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China * private header files.
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China */
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China#include <sys/scsi/adapters/mpt_sas/mptsas_var.h>
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China#include <sys/scsi/adapters/mpt_sas/mptsas_smhba.h>
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada/*
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada * SM - HBA statics
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada */
a9b510629bb89d580bb11ce66254ff44bf4959d1Adaextern char *mptsas_driver_rev;
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada
8b1f072cdb7c7ae7c166fc48e2f1988fc5fbb3f4Hans Rosenfeldstatic void mptsas_smhba_create_phy_props(nvlist_t **, smhba_info_t *, uint8_t,
8b1f072cdb7c7ae7c166fc48e2f1988fc5fbb3f4Hans Rosenfeld uint16_t *);
8b1f072cdb7c7ae7c166fc48e2f1988fc5fbb3f4Hans Rosenfeldstatic void mptsas_smhba_update_phy_props(mptsas_t *, dev_info_t *, nvlist_t **,
8b1f072cdb7c7ae7c166fc48e2f1988fc5fbb3f4Hans Rosenfeld uint8_t);
8b1f072cdb7c7ae7c166fc48e2f1988fc5fbb3f4Hans Rosenfeld
a9b510629bb89d580bb11ce66254ff44bf4959d1Adastatic void
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing Chinamptsas_smhba_add_hba_prop(mptsas_t *mpt, data_type_t dt,
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China char *prop_name, void *prop_val);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing Chinavoid
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing Chinamptsas_smhba_show_phy_info(mptsas_t *mpt);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
a9b510629bb89d580bb11ce66254ff44bf4959d1Adastatic void
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing Chinamptsas_smhba_add_hba_prop(mptsas_t *mpt, data_type_t dt,
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China char *prop_name, void *prop_val)
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China{
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China ASSERT(mpt != NULL);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China switch (dt) {
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China case DATA_TYPE_INT32:
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China if (ddi_prop_update_int(DDI_DEV_T_NONE, mpt->m_dip,
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China prop_name, *(int *)prop_val)) {
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN,
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China "%s: %s prop update failed", __func__, prop_name);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China }
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China break;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China case DATA_TYPE_STRING:
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China if (ddi_prop_update_string(DDI_DEV_T_NONE, mpt->m_dip,
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China prop_name, (char *)prop_val)) {
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN,
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China "%s: %s prop update failed", __func__, prop_name);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China }
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China break;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China default:
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, "%s: "
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China "Unhandled datatype(%d) for (%s). Skipping prop update.",
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China __func__, dt, prop_name);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China }
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China}
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing Chinavoid
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing Chinamptsas_smhba_show_phy_info(mptsas_t *mpt)
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China{
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China int i;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China ASSERT(mpt != NULL);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China for (i = 0; i < MPTSAS_MAX_PHYS; i++) {
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN,
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China "phy %d, Owner hdl:0x%x, attached hdl: 0x%x,"
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China "attached phy identifier %d,Program link rate 0x%x,"
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China "hw link rate 0x%x, negotiator link rate 0x%x, path %s",
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China i, mpt->m_phy_info[i].smhba_info.owner_devhdl,
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China mpt->m_phy_info[i].smhba_info.attached_devhdl,
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China mpt->m_phy_info[i].smhba_info.attached_phy_identify,
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China mpt->m_phy_info[i].smhba_info.programmed_link_rate,
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China mpt->m_phy_info[i].smhba_info.hw_link_rate,
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China mpt->m_phy_info[i].smhba_info.negotiated_link_rate,
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China mpt->m_phy_info[i].smhba_info.path);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China }
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China}
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
8b1f072cdb7c7ae7c166fc48e2f1988fc5fbb3f4Hans Rosenfeldstatic void
8b1f072cdb7c7ae7c166fc48e2f1988fc5fbb3f4Hans Rosenfeldmptsas_smhba_create_phy_props(nvlist_t **phy_props, smhba_info_t *pSmhba,
8b1f072cdb7c7ae7c166fc48e2f1988fc5fbb3f4Hans Rosenfeld uint8_t phy_id, uint16_t *attached_devhdl)
8b1f072cdb7c7ae7c166fc48e2f1988fc5fbb3f4Hans Rosenfeld{
8b1f072cdb7c7ae7c166fc48e2f1988fc5fbb3f4Hans Rosenfeld (void) nvlist_alloc(phy_props, NV_UNIQUE_NAME, KM_SLEEP);
8b1f072cdb7c7ae7c166fc48e2f1988fc5fbb3f4Hans Rosenfeld (void) nvlist_add_uint8(*phy_props, SAS_PHY_ID, phy_id);
8b1f072cdb7c7ae7c166fc48e2f1988fc5fbb3f4Hans Rosenfeld (void) nvlist_add_uint8(*phy_props, "phyState",
8b1f072cdb7c7ae7c166fc48e2f1988fc5fbb3f4Hans Rosenfeld (pSmhba->negotiated_link_rate & 0x0f));
8b1f072cdb7c7ae7c166fc48e2f1988fc5fbb3f4Hans Rosenfeld (void) nvlist_add_int8(*phy_props, SAS_NEG_LINK_RATE,
8b1f072cdb7c7ae7c166fc48e2f1988fc5fbb3f4Hans Rosenfeld (pSmhba->negotiated_link_rate & 0x0f));
8b1f072cdb7c7ae7c166fc48e2f1988fc5fbb3f4Hans Rosenfeld (void) nvlist_add_int8(*phy_props, SAS_PROG_MIN_LINK_RATE,
8b1f072cdb7c7ae7c166fc48e2f1988fc5fbb3f4Hans Rosenfeld (pSmhba->programmed_link_rate & 0x0f));
8b1f072cdb7c7ae7c166fc48e2f1988fc5fbb3f4Hans Rosenfeld (void) nvlist_add_int8(*phy_props, SAS_HW_MIN_LINK_RATE,
8b1f072cdb7c7ae7c166fc48e2f1988fc5fbb3f4Hans Rosenfeld (pSmhba->hw_link_rate & 0x0f));
8b1f072cdb7c7ae7c166fc48e2f1988fc5fbb3f4Hans Rosenfeld (void) nvlist_add_int8(*phy_props, SAS_PROG_MAX_LINK_RATE,
8b1f072cdb7c7ae7c166fc48e2f1988fc5fbb3f4Hans Rosenfeld ((pSmhba->programmed_link_rate & 0xf0) >> 4));
8b1f072cdb7c7ae7c166fc48e2f1988fc5fbb3f4Hans Rosenfeld (void) nvlist_add_int8(*phy_props, SAS_HW_MAX_LINK_RATE,
8b1f072cdb7c7ae7c166fc48e2f1988fc5fbb3f4Hans Rosenfeld ((pSmhba->hw_link_rate & 0xf0) >> 4));
8b1f072cdb7c7ae7c166fc48e2f1988fc5fbb3f4Hans Rosenfeld
8b1f072cdb7c7ae7c166fc48e2f1988fc5fbb3f4Hans Rosenfeld if (pSmhba->attached_devhdl && (attached_devhdl != NULL))
8b1f072cdb7c7ae7c166fc48e2f1988fc5fbb3f4Hans Rosenfeld *attached_devhdl = pSmhba->attached_devhdl;
8b1f072cdb7c7ae7c166fc48e2f1988fc5fbb3f4Hans Rosenfeld}
8b1f072cdb7c7ae7c166fc48e2f1988fc5fbb3f4Hans Rosenfeld
8b1f072cdb7c7ae7c166fc48e2f1988fc5fbb3f4Hans Rosenfeldstatic void
8b1f072cdb7c7ae7c166fc48e2f1988fc5fbb3f4Hans Rosenfeldmptsas_smhba_update_phy_props(mptsas_t *mpt, dev_info_t *dip,
8b1f072cdb7c7ae7c166fc48e2f1988fc5fbb3f4Hans Rosenfeld nvlist_t **phy_props, uint8_t phy_nums)
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China{
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China int rval;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China size_t packed_size;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China char *packed_data = NULL;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China nvlist_t *nvl;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
8b1f072cdb7c7ae7c166fc48e2f1988fc5fbb3f4Hans Rosenfeld if (nvlist_alloc(&nvl, NV_UNIQUE_NAME, KM_SLEEP) != 0) {
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, "%s: nvlist_alloc() failed", __func__);
8b1f072cdb7c7ae7c166fc48e2f1988fc5fbb3f4Hans Rosenfeld return;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China }
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China rval = nvlist_add_nvlist_array(nvl, SAS_PHY_INFO_NVL, phy_props,
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China phy_nums);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China if (rval) {
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN,
8b1f072cdb7c7ae7c166fc48e2f1988fc5fbb3f4Hans Rosenfeld " nv list array add failed, return value %d.", rval);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China goto exit;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China }
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China (void) nvlist_size(nvl, &packed_size, NV_ENCODE_NATIVE);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China packed_data = kmem_zalloc(packed_size, KM_SLEEP);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China (void) nvlist_pack(nvl, &packed_data, &packed_size,
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China NV_ENCODE_NATIVE, 0);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China (void) ddi_prop_update_byte_array(DDI_DEV_T_NONE, dip,
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China SAS_PHY_INFO, (uchar_t *)packed_data, packed_size);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing Chinaexit:
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China nvlist_free(nvl);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China if (packed_data != NULL) {
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China kmem_free(packed_data, packed_size);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China }
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China}
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
8b1f072cdb7c7ae7c166fc48e2f1988fc5fbb3f4Hans Rosenfeldvoid
8b1f072cdb7c7ae7c166fc48e2f1988fc5fbb3f4Hans Rosenfeldmptsas_smhba_set_one_phy_props(mptsas_t *mpt, dev_info_t *dip, uint8_t phy_id,
8b1f072cdb7c7ae7c166fc48e2f1988fc5fbb3f4Hans Rosenfeld uint16_t *attached_devhdl)
8b1f072cdb7c7ae7c166fc48e2f1988fc5fbb3f4Hans Rosenfeld{
8b1f072cdb7c7ae7c166fc48e2f1988fc5fbb3f4Hans Rosenfeld nvlist_t *phy_props;
8b1f072cdb7c7ae7c166fc48e2f1988fc5fbb3f4Hans Rosenfeld
8b1f072cdb7c7ae7c166fc48e2f1988fc5fbb3f4Hans Rosenfeld ASSERT(phy_id < mpt->m_num_phys);
8b1f072cdb7c7ae7c166fc48e2f1988fc5fbb3f4Hans Rosenfeld
8b1f072cdb7c7ae7c166fc48e2f1988fc5fbb3f4Hans Rosenfeld mptsas_smhba_create_phy_props(&phy_props,
8b1f072cdb7c7ae7c166fc48e2f1988fc5fbb3f4Hans Rosenfeld &mpt->m_phy_info[phy_id].smhba_info, phy_id, attached_devhdl);
8b1f072cdb7c7ae7c166fc48e2f1988fc5fbb3f4Hans Rosenfeld
8b1f072cdb7c7ae7c166fc48e2f1988fc5fbb3f4Hans Rosenfeld mptsas_smhba_update_phy_props(mpt, dip, &phy_props, 1);
8b1f072cdb7c7ae7c166fc48e2f1988fc5fbb3f4Hans Rosenfeld
8b1f072cdb7c7ae7c166fc48e2f1988fc5fbb3f4Hans Rosenfeld nvlist_free(phy_props);
8b1f072cdb7c7ae7c166fc48e2f1988fc5fbb3f4Hans Rosenfeld}
8b1f072cdb7c7ae7c166fc48e2f1988fc5fbb3f4Hans Rosenfeld
8b1f072cdb7c7ae7c166fc48e2f1988fc5fbb3f4Hans Rosenfeldvoid
8b1f072cdb7c7ae7c166fc48e2f1988fc5fbb3f4Hans Rosenfeldmptsas_smhba_set_all_phy_props(mptsas_t *mpt, dev_info_t *dip, uint8_t phy_nums,
8b1f072cdb7c7ae7c166fc48e2f1988fc5fbb3f4Hans Rosenfeld mptsas_phymask_t phy_mask, uint16_t *attached_devhdl)
8b1f072cdb7c7ae7c166fc48e2f1988fc5fbb3f4Hans Rosenfeld{
8b1f072cdb7c7ae7c166fc48e2f1988fc5fbb3f4Hans Rosenfeld int i, j;
8b1f072cdb7c7ae7c166fc48e2f1988fc5fbb3f4Hans Rosenfeld nvlist_t **phy_props;
8b1f072cdb7c7ae7c166fc48e2f1988fc5fbb3f4Hans Rosenfeld
8b1f072cdb7c7ae7c166fc48e2f1988fc5fbb3f4Hans Rosenfeld if (phy_nums == 0)
8b1f072cdb7c7ae7c166fc48e2f1988fc5fbb3f4Hans Rosenfeld return;
8b1f072cdb7c7ae7c166fc48e2f1988fc5fbb3f4Hans Rosenfeld
8b1f072cdb7c7ae7c166fc48e2f1988fc5fbb3f4Hans Rosenfeld phy_props = kmem_zalloc(sizeof (nvlist_t *) * phy_nums, KM_SLEEP);
8b1f072cdb7c7ae7c166fc48e2f1988fc5fbb3f4Hans Rosenfeld
8b1f072cdb7c7ae7c166fc48e2f1988fc5fbb3f4Hans Rosenfeld for (i = 0, j = 0; i < mpt->m_num_phys && j < phy_nums; i++)
8b1f072cdb7c7ae7c166fc48e2f1988fc5fbb3f4Hans Rosenfeld if (phy_mask == mpt->m_phy_info[i].phy_mask)
8b1f072cdb7c7ae7c166fc48e2f1988fc5fbb3f4Hans Rosenfeld mptsas_smhba_create_phy_props(&phy_props[j++],
8b1f072cdb7c7ae7c166fc48e2f1988fc5fbb3f4Hans Rosenfeld &mpt->m_phy_info[i].smhba_info, i, attached_devhdl);
8b1f072cdb7c7ae7c166fc48e2f1988fc5fbb3f4Hans Rosenfeld
8b1f072cdb7c7ae7c166fc48e2f1988fc5fbb3f4Hans Rosenfeld mptsas_smhba_update_phy_props(mpt, dip, phy_props, j);
8b1f072cdb7c7ae7c166fc48e2f1988fc5fbb3f4Hans Rosenfeld
8b1f072cdb7c7ae7c166fc48e2f1988fc5fbb3f4Hans Rosenfeld for (i = 0; i < j && phy_props[i] != NULL; i++)
8b1f072cdb7c7ae7c166fc48e2f1988fc5fbb3f4Hans Rosenfeld nvlist_free(phy_props[i]);
8b1f072cdb7c7ae7c166fc48e2f1988fc5fbb3f4Hans Rosenfeld
8b1f072cdb7c7ae7c166fc48e2f1988fc5fbb3f4Hans Rosenfeld kmem_free(phy_props, sizeof (nvlist_t *) * phy_nums);
8b1f072cdb7c7ae7c166fc48e2f1988fc5fbb3f4Hans Rosenfeld}
8b1f072cdb7c7ae7c166fc48e2f1988fc5fbb3f4Hans Rosenfeld
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China/*
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China * Called with PHY lock held on phyp
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China */
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing Chinavoid
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing Chinamptsas_smhba_log_sysevent(mptsas_t *mpt, char *subclass, char *etype,
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China smhba_info_t *phyp)
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China{
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China nvlist_t *attr_list;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China char *pname;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China char sas_addr[MPTSAS_WWN_STRLEN];
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China uint8_t phynum = 0;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China uint8_t lrate = 0;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China if (mpt->m_dip == NULL)
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China return;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China if (phyp == NULL)
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China return;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China pname = kmem_zalloc(MAXPATHLEN, KM_NOSLEEP);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China if (pname == NULL)
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China return;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China if ((strcmp(subclass, ESC_SAS_PHY_EVENT) == 0) ||
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China (strcmp(subclass, ESC_SAS_HBA_PORT_BROADCAST) == 0)) {
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China ASSERT(phyp != NULL);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China (void) strncpy(pname, phyp->path, strlen(phyp->path));
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China phynum = phyp->phy_id;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China bzero(sas_addr, sizeof (sas_addr));
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China (void) sprintf(sas_addr, "w%016"PRIx64, phyp->sas_addr);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China if (strcmp(etype, SAS_PHY_ONLINE) == 0) {
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China lrate = phyp->negotiated_link_rate;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China }
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China }
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China if (strcmp(subclass, ESC_SAS_HBA_PORT_BROADCAST) == 0) {
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China (void) ddi_pathname(mpt->m_dip, pname);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China }
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China if (nvlist_alloc(&attr_list, NV_UNIQUE_NAME_TYPE, 0) != 0) {
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN,
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China "%s: Failed to post sysevent", __func__);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China kmem_free(pname, MAXPATHLEN);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China return;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China }
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China if (nvlist_add_int32(attr_list, SAS_DRV_INST,
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China ddi_get_instance(mpt->m_dip)) != 0)
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China goto fail;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China if (nvlist_add_string(attr_list, SAS_PORT_ADDR, sas_addr) != 0)
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China goto fail;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China if (nvlist_add_string(attr_list, SAS_DEVFS_PATH, pname) != 0)
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China goto fail;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China if (nvlist_add_uint8(attr_list, SAS_PHY_ID, phynum) != 0)
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China goto fail;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China if (strcmp(etype, SAS_PHY_ONLINE) == 0) {
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China if (nvlist_add_uint8(attr_list, SAS_LINK_RATE, lrate) != 0)
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China goto fail;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China }
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China if (nvlist_add_string(attr_list, SAS_EVENT_TYPE, etype) != 0)
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China goto fail;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China (void) ddi_log_sysevent(mpt->m_dip, DDI_VENDOR_SUNW, EC_HBA, subclass,
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China attr_list, NULL, DDI_NOSLEEP);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing Chinafail:
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China kmem_free(pname, MAXPATHLEN);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China nvlist_free(attr_list);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China}
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing Chinavoid
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing Chinamptsas_create_phy_stats(mptsas_t *mpt, char *iport, dev_info_t *dip)
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China{
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China sas_phy_stats_t *ps;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China smhba_info_t *phyp;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China int ndata;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China char ks_name[KSTAT_STRLEN];
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China char phymask[MPTSAS_MAX_PHYS];
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China int i;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China ASSERT(iport != NULL);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China ASSERT(mpt != NULL);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China for (i = 0; i < mpt->m_num_phys; i++) {
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China bzero(phymask, sizeof (phymask));
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China (void) sprintf(phymask, "%x", mpt->m_phy_info[i].phy_mask);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China if (strcmp(phymask, iport) == 0) {
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China phyp = &mpt->m_phy_info[i].smhba_info;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China mutex_enter(&phyp->phy_mutex);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China if (phyp->phy_stats != NULL) {
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China mutex_exit(&phyp->phy_mutex);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China /* We've already created this kstat instance */
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China continue;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China }
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China ndata = (sizeof (sas_phy_stats_t)/
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China sizeof (kstat_named_t));
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China (void) snprintf(ks_name, sizeof (ks_name),
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China "%s.%llx.%d.%d", ddi_driver_name(dip),
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China (longlong_t)mpt->un.m_base_wwid,
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China ddi_get_instance(dip), i);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China phyp->phy_stats = kstat_create("mptsas",
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China ddi_get_instance(dip), ks_name, KSTAT_SAS_PHY_CLASS,
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China KSTAT_TYPE_NAMED, ndata, 0);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China if (phyp->phy_stats == NULL) {
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China mutex_exit(&phyp->phy_mutex);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN,
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China "%s: Failed to create %s kstats", __func__,
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China ks_name);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China continue;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China }
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China ps = (sas_phy_stats_t *)phyp->phy_stats->ks_data;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China kstat_named_init(&ps->seconds_since_last_reset,
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China "SecondsSinceLastReset", KSTAT_DATA_ULONGLONG);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China kstat_named_init(&ps->tx_frames,
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China "TxFrames", KSTAT_DATA_ULONGLONG);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China kstat_named_init(&ps->rx_frames,
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China "RxFrames", KSTAT_DATA_ULONGLONG);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China kstat_named_init(&ps->tx_words,
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China "TxWords", KSTAT_DATA_ULONGLONG);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China kstat_named_init(&ps->rx_words,
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China "RxWords", KSTAT_DATA_ULONGLONG);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China kstat_named_init(&ps->invalid_dword_count,
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China "InvalidDwordCount", KSTAT_DATA_ULONGLONG);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China kstat_named_init(&ps->running_disparity_error_count,
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China "RunningDisparityErrorCount", KSTAT_DATA_ULONGLONG);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China kstat_named_init(&ps->loss_of_dword_sync_count,
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China "LossofDwordSyncCount", KSTAT_DATA_ULONGLONG);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China kstat_named_init(&ps->phy_reset_problem_count,
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China "PhyResetProblemCount", KSTAT_DATA_ULONGLONG);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China phyp->phy_stats->ks_private = phyp;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China phyp->phy_stats->ks_update = mptsas_update_phy_stats;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China kstat_install(phyp->phy_stats);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China mutex_exit(&phyp->phy_mutex);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China }
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China }
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China}
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing Chinaint
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing Chinamptsas_update_phy_stats(kstat_t *ks, int rw)
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China{
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China int ret = DDI_FAILURE;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China smhba_info_t *pptr = NULL;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China sas_phy_stats_t *ps = ks->ks_data;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China uint32_t page_address;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China mptsas_t *mpt;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China _NOTE(ARGUNUSED(rw));
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China pptr = (smhba_info_t *)ks->ks_private;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China ASSERT((pptr != NULL));
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China mpt = (mptsas_t *)pptr->mpt;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China ASSERT((mpt != NULL));
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China page_address = (MPI2_SAS_PHY_PGAD_FORM_PHY_NUMBER | pptr->phy_id);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China /*
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China * We just want to lock against other invocations of kstat;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China * we don't need to pmcs_lock_phy() for this.
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China */
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China mutex_enter(&mpt->m_mutex);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China ret = mptsas_get_sas_phy_page1(pptr->mpt, page_address, pptr);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China if (ret == DDI_FAILURE)
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China goto fail;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China ps->invalid_dword_count.value.ull =
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China (unsigned long long)pptr->invalid_dword_count;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China ps->running_disparity_error_count.value.ull =
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China (unsigned long long)pptr->running_disparity_error_count;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China ps->loss_of_dword_sync_count.value.ull =
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China (unsigned long long)pptr->loss_of_dword_sync_count;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China ps->phy_reset_problem_count.value.ull =
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China (unsigned long long)pptr->phy_reset_problem_count;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China ret = DDI_SUCCESS;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing Chinafail:
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China mutex_exit(&mpt->m_mutex);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China return (ret);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China}
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing Chinavoid
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing Chinamptsas_destroy_phy_stats(mptsas_t *mpt)
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China{
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China smhba_info_t *phyp;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China int i = 0;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China ASSERT(mpt != NULL);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China for (i = 0; i < mpt->m_num_phys; i++) {
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China phyp = &mpt->m_phy_info[i].smhba_info;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China if (phyp == NULL) {
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China continue;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China }
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China mutex_enter(&phyp->phy_mutex);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China if (phyp->phy_stats != NULL) {
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China kstat_delete(phyp->phy_stats);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China phyp->phy_stats = NULL;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China }
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China mutex_exit(&phyp->phy_mutex);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China }
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China}
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing Chinaint
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing Chinamptsas_smhba_phy_init(mptsas_t *mpt)
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China{
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China int i = 0;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China int rval = DDI_SUCCESS;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China uint32_t page_address;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China ASSERT(mutex_owned(&mpt->m_mutex));
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China for (i = 0; i < mpt->m_num_phys; i++) {
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China page_address =
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China (MPI2_SAS_PHY_PGAD_FORM_PHY_NUMBER |
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China (MPI2_SAS_PHY_PGAD_PHY_NUMBER_MASK & i));
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China rval = mptsas_get_sas_phy_page0(mpt,
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China page_address, &mpt->m_phy_info[i].smhba_info);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China if (rval != DDI_SUCCESS) {
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN,
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China "Failed to get sas phy page 0"
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China " for each phy");
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China return (DDI_FAILURE);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China }
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China mpt->m_phy_info[i].smhba_info.phy_id = (uint8_t)i;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China mpt->m_phy_info[i].smhba_info.sas_addr =
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China mpt->un.m_base_wwid + i;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China mpt->m_phy_info[i].smhba_info.mpt = mpt;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China }
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada return (DDI_SUCCESS);
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada}
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada
a9b510629bb89d580bb11ce66254ff44bf4959d1Adaint
a9b510629bb89d580bb11ce66254ff44bf4959d1Adamptsas_smhba_setup(mptsas_t *mpt)
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada{
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada int sm_hba = 1;
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada char chiprev, hw_rev[24];
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada char serial_number[72];
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada int protocol = 0;
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada mutex_enter(&mpt->m_mutex);
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada if (mptsas_smhba_phy_init(mpt)) {
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada mutex_exit(&mpt->m_mutex);
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada return (DDI_FAILURE);
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada }
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada mutex_exit(&mpt->m_mutex);
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada /* SM-HBA support */
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada mptsas_smhba_add_hba_prop(mpt, DATA_TYPE_INT32, MPTSAS_SMHBA_SUPPORTED,
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada &sm_hba);
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada /* SM-HBA driver version */
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada mptsas_smhba_add_hba_prop(mpt, DATA_TYPE_STRING, MPTSAS_DRV_VERSION,
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada mptsas_driver_rev);
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada /* SM-HBA hardware version */
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada chiprev = 'A' + mpt->m_revid;
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada (void) snprintf(hw_rev, 2, "%s", &chiprev);
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada mptsas_smhba_add_hba_prop(mpt, DATA_TYPE_STRING, MPTSAS_HWARE_VERSION,
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada hw_rev);
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada /* SM-HBA phy number per HBA */
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada mptsas_smhba_add_hba_prop(mpt, DATA_TYPE_INT32, MPTSAS_NUM_PHYS_HBA,
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada &(mpt->m_num_phys));
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada /* SM-HBA protocal support */
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada protocol = SAS_SSP_SUPPORT | SAS_SATA_SUPPORT | SAS_SMP_SUPPORT;
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada mptsas_smhba_add_hba_prop(mpt, DATA_TYPE_INT32,
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada MPTSAS_SUPPORTED_PROTOCOL, &protocol);
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada mptsas_smhba_add_hba_prop(mpt, DATA_TYPE_STRING, MPTSAS_MANUFACTURER,
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada mpt->m_MANU_page0.ChipName);
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada mptsas_smhba_add_hba_prop(mpt, DATA_TYPE_STRING, MPTSAS_MODEL_NAME,
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada mpt->m_MANU_page0.BoardName);
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada /*
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada * VPD data is not available, we make a serial number for this.
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada */
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada (void) sprintf(serial_number, "%s%s%s%s%s",
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada mpt->m_MANU_page0.ChipName,
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada mpt->m_MANU_page0.ChipRevision,
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada mpt->m_MANU_page0.BoardName,
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada mpt->m_MANU_page0.BoardAssembly,
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada mpt->m_MANU_page0.BoardTracerNumber);
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada mptsas_smhba_add_hba_prop(mpt, DATA_TYPE_STRING, MPTSAS_SERIAL_NUMBER,
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada &serial_number[0]);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China return (DDI_SUCCESS);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China}