mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-05 18:41:58 +09:00
wifi: ath10k: Trigger STA disconnect after reconfig complete on hardware restart
[ Upstream commit75bd32f5ce] Currently, on WCN3990, the station disconnect after hardware recovery is not working as expected. This is because of setting the IEEE80211_SDATA_DISCONNECT_HW_RESTART flag very early in the hardware recovery process even before the driver invokes ieee80211_hw_restart(). On the contrary, mac80211 expects this flag to be set after ieee80211_hw_restart() is invoked for it to trigger station disconnect. Set the IEEE80211_SDATA_DISCONNECT_HW_RESTART flag in ath10k_reconfig_complete() instead to fix this. The other targets are not affected by this change, since the hardware params flag is not set. Tested-on: WCN3990 hw1.0 SNOC WLAN.HL.3.2.2.c10-00754-QCAHLSWMTPL-1 Fixes:2c3fc50591("ath10k: Trigger sta disconnect on hardware restart") Signed-off-by: Youghandhar Chintala <quic_youghand@quicinc.com> Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com> Link: https://lore.kernel.org/r/20230518101515.3820-1-quic_youghand@quicinc.com Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
cf5beb8ce9
commit
272240f20d
@@ -2504,7 +2504,6 @@ EXPORT_SYMBOL(ath10k_core_napi_sync_disable);
|
|||||||
static void ath10k_core_restart(struct work_struct *work)
|
static void ath10k_core_restart(struct work_struct *work)
|
||||||
{
|
{
|
||||||
struct ath10k *ar = container_of(work, struct ath10k, restart_work);
|
struct ath10k *ar = container_of(work, struct ath10k, restart_work);
|
||||||
struct ath10k_vif *arvif;
|
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
set_bit(ATH10K_FLAG_CRASH_FLUSH, &ar->dev_flags);
|
set_bit(ATH10K_FLAG_CRASH_FLUSH, &ar->dev_flags);
|
||||||
@@ -2543,14 +2542,6 @@ static void ath10k_core_restart(struct work_struct *work)
|
|||||||
ar->state = ATH10K_STATE_RESTARTING;
|
ar->state = ATH10K_STATE_RESTARTING;
|
||||||
ath10k_halt(ar);
|
ath10k_halt(ar);
|
||||||
ath10k_scan_finish(ar);
|
ath10k_scan_finish(ar);
|
||||||
if (ar->hw_params.hw_restart_disconnect) {
|
|
||||||
list_for_each_entry(arvif, &ar->arvifs, list) {
|
|
||||||
if (arvif->is_up &&
|
|
||||||
arvif->vdev_type == WMI_VDEV_TYPE_STA)
|
|
||||||
ieee80211_hw_restart_disconnect(arvif->vif);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ieee80211_restart_hw(ar->hw);
|
ieee80211_restart_hw(ar->hw);
|
||||||
break;
|
break;
|
||||||
case ATH10K_STATE_OFF:
|
case ATH10K_STATE_OFF:
|
||||||
|
|||||||
@@ -8108,6 +8108,7 @@ static void ath10k_reconfig_complete(struct ieee80211_hw *hw,
|
|||||||
enum ieee80211_reconfig_type reconfig_type)
|
enum ieee80211_reconfig_type reconfig_type)
|
||||||
{
|
{
|
||||||
struct ath10k *ar = hw->priv;
|
struct ath10k *ar = hw->priv;
|
||||||
|
struct ath10k_vif *arvif;
|
||||||
|
|
||||||
if (reconfig_type != IEEE80211_RECONFIG_TYPE_RESTART)
|
if (reconfig_type != IEEE80211_RECONFIG_TYPE_RESTART)
|
||||||
return;
|
return;
|
||||||
@@ -8122,6 +8123,12 @@ static void ath10k_reconfig_complete(struct ieee80211_hw *hw,
|
|||||||
ar->state = ATH10K_STATE_ON;
|
ar->state = ATH10K_STATE_ON;
|
||||||
ieee80211_wake_queues(ar->hw);
|
ieee80211_wake_queues(ar->hw);
|
||||||
clear_bit(ATH10K_FLAG_RESTARTING, &ar->dev_flags);
|
clear_bit(ATH10K_FLAG_RESTARTING, &ar->dev_flags);
|
||||||
|
if (ar->hw_params.hw_restart_disconnect) {
|
||||||
|
list_for_each_entry(arvif, &ar->arvifs, list) {
|
||||||
|
if (arvif->is_up && arvif->vdev_type == WMI_VDEV_TYPE_STA)
|
||||||
|
ieee80211_hw_restart_disconnect(arvif->vif);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mutex_unlock(&ar->conf_mutex);
|
mutex_unlock(&ar->conf_mutex);
|
||||||
|
|||||||
Reference in New Issue
Block a user