]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
brcmfmac: proto: add callback for queuing TX data
authorRafał Miłecki <rafal@milecki.pl>
Mon, 26 Sep 2016 21:51:44 +0000 (23:51 +0200)
committerKalle Valo <kvalo@codeaurora.org>
Wed, 9 Nov 2016 01:30:32 +0000 (03:30 +0200)
So far our core code was calling brcmf_fws_process_skb which wasn't
a proper thing to do. If case of devices using msgbuf protocol fwsignal
shouldn't be used. It was an unnecessary extra layer simply calling
a protocol specifix txdata function.

Please note we already have txdata callback, but it's used for calls
between bcdc and fwsignal so it couldn't be simply used there.

This makes core code more generic (instead of bcdc/fwsignal specific).

Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.c
drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.h
drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c
drivers/net/wireless/broadcom/brcm80211/brcmfmac/proto.c
drivers/net/wireless/broadcom/brcm80211/brcmfmac/proto.h

index 038a960c5104fe19dd66838e0a555d29d5f795d0..384b1873e7e38dfbeac989ce7f46138548f8d750 100644 (file)
@@ -326,6 +326,17 @@ brcmf_proto_bcdc_hdrpull(struct brcmf_pub *drvr, bool do_fws,
        return 0;
 }
 
+static int brcmf_proto_bcdc_tx_queue_data(struct brcmf_pub *drvr, int ifidx,
+                                         struct sk_buff *skb)
+{
+       struct brcmf_if *ifp = brcmf_get_ifp(drvr, ifidx);
+
+       if (!brcmf_fws_queue_skbs(drvr->fws))
+               return brcmf_proto_txdata(drvr, ifidx, 0, skb);
+
+       return brcmf_fws_process_skb(ifp, skb);
+}
+
 static int
 brcmf_proto_bcdc_txdata(struct brcmf_pub *drvr, int ifidx, u8 offset,
                        struct sk_buff *pktbuf)
@@ -375,6 +386,7 @@ int brcmf_proto_bcdc_attach(struct brcmf_pub *drvr)
        drvr->proto->hdrpull = brcmf_proto_bcdc_hdrpull;
        drvr->proto->query_dcmd = brcmf_proto_bcdc_query_dcmd;
        drvr->proto->set_dcmd = brcmf_proto_bcdc_set_dcmd;
+       drvr->proto->tx_queue_data = brcmf_proto_bcdc_tx_queue_data;
        drvr->proto->txdata = brcmf_proto_bcdc_txdata;
        drvr->proto->configure_addr_mode = brcmf_proto_bcdc_configure_addr_mode;
        drvr->proto->delete_peer = brcmf_proto_bcdc_delete_peer;
