wil6210: fix protection against connections during reset
authorHamad Kadmany <qca_hkadmany@qca.qualcomm.com>
Wed, 5 Apr 2017 11:58:08 +0000 (14:58 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 22 Mar 2018 08:17:53 +0000 (09:17 +0100)
[ 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 <qca_hkadmany@qca.qualcomm.com>
Signed-off-by: Maya Erez <qca_merez@qca.qualcomm.com>
Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/net/wireless/ath/wil6210/wmi.c

index fae4f1285d0873c2b8afa77d75c35904e7d8ed73..94a356bbb6b9391fdf535ad891e74eed4ea8e995 100644 (file)
@@ -501,16 +501,16 @@ static void wmi_evt_connect(struct wil6210_priv *wil, int id, void *d, int len)
                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 wil6210_priv *wil, int id,
 
        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);