According to ath9k recv.c, one shouldn't be doing self-linked descriptors

in the RX path when doing 11n and block-ack'ed frames. Apparently, the MAC
will loop over that self-linked descriptor and treat it as "good enough"
for (incorrectly!) ACKing the frames in the block-ack.

Until I figure out how to work around this issue in the future, this counter
will tell me if packet RX processing ever gets to the point where it's
touching the self-linked descriptor. If there's ever enough packets to get
to that point, BA's will be invalid and likely very unhappy.
This commit is contained in:
adrian 2011-03-29 15:59:07 +00:00
parent f226edd26e
commit 056d03857b
3 changed files with 5 additions and 1 deletions

View File

@ -3338,6 +3338,7 @@ ath_rx_proc(void *arg, int npending)
ds = bf->bf_desc;
if (ds->ds_link == bf->bf_daddr) {
/* NB: never process the self-linked entry at the end */
sc->sc_stats.ast_rx_hitqueueend++;
break;
}
/* XXX sync descriptor memory */

View File

@ -703,6 +703,8 @@ ath_sysctl_stats_attach(struct ath_softc *sc)
&sc->sc_stats.ast_rx_hi_rx_chain, 0, "");
SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "ast_tx_htprotect", CTLFLAG_RD,
&sc->sc_stats.ast_tx_htprotect, 0, "HT tx frames with protection");
SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "ast_rx_hitqueueend", CTLFLAG_RD,
&sc->sc_stats.ast_rx_hitqueueend, 0, "RX hit queue end");
/* Attach the RX phy error array */
ath_sysctl_stats_attach_rxphyerr(sc, child);

View File

@ -128,7 +128,8 @@ struct ath_stats {
u_int32_t ast_rx_decrypt_busy_err;
u_int32_t ast_rx_hi_rx_chain;
u_int32_t ast_tx_htprotect; /* HT tx frames with protection */
u_int32_t ast_pad[3];
u_int32_t ast_rx_hitqueueend;
u_int32_t ast_pad[2];
};
#define SIOCGATHSTATS _IOWR('i', 137, struct ifreq)