wlc->qvalid = 0;
}
- /* phy tx error */
- if (macintstatus & MI_PHYTXERR) {
- wlc->pub->_cnt->txphyerr++;
- }
-
/* received data or control frame, MI_DMAINT is indication of RX_FIFO interrupt */
if (macintstatus & MI_DMAINT) {
if (wlc_bmac_recv(wlc_hw, RX_FIFO, bounded)) {
printk_once("%s : PSM Watchdog, chipid 0x%x, chiprev 0x%x\n",
__func__, wlc_hw->sih->chip,
wlc_hw->sih->chiprev);
-
- wlc->pub->_cnt->psmwds++;
-
/* big hammer */
wl_init(wlc->wl);
}
if (macintstatus & MI_RFDISABLE) {
BCMMSG(wlc->wiphy, "wl%d: BMAC Detected a change on the"
" RF Disable Input\n", wlc_hw->unit);
- wlc->pub->_cnt->rfdisable++;
wl_rfkill_set_hw_state(wlc->wl);
}
{
BCMMSG(wlc_hw->wlc->wiphy, "wl%d\n", wlc_hw->unit);
- wlc_hw->wlc->pub->_cnt->reset++;
-
/* reset the core */
if (!DEVICEREMOVED(wlc_hw->wlc))
wlc_bmac_corereset(wlc_hw, WLC_USE_COREFLAGS);
if (intstatus & I_RO) {
wiphy_err(wiphy, "wl%d: fifo %d: receive fifo "
"overflow\n", unit, idx);
- wlc_hw->wlc->pub->_cnt->rxoflo++;
fatal = true;
}
if (intstatus & I_PC) {
wiphy_err(wiphy, "wl%d: fifo %d: descriptor error\n",
unit, idx);
- wlc_hw->wlc->pub->_cnt->dmade++;
fatal = true;
}
if (intstatus & I_PD) {
wiphy_err(wiphy, "wl%d: fifo %d: data error\n", unit,
idx);
- wlc_hw->wlc->pub->_cnt->dmada++;
fatal = true;
}
if (intstatus & I_DE) {
wiphy_err(wiphy, "wl%d: fifo %d: descriptor protocol "
"error\n", unit, idx);
- wlc_hw->wlc->pub->_cnt->dmape++;
fatal = true;
}
if (intstatus & I_RU) {
wiphy_err(wiphy, "wl%d: fifo %d: receive descriptor "
"underflow\n", idx, unit);
- wlc_hw->wlc->pub->_cnt->rxuflo[idx]++;
}
if (intstatus & I_XU) {
wiphy_err(wiphy, "wl%d: fifo %d: transmit fifo "
"underflow\n", idx, unit);
- wlc_hw->wlc->pub->_cnt->txuflo++;
fatal = true;
}
uint next_frag_len,
wsec_key_t *key,
ratespec_t rspec_override);
-
-static void wlc_ctrupd_cache(u16 cur_stat, u16 *macstat_snapshot, u32 *macstat);
static void wlc_bss_default_init(struct wlc_info *wlc);
static void wlc_ucode_mac_upd(struct wlc_info *wlc);
static ratespec_t mac80211_wlc_set_nrate(struct wlc_info *wlc,
wlc->cfg->wlc = wlc;
pub->txmaxpkts = MAXTXPKTS;
- pub->_cnt->version = WL_CNT_T_VERSION;
- pub->_cnt->length = sizeof(struct wl_cnt);
-
wlc_wme_initparams_sta(wlc, &wlc->wme_param_ie);
wlc->mimoft = FT_HT;
#endif /* defined(BCMDBG) */
}
-static void
-wlc_ctrupd_cache(u16 cur_stat, u16 *macstat_snapshot, u32 *macstat)
-{
- u16 v;
- u16 delta;
-
- v = le16_to_cpu(cur_stat);
- delta = (u16)(v - *macstat_snapshot);
-
- if (delta != 0) {
- *macstat += delta;
- *macstat_snapshot = v;
- }
-}
-
-#define MACSTATUPD(name) \
- wlc_ctrupd_cache(macstats.name, &wlc->core->macstat_snapshot->name, &wlc->pub->_cnt->name)
-
void wlc_statsupd(struct wlc_info *wlc)
{
int i;
wlc_bmac_copyfrom_shm(wlc->hw, M_UCODE_MACSTAT,
&macstats, sizeof(macstat_t));
- /* update mac stats */
- MACSTATUPD(txallfrm);
- MACSTATUPD(txrtsfrm);
- MACSTATUPD(txctsfrm);
- MACSTATUPD(txackfrm);
- MACSTATUPD(txdnlfrm);
- MACSTATUPD(txbcnfrm);
- for (i = 0; i < NFIFO; i++)
- MACSTATUPD(txfunfl[i]);
- MACSTATUPD(txtplunfl);
- MACSTATUPD(txphyerr);
- MACSTATUPD(rxfrmtoolong);
- MACSTATUPD(rxfrmtooshrt);
- MACSTATUPD(rxinvmachdr);
- MACSTATUPD(rxbadfcs);
- MACSTATUPD(rxbadplcp);
- MACSTATUPD(rxcrsglitch);
- MACSTATUPD(rxstrt);
- MACSTATUPD(rxdfrmucastmbss);
- MACSTATUPD(rxmfrmucastmbss);
- MACSTATUPD(rxcfrmucast);
- MACSTATUPD(rxrtsucast);
- MACSTATUPD(rxctsucast);
- MACSTATUPD(rxackucast);
- MACSTATUPD(rxdfrmocast);
- MACSTATUPD(rxmfrmocast);
- MACSTATUPD(rxcfrmocast);
- MACSTATUPD(rxrtsocast);
- MACSTATUPD(rxctsocast);
- MACSTATUPD(rxdfrmmcast);
- MACSTATUPD(rxmfrmmcast);
- MACSTATUPD(rxcfrmmcast);
- MACSTATUPD(rxbeaconmbss);
- MACSTATUPD(rxdfrmucastobss);
- MACSTATUPD(rxbeaconobss);
- MACSTATUPD(rxrsptmout);
- MACSTATUPD(bcntxcancl);
- MACSTATUPD(rxf0ovfl);
- MACSTATUPD(rxf1ovfl);
- MACSTATUPD(rxf2ovfl);
- MACSTATUPD(txsfovfl);
- MACSTATUPD(pmqovfl);
- MACSTATUPD(rxcgprqfrm);
- MACSTATUPD(rxcgprsqovfl);
- MACSTATUPD(txcgprsfail);
- MACSTATUPD(txcgprssuc);
- MACSTATUPD(prs_timeout);
- MACSTATUPD(rxnack);
- MACSTATUPD(frmscons);
- MACSTATUPD(txnack);
- MACSTATUPD(txglitch_nack);
- MACSTATUPD(txburst);
- MACSTATUPD(phywatchdog);
- MACSTATUPD(pktengrxducast);
- MACSTATUPD(pktengrxdmcast);
-
#ifdef BCMDBG
/* check for rx fifo 0 overflow */
delta = (u16) (wlc->core->macstat_snapshot->rxf0ovfl - rxf0ovfl);
dma_counterreset(wlc->hw->di[i]);
}
}
-
- for (i = 0; i < NFIFO; i++)
- wlc->pub->_cnt->rxerror += wlc->pub->_cnt->rxuflo[i];
}
bool wlc_chipmatch(u16 vendor, u16 device)
p = discard_oldest ? bcm_pktq_pdeq(q, eprec) :
bcm_pktq_pdeq_tail(q, eprec);
bcm_pkt_buf_free_skb(p);
- wlc->pub->_cnt->txnobuf++;
}
/* Enqueue */
* packet flooding from mac80211 stack
*/
bcm_pkt_buf_free_skb(sdu);
- wlc->pub->_cnt->txnobuf++;
}
/* Check if flow control needs to be turned on after enqueuing the packet
return -EINVAL;
wlc_txq_enq(wlc, scb, pkt, WLC_PRIO_TO_PREC(prio));
wlc_send_q(wlc);
-
- wlc->pub->_cnt->ieee_tx++;
return 0;
}
(preamble_type[0] == WLC_GF_PREAMBLE)) {
if (RSPEC2RATE(rspec[0]) != WLC_RATE_1M)
phyctl |= PHY_TXC_SHORT_HDR;
- wlc->pub->_cnt->txprshort++;
}
/* phytxant is properly bit shifted */
{
struct wlc_bsscfg *cfg = wlc->cfg;
- wlc->pub->_cnt->tbtt++;
-
if (BSSCFG_STA(cfg)) {
/* run watchdog here if the watchdog timer is not armed */
if (WLC_WATCHDOG_TBTT(wlc)) {
if (tx_info->control.sta)
scb = (struct scb *)tx_info->control.sta->drv_priv;
- if (N_ENAB(wlc->pub)) {
- u8 *plcp = (u8 *) (txh + 1);
- if (PLCP3_ISSGI(plcp[3]))
- wlc->pub->_cnt->txmpdu_sgi++;
- if (PLCP3_ISSTBC(plcp[3]))
- wlc->pub->_cnt->txmpdu_stbc++;
- }
-
if (tx_info->flags & IEEE80211_TX_CTL_AMPDU) {
wlc_ampdu_dotxstatus(wlc->ampdu, scb, p, txs);
return false;
skb_pull(p, D11_PHY_HDR_LEN);
skb_pull(p, D11_TXH_LEN);
ieee80211_tx_status_irqsafe(wlc->pub->ieee_hw, p);
- wlc->pub->_cnt->ieee_tx_status++;
} else {
wiphy_err(wlc->wiphy, "%s: Not last frame => not calling "
"tx_status\n", __func__);
memcpy(IEEE80211_SKB_RXCB(p), &rx_status, sizeof(rx_status));
ieee80211_rx_irqsafe(wlc->pub->ieee_hw, p);
-
- wlc->pub->_cnt->ieee_rx++;
return;
}
/* MAC inserts 2 pad bytes for a4 headers or QoS or A-MSDU subframes */
if (rxh->RxStatus1 & RXS_PBPRES) {
if (p->len < 2) {
- wlc->pub->_cnt->rxrunt++;
wiphy_err(wlc->wiphy, "wl%d: wlc_recv: rcvd runt of "
"len %d\n", wlc->pub->unit, p->len);
goto toss;
/* check received pkt has at least frame control field */
if (len < D11_PHY_HDR_LEN + sizeof(h->frame_control)) {
- wlc->pub->_cnt->rxrunt++;
goto toss;
}
"frame with invalid src mac address,"
" a2: %pM\n",
wlc->pub->unit, __func__, h->addr2);
- wlc->pub->_cnt->rxbadsrcmac++;
goto toss;
}
- wlc->pub->_cnt->rxfrag++;
}
}
WLC_TX_FIFO_CLEAR(wlc, fifo);
return -EBUSY;
}
-
- if (!ieee80211_is_data(txh->MacFrameControl))
- wlc->pub->_cnt->txctl++;
-
return 0;
}
#define NFIFO 6 /* # tx/rx fifopairs */
-#define WL_CNT_T_VERSION 7 /* current version of wl_cnt_t struct */
-
-struct wl_cnt {
- u16 version; /* see definition of WL_CNT_T_VERSION */
- u16 length; /* length of entire structure */
-
- /* transmit stat counters */
- u32 txframe; /* tx data frames */
- u32 txbyte; /* tx data bytes */
- u32 txretrans; /* tx mac retransmits */
- u32 txerror; /* tx data errors (derived: sum of others) */
- u32 txctl; /* tx management frames */
- u32 txprshort; /* tx short preamble frames */
- u32 txserr; /* tx status errors */
- u32 txnobuf; /* tx out of buffers errors */
- u32 txnoassoc; /* tx discard because we're not associated */
- u32 txrunt; /* tx runt frames */
- u32 txchit; /* tx header cache hit (fastpath) */
- u32 txcmiss; /* tx header cache miss (slowpath) */
- u32 ieee_tx_status; /* calls to ieee80211_tx_status */
- u32 ieee_tx; /* tx calls frm mac0211 */
- u32 ieee_rx; /* calls to ieee_rx */
-
- /* transmit chip error counters */
- u32 txuflo; /* tx fifo underflows */
- u32 txphyerr; /* tx phy errors (indicated in tx status) */
- u32 txphycrs;
-
- /* receive stat counters */
- u32 rxframe; /* rx data frames */
- u32 rxbyte; /* rx data bytes */
- u32 rxerror; /* rx data errors (derived: sum of others) */
- u32 rxctl; /* rx management frames */
- u32 rxnobuf; /* rx out of buffers errors */
- u32 rxnondata; /* rx non data frames in the data channel errors */
- u32 rxbadds; /* rx bad DS errors */
- u32 rxbadcm; /* rx bad control or management frames */
- u32 rxfragerr; /* rx fragmentation errors */
- u32 rxrunt; /* rx runt frames */
- u32 rxgiant; /* rx giant frames */
- u32 rxnoscb; /* rx no scb error */
- u32 rxbadproto; /* rx invalid frames */
- u32 rxbadsrcmac; /* rx frames with Invalid Src Mac */
- u32 rxbadda; /* rx frames tossed for invalid da */
- u32 rxfilter; /* rx frames filtered out */
-
- /* receive chip error counters */
- u32 rxoflo; /* rx fifo overflow errors */
- u32 rxuflo[NFIFO]; /* rx dma descriptor underflow errors */
-
- u32 d11cnt_txrts_off; /* d11cnt txrts value when reset d11cnt */
- u32 d11cnt_rxcrc_off; /* d11cnt rxcrc value when reset d11cnt */
- u32 d11cnt_txnocts_off; /* d11cnt txnocts value when reset d11cnt */
-
- /* misc counters */
- u32 dmade; /* tx/rx dma descriptor errors */
- u32 dmada; /* tx/rx dma data errors */
- u32 dmape; /* tx/rx dma descriptor protocol errors */
- u32 reset; /* reset count */
- u32 tbtt; /* cnts the TBTT int's */
- u32 txdmawar;
- u32 pkt_callback_reg_fail; /* callbacks register failure */
-
- /* MAC counters: 32-bit version of d11.h's macstat_t */
- u32 txallfrm; /* total number of frames sent, incl. Data, ACK, RTS, CTS,
- * Control Management (includes retransmissions)
- */
- u32 txrtsfrm; /* number of RTS sent out by the MAC */
- u32 txctsfrm; /* number of CTS sent out by the MAC */
- u32 txackfrm; /* number of ACK frames sent out */
- u32 txdnlfrm; /* Not used */
- u32 txbcnfrm; /* beacons transmitted */
- u32 txfunfl[8]; /* per-fifo tx underflows */
- u32 txtplunfl; /* Template underflows (mac was too slow to transmit ACK/CTS
- * or BCN)
- */
- u32 txphyerror; /* Transmit phy error, type of error is reported in tx-status for
- * driver enqueued frames
- */
- u32 rxfrmtoolong; /* Received frame longer than legal limit (2346 bytes) */
- u32 rxfrmtooshrt; /* Received frame did not contain enough bytes for its frame type */
- u32 rxinvmachdr; /* Either the protocol version != 0 or frame type not
- * data/control/management
- */
- u32 rxbadfcs; /* number of frames for which the CRC check failed in the MAC */
- u32 rxbadplcp; /* parity check of the PLCP header failed */
- u32 rxcrsglitch; /* PHY was able to correlate the preamble but not the header */
- u32 rxstrt; /* Number of received frames with a good PLCP
- * (i.e. passing parity check)
- */
- u32 rxdfrmucastmbss; /* Number of received DATA frames with good FCS and matching RA */
- u32 rxmfrmucastmbss; /* number of received mgmt frames with good FCS and matching RA */
- u32 rxcfrmucast; /* number of received CNTRL frames with good FCS and matching RA */
- u32 rxrtsucast; /* number of unicast RTS addressed to the MAC (good FCS) */
- u32 rxctsucast; /* number of unicast CTS addressed to the MAC (good FCS) */
- u32 rxackucast; /* number of ucast ACKS received (good FCS) */
- u32 rxdfrmocast; /* number of received DATA frames (good FCS and not matching RA) */
- u32 rxmfrmocast; /* number of received MGMT frames (good FCS and not matching RA) */
- u32 rxcfrmocast; /* number of received CNTRL frame (good FCS and not matching RA) */
- u32 rxrtsocast; /* number of received RTS not addressed to the MAC */
- u32 rxctsocast; /* number of received CTS not addressed to the MAC */
- u32 rxdfrmmcast; /* number of RX Data multicast frames received by the MAC */
- u32 rxmfrmmcast; /* number of RX Management multicast frames received by the MAC */
- u32 rxcfrmmcast; /* number of RX Control multicast frames received by the MAC
- * (unlikely to see these)
- */
- u32 rxbeaconmbss; /* beacons received from member of BSS */
- u32 rxdfrmucastobss; /* number of unicast frames addressed to the MAC from
- * other BSS (WDS FRAME)
- */
- u32 rxbeaconobss; /* beacons received from other BSS */
- u32 rxrsptmout; /* Number of response timeouts for transmitted frames
- * expecting a response
- */
- u32 bcntxcancl; /* transmit beacons canceled due to receipt of beacon (IBSS) */
- u32 rxf0ovfl; /* Number of receive fifo 0 overflows */
- u32 rxf1ovfl; /* Number of receive fifo 1 overflows (obsolete) */
- u32 rxf2ovfl; /* Number of receive fifo 2 overflows (obsolete) */
- u32 txsfovfl; /* Number of transmit status fifo overflows (obsolete) */
- u32 pmqovfl; /* Number of PMQ overflows */
- u32 rxcgprqfrm; /* Number of received Probe requests that made it into
- * the PRQ fifo
- */
- u32 rxcgprsqovfl; /* Rx Probe Request Que overflow in the AP */
- u32 txcgprsfail; /* Tx Probe Response Fail. AP sent probe response but did
- * not get ACK
- */
- u32 txcgprssuc; /* Tx Probe Response Success (ACK was received) */
- u32 prs_timeout; /* Number of probe requests that were dropped from the PRQ
- * fifo because a probe response could not be sent out within
- * the time limit defined in M_PRS_MAXTIME
- */
- u32 rxnack;
- u32 frmscons;
- u32 txnack;
- u32 txglitch_nack; /* obsolete */
- u32 txburst; /* obsolete */
-
- /* 802.11 MIB counters, pp. 614 of 802.11 reaff doc. */
- u32 txfrag; /* dot11TransmittedFragmentCount */
- u32 txmulti; /* dot11MulticastTransmittedFrameCount */
- u32 txfail; /* dot11FailedCount */
- u32 txretry; /* dot11RetryCount */
- u32 txretrie; /* dot11MultipleRetryCount */
- u32 rxdup; /* dot11FrameduplicateCount */
- u32 txrts; /* dot11RTSSuccessCount */
- u32 txnocts; /* dot11RTSFailureCount */
- u32 txnoack; /* dot11ACKFailureCount */
- u32 rxfrag; /* dot11ReceivedFragmentCount */
- u32 rxmulti; /* dot11MulticastReceivedFrameCount */
- u32 rxcrc; /* dot11FCSErrorCount */
- u32 txfrmsnt; /* dot11TransmittedFrameCount (bogus MIB?) */
- u32 rxundec; /* dot11WEPUndecryptableCount */
-
- /* WPA2 counters (see rxundec for DecryptFailureCount) */
- u32 tkipmicfaill; /* TKIPLocalMICFailures */
- u32 tkipcntrmsr; /* TKIPCounterMeasuresInvoked */
- u32 tkipreplay; /* TKIPReplays */
- u32 ccmpfmterr; /* CCMPFormatErrors */
- u32 ccmpreplay; /* CCMPReplays */
- u32 ccmpundec; /* CCMPDecryptErrors */
- u32 fourwayfail; /* FourWayHandshakeFailures */
- u32 wepundec; /* dot11WEPUndecryptableCount */
- u32 wepicverr; /* dot11WEPICVErrorCount */
- u32 decsuccess; /* DecryptSuccessCount */
- u32 tkipicverr; /* TKIPICVErrorCount */
- u32 wepexcluded; /* dot11WEPExcludedCount */
-
- u32 rxundec_mcst; /* dot11WEPUndecryptableCount */
-
- /* WPA2 counters (see rxundec for DecryptFailureCount) */
- u32 tkipmicfaill_mcst; /* TKIPLocalMICFailures */
- u32 tkipcntrmsr_mcst; /* TKIPCounterMeasuresInvoked */
- u32 tkipreplay_mcst; /* TKIPReplays */
- u32 ccmpfmterr_mcst; /* CCMPFormatErrors */
- u32 ccmpreplay_mcst; /* CCMPReplays */
- u32 ccmpundec_mcst; /* CCMPDecryptErrors */
- u32 fourwayfail_mcst; /* FourWayHandshakeFailures */
- u32 wepundec_mcst; /* dot11WEPUndecryptableCount */
- u32 wepicverr_mcst; /* dot11WEPICVErrorCount */
- u32 decsuccess_mcst; /* DecryptSuccessCount */
- u32 tkipicverr_mcst; /* TKIPICVErrorCount */
- u32 wepexcluded_mcst; /* dot11WEPExcludedCount */
-
- u32 txchanrej; /* Tx frames suppressed due to channel rejection */
- u32 txexptime; /* Tx frames suppressed due to timer expiration */
- u32 psmwds; /* Count PSM watchdogs */
- u32 phywatchdog; /* Count Phy watchdogs (triggered by ucode) */
-
- /* MBSS counters, AP only */
- u32 prq_entries_handled; /* PRQ entries read in */
- u32 prq_undirected_entries; /* which were bcast bss & ssid */
- u32 prq_bad_entries; /* which could not be translated to info */
- u32 atim_suppress_count; /* TX suppressions on ATIM fifo */
- u32 bcn_template_not_ready; /* Template marked in use on send bcn ... */
- u32 bcn_template_not_ready_done; /* ...but "DMA done" interrupt rcvd */
- u32 late_tbtt_dpc; /* TBTT DPC did not happen in time */
-
- /* per-rate receive stat counters */
- u32 rx1mbps; /* packets rx at 1Mbps */
- u32 rx2mbps; /* packets rx at 2Mbps */
- u32 rx5mbps5; /* packets rx at 5.5Mbps */
- u32 rx6mbps; /* packets rx at 6Mbps */
- u32 rx9mbps; /* packets rx at 9Mbps */
- u32 rx11mbps; /* packets rx at 11Mbps */
- u32 rx12mbps; /* packets rx at 12Mbps */
- u32 rx18mbps; /* packets rx at 18Mbps */
- u32 rx24mbps; /* packets rx at 24Mbps */
- u32 rx36mbps; /* packets rx at 36Mbps */
- u32 rx48mbps; /* packets rx at 48Mbps */
- u32 rx54mbps; /* packets rx at 54Mbps */
- u32 rx108mbps; /* packets rx at 108mbps */
- u32 rx162mbps; /* packets rx at 162mbps */
- u32 rx216mbps; /* packets rx at 216 mbps */
- u32 rx270mbps; /* packets rx at 270 mbps */
- u32 rx324mbps; /* packets rx at 324 mbps */
- u32 rx378mbps; /* packets rx at 378 mbps */
- u32 rx432mbps; /* packets rx at 432 mbps */
- u32 rx486mbps; /* packets rx at 486 mbps */
- u32 rx540mbps; /* packets rx at 540 mbps */
-
- /* pkteng rx frame stats */
- u32 pktengrxducast; /* unicast frames rxed by the pkteng code */
- u32 pktengrxdmcast; /* multicast frames rxed by the pkteng code */
-
- u32 rfdisable; /* count of radio disables */
- u32 bphy_rxcrsglitch; /* PHY count of bphy glitches */
-
- u32 txmpdu_sgi; /* count for sgi transmit */
- u32 rxmpdu_sgi; /* count for sgi received */
- u32 txmpdu_stbc; /* count for stbc transmit */
- u32 rxmpdu_stbc; /* count for stbc received */
-};
-
#define WL_DELTA_STATS_T_VERSION 1 /* current version of wl_delta_stats_t struct */
typedef struct {