4.9-stable review patch.  If anyone has any objections, please let me know.

------------------

From: Hamad Kadmany <[email protected]>


[ Upstream commit b819447dfc4bd120c9d6cd8521252d544fce8fe7 ]

Existing code that ignores connection events during
reset flow will never take effect since it locks the
same mutex taken by the reset flow.

In addition, in case of unsolicited disconnect events ignore
those as well since device is about to get reset.

Signed-off-by: Hamad Kadmany <[email protected]>
Signed-off-by: Maya Erez <[email protected]>
Signed-off-by: Kalle Valo <[email protected]>
Signed-off-by: Sasha Levin <[email protected]>
Signed-off-by: Greg Kroah-Hartman <[email protected]>
---
 drivers/net/wireless/ath/wil6210/wmi.c |   11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

--- a/drivers/net/wireless/ath/wil6210/wmi.c
+++ b/drivers/net/wireless/ath/wil6210/wmi.c
@@ -501,16 +501,16 @@ static void wmi_evt_connect(struct wil62
                assoc_resp_ielen = 0;
        }
 
-       mutex_lock(&wil->mutex);
        if (test_bit(wil_status_resetting, wil->status) ||
            !test_bit(wil_status_fwready, wil->status)) {
                wil_err(wil, "status_resetting, cancel connect event, CID %d\n",
                        evt->cid);
-               mutex_unlock(&wil->mutex);
                /* no need for cleanup, wil_reset will do that */
                return;
        }
 
+       mutex_lock(&wil->mutex);
+
        if ((wdev->iftype == NL80211_IFTYPE_STATION) ||
            (wdev->iftype == NL80211_IFTYPE_P2P_CLIENT)) {
                if (!test_bit(wil_status_fwconnecting, wil->status)) {
@@ -608,6 +608,13 @@ static void wmi_evt_disconnect(struct wi
 
        wil->sinfo_gen++;
 
+       if (test_bit(wil_status_resetting, wil->status) ||
+           !test_bit(wil_status_fwready, wil->status)) {
+               wil_err(wil, "status_resetting, cancel disconnect event\n");
+               /* no need for cleanup, wil_reset will do that */
+               return;
+       }
+
        mutex_lock(&wil->mutex);
        wil6210_disconnect(wil, evt->bssid, reason_code, true);
        mutex_unlock(&wil->mutex);


Reply via email to