blob: 62c8f88ecf7b3c8f8687f783e7625233c93cf2c0 [file] [log] [blame]
/*
* Availability support functions
*
* Broadcom Proprietary and Confidential. Copyright (C) 2017,
* All Rights Reserved.
*
* This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom;
* the contents of this file may not be disclosed to third parties, copied
* or duplicated in any form, in whole or in part, without the prior
* written permission of Broadcom.
*
* <<Broadcom-WL-IPTag/Proprietary:>>
*
* $Id: $
*/
#include <bcmendian.h>
#include "wlu_common.h"
#include <bcmutils.h>
#include <wlioctl.h>
#include <wlioctl_utils.h>
#include "wlu_cmd.h"
#include "wlu.h"
#define CAT_TX (1<<0) /**< counter is transmit related */
#define CAT_RX (1<<1) /**< counter is receive related */
#define CAT_ERR (1<<2) /**< counter signals a non optimal condition */
#define CAT_UCAST (1<<3) /**< unicast specific counter */
#define CAT_MCAST (1<<4) /**< multicast or broadcast specific counter */
#define CAT_AMPDU (1<<5) /**< AMPDU specific counter */
#define CAT_UCODE (1<<6) /**< Counter is generated by ucode (contained in SHM in d11 core) */
#define CAT_CTRL (1<<7) /**< Counters related to d11 control or mgmt frames */
#define CAT_SEC (1<<8) /**< Counters related to security/encryption */
#define CAT_ASSOC (1<<9) /**< Counters related to authentication/association */
#define PRINIT() prcnt_init()
#define PRNL1() prcnt_prnl1(p_cnt_filters)
#define PRFMT1(name) #name " %u " /* converts into the 'default' counters printf format string */
/** prints one string without arguments */
#define PRSTR(name, str) \
if (prcnt_filter1(p_cnt_filters, #name)) { \
printf("%s", str); \
at_start_of_line = FALSE; \
}
/** prints one variable with dtoh32 conversion */
#define PRVALV1(name) \
if (prcnt_filter(p_cnt_filters, #name, cnt_v1->name)) { \
printf(PRFMT1(name), dtoh32(cnt_v1->name)); \
at_start_of_line = FALSE; \
}
#define PRVAL(name) \
if (prcnt_filter(p_cnt_filters, #name, cnt->name)) { \
printf(PRFMT1(name), dtoh32(cnt->name)); \
at_start_of_line = FALSE; \
}
/** prints one variable with dtoh32 conversion */
#define PRVAL_RENAME(name, prname) \
if (prcnt_filter(p_cnt_filters, #name, cnt->name)) { \
printf(PRFMT1(prname), dtoh32(cnt->name)); \
at_start_of_line = FALSE; \
}
/** Safe value print for only valid counter values, and when the counter is within len */
#define PRVALSF(name) \
if ((dtoh32(cnt->name) != INVALID_CNT_VAL) && \
(len > ((uint8 *)&cnt->name - (uint8 *)cnt))) \
PRVAL(name)
/** prints one variable with dtoh32 conversion */
#define PRVALSF_RENAME(varname, prname) \
if (dtoh32(cnt->varname) != INVALID_CNT_VAL) \
PRVAL_RENAME(varname, prname)
/** prints one variable with dtoh32 conversion */
#define PRVAL_FMTSTR1(varname, fmtstring, value) \
if (prcnt_filter(p_cnt_filters, #varname, value)) { \
printf(fmtstring, value); \
at_start_of_line = FALSE; \
}
/** prints two variables, no dtoh32 conversion */
#define PRVAL_FMTSTR2(varname, fmtstring, value1, value2) \
if (prcnt_filter(p_cnt_filters, #varname, value2)) { \
printf(fmtstring, value1, value2); \
at_start_of_line = FALSE; \
}
/** prints one float variable without dtoh32 conversion */
#define PRVAL_FMTSTR1F(varname, fmtstring, value1) \
if (prcnt_filter(p_cnt_filters, #varname, value1 != 0.0 ? TRUE : FALSE)) { \
printf(fmtstring, value1); \
at_start_of_line = FALSE; \
}
#define PRCNT_MACSTAT_TX_VER_GE11 \
do { \
/* UCODE SHM counters */ \
/* tx start and those that do not end well */ \
PRVAL(txallfrm); PRVAL(txbcnfrm); PRVAL(txrtsfrm); PRVAL(txctsfrm); \
PRVAL(txackfrm); PRVAL(txback); PRVAL(txdnlfrm); PRNL1(); \
PRVAL(txampdu); PRVAL(txmpdu); PRVAL(txucast); \
PRVAL(rxrsptmout); PRVAL(txinrtstxop); PRVAL(txrtsfail); PRNL1(); \
PRVAL_FMTSTR1F(txper_ucastdt, "txper_ucastdt %.1f%% ", \
cnt->txucast > 0 ? \
(float)(1000 - ((cnt->rxackucast + cnt->rxback) * 1000 \
/ cnt->txucast))/10 : 0); \
PRVAL_FMTSTR1F(txper_rts, "txper_rts %.1f%%", \
cnt->txrtsfrm > 0 ? \
(float)(1000 - (cnt->rxctsucast * 1000 \
/ cnt->txrtsfrm))/10 : 0); \
PRNL1(); \
PRSTR(txfunfl, "txfunfl: "); \
for (i = 0; i < NFIFO; i++) { \
PRVAL_FMTSTR1(txfunfl, "%u ", cnt->txfunfl[i]); \
} \
PRVAL(txtplunfl); PRVAL(txphyerror); PRNL1(); PRNL1(); \
} while (0)
#define PRCNT_MACSTAT_RX_VER_GE11 \
do { \
/* rx with goodfcs */ \
PRVAL(rxctlucast); PRVAL(rxrtsucast); PRVAL(rxctsucast); \
PRVAL(rxackucast); PRVAL(rxback); PRNL1(); \
PRVAL(rxbeaconmbss); PRVAL(rxdtucastmbss); \
PRVAL(rxmgucastmbss); PRNL1(); \
PRVAL(rxbeaconobss); PRVAL(rxdtucastobss); PRVAL(rxdtocast); \
PRVAL(rxmgocast); PRNL1(); \
PRVAL(rxctlocast); PRVAL(rxrtsocast); PRVAL(rxctsocast); PRNL1(); \
PRVAL(rxctlmcast); PRVAL(rxdtmcast); PRVAL(rxmgmcast); PRNL1(); PRNL1(); \
\
PRVAL(rxcgprqfrm); PRVAL(rxcgprsqovfl); PRVAL(txcgprsfail); \
PRVAL(txcgprssuc); PRVAL(prs_timeout); PRNL1(); \
PRVAL(pktengrxducast); PRVAL(pktengrxdmcast); \
PRVAL(bcntxcancl); \
} while (0)
extern int wlu_var_getbuf_minimal(void *wl, const char *iovar, void *param, int param_len,
void **bufptr);
/** specifies filters to apply when printing counters */
struct cnt_filters_s {
bool nonzero; /**< only print nonzero counter values */
bool filters_active; /**< FALSE when user did not supply cmd line options */
bool invert_selection; /**< inverts entire selection */
uint32 filter; /**< only print counters falling into these categorie(s). Ignored if 0. */
};
typedef struct {
char **pbuf_ptr;
uint32 cntr_ver;
struct cnt_filters_s cnt_filters; /**< specifies filters to apply when printing counters */
} wl_cnt_cbfn_info_t;
typedef struct counter_offset_info {
const char *name; /* Name for the counter */
uint32 offset; /* Offset of the counter in structure */
} counter_offset_info_t;
typedef struct ver_to_cntr_offset_info {
counter_offset_info_t *offset_info_tbl;
uint32 cntr_ver;
} ver_to_cntr_offset_info_t;
/** specifies properties of each counter, so it can be optionally not printed on a criterium */
struct cnt_properties_s {
char *name;
uint32 categories; /**< a bitmask, '1' means that counter is a member of that category */
};
static counter_offset_info_t cntr_offset_info_v6[] = {
{"txframe", OFFSETOF(wl_cnt_ver_6_t, txframe)},
{"txbyte", OFFSETOF(wl_cnt_ver_6_t, txbyte)},
{"txretrans", OFFSETOF(wl_cnt_ver_6_t, txretrans)},
{"txerror", OFFSETOF(wl_cnt_ver_6_t, txerror)},
{"txctl", OFFSETOF(wl_cnt_ver_6_t, txctl)},
{"txprshort", OFFSETOF(wl_cnt_ver_6_t, txprshort)},
{"txserr", OFFSETOF(wl_cnt_ver_6_t, txserr)},
{"txnobuf", OFFSETOF(wl_cnt_ver_6_t, txnobuf)},
{"txnoassoc", OFFSETOF(wl_cnt_ver_6_t, txnoassoc)},
{"txrunt", OFFSETOF(wl_cnt_ver_6_t, txrunt)},
{"txchit", OFFSETOF(wl_cnt_ver_6_t, txchit)},
{"txcmiss", OFFSETOF(wl_cnt_ver_6_t, txcmiss)},
{"txuflo", OFFSETOF(wl_cnt_ver_6_t, txuflo)},
{"txphyerr", OFFSETOF(wl_cnt_ver_6_t, txphyerr)},
{"txphycrs", OFFSETOF(wl_cnt_ver_6_t, txphycrs)},
{"rxframe", OFFSETOF(wl_cnt_ver_6_t, rxframe)},
{"rxbyte", OFFSETOF(wl_cnt_ver_6_t, rxbyte)},
{"rxerror", OFFSETOF(wl_cnt_ver_6_t, rxerror)},
{"rxctl", OFFSETOF(wl_cnt_ver_6_t, rxctl)},
{"rxnobuf", OFFSETOF(wl_cnt_ver_6_t, rxnobuf)},
{"rxnondata", OFFSETOF(wl_cnt_ver_6_t, rxnondata)},
{"rxbadds", OFFSETOF(wl_cnt_ver_6_t, rxbadds)},
{"rxbadcm", OFFSETOF(wl_cnt_ver_6_t, rxbadcm)},
{"rxfragerr", OFFSETOF(wl_cnt_ver_6_t, rxfragerr)},
{"rxrunt", OFFSETOF(wl_cnt_ver_6_t, rxrunt)},
{"rxgiant", OFFSETOF(wl_cnt_ver_6_t, rxgiant)},
{"rxnoscb", OFFSETOF(wl_cnt_ver_6_t, rxnoscb)},
{"rxbadproto", OFFSETOF(wl_cnt_ver_6_t, rxbadproto)},
{"rxbadsrcmac", OFFSETOF(wl_cnt_ver_6_t, rxbadsrcmac)},
{"rxbadda", OFFSETOF(wl_cnt_ver_6_t, rxbadda)},
{"rxfilter", OFFSETOF(wl_cnt_ver_6_t, rxfilter)},
{"rxoflo", OFFSETOF(wl_cnt_ver_6_t, rxoflo)},
{"rxuflo[0]", OFFSETOF(wl_cnt_ver_6_t, rxuflo[0])},
{"rxuflo[1]", OFFSETOF(wl_cnt_ver_6_t, rxuflo[1])},
{"rxuflo[2]", OFFSETOF(wl_cnt_ver_6_t, rxuflo[2])},
{"rxuflo[3]", OFFSETOF(wl_cnt_ver_6_t, rxuflo[3])},
{"rxuflo[4]", OFFSETOF(wl_cnt_ver_6_t, rxuflo[4])},
{"rxuflo[5]", OFFSETOF(wl_cnt_ver_6_t, rxuflo[5])},
{"d11cnt_txrts_off", OFFSETOF(wl_cnt_ver_6_t, d11cnt_txrts_off)},
{"d11cnt_rxcrc_off", OFFSETOF(wl_cnt_ver_6_t, d11cnt_rxcrc_off)},
{"d11cnt_txnocts_off", OFFSETOF(wl_cnt_ver_6_t, d11cnt_txnocts_off)},
{"dmade", OFFSETOF(wl_cnt_ver_6_t, dmade)},
{"dmada", OFFSETOF(wl_cnt_ver_6_t, dmada)},
{"dmape", OFFSETOF(wl_cnt_ver_6_t, dmape)},
{"reset", OFFSETOF(wl_cnt_ver_6_t, reset)},
{"tbtt", OFFSETOF(wl_cnt_ver_6_t, tbtt)},
{"txdmawar", OFFSETOF(wl_cnt_ver_6_t, txdmawar)},
{"pkt_callback_reg_fail", OFFSETOF(wl_cnt_ver_6_t, pkt_callback_reg_fail)},
{"d11_txfrag", OFFSETOF(wl_cnt_ver_6_t, txfrag)},
{"d11_txmulti", OFFSETOF(wl_cnt_ver_6_t, txmulti)},
{"txfail", OFFSETOF(wl_cnt_ver_6_t, txfail)},
{"d11_txretry", OFFSETOF(wl_cnt_ver_6_t, txretry)},
{"d11_txretrie", OFFSETOF(wl_cnt_ver_6_t, txretrie)},
{"rxdup", OFFSETOF(wl_cnt_ver_6_t, rxdup)},
{"d11_txrts", OFFSETOF(wl_cnt_ver_6_t, txrts)},
{"d11_txnocts", OFFSETOF(wl_cnt_ver_6_t, txnocts)},
{"d11_txnoack", OFFSETOF(wl_cnt_ver_6_t, txnoack)},
{"d11_rxfrag", OFFSETOF(wl_cnt_ver_6_t, rxfrag)},
{"d11_rxmulti", OFFSETOF(wl_cnt_ver_6_t, rxmulti)},
{"rxcrc", OFFSETOF(wl_cnt_ver_6_t, rxcrc)},
{"d11_txfrmsnt", OFFSETOF(wl_cnt_ver_6_t, txfrmsnt)},
{"d11_rxundec", OFFSETOF(wl_cnt_ver_6_t, rxundec)},
{"tkipmicfaill", OFFSETOF(wl_cnt_ver_6_t, tkipmicfaill)},
{"tkipcntrmsr", OFFSETOF(wl_cnt_ver_6_t, tkipcntrmsr)},
{"tkipreplay", OFFSETOF(wl_cnt_ver_6_t, tkipreplay)},
{"ccmpfmterr", OFFSETOF(wl_cnt_ver_6_t, ccmpfmterr)},
{"ccmpreplay", OFFSETOF(wl_cnt_ver_6_t, ccmpreplay)},
{"ccmpundec", OFFSETOF(wl_cnt_ver_6_t, ccmpundec)},
{"fourwayfail", OFFSETOF(wl_cnt_ver_6_t, fourwayfail)},
{"wepundec", OFFSETOF(wl_cnt_ver_6_t, wepundec)},
{"wepicverr", OFFSETOF(wl_cnt_ver_6_t, wepicverr)},
{"decsuccess", OFFSETOF(wl_cnt_ver_6_t, decsuccess)},
{"tkipicverr", OFFSETOF(wl_cnt_ver_6_t, tkipicverr)},
{"wepexcluded", OFFSETOF(wl_cnt_ver_6_t, wepexcluded)},
{"txchanrej", OFFSETOF(wl_cnt_ver_6_t, txchanrej)},
{"psmwds", OFFSETOF(wl_cnt_ver_6_t, psmwds)},
{"phywatchdog", OFFSETOF(wl_cnt_ver_6_t, phywatchdog)},
{"prq_entries_handled", OFFSETOF(wl_cnt_ver_6_t, prq_entries_handled)},
{"prq_undirected_entries", OFFSETOF(wl_cnt_ver_6_t, prq_undirected_entries)},
{"prq_bad_entries", OFFSETOF(wl_cnt_ver_6_t, prq_bad_entries)},
{"atim_suppress_count", OFFSETOF(wl_cnt_ver_6_t, atim_suppress_count)},
{"bcn_template_not_ready", OFFSETOF(wl_cnt_ver_6_t, bcn_template_not_ready)},
{"bcn_template_not_ready_done", OFFSETOF(wl_cnt_ver_6_t, bcn_template_not_ready_done)},
{"late_tbtt_dpc", OFFSETOF(wl_cnt_ver_6_t, late_tbtt_dpc)},
{"rx1mbps", OFFSETOF(wl_cnt_ver_6_t, rx1mbps)},
{"rx2mbps", OFFSETOF(wl_cnt_ver_6_t, rx2mbps)},
{"rx5mbps5", OFFSETOF(wl_cnt_ver_6_t, rx5mbps5)},
{"rx6mbps", OFFSETOF(wl_cnt_ver_6_t, rx6mbps)},
{"rx9mbps", OFFSETOF(wl_cnt_ver_6_t, rx9mbps)},
{"rx11mbps", OFFSETOF(wl_cnt_ver_6_t, rx11mbps)},
{"rx12mbps", OFFSETOF(wl_cnt_ver_6_t, rx12mbps)},
{"rx18mbps", OFFSETOF(wl_cnt_ver_6_t, rx18mbps)},
{"rx24mbps", OFFSETOF(wl_cnt_ver_6_t, rx24mbps)},
{"rx36mbps", OFFSETOF(wl_cnt_ver_6_t, rx36mbps)},
{"rx48mbps", OFFSETOF(wl_cnt_ver_6_t, rx48mbps)},
{"rx54mbps", OFFSETOF(wl_cnt_ver_6_t, rx54mbps)},
{"rx108mbps", OFFSETOF(wl_cnt_ver_6_t, rx108mbps)},
{"rx162mbps", OFFSETOF(wl_cnt_ver_6_t, rx162mbps)},
{"rx216mbps", OFFSETOF(wl_cnt_ver_6_t, rx216mbps)},
{"rx270mbps", OFFSETOF(wl_cnt_ver_6_t, rx270mbps)},
{"rx324mbps", OFFSETOF(wl_cnt_ver_6_t, rx324mbps)},
{"rx378mbps", OFFSETOF(wl_cnt_ver_6_t, rx378mbps)},
{"rx432mbps", OFFSETOF(wl_cnt_ver_6_t, rx432mbps)},
{"rx486mbps", OFFSETOF(wl_cnt_ver_6_t, rx486mbps)},
{"rx540mbps", OFFSETOF(wl_cnt_ver_6_t, rx540mbps)},
{"rfdisable", OFFSETOF(wl_cnt_ver_6_t, rfdisable)},
{"txexptime", OFFSETOF(wl_cnt_ver_6_t, txexptime)},
{"txmpdu_sgi", OFFSETOF(wl_cnt_ver_6_t, txmpdu_sgi)},
{"rxmpdu_sgi", OFFSETOF(wl_cnt_ver_6_t, rxmpdu_sgi)},
{"txmpdu_stbc", OFFSETOF(wl_cnt_ver_6_t, txmpdu_stbc)},
{"rxmpdu_stbc", OFFSETOF(wl_cnt_ver_6_t, rxmpdu_stbc)},
{"rxundec_mcst", OFFSETOF(wl_cnt_ver_6_t, rxundec_mcst)},
{"tkipmicfaill_mcst", OFFSETOF(wl_cnt_ver_6_t, tkipmicfaill_mcst)},
{"tkipcntrmsr_mcst", OFFSETOF(wl_cnt_ver_6_t, tkipcntrmsr_mcst)},
{"tkipreplay_mcst", OFFSETOF(wl_cnt_ver_6_t, tkipreplay_mcst)},
{"ccmpfmterr_mcst", OFFSETOF(wl_cnt_ver_6_t, ccmpfmterr_mcst)},
{"ccmpreplay_mcst", OFFSETOF(wl_cnt_ver_6_t, ccmpreplay_mcst)},
{"ccmpundec_mcst", OFFSETOF(wl_cnt_ver_6_t, ccmpundec_mcst)},
{"fourwayfail_mcst", OFFSETOF(wl_cnt_ver_6_t, fourwayfail_mcst)},
{"wepundec_mcst", OFFSETOF(wl_cnt_ver_6_t, wepundec_mcst)},
{"wepicverr_mcst", OFFSETOF(wl_cnt_ver_6_t, wepicverr_mcst)},
{"decsuccess_mcst", OFFSETOF(wl_cnt_ver_6_t, decsuccess_mcst)},
{"tkipicverr_mcst", OFFSETOF(wl_cnt_ver_6_t, tkipicverr_mcst)},
{"wepexcluded_mcst", OFFSETOF(wl_cnt_ver_6_t, wepexcluded_mcst)},
/* macstat counters */
{"txallfrm", OFFSETOF(wl_cnt_ver_6_t, txallfrm)},
{"txrtsfrm", OFFSETOF(wl_cnt_ver_6_t, txrtsfrm)},
{"txctsfrm", OFFSETOF(wl_cnt_ver_6_t, txctsfrm)},
{"txackfrm", OFFSETOF(wl_cnt_ver_6_t, txackfrm)},
{"txdnlfrm", OFFSETOF(wl_cnt_ver_6_t, txdnlfrm)},
{"txbcnfrm", OFFSETOF(wl_cnt_ver_6_t, txbcnfrm)},
{"txfunfl[0]", OFFSETOF(wl_cnt_ver_6_t, txfunfl[0])},
{"txfunfl[1]", OFFSETOF(wl_cnt_ver_6_t, txfunfl[1])},
{"txfunfl[2]", OFFSETOF(wl_cnt_ver_6_t, txfunfl[2])},
{"txfunfl[3]", OFFSETOF(wl_cnt_ver_6_t, txfunfl[3])},
{"txfunfl[4]", OFFSETOF(wl_cnt_ver_6_t, txfunfl[4])},
{"txfunfl[5]", OFFSETOF(wl_cnt_ver_6_t, txfunfl[5])},
{"txampdu", OFFSETOF(wl_cnt_ver_6_t, txfbw)},
{"txtplunfl", OFFSETOF(wl_cnt_ver_6_t, txtplunfl)},
{"txphyerror", OFFSETOF(wl_cnt_ver_6_t, txphyerror)},
{"pktengrxducast", OFFSETOF(wl_cnt_ver_6_t, pktengrxducast)},
{"pktengrxdmcast", OFFSETOF(wl_cnt_ver_6_t, pktengrxdmcast)},
{"rxfrmtoolong", OFFSETOF(wl_cnt_ver_6_t, rxfrmtoolong)},
{"rxfrmtooshrt", OFFSETOF(wl_cnt_ver_6_t, rxfrmtooshrt)},
{"rxanyerr", OFFSETOF(wl_cnt_ver_6_t, rxinvmachdr)},
{"rxbadfcs", OFFSETOF(wl_cnt_ver_6_t, rxbadfcs)},
{"rxbadplcp", OFFSETOF(wl_cnt_ver_6_t, rxbadplcp)},
{"rxcrsglitch", OFFSETOF(wl_cnt_ver_6_t, rxcrsglitch)},
{"rxstrt", OFFSETOF(wl_cnt_ver_6_t, rxstrt)},
{"rxdtucastmbss", OFFSETOF(wl_cnt_ver_6_t, rxdfrmucastmbss)},
{"rxmgucastmbss", OFFSETOF(wl_cnt_ver_6_t, rxmfrmucastmbss)},
{"rxctlucast", OFFSETOF(wl_cnt_ver_6_t, rxcfrmucast)},
{"rxrtsucast", OFFSETOF(wl_cnt_ver_6_t, rxrtsucast)},
{"rxctsucast", OFFSETOF(wl_cnt_ver_6_t, rxctsucast)},
{"rxackucast", OFFSETOF(wl_cnt_ver_6_t, rxackucast)},
{"rxdtocast", OFFSETOF(wl_cnt_ver_6_t, rxdfrmocast)},
{"rxmgocast", OFFSETOF(wl_cnt_ver_6_t, rxmfrmocast)},
{"rxctlocast", OFFSETOF(wl_cnt_ver_6_t, rxcfrmocast)},
{"rxrtsocast", OFFSETOF(wl_cnt_ver_6_t, rxrtsocast)},
{"rxctsocast", OFFSETOF(wl_cnt_ver_6_t, rxctsocast)},
{"rxdtmcast", OFFSETOF(wl_cnt_ver_6_t, rxdfrmmcast)},
{"rxmgmcast", OFFSETOF(wl_cnt_ver_6_t, rxmfrmmcast)},
{"rxctlmcast", OFFSETOF(wl_cnt_ver_6_t, rxcfrmmcast)},
{"rxbeaconmbss", OFFSETOF(wl_cnt_ver_6_t, rxbeaconmbss)},
{"rxdtucastobss", OFFSETOF(wl_cnt_ver_6_t, rxdfrmucastobss)},
{"rxbeaconobss", OFFSETOF(wl_cnt_ver_6_t, rxbeaconobss)},
{"rxrsptmout", OFFSETOF(wl_cnt_ver_6_t, rxrsptmout)},
{"bcntxcancl", OFFSETOF(wl_cnt_ver_6_t, bcntxcancl)},
{"rxf0ovfl", OFFSETOF(wl_cnt_ver_6_t, rxf0ovfl)},
{"rxf1ovfl", OFFSETOF(wl_cnt_ver_6_t, rxf1ovfl)},
{"rxhlovfl", OFFSETOF(wl_cnt_ver_6_t, rxf2ovfl)},
{"missbcn_dbg", OFFSETOF(wl_cnt_ver_6_t, txsfovfl)},
{"pmqovfl", OFFSETOF(wl_cnt_ver_6_t, pmqovfl)},
{"rxcgprqfrm", OFFSETOF(wl_cnt_ver_6_t, rxcgprqfrm)},
{"rxcgprsqovfl", OFFSETOF(wl_cnt_ver_6_t, rxcgprsqovfl)},
{"txcgprsfail", OFFSETOF(wl_cnt_ver_6_t, txcgprsfail)},
{"txcgprssuc", OFFSETOF(wl_cnt_ver_6_t, txcgprssuc)},
{"prs_timeout", OFFSETOF(wl_cnt_ver_6_t, prs_timeout)},
{"txrtsfail", OFFSETOF(wl_cnt_ver_6_t, rxnack)},
{"txucast", OFFSETOF(wl_cnt_ver_6_t, frmscons)},
{"txinrtstxop", OFFSETOF(wl_cnt_ver_6_t, txnack)},
{"rxback", OFFSETOF(wl_cnt_ver_6_t, rxback)},
{"txback", OFFSETOF(wl_cnt_ver_6_t, txback)},
{"bphy_rxcrsglitch", OFFSETOF(wl_cnt_ver_6_t, bphy_rxcrsglitch)},
{"rxdrop20s", OFFSETOF(wl_cnt_ver_6_t, rxdrop20s)},
{"rxtoolate", OFFSETOF(wl_cnt_ver_6_t, rxtoolate)},
{"bphy_badplcp", OFFSETOF(wl_cnt_ver_6_t, bphy_badplcp)},
{NULL, 0},
};
static counter_offset_info_t cntr_offset_info_v7[] = {
{"txframe", OFFSETOF(wl_cnt_ver_7_t, txframe)},
{"txbyte", OFFSETOF(wl_cnt_ver_7_t, txbyte)},
{"txretrans", OFFSETOF(wl_cnt_ver_7_t, txretrans)},
{"txerror", OFFSETOF(wl_cnt_ver_7_t, txerror)},
{"txctl", OFFSETOF(wl_cnt_ver_7_t, txctl)},
{"txprshort", OFFSETOF(wl_cnt_ver_7_t, txprshort)},
{"txserr", OFFSETOF(wl_cnt_ver_7_t, txserr)},
{"txnobuf", OFFSETOF(wl_cnt_ver_7_t, txnobuf)},
{"txnoassoc", OFFSETOF(wl_cnt_ver_7_t, txnoassoc)},
{"txrunt", OFFSETOF(wl_cnt_ver_7_t, txrunt)},
{"txchit", OFFSETOF(wl_cnt_ver_7_t, txchit)},
{"txcmiss", OFFSETOF(wl_cnt_ver_7_t, txcmiss)},
{"txuflo", OFFSETOF(wl_cnt_ver_7_t, txuflo)},
{"txphyerr", OFFSETOF(wl_cnt_ver_7_t, txphyerr)},
{"txphycrs", OFFSETOF(wl_cnt_ver_7_t, txphycrs)},
{"rxframe", OFFSETOF(wl_cnt_ver_7_t, rxframe)},
{"rxbyte", OFFSETOF(wl_cnt_ver_7_t, rxbyte)},
{"rxerror", OFFSETOF(wl_cnt_ver_7_t, rxerror)},
{"rxctl", OFFSETOF(wl_cnt_ver_7_t, rxctl)},
{"rxnobuf", OFFSETOF(wl_cnt_ver_7_t, rxnobuf)},
{"rxnondata", OFFSETOF(wl_cnt_ver_7_t, rxnondata)},
{"rxbadds", OFFSETOF(wl_cnt_ver_7_t, rxbadds)},
{"rxbadcm", OFFSETOF(wl_cnt_ver_7_t, rxbadcm)},
{"rxfragerr", OFFSETOF(wl_cnt_ver_7_t, rxfragerr)},
{"rxrunt", OFFSETOF(wl_cnt_ver_7_t, rxrunt)},
{"rxgiant", OFFSETOF(wl_cnt_ver_7_t, rxgiant)},
{"rxnoscb", OFFSETOF(wl_cnt_ver_7_t, rxnoscb)},
{"rxbadproto", OFFSETOF(wl_cnt_ver_7_t, rxbadproto)},
{"rxbadsrcmac", OFFSETOF(wl_cnt_ver_7_t, rxbadsrcmac)},
{"rxbadda", OFFSETOF(wl_cnt_ver_7_t, rxbadda)},
{"rxfilter", OFFSETOF(wl_cnt_ver_7_t, rxfilter)},
{"rxoflo", OFFSETOF(wl_cnt_ver_7_t, rxoflo)},
{"rxuflo[0]", OFFSETOF(wl_cnt_ver_7_t, rxuflo[0])},
{"rxuflo[1]", OFFSETOF(wl_cnt_ver_7_t, rxuflo[1])},
{"rxuflo[2]", OFFSETOF(wl_cnt_ver_7_t, rxuflo[2])},
{"rxuflo[3]", OFFSETOF(wl_cnt_ver_7_t, rxuflo[3])},
{"rxuflo[4]", OFFSETOF(wl_cnt_ver_7_t, rxuflo[4])},
{"rxuflo[5]", OFFSETOF(wl_cnt_ver_7_t, rxuflo[5])},
{"d11cnt_txrts_off", OFFSETOF(wl_cnt_ver_7_t, d11cnt_txrts_off)},
{"d11cnt_rxcrc_off", OFFSETOF(wl_cnt_ver_7_t, d11cnt_rxcrc_off)},
{"d11cnt_txnocts_off", OFFSETOF(wl_cnt_ver_7_t, d11cnt_txnocts_off)},
{"dmade", OFFSETOF(wl_cnt_ver_7_t, dmade)},
{"dmada", OFFSETOF(wl_cnt_ver_7_t, dmada)},
{"dmape", OFFSETOF(wl_cnt_ver_7_t, dmape)},
{"reset", OFFSETOF(wl_cnt_ver_7_t, reset)},
{"tbtt", OFFSETOF(wl_cnt_ver_7_t, tbtt)},
{"txdmawar", OFFSETOF(wl_cnt_ver_7_t, txdmawar)},
{"pkt_callback_reg_fail", OFFSETOF(wl_cnt_ver_7_t, pkt_callback_reg_fail)},
{"d11_txfrag", OFFSETOF(wl_cnt_ver_7_t, txfrag)},
{"d11_txmulti", OFFSETOF(wl_cnt_ver_7_t, txmulti)},
{"txfail", OFFSETOF(wl_cnt_ver_7_t, txfail)},
{"d11_txretry", OFFSETOF(wl_cnt_ver_7_t, txretry)},
{"d11_txretrie", OFFSETOF(wl_cnt_ver_7_t, txretrie)},
{"rxdup", OFFSETOF(wl_cnt_ver_7_t, rxdup)},
{"d11_txrts", OFFSETOF(wl_cnt_ver_7_t, txrts)},
{"d11_txnocts", OFFSETOF(wl_cnt_ver_7_t, txnocts)},
{"d11_txnoack", OFFSETOF(wl_cnt_ver_7_t, txnoack)},
{"d11_rxfrag", OFFSETOF(wl_cnt_ver_7_t, rxfrag)},
{"d11_rxmulti", OFFSETOF(wl_cnt_ver_7_t, rxmulti)},
{"rxcrc", OFFSETOF(wl_cnt_ver_7_t, rxcrc)},
{"d11_txfrmsnt", OFFSETOF(wl_cnt_ver_7_t, txfrmsnt)},
{"d11_rxundec", OFFSETOF(wl_cnt_ver_7_t, rxundec)},
{"tkipmicfaill", OFFSETOF(wl_cnt_ver_7_t, tkipmicfaill)},
{"tkipcntrmsr", OFFSETOF(wl_cnt_ver_7_t, tkipcntrmsr)},
{"tkipreplay", OFFSETOF(wl_cnt_ver_7_t, tkipreplay)},
{"ccmpfmterr", OFFSETOF(wl_cnt_ver_7_t, ccmpfmterr)},
{"ccmpreplay", OFFSETOF(wl_cnt_ver_7_t, ccmpreplay)},
{"ccmpundec", OFFSETOF(wl_cnt_ver_7_t, ccmpundec)},
{"fourwayfail", OFFSETOF(wl_cnt_ver_7_t, fourwayfail)},
{"wepundec", OFFSETOF(wl_cnt_ver_7_t, wepundec)},
{"wepicverr", OFFSETOF(wl_cnt_ver_7_t, wepicverr)},
{"decsuccess", OFFSETOF(wl_cnt_ver_7_t, decsuccess)},
{"tkipicverr", OFFSETOF(wl_cnt_ver_7_t, tkipicverr)},
{"wepexcluded", OFFSETOF(wl_cnt_ver_7_t, wepexcluded)},
{"txchanrej", OFFSETOF(wl_cnt_ver_7_t, txchanrej)},
{"psmwds", OFFSETOF(wl_cnt_ver_7_t, psmwds)},
{"phywatchdog", OFFSETOF(wl_cnt_ver_7_t, phywatchdog)},
{"prq_entries_handled", OFFSETOF(wl_cnt_ver_7_t, prq_entries_handled)},
{"prq_undirected_entries", OFFSETOF(wl_cnt_ver_7_t, prq_undirected_entries)},
{"prq_bad_entries", OFFSETOF(wl_cnt_ver_7_t, prq_bad_entries)},
{"atim_suppress_count", OFFSETOF(wl_cnt_ver_7_t, atim_suppress_count)},
{"bcn_template_not_ready", OFFSETOF(wl_cnt_ver_7_t, bcn_template_not_ready)},
{"bcn_template_not_ready_done", OFFSETOF(wl_cnt_ver_7_t, bcn_template_not_ready_done)},
{"late_tbtt_dpc", OFFSETOF(wl_cnt_ver_7_t, late_tbtt_dpc)},
{"rx1mbps", OFFSETOF(wl_cnt_ver_7_t, rx1mbps)},
{"rx2mbps", OFFSETOF(wl_cnt_ver_7_t, rx2mbps)},
{"rx5mbps5", OFFSETOF(wl_cnt_ver_7_t, rx5mbps5)},
{"rx6mbps", OFFSETOF(wl_cnt_ver_7_t, rx6mbps)},
{"rx9mbps", OFFSETOF(wl_cnt_ver_7_t, rx9mbps)},
{"rx11mbps", OFFSETOF(wl_cnt_ver_7_t, rx11mbps)},
{"rx12mbps", OFFSETOF(wl_cnt_ver_7_t, rx12mbps)},
{"rx18mbps", OFFSETOF(wl_cnt_ver_7_t, rx18mbps)},
{"rx24mbps", OFFSETOF(wl_cnt_ver_7_t, rx24mbps)},
{"rx36mbps", OFFSETOF(wl_cnt_ver_7_t, rx36mbps)},
{"rx48mbps", OFFSETOF(wl_cnt_ver_7_t, rx48mbps)},
{"rx54mbps", OFFSETOF(wl_cnt_ver_7_t, rx54mbps)},
{"rx108mbps", OFFSETOF(wl_cnt_ver_7_t, rx108mbps)},
{"rx162mbps", OFFSETOF(wl_cnt_ver_7_t, rx162mbps)},
{"rx216mbps", OFFSETOF(wl_cnt_ver_7_t, rx216mbps)},
{"rx270mbps", OFFSETOF(wl_cnt_ver_7_t, rx270mbps)},
{"rx324mbps", OFFSETOF(wl_cnt_ver_7_t, rx324mbps)},
{"rx378mbps", OFFSETOF(wl_cnt_ver_7_t, rx378mbps)},
{"rx432mbps", OFFSETOF(wl_cnt_ver_7_t, rx432mbps)},
{"rx486mbps", OFFSETOF(wl_cnt_ver_7_t, rx486mbps)},
{"rx540mbps", OFFSETOF(wl_cnt_ver_7_t, rx540mbps)},
{"rfdisable", OFFSETOF(wl_cnt_ver_7_t, rfdisable)},
{"txexptime", OFFSETOF(wl_cnt_ver_7_t, txexptime)},
{"txmpdu_sgi", OFFSETOF(wl_cnt_ver_7_t, txmpdu_sgi)},
{"rxmpdu_sgi", OFFSETOF(wl_cnt_ver_7_t, rxmpdu_sgi)},
{"txmpdu_stbc", OFFSETOF(wl_cnt_ver_7_t, txmpdu_stbc)},
{"rxmpdu_stbc", OFFSETOF(wl_cnt_ver_7_t, rxmpdu_stbc)},
{"rxundec_mcst", OFFSETOF(wl_cnt_ver_7_t, rxundec_mcst)},
{"tkipmicfaill_mcst", OFFSETOF(wl_cnt_ver_7_t, tkipmicfaill_mcst)},
{"tkipcntrmsr_mcst", OFFSETOF(wl_cnt_ver_7_t, tkipcntrmsr_mcst)},
{"tkipreplay_mcst", OFFSETOF(wl_cnt_ver_7_t, tkipreplay_mcst)},
{"ccmpfmterr_mcst", OFFSETOF(wl_cnt_ver_7_t, ccmpfmterr_mcst)},
{"ccmpreplay_mcst", OFFSETOF(wl_cnt_ver_7_t, ccmpreplay_mcst)},
{"ccmpundec_mcst", OFFSETOF(wl_cnt_ver_7_t, ccmpundec_mcst)},
{"fourwayfail_mcst", OFFSETOF(wl_cnt_ver_7_t, fourwayfail_mcst)},
{"wepundec_mcst", OFFSETOF(wl_cnt_ver_7_t, wepundec_mcst)},
{"wepicverr_mcst", OFFSETOF(wl_cnt_ver_7_t, wepicverr_mcst)},
{"decsuccess_mcst", OFFSETOF(wl_cnt_ver_7_t, decsuccess_mcst)},
{"tkipicverr_mcst", OFFSETOF(wl_cnt_ver_7_t, tkipicverr_mcst)},
{"wepexcluded_mcst", OFFSETOF(wl_cnt_ver_7_t, wepexcluded_mcst)},
/* macstat counters */
{"txallfrm", OFFSETOF(wl_cnt_ver_7_t, txallfrm)},
{"txrtsfrm", OFFSETOF(wl_cnt_ver_7_t, txrtsfrm)},
{"txctsfrm", OFFSETOF(wl_cnt_ver_7_t, txctsfrm)},
{"txackfrm", OFFSETOF(wl_cnt_ver_7_t, txackfrm)},
{"txdnlfrm", OFFSETOF(wl_cnt_ver_7_t, txdnlfrm)},
{"txbcnfrm", OFFSETOF(wl_cnt_ver_7_t, txbcnfrm)},
{"txfunfl[0]", OFFSETOF(wl_cnt_ver_7_t, txfunfl[0])},
{"txfunfl[1]", OFFSETOF(wl_cnt_ver_7_t, txfunfl[1])},
{"txfunfl[2]", OFFSETOF(wl_cnt_ver_7_t, txfunfl[2])},
{"txfunfl[3]", OFFSETOF(wl_cnt_ver_7_t, txfunfl[3])},
{"txfunfl[4]", OFFSETOF(wl_cnt_ver_7_t, txfunfl[4])},
{"txfunfl[5]", OFFSETOF(wl_cnt_ver_7_t, txfunfl[5])},
{"txtplunfl", OFFSETOF(wl_cnt_ver_7_t, txtplunfl)},
{"txphyerror", OFFSETOF(wl_cnt_ver_7_t, txphyerror)},
{"pktengrxducast", OFFSETOF(wl_cnt_ver_7_t, pktengrxducast)},
{"pktengrxdmcast", OFFSETOF(wl_cnt_ver_7_t, pktengrxdmcast)},
{"rxfrmtoolong", OFFSETOF(wl_cnt_ver_7_t, rxfrmtoolong)},
{"rxfrmtooshrt", OFFSETOF(wl_cnt_ver_7_t, rxfrmtooshrt)},
{"rxanyerr", OFFSETOF(wl_cnt_ver_7_t, rxinvmachdr)},
{"rxbadfcs", OFFSETOF(wl_cnt_ver_7_t, rxbadfcs)},
{"rxbadplcp", OFFSETOF(wl_cnt_ver_7_t, rxbadplcp)},
{"rxcrsglitch", OFFSETOF(wl_cnt_ver_7_t, rxcrsglitch)},
{"rxstrt", OFFSETOF(wl_cnt_ver_7_t, rxstrt)},
{"rxdtucastmbss", OFFSETOF(wl_cnt_ver_7_t, rxdfrmucastmbss)},
{"rxmgucastmbss", OFFSETOF(wl_cnt_ver_7_t, rxmfrmucastmbss)},
{"rxctlucast", OFFSETOF(wl_cnt_ver_7_t, rxcfrmucast)},
{"rxrtsucast", OFFSETOF(wl_cnt_ver_7_t, rxrtsucast)},
{"rxctsucast", OFFSETOF(wl_cnt_ver_7_t, rxctsucast)},
{"rxackucast", OFFSETOF(wl_cnt_ver_7_t, rxackucast)},
{"rxdtocast", OFFSETOF(wl_cnt_ver_7_t, rxdfrmocast)},
{"rxmgocast", OFFSETOF(wl_cnt_ver_7_t, rxmfrmocast)},
{"rxctlocast", OFFSETOF(wl_cnt_ver_7_t, rxcfrmocast)},
{"rxrtsocast", OFFSETOF(wl_cnt_ver_7_t, rxrtsocast)},
{"rxctsocast", OFFSETOF(wl_cnt_ver_7_t, rxctsocast)},
{"rxdtmcast", OFFSETOF(wl_cnt_ver_7_t, rxdfrmmcast)},
{"rxmgmcast", OFFSETOF(wl_cnt_ver_7_t, rxmfrmmcast)},
{"rxctlmcast", OFFSETOF(wl_cnt_ver_7_t, rxcfrmmcast)},
{"rxbeaconmbss", OFFSETOF(wl_cnt_ver_7_t, rxbeaconmbss)},
{"rxdtucastobss", OFFSETOF(wl_cnt_ver_7_t, rxdfrmucastobss)},
{"rxbeaconobss", OFFSETOF(wl_cnt_ver_7_t, rxbeaconobss)},
{"rxrsptmout", OFFSETOF(wl_cnt_ver_7_t, rxrsptmout)},
{"bcntxcancl", OFFSETOF(wl_cnt_ver_7_t, bcntxcancl)},
{"rxf0ovfl", OFFSETOF(wl_cnt_ver_7_t, rxf0ovfl)},
{"rxf1ovfl", OFFSETOF(wl_cnt_ver_7_t, rxf1ovfl)},
{"rxhlovfl", OFFSETOF(wl_cnt_ver_7_t, rxf2ovfl)},
{"missbcn_dbg", OFFSETOF(wl_cnt_ver_7_t, txsfovfl)},
{"pmqovfl", OFFSETOF(wl_cnt_ver_7_t, pmqovfl)},
{"rxcgprqfrm", OFFSETOF(wl_cnt_ver_7_t, rxcgprqfrm)},
{"rxcgprsqovfl", OFFSETOF(wl_cnt_ver_7_t, rxcgprsqovfl)},
{"txcgprsfail", OFFSETOF(wl_cnt_ver_7_t, txcgprsfail)},
{"txcgprssuc", OFFSETOF(wl_cnt_ver_7_t, txcgprssuc)},
{"prs_timeout", OFFSETOF(wl_cnt_ver_7_t, prs_timeout)},
{"txrtsfail", OFFSETOF(wl_cnt_ver_7_t, rxnack)},
{"txucast", OFFSETOF(wl_cnt_ver_7_t, frmscons)},
{"txinrtstxop", OFFSETOF(wl_cnt_ver_7_t, txnack)},
{"bphy_rxcrsglitch", OFFSETOF(wl_cnt_ver_7_t, bphy_rxcrsglitch)},
{NULL, 0},
};
static counter_offset_info_t cntr_offset_info_v11[] = {
{"txframe", OFFSETOF(wl_cnt_ver_11_t, txframe)},
{"txbyte", OFFSETOF(wl_cnt_ver_11_t, txbyte)},
{"txretrans", OFFSETOF(wl_cnt_ver_11_t, txretrans)},
{"txerror", OFFSETOF(wl_cnt_ver_11_t, txerror)},
{"txctl", OFFSETOF(wl_cnt_ver_11_t, txctl)},
{"txprshort", OFFSETOF(wl_cnt_ver_11_t, txprshort)},
{"txserr", OFFSETOF(wl_cnt_ver_11_t, txserr)},
{"txnobuf", OFFSETOF(wl_cnt_ver_11_t, txnobuf)},
{"txnoassoc", OFFSETOF(wl_cnt_ver_11_t, txnoassoc)},
{"txrunt", OFFSETOF(wl_cnt_ver_11_t, txrunt)},
{"txchit", OFFSETOF(wl_cnt_ver_11_t, txchit)},
{"txcmiss", OFFSETOF(wl_cnt_ver_11_t, txcmiss)},
{"txuflo", OFFSETOF(wl_cnt_ver_11_t, txuflo)},
{"txphyerr", OFFSETOF(wl_cnt_ver_11_t, txphyerr)},
{"txphycrs", OFFSETOF(wl_cnt_ver_11_t, txphycrs)},
{"rxframe", OFFSETOF(wl_cnt_ver_11_t, rxframe)},
{"rxbyte", OFFSETOF(wl_cnt_ver_11_t, rxbyte)},
{"rxerror", OFFSETOF(wl_cnt_ver_11_t, rxerror)},
{"rxctl", OFFSETOF(wl_cnt_ver_11_t, rxctl)},
{"rxnobuf", OFFSETOF(wl_cnt_ver_11_t, rxnobuf)},
{"rxnondata", OFFSETOF(wl_cnt_ver_11_t, rxnondata)},
{"rxbadds", OFFSETOF(wl_cnt_ver_11_t, rxbadds)},
{"rxbadcm", OFFSETOF(wl_cnt_ver_11_t, rxbadcm)},
{"rxfragerr", OFFSETOF(wl_cnt_ver_11_t, rxfragerr)},
{"rxrunt", OFFSETOF(wl_cnt_ver_11_t, rxrunt)},
{"rxgiant", OFFSETOF(wl_cnt_ver_11_t, rxgiant)},
{"rxnoscb", OFFSETOF(wl_cnt_ver_11_t, rxnoscb)},
{"rxbadproto", OFFSETOF(wl_cnt_ver_11_t, rxbadproto)},
{"rxbadsrcmac", OFFSETOF(wl_cnt_ver_11_t, rxbadsrcmac)},
{"rxbadda", OFFSETOF(wl_cnt_ver_11_t, rxbadda)},
{"rxfilter", OFFSETOF(wl_cnt_ver_11_t, rxfilter)},
{"rxoflo", OFFSETOF(wl_cnt_ver_11_t, rxoflo)},
{"rxuflo[0]", OFFSETOF(wl_cnt_ver_11_t, rxuflo[0])},
{"rxuflo[1]", OFFSETOF(wl_cnt_ver_11_t, rxuflo[1])},
{"rxuflo[2]", OFFSETOF(wl_cnt_ver_11_t, rxuflo[2])},
{"rxuflo[3]", OFFSETOF(wl_cnt_ver_11_t, rxuflo[3])},
{"rxuflo[4]", OFFSETOF(wl_cnt_ver_11_t, rxuflo[4])},
{"rxuflo[5]", OFFSETOF(wl_cnt_ver_11_t, rxuflo[5])},
{"d11cnt_txrts_off", OFFSETOF(wl_cnt_ver_11_t, d11cnt_txrts_off)},
{"d11cnt_rxcrc_off", OFFSETOF(wl_cnt_ver_11_t, d11cnt_rxcrc_off)},
{"d11cnt_txnocts_off", OFFSETOF(wl_cnt_ver_11_t, d11cnt_txnocts_off)},
{"dmade", OFFSETOF(wl_cnt_ver_11_t, dmade)},
{"dmada", OFFSETOF(wl_cnt_ver_11_t, dmada)},
{"dmape", OFFSETOF(wl_cnt_ver_11_t, dmape)},
{"reset", OFFSETOF(wl_cnt_ver_11_t, reset)},
{"tbtt", OFFSETOF(wl_cnt_ver_11_t, tbtt)},
{"txdmawar", OFFSETOF(wl_cnt_ver_11_t, txdmawar)},
{"pkt_callback_reg_fail", OFFSETOF(wl_cnt_ver_11_t, pkt_callback_reg_fail)},
{"d11_txfrag", OFFSETOF(wl_cnt_ver_11_t, txfrag)},
{"d11_txmulti", OFFSETOF(wl_cnt_ver_11_t, txmulti)},
{"txfail", OFFSETOF(wl_cnt_ver_11_t, txfail)},
{"d11_txretry", OFFSETOF(wl_cnt_ver_11_t, txretry)},
{"d11_txretrie", OFFSETOF(wl_cnt_ver_11_t, txretrie)},
{"rxdup", OFFSETOF(wl_cnt_ver_11_t, rxdup)},
{"d11_txrts", OFFSETOF(wl_cnt_ver_11_t, txrts)},
{"d11_txnocts", OFFSETOF(wl_cnt_ver_11_t, txnocts)},
{"d11_txnoack", OFFSETOF(wl_cnt_ver_11_t, txnoack)},
{"d11_rxfrag", OFFSETOF(wl_cnt_ver_11_t, rxfrag)},
{"d11_rxmulti", OFFSETOF(wl_cnt_ver_11_t, rxmulti)},
{"rxcrc", OFFSETOF(wl_cnt_ver_11_t, rxcrc)},
{"d11_txfrmsnt", OFFSETOF(wl_cnt_ver_11_t, txfrmsnt)},
{"d11_rxundec", OFFSETOF(wl_cnt_ver_11_t, rxundec)},
{"tkipmicfaill", OFFSETOF(wl_cnt_ver_11_t, tkipmicfaill)},
{"tkipcntrmsr", OFFSETOF(wl_cnt_ver_11_t, tkipcntrmsr)},
{"tkipreplay", OFFSETOF(wl_cnt_ver_11_t, tkipreplay)},
{"ccmpfmterr", OFFSETOF(wl_cnt_ver_11_t, ccmpfmterr)},
{"ccmpreplay", OFFSETOF(wl_cnt_ver_11_t, ccmpreplay)},
{"ccmpundec", OFFSETOF(wl_cnt_ver_11_t, ccmpundec)},
{"fourwayfail", OFFSETOF(wl_cnt_ver_11_t, fourwayfail)},
{"wepundec", OFFSETOF(wl_cnt_ver_11_t, wepundec)},
{"wepicverr", OFFSETOF(wl_cnt_ver_11_t, wepicverr)},
{"decsuccess", OFFSETOF(wl_cnt_ver_11_t, decsuccess)},
{"tkipicverr", OFFSETOF(wl_cnt_ver_11_t, tkipicverr)},
{"wepexcluded", OFFSETOF(wl_cnt_ver_11_t, wepexcluded)},
{"txchanrej", OFFSETOF(wl_cnt_ver_11_t, txchanrej)},
{"psmwds", OFFSETOF(wl_cnt_ver_11_t, psmwds)},
{"phywatchdog", OFFSETOF(wl_cnt_ver_11_t, phywatchdog)},
{"prq_entries_handled", OFFSETOF(wl_cnt_ver_11_t, prq_entries_handled)},
{"prq_undirected_entries", OFFSETOF(wl_cnt_ver_11_t, prq_undirected_entries)},
{"prq_bad_entries", OFFSETOF(wl_cnt_ver_11_t, prq_bad_entries)},
{"atim_suppress_count", OFFSETOF(wl_cnt_ver_11_t, atim_suppress_count)},
{"bcn_template_not_ready", OFFSETOF(wl_cnt_ver_11_t, bcn_template_not_ready)},
{"bcn_template_not_ready_done", OFFSETOF(wl_cnt_ver_11_t, bcn_template_not_ready_done)},
{"late_tbtt_dpc", OFFSETOF(wl_cnt_ver_11_t, late_tbtt_dpc)},
{"rx1mbps", OFFSETOF(wl_cnt_ver_11_t, rx1mbps)},
{"rx2mbps", OFFSETOF(wl_cnt_ver_11_t, rx2mbps)},
{"rx5mbps5", OFFSETOF(wl_cnt_ver_11_t, rx5mbps5)},
{"rx6mbps", OFFSETOF(wl_cnt_ver_11_t, rx6mbps)},
{"rx9mbps", OFFSETOF(wl_cnt_ver_11_t, rx9mbps)},
{"rx11mbps", OFFSETOF(wl_cnt_ver_11_t, rx11mbps)},
{"rx12mbps", OFFSETOF(wl_cnt_ver_11_t, rx12mbps)},
{"rx18mbps", OFFSETOF(wl_cnt_ver_11_t, rx18mbps)},
{"rx24mbps", OFFSETOF(wl_cnt_ver_11_t, rx24mbps)},
{"rx36mbps", OFFSETOF(wl_cnt_ver_11_t, rx36mbps)},
{"rx48mbps", OFFSETOF(wl_cnt_ver_11_t, rx48mbps)},
{"rx54mbps", OFFSETOF(wl_cnt_ver_11_t, rx54mbps)},
{"rx108mbps", OFFSETOF(wl_cnt_ver_11_t, rx108mbps)},
{"rx162mbps", OFFSETOF(wl_cnt_ver_11_t, rx162mbps)},
{"rx216mbps", OFFSETOF(wl_cnt_ver_11_t, rx216mbps)},
{"rx270mbps", OFFSETOF(wl_cnt_ver_11_t, rx270mbps)},
{"rx324mbps", OFFSETOF(wl_cnt_ver_11_t, rx324mbps)},
{"rx378mbps", OFFSETOF(wl_cnt_ver_11_t, rx378mbps)},
{"rx432mbps", OFFSETOF(wl_cnt_ver_11_t, rx432mbps)},
{"rx486mbps", OFFSETOF(wl_cnt_ver_11_t, rx486mbps)},
{"rx540mbps", OFFSETOF(wl_cnt_ver_11_t, rx540mbps)},
{"rfdisable", OFFSETOF(wl_cnt_ver_11_t, rfdisable)},
{"txexptime", OFFSETOF(wl_cnt_ver_11_t, txexptime)},
{"txmpdu_sgi", OFFSETOF(wl_cnt_ver_11_t, txmpdu_sgi)},
{"rxmpdu_sgi", OFFSETOF(wl_cnt_ver_11_t, rxmpdu_sgi)},
{"txmpdu_stbc", OFFSETOF(wl_cnt_ver_11_t, txmpdu_stbc)},
{"rxmpdu_stbc", OFFSETOF(wl_cnt_ver_11_t, rxmpdu_stbc)},
{"rxundec_mcst", OFFSETOF(wl_cnt_ver_11_t, rxundec_mcst)},
{"tkipmicfaill_mcst", OFFSETOF(wl_cnt_ver_11_t, tkipmicfaill_mcst)},
{"tkipcntrmsr_mcst", OFFSETOF(wl_cnt_ver_11_t, tkipcntrmsr_mcst)},
{"tkipreplay_mcst", OFFSETOF(wl_cnt_ver_11_t, tkipreplay_mcst)},
{"ccmpfmterr_mcst", OFFSETOF(wl_cnt_ver_11_t, ccmpfmterr_mcst)},
{"ccmpreplay_mcst", OFFSETOF(wl_cnt_ver_11_t, ccmpreplay_mcst)},
{"ccmpundec_mcst", OFFSETOF(wl_cnt_ver_11_t, ccmpundec_mcst)},
{"fourwayfail_mcst", OFFSETOF(wl_cnt_ver_11_t, fourwayfail_mcst)},
{"wepundec_mcst", OFFSETOF(wl_cnt_ver_11_t, wepundec_mcst)},
{"wepicverr_mcst", OFFSETOF(wl_cnt_ver_11_t, wepicverr_mcst)},
{"decsuccess_mcst", OFFSETOF(wl_cnt_ver_11_t, decsuccess_mcst)},
{"tkipicverr_mcst", OFFSETOF(wl_cnt_ver_11_t, tkipicverr_mcst)},
{"wepexcluded_mcst", OFFSETOF(wl_cnt_ver_11_t, wepexcluded_mcst)},
{"dma_hang", OFFSETOF(wl_cnt_ver_11_t, dma_hang)},
{"reinit", OFFSETOF(wl_cnt_ver_11_t, reinit)},
{"pstatxucast", OFFSETOF(wl_cnt_ver_11_t, pstatxucast)},
{"pstatxnoassoc", OFFSETOF(wl_cnt_ver_11_t, pstatxnoassoc)},
{"pstarxucast", OFFSETOF(wl_cnt_ver_11_t, pstarxucast)},
{"pstarxbcmc", OFFSETOF(wl_cnt_ver_11_t, pstarxbcmc)},
{"pstatxbcmc", OFFSETOF(wl_cnt_ver_11_t, pstatxbcmc)},
{"cso_passthrough", OFFSETOF(wl_cnt_ver_11_t, cso_passthrough)},
{"cso_normal", OFFSETOF(wl_cnt_ver_11_t, cso_normal)},
{"chained", OFFSETOF(wl_cnt_ver_11_t, chained)},
{"chainedsz1", OFFSETOF(wl_cnt_ver_11_t, chainedsz1)},
{"unchained", OFFSETOF(wl_cnt_ver_11_t, unchained)},
{"maxchainsz", OFFSETOF(wl_cnt_ver_11_t, maxchainsz)},
{"currchainsz", OFFSETOF(wl_cnt_ver_11_t, currchainsz)},
{"pciereset", OFFSETOF(wl_cnt_ver_11_t, pciereset)},
{"cfgrestore", OFFSETOF(wl_cnt_ver_11_t, cfgrestore)},
{"reinit", OFFSETOF(wl_cnt_ver_11_t, reinit)},
{"reinitreason[0]", OFFSETOF(wl_cnt_ver_11_t, reinitreason[0])},
{"reinitreason[1]", OFFSETOF(wl_cnt_ver_11_t, reinitreason[1])},
{"reinitreason[2]", OFFSETOF(wl_cnt_ver_11_t, reinitreason[2])},
{"reinitreason[3]", OFFSETOF(wl_cnt_ver_11_t, reinitreason[3])},
{"reinitreason[4]", OFFSETOF(wl_cnt_ver_11_t, reinitreason[4])},
{"reinitreason[5]", OFFSETOF(wl_cnt_ver_11_t, reinitreason[5])},
{"reinitreason[6]", OFFSETOF(wl_cnt_ver_11_t, reinitreason[6])},
{"reinitreason[7]", OFFSETOF(wl_cnt_ver_11_t, reinitreason[7])},
{"rxrtry", OFFSETOF(wl_cnt_ver_11_t, rxrtry)},
{"rxmpdu_mu", OFFSETOF(wl_cnt_ver_11_t, rxmpdu_mu)},
{"txbar", OFFSETOF(wl_cnt_ver_11_t, txbar)},
{"rxbar", OFFSETOF(wl_cnt_ver_11_t, rxbar)},
{"txpspoll", OFFSETOF(wl_cnt_ver_11_t, txpspoll)},
{"rxpspoll", OFFSETOF(wl_cnt_ver_11_t, rxpspoll)},
{"txnull", OFFSETOF(wl_cnt_ver_11_t, txnull)},
{"rxnull", OFFSETOF(wl_cnt_ver_11_t, rxnull)},
{"txqosnull", OFFSETOF(wl_cnt_ver_11_t, txqosnull)},
{"rxqosnull", OFFSETOF(wl_cnt_ver_11_t, rxqosnull)},
{"txassocreq", OFFSETOF(wl_cnt_ver_11_t, txassocreq)},
{"rxassocreq", OFFSETOF(wl_cnt_ver_11_t, rxassocreq)},
{"txreassocreq", OFFSETOF(wl_cnt_ver_11_t, txreassocreq)},
{"rxreassocreq", OFFSETOF(wl_cnt_ver_11_t, rxreassocreq)},
{"txdisassoc", OFFSETOF(wl_cnt_ver_11_t, txdisassoc)},
{"rxdisassoc", OFFSETOF(wl_cnt_ver_11_t, rxdisassoc)},
{"txassocrsp", OFFSETOF(wl_cnt_ver_11_t, txassocrsp)},
{"rxassocrsp", OFFSETOF(wl_cnt_ver_11_t, rxassocrsp)},
{"txreassocrsp", OFFSETOF(wl_cnt_ver_11_t, txreassocrsp)},
{"rxreassocrsp", OFFSETOF(wl_cnt_ver_11_t, rxreassocrsp)},
{"txauth", OFFSETOF(wl_cnt_ver_11_t, txauth)},
{"rxauth", OFFSETOF(wl_cnt_ver_11_t, rxauth)},
{"txdeauth", OFFSETOF(wl_cnt_ver_11_t, txdeauth)},
{"rxdeauth", OFFSETOF(wl_cnt_ver_11_t, rxdeauth)},
{"txprobereq", OFFSETOF(wl_cnt_ver_11_t, txprobereq)},
{"rxprobereq", OFFSETOF(wl_cnt_ver_11_t, rxprobereq)},
{"txprobersp", OFFSETOF(wl_cnt_ver_11_t, txprobersp)},
{"rxprobersp", OFFSETOF(wl_cnt_ver_11_t, rxprobersp)},
{"txaction", OFFSETOF(wl_cnt_ver_11_t, txaction)},
{"rxaction", OFFSETOF(wl_cnt_ver_11_t, rxaction)},
/* macstats counters */
{"txallfrm", OFFSETOF(wl_cnt_ver_11_t, txallfrm)},
{"txrtsfrm", OFFSETOF(wl_cnt_ver_11_t, txrtsfrm)},
{"txctsfrm", OFFSETOF(wl_cnt_ver_11_t, txctsfrm)},
{"txackfrm", OFFSETOF(wl_cnt_ver_11_t, txackfrm)},
{"txdnlfrm", OFFSETOF(wl_cnt_ver_11_t, txdnlfrm)},
{"txbcnfrm", OFFSETOF(wl_cnt_ver_11_t, txbcnfrm)},
{"txfunfl[0]", OFFSETOF(wl_cnt_ver_11_t, txfunfl[0])},
{"txfunfl[1]", OFFSETOF(wl_cnt_ver_11_t, txfunfl[1])},
{"txfunfl[2]", OFFSETOF(wl_cnt_ver_11_t, txfunfl[2])},
{"txfunfl[3]", OFFSETOF(wl_cnt_ver_11_t, txfunfl[3])},
{"txfunfl[4]", OFFSETOF(wl_cnt_ver_11_t, txfunfl[4])},
{"txfunfl[5]", OFFSETOF(wl_cnt_ver_11_t, txfunfl[5])},
{"txampdu", OFFSETOF(wl_cnt_ver_11_t, txfbw)},
{"txmpdu", OFFSETOF(wl_cnt_ver_11_t, txmpdu)},
{"txtplunfl", OFFSETOF(wl_cnt_ver_11_t, txtplunfl)},
{"txphyerror", OFFSETOF(wl_cnt_ver_11_t, txphyerror)},
{"pktengrxducast", OFFSETOF(wl_cnt_ver_11_t, pktengrxducast)},
{"pktengrxdmcast", OFFSETOF(wl_cnt_ver_11_t, pktengrxdmcast)},
{"rxfrmtoolong", OFFSETOF(wl_cnt_ver_11_t, rxfrmtoolong)},
{"rxfrmtooshrt", OFFSETOF(wl_cnt_ver_11_t, rxfrmtooshrt)},
{"rxanyerr", OFFSETOF(wl_cnt_ver_11_t, rxinvmachdr)},
{"rxbadfcs", OFFSETOF(wl_cnt_ver_11_t, rxbadfcs)},
{"rxbadplcp", OFFSETOF(wl_cnt_ver_11_t, rxbadplcp)},
{"rxcrsglitch", OFFSETOF(wl_cnt_ver_11_t, rxcrsglitch)},
{"rxstrt", OFFSETOF(wl_cnt_ver_11_t, rxstrt)},
{"rxdtucastmbss", OFFSETOF(wl_cnt_ver_11_t, rxdfrmucastmbss)},
{"rxmgucastmbss", OFFSETOF(wl_cnt_ver_11_t, rxmfrmucastmbss)},
{"rxctlucast", OFFSETOF(wl_cnt_ver_11_t, rxcfrmucast)},
{"rxrtsucast", OFFSETOF(wl_cnt_ver_11_t, rxrtsucast)},
{"rxctsucast", OFFSETOF(wl_cnt_ver_11_t, rxctsucast)},
{"rxackucast", OFFSETOF(wl_cnt_ver_11_t, rxackucast)},
{"rxdtocast", OFFSETOF(wl_cnt_ver_11_t, rxdfrmocast)},
{"rxmgocast", OFFSETOF(wl_cnt_ver_11_t, rxmfrmocast)},
{"rxctlocast", OFFSETOF(wl_cnt_ver_11_t, rxcfrmocast)},
{"rxrtsocast", OFFSETOF(wl_cnt_ver_11_t, rxrtsocast)},
{"rxctsocast", OFFSETOF(wl_cnt_ver_11_t, rxctsocast)},
{"rxdtmcast", OFFSETOF(wl_cnt_ver_11_t, rxdfrmmcast)},
{"rxmgmcast", OFFSETOF(wl_cnt_ver_11_t, rxmfrmmcast)},
{"rxctlmcast", OFFSETOF(wl_cnt_ver_11_t, rxcfrmmcast)},
{"rxbeaconmbss", OFFSETOF(wl_cnt_ver_11_t, rxbeaconmbss)},
{"rxdtucastobss", OFFSETOF(wl_cnt_ver_11_t, rxdfrmucastobss)},
{"rxbeaconobss", OFFSETOF(wl_cnt_ver_11_t, rxbeaconobss)},
{"rxrsptmout", OFFSETOF(wl_cnt_ver_11_t, rxrsptmout)},
{"bcntxcancl", OFFSETOF(wl_cnt_ver_11_t, bcntxcancl)},
{"rxnodelim", OFFSETOF(wl_cnt_ver_11_t, rxnodelim)},
{"rxf0ovfl", OFFSETOF(wl_cnt_ver_11_t, rxf0ovfl)},
{"rxf1ovfl", OFFSETOF(wl_cnt_ver_11_t, rxf1ovfl)},
{"rxhlovfl", OFFSETOF(wl_cnt_ver_11_t, rxf2ovfl)},
{"missbcn_dbg", OFFSETOF(wl_cnt_ver_11_t, txsfovfl)},
{"pmqovfl", OFFSETOF(wl_cnt_ver_11_t, pmqovfl)},
{"rxcgprqfrm", OFFSETOF(wl_cnt_ver_11_t, rxcgprqfrm)},
{"rxcgprsqovfl", OFFSETOF(wl_cnt_ver_11_t, rxcgprsqovfl)},
{"txcgprsfail", OFFSETOF(wl_cnt_ver_11_t, txcgprsfail)},
{"txcgprssuc", OFFSETOF(wl_cnt_ver_11_t, txcgprssuc)},
{"prs_timeout", OFFSETOF(wl_cnt_ver_11_t, prs_timeout)},
{"txrtsfail", OFFSETOF(wl_cnt_ver_11_t, rxnack)},
{"txucast", OFFSETOF(wl_cnt_ver_11_t, frmscons)},
{"txinrtstxop", OFFSETOF(wl_cnt_ver_11_t, txnack)},
{"rxback", OFFSETOF(wl_cnt_ver_11_t, rxback)},
{"txback", OFFSETOF(wl_cnt_ver_11_t, txback)},
{"bphy_rxcrsglitch", OFFSETOF(wl_cnt_ver_11_t, bphy_rxcrsglitch)},
{"rxdrop20s", OFFSETOF(wl_cnt_ver_11_t, rxdrop20s)},
{"rxtoolate", OFFSETOF(wl_cnt_ver_11_t, rxtoolate)},
{"bphy_badplcp", OFFSETOF(wl_cnt_ver_11_t, bphy_badplcp)},
{NULL, 0},
};
#define OFFSET_MCST_V30(X) (OFFSETOF(wl_cnt_ge40mcst_v1_t, X) +\
sizeof(wl_cnt_wlc_t))
#define OFFSET_RIRNS_V30(X) (sizeof(wl_cnt_wlc_t) +\
WL_CNT_MCST_STRUCT_SZ + OFFSETOF(reinit_rsns_t, X))
static counter_offset_info_t cntr_offset_info_v30[] = {
/* wl counters */
{"txframe", OFFSETOF(wl_cnt_wlc_t, txframe)},
{"txbyte", OFFSETOF(wl_cnt_wlc_t, txbyte)},
{"txretrans", OFFSETOF(wl_cnt_wlc_t, txretrans)},
{"txerror", OFFSETOF(wl_cnt_wlc_t, txerror)},
{"txctl", OFFSETOF(wl_cnt_wlc_t, txctl)},
{"txprshort", OFFSETOF(wl_cnt_wlc_t, txprshort)},
{"txserr", OFFSETOF(wl_cnt_wlc_t, txserr)},
{"txnobuf", OFFSETOF(wl_cnt_wlc_t, txnobuf)},
{"txnoassoc", OFFSETOF(wl_cnt_wlc_t, txnoassoc)},
{"txrunt", OFFSETOF(wl_cnt_wlc_t, txrunt)},
{"txchit", OFFSETOF(wl_cnt_wlc_t, txchit)},
{"txcmiss", OFFSETOF(wl_cnt_wlc_t, txcmiss)},
{"txuflo", OFFSETOF(wl_cnt_wlc_t, txuflo)},
{"txphyerr", OFFSETOF(wl_cnt_wlc_t, txphyerr)},
{"txphycrs", OFFSETOF(wl_cnt_wlc_t, txphycrs)},
{"rxframe", OFFSETOF(wl_cnt_wlc_t, rxframe)},
{"rxbyte", OFFSETOF(wl_cnt_wlc_t, rxbyte)},
{"rxerror", OFFSETOF(wl_cnt_wlc_t, rxerror)},
{"rxctl", OFFSETOF(wl_cnt_wlc_t, rxctl)},
{"rxnobuf", OFFSETOF(wl_cnt_wlc_t, rxnobuf)},
{"rxnondata", OFFSETOF(wl_cnt_wlc_t, rxnondata)},
{"rxbadds", OFFSETOF(wl_cnt_wlc_t, rxbadds)},
{"rxbadcm", OFFSETOF(wl_cnt_wlc_t, rxbadcm)},
{"rxfragerr", OFFSETOF(wl_cnt_wlc_t, rxfragerr)},
{"rxrunt", OFFSETOF(wl_cnt_wlc_t, rxrunt)},
{"rxgiant", OFFSETOF(wl_cnt_wlc_t, rxgiant)},
{"rxnoscb", OFFSETOF(wl_cnt_wlc_t, rxnoscb)},
{"rxbadproto", OFFSETOF(wl_cnt_wlc_t, rxbadproto)},
{"rxbadsrcmac", OFFSETOF(wl_cnt_wlc_t, rxbadsrcmac)},
{"rxbadda", OFFSETOF(wl_cnt_wlc_t, rxbadda)},
{"rxfilter", OFFSETOF(wl_cnt_wlc_t, rxfilter)},
{"rxoflo", OFFSETOF(wl_cnt_wlc_t, rxoflo)},
{"rxuflo[0]", OFFSETOF(wl_cnt_wlc_t, rxuflo[0])},
{"rxuflo[1]", OFFSETOF(wl_cnt_wlc_t, rxuflo[1])},
{"rxuflo[2]", OFFSETOF(wl_cnt_wlc_t, rxuflo[2])},
{"rxuflo[3]", OFFSETOF(wl_cnt_wlc_t, rxuflo[3])},
{"rxuflo[4]", OFFSETOF(wl_cnt_wlc_t, rxuflo[4])},
{"rxuflo[5]", OFFSETOF(wl_cnt_wlc_t, rxuflo[5])},
{"d11cnt_txrts_off", OFFSETOF(wl_cnt_wlc_t, d11cnt_txrts_off)},
{"d11cnt_rxcrc_off", OFFSETOF(wl_cnt_wlc_t, d11cnt_rxcrc_off)},
{"d11cnt_txnocts_off", OFFSETOF(wl_cnt_wlc_t, d11cnt_txnocts_off)},
{"dmade", OFFSETOF(wl_cnt_wlc_t, dmade)},
{"dmada", OFFSETOF(wl_cnt_wlc_t, dmada)},
{"dmape", OFFSETOF(wl_cnt_wlc_t, dmape)},
{"reset", OFFSETOF(wl_cnt_wlc_t, reset)},
{"tbtt", OFFSETOF(wl_cnt_wlc_t, tbtt)},
{"txdmawar", OFFSETOF(wl_cnt_wlc_t, txdmawar)},
{"pkt_callback_reg_fail", OFFSETOF(wl_cnt_wlc_t, pkt_callback_reg_fail)},
{"d11_txfrag", OFFSETOF(wl_cnt_wlc_t, txfrag)},
{"d11_txmulti", OFFSETOF(wl_cnt_wlc_t, txmulti)},
{"txfail", OFFSETOF(wl_cnt_wlc_t, txfail)},
{"d11_txretry", OFFSETOF(wl_cnt_wlc_t, txretry)},
{"d11_txretrie", OFFSETOF(wl_cnt_wlc_t, txretrie)},
{"rxdup", OFFSETOF(wl_cnt_wlc_t, rxdup)},
{"d11_txrts", OFFSETOF(wl_cnt_wlc_t, txrts)},
{"d11_txnocts", OFFSETOF(wl_cnt_wlc_t, txnocts)},
{"d11_txnoack", OFFSETOF(wl_cnt_wlc_t, txnoack)},
{"d11_rxfrag", OFFSETOF(wl_cnt_wlc_t, rxfrag)},
{"d11_rxmulti", OFFSETOF(wl_cnt_wlc_t, rxmulti)},
{"rxcrc", OFFSETOF(wl_cnt_wlc_t, rxcrc)},
{"d11_txfrmsnt", OFFSETOF(wl_cnt_wlc_t, txfrmsnt)},
{"d11_rxundec", OFFSETOF(wl_cnt_wlc_t, rxundec)},
{"tkipmicfaill", OFFSETOF(wl_cnt_wlc_t, tkipmicfaill)},
{"tkipcntrmsr", OFFSETOF(wl_cnt_wlc_t, tkipcntrmsr)},
{"tkipreplay", OFFSETOF(wl_cnt_wlc_t, tkipreplay)},
{"ccmpfmterr", OFFSETOF(wl_cnt_wlc_t, ccmpfmterr)},
{"ccmpreplay", OFFSETOF(wl_cnt_wlc_t, ccmpreplay)},
{"ccmpundec", OFFSETOF(wl_cnt_wlc_t, ccmpundec)},
{"fourwayfail", OFFSETOF(wl_cnt_wlc_t, fourwayfail)},
{"wepundec", OFFSETOF(wl_cnt_wlc_t, wepundec)},
{"wepicverr", OFFSETOF(wl_cnt_wlc_t, wepicverr)},
{"decsuccess", OFFSETOF(wl_cnt_wlc_t, decsuccess)},
{"tkipicverr", OFFSETOF(wl_cnt_wlc_t, tkipicverr)},
{"wepexcluded", OFFSETOF(wl_cnt_wlc_t, wepexcluded)},
{"txchanrej", OFFSETOF(wl_cnt_wlc_t, txchanrej)},
{"psmwds", OFFSETOF(wl_cnt_wlc_t, psmwds)},
{"phywatchdog", OFFSETOF(wl_cnt_wlc_t, phywatchdog)},
{"prq_entries_handled", OFFSETOF(wl_cnt_wlc_t, prq_entries_handled)},
{"prq_undirected_entries", OFFSETOF(wl_cnt_wlc_t, prq_undirected_entries)},
{"prq_bad_entries", OFFSETOF(wl_cnt_wlc_t, prq_bad_entries)},
{"atim_suppress_count", OFFSETOF(wl_cnt_wlc_t, atim_suppress_count)},
{"bcn_template_not_ready", OFFSETOF(wl_cnt_wlc_t, bcn_template_not_ready)},
{"bcn_template_not_ready_done", OFFSETOF(wl_cnt_wlc_t, bcn_template_not_ready_done)},
{"late_tbtt_dpc", OFFSETOF(wl_cnt_wlc_t, late_tbtt_dpc)},
{"rx1mbps", OFFSETOF(wl_cnt_wlc_t, rx1mbps)},
{"rx2mbps", OFFSETOF(wl_cnt_wlc_t, rx2mbps)},
{"rx5mbps5", OFFSETOF(wl_cnt_wlc_t, rx5mbps5)},
{"rx6mbps", OFFSETOF(wl_cnt_wlc_t, rx6mbps)},
{"rx9mbps", OFFSETOF(wl_cnt_wlc_t, rx9mbps)},
{"rx11mbps", OFFSETOF(wl_cnt_wlc_t, rx11mbps)},
{"rx12mbps", OFFSETOF(wl_cnt_wlc_t, rx12mbps)},
{"rx18mbps", OFFSETOF(wl_cnt_wlc_t, rx18mbps)},
{"rx24mbps", OFFSETOF(wl_cnt_wlc_t, rx24mbps)},
{"rx36mbps", OFFSETOF(wl_cnt_wlc_t, rx36mbps)},
{"rx48mbps", OFFSETOF(wl_cnt_wlc_t, rx48mbps)},
{"rx54mbps", OFFSETOF(wl_cnt_wlc_t, rx54mbps)},
{"rx108mbps", OFFSETOF(wl_cnt_wlc_t, rx108mbps)},
{"rx162mbps", OFFSETOF(wl_cnt_wlc_t, rx162mbps)},
{"rx216mbps", OFFSETOF(wl_cnt_wlc_t, rx216mbps)},
{"rx270mbps", OFFSETOF(wl_cnt_wlc_t, rx270mbps)},
{"rx324mbps", OFFSETOF(wl_cnt_wlc_t, rx324mbps)},
{"rx378mbps", OFFSETOF(wl_cnt_wlc_t, rx378mbps)},
{"rx432mbps", OFFSETOF(wl_cnt_wlc_t, rx432mbps)},
{"rx486mbps", OFFSETOF(wl_cnt_wlc_t, rx486mbps)},
{"rx540mbps", OFFSETOF(wl_cnt_wlc_t, rx540mbps)},
{"rfdisable", OFFSETOF(wl_cnt_wlc_t, rfdisable)},
{"txexptime", OFFSETOF(wl_cnt_wlc_t, txexptime)},
{"txmpdu_sgi", OFFSETOF(wl_cnt_wlc_t, txmpdu_sgi)},
{"rxmpdu_sgi", OFFSETOF(wl_cnt_wlc_t, rxmpdu_sgi)},
{"txmpdu_stbc", OFFSETOF(wl_cnt_wlc_t, txmpdu_stbc)},
{"rxmpdu_stbc", OFFSETOF(wl_cnt_wlc_t, rxmpdu_stbc)},
{"rxundec_mcst", OFFSETOF(wl_cnt_wlc_t, rxundec_mcst)},
{"tkipmicfaill_mcst", OFFSETOF(wl_cnt_wlc_t, tkipmicfaill_mcst)},
{"tkipcntrmsr_mcst", OFFSETOF(wl_cnt_wlc_t, tkipcntrmsr_mcst)},
{"tkipreplay_mcst", OFFSETOF(wl_cnt_wlc_t, tkipreplay_mcst)},
{"ccmpfmterr_mcst", OFFSETOF(wl_cnt_wlc_t, ccmpfmterr_mcst)},
{"ccmpreplay_mcst", OFFSETOF(wl_cnt_wlc_t, ccmpreplay_mcst)},
{"ccmpundec_mcst", OFFSETOF(wl_cnt_wlc_t, ccmpundec_mcst)},
{"fourwayfail_mcst", OFFSETOF(wl_cnt_wlc_t, fourwayfail_mcst)},
{"wepundec_mcst", OFFSETOF(wl_cnt_wlc_t, wepundec_mcst)},
{"wepicverr_mcst", OFFSETOF(wl_cnt_wlc_t, wepicverr_mcst)},
{"decsuccess_mcst", OFFSETOF(wl_cnt_wlc_t, decsuccess_mcst)},
{"tkipicverr_mcst", OFFSETOF(wl_cnt_wlc_t, tkipicverr_mcst)},
{"wepexcluded_mcst", OFFSETOF(wl_cnt_wlc_t, wepexcluded_mcst)},
{"dma_hang", OFFSETOF(wl_cnt_wlc_t, dma_hang)},
{"reinit", OFFSETOF(wl_cnt_wlc_t, reinit)},
{"pstatxucast", OFFSETOF(wl_cnt_wlc_t, pstatxucast)},
{"pstatxnoassoc", OFFSETOF(wl_cnt_wlc_t, pstatxnoassoc)},
{"pstarxucast", OFFSETOF(wl_cnt_wlc_t, pstarxucast)},
{"pstarxbcmc", OFFSETOF(wl_cnt_wlc_t, pstarxbcmc)},
{"pstatxbcmc", OFFSETOF(wl_cnt_wlc_t, pstatxbcmc)},
{"cso_passthrough", OFFSETOF(wl_cnt_wlc_t, cso_passthrough)},
{"cso_normal", OFFSETOF(wl_cnt_wlc_t, cso_normal)},
{"chained", OFFSETOF(wl_cnt_wlc_t, chained)},
{"chainedsz1", OFFSETOF(wl_cnt_wlc_t, chainedsz1)},
{"unchained", OFFSETOF(wl_cnt_wlc_t, unchained)},
{"maxchainsz", OFFSETOF(wl_cnt_wlc_t, maxchainsz)},
{"currchainsz", OFFSETOF(wl_cnt_wlc_t, currchainsz)},
{"pciereset", OFFSETOF(wl_cnt_wlc_t, pciereset)},
{"cfgrestore", OFFSETOF(wl_cnt_wlc_t, cfgrestore)},
{"reinitreason[0]", OFFSETOF(wl_cnt_wlc_t, reinitreason[0])},
{"reinitreason[1]", OFFSETOF(wl_cnt_wlc_t, reinitreason[1])},
{"reinitreason[2]", OFFSETOF(wl_cnt_wlc_t, reinitreason[2])},
{"reinitreason[3]", OFFSETOF(wl_cnt_wlc_t, reinitreason[3])},
{"reinitreason[4]", OFFSETOF(wl_cnt_wlc_t, reinitreason[4])},
{"reinitreason[5]", OFFSETOF(wl_cnt_wlc_t, reinitreason[5])},
{"reinitreason[6]", OFFSETOF(wl_cnt_wlc_t, reinitreason[6])},
{"reinitreason[7]", OFFSETOF(wl_cnt_wlc_t, reinitreason[7])},
{"rxrtry", OFFSETOF(wl_cnt_wlc_t, rxrtry)},
{"rxmpdu_mu", OFFSETOF(wl_cnt_wlc_t, rxmpdu_mu)},
{"txbar", OFFSETOF(wl_cnt_wlc_t, txbar)},
{"rxbar", OFFSETOF(wl_cnt_wlc_t, rxbar)},
{"txpspoll", OFFSETOF(wl_cnt_wlc_t, txpspoll)},
{"rxpspoll", OFFSETOF(wl_cnt_wlc_t, rxpspoll)},
{"txnull", OFFSETOF(wl_cnt_wlc_t, txnull)},
{"rxnull", OFFSETOF(wl_cnt_wlc_t, rxnull)},
{"txqosnull", OFFSETOF(wl_cnt_wlc_t, txqosnull)},
{"rxqosnull", OFFSETOF(wl_cnt_wlc_t, rxqosnull)},
{"txassocreq", OFFSETOF(wl_cnt_wlc_t, txassocreq)},
{"rxassocreq", OFFSETOF(wl_cnt_wlc_t, rxassocreq)},
{"txreassocreq", OFFSETOF(wl_cnt_wlc_t, txreassocreq)},
{"rxreassocreq", OFFSETOF(wl_cnt_wlc_t, rxreassocreq)},
{"txdisassoc", OFFSETOF(wl_cnt_wlc_t, txdisassoc)},
{"rxdisassoc", OFFSETOF(wl_cnt_wlc_t, rxdisassoc)},
{"txassocrsp", OFFSETOF(wl_cnt_wlc_t, txassocrsp)},
{"rxassocrsp", OFFSETOF(wl_cnt_wlc_t, rxassocrsp)},
{"txreassocrsp", OFFSETOF(wl_cnt_wlc_t, txreassocrsp)},
{"rxreassocrsp", OFFSETOF(wl_cnt_wlc_t, rxreassocrsp)},
{"txauth", OFFSETOF(wl_cnt_wlc_t, txauth)},
{"rxauth", OFFSETOF(wl_cnt_wlc_t, rxauth)},
{"txdeauth", OFFSETOF(wl_cnt_wlc_t, txdeauth)},
{"rxdeauth", OFFSETOF(wl_cnt_wlc_t, rxdeauth)},
{"txprobereq", OFFSETOF(wl_cnt_wlc_t, txprobereq)},
{"rxprobereq", OFFSETOF(wl_cnt_wlc_t, rxprobereq)},
{"txprobersp", OFFSETOF(wl_cnt_wlc_t, txprobersp)},
{"rxprobersp", OFFSETOF(wl_cnt_wlc_t, rxprobersp)},
{"txaction", OFFSETOF(wl_cnt_wlc_t, txaction)},
{"rxaction", OFFSETOF(wl_cnt_wlc_t, rxaction)},
{"ampdu_wds", OFFSETOF(wl_cnt_wlc_t, ampdu_wds)},
{"txlost", OFFSETOF(wl_cnt_wlc_t, txlost)},
{"txdatamcast", OFFSETOF(wl_cnt_wlc_t, txdatamcast)},
{"txdatabcast", OFFSETOF(wl_cnt_wlc_t, txdatabcast)},
{"psmxwds", OFFSETOF(wl_cnt_wlc_t, psmxwds)},
{"rxback", OFFSETOF(wl_cnt_wlc_t, rxback)},
{"txback", OFFSETOF(wl_cnt_wlc_t, txback)},
{"p2p_tbtt", OFFSETOF(wl_cnt_wlc_t, p2p_tbtt)},
{"p2p_tbtt_miss", OFFSETOF(wl_cnt_wlc_t, p2p_tbtt_miss)},
/* macstats counters */
{"txallfrm", OFFSET_MCST_V30(txallfrm)},
{"txrtsfrm", OFFSET_MCST_V30(txrtsfrm)},
{"txctsfrm", OFFSET_MCST_V30(txctsfrm)},
{"txackfrm", OFFSET_MCST_V30(txackfrm)},
{"txdnlfrm", OFFSET_MCST_V30(txdnlfrm)},
{"txbcnfrm", OFFSET_MCST_V30(txbcnfrm)},
{"txfunfl[0]", OFFSET_MCST_V30(txfunfl[0])},
{"txfunfl[1]", OFFSET_MCST_V30(txfunfl[1])},
{"txfunfl[2]", OFFSET_MCST_V30(txfunfl[2])},
{"txfunfl[3]", OFFSET_MCST_V30(txfunfl[3])},
{"txfunfl[4]", OFFSET_MCST_V30(txfunfl[4])},
{"txfunfl[5]", OFFSET_MCST_V30(txfunfl[5])},
{"txampdu", OFFSET_MCST_V30(txampdu)},
{"txmpdu", OFFSET_MCST_V30(txmpdu)},
{"txtplunfl", OFFSET_MCST_V30(txtplunfl)},
{"txphyerror", OFFSET_MCST_V30(txphyerror)},
{"pktengrxducast", OFFSET_MCST_V30(pktengrxducast)},
{"pktengrxdmcast", OFFSET_MCST_V30(pktengrxdmcast)},
{"rxfrmtoolong", OFFSET_MCST_V30(rxfrmtoolong)},
{"rxfrmtooshrt", OFFSET_MCST_V30(rxfrmtooshrt)},
{"rxanyerr", OFFSET_MCST_V30(rxanyerr)},
{"rxbadfcs", OFFSET_MCST_V30(rxbadfcs)},
{"rxbadplcp", OFFSET_MCST_V30(rxbadplcp)},
{"rxcrsglitch", OFFSET_MCST_V30(rxcrsglitch)},
{"rxstrt", OFFSET_MCST_V30(rxstrt)},
{"rxdtucastmbss", OFFSET_MCST_V30(rxdtucastmbss)},
{"rxmgucastmbss", OFFSET_MCST_V30(rxmgucastmbss)},
{"rxctlucast", OFFSET_MCST_V30(rxctlucast)},
{"rxrtsucast", OFFSET_MCST_V30(rxrtsucast)},
{"rxctsucast", OFFSET_MCST_V30(rxctsucast)},
{"rxackucast", OFFSET_MCST_V30(rxackucast)},
{"rxdtocast", OFFSET_MCST_V30(rxdtocast)},
{"rxmgocast", OFFSET_MCST_V30(rxmgocast)},
{"rxctlocast", OFFSET_MCST_V30(rxctlocast)},
{"rxrtsocast", OFFSET_MCST_V30(rxrtsocast)},
{"rxctsocast", OFFSET_MCST_V30(rxctsocast)},
{"rxdtmcast", OFFSET_MCST_V30(rxdtmcast)},
{"rxmgmcast", OFFSET_MCST_V30(rxmgmcast)},
{"rxctlmcast", OFFSET_MCST_V30(rxctlmcast)},
{"rxbeaconmbss", OFFSET_MCST_V30(rxbeaconmbss)},
{"rxdtucastobss", OFFSET_MCST_V30(rxdtucastobss)},
{"rxbeaconobss", OFFSET_MCST_V30(rxbeaconobss)},
{"rxrsptmout", OFFSET_MCST_V30(rxrsptmout)},
{"bcntxcancl", OFFSET_MCST_V30(bcntxcancl)},
{"rxnodelim", OFFSET_MCST_V30(rxnodelim)},
{"rxf0ovfl", OFFSET_MCST_V30(rxf0ovfl)},
{"rxf1ovfl", OFFSET_MCST_V30(rxf1ovfl)},
{"rxhlovfl", OFFSET_MCST_V30(rxhlovfl)},
{"missbcn_dbg", OFFSET_MCST_V30(missbcn_dbg)},
{"pmqovfl", OFFSET_MCST_V30(pmqovfl)},
{"rxcgprqfrm", OFFSET_MCST_V30(rxcgprqfrm)},
{"rxcgprsqovfl", OFFSET_MCST_V30(rxcgprsqovfl)},
{"txcgprsfail", OFFSET_MCST_V30(txcgprsfail)},
{"txcgprssuc", OFFSET_MCST_V30(txcgprssuc)},
{"prs_timeout", OFFSET_MCST_V30(prs_timeout)},
{"txrtsfail", OFFSET_MCST_V30(txrtsfail)},
{"txucast", OFFSET_MCST_V30(txucast)},
{"txinrtstxop", OFFSET_MCST_V30(txinrtstxop)},
{"rxback", OFFSET_MCST_V30(rxback)},
{"txback", OFFSET_MCST_V30(txback)},
{"bphy_rxcrsglitch", OFFSET_MCST_V30(bphy_rxcrsglitch)},
{"rxdrop20s", OFFSET_MCST_V30(rxdrop20s)},
{"rxtoolate", OFFSET_MCST_V30(rxtoolate)},
{"bphy_badplcp", OFFSET_MCST_V30(bphy_badplcp)},
/* reinitreason counter */
{"reinitreason_counts[0]", OFFSET_RIRNS_V30(rsn[0])},
{"reinitreason_counts[1]", OFFSET_RIRNS_V30(rsn[1])},
{"reinitreason_counts[2]", OFFSET_RIRNS_V30(rsn[2])},
{"reinitreason_counts[3]", OFFSET_RIRNS_V30(rsn[3])},
{"reinitreason_counts[4]", OFFSET_RIRNS_V30(rsn[4])},
{"reinitreason_counts[5]", OFFSET_RIRNS_V30(rsn[5])},
{"reinitreason_counts[6]", OFFSET_RIRNS_V30(rsn[6])},
{"reinitreason_counts[7]", OFFSET_RIRNS_V30(rsn[7])},
{"reinitreason_counts[8]", OFFSET_RIRNS_V30(rsn[8])},
{"reinitreason_counts[9]", OFFSET_RIRNS_V30(rsn[9])},
{"reinitreason_counts[10]", OFFSET_RIRNS_V30(rsn[10])},
{"reinitreason_counts[11]", OFFSET_RIRNS_V30(rsn[11])},
{"reinitreason_counts[12]", OFFSET_RIRNS_V30(rsn[12])},
{"reinitreason_counts[13]", OFFSET_RIRNS_V30(rsn[13])},
{"reinitreason_counts[14]", OFFSET_RIRNS_V30(rsn[14])},
{"reinitreason_counts[15]", OFFSET_RIRNS_V30(rsn[15])},
{"reinitreason_counts[16]", OFFSET_RIRNS_V30(rsn[16])},
{"reinitreason_counts[17]", OFFSET_RIRNS_V30(rsn[17])},
{"reinitreason_counts[18]", OFFSET_RIRNS_V30(rsn[18])},
{"reinitreason_counts[19]", OFFSET_RIRNS_V30(rsn[19])},
{"reinitreason_counts[20]", OFFSET_RIRNS_V30(rsn[20])},
{"reinitreason_counts[21]", OFFSET_RIRNS_V30(rsn[21])},
{"reinitreason_counts[22]", OFFSET_RIRNS_V30(rsn[22])},
{"reinitreason_counts[23]", OFFSET_RIRNS_V30(rsn[23])},
{"reinitreason_counts[24]", OFFSET_RIRNS_V30(rsn[24])},
{"reinitreason_counts[25]", OFFSET_RIRNS_V30(rsn[25])},
{"reinitreason_counts[26]", OFFSET_RIRNS_V30(rsn[26])},
{"reinitreason_counts[27]", OFFSET_RIRNS_V30(rsn[27])},
{"reinitreason_counts[28]", OFFSET_RIRNS_V30(rsn[28])},
{"reinitreason_counts[29]", OFFSET_RIRNS_V30(rsn[29])},
{"reinitreason_counts[30]", OFFSET_RIRNS_V30(rsn[30])},
{"reinitreason_counts[31]", OFFSET_RIRNS_V30(rsn[31])},
{"reinitreason_counts[32]", OFFSET_RIRNS_V30(rsn[32])},
{"reinitreason_counts[33]", OFFSET_RIRNS_V30(rsn[33])},
{"reinitreason_counts[34]", OFFSET_RIRNS_V30(rsn[34])},
{"reinitreason_counts[35]", OFFSET_RIRNS_V30(rsn[35])},
{"reinitreason_counts[36]", OFFSET_RIRNS_V30(rsn[36])},
{"reinitreason_counts[37]", OFFSET_RIRNS_V30(rsn[37])},
{"reinitreason_counts[38]", OFFSET_RIRNS_V30(rsn[38])},
{"reinitreason_counts[39]", OFFSET_RIRNS_V30(rsn[39])},
{"reinitreason_counts[40]", OFFSET_RIRNS_V30(rsn[40])},
{"reinitreason_counts[41]", OFFSET_RIRNS_V30(rsn[41])},
{"reinitreason_counts[42]", OFFSET_RIRNS_V30(rsn[42])},
{"reinitreason_counts[43]", OFFSET_RIRNS_V30(rsn[43])},
{"reinitreason_counts[44]", OFFSET_RIRNS_V30(rsn[44])},
{"reinitreason_counts[45]", OFFSET_RIRNS_V30(rsn[45])},
{"reinitreason_counts[46]", OFFSET_RIRNS_V30(rsn[46])},
{"reinitreason_counts[47]", OFFSET_RIRNS_V30(rsn[47])},
{"reinitreason_counts[48]", OFFSET_RIRNS_V30(rsn[48])},
{"reinitreason_counts[49]", OFFSET_RIRNS_V30(rsn[49])},
{"reinitreason_counts[50]", OFFSET_RIRNS_V30(rsn[50])},
{"reinitreason_counts[51]", OFFSET_RIRNS_V30(rsn[51])},
{NULL, 0},
};
static ver_to_cntr_offset_info_t ver_to_cntr_offset_info_tbl[] = {
{&cntr_offset_info_v6[0], 6},
{&cntr_offset_info_v7[0], 7},
{&cntr_offset_info_v7[0], 7001},
{&cntr_offset_info_v11[0], 11},
{&cntr_offset_info_v30[0], 30},
{NULL, 0}
};
static const struct cnt_properties_s cnt_props[] = {
{"active_ant", 0},
{"ampdu_wds", CAT_AMPDU},
{"auto_en", 0},
{"avg_snr_per_ant0", 0},
{"avg_snr_per_ant1", 0},
{"avg_snr_per_ant2", 0},
{"bcntxcancl", CAT_TX | CAT_ERR | CAT_MCAST | CAT_UCODE},
{"bphy_badplcp", CAT_ERR | CAT_UCODE},
{"bphy_rxcrsglitch", CAT_RX | CAT_ERR | CAT_UCODE},
{"ccmpfmterr", CAT_SEC | CAT_ERR},
{"ccmpreplay", CAT_SEC | CAT_ERR},
{"ccmpundec", CAT_SEC | CAT_ERR},
{"cell_policy", 0},
{"cfgrestore", 0},
{"chained", 0},
{"chainedsz1", 0},
{"cso_normal", 0},
{"cso_passthrough", 0},
{"currchainsz", 0},
{"dbgoff46", CAT_UCODE},
{"dbgoff47", CAT_UCODE},
{"dbgoff48", CAT_UCODE},
{"decsuccess", 0},
{"dma_hang", CAT_ERR},
{"fourwayfail", CAT_ERR | CAT_CTRL | CAT_SEC | CAT_ASSOC},
{"frmscons", 0},
{"m2vmsg", 0},
{"macxsusp", 0},
{"maxchainsz", 0},
{"mboxout", 0},
{"missbcn_dbg", CAT_ERR | CAT_MCAST | CAT_UCODE | CAT_CTRL},
{"musnd", CAT_CTRL},
{"mws_antsel_ovr_rx", CAT_RX},
{"mws_antsel_ovr_tx", CAT_TX},
{"p2p_tbtt", 0},
{"p2p_tbtt_miss", CAT_ERR},
{"pciereset", CAT_ERR},
{"phywatch", CAT_UCODE},
{"pktengrxdmcast", CAT_RX | CAT_MCAST | CAT_UCODE},
{"pktengrxducast", CAT_RX | CAT_UCAST | CAT_UCODE},
{"pmqovfl", CAT_ERR | CAT_UCODE},
{"prs_timeout", CAT_ERR | CAT_UCODE},
{"reinit", CAT_ERR},
{"reinitreason_counts", CAT_ERR},
{"reset", CAT_ERR},
{"rx11mbps", CAT_RX},
{"rx12mbps", CAT_RX},
{"rx18mbps", CAT_RX},
{"rx1mbps", CAT_RX},
{"rx24mbps", CAT_RX},
{"rx2mbps", CAT_RX},
{"rx36mbps", CAT_RX},
{"rx48mbps", CAT_RX},
{"rx54mbps", CAT_RX},
{"rx5mbps5", CAT_RX},
{"rx6mbps", CAT_RX},
{"rx9mbps", CAT_RX},
{"rx_policy", CAT_RX},
{"rxackucast", CAT_RX | CAT_UCAST | CAT_UCODE},
{"rxaction", CAT_RX | CAT_CTRL},
{"rxanyerr", CAT_RX | CAT_UCODE},
{"rxassocreq", CAT_RX | CAT_CTRL | CAT_ASSOC},
{"rxassocrsp", CAT_RX | CAT_CTRL | CAT_ASSOC},
{"rxauth", CAT_RX | CAT_CTRL | CAT_SEC | CAT_ASSOC},
{"rxback", CAT_RX | CAT_UCODE},
{"rxbadcm", CAT_RX | CAT_ERR | CAT_SEC},
{"rxbadda", CAT_RX | CAT_CTRL},
{"rxbadds", CAT_RX | CAT_CTRL},
{"rxbadfcs", CAT_RX | CAT_ERR | CAT_UCODE},
{"rxbadplcp", CAT_RX | CAT_ERR | CAT_UCODE},
{"rxbadproto", CAT_RX | CAT_ERR},
{"rxbadsrcmac", CAT_RX | CAT_ERR},
{"rxbar", CAT_RX | CAT_AMPDU | CAT_CTRL},
{"rxbeaconmbss", CAT_RX | CAT_UCODE | CAT_CTRL},
{"rxbeaconobss", CAT_RX | CAT_UCODE | CAT_CTRL},
{"rxbyte", CAT_RX},
{"rxcfrmmcast", CAT_RX | CAT_MCAST | CAT_CTRL},
{"rxcfrmocast", CAT_RX | CAT_CTRL},
{"rxcfrmucast", CAT_RX | CAT_UCAST | CAT_CTRL},
{"rxcgprqfrm", CAT_RX | CAT_UCODE},
{"rxcgprsqovfl", CAT_RX | CAT_ERR | CAT_UCODE},
{"rxcount", CAT_RX},
{"rxcrc", CAT_RX},
{"rxcrsglitch", CAT_RX | CAT_ERR | CAT_UCODE},
{"rxctl", CAT_RX | CAT_CTRL},
{"rxctlmcast", CAT_RX | CAT_MCAST | CAT_UCODE | CAT_CTRL},
{"rxctlocast", CAT_RX | CAT_UCODE | CAT_CTRL},
{"rxctlucast", CAT_RX | CAT_UCAST | CAT_UCODE | CAT_CTRL},
{"rxctsocast", CAT_RX | CAT_UCODE | CAT_CTRL},
{"rxctsucast", CAT_RX | CAT_UCAST | CAT_UCODE | CAT_CTRL},
{"rxdeauth", CAT_RX | CAT_CTRL | CAT_SEC | CAT_ASSOC},
{"rxdfrmmcast", CAT_RX | CAT_MCAST},
{"rxdfrmocast", CAT_RX},
{"rxdfrmucastmbss", CAT_RX | CAT_UCAST},
{"rxdfrmucastobss", CAT_RX | CAT_UCAST},
{"rxdisassoc", CAT_RX | CAT_ERR | CAT_ASSOC},
{"rxdrop20s", CAT_RX | CAT_ERR | CAT_UCODE},
{"rxdtmcast", CAT_RX | CAT_MCAST | CAT_UCODE},
{"rxdtocast", CAT_RX | CAT_UCODE},
{"rxdtucastmbss", CAT_RX | CAT_UCAST | CAT_UCODE},
{"rxdtucastobss", CAT_RX | CAT_UCAST | CAT_UCODE},
{"rxdup", CAT_RX | CAT_ERR},
{"rxerror", CAT_RX | CAT_ERR},
{"rxf0ovfl", CAT_RX | CAT_ERR | CAT_UCODE},
{"rxf1ovfl", CAT_RX | CAT_ERR | CAT_UCODE},
{"rxf2ovfl", CAT_RX | CAT_ERR},
{"rxfilter", CAT_RX},
{"rxfrag", CAT_RX},
{"rxfragerr", CAT_RX | CAT_ERR},
{"rxframe", CAT_RX},
{"rxfrmtoolong", CAT_RX | CAT_ERR | CAT_UCODE},
{"rxfrmtooshrt", CAT_RX | CAT_ERR | CAT_UCODE},
{"rxgiant", CAT_RX},
{"rxhlovfl", CAT_RX | CAT_ERR | CAT_UCODE},
{"rxinvmachdr", CAT_RX},
{"rxmfrmmcast", CAT_RX | CAT_MCAST},
{"rxmfrmocast", CAT_RX},
{"rxmfrmucastmbss", CAT_RX | CAT_UCAST},
{"rxmgmcast", CAT_RX | CAT_MCAST | CAT_UCODE | CAT_CTRL},
{"rxmgocast", CAT_RX | CAT_UCODE | CAT_CTRL},
{"rxmgucastmbss", CAT_RX| CAT_UCAST | CAT_UCODE | CAT_CTRL},
{"rxmpdu_mu", CAT_RX},
{"rxmpdu_sgi", CAT_RX},
{"rxmpdu_stbc", CAT_RX},
{"rxmulti", CAT_RX | CAT_MCAST},
{"rxnack", CAT_RX | CAT_ERR},
{"rxnobuf", CAT_RX | CAT_ERR},
{"rxnodelim", CAT_RX | CAT_ERR | CAT_UCODE},
{"rxnondata", CAT_RX | CAT_ERR | CAT_CTRL},
{"rxnoscb", CAT_RX | CAT_ERR},
{"rxnull", CAT_RX | CAT_ERR},
{"rxprobereq", CAT_RX | CAT_CTRL},
{"rxprobersp", CAT_RX | CAT_CTRL},
{"rxpspoll", CAT_RX | CAT_CTRL},
{"rxqosnull", CAT_RX},
{"rxreassocreq", CAT_RX | CAT_CTRL | CAT_ASSOC},
{"rxreassocrsp", CAT_RX | CAT_CTRL | CAT_ASSOC},
{"rxrsptmout", CAT_RX | CAT_ERR | CAT_UCODE},
{"rxrtry", CAT_RX | CAT_ERR},
{"rxrtsocast", CAT_RX | CAT_UCODE | CAT_CTRL},
{"rxrtsucast", CAT_RX | CAT_UCAST | CAT_UCODE | CAT_CTRL},
{"rxrunt", CAT_RX | CAT_ERR},
{"rxstrt", CAT_RX | CAT_UCODE},
{"rxtoolate", CAT_RX | CAT_ERR | CAT_UCODE},
{"rxuflo", CAT_RX | CAT_ERR},
{"rxundec", CAT_RX | CAT_SEC},
{"sfb2v", 0},
{"swap_alivecheck0", 0},
{"swap_alivecheck1", 0},
{"swap_ge_rxcount0", CAT_RX},
{"swap_ge_rxcount1", CAT_RX},
{"swap_ge_snrthresh0", 0},
{"swap_ge_snrthresh1", 0},
{"swap_snrdrop0", 0},
{"swap_snrdrop1", 0},
{"swap_timer0", 0},
{"swap_timer1", 0},
{"swap_trig_event_id", 0},
{"swap_txfail0", CAT_TX | CAT_ERR},
{"swap_txfail1", CAT_TX | CAT_ERR},
{"tbtt", 0},
{"tkipcntrmsr", CAT_SEC},
{"tkipicverr", CAT_SEC},
{"tkipmicfaill", CAT_ERR | CAT_SEC},
{"tkipreplay", CAT_ERR | CAT_SEC},
{"tx_active_ant", CAT_TX},
{"tx_auto_en", CAT_TX},
{"tx_policy", CAT_TX},
{"txackfrm", CAT_TX | CAT_UCAST | CAT_UCODE},
{"txaction", CAT_TX | CAT_CTRL},
{"txallfrm", CAT_TX | CAT_UCODE},
{"txampdu", CAT_TX | CAT_AMPDU | CAT_UCODE},
{"txassocreq", CAT_TX | CAT_CTRL | CAT_ASSOC},
{"txassocrsp", CAT_TX | CAT_CTRL | CAT_ASSOC},
{"txauth", CAT_TX | CAT_CTRL | CAT_SEC | CAT_ASSOC},
{"txback", CAT_TX | CAT_UCODE},
{"txbar", CAT_TX | CAT_AMPDU},
{"txbcnfrm", CAT_TX | CAT_MCAST | CAT_UCODE | CAT_CTRL},
{"txbyte", CAT_TX},
{"txcgprsfail", CAT_TX | CAT_ERR | CAT_UCODE},
{"txcgprssuc", CAT_TX | CAT_UCODE},
{"txchanrej", CAT_TX | CAT_ERR},
{"txchit", CAT_TX},
{"txcmiss", CAT_TX | CAT_ERR},
{"txctsfrm", CAT_TX | CAT_UCODE | CAT_CTRL},
{"txdatabcast", CAT_TX | CAT_MCAST},
{"txdatamcast", CAT_TX | CAT_MCAST},
{"txdeauth", CAT_TX | CAT_ERR | CAT_CTRL | CAT_SEC | CAT_ASSOC},
{"txdisassoc", CAT_TX | CAT_ERR | CAT_CTRL | CAT_ASSOC},
{"txdmawar", CAT_TX | CAT_ERR},
{"txdnlfrm", CAT_TX | CAT_UCODE},
{"txerror", CAT_TX | CAT_ERR},
{"txfail", CAT_TX | CAT_ERR},
{"txfbw", CAT_TX},
{"txfrag", CAT_TX},
{"txfrag", CAT_TX},
{"txframe", CAT_TX},
{"txfrmsnt", CAT_TX},
{"txfunfl", CAT_TX | CAT_UCODE},
{"txinrtstxop", CAT_TX | CAT_UCODE},
{"txlost", CAT_TX | CAT_ERR},
{"txmpdu", CAT_TX | CAT_UCODE},
{"txmpdu_sgi", CAT_TX},
{"txmpdu_stbc", CAT_TX},
{"txmulti", CAT_TX | CAT_MCAST},
{"txnack", CAT_TX | CAT_ERR | CAT_UCAST},
{"txnoack", CAT_TX | CAT_ERR | CAT_UCAST},
{"txnoassoc", CAT_TX | CAT_ERR | CAT_ASSOC},
{"txnobuf", CAT_TX | CAT_ERR},
{"txnocts", CAT_TX},
{"txnull", CAT_TX},
{"txper_rts", CAT_TX | CAT_ERR | CAT_CTRL},
{"txper_ucastdt", CAT_TX | CAT_ERR | CAT_UCAST},
{"txphycrs", CAT_TX},
{"txphyerr", CAT_TX | CAT_ERR},
{"txphyerror", CAT_TX | CAT_ERR | CAT_UCODE},
{"txprobereq", CAT_TX | CAT_CTRL | CAT_ASSOC},
{"txprobersp", CAT_TX | CAT_CTRL | CAT_ASSOC},
{"txprshort", CAT_TX},
{"txpspoll", CAT_TX | CAT_CTRL},
{"txqosnull", CAT_TX | CAT_CTRL},
{"txreassocreq", CAT_TX | CAT_CTRL | CAT_ASSOC},
{"txreassocrsp", CAT_TX | CAT_CTRL | CAT_ASSOC},
{"txretrans", CAT_TX | CAT_ERR},
{"txretrie", CAT_TX | CAT_ERR | CAT_UCAST},
{"txretry", CAT_TX | CAT_ERR | CAT_UCAST},
{"txrts", CAT_TX | CAT_CTRL},
{"txrtsfail", CAT_TX | CAT_ERR | CAT_UCODE | CAT_CTRL},
{"txrtsfrm", CAT_TX | CAT_UCODE | CAT_CTRL},
{"txserr", CAT_TX | CAT_ERR},
{"txsfovfl", CAT_TX | CAT_ERR},
{"txtplunfl", CAT_TX | CAT_UCODE},
{"txucast", CAT_TX | CAT_UCAST | CAT_UCODE},
{"unchained", 0},
{"v2mmsg", 0},
{"wepicverr", CAT_ERR | CAT_SEC},
{"wepundec", CAT_SEC},
{NULL, 0}
};
static bool at_start_of_line; /**< prevents printing of empty lines */
static int
cntr_ver_to_tbl_info(uint8 counter_ver, counter_offset_info_t **cntr_offset_info_tbl)
{
uint32 index = 0;
while (ver_to_cntr_offset_info_tbl[index].offset_info_tbl != NULL) {
if (ver_to_cntr_offset_info_tbl[index].cntr_ver == counter_ver) {
*cntr_offset_info_tbl = ver_to_cntr_offset_info_tbl[index].offset_info_tbl;
return BCME_OK;
}
index++;
}
*cntr_offset_info_tbl = NULL;
return BCME_ERROR;
}
/* Returns the offset of the counter in respective version of counters structure */
/* Returns 0 - Found the offset of the counter */
/* Returns -1 - Counter name passed do not match to any counter name */
int
get_counter_offset(char *name, uint32 *offset, uint8 counter_ver)
{
uint32 index = 0;
counter_offset_info_t *offset_info_tbl = NULL;
if (cntr_ver_to_tbl_info(counter_ver, &offset_info_tbl) != BCME_OK) {
fprintf(stderr, "Unsupported counter ver %d\n", counter_ver);
return BCME_ERROR;
}
while (offset_info_tbl[index].name != NULL) {
if (!strcmp(offset_info_tbl[index].name, name)) {
*offset = htod32(offset_info_tbl[index].offset);
return BCME_OK;
}
index++;
}
fprintf(stderr, "Invalid counter name %s\n", name);
return BCME_ERROR;
}
int
print_counter_help(uint8 counter_ver)
{
uint32 index = 0;
counter_offset_info_t *offset_info_tbl = NULL;
if (cntr_ver_to_tbl_info(counter_ver, &offset_info_tbl) != BCME_OK) {
fprintf(stderr, "Unsupported counter ver %d\n", counter_ver);
return BCME_ERROR;
}
while (offset_info_tbl[index].name != NULL) {
if (index % 5 == 0) {
printf("\n");
}
printf("%s ", offset_info_tbl[index].name);
index++;
}
return BCME_OK;
}
int
wl_subcounters(void *wl, cmd_t *cmd, char **argv)
{
int err;
void *ptr;
char *endptr;
uint8 subcntdata[(MAX_SUBCOUNTER_SUPPORTED * sizeof(uint32)) +
OFFSETOF(wl_subcnt_info_t, data)];
int32 cntr_ver = -1;
uint32 cntr_num = 0;
uint32 req_len = 0;
uint32 arg_index = 1; /* 0th arg is command_name */
wl_subcnt_info_t *subcntinfo;
memset(subcntdata, 0, sizeof(subcntdata));
if (argv[arg_index] != NULL) {
cntr_ver = strtoul(argv[arg_index], &endptr, 0);
if (*endptr != '\0') {
fprintf(stderr, "Invalid cntr ver %s\n", argv[arg_index]);
return BCME_BADARG;
}
arg_index++;
}
subcntinfo = (wl_subcnt_info_t *)subcntdata;
while (argv[arg_index] != NULL) {
if (cntr_num >= MAX_SUBCOUNTER_SUPPORTED) {
fprintf(stderr, "Max counters supported: %d\n", MAX_SUBCOUNTER_SUPPORTED);
return BCME_BADARG;
}
if (get_counter_offset(argv[arg_index],
&subcntinfo->data[cntr_num], cntr_ver)) {
return BCME_BADARG;
}
arg_index++;
cntr_num++;
}
if ((cntr_ver != -1) && (cntr_num == 0)) {
print_counter_help(cntr_ver);
return BCME_OK;
}
req_len = OFFSETOF(wl_subcnt_info_t, data) + (cntr_num * sizeof(subcntinfo->data[0]));
subcntinfo->version = htod16(WL_SUBCNTR_IOV_VER);
subcntinfo->counters_version = htod16(cntr_ver);
subcntinfo->num_subcounters = htod16(cntr_num);
subcntinfo->length = htod16(req_len);
if ((err = wlu_var_getbuf_minimal(wl, cmd->name, subcntdata, req_len, &ptr))) {
return (err);
}
subcntinfo = ptr;
subcntinfo->version = dtoh16(subcntinfo->version);
subcntinfo->counters_version = dtoh16(subcntinfo->counters_version);
subcntinfo->num_subcounters = dtoh16(subcntinfo->num_subcounters);
subcntinfo->length = dtoh16(subcntinfo->length);
if ((cntr_ver == -1) || (cntr_num == 0) || (subcntinfo->num_subcounters == 0)) {
printf("FW counter Version %d\n", subcntinfo->counters_version);
return BCME_OK;
}
if ((subcntinfo->num_subcounters > MAX_SUBCOUNTER_SUPPORTED) ||
(subcntinfo->length != req_len) ||
(subcntinfo->length != OFFSETOF(wl_subcnt_info_t, data) +
(subcntinfo->num_subcounters * sizeof(subcntinfo->data[0])))) {
fprintf(stderr,
"Mismatch App:FW cntr_ver %d:%d iov_ver %d:%d num_cntr %d:%d len %d:%d\n",
cntr_ver, subcntinfo->counters_version,
WL_SUBCNTR_IOV_VER, subcntinfo->version, cntr_num,
subcntinfo->num_subcounters, req_len, subcntinfo->length);
return BCME_BADARG;
}
for (cntr_num = 0; cntr_num < subcntinfo->num_subcounters; cntr_num++) {
/* Print max 5 counters value in a single row */
if (cntr_num % 5 == 0)
printf("\n");
printf("%s %d ", argv[cntr_num + 2],
dtoh32(subcntinfo->data[cntr_num]));
}
printf("\n");
return 0;
}
/***************************************************************************************************
* The prcnt_*() functions print counter values. The purpose of the functions is to facilitate
* filtering of the counter values, e.g. when the user only wants to see non-zero values.
*/
/** Must be called before any of the other prcnt_*() functions */
void prcnt_init()
{
at_start_of_line = TRUE;
}
/**
* Returns TRUE if a counter value is allowed by the filters to be printed.
* @param cnt_filters Specifies the filters to be applied
* @param cntname The name of the variable in the 'cnt' structure
*/
static bool prcnt_filter1(struct cnt_filters_s *cnt_filters, char *cntname)
{
if (cnt_filters->filter != 0) {
const struct cnt_properties_s *cnt = &cnt_props[0];
while (cnt->name != NULL) {
if (!strcmp(cntname, cnt->name)) {
if ((cnt_filters->filter & cnt->categories) !=
cnt_filters->filter) {
// returns FALSE in non inverted case
return cnt_filters->invert_selection;
}
break;
}
cnt++;
}
if (cnt->name == NULL)
fprintf(stderr, "could not find this entry... %s\n", cntname);
}
return !cnt_filters->invert_selection;
}
/**
* Returns TRUE if a counter value is allowed by the filters to be printed.
* @param cnt_filters Specifies the filters to be applied
* @param cntname The name of the variable in the 'cnt' structure
* @param cntvalue The value of the counter
*/
static bool prcnt_filter(struct cnt_filters_s *cnt_filters, char *cntname, uint32 cntvalue)
{
if (cnt_filters->nonzero == TRUE && cntvalue == 0)
return FALSE;
return prcnt_filter1(cnt_filters, cntname);
}
/**
* For non-legacy mode (so user specified filter options): prevents empty lines when printing
* counter values. For legacy mode: empty lines are preserved for backwards compatibility of tools
* that interpret wl utility output.
* @param cnt_filters User specified filters to apply
* @param ppbuf Output buffer for the sprintf
*/
void prcnt_prnl1(struct cnt_filters_s *cnt_filters)
{
if (at_start_of_line == FALSE || cnt_filters->filters_active == FALSE) {
printf("\n");
at_start_of_line = TRUE;
}
}
static int wl_counters_cbfn(void *ctx, const uint8 *data, uint16 type, uint16 len)
{
int err = BCME_OK;
wl_cnt_cbfn_info_t *cbfn_info = ctx;
uint i;
struct cnt_filters_s *p_cnt_filters = &cbfn_info->cnt_filters;
PRINIT(); /* initializes printing of counter values */
switch (type) {
case WL_CNT_XTLV_WLC_RINIT_RSN: {
/* reinit reason counters */
reinit_rsns_t *cnt = (reinit_rsns_t *)data;
uint32 *val = cnt->rsn;
uint maxoffset = len/sizeof(uint32);
if (len > sizeof(reinit_rsns_t)) {
printf("type %d: cntbuf length too long! %d > %d\n"
"May need to use up-to-date wl utility.\n",
type, len, (int)sizeof(reinit_rsns_t));
}
if (cnt->rsn[0] != INVALID_CNT_VAL) {
PRSTR(reinitreason_counts, "reinitreason_counts: ");
for (i = 0; i < WL_REINIT_RC_LAST && i < maxoffset; i++) {
PRVAL_FMTSTR2(reinitreason_counts, "%d(%d) ", i, val[i]);
}
PRNL1();
}
break;
}
case WL_CNT_XTLV_WLC: {
/* WLC layer counters */
wl_cnt_wlc_t *cnt = (wl_cnt_wlc_t *)data;
if (len > sizeof(wl_cnt_wlc_t)) {
printf("type %d: cntbuf length too long! %d > %d\n"
"May need to use up-to-date wl utility.\n",
type, len, (int)sizeof(wl_cnt_wlc_t));
}
PRVALSF(reinit);
/* Display old reinitreason counts */
if (cnt->reinitreason[0] != INVALID_CNT_VAL) {
PRSTR(reinitreason_counts, "reinitreason_counts: ");
for (i = 0; i < NREINITREASONCOUNT; i++)
PRVAL_FMTSTR2(reinitreason_counts, "%d(%d) ",
i, cnt->reinitreason[i]);
PRNL1();
}
PRVALSF(reset); PRVALSF(pciereset); PRVALSF(cfgrestore);
PRVALSF(dma_hang); PRVALSF(ampdu_wds); PRNL1();
PRVALSF(txframe); PRVALSF(txbyte); PRVALSF(txretrans); PRVALSF(txlost);
PRVALSF(txfail); PRVALSF(txchanrej);
if (cbfn_info->cntr_ver == WL_CNT_VERSION_7001) PRVALSF_RENAME(phywatchdog,rxbcnlossmbss);
PRNL1();
PRVALSF(txdatamcast); PRVALSF(txdatabcast); PRNL1();
PRVALSF(tbtt); PRVALSF(p2p_tbtt); PRVALSF(p2p_tbtt_miss); PRNL1();
PRVALSF(rxframe); PRVALSF(rxbyte); PRVALSF(rxerror); PRNL1();
PRVALSF(txprshort); PRVALSF(txdmawar); PRVALSF(txnobuf); PRVALSF(txnoassoc);
PRVALSF(txchit); PRVALSF(txcmiss); PRNL1();
PRVALSF(txserr); PRVALSF(txphyerr); PRVALSF(txphycrs); PRVALSF(txerror);
PRNL1();
PRVALSF_RENAME(txfrag, d11_txfrag); PRVALSF_RENAME(txmulti, d11_txmulti);
PRVALSF_RENAME(txretry, d11_txretry);
PRVALSF_RENAME(txretrie, d11_txretrie); PRNL1();
PRVALSF_RENAME(txrts, d11_txrts); PRVALSF_RENAME(txnocts, d11_txnocts);
PRVALSF_RENAME(txnoack, d11_txnoack);
PRVALSF_RENAME(txfrmsnt, d11_txfrmsnt); PRNL1();
PRVALSF(rxcrc); PRVALSF(rxnobuf); PRVALSF(rxnondata); PRVALSF(rxbadds);
PRVALSF(rxbadcm); PRVALSF(rxdup); PRVALSF(rxfragerr); PRNL1();
PRVALSF(rxrunt); PRVALSF(rxgiant); PRVALSF(rxnoscb); PRVALSF(rxbadproto);
PRVALSF(rxbadsrcmac); PRVALSF(rxrtry); PRNL1();
PRVALSF_RENAME(rxfrag, d11_rxfrag); PRVALSF_RENAME(rxmulti, d11_rxmulti);
PRVALSF_RENAME(rxundec, d11_rxundec); PRNL1();
PRVALSF(rxctl); PRVALSF(rxbadda); PRVALSF(rxfilter);
if (cnt->rxuflo[0] != INVALID_CNT_VAL) {
PRSTR(rxuflo, "rxuflo: ");
for (i = 0; i < NFIFO; i++)
PRVAL_FMTSTR1(rxuflo, "%u ", cnt->rxuflo[i]);
PRNL1();
}
/* WPA2 counters */
PRNL1();
PRVALSF(tkipmicfaill); PRVALSF(tkipicverr); PRVALSF(tkipcntrmsr); PRNL1();
PRVALSF(tkipreplay); PRVALSF(ccmpfmterr); PRVALSF(ccmpreplay); PRNL1();
PRVALSF(ccmpundec); PRVALSF(fourwayfail); PRVALSF(wepundec); PRNL1();
PRVALSF(wepicverr); PRVALSF(decsuccess); PRVALSF(rxundec); PRNL1();
PRNL1();
/* per-rate receive counters */
PRVALSF(rx1mbps); PRVALSF(rx2mbps); PRVALSF(rx5mbps5);
PRVALSF(rx11mbps); PRNL1();
PRVALSF(rx6mbps); PRVALSF(rx9mbps); PRVALSF(rx12mbps);
PRVALSF(rx18mbps); PRNL1();
PRVALSF(rx24mbps); PRVALSF(rx36mbps); PRVALSF(rx48mbps);
PRVALSF(rx54mbps); PRNL1();
PRVALSF(txmpdu_sgi); PRVALSF(rxmpdu_sgi); PRVALSF(txmpdu_stbc);
PRVALSF(rxmpdu_stbc); PRVALSF(rxmpdu_mu); PRNL1();
PRVALSF(cso_normal); PRVALSF(cso_passthrough);
PRNL1();
PRVALSF(chained); PRVALSF(chainedsz1); PRVALSF(unchained);
PRVALSF(maxchainsz); PRVALSF(currchainsz); PRNL1();
PRNL1();
/* detailed amangement and control frame counters */
PRVALSF(txbar); PRVALSF(txpspoll); PRVALSF(rxbar);
PRVALSF(rxpspoll); PRNL1();
PRVALSF(txnull); PRVALSF(txqosnull); PRVALSF(rxnull);
PRVALSF(rxqosnull); PRNL1();
PRVALSF(txassocreq); PRVALSF(txreassocreq); PRVALSF(txdisassoc);
PRVALSF(txassocrsp); PRVALSF(txreassocrsp); PRNL1();
PRVALSF(txauth); PRVALSF(txdeauth); PRVALSF(txprobereq);
PRVALSF(txprobersp); PRVALSF(txaction); PRNL1();
PRVALSF(rxassocreq); PRVALSF(rxreassocreq); PRVALSF(rxdisassoc);
PRVALSF(rxassocrsp); PRVALSF(rxreassocrsp); PRNL1();
PRVALSF(rxauth); PRVALSF(rxdeauth); PRVALSF(rxprobereq);
PRVALSF(rxprobersp); PRVALSF(rxaction); PRNL1();
break;
}
case WL_CNT_XTLV_CNTV_LE10_UCODE: {
wl_cnt_v_le10_mcst_t *cnt = (wl_cnt_v_le10_mcst_t *)data;
if (len != sizeof(wl_cnt_v_le10_mcst_t)) {
printf("type %d: cnt struct length mismatch! %d != %d\n",
type, len, (int)sizeof(wl_cnt_v_le10_mcst_t));
}
/* UCODE SHM counters */
PRVAL(txallfrm); PRVAL(txbcnfrm); PRVAL(txrtsfrm);
PRVAL(txctsfrm); PRVAL(txackfrm); PRVAL(txback);
PRVAL(txdnlfrm); PRNL1();
PRSTR(txfunfl, "txfunfl: ");
for (i = 0; i < NFIFO; i++) {
PRVAL_FMTSTR1(txfunfl, "%u ", cnt->txfunfl[i]);
}
PRVAL(txtplunfl); PRVAL(txphyerror); PRNL1();
PRNL1();
PRVAL(rxstrt); PRVAL(rxbadplcp); PRVAL(rxcrsglitch);
PRVAL(rxtoolate); PRNL1();
PRVAL(rxdrop20s); PRVAL(rxrsptmout); PRNL1();
PRVAL(rxbadfcs); PRVAL(rxfrmtoolong); PRVAL(rxfrmtooshrt);
PRVAL(rxinvmachdr); PRNL1();
PRVAL(rxf0ovfl); PRVAL(rxf1ovfl); PRVAL(rxf2ovfl);
PRVAL(txsfovfl); PRVAL(pmqovfl); PRNL1();
PRVAL(rxcfrmucast); PRVAL(rxrtsucast); PRVAL(rxctsucast);
PRVAL(rxackucast); PRVAL(rxback); PRNL1();
PRVAL(rxbeaconmbss); PRVAL(rxdfrmucastmbss);
PRVAL(rxmfrmucastmbss); PRNL1();
PRVAL(rxbeaconobss); PRVAL(rxdfrmucastobss);
PRVAL(rxdfrmocast); PRVAL(rxmfrmocast); PRNL1();
PRVAL(rxcfrmocast); PRVAL(rxrtsocast); PRVAL(rxctsocast); PRNL1();
PRVAL(rxcfrmmcast); PRVAL(rxdfrmmcast); PRVAL(rxmfrmmcast); PRNL1();
PRNL1();
PRVAL(rxcgprqfrm); PRVAL(rxcgprsqovfl);
PRVAL(txcgprsfail); PRVAL(txcgprssuc); PRVAL(prs_timeout); PRNL1();
PRVAL(pktengrxducast); PRVAL(pktengrxdmcast);
PRVAL(bcntxcancl); PRNL1();
PRVAL(txfbw); PRVAL(rxnack); PRVAL(frmscons);
PRVAL(txnack); PRNL1();
PRNL1();
break;
}
case WL_CNT_XTLV_LT40_UCODE_V1: {
wl_cnt_lt40mcst_v1_t *cnt = (wl_cnt_lt40mcst_v1_t *)data;
if (len != sizeof(wl_cnt_lt40mcst_v1_t)) {
printf("type %d: cnt struct length mismatch! %d != %d\n",
type, len, (int)sizeof(wl_cnt_lt40mcst_v1_t));
}
PRCNT_MACSTAT_TX_VER_GE11;
/* rx start and those that do not end well */
PRVAL(rxstrt); PRVAL(rxbadplcp); PRVAL(rxcrsglitch);
PRVAL(rxtoolate); PRVAL(rxnodelim); PRNL1();
PRVAL(bphy_badplcp); PRVAL(bphy_rxcrsglitch); PRNL1();
PRVAL(rxbadfcs); PRVAL(rxfrmtoolong); PRVAL(rxfrmtooshrt);
PRVAL(rxanyerr); PRNL1();
PRVAL(rxf0ovfl); PRVAL(pmqovfl); PRNL1();
PRCNT_MACSTAT_RX_VER_GE11;
PRNL1();
PRVAL(dbgoff46); PRVAL(dbgoff47);
PRVAL(dbgoff48); PRVAL(phywatch); PRNL1();
PRNL1();
break;
}
case WL_CNT_XTLV_GE40_UCODE_V1: {
wl_cnt_ge40mcst_v1_t *cnt = (wl_cnt_ge40mcst_v1_t *)data;
if (len != sizeof(wl_cnt_ge40mcst_v1_t)) {
printf("type %d: cnt struct length mismatch! %d != %d\n",
type, len, (int)sizeof(wl_cnt_ge40mcst_v1_t));
}
PRCNT_MACSTAT_TX_VER_GE11;
/* rx start and those that do not end well */
PRVAL(rxstrt); PRVAL(rxbadplcp); PRVAL(rxcrsglitch);
PRVAL(rxtoolate); PRVAL(rxnodelim); PRNL1();
PRVAL(rxdrop20s); PRVAL(bphy_badplcp); PRVAL(bphy_rxcrsglitch); PRNL1();
PRVAL(rxbadfcs); PRVAL(rxfrmtoolong); PRVAL(rxfrmtooshrt);
PRVAL(rxanyerr); PRNL1();
PRVAL(rxf0ovfl); PRVAL(rxf1ovfl); PRVAL(rxhlovfl); PRVAL(pmqovfl); PRNL1();
PRCNT_MACSTAT_RX_VER_GE11;
PRVAL(missbcn_dbg); PRNL1();
PRNL1();
break;
}
case WL_CNT_XTLV_GE64_UCODEX_V1: {
wl_cnt_ge64mcxst_v1_t *cnt = (wl_cnt_ge64mcxst_v1_t *)data;
if (len != sizeof(wl_cnt_ge64mcxst_v1_t)) {
printf("type %d: cnt struct length mismatch! %d != %d\n",
type, len, (int)sizeof(wl_cnt_ge64mcxst_v1_t));
}
PRVAL(macxsusp); PRVAL(m2vmsg); PRVAL(v2mmsg); PRNL1();
PRVAL(mboxout); PRVAL(musnd); PRVAL(sfb2v);
PRNL1();
break;
}
default:
printf("Unknown counters type %d!! You may try updating wl utility.\n",
type);
break;
}
return err;
}
int
wl_counters(void *wl, cmd_t *cmd, char **argv)
{
wl_cnt_info_t *cntinfo;
int err;
void *ptr;
uint16 ver;
uint8 *cntdata;
uint32 corerev = 0;
wl_cnt_cbfn_info_t cbfn_info;
#ifdef WL_NAN
wl_nan_ioc_t*nanioc;
uint16 iocsz = sizeof(wl_nan_ioc_t) + WL_NAN_IOC_BUFSZ;
#endif /* WL_NAN */
memset(&cbfn_info, 0, sizeof(cbfn_info));
while (*++argv != NULL) {
cbfn_info.cnt_filters.filters_active = TRUE;
if (!strcmp(*argv, "--nz"))
cbfn_info.cnt_filters.nonzero = TRUE;
else if (!strcmp(*argv, "--invert")) /* inverts entire selection */
cbfn_info.cnt_filters.invert_selection = TRUE;
else if (!strcmp(*argv, "--rx"))
cbfn_info.cnt_filters.filter |= CAT_RX;
else if (!strcmp(*argv, "--tx"))
cbfn_info.cnt_filters.filter |= CAT_TX;
else if (!strcmp(*argv, "--err"))
cbfn_info.cnt_filters.filter |= CAT_ERR;
else if (!strcmp(*argv, "--ucast"))
cbfn_info.cnt_filters.filter |= CAT_UCAST;
else if (!strcmp(*argv, "--mcast")) /* includes broadcast frames */
cbfn_info.cnt_filters.filter |= CAT_MCAST;
else if (!strcmp(*argv, "--ampdu"))
cbfn_info.cnt_filters.filter |= CAT_AMPDU;
else if (!strcmp(*argv, "--ucode"))
cbfn_info.cnt_filters.filter |= CAT_UCODE;
else if (!strcmp(*argv, "--ctrl"))
cbfn_info.cnt_filters.filter |= CAT_CTRL;
else if (!strcmp(*argv, "--sec"))
cbfn_info.cnt_filters.filter |= CAT_SEC;
else if (!strcmp(*argv, "--assoc"))
cbfn_info.cnt_filters.filter |= CAT_ASSOC;
else {
fprintf(stderr, "unrecognized option %s\n", *argv);
err = BCME_ERROR;
goto exit;
}
}
if ((err = wlu_var_getbuf_med (wl, cmd->name, NULL, 0, &ptr))) {
goto exit;
}
cntinfo = ptr;
cntinfo->version = dtoh16(cntinfo->version);
cntinfo->datalen = dtoh16(cntinfo->datalen);
CHK_CNTBUF_DATALEN(cntinfo, WLC_IOCTL_MEDLEN);
ver = cntinfo->version;
if (ver > WL_CNT_T_VERSION && ver != WL_CNT_VERSION_7001) {
printf("\tIncorrect version of counters struct: expected %d; got %d\n",
WL_CNT_T_VERSION, ver);
err = BCME_ERROR;
goto exit;
}
printf("counters_version %d\n", ver);
if (ver == WL_CNT_VERSION_11) {
wlc_rev_info_t revinfo;
memset(&revinfo, 0, sizeof(revinfo));
err = wlu_get(wl, WLC_GET_REVINFO, &revinfo, sizeof(revinfo));
if (err) {
printf("%s: WLC_GET_REVINFO failed %d\n", __FUNCTION__, err);
goto exit;
}
corerev = dtoh32(revinfo.corerev);
}
err = wl_cntbuf_to_xtlv_format(NULL, cntinfo, WLC_IOCTL_MEDLEN, corerev);
if (err) {
printf("%s: wl_cntbuf_to_xtlv_format failed %d\n", __FUNCTION__, err);
goto exit;
}
/* Now counter buffer of all versions is translated to xtlv format */
printf("datalen %d\n", cntinfo->datalen);
cntdata = (uint8 *)malloc(cntinfo->datalen);
if (cntdata == NULL) {
err = BCME_NOMEM;
printf("malloc fail!\n");
goto exit;
};
memcpy(cntdata, cntinfo->data, cntinfo->datalen);
cbfn_info.cntr_ver = ver;
if ((err = bcm_unpack_xtlv_buf(&cbfn_info, cntdata, cntinfo->datalen,
BCM_XTLV_OPTION_ALIGN32, wl_counters_cbfn))) {
printf("error %d\n", err);
}
free(cntdata);
exit:
#ifdef WL_NAN
/* alloc mem for ioctl headr + tlv data */
nanioc = calloc(1, iocsz);
if (nanioc == NULL)
return BCME_NOMEM;
/* make up nan cmd ioctl header */
nanioc->version = htod16(WL_NAN_IOCTL_VERSION);
nanioc->id = WL_NAN_CMD_CFG_COUNT;
nanioc->len = WL_NAN_IOC_BUFSZ;
wl_nan_do_get_ioctl(wl, nanioc, iocsz);
free(nanioc);
#endif /* WL_NAN */
return err;
}
int
wl_if_counters(void *wl, cmd_t *cmd, char **argv)
{
char *statsbuf;
wl_if_stats_t *cnt;
int err;
void *ptr;
struct cnt_filters_s cnt_filters;
struct cnt_filters_s *p_cnt_filters = &cnt_filters;
UNUSED_PARAMETER(argv);
memset(&cnt_filters, 0, sizeof(cnt_filters));
if ((err = wlu_var_getbuf_med (wl, cmd->name, NULL, 0, &ptr)))
return (err);
statsbuf = (char *)ptr;
cnt = (wl_if_stats_t*)malloc(sizeof(wl_if_stats_t));
if (cnt == NULL) {
printf("\tCan not allocate %d bytes for counters struct\n",
(int)sizeof(wl_if_stats_t));
return BCME_NOMEM;
} else
memcpy(cnt, statsbuf, sizeof(wl_if_stats_t));
/* summary stat counter line */
PRINIT();
PRVAL(txframe); PRVAL(txbyte); PRVAL(txerror);
PRVAL(rxframe); PRVAL(rxbyte); PRVAL(rxerror); PRNL1();
PRVAL(txnobuf); PRVAL(txfail); PRNL1();
PRVALSF_RENAME(txfrag, d11_txfrag);
PRVALSF_RENAME(txmulti, d11_txmulti);
PRVALSF_RENAME(txretry, d11_txretry);
PRVALSF_RENAME(txretrie, d11_txretrie);
PRNL1();
PRVALSF_RENAME(txfrmsnt, d11_txfrmsnt);
PRNL1();
PRVAL(rxnobuf); PRVAL(rxfragerr); PRNL1();
PRVAL(rxrunt); PRNL1();
PRVALSF_RENAME(rxmulti, d11_rxmulti);
PRNL1();
if (dtoh16(cnt->length) > OFFSETOF(wl_if_stats_t, txexptime)) {
PRVAL(txexptime);
PRVAL(txrts); PRVAL(txnocts);
}
PRNL1();
if (cnt)
free(cnt);
return (0);
}
int
wl_delta_stats(void *wl, cmd_t *cmd, char **argv)
{
char *statsbuf;
wl_delta_stats_t *cnt;
int err;
void *ptr;
struct cnt_filters_s cnt_filters;
struct cnt_filters_s *p_cnt_filters = &cnt_filters;
UNUSED_PARAMETER(cmd);
UNUSED_PARAMETER(argv);
memset(&cnt_filters, 0, sizeof(cnt_filters));
if ((err = wlu_var_getbuf_med (wl, cmd->name, NULL, 0, &ptr)))
return (err);
statsbuf = (char *)ptr;
cnt = (wl_delta_stats_t*)malloc(sizeof(wl_delta_stats_t));
if (cnt == NULL) {
printf("\tCan not allocate %d bytes for wl delta stats struct\n",
(int)sizeof(wl_delta_stats_t));
return BCME_NOMEM;
}
memcpy(cnt, statsbuf, sizeof(wl_delta_stats_t));
cnt->version = dtoh16(cnt->version);
cnt->length = dtoh16(cnt->length);
if (cnt->version != WL_DELTA_STATS_T_VERSION) {
printf("\tIncorrect version of delta stats struct: expected %d; got %d\n",
WL_DELTA_STATS_T_VERSION, cnt->version);
free(cnt);
return -1;
}
PRINIT();
PRVAL(txframe); PRVAL(txbyte); PRVAL(txretrans); PRVAL(txfail); PRNL1();
PRVAL(rxframe); PRVAL(rxbyte); PRNL1();
PRVAL(rx1mbps); PRVAL(rx2mbps); PRVAL(rx5mbps5); PRVAL(rx6mbps); PRNL1();
PRVAL(rx9mbps); PRVAL(rx11mbps); PRVAL(rx12mbps); PRVAL(rx18mbps); PRNL1();
PRVAL(rx24mbps); PRVAL(rx36mbps); PRVAL(rx48mbps); PRVAL(rx54mbps); PRNL1();
PRNL1();
PRVAL(rxbadplcp); PRVAL(rxcrsglitch); PRVAL(bphy_rxcrsglitch); PRVAL(bphy_badplcp);
PRNL1();
if (cnt != NULL)
free(cnt);
return (0);
}
int
wl_swdiv_stats(void *wl, cmd_t *cmd, char **argv)
{
char *statsbuf;
struct wlc_swdiv_stats_v1 *cnt_v1;
struct wlc_swdiv_stats_v2 *cnt;
int err = BCME_OK;
void *ptr;
struct cnt_filters_s cnt_filters;
struct cnt_filters_s *p_cnt_filters = &cnt_filters;
memset(&cnt_filters, 0, sizeof(cnt_filters));
UNUSED_PARAMETER(cmd);
UNUSED_PARAMETER(argv);
if ((err = wlu_var_getbuf_med (wl, cmd->name, NULL, 0, &ptr)))
return (err);
statsbuf = (char *)ptr;
/* Check for the firmware version and process accordingly */
if (wlc_ver_major(wl) <= 5) {
cnt_v1 = (struct wlc_swdiv_stats_v1*)malloc(sizeof(struct wlc_swdiv_stats_v1));
if (cnt_v1 == NULL) {
printf("\tCan not allocate %d bytes for wl swdiv stats struct\n",
(int)sizeof(struct wlc_swdiv_stats_v2));
return (-1);
}
memcpy(cnt_v1, statsbuf, sizeof(struct wlc_swdiv_stats_v1));
PRINIT();
PRVALV1(mws_antsel_ovr_tx); PRVALV1(mws_antsel_ovr_rx); PRNL1();
PRVALV1(rx_policy); PRVALV1(tx_policy); PRVALV1(cell_policy); PRNL1();
PRVALV1(auto_en); PRVALV1(active_ant); PRVALV1(rxcount); PRNL1();
PRVALV1(tx_auto_en); PRVALV1(tx_active_ant); PRNL1();
PRVALV1(avg_snr_per_ant0); PRVALV1(avg_snr_per_ant1);
PRVALV1(avg_snr_per_ant2); PRNL1();
PRVALV1(swap_ge_rxcount0); PRVALV1(swap_ge_rxcount1); PRNL1();
PRVALV1(swap_ge_snrthresh0); PRVALV1(swap_ge_snrthresh1); PRNL1();
PRVALV1(swap_txfail0); PRVALV1(swap_txfail1); PRNL1();
PRVALV1(swap_timer0); PRVALV1(swap_timer1); PRNL1();
PRVALV1(swap_alivecheck0); PRVALV1(swap_alivecheck1); PRNL1();
PRVALV1(swap_snrdrop0); PRVALV1(swap_snrdrop1); PRNL1();
PRVALV1(swap_trig_event_id); PRNL1();
PRNL1();
} else {
cnt = (struct wlc_swdiv_stats_v2*)malloc(sizeof(struct wlc_swdiv_stats_v2));
if (cnt == NULL) {
printf("\tCan not allocate %d bytes for wl swdiv stats struct\n",
(int)sizeof(struct wlc_swdiv_stats_v2));
return (-1);
}
memcpy(cnt, statsbuf, sizeof(struct wlc_swdiv_stats_v2));
if (cnt->version != 0) {
err = BCME_USAGE_ERROR;
goto exit;
}
PRINIT();
PRVAL(mws_antsel_ovr_tx); PRVAL(mws_antsel_ovr_rx); PRNL1();
PRVAL(rx_policy); PRVAL(tx_policy); PRVAL(cell_policy); PRNL1();
PRVAL(auto_en); PRVAL(active_ant); PRVAL(rxcount); PRNL1();
PRVAL(tx_auto_en); PRVAL(tx_active_ant); PRNL1();
PRVAL(avg_snr_per_ant0); PRVAL(avg_snr_per_ant1);
PRVAL(avg_snr_per_ant2); PRNL1();
PRVAL(swap_ge_rxcount0); PRVAL(swap_ge_rxcount1); PRNL1();
PRVAL(swap_ge_snrthresh0); PRVAL(swap_ge_snrthresh1); PRNL1();
PRVAL(swap_txfail0); PRVAL(swap_txfail1); PRNL1();
PRVAL(swap_timer0); PRVAL(swap_timer1); PRNL1();
PRVAL(swap_alivecheck0); PRVAL(swap_alivecheck1); PRNL1();
PRVAL(swap_snrdrop0); PRVAL(swap_snrdrop1); PRNL1();
PRVAL(swap_trig_event_id); PRNL1();
PRNL1();
}
exit :
if (wlc_ver_major(wl) <= 5) {
if (cnt_v1 != NULL)
free(cnt_v1);
} else {
if (cnt)
free(cnt);
}
return err;
}
int
wl_clear_counters(void *wl, cmd_t *cmd, char **argv)
{
int err;
int val;
#ifdef WL_NAN
wl_nan_ioc_t*nanioc;
uint16 iocsz = sizeof(wl_nan_ioc_t) + WL_NAN_IOC_BUFSZ;
#endif /* WL_NAN */
UNUSED_PARAMETER(argv);
if ((err = wlu_iovar_getint(wl, cmd->name, &val)))
return (err);
#ifdef WL_NAN
/* alloc mem for ioctl headr + tlv data */
nanioc = calloc(1, iocsz);
if (nanioc == NULL)
return BCME_NOMEM;
/* make up nan cmd ioctl header */
nanioc->version = htod16(WL_NAN_IOCTL_VERSION);
nanioc->id = WL_NAN_CMD_CFG_CLEARCOUNT;
nanioc->len = WL_NAN_IOC_BUFSZ;
wl_nan_do_get_ioctl(wl, nanioc, iocsz);
free(nanioc);
#endif /* WL_NAN */
return (0);
}