From 8810ec72c14f60050127ff94f48ac95c28c8f2ae Mon Sep 17 00:00:00 2001 From: Redecorating <69827514+Redecorating@users.noreply.github.com> Date: Thu, 6 Jan 2022 18:29:53 +1100 Subject: [PATCH] kernel 5.15.13, update asahi patchset: txcap support --- ...clare-missing-firmware-files-in-pcie.patch | 2 +- ...re-Support-having-multiple-alt-paths.patch | 2 +- ...ware-Handle-per-board-clm_blob-files.patch | 2 +- ...io-usb-Get-CLM-blob-via-standard-fir.patch | 129 +++++++---- ...e-Support-passing-in-multiple-board_.patch | 12 +- ...fmac-pcie-Read-Apple-OTP-information.patch | 10 +- 8007-brcmfmac-of-Fetch-Apple-properties.patch | 4 +- ...rform-firmware-selection-for-Apple-p.patch | 8 +- ...e-Allow-platform-to-override-macaddr.patch | 4 +- ...sgbuf-Increase-RX-ring-sizes-to-1024.patch | 4 +- ...c-pcie-Fix-crashes-due-to-early-IRQs.patch | 10 +- ...-pcie-Support-PCIe-core-revisions-64.patch | 14 +- ...-pcie-Add-IDs-properties-for-BCM4378.patch | 10 +- ...-Support-strings-in-Apple-_DSM-props.patch | 4 +- ...d-support-for-fetching-Apple-ACPI-pr.patch | 6 +- ...ovide-a-buffer-of-random-bytes-to-th.patch | 10 +- ...-pcie-Add-IDs-properties-for-BCM4355.patch | 11 +- ...-pcie-Add-IDs-properties-for-BCM4377.patch | 14 +- ...rform-correct-BCM4364-firmware-selec.patch | 12 +- ...ly-disable-D11-cores-handle-an-arbit.patch | 4 +- ...andle-1024-unit-sizes-for-TCM-blocks.patch | 4 +- ...80211-Add-support-for-scan-params-v2.patch | 4 +- ...-Add-support-for-setting-feats-based.patch | 4 +- ...1-Add-support-for-PMKID_V3-operation.patch | 4 +- ...1-Pass-the-PMK-in-binary-instead-of-.patch | 4 +- ...-pcie-Add-IDs-properties-for-BCM4387.patch | 10 +- ...place-brcmf_pcie_copy_mem_todev-with.patch | 12 +- ...ead-the-console-on-init-and-shutdown.patch | 10 +- ...lease-firmwares-in-the-brcmf_pcie_se.patch | 8 +- ...c-fwil-Constify-iovar-name-arguments.patch | 215 ++++++++++++++++++ ...Add-support-for-downloading-TxCap-bl.patch | 189 +++++++++++++++ ...ac-pcie-Load-and-provide-TxCap-blobs.patch | 91 ++++++++ ...Add-support-for-external-calibration.patch | 100 ++++++++ PKGBUILD | 77 ++++--- 34 files changed, 820 insertions(+), 184 deletions(-) create mode 100644 8031-brcmfmac-fwil-Constify-iovar-name-arguments.patch create mode 100644 8032-brcmfmac-common-Add-support-for-downloading-TxCap-bl.patch create mode 100644 8033-brcmfmac-pcie-Load-and-provide-TxCap-blobs.patch create mode 100644 8034-brcmfmac-common-Add-support-for-external-calibration.patch diff --git a/8001-brcmfmac-pcie-Declare-missing-firmware-files-in-pcie.patch b/8001-brcmfmac-pcie-Declare-missing-firmware-files-in-pcie.patch index fb63be1..3aa14c8 100644 --- a/8001-brcmfmac-pcie-Declare-missing-firmware-files-in-pcie.patch +++ b/8001-brcmfmac-pcie-Declare-missing-firmware-files-in-pcie.patch @@ -1,7 +1,7 @@ From 3f43bc112ea442739258e2c6b143408c7c45e2e9 Mon Sep 17 00:00:00 2001 From: Hector Martin Date: Tue, 21 Dec 2021 19:32:16 +0900 -Subject: [PATCH 01/30] brcmfmac: pcie: Declare missing firmware files in +Subject: [PATCH 01/34] brcmfmac: pcie: Declare missing firmware files in pcie.c Move one of the declarations from sdio.c to pcie.c, since it makes no diff --git a/8002-brcmfmac-firmware-Support-having-multiple-alt-paths.patch b/8002-brcmfmac-firmware-Support-having-multiple-alt-paths.patch index 82131c3..fda0a3b 100644 --- a/8002-brcmfmac-firmware-Support-having-multiple-alt-paths.patch +++ b/8002-brcmfmac-firmware-Support-having-multiple-alt-paths.patch @@ -1,7 +1,7 @@ From 59c61aa5ad2e12fdbccb5712d35c203cf9079230 Mon Sep 17 00:00:00 2001 From: Hector Martin Date: Sat, 18 Dec 2021 20:38:34 +0900 -Subject: [PATCH 02/30] brcmfmac: firmware: Support having multiple alt paths +Subject: [PATCH 02/34] brcmfmac: firmware: Support having multiple alt paths Apple platforms have firmware and config files identified with multiple dimensions. We want to be able to find the most specific firmware diff --git a/8003-brcmfmac-firmware-Handle-per-board-clm_blob-files.patch b/8003-brcmfmac-firmware-Handle-per-board-clm_blob-files.patch index c2067f5..1698bfc 100644 --- a/8003-brcmfmac-firmware-Handle-per-board-clm_blob-files.patch +++ b/8003-brcmfmac-firmware-Handle-per-board-clm_blob-files.patch @@ -1,7 +1,7 @@ From 637e3946944e25c98c8955ec2a84133b79afca4d Mon Sep 17 00:00:00 2001 From: Hector Martin Date: Sat, 18 Dec 2021 20:52:04 +0900 -Subject: [PATCH 03/30] brcmfmac: firmware: Handle per-board clm_blob files +Subject: [PATCH 03/34] brcmfmac: firmware: Handle per-board clm_blob files Teach brcm_alt_fw_paths to correctly split off variable length extensions, and enable alt firmware lookups for the CLM blob firmware diff --git a/8004-brcmfmac-pcie-sdio-usb-Get-CLM-blob-via-standard-fir.patch b/8004-brcmfmac-pcie-sdio-usb-Get-CLM-blob-via-standard-fir.patch index 43dc7ba..a7b4088 100644 --- a/8004-brcmfmac-pcie-sdio-usb-Get-CLM-blob-via-standard-fir.patch +++ b/8004-brcmfmac-pcie-sdio-usb-Get-CLM-blob-via-standard-fir.patch @@ -1,7 +1,7 @@ -From 95cfbeaaac15e765969a5048c6815c83d59adeec Mon Sep 17 00:00:00 2001 +From 10ae20866cddd7ba8421dfa331d617c36e1510f6 Mon Sep 17 00:00:00 2001 From: Hector Martin Date: Tue, 21 Dec 2021 17:13:49 +0900 -Subject: [PATCH 04/30] brcmfmac: pcie/sdio/usb: Get CLM blob via standard +Subject: [PATCH 04/34] brcmfmac: pcie/sdio/usb: Get CLM blob via standard firmware mechanism Now that the firmware fetcher can handle per-board CLM files, load the @@ -12,16 +12,16 @@ This enables per-board CLM blobs, which are required on Apple platforms. Signed-off-by: Hector Martin --- - .../broadcom/brcm80211/brcmfmac/bus.h | 12 +++---- - .../broadcom/brcm80211/brcmfmac/common.c | 12 ++----- - .../broadcom/brcm80211/brcmfmac/pcie.c | 32 +++++++++++-------- - .../broadcom/brcm80211/brcmfmac/sdio.c | 29 +++++++++-------- - .../broadcom/brcm80211/brcmfmac/sdio.h | 2 ++ - .../broadcom/brcm80211/brcmfmac/usb.c | 22 +++---------- - 6 files changed, 47 insertions(+), 62 deletions(-) + .../broadcom/brcm80211/brcmfmac/bus.h | 19 ++++++--- + .../broadcom/brcm80211/brcmfmac/common.c | 12 +----- + .../broadcom/brcm80211/brcmfmac/pcie.c | 39 ++++++++++++------- + .../broadcom/brcm80211/brcmfmac/sdio.c | 36 ++++++++++------- + .../broadcom/brcm80211/brcmfmac/sdio.h | 2 + + .../broadcom/brcm80211/brcmfmac/usb.c | 23 +++-------- + 6 files changed, 69 insertions(+), 62 deletions(-) diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h -index 3f5da3bb6..7880f77a4 100644 +index 3f5da3bb6..b13af8f63 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h @@ -7,6 +7,8 @@ @@ -33,40 +33,54 @@ index 3f5da3bb6..7880f77a4 100644 /* IDs of the 6 default common rings of msgbuf protocol */ #define BRCMF_H2D_MSGRING_CONTROL_SUBMIT 0 -@@ -60,7 +62,7 @@ struct brcmf_bus_dcmd { +@@ -34,6 +36,11 @@ enum brcmf_bus_protocol_type { + BRCMF_PROTO_MSGBUF + }; + ++/* Firmware blobs that may be available */ ++enum brcmf_blob_type { ++ BRCMF_BLOB_CLM, ++}; ++ + struct brcmf_mp_device; + + struct brcmf_bus_dcmd { +@@ -60,7 +67,7 @@ struct brcmf_bus_dcmd { * @wowl_config: specify if dongle is configured for wowl when going to suspend * @get_ramsize: obtain size of device memory. * @get_memdump: obtain device memory dump in provided buffer. - * @get_fwname: obtain firmware name. -+ * @get_clm: obtain CLM firmware blob. ++ * @get_blob: obtain a firmware blob. * * This structure provides an abstract interface towards the * bus specific driver. For control messages to common driver -@@ -77,8 +79,7 @@ struct brcmf_bus_ops { +@@ -77,8 +84,8 @@ struct brcmf_bus_ops { void (*wowl_config)(struct device *dev, bool enabled); size_t (*get_ramsize)(struct device *dev); int (*get_memdump)(struct device *dev, void *data, size_t len); - int (*get_fwname)(struct device *dev, const char *ext, - unsigned char *fw_name); -+ int (*get_clm)(struct device *dev, const struct firmware **fw); ++ int (*get_blob)(struct device *dev, const struct firmware **fw, ++ enum brcmf_blob_type type); void (*debugfs_create)(struct device *dev); int (*reset)(struct device *dev); }; -@@ -220,10 +221,9 @@ int brcmf_bus_get_memdump(struct brcmf_bus *bus, void *data, size_t len) +@@ -220,10 +227,10 @@ int brcmf_bus_get_memdump(struct brcmf_bus *bus, void *data, size_t len) } static inline -int brcmf_bus_get_fwname(struct brcmf_bus *bus, const char *ext, - unsigned char *fw_name) -+int brcmf_bus_get_clm(struct brcmf_bus *bus, const struct firmware **fw) ++int brcmf_bus_get_blob(struct brcmf_bus *bus, const struct firmware **fw, ++ enum brcmf_blob_type type) { - return bus->ops->get_fwname(bus->dev, ext, fw_name); -+ return bus->ops->get_clm(bus->dev, fw); ++ return bus->ops->get_blob(bus->dev, fw, type); } static inline diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c -index e3758bd86..ec4cb7050 100644 +index e3758bd86..b8ed85112 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c @@ -123,7 +123,6 @@ static int brcmf_c_process_clm_blob(struct brcmf_if *ifp) @@ -90,13 +104,13 @@ index e3758bd86..ec4cb7050 100644 - - err = firmware_request_nowarn(&clm, clm_name, bus->dev); - if (err) { -+ err = brcmf_bus_get_clm(bus, &clm); ++ err = brcmf_bus_get_blob(bus, &clm, BRCMF_BLOB_CLM); + if (err || !clm) { brcmf_info("no clm_blob available (err=%d), device may have limited channels available\n", err); return 0; diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c -index aed49416c..ea8776fd2 100644 +index aed49416c..ab0503c6f 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c @@ -65,6 +65,7 @@ MODULE_FIRMWARE(BRCMF_FW_DEFAULT_PATH "brcmfmac*-pcie.*.txt"); @@ -116,13 +130,14 @@ index aed49416c..ea8776fd2 100644 void __iomem *regs; void __iomem *tcm; u32 ram_base; -@@ -1408,23 +1411,18 @@ static int brcmf_pcie_get_memdump(struct device *dev, void *data, size_t len) +@@ -1408,23 +1411,25 @@ static int brcmf_pcie_get_memdump(struct device *dev, void *data, size_t len) return 0; } -static -int brcmf_pcie_get_fwname(struct device *dev, const char *ext, u8 *fw_name) -+static int brcmf_pcie_get_clm(struct device *dev, const struct firmware **fw) ++static int brcmf_pcie_get_blob(struct device *dev, const struct firmware **fw, ++ enum brcmf_blob_type type) { struct brcmf_bus *bus_if = dev_get_drvdata(dev); - struct brcmf_fw_request *fwreq; @@ -138,26 +153,32 @@ index aed49416c..ea8776fd2 100644 - fwnames, ARRAY_SIZE(fwnames)); - if (!fwreq) - return -ENOMEM; -+ if (!devinfo->clm_fw) { ++ switch (type) { ++ case BRCMF_BLOB_CLM: ++ *fw = devinfo->clm_fw; ++ devinfo->clm_fw = NULL; ++ break; ++ default: + return -ENOENT; + } ++ ++ if (!*fw) ++ return -ENOENT; - kfree(fwreq); -+ *fw = devinfo->clm_fw; -+ devinfo->clm_fw = NULL; return 0; } -@@ -1470,7 +1468,7 @@ static const struct brcmf_bus_ops brcmf_pcie_bus_ops = { +@@ -1470,7 +1475,7 @@ static const struct brcmf_bus_ops brcmf_pcie_bus_ops = { .wowl_config = brcmf_pcie_wowl_config, .get_ramsize = brcmf_pcie_get_ramsize, .get_memdump = brcmf_pcie_get_memdump, - .get_fwname = brcmf_pcie_get_fwname, -+ .get_clm = brcmf_pcie_get_clm, ++ .get_blob = brcmf_pcie_get_blob, .reset = brcmf_pcie_reset, }; -@@ -1755,6 +1753,7 @@ static const struct brcmf_buscore_ops brcmf_pcie_buscore_ops = { +@@ -1755,6 +1760,7 @@ static const struct brcmf_buscore_ops brcmf_pcie_buscore_ops = { #define BRCMF_PCIE_FW_CODE 0 #define BRCMF_PCIE_FW_NVRAM 1 @@ -165,7 +186,7 @@ index aed49416c..ea8776fd2 100644 static void brcmf_pcie_setup(struct device *dev, int ret, struct brcmf_fw_request *fwreq) -@@ -1779,6 +1778,7 @@ static void brcmf_pcie_setup(struct device *dev, int ret, +@@ -1779,6 +1785,7 @@ static void brcmf_pcie_setup(struct device *dev, int ret, fw = fwreq->items[BRCMF_PCIE_FW_CODE].binary; nvram = fwreq->items[BRCMF_PCIE_FW_NVRAM].nv_data.data; nvram_len = fwreq->items[BRCMF_PCIE_FW_NVRAM].nv_data.len; @@ -173,7 +194,7 @@ index aed49416c..ea8776fd2 100644 kfree(fwreq); ret = brcmf_chip_get_raminfo(devinfo->ci); -@@ -1855,6 +1855,7 @@ brcmf_pcie_prepare_fw_request(struct brcmf_pciedev_info *devinfo) +@@ -1855,6 +1862,7 @@ brcmf_pcie_prepare_fw_request(struct brcmf_pciedev_info *devinfo) struct brcmf_fw_name fwnames[] = { { ".bin", devinfo->fw_name }, { ".txt", devinfo->nvram_name }, @@ -181,7 +202,7 @@ index aed49416c..ea8776fd2 100644 }; fwreq = brcmf_fw_alloc_request(devinfo->ci->chip, devinfo->ci->chiprev, -@@ -1867,6 +1868,8 @@ brcmf_pcie_prepare_fw_request(struct brcmf_pciedev_info *devinfo) +@@ -1867,6 +1875,8 @@ brcmf_pcie_prepare_fw_request(struct brcmf_pciedev_info *devinfo) fwreq->items[BRCMF_PCIE_FW_CODE].type = BRCMF_FW_TYPE_BINARY; fwreq->items[BRCMF_PCIE_FW_NVRAM].type = BRCMF_FW_TYPE_NVRAM; fwreq->items[BRCMF_PCIE_FW_NVRAM].flags = BRCMF_FW_REQF_OPTIONAL; @@ -190,7 +211,7 @@ index aed49416c..ea8776fd2 100644 fwreq->board_type = devinfo->settings->board_type; /* NVRAM reserves PCI domain 0 for Broadcom's SDK faked bus */ fwreq->domain_nr = pci_domain_nr(devinfo->pdev->bus) + 1; -@@ -2005,6 +2008,7 @@ brcmf_pcie_remove(struct pci_dev *pdev) +@@ -2005,6 +2015,7 @@ brcmf_pcie_remove(struct pci_dev *pdev) brcmf_pcie_release_ringbuffers(devinfo); brcmf_pcie_reset_device(devinfo); brcmf_pcie_release_resource(devinfo); @@ -199,16 +220,17 @@ index aed49416c..ea8776fd2 100644 if (devinfo->ci) brcmf_chip_detach(devinfo->ci); diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c -index 5d156e591..593ddd237 100644 +index 5d156e591..7466e6fd6 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c -@@ -4129,23 +4129,17 @@ brcmf_sdio_watchdog(struct timer_list *t) +@@ -4129,23 +4129,24 @@ brcmf_sdio_watchdog(struct timer_list *t) } } -static -int brcmf_sdio_get_fwname(struct device *dev, const char *ext, u8 *fw_name) -+static int brcmf_sdio_get_clm(struct device *dev, const struct firmware **fw) ++static int brcmf_sdio_get_blob(struct device *dev, const struct firmware **fw, ++ enum brcmf_blob_type type) { struct brcmf_bus *bus_if = dev_get_drvdata(dev); - struct brcmf_fw_request *fwreq; @@ -223,22 +245,28 @@ index 5d156e591..593ddd237 100644 - fwnames, ARRAY_SIZE(fwnames)); - if (!fwreq) - return -ENOMEM; -+ if (!sdiodev->clm_fw) { ++ switch (type) { ++ case BRCMF_BLOB_CLM: ++ *fw = sdiodev->clm_fw; ++ sdiodev->clm_fw = NULL; ++ break; ++ default: + return -ENOENT; + } ++ ++ if (!*fw) ++ return -ENOENT; - kfree(fwreq); -+ *fw = sdiodev->clm_fw; -+ sdiodev->clm_fw = NULL; return 0; } -@@ -4188,13 +4182,14 @@ static const struct brcmf_bus_ops brcmf_sdio_bus_ops = { +@@ -4188,13 +4189,14 @@ static const struct brcmf_bus_ops brcmf_sdio_bus_ops = { .wowl_config = brcmf_sdio_wowl_config, .get_ramsize = brcmf_sdio_bus_get_ramsize, .get_memdump = brcmf_sdio_bus_get_memdump, - .get_fwname = brcmf_sdio_get_fwname, -+ .get_clm = brcmf_sdio_get_clm, ++ .get_blob = brcmf_sdio_get_blob, .debugfs_create = brcmf_sdio_debugfs_create, .reset = brcmf_sdio_bus_reset }; @@ -249,7 +277,7 @@ index 5d156e591..593ddd237 100644 static void brcmf_sdio_firmware_callback(struct device *dev, int err, struct brcmf_fw_request *fwreq) -@@ -4217,6 +4212,7 @@ static void brcmf_sdio_firmware_callback(struct device *dev, int err, +@@ -4217,6 +4219,7 @@ static void brcmf_sdio_firmware_callback(struct device *dev, int err, code = fwreq->items[BRCMF_SDIO_FW_CODE].binary; nvram = fwreq->items[BRCMF_SDIO_FW_NVRAM].nv_data.data; nvram_len = fwreq->items[BRCMF_SDIO_FW_NVRAM].nv_data.len; @@ -257,7 +285,7 @@ index 5d156e591..593ddd237 100644 kfree(fwreq); /* try to download image and nvram to the dongle */ -@@ -4415,6 +4411,7 @@ brcmf_sdio_prepare_fw_request(struct brcmf_sdio *bus) +@@ -4415,6 +4418,7 @@ brcmf_sdio_prepare_fw_request(struct brcmf_sdio *bus) struct brcmf_fw_name fwnames[] = { { ".bin", bus->sdiodev->fw_name }, { ".txt", bus->sdiodev->nvram_name }, @@ -265,7 +293,7 @@ index 5d156e591..593ddd237 100644 }; fwreq = brcmf_fw_alloc_request(bus->ci->chip, bus->ci->chiprev, -@@ -4426,6 +4423,8 @@ brcmf_sdio_prepare_fw_request(struct brcmf_sdio *bus) +@@ -4426,6 +4430,8 @@ brcmf_sdio_prepare_fw_request(struct brcmf_sdio *bus) fwreq->items[BRCMF_SDIO_FW_CODE].type = BRCMF_FW_TYPE_BINARY; fwreq->items[BRCMF_SDIO_FW_NVRAM].type = BRCMF_FW_TYPE_NVRAM; @@ -274,7 +302,7 @@ index 5d156e591..593ddd237 100644 fwreq->board_type = bus->sdiodev->settings->board_type; return fwreq; -@@ -4582,6 +4581,8 @@ void brcmf_sdio_remove(struct brcmf_sdio *bus) +@@ -4582,6 +4588,8 @@ void brcmf_sdio_remove(struct brcmf_sdio *bus) if (bus->sdiodev->settings) brcmf_release_module_param(bus->sdiodev->settings); @@ -300,16 +328,17 @@ index 15d2c02fa..7b74c295e 100644 /* sdio core registers */ diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c -index 9fb68c2dc..b8a8bf774 100644 +index 9fb68c2dc..85e18fb9c 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c -@@ -1154,24 +1154,10 @@ struct brcmf_usbdev *brcmf_usb_attach(struct brcmf_usbdev_info *devinfo, +@@ -1154,24 +1154,11 @@ struct brcmf_usbdev *brcmf_usb_attach(struct brcmf_usbdev_info *devinfo, return NULL; } -static -int brcmf_usb_get_fwname(struct device *dev, const char *ext, u8 *fw_name) -+static int brcmf_usb_get_clm(struct device *dev, const struct firmware **fw) ++static int brcmf_usb_get_blob(struct device *dev, const struct firmware **fw, ++ enum brcmf_blob_type type) { - struct brcmf_bus *bus = dev_get_drvdata(dev); - struct brcmf_fw_request *fwreq; @@ -326,17 +355,17 @@ index 9fb68c2dc..b8a8bf774 100644 - - kfree(fwreq); - return 0; -+ /* No CLM blobs for USB devices... */ ++ /* No blobs for USB devices... */ + return -ENOENT; } static const struct brcmf_bus_ops brcmf_usb_bus_ops = { -@@ -1180,7 +1166,7 @@ static const struct brcmf_bus_ops brcmf_usb_bus_ops = { +@@ -1180,7 +1167,7 @@ static const struct brcmf_bus_ops brcmf_usb_bus_ops = { .txdata = brcmf_usb_tx, .txctl = brcmf_usb_tx_ctlpkt, .rxctl = brcmf_usb_rx_ctlpkt, - .get_fwname = brcmf_usb_get_fwname, -+ .get_clm = brcmf_usb_get_clm, ++ .get_blob = brcmf_usb_get_blob, }; #define BRCMF_USB_FW_CODE 0 diff --git a/8005-brcmfmac-firmware-Support-passing-in-multiple-board_.patch b/8005-brcmfmac-firmware-Support-passing-in-multiple-board_.patch index 74828a8..d4108a5 100644 --- a/8005-brcmfmac-firmware-Support-passing-in-multiple-board_.patch +++ b/8005-brcmfmac-firmware-Support-passing-in-multiple-board_.patch @@ -1,7 +1,7 @@ -From f7df4e463c323eaf303ca4d1a6721c8458a8cdd1 Mon Sep 17 00:00:00 2001 +From 880d3f98041005210a332974c3b19e0116e14053 Mon Sep 17 00:00:00 2001 From: Hector Martin Date: Tue, 21 Dec 2021 17:38:37 +0900 -Subject: [PATCH 05/30] brcmfmac: firmware: Support passing in multiple +Subject: [PATCH 05/34] brcmfmac: firmware: Support passing in multiple board_types In order to make use of the multiple alt_path functionality, change @@ -94,10 +94,10 @@ index e290dec9c..d94a1d5be 100644 }; diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c -index ea8776fd2..cdfb32d6f 100644 +index ab0503c6f..0e4ba33fb 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c -@@ -1870,11 +1870,16 @@ brcmf_pcie_prepare_fw_request(struct brcmf_pciedev_info *devinfo) +@@ -1877,11 +1877,16 @@ brcmf_pcie_prepare_fw_request(struct brcmf_pciedev_info *devinfo) fwreq->items[BRCMF_PCIE_FW_NVRAM].flags = BRCMF_FW_REQF_OPTIONAL; fwreq->items[BRCMF_PCIE_FW_CLM].type = BRCMF_FW_TYPE_BINARY; fwreq->items[BRCMF_PCIE_FW_CLM].flags = BRCMF_FW_REQF_OPTIONAL; @@ -116,10 +116,10 @@ index ea8776fd2..cdfb32d6f 100644 } diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c -index 593ddd237..637aef30c 100644 +index 7466e6fd6..32f457bf0 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c -@@ -4425,7 +4425,9 @@ brcmf_sdio_prepare_fw_request(struct brcmf_sdio *bus) +@@ -4432,7 +4432,9 @@ brcmf_sdio_prepare_fw_request(struct brcmf_sdio *bus) fwreq->items[BRCMF_SDIO_FW_NVRAM].type = BRCMF_FW_TYPE_NVRAM; fwreq->items[BRCMF_SDIO_FW_CLM].type = BRCMF_FW_TYPE_BINARY; fwreq->items[BRCMF_SDIO_FW_CLM].flags = BRCMF_FW_REQF_OPTIONAL; diff --git a/8006-brcmfmac-pcie-Read-Apple-OTP-information.patch b/8006-brcmfmac-pcie-Read-Apple-OTP-information.patch index 86e9806..71ec737 100644 --- a/8006-brcmfmac-pcie-Read-Apple-OTP-information.patch +++ b/8006-brcmfmac-pcie-Read-Apple-OTP-information.patch @@ -1,7 +1,7 @@ -From 5e341c53e88383a998f3618e999762f660a26c02 Mon Sep 17 00:00:00 2001 +From 18b840ed5dc7084d4ba83345a63a7f5f33cec013 Mon Sep 17 00:00:00 2001 From: Hector Martin Date: Tue, 21 Dec 2021 17:26:34 +0900 -Subject: [PATCH 06/30] brcmfmac: pcie: Read Apple OTP information +Subject: [PATCH 06/34] brcmfmac: pcie: Read Apple OTP information On Apple platforms, the One Time Programmable ROM in the Broadcom chips contains information about the specific board design (module, vendor, @@ -18,7 +18,7 @@ Signed-off-by: Hector Martin 2 files changed, 222 insertions(+) diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c -index cdfb32d6f..3cc79d912 100644 +index 0e4ba33fb..0f19fc9b1 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c @@ -255,6 +255,15 @@ struct brcmf_pcie_core_info { @@ -70,7 +70,7 @@ index cdfb32d6f..3cc79d912 100644 #define WRITECC32(devinfo, reg, value) brcmf_pcie_write_reg32(devinfo, \ CHIPCREGOFFS(reg), value) -@@ -1751,6 +1772,200 @@ static const struct brcmf_buscore_ops brcmf_pcie_buscore_ops = { +@@ -1758,6 +1779,200 @@ static const struct brcmf_buscore_ops brcmf_pcie_buscore_ops = { .write32 = brcmf_pcie_buscore_write32, }; @@ -271,7 +271,7 @@ index cdfb32d6f..3cc79d912 100644 #define BRCMF_PCIE_FW_CODE 0 #define BRCMF_PCIE_FW_NVRAM 1 #define BRCMF_PCIE_FW_CLM 2 -@@ -1951,6 +2166,12 @@ brcmf_pcie_probe(struct pci_dev *pdev, const struct pci_device_id *id) +@@ -1958,6 +2173,12 @@ brcmf_pcie_probe(struct pci_dev *pdev, const struct pci_device_id *id) if (ret) goto fail_bus; diff --git a/8007-brcmfmac-of-Fetch-Apple-properties.patch b/8007-brcmfmac-of-Fetch-Apple-properties.patch index 35767cd..76dde1e 100644 --- a/8007-brcmfmac-of-Fetch-Apple-properties.patch +++ b/8007-brcmfmac-of-Fetch-Apple-properties.patch @@ -1,7 +1,7 @@ -From 5a9d560acd1ed5a2b1d16c124aba6ff3f2205483 Mon Sep 17 00:00:00 2001 +From c42886eecdf0752c2525bb9f24a4a1db862fdd18 Mon Sep 17 00:00:00 2001 From: Hector Martin Date: Tue, 21 Dec 2021 17:27:19 +0900 -Subject: [PATCH 07/30] brcmfmac: of: Fetch Apple properties +Subject: [PATCH 07/34] brcmfmac: of: Fetch Apple properties On Apple ARM64 platforms, firmware selection requires two properties that come from system firmware: the module-instance (aka "island", a diff --git a/8008-brcmfmac-pcie-Perform-firmware-selection-for-Apple-p.patch b/8008-brcmfmac-pcie-Perform-firmware-selection-for-Apple-p.patch index faac517..fddac07 100644 --- a/8008-brcmfmac-pcie-Perform-firmware-selection-for-Apple-p.patch +++ b/8008-brcmfmac-pcie-Perform-firmware-selection-for-Apple-p.patch @@ -1,7 +1,7 @@ -From 9d6841d0ecb677e20436d60f6d82fb006613972b Mon Sep 17 00:00:00 2001 +From 2ea0163cdf39c28e923961180b8dd158467a3751 Mon Sep 17 00:00:00 2001 From: Hector Martin Date: Tue, 21 Dec 2021 17:45:21 +0900 -Subject: [PATCH 08/30] brcmfmac: pcie: Perform firmware selection for Apple +Subject: [PATCH 08/34] brcmfmac: pcie: Perform firmware selection for Apple platforms On Apple platforms, firmware selection uses the following elements: @@ -77,10 +77,10 @@ Signed-off-by: Hector Martin 1 file changed, 63 insertions(+), 5 deletions(-) diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c -index 3cc79d912..42b3c17ba 100644 +index 0f19fc9b1..4f14b261a 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c -@@ -2089,11 +2089,69 @@ brcmf_pcie_prepare_fw_request(struct brcmf_pciedev_info *devinfo) +@@ -2096,11 +2096,69 @@ brcmf_pcie_prepare_fw_request(struct brcmf_pciedev_info *devinfo) fwreq->domain_nr = pci_domain_nr(devinfo->pdev->bus) + 1; fwreq->bus_nr = devinfo->pdev->bus->number; diff --git a/8009-brcmfmac-firmware-Allow-platform-to-override-macaddr.patch b/8009-brcmfmac-firmware-Allow-platform-to-override-macaddr.patch index c2cd901..92cecd8 100644 --- a/8009-brcmfmac-firmware-Allow-platform-to-override-macaddr.patch +++ b/8009-brcmfmac-firmware-Allow-platform-to-override-macaddr.patch @@ -1,7 +1,7 @@ -From 3b481da6295a389716c2d8fcfb4b5b87a0ef4103 Mon Sep 17 00:00:00 2001 +From dd4b327a30697ddad3819ca145d4ce319b7cf528 Mon Sep 17 00:00:00 2001 From: Hector Martin Date: Thu, 23 Dec 2021 22:32:08 +0900 -Subject: [PATCH 09/30] brcmfmac: firmware: Allow platform to override macaddr +Subject: [PATCH 09/34] brcmfmac: firmware: Allow platform to override macaddr On Device Tree platforms, it is customary to be able to set the MAC address via the Device Tree, as it is often stored in system firmware. diff --git a/8010-brcmfmac-msgbuf-Increase-RX-ring-sizes-to-1024.patch b/8010-brcmfmac-msgbuf-Increase-RX-ring-sizes-to-1024.patch index bf62fd7..c653193 100644 --- a/8010-brcmfmac-msgbuf-Increase-RX-ring-sizes-to-1024.patch +++ b/8010-brcmfmac-msgbuf-Increase-RX-ring-sizes-to-1024.patch @@ -1,7 +1,7 @@ -From 037883f3157a508078ffcaf336475645fa373f6a Mon Sep 17 00:00:00 2001 +From 531b129464e6f498270c8283f547d65fad32b1fb Mon Sep 17 00:00:00 2001 From: Hector Martin Date: Tue, 21 Dec 2021 17:39:04 +0900 -Subject: [PATCH 10/30] brcmfmac: msgbuf: Increase RX ring sizes to 1024 +Subject: [PATCH 10/34] brcmfmac: msgbuf: Increase RX ring sizes to 1024 Newer chips used on Apple platforms have more than max_rxbufpost greater than 512, which causes warnings when brcmf_msgbuf_rxbuf_data_fill tries diff --git a/8011-brcmfmac-pcie-Fix-crashes-due-to-early-IRQs.patch b/8011-brcmfmac-pcie-Fix-crashes-due-to-early-IRQs.patch index 47cc417..3650e06 100644 --- a/8011-brcmfmac-pcie-Fix-crashes-due-to-early-IRQs.patch +++ b/8011-brcmfmac-pcie-Fix-crashes-due-to-early-IRQs.patch @@ -1,7 +1,7 @@ -From caea8fe9c9524950fedd3b317a05556dca105403 Mon Sep 17 00:00:00 2001 +From 60efee55336f83bb968713686bfd2c90d9b23733 Mon Sep 17 00:00:00 2001 From: Hector Martin Date: Tue, 21 Dec 2021 17:44:00 +0900 -Subject: [PATCH 11/30] brcmfmac: pcie: Fix crashes due to early IRQs +Subject: [PATCH 11/34] brcmfmac: pcie: Fix crashes due to early IRQs The driver was enabling IRQs before the message processing was initialized. This could cause IRQs to come in too early and crash the @@ -15,7 +15,7 @@ Signed-off-by: Hector Martin 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c -index 42b3c17ba..a4b49d175 100644 +index 4f14b261a..7190b7b80 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c @@ -1380,6 +1380,20 @@ static void brcmf_pcie_down(struct device *dev) @@ -39,7 +39,7 @@ index 42b3c17ba..a4b49d175 100644 static int brcmf_pcie_tx(struct device *dev, struct sk_buff *skb) { return 0; -@@ -1482,6 +1496,7 @@ static int brcmf_pcie_reset(struct device *dev) +@@ -1489,6 +1503,7 @@ static int brcmf_pcie_reset(struct device *dev) } static const struct brcmf_bus_ops brcmf_pcie_bus_ops = { @@ -47,7 +47,7 @@ index 42b3c17ba..a4b49d175 100644 .txdata = brcmf_pcie_tx, .stop = brcmf_pcie_down, .txctl = brcmf_pcie_tx_ctlpkt, -@@ -2048,9 +2063,6 @@ static void brcmf_pcie_setup(struct device *dev, int ret, +@@ -2055,9 +2070,6 @@ static void brcmf_pcie_setup(struct device *dev, int ret, init_waitqueue_head(&devinfo->mbdata_resp_wait); diff --git a/8012-brcmfmac-pcie-Support-PCIe-core-revisions-64.patch b/8012-brcmfmac-pcie-Support-PCIe-core-revisions-64.patch index f29f908..4aa472f 100644 --- a/8012-brcmfmac-pcie-Support-PCIe-core-revisions-64.patch +++ b/8012-brcmfmac-pcie-Support-PCIe-core-revisions-64.patch @@ -1,7 +1,7 @@ -From fa24c7e164edae9afea03d4af6264e0151b42649 Mon Sep 17 00:00:00 2001 +From 6de1197eadd384f977934fb85061db7108f0c86d Mon Sep 17 00:00:00 2001 From: Hector Martin Date: Tue, 21 Dec 2021 17:25:35 +0900 -Subject: [PATCH 12/30] brcmfmac: pcie: Support PCIe core revisions >= 64 +Subject: [PATCH 12/34] brcmfmac: pcie: Support PCIe core revisions >= 64 These newer PCIe core revisions include new sets of registers that must be used instead of the legacy ones. Introduce a brcmf_pcie_reginfo to @@ -14,7 +14,7 @@ Signed-off-by: Hector Martin 1 file changed, 107 insertions(+), 20 deletions(-) diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c -index a4b49d175..4a6370efb 100644 +index 7190b7b80..01c7b2703 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c @@ -117,6 +117,14 @@ static const struct brcmf_firmware_mapping brcmf_pcie_fwnames[] = { @@ -204,7 +204,7 @@ index a4b49d175..4a6370efb 100644 return 0; } -@@ -1756,15 +1829,22 @@ static int brcmf_pcie_buscoreprep(void *ctx) +@@ -1763,15 +1836,22 @@ static int brcmf_pcie_buscoreprep(void *ctx) static int brcmf_pcie_buscore_reset(void *ctx, struct brcmf_chip *chip) { struct brcmf_pciedev_info *devinfo = (struct brcmf_pciedev_info *)ctx; @@ -231,7 +231,7 @@ index a4b49d175..4a6370efb 100644 return 0; } -@@ -2176,6 +2256,7 @@ brcmf_pcie_probe(struct pci_dev *pdev, const struct pci_device_id *id) +@@ -2183,6 +2263,7 @@ brcmf_pcie_probe(struct pci_dev *pdev, const struct pci_device_id *id) struct brcmf_pciedev_info *devinfo; struct brcmf_pciedev *pcie_bus_dev; struct brcmf_bus *bus; @@ -239,7 +239,7 @@ index a4b49d175..4a6370efb 100644 brcmf_dbg(PCIE, "Enter %x:%x\n", pdev->vendor, pdev->device); -@@ -2194,6 +2275,12 @@ brcmf_pcie_probe(struct pci_dev *pdev, const struct pci_device_id *id) +@@ -2201,6 +2282,12 @@ brcmf_pcie_probe(struct pci_dev *pdev, const struct pci_device_id *id) goto fail; } @@ -252,7 +252,7 @@ index a4b49d175..4a6370efb 100644 pcie_bus_dev = kzalloc(sizeof(*pcie_bus_dev), GFP_KERNEL); if (pcie_bus_dev == NULL) { ret = -ENOMEM; -@@ -2362,7 +2449,7 @@ static int brcmf_pcie_pm_leave_D3(struct device *dev) +@@ -2369,7 +2456,7 @@ static int brcmf_pcie_pm_leave_D3(struct device *dev) brcmf_dbg(PCIE, "Enter, dev=%p, bus=%p\n", dev, bus); /* Check if device is still up and running, if so we are ready */ diff --git a/8013-brcmfmac-pcie-Add-IDs-properties-for-BCM4378.patch b/8013-brcmfmac-pcie-Add-IDs-properties-for-BCM4378.patch index 477dbdf..e7a874b 100644 --- a/8013-brcmfmac-pcie-Add-IDs-properties-for-BCM4378.patch +++ b/8013-brcmfmac-pcie-Add-IDs-properties-for-BCM4378.patch @@ -1,7 +1,7 @@ -From 395b965fa51c7ad26284c6fefd7d05c3339bb24d Mon Sep 17 00:00:00 2001 +From d37f0e2bd8a981c82aaec33c4916b216a245d87c Mon Sep 17 00:00:00 2001 From: Hector Martin Date: Tue, 21 Dec 2021 17:46:40 +0900 -Subject: [PATCH 13/30] brcmfmac: pcie: Add IDs/properties for BCM4378 +Subject: [PATCH 13/34] brcmfmac: pcie: Add IDs/properties for BCM4378 This chip is present on Apple M1 (t8103) platforms: @@ -32,7 +32,7 @@ index 1ee49f9e3..56a6f4168 100644 brcmf_err("unknown chip: %s\n", ci->pub.name); break; diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c -index 4a6370efb..785090570 100644 +index 01c7b2703..e1bc7e4a9 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c @@ -58,6 +58,7 @@ BRCMF_FW_DEF(4365C, "brcmfmac4365c-pcie"); @@ -51,7 +51,7 @@ index 4a6370efb..785090570 100644 }; #define BRCMF_PCIE_FW_UP_TIMEOUT 5000 /* msec */ -@@ -2008,6 +2010,11 @@ static int brcmf_pcie_read_otp(struct brcmf_pciedev_info *devinfo) +@@ -2015,6 +2017,11 @@ static int brcmf_pcie_read_otp(struct brcmf_pciedev_info *devinfo) int ret; switch (devinfo->ci->chip) { @@ -63,7 +63,7 @@ index 4a6370efb..785090570 100644 default: /* OTP not supported on this chip */ return 0; -@@ -2515,6 +2522,7 @@ static const struct pci_device_id brcmf_pcie_devid_table[] = { +@@ -2522,6 +2529,7 @@ static const struct pci_device_id brcmf_pcie_devid_table[] = { BRCMF_PCIE_DEVICE(BRCM_PCIE_4366_2G_DEVICE_ID), BRCMF_PCIE_DEVICE(BRCM_PCIE_4366_5G_DEVICE_ID), BRCMF_PCIE_DEVICE(BRCM_PCIE_4371_DEVICE_ID), diff --git a/8014-ACPI-property-Support-strings-in-Apple-_DSM-props.patch b/8014-ACPI-property-Support-strings-in-Apple-_DSM-props.patch index a8cb181..5cb777d 100644 --- a/8014-ACPI-property-Support-strings-in-Apple-_DSM-props.patch +++ b/8014-ACPI-property-Support-strings-in-Apple-_DSM-props.patch @@ -1,7 +1,7 @@ -From d7efc0ae360df39dea3a843fb7bd57127652f728 Mon Sep 17 00:00:00 2001 +From 599bfcd71c7c6b995db7a4453e03244d032b4317 Mon Sep 17 00:00:00 2001 From: Hector Martin Date: Thu, 23 Dec 2021 19:51:11 +0900 -Subject: [PATCH 14/30] ACPI / property: Support strings in Apple _DSM props +Subject: [PATCH 14/34] ACPI / property: Support strings in Apple _DSM props The Wi-Fi module in Apple machines has a "module-instance" device property that specifies the platform type and is used for firmware diff --git a/8015-brcmfmac-acpi-Add-support-for-fetching-Apple-ACPI-pr.patch b/8015-brcmfmac-acpi-Add-support-for-fetching-Apple-ACPI-pr.patch index 2610a95..14f0f98 100644 --- a/8015-brcmfmac-acpi-Add-support-for-fetching-Apple-ACPI-pr.patch +++ b/8015-brcmfmac-acpi-Add-support-for-fetching-Apple-ACPI-pr.patch @@ -1,7 +1,7 @@ -From 5aa741e9fbe7650a4018be84e6a3b60905625107 Mon Sep 17 00:00:00 2001 +From ebdaee11be6e18ea1952a72a4a9ef80ca4228b7d Mon Sep 17 00:00:00 2001 From: Hector Martin Date: Thu, 23 Dec 2021 19:51:36 +0900 -Subject: [PATCH 15/30] brcmfmac: acpi: Add support for fetching Apple ACPI +Subject: [PATCH 15/34] brcmfmac: acpi: Add support for fetching Apple ACPI properties On DT platforms, the module-instance and antenna-sku-info properties @@ -91,7 +91,7 @@ index 000000000..b70cd6970 + } +} diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c -index ec4cb7050..0151d129c 100644 +index b8ed85112..c84c48e49 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c @@ -437,6 +437,7 @@ struct brcmf_mp_device *brcmf_get_module_param(struct device *dev, diff --git a/8016-brcmfmac-pcie-Provide-a-buffer-of-random-bytes-to-th.patch b/8016-brcmfmac-pcie-Provide-a-buffer-of-random-bytes-to-th.patch index b8281cd..ab7fba4 100644 --- a/8016-brcmfmac-pcie-Provide-a-buffer-of-random-bytes-to-th.patch +++ b/8016-brcmfmac-pcie-Provide-a-buffer-of-random-bytes-to-th.patch @@ -1,7 +1,7 @@ -From 7d0f1f3475206fe2a37ee9e3180783d1c72daaaa Mon Sep 17 00:00:00 2001 +From 3ecb57b6628211ef42a6267f17a1d5c5fcecd012 Mon Sep 17 00:00:00 2001 From: Hector Martin Date: Thu, 23 Dec 2021 19:30:17 +0900 -Subject: [PATCH 16/30] brcmfmac: pcie: Provide a buffer of random bytes to the +Subject: [PATCH 16/34] brcmfmac: pcie: Provide a buffer of random bytes to the device Newer Apple firmwares on chipsets without a hardware RNG require the @@ -18,7 +18,7 @@ Signed-off-by: Hector Martin 1 file changed, 31 insertions(+) diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c -index 785090570..bd55f5a30 100644 +index e1bc7e4a9..b71952254 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c @@ -12,6 +12,7 @@ @@ -29,7 +29,7 @@ index 785090570..bd55f5a30 100644 #include #include -@@ -1660,6 +1661,13 @@ brcmf_pcie_init_share_ram_info(struct brcmf_pciedev_info *devinfo, +@@ -1667,6 +1668,13 @@ brcmf_pcie_init_share_ram_info(struct brcmf_pciedev_info *devinfo, return 0; } @@ -43,7 +43,7 @@ index 785090570..bd55f5a30 100644 static int brcmf_pcie_download_fw_nvram(struct brcmf_pciedev_info *devinfo, const struct firmware *fw, void *nvram, -@@ -1691,11 +1699,34 @@ static int brcmf_pcie_download_fw_nvram(struct brcmf_pciedev_info *devinfo, +@@ -1698,11 +1706,34 @@ static int brcmf_pcie_download_fw_nvram(struct brcmf_pciedev_info *devinfo, brcmf_pcie_write_ram32(devinfo, devinfo->ci->ramsize - 4, 0); if (nvram) { diff --git a/8017-brcmfmac-pcie-Add-IDs-properties-for-BCM4355.patch b/8017-brcmfmac-pcie-Add-IDs-properties-for-BCM4355.patch index 435b98c..fd724aa 100644 --- a/8017-brcmfmac-pcie-Add-IDs-properties-for-BCM4355.patch +++ b/8017-brcmfmac-pcie-Add-IDs-properties-for-BCM4355.patch @@ -1,7 +1,7 @@ -From 255bc66f8a00a5d100d82ccfeb162a59312c9609 Mon Sep 17 00:00:00 2001 +From e46046ce92838278ec265de9d662ca3ee0be8cef Mon Sep 17 00:00:00 2001 From: Hector Martin Date: Tue, 21 Dec 2021 17:50:15 +0900 -Subject: [PATCH 17/30] brcmfmac: pcie: Add IDs/properties for BCM4355 +Subject: [PATCH 17/34] brcmfmac: pcie: Add IDs/properties for BCM4355 This chip is present on at least these Apple T2 Macs: @@ -9,7 +9,6 @@ This chip is present on at least these Apple T2 Macs: * hawaii: MacBook Air 13" (True Tone, 2019) Signed-off-by: Hector Martin -[fixed otp base and words values] --- drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c | 1 + drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c | 8 ++++++++ @@ -29,7 +28,7 @@ index 56a6f4168..fdff7f5fc 100644 case CY_CC_4373_CHIP_ID: return 0x160000; diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c -index bd55f5a30..035656433 100644 +index b71952254..6d95c704f 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c @@ -49,6 +49,7 @@ enum brcmf_pcie_state { @@ -48,7 +47,7 @@ index bd55f5a30..035656433 100644 BRCMF_FW_ENTRY(BRCM_CC_4356_CHIP_ID, 0xFFFFFFFF, 4356), BRCMF_FW_ENTRY(BRCM_CC_43567_CHIP_ID, 0xFFFFFFFF, 43570), BRCMF_FW_ENTRY(BRCM_CC_43569_CHIP_ID, 0xFFFFFFFF, 43570), -@@ -2041,6 +2043,11 @@ static int brcmf_pcie_read_otp(struct brcmf_pciedev_info *devinfo) +@@ -2048,6 +2050,11 @@ static int brcmf_pcie_read_otp(struct brcmf_pciedev_info *devinfo) int ret; switch (devinfo->ci->chip) { @@ -60,7 +59,7 @@ index bd55f5a30..035656433 100644 case BRCM_CC_4378_CHIP_ID: coreid = BCMA_CORE_GCI; base = 0x1120; -@@ -2535,6 +2542,7 @@ static const struct pci_device_id brcmf_pcie_devid_table[] = { +@@ -2542,6 +2549,7 @@ static const struct pci_device_id brcmf_pcie_devid_table[] = { BRCMF_PCIE_DEVICE(BRCM_PCIE_4350_DEVICE_ID), BRCMF_PCIE_DEVICE_SUB(0x4355, BRCM_PCIE_VENDOR_ID_BROADCOM, 0x4355), BRCMF_PCIE_DEVICE(BRCM_PCIE_4354_RAW_DEVICE_ID), diff --git a/8018-brcmfmac-pcie-Add-IDs-properties-for-BCM4377.patch b/8018-brcmfmac-pcie-Add-IDs-properties-for-BCM4377.patch index 935ceda..b66d097 100644 --- a/8018-brcmfmac-pcie-Add-IDs-properties-for-BCM4377.patch +++ b/8018-brcmfmac-pcie-Add-IDs-properties-for-BCM4377.patch @@ -1,7 +1,7 @@ -From 1a5efb5e8af74f3f349094dd52092c62aaf9b1b4 Mon Sep 17 00:00:00 2001 +From a014d5ec01f8b9084b55a368f5847105c5a87758 Mon Sep 17 00:00:00 2001 From: Hector Martin Date: Tue, 21 Dec 2021 17:51:31 +0900 -Subject: [PATCH 18/30] brcmfmac: pcie: Add IDs/properties for BCM4377 +Subject: [PATCH 18/34] brcmfmac: pcie: Add IDs/properties for BCM4377 This chip is present on at least these Apple T2 Macs: @@ -29,7 +29,7 @@ index fdff7f5fc..73ab96968 100644 case BRCM_CC_4378_CHIP_ID: return 0x352000; diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c -index 035656433..ca3c2a29d 100644 +index 6d95c704f..5b4a4cb33 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c @@ -60,6 +60,7 @@ BRCMF_FW_DEF(4365C, "brcmfmac4365c-pcie"); @@ -48,15 +48,15 @@ index 035656433..ca3c2a29d 100644 BRCMF_FW_ENTRY(BRCM_CC_4378_CHIP_ID, 0xFFFFFFFF, 4378B1), /* 3 */ }; -@@ -2048,6 +2050,7 @@ static int brcmf_pcie_read_otp(struct brcmf_pciedev_info *devinfo) - base = 0x800; - words = 0x112; +@@ -2055,6 +2057,7 @@ static int brcmf_pcie_read_otp(struct brcmf_pciedev_info *devinfo) + base = 0x8c0; + words = 0xb2; break; + case BRCM_CC_4377_CHIP_ID: case BRCM_CC_4378_CHIP_ID: coreid = BCMA_CORE_GCI; base = 0x1120; -@@ -2561,6 +2564,7 @@ static const struct pci_device_id brcmf_pcie_devid_table[] = { +@@ -2568,6 +2571,7 @@ static const struct pci_device_id brcmf_pcie_devid_table[] = { BRCMF_PCIE_DEVICE(BRCM_PCIE_4366_2G_DEVICE_ID), BRCMF_PCIE_DEVICE(BRCM_PCIE_4366_5G_DEVICE_ID), BRCMF_PCIE_DEVICE(BRCM_PCIE_4371_DEVICE_ID), diff --git a/8019-brcmfmac-pcie-Perform-correct-BCM4364-firmware-selec.patch b/8019-brcmfmac-pcie-Perform-correct-BCM4364-firmware-selec.patch index 743f2a3..f493ec5 100644 --- a/8019-brcmfmac-pcie-Perform-correct-BCM4364-firmware-selec.patch +++ b/8019-brcmfmac-pcie-Perform-correct-BCM4364-firmware-selec.patch @@ -1,7 +1,7 @@ -From 7f5b8ed753c3616f7e20ac7ed95aea7276483298 Mon Sep 17 00:00:00 2001 +From 680ef41dd2e00b3e891e62f5ed8a746e96b8567d Mon Sep 17 00:00:00 2001 From: Hector Martin Date: Tue, 21 Dec 2021 17:51:52 +0900 -Subject: [PATCH 19/30] brcmfmac: pcie: Perform correct BCM4364 firmware +Subject: [PATCH 19/34] brcmfmac: pcie: Perform correct BCM4364 firmware selection This chip exists in two revisions (B2=r3 and B3=r4) on different @@ -38,7 +38,7 @@ Signed-off-by: Hector Martin 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c -index ca3c2a29d..5bf67f1e6 100644 +index 5b4a4cb33..b6b789b49 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c @@ -54,7 +54,8 @@ BRCMF_FW_CLM_DEF(4356, "brcmfmac4356-pcie"); @@ -61,9 +61,9 @@ index ca3c2a29d..5bf67f1e6 100644 BRCMF_FW_ENTRY(BRCM_CC_4365_CHIP_ID, 0x0000000F, 4365B), BRCMF_FW_ENTRY(BRCM_CC_4365_CHIP_ID, 0xFFFFFFF0, 4365C), BRCMF_FW_ENTRY(BRCM_CC_4366_CHIP_ID, 0x0000000F, 4366B), -@@ -2050,6 +2052,11 @@ static int brcmf_pcie_read_otp(struct brcmf_pciedev_info *devinfo) - base = 0x800; - words = 0x112; +@@ -2057,6 +2059,11 @@ static int brcmf_pcie_read_otp(struct brcmf_pciedev_info *devinfo) + base = 0x8c0; + words = 0xb2; break; + case BRCM_CC_4364_CHIP_ID: + coreid = BCMA_CORE_CHIPCOMMON; diff --git a/8020-brcmfmac-chip-Only-disable-D11-cores-handle-an-arbit.patch b/8020-brcmfmac-chip-Only-disable-D11-cores-handle-an-arbit.patch index ace1e3e..45afc59 100644 --- a/8020-brcmfmac-chip-Only-disable-D11-cores-handle-an-arbit.patch +++ b/8020-brcmfmac-chip-Only-disable-D11-cores-handle-an-arbit.patch @@ -1,7 +1,7 @@ -From d1da7977d230e10a35a6f0744c37ffccc1c83631 Mon Sep 17 00:00:00 2001 +From 9600a63e7c36866faac8c458dc48ba9eb19032bc Mon Sep 17 00:00:00 2001 From: Hector Martin Date: Mon, 20 Dec 2021 20:00:57 +0900 -Subject: [PATCH 20/30] brcmfmac: chip: Only disable D11 cores; handle an +Subject: [PATCH 20/34] brcmfmac: chip: Only disable D11 cores; handle an arbitrary number At least on BCM4387, the D11 cores are held in reset on cold startup and diff --git a/8021-brcmfmac-chip-Handle-1024-unit-sizes-for-TCM-blocks.patch b/8021-brcmfmac-chip-Handle-1024-unit-sizes-for-TCM-blocks.patch index 0b295a0..00552b7 100644 --- a/8021-brcmfmac-chip-Handle-1024-unit-sizes-for-TCM-blocks.patch +++ b/8021-brcmfmac-chip-Handle-1024-unit-sizes-for-TCM-blocks.patch @@ -1,7 +1,7 @@ -From e80782889c8e9e319bbecc2da5d61514352d58d0 Mon Sep 17 00:00:00 2001 +From 505a2532e3795409d3f179ade118845992c30a14 Mon Sep 17 00:00:00 2001 From: Hector Martin Date: Tue, 21 Dec 2021 17:14:59 +0900 -Subject: [PATCH 21/30] brcmfmac: chip: Handle 1024-unit sizes for TCM blocks +Subject: [PATCH 21/34] brcmfmac: chip: Handle 1024-unit sizes for TCM blocks BCM4387 has trailing odd-sized blocks as part of TCM which have their size described as a multiple of 1024 instead of 8192. Handle this diff --git a/8022-brcmfmac-cfg80211-Add-support-for-scan-params-v2.patch b/8022-brcmfmac-cfg80211-Add-support-for-scan-params-v2.patch index afc8de6..e65acf3 100644 --- a/8022-brcmfmac-cfg80211-Add-support-for-scan-params-v2.patch +++ b/8022-brcmfmac-cfg80211-Add-support-for-scan-params-v2.patch @@ -1,7 +1,7 @@ -From 5ec28f818b9d53931d376c7b2fae8b81b4fa4a20 Mon Sep 17 00:00:00 2001 +From db9e401c2913bb2f8055ace80e99d1a5578a08b1 Mon Sep 17 00:00:00 2001 From: Hector Martin Date: Mon, 20 Dec 2021 03:39:44 +0900 -Subject: [PATCH 22/30] brcmfmac: cfg80211: Add support for scan params v2 +Subject: [PATCH 22/34] brcmfmac: cfg80211: Add support for scan params v2 This new API version is required for at least the BCM4387 firmware. Add support for it, with a fallback to the v1 API. diff --git a/8023-brcmfmac-feature-Add-support-for-setting-feats-based.patch b/8023-brcmfmac-feature-Add-support-for-setting-feats-based.patch index cf05461..5b6ee01 100644 --- a/8023-brcmfmac-feature-Add-support-for-setting-feats-based.patch +++ b/8023-brcmfmac-feature-Add-support-for-setting-feats-based.patch @@ -1,7 +1,7 @@ -From cd7d7bac040503d2d5389bf8392d0d82d47cc054 Mon Sep 17 00:00:00 2001 +From 150f44fdb2184e9bd9ceed6a05dcdfb9334d8924 Mon Sep 17 00:00:00 2001 From: Hector Martin Date: Mon, 20 Dec 2021 18:15:10 +0900 -Subject: [PATCH 23/30] brcmfmac: feature: Add support for setting feats based +Subject: [PATCH 23/34] brcmfmac: feature: Add support for setting feats based on WLC version The "wlc_ver" iovar returns information on the WLC and EPI versions. diff --git a/8024-brcmfmac-cfg80211-Add-support-for-PMKID_V3-operation.patch b/8024-brcmfmac-cfg80211-Add-support-for-PMKID_V3-operation.patch index 374b7da..91e551c 100644 --- a/8024-brcmfmac-cfg80211-Add-support-for-PMKID_V3-operation.patch +++ b/8024-brcmfmac-cfg80211-Add-support-for-PMKID_V3-operation.patch @@ -1,7 +1,7 @@ -From c2848618077ddc37b3e2e2ff2c22b8cc423822a6 Mon Sep 17 00:00:00 2001 +From b9bed13f0ee89343529d7d0cce615cffdbea972b Mon Sep 17 00:00:00 2001 From: Hector Martin Date: Mon, 20 Dec 2021 18:16:33 +0900 -Subject: [PATCH 24/30] brcmfmac: cfg80211: Add support for PMKID_V3 operations +Subject: [PATCH 24/34] brcmfmac: cfg80211: Add support for PMKID_V3 operations Add support for the new PMKID_V3 API, which allows performing PMKID mutations individually, instead of requiring the driver to keep track of diff --git a/8025-brcmfmac-cfg80211-Pass-the-PMK-in-binary-instead-of-.patch b/8025-brcmfmac-cfg80211-Pass-the-PMK-in-binary-instead-of-.patch index d11452e..2662165 100644 --- a/8025-brcmfmac-cfg80211-Pass-the-PMK-in-binary-instead-of-.patch +++ b/8025-brcmfmac-cfg80211-Pass-the-PMK-in-binary-instead-of-.patch @@ -1,7 +1,7 @@ -From a27a7388f9ad605b90998037d6e75910252bab4f Mon Sep 17 00:00:00 2001 +From bc717842356e7739ee9b58838592ef0e540d0b39 Mon Sep 17 00:00:00 2001 From: Hector Martin Date: Mon, 20 Dec 2021 19:15:58 +0900 -Subject: [PATCH 25/30] brcmfmac: cfg80211: Pass the PMK in binary instead of +Subject: [PATCH 25/34] brcmfmac: cfg80211: Pass the PMK in binary instead of hex Apparently the hex passphrase mechanism does not work on newer diff --git a/8026-brcmfmac-pcie-Add-IDs-properties-for-BCM4387.patch b/8026-brcmfmac-pcie-Add-IDs-properties-for-BCM4387.patch index ea1adce..a2bddae 100644 --- a/8026-brcmfmac-pcie-Add-IDs-properties-for-BCM4387.patch +++ b/8026-brcmfmac-pcie-Add-IDs-properties-for-BCM4387.patch @@ -1,7 +1,7 @@ -From 0ea5e8b30dffde17047f192085fe689eba8cd744 Mon Sep 17 00:00:00 2001 +From 534075f8cc83a2d5b57af7622e0bc03277e2aa84 Mon Sep 17 00:00:00 2001 From: Hector Martin Date: Tue, 21 Dec 2021 17:52:03 +0900 -Subject: [PATCH 26/30] brcmfmac: pcie: Add IDs/properties for BCM4387 +Subject: [PATCH 26/34] brcmfmac: pcie: Add IDs/properties for BCM4387 This chip is present on Apple M1 Pro/Max (t600x) platforms: @@ -31,7 +31,7 @@ index c4c80664b..f7ca9ff29 100644 brcmf_err("unknown chip: %s\n", ci->pub.name); break; diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c -index 5bf67f1e6..8778d9950 100644 +index b6b789b49..bc2a53812 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c @@ -63,6 +63,7 @@ BRCMF_FW_DEF(4366C, "brcmfmac4366c-pcie"); @@ -50,7 +50,7 @@ index 5bf67f1e6..8778d9950 100644 }; #define BRCMF_PCIE_FW_UP_TIMEOUT 5000 /* msec */ -@@ -2063,6 +2065,11 @@ static int brcmf_pcie_read_otp(struct brcmf_pciedev_info *devinfo) +@@ -2070,6 +2072,11 @@ static int brcmf_pcie_read_otp(struct brcmf_pciedev_info *devinfo) base = 0x1120; words = 0x170; break; @@ -62,7 +62,7 @@ index 5bf67f1e6..8778d9950 100644 default: /* OTP not supported on this chip */ return 0; -@@ -2573,6 +2580,7 @@ static const struct pci_device_id brcmf_pcie_devid_table[] = { +@@ -2580,6 +2587,7 @@ static const struct pci_device_id brcmf_pcie_devid_table[] = { BRCMF_PCIE_DEVICE(BRCM_PCIE_4371_DEVICE_ID), BRCMF_PCIE_DEVICE(BRCM_PCIE_4377_DEVICE_ID), BRCMF_PCIE_DEVICE(BRCM_PCIE_4378_DEVICE_ID), diff --git a/8027-brcmfmac-pcie-Replace-brcmf_pcie_copy_mem_todev-with.patch b/8027-brcmfmac-pcie-Replace-brcmf_pcie_copy_mem_todev-with.patch index ccc91e2..8453929 100644 --- a/8027-brcmfmac-pcie-Replace-brcmf_pcie_copy_mem_todev-with.patch +++ b/8027-brcmfmac-pcie-Replace-brcmf_pcie_copy_mem_todev-with.patch @@ -1,7 +1,7 @@ -From 09b15f594d459c1bc6b63d00c1b208021460e88e Mon Sep 17 00:00:00 2001 +From e5278ec18dc59d4c01afb60e706df41d7e83f1cf Mon Sep 17 00:00:00 2001 From: Hector Martin Date: Tue, 21 Dec 2021 17:39:28 +0900 -Subject: [PATCH 27/30] brcmfmac: pcie: Replace brcmf_pcie_copy_mem_todev with +Subject: [PATCH 27/34] brcmfmac: pcie: Replace brcmf_pcie_copy_mem_todev with memcpy_toio The alignment check was wrong (e.g. & 4 instead of & 3), and the logic @@ -19,7 +19,7 @@ Signed-off-by: Hector Martin 1 file changed, 6 insertions(+), 47 deletions(-) diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c -index 8778d9950..1e3d5e3c3 100644 +index bc2a53812..865e3f28c 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c @@ -14,6 +14,7 @@ @@ -78,7 +78,7 @@ index 8778d9950..1e3d5e3c3 100644 static void brcmf_pcie_copy_dev_tomem(struct brcmf_pciedev_info *devinfo, u32 mem_offset, void *dstaddr, u32 len) -@@ -1695,8 +1655,8 @@ static int brcmf_pcie_download_fw_nvram(struct brcmf_pciedev_info *devinfo, +@@ -1702,8 +1662,8 @@ static int brcmf_pcie_download_fw_nvram(struct brcmf_pciedev_info *devinfo, return err; brcmf_dbg(PCIE, "Download FW %s\n", devinfo->fw_name); @@ -89,7 +89,7 @@ index 8778d9950..1e3d5e3c3 100644 resetintr = get_unaligned_le32(fw->data); release_firmware(fw); -@@ -1717,7 +1677,7 @@ static int brcmf_pcie_download_fw_nvram(struct brcmf_pciedev_info *devinfo, +@@ -1724,7 +1684,7 @@ static int brcmf_pcie_download_fw_nvram(struct brcmf_pciedev_info *devinfo, brcmf_dbg(PCIE, "Download NVRAM %s\n", devinfo->nvram_name); address = devinfo->ci->rambase + devinfo->ci->ramsize - nvram_len; @@ -98,7 +98,7 @@ index 8778d9950..1e3d5e3c3 100644 brcmf_fw_nvram_free(nvram); /* -@@ -1727,13 +1687,12 @@ static int brcmf_pcie_download_fw_nvram(struct brcmf_pciedev_info *devinfo, +@@ -1734,13 +1694,12 @@ static int brcmf_pcie_download_fw_nvram(struct brcmf_pciedev_info *devinfo, brcmf_dbg(PCIE, "Download random seed\n"); address -= sizeof(footer); diff --git a/8028-brcmfmac-pcie-Read-the-console-on-init-and-shutdown.patch b/8028-brcmfmac-pcie-Read-the-console-on-init-and-shutdown.patch index d9445c3..56b0723 100644 --- a/8028-brcmfmac-pcie-Read-the-console-on-init-and-shutdown.patch +++ b/8028-brcmfmac-pcie-Read-the-console-on-init-and-shutdown.patch @@ -1,7 +1,7 @@ -From 1bfd02a475230d36d3d5663838784a11950f5231 Mon Sep 17 00:00:00 2001 +From f6f42c43e1301ba77fe6b4480007871b3a2da85c Mon Sep 17 00:00:00 2001 From: Hector Martin Date: Tue, 21 Dec 2021 17:43:03 +0900 -Subject: [PATCH 28/30] brcmfmac: pcie: Read the console on init and shutdown +Subject: [PATCH 28/34] brcmfmac: pcie: Read the console on init and shutdown This allows us to get console messages if the firmware crashed during early init, or if an operation failed and we're about to shut down. @@ -12,7 +12,7 @@ Signed-off-by: Hector Martin 1 file changed, 4 insertions(+) diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c -index 1e3d5e3c3..30802d922 100644 +index 865e3f28c..8b67cddb7 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c @@ -854,6 +854,8 @@ static void brcmf_pcie_bus_console_read(struct brcmf_pciedev_info *devinfo, @@ -24,7 +24,7 @@ index 1e3d5e3c3..30802d922 100644 addr = console->base_addr + BRCMF_CONSOLE_WRITEIDX_OFFSET; newidx = brcmf_pcie_read_tcm32(devinfo, addr); while (newidx != console->read_idx) { -@@ -1625,6 +1627,7 @@ brcmf_pcie_init_share_ram_info(struct brcmf_pciedev_info *devinfo, +@@ -1632,6 +1634,7 @@ brcmf_pcie_init_share_ram_info(struct brcmf_pciedev_info *devinfo, shared->max_rxbufpost, shared->rx_dataoffset); brcmf_pcie_bus_console_init(devinfo); @@ -32,7 +32,7 @@ index 1e3d5e3c3..30802d922 100644 return 0; } -@@ -2394,6 +2397,7 @@ brcmf_pcie_remove(struct pci_dev *pdev) +@@ -2401,6 +2404,7 @@ brcmf_pcie_remove(struct pci_dev *pdev) return; devinfo = bus->bus_priv.pcie->devinfo; diff --git a/8029-brcmfmac-pcie-Release-firmwares-in-the-brcmf_pcie_se.patch b/8029-brcmfmac-pcie-Release-firmwares-in-the-brcmf_pcie_se.patch index e90fa6c..4b32887 100644 --- a/8029-brcmfmac-pcie-Release-firmwares-in-the-brcmf_pcie_se.patch +++ b/8029-brcmfmac-pcie-Release-firmwares-in-the-brcmf_pcie_se.patch @@ -1,7 +1,7 @@ -From da1558f263300fcf9798e5c918aec9a90e65619b Mon Sep 17 00:00:00 2001 +From fbf132e816fb5ab9fc5e44be8a3ba78cdc5bb1e1 Mon Sep 17 00:00:00 2001 From: Hector Martin Date: Tue, 21 Dec 2021 17:44:51 +0900 -Subject: [PATCH 29/30] brcmfmac: pcie: Release firmwares in the +Subject: [PATCH 29/34] brcmfmac: pcie: Release firmwares in the brcmf_pcie_setup error path This avoids leaking memory if brcmf_chip_get_raminfo fails. Note that @@ -14,10 +14,10 @@ Signed-off-by: Hector Martin 1 file changed, 2 insertions(+) diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c -index 30802d922..293443a1c 100644 +index 8b67cddb7..f1b90b5e7 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c -@@ -2118,6 +2118,8 @@ static void brcmf_pcie_setup(struct device *dev, int ret, +@@ -2125,6 +2125,8 @@ static void brcmf_pcie_setup(struct device *dev, int ret, ret = brcmf_chip_get_raminfo(devinfo->ci); if (ret) { brcmf_err(bus, "Failed to get RAM info\n"); diff --git a/8031-brcmfmac-fwil-Constify-iovar-name-arguments.patch b/8031-brcmfmac-fwil-Constify-iovar-name-arguments.patch new file mode 100644 index 0000000..f8996cd --- /dev/null +++ b/8031-brcmfmac-fwil-Constify-iovar-name-arguments.patch @@ -0,0 +1,215 @@ +From 540d5a24c9b0c9a14dce5b59167628b9f18c27cd Mon Sep 17 00:00:00 2001 +From: Hector Martin +Date: Sun, 26 Dec 2021 00:24:02 +0900 +Subject: [PATCH 31/34] brcmfmac: fwil: Constify iovar name arguments + +Make all the iovar name arguments const char * instead of just char *. + +Signed-off-by: Hector Martin +--- + .../broadcom/brcm80211/brcmfmac/fwil.c | 34 +++++++++---------- + .../broadcom/brcm80211/brcmfmac/fwil.h | 28 +++++++-------- + 2 files changed, 31 insertions(+), 31 deletions(-) + +diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil.c +index d5578ca68..72fe8bce6 100644 +--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil.c ++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil.c +@@ -192,7 +192,7 @@ brcmf_fil_cmd_int_get(struct brcmf_if *ifp, u32 cmd, u32 *data) + } + + static u32 +-brcmf_create_iovar(char *name, const char *data, u32 datalen, ++brcmf_create_iovar(const char *name, const char *data, u32 datalen, + char *buf, u32 buflen) + { + u32 len; +@@ -213,7 +213,7 @@ brcmf_create_iovar(char *name, const char *data, u32 datalen, + + + s32 +-brcmf_fil_iovar_data_set(struct brcmf_if *ifp, char *name, const void *data, ++brcmf_fil_iovar_data_set(struct brcmf_if *ifp, const char *name, const void *data, + u32 len) + { + struct brcmf_pub *drvr = ifp->drvr; +@@ -241,7 +241,7 @@ brcmf_fil_iovar_data_set(struct brcmf_if *ifp, char *name, const void *data, + } + + s32 +-brcmf_fil_iovar_data_get(struct brcmf_if *ifp, char *name, void *data, ++brcmf_fil_iovar_data_get(struct brcmf_if *ifp, const char *name, void *data, + u32 len) + { + struct brcmf_pub *drvr = ifp->drvr; +@@ -272,7 +272,7 @@ brcmf_fil_iovar_data_get(struct brcmf_if *ifp, char *name, void *data, + } + + s32 +-brcmf_fil_iovar_int_set(struct brcmf_if *ifp, char *name, u32 data) ++brcmf_fil_iovar_int_set(struct brcmf_if *ifp, const char *name, u32 data) + { + __le32 data_le = cpu_to_le32(data); + +@@ -280,7 +280,7 @@ brcmf_fil_iovar_int_set(struct brcmf_if *ifp, char *name, u32 data) + } + + s32 +-brcmf_fil_iovar_int_get(struct brcmf_if *ifp, char *name, u32 *data) ++brcmf_fil_iovar_int_get(struct brcmf_if *ifp, const char *name, u32 *data) + { + __le32 data_le = cpu_to_le32(*data); + s32 err; +@@ -292,7 +292,7 @@ brcmf_fil_iovar_int_get(struct brcmf_if *ifp, char *name, u32 *data) + } + + static u32 +-brcmf_create_bsscfg(s32 bsscfgidx, char *name, char *data, u32 datalen, ++brcmf_create_bsscfg(s32 bsscfgidx, const char *name, char *data, u32 datalen, + char *buf, u32 buflen) + { + const s8 *prefix = "bsscfg:"; +@@ -337,7 +337,7 @@ brcmf_create_bsscfg(s32 bsscfgidx, char *name, char *data, u32 datalen, + } + + s32 +-brcmf_fil_bsscfg_data_set(struct brcmf_if *ifp, char *name, ++brcmf_fil_bsscfg_data_set(struct brcmf_if *ifp, const char *name, + void *data, u32 len) + { + struct brcmf_pub *drvr = ifp->drvr; +@@ -366,7 +366,7 @@ brcmf_fil_bsscfg_data_set(struct brcmf_if *ifp, char *name, + } + + s32 +-brcmf_fil_bsscfg_data_get(struct brcmf_if *ifp, char *name, ++brcmf_fil_bsscfg_data_get(struct brcmf_if *ifp, const char *name, + void *data, u32 len) + { + struct brcmf_pub *drvr = ifp->drvr; +@@ -396,7 +396,7 @@ brcmf_fil_bsscfg_data_get(struct brcmf_if *ifp, char *name, + } + + s32 +-brcmf_fil_bsscfg_int_set(struct brcmf_if *ifp, char *name, u32 data) ++brcmf_fil_bsscfg_int_set(struct brcmf_if *ifp, const char *name, u32 data) + { + __le32 data_le = cpu_to_le32(data); + +@@ -405,7 +405,7 @@ brcmf_fil_bsscfg_int_set(struct brcmf_if *ifp, char *name, u32 data) + } + + s32 +-brcmf_fil_bsscfg_int_get(struct brcmf_if *ifp, char *name, u32 *data) ++brcmf_fil_bsscfg_int_get(struct brcmf_if *ifp, const char *name, u32 *data) + { + __le32 data_le = cpu_to_le32(*data); + s32 err; +@@ -417,7 +417,7 @@ brcmf_fil_bsscfg_int_get(struct brcmf_if *ifp, char *name, u32 *data) + return err; + } + +-static u32 brcmf_create_xtlv(char *name, u16 id, char *data, u32 len, ++static u32 brcmf_create_xtlv(const char *name, u16 id, char *data, u32 len, + char *buf, u32 buflen) + { + u32 iolen; +@@ -438,7 +438,7 @@ static u32 brcmf_create_xtlv(char *name, u16 id, char *data, u32 len, + return iolen; + } + +-s32 brcmf_fil_xtlv_data_set(struct brcmf_if *ifp, char *name, u16 id, ++s32 brcmf_fil_xtlv_data_set(struct brcmf_if *ifp, const char *name, u16 id, + void *data, u32 len) + { + struct brcmf_pub *drvr = ifp->drvr; +@@ -466,7 +466,7 @@ s32 brcmf_fil_xtlv_data_set(struct brcmf_if *ifp, char *name, u16 id, + return err; + } + +-s32 brcmf_fil_xtlv_data_get(struct brcmf_if *ifp, char *name, u16 id, ++s32 brcmf_fil_xtlv_data_get(struct brcmf_if *ifp, const char *name, u16 id, + void *data, u32 len) + { + struct brcmf_pub *drvr = ifp->drvr; +@@ -495,7 +495,7 @@ s32 brcmf_fil_xtlv_data_get(struct brcmf_if *ifp, char *name, u16 id, + return err; + } + +-s32 brcmf_fil_xtlv_int_set(struct brcmf_if *ifp, char *name, u16 id, u32 data) ++s32 brcmf_fil_xtlv_int_set(struct brcmf_if *ifp, const char *name, u16 id, u32 data) + { + __le32 data_le = cpu_to_le32(data); + +@@ -503,7 +503,7 @@ s32 brcmf_fil_xtlv_int_set(struct brcmf_if *ifp, char *name, u16 id, u32 data) + sizeof(data_le)); + } + +-s32 brcmf_fil_xtlv_int_get(struct brcmf_if *ifp, char *name, u16 id, u32 *data) ++s32 brcmf_fil_xtlv_int_get(struct brcmf_if *ifp, const char *name, u16 id, u32 *data) + { + __le32 data_le = cpu_to_le32(*data); + s32 err; +@@ -514,12 +514,12 @@ s32 brcmf_fil_xtlv_int_get(struct brcmf_if *ifp, char *name, u16 id, u32 *data) + return err; + } + +-s32 brcmf_fil_xtlv_int8_get(struct brcmf_if *ifp, char *name, u16 id, u8 *data) ++s32 brcmf_fil_xtlv_int8_get(struct brcmf_if *ifp, const char *name, u16 id, u8 *data) + { + return brcmf_fil_xtlv_data_get(ifp, name, id, data, sizeof(*data)); + } + +-s32 brcmf_fil_xtlv_int16_get(struct brcmf_if *ifp, char *name, u16 id, u16 *data) ++s32 brcmf_fil_xtlv_int16_get(struct brcmf_if *ifp, const char *name, u16 id, u16 *data) + { + __le16 data_le = cpu_to_le16(*data); + s32 err; +diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil.h +index cb26f8c59..bc693157c 100644 +--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil.h ++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil.h +@@ -84,26 +84,26 @@ s32 brcmf_fil_cmd_data_get(struct brcmf_if *ifp, u32 cmd, void *data, u32 len); + s32 brcmf_fil_cmd_int_set(struct brcmf_if *ifp, u32 cmd, u32 data); + s32 brcmf_fil_cmd_int_get(struct brcmf_if *ifp, u32 cmd, u32 *data); + +-s32 brcmf_fil_iovar_data_set(struct brcmf_if *ifp, char *name, const void *data, ++s32 brcmf_fil_iovar_data_set(struct brcmf_if *ifp, const char *name, const void *data, + u32 len); +-s32 brcmf_fil_iovar_data_get(struct brcmf_if *ifp, char *name, void *data, ++s32 brcmf_fil_iovar_data_get(struct brcmf_if *ifp, const char *name, void *data, + u32 len); +-s32 brcmf_fil_iovar_int_set(struct brcmf_if *ifp, char *name, u32 data); +-s32 brcmf_fil_iovar_int_get(struct brcmf_if *ifp, char *name, u32 *data); ++s32 brcmf_fil_iovar_int_set(struct brcmf_if *ifp, const char *name, u32 data); ++s32 brcmf_fil_iovar_int_get(struct brcmf_if *ifp, const char *name, u32 *data); + +-s32 brcmf_fil_bsscfg_data_set(struct brcmf_if *ifp, char *name, void *data, ++s32 brcmf_fil_bsscfg_data_set(struct brcmf_if *ifp, const char *name, void *data, + u32 len); +-s32 brcmf_fil_bsscfg_data_get(struct brcmf_if *ifp, char *name, void *data, ++s32 brcmf_fil_bsscfg_data_get(struct brcmf_if *ifp, const char *name, void *data, + u32 len); +-s32 brcmf_fil_bsscfg_int_set(struct brcmf_if *ifp, char *name, u32 data); +-s32 brcmf_fil_bsscfg_int_get(struct brcmf_if *ifp, char *name, u32 *data); +-s32 brcmf_fil_xtlv_data_set(struct brcmf_if *ifp, char *name, u16 id, ++s32 brcmf_fil_bsscfg_int_set(struct brcmf_if *ifp, const char *name, u32 data); ++s32 brcmf_fil_bsscfg_int_get(struct brcmf_if *ifp, const char *name, u32 *data); ++s32 brcmf_fil_xtlv_data_set(struct brcmf_if *ifp, const char *name, u16 id, + void *data, u32 len); +-s32 brcmf_fil_xtlv_data_get(struct brcmf_if *ifp, char *name, u16 id, ++s32 brcmf_fil_xtlv_data_get(struct brcmf_if *ifp, const char *name, u16 id, + void *data, u32 len); +-s32 brcmf_fil_xtlv_int_set(struct brcmf_if *ifp, char *name, u16 id, u32 data); +-s32 brcmf_fil_xtlv_int_get(struct brcmf_if *ifp, char *name, u16 id, u32 *data); +-s32 brcmf_fil_xtlv_int8_get(struct brcmf_if *ifp, char *name, u16 id, u8 *data); +-s32 brcmf_fil_xtlv_int16_get(struct brcmf_if *ifp, char *name, u16 id, u16 *data); ++s32 brcmf_fil_xtlv_int_set(struct brcmf_if *ifp, const char *name, u16 id, u32 data); ++s32 brcmf_fil_xtlv_int_get(struct brcmf_if *ifp, const char *name, u16 id, u32 *data); ++s32 brcmf_fil_xtlv_int8_get(struct brcmf_if *ifp, const char *name, u16 id, u8 *data); ++s32 brcmf_fil_xtlv_int16_get(struct brcmf_if *ifp, const char *name, u16 id, u16 *data); + + #endif /* _fwil_h_ */ +-- +2.34.1 + diff --git a/8032-brcmfmac-common-Add-support-for-downloading-TxCap-bl.patch b/8032-brcmfmac-common-Add-support-for-downloading-TxCap-bl.patch new file mode 100644 index 0000000..9a2eb9a --- /dev/null +++ b/8032-brcmfmac-common-Add-support-for-downloading-TxCap-bl.patch @@ -0,0 +1,189 @@ +From 4c496f67db9939ac2be78a91c483d3afd4960f08 Mon Sep 17 00:00:00 2001 +From: Hector Martin +Date: Sun, 26 Dec 2021 00:25:00 +0900 +Subject: [PATCH 32/34] brcmfmac: common: Add support for downloading TxCap + blobs + +The TxCap blobs are additional data blobs used on Apple devices, and +are uploaded analogously to CLM blobs. Add core support for doing this. + +Signed-off-by: Hector Martin +--- + .../broadcom/brcm80211/brcmfmac/bus.h | 1 + + .../broadcom/brcm80211/brcmfmac/common.c | 97 +++++++++++++------ + 2 files changed, 71 insertions(+), 27 deletions(-) + +diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h +index b13af8f63..f4bd98da9 100644 +--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h ++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h +@@ -39,6 +39,7 @@ enum brcmf_bus_protocol_type { + /* Firmware blobs that may be available */ + enum brcmf_blob_type { + BRCMF_BLOB_CLM, ++ BRCMF_BLOB_TXCAP, + }; + + struct brcmf_mp_device; +diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c +index c84c48e49..d65308c3f 100644 +--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c ++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c +@@ -101,7 +101,7 @@ void brcmf_c_set_joinpref_default(struct brcmf_if *ifp) + + static int brcmf_c_download(struct brcmf_if *ifp, u16 flag, + struct brcmf_dload_data_le *dload_buf, +- u32 len) ++ u32 len, const char *var) + { + s32 err; + +@@ -112,17 +112,17 @@ static int brcmf_c_download(struct brcmf_if *ifp, u16 flag, + dload_buf->crc = cpu_to_le32(0); + len = sizeof(*dload_buf) + len - 1; + +- err = brcmf_fil_iovar_data_set(ifp, "clmload", dload_buf, len); ++ err = brcmf_fil_iovar_data_set(ifp, var, dload_buf, len); + + return err; + } + +-static int brcmf_c_process_clm_blob(struct brcmf_if *ifp) ++static int brcmf_c_download_blob(struct brcmf_if *ifp, ++ const void *data, size_t size, ++ const char *loadvar, const char *statvar) + { + struct brcmf_pub *drvr = ifp->drvr; +- struct brcmf_bus *bus = drvr->bus_if; + struct brcmf_dload_data_le *chunk_buf; +- const struct firmware *clm = NULL; + u32 chunk_len; + u32 datalen; + u32 cumulative_len; +@@ -132,20 +132,11 @@ static int brcmf_c_process_clm_blob(struct brcmf_if *ifp) + + brcmf_dbg(TRACE, "Enter\n"); + +- err = brcmf_bus_get_blob(bus, &clm, BRCMF_BLOB_CLM); +- if (err || !clm) { +- brcmf_info("no clm_blob available (err=%d), device may have limited channels available\n", +- err); +- return 0; +- } +- + chunk_buf = kzalloc(sizeof(*chunk_buf) + MAX_CHUNK_LEN - 1, GFP_KERNEL); +- if (!chunk_buf) { +- err = -ENOMEM; +- goto done; +- } ++ if (!chunk_buf) ++ return -ENOMEM; + +- datalen = clm->size; ++ datalen = size; + cumulative_len = 0; + do { + if (datalen > MAX_CHUNK_LEN) { +@@ -154,9 +145,10 @@ static int brcmf_c_process_clm_blob(struct brcmf_if *ifp) + chunk_len = datalen; + dl_flag |= DL_END; + } +- memcpy(chunk_buf->data, clm->data + cumulative_len, chunk_len); ++ memcpy(chunk_buf->data, data + cumulative_len, chunk_len); + +- err = brcmf_c_download(ifp, dl_flag, chunk_buf, chunk_len); ++ err = brcmf_c_download(ifp, dl_flag, chunk_buf, chunk_len, ++ loadvar); + + dl_flag &= ~DL_BEGIN; + +@@ -165,20 +157,64 @@ static int brcmf_c_process_clm_blob(struct brcmf_if *ifp) + } while ((datalen > 0) && (err == 0)); + + if (err) { +- bphy_err(drvr, "clmload (%zu byte file) failed (%d)\n", +- clm->size, err); +- /* Retrieve clmload_status and print */ +- err = brcmf_fil_iovar_int_get(ifp, "clmload_status", &status); ++ bphy_err(drvr, "%s (%zu byte file) failed (%d)\n", ++ loadvar, size, err); ++ /* Retrieve status and print */ ++ err = brcmf_fil_iovar_int_get(ifp, statvar, &status); + if (err) +- bphy_err(drvr, "get clmload_status failed (%d)\n", err); ++ bphy_err(drvr, "get %s failed (%d)\n", statvar, err); + else +- brcmf_dbg(INFO, "clmload_status=%d\n", status); ++ brcmf_dbg(INFO, "%s=%d\n", statvar, status); + err = -EIO; + } + + kfree(chunk_buf); +-done: +- release_firmware(clm); ++ return err; ++} ++ ++static int brcmf_c_process_clm_blob(struct brcmf_if *ifp) ++{ ++ struct brcmf_pub *drvr = ifp->drvr; ++ struct brcmf_bus *bus = drvr->bus_if; ++ const struct firmware *fw = NULL; ++ s32 err; ++ ++ brcmf_dbg(TRACE, "Enter\n"); ++ ++ err = brcmf_bus_get_blob(bus, &fw, BRCMF_BLOB_CLM); ++ if (err || !fw) { ++ brcmf_info("no clm_blob available (err=%d), device may have limited channels available\n", ++ err); ++ return 0; ++ } ++ ++ err = brcmf_c_download_blob(ifp, fw->data, fw->size, ++ "clmload", "clmload_status"); ++ ++ release_firmware(fw); ++ return err; ++} ++ ++static int brcmf_c_process_txcap_blob(struct brcmf_if *ifp) ++{ ++ struct brcmf_pub *drvr = ifp->drvr; ++ struct brcmf_bus *bus = drvr->bus_if; ++ const struct firmware *fw = NULL; ++ s32 err; ++ ++ brcmf_dbg(TRACE, "Enter\n"); ++ ++ err = brcmf_bus_get_blob(bus, &fw, BRCMF_BLOB_TXCAP); ++ if (err || !fw) { ++ brcmf_info("no txcap_blob available (err=%d)\n", err); ++ return 0; ++ } ++ ++ brcmf_info("TxCap blob found, loading\n"); ++ err = brcmf_c_download_blob(ifp, fw->data, fw->size, ++ "txcapload", "txcapload_status"); ++ ++ release_firmware(fw); + return err; + } + +@@ -248,6 +284,13 @@ int brcmf_c_preinit_dcmds(struct brcmf_if *ifp) + goto done; + } + ++ /* Do TxCap downloading, if needed */ ++ err = brcmf_c_process_txcap_blob(ifp); ++ if (err < 0) { ++ bphy_err(drvr, "download TxCap blob file failed, %d\n", err); ++ goto done; ++ } ++ + /* query for 'ver' to get version info from firmware */ + memset(buf, 0, sizeof(buf)); + err = brcmf_fil_iovar_data_get(ifp, "ver", buf, sizeof(buf)); +-- +2.34.1 + diff --git a/8033-brcmfmac-pcie-Load-and-provide-TxCap-blobs.patch b/8033-brcmfmac-pcie-Load-and-provide-TxCap-blobs.patch new file mode 100644 index 0000000..f90b461 --- /dev/null +++ b/8033-brcmfmac-pcie-Load-and-provide-TxCap-blobs.patch @@ -0,0 +1,91 @@ +From de52f6bca772503aa189136b565584c1fbf6b43a Mon Sep 17 00:00:00 2001 +From: Hector Martin +Date: Sun, 26 Dec 2021 00:26:10 +0900 +Subject: [PATCH 33/34] brcmfmac: pcie: Load and provide TxCap blobs + +These blobs are named .txcap_blob, and exist alongside the existing +.clm_blob files. Use the existing firmware machinery to provide them to +the core. + +Signed-off-by: Hector Martin +--- + .../net/wireless/broadcom/brcm80211/brcmfmac/pcie.c | 13 +++++++++++++ + 1 file changed, 13 insertions(+) + +diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c +index f1b90b5e7..b16bab061 100644 +--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c ++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c +@@ -73,6 +73,7 @@ MODULE_FIRMWARE(BRCMF_FW_DEFAULT_PATH "brcmfmac*-pcie.*.txt"); + /* per-board firmware binaries */ + MODULE_FIRMWARE(BRCMF_FW_DEFAULT_PATH "brcmfmac*-pcie.*.bin"); + MODULE_FIRMWARE(BRCMF_FW_DEFAULT_PATH "brcmfmac*-pcie.*.clm_blob"); ++MODULE_FIRMWARE(BRCMF_FW_DEFAULT_PATH "brcmfmac*-pcie.*.txcap_blob"); + + static const struct brcmf_firmware_mapping brcmf_pcie_fwnames[] = { + BRCMF_FW_ENTRY(BRCM_CC_43602_CHIP_ID, 0xFFFFFFFF, 43602), +@@ -327,7 +328,9 @@ struct brcmf_pciedev_info { + char fw_name[BRCMF_FW_NAME_LEN]; + char nvram_name[BRCMF_FW_NAME_LEN]; + char clm_name[BRCMF_FW_NAME_LEN]; ++ char txcap_name[BRCMF_FW_NAME_LEN]; + const struct firmware *clm_fw; ++ const struct firmware *txcap_fw; + const struct brcmf_pcie_reginfo *reginfo; + void __iomem *regs; + void __iomem *tcm; +@@ -1504,6 +1507,10 @@ static int brcmf_pcie_get_blob(struct device *dev, const struct firmware **fw, + *fw = devinfo->clm_fw; + devinfo->clm_fw = NULL; + break; ++ case BRCMF_BLOB_TXCAP: ++ *fw = devinfo->txcap_fw; ++ devinfo->txcap_fw = NULL; ++ break; + default: + return -ENOENT; + } +@@ -2095,6 +2102,7 @@ static int brcmf_pcie_read_otp(struct brcmf_pciedev_info *devinfo) + #define BRCMF_PCIE_FW_CODE 0 + #define BRCMF_PCIE_FW_NVRAM 1 + #define BRCMF_PCIE_FW_CLM 2 ++#define BRCMF_PCIE_FW_TXCAP 3 + + static void brcmf_pcie_setup(struct device *dev, int ret, + struct brcmf_fw_request *fwreq) +@@ -2120,6 +2128,7 @@ static void brcmf_pcie_setup(struct device *dev, int ret, + nvram = fwreq->items[BRCMF_PCIE_FW_NVRAM].nv_data.data; + nvram_len = fwreq->items[BRCMF_PCIE_FW_NVRAM].nv_data.len; + devinfo->clm_fw = fwreq->items[BRCMF_PCIE_FW_CLM].binary; ++ devinfo->txcap_fw = fwreq->items[BRCMF_PCIE_FW_TXCAP].binary; + kfree(fwreq); + + ret = brcmf_chip_get_raminfo(devinfo->ci); +@@ -2196,6 +2205,7 @@ brcmf_pcie_prepare_fw_request(struct brcmf_pciedev_info *devinfo) + { ".bin", devinfo->fw_name }, + { ".txt", devinfo->nvram_name }, + { ".clm_blob", devinfo->clm_name }, ++ { ".txcap_blob", devinfo->txcap_name }, + }; + + fwreq = brcmf_fw_alloc_request(devinfo->ci->chip, devinfo->ci->chiprev, +@@ -2210,6 +2220,8 @@ brcmf_pcie_prepare_fw_request(struct brcmf_pciedev_info *devinfo) + fwreq->items[BRCMF_PCIE_FW_NVRAM].flags = BRCMF_FW_REQF_OPTIONAL; + fwreq->items[BRCMF_PCIE_FW_CLM].type = BRCMF_FW_TYPE_BINARY; + fwreq->items[BRCMF_PCIE_FW_CLM].flags = BRCMF_FW_REQF_OPTIONAL; ++ fwreq->items[BRCMF_PCIE_FW_TXCAP].type = BRCMF_FW_TYPE_BINARY; ++ fwreq->items[BRCMF_PCIE_FW_TXCAP].flags = BRCMF_FW_REQF_OPTIONAL; + /* NVRAM reserves PCI domain 0 for Broadcom's SDK faked bus */ + fwreq->domain_nr = pci_domain_nr(devinfo->pdev->bus) + 1; + fwreq->bus_nr = devinfo->pdev->bus->number; +@@ -2426,6 +2438,7 @@ brcmf_pcie_remove(struct pci_dev *pdev) + brcmf_pcie_reset_device(devinfo); + brcmf_pcie_release_resource(devinfo); + release_firmware(devinfo->clm_fw); ++ release_firmware(devinfo->txcap_fw); + + if (devinfo->ci) + brcmf_chip_detach(devinfo->ci); +-- +2.34.1 + diff --git a/8034-brcmfmac-common-Add-support-for-external-calibration.patch b/8034-brcmfmac-common-Add-support-for-external-calibration.patch new file mode 100644 index 0000000..c31da1b --- /dev/null +++ b/8034-brcmfmac-common-Add-support-for-external-calibration.patch @@ -0,0 +1,100 @@ +From f92aef8679038a4d0b055babf368f8f43bdd072b Mon Sep 17 00:00:00 2001 +From: Hector Martin +Date: Sun, 26 Dec 2021 00:53:37 +0900 +Subject: [PATCH 34/34] brcmfmac: common: Add support for external calibration + blobs + +The calibration blob for a chip is normally stored in SROM and loaded +internally by the firmware. However, Apple ARM64 platforms instead store +it as part of platform configuration data, and provide it via the Apple +Device Tree. We forward this into the Linux DT in the bootloader. + +Add support for taking this blob from the DT and loading it into the +dongle. The loading mechanism is the same as used for the CLM and TxCap +blobs. + +Signed-off-by: Hector Martin +--- + .../broadcom/brcm80211/brcmfmac/common.c | 24 +++++++++++++++++++ + .../broadcom/brcm80211/brcmfmac/common.h | 2 ++ + .../wireless/broadcom/brcm80211/brcmfmac/of.c | 9 +++++++ + 3 files changed, 35 insertions(+) + +diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c +index d65308c3f..ad36e6b5d 100644 +--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c ++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c +@@ -218,6 +218,23 @@ static int brcmf_c_process_txcap_blob(struct brcmf_if *ifp) + return err; + } + ++static int brcmf_c_process_cal_blob(struct brcmf_if *ifp) ++{ ++ struct brcmf_pub *drvr = ifp->drvr; ++ struct brcmf_mp_device *settings = drvr->settings; ++ s32 err; ++ ++ brcmf_dbg(TRACE, "Enter\n"); ++ ++ if (!settings->cal_blob || !settings->cal_size) ++ return 0; ++ ++ brcmf_info("Calibration blob provided by platform, loading\n"); ++ err = brcmf_c_download_blob(ifp, settings->cal_blob, settings->cal_size, ++ "calload", "calload_status"); ++ return err; ++} ++ + int brcmf_c_preinit_dcmds(struct brcmf_if *ifp) + { + struct brcmf_pub *drvr = ifp->drvr; +@@ -291,6 +308,13 @@ int brcmf_c_preinit_dcmds(struct brcmf_if *ifp) + goto done; + } + ++ /* Download external calibration blob, if available */ ++ err = brcmf_c_process_cal_blob(ifp); ++ if (err < 0) { ++ bphy_err(drvr, "download calibration blob file failed, %d\n", err); ++ goto done; ++ } ++ + /* query for 'ver' to get version info from firmware */ + memset(buf, 0, sizeof(buf)); + err = brcmf_fil_iovar_data_get(ifp, "ver", buf, sizeof(buf)); +diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h +index a88c4a931..f321346ed 100644 +--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h ++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h +@@ -51,6 +51,8 @@ struct brcmf_mp_device { + struct brcmfmac_pd_cc *country_codes; + const char *board_type; + const char *antenna_sku; ++ void *cal_blob; ++ int cal_size; + union { + struct brcmfmac_sdio_pd sdio; + } bus; +diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c +index 31407d3a1..9db5fa106 100644 +--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c ++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c +@@ -86,6 +86,15 @@ void brcmf_of_probe(struct device *dev, enum brcmf_bus_type bus_type, + if (!of_property_read_string(np, "apple,antenna-sku", &prop)) + settings->antenna_sku = devm_kstrdup(dev, prop, GFP_KERNEL); + ++ /* ++ * The WLAN calibration blob is normally stored in SROM, but Apple ++ * ARM64 platforms pass it via the DT instead. ++ */ ++ prop = of_get_property(np, "brcm,cal-blob", &settings->cal_size); ++ if (prop && settings->cal_size) ++ settings->cal_blob = devm_kmemdup(dev, prop, settings->cal_size, ++ GFP_KERNEL); ++ + /* Set board-type to the first string of the machine compatible prop */ + root = of_find_node_by_path("/"); + if (root && !settings->board_type) { +-- +2.34.1 + diff --git a/PKGBUILD b/PKGBUILD index 3e9d5d0..2b7c303 100644 --- a/PKGBUILD +++ b/PKGBUILD @@ -4,14 +4,18 @@ # Contributor: Jan Alexander Steffens (heftig) pkgbase=linux-t2 -pkgver=5.15.11 +pkgver=5.15.13 _srcname=linux-${pkgver} -pkgrel=4 +pkgrel=1 pkgdesc='Linux kernel for T2 Macs' _srctag=v${pkgver%.*}-${pkgver##*.} url="https://git.archlinux.org/linux.git/log/?h=v$_srctag" arch=(x86_64) license=(GPL2) +provides=( + apple-bce + apple-ibridge +) makedepends=( bc kmod libelf pahole cpio perl tar xz xmlto python-sphinx python-sphinx_rtd_theme graphviz imagemagick @@ -94,6 +98,11 @@ source=( 8027-brcmfmac-pcie-Replace-brcmf_pcie_copy_mem_todev-with.patch 8028-brcmfmac-pcie-Read-the-console-on-init-and-shutdown.patch 8029-brcmfmac-pcie-Release-firmwares-in-the-brcmf_pcie_se.patch + # 8030 only applies to the linux-asahi tree and is only for M1 Macs + 8031-brcmfmac-fwil-Constify-iovar-name-arguments.patch + 8032-brcmfmac-common-Add-support-for-downloading-TxCap-bl.patch + 8033-brcmfmac-pcie-Load-and-provide-TxCap-blobs.patch + 8034-brcmfmac-common-Add-support-for-external-calibration.patch # Broadcom BT device support 9001-bluetooth-add-disable-read-tx-power-quirk.patch @@ -284,7 +293,7 @@ for _p in "${pkgname[@]}"; do }" done -sha256sums=('c1178b7e7e12d91292e670191268e3fe9a3563faf899eef43e468577e973a1ce' +sha256sums=('0a131b6a2f9f5ee37ecb332b5459ab35a87f0bf2d4ec923988d0663646cf156a' 'SKIP' '324a9d46c2338806a0c3ce0880c8d5e85c2ef30d342af3dc96f87b54fae7a586' '6b4da532421cac5600d09c0c52742aa52d848af098f7853abe60c02e9d0a3752' @@ -313,35 +322,39 @@ sha256sums=('c1178b7e7e12d91292e670191268e3fe9a3563faf899eef43e468577e973a1ce' '2cfc28a394117184c4fd4c14fd8d1cbf2ed6d2c5ddba93f077cbbc621d73ca81' '9640178d6251686c980c30fc528b3d70beac6ce8246bf433506a3f843808326c' '90a6012cdd8a64ede8e0bbaf7331960bd68f628e0973b65459188eb1ccb5b829' - '23a44991bcd6254ff91ab259900bb7decad16efc5b87498c93fcd9bb86fe561a' - '0d0c3b2a5e30b29d6c93a760f9b4fab1dd30a9561be56ecd43c7471e674aee26' - '9bf9dd0d978a649c7e0437ac8f42a11f09af4917fe1968dc26223692137fc517' - 'c4966acab11e2e9f61132d8740371b404317d49ba86e899e01faa6896736675e' - '53ad3c9fae3472c9f572bb485190c6d865656435742584a83f411c3f6eaebf49' - '7616371062addcc256c9217c65b92da59e5f16b35845cd3f7d537bf2bcde08bd' - '0011ae2df9e8cd87adb46f7c0a0edfe83bbbb845cc141db304be63cb03118f26' - '4f36a11f3545c4db77187395b10e078525a4c494fa6a0f58bc85bdb53403afda' - '4f7b22bc363fab93199e77a5713ea51b6a32d1087c0efbc8b36cb9d1ce3df620' - 'e2b483966f138e9112027e47280a5045c80694bc1b8f132ebfec271b9155bbe2' - 'e71a275dbcfb7f394b946c748f3317fffe7a6d6df897f766b537fe0ba7cd1e0d' - '8770b56adb15004e624a98b9675e496c2ac662744f899f058a18b16868bd04f6' - '3badfb3ea7c17ce948524a22284370f0739c59e62ea529c869329243e66682ca' - 'c25d935ed2e21308389aac775d029c32eecc6a8fdef1dc3df4c745c0d46981ea' - '96b954987bcbe7ea0ba24943c00570570adfb74e2ba7e1f0df3c4074d0f4d112' - '5c89f30332ce30e010c1e6dcfcef41bb7ce3411acc147b6b00925c24cc0f9086' - 'd314b41614c6e730cd43467eedd22c15197b437e82088242fa9dc453316f2398' - '54fa470bc8b1b3a449e19860a11cd9ee5dfdf297a05f90dc0029a4e30ee0de43' - 'e5e2cdd0140e93e1f599f37ba0380ce1f51646b35cfccdb7a5a0e02a7eb7afdb' - '4b1d72c3d402e9135810dde26bcfd41cee3c988c4f5644eedf8d5254376dc329' - 'b256ec4d4057019ede92fff228a959a8be99a9130078b7cda5265a5f1e3a000e' - '0c30315c95c27e1fb64e0af972e8ec27ffd3333869ffa7ab5cefb8cbc7abce38' - '5453c12bb8084e19c5e8e627084a644663b209f7812fd6149dee0c5e18f7f577' - 'a9497ecbb19e3c24eb057d2a5c57ddc91dd78be7f370ea0965e7a93316f11ade' - '143e7c874feb714f0075969662a245ecacf60f243ed6c7b3bb1030c00b605f94' - '1745213ecf75126cd77a98324545995faef0477e9df35a76ae02a3bb8707ab3f' - 'ba5660c533d3d91bcb2f4452e7e3125f594457567478e87fba58c1296c58c096' - '1096b078a9870ffc528a4001b534dd5bc3e03b24e33225d930b4f5be2efadeb8' - '5980bbc0702eafebcbbe80c53d39f985422247020b811e44c333fe047d1ab779' + '862f631ef9f25453ce38d9ed0197e62d85f9f5a0625ed77237e643297fb42f75' + '2f7899b70d5c55aea3f6385385fea01ce21b48f9441982a94f36c842cceec083' + '2b126cda3863f49b8d3a6de8fa8cca979d87bd9e66812531be5c02c9e5840d82' + '70a277c9ad4fba624b3916e397624e557135b269c34eb704ace29aa1a6b8e430' + '42ae52b93ea0cbd0d1859512b88e0c290e3500b8e52f8de3be7398cb6039d0b4' + '300d926bac23b81d267e73433d668581ec1e3b12fa76462ba3d0b1cf2728b82d' + '01f3185e551dd49007b533d4bae37774131820a51715e1f1a391220e055afc66' + 'db55305b8e3c2a8fa0a85aeaad661717ae745d5dabc7735221adb184e89a2d1b' + '82f679f3736e09ee9ea8a8b53c052e84bb40df8a05f21a2082224184ad3cf162' + '9907f67d099a2b6243747350a2c057d82c39e822107ca57cbfdc32baf378d2cb' + 'd25cd32de8c74ba8bcb430c21f9d84deae1174594d00ea94e1fd1e2ab70ea5cb' + '823d35349844605dadf381ae7c6097379a23c72da59e3cf393fcf3e5d466dafd' + 'ed6e84bc03cd6adfc3f8def843f150b71470df6d6a88fc348d5e1b36f133f424' + '23d9018c90d02389f2ddeb0821e581d354184b3b38d4488fbc0f3363463a0c9e' + 'd2e2b0f0c80fb5b4da36d3a7a87b10c2419255c0e38e0faa1d7478eaab1b9a35' + 'ecef58f944bf61950b3211e88acd104b0006a177e76f59a47b8253aaf5e6acc6' + '1eb6e14b5504efbad7911aabc801a265e9ba13cb2fd6ce8e029af55bf97cec86' + 'f2b553e11240bb88e5d0ffd7883d808c069ede544e5c578c22975466a5c9d26a' + 'ac4b200dadbb88179bf37dcea280efe25bf42b420a90ab1399c3bd9c7905f592' + 'e12726162b868435081a215f04d921cd8b9307de71738c41090ec93a267725de' + 'bfa3bb8d16b6c26831f9b5e833d46ea2c60854f016540a051f96c418be1a728f' + 'e9df13adedefd0043ea6678c19a9de608aa69fe83929a13213c528052096ed3c' + 'b51a916bb0048d7cb57ed2afc25394ec72664efe2a8c5705b0dcfe62384e34ed' + '2ec5dddd41327b5018d41b920955182bc3f220f692a32b061d8797c8fee99dbc' + 'a8596e6180a895515cbc1f361edc8fca460f630dd15bbd161037d84717717ba8' + '55b6981468b489f5bb7c59d5f9a6b479c0d96bb1018efa209ed8506d54de8399' + '2339acd32f020db66f2a3190910d925a030798e3fd57006a09dda56e5acbf279' + 'f41ab41dd9445dee28699c1af7909723514f9d41d30a5c148d4f99617ed2d46e' + '0e6cd10376f13873a9226d233161a0dab6b1d3c6a7d66bc3c4e8d3cc0f0397d0' + '8f9a6d47eaec7d9df9a822a146ab15ca7bee906866545493cac8621570237060' + 'ecede30aa68ea4646d3efb0a7190466ff1784f4e93756a04bb58756536f28035' + '0bed877897873ae86e512d711b86fa11adc5b8e7fe35139e290e8d0a0133f6a5' + '23f4a7002632f95abb1ed75a4df0570b7a81e5cf4067a16da7101b16eb582a01' '31e414978a947bdb71f27ed364c4da73b81fcf1921250cb69ee1bcf2bbd25636' '5d36770f436b69e69633d060deb55a37b8b3871983068e95fb33d5a195f00574' '3bffb2bb84800453ba05676293de9b0b1619d0c19b6295e803f0d9c3a07be23a')