mac80211: update brcmfmac to the wireless-drivers-next-for-davem-2015-04-09
[openwrt.git] / package / kernel / mac80211 / patches / 335-brcmfmac-Fix-oops-when-SDIO-device-is-removed.patch
1 From: Hante Meuleman <meuleman@broadcom.com>
2 Date: Fri, 6 Mar 2015 18:40:38 +0100
3 Subject: [PATCH] brcmfmac: Fix oops when SDIO device is removed.
4
5 On removal of SDIO card both functions of card will be getting
6 a remove call. When the first is hanging in ctrl frame xmit then
7 the second will cause oops. This patch fixes the xmit ctrl
8 handling in case of serious errors and also limits the handling
9 for remove to function 1 only.
10
11 Reviewed-by: Arend Van Spriel <arend@broadcom.com>
12 Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com>
13 Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
14 Reviewed-by: Daniel (Deognyoun) Kim <dekim@broadcom.com>
15 Signed-off-by: Hante Meuleman <meuleman@broadcom.com>
16 Signed-off-by: Arend van Spriel <arend@broadcom.com>
17 Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
18 ---
19
20 --- a/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c
21 +++ b/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c
22 @@ -1194,7 +1194,7 @@ static void brcmf_ops_sdio_remove(struct
23         brcmf_dbg(SDIO, "sdio device ID: 0x%04x\n", func->device);
24         brcmf_dbg(SDIO, "Function: %d\n", func->num);
25  
26 -       if (func->num != 1 && func->num != 2)
27 +       if (func->num != 1)
28                 return;
29  
30         bus_if = dev_get_drvdata(&func->dev);
31 --- a/drivers/net/wireless/brcm80211/brcmfmac/sdio.c
32 +++ b/drivers/net/wireless/brcm80211/brcmfmac/sdio.c
33 @@ -2740,6 +2740,11 @@ static void brcmf_sdio_dpc(struct brcmf_
34         if ((bus->sdiodev->state != BRCMF_SDIOD_DATA) || (err != 0)) {
35                 brcmf_err("failed backplane access over SDIO, halting operation\n");
36                 atomic_set(&bus->intstatus, 0);
37 +               if (bus->ctrl_frame_stat) {
38 +                       bus->ctrl_frame_err = -ENODEV;
39 +                       bus->ctrl_frame_stat = false;
40 +                       brcmf_sdio_wait_event_wakeup(bus);
41 +               }
42         } else if (atomic_read(&bus->intstatus) ||
43                    atomic_read(&bus->ipend) > 0 ||
44                    (!atomic_read(&bus->fcstate) &&