add chaos_calmer branch
[15.05/openwrt.git] / package / kernel / mac80211 / patches / 344-brcmfmac-take-save-restore-memory-into-account-for-S.patch
1 From: Arend van Spriel <arend@broadcom.com>
2 Date: Wed, 11 Mar 2015 16:11:32 +0100
3 Subject: [PATCH] brcmfmac: take save&restore memory into account for SDIO
4  shared info
5
6 The firmware provides pointer to SDIO shared information at end of
7 RAM during firmware initialization. End of RAM is obviously determined
8 by the actual ram size, but part of that may be used for save&restore
9 memory. In that case another location in RAM will hold the pointer.
10
11 Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
12 Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
13 Signed-off-by: Arend van Spriel <arend@broadcom.com>
14 Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
15 ---
16
17 --- a/drivers/net/wireless/brcm80211/brcmfmac/sdio.c
18 +++ b/drivers/net/wireless/brcm80211/brcmfmac/sdio.c
19 @@ -1067,44 +1067,47 @@ static inline bool brcmf_sdio_valid_shar
20  static int brcmf_sdio_readshared(struct brcmf_sdio *bus,
21                                  struct sdpcm_shared *sh)
22  {
23 -       u32 addr;
24 +       u32 addr = 0;
25         int rv;
26         u32 shaddr = 0;
27         struct sdpcm_shared_le sh_le;
28         __le32 addr_le;
29  
30 -       shaddr = bus->ci->rambase + bus->ci->ramsize - 4;
31 +       sdio_claim_host(bus->sdiodev->func[1]);
32 +       brcmf_sdio_bus_sleep(bus, false, false);
33  
34         /*
35          * Read last word in socram to determine
36          * address of sdpcm_shared structure
37          */
38 -       sdio_claim_host(bus->sdiodev->func[1]);
39 -       brcmf_sdio_bus_sleep(bus, false, false);
40 -       rv = brcmf_sdiod_ramrw(bus->sdiodev, false, shaddr, (u8 *)&addr_le, 4);
41 -       sdio_release_host(bus->sdiodev->func[1]);
42 +       shaddr = bus->ci->rambase + bus->ci->ramsize - 4;
43 +       if (!bus->ci->rambase && brcmf_chip_sr_capable(bus->ci))
44 +               shaddr -= bus->ci->srsize;
45 +       rv = brcmf_sdiod_ramrw(bus->sdiodev, false, shaddr,
46 +                              (u8 *)&addr_le, 4);
47         if (rv < 0)
48 -               return rv;
49 -
50 -       addr = le32_to_cpu(addr_le);
51 -
52 -       brcmf_dbg(SDIO, "sdpcm_shared address 0x%08X\n", addr);
53 +               goto fail;
54  
55         /*
56          * Check if addr is valid.
57          * NVRAM length at the end of memory should have been overwritten.
58          */
59 +       addr = le32_to_cpu(addr_le);
60         if (!brcmf_sdio_valid_shared_address(addr)) {
61 -                       brcmf_err("invalid sdpcm_shared address 0x%08X\n",
62 -                                 addr);
63 -                       return -EINVAL;
64 +               brcmf_err("invalid sdpcm_shared address 0x%08X\n", addr);
65 +               rv = -EINVAL;
66 +               goto fail;
67         }
68  
69 +       brcmf_dbg(INFO, "sdpcm_shared address 0x%08X\n", addr);
70 +
71         /* Read hndrte_shared structure */
72         rv = brcmf_sdiod_ramrw(bus->sdiodev, false, addr, (u8 *)&sh_le,
73                                sizeof(struct sdpcm_shared_le));
74         if (rv < 0)
75 -               return rv;
76 +               goto fail;
77 +
78 +       sdio_release_host(bus->sdiodev->func[1]);
79  
80         /* Endianness */
81         sh->flags = le32_to_cpu(sh_le.flags);
82 @@ -1121,8 +1124,13 @@ static int brcmf_sdio_readshared(struct
83                           sh->flags & SDPCM_SHARED_VERSION_MASK);
84                 return -EPROTO;
85         }
86 -
87         return 0;
88 +
89 +fail:
90 +       brcmf_err("unable to obtain sdpcm_shared info: rv=%d (addr=0x%x)\n",
91 +                 rv, addr);
92 +       sdio_release_host(bus->sdiodev->func[1]);
93 +       return rv;
94  }
95  
96  static void brcmf_sdio_get_console_addr(struct brcmf_sdio *bus)