diff options
author | adrian <adrian@FreeBSD.org> | 2012-09-24 20:35:56 +0000 |
---|---|---|
committer | adrian <adrian@FreeBSD.org> | 2012-09-24 20:35:56 +0000 |
commit | d870dd946f39966862b8ed7df650e251dbfa06b0 (patch) | |
tree | 50a691df6d13d3d034f4fa9b74e44171bfd657fe | |
parent | 22f63cd570f2cd87e8c59b1a55e48b8af085218e (diff) | |
download | FreeBSD-src-d870dd946f39966862b8ed7df650e251dbfa06b0.zip FreeBSD-src-d870dd946f39966862b8ed7df650e251dbfa06b0.tar.gz |
Migrate the ath(4) KTR logging to use an ATH_KTR() macro.
This should eventually be unified with ATH_DEBUG() so I can get both
from one macro; that may take some time.
Add some new probes for TX and TX completion.
-rw-r--r-- | sys/dev/ath/if_ath.c | 47 | ||||
-rw-r--r-- | sys/dev/ath/if_ath_debug.h | 20 | ||||
-rw-r--r-- | sys/dev/ath/if_ath_rx.c | 6 | ||||
-rw-r--r-- | sys/dev/ath/if_ath_rx_edma.c | 6 | ||||
-rw-r--r-- | sys/dev/ath/if_ath_sysctl.c | 3 | ||||
-rw-r--r-- | sys/dev/ath/if_ath_tx.c | 85 | ||||
-rw-r--r-- | sys/dev/ath/if_athvar.h | 1 |
7 files changed, 142 insertions, 26 deletions
diff --git a/sys/dev/ath/if_ath.c b/sys/dev/ath/if_ath.c index 6aea741..fefd0c9 100644 --- a/sys/dev/ath/if_ath.c +++ b/sys/dev/ath/if_ath.c @@ -1519,9 +1519,9 @@ ath_intr(void *arg) */ ath_hal_getisr(ah, &status); /* NB: clears ISR too */ DPRINTF(sc, ATH_DEBUG_INTR, "%s: status 0x%x\n", __func__, status); - CTR1(ATH_KTR_INTR, "ath_intr: mask=0x%.8x", status); + ATH_KTR(sc, ATH_KTR_INTERRUPTS, 1, "ath_intr: mask=0x%.8x", status); #ifdef ATH_KTR_INTR_DEBUG - CTR5(ATH_KTR_INTR, + ATH_KTR(sc, ATH_KTR_INTERRUPTS, 5, "ath_intr: ISR=0x%.8x, ISR_S0=0x%.8x, ISR_S1=0x%.8x, ISR_S2=0x%.8x, ISR_S5=0x%.8x", ah->ah_intrstate[0], ah->ah_intrstate[1], @@ -1597,7 +1597,7 @@ ath_intr(void *arg) } if (status & HAL_INT_RXEOL) { int imask; - CTR0(ATH_KTR_ERR, "ath_intr: RXEOL"); + ATH_KTR(sc, ATH_KTR_ERROR, 0, "ath_intr: RXEOL"); ATH_PCU_LOCK(sc); /* * NB: the hardware should re-read the link when @@ -1663,6 +1663,11 @@ ath_intr(void *arg) ATH_PCU_LOCK(sc); txqs = 0xffffffff; ath_hal_gettxintrtxqs(sc->sc_ah, &txqs); + ATH_KTR(sc, ATH_KTR_INTERRUPTS, 3, + "ath_intr: TX; txqs=0x%08x, txq_active was 0x%08x, now 0x%08x", + txqs, + sc->sc_txq_active, + sc->sc_txq_active | txqs); sc->sc_txq_active |= txqs; ATH_PCU_UNLOCK(sc); } @@ -1701,7 +1706,7 @@ ath_intr(void *arg) } if (status & HAL_INT_RXORN) { /* NB: hal marks HAL_INT_FATAL when RXORN is fatal */ - CTR0(ATH_KTR_ERR, "ath_intr: RXORN"); + ATH_KTR(sc, ATH_KTR_ERROR, 0, "ath_intr: RXORN"); sc->sc_stats.ast_rxorn++; } } @@ -3637,6 +3642,14 @@ ath_tx_processq(struct ath_softc *sc, struct ath_txq *txq, int dosched) __func__, txq->axq_qnum, (caddr_t)(uintptr_t) ath_hal_gettxbuf(sc->sc_ah, txq->axq_qnum), txq->axq_link); + + ATH_KTR(sc, ATH_KTR_TXCOMP, 4, + "ath_tx_processq: txq=%u head %p link %p depth %p", + txq->axq_qnum, + (caddr_t)(uintptr_t) ath_hal_gettxbuf(sc->sc_ah, txq->axq_qnum), + txq->axq_link, + txq->axq_depth); + nacked = 0; for (;;) { ATH_TXQ_LOCK(txq); @@ -3648,17 +3661,21 @@ ath_tx_processq(struct ath_softc *sc, struct ath_txq *txq, int dosched) } ds = bf->bf_lastds; /* XXX must be setup correctly! */ ts = &bf->bf_status.ds_txstat; + status = ath_hal_txprocdesc(ah, ds, ts); #ifdef ATH_DEBUG if (sc->sc_debug & ATH_DEBUG_XMIT_DESC) ath_printtxbuf(sc, bf, txq->axq_qnum, 0, status == HAL_OK); - else if ((sc->sc_debug & ATH_DEBUG_RESET) && (dosched == 0)) { + else if ((sc->sc_debug & ATH_DEBUG_RESET) && (dosched == 0)) ath_printtxbuf(sc, bf, txq->axq_qnum, 0, status == HAL_OK); - } #endif + if (status == HAL_EINPROGRESS) { + ATH_KTR(sc, ATH_KTR_TXCOMP, 3, + "ath_tx_processq: txq=%u, bf=%p ds=%p, HAL_EINPROGRESS", + txq->axq_qnum, bf, ds); ATH_TXQ_UNLOCK(txq); break; } @@ -3684,6 +3701,10 @@ ath_tx_processq(struct ath_softc *sc, struct ath_txq *txq, int dosched) txq->axq_aggr_depth--; ni = bf->bf_node; + + ATH_KTR(sc, ATH_KTR_TXCOMP, 5, + "ath_tx_processq: txq=%u, bf=%p, ds=%p, ni=%p, ts_status=0x%08x", + txq->axq_qnum, bf, ds, ni, ts->ts_status); /* * If unicast frame was ack'd update RSSI, * including the last rx time used to @@ -3702,8 +3723,6 @@ ath_tx_processq(struct ath_softc *sc, struct ath_txq *txq, int dosched) * Update statistics and call completion */ ath_tx_process_buf_completion(sc, txq, ts, bf); - - } #ifdef IEEE80211_SUPPORT_SUPERG /* @@ -3720,6 +3739,10 @@ ath_tx_processq(struct ath_softc *sc, struct ath_txq *txq, int dosched) ATH_TXQ_UNLOCK(txq); } + ATH_KTR(sc, ATH_KTR_TXCOMP, 1, + "ath_tx_processq: txq=%u: done", + txq->axq_qnum); + return nacked; } @@ -3742,6 +3765,9 @@ ath_tx_proc_q0(void *arg, int npending) sc->sc_txq_active &= ~txqs; ATH_PCU_UNLOCK(sc); + ATH_KTR(sc, ATH_KTR_TXCOMP, 1, + "ath_tx_proc_q0: txqs=0x%08x", txqs); + if (TXQACTIVE(txqs, 0) && ath_tx_processq(sc, &sc->sc_txq[0], 1)) /* XXX why is lastrx updated in tx code? */ sc->sc_lastrx = ath_hal_gettsf64(sc->sc_ah); @@ -3780,6 +3806,9 @@ ath_tx_proc_q0123(void *arg, int npending) sc->sc_txq_active &= ~txqs; ATH_PCU_UNLOCK(sc); + ATH_KTR(sc, ATH_KTR_TXCOMP, 1, + "ath_tx_proc_q0123: txqs=0x%08x", txqs); + /* * Process each active queue. */ @@ -3829,6 +3858,8 @@ ath_tx_proc(void *arg, int npending) sc->sc_txq_active &= ~txqs; ATH_PCU_UNLOCK(sc); + ATH_KTR(sc, ATH_KTR_TXCOMP, 1, "ath_tx_proc: txqs=0x%08x", txqs); + /* * Process each active queue. */ diff --git a/sys/dev/ath/if_ath_debug.h b/sys/dev/ath/if_ath_debug.h index 875a6c8..9f73744 100644 --- a/sys/dev/ath/if_ath_debug.h +++ b/sys/dev/ath/if_ath_debug.h @@ -70,8 +70,21 @@ enum { ATH_DEBUG_ANY = 0xffffffffffffffffULL }; -#define ATH_KTR_INTR KTR_SPARE4 -#define ATH_KTR_ERR KTR_SPARE3 +enum { + ATH_KTR_RXPROC = 0x00000001, + ATH_KTR_TXPROC = 0x00000002, + ATH_KTR_TXCOMP = 0x00000004, + ATH_KTR_SWQ = 0x00000008, + ATH_KTR_INTERRUPTS = 0x00000010, + ATH_KTR_ERROR = 0x00000020, + ATH_KTR_NODE = 0x00000040, + ATH_KTR_TX = 0x00000080, +}; + +#define ATH_KTR(_sc, _km, _kf, ...) do { \ + if (sc->sc_ktrdebug & (_km)) \ + CTR##_kf(KTR_DEV, __VA_ARGS__); \ + } while (0) extern uint64_t ath_debug; @@ -92,8 +105,7 @@ extern void ath_printrxbuf(struct ath_softc *, const struct ath_buf *bf, extern void ath_printtxbuf(struct ath_softc *, const struct ath_buf *bf, u_int qnum, u_int ix, int done); #else /* ATH_DEBUG */ -#define ATH_KTR_INTR 0 -#define ATH_KTR_ERR 0 +#define ATH_KTR(_sc, _km, _kf, ...) do { } while (0) #define IFF_DUMPPKTS(sc, m) \ ((sc->sc_ifp->if_flags & (IFF_DEBUG|IFF_LINK2)) == (IFF_DEBUG|IFF_LINK2)) diff --git a/sys/dev/ath/if_ath_rx.c b/sys/dev/ath/if_ath_rx.c index 31949a3..172d8fd 100644 --- a/sys/dev/ath/if_ath_rx.c +++ b/sys/dev/ath/if_ath_rx.c @@ -900,7 +900,7 @@ rx_proc_next: if (ngood) sc->sc_lastrx = tsf; - CTR2(ATH_KTR_INTR, "ath_rx_proc: npkts=%d, ngood=%d", npkts, ngood); + ATH_KTR(sc, ATH_KTR_RXPROC, 2, "ath_rx_proc: npkts=%d, ngood=%d", npkts, ngood); /* Queue DFS tasklet if needed */ if (resched && ath_dfs_tasklet_needed(sc, sc->sc_curchan)) taskqueue_enqueue(sc->sc_tq, &sc->sc_dfstask); @@ -912,7 +912,7 @@ rx_proc_next: */ ATH_PCU_LOCK(sc); if (resched && sc->sc_kickpcu) { - CTR0(ATH_KTR_ERR, "ath_rx_proc: kickpcu"); + ATH_KTR(sc, ATH_KTR_ERROR, 0, "ath_rx_proc: kickpcu"); device_printf(sc->sc_dev, "%s: kickpcu; handled %d packets\n", __func__, npkts); @@ -957,7 +957,7 @@ ath_legacy_rx_tasklet(void *arg, int npending) { struct ath_softc *sc = arg; - CTR1(ATH_KTR_INTR, "ath_rx_proc: pending=%d", npending); + ATH_KTR(sc, ATH_KTR_RXPROC, 1, "ath_rx_proc: pending=%d", npending); DPRINTF(sc, ATH_DEBUG_RX_PROC, "%s: pending %u\n", __func__, npending); ATH_PCU_LOCK(sc); if (sc->sc_inreset_cnt > 0) { diff --git a/sys/dev/ath/if_ath_rx_edma.c b/sys/dev/ath/if_ath_rx_edma.c index 0916336..bb5f082 100644 --- a/sys/dev/ath/if_ath_rx_edma.c +++ b/sys/dev/ath/if_ath_rx_edma.c @@ -421,13 +421,15 @@ ath_edma_recv_proc_queue(struct ath_softc *sc, HAL_RX_QUEUE qtype, if (ngood) sc->sc_lastrx = tsf; - CTR2(ATH_KTR_INTR, "ath edma rx proc: npkts=%d, ngood=%d", + ATH_KTR(sc, ATH_KTR_INTERRUPTS, 2, + "ath edma rx proc: npkts=%d, ngood=%d", npkts, ngood); /* Handle resched and kickpcu appropriately */ ATH_PCU_LOCK(sc); if (dosched && sc->sc_kickpcu) { - CTR0(ATH_KTR_ERR, "ath_edma_recv_proc_queue(): kickpcu"); + ATH_KTR(sc, ATH_KTR_ERROR, 0, + "ath_edma_recv_proc_queue(): kickpcu"); device_printf(sc->sc_dev, "%s: handled npkts %d ngood %d\n", __func__, npkts, ngood); diff --git a/sys/dev/ath/if_ath_sysctl.c b/sys/dev/ath/if_ath_sysctl.c index 49c6983..9c9ce52 100644 --- a/sys/dev/ath/if_ath_sysctl.c +++ b/sys/dev/ath/if_ath_sysctl.c @@ -518,6 +518,9 @@ ath_sysctlattach(struct ath_softc *sc) SYSCTL_ADD_QUAD(ctx, SYSCTL_CHILDREN(tree), OID_AUTO, "debug", CTLFLAG_RW, &sc->sc_debug, "control debugging printfs"); + SYSCTL_ADD_QUAD(ctx, SYSCTL_CHILDREN(tree), OID_AUTO, + "ktrdebug", CTLFLAG_RW, &sc->sc_ktrdebug, + "control debugging KTR"); #endif SYSCTL_ADD_PROC(ctx, SYSCTL_CHILDREN(tree), OID_AUTO, "slottime", CTLTYPE_INT | CTLFLAG_RW, sc, 0, diff --git a/sys/dev/ath/if_ath_tx.c b/sys/dev/ath/if_ath_tx.c index b6d5618..751c562 100644 --- a/sys/dev/ath/if_ath_tx.c +++ b/sys/dev/ath/if_ath_tx.c @@ -722,6 +722,10 @@ ath_tx_handoff_hw(struct ath_softc *sc, struct ath_txq *txq, ATH_TXQ_INSERT_TAIL(txq, bf, bf_list); qbusy = ath_hal_txqenabled(ah, txq->axq_qnum); + + ATH_KTR(sc, ATH_KTR_TX, 4, + "ath_tx_handoff: txq=%u, add bf=%p, qbusy=%d, depth=%d", + txq->axq_qnum, bf, qbusy, txq->axq_depth); if (txq->axq_link == NULL) { /* * Be careful writing the address to TXDP. If @@ -738,15 +742,24 @@ ath_tx_handoff_hw(struct ath_softc *sc, struct ath_txq *txq, bf->bf_daddr); txq->axq_flags &= ~ATH_TXQ_PUTPENDING; DPRINTF(sc, ATH_DEBUG_XMIT, - "%s: TXDP[%u] = %p (%p) depth %d\n", + "%s: TXDP[%u] = %p (%p) lastds=%p depth %d\n", __func__, txq->axq_qnum, (caddr_t)bf->bf_daddr, bf->bf_desc, + bf->bf_lastds, + txq->axq_depth); + ATH_KTR(sc, ATH_KTR_TX, 5, + "ath_tx_handoff: TXDP[%u] = %p (%p) " + "lastds=%p depth %d", + txq->axq_qnum, + (caddr_t)bf->bf_daddr, bf->bf_desc, + bf->bf_lastds, txq->axq_depth); } else { txq->axq_flags |= ATH_TXQ_PUTPENDING; DPRINTF(sc, ATH_DEBUG_TDMA | ATH_DEBUG_XMIT, "%s: Q%u busy, defer enable\n", __func__, txq->axq_qnum); + ATH_KTR(sc, ATH_KTR_TX, 0, "defer enable"); } } else { *txq->axq_link = bf->bf_daddr; @@ -755,6 +768,12 @@ ath_tx_handoff_hw(struct ath_softc *sc, struct ath_txq *txq, txq->axq_qnum, txq->axq_link, (caddr_t)bf->bf_daddr, bf->bf_desc, txq->axq_depth); + ATH_KTR(sc, ATH_KTR_TX, 5, + "ath_tx_handoff: link[%u](%p)=%p (%p) lastds=%p", + txq->axq_qnum, txq->axq_link, + (caddr_t)bf->bf_daddr, bf->bf_desc, + bf->bf_lastds); + if ((txq->axq_flags & ATH_TXQ_PUTPENDING) && !qbusy) { /* * The q was busy when we previously tried @@ -771,10 +790,24 @@ ath_tx_handoff_hw(struct ath_softc *sc, struct ath_txq *txq, DPRINTF(sc, ATH_DEBUG_TDMA | ATH_DEBUG_XMIT, "%s: Q%u restarted\n", __func__, txq->axq_qnum); + ATH_KTR(sc, ATH_KTR_TX, 4, + "ath_tx_handoff: txq[%d] restarted, bf=%p " + "daddr=%p ds=%p", + txq->axq_qnum, + bf, + (caddr_t)bf->bf_daddr, + bf->bf_desc); } } #else ATH_TXQ_INSERT_TAIL(txq, bf, bf_list); + ATH_KTR(sc, ATH_KTR_TX, 4, + "ath_tx_handoff: non-tdma: txq=%u, add bf=%p, qbusy=%d, " + "depth=%d", + txq->axq_qnum, + bf, + qbusy, + txq->axq_depth); if (txq->axq_link == NULL) { ath_hal_puttxbuf(ah, txq->axq_qnum, bf->bf_daddr); DPRINTF(sc, ATH_DEBUG_XMIT, @@ -782,6 +815,14 @@ ath_tx_handoff_hw(struct ath_softc *sc, struct ath_txq *txq, __func__, txq->axq_qnum, (caddr_t)bf->bf_daddr, bf->bf_desc, txq->axq_depth); + ATH_KTR(sc, ATH_KTR_TX, 5, + "ath_tx_handoff: non-tdma: TXDP[%u] = %p (%p) " + "lastds=%p depth %d", + txq->axq_qnum, + (caddr_t)bf->bf_daddr, bf->bf_desc, + bf->bf_lastds, + txq->axq_depth); + } else { *txq->axq_link = bf->bf_daddr; DPRINTF(sc, ATH_DEBUG_XMIT, @@ -789,12 +830,21 @@ ath_tx_handoff_hw(struct ath_softc *sc, struct ath_txq *txq, txq->axq_qnum, txq->axq_link, (caddr_t)bf->bf_daddr, bf->bf_desc, txq->axq_depth); + ATH_KTR(sc, ATH_KTR_TX, 5, + "ath_tx_handoff: non-tdma: link[%u](%p)=%p (%p) " + "lastds=%d", + txq->axq_qnum, txq->axq_link, + (caddr_t)bf->bf_daddr, bf->bf_desc, + bf->bf_lastds); + } #endif /* IEEE80211_SUPPORT_TDMA */ if (bf->bf_state.bfs_aggr) txq->axq_aggr_depth++; ath_hal_gettxdesclinkptr(ah, bf->bf_lastds, &txq->axq_link); ath_hal_txstart(ah, txq->axq_qnum); + ATH_KTR(sc, ATH_KTR_TX, 1, + "ath_tx_handoff: txq=%u, txstart", txq->axq_qnum); } } @@ -1875,6 +1925,9 @@ ath_tx_raw_start(struct ath_softc *sc, struct ieee80211_node *ni, /* XXX honor IEEE80211_BPF_DATAPAD */ pktlen = m0->m_pkthdr.len - (hdrlen & 3) + IEEE80211_CRC_LEN; + ATH_KTR(sc, ATH_KTR_TX, 2, + "ath_tx_raw_start: ni=%p, bf=%p, raw", ni, bf); + DPRINTF(sc, ATH_DEBUG_SW_TX, "%s: ismcast=%d\n", __func__, ismcast); @@ -2132,6 +2185,8 @@ ath_raw_xmit(struct ieee80211_node *ni, struct mbuf *m, error = ENOBUFS; goto bad; } + ATH_KTR(sc, ATH_KTR_TX, 3, "ath_raw_xmit: m=%p, params=%p, bf=%p\n", + m, params, bf); if (params == NULL) { /* @@ -2162,6 +2217,11 @@ ath_raw_xmit(struct ieee80211_node *ni, struct mbuf *m, return 0; bad2: + ATH_KTR(sc, ATH_KTR_TX, 3, "ath_raw_xmit: bad2: m=%p, params=%p, " + "bf=%p", + m, + params, + bf); ATH_TXBUF_LOCK(sc); ath_returnbuf_head(sc, bf); ATH_TXBUF_UNLOCK(sc); @@ -2170,6 +2230,8 @@ bad: sc->sc_txstart_cnt--; ATH_PCU_UNLOCK(sc); bad0: + ATH_KTR(sc, ATH_KTR_TX, 2, "ath_raw_xmit: bad0: m=%p, params=%p", + m, params); ifp->if_oerrors++; sc->sc_stats.ast_tx_raw_fail++; ieee80211_free_node(ni); @@ -2752,6 +2814,7 @@ ath_tx_swq(struct ath_softc *sc, struct ieee80211_node *ni, struct ath_txq *txq, DPRINTF(sc, ATH_DEBUG_SW_TX, "%s: ampdu; swq'ing\n", __func__); + ath_tx_tid_sched(sc, atid); } } else if (txq->axq_depth < sc->sc_hwq_limit) { @@ -3240,7 +3303,7 @@ ath_tx_tid_drain_pkt(struct ath_softc *sc, struct ath_node *an, static void ath_tx_tid_drain_print(struct ath_softc *sc, struct ath_node *an, - struct ath_tid *tid, struct ath_buf *bf) + const char *pfx, struct ath_tid *tid, struct ath_buf *bf) { struct ieee80211_node *ni = &an->an_node; struct ath_txq *txq = sc->sc_ac2q[tid->ac]; @@ -3249,18 +3312,19 @@ ath_tx_tid_drain_print(struct ath_softc *sc, struct ath_node *an, tap = ath_tx_get_tx_tid(an, tid->tid); device_printf(sc->sc_dev, - "%s: node %p: bf=%p: addbaw=%d, dobaw=%d, " + "%s: %s: node %p: bf=%p: addbaw=%d, dobaw=%d, " "seqno=%d, retry=%d\n", - __func__, ni, bf, + __func__, pfx, ni, bf, bf->bf_state.bfs_addedbaw, bf->bf_state.bfs_dobaw, SEQNO(bf->bf_state.bfs_seqno), bf->bf_state.bfs_retries); device_printf(sc->sc_dev, - "%s: node %p: bf=%p: txq axq_depth=%d, axq_aggr_depth=%d\n", + "%s: node %p: bf=%p: txq[%d] axq_depth=%d, axq_aggr_depth=%d\n", __func__, ni, bf, - txq->axq_depth, - txq->axq_aggr_depth); + txq->axq_qnum, + txq->axq_depth, + txq->axq_aggr_depth); device_printf(sc->sc_dev, "%s: node %p: bf=%p: tid txq_depth=%d hwq_depth=%d, bar_wait=%d, isfiltered=%d\n", @@ -3323,7 +3387,7 @@ ath_tx_tid_drain(struct ath_softc *sc, struct ath_node *an, } if (t == 0) { - ath_tx_tid_drain_print(sc, an, tid, bf); + ath_tx_tid_drain_print(sc, an, "norm", tid, bf); t = 1; } @@ -3339,7 +3403,7 @@ ath_tx_tid_drain(struct ath_softc *sc, struct ath_node *an, break; if (t == 0) { - ath_tx_tid_drain_print(sc, an, tid, bf); + ath_tx_tid_drain_print(sc, an, "filt", tid, bf); t = 1; } @@ -3397,6 +3461,9 @@ ath_tx_node_flush(struct ath_softc *sc, struct ath_node *an) TAILQ_INIT(&bf_cq); + ATH_KTR(sc, ATH_KTR_NODE, 1, "ath_tx_node_flush: flush node; ni=%p", + &an->an_node); + for (tid = 0; tid < IEEE80211_TID_SIZE; tid++) { struct ath_tid *atid = &an->an_tid[tid]; struct ath_txq *txq = sc->sc_ac2q[atid->ac]; diff --git a/sys/dev/ath/if_athvar.h b/sys/dev/ath/if_athvar.h index 6c8c5fc..d8bc474 100644 --- a/sys/dev/ath/if_athvar.h +++ b/sys/dev/ath/if_athvar.h @@ -445,6 +445,7 @@ struct ath_softc { struct ath_tx_aggr_stats sc_aggr_stats; struct ath_intr_stats sc_intr_stats; uint64_t sc_debug; + uint64_t sc_ktrdebug; int sc_nvaps; /* # vaps */ int sc_nstavaps; /* # station vaps */ int sc_nmeshvaps; /* # mbss vaps */ |