From: Suraj P Kizhakkethil quic_surapk@quicinc.com
[ Upstream commit b1b01e46a3db5ad44d1e4691ba37c1e0832cd5cf ]
Currently, for 160 MHz bandwidth, center frequency1 and center frequency2 are not passed correctly to the firmware. Set center frequency1 as the center frequency of the primary 80 MHz channel segment and center frequency2 as the center frequency of the 160 MHz channel and pass the values to the firmware.
Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.3.1-00173-QCAHKSWPL_SILICONZ-1
Signed-off-by: Suraj P Kizhakkethil quic_surapk@quicinc.com Reviewed-by: Aditya Kumar Singh aditya.kumar.singh@oss.qualcomm.com Link: https://patch.msgid.link/20250304095315.3050325-2-quic_surapk@quicinc.com Signed-off-by: Jeff Johnson jeff.johnson@oss.qualcomm.com Signed-off-by: Sasha Levin sashal@kernel.org ---
Based on my thorough analysis, here is my assessment: **YES** This commit should be backported to stable kernel trees for the following reasons: ## Analysis of the Code Changes The commit fixes a critical bug in the 160 MHz channel frequency handling for the ath12k driver (Qualcomm Wi-Fi 7 devices). The specific issues being corrected are: ### 1. **Incorrect center frequency calculation for 160 MHz EHT channels** **Before the fix**: The code only handled `MODE_11AC_VHT80_80` for dual- band scenarios but completely ignored `MODE_11BE_EHT160` (Wi-Fi 7's 160 MHz mode). This meant: - `chan->band_center_freq1` was incorrectly set to the original `arg->band_center_freq1` - `chan->band_center_freq2` was set to 0, providing no information about the 160 MHz channel structure **After the fix**: For `MODE_11BE_EHT160`, the code now correctly: - Sets `chan->band_center_freq1` to the center of the primary 80 MHz segment (±40 MHz from control channel) - Sets `chan->band_center_freq2` to the center of the entire 160 MHz channel - Follows the exact same pattern already established and proven in ath11k driver for `MODE_11AX_HE160` ### 2. **Follows established precedent from ath11k** The ath11k driver (lines 851-860 in `/home/sasha/linux/drivers/net/wireless/ath/ath11k/wmi.c`) already implements this exact logic for `MODE_11AX_HE160`: ```c if (arg->channel.mode == MODE_11AX_HE160) { if (arg->channel.freq > arg->channel.band_center_freq1) chan->band_center_freq1 = center_freq1 + 40; else chan->band_center_freq1 = center_freq1 - 40; chan->band_center_freq2 = arg->channel.band_center_freq1; } ``` The ath12k fix implements identical logic for `MODE_11BE_EHT160`, ensuring consistency across the ath driver family. ### 3. **Impact on Users** Without this fix, 160 MHz channels on Wi-Fi 7 devices would not work correctly because: - The firmware receives incorrect channel center frequency information - This could lead to improper channel selection, interference, or complete failure to establish 160 MHz connections - Users with QCN9274 (and similar) devices would experience degraded Wi-Fi 7 performance ### 4. **Meets Stable Backport Criteria** ✅ **Fixes important functionality**: 160 MHz operation is a key Wi-Fi 7 feature ✅ **Small, contained change**: Only affects one function, adds clear conditional logic ✅ **Low regression risk**: Follows proven pattern from ath11k, only changes previously broken path ✅ **Clear side effects**: None beyond fixing the intended issue ✅ **Well-tested**: Commit includes "Tested-on: QCN9274 hw2.0" with specific firmware version ### 5. **Driver Maturity Context** ATH12K is the Wi-Fi 7 driver for current/recent Qualcomm chipsets. While newer than ath11k, it supports hardware that users actively deploy. The 160 MHz functionality is critical for achieving the high throughput promised by Wi-Fi 7. ### 6. **Comparison with Similar Commits** This commit closely resembles **Similar Commit #2** (marked YES for backport) which also fixed frequency calculation issues in ath12k for 6 GHz operation. Both commits: - Fix critical frequency/channel handling bugs - Have minimal code changes with low regression risk - Include proper testing validation - Address functionality that affects real user deployments The fix is essential for proper Wi-Fi 7 160 MHz operation and should be backported to ensure users with ath12k-supported hardware can fully utilize their devices' capabilities.
drivers/net/wireless/ath/ath12k/wmi.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-)
diff --git a/drivers/net/wireless/ath/ath12k/wmi.c b/drivers/net/wireless/ath/ath12k/wmi.c index b45126a184930..9436e7e1ec1f6 100644 --- a/drivers/net/wireless/ath/ath12k/wmi.c +++ b/drivers/net/wireless/ath/ath12k/wmi.c @@ -980,14 +980,24 @@ int ath12k_wmi_vdev_down(struct ath12k *ar, u8 vdev_id) static void ath12k_wmi_put_wmi_channel(struct ath12k_wmi_channel_params *chan, struct wmi_vdev_start_req_arg *arg) { + u32 center_freq1 = arg->band_center_freq1; + memset(chan, 0, sizeof(*chan));
chan->mhz = cpu_to_le32(arg->freq); - chan->band_center_freq1 = cpu_to_le32(arg->band_center_freq1); - if (arg->mode == MODE_11AC_VHT80_80) + chan->band_center_freq1 = cpu_to_le32(center_freq1); + if (arg->mode == MODE_11BE_EHT160) { + if (arg->freq > center_freq1) + chan->band_center_freq1 = cpu_to_le32(center_freq1 + 40); + else + chan->band_center_freq1 = cpu_to_le32(center_freq1 - 40); + + chan->band_center_freq2 = cpu_to_le32(center_freq1); + } else if (arg->mode == MODE_11BE_EHT80_80) { chan->band_center_freq2 = cpu_to_le32(arg->band_center_freq2); - else + } else { chan->band_center_freq2 = 0; + }
chan->info |= le32_encode_bits(arg->mode, WMI_CHAN_INFO_MODE); if (arg->passive)