]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
brcmfmac: revise handling events in receive path
authorArend van Spriel <arend@broadcom.com>
Mon, 11 Apr 2016 09:35:27 +0000 (11:35 +0200)
committerBen Hutchings <ben@decadent.org.uk>
Thu, 2 May 2019 20:42:06 +0000 (21:42 +0100)
commit 9c349892ccc90c6de2baaa69cc78449f58082273 upstream.

Move event handling out of brcmf_netif_rx() avoiding the need
to pass a flag. This flag is only ever true for USB hosts as
other interface use separate brcmf_rx_event() function.

Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com>
Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com>
Reviewed-by: Franky Lin <franky.lin@broadcom.com>
Signed-off-by: Arend van Spriel <arend@broadcom.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
[bwh: Backported to 3.16 as dependency of commit a4176ec356c7
 "brcmfmac: add subtype check for event handling in data path"
 - Drop changes to PCIe bus support
 - Adjust filenames]
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
drivers/net/wireless/brcm80211/brcmfmac/dhd_bus.h
drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c

index f9f1d3a259d04a9c8a2a9827472a6f6942747970..1436ae2249d3b5bd6d4a58bcc846604541c8cc2d 100644 (file)
@@ -168,7 +168,7 @@ bool brcmf_c_prec_enq(struct device *dev, struct pktq *q, struct sk_buff *pkt,
                      int prec);
 
 /* Receive frame for delivery to OS.  Callee disposes of rxp. */
-void brcmf_rx_frame(struct device *dev, struct sk_buff *rxp, bool handle_evnt);
+void brcmf_rx_frame(struct device *dev, struct sk_buff *rxp, bool handle_event);
 /* Receive async event packet from firmware. Callee disposes of rxp. */
 void brcmf_rx_event(struct device *dev, struct sk_buff *rxp);
 
index 6f1d83d1d69e9316fe9504974eaa1cd4eb7ee7a1..8babf7788d59ac099d685e426effd0ed52956094 100644 (file)
@@ -306,18 +306,11 @@ void brcmf_txflowblock(struct device *dev, bool state)
        brcmf_fws_bus_blocked(drvr, state);
 }
 
-static void brcmf_netif_rx(struct brcmf_if *ifp, struct sk_buff *skb,
-                           bool handle_event)
+static void brcmf_netif_rx(struct brcmf_if *ifp, struct sk_buff *skb)
 {
-       skb->protocol = eth_type_trans(skb, ifp->ndev);
-
        if (skb->pkt_type == PACKET_MULTICAST)
                ifp->stats.multicast++;
 
-       /* Process special event packets */
-       if (handle_event)
-               brcmf_fweh_process_skb(ifp->drvr, skb);
-
        if (!(ifp->ndev->flags & IFF_UP)) {
                brcmu_pkt_buf_free_skb(skb);
                return;
@@ -377,7 +370,7 @@ static void brcmf_rxreorder_process_info(struct brcmf_if *ifp, u8 *reorder_data,
        /* validate flags and flow id */
        if (flags == 0xFF) {
                brcmf_err("invalid flags...so ignore this packet\n");
-               brcmf_netif_rx(ifp, pkt, false);
+               brcmf_netif_rx(ifp, pkt);
                return;
        }
 
@@ -389,7 +382,7 @@ static void brcmf_rxreorder_process_info(struct brcmf_if *ifp, u8 *reorder_data,
                if (rfi == NULL) {
                        brcmf_dbg(INFO, "received flags to cleanup, but no flow (%d) yet\n",
                                  flow_id);
-                       brcmf_netif_rx(ifp, pkt, false);
+                       brcmf_netif_rx(ifp, pkt);
                        return;
                }
 
@@ -414,7 +407,7 @@ static void brcmf_rxreorder_process_info(struct brcmf_if *ifp, u8 *reorder_data,
                rfi = kzalloc(buf_size, GFP_ATOMIC);
                if (rfi == NULL) {
                        brcmf_err("failed to alloc buffer\n");
-                       brcmf_netif_rx(ifp, pkt, false);
+                       brcmf_netif_rx(ifp, pkt);
                        return;
                }
 
@@ -528,11 +521,11 @@ static void brcmf_rxreorder_process_info(struct brcmf_if *ifp, u8 *reorder_data,
 netif_rx:
        skb_queue_walk_safe(&reorder_list, pkt, pnext) {
                __skb_unlink(pkt, &reorder_list);
-               brcmf_netif_rx(ifp, pkt, false);
+               brcmf_netif_rx(ifp, pkt);
        }
 }
 
-void brcmf_rx_frame(struct device *dev, struct sk_buff *skb, bool handle_evnt)
+void brcmf_rx_frame(struct device *dev, struct sk_buff *skb, bool handle_event)
 {
        struct brcmf_if *ifp;
        struct brcmf_bus *bus_if = dev_get_drvdata(dev);
@@ -552,11 +545,18 @@ void brcmf_rx_frame(struct device *dev, struct sk_buff *skb, bool handle_evnt)
                return;
        }
 
+       skb->protocol = eth_type_trans(skb, ifp->ndev);
+
        rd = (struct brcmf_skb_reorder_data *)skb->cb;
-       if (rd->reorder)
+       if (rd->reorder) {
                brcmf_rxreorder_process_info(ifp, rd->reorder, skb);
-       else
-               brcmf_netif_rx(ifp, skb, handle_evnt);
+       } else {
+               /* Process special event packets */
+               if (handle_event)
+                       brcmf_fweh_process_skb(ifp->drvr, skb);
+
+               brcmf_netif_rx(ifp, skb);
+       }
 }
 
 void brcmf_rx_event(struct device *dev, struct sk_buff *skb)