Message ID | 20250320112426.1956961-1-quic_rdevanat@quicinc.com |
---|---|
State | New |
Headers | show |
Series | [ath-next,v3] wifi: ath12k: Fix incorrect rates sent to firmware | expand |
Roopni Devanathan <quic_rdevanat@quicinc.com> wrote: > From: Pradeep Kumar Chitrapu <quic_pradeepc@quicinc.com> > > Before firmware assert, if there is a station interface in the device > which is not associated with an AP, the basic rates are set to zero. > Following this, during firmware recovery, when basic rates are zero, > ath12k driver is sending invalid rate codes, which are negative values, > to firmware. This results in firmware assert. > > Fix this by checking if rate codes are valid, before sending them > to the firmware. > > Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.4.1-00199-QCAHKSWPL_SILICONZ-1 > > Signed-off-by: Pradeep Kumar Chitrapu <quic_pradeepc@quicinc.com> > Signed-off-by: Roopni Devanathan <quic_rdevanat@quicinc.com> For the __ffs() part, Reviewed-by: Ping-Ke Shih <pkshih@realtek.com>
On 3/20/2025 4:54 PM, Roopni Devanathan wrote: > From: Pradeep Kumar Chitrapu <quic_pradeepc@quicinc.com> > > Before firmware assert, if there is a station interface in the device > which is not associated with an AP, the basic rates are set to zero. > Following this, during firmware recovery, when basic rates are zero, > ath12k driver is sending invalid rate codes, which are negative values, > to firmware. This results in firmware assert. > > Fix this by checking if rate codes are valid, before sending them > to the firmware. > > Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.4.1-00199-QCAHKSWPL_SILICONZ-1 > > Signed-off-by: Pradeep Kumar Chitrapu <quic_pradeepc@quicinc.com> > Signed-off-by: Roopni Devanathan <quic_rdevanat@quicinc.com> Reviewed-by: Vasanthakumar Thiagarajan <vasanthakumar.thiagarajan@oss.qualcomm.com>
diff --git a/drivers/net/wireless/ath/ath12k/mac.c b/drivers/net/wireless/ath/ath12k/mac.c index 9fda97667d4e..b7e4bb00e87c 100644 --- a/drivers/net/wireless/ath/ath12k/mac.c +++ b/drivers/net/wireless/ath/ath12k/mac.c @@ -3450,7 +3450,10 @@ static void ath12k_recalculate_mgmt_rate(struct ath12k *ar, } sband = hw->wiphy->bands[def->chan->band]; - basic_rate_idx = ffs(bss_conf->basic_rates) - 1; + if (bss_conf->basic_rates) + basic_rate_idx = __ffs(bss_conf->basic_rates); + else + basic_rate_idx = 0; bitrate = sband->bitrates[basic_rate_idx].bitrate; hw_rate_code = ath12k_mac_get_rate_hw_value(bitrate); @@ -3983,10 +3986,14 @@ static void ath12k_mac_bss_info_changed(struct ath12k *ar, band = def.chan->band; mcast_rate = info->mcast_rate[band]; - if (mcast_rate > 0) + if (mcast_rate > 0) { rateidx = mcast_rate - 1; - else - rateidx = ffs(info->basic_rates) - 1; + } else { + if (info->basic_rates) + rateidx = __ffs(info->basic_rates); + else + rateidx = 0; + } if (ar->pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP) rateidx += ATH12K_MAC_FIRST_OFDM_RATE_IDX;