From 91c6de57ec0e16f6346ffeb8d60bab8f069e39ec Mon Sep 17 00:00:00 2001 From: Owen Huang Date: Thu, 8 May 2025 01:59:04 -0500 Subject: [PATCH 1/4] non-upstream: workaround to resend cmd if bus error happened This SDIO CRC error happened on CMD 53 READ randomly, and usually next command successfully after terminating read frame. So resend command as a workaround temporarily. Fixes SWWLAN-153627 Signed-off-by: Owen Huang --- .../broadcom/brcm80211/brcmfmac/fwil.c | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil.c index 72fe8bce6eaf..ad04da608b8c 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil.c @@ -21,6 +21,7 @@ #define MAX_HEX_DUMP_LEN 64 +#define MAX_CMD_RESEND 3 #ifdef DEBUG static const char * const brcmf_fil_errstr[] = { @@ -98,6 +99,7 @@ brcmf_fil_cmd_data(struct brcmf_if *ifp, u32 cmd, void *data, u32 len, bool set) { struct brcmf_pub *drvr = ifp->drvr; s32 err, fwerr; + u8 resend_cnt = 1; if (drvr->bus_if->state != BRCMF_BUS_UP) { bphy_err(drvr, "bus is down. we have nothing to do.\n"); @@ -106,12 +108,19 @@ brcmf_fil_cmd_data(struct brcmf_if *ifp, u32 cmd, void *data, u32 len, bool set) if (data != NULL) len = min_t(uint, len, BRCMF_DCMD_MAXLEN); - if (set) - err = brcmf_proto_set_dcmd(drvr, ifp->ifidx, cmd, - data, len, &fwerr); - else - err = brcmf_proto_query_dcmd(drvr, ifp->ifidx, cmd, - data, len, &fwerr); + + do { + if (set) + err = brcmf_proto_set_dcmd(drvr, ifp->ifidx, cmd, + data, len, &fwerr); + else + err = brcmf_proto_query_dcmd(drvr, ifp->ifidx, cmd, + data, len, &fwerr); + if (!err || resend_cnt > MAX_CMD_RESEND) + break; + + brcmf_err("cmd error %d, resend cmd count %d\n", err, resend_cnt++); + } while (true); if (err) { brcmf_dbg(FIL, "Failed: error=%d\n", err); -- 2.25.0