index 5eaac13e231723b903a7c11e373018ee6669b30a..9e6f60a0ec3eac7adac493b9fb337ffae62b6b9f 100644 (file)
@@ -239,7 +239,13 @@ static netdev_tx_t brcmf_netdev_start_xmit(struct sk_buff *skb,
        if (eh->h_proto == htons(ETH_P_PAE))
                atomic_inc(&ifp->pend_8021x_cnt);
 
-       ret = brcmf_fws_process_skb(ifp, skb);
+       /* determine the priority */
+       if ((skb->priority == 0) || (skb->priority > 7))
+               skb->priority = cfg80211_classify8021d(skb, NULL);
+
+       ret = brcmf_proto_tx_queue_data(drvr, ifp->ifidx, skb);
+       if (ret < 0)
+               brcmf_txfinalize(ifp, skb, false);
 
 done:
        if (ret) {
index a190f535efc9f91df881c350d0f7c4b66682ca93..5f1a5929cb307e8c8e9353e264b1c313210cdd88 100644 (file)
@@ -2100,16 +2100,6 @@ int brcmf_fws_process_skb(struct brcmf_if *ifp, struct sk_buff *skb)
        int rc = 0;
 
        brcmf_dbg(DATA, "tx proto=0x%X\n", ntohs(eh->h_proto));
-       /* determine the priority */
-       if ((skb->priority == 0) || (skb->priority > 7))
-               skb->priority = cfg80211_classify8021d(skb, NULL);
-
-       if (fws->avoid_queueing) {
-               rc = brcmf_proto_txdata(drvr, ifp->ifidx, 0, skb);
-               if (rc < 0)
-                       brcmf_txfinalize(ifp, skb, false);
-               return rc;
-       }
 
        /* set control buffer information */
        skcb->if_flags = 0;
@@ -2442,6 +2432,11 @@ void brcmf_fws_deinit(struct brcmf_pub *drvr)
        kfree(fws);
 }
 
+bool brcmf_fws_queue_skbs(struct brcmf_fws_info *fws)
+{
+       return !fws->avoid_queueing;
+}
+
 bool brcmf_fws_fc_active(struct brcmf_fws_info *fws)
 {
        if (!fws->creditmap_received)
index ef0ad8597c8a08796092a3567b9c61d6cb7d3f05..96df66073b2a182d050dd777893ded4b4da13473 100644 (file)
@@ -20,6 +20,7 @@
 
 int brcmf_fws_init(struct brcmf_pub *drvr);
 void brcmf_fws_deinit(struct brcmf_pub *drvr);
+bool brcmf_fws_queue_skbs(struct brcmf_fws_info *fws);
 bool brcmf_fws_fc_active(struct brcmf_fws_info *fws);
 void brcmf_fws_hdrpull(struct brcmf_if *ifp, s16 siglen, struct sk_buff *skb);
 int brcmf_fws_process_skb(struct brcmf_if *ifp, struct sk_buff *skb);
index 2b9a2bc429d6fc23a49aecad27e36e14ac5408ce..7cc8851c071ea1388f5ab65c105eff2ec659403e 100644 (file)
@@ -782,8 +782,8 @@ static int brcmf_msgbuf_schedule_txdata(struct brcmf_msgbuf *msgbuf, u32 flowid,
 }
 
 
-static int brcmf_msgbuf_txdata(struct brcmf_pub *drvr, int ifidx,
-                              u8 offset, struct sk_buff *skb)
+static int brcmf_msgbuf_tx_queue_data(struct brcmf_pub *drvr, int ifidx,
+                                     struct sk_buff *skb)
 {
        struct brcmf_msgbuf *msgbuf = (struct brcmf_msgbuf *)drvr->proto->pd;
        struct brcmf_flowring *flow = msgbuf->flow;
@@ -1467,7 +1467,7 @@ int brcmf_proto_msgbuf_attach(struct brcmf_pub *drvr)
        drvr->proto->hdrpull = brcmf_msgbuf_hdrpull;
        drvr->proto->query_dcmd = brcmf_msgbuf_query_dcmd;
        drvr->proto->set_dcmd = brcmf_msgbuf_set_dcmd;
-       drvr->proto->txdata = brcmf_msgbuf_txdata;
+       drvr->proto->tx_queue_data = brcmf_msgbuf_tx_queue_data;
        drvr->proto->configure_addr_mode = brcmf_msgbuf_configure_addr_mode;
        drvr->proto->delete_peer = brcmf_msgbuf_delete_peer;
        drvr->proto->add_tdls_peer = brcmf_msgbuf_add_tdls_peer;
index 26b68c367f57ccc33f9afda71310d10fd61455e0..d26ff219ef66fc84ab9663d0167079d85cd99da3 100644 (file)
@@ -51,7 +51,7 @@ int brcmf_proto_attach(struct brcmf_pub *drvr)
                          drvr->bus_if->proto_type);
                goto fail;
        }
-       if ((proto->txdata == NULL) || (proto->hdrpull == NULL) ||
+       if (!proto->tx_queue_data || (proto->hdrpull == NULL) ||
            (proto->query_dcmd == NULL) || (proto->set_dcmd == NULL) ||
            (proto->configure_addr_mode == NULL) ||
            (proto->delete_peer == NULL) || (proto->add_tdls_peer == NULL)) {
index 57531f42190ef21715f980abf862b084fbb2ee22..34b59feedeba86b592dfb08c0d737b340b57c798 100644 (file)
@@ -33,6 +33,8 @@ struct brcmf_proto {
                          void *buf, uint len);
        int (*set_dcmd)(struct brcmf_pub *drvr, int ifidx, uint cmd, void *buf,
                        uint len);
+       int (*tx_queue_data)(struct brcmf_pub *drvr, int ifidx,
+                            struct sk_buff *skb);
        int (*txdata)(struct brcmf_pub *drvr, int ifidx, u8 offset,
                      struct sk_buff *skb);
        void (*configure_addr_mode)(struct brcmf_pub *drvr, int ifidx,
@@ -74,6 +76,13 @@ static inline int brcmf_proto_set_dcmd(struct brcmf_pub *drvr, int ifidx,
 {
        return drvr->proto->set_dcmd(drvr, ifidx, cmd, buf, len);
 }
+
+static inline int brcmf_proto_tx_queue_data(struct brcmf_pub *drvr, int ifidx,
+                                           struct sk_buff *skb)
+{
+       return drvr->proto->tx_queue_data(drvr, ifidx, skb);
+}
+
 static inline int brcmf_proto_txdata(struct brcmf_pub *drvr, int ifidx,
                                     u8 offset, struct sk_buff *skb)
 {