mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-21 21:54:52 -04:00
wifi: ath12k: fix ath12k_core_pre_reconfigure_recovery() with grouping
Currently, ath12k_core_pre_reconfigure_recovery() reconfigures all radios within the same group. During grouping and driver going for a recovery, this function is called as many times as there are devices in the group. Consequently, it performs the same reconfiguration multiple times, which is unnecessary. To prevent this, add a check to continue if the action has already been taken. To simplify the management of various flags, the reason for hardware queues being stopped is used as a check instead of introducing a new flag. While at it, also add missing wiphy locks. Wiphy lock is required since ath12k_mac_drain_tx() which is called by ath12k_core_pre_reconfigure_recovery() needs this lock to be held by the caller. Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.3.1-00173-QCAHKSWPL_SILICONZ-1 Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.4.1-00199-QCAHKSWPL_SILICONZ-1 Tested-on: WCN7850 hw2.0 PCI WLAN.HMT.1.0.c5-00481-QCAHMTSWPL_V1.0_V2.0_SILICONZ-3 Signed-off-by: Aditya Kumar Singh <aditya.kumar.singh@oss.qualcomm.com> Reviewed-by: Vasanthakumar Thiagarajan <vasanthakumar.thiagarajan@oss.qualcomm.com> Link: https://patch.msgid.link/20250408-fix_reboot_issues_with_hw_grouping-v4-6-95e7bf048595@oss.qualcomm.com Signed-off-by: Jeff Johnson <jeff.johnson@oss.qualcomm.com>
This commit is contained in:
committed by
Jeff Johnson
parent
1d55625bc2
commit
718ead261f
@@ -1411,6 +1411,18 @@ static void ath12k_core_pre_reconfigure_recovery(struct ath12k_base *ab)
|
||||
ah->state == ATH12K_HW_STATE_TM)
|
||||
continue;
|
||||
|
||||
wiphy_lock(ah->hw->wiphy);
|
||||
|
||||
/* If queue 0 is stopped, it is safe to assume that all
|
||||
* other queues are stopped by driver via
|
||||
* ieee80211_stop_queues() below. This means, there is
|
||||
* no need to stop it again and hence continue
|
||||
*/
|
||||
if (ieee80211_queue_stopped(ah->hw, 0)) {
|
||||
wiphy_unlock(ah->hw->wiphy);
|
||||
continue;
|
||||
}
|
||||
|
||||
ieee80211_stop_queues(ah->hw);
|
||||
|
||||
for (j = 0; j < ah->num_radio; j++) {
|
||||
@@ -1439,6 +1451,8 @@ static void ath12k_core_pre_reconfigure_recovery(struct ath12k_base *ab)
|
||||
ar->monitor_vdev_created = false;
|
||||
ar->monitor_started = false;
|
||||
}
|
||||
|
||||
wiphy_unlock(ah->hw->wiphy);
|
||||
}
|
||||
|
||||
wake_up(&ab->wmi_ab.tx_credits_wq);
|
||||
|
||||
Reference in New Issue
Block a user