Skip to content

Commit 9587fcd

Browse files
committed
brcmfmac: pcie: Provide a buffer of random bytes to the device
Newer Apple firmwares on chipsets without a hardware RNG require the host to provide a buffer of 256 random bytes to the device on initialization. This buffer is present immediately before NVRAM, suffixed by a footer containing a magic number and the buffer length. This won't affect chips/firmwares that do not use this feature, so do it unconditionally. Reviewed-by: Linus Walleij <linus.walleij@linaro.org> Signed-off-by: Hector Martin <marcan@marcan.st>
1 parent 27ea7b8 commit 9587fcd

1 file changed

Lines changed: 29 additions & 0 deletions

File tree

  • drivers/net/wireless/broadcom/brcm80211/brcmfmac

drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include <linux/sched/signal.h>
1616
#include <linux/kthread.h>
1717
#include <linux/io.h>
18+
#include <linux/random.h>
1819
#include <asm/unaligned.h>
1920

2021
#include <soc.h>
@@ -1653,6 +1654,13 @@ brcmf_pcie_init_share_ram_info(struct brcmf_pciedev_info *devinfo,
16531654
return 0;
16541655
}
16551656

1657+
struct brcmf_random_seed_footer {
1658+
__le32 length;
1659+
__le32 magic;
1660+
};
1661+
1662+
#define BRCMF_RANDOM_SEED_MAGIC 0xfeedc0de
1663+
#define BRCMF_RANDOM_SEED_LENGTH 0x100
16561664

16571665
static int brcmf_pcie_download_fw_nvram(struct brcmf_pciedev_info *devinfo,
16581666
const struct firmware *fw, void *nvram,
@@ -1684,11 +1692,32 @@ static int brcmf_pcie_download_fw_nvram(struct brcmf_pciedev_info *devinfo,
16841692
brcmf_pcie_write_ram32(devinfo, devinfo->ci->ramsize - 4, 0);
16851693

16861694
if (nvram) {
1695+
size_t rand_len = BRCMF_RANDOM_SEED_LENGTH;
1696+
struct brcmf_random_seed_footer footer = {
1697+
.length = cpu_to_le32(rand_len),
1698+
.magic = cpu_to_le32(BRCMF_RANDOM_SEED_MAGIC),
1699+
};
1700+
void *randbuf;
1701+
16871702
brcmf_dbg(PCIE, "Download NVRAM %s\n", devinfo->nvram_name);
16881703
address = devinfo->ci->rambase + devinfo->ci->ramsize -
16891704
nvram_len;
16901705
memcpy_toio(devinfo->tcm + address, nvram, nvram_len);
16911706
brcmf_fw_nvram_free(nvram);
1707+
1708+
/* Some Apple chips/firmwares expect a buffer of random data
1709+
* to be present before NVRAM
1710+
*/
1711+
brcmf_dbg(PCIE, "Download random seed\n");
1712+
1713+
address -= sizeof(footer);
1714+
memcpy_toio(devinfo->tcm + address, &footer, sizeof(footer));
1715+
1716+
address -= rand_len;
1717+
randbuf = kzalloc(rand_len, GFP_KERNEL);
1718+
get_random_bytes(randbuf, rand_len);
1719+
memcpy_toio(devinfo->tcm + address, randbuf, rand_len);
1720+
kfree(randbuf);
16921721
} else {
16931722
brcmf_dbg(PCIE, "No matching NVRAM file found %s\n",
16941723
devinfo->nvram_name);

0 commit comments

Comments
 (0)