ath6kl: Fix reconnection issue after recovery
Disallowing any wmi commands while re-initializing the firmware results in connection failures after recovery is done in open/WEP mode. To fix this, clear WMI_READY, to make sure no wmi command is tried while fw is down. Remove ATH6KL_STATE_RECOVERY state check in ath6kl_control_tx() so that any configuration during fw init time will go through using wmi commands. Signed-off-by: Vasanthakumar Thiagarajan <vthiagar@qca.qualcomm.com> Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
This commit is contained in:
parent
f08dbda25f
commit
58109df67a
|
@ -151,6 +151,10 @@ static bool __ath6kl_cfg80211_sscan_stop(struct ath6kl_vif *vif)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
del_timer_sync(&vif->sched_scan_timer);
|
del_timer_sync(&vif->sched_scan_timer);
|
||||||
|
|
||||||
|
if (ar->state == ATH6KL_STATE_RECOVERY)
|
||||||
|
return true;
|
||||||
|
|
||||||
ath6kl_wmi_enable_sched_scan_cmd(ar->wmi, vif->fw_vif_idx, false);
|
ath6kl_wmi_enable_sched_scan_cmd(ar->wmi, vif->fw_vif_idx, false);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
@ -3435,8 +3439,9 @@ void ath6kl_cfg80211_stop(struct ath6kl_vif *vif)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (test_bit(CONNECTED, &vif->flags) ||
|
if (vif->ar->state != ATH6KL_STATE_RECOVERY &&
|
||||||
test_bit(CONNECT_PEND, &vif->flags))
|
(test_bit(CONNECTED, &vif->flags) ||
|
||||||
|
test_bit(CONNECT_PEND, &vif->flags)))
|
||||||
ath6kl_wmi_disconnect_cmd(vif->ar->wmi, vif->fw_vif_idx);
|
ath6kl_wmi_disconnect_cmd(vif->ar->wmi, vif->fw_vif_idx);
|
||||||
|
|
||||||
vif->sme_state = SME_DISCONNECTED;
|
vif->sme_state = SME_DISCONNECTED;
|
||||||
|
@ -3448,7 +3453,8 @@ void ath6kl_cfg80211_stop(struct ath6kl_vif *vif)
|
||||||
netif_carrier_off(vif->ndev);
|
netif_carrier_off(vif->ndev);
|
||||||
|
|
||||||
/* disable scanning */
|
/* disable scanning */
|
||||||
if (ath6kl_wmi_scanparams_cmd(vif->ar->wmi, vif->fw_vif_idx, 0xFFFF,
|
if (vif->ar->state != ATH6KL_STATE_RECOVERY &&
|
||||||
|
ath6kl_wmi_scanparams_cmd(vif->ar->wmi, vif->fw_vif_idx, 0xFFFF,
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0) != 0)
|
0, 0, 0, 0, 0, 0, 0, 0, 0) != 0)
|
||||||
ath6kl_warn("failed to disable scan during stop\n");
|
ath6kl_warn("failed to disable scan during stop\n");
|
||||||
|
|
||||||
|
|
|
@ -1697,10 +1697,14 @@ int ath6kl_init_hw_stop(struct ath6kl *ar)
|
||||||
|
|
||||||
void ath6kl_init_hw_restart(struct ath6kl *ar)
|
void ath6kl_init_hw_restart(struct ath6kl *ar)
|
||||||
{
|
{
|
||||||
|
clear_bit(WMI_READY, &ar->flag);
|
||||||
|
|
||||||
ath6kl_cfg80211_stop_all(ar);
|
ath6kl_cfg80211_stop_all(ar);
|
||||||
|
|
||||||
if (__ath6kl_init_hw_stop(ar))
|
if (__ath6kl_init_hw_stop(ar)) {
|
||||||
|
ath6kl_dbg(ATH6KL_DBG_RECOVERY, "Failed to stop during fw error recovery\n");
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (__ath6kl_init_hw_start(ar)) {
|
if (__ath6kl_init_hw_start(ar)) {
|
||||||
ath6kl_dbg(ATH6KL_DBG_RECOVERY, "Failed to restart during fw error recovery\n");
|
ath6kl_dbg(ATH6KL_DBG_RECOVERY, "Failed to restart during fw error recovery\n");
|
||||||
|
|
|
@ -288,8 +288,7 @@ int ath6kl_control_tx(void *devt, struct sk_buff *skb,
|
||||||
int status = 0;
|
int status = 0;
|
||||||
struct ath6kl_cookie *cookie = NULL;
|
struct ath6kl_cookie *cookie = NULL;
|
||||||
|
|
||||||
if (WARN_ON_ONCE(ar->state == ATH6KL_STATE_WOW) ||
|
if (WARN_ON_ONCE(ar->state == ATH6KL_STATE_WOW)) {
|
||||||
ar->state == ATH6KL_STATE_RECOVERY) {
|
|
||||||
dev_kfree_skb(skb);
|
dev_kfree_skb(skb);
|
||||||
return -EACCES;
|
return -EACCES;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue