d62bc4badc1c1f1549c961cfb8b420e650e1272byz/*
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * CDDL HEADER START
d62bc4badc1c1f1549c961cfb8b420e650e1272byz *
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * The contents of this file are subject to the terms of the
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Common Development and Distribution License (the "License").
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * You may not use this file except in compliance with the License.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz *
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * or http://www.opensolaris.org/os/licensing.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * See the License for the specific language governing permissions
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * and limitations under the License.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz *
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * When distributing Covered Code, include this CDDL HEADER in each
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * If applicable, add the following below this CDDL HEADER, with the
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * fields enclosed by brackets "[]" replaced with your own identifying
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * information: Portions Copyright [yyyy] [name of copyright owner]
d62bc4badc1c1f1549c961cfb8b420e650e1272byz *
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * CDDL HEADER END
d62bc4badc1c1f1549c961cfb8b420e650e1272byz */
d62bc4badc1c1f1549c961cfb8b420e650e1272byz/*
aca118b711d5dc86653e0b3c1a122a6b93a0112dlucy wang - Sun Microsystems - Beijing China * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Use is subject to license terms.
3bc4925d580ab95c16f1ddd5eb387655cbd16e65Garrett D'Amore *
3bc4925d580ab95c16f1ddd5eb387655cbd16e65Garrett D'Amore * Copyright 2015 Garrett D'Amore <garret@damore.org>
d62bc4badc1c1f1549c961cfb8b420e650e1272byz */
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz#include <sys/types.h>
d62bc4badc1c1f1549c961cfb8b420e650e1272byz#include <sys/kstat.h>
d62bc4badc1c1f1549c961cfb8b420e650e1272byz#include <sys/mac.h>
d62bc4badc1c1f1549c961cfb8b420e650e1272byz#include <sys/dls.h>
d62bc4badc1c1f1549c961cfb8b420e650e1272byz#include <sys/softmac_impl.h>
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byztypedef struct i_softmac_stat_info_s {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz uint_t ssi_stat;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz char *ssi_name;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz char *ssi_alias;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz} i_softmac_stat_info_t;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz/*
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Must be the same order as mac_driver_stat.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz */
d62bc4badc1c1f1549c961cfb8b420e650e1272byzstatic i_softmac_stat_info_t i_softmac_driver_si[] = {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz { MAC_STAT_IFSPEED, "ifspeed", "link_speed" },
d62bc4badc1c1f1549c961cfb8b420e650e1272byz { MAC_STAT_MULTIRCV, "multircv", NULL },
d62bc4badc1c1f1549c961cfb8b420e650e1272byz { MAC_STAT_BRDCSTRCV, "brdcstrcv", NULL },
d62bc4badc1c1f1549c961cfb8b420e650e1272byz { MAC_STAT_MULTIXMT, "multixmt", NULL },
d62bc4badc1c1f1549c961cfb8b420e650e1272byz { MAC_STAT_BRDCSTXMT, "brdcstxmt", NULL },
d62bc4badc1c1f1549c961cfb8b420e650e1272byz { MAC_STAT_NORCVBUF, "norcvbuf", "rx_no_buf" },
d62bc4badc1c1f1549c961cfb8b420e650e1272byz { MAC_STAT_IERRORS, "ierrors", NULL },
d62bc4badc1c1f1549c961cfb8b420e650e1272byz { MAC_STAT_UNKNOWNS, "unknowns", NULL },
d62bc4badc1c1f1549c961cfb8b420e650e1272byz { MAC_STAT_NOXMTBUF, "noxmtbuf", "No Txpkt " },
d62bc4badc1c1f1549c961cfb8b420e650e1272byz { MAC_STAT_OERRORS, "oerrors", NULL },
d62bc4badc1c1f1549c961cfb8b420e650e1272byz { MAC_STAT_COLLISIONS, "collisions", NULL },
d62bc4badc1c1f1549c961cfb8b420e650e1272byz { MAC_STAT_RBYTES, "rbytes64", "rbytes" },
d62bc4badc1c1f1549c961cfb8b420e650e1272byz { MAC_STAT_IPACKETS, "ipackets64", "ipackets" },
d62bc4badc1c1f1549c961cfb8b420e650e1272byz { MAC_STAT_OBYTES, "obytes64", "obytes" },
d62bc4badc1c1f1549c961cfb8b420e650e1272byz { MAC_STAT_OPACKETS, "opackets64", "opackets" },
d62bc4badc1c1f1549c961cfb8b420e650e1272byz { MAC_STAT_UNDERFLOWS, "uflo", NULL },
d62bc4badc1c1f1549c961cfb8b420e650e1272byz { MAC_STAT_OVERFLOWS, "oflo", NULL }
d62bc4badc1c1f1549c961cfb8b420e650e1272byz};
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
aca118b711d5dc86653e0b3c1a122a6b93a0112dlucy wang - Sun Microsystems - Beijing China#define SOFTMAC_DRIVER_SI_SZ \
aca118b711d5dc86653e0b3c1a122a6b93a0112dlucy wang - Sun Microsystems - Beijing China (sizeof (i_softmac_driver_si) / sizeof (i_softmac_driver_si[0]))
aca118b711d5dc86653e0b3c1a122a6b93a0112dlucy wang - Sun Microsystems - Beijing China
d62bc4badc1c1f1549c961cfb8b420e650e1272byz/*
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Must be the same order as ether_stat.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz */
d62bc4badc1c1f1549c961cfb8b420e650e1272byzstatic i_softmac_stat_info_t i_softmac_ether_si[] = {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz { ETHER_STAT_ALIGN_ERRORS, "align_errors",
d62bc4badc1c1f1549c961cfb8b420e650e1272byz "alignment_err" },
d62bc4badc1c1f1549c961cfb8b420e650e1272byz { ETHER_STAT_FCS_ERRORS, "fcs_errors", "crc_err" },
d62bc4badc1c1f1549c961cfb8b420e650e1272byz { ETHER_STAT_FIRST_COLLISIONS, "first_collisions", NULL },
d62bc4badc1c1f1549c961cfb8b420e650e1272byz { ETHER_STAT_MULTI_COLLISIONS, "multi_collisions", NULL },
d62bc4badc1c1f1549c961cfb8b420e650e1272byz { ETHER_STAT_SQE_ERRORS, "sqe_errors", NULL },
d62bc4badc1c1f1549c961cfb8b420e650e1272byz { ETHER_STAT_DEFER_XMTS, "defer_xmts", NULL },
d62bc4badc1c1f1549c961cfb8b420e650e1272byz { ETHER_STAT_TX_LATE_COLLISIONS, "tx_late_collisions",
d62bc4badc1c1f1549c961cfb8b420e650e1272byz "late_collisions" },
d62bc4badc1c1f1549c961cfb8b420e650e1272byz { ETHER_STAT_EX_COLLISIONS, "ex_collisions",
d62bc4badc1c1f1549c961cfb8b420e650e1272byz "excessive_collisions" },
d62bc4badc1c1f1549c961cfb8b420e650e1272byz { ETHER_STAT_MACXMT_ERRORS, "macxmt_errors", NULL },
d62bc4badc1c1f1549c961cfb8b420e650e1272byz { ETHER_STAT_CARRIER_ERRORS, "carrier_errors", NULL },
d62bc4badc1c1f1549c961cfb8b420e650e1272byz { ETHER_STAT_TOOLONG_ERRORS, "toolong_errors", "length_err" },
d62bc4badc1c1f1549c961cfb8b420e650e1272byz { ETHER_STAT_MACRCV_ERRORS, "macrcv_errors",
d62bc4badc1c1f1549c961cfb8b420e650e1272byz "Rx Error Count" },
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz { ETHER_STAT_XCVR_ADDR, "xcvr_addr", NULL },
d62bc4badc1c1f1549c961cfb8b420e650e1272byz { ETHER_STAT_XCVR_ID, "xcvr_id", NULL },
d62bc4badc1c1f1549c961cfb8b420e650e1272byz { ETHER_STAT_XCVR_INUSE, "xcvr_inuse", NULL },
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz { ETHER_STAT_CAP_1000FDX, "cap_1000fdx", NULL },
d62bc4badc1c1f1549c961cfb8b420e650e1272byz { ETHER_STAT_CAP_1000HDX, "cap_1000hdx", NULL },
d62bc4badc1c1f1549c961cfb8b420e650e1272byz { ETHER_STAT_CAP_100FDX, "cap_100fdx", NULL },
d62bc4badc1c1f1549c961cfb8b420e650e1272byz { ETHER_STAT_CAP_100HDX, "cap_100hdx", NULL },
d62bc4badc1c1f1549c961cfb8b420e650e1272byz { ETHER_STAT_CAP_10FDX, "cap_10fdx", NULL },
d62bc4badc1c1f1549c961cfb8b420e650e1272byz { ETHER_STAT_CAP_10HDX, "cap_10hdx", NULL },
d62bc4badc1c1f1549c961cfb8b420e650e1272byz { ETHER_STAT_CAP_ASMPAUSE, "cap_asmpause", NULL },
d62bc4badc1c1f1549c961cfb8b420e650e1272byz { ETHER_STAT_CAP_PAUSE, "cap_pause", NULL },
d62bc4badc1c1f1549c961cfb8b420e650e1272byz { ETHER_STAT_CAP_AUTONEG, "cap_autoneg", NULL },
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz { ETHER_STAT_ADV_CAP_1000FDX, "adv_cap_1000fdx", NULL },
d62bc4badc1c1f1549c961cfb8b420e650e1272byz { ETHER_STAT_ADV_CAP_1000HDX, "adv_cap_1000hdx", NULL },
d62bc4badc1c1f1549c961cfb8b420e650e1272byz { ETHER_STAT_ADV_CAP_100FDX, "adv_cap_100fdx", NULL },
d62bc4badc1c1f1549c961cfb8b420e650e1272byz { ETHER_STAT_ADV_CAP_100HDX, "adv_cap_100hdx", NULL },
d62bc4badc1c1f1549c961cfb8b420e650e1272byz { ETHER_STAT_ADV_CAP_10FDX, "adv_cap_10fdx", NULL },
d62bc4badc1c1f1549c961cfb8b420e650e1272byz { ETHER_STAT_ADV_CAP_10HDX, "adv_cap_10hdx", NULL },
d62bc4badc1c1f1549c961cfb8b420e650e1272byz { ETHER_STAT_ADV_CAP_ASMPAUSE, "adv_cap_asmpause", NULL },
d62bc4badc1c1f1549c961cfb8b420e650e1272byz { ETHER_STAT_ADV_CAP_PAUSE, "adv_cap_pause", NULL },
d62bc4badc1c1f1549c961cfb8b420e650e1272byz { ETHER_STAT_ADV_CAP_AUTONEG, "adv_cap_autoneg", NULL },
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz { ETHER_STAT_LP_CAP_1000FDX, "lp_cap_1000fdx", NULL },
d62bc4badc1c1f1549c961cfb8b420e650e1272byz { ETHER_STAT_LP_CAP_1000HDX, "lp_cap_1000hdx", NULL },
d62bc4badc1c1f1549c961cfb8b420e650e1272byz { ETHER_STAT_LP_CAP_100FDX, "lp_cap_100fdx", NULL },
d62bc4badc1c1f1549c961cfb8b420e650e1272byz { ETHER_STAT_LP_CAP_100HDX, "lp_cap_100hdx", NULL },
d62bc4badc1c1f1549c961cfb8b420e650e1272byz { ETHER_STAT_LP_CAP_10FDX, "lp_cap_10fdx", NULL },
d62bc4badc1c1f1549c961cfb8b420e650e1272byz { ETHER_STAT_LP_CAP_10HDX, "lp_cap_10hdx", NULL },
d62bc4badc1c1f1549c961cfb8b420e650e1272byz { ETHER_STAT_LP_CAP_ASMPAUSE, "lp_cap_asmpause", NULL },
d62bc4badc1c1f1549c961cfb8b420e650e1272byz { ETHER_STAT_LP_CAP_PAUSE, "lp_cap_pause", NULL },
d62bc4badc1c1f1549c961cfb8b420e650e1272byz { ETHER_STAT_LP_CAP_AUTONEG, "lp_cap_autoneg", NULL },
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz { ETHER_STAT_LINK_ASMPAUSE, "link_asmpause", NULL },
d62bc4badc1c1f1549c961cfb8b420e650e1272byz { ETHER_STAT_LINK_PAUSE, "link_pause", NULL },
d62bc4badc1c1f1549c961cfb8b420e650e1272byz { ETHER_STAT_LINK_AUTONEG, "link_autoneg", NULL },
d62bc4badc1c1f1549c961cfb8b420e650e1272byz { ETHER_STAT_LINK_DUPLEX, "link_duplex", "duplex" },
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz { ETHER_STAT_TOOSHORT_ERRORS, "runt_errors", NULL },
d62bc4badc1c1f1549c961cfb8b420e650e1272byz { ETHER_STAT_CAP_REMFAULT, "cap_rem_fault", NULL },
d62bc4badc1c1f1549c961cfb8b420e650e1272byz { ETHER_STAT_ADV_REMFAULT, "adv_rem_fault", NULL },
d62bc4badc1c1f1549c961cfb8b420e650e1272byz { ETHER_STAT_LP_REMFAULT, "lp_rem_fault", NULL },
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz { ETHER_STAT_JABBER_ERRORS, "jabber_errors", NULL },
d62bc4badc1c1f1549c961cfb8b420e650e1272byz { ETHER_STAT_CAP_100T4, "cap_100T4", NULL },
d62bc4badc1c1f1549c961cfb8b420e650e1272byz { ETHER_STAT_ADV_CAP_100T4, "adv_cap_100T4", NULL },
3bc4925d580ab95c16f1ddd5eb387655cbd16e65Garrett D'Amore { ETHER_STAT_LP_CAP_100T4, "lp_cap_100T4", NULL },
aca118b711d5dc86653e0b3c1a122a6b93a0112dlucy wang - Sun Microsystems - Beijing China
aca118b711d5dc86653e0b3c1a122a6b93a0112dlucy wang - Sun Microsystems - Beijing China { ETHER_STAT_CAP_10GFDX, "cap_10gfdx", NULL },
aca118b711d5dc86653e0b3c1a122a6b93a0112dlucy wang - Sun Microsystems - Beijing China { ETHER_STAT_ADV_CAP_10GFDX, "adv_cap_10gfdx", NULL },
3bc4925d580ab95c16f1ddd5eb387655cbd16e65Garrett D'Amore { ETHER_STAT_LP_CAP_1000FDX, "lp_cap_10gfdx", NULL },
3bc4925d580ab95c16f1ddd5eb387655cbd16e65Garrett D'Amore
3bc4925d580ab95c16f1ddd5eb387655cbd16e65Garrett D'Amore { ETHER_STAT_CAP_40GFDX, "cap_40gfdx", NULL },
3bc4925d580ab95c16f1ddd5eb387655cbd16e65Garrett D'Amore { ETHER_STAT_ADV_CAP_40GFDX, "adv_cap_40gfdx", NULL },
3bc4925d580ab95c16f1ddd5eb387655cbd16e65Garrett D'Amore { ETHER_STAT_LP_CAP_40GFDX, "lp_cap_40gfdx", NULL },
3bc4925d580ab95c16f1ddd5eb387655cbd16e65Garrett D'Amore
3bc4925d580ab95c16f1ddd5eb387655cbd16e65Garrett D'Amore { ETHER_STAT_CAP_100GFDX, "cap_100gfdx", NULL },
3bc4925d580ab95c16f1ddd5eb387655cbd16e65Garrett D'Amore { ETHER_STAT_ADV_CAP_100GFDX, "adv_cap_100gfdx", NULL },
3bc4925d580ab95c16f1ddd5eb387655cbd16e65Garrett D'Amore { ETHER_STAT_LP_CAP_100GFDX, "lp_cap_100gfdx", NULL },
3bc4925d580ab95c16f1ddd5eb387655cbd16e65Garrett D'Amore
3bc4925d580ab95c16f1ddd5eb387655cbd16e65Garrett D'Amore { ETHER_STAT_CAP_2500FDX, "cap_2500fdx", NULL },
3bc4925d580ab95c16f1ddd5eb387655cbd16e65Garrett D'Amore { ETHER_STAT_ADV_CAP_2500FDX, "adv_cap_2500fdx", NULL },
3bc4925d580ab95c16f1ddd5eb387655cbd16e65Garrett D'Amore { ETHER_STAT_LP_CAP_2500FDX, "lp_cap_2500fdx", NULL },
3bc4925d580ab95c16f1ddd5eb387655cbd16e65Garrett D'Amore
3bc4925d580ab95c16f1ddd5eb387655cbd16e65Garrett D'Amore { ETHER_STAT_CAP_5000FDX, "cap_5000fdx", NULL },
3bc4925d580ab95c16f1ddd5eb387655cbd16e65Garrett D'Amore { ETHER_STAT_ADV_CAP_5000FDX, "adv_cap_5000fdx", NULL },
3bc4925d580ab95c16f1ddd5eb387655cbd16e65Garrett D'Amore { ETHER_STAT_LP_CAP_5000FDX, "lp_cap_5000fdx", NULL },
d62bc4badc1c1f1549c961cfb8b420e650e1272byz};
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
aca118b711d5dc86653e0b3c1a122a6b93a0112dlucy wang - Sun Microsystems - Beijing China#define SOFTMAC_ETHER_SI_SZ \
aca118b711d5dc86653e0b3c1a122a6b93a0112dlucy wang - Sun Microsystems - Beijing China (sizeof (i_softmac_ether_si) / sizeof (i_softmac_ether_si[0]))
aca118b711d5dc86653e0b3c1a122a6b93a0112dlucy wang - Sun Microsystems - Beijing China
d62bc4badc1c1f1549c961cfb8b420e650e1272byzstatic kstat_t *softmac_hold_dev_kstat(softmac_t *);
d62bc4badc1c1f1549c961cfb8b420e650e1272byzstatic void softmac_rele_dev_kstat(kstat_t *);
d62bc4badc1c1f1549c961cfb8b420e650e1272byzstatic int softmac_get_kstat(kstat_t *, char *, uint64_t *);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byzstatic kstat_t *
d62bc4badc1c1f1549c961cfb8b420e650e1272byzsoftmac_hold_dev_kstat(softmac_t *softmac)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz{
d62bc4badc1c1f1549c961cfb8b420e650e1272byz char drv[MAXLINKNAMELEN];
d62bc4badc1c1f1549c961cfb8b420e650e1272byz uint_t ppa;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz kstat_t *ksp;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if (ddi_parse(softmac->smac_devname, drv, &ppa) != DDI_SUCCESS)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (NULL);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz /*
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Find the kstat by the module name and the instance number.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz */
d62bc4badc1c1f1549c961cfb8b420e650e1272byz ksp = kstat_hold_byname(drv, ppa, softmac->smac_devname, ALL_ZONES);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if (ksp != NULL) {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz KSTAT_ENTER(ksp);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if ((ksp->ks_data != NULL) &&
d62bc4badc1c1f1549c961cfb8b420e650e1272byz (ksp->ks_type == KSTAT_TYPE_NAMED)) {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz /*
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Update the kstat to get the latest statistics.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz */
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if (KSTAT_UPDATE(ksp, KSTAT_READ) == 0)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (ksp);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz }
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz KSTAT_EXIT(ksp);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz kstat_rele(ksp);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz }
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (NULL);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz}
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byzstatic void
d62bc4badc1c1f1549c961cfb8b420e650e1272byzsoftmac_rele_dev_kstat(kstat_t *ksp)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz{
d62bc4badc1c1f1549c961cfb8b420e650e1272byz KSTAT_EXIT(ksp);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz kstat_rele(ksp);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz}
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz/*
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * The kstat needs to be held when calling this function.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz */
d62bc4badc1c1f1549c961cfb8b420e650e1272byzstatic int
d62bc4badc1c1f1549c961cfb8b420e650e1272byzsoftmac_get_kstat(kstat_t *ksp, char *name, uint64_t *valp)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz{
d62bc4badc1c1f1549c961cfb8b420e650e1272byz kstat_named_t *knp;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz int i;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz int ret = ENOTSUP;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if (name == NULL)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (ret);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz /*
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Search the kstat with the given name.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz */
d62bc4badc1c1f1549c961cfb8b420e650e1272byz for (i = 0, knp = KSTAT_NAMED_PTR(ksp); i < ksp->ks_ndata; i++, knp++) {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if (strcmp(knp->name, name) == 0) {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz switch (knp->data_type) {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz case KSTAT_DATA_INT32:
d62bc4badc1c1f1549c961cfb8b420e650e1272byz case KSTAT_DATA_UINT32:
d62bc4badc1c1f1549c961cfb8b420e650e1272byz *valp = (uint64_t)(knp->value.ui32);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz ret = 0;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz break;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz case KSTAT_DATA_INT64:
d62bc4badc1c1f1549c961cfb8b420e650e1272byz case KSTAT_DATA_UINT64:
d62bc4badc1c1f1549c961cfb8b420e650e1272byz *valp = knp->value.ui64;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz ret = 0;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz break;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz#ifdef _LP64
d62bc4badc1c1f1549c961cfb8b420e650e1272byz case KSTAT_DATA_LONG:
d62bc4badc1c1f1549c961cfb8b420e650e1272byz case KSTAT_DATA_ULONG:
d62bc4badc1c1f1549c961cfb8b420e650e1272byz *valp = (uint64_t)knp->value.ul;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz ret = 0;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz break;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz#endif
d62bc4badc1c1f1549c961cfb8b420e650e1272byz case KSTAT_DATA_CHAR:
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if (strcmp(name, "duplex") != 0)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz break;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if (strncmp(knp->value.c, "full", 4) == 0)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz *valp = LINK_DUPLEX_FULL;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz else if (strncmp(knp->value.c, "half", 4) == 0)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz *valp = LINK_DUPLEX_HALF;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz else
d62bc4badc1c1f1549c961cfb8b420e650e1272byz *valp = LINK_DUPLEX_UNKNOWN;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz ret = 0;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz break;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz }
d62bc4badc1c1f1549c961cfb8b420e650e1272byz break;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz }
d62bc4badc1c1f1549c961cfb8b420e650e1272byz }
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (ret);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz}
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byzint
d62bc4badc1c1f1549c961cfb8b420e650e1272byzsoftmac_m_stat(void *arg, uint_t stat, uint64_t *val)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz{
d62bc4badc1c1f1549c961cfb8b420e650e1272byz softmac_t *softmac = arg;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz kstat_t *ksp;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz uint_t index;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz int ret;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if ((ksp = softmac_hold_dev_kstat(softmac)) == NULL)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (ENOTSUP);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if (IS_MAC_STAT(stat)) {
aca118b711d5dc86653e0b3c1a122a6b93a0112dlucy wang - Sun Microsystems - Beijing China i_softmac_stat_info_t *ssip = NULL;
aca118b711d5dc86653e0b3c1a122a6b93a0112dlucy wang - Sun Microsystems - Beijing China
aca118b711d5dc86653e0b3c1a122a6b93a0112dlucy wang - Sun Microsystems - Beijing China for (index = 0; index < SOFTMAC_DRIVER_SI_SZ; index++) {
aca118b711d5dc86653e0b3c1a122a6b93a0112dlucy wang - Sun Microsystems - Beijing China if (stat == i_softmac_driver_si[index].ssi_stat) {
aca118b711d5dc86653e0b3c1a122a6b93a0112dlucy wang - Sun Microsystems - Beijing China ssip = &i_softmac_driver_si[index];
aca118b711d5dc86653e0b3c1a122a6b93a0112dlucy wang - Sun Microsystems - Beijing China break;
aca118b711d5dc86653e0b3c1a122a6b93a0112dlucy wang - Sun Microsystems - Beijing China }
aca118b711d5dc86653e0b3c1a122a6b93a0112dlucy wang - Sun Microsystems - Beijing China }
aca118b711d5dc86653e0b3c1a122a6b93a0112dlucy wang - Sun Microsystems - Beijing China
aca118b711d5dc86653e0b3c1a122a6b93a0112dlucy wang - Sun Microsystems - Beijing China if (ssip == NULL) {
aca118b711d5dc86653e0b3c1a122a6b93a0112dlucy wang - Sun Microsystems - Beijing China ret = ENOTSUP;
aca118b711d5dc86653e0b3c1a122a6b93a0112dlucy wang - Sun Microsystems - Beijing China } else {
aca118b711d5dc86653e0b3c1a122a6b93a0112dlucy wang - Sun Microsystems - Beijing China if ((ret = softmac_get_kstat(ksp, ssip->ssi_name,
aca118b711d5dc86653e0b3c1a122a6b93a0112dlucy wang - Sun Microsystems - Beijing China val)) != 0)
aca118b711d5dc86653e0b3c1a122a6b93a0112dlucy wang - Sun Microsystems - Beijing China ret = softmac_get_kstat(ksp, ssip->ssi_alias,
aca118b711d5dc86653e0b3c1a122a6b93a0112dlucy wang - Sun Microsystems - Beijing China val);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz }
d62bc4badc1c1f1549c961cfb8b420e650e1272byz } else {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz ASSERT(IS_MACTYPE_STAT(stat));
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz switch (softmac->smac_media) {
aca118b711d5dc86653e0b3c1a122a6b93a0112dlucy wang - Sun Microsystems - Beijing China case DL_ETHER: {
aca118b711d5dc86653e0b3c1a122a6b93a0112dlucy wang - Sun Microsystems - Beijing China i_softmac_stat_info_t *ssip = NULL;
aca118b711d5dc86653e0b3c1a122a6b93a0112dlucy wang - Sun Microsystems - Beijing China
aca118b711d5dc86653e0b3c1a122a6b93a0112dlucy wang - Sun Microsystems - Beijing China for (index = 0; index < SOFTMAC_ETHER_SI_SZ; index++) {
aca118b711d5dc86653e0b3c1a122a6b93a0112dlucy wang - Sun Microsystems - Beijing China if (stat ==
aca118b711d5dc86653e0b3c1a122a6b93a0112dlucy wang - Sun Microsystems - Beijing China i_softmac_ether_si[index].ssi_stat) {
aca118b711d5dc86653e0b3c1a122a6b93a0112dlucy wang - Sun Microsystems - Beijing China ssip = &i_softmac_ether_si[index];
aca118b711d5dc86653e0b3c1a122a6b93a0112dlucy wang - Sun Microsystems - Beijing China break;
aca118b711d5dc86653e0b3c1a122a6b93a0112dlucy wang - Sun Microsystems - Beijing China }
d62bc4badc1c1f1549c961cfb8b420e650e1272byz }
aca118b711d5dc86653e0b3c1a122a6b93a0112dlucy wang - Sun Microsystems - Beijing China
aca118b711d5dc86653e0b3c1a122a6b93a0112dlucy wang - Sun Microsystems - Beijing China if (ssip == NULL) {
aca118b711d5dc86653e0b3c1a122a6b93a0112dlucy wang - Sun Microsystems - Beijing China ret = ENOTSUP;
aca118b711d5dc86653e0b3c1a122a6b93a0112dlucy wang - Sun Microsystems - Beijing China } else {
aca118b711d5dc86653e0b3c1a122a6b93a0112dlucy wang - Sun Microsystems - Beijing China if ((ret = softmac_get_kstat(ksp,
aca118b711d5dc86653e0b3c1a122a6b93a0112dlucy wang - Sun Microsystems - Beijing China ssip->ssi_name, val)) != 0)
aca118b711d5dc86653e0b3c1a122a6b93a0112dlucy wang - Sun Microsystems - Beijing China ret = softmac_get_kstat(ksp,
aca118b711d5dc86653e0b3c1a122a6b93a0112dlucy wang - Sun Microsystems - Beijing China ssip->ssi_alias, val);
aca118b711d5dc86653e0b3c1a122a6b93a0112dlucy wang - Sun Microsystems - Beijing China }
aca118b711d5dc86653e0b3c1a122a6b93a0112dlucy wang - Sun Microsystems - Beijing China
d62bc4badc1c1f1549c961cfb8b420e650e1272byz break;
aca118b711d5dc86653e0b3c1a122a6b93a0112dlucy wang - Sun Microsystems - Beijing China }
d62bc4badc1c1f1549c961cfb8b420e650e1272byz default:
d62bc4badc1c1f1549c961cfb8b420e650e1272byz ret = ENOTSUP;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz break;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz }
d62bc4badc1c1f1549c961cfb8b420e650e1272byz }
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz softmac_rele_dev_kstat(ksp);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (ret);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz}