From: Dedy Lansky <[email protected]>

Driver always invoke cfg80211_disconnected() with locally_generated as
false.
Fix this by reporting true whenever the disconnect is triggered from
upper layers (cfg80211) or from within the driver itself (reset,
deinit).

Signed-off-by: Dedy Lansky <[email protected]>
Signed-off-by: Maya Erez <[email protected]>
---
 drivers/net/wireless/ath/wil6210/cfg80211.c | 1 +
 drivers/net/wireless/ath/wil6210/main.c     | 5 ++++-
 drivers/net/wireless/ath/wil6210/wil6210.h  | 1 +
 drivers/net/wireless/ath/wil6210/wmi.c      | 1 +
 4 files changed, 7 insertions(+), 1 deletion(-)

diff --git a/drivers/net/wireless/ath/wil6210/cfg80211.c 
b/drivers/net/wireless/ath/wil6210/cfg80211.c
index 39ee565..1981ec2 100644
--- a/drivers/net/wireless/ath/wil6210/cfg80211.c
+++ b/drivers/net/wireless/ath/wil6210/cfg80211.c
@@ -710,6 +710,7 @@ static int wil_cfg80211_disconnect(struct wiphy *wiphy,
                return 0;
        }
 
+       wil->locally_generated_disc = true;
        rc = wmi_call(wil, WMI_DISCONNECT_CMDID, NULL, 0,
                      WMI_DISCONNECT_EVENTID, NULL, 0,
                      WIL6210_DISCONNECT_TO_MS);
diff --git a/drivers/net/wireless/ath/wil6210/main.c 
b/drivers/net/wireless/ath/wil6210/main.c
index 79aeb2b8..3206aea 100644
--- a/drivers/net/wireless/ath/wil6210/main.c
+++ b/drivers/net/wireless/ath/wil6210/main.c
@@ -279,7 +279,10 @@ static void _wil6210_disconnect(struct wil6210_priv *wil, 
const u8 *bssid,
                if (test_bit(wil_status_fwconnected, wil->status)) {
                        clear_bit(wil_status_fwconnected, wil->status);
                        cfg80211_disconnected(ndev, reason_code,
-                                             NULL, 0, false, GFP_KERNEL);
+                                             NULL, 0,
+                                             wil->locally_generated_disc,
+                                             GFP_KERNEL);
+                       wil->locally_generated_disc = false;
                } else if (test_bit(wil_status_fwconnecting, wil->status)) {
                        cfg80211_connect_result(ndev, bssid, NULL, 0, NULL, 0,
                                                WLAN_STATUS_UNSPECIFIED_FAILURE,
diff --git a/drivers/net/wireless/ath/wil6210/wil6210.h 
b/drivers/net/wireless/ath/wil6210/wil6210.h
index 09e2fce..cb825cc 100644
--- a/drivers/net/wireless/ath/wil6210/wil6210.h
+++ b/drivers/net/wireless/ath/wil6210/wil6210.h
@@ -614,6 +614,7 @@ struct wil6210_priv {
        int sinfo_gen;
        u32 ap_isolate; /* no intra-BSS communication */
        struct cfg80211_bss *bss; /* connected bss, relevant in STA mode */
+       int locally_generated_disc; /* relevant in STA mode */
        /* interrupt moderation */
        u32 tx_max_burst_duration;
        u32 tx_interframe_timeout;
diff --git a/drivers/net/wireless/ath/wil6210/wmi.c 
b/drivers/net/wireless/ath/wil6210/wmi.c
index 02ccdae..9255c47 100644
--- a/drivers/net/wireless/ath/wil6210/wmi.c
+++ b/drivers/net/wireless/ath/wil6210/wmi.c
@@ -1497,6 +1497,7 @@ int wmi_disconnect_sta(struct wil6210_priv *wil, const u8 
*mac,
 
        wil_dbg_wmi(wil, "disconnect_sta: (%pM, reason %d)\n", mac, reason);
 
+       wil->locally_generated_disc = true;
        if (del_sta) {
                ether_addr_copy(del_sta_cmd.dst_mac, mac);
                rc = wmi_call(wil, WMI_DEL_STA_CMDID, &del_sta_cmd,
-- 
1.9.1

Reply via email to