mac80211: brcmfmac: support dumping stations
[15.05/openwrt.git] / package / kernel / mac80211 / patches / 372-0011-brcmfmac-Properly-set-carrier-state-of-netdev.patch
1 From: Hante Meuleman <meuleman@broadcom.com>
2 Date: Thu, 8 Oct 2015 20:33:21 +0200
3 Subject: [PATCH] brcmfmac: Properly set carrier state of netdev.
4
5 Use the netif_carrier api to correctly set carrier state on the
6 different modes.
7
8 Reviewed-by: Arend Van Spriel <arend@broadcom.com>
9 Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
10 Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com>
11 Signed-off-by: Hante Meuleman <meuleman@broadcom.com>
12 Signed-off-by: Arend van Spriel <arend@broadcom.com>
13 Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
14 ---
15
16 --- a/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
17 +++ b/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
18 @@ -4250,6 +4250,7 @@ brcmf_cfg80211_start_ap(struct wiphy *wi
19                 brcmf_dbg(TRACE, "GO mode configuration complete\n");
20         }
21         set_bit(BRCMF_VIF_STATUS_AP_CREATED, &ifp->vif->sme_state);
22 +       brcmf_net_setcarrier(ifp, true);
23  
24  exit:
25         if ((err) && (!mbss)) {
26 @@ -4314,6 +4315,7 @@ static int brcmf_cfg80211_stop_ap(struct
27         brcmf_set_mpc(ifp, 1);
28         brcmf_configure_arp_offload(ifp, true);
29         clear_bit(BRCMF_VIF_STATUS_AP_CREATED, &ifp->vif->sme_state);
30 +       brcmf_net_setcarrier(ifp, false);
31  
32         return err;
33  }
34 @@ -5023,6 +5025,7 @@ brcmf_notify_connect_status(struct brcmf
35                                 &ifp->vif->sme_state);
36                 } else
37                         brcmf_bss_connect_done(cfg, ndev, e, true);
38 +               brcmf_net_setcarrier(ifp, true);
39         } else if (brcmf_is_linkdown(e)) {
40                 brcmf_dbg(CONN, "Linkdown\n");
41                 if (!brcmf_is_ibssmode(ifp->vif)) {
42 @@ -5032,6 +5035,7 @@ brcmf_notify_connect_status(struct brcmf
43                 brcmf_init_prof(ndev_to_prof(ndev));
44                 if (ndev != cfg_to_ndev(cfg))
45                         complete(&cfg->vif_disabled);
46 +               brcmf_net_setcarrier(ifp, false);
47         } else if (brcmf_is_nonetwork(cfg, e)) {
48                 if (brcmf_is_ibssmode(ifp->vif))
49                         clear_bit(BRCMF_VIF_STATUS_CONNECTING,
50 --- a/drivers/net/wireless/brcm80211/brcmfmac/core.c
51 +++ b/drivers/net/wireless/brcm80211/brcmfmac/core.c
52 @@ -635,8 +635,7 @@ static int brcmf_netdev_stop(struct net_
53  
54         brcmf_cfg80211_down(ndev);
55  
56 -       /* Set state and stop OS transmissions */
57 -       netif_stop_queue(ndev);
58 +       brcmf_net_setcarrier(ifp, false);
59  
60         return 0;
61  }
62 @@ -670,8 +669,8 @@ static int brcmf_netdev_open(struct net_
63                 return -EIO;
64         }
65  
66 -       /* Allow transmit calls */
67 -       netif_start_queue(ndev);
68 +       /* Clear, carrier, set when connected or AP mode. */
69 +       netif_carrier_off(ndev);
70         return 0;
71  }
72  
73 @@ -736,6 +735,24 @@ static void brcmf_net_detach(struct net_
74                 brcmf_cfg80211_free_netdev(ndev);
75  }
76  
77 +void brcmf_net_setcarrier(struct brcmf_if *ifp, bool on)
78 +{
79 +       struct net_device *ndev;
80 +
81 +       brcmf_dbg(TRACE, "Enter, idx=%d carrier=%d\n", ifp->bssidx, on);
82 +
83 +       ndev = ifp->ndev;
84 +       brcmf_txflowblock_if(ifp, BRCMF_NETIF_STOP_REASON_DISCONNECTED, !on);
85 +       if (on) {
86 +               if (!netif_carrier_ok(ndev))
87 +                       netif_carrier_on(ndev);
88 +
89 +       } else {
90 +               if (netif_carrier_ok(ndev))
91 +                       netif_carrier_off(ndev);
92 +       }
93 +}
94 +
95  static int brcmf_net_p2p_open(struct net_device *ndev)
96  {
97         brcmf_dbg(TRACE, "Enter\n");
98 --- a/drivers/net/wireless/brcm80211/brcmfmac/core.h
99 +++ b/drivers/net/wireless/brcm80211/brcmfmac/core.h
100 @@ -154,10 +154,13 @@ struct brcmf_fws_mac_descriptor;
101   *     netif stopped due to firmware signalling flow control.
102   * @BRCMF_NETIF_STOP_REASON_FLOW:
103   *     netif stopped due to flowring full.
104 + * @BRCMF_NETIF_STOP_REASON_DISCONNECTED:
105 + *     netif stopped due to not being connected (STA mode).
106   */
107  enum brcmf_netif_stop_reason {
108 -       BRCMF_NETIF_STOP_REASON_FWS_FC = 1,
109 -       BRCMF_NETIF_STOP_REASON_FLOW = 2
110 +       BRCMF_NETIF_STOP_REASON_FWS_FC = BIT(0),
111 +       BRCMF_NETIF_STOP_REASON_FLOW = BIT(1),
112 +       BRCMF_NETIF_STOP_REASON_DISCONNECTED = BIT(2)
113  };
114  
115  /**
116 @@ -213,5 +216,6 @@ void brcmf_txflowblock_if(struct brcmf_i
117                           enum brcmf_netif_stop_reason reason, bool state);
118  void brcmf_txfinalize(struct brcmf_if *ifp, struct sk_buff *txp, bool success);
119  void brcmf_netif_rx(struct brcmf_if *ifp, struct sk_buff *skb);
120 +void brcmf_net_setcarrier(struct brcmf_if *ifp, bool on);
121  
122  #endif /* BRCMFMAC_CORE_H */