diff options
author | Arend van Spriel <arend@broadcom.com> | 2013-04-03 06:40:36 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2013-04-03 15:07:05 -0400 |
commit | a3e993c78631b918f26db38605678889e3a5e964 (patch) | |
tree | b0f7b5de7c3b14e1c0829b0055c40872de3577ee /drivers | |
parent | ebb93883cf4c4ea0b44abab254ad35fd6236177b (diff) |
brcmfmac: perform filtered firmware-signalling cleanup upon DEL_IF
When an interface is deleted make sure to cleanup all packet
buffers related to that interface.
Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
Reviewed-by: Piotr Haber <phaber@broadcom.com>
Signed-off-by: Arend van Spriel <arend@broadcom.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/net/wireless/brcm80211/brcmfmac/fwsignal.c | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/fwsignal.c b/drivers/net/wireless/brcm80211/brcmfmac/fwsignal.c index eba510694cb6..b123a80b17cf 100644 --- a/drivers/net/wireless/brcm80211/brcmfmac/fwsignal.c +++ b/drivers/net/wireless/brcm80211/brcmfmac/fwsignal.c | |||
@@ -354,21 +354,31 @@ static void brcmf_fws_mac_desc_cleanup(struct brcmf_fws_mac_descriptor *entry, | |||
354 | } | 354 | } |
355 | } | 355 | } |
356 | 356 | ||
357 | static bool brcmf_fws_ifidx_match(struct sk_buff *skb, void *arg) | ||
358 | { | ||
359 | u32 ifidx = brcmf_skb_if_flags_get_field(skb, INDEX); | ||
360 | return ifidx == *(int *)arg; | ||
361 | } | ||
362 | |||
357 | static void brcmf_fws_cleanup(struct brcmf_fws_info *fws, int ifidx) | 363 | static void brcmf_fws_cleanup(struct brcmf_fws_info *fws, int ifidx) |
358 | { | 364 | { |
359 | int i; | 365 | int i; |
360 | struct brcmf_fws_mac_descriptor *table; | 366 | struct brcmf_fws_mac_descriptor *table; |
367 | bool (*matchfn)(struct sk_buff *, void *) = NULL; | ||
361 | 368 | ||
362 | brcmf_dbg(TRACE, "enter: ifidx=%d\n", ifidx); | 369 | brcmf_dbg(TRACE, "enter: ifidx=%d\n", ifidx); |
363 | if (fws == NULL) | 370 | if (fws == NULL) |
364 | return; | 371 | return; |
365 | 372 | ||
373 | if (ifidx != -1) | ||
374 | matchfn = brcmf_fws_ifidx_match; | ||
375 | |||
366 | /* cleanup individual nodes */ | 376 | /* cleanup individual nodes */ |
367 | table = &fws->nodes[0]; | 377 | table = &fws->nodes[0]; |
368 | for (i = 0; i < ARRAY_SIZE(fws->nodes); i++) | 378 | for (i = 0; i < ARRAY_SIZE(fws->nodes); i++) |
369 | brcmf_fws_mac_desc_cleanup(&table[i], NULL, ifidx); | 379 | brcmf_fws_mac_desc_cleanup(&table[i], matchfn, ifidx); |
370 | 380 | ||
371 | brcmf_fws_mac_desc_cleanup(&fws->other, NULL, ifidx); | 381 | brcmf_fws_mac_desc_cleanup(&fws->other, matchfn, ifidx); |
372 | } | 382 | } |
373 | 383 | ||
374 | static int brcmf_fws_rssi_indicate(struct brcmf_fws_info *fws, s8 rssi) | 384 | static int brcmf_fws_rssi_indicate(struct brcmf_fws_info *fws, s8 rssi) |
@@ -678,5 +688,6 @@ void brcmf_fws_del_interface(struct brcmf_if *ifp) | |||
678 | 688 | ||
679 | ifp->fws_desc = NULL; | 689 | ifp->fws_desc = NULL; |
680 | brcmf_fws_clear_mac_descriptor(entry); | 690 | brcmf_fws_clear_mac_descriptor(entry); |
691 | brcmf_fws_cleanup(ifp->drvr->fws, ifp->ifidx); | ||
681 | kfree(entry); | 692 | kfree(entry); |
682 | } | 693 | } |