mac80211: update brcmfmac to the wireless-drivers-next-for-davem-2015-04-09
[openwrt/svn-archive/archive.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)