diff mbox

[7/8] brcmfmac: revise handling events in receive path

Message ID 1460367328-12082-8-git-send-email-arend@broadcom.com (mailing list archive)
State Accepted
Delegated to: Kalle Valo
Headers show

Commit Message

Arend van Spriel April 11, 2016, 9:35 a.m. UTC
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>
---
 .../net/wireless/broadcom/brcm80211/brcmfmac/bus.h |  2 +-
 .../wireless/broadcom/brcm80211/brcmfmac/core.c    | 24 +++++++++++-----------
 .../wireless/broadcom/brcm80211/brcmfmac/core.h    |  3 +--
 .../broadcom/brcm80211/brcmfmac/fwsignal.c         |  8 ++++----
 .../wireless/broadcom/brcm80211/brcmfmac/msgbuf.c  |  2 +-
 5 files changed, 19 insertions(+), 20 deletions(-)

Comments

Rafał Miłecki April 25, 2016, 10 a.m. UTC | #1
On 11 April 2016 at 11:35, Arend van Spriel <arend@broadcom.com> wrote:
> 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>

With this patch applied I'm getting:
Unable to handle kernel NULL pointer dereference at virtual address 000001fc
on the first brcmf_netif_rx call.

I'm using D-Link DIR-885L with 14e4:4365 (BCM4366).
[   44.086579] Unable to handle kernel NULL pointer dereference at virtual address 000001fc
[   44.094706] pgd = c0004000
[   44.097415] [000001fc] *pgd=00000000
[   44.101019] Internal error: Oops: 17 [#1] SMP ARM
[   44.105726] Modules linked in: pppoe ppp_async iptable_nat brcmfmac b43 pppox ppp_generic nf_nat_ipv4 nf_conntrack_ipv6 nf_conntrack_ipv4 mac80211 ipt_REJECT ipt_MASQUERADE cfg80211 xt_time xt_tcpudp xt_state xt_nat xt_multiport xt_mark xt_mac xt_limit xt_id xt_conntn
[   44.168765] CPU: 0 PID: 632 Comm: irq/32-brcmf_pc Not tainted 4.4.7 #6
[   44.175305] Hardware name: BCM5301X
[   44.178799] task: c7a16400 ti: c73de000 task.ti: c73de000
[   44.184215] PC is at get_rps_cpu+0x24/0x330
[   44.188410] LR is at netif_rx_internal+0x8c/0xbc
[   44.193038] pc : [<c0251284>]    lr : [<c0253ff8>]    psr: 60000013
[   44.193038] sp : c73dfdc8  ip : c73dfe18  fp : c73dfe14
[   44.204543] r10: 00000000  r9 : c8ce5000  r8 : c8ce5000
[   44.209774] r7 : c7a08e80  r6 : 00000000  r5 : c047c848  r4 : c797a3c0
[   44.216311] r3 : 00000000  r2 : c73dfe24  r1 : c797a3c0  r0 : 00000000
[   44.222849] Flags: nZCv  IRQs on  FIQs on  Mode SVC_32  ISA ARM  Segment none
[   44.229995] Control: 10c5387d  Table: 073d004a  DAC: 00000051
[   44.235748] Process irq/32-brcmf_pc (pid: 632, stack limit = 0xc73de190)
[   44.242459] Stack: (0xc73dfdc8 to 0xc73e0000)
[   44.246821] fdc0:                   c6ec8320 00000000 c73dfe14 c73dfe24 c0019c3c c009c93c
[   44.255012] fde0: c047ecc4 c04bd550 c7a08e00 c797a3c0 c047c848 c797a3c0 c7a08e80 c8ce5000
[   44.263211] fe00: c8ce5000 00000000 c73dfe44 c73dfe18 c0253ff8 c025126c c000acf4 c73dfe3c
[   44.271401] fe20: c001a760 c73dfe28 c71d8410 c71d8000 c797a3c0 00000000 c73dfe5c c73dfe48
[   44.279592] fe40: c0254074 c0253f78 c797a3c0 00000000 c73dfe74 c73dfe60 bf21f40c c0254070
[   44.287791] fe60: c712a9c0 00000000 c73dfebc c73dfe78 bf224ea4 bf21f36c c7a16400 c6dd1840
[   44.295981] fe80: 00000000 00000014 c0477840 00019e7c c73dfebc c712a9c0 00010000 c787e3c0
[   44.304172] fea0: c0057bb0 c719c1e4 c047f842 00000000 c73dfedc c73dfec0 bf224f8c bf224a38
[   44.312372] fec0: c7ad7000 00010000 c787e3c0 c0057bb0 c73dff04 c73dfee0 bf229608 bf224f6c
[   44.320570] fee0: c719c1c0 c719c1c0 c787e3c0 c0057bb0 c719c1e4 c047f842 c73dff24 c73dff08
[   44.328761] ff00: c0057bd4 bf229450 c787e3c0 c719c1c0 c73de000 c0057bb0 c73dff5c c73dff28
[   44.336951] ff20: c0057eb8 c0057bbc 00000000 c0057d0c 00000000 c7244d80 00000000 c719c1c0
[   44.345141] ff40: c0057dc0 00000000 00000000 00000000 c73dffac c73dff60 c00393a4 c0057dcc
[   44.353332] ff60: c73dff8c 00000000 c00228cc c719c1c0 00000000 00000000 c73dff78 c73dff78
[   44.361522] ff80: 00000000 00000000 c73dff88 c73dff88 c7244d80 c00392c4 00000000 00000000
[   44.369712] ffa0: 00000000 c73dffb0 c00097b8 c00392d0 00000000 00000000 00000000 00000000
[   44.377903] ffc0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
[   44.386094] ffe0: 00000000 00000000 00000000 00000000 00000013 00000000 c73dfff4 00000000
[   44.394281] Backtrace: 
[   44.396743] [<c0251260>] (get_rps_cpu) from [<c0253ff8>] (netif_rx_internal+0x8c/0xbc)
[   44.404674]  r10:00000000 r9:c8ce5000 r8:c8ce5000 r7:c7a08e80 r6:c797a3c0 r5:c047c848
[   44.412559]  r4:c797a3c0
[   44.415106] [<c0253f6c>] (netif_rx_internal) from [<c0254074>] (netif_rx_ni+0x10/0x44)
[   44.423039]  r5:00000000 r4:c797a3c0
[   44.426665] [<c0254064>] (netif_rx_ni) from [<bf21f40c>] (brcmf_netif_rx+0xac/0xbc [brcmfmac])
[   44.435294]  r5:00000000 r4:c797a3c0
[   44.438909] [<bf21f360>] (brcmf_netif_rx [brcmfmac]) from [<bf224ea4>] (brcmf_msgbuf_txdata+0x5c0/0x67c [brcmfmac])
[   44.449360]  r5:00000000 r4:c712a9c0
[   44.452973] [<bf224a2c>] (brcmf_msgbuf_txdata [brcmfmac]) from [<bf224f8c>] (brcmf_proto_msgbuf_rx_trigger+0x2c/0xd0 [brcmfmac])
[   44.464557]  r10:00000000 r9:c047f842 r8:c719c1e4 r7:c0057bb0 r6:c787e3c0 r5:00010000
[   44.472443]  r4:c712a9c0
[   44.475002] [<bf224f60>] (brcmf_proto_msgbuf_rx_trigger [brcmfmac]) from [<bf229608>] (brcmf_pcie_isr_thread+0x1c4/0x238 [brcmfmac])
[   44.486935]  r7:c0057bb0 r6:c787e3c0 r5:00010000 r4:c7ad7000
[   44.492648] [<bf229444>] (brcmf_pcie_isr_thread [brcmfmac]) from [<c0057bd4>] (irq_thread_fn+0x24/0x3c)
[   44.502054]  r9:c047f842 r8:c719c1e4 r7:c0057bb0 r6:c787e3c0 r5:c719c1c0 r4:c719c1c0
[   44.509857] [<c0057bb0>] (irq_thread_fn) from [<c0057eb8>] (irq_thread+0xf8/0x1e4)
[   44.517442]  r7:c0057bb0 r6:c73de000 r5:c719c1c0 r4:c787e3c0
[   44.523150] [<c0057dc0>] (irq_thread) from [<c00393a4>] (kthread+0xe0/0xf4)
[   44.530124]  r10:00000000 r9:00000000 r8:00000000 r7:c0057dc0 r6:c719c1c0 r5:00000000
[   44.538010]  r4:c7244d80
[   44.540557] [<c00392c4>] (kthread) from [<c00097b8>] (ret_from_fork+0x14/0x3c)
[   44.547793]  r7:00000000 r6:00000000 r5:c00392c4 r4:c7244d80
[   44.553498] Code: e50b2040 e1a06000 e3530000 e1a04001 (e59021fc) 
[   44.559625] ---[ end trace fbc5940e895b0890 ]---
[   44.564276] Unable to handle kernel paging request at virtual address ffffffec
[   44.571526] pgd = c0004000
[   44.574237] [ffffffec] *pgd=07fff841, *pte=00000000, *ppte=00000000
[   44.580550] Internal error: Oops: 27 [#2] SMP ARM
[   44.585264] Modules linked in: pppoe ppp_async iptable_nat brcmfmac b43 pppox ppp_generic nf_nat_ipv4 nf_conntrack_ipv6 nf_conntrack_ipv4 mac80211 ipt_REJECT ipt_MASQUERADE cfg80211 xt_time xt_tcpudp xt_state xt_nat xt_multiport xt_mark xt_mac xt_limit xt_id xt_conntn
[   44.648302] CPU: 0 PID: 632 Comm: irq/32-brcmf_pc Tainted: G      D         4.4.7 #6
[   44.656062] Hardware name: BCM5301X
[   44.659554] task: c7a16400 ti: c73de000 task.ti: c73de000
[   44.664962] PC is at kthread_data+0x10/0x18
[   44.669155] LR is at irq_thread_dtor+0x58/0xb4
[   44.673603] pc : [<c0039844>]    lr : [<c0057d64>]    psr: 20000113
[   44.673603] sp : c73dfbd0  ip : c73dfbe0  fp : c73dfbdc
[   44.685109] r10: 00000000  r9 : c0480878  r8 : c73dfc18
[   44.690340] r7 : c7a16400  r6 : 00000000  r5 : c7a16400  r4 : c7a16400
[   44.696876] r3 : 00000000  r2 : 0000007c  r1 : 00000000  r0 : c7a16400
[   44.703414] Flags: nzCv  IRQs on  FIQs on  Mode SVC_32  ISA ARM  Segment none
[   44.710559] Control: 10c5387d  Table: 073d004a  DAC: 00000051
[   44.716313] Process irq/32-brcmf_pc (pid: 632, stack limit = 0xc73de190)
[   44.723023] Stack: (0xc73dfbd0 to 0xc73e0000)
[   44.727386] fbc0:                                     c73dfbf4 c73dfbe0 c0057d64 c0039840
[   44.735586] fbe0: c7a16400 c04940dc c73dfc14 c73dfbf8 c0037ca8 c0057d18 c7a16400 00000000
[   44.743785] fc00: c04935ec c7a16400 c73dfc34 c73dfc18 c002248c c0037c14 c73dfc34 c73dfc28
[   44.751985] fc20: c0021538 c7a16400 c73dfc74 c73dfc38 c00174a8 c002213c c73de190 0000000b
[   44.760183] fc40: c001ab84 60000113 c040ca10 000001fc c73dfd78 00000017 00000000 c7a16400
[   44.768383] fc60: 00000000 00000017 c73dfc8c c73dfc78 c001ad04 c001725c 00000017 000001fc
[   44.776582] fc80: c73dfccc c73dfc90 c001afa0 c001acb4 00000001 00000000 c73dfc94 00000003
[   44.784772] fca0: c73dfcd4 00000017 000001fc c0480d58 c73dfd78 c8ce5000 c8ce5000 00000000
[   44.792972] fcc0: c73dfd74 c73dfcd0 c00092ec c001ad30 c0088290 c0086198 00000141 c6dd1840
[   44.801170] fce0: c73dfd14 00000104 c047f780 c047ee04 fffffff8 00000000 00000008 ffffffff
[   44.809361] fd00: 40000093 00000001 c6edf580 00000000 00000000 00000000 c047f788 020b5220
[   44.817551] fd20: c73dfdac c047f780 00000003 02095220 c6acc000 c6acc000 00000001 a0000013
[   44.825751] fd40: c73dfdcc c73dfd50 00000740 80100008 c7a049c0 c7a049c0 c0251284 60000013
[   44.833949] fd60: ffffffff c73dfdac c73dfe14 c73dfd78 c000a000 c00092bc 00000000 c797a3c0
[   44.842140] fd80: c73dfe24 00000000 c797a3c0 c047c848 00000000 c7a08e80 c8ce5000 c8ce5000
[   44.850330] fda0: 00000000 c73dfe14 c73dfe18 c73dfdc8 c0253ff8 c0251284 60000013 ffffffff
[   44.858521] fdc0: 00000051 00000800 c6ec8320 00000000 c73dfe14 c73dfe24 c0019c3c c009c93c
[   44.866711] fde0: c047ecc4 c04bd550 c7a08e00 c797a3c0 c047c848 c797a3c0 c7a08e80 c8ce5000
[   44.874902] fe00: c8ce5000 00000000 c73dfe44 c73dfe18 c0253ff8 c025126c c000acf4 c73dfe3c
[   44.883102] fe20: c001a760 c73dfe28 c71d8410 c71d8000 c797a3c0 00000000 c73dfe5c c73dfe48
[   44.891300] fe40: c0254074 c0253f78 c797a3c0 00000000 c73dfe74 c73dfe60 bf21f40c c0254070
[   44.899491] fe60: c712a9c0 00000000 c73dfebc c73dfe78 bf224ea4 bf21f36c c7a16400 c6dd1840
[   44.907681] fe80: 00000000 00000014 c0477840 00019e7c c73dfebc c712a9c0 00010000 c787e3c0
[   44.915881] fea0: c0057bb0 c719c1e4 c047f842 00000000 c73dfedc c73dfec0 bf224f8c bf224a38
[   44.924079] fec0: c7ad7000 00010000 c787e3c0 c0057bb0 c73dff04 c73dfee0 bf229608 bf224f6c
[   44.932270] fee0: c719c1c0 c719c1c0 c787e3c0 c0057bb0 c719c1e4 c047f842 c73dff24 c73dff08
[   44.940470] ff00: c0057bd4 bf229450 c787e3c0 c719c1c0 c73de000 c0057bb0 c73dff5c c73dff28
[   44.948668] ff20: c0057eb8 c0057bbc 00000000 c0057d0c 00000000 c7244d80 00000000 c719c1c0
[   44.956858] ff40: c0057dc0 00000000 00000000 00000000 c73dffac c73dff60 c00393a4 c0057dcc
[   44.965049] ff60: c73dff8c 00000000 c00228cc c719c1c0 00000000 00000000 c73dff78 c73dff78
[   44.973240] ff80: 00000001 00010001 c73dff88 c73dff88 c7244d80 c00392c4 00000000 00000000
[   44.981438] ffa0: 00000000 c73dffb0 c00097b8 c00392d0 00000000 00000000 00000000 00000000
[   44.989629] ffc0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
[   44.997828] ffe0: 00000000 00000000 00000000 00000000 00000013 00000000 c73dfff4 00000000
[   45.006024] Backtrace: 
[   45.008483] [<c0039834>] (kthread_data) from [<c0057d64>] (irq_thread_dtor+0x58/0xb4)
[   45.016344] [<c0057d0c>] (irq_thread_dtor) from [<c0037ca8>] (task_work_run+0xa0/0xb4)
[   45.024277]  r5:c04940dc r4:c7a16400
[   45.027877] [<c0037c08>] (task_work_run) from [<c002248c>] (do_exit+0x35c/0x7cc)
[   45.035287]  r7:c7a16400 r6:c04935ec r5:00000000 r4:c7a16400
[   45.041003] [<c0022130>] (do_exit) from [<c00174a8>] (die+0x258/0x2dc)
[   45.047542]  r7:c7a16400
[   45.050093] [<c0017250>] (die) from [<c001ad04>] (__do_kernel_fault.part.0+0x5c/0x7c)
[   45.057935]  r10:00000017 r9:00000000 r8:c7a16400 r7:00000000 r6:00000017 r5:c73dfd78
[   45.065820]  r4:000001fc
[   45.068366] [<c001aca8>] (__do_kernel_fault.part.0) from [<c001afa0>] (do_page_fault+0x27c/0x294)
[   45.077257]  r7:000001fc r4:00000017
[   45.080856] [<c001ad24>] (do_page_fault) from [<c00092ec>] (do_DataAbort+0x3c/0xbc)
[   45.088529]  r10:00000000 r9:c8ce5000 r8:c8ce5000 r7:c73dfd78 r6:c0480d58 r5:000001fc
[   45.096415]  r4:00000017
[   45.098961] [<c00092b0>] (do_DataAbort) from [<c000a000>] (__dabt_svc+0x40/0x60)
[   45.106373] Exception stack(0xc73dfd78 to 0xc73dfdc0)
[   45.111431] fd60:                                                       00000000 c797a3c0
[   45.119624] fd80: c73dfe24 00000000 c797a3c0 c047c848 00000000 c7a08e80 c8ce5000 c8ce5000
[   45.127822] fda0: 00000000 c73dfe14 c73dfe18 c73dfdc8 c0253ff8 c0251284 60000013 ffffffff
[   45.136009]  r7:c73dfdac r6:ffffffff r5:60000013 r4:c0251284
[   45.141724] [<c0251260>] (get_rps_cpu) from [<c0253ff8>] (netif_rx_internal+0x8c/0xbc)
[   45.149658]  r10:00000000 r9:c8ce5000 r8:c8ce5000 r7:c7a08e80 r6:c797a3c0 r5:c047c848
[   45.157543]  r4:c797a3c0
[   45.160089] [<c0253f6c>] (netif_rx_internal) from [<c0254074>] (netif_rx_ni+0x10/0x44)
[   45.168023]  r5:00000000 r4:c797a3c0
[   45.171645] [<c0254064>] (netif_rx_ni) from [<bf21f40c>] (brcmf_netif_rx+0xac/0xbc [brcmfmac])
[   45.180270]  r5:00000000 r4:c797a3c0
[   45.183884] [<bf21f360>] (brcmf_netif_rx [brcmfmac]) from [<bf224ea4>] (brcmf_msgbuf_txdata+0x5c0/0x67c [brcmfmac])
[   45.194334]  r5:00000000 r4:c712a9c0
[   45.197947] [<bf224a2c>] (brcmf_msgbuf_txdata [brcmfmac]) from [<bf224f8c>] (brcmf_proto_msgbuf_rx_trigger+0x2c/0xd0 [brcmfmac])
[   45.209532]  r10:00000000 r9:c047f842 r8:c719c1e4 r7:c0057bb0 r6:c787e3c0 r5:00010000
[   45.217418]  r4:c712a9c0
[   45.219977] [<bf224f60>] (brcmf_proto_msgbuf_rx_trigger [brcmfmac]) from [<bf229608>] (brcmf_pcie_isr_thread+0x1c4/0x238 [brcmfmac])
[   45.231910]  r7:c0057bb0 r6:c787e3c0 r5:00010000 r4:c7ad7000
[   45.237622] [<bf229444>] (brcmf_pcie_isr_thread [brcmfmac]) from [<c0057bd4>] (irq_thread_fn+0x24/0x3c)
[   45.247028]  r9:c047f842 r8:c719c1e4 r7:c0057bb0 r6:c787e3c0 r5:c719c1c0 r4:c719c1c0
[   45.254831] [<c0057bb0>] (irq_thread_fn) from [<c0057eb8>] (irq_thread+0xf8/0x1e4)
[   45.262408]  r7:c0057bb0 r6:c73de000 r5:c719c1c0 r4:c787e3c0
[   45.268115] [<c0057dc0>] (irq_thread) from [<c00393a4>] (kthread+0xe0/0xf4)
[   45.275091]  r10:00000000 r9:00000000 r8:00000000 r7:c0057dc0 r6:c719c1c0 r5:00000000
[   45.282976]  r4:c7244d80
[   45.285522] [<c00392c4>] (kthread) from [<c00097b8>] (ret_from_fork+0x14/0x3c)
[   45.292760]  r7:00000000 r6:00000000 r5:c00392c4 r4:c7244d80
[   45.298464] Code: e1a0c00d e92dd800 e24cb004 e590325c (e5130014) 
[   45.304595] ---[ end trace fbc5940e895b0891 ]---
[   45.309242] Fixing recursive fault but reboot is needed!
Rafał Miłecki April 25, 2016, 10:40 a.m. UTC | #2
On 11 April 2016 at 11:35, Arend van Spriel <arend@broadcom.com> wrote:
> @@ -298,18 +298,11 @@ void brcmf_txflowblock(struct device *dev, bool state)
>         brcmf_fws_bus_blocked(drvr, state);
>  }
>
> -void brcmf_netif_rx(struct brcmf_if *ifp, struct sk_buff *skb,
> -                   bool handle_event)
> +void brcmf_netif_rx(struct brcmf_if *ifp, struct sk_buff *skb)
>  {
> -       skb->protocol = eth_type_trans(skb, ifp->ndev);

With this change every brcmf_netif_rx caller has to call
eth_type_trans on its own.


> @@ -348,10 +341,17 @@ void brcmf_rx_frame(struct device *dev, struct sk_buff *skb, bool handle_evnt)
>                 return;
>         }
>
> -       if (brcmf_proto_is_reorder_skb(skb))
> +       skb->protocol = eth_type_trans(skb, ifp->ndev);
> +
> +       if (brcmf_proto_is_reorder_skb(skb)) {
>                 brcmf_proto_rxreorder(ifp, 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);
> +       }
>  }

You added a call to eth_type_trans in brcmf_rx_frame which is used by
USB and SDIO. My guess it you wanted to avoid having duplicated
eth_type_trans call in brcmf_proto_rxreorder.
However you forgot about calling eth_type_trans from
brcmf_msgbuf_process_rx_complete (used by PCI). So to fix this
regression you'll need another call to eth_type_trans anyway.
--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
index 31856eb..2b24654 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
@@ -216,7 +216,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);
 
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
index a30841b..9b53555 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
@@ -298,18 +298,11 @@  void brcmf_txflowblock(struct device *dev, bool state)
 	brcmf_fws_bus_blocked(drvr, state);
 }
 
-void brcmf_netif_rx(struct brcmf_if *ifp, struct sk_buff *skb,
-		    bool handle_event)
+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;
@@ -329,7 +322,7 @@  void brcmf_netif_rx(struct brcmf_if *ifp, struct sk_buff *skb,
 		netif_rx_ni(skb);
 }
 
-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);
@@ -348,10 +341,17 @@  void brcmf_rx_frame(struct device *dev, struct sk_buff *skb, bool handle_evnt)
 		return;
 	}
 
-	if (brcmf_proto_is_reorder_skb(skb))
+	skb->protocol = eth_type_trans(skb, ifp->ndev);
+
+	if (brcmf_proto_is_reorder_skb(skb)) {
 		brcmf_proto_rxreorder(ifp, 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)
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h
index 394ae05..241ee8d 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h
@@ -221,8 +221,7 @@  int brcmf_get_next_free_bsscfgidx(struct brcmf_pub *drvr);
 void brcmf_txflowblock_if(struct brcmf_if *ifp,
 			  enum brcmf_netif_stop_reason reason, bool state);
 void brcmf_txfinalize(struct brcmf_if *ifp, struct sk_buff *txp, bool success);
-void brcmf_netif_rx(struct brcmf_if *ifp, struct sk_buff *skb,
-		    bool handle_event);
+void brcmf_netif_rx(struct brcmf_if *ifp, struct sk_buff *skb);
 void brcmf_net_setcarrier(struct brcmf_if *ifp, bool on);
 int __init brcmf_core_init(void);
 void __exit brcmf_core_exit(void);
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
index 8a07687..5b30922 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
@@ -1668,7 +1668,7 @@  void brcmf_fws_rxreorder(struct brcmf_if *ifp, struct sk_buff *pkt)
 	/* 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;
 	}
 
@@ -1680,7 +1680,7 @@  void brcmf_fws_rxreorder(struct brcmf_if *ifp, struct sk_buff *pkt)
 		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;
 		}
 
@@ -1705,7 +1705,7 @@  void brcmf_fws_rxreorder(struct brcmf_if *ifp, struct sk_buff *pkt)
 		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;
 		}
 
@@ -1819,7 +1819,7 @@  void brcmf_fws_rxreorder(struct brcmf_if *ifp, struct sk_buff *pkt)
 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);
 	}
 }
 
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c
index 8c064ab..68f1ce0 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c
@@ -1157,7 +1157,7 @@  brcmf_msgbuf_process_rx_complete(struct brcmf_msgbuf *msgbuf, void *buf)
 		brcmu_pkt_buf_free_skb(skb);
 		return;
 	}
-	brcmf_netif_rx(ifp, skb, false);
+	brcmf_netif_rx(ifp, skb);
 }