From: Michael Reeves via B4 Relay <devnull+michael.reeves077.gmail.com@kernel.org>
To: Arend van Spriel <arend.vanspriel@broadcom.com>,
Pieter-Paul Giesberts <pieterpg@broadcom.com>,
"Franky Lin (Zhenhui)" <frankyl@broadcom.com>,
Mathy Vanhoef <vanhoefm@gmail.com>,
Kalle Valo <kvalo@kernel.org>, Kees Cook <kees@kernel.org>,
"Gustavo A. R. Silva" <gustavoars@kernel.org>
Cc: linux-wireless@vger.kernel.org, brcm80211@lists.linux.dev,
brcm80211-dev-list.pdl@broadcom.com, asahi@lists.linux.dev,
Hector Martin <marcan@marcan.st>,
Daniel Berlin <dberlin@dberlin.org>, Janne Grunau <j@jannau.net>,
linux-kernel@vger.kernel.org,
Hante Meuleman <meuleman@broadcom.com>,
linux-hardening@vger.kernel.org,
Michael Reeves <michael.reeves077@gmail.com>
Subject: [PATCH 04/13] wifi: brcmfmac: Support newer PCIe core startup and interrupts
Date: Fri, 25 Sep 2026 23:43:39 +1000 [thread overview]
Message-ID: <20260925-brcm4388-submit-v1-4-b5cbc2cde2fb@gmail.com> (raw)
In-Reply-To: <20260925-brcm4388-submit-v1-0-b5cbc2cde2fb@gmail.com>
From: Hector Martin <marcan@marcan.st>
Newer Broadcom chips, such as BCM4388, require changes to PCIe register
access, watchdog reset, and RAM size detection. PCIe core revision 64
and higher uses a different BAR0 register window. ChipCommon revision 65
and higher requires a different watchdog reset sequence.
Update register access and reset for these revisions. Decode the SYSMEM
bank counts according to the core revision and exclude ROM banks from
RAM size calculation. Disable all detected D11 cores during CA7 setup
and select H2D doorbells based on the firmware DAR flag.
In MSI mode, firmware can clear the mailbox interrupt status before the
host reads it. Requiring a nonzero status can therefore discard valid
interrupts. Process ring events without that requirement when MSI is
enabled. Use release/acquire ordering on irq_ready to publish the
initialized rings before the interrupt thread accesses them.
Signed-off-by: Hector Martin <marcan@marcan.st>
Co-developed-by: Michael Reeves <michael.reeves077@gmail.com>
Signed-off-by: Michael Reeves <michael.reeves077@gmail.com>
---
.../wireless/broadcom/brcm80211/brcmfmac/chip.c | 35 +++-
.../wireless/broadcom/brcm80211/brcmfmac/pcie.c | 197 ++++++++++++++++-----
.../broadcom/brcm80211/include/chipcommon.h | 5 +
3 files changed, 183 insertions(+), 54 deletions(-)
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
index 4adc0d0e42..253ab45c33 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
@@ -162,6 +162,15 @@ struct sbconfig {
#define SRCI_SRBSZ_SHIFT 0
#define SR_BSZ_BASE 14
+#define SYSMEM_SRCI_ROMNB_MASK 0x3e0
+#define SYSMEM_SRCI_ROMNB_SHIFT 5
+#define SYSMEM_SRCI_SRNB_MASK 0x1f
+#define SYSMEM_SRCI_SRNB_SHIFT 0
+#define SYSMEM_SRCI_NEW_ROMNB_MASK 0xff000000
+#define SYSMEM_SRCI_NEW_ROMNB_SHIFT 24
+#define SYSMEM_SRCI_NEW_SRNB_MASK 0x00ff0000
+#define SYSMEM_SRCI_NEW_SRNB_SHIFT 16
+
struct sbsocramregs {
u32 coreinfo;
u32 bwalloc;
@@ -659,6 +668,7 @@ static u32 brcmf_chip_sysmem_ramsize(struct brcmf_core_priv *sysmem)
u32 memsize = 0;
u32 coreinfo;
u32 idx;
+ u32 nrb;
u32 nb;
u32 banksize;
@@ -666,10 +676,20 @@ static u32 brcmf_chip_sysmem_ramsize(struct brcmf_core_priv *sysmem)
brcmf_chip_resetcore(&sysmem->pub, 0, 0, 0);
coreinfo = brcmf_chip_core_read32(sysmem, SYSMEMREGOFFS(coreinfo));
- nb = (coreinfo & SRCI_SRNB_MASK) >> SRCI_SRNB_SHIFT;
+ if (sysmem->pub.rev >= 12) {
+ nrb = (coreinfo & SYSMEM_SRCI_NEW_ROMNB_MASK) >>
+ SYSMEM_SRCI_NEW_ROMNB_SHIFT;
+ nb = (coreinfo & SYSMEM_SRCI_NEW_SRNB_MASK) >>
+ SYSMEM_SRCI_NEW_SRNB_SHIFT;
+ } else {
+ nrb = (coreinfo & SYSMEM_SRCI_ROMNB_MASK) >>
+ SYSMEM_SRCI_ROMNB_SHIFT;
+ nb = (coreinfo & SYSMEM_SRCI_SRNB_MASK) >>
+ SYSMEM_SRCI_SRNB_SHIFT;
+ }
for (idx = 0; idx < nb; idx++) {
- brcmf_chip_socram_banksize(sysmem, idx, &banksize);
+ brcmf_chip_socram_banksize(sysmem, idx + nrb, &banksize);
memsize += banksize;
}
@@ -1353,14 +1373,15 @@ static inline void
brcmf_chip_ca7_set_passive(struct brcmf_chip_priv *chip)
{
struct brcmf_core *core;
+ int i;
brcmf_chip_disable_arm(chip, BCMA_CORE_ARM_CA7);
- core = brcmf_chip_get_core(&chip->pub, BCMA_CORE_80211);
- brcmf_chip_resetcore(core, D11_BCMA_IOCTL_PHYRESET |
- D11_BCMA_IOCTL_PHYCLOCKEN,
- D11_BCMA_IOCTL_PHYCLOCKEN,
- D11_BCMA_IOCTL_PHYCLOCKEN);
+ /* Leave all D11 cores disabled for the firmware to enable. */
+ for (i = 0; (core = brcmf_chip_get_d11core(&chip->pub, i)); i++)
+ brcmf_chip_coredisable(core, D11_BCMA_IOCTL_PHYRESET |
+ D11_BCMA_IOCTL_PHYCLOCKEN,
+ D11_BCMA_IOCTL_PHYCLOCKEN);
}
static bool brcmf_chip_ca7_set_active(struct brcmf_chip_priv *chip, u32 rstvec)
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
index 5d84526c96..5917ee5fd7 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
@@ -220,6 +220,8 @@ static const struct brcmf_firmware_mapping brcmf_pcie_fwnames[] = {
#define BRCMF_PCIE_SHARED_DMA_INDEX 0x10000
#define BRCMF_PCIE_SHARED_DMA_2B_IDX 0x100000
#define BRCMF_PCIE_SHARED_HOSTRDY_DB1 0x10000000
+#define BRCMF_PCIE_SHARED_DAR 0x80000000
+
#define BRCMF_PCIE_FLAGS_HTOD_SPLIT 0x4000
#define BRCMF_PCIE_FLAGS_DTOH_SPLIT 0x8000
@@ -280,6 +282,7 @@ static const struct brcmf_firmware_mapping brcmf_pcie_fwnames[] = {
#define BRCMF_PCIE_CFGREG_PML1_SUB_CTRL1 0x248
#define BRCMF_PCIE_CFGREG_REG_BAR2_CONFIG 0x4E0
#define BRCMF_PCIE_CFGREG_REG_BAR3_CONFIG 0x4F4
+#define BRCMF_PCIE_CFGREG_TLCNTRL_5 0x814
#define BRCMF_PCIE_LINK_STATUS_CTRL_ASPM_ENAB 3
/* Magic number at a magic location to find RAM size */
@@ -346,6 +349,8 @@ struct brcmf_pciedev_info {
wait_queue_head_t mbdata_resp_wait;
bool mbdata_completed;
bool irq_allocated;
+ bool irq_ready;
+ bool have_msi;
bool wowl_enabled;
u8 dma_idx_sz;
void *idxbuf;
@@ -432,8 +437,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;
};
@@ -442,8 +445,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,
};
@@ -452,8 +453,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,
};
@@ -492,6 +491,46 @@ brcmf_pcie_write_reg32(struct brcmf_pciedev_info *devinfo, u32 reg_offset,
iowrite32(value, address);
}
+static bool
+brcmf_pcie_use_pcie2_bar0_window(struct brcmf_pciedev_info *devinfo)
+{
+ struct brcmf_core *core;
+
+ if (!devinfo->ci)
+ return false;
+
+ core = brcmf_chip_get_core(devinfo->ci, BCMA_CORE_PCIE2);
+ return core && core->rev >= 64;
+}
+
+static u32
+brcmf_pcie_pcie2_reg_offset(struct brcmf_pciedev_info *devinfo,
+ u32 reg_offset)
+{
+ if (brcmf_pcie_use_pcie2_bar0_window(devinfo))
+ return BRCMF_PCIE_BARO_PCIE_ENUM_OFFSET + reg_offset;
+
+ return reg_offset;
+}
+
+static u32
+brcmf_pcie_read_pcie32(struct brcmf_pciedev_info *devinfo, u32 reg_offset)
+{
+ return brcmf_pcie_read_reg32(devinfo,
+ brcmf_pcie_pcie2_reg_offset(devinfo,
+ reg_offset));
+}
+
+static void
+brcmf_pcie_write_pcie32(struct brcmf_pciedev_info *devinfo, u32 reg_offset,
+ u32 value)
+{
+ brcmf_pcie_write_reg32(devinfo,
+ brcmf_pcie_pcie2_reg_offset(devinfo,
+ reg_offset),
+ value);
+}
+
static u8
brcmf_pcie_read_tcm8(struct brcmf_pciedev_info *devinfo, u32 mem_offset)
@@ -685,8 +724,29 @@ static void brcmf_pcie_reset_device(struct brcmf_pciedev_info *devinfo)
/* Watchdog reset */
brcmf_pcie_select_core(devinfo, BCMA_CORE_CHIPCOMMON);
- WRITECC32(devinfo, watchdog, 4);
- msleep(100);
+ core = brcmf_chip_get_chipcommon(devinfo->ci);
+ if (core->rev >= 65) {
+ u32 mask = CC_WD_SSRESET_PCIE_F0_EN;
+
+ core = brcmf_chip_get_core(devinfo->ci, BCMA_CORE_PCIE2);
+ if (core->rev < 66)
+ mask |= CC_WD_SSRESET_PCIE_ALL_FN_EN;
+
+ val = READCC32(devinfo, watchdog);
+ val &= ~CC_WD_ENABLE_MASK;
+ val |= mask;
+ WRITECC32(devinfo, watchdog, val);
+ val &= ~CC_WD_COUNTER_MASK;
+ val |= 4;
+ WRITECC32(devinfo, watchdog, val);
+ fsleep(10000);
+ val = READCC32(devinfo, intstatus);
+ val |= mask;
+ WRITECC32(devinfo, intstatus, val);
+ } else {
+ WRITECC32(devinfo, watchdog, 4);
+ msleep(100);
+ }
/* Restore ASPM */
brcmf_pcie_select_core(devinfo, BCMA_CORE_PCIE2);
@@ -696,16 +756,13 @@ static void brcmf_pcie_reset_device(struct brcmf_pciedev_info *devinfo)
core = brcmf_chip_get_core(devinfo->ci, BCMA_CORE_PCIE2);
if (core->rev <= 13) {
for (i = 0; i < ARRAY_SIZE(cfg_offset); i++) {
- brcmf_pcie_write_reg32(devinfo,
- BRCMF_PCIE_PCIE2REG_CONFIGADDR,
- cfg_offset[i]);
- val = brcmf_pcie_read_reg32(devinfo,
- BRCMF_PCIE_PCIE2REG_CONFIGDATA);
+ brcmf_pcie_write_pcie32(devinfo, BRCMF_PCIE_PCIE2REG_CONFIGADDR,
+ cfg_offset[i]);
+ val = brcmf_pcie_read_pcie32(devinfo, BRCMF_PCIE_PCIE2REG_CONFIGDATA);
brcmf_dbg(PCIE, "config offset 0x%04x, value 0x%04x\n",
cfg_offset[i], val);
- brcmf_pcie_write_reg32(devinfo,
- BRCMF_PCIE_PCIE2REG_CONFIGDATA,
- val);
+ brcmf_pcie_write_pcie32(devinfo, BRCMF_PCIE_PCIE2REG_CONFIGDATA,
+ val);
}
}
}
@@ -717,9 +774,12 @@ static void brcmf_pcie_attach(struct brcmf_pciedev_info *devinfo)
/* BAR1 window may not be sized properly */
brcmf_pcie_select_core(devinfo, BCMA_CORE_PCIE2);
- brcmf_pcie_write_reg32(devinfo, BRCMF_PCIE_PCIE2REG_CONFIGADDR, 0x4e0);
- config = brcmf_pcie_read_reg32(devinfo, BRCMF_PCIE_PCIE2REG_CONFIGDATA);
- brcmf_pcie_write_reg32(devinfo, BRCMF_PCIE_PCIE2REG_CONFIGDATA, config);
+ brcmf_pcie_write_pcie32(devinfo, BRCMF_PCIE_PCIE2REG_CONFIGADDR,
+ 0x4e0);
+ config = brcmf_pcie_read_pcie32(devinfo,
+ BRCMF_PCIE_PCIE2REG_CONFIGDATA);
+ brcmf_pcie_write_pcie32(devinfo, BRCMF_PCIE_PCIE2REG_CONFIGDATA,
+ config);
device_wakeup_enable(&devinfo->pdev->dev);
}
@@ -738,6 +798,21 @@ static int brcmf_pcie_enter_download_state(struct brcmf_pciedev_info *devinfo)
brcmf_pcie_write_reg32(devinfo, BRCMF_PCIE_ARMCR4REG_BANKPDA,
0);
}
+ if (brcmf_pcie_use_pcie2_bar0_window(devinfo)) {
+ brcmf_pcie_write_pcie32(devinfo,
+ devinfo->reginfo->mailboxmask, 0);
+ brcmf_pcie_write_pcie32(devinfo,
+ devinfo->reginfo->mailboxint,
+ 0xffffffff);
+ pci_write_config_dword(devinfo->pdev, BRCMF_PCIE_REG_INTMASK,
+ 0);
+ brcmf_pcie_write_pcie32(devinfo,
+ BRCMF_PCIE_PCIE2REG_CONFIGADDR,
+ BRCMF_PCIE_CFGREG_TLCNTRL_5);
+ brcmf_pcie_write_pcie32(devinfo,
+ BRCMF_PCIE_PCIE2REG_CONFIGDATA,
+ 0xffffffff);
+ }
return 0;
}
@@ -906,33 +981,48 @@ static void brcmf_pcie_bus_console_read(struct brcmf_pciedev_info *devinfo,
static void brcmf_pcie_intr_disable(struct brcmf_pciedev_info *devinfo)
{
- brcmf_pcie_write_reg32(devinfo, devinfo->reginfo->mailboxmask, 0);
+ WRITE_ONCE(devinfo->irq_ready, false);
+ brcmf_pcie_write_pcie32(devinfo, devinfo->reginfo->mailboxmask, 0);
}
static void brcmf_pcie_intr_enable(struct brcmf_pciedev_info *devinfo)
{
- brcmf_pcie_write_reg32(devinfo, devinfo->reginfo->mailboxmask,
- devinfo->reginfo->int_d2h_db |
- devinfo->reginfo->int_fn0);
+ u32 mask = devinfo->reginfo->int_d2h_db | devinfo->reginfo->int_fn0;
+
+ /* Publish initialized rings before accepting firmware MSIs. */
+ smp_store_release(&devinfo->irq_ready, true);
+ brcmf_pcie_write_pcie32(devinfo, devinfo->reginfo->mailboxmask, mask);
}
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);
+ u32 reg;
+
+ if (!(devinfo->shared.flags & BRCMF_PCIE_SHARED_HOSTRDY_DB1))
+ return;
+
+ reg = devinfo->shared.flags & BRCMF_PCIE_SHARED_DAR ?
+ BRCMF_PCIE_64_PCIE2REG_H2D_MAILBOX_1 :
+ BRCMF_PCIE_PCIE2REG_H2D_MAILBOX_1;
+ brcmf_pcie_write_pcie32(devinfo, reg, 1);
}
static irqreturn_t brcmf_pcie_quick_check_isr(int irq, void *arg)
{
struct brcmf_pciedev_info *devinfo = (struct brcmf_pciedev_info *)arg;
- if (brcmf_pcie_read_reg32(devinfo, devinfo->reginfo->mailboxint)) {
- brcmf_pcie_intr_disable(devinfo);
+ if (brcmf_pcie_read_pcie32(devinfo, devinfo->reginfo->mailboxint)) {
+ brcmf_pcie_write_pcie32(devinfo,
+ devinfo->reginfo->mailboxmask, 0);
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;
}
@@ -942,23 +1032,28 @@ static irqreturn_t brcmf_pcie_isr_thread(int irq, void *arg)
struct brcmf_pciedev_info *devinfo = (struct brcmf_pciedev_info *)arg;
u32 status;
+ /* Pair with ring publication in brcmf_pcie_intr_enable(). */
+ if (!smp_load_acquire(&devinfo->irq_ready))
+ return IRQ_HANDLED;
+
devinfo->in_irq = true;
- status = brcmf_pcie_read_reg32(devinfo, devinfo->reginfo->mailboxint);
+ status = brcmf_pcie_read_pcie32(devinfo, devinfo->reginfo->mailboxint);
brcmf_dbg(PCIE, "Enter %x\n", status);
if (status) {
- brcmf_pcie_write_reg32(devinfo, devinfo->reginfo->mailboxint,
- status);
+ brcmf_pcie_write_pcie32(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);
- }
+ }
+ 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);
+ if (devinfo->state == BRCMFMAC_PCIE_STATE_UP &&
+ READ_ONCE(devinfo->irq_ready))
+ brcmf_pcie_write_pcie32(devinfo, devinfo->reginfo->mailboxmask,
+ devinfo->reginfo->int_d2h_db |
+ devinfo->reginfo->int_fn0);
devinfo->in_irq = false;
return IRQ_HANDLED;
}
@@ -973,11 +1068,13 @@ 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 (request_threaded_irq(pdev->irq, brcmf_pcie_quick_check_isr,
brcmf_pcie_isr_thread, IRQF_SHARED,
"brcmf_pcie_intr", devinfo)) {
- pci_disable_msi(pdev);
+ if (devinfo->have_msi)
+ pci_disable_msi(pdev);
+ devinfo->have_msi = false;
brcmf_err(bus, "Failed to request IRQ %d\n", pdev->irq);
return -EIO;
}
@@ -998,7 +1095,9 @@ static void brcmf_pcie_release_irq(struct brcmf_pciedev_info *devinfo)
brcmf_pcie_intr_disable(devinfo);
free_irq(pdev->irq, devinfo);
- pci_disable_msi(pdev);
+ if (devinfo->have_msi)
+ pci_disable_msi(pdev);
+ devinfo->have_msi = false;
msleep(50);
count = 0;
@@ -1009,8 +1108,8 @@ static void brcmf_pcie_release_irq(struct brcmf_pciedev_info *devinfo)
if (devinfo->in_irq)
brcmf_err(bus, "Still in IRQ (processing) !!!\n");
- status = brcmf_pcie_read_reg32(devinfo, devinfo->reginfo->mailboxint);
- brcmf_pcie_write_reg32(devinfo, devinfo->reginfo->mailboxint, status);
+ status = brcmf_pcie_read_pcie32(devinfo, devinfo->reginfo->mailboxint);
+ brcmf_pcie_write_pcie32(devinfo, devinfo->reginfo->mailboxint, status);
devinfo->irq_allocated = false;
}
@@ -1056,13 +1155,17 @@ static int brcmf_pcie_ring_mb_ring_bell(void *ctx)
{
struct brcmf_pcie_ringbuf *ring = (struct brcmf_pcie_ringbuf *)ctx;
struct brcmf_pciedev_info *devinfo = ring->devinfo;
+ u32 reg;
if (devinfo->state != BRCMFMAC_PCIE_STATE_UP)
return -EIO;
brcmf_dbg(PCIE, "RING !\n");
+ reg = devinfo->shared.flags & BRCMF_PCIE_SHARED_DAR ?
+ BRCMF_PCIE_64_PCIE2REG_H2D_MAILBOX_0 :
+ BRCMF_PCIE_PCIE2REG_H2D_MAILBOX_0;
/* Any arbitrary value will do, lets use 1 */
- brcmf_pcie_write_reg32(devinfo, devinfo->reginfo->h2d_mailbox_0, 1);
+ brcmf_pcie_write_pcie32(devinfo, reg, 1);
return 0;
}
@@ -1892,9 +1995,9 @@ static int brcmf_pcie_buscore_reset(void *ctx, struct brcmf_chip *chip)
else
reg = BRCMF_PCIE_PCIE2REG_MAILBOXINT;
- val = brcmf_pcie_read_reg32(devinfo, reg);
+ val = brcmf_pcie_read_pcie32(devinfo, reg);
if (val != 0xffffffff)
- brcmf_pcie_write_reg32(devinfo, reg, val);
+ brcmf_pcie_write_pcie32(devinfo, reg, val);
return 0;
}
@@ -2676,7 +2779,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 */
- if (brcmf_pcie_read_reg32(devinfo, devinfo->reginfo->intmask) != 0) {
+ if (brcmf_pcie_read_pcie32(devinfo, devinfo->reginfo->intmask) != 0) {
brcmf_dbg(PCIE, "Try to wakeup device....\n");
if (brcmf_pcie_send_mb_data(devinfo, BRCMF_H2D_HOST_D0_INFORM))
goto cleanup;
diff --git a/drivers/net/wireless/broadcom/brcm80211/include/chipcommon.h b/drivers/net/wireless/broadcom/brcm80211/include/chipcommon.h
index 0340bba968..641eff6b19 100644
--- a/drivers/net/wireless/broadcom/brcm80211/include/chipcommon.h
+++ b/drivers/net/wireless/broadcom/brcm80211/include/chipcommon.h
@@ -302,6 +302,11 @@ struct chipcregs {
#define PMU_RCTL_LOGIC_DISABLE_MASK (1 << 27)
+#define CC_WD_SSRESET_PCIE_F0_EN 0x10000000
+#define CC_WD_SSRESET_PCIE_ALL_FN_EN 0x80000000
+#define CC_WD_COUNTER_MASK 0x0fffffff
+#define CC_WD_ENABLE_MASK 0xf0000000
+
/*
* Maximum delay for the PMU state transition in us.
* This is an upper bound intended for spinwaits etc.
--
2.55.0
next prev parent reply other threads:[~2026-09-25 13:43 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-25 13:43 [PATCH 00/13] wifi: brcmfmac: Add BCM4388 support Michael Reeves via B4 Relay
2026-09-25 13:43 ` [PATCH 01/13] wifi: brcmfmac: pcie: Report the detected chip ID to the bus Michael Reeves via B4 Relay
2026-09-25 13:43 ` [PATCH 02/13] wifi: brcmfmac: Match complete firmware capability names Michael Reeves via B4 Relay
2026-09-25 13:43 ` [PATCH 03/13] wifi: brcmfmac: Fall back to RSSI-only default join preferences Michael Reeves via B4 Relay
2026-09-25 13:43 ` Michael Reeves via B4 Relay [this message]
2026-09-25 13:43 ` [PATCH 05/13] wifi: brcmfmac: Negotiate PCIe mailbox transport with firmware Michael Reeves via B4 Relay
2026-09-25 13:43 ` [PATCH 06/13] wifi: brcmfmac: Load signed PCIe firmware images Michael Reeves via B4 Relay
2026-09-25 13:43 ` [PATCH 07/13] wifi: brcmfmac: Use event_msgs_ext for event masks Michael Reeves via B4 Relay
2026-09-25 13:43 ` [PATCH 08/13] wifi: brcmfmac: Handle larger firmware band lists Michael Reeves via B4 Relay
2026-09-25 13:43 ` [PATCH 09/13] wifi: brcmfmac: Accept newer BSS information versions Michael Reeves via B4 Relay
2026-09-25 13:43 ` [PATCH 10/13] wifi: brcmfmac: Support versioned scan parameter layouts Michael Reeves via B4 Relay
2026-09-25 13:43 ` [PATCH 11/13] wifi: brcmfmac: Support versioned join requests Michael Reeves via B4 Relay
2026-09-25 13:43 ` [PATCH 12/13] wifi: brcmfmac: Handle extended PMK command payloads Michael Reeves via B4 Relay
2026-09-25 13:43 ` [PATCH 13/13] wifi: brcmfmac: Add BCM4388 support Michael Reeves via B4 Relay
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260925-brcm4388-submit-v1-4-b5cbc2cde2fb@gmail.com \
--to=devnull+michael.reeves077.gmail.com@kernel.org \
--cc=arend.vanspriel@broadcom.com \
--cc=asahi@lists.linux.dev \
--cc=brcm80211-dev-list.pdl@broadcom.com \
--cc=brcm80211@lists.linux.dev \
--cc=dberlin@dberlin.org \
--cc=frankyl@broadcom.com \
--cc=gustavoars@kernel.org \
--cc=j@jannau.net \
--cc=kees@kernel.org \
--cc=kvalo@kernel.org \
--cc=linux-hardening@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-wireless@vger.kernel.org \
--cc=marcan@marcan.st \
--cc=meuleman@broadcom.com \
--cc=michael.reeves077@gmail.com \
--cc=pieterpg@broadcom.com \
--cc=vanhoefm@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®