From: Rosen Penev <rosenp@gmail.com>
To: linux-kernel@vger.kernel.org
Cc: "open list:B43 WIRELESS DRIVER" <linux-wireless@vger.kernel.org>,
"John W. Linville" <linville@tuxdriver.com>,
"open list:B43 WIRELESS DRIVER" <b43-dev@lists.infradead.org>
Subject: [PATCH wireless] wifi: b43: back off the N-PHY TX power per rate
Date: Thu, 15 Oct 2026 10:59:28 -0700 [thread overview]
Message-ID: <20261015175928.3558057-1-rosenp@gmail.com> (raw)
On N-PHY rev 3+ the hardware TX power control aims at the highest
per-rate target, and an adjusted power table backs each rate group off
from it. b43 fills that table from nphy->tx_power_offset[], but never
sets the offsets, so they stay zero and every rate is sent at the power
allowed for CCK.
The SPROM power offsets exist to avoid this: on boards with external
PAs, OFDM and MCS rates have to be sent a few dB lower than CCK to
keep the PA linear. Sent at full power, 16-QAM and 64-QAM frames are
too distorted to decode. On an ASUS RT-N16 (BCM4718, N-PHY rev 5,
radio 2056, ofdm2gpo 0x66666666) the router could only send at 6-18
Mbit/s and MCS 0-2, even at -50 dBm, and 24 Mbit/s and up or MCS 3 and
up delivered nothing.
Set the offsets from the per-rate targets b43 already computes from
the SPROM, as brcmsmac does, before the table is built.
With this, the RT-N16 sends at 54 Mbit/s, and at MCS 7 with HT
enabled, and TCP from the router to a client goes from 9 to 17-18
Mbit/s.
Fixes: 8615eb2870f1 ("b43: N-PHY: support setting custom TX power")
Assisted-by: LLM
Signed-off-by: Rosen Penev <rosenp@gmail.com>
---
drivers/net/wireless/broadcom/b43/phy_n.c | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/drivers/net/wireless/broadcom/b43/phy_n.c b/drivers/net/wireless/broadcom/b43/phy_n.c
index 22359bd9db47..c9b2b7496983 100644
--- a/drivers/net/wireless/broadcom/b43/phy_n.c
+++ b/drivers/net/wireless/broadcom/b43/phy_n.c
@@ -5834,6 +5834,7 @@ static enum b43_txpwr_result b43_nphy_op_recalc_txpower(struct b43_wldev *dev,
struct ieee80211_channel *channel = dev->wl->hw->conf.chandef.chan;
struct b43_ppr *ppr = &nphy->tx_pwr_max_ppr;
u8 max; /* qdBm */
+ int i;
if (nphy->tx_pwr_last_recalc_freq == channel->center_freq &&
nphy->tx_pwr_last_recalc_limit == phy->desired_txpower)
@@ -5868,6 +5869,16 @@ static enum b43_txpwr_result b43_nphy_op_recalc_txpower(struct b43_wldev *dev,
/* Make sure we didn't go too low */
b43_ppr_apply_min(dev, ppr, INT_TO_Q52(8));
+ /*
+ * The hardware power control aims at the highest per-rate target.
+ * The adjusted power table backs other rates off from it, so that
+ * e.g. 64-QAM isn't sent at the power allowed for CCK.
+ */
+ max = b43_ppr_get_max(dev, ppr);
+ memset(nphy->tx_power_offset, 0, sizeof(nphy->tx_power_offset));
+ for (i = 0; i < B43_PPR_RATES_NUM; i++)
+ nphy->tx_power_offset[i] = max - ppr->__all_rates[i];
+
/* Apply */
b43_mac_suspend(dev);
b43_nphy_tx_power_ctl_setup(dev);
--
2.56.0
_______________________________________________
b43-dev mailing list
b43-dev@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/b43-dev
WARNING: multiple messages have this Message-ID (diff)
From: Rosen Penev <rosenp@gmail.com>
To: linux-kernel@vger.kernel.org
Cc: "Rafał Miłecki" <zajec5@gmail.com>,
"John W. Linville" <linville@tuxdriver.com>,
linux-wireless@vger.kernel.org (open list:B43 WIRELESS DRIVER),
b43-dev@lists.infradead.org (open list:B43 WIRELESS DRIVER)
Subject: [PATCH wireless] wifi: b43: back off the N-PHY TX power per rate
Date: Thu, 15 Oct 2026 10:59:28 -0700 [thread overview]
Message-ID: <20261015175928.3558057-1-rosenp@gmail.com> (raw)
On N-PHY rev 3+ the hardware TX power control aims at the highest
per-rate target, and an adjusted power table backs each rate group off
from it. b43 fills that table from nphy->tx_power_offset[], but never
sets the offsets, so they stay zero and every rate is sent at the power
allowed for CCK.
The SPROM power offsets exist to avoid this: on boards with external
PAs, OFDM and MCS rates have to be sent a few dB lower than CCK to
keep the PA linear. Sent at full power, 16-QAM and 64-QAM frames are
too distorted to decode. On an ASUS RT-N16 (BCM4718, N-PHY rev 5,
radio 2056, ofdm2gpo 0x66666666) the router could only send at 6-18
Mbit/s and MCS 0-2, even at -50 dBm, and 24 Mbit/s and up or MCS 3 and
up delivered nothing.
Set the offsets from the per-rate targets b43 already computes from
the SPROM, as brcmsmac does, before the table is built.
With this, the RT-N16 sends at 54 Mbit/s, and at MCS 7 with HT
enabled, and TCP from the router to a client goes from 9 to 17-18
Mbit/s.
Fixes: 8615eb2870f1 ("b43: N-PHY: support setting custom TX power")
Assisted-by: LLM
Signed-off-by: Rosen Penev <rosenp@gmail.com>
---
drivers/net/wireless/broadcom/b43/phy_n.c | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/drivers/net/wireless/broadcom/b43/phy_n.c b/drivers/net/wireless/broadcom/b43/phy_n.c
index 22359bd9db47..c9b2b7496983 100644
--- a/drivers/net/wireless/broadcom/b43/phy_n.c
+++ b/drivers/net/wireless/broadcom/b43/phy_n.c
@@ -5834,6 +5834,7 @@ static enum b43_txpwr_result b43_nphy_op_recalc_txpower(struct b43_wldev *dev,
struct ieee80211_channel *channel = dev->wl->hw->conf.chandef.chan;
struct b43_ppr *ppr = &nphy->tx_pwr_max_ppr;
u8 max; /* qdBm */
+ int i;
if (nphy->tx_pwr_last_recalc_freq == channel->center_freq &&
nphy->tx_pwr_last_recalc_limit == phy->desired_txpower)
@@ -5868,6 +5869,16 @@ static enum b43_txpwr_result b43_nphy_op_recalc_txpower(struct b43_wldev *dev,
/* Make sure we didn't go too low */
b43_ppr_apply_min(dev, ppr, INT_TO_Q52(8));
+ /*
+ * The hardware power control aims at the highest per-rate target.
+ * The adjusted power table backs other rates off from it, so that
+ * e.g. 64-QAM isn't sent at the power allowed for CCK.
+ */
+ max = b43_ppr_get_max(dev, ppr);
+ memset(nphy->tx_power_offset, 0, sizeof(nphy->tx_power_offset));
+ for (i = 0; i < B43_PPR_RATES_NUM; i++)
+ nphy->tx_power_offset[i] = max - ppr->__all_rates[i];
+
/* Apply */
b43_mac_suspend(dev);
b43_nphy_tx_power_ctl_setup(dev);
--
2.56.0
next reply other threads:[~2026-10-15 17:59 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-15 17:59 Rosen Penev [this message]
2026-10-15 17:59 ` [PATCH wireless] wifi: b43: back off the N-PHY TX power per rate Rosen Penev
2026-10-15 20:11 ` Alessio Ferri
2026-10-15 20:11 ` Alessio Ferri
2026-10-15 21:50 ` Rosen Penev
2026-10-15 21:50 ` Rosen Penev
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20261015175928.3558057-1-rosenp@gmail.com \
--to=rosenp@gmail.com \
--cc=b43-dev@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-wireless@vger.kernel.org \
--cc=linville@tuxdriver.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.