wil6210: correctly report locally generated disconnect in STA mode
authorDedy Lansky <qca_dlansky@qca.qualcomm.com>
Wed, 8 Mar 2017 11:52:18 +0000 (13:52 +0200)
committerKalle Valo <kvalo@qca.qualcomm.com>
Thu, 9 Mar 2017 08:04:36 +0000 (10:04 +0200)
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 <qca_dlansky@qca.qualcomm.com>
Signed-off-by: Maya Erez <qca_merez@qca.qualcomm.com>
Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
drivers/net/wireless/ath/wil6210/cfg80211.c
drivers/net/wireless/ath/wil6210/main.c
drivers/net/wireless/ath/wil6210/wil6210.h
drivers/net/wireless/ath/wil6210/wmi.c

index 39ee565ecf56cfc1386a756a287d5ba0e92c0d8a..1981ec2e0186e2835fd7a5b1218aae6fe313ca55 100644 (file)
@@ -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);
index 79aeb2b80055c2dafc9dd96ea33053ec022deb86..3206aea00ccdc38944b8816046b687f840128506 100644 (file)
@@ -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,
index 09e2fcef4f07e5b7b307e69812c11fc32a1c1800..cb825ccedbe09637279401c894e5ae30243d3f2d 100644 (file)
@@ -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;
index 02ccdaee6da962c118e704571e6d4aa64cfb6513..9255c47af15a8d941577f7049cd6b612cb63e8dc 100644 (file)
@@ -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,