wil6210: fix disconnect handling for AP
authorVladimir Kondratiev <qca_vkondrat@qca.qualcomm.com>
Mon, 16 Jun 2014 16:37:16 +0000 (19:37 +0300)
committerJohn W. Linville <linville@tuxdriver.com>
Thu, 19 Jun 2014 19:49:26 +0000 (15:49 -0400)
For the AP-like interface, if "disconnect all" requested,
every station should be deleted with cfg80211_del_sta().
Implement this behavior.

Signed-off-by: Vladimir Kondratiev <qca_vkondrat@qca.qualcomm.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/ath/wil6210/main.c

index 33b89d1e4570c0bae3b10d2245206ff40e711d42..6cc4791d6022703941db80724929b40f43de90da 100644 (file)
@@ -61,11 +61,24 @@ void wil_memcpy_toio_32(volatile void __iomem *dst, const void *src,
 static void wil_disconnect_cid(struct wil6210_priv *wil, int cid)
 {
        uint i;
+       struct net_device *ndev = wil_to_ndev(wil);
+       struct wireless_dev *wdev = wil->wdev;
        struct wil_sta_info *sta = &wil->sta[cid];
+       wil_dbg_misc(wil, "%s(CID %d, status %d)\n", __func__, cid,
+                    sta->status);
 
        sta->data_port_open = false;
        if (sta->status != wil_sta_unused) {
                wmi_disconnect_sta(wil, sta->addr, WLAN_REASON_DEAUTH_LEAVING);
+               switch (wdev->iftype) {
+               case NL80211_IFTYPE_AP:
+               case NL80211_IFTYPE_P2P_GO:
+                       /* AP-like interface */
+                       cfg80211_del_sta(ndev, sta->addr, GFP_KERNEL);
+                       break;
+               default:
+                       break;
+               }
                sta->status = wil_sta_unused;
        }
 
@@ -119,11 +132,6 @@ static void _wil6210_disconnect(struct wil6210_priv *wil, const u8 *bssid)
                clear_bit(wil_status_fwconnecting, &wil->status);
                break;
        default:
-               /* AP-like interface and monitor:
-                * never scan, always connected
-                */
-               if (bssid)
-                       cfg80211_del_sta(ndev, bssid, GFP_KERNEL);
                break;
        }
 }