4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh/*
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * CDDL HEADER START
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh *
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * The contents of this file are subject to the terms of the
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * Common Development and Distribution License (the "License").
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * You may not use this file except in compliance with the License.
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh *
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * or http://www.opensolaris.org/os/licensing.
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * See the License for the specific language governing permissions
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * and limitations under the License.
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh *
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * When distributing Covered Code, include this CDDL HEADER in each
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * If applicable, add the following below this CDDL HEADER, with the
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * fields enclosed by brackets "[]" replaced with your own identifying
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * information: Portions Copyright [yyyy] [name of copyright owner]
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh *
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * CDDL HEADER END
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister */
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister/*
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh/*
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * This file contains SM-HBA support for PMC-S driver
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh#include <sys/scsi/adapters/pmcs/pmcs.h>
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhvoid
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhpmcs_smhba_add_hba_prop(pmcs_hw_t *pwp, data_type_t dt,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh char *prop_name, void *prop_val)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh ASSERT(pwp != NULL);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh switch (dt) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case DATA_TYPE_INT32:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (ddi_prop_update_int(DDI_DEV_T_NONE, pwp->dip,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh prop_name, *(int *)prop_val)) {
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh pmcs_prt(pwp, PMCS_PRT_DEBUG, NULL, NULL,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh "%s: %s prop update failed", __func__, prop_name);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case DATA_TYPE_STRING:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (ddi_prop_update_string(DDI_DEV_T_NONE, pwp->dip,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh prop_name, (char *)prop_val)) {
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh pmcs_prt(pwp, PMCS_PRT_DEBUG, NULL, NULL,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh "%s: %s prop update failed", __func__, prop_name);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh default:
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh pmcs_prt(pwp, PMCS_PRT_DEBUG, NULL, NULL, "%s: "
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh "Unhandled datatype(%d) for (%s). Skipping prop update.",
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh __func__, dt, prop_name);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
145e0143b4896d03ce53b1af6787afa1a7e73959dh/*
145e0143b4896d03ce53b1af6787afa1a7e73959dh * Called with iport lock held.
145e0143b4896d03ce53b1af6787afa1a7e73959dh */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhvoid
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhpmcs_smhba_add_iport_prop(pmcs_iport_t *iport, data_type_t dt,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh char *prop_name, void *prop_val)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh ASSERT(iport != NULL);
145e0143b4896d03ce53b1af6787afa1a7e73959dh ASSERT(mutex_owned(&iport->lock));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh switch (dt) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case DATA_TYPE_INT32:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (ddi_prop_update_int(DDI_DEV_T_NONE, iport->dip,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh prop_name, *(int *)prop_val)) {
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh pmcs_prt(iport->pwp, PMCS_PRT_DEBUG, NULL, NULL,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh "%s: %s prop update failed", __func__, prop_name);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case DATA_TYPE_STRING:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (ddi_prop_update_string(DDI_DEV_T_NONE, iport->dip,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh prop_name, (char *)prop_val)) {
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh pmcs_prt(iport->pwp, PMCS_PRT_DEBUG, NULL, NULL,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh "%s: %s prop update failed", __func__, prop_name);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh default:
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh pmcs_prt(iport->pwp, PMCS_PRT_DEBUG, NULL, NULL, "%s: "
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh "Unhandled datatype(%d) for(%s). Skipping prop update.",
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh __func__, dt, prop_name);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
145e0143b4896d03ce53b1af6787afa1a7e73959dh
145e0143b4896d03ce53b1af6787afa1a7e73959dh pmcs_smhba_set_phy_props(iport);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhvoid
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhpmcs_smhba_add_tgt_prop(pmcs_xscsi_t *tgt, data_type_t dt,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh char *prop_name, void *prop_val)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh ASSERT(tgt != NULL);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh switch (dt) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case DATA_TYPE_INT32:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (ddi_prop_update_int(DDI_DEV_T_NONE, tgt->dip,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh prop_name, *(int *)prop_val)) {
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh pmcs_prt(tgt->pwp, PMCS_PRT_DEBUG, NULL, NULL,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh "%s: %s prop update failed", __func__, prop_name);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh case DATA_TYPE_STRING:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (ddi_prop_update_string(DDI_DEV_T_NONE, tgt->dip,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh prop_name, (char *)prop_val)) {
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh pmcs_prt(tgt->pwp, PMCS_PRT_DEBUG, NULL, NULL,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh "%s: %s prop update failed", __func__, prop_name);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh break;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh default:
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh pmcs_prt(tgt->pwp, PMCS_PRT_DEBUG, NULL, NULL, "%s: "
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh "Unhandled datatype(%d) for (%s). Skipping prop update.",
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh __func__, dt, prop_name);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh/* ARGSUSED */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhvoid
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhpmcs_smhba_set_scsi_device_props(pmcs_hw_t *pwp, pmcs_phy_t *pptr,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh struct scsi_device *sd)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
c80dec56debdecfa03d9c0c18755df818e408772David Hollister char *paddr, *addr;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh int ua_form = 1;
c80dec56debdecfa03d9c0c18755df818e408772David Hollister uint64_t wwn, pwwn;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh pmcs_phy_t *pphy;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh pphy = pptr->parent;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (pphy != NULL) {
c80dec56debdecfa03d9c0c18755df818e408772David Hollister paddr = kmem_zalloc(PMCS_MAX_UA_SIZE, KM_SLEEP);
c80dec56debdecfa03d9c0c18755df818e408772David Hollister pwwn = pmcs_barray2wwn(pphy->sas_address);
c80dec56debdecfa03d9c0c18755df818e408772David Hollister (void) scsi_wwn_to_wwnstr(pwwn, ua_form, paddr);
c80dec56debdecfa03d9c0c18755df818e408772David Hollister
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh addr = kmem_zalloc(PMCS_MAX_UA_SIZE, KM_SLEEP);
c80dec56debdecfa03d9c0c18755df818e408772David Hollister wwn = pmcs_barray2wwn(pptr->sas_address);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) scsi_wwn_to_wwnstr(wwn, ua_form, addr);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
c80dec56debdecfa03d9c0c18755df818e408772David Hollister if ((pptr->dtype == SATA) || pptr->virtual) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) scsi_device_prop_update_string(sd,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh SCSI_DEVICE_PROP_PATH,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh SCSI_ADDR_PROP_BRIDGE_PORT, addr);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (pphy->dtype == EXPANDER) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) scsi_device_prop_update_string(sd,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh SCSI_DEVICE_PROP_PATH,
c80dec56debdecfa03d9c0c18755df818e408772David Hollister SCSI_ADDR_PROP_ATTACHED_PORT, paddr);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh kmem_free(addr, PMCS_MAX_UA_SIZE);
c80dec56debdecfa03d9c0c18755df818e408772David Hollister kmem_free(paddr, PMCS_MAX_UA_SIZE);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister if (pptr->dtype != EXPANDER) {
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister (void) scsi_device_prop_update_int(sd,
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister SCSI_DEVICE_PROP_PATH, SCSI_ADDR_PROP_TARGET_PORT_DEPTH,
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister pptr->level);
658280b6253b61dbb155f43d0e3cbcffa85ccb90David Hollister }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhvoid
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhpmcs_smhba_set_phy_props(pmcs_iport_t *iport)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh int i;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh size_t packed_size;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh char *packed_data;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh pmcs_hw_t *pwp = iport->pwp;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh pmcs_phy_t *phy_ptr;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh nvlist_t **phy_props;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh nvlist_t *nvl;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
145e0143b4896d03ce53b1af6787afa1a7e73959dh ASSERT(mutex_owned(&iport->lock));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (iport->nphy == 0) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (nvlist_alloc(&nvl, NV_UNIQUE_NAME, 0) != 0) {
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh pmcs_prt(pwp, PMCS_PRT_DEBUG, NULL, NULL,
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh "%s: nvlist_alloc() failed", __func__);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh phy_props = kmem_zalloc(sizeof (nvlist_t *) * iport->nphy, KM_SLEEP);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh for (phy_ptr = list_head(&iport->phys), i = 0;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh phy_ptr != NULL;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh phy_ptr = list_next(&iport->phys, phy_ptr), i++) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh pmcs_lock_phy(phy_ptr);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) nvlist_alloc(&phy_props[i], NV_UNIQUE_NAME, 0);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) nvlist_add_uint8(phy_props[i], SAS_PHY_ID,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh phy_ptr->phynum);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) nvlist_add_int8(phy_props[i], SAS_NEG_LINK_RATE,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh phy_ptr->link_rate);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) nvlist_add_int8(phy_props[i], SAS_PROG_MIN_LINK_RATE,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh phy_ptr->state.prog_min_rate);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) nvlist_add_int8(phy_props[i], SAS_HW_MIN_LINK_RATE,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh phy_ptr->state.hw_min_rate);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) nvlist_add_int8(phy_props[i], SAS_PROG_MAX_LINK_RATE,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh phy_ptr->state.prog_max_rate);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) nvlist_add_int8(phy_props[i], SAS_HW_MAX_LINK_RATE,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh phy_ptr->state.hw_max_rate);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh pmcs_unlock_phy(phy_ptr);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) nvlist_add_nvlist_array(nvl, SAS_PHY_INFO_NVL, phy_props,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh iport->nphy);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) nvlist_size(nvl, &packed_size, NV_ENCODE_NATIVE);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh packed_data = kmem_zalloc(packed_size, KM_SLEEP);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) nvlist_pack(nvl, &packed_data, &packed_size,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh NV_ENCODE_NATIVE, 0);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) ddi_prop_update_byte_array(DDI_DEV_T_NONE, iport->dip,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh SAS_PHY_INFO, (uchar_t *)packed_data, packed_size);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh for (i = 0; i < iport->nphy && phy_props[i] != NULL; i++) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh nvlist_free(phy_props[i]);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh nvlist_free(nvl);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh kmem_free(phy_props, sizeof (nvlist_t *) * iport->nphy);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh kmem_free(packed_data, packed_size);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh/*
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * Called with PHY lock held on phyp
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhvoid
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhpmcs_smhba_log_sysevent(pmcs_hw_t *pwp, char *subclass, char *etype,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh pmcs_phy_t *phyp)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh{
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh nvlist_t *attr_list;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh char *pname;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh char sas_addr[PMCS_MAX_UA_SIZE];
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh uint8_t phynum = 0;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh uint8_t lrate = 0;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh uint64_t wwn;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh int ua_form = 0;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (pwp->dip == NULL)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (phyp == NULL)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh pname = kmem_zalloc(MAXPATHLEN, KM_NOSLEEP);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (pname == NULL)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if ((strcmp(subclass, ESC_SAS_PHY_EVENT) == 0) ||
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (strcmp(subclass, ESC_SAS_HBA_PORT_BROADCAST) == 0)) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh ASSERT(phyp != NULL);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) strncpy(pname, phyp->path, strlen(phyp->path));
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh phynum = phyp->phynum;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh wwn = pmcs_barray2wwn(phyp->sas_address);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) scsi_wwn_to_wwnstr(wwn, ua_form, sas_addr);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (strcmp(etype, SAS_PHY_ONLINE) == 0) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh lrate = phyp->link_rate;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (strcmp(subclass, ESC_SAS_HBA_PORT_BROADCAST) == 0) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) ddi_pathname(pwp->dip, pname);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (nvlist_alloc(&attr_list, NV_UNIQUE_NAME_TYPE, 0) != 0) {
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh pmcs_prt(pwp, PMCS_PRT_DEBUG, NULL, NULL,
c3bc407cfbd238a18e4728ad5f36f39cecdb062fdh "%s: Failed to post sysevent", __func__);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh kmem_free(pname, MAXPATHLEN);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh return;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (nvlist_add_int32(attr_list, SAS_DRV_INST,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh ddi_get_instance(pwp->dip)) != 0)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh goto fail;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (nvlist_add_string(attr_list, SAS_PORT_ADDR, sas_addr) != 0)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh goto fail;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (nvlist_add_string(attr_list, SAS_DEVFS_PATH, pname) != 0)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh goto fail;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (nvlist_add_uint8(attr_list, SAS_PHY_ID, phynum) != 0)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh goto fail;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (strcmp(etype, SAS_PHY_ONLINE) == 0) {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (nvlist_add_uint8(attr_list, SAS_LINK_RATE, lrate) != 0)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh goto fail;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh }
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh if (nvlist_add_string(attr_list, SAS_EVENT_TYPE, etype) != 0)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh goto fail;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh (void) ddi_log_sysevent(pwp->dip, DDI_VENDOR_SUNW, EC_HBA, subclass,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh attr_list, NULL, DDI_NOSLEEP);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhfail:
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh kmem_free(pname, MAXPATHLEN);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh nvlist_free(attr_list);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}