Commit f187fe8e authored by Venkateswara Naralasetty's avatar Venkateswara Naralasetty Committed by Kalle Valo

ath11k: fix firmware crash during channel switch

Currently the updated bandwidth for the peer will be configured
to the firmware after channel switch from the sta_rc_update_wk.
If the updated bandwidth is greater than the configured peer phymode
during the peer assoc may result firmware assert.

For example, initially AP is in HE40 mode and the peer phymode is
configured as MODE_11AX_HE40 during peer assoc. Now user change the
channel width to HE80 then, the peer bandwidth will be updated as
HE80 to the firmware.

This will trigger firmware assert due to peer bandwidth is greater than
the peer phymode.

Fix this issue by sending peer assoc command before setting the updated
peer bandwith to firmware.

Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.5.0.1-01100-QCAHKSWPL_SILICONZ-1
Signed-off-by: default avatarVenkateswara Naralasetty <quic_vnaralas@quicinc.com>
Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
Link: https://lore.kernel.org/r/1636644002-25446-1-git-send-email-quic_vnaralas@quicinc.com
parent 624e0a31
...@@ -3924,11 +3924,27 @@ static void ath11k_sta_rc_update_wk(struct work_struct *wk) ...@@ -3924,11 +3924,27 @@ static void ath11k_sta_rc_update_wk(struct work_struct *wk)
ath11k_mac_max_he_nss(he_mcs_mask))); ath11k_mac_max_he_nss(he_mcs_mask)));
if (changed & IEEE80211_RC_BW_CHANGED) { if (changed & IEEE80211_RC_BW_CHANGED) {
/* Send peer assoc command before set peer bandwidth param to
* avoid the mismatch between the peer phymode and the peer
* bandwidth.
*/
ath11k_peer_assoc_prepare(ar, arvif->vif, sta, &peer_arg, true);
peer_arg.is_assoc = false;
err = ath11k_wmi_send_peer_assoc_cmd(ar, &peer_arg);
if (err) {
ath11k_warn(ar->ab, "failed to send peer assoc for STA %pM vdev %i: %d\n",
sta->addr, arvif->vdev_id, err);
} else if (wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ)) {
err = ath11k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id, err = ath11k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id,
WMI_PEER_CHWIDTH, bw); WMI_PEER_CHWIDTH, bw);
if (err) if (err)
ath11k_warn(ar->ab, "failed to update STA %pM peer bw %d: %d\n", ath11k_warn(ar->ab, "failed to update STA %pM peer bw %d: %d\n",
sta->addr, bw, err); sta->addr, bw, err);
} else {
ath11k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n",
sta->addr, arvif->vdev_id);
}
} }
if (changed & IEEE80211_RC_NSS_CHANGED) { if (changed & IEEE80211_RC_NSS_CHANGED) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment