Module Name:    src
Committed By:   jmcneill
Date:           Sat Feb 15 15:41:08 UTC 2025

Modified Files:
        src/sys/dev/ic: bwi.c

Log Message:
bwi: Update rate control statistics on txeof to enable AMRR.


To generate a diff of this commit:
cvs rdiff -u -r1.41 -r1.42 src/sys/dev/ic/bwi.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/ic/bwi.c
diff -u src/sys/dev/ic/bwi.c:1.41 src/sys/dev/ic/bwi.c:1.42
--- src/sys/dev/ic/bwi.c:1.41	Mon Jan 20 17:16:33 2025
+++ src/sys/dev/ic/bwi.c	Sat Feb 15 15:41:08 2025
@@ -1,4 +1,4 @@
-/*	$NetBSD: bwi.c,v 1.41 2025/01/20 17:16:33 christos Exp $	*/
+/*	$NetBSD: bwi.c,v 1.42 2025/02/15 15:41:08 jmcneill Exp $	*/
 /*	$OpenBSD: bwi.c,v 1.74 2008/02/25 21:13:30 mglocker Exp $	*/
 
 /*
@@ -48,7 +48,7 @@
 
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: bwi.c,v 1.41 2025/01/20 17:16:33 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: bwi.c,v 1.42 2025/02/15 15:41:08 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/callout.h>
@@ -395,7 +395,7 @@ static void	 bwi_start_tx64(struct bwi_s
 static void	 bwi_txeof_status_pio(struct bwi_softc *);
 static void	 bwi_txeof_status32(struct bwi_softc *);
 static void	 bwi_txeof_status64(struct bwi_softc *);
-static void	 _bwi_txeof(struct bwi_softc *, uint16_t);
+static void	 _bwi_txeof(struct bwi_softc *, uint16_t, uint8_t);
 static void	 bwi_txeof_status(struct bwi_softc *, int);
 static void	 bwi_txeof(struct bwi_softc *);
 static int	 bwi_bbp_power_on(struct bwi_softc *, enum bwi_clock_mode);
@@ -9648,10 +9648,7 @@ bwi_encap(struct bwi_softc *sc, int idx,
 			/* [TRC: XXX Set fallback rate.] */
 		} else {
 			/* AMRR rate control */
-			/* [TRC: XXX amrr] */
-			/* rate = ni->ni_rates.rs_rates[ni->ni_txrate]; */
-			rate = (1 * 2);
-			/* [TRC: XXX Set fallback rate.] */
+			rate = ni->ni_rates.rs_rates[ni->ni_txrate];
 		}
 	} else {
 		/* Fixed at 1Mbits/s for mgt frames */
@@ -9924,7 +9921,7 @@ bwi_txeof_status64(struct bwi_softc *sc)
 }
 
 static void
-_bwi_txeof(struct bwi_softc *sc, uint16_t tx_id)
+_bwi_txeof(struct bwi_softc *sc, uint16_t tx_id, uint8_t retry_cnt)
 {
 	struct ifnet *ifp = &sc->sc_if;
 	struct bwi_txbuf_data *tbd;
@@ -9961,6 +9958,14 @@ _bwi_txeof(struct bwi_softc *sc, uint16_
 	tb->tb_mbuf = NULL;
 
 	if (tb->tb_ni != NULL) {
+		struct bwi_node *bn = (struct bwi_node *)tb->tb_ni;
+
+		/* Update rate control statistics for the node. */
+		bn->amn.amn_txcnt++;
+		if (retry_cnt) {
+			bn->amn.amn_retrycnt++;
+		}
+
 		ieee80211_free_node(tb->tb_ni);
 		tb->tb_ni = NULL;
 	}
@@ -9986,7 +9991,8 @@ bwi_txeof_status(struct bwi_softc *sc, i
 	while (idx != end_idx) {
 		/* [TRC: XXX Filter this out if it is not pending; see
 		   DragonFlyBSD's revision 1.5. */
-		_bwi_txeof(sc, le16toh(st->stats[idx].txs_id));
+		_bwi_txeof(sc, le16toh(st->stats[idx].txs_id),
+		    st->stats[idx].txs_retry_cnt);
 		idx = (idx + 1) % BWI_TXSTATS_NDESC;
 	}
 	st->stats_idx = idx;
@@ -10015,7 +10021,7 @@ bwi_txeof(struct bwi_softc *sc)
 		if (tx_info & 0x30) /* XXX */
 			continue;
 
-		_bwi_txeof(sc, tx_id);
+		_bwi_txeof(sc, tx_id, (tx_info >> 8) & 0xf);
 
 		if_statinc(ifp, if_opackets);
 	}

Reply via email to