From 1195754e6fd0ee3dd6b1f6e05a034db1af53551d Mon Sep 17 00:00:00 2001 From: Aditya Garg Date: Mon, 16 Jan 2023 04:16:42 +0530 Subject: [PATCH] Remove patches causing regression --- 8001-asahilinux-wifi-patchset.patch | 738 ---------------------------- 1 file changed, 738 deletions(-) diff --git a/8001-asahilinux-wifi-patchset.patch b/8001-asahilinux-wifi-patchset.patch index 91ed968..8811c34 100644 --- a/8001-asahilinux-wifi-patchset.patch +++ b/8001-asahilinux-wifi-patchset.patch @@ -1915,741 +1915,3 @@ index a83699de01ec3c..d295b9f3a4fbe5 100644 /* Set board-type to the first string of the machine compatible prop */ root = of_find_node_by_path("/"); if (root && !settings->board_type) { - -From 55b5f2833aa40024bf6cde448fb8403a8be0e686 Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Fri, 1 Jul 2022 23:51:23 +0900 -Subject: [PATCH 18/26] brcmfmac: pcie: Add BCM4378B3 support - -BCM4378B3 is a new silicon revision of BCM4378 present on the Apple M2 -13" MacBook Pro "kyushu". Its PCI revision number is 5. - -Signed-off-by: Hector Martin ---- - drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c | 4 +++- - 1 file changed, 3 insertions(+), 1 deletion(-) - -diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c -index 286362c2c6cb23..7d9e593a822ada 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"); - BRCMF_FW_DEF(4371, "brcmfmac4371-pcie"); - BRCMF_FW_CLM_DEF(4377B3, "brcmfmac4377b3-pcie"); - BRCMF_FW_CLM_DEF(4378B1, "brcmfmac4378b1-pcie"); -+BRCMF_FW_CLM_DEF(4378B3, "brcmfmac4378b3-pcie"); - BRCMF_FW_CLM_DEF(4387C2, "brcmfmac4387c2-pcie"); - BRCMF_FW_DEF(4355, "brcmfmac89459-pcie"); - -@@ -97,7 +98,8 @@ static const struct brcmf_firmware_mapping brcmf_pcie_fwnames[] = { - 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_4377_CHIP_ID, 0xFFFFFFFF, 4377B3), /* revision ID 4 */ -- BRCMF_FW_ENTRY(BRCM_CC_4378_CHIP_ID, 0xFFFFFFFF, 4378B1), /* revision ID 3 */ -+ 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 */ - BRCMF_FW_ENTRY(BRCM_CC_4387_CHIP_ID, 0xFFFFFFFF, 4387C2), /* revision ID 7 */ - BRCMF_FW_ENTRY(CY_CC_89459_CHIP_ID, 0xFFFFFFFF, 4355), - }; - -From 287713d2f27eb826f1dcae16368bcda262e4318d Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Tue, 18 Oct 2022 21:59:24 +0900 -Subject: [PATCH 19/26] wifi: brcmfmac: Add missing shared area defines to - pcie.c - -There are many newer flags and extended shared area fields used by newer -firmwares that are not yet defined. Add them for future usage. - -Signed-off-by: Hector Martin ---- - .../broadcom/brcm80211/brcmfmac/pcie.c | 58 +++++++++++++++++++ - 1 file changed, 58 insertions(+) - -diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c -index 7d9e593a822ada..ec58f0a83dbe42 100644 ---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c -+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c -@@ -209,11 +209,64 @@ static const struct brcmf_firmware_mapping brcmf_pcie_fwnames[] = { - #define BRCMF_PCIE_SHARED_VERSION_MASK 0x00FF - #define BRCMF_PCIE_SHARED_DMA_INDEX 0x10000 - #define BRCMF_PCIE_SHARED_DMA_2B_IDX 0x100000 -+#define BRCMF_PCIE_SHARED_USE_MAILBOX 0x2000000 -+#define BRCMF_PCIE_SHARED_TIMESTAMP_DB0 0x8000000 - #define BRCMF_PCIE_SHARED_HOSTRDY_DB1 0x10000000 -+#define BRCMF_PCIE_SHARED_NO_OOB_DW 0x20000000 -+#define BRCMF_PCIE_SHARED_INBAND_DS 0x40000000 -+#define BRCMF_PCIE_SHARED_DAR 0x80000000 -+ -+#define BRCMF_PCIE_SHARED2_EXTENDED_TRAP_DATA 0x1 -+#define BRCMF_PCIE_SHARED2_TXSTATUS_METADATA 0x2 -+#define BRCMF_PCIE_SHARED2_BT_LOGGING 0x4 -+#define BRCMF_PCIE_SHARED2_SNAPSHOT_UPLOAD 0x8 -+#define BRCMF_PCIE_SHARED2_SUBMIT_COUNT_WAR 0x10 -+#define BRCMF_PCIE_SHARED2_FAST_DELETE_RING 0x20 -+#define BRCMF_PCIE_SHARED2_EVTBUF_MAX_MASK 0xC0 -+#define BRCMF_PCIE_SHARED2_PKT_TX_STATUS 0x100 -+#define BRCMF_PCIE_SHARED2_FW_SMALL_MEMDUMP 0x200 -+#define BRCMF_PCIE_SHARED2_FW_HC_ON_TRAP 0x400 -+#define BRCMF_PCIE_SHARED2_HSCB 0x800 -+#define BRCMF_PCIE_SHARED2_EDL_RING 0x1000 -+#define BRCMF_PCIE_SHARED2_DEBUG_BUF_DEST 0x2000 -+#define BRCMF_PCIE_SHARED2_PCIE_ENUM_RESET_FLR 0x4000 -+#define BRCMF_PCIE_SHARED2_PKT_TIMESTAMP 0x8000 -+#define BRCMF_PCIE_SHARED2_HP2P 0x10000 -+#define BRCMF_PCIE_SHARED2_HWA 0x20000 -+#define BRCMF_PCIE_SHARED2_TRAP_ON_HOST_DB7 0x40000 -+#define BRCMF_PCIE_SHARED2_DURATION_SCALE 0x100000 -+#define BRCMF_PCIE_SHARED2_D2H_D11_TX_STATUS 0x40000000 -+#define BRCMF_PCIE_SHARED2_H2D_D11_TX_STATUS 0x80000000 - - #define BRCMF_PCIE_FLAGS_HTOD_SPLIT 0x4000 - #define BRCMF_PCIE_FLAGS_DTOH_SPLIT 0x8000 - -+#define BRCMF_HOSTCAP_PCIEAPI_VERSION_MASK 0x000000FF -+#define BRCMF_HOSTCAP_H2D_VALID_PHASE 0x00000100 -+#define BRCMF_HOSTCAP_H2D_ENABLE_TRAP_ON_BADPHASE 0x00000200 -+#define BRCMF_HOSTCAP_H2D_ENABLE_HOSTRDY 0x400 -+#define BRCMF_HOSTCAP_DB0_TIMESTAMP 0x800 -+#define BRCMF_HOSTCAP_DS_NO_OOB_DW 0x1000 -+#define BRCMF_HOSTCAP_DS_INBAND_DW 0x2000 -+#define BRCMF_HOSTCAP_H2D_IDMA 0x4000 -+#define BRCMF_HOSTCAP_H2D_IFRM 0x8000 -+#define BRCMF_HOSTCAP_H2D_DAR 0x10000 -+#define BRCMF_HOSTCAP_EXTENDED_TRAP_DATA 0x20000 -+#define BRCMF_HOSTCAP_TXSTATUS_METADATA 0x40000 -+#define BRCMF_HOSTCAP_BT_LOGGING 0x80000 -+#define BRCMF_HOSTCAP_SNAPSHOT_UPLOAD 0x100000 -+#define BRCMF_HOSTCAP_FAST_DELETE_RING 0x200000 -+#define BRCMF_HOSTCAP_PKT_TXSTATUS 0x400000 -+#define BRCMF_HOSTCAP_UR_FW_NO_TRAP 0x800000 -+#define BRCMF_HOSTCAP_HSCB 0x2000000 -+#define BRCMF_HOSTCAP_EXT_TRAP_DBGBUF 0x4000000 -+#define BRCMF_HOSTCAP_EDL_RING 0x10000000 -+#define BRCMF_HOSTCAP_PKT_TIMESTAMP 0x20000000 -+#define BRCMF_HOSTCAP_PKT_HP2P 0x40000000 -+#define BRCMF_HOSTCAP_HWA 0x80000000 -+#define BRCMF_HOSTCAP2_DURATION_SCALE_MASK 0x3F -+ -+#define BRCMF_SHARED_FLAGS_OFFSET 0 - #define BRCMF_SHARED_MAX_RXBUFPOST_OFFSET 34 - #define BRCMF_SHARED_RING_BASE_OFFSET 52 - #define BRCMF_SHARED_RX_DATAOFFSET_OFFSET 36 -@@ -225,6 +278,11 @@ static const struct brcmf_firmware_mapping brcmf_pcie_fwnames[] = { - #define BRCMF_SHARED_DMA_SCRATCH_ADDR_OFFSET 56 - #define BRCMF_SHARED_DMA_RINGUPD_LEN_OFFSET 64 - #define BRCMF_SHARED_DMA_RINGUPD_ADDR_OFFSET 68 -+#define BRCMF_SHARED_FLAGS2_OFFSET 80 -+#define BRCMF_SHARED_HOST_CAP_OFFSET 84 -+#define BRCMF_SHARED_FLAGS3_OFFSET 108 -+#define BRCMF_SHARED_HOST_CAP2_OFFSET 112 -+#define BRCMF_SHARED_HOST_CAP3_OFFSET 116 - - #define BRCMF_RING_H2D_RING_COUNT_OFFSET 0 - #define BRCMF_RING_D2H_RING_COUNT_OFFSET 1 - -From d65e16faef2e15889ba1c67075fff294249aeba8 Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Tue, 18 Oct 2022 22:02:10 +0900 -Subject: [PATCH 20/26] wifi: brcmfmac: Handle PCIe MSI properly - -On newer firmwares under at least certain conditions, MSI mode does not -leave interrupt flags set (they are cleared by the firmware). Handle -this by always checking for ring data when we get an MSI, regardless of -whether any IRQ flags were set. - -Signed-off-by: Hector Martin ---- - .../broadcom/brcm80211/brcmfmac/pcie.c | 23 +++++++++++++------ - 1 file changed, 16 insertions(+), 7 deletions(-) - -diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c -index ec58f0a83dbe42..2d0071df2b2bfc 100644 ---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c -+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c -@@ -400,6 +400,7 @@ struct brcmf_pciedev_info { - wait_queue_head_t mbdata_resp_wait; - bool mbdata_completed; - bool irq_allocated; -+ bool have_msi; - bool wowl_enabled; - u8 dma_idx_sz; - void *idxbuf; -@@ -976,6 +977,11 @@ static irqreturn_t brcmf_pcie_quick_check_isr(int irq, void *arg) - brcmf_dbg(PCIE, "Enter\n"); - return IRQ_WAKE_THREAD; - } -+ -+ /* mailboxint is cleared by the firmware in MSI mode */ -+ if (devinfo->have_msi) -+ return IRQ_WAKE_THREAD; -+ - return IRQ_NONE; - } - -@@ -992,13 +998,13 @@ static irqreturn_t brcmf_pcie_isr_thread(int irq, void *arg) - brcmf_pcie_write_reg32(devinfo, devinfo->reginfo->mailboxint, - status); - if (status & devinfo->reginfo->int_fn0) -- brcmf_pcie_handle_mb_data(devinfo); -- if (status & devinfo->reginfo->int_d2h_db) { -- if (devinfo->state == BRCMFMAC_PCIE_STATE_UP) -- brcmf_proto_msgbuf_rx_trigger( -- &devinfo->pdev->dev); -- } -+ brcmf_pcie_poll_mb_data(devinfo); - } -+ if (devinfo->have_msi || status & devinfo->reginfo->int_d2h_db) { -+ if (devinfo->state == BRCMFMAC_PCIE_STATE_UP) -+ brcmf_proto_msgbuf_rx_trigger(&devinfo->pdev->dev); -+ } -+ - brcmf_pcie_bus_console_read(devinfo, false); - if (devinfo->state == BRCMFMAC_PCIE_STATE_UP) - brcmf_pcie_intr_enable(devinfo); -@@ -1016,7 +1022,10 @@ static int brcmf_pcie_request_irq(struct brcmf_pciedev_info *devinfo) - - brcmf_dbg(PCIE, "Enter\n"); - -- pci_enable_msi(pdev); -+ devinfo->have_msi = pci_enable_msi(pdev) >= 0; -+ if (devinfo->have_msi) -+ brcmf_dbg(PCIE, "MSI enabled\n"); -+ - if (request_threaded_irq(pdev->irq, brcmf_pcie_quick_check_isr, - brcmf_pcie_isr_thread, IRQF_SHARED, - "brcmf_pcie_intr", devinfo)) { - -From cc715bdd066512ae2b507b776b0c2c49849e1213 Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Tue, 18 Oct 2022 22:06:40 +0900 -Subject: [PATCH 21/26] wifi: brcmfmac: Fix logic for deciding which doorbell - registers to use - -While the other >PCIe r64 registers (which are apparently called DAR -registers) are always used on newer revisions, which doorbell registers -should be used depends only on flags set by firmware. Take them out of -the reginfo struct and check the flag to decide instead. - -Signed-off-by: Hector Martin ---- - .../broadcom/brcm80211/brcmfmac/pcie.c | 20 +++++++++---------- - 1 file changed, 10 insertions(+), 10 deletions(-) - -diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c -index 2d0071df2b2bfc..b49dcdf70fccd3 100644 ---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c -+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c -@@ -481,8 +481,6 @@ struct brcmf_pcie_reginfo { - u32 intmask; - u32 mailboxint; - u32 mailboxmask; -- u32 h2d_mailbox_0; -- u32 h2d_mailbox_1; - u32 int_d2h_db; - u32 int_fn0; - }; -@@ -491,8 +489,6 @@ static const struct brcmf_pcie_reginfo brcmf_reginfo_default = { - .intmask = BRCMF_PCIE_PCIE2REG_INTMASK, - .mailboxint = BRCMF_PCIE_PCIE2REG_MAILBOXINT, - .mailboxmask = BRCMF_PCIE_PCIE2REG_MAILBOXMASK, -- .h2d_mailbox_0 = BRCMF_PCIE_PCIE2REG_H2D_MAILBOX_0, -- .h2d_mailbox_1 = BRCMF_PCIE_PCIE2REG_H2D_MAILBOX_1, - .int_d2h_db = BRCMF_PCIE_MB_INT_D2H_DB, - .int_fn0 = BRCMF_PCIE_MB_INT_FN0, - }; -@@ -501,8 +497,6 @@ static const struct brcmf_pcie_reginfo brcmf_reginfo_64 = { - .intmask = BRCMF_PCIE_64_PCIE2REG_INTMASK, - .mailboxint = BRCMF_PCIE_64_PCIE2REG_MAILBOXINT, - .mailboxmask = BRCMF_PCIE_64_PCIE2REG_MAILBOXMASK, -- .h2d_mailbox_0 = BRCMF_PCIE_64_PCIE2REG_H2D_MAILBOX_0, -- .h2d_mailbox_1 = BRCMF_PCIE_64_PCIE2REG_H2D_MAILBOX_1, - .int_d2h_db = BRCMF_PCIE_64_MB_INT_D2H_DB, - .int_fn0 = 0, - }; -@@ -963,9 +957,12 @@ static void brcmf_pcie_intr_enable(struct brcmf_pciedev_info *devinfo) - - static void brcmf_pcie_hostready(struct brcmf_pciedev_info *devinfo) - { -- if (devinfo->shared.flags & BRCMF_PCIE_SHARED_HOSTRDY_DB1) -- brcmf_pcie_write_reg32(devinfo, -- devinfo->reginfo->h2d_mailbox_1, 1); -+ if (devinfo->shared.flags & BRCMF_PCIE_SHARED_HOSTRDY_DB1) { -+ if (devinfo->shared.flags & BRCMF_PCIE_SHARED_DAR) -+ brcmf_pcie_write_reg32(devinfo, BRCMF_PCIE_64_PCIE2REG_H2D_MAILBOX_1, 1); -+ else -+ brcmf_pcie_write_reg32(devinfo, BRCMF_PCIE_PCIE2REG_H2D_MAILBOX_1, 1); -+ } - } - - static irqreturn_t brcmf_pcie_quick_check_isr(int irq, void *arg) -@@ -1114,7 +1111,10 @@ static int brcmf_pcie_ring_mb_ring_bell(void *ctx) - - brcmf_dbg(PCIE, "RING !\n"); - /* Any arbitrary value will do, lets use 1 */ -- brcmf_pcie_write_reg32(devinfo, devinfo->reginfo->h2d_mailbox_0, 1); -+ if (devinfo->shared.flags & BRCMF_PCIE_SHARED_DAR) -+ brcmf_pcie_write_reg32(devinfo, BRCMF_PCIE_64_PCIE2REG_H2D_MAILBOX_0, 1); -+ else -+ brcmf_pcie_write_reg32(devinfo, BRCMF_PCIE_PCIE2REG_H2D_MAILBOX_0, 1); - - return 0; - } - -From 8e76ec01738c0d63afb72ff681547b1efb530b69 Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Tue, 18 Oct 2022 22:10:08 +0900 -Subject: [PATCH 22/26] wifi: brcmfmac: Support v6+ flags and set host_cap - properly - -Interface versions 6 and above support having the host tell the dongle -about what it supports via a host_cap field (it seems that if it is set -to zero, some kind of unknown defaults are used). Explicitly support and -set this. - -This also disables OOB deep sleep support; it doesn't look like deep -sleep is properly supported yet at all (it needs more logic than merely -acking requests, which is all pcie.c does right now). - -Signed-off-by: Hector Martin ---- - .../broadcom/brcm80211/brcmfmac/pcie.c | 35 ++++++++++++++++++- - 1 file changed, 34 insertions(+), 1 deletion(-) - -diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c -index b49dcdf70fccd3..81d908b75de14c 100644 ---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c -+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c -@@ -347,6 +347,8 @@ struct brcmf_pcie_console { - struct brcmf_pcie_shared_info { - u32 tcm_base_address; - u32 flags; -+ u32 flags2; -+ u32 flags3; - struct brcmf_pcie_ringbuf *commonrings[BRCMF_NROF_COMMON_MSGRINGS]; - struct brcmf_pcie_ringbuf *flowrings; - u16 max_rxbufpost; -@@ -1661,12 +1663,16 @@ brcmf_pcie_init_share_ram_info(struct brcmf_pciedev_info *devinfo, - { - struct brcmf_bus *bus = dev_get_drvdata(&devinfo->pdev->dev); - struct brcmf_pcie_shared_info *shared; -+ u32 host_cap; -+ u32 host_cap2; - u32 addr; - - shared = &devinfo->shared; - shared->tcm_base_address = sharedram_addr; - -- shared->flags = brcmf_pcie_read_tcm32(devinfo, sharedram_addr); -+ shared->flags = brcmf_pcie_read_tcm32(devinfo, sharedram_addr + -+ BRCMF_SHARED_FLAGS_OFFSET); -+ - shared->version = (u8)(shared->flags & BRCMF_PCIE_SHARED_VERSION_MASK); - brcmf_dbg(PCIE, "PCIe protocol version %d\n", shared->version); - if ((shared->version > BRCMF_PCIE_MAX_SHARED_VERSION) || -@@ -1707,6 +1713,33 @@ brcmf_pcie_init_share_ram_info(struct brcmf_pciedev_info *devinfo, - brcmf_pcie_bus_console_init(devinfo); - brcmf_pcie_bus_console_read(devinfo, false); - -+ /* Features added in revision 6 follow */ -+ if (shared->version < 6) -+ return 0; -+ -+ shared->flags2 = brcmf_pcie_read_tcm32(devinfo, sharedram_addr + -+ BRCMF_SHARED_FLAGS2_OFFSET); -+ shared->flags3 = brcmf_pcie_read_tcm32(devinfo, sharedram_addr + -+ BRCMF_SHARED_FLAGS3_OFFSET); -+ -+ /* Update host support flags */ -+ host_cap = shared->version; -+ host_cap2 = 0; -+ -+ if (shared->flags & BRCMF_PCIE_SHARED_HOSTRDY_DB1) -+ host_cap |= BRCMF_HOSTCAP_H2D_ENABLE_HOSTRDY; -+ -+ if (shared->flags & BRCMF_PCIE_SHARED_DAR) -+ host_cap |= BRCMF_HOSTCAP_H2D_DAR; -+ -+ /* Disable DS: this is not currently properly supported */ -+ host_cap |= BRCMF_HOSTCAP_DS_NO_OOB_DW; -+ -+ brcmf_pcie_write_tcm32(devinfo, sharedram_addr + -+ BRCMF_SHARED_HOST_CAP_OFFSET, host_cap); -+ brcmf_pcie_write_tcm32(devinfo, sharedram_addr + -+ BRCMF_SHARED_HOST_CAP2_OFFSET, host_cap2); -+ - return 0; - } - - -From 3ea0fedefa1fe836caf71726a0060c1ec6d19fff Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Tue, 18 Oct 2022 21:55:52 +0900 -Subject: [PATCH 23/26] wifi: brcmfmac: Add newer msgbuf packet types up to - 0x2e - -There are many newer msgbuf packet types that are not yet listed in the -defines in msgbuf.c. Add them for future use. - -Signed-off-by: Hector Martin ---- - .../broadcom/brcm80211/brcmfmac/msgbuf.c | 26 +++++++++++++++++++ - 1 file changed, 26 insertions(+) - -diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c -index cec53f934940a6..6b462c8e0b54be 100644 ---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c -+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c -@@ -47,6 +47,32 @@ - #define MSGBUF_TYPE_RX_CMPLT 0x12 - #define MSGBUF_TYPE_LPBK_DMAXFER 0x13 - #define MSGBUF_TYPE_LPBK_DMAXFER_CMPLT 0x14 -+#define MSGBUF_TYPE_FLOW_RING_RESUME 0x15 -+#define MSGBUF_TYPE_FLOW_RING_RESUME_CMPLT 0x16 -+#define MSGBUF_TYPE_FLOW_RING_SUSPEND 0x17 -+#define MSGBUF_TYPE_FLOW_RING_SUSPEND_CMPLT 0x18 -+#define MSGBUF_TYPE_INFO_BUF_POST 0x19 -+#define MSGBUF_TYPE_INFO_BUF_CMPLT 0x1A -+#define MSGBUF_TYPE_H2D_RING_CREATE 0x1B -+#define MSGBUF_TYPE_D2H_RING_CREATE 0x1C -+#define MSGBUF_TYPE_H2D_RING_CREATE_CMPLT 0x1D -+#define MSGBUF_TYPE_D2H_RING_CREATE_CMPLT 0x1E -+#define MSGBUF_TYPE_H2D_RING_CONFIG 0x1F -+#define MSGBUF_TYPE_D2H_RING_CONFIG 0x20 -+#define MSGBUF_TYPE_H2D_RING_CONFIG_CMPLT 0x21 -+#define MSGBUF_TYPE_D2H_RING_CONFIG_CMPLT 0x22 -+#define MSGBUF_TYPE_H2D_MAILBOX_DATA 0x23 -+#define MSGBUF_TYPE_D2H_MAILBOX_DATA 0x24 -+#define MSGBUF_TYPE_TIMSTAMP_BUFPOST 0x25 -+#define MSGBUF_TYPE_HOSTTIMSTAMP 0x26 -+#define MSGBUF_TYPE_HOSTTIMSTAMP_CMPLT 0x27 -+#define MSGBUF_TYPE_FIRMWARE_TIMESTAMP 0x28 -+#define MSGBUF_TYPE_SNAPSHOT_UPLOAD 0x29 -+#define MSGBUF_TYPE_SNAPSHOT_CMPLT 0x2A -+#define MSGBUF_TYPE_H2D_RING_DELETE 0x2B -+#define MSGBUF_TYPE_D2H_RING_DELETE 0x2C -+#define MSGBUF_TYPE_H2D_RING_DELETE_CMPLT 0x2D -+#define MSGBUF_TYPE_D2H_RING_DELETE_CMPLT 0x2E - - #define NR_TX_PKTIDS 2048 - #define NR_RX_PKTIDS 1024 - -From caddbfef02f63b2b7b119ff58043dde5f9dad61f Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Tue, 18 Oct 2022 21:56:53 +0900 -Subject: [PATCH 24/26] wifi: brcmfmac: Add a new bus op for D2H mailbox - message handling - -Newer firmware versions use the common ring for sending mailbox messages -between the dongle and host, instead of the hardware mailboxes. This -needs the protocol driver to call back into the bus driver, so add a -callback for this to bus.h. - -Signed-off-by: Hector Martin ---- - drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h | 10 ++++++++++ - 1 file changed, 10 insertions(+) - -diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h -index 4802692c91f765..c350af827003b6 100644 ---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h -+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h -@@ -89,6 +89,7 @@ struct brcmf_bus_ops { - enum brcmf_blob_type type); - void (*debugfs_create)(struct device *dev); - int (*reset)(struct device *dev); -+ void (*d2h_mb_rx)(struct device *dev, u32 data); - }; - - -@@ -252,6 +253,15 @@ int brcmf_bus_reset(struct brcmf_bus *bus) - return bus->ops->reset(bus->dev); - } - -+static inline -+void brcmf_bus_d2h_mb_rx(struct brcmf_bus *bus, u32 data) -+{ -+ if (!bus->ops->d2h_mb_rx) -+ return; -+ -+ return bus->ops->d2h_mb_rx(bus->dev, data); -+} -+ - /* - * interface functions from common layer - */ - -From 9318e60cd2aa1dc88feba0f6fa14f3e1bba2b0a0 Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Tue, 18 Oct 2022 21:58:21 +0900 -Subject: [PATCH 25/26] wifi: brcmfmac: Implement the H2D/D2H mailbox data - commonring messages - -Newer firmware versions use these to exchange mailbox data, instead of -the hardware mailbox registers. Add handling for them to msgbuf.c. - -Signed-off-by: Hector Martin ---- - .../broadcom/brcm80211/brcmfmac/msgbuf.c | 59 +++++++++++++++++++ - .../broadcom/brcm80211/brcmfmac/msgbuf.h | 1 + - 2 files changed, 60 insertions(+) - -diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c -index 6b462c8e0b54be..e737db3f5774c8 100644 ---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c -+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c -@@ -244,6 +244,19 @@ struct msgbuf_flowring_flush_resp { - __le32 rsvd0[3]; - }; - -+struct msgbuf_h2d_mailbox_data { -+ struct msgbuf_common_hdr msg; -+ __le32 data; -+ __le32 rsvd0[7]; -+}; -+ -+struct msgbuf_d2h_mailbox_data { -+ struct msgbuf_common_hdr msg; -+ struct msgbuf_completion_hdr compl_hdr; -+ __le32 data; -+ __le32 rsvd0[2]; -+}; -+ - struct brcmf_msgbuf_work_item { - struct list_head queue; - u32 flowid; -@@ -1308,6 +1321,16 @@ brcmf_msgbuf_process_flow_ring_delete_response(struct brcmf_msgbuf *msgbuf, - } - - -+static void brcmf_msgbuf_process_d2h_mailbox_data(struct brcmf_msgbuf *msgbuf, -+ void *buf) -+{ -+ struct msgbuf_d2h_mailbox_data *d2h_mb_data = buf; -+ struct brcmf_pub *drvr = msgbuf->drvr; -+ -+ brcmf_bus_d2h_mb_rx(drvr->bus_if, le32_to_cpu(d2h_mb_data->data)); -+} -+ -+ - static void brcmf_msgbuf_process_msgtype(struct brcmf_msgbuf *msgbuf, void *buf) - { - struct brcmf_pub *drvr = msgbuf->drvr; -@@ -1350,6 +1373,10 @@ static void brcmf_msgbuf_process_msgtype(struct brcmf_msgbuf *msgbuf, void *buf) - brcmf_dbg(MSGBUF, "MSGBUF_TYPE_RX_CMPLT\n"); - brcmf_msgbuf_process_rx_complete(msgbuf, buf); - break; -+ case MSGBUF_TYPE_D2H_MAILBOX_DATA: -+ brcmf_dbg(MSGBUF, "MSGBUF_TYPE_D2H_MAILBOX_DATA\n"); -+ brcmf_msgbuf_process_d2h_mailbox_data(msgbuf, buf); -+ break; - default: - bphy_err(drvr, "Unsupported msgtype %d\n", msg->msgtype); - break; -@@ -1488,6 +1515,38 @@ void brcmf_msgbuf_delete_flowring(struct brcmf_pub *drvr, u16 flowid) - } - } - -+ -+int brcmf_msgbuf_h2d_mb_write(struct brcmf_pub *drvr, u32 data) -+{ -+ struct brcmf_msgbuf *msgbuf = (struct brcmf_msgbuf *)drvr->proto->pd; -+ struct brcmf_commonring *commonring; -+ struct msgbuf_h2d_mailbox_data *request; -+ void *ret_ptr; -+ int err; -+ -+ commonring = msgbuf->commonrings[BRCMF_H2D_MSGRING_CONTROL_SUBMIT]; -+ brcmf_commonring_lock(commonring); -+ ret_ptr = brcmf_commonring_reserve_for_write(commonring); -+ if (!ret_ptr) { -+ bphy_err(drvr, "Failed to reserve space in commonring\n"); -+ brcmf_commonring_unlock(commonring); -+ return -ENOMEM; -+ } -+ -+ request = (struct msgbuf_h2d_mailbox_data *)ret_ptr; -+ request->msg.msgtype = MSGBUF_TYPE_H2D_MAILBOX_DATA; -+ request->msg.ifidx = -1; -+ request->msg.flags = 0; -+ request->msg.request_id = 0; -+ request->data = data; -+ -+ err = brcmf_commonring_write_complete(commonring); -+ brcmf_commonring_unlock(commonring); -+ -+ return err; -+} -+ -+ - #ifdef DEBUG - static int brcmf_msgbuf_stats_read(struct seq_file *seq, void *data) - { -diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.h -index 6a849f4a94dd7f..89b6b7f9ddb748 100644 ---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.h -+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.h -@@ -32,6 +32,7 @@ int brcmf_proto_msgbuf_rx_trigger(struct device *dev); - void brcmf_msgbuf_delete_flowring(struct brcmf_pub *drvr, u16 flowid); - int brcmf_proto_msgbuf_attach(struct brcmf_pub *drvr); - void brcmf_proto_msgbuf_detach(struct brcmf_pub *drvr); -+int brcmf_msgbuf_h2d_mb_write(struct brcmf_pub *drvr, u32 data); - #else - static inline int brcmf_proto_msgbuf_attach(struct brcmf_pub *drvr) - { - -From 306575a75261ada4c85e47ed74a0a030b74f37cf Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Tue, 18 Oct 2022 22:12:15 +0900 -Subject: [PATCH 26/26] wifi: brcmfmac: Support exchanging power mailbox - messages via commonring - -Newer firmwares have switched from using the hardware mailbox to -commonring messages for power mailbox data. Implement this, which makes -D3 work on WiFi chipsets in Apple devices. - -This is only enabled on v6 or newer, iff BRCMF_PCIE_SHARED_USE_MAILBOX -is not set in the flags. - -Signed-off-by: Hector Martin ---- - .../broadcom/brcm80211/brcmfmac/pcie.c | 73 ++++++++++++++----- - 1 file changed, 54 insertions(+), 19 deletions(-) - -diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c -index 81d908b75de14c..a3c66b808bc17c 100644 ---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c -+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c -@@ -365,6 +365,7 @@ struct brcmf_pcie_shared_info { - void *ringupd; - dma_addr_t ringupd_dmahandle; - u8 version; -+ bool mb_via_ctl; - }; - - struct brcmf_pcie_core_info { -@@ -808,6 +809,19 @@ brcmf_pcie_send_mb_data(struct brcmf_pciedev_info *devinfo, u32 htod_mb_data) - u32 i; - - shared = &devinfo->shared; -+ -+ if (shared->mb_via_ctl) { -+ struct pci_dev *pdev = devinfo->pdev; -+ struct brcmf_bus *bus = dev_get_drvdata(&pdev->dev); -+ int ret; -+ -+ ret = brcmf_msgbuf_h2d_mb_write(bus->drvr, htod_mb_data); -+ if (ret < 0) -+ brcmf_err(bus, "Failed to send H2D mailbox data (%d)\n", -+ ret); -+ return ret; -+ } -+ - addr = shared->htod_mb_data_addr; - cur_htod_mb_data = brcmf_pcie_read_tcm32(devinfo, addr); - -@@ -835,8 +849,29 @@ brcmf_pcie_send_mb_data(struct brcmf_pciedev_info *devinfo, u32 htod_mb_data) - return 0; - } - -+static void brcmf_pcie_handle_mb_data(struct brcmf_pciedev_info *devinfo, u32 data) -+{ -+ brcmf_dbg(PCIE, "D2H_MB_DATA: 0x%04x\n", data); -+ if (data & BRCMF_D2H_DEV_DS_ENTER_REQ) { -+ brcmf_dbg(PCIE, "D2H_MB_DATA: DEEP SLEEP REQ\n"); -+ brcmf_pcie_send_mb_data(devinfo, BRCMF_H2D_HOST_DS_ACK); -+ brcmf_dbg(PCIE, "D2H_MB_DATA: sent DEEP SLEEP ACK\n"); -+ } -+ if (data & BRCMF_D2H_DEV_DS_EXIT_NOTE) -+ brcmf_dbg(PCIE, "D2H_MB_DATA: DEEP SLEEP EXIT\n"); -+ if (data & BRCMF_D2H_DEV_D3_ACK) { -+ brcmf_dbg(PCIE, "D2H_MB_DATA: D3 ACK\n"); -+ devinfo->mbdata_completed = true; -+ wake_up(&devinfo->mbdata_resp_wait); -+ } -+ if (data & BRCMF_D2H_DEV_FWHALT) { -+ brcmf_dbg(PCIE, "D2H_MB_DATA: FW HALT\n"); -+ brcmf_fw_crashed(&devinfo->pdev->dev); -+ } -+} -+ - --static void brcmf_pcie_handle_mb_data(struct brcmf_pciedev_info *devinfo) -+static void brcmf_pcie_poll_mb_data(struct brcmf_pciedev_info *devinfo) - { - struct brcmf_pcie_shared_info *shared; - u32 addr; -@@ -851,23 +886,16 @@ static void brcmf_pcie_handle_mb_data(struct brcmf_pciedev_info *devinfo) - - brcmf_pcie_write_tcm32(devinfo, addr, 0); - -- brcmf_dbg(PCIE, "D2H_MB_DATA: 0x%04x\n", dtoh_mb_data); -- if (dtoh_mb_data & BRCMF_D2H_DEV_DS_ENTER_REQ) { -- brcmf_dbg(PCIE, "D2H_MB_DATA: DEEP SLEEP REQ\n"); -- brcmf_pcie_send_mb_data(devinfo, BRCMF_H2D_HOST_DS_ACK); -- brcmf_dbg(PCIE, "D2H_MB_DATA: sent DEEP SLEEP ACK\n"); -- } -- if (dtoh_mb_data & BRCMF_D2H_DEV_DS_EXIT_NOTE) -- brcmf_dbg(PCIE, "D2H_MB_DATA: DEEP SLEEP EXIT\n"); -- if (dtoh_mb_data & BRCMF_D2H_DEV_D3_ACK) { -- brcmf_dbg(PCIE, "D2H_MB_DATA: D3 ACK\n"); -- devinfo->mbdata_completed = true; -- wake_up(&devinfo->mbdata_resp_wait); -- } -- if (dtoh_mb_data & BRCMF_D2H_DEV_FWHALT) { -- brcmf_dbg(PCIE, "D2H_MB_DATA: FW HALT\n"); -- brcmf_fw_crashed(&devinfo->pdev->dev); -- } -+ brcmf_pcie_handle_mb_data(devinfo, dtoh_mb_data); -+} -+ -+ -+static void brcmf_pcie_d2h_mb_rx(struct device *dev, u32 data) -+{ -+ struct brcmf_bus *bus_if = dev_get_drvdata(dev); -+ struct brcmf_pciedev *buspub = bus_if->bus_priv.pcie; -+ -+ brcmf_pcie_handle_mb_data(buspub->devinfo, data); - } - - -@@ -1632,6 +1660,7 @@ static const struct brcmf_bus_ops brcmf_pcie_bus_ops = { - .get_memdump = brcmf_pcie_get_memdump, - .get_blob = brcmf_pcie_get_blob, - .reset = brcmf_pcie_reset, -+ .d2h_mb_rx = brcmf_pcie_d2h_mb_rx, - }; - - -@@ -1722,6 +1751,10 @@ brcmf_pcie_init_share_ram_info(struct brcmf_pciedev_info *devinfo, - shared->flags3 = brcmf_pcie_read_tcm32(devinfo, sharedram_addr + - BRCMF_SHARED_FLAGS3_OFFSET); - -+ /* Check which mailbox mechanism to use */ -+ if (!(shared->flags & BRCMF_PCIE_SHARED_USE_MAILBOX)) -+ shared->mb_via_ctl = true; -+ - /* Update host support flags */ - host_cap = shared->version; - host_cap2 = 0; -@@ -2567,10 +2600,11 @@ static int brcmf_pcie_pm_leave_D3(struct device *dev) - /* Check if device is still up and running, if so we are ready */ - if (brcmf_pcie_read_reg32(devinfo, devinfo->reginfo->intmask) != 0) { - brcmf_dbg(PCIE, "Try to wakeup device....\n"); -+ /* Set the device up, so we can write the MB data message in ring mode */ -+ devinfo->state = BRCMFMAC_PCIE_STATE_UP; - if (brcmf_pcie_send_mb_data(devinfo, BRCMF_H2D_HOST_D0_INFORM)) - goto cleanup; - brcmf_dbg(PCIE, "Hot resume, continue....\n"); -- devinfo->state = BRCMFMAC_PCIE_STATE_UP; - brcmf_pcie_select_core(devinfo, BCMA_CORE_PCIE2); - brcmf_bus_change_state(bus, BRCMF_BUS_UP); - brcmf_pcie_intr_enable(devinfo); -@@ -2579,6 +2613,7 @@ static int brcmf_pcie_pm_leave_D3(struct device *dev) - } - - cleanup: -+ devinfo->state = BRCMFMAC_PCIE_STATE_DOWN; - brcmf_chip_detach(devinfo->ci); - devinfo->ci = NULL; - pdev = devinfo->pdev;