wil6210: fix no_fw_recovery mode with change_virtual_intf
When FW crashed with no_fw_recovery mode enabled, user space could still call wil_cfg80211_change_iface quickly to change interface type, and this would cause recovery to proceed and FW crash logs may be lost. Fix this problem by not resetting the FW in case no_fw_recovery is enabled. Change-Id: I139a5e846555e30666f96675400c6db6e1999e05 Signed-off-by: Lior David <qca_liord@qca.qualcomm.com> Signed-off-by: Maya Erez <qca_merez@qca.qualcomm.com> Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com> git-commit: 375a173fc1524eb569c7e8f9cf331126a9d29033 Git-repo: https://github.com/kvalo/ath.git CRs-Fixed: 982931 Signed-off-by: Maya Erez <merez@codeaurora.org>
This commit is contained in:
parent
f696bf2b3c
commit
6237ecf917
4 changed files with 8 additions and 1 deletions
|
@ -306,7 +306,7 @@ static int wil_cfg80211_change_iface(struct wiphy *wiphy,
|
||||||
|
|
||||||
wil_dbg_misc(wil, "%s() type=%d\n", __func__, type);
|
wil_dbg_misc(wil, "%s() type=%d\n", __func__, type);
|
||||||
|
|
||||||
if (netif_running(wil_to_ndev(wil))) {
|
if (netif_running(wil_to_ndev(wil)) && !wil_is_recovery_blocked(wil)) {
|
||||||
wil_dbg_misc(wil, "interface is up. resetting...\n");
|
wil_dbg_misc(wil, "interface is up. resetting...\n");
|
||||||
mutex_lock(&wil->mutex);
|
mutex_lock(&wil->mutex);
|
||||||
__wil_down(wil);
|
__wil_down(wil);
|
||||||
|
|
|
@ -391,6 +391,7 @@ static irqreturn_t wil6210_irq_misc_thread(int irq, void *cookie)
|
||||||
wil_dbg_irq(wil, "Thread ISR MISC 0x%08x\n", isr);
|
wil_dbg_irq(wil, "Thread ISR MISC 0x%08x\n", isr);
|
||||||
|
|
||||||
if (isr & ISR_MISC_FW_ERROR) {
|
if (isr & ISR_MISC_FW_ERROR) {
|
||||||
|
wil->recovery_state = fw_recovery_pending;
|
||||||
wil_fw_core_dump(wil);
|
wil_fw_core_dump(wil);
|
||||||
wil_notify_fw_error(wil);
|
wil_notify_fw_error(wil);
|
||||||
isr &= ~ISR_MISC_FW_ERROR;
|
isr &= ~ISR_MISC_FW_ERROR;
|
||||||
|
|
|
@ -305,6 +305,11 @@ void wil_set_recovery_state(struct wil6210_priv *wil, int state)
|
||||||
wake_up_interruptible(&wil->wq);
|
wake_up_interruptible(&wil->wq);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool wil_is_recovery_blocked(struct wil6210_priv *wil)
|
||||||
|
{
|
||||||
|
return no_fw_recovery && (wil->recovery_state == fw_recovery_pending);
|
||||||
|
}
|
||||||
|
|
||||||
static void wil_fw_error_worker(struct work_struct *work)
|
static void wil_fw_error_worker(struct work_struct *work)
|
||||||
{
|
{
|
||||||
struct wil6210_priv *wil = container_of(work, struct wil6210_priv,
|
struct wil6210_priv *wil = container_of(work, struct wil6210_priv,
|
||||||
|
|
|
@ -719,6 +719,7 @@ void wil_priv_deinit(struct wil6210_priv *wil);
|
||||||
int wil_reset(struct wil6210_priv *wil, bool no_fw);
|
int wil_reset(struct wil6210_priv *wil, bool no_fw);
|
||||||
void wil_fw_error_recovery(struct wil6210_priv *wil);
|
void wil_fw_error_recovery(struct wil6210_priv *wil);
|
||||||
void wil_set_recovery_state(struct wil6210_priv *wil, int state);
|
void wil_set_recovery_state(struct wil6210_priv *wil, int state);
|
||||||
|
bool wil_is_recovery_blocked(struct wil6210_priv *wil);
|
||||||
int wil_up(struct wil6210_priv *wil);
|
int wil_up(struct wil6210_priv *wil);
|
||||||
int __wil_up(struct wil6210_priv *wil);
|
int __wil_up(struct wil6210_priv *wil);
|
||||||
int wil_down(struct wil6210_priv *wil);
|
int wil_down(struct wil6210_priv *wil);
|
||||||
|
|
Loading…
Add table
Reference in a new issue