Message ID | 20160927121104.5771-1-zajec5@gmail.com (mailing list archive) |
---|---|
State | Accepted |
Commit | 7f00ee2bbc630900ba16fc2690473f3e2db0e264 |
Delegated to: | Kalle Valo |
Headers | show |
Rafał Miłecki wrote: > From: Rafał Miłecki <rafal@milecki.pl> > > Flowrings contain skbs waiting for transmission that were passed to us > by netif. It means we checked every one of them looking for 802.1x > Ethernet type. When deleting flowring we have to use freeing function > that will check for 802.1x type as well. > > Freeing skbs without a proper check was leading to counter not being > properly decreased. This was triggering a WARNING every time > brcmf_netdev_wait_pend8021x was called. > > Signed-off-by: Rafał Miłecki <rafal@milecki.pl> > Acked-by: Arend van Spriel <arend@broadcom.com> > Cc: stable@vger.kernel.org # 4.5+ Patch applied to wireless-drivers-next.git, thanks. 7f00ee2bbc63 brcmfmac: use correct skb freeing helper when deleting flowring
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/flowring.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/flowring.c index b16b367..d0b738d 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/flowring.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/flowring.c @@ -234,13 +234,20 @@ static void brcmf_flowring_block(struct brcmf_flowring *flow, u16 flowid, void brcmf_flowring_delete(struct brcmf_flowring *flow, u16 flowid) { + struct brcmf_bus *bus_if = dev_get_drvdata(flow->dev); struct brcmf_flowring_ring *ring; + struct brcmf_if *ifp; u16 hash_idx; + u8 ifidx; struct sk_buff *skb; ring = flow->rings[flowid]; if (!ring) return; + + ifidx = brcmf_flowring_ifidx_get(flow, flowid); + ifp = brcmf_get_ifp(bus_if->drvr, ifidx); + brcmf_flowring_block(flow, flowid, false); hash_idx = ring->hash_id; flow->hash[hash_idx].ifidx = BRCMF_FLOWRING_INVALID_IFIDX; @@ -249,7 +256,7 @@ void brcmf_flowring_delete(struct brcmf_flowring *flow, u16 flowid) skb = skb_dequeue(&ring->skblist); while (skb) { - brcmu_pkt_buf_free_skb(skb); + brcmf_txfinalize(ifp, skb, false); skb = skb_dequeue(&ring->skblist); }