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
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.
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>
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)
27 struct sdpcm_shared_le sh_le;
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);
35 * Read last word in socram to determine
36 * address of sdpcm_shared structure
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,
50 - addr = le32_to_cpu(addr_le);
52 - brcmf_dbg(SDIO, "sdpcm_shared address 0x%08X\n", addr);
56 * Check if addr is valid.
57 * NVRAM length at the end of memory should have been overwritten.
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",
64 + brcmf_err("invalid sdpcm_shared address 0x%08X\n", addr);
69 + brcmf_dbg(INFO, "sdpcm_shared address 0x%08X\n", addr);
71 /* Read hndrte_shared structure */
72 rv = brcmf_sdiod_ramrw(bus->sdiodev, false, addr, (u8 *)&sh_le,
73 sizeof(struct sdpcm_shared_le));
78 + sdio_release_host(bus->sdiodev->func[1]);
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);
90 + brcmf_err("unable to obtain sdpcm_shared info: rv=%d (addr=0x%x)\n",
92 + sdio_release_host(bus->sdiodev->func[1]);
96 static void brcmf_sdio_get_console_addr(struct brcmf_sdio *bus)