mac80211: backport latest AP6275P patches
Signed-off-by: Tianling Shen <cnsztl@immortalwrt.org>
This commit is contained in:
parent
8d0a426b3a
commit
87a65ed282
@ -1,7 +1,8 @@
|
||||
From: Jacobe Zang <jacobe.zang@wesion.com>
|
||||
To: robh@kernel.org, krzk+dt@kernel.org, heiko@sntech.de,
|
||||
kvalo@kernel.org, davem@davemloft.net, edumazet@google.com,
|
||||
kuba@kernel.org, pabeni@redhat.com, conor+dt@kernel.org
|
||||
kuba@kernel.org, pabeni@redhat.com, conor+dt@kernel.org,
|
||||
arend.vanspriel@broadcom.com
|
||||
Cc: efectn@protonmail.com, dsimic@manjaro.org, jagan@edgeble.ai,
|
||||
devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org,
|
||||
linux-rockchip@lists.infradead.org, linux-kernel@vger.kernel.org,
|
||||
@ -10,51 +11,269 @@ Cc: efectn@protonmail.com, dsimic@manjaro.org, jagan@edgeble.ai,
|
||||
bhelgaas@google.com, minipli@grsecurity.net,
|
||||
brcm80211@lists.linux.dev, brcm80211-dev-list.pdl@broadcom.com,
|
||||
nick@khadas.com, Jacobe Zang <jacobe.zang@wesion.com>
|
||||
Subject: [PATCH v3 4/5] wifi: brcmfmac: Add optional lpo clock enable support
|
||||
Date: Sun, 30 Jun 2024 15:36:04 +0800 [thread overview]
|
||||
Message-ID: <20240630073605.2164346-5-jacobe.zang@wesion.com> (raw)
|
||||
In-Reply-To: <20240630073605.2164346-1-jacobe.zang@wesion.com>
|
||||
Subject: [PATCH v8 4/5] wifi: brcmfmac: Add optional lpo clock enable support
|
||||
Date: Mon, 5 Aug 2024 15:34:24 +0800 [thread overview]
|
||||
Message-ID: <20240805073425.3492078-5-jacobe.zang@wesion.com> (raw)
|
||||
In-Reply-To: <20240805073425.3492078-1-jacobe.zang@wesion.com>
|
||||
|
||||
WiFi modules often require 32kHz clock to function. Add support to
|
||||
enable the clock to PCIe driver.
|
||||
enable the clock to PCIe driver and move "brcm,bcm4329-fmac" check
|
||||
to the top of brcmf_of_probe. Change function prototypes from void
|
||||
to int and add appropriate errno's for return values that will be
|
||||
send to bus when error occurred.
|
||||
|
||||
Co-developed-by: Ondrej Jirman <megi@xff.cz>
|
||||
Signed-off-by: Ondrej Jirman <megi@xff.cz>
|
||||
Co-developed-by: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
Signed-off-by: Jacobe Zang <jacobe.zang@wesion.com>
|
||||
---
|
||||
.../net/wireless/broadcom/brcm80211/brcmfmac/pcie.c | 10 ++++++++++
|
||||
1 file changed, 10 insertions(+)
|
||||
.../broadcom/brcm80211/brcmfmac/bcmsdh.c | 4 +++
|
||||
.../broadcom/brcm80211/brcmfmac/common.c | 6 +++-
|
||||
.../wireless/broadcom/brcm80211/brcmfmac/of.c | 28 +++++++++++++------
|
||||
.../wireless/broadcom/brcm80211/brcmfmac/of.h | 9 +++---
|
||||
.../broadcom/brcm80211/brcmfmac/pcie.c | 3 ++
|
||||
.../broadcom/brcm80211/brcmfmac/sdio.c | 18 ++++++++----
|
||||
.../broadcom/brcm80211/brcmfmac/usb.c | 3 ++
|
||||
7 files changed, 52 insertions(+), 19 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||
@@ -3,6 +3,7 @@
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
|
||||
@@ -951,6 +951,10 @@ int brcmf_sdiod_probe(struct brcmf_sdio_
|
||||
ret = -ENODEV;
|
||||
goto out;
|
||||
}
|
||||
+ if (IS_ERR(sdiodev->bus)) {
|
||||
+ ret = PTR_ERR(sdiodev->bus);
|
||||
+ goto out;
|
||||
+ }
|
||||
brcmf_sdiod_host_fixup(sdiodev->func2->card->host);
|
||||
out:
|
||||
if (ret)
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
|
||||
@@ -561,8 +561,12 @@ struct brcmf_mp_device *brcmf_get_module
|
||||
if (!found) {
|
||||
/* No platform data for this device, try OF and DMI data */
|
||||
brcmf_dmi_probe(settings, chip, chiprev);
|
||||
- brcmf_of_probe(dev, bus_type, settings);
|
||||
brcmf_acpi_probe(dev, bus_type, settings);
|
||||
+ i = brcmf_of_probe(dev, bus_type, settings);
|
||||
+ if (i < 0) {
|
||||
+ kfree(settings);
|
||||
+ settings = ERR_PTR(i);
|
||||
+ }
|
||||
}
|
||||
return settings;
|
||||
}
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c
|
||||
@@ -6,6 +6,7 @@
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_irq.h>
|
||||
#include <linux/of_net.h>
|
||||
+#include <linux/clk.h>
|
||||
|
||||
#include <defs.h>
|
||||
#include "debug.h"
|
||||
@@ -65,17 +66,21 @@ static int brcmf_of_get_country_codes(st
|
||||
return 0;
|
||||
}
|
||||
|
||||
-void brcmf_of_probe(struct device *dev, enum brcmf_bus_type bus_type,
|
||||
- struct brcmf_mp_device *settings)
|
||||
+int brcmf_of_probe(struct device *dev, enum brcmf_bus_type bus_type,
|
||||
+ struct brcmf_mp_device *settings)
|
||||
{
|
||||
struct brcmfmac_sdio_pd *sdio = &settings->bus.sdio;
|
||||
struct device_node *root, *np = dev->of_node;
|
||||
+ struct clk *clk;
|
||||
const char *prop;
|
||||
int irq;
|
||||
int err;
|
||||
u32 irqf;
|
||||
u32 val;
|
||||
|
||||
+ if (!np || !of_device_is_compatible(np, "brcm,bcm4329-fmac"))
|
||||
+ return 0;
|
||||
+
|
||||
/* Apple ARM64 platforms have their own idea of board type, passed in
|
||||
* via the device tree. They also have an antenna SKU parameter
|
||||
*/
|
||||
@@ -105,7 +110,7 @@ void brcmf_of_probe(struct device *dev,
|
||||
board_type = devm_kstrdup(dev, tmp, GFP_KERNEL);
|
||||
if (!board_type) {
|
||||
of_node_put(root);
|
||||
- return;
|
||||
+ return 0;
|
||||
}
|
||||
strreplace(board_type, '/', '-');
|
||||
settings->board_type = board_type;
|
||||
@@ -113,8 +118,13 @@ void brcmf_of_probe(struct device *dev,
|
||||
of_node_put(root);
|
||||
}
|
||||
|
||||
- if (!np || !of_device_is_compatible(np, "brcm,bcm4329-fmac"))
|
||||
- return;
|
||||
+ clk = devm_clk_get_optional_enabled(dev, "lpo");
|
||||
+ if (!IS_ERR_OR_NULL(clk)) {
|
||||
+ brcmf_dbg(INFO, "enabling 32kHz clock\n");
|
||||
+ clk_set_rate(clk, 32768);
|
||||
+ } else if (PTR_ERR_OR_ZERO(clk) == -EPROBE_DEFER) {
|
||||
+ return -EPROBE_DEFER;
|
||||
+ }
|
||||
|
||||
err = brcmf_of_get_country_codes(dev, settings);
|
||||
if (err)
|
||||
@@ -123,23 +133,25 @@ void brcmf_of_probe(struct device *dev,
|
||||
of_get_mac_address(np, settings->mac);
|
||||
|
||||
if (bus_type != BRCMF_BUSTYPE_SDIO)
|
||||
- return;
|
||||
+ return 0;
|
||||
|
||||
if (of_property_read_u32(np, "brcm,drive-strength", &val) == 0)
|
||||
sdio->drive_strength = val;
|
||||
|
||||
/* make sure there are interrupts defined in the node */
|
||||
if (!of_property_present(np, "interrupts"))
|
||||
- return;
|
||||
+ return 0;
|
||||
|
||||
irq = irq_of_parse_and_map(np, 0);
|
||||
if (!irq) {
|
||||
brcmf_err("interrupt could not be mapped\n");
|
||||
- return;
|
||||
+ return 0;
|
||||
}
|
||||
irqf = irqd_get_trigger_type(irq_get_irq_data(irq));
|
||||
|
||||
sdio->oob_irq_supported = true;
|
||||
sdio->oob_irq_nr = irq;
|
||||
sdio->oob_irq_flags = irqf;
|
||||
+
|
||||
+ return 0;
|
||||
}
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.h
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.h
|
||||
@@ -3,11 +3,12 @@
|
||||
* Copyright (c) 2014 Broadcom Corporation
|
||||
*/
|
||||
#ifdef CONFIG_OF
|
||||
-void brcmf_of_probe(struct device *dev, enum brcmf_bus_type bus_type,
|
||||
- struct brcmf_mp_device *settings);
|
||||
+int brcmf_of_probe(struct device *dev, enum brcmf_bus_type bus_type,
|
||||
+ struct brcmf_mp_device *settings);
|
||||
#else
|
||||
-static void brcmf_of_probe(struct device *dev, enum brcmf_bus_type bus_type,
|
||||
- struct brcmf_mp_device *settings)
|
||||
+static int brcmf_of_probe(struct device *dev, enum brcmf_bus_type bus_type,
|
||||
+ struct brcmf_mp_device *settings)
|
||||
{
|
||||
+ return 0;
|
||||
}
|
||||
#endif /* CONFIG_OF */
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||
@@ -2457,6 +2457,9 @@ brcmf_pcie_probe(struct pci_dev *pdev, c
|
||||
ret = -ENOMEM;
|
||||
goto fail;
|
||||
}
|
||||
+ ret = PTR_ERR_OR_ZERO(devinfo->settings);
|
||||
+ if (ret < 0)
|
||||
+ goto fail;
|
||||
|
||||
+#include <linux/clk.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/firmware.h>
|
||||
@@ -2411,6 +2412,7 @@ brcmf_pcie_probe(struct pci_dev *pdev, c
|
||||
struct brcmf_pciedev *pcie_bus_dev;
|
||||
struct brcmf_core *core;
|
||||
struct brcmf_bus *bus;
|
||||
+ struct clk *clk;
|
||||
bus = kzalloc(sizeof(*bus), GFP_KERNEL);
|
||||
if (!bus) {
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
|
||||
@@ -3943,7 +3943,7 @@ static const struct brcmf_buscore_ops br
|
||||
.write32 = brcmf_sdio_buscore_write32,
|
||||
};
|
||||
|
||||
if (!id) {
|
||||
id = pci_match_id(brcmf_pcie_devid_table, pdev);
|
||||
@@ -2422,6 +2424,14 @@ brcmf_pcie_probe(struct pci_dev *pdev, c
|
||||
-static bool
|
||||
+static int
|
||||
brcmf_sdio_probe_attach(struct brcmf_sdio *bus)
|
||||
{
|
||||
struct brcmf_sdio_dev *sdiodev;
|
||||
@@ -3953,6 +3953,7 @@ brcmf_sdio_probe_attach(struct brcmf_sdi
|
||||
u32 reg_val;
|
||||
u32 drivestrength;
|
||||
u32 enum_base;
|
||||
+ int ret = -EBADE;
|
||||
|
||||
brcmf_dbg(PCIE, "Enter %x:%x\n", pdev->vendor, pdev->device);
|
||||
sdiodev = bus->sdiodev;
|
||||
sdio_claim_host(sdiodev->func1);
|
||||
@@ -4001,8 +4002,9 @@ brcmf_sdio_probe_attach(struct brcmf_sdi
|
||||
BRCMF_BUSTYPE_SDIO,
|
||||
bus->ci->chip,
|
||||
bus->ci->chiprev);
|
||||
- if (!sdiodev->settings) {
|
||||
+ if (IS_ERR_OR_NULL(sdiodev->settings)) {
|
||||
brcmf_err("Failed to get device parameters\n");
|
||||
+ ret = PTR_ERR_OR_ZERO(sdiodev->settings);
|
||||
goto fail;
|
||||
}
|
||||
/* platform specific configuration:
|
||||
@@ -4071,7 +4073,7 @@ brcmf_sdio_probe_attach(struct brcmf_sdi
|
||||
/* allocate header buffer */
|
||||
bus->hdrbuf = kzalloc(MAX_HDR_READ + bus->head_align, GFP_KERNEL);
|
||||
if (!bus->hdrbuf)
|
||||
- return false;
|
||||
+ return -ENOMEM;
|
||||
/* Locate an appropriately-aligned portion of hdrbuf */
|
||||
bus->rxhdr = (u8 *) roundup((unsigned long)&bus->hdrbuf[0],
|
||||
bus->head_align);
|
||||
@@ -4082,11 +4084,11 @@ brcmf_sdio_probe_attach(struct brcmf_sdi
|
||||
if (bus->poll)
|
||||
bus->pollrate = 1;
|
||||
|
||||
+ clk = devm_clk_get_optional_enabled(&pdev->dev, "lpo");
|
||||
+ if (IS_ERR(clk))
|
||||
+ return PTR_ERR(clk);
|
||||
+ if (clk) {
|
||||
+ brcmf_dbg(PCIE, "enabling 32kHz clock\n", pdev->vendor, pdev->device);
|
||||
+ clk_set_rate(clk, 32768);
|
||||
+ }
|
||||
+
|
||||
ret = -ENOMEM;
|
||||
devinfo = kzalloc(sizeof(*devinfo), GFP_KERNEL);
|
||||
if (devinfo == NULL)
|
||||
- return true;
|
||||
+ return 0;
|
||||
|
||||
fail:
|
||||
sdio_release_host(sdiodev->func1);
|
||||
- return false;
|
||||
+ return ret;
|
||||
}
|
||||
|
||||
static int
|
||||
@@ -4446,6 +4448,7 @@ struct brcmf_sdio *brcmf_sdio_probe(stru
|
||||
struct brcmf_sdio *bus;
|
||||
struct workqueue_struct *wq;
|
||||
struct brcmf_fw_request *fwreq;
|
||||
+ int probe_attach_result;
|
||||
|
||||
brcmf_dbg(TRACE, "Enter\n");
|
||||
|
||||
@@ -4474,7 +4477,8 @@ struct brcmf_sdio *brcmf_sdio_probe(stru
|
||||
bus->brcmf_wq = wq;
|
||||
|
||||
/* attempt to attach to the dongle */
|
||||
- if (!(brcmf_sdio_probe_attach(bus))) {
|
||||
+ probe_attach_result = brcmf_sdio_probe_attach(bus);
|
||||
+ if (probe_attach_result < 0) {
|
||||
brcmf_err("brcmf_sdio_probe_attach failed\n");
|
||||
goto fail;
|
||||
}
|
||||
@@ -4546,6 +4550,8 @@ struct brcmf_sdio *brcmf_sdio_probe(stru
|
||||
|
||||
fail:
|
||||
brcmf_sdio_remove(bus);
|
||||
+ if (probe_attach_result < 0)
|
||||
+ return ERR_PTR(probe_attach_result);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
|
||||
@@ -1279,6 +1279,9 @@ static int brcmf_usb_probe_cb(struct brc
|
||||
ret = -ENOMEM;
|
||||
goto fail;
|
||||
}
|
||||
+ ret = PTR_ERR_OR_ZERO(devinfo->settings);
|
||||
+ if (ret < 0)
|
||||
+ goto fail;
|
||||
|
||||
if (!brcmf_usb_dlneeded(devinfo)) {
|
||||
ret = brcmf_alloc(devinfo->dev, devinfo->settings);
|
||||
|
||||
@ -1,82 +0,0 @@
|
||||
From: Jacobe Zang <jacobe.zang@wesion.com>
|
||||
To: robh@kernel.org, krzk+dt@kernel.org, heiko@sntech.de,
|
||||
kvalo@kernel.org, davem@davemloft.net, edumazet@google.com,
|
||||
kuba@kernel.org, pabeni@redhat.com, conor+dt@kernel.org
|
||||
Cc: efectn@protonmail.com, dsimic@manjaro.org, jagan@edgeble.ai,
|
||||
devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org,
|
||||
linux-rockchip@lists.infradead.org, linux-kernel@vger.kernel.org,
|
||||
arend@broadcom.com, linux-wireless@vger.kernel.org,
|
||||
netdev@vger.kernel.org, megi@xff.cz, duoming@zju.edu.cn,
|
||||
bhelgaas@google.com, minipli@grsecurity.net,
|
||||
brcm80211@lists.linux.dev, brcm80211-dev-list.pdl@broadcom.com,
|
||||
nick@khadas.com, Jacobe Zang <jacobe.zang@wesion.com>
|
||||
Subject: [PATCH v3 5/5] wifi: brcmfmac: Add support for AP6275P
|
||||
Date: Sun, 30 Jun 2024 15:36:05 +0800 [thread overview]
|
||||
Message-ID: <20240630073605.2164346-6-jacobe.zang@wesion.com> (raw)
|
||||
In-Reply-To: <20240630073605.2164346-1-jacobe.zang@wesion.com>
|
||||
|
||||
This module features BCM43752A2 chipset. The firmware requires
|
||||
randomness seeding, so enabled it.
|
||||
|
||||
Co-developed-by: Ondrej Jirman <megi@xff.cz>
|
||||
Signed-off-by: Ondrej Jirman <megi@xff.cz>
|
||||
Signed-off-by: Jacobe Zang <jacobe.zang@wesion.com>
|
||||
Link: https://megous.com/git/linux/commit/?h=ap6275p-6.10&id=1a99573bc8ed412e60e1969c0b29d53a0e5782e0
|
||||
---
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c | 5 ++++-
|
||||
.../net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h | 2 ++
|
||||
2 files changed, 6 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||
@@ -71,6 +71,7 @@ BRCMF_FW_CLM_DEF(4377B3, "brcmfmac4377b3
|
||||
BRCMF_FW_CLM_DEF(4378B1, "brcmfmac4378b1-pcie");
|
||||
BRCMF_FW_CLM_DEF(4378B3, "brcmfmac4378b3-pcie");
|
||||
BRCMF_FW_CLM_DEF(4387C2, "brcmfmac4387c2-pcie");
|
||||
+BRCMF_FW_CLM_DEF(43752, "brcmfmac43752-pcie");
|
||||
|
||||
/* firmware config files */
|
||||
MODULE_FIRMWARE(BRCMF_FW_DEFAULT_PATH "brcmfmac*-pcie.txt");
|
||||
@@ -105,6 +106,7 @@ static const struct brcmf_firmware_mappi
|
||||
BRCMF_FW_ENTRY(BRCM_CC_43664_CHIP_ID, 0xFFFFFFF0, 4366C),
|
||||
BRCMF_FW_ENTRY(BRCM_CC_43666_CHIP_ID, 0xFFFFFFF0, 4366C),
|
||||
BRCMF_FW_ENTRY(BRCM_CC_4371_CHIP_ID, 0xFFFFFFFF, 4371),
|
||||
+ BRCMF_FW_ENTRY(BRCM_CC_43752_CHIP_ID, 0xFFFFFFFF, 43752),
|
||||
BRCMF_FW_ENTRY(BRCM_CC_4377_CHIP_ID, 0xFFFFFFFF, 4377B3), /* revision ID 4 */
|
||||
BRCMF_FW_ENTRY(BRCM_CC_4378_CHIP_ID, 0x0000000F, 4378B1), /* revision ID 3 */
|
||||
BRCMF_FW_ENTRY(BRCM_CC_4378_CHIP_ID, 0xFFFFFFE0, 4378B3), /* revision ID 5 */
|
||||
@@ -1721,7 +1723,7 @@ static int brcmf_pcie_download_fw_nvram(
|
||||
memcpy_toio(devinfo->tcm + address, nvram, nvram_len);
|
||||
brcmf_fw_nvram_free(nvram);
|
||||
|
||||
- if (devinfo->otp.valid) {
|
||||
+ if (devinfo->otp.valid || devinfo->ci->chip == BRCM_CC_43752_CHIP_ID) {
|
||||
size_t rand_len = BRCMF_RANDOM_SEED_LENGTH;
|
||||
struct brcmf_random_seed_footer footer = {
|
||||
.length = cpu_to_le32(rand_len),
|
||||
@@ -2710,6 +2712,7 @@ static const struct pci_device_id brcmf_
|
||||
BRCMF_PCIE_DEVICE(BRCM_PCIE_4366_5G_DEVICE_ID, BCA),
|
||||
BRCMF_PCIE_DEVICE(BRCM_PCIE_4371_DEVICE_ID, WCC),
|
||||
BRCMF_PCIE_DEVICE(BRCM_PCIE_43596_DEVICE_ID, CYW),
|
||||
+ BRCMF_PCIE_DEVICE(BRCM_PCIE_43752_DEVICE_ID, WCC),
|
||||
BRCMF_PCIE_DEVICE(BRCM_PCIE_4377_DEVICE_ID, WCC),
|
||||
BRCMF_PCIE_DEVICE(BRCM_PCIE_4378_DEVICE_ID, WCC),
|
||||
BRCMF_PCIE_DEVICE(BRCM_PCIE_4387_DEVICE_ID, WCC),
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h
|
||||
@@ -52,6 +52,7 @@
|
||||
#define BRCM_CC_43664_CHIP_ID 43664
|
||||
#define BRCM_CC_43666_CHIP_ID 43666
|
||||
#define BRCM_CC_4371_CHIP_ID 0x4371
|
||||
+#define BRCM_CC_43752_CHIP_ID 43752
|
||||
#define BRCM_CC_4377_CHIP_ID 0x4377
|
||||
#define BRCM_CC_4378_CHIP_ID 0x4378
|
||||
#define BRCM_CC_4387_CHIP_ID 0x4387
|
||||
@@ -94,6 +95,7 @@
|
||||
#define BRCM_PCIE_4366_5G_DEVICE_ID 0x43c5
|
||||
#define BRCM_PCIE_4371_DEVICE_ID 0x440d
|
||||
#define BRCM_PCIE_43596_DEVICE_ID 0x4415
|
||||
+#define BRCM_PCIE_43752_DEVICE_ID 0x449d
|
||||
#define BRCM_PCIE_4377_DEVICE_ID 0x4488
|
||||
#define BRCM_PCIE_4378_DEVICE_ID 0x4425
|
||||
#define BRCM_PCIE_4387_DEVICE_ID 0x4433
|
||||
@ -0,0 +1,177 @@
|
||||
From: Jacobe Zang <jacobe.zang@wesion.com>
|
||||
To: robh@kernel.org, krzk+dt@kernel.org, heiko@sntech.de,
|
||||
kvalo@kernel.org, davem@davemloft.net, edumazet@google.com,
|
||||
kuba@kernel.org, pabeni@redhat.com, conor+dt@kernel.org,
|
||||
arend.vanspriel@broadcom.com
|
||||
Cc: efectn@protonmail.com, dsimic@manjaro.org, jagan@edgeble.ai,
|
||||
devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org,
|
||||
linux-rockchip@lists.infradead.org, linux-kernel@vger.kernel.org,
|
||||
arend@broadcom.com, linux-wireless@vger.kernel.org,
|
||||
netdev@vger.kernel.org, megi@xff.cz, duoming@zju.edu.cn,
|
||||
bhelgaas@google.com, minipli@grsecurity.net,
|
||||
brcm80211@lists.linux.dev, brcm80211-dev-list.pdl@broadcom.com,
|
||||
nick@khadas.com, Jacobe Zang <jacobe.zang@wesion.com>
|
||||
Subject: [PATCH v8 5/5] wifi: brcmfmac: add flag for random seed during firmware download
|
||||
Date: Mon, 5 Aug 2024 15:34:25 +0800 [thread overview]
|
||||
Message-ID: <20240805073425.3492078-6-jacobe.zang@wesion.com> (raw)
|
||||
In-Reply-To: <20240805073425.3492078-1-jacobe.zang@wesion.com>
|
||||
|
||||
Providing the random seed to firmware was tied to the fact that the
|
||||
device has a valid OTP, which worked for some Apple chips. However,
|
||||
it turns out the BCM43752 device also needs the random seed in order
|
||||
to get firmware running. Suspect it is simply tied to the firmware
|
||||
branch used for the device. Introducing a mechanism to allow setting
|
||||
it for a device through the device table.
|
||||
|
||||
Co-developed-by: Ondrej Jirman <megi@xff.cz>
|
||||
Signed-off-by: Ondrej Jirman <megi@xff.cz>
|
||||
Co-developed-by: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
Signed-off-by: Jacobe Zang <jacobe.zang@wesion.com>
|
||||
---
|
||||
.../broadcom/brcm80211/brcmfmac/pcie.c | 52 ++++++++++++++++---
|
||||
.../broadcom/brcm80211/include/brcm_hw_ids.h | 2 +
|
||||
2 files changed, 46 insertions(+), 8 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||
@@ -66,6 +66,7 @@ BRCMF_FW_DEF(4365C, "brcmfmac4365c-pcie"
|
||||
BRCMF_FW_DEF(4366B, "brcmfmac4366b-pcie");
|
||||
BRCMF_FW_DEF(4366C, "brcmfmac4366c-pcie");
|
||||
BRCMF_FW_DEF(4371, "brcmfmac4371-pcie");
|
||||
+BRCMF_FW_CLM_DEF(43752, "brcmfmac43752-pcie");
|
||||
BRCMF_FW_CLM_DEF(4377B3, "brcmfmac4377b3-pcie");
|
||||
BRCMF_FW_CLM_DEF(4378B1, "brcmfmac4378b1-pcie");
|
||||
BRCMF_FW_CLM_DEF(4378B3, "brcmfmac4378b3-pcie");
|
||||
@@ -104,6 +105,7 @@ static const struct brcmf_firmware_mappi
|
||||
BRCMF_FW_ENTRY(BRCM_CC_43664_CHIP_ID, 0xFFFFFFF0, 4366C),
|
||||
BRCMF_FW_ENTRY(BRCM_CC_43666_CHIP_ID, 0xFFFFFFF0, 4366C),
|
||||
BRCMF_FW_ENTRY(BRCM_CC_4371_CHIP_ID, 0xFFFFFFFF, 4371),
|
||||
+ BRCMF_FW_ENTRY(BRCM_CC_43752_CHIP_ID, 0xFFFFFFFF, 43752),
|
||||
BRCMF_FW_ENTRY(BRCM_CC_4377_CHIP_ID, 0xFFFFFFFF, 4377B3), /* revision ID 4 */
|
||||
BRCMF_FW_ENTRY(BRCM_CC_4378_CHIP_ID, 0x0000000F, 4378B1), /* revision ID 3 */
|
||||
BRCMF_FW_ENTRY(BRCM_CC_4378_CHIP_ID, 0xFFFFFFE0, 4378B3), /* revision ID 5 */
|
||||
@@ -358,6 +360,7 @@ struct brcmf_pciedev_info {
|
||||
u16 value);
|
||||
struct brcmf_mp_device *settings;
|
||||
struct brcmf_otp_params otp;
|
||||
+ bool fwseed;
|
||||
#ifdef DEBUG
|
||||
u32 console_interval;
|
||||
bool console_active;
|
||||
@@ -1720,14 +1723,14 @@ static int brcmf_pcie_download_fw_nvram(
|
||||
memcpy_toio(devinfo->tcm + address, nvram, nvram_len);
|
||||
brcmf_fw_nvram_free(nvram);
|
||||
|
||||
- if (devinfo->otp.valid) {
|
||||
+ if (devinfo->fwseed) {
|
||||
size_t rand_len = BRCMF_RANDOM_SEED_LENGTH;
|
||||
struct brcmf_random_seed_footer footer = {
|
||||
.length = cpu_to_le32(rand_len),
|
||||
.magic = cpu_to_le32(BRCMF_RANDOM_SEED_MAGIC),
|
||||
};
|
||||
|
||||
- /* Some Apple chips/firmwares expect a buffer of random
|
||||
+ /* Some chips/firmwares expect a buffer of random
|
||||
* data to be present before NVRAM
|
||||
*/
|
||||
brcmf_dbg(PCIE, "Download random seed\n");
|
||||
@@ -2399,6 +2402,37 @@ static void brcmf_pcie_debugfs_create(st
|
||||
}
|
||||
#endif
|
||||
|
||||
+struct brcmf_pcie_drvdata {
|
||||
+ enum brcmf_fwvendor vendor;
|
||||
+ bool fw_seed;
|
||||
+};
|
||||
+
|
||||
+enum {
|
||||
+ BRCMF_DRVDATA_CYW,
|
||||
+ BRCMF_DRVDATA_BCA,
|
||||
+ BRCMF_DRVDATA_WCC,
|
||||
+ BRCMF_DRVDATA_WCC_SEED,
|
||||
+};
|
||||
+
|
||||
+static const struct brcmf_pcie_drvdata drvdata[] = {
|
||||
+ [BRCMF_DRVDATA_CYW] = {
|
||||
+ .vendor = BRCMF_FWVENDOR_CYW,
|
||||
+ .fw_seed = false,
|
||||
+ },
|
||||
+ [BRCMF_DRVDATA_BCA] = {
|
||||
+ .vendor = BRCMF_FWVENDOR_BCA,
|
||||
+ .fw_seed = false,
|
||||
+ },
|
||||
+ [BRCMF_DRVDATA_WCC] = {
|
||||
+ .vendor = BRCMF_FWVENDOR_WCC,
|
||||
+ .fw_seed = false,
|
||||
+ },
|
||||
+ [BRCMF_DRVDATA_WCC_SEED] = {
|
||||
+ .vendor = BRCMF_FWVENDOR_WCC,
|
||||
+ .fw_seed = true,
|
||||
+ },
|
||||
+};
|
||||
+
|
||||
/* Forward declaration for pci_match_id() call */
|
||||
static const struct pci_device_id brcmf_pcie_devid_table[];
|
||||
|
||||
@@ -2480,9 +2514,10 @@ brcmf_pcie_probe(struct pci_dev *pdev, c
|
||||
bus->bus_priv.pcie = pcie_bus_dev;
|
||||
bus->ops = &brcmf_pcie_bus_ops;
|
||||
bus->proto_type = BRCMF_PROTO_MSGBUF;
|
||||
- bus->fwvid = id->driver_data;
|
||||
bus->chip = devinfo->coreid;
|
||||
bus->wowl_supported = pci_pme_capable(pdev, PCI_D3hot);
|
||||
+ bus->fwvid = drvdata[id->driver_data].vendor;
|
||||
+ devinfo->fwseed = drvdata[id->driver_data].fw_seed;
|
||||
dev_set_drvdata(&pdev->dev, bus);
|
||||
|
||||
ret = brcmf_alloc(&devinfo->pdev->dev, devinfo->settings);
|
||||
@@ -2668,14 +2703,14 @@ static const struct dev_pm_ops brcmf_pci
|
||||
BRCM_PCIE_VENDOR_ID_BROADCOM, (dev_id), \
|
||||
PCI_ANY_ID, PCI_ANY_ID, \
|
||||
PCI_CLASS_NETWORK_OTHER << 8, 0xffff00, \
|
||||
- BRCMF_FWVENDOR_ ## fw_vend \
|
||||
+ BRCMF_DRVDATA_ ## fw_vend \
|
||||
}
|
||||
#define BRCMF_PCIE_DEVICE_SUB(dev_id, subvend, subdev, fw_vend) \
|
||||
{ \
|
||||
BRCM_PCIE_VENDOR_ID_BROADCOM, (dev_id), \
|
||||
(subvend), (subdev), \
|
||||
PCI_CLASS_NETWORK_OTHER << 8, 0xffff00, \
|
||||
- BRCMF_FWVENDOR_ ## fw_vend \
|
||||
+ BRCMF_DRVDATA_ ## fw_vend \
|
||||
}
|
||||
|
||||
static const struct pci_device_id brcmf_pcie_devid_table[] = {
|
||||
@@ -2703,9 +2738,10 @@ static const struct pci_device_id brcmf_
|
||||
BRCMF_PCIE_DEVICE(BRCM_PCIE_4366_5G_DEVICE_ID, BCA),
|
||||
BRCMF_PCIE_DEVICE(BRCM_PCIE_4371_DEVICE_ID, WCC),
|
||||
BRCMF_PCIE_DEVICE(BRCM_PCIE_43596_DEVICE_ID, CYW),
|
||||
- BRCMF_PCIE_DEVICE(BRCM_PCIE_4377_DEVICE_ID, WCC),
|
||||
- BRCMF_PCIE_DEVICE(BRCM_PCIE_4378_DEVICE_ID, WCC),
|
||||
- BRCMF_PCIE_DEVICE(BRCM_PCIE_4387_DEVICE_ID, WCC),
|
||||
+ BRCMF_PCIE_DEVICE(BRCM_PCIE_4377_DEVICE_ID, WCC_SEED),
|
||||
+ BRCMF_PCIE_DEVICE(BRCM_PCIE_4378_DEVICE_ID, WCC_SEED),
|
||||
+ BRCMF_PCIE_DEVICE(BRCM_PCIE_4387_DEVICE_ID, WCC_SEED),
|
||||
+ BRCMF_PCIE_DEVICE(BRCM_PCIE_43752_DEVICE_ID, WCC_SEED),
|
||||
|
||||
{ /* end: all zeroes */ }
|
||||
};
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h
|
||||
@@ -52,6 +52,7 @@
|
||||
#define BRCM_CC_43664_CHIP_ID 43664
|
||||
#define BRCM_CC_43666_CHIP_ID 43666
|
||||
#define BRCM_CC_4371_CHIP_ID 0x4371
|
||||
+#define BRCM_CC_43752_CHIP_ID 43752
|
||||
#define BRCM_CC_4377_CHIP_ID 0x4377
|
||||
#define BRCM_CC_4378_CHIP_ID 0x4378
|
||||
#define BRCM_CC_4387_CHIP_ID 0x4387
|
||||
@@ -94,6 +95,7 @@
|
||||
#define BRCM_PCIE_4366_5G_DEVICE_ID 0x43c5
|
||||
#define BRCM_PCIE_4371_DEVICE_ID 0x440d
|
||||
#define BRCM_PCIE_43596_DEVICE_ID 0x4415
|
||||
+#define BRCM_PCIE_43752_DEVICE_ID 0x449d
|
||||
#define BRCM_PCIE_4377_DEVICE_ID 0x4488
|
||||
#define BRCM_PCIE_4378_DEVICE_ID 0x4425
|
||||
#define BRCM_PCIE_4387_DEVICE_ID 0x4433
|
||||
@ -12,7 +12,7 @@ Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c
|
||||
@@ -65,6 +65,36 @@ static int brcmf_of_get_country_codes(st
|
||||
@@ -66,6 +66,36 @@ static int brcmf_of_get_country_codes(st
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -46,15 +46,15 @@ Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
void brcmf_of_probe(struct device *dev, enum brcmf_bus_type bus_type,
|
||||
struct brcmf_mp_device *settings)
|
||||
int brcmf_of_probe(struct device *dev, enum brcmf_bus_type bus_type,
|
||||
struct brcmf_mp_device *settings)
|
||||
{
|
||||
@@ -113,6 +143,8 @@ void brcmf_of_probe(struct device *dev,
|
||||
of_node_put(root);
|
||||
}
|
||||
@@ -78,6 +108,8 @@ int brcmf_of_probe(struct device *dev, e
|
||||
u32 irqf;
|
||||
u32 val;
|
||||
|
||||
+ brcmf_of_probe_cc(dev, settings);
|
||||
+
|
||||
if (!np || !of_device_is_compatible(np, "brcm,bcm4329-fmac"))
|
||||
return;
|
||||
return 0;
|
||||
|
||||
|
||||
@ -384,12 +384,9 @@
|
||||
reg = <0x00300000 0 0 0 0>;
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
ranges;
|
||||
device_type = "pci";
|
||||
bus-range = <0x30 0x3f>;
|
||||
|
||||
wifi: wifi@30,0 {
|
||||
compatible = "pci14e4,449d";
|
||||
compatible = "brcm,bcm4329-fmac", "pci14e4,449d";
|
||||
reg = <0x310000 0 0 0 0>;
|
||||
clocks = <&hym8563>;
|
||||
clock-names = "lpo";
|
||||
|
||||
Loading…
Reference in New Issue
Block a user