mac80211: group brcmfmac patches into sets as they were sent
[15.05/openwrt.git] / package / kernel / mac80211 / patches / 389-0004-brcmfmac-have-sdio-return-EIO-when-device-communicat.patch
1 From: Arend van Spriel <arend@broadcom.com>
2 Date: Thu, 11 Jun 2015 00:12:20 +0200
3 Subject: [PATCH] brcmfmac: have sdio return -EIO when device communication
4  is not possible
5
6 The bus interface functions txctl and rxctl may be used while the device
7 can not be accessed, eg. upon driver .remove() callback. This patch will
8 immediately return -EIO when this is the case which speeds up the module
9 unload.
10
11 Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
12 Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com>
13 Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
14 Signed-off-by: Arend van Spriel <arend@broadcom.com>
15 Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
16 ---
17
18 --- a/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c
19 +++ b/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c
20 @@ -988,6 +988,7 @@ static void brcmf_sdiod_freezer_detach(s
21  
22  static int brcmf_sdiod_remove(struct brcmf_sdio_dev *sdiodev)
23  {
24 +       sdiodev->state = BRCMF_SDIOD_DOWN;
25         if (sdiodev->bus) {
26                 brcmf_sdio_remove(sdiodev->bus);
27                 sdiodev->bus = NULL;
28 --- a/drivers/net/wireless/brcm80211/brcmfmac/sdio.c
29 +++ b/drivers/net/wireless/brcm80211/brcmfmac/sdio.c
30 @@ -2820,6 +2820,8 @@ static int brcmf_sdio_bus_txdata(struct
31         struct brcmf_sdio *bus = sdiodev->bus;
32  
33         brcmf_dbg(TRACE, "Enter: pkt: data %p len %d\n", pkt->data, pkt->len);
34 +       if (sdiodev->state != BRCMF_SDIOD_DATA)
35 +               return -EIO;
36  
37         /* Add space for the header */
38         skb_push(pkt, bus->tx_hdrlen);
39 @@ -2948,6 +2950,8 @@ brcmf_sdio_bus_txctl(struct device *dev,
40         int ret;
41  
42         brcmf_dbg(TRACE, "Enter\n");
43 +       if (sdiodev->state != BRCMF_SDIOD_DATA)
44 +               return -EIO;
45  
46         /* Send from dpc */
47         bus->ctrl_frame_buf = msg;
48 @@ -3238,6 +3242,8 @@ brcmf_sdio_bus_rxctl(struct device *dev,
49         struct brcmf_sdio *bus = sdiodev->bus;
50  
51         brcmf_dbg(TRACE, "Enter\n");
52 +       if (sdiodev->state != BRCMF_SDIOD_DATA)
53 +               return -EIO;
54  
55         /* Wait until control frame is available */
56         timeleft = brcmf_sdio_dcmd_resp_wait(bus, &bus->rxlen, &pending);