From nobody Tue Jan 14 04:34:54 2025 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4YXGWM0c0Pz5j6Ym; Tue, 14 Jan 2025 04:34:55 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R11" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4YXGWM00j3z3cxg; Tue, 14 Jan 2025 04:34:55 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1736829295; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=CiugQtBSalOSSVOaLthjsY7WzgZc6sDY0BMMhs6+RUw=; b=ByiJ3bGC9QcWLWEoQMb+rOdD0SxzFftoAc4KcbrD6qjvg2/c/2Fy1fgP5+RHq/emtTQUhF MsG0/qEGim5j7IFvltx4ftbHB4tX8yavvi/G9pt8/r/hjJJ9cEChqTnjBQi/JOKSul0cUI Jk1iZ0RcybRvrl3VOUgbo6+DBE7TWJXBuZP5WQHKAfSnRCEIpLFsQtQPnzk6I/TnS1s8gs Eyi79dNy0920c6iKvW+PMAXt2YAokKlsqGvKLE7v2uBZsGIu7O96idSXY5FsDrlv9934su EJCEUHn4PTbZmmMJ82Cd9qNHILzm+ohfp3vuPZ+S0WCWPUhwsy+/wjc2QeCSAQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1736829295; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=CiugQtBSalOSSVOaLthjsY7WzgZc6sDY0BMMhs6+RUw=; b=ESjgA5ojd6Xlg1VHuhhaQgINSKjd/gRBRp3lEoxEaICY6rBYiuOBt36lGODHN9BQBDl/yA kIoq80lNaHhp0cYOqIqqGKCoeGM0J6zsBy+m2JUdyRjCki6FLSIHoFOhF7NZ5+geSYvwrp BjIogSatfPFzvpKgiY05b75zHjYefk/H+RvMK9APAV7TdpfKwDMt7GWi2SrDhrk/iB4O92 yxlBbV5qmGU2dAMGd/qDzKvoOLW3z/b7qQ2rMCI5LLsmInIjAO1FL0YppPG30hH9jqT6AU bQYbfeOIm9iHNU9Ryaxvj0cC6qRGMSIRBsCWrYVNVozyvvf3MmD2OOLAWAQeLQ== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1736829295; a=rsa-sha256; cv=none; b=qxWf96dBLLcE6Ga2ppkNOBj12Y4SWUOG/sXLg9d0xfRZhzlbfiCM8+kByukN1aR0iZvlD8 8pyVFKN2L4pqDjAmPImf2WvaoYEldmFeXscdf9QALMFFOYE1Uuv2wnWGZLhRa49hLzeLR2 ULlXX0TKcFjLSS3WLjlpmflDBYyRi6/2JMHQyCo/Ok6l9pIT48kCynyMMH3SNBdwMZ971a KDWKsAIxJrIIRJIh8dEiKG444KsVQ2mqPRw4xv13CA+qtyNFRIpI/exooOJA7WxkA2YP51 udDbqYvs2cIG6S0RV4QlHQO1H3nzxsNrjVbb3ImcT+XLtnRTbG9dD7SXMSE97w== ARC-Authentication-Results: i=1; mx1.freebsd.org; none Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4YXGWL6dMJz113F; Tue, 14 Jan 2025 04:34:54 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.18.1/8.18.1) with ESMTP id 50E4Ysts072507; Tue, 14 Jan 2025 04:34:54 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 50E4Ys6L072504; Tue, 14 Jan 2025 04:34:54 GMT (envelope-from git) Date: Tue, 14 Jan 2025 04:34:54 GMT Message-Id: <202501140434.50E4Ys6L072504@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Adrian Chadd Subject: git: f45f66fadacc - main - rtwn: explicitly configure RTS based on basic rates List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-all@freebsd.org Sender: owner-dev-commits-src-all@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: adrian X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: f45f66fadacc2efff3c2ff64e3528b8dbaad3673 Auto-Submitted: auto-generated The branch main has been updated by adrian: URL: https://cgit.FreeBSD.org/src/commit/?id=f45f66fadacc2efff3c2ff64e3528b8dbaad3673 commit f45f66fadacc2efff3c2ff64e3528b8dbaad3673 Author: Adrian Chadd AuthorDate: 2024-12-19 02:11:28 +0000 Commit: Adrian Chadd CommitDate: 2025-01-14 04:33:44 +0000 rtwn: explicitly configure RTS based on basic rates The NIC/firmware initialises the initial RTS/CTS rate to something high, like OFDM48. That's not going to be very reliable. It's not a problem right now as we program in the RTS/CTS value to use in the TX descriptor setup path based on the control rate for the given frame TX rate, and like the INIDATA/driver rate stuff in the TX descriptor, the TX descriptor RTS/CTS rate overrides the INIRTS rate. However when it's time to flip on firmware based rate control, the initial rate needs to not be OFDM48. Yes, the firmware and hardware does have some rate retry schedule for RTS/CTS frames, but there's no point in wasting short retries trying to do OFDM48 based RTS/CTS setup. Add some warning logging if there are no basic or RTS/CTS rates available, and leave things at default. If this happens in production for someone then it would be good to know and what the rate mask was. Locally tested: * RTL8192CU, STA mode (with/without firmware rate control enabled locally) Differential Revision: https://reviews.freebsd.org/D48140 --- sys/dev/rtwn/if_rtwn.c | 8 +++++--- sys/dev/rtwn/if_rtwn_rx.c | 35 +++++++++++++++++++++++++++++++++++ sys/dev/rtwn/if_rtwn_rx.h | 1 + 3 files changed, 41 insertions(+), 3 deletions(-) diff --git a/sys/dev/rtwn/if_rtwn.c b/sys/dev/rtwn/if_rtwn.c index f9950c5acf4d..2003fa7d20be 100644 --- a/sys/dev/rtwn/if_rtwn.c +++ b/sys/dev/rtwn/if_rtwn.c @@ -1308,12 +1308,14 @@ rtwn_calc_basicrates(struct rtwn_softc *sc) ieee80211_free_node(ni); } - - if (basicrates == 0) + if (basicrates == 0) { + device_printf(sc->sc_dev, + "WARNING: no configured basic rates!\n"); return; + } - /* XXX also set initial RTS rate? */ rtwn_set_basicrates(sc, basicrates); + rtwn_set_rts_rate(sc, basicrates); } static int diff --git a/sys/dev/rtwn/if_rtwn_rx.c b/sys/dev/rtwn/if_rtwn_rx.c index e5ddc7a3cb97..9b7c93fee9b6 100644 --- a/sys/dev/rtwn/if_rtwn_rx.c +++ b/sys/dev/rtwn/if_rtwn_rx.c @@ -134,6 +134,41 @@ rtwn_set_basicrates(struct rtwn_softc *sc, uint32_t rates) rtwn_setbits_4(sc, R92C_RRSR, R92C_RRSR_RATE_BITMAP_M, rates); } +/* + * Configure the initial RTS rate to use. + */ +void +rtwn_set_rts_rate(struct rtwn_softc *sc, uint32_t rates) +{ + uint8_t ridx; + + /* + * We shouldn't set the initial RTS/CTS generation rate + * as the highest available rate - that may end up + * with trying to configure something like MCS1 RTS/CTS. + * + * Instead, choose a suitable low OFDM/CCK rate based + * on the basic rate bitmask. Assume the caller + * has filtered out CCK modes in 5GHz. + */ + rates &= (1 << RTWN_RIDX_CCK1) | (1 << RTWN_RIDX_CCK55) | + (1 << RTWN_RIDX_CCK11) | (1 << RTWN_RIDX_OFDM6) | + (1 << RTWN_RIDX_OFDM9) | (1 << RTWN_RIDX_OFDM12) | + (1 << RTWN_RIDX_OFDM18) | (1 << RTWN_RIDX_OFDM24); + if (rates == 0) { + device_printf(sc->sc_dev, + "WARNING: no configured basic RTS rate!\n"); + return; + } + ridx = fls(rates) - 1; + + RTWN_DPRINTF(sc, RTWN_DEBUG_RA, + "%s: mask=0x%08x, ridx=%d\n", + __func__, rates, ridx); + + rtwn_write_1(sc, R92C_INIRTS_RATE_SEL, ridx); +} + static void rtwn_update_avgrssi(struct rtwn_softc *sc, struct rtwn_node *un, int8_t rssi, int is_cck) diff --git a/sys/dev/rtwn/if_rtwn_rx.h b/sys/dev/rtwn/if_rtwn_rx.h index 3108f1d4cde4..751173d0f80f 100644 --- a/sys/dev/rtwn/if_rtwn_rx.h +++ b/sys/dev/rtwn/if_rtwn_rx.h @@ -23,6 +23,7 @@ void rtwn_get_rates(struct rtwn_softc *, const struct ieee80211_rateset *, const struct ieee80211_htrateset *, uint32_t *, uint32_t *, int *, int); void rtwn_set_basicrates(struct rtwn_softc *, uint32_t); +void rtwn_set_rts_rate(struct rtwn_softc *, uint32_t); struct ieee80211_node * rtwn_rx_common(struct rtwn_softc *, struct mbuf *, void *); void rtwn_adhoc_recv_mgmt(struct ieee80211_node *, struct mbuf *, int,