kernel: add missing config symbols for 4.9
[librecmc/librecmc.git] / package / kernel / mac80211 / patches / 356-0002-brcmfmac-proto-add-callback-for-queuing-TX-data.patch
1 From b073ac1fcf42376018f6db6acc885dfd2cc9ff02 Mon Sep 17 00:00:00 2001
2 From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
3 Date: Mon, 26 Sep 2016 23:51:44 +0200
4 Subject: [PATCH] brcmfmac: proto: add callback for queuing TX data
5 MIME-Version: 1.0
6 Content-Type: text/plain; charset=UTF-8
7 Content-Transfer-Encoding: 8bit
8
9 So far our core code was calling brcmf_fws_process_skb which wasn't
10 a proper thing to do. If case of devices using msgbuf protocol fwsignal
11 shouldn't be used. It was an unnecessary extra layer simply calling
12 a protocol specifix txdata function.
13
14 Please note we already have txdata callback, but it's used for calls
15 between bcdc and fwsignal so it couldn't be simply used there.
16
17 This makes core code more generic (instead of bcdc/fwsignal specific).
18
19 Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
20 Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
21 ---
22  drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.c   | 12 ++++++++++++
23  drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c   |  8 +++++++-
24  .../net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c   | 15 +++++----------
25  .../net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.h   |  1 +
26  drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c |  6 +++---
27  drivers/net/wireless/broadcom/brcm80211/brcmfmac/proto.c  |  2 +-
28  drivers/net/wireless/broadcom/brcm80211/brcmfmac/proto.h  |  9 +++++++++
29  7 files changed, 38 insertions(+), 15 deletions(-)
30
31 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.c
32 +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.c
33 @@ -326,6 +326,17 @@ brcmf_proto_bcdc_hdrpull(struct brcmf_pu
34         return 0;
35  }
36  
37 +static int brcmf_proto_bcdc_tx_queue_data(struct brcmf_pub *drvr, int ifidx,
38 +                                         struct sk_buff *skb)
39 +{
40 +       struct brcmf_if *ifp = brcmf_get_ifp(drvr, ifidx);
41 +
42 +       if (!brcmf_fws_queue_skbs(drvr->fws))
43 +               return brcmf_proto_txdata(drvr, ifidx, 0, skb);
44 +
45 +       return brcmf_fws_process_skb(ifp, skb);
46 +}
47 +
48  static int
49  brcmf_proto_bcdc_txdata(struct brcmf_pub *drvr, int ifidx, u8 offset,
50                         struct sk_buff *pktbuf)
51 @@ -375,6 +386,7 @@ int brcmf_proto_bcdc_attach(struct brcmf
52         drvr->proto->hdrpull = brcmf_proto_bcdc_hdrpull;
53         drvr->proto->query_dcmd = brcmf_proto_bcdc_query_dcmd;
54         drvr->proto->set_dcmd = brcmf_proto_bcdc_set_dcmd;
55 +       drvr->proto->tx_queue_data = brcmf_proto_bcdc_tx_queue_data;
56         drvr->proto->txdata = brcmf_proto_bcdc_txdata;
57         drvr->proto->configure_addr_mode = brcmf_proto_bcdc_configure_addr_mode;
58         drvr->proto->delete_peer = brcmf_proto_bcdc_delete_peer;
59 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
60 +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
61 @@ -239,7 +239,13 @@ static netdev_tx_t brcmf_netdev_start_xm
62         if (eh->h_proto == htons(ETH_P_PAE))
63                 atomic_inc(&ifp->pend_8021x_cnt);
64  
65 -       ret = brcmf_fws_process_skb(ifp, skb);
66 +       /* determine the priority */
67 +       if ((skb->priority == 0) || (skb->priority > 7))
68 +               skb->priority = cfg80211_classify8021d(skb, NULL);
69 +
70 +       ret = brcmf_proto_tx_queue_data(drvr, ifp->ifidx, skb);
71 +       if (ret < 0)
72 +               brcmf_txfinalize(ifp, skb, false);
73  
74  done:
75         if (ret) {
76 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
77 +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
78 @@ -2100,16 +2100,6 @@ int brcmf_fws_process_skb(struct brcmf_i
79         int rc = 0;
80  
81         brcmf_dbg(DATA, "tx proto=0x%X\n", ntohs(eh->h_proto));
82 -       /* determine the priority */
83 -       if ((skb->priority == 0) || (skb->priority > 7))
84 -               skb->priority = cfg80211_classify8021d(skb, NULL);
85 -
86 -       if (fws->avoid_queueing) {
87 -               rc = brcmf_proto_txdata(drvr, ifp->ifidx, 0, skb);
88 -               if (rc < 0)
89 -                       brcmf_txfinalize(ifp, skb, false);
90 -               return rc;
91 -       }
92  
93         /* set control buffer information */
94         skcb->if_flags = 0;
95 @@ -2442,6 +2432,11 @@ void brcmf_fws_deinit(struct brcmf_pub *
96         kfree(fws);
97  }
98  
99 +bool brcmf_fws_queue_skbs(struct brcmf_fws_info *fws)
100 +{
101 +       return !fws->avoid_queueing;
102 +}
103 +
104  bool brcmf_fws_fc_active(struct brcmf_fws_info *fws)
105  {
106         if (!fws->creditmap_received)
107 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.h
108 +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.h
109 @@ -20,6 +20,7 @@
110  
111  int brcmf_fws_init(struct brcmf_pub *drvr);
112  void brcmf_fws_deinit(struct brcmf_pub *drvr);
113 +bool brcmf_fws_queue_skbs(struct brcmf_fws_info *fws);
114  bool brcmf_fws_fc_active(struct brcmf_fws_info *fws);
115  void brcmf_fws_hdrpull(struct brcmf_if *ifp, s16 siglen, struct sk_buff *skb);
116  int brcmf_fws_process_skb(struct brcmf_if *ifp, struct sk_buff *skb);
117 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c
118 +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c
119 @@ -782,8 +782,8 @@ static int brcmf_msgbuf_schedule_txdata(
120  }
121  
122  
123 -static int brcmf_msgbuf_txdata(struct brcmf_pub *drvr, int ifidx,
124 -                              u8 offset, struct sk_buff *skb)
125 +static int brcmf_msgbuf_tx_queue_data(struct brcmf_pub *drvr, int ifidx,
126 +                                     struct sk_buff *skb)
127  {
128         struct brcmf_msgbuf *msgbuf = (struct brcmf_msgbuf *)drvr->proto->pd;
129         struct brcmf_flowring *flow = msgbuf->flow;
130 @@ -1467,7 +1467,7 @@ int brcmf_proto_msgbuf_attach(struct brc
131         drvr->proto->hdrpull = brcmf_msgbuf_hdrpull;
132         drvr->proto->query_dcmd = brcmf_msgbuf_query_dcmd;
133         drvr->proto->set_dcmd = brcmf_msgbuf_set_dcmd;
134 -       drvr->proto->txdata = brcmf_msgbuf_txdata;
135 +       drvr->proto->tx_queue_data = brcmf_msgbuf_tx_queue_data;
136         drvr->proto->configure_addr_mode = brcmf_msgbuf_configure_addr_mode;
137         drvr->proto->delete_peer = brcmf_msgbuf_delete_peer;
138         drvr->proto->add_tdls_peer = brcmf_msgbuf_add_tdls_peer;
139 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/proto.c
140 +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/proto.c
141 @@ -51,7 +51,7 @@ int brcmf_proto_attach(struct brcmf_pub
142                           drvr->bus_if->proto_type);
143                 goto fail;
144         }
145 -       if ((proto->txdata == NULL) || (proto->hdrpull == NULL) ||
146 +       if (!proto->tx_queue_data || (proto->hdrpull == NULL) ||
147             (proto->query_dcmd == NULL) || (proto->set_dcmd == NULL) ||
148             (proto->configure_addr_mode == NULL) ||
149             (proto->delete_peer == NULL) || (proto->add_tdls_peer == NULL)) {
150 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/proto.h
151 +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/proto.h
152 @@ -33,6 +33,8 @@ struct brcmf_proto {
153                           void *buf, uint len);
154         int (*set_dcmd)(struct brcmf_pub *drvr, int ifidx, uint cmd, void *buf,
155                         uint len);
156 +       int (*tx_queue_data)(struct brcmf_pub *drvr, int ifidx,
157 +                            struct sk_buff *skb);
158         int (*txdata)(struct brcmf_pub *drvr, int ifidx, u8 offset,
159                       struct sk_buff *skb);
160         void (*configure_addr_mode)(struct brcmf_pub *drvr, int ifidx,
161 @@ -74,6 +76,13 @@ static inline int brcmf_proto_set_dcmd(s
162  {
163         return drvr->proto->set_dcmd(drvr, ifidx, cmd, buf, len);
164  }
165 +
166 +static inline int brcmf_proto_tx_queue_data(struct brcmf_pub *drvr, int ifidx,
167 +                                           struct sk_buff *skb)
168 +{
169 +       return drvr->proto->tx_queue_data(drvr, ifidx, skb);
170 +}
171 +
172  static inline int brcmf_proto_txdata(struct brcmf_pub *drvr, int ifidx,
173                                      u8 offset, struct sk_buff *skb)
174  {