brcmfmac: Do not handle link downs for ibss.
authorHante Meuleman <meuleman@broadcom.com>
Tue, 5 Jan 2016 10:05:50 +0000 (11:05 +0100)
committerKalle Valo <kvalo@codeaurora.org>
Fri, 8 Jan 2016 08:44:48 +0000 (10:44 +0200)
Sometimes on module reload and reconnect to ibss a deauth from
other station can be received. This is treated as a link down but
for ibss this is wrong. It will close the interface and no data
is possible. Ignore the firmware generated link down events in
ibss mode, as ibss is always teared down by cfg80211.

Reviewed-by: Arend Van Spriel <arend@broadcom.com>
Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
Signed-off-by: Hante Meuleman <meuleman@broadcom.com>
Signed-off-by: Arend van Spriel <arend@broadcom.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c

index 84788ea..7b01e4d 100644 (file)
@@ -1454,6 +1454,7 @@ brcmf_cfg80211_leave_ibss(struct wiphy *wiphy, struct net_device *ndev)
        }
 
        brcmf_link_down(ifp->vif, WLAN_REASON_DEAUTH_LEAVING);
+       brcmf_net_setcarrier(ifp, false);
 
        brcmf_dbg(TRACE, "Exit\n");
 
@@ -5248,12 +5249,13 @@ brcmf_notify_connect_status(struct brcmf_if *ifp,
                brcmf_dbg(CONN, "Linkdown\n");
                if (!brcmf_is_ibssmode(ifp->vif)) {
                        brcmf_bss_connect_done(cfg, ndev, e, false);
+                       brcmf_link_down(ifp->vif,
+                                       brcmf_map_fw_linkdown_reason(e));
+                       brcmf_init_prof(ndev_to_prof(ndev));
+                       if (ndev != cfg_to_ndev(cfg))
+                               complete(&cfg->vif_disabled);
+                       brcmf_net_setcarrier(ifp, false);
                }
-               brcmf_link_down(ifp->vif, brcmf_map_fw_linkdown_reason(e));
-               brcmf_init_prof(ndev_to_prof(ndev));
-               if (ndev != cfg_to_ndev(cfg))
-                       complete(&cfg->vif_disabled);
-               brcmf_net_setcarrier(ifp, false);
        } else if (brcmf_is_nonetwork(cfg, e)) {
                if (brcmf_is_ibssmode(ifp->vif))
                        clear_bit(BRCMF_VIF_STATUS_CONNECTING,