From abe0427eb5b23f0a8ee5e59d61258765122945e6 Mon Sep 17 00:00:00 2001 From: avishad verma Date: Tue, 21 Oct 2025 05:31:09 -0500 Subject: [PATCH] brcmfmac: SDIO recovery fixes. In case IOVAR's are failing multiple times, toggle WLAN REG ON/OFF and trigger FW re-download. Fixes SWLINUX-5456 Signed-off-by: avishad verma --- drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c | 9 +++++++++ drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h | 1 + drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil.c | 5 +++++ 3 files changed, 15 insertions(+) diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c index 4f40b37893efe..904398a322b45 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c @@ -1556,6 +1556,10 @@ static void brcmf_core_bus_reset(struct work_struct *work) struct brcmf_pub *drvr = container_of(work, struct brcmf_pub, bus_reset); + /* WLAN REG TOGGLE */ + brcmf_wlanregon_gpio_toggle(0); + msleep(100); + brcmf_wlanregon_gpio_toggle(1); brcmf_bus_reset(drvr->bus_if); } @@ -1824,6 +1828,11 @@ void brcmf_dev_coredump(struct device *dev) brcmf_dbg(TRACE, "failed to create coredump\n"); } +void brcmf_wlanregon_gpio_toggle(u8 gpio_on) +{ + /* WLAN REG ON/OFF Toggle code to be added */ +} + void brcmf_fw_crashed(struct device *dev) { struct brcmf_bus *bus_if = dev_get_drvdata(dev); diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h index 3cf64907a2826..11b2863fd9cc0 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h @@ -263,4 +263,5 @@ int brcmf_pktfilter_enable(struct net_device *ndev, bool enable); void brcmf_del_sta(struct brcmf_if *ifp, const u8 *ea); struct brcmf_sta *brcmf_find_sta(struct brcmf_if *ifp, const u8 *ea); struct brcmf_sta *brcmf_findadd_sta(struct brcmf_if *ifp, const u8 *ea); +void brcmf_wlanregon_gpio_toggle(u8 gpio_on); #endif /* BRCMFMAC_CORE_H */ diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil.c index ad04da608b8c4..ab973682dcaa8 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil.c @@ -132,6 +132,11 @@ brcmf_fil_cmd_data(struct brcmf_if *ifp, u32 cmd, void *data, u32 len, bool set) if (ifp->fwil_fwerr) return fwerr; + if (err && resend_cnt == MAX_CMD_RESEND) { + if (drvr->bus_reset.func) + schedule_work(&drvr->bus_reset); + } + return err; }