wil6210: fix disconnect 1 STA in AP
authorVladimir Kondratiev <qca_vkondrat@qca.qualcomm.com>
Tue, 23 Dec 2014 07:47:07 +0000 (09:47 +0200)
committerKalle Valo <kvalo@codeaurora.org>
Thu, 15 Jan 2015 12:31:17 +0000 (14:31 +0200)
When disconnecting single STA in AP, it might be that STA
in question is already disconnected. In this case, need to do nothing.
Previously, it was mis-interpreted as "disconnect all"

Signed-off-by: Vladimir Kondratiev <qca_vkondrat@qca.qualcomm.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
drivers/net/wireless/ath/wil6210/main.c

index 42e119242107967da206e5d4469903bdf0acc0c8..18a2eb5b5d6653ac745574673fa756726a42bd46 100644 (file)
@@ -188,18 +188,29 @@ static void _wil6210_disconnect(struct wil6210_priv *wil, const u8 *bssid,
        struct wireless_dev *wdev = wil->wdev;
 
        might_sleep();
-       if (bssid) {
+       wil_dbg_misc(wil, "%s(bssid=%pM, reason=%d, ev%s)\n", __func__, bssid,
+                    reason_code, from_event ? "+" : "-");
+
+       /* Cases are:
+        * - disconnect single STA, still connected
+        * - disconnect single STA, already disconnected
+        * - disconnect all
+        *
+        * For "disconnect all", there are 2 options:
+        * - bssid == NULL
+        * - bssid is our MAC address
+        */
+       if (bssid && memcmp(ndev->dev_addr, bssid, ETH_ALEN)) {
                cid = wil_find_cid(wil, bssid);
-               wil_dbg_misc(wil, "%s(%pM, CID %d)\n", __func__, bssid, cid);
-       } else {
-               wil_dbg_misc(wil, "%s(all)\n", __func__);
-       }
-
-       if (cid >= 0) /* disconnect 1 peer */
-               wil_disconnect_cid(wil, cid, reason_code, from_event);
-       else /* disconnect all */
+               wil_dbg_misc(wil, "Disconnect %pM, CID=%d, reason=%d\n",
+                            bssid, cid, reason_code);
+               if (cid >= 0) /* disconnect 1 peer */
+                       wil_disconnect_cid(wil, cid, reason_code, from_event);
+       } else { /* all */
+               wil_dbg_misc(wil, "Disconnect all\n");
                for (cid = 0; cid < WIL6210_MAX_CID; cid++)
                        wil_disconnect_cid(wil, cid, reason_code, from_event);
+       }
 
        /* link state */
        switch (wdev->iftype) {