9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * CDDL HEADER START
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * The contents of this file are subject to the terms of the
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Common Development and Distribution License (the "License").
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * You may not use this file except in compliance with the License.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * or http://www.opensolaris.org/os/licensing.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * See the License for the specific language governing permissions
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * and limitations under the License.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * When distributing Covered Code, include this CDDL HEADER in each
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * If applicable, add the following below this CDDL HEADER, with the
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * fields enclosed by brackets "[]" replaced with your own identifying
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * information: Portions Copyright [yyyy] [name of copyright owner]
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * CDDL HEADER END
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Use is subject to license terms.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#include <kstat.h>
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim#include <sun_sas.h>
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim/*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Retrieves the statistics for a specified port.phy on an adapter
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon KimHBA_STATUS Sun_sasGetPhyStatistics(HBA_HANDLE handle,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_UINT32 port, HBA_UINT32 phy, SMHBA_PHYSTATISTICS *pStatistics) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim const char ROUTINE[] = "Sun_sasGetPhyStatistics";
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim HBA_STATUS status = HBA_STATUS_OK;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim struct sun_sas_hba *hba_ptr;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim struct sun_sas_port *hba_port_ptr;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim struct phy_info *phy_ptr;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim PSMHBA_SASPHYSTATISTICS psas;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim kstat_ctl_t *kc;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim kstat_t *ksp;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim kstat_named_t *kname;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim char *charptr, path[MAXPATHLEN + 1];
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim char *driver_name, kstat_name[256];
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim di_node_t node;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int instance = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim int i;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim uint64_t iport_wwn;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* Validate the arguments */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (pStatistics == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim log(LOG_DEBUG, ROUTINE,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "NULL Phy Statistics buffer of phyIndex: %08lx", phy);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (HBA_STATUS_ERROR_ARG);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim psas = pStatistics->SASPhyStatistics;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (psas == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim log(LOG_DEBUG, ROUTINE,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "NULL SAS Phy Statistics buffer of phyIndex: %08lx", phy);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (HBA_STATUS_ERROR_ARG);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim lock(&all_hbas_lock);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if ((hba_ptr = Retrieve_Sun_sasHandle(handle)) == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim log(LOG_DEBUG, ROUTINE,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "Invalid HBA handler %08lx of phyIndex: %08lx",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim handle, phy);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim unlock(&all_hbas_lock);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (HBA_STATUS_ERROR_INVALID_HANDLE);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* Check for stale data */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim status = verifyAdapter(hba_ptr);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (status != HBA_STATUS_OK) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim log(LOG_DEBUG, ROUTINE,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "Verify Adapter failed for phyIndex: %08lx", phy);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim unlock(&all_hbas_lock);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (status);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (hba_port_ptr = hba_ptr->first_port;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim hba_port_ptr != NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim hba_port_ptr = hba_port_ptr->next) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (hba_port_ptr->index == port) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim break;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (hba_port_ptr == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim log(LOG_DEBUG, ROUTINE,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "Invalid port index of phyIndex: %08lx", phy);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim unlock(&all_hbas_lock);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (HBA_STATUS_ERROR_ILLEGAL_INDEX);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (phy >= hba_port_ptr->port_attributes.PortSpecificAttribute.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim SASPort->NumberofPhys) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim log(LOG_DEBUG, ROUTINE, "Invalid phy index %08lx", phy);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim unlock(&all_hbas_lock);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (HBA_STATUS_ERROR_ILLEGAL_INDEX);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* We need to find out the phy identifier. */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (phy_ptr = hba_port_ptr->first_phy;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim phy_ptr != NULL;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim phy_ptr = phy_ptr->next) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (phy == phy_ptr->index)
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim break;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (phy_ptr == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim log(LOG_DEBUG, ROUTINE, "Invalid phy index %08lx", phy);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim unlock(&all_hbas_lock);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (HBA_STATUS_ERROR_ILLEGAL_INDEX);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * for statistics that are not supported, its bits should all be
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * set to -1
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) memset(pStatistics->SASPhyStatistics, 0xff,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim sizeof (SMHBA_SASPHYSTATISTICS));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* First, we need the deivce path to locate the devinfo node. */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) strlcpy(path, hba_port_ptr->device_path,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim sizeof (path));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim charptr = strrchr(path, ':');
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (charptr) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim *charptr = '\0';
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim errno = 0;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void *) memset(kstat_name, 0, sizeof (kstat_name));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim node = di_init(path, DINFOCPYONE);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (node == DI_NODE_NIL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim di_fini(node);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim log(LOG_DEBUG, ROUTINE,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "Unable to take devinfo snapshot on HBA \"%s\" "
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "for phyIndex: %08lx due to %s",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim path, phy, strerror(errno));
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim unlock(&all_hbas_lock);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (HBA_STATUS_ERROR);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Then we could fetch the instance number and driver name of this
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * device.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim instance = di_instance(node);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (instance == -1) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim di_fini(node);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim log(LOG_DEBUG, ROUTINE,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "An instance number has not been assigned to the "
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "device \"%s\" when get phyIndex: %08lx", path, phy);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim unlock(&all_hbas_lock);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (HBA_STATUS_ERROR);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim driver_name = di_driver_name(node);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (driver_name == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim di_fini(node);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim log(LOG_DEBUG, ROUTINE,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "No driver bound to this device \"%s\" "
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "when get phyIndex: %08lx",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim path, phy);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim unlock(&all_hbas_lock);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (HBA_STATUS_ERROR);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim di_fini(node);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim iport_wwn = wwnConversion(hba_port_ptr->port_attributes.\
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim PortSpecificAttribute.SASPort->LocalSASAddress.wwn);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /*
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim * Construct the kstat name here.
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) snprintf(kstat_name, sizeof (kstat_name), "%s.%016llx.%u.%u",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim driver_name, iport_wwn, instance, phy_ptr->phy.PhyIdentifier);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* retrieve all the statistics from kstat. */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim kc = kstat_open();
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (kc == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim log(LOG_DEBUG, ROUTINE,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "kstat_open failed due to \"%s\" of phyIndex: %08lx",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim strerror(errno), phy);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim unlock(&all_hbas_lock);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (HBA_STATUS_ERROR);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim ksp = kstat_lookup(kc, NULL, -1, kstat_name);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (ksp == NULL) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim log(LOG_DEBUG, ROUTINE,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "No matching kstat name found for \"%s\" "
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "of phyIndex: %08lx",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim kstat_name, phy);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim unlock(&all_hbas_lock);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) kstat_close(kc);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (HBA_STATUS_ERROR);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim /* Found the phy we're looking for. */
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (kstat_read(kc, ksp, NULL) == -1) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim log(LOG_DEBUG, ROUTINE,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "error reading kstat data due to \"%s\" "
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "of phyIndex: %08lx",
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim strerror(errno), phy);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim unlock(&all_hbas_lock);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) kstat_close(kc);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (HBA_STATUS_ERROR);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim kname = (kstat_named_t *)ksp->ks_data;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim for (i = 0; i < ksp->ks_ndata; i++, kname++) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (strcmp(kname->name,
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim "SecondsSinceLastReset") == 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim psas->SecondsSinceLastReset = kname->value.ull;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim continue;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (strcmp(kname->name, "TxFrames") == 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim psas->TxFrames = kname->value.ull;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim continue;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (strcmp(kname->name, "RxFrames") == 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim psas->RxFrames = kname->value.ull;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim continue;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (strcmp(kname->name, "TxWords") == 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim psas->TxWords = kname->value.ull;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim continue;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (strcmp(kname->name, "RxWords") == 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim psas->RxWords = kname->value.ull;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim continue;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (strcmp(kname->name, "InvalidDwordCount") == 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim psas->InvalidDwordCount = kname->value.ull;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim continue;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (strcmp(kname->name, "RunningDisparityErrorCount") == 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim psas->RunningDisparityErrorCount = kname->value.ull;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim continue;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (strcmp(kname->name, "LossofDwordSyncCount") == 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim psas->LossofDwordSyncCount = kname->value.ull;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim continue;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim if (strcmp(kname->name, "PhyResetProblemCount") == 0) {
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim psas->PhyResetProblemCount = kname->value.ull;
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim }
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim unlock(&all_hbas_lock);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim (void) kstat_close(kc);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim return (HBA_STATUS_OK);
9e86db79b7d1bbc5f2f04e99954cbd5eae0e22bbHyon Kim}