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
|
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
|
||||||
+++ b/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))
|
if (!schedule_work(&brcmf_driver_work))
|
||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
|
|
Loading…
Reference in a new issue