mac80211: backport brcmfmac changes from 2016-09-27
This fixes bug that could cause WARNING on every add_key/del_key call. It also replaces WARNING with a simple message. They may still occur e.g. on station going out of range and A-MPDU stall in the firmware. Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
This commit is contained in:
parent
68d649f5cd
commit
a0ce6982d8
3 changed files with 97 additions and 1 deletions
|
@ -0,0 +1,38 @@
|
|||
From 2f0e56fa37cce60a5ac5d451bcadec51cd711436 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Tue, 27 Sep 2016 12:12:24 +0200
|
||||
Subject: [PATCH] brcmfmac: replace WARNING on timeout with a simple error
|
||||
message
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Even with timeout increased to 950 ms we get WARNINGs from time to time.
|
||||
It mostly happens on A-MPDU stalls (e.g. when station goes out of
|
||||
range). It may take up to 5-10 secods for the firmware to recover and
|
||||
for that time it doesn't process packets.
|
||||
|
||||
It's still useful to have a message on time out as it may indicate some
|
||||
firmware problem and incorrect key update. Raising a WARNING however
|
||||
wasn't really that necessary, it doesn't point to any driver bug anymore
|
||||
and backtrace wasn't much useful.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Acked-by: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c | 3 ++-
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
|
||||
@@ -1155,7 +1155,8 @@ int brcmf_netdev_wait_pend8021x(struct b
|
||||
!brcmf_get_pend_8021x_cnt(ifp),
|
||||
MAX_WAIT_FOR_8021X_TX);
|
||||
|
||||
- WARN_ON(!err);
|
||||
+ if (!err)
|
||||
+ brcmf_err("Timed out waiting for no pending 802.1x packets\n");
|
||||
|
||||
return !err;
|
||||
}
|
|
@ -0,0 +1,58 @@
|
|||
From 7f00ee2bbc630900ba16fc2690473f3e2db0e264 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Tue, 27 Sep 2016 14:11:04 +0200
|
||||
Subject: [PATCH] brcmfmac: use correct skb freeing helper when deleting
|
||||
flowring
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
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+
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/flowring.c | 9 ++++++++-
|
||||
1 file changed, 8 insertions(+), 1 deletion(-)
|
||||
|
||||
--- 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
|
||||
|
||||
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_
|
||||
|
||||
skb = skb_dequeue(&ring->skblist);
|
||||
while (skb) {
|
||||
- brcmu_pkt_buf_free_skb(skb);
|
||||
+ brcmf_txfinalize(ifp, skb, false);
|
||||
skb = skb_dequeue(&ring->skblist);
|
||||
}
|
||||
|
|
@ -13,7 +13,7 @@ Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
|
|||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
|
||||
@@ -1199,6 +1199,7 @@ int __init brcmf_core_init(void)
|
||||
@@ -1200,6 +1200,7 @@ int __init brcmf_core_init(void)
|
||||
{
|
||||
if (!schedule_work(&brcmf_driver_work))
|
||||
return -EBUSY;
|
||||
|
|
Loading…
Reference in a new issue