From be24df62960e746bf5a37acab5b25d1a9e314bbe Mon Sep 17 00:00:00 2001 From: "Deshpande Ishan Shirish (IFINS CSS ICW ENG SW WFSW)" Date: Wed, 1 Mar 2023 08:30:30 +0000 Subject: [PATCH 203/296] brcmfmac: Avoid realloc resources on DS1 exit in fw download callback After DS1 exit FMAC crash and Rx packets getting dropped. [Root Cause] In firmware_download callback there was code piece which was reallocating/initializing some data structures which were never deallocated/de-initialized. [Solution] In exiting DS1 on ULP do not call those functions after each firmware download. Signed-off-by: Deshpande Ishan Shirish (IFINS CSS ICW ENG SW WFSW) --- .../broadcom/brcm80211/brcmfmac/sdio.c | 47 ++++++++++--------- 1 file changed, 25 insertions(+), 22 deletions(-) diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c index 934589d62fce..7e0165f0e0cb 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c @@ -5142,33 +5142,36 @@ static void brcmf_sdio_firmware_callback(struct device *dev, int err, brcmf_sdio_wd_timer(bus, true); sdio_release_host(sdiod->func1); - err = brcmf_alloc(sdiod->dev, sdiod->settings); - if (err) { - brcmf_err("brcmf_alloc failed\n"); - goto claim; - } + if (!bus->sdiodev->ulp || + (bus->sdiodev->ulp && bus->sdiodev->fmac_ulp.ulp_state != FMAC_ULP_TRIGGERED)) { + err = brcmf_alloc(sdiod->dev, sdiod->settings); + if (err) { + brcmf_err("brcmf_alloc failed\n"); + goto claim; + } #ifdef CONFIG_BRCMFMAC_BT_SHARED_SDIO - err = brcmf_btsdio_init(bus_if); - if (err) { - brcmf_err("brcmf_btsdio_init failed\n"); - goto free; - } + err = brcmf_btsdio_init(bus_if); + if (err) { + brcmf_err("brcmf_btsdio_init failed\n"); + goto free; + } #endif /* CONFIG_BRCMFMAC_BT_SHARED_SDIO */ - /* Attach to the common layer, reserve hdr space */ - err = brcmf_attach(sdiod->dev, !bus->sdiodev->ulp); - if (err != 0) { - brcmf_err("brcmf_attach failed\n"); - goto free; - } + /* Attach to the common layer, reserve hdr space */ + err = brcmf_attach(sdiod->dev, !bus->sdiodev->ulp); + if (err != 0) { + brcmf_err("brcmf_attach failed\n"); + goto free; + } - /* Register for ULP events */ - if (sdiod->func1->device == SDIO_DEVICE_ID_BROADCOM_CYPRESS_43012 || - sdiod->func1->device == SDIO_DEVICE_ID_BROADCOM_CYPRESS_43022 || - sdiod->func1->device == SDIO_DEVICE_ID_CYPRESS_43022) - brcmf_fweh_register(bus_if->drvr, BRCMF_E_ULP, - brcmf_ulp_event_notify); + /* Register for ULP events */ + if (sdiod->func1->device == SDIO_DEVICE_ID_BROADCOM_CYPRESS_43012 || + sdiod->func1->device == SDIO_DEVICE_ID_BROADCOM_CYPRESS_43022 || + sdiod->func1->device == SDIO_DEVICE_ID_CYPRESS_43022) + brcmf_fweh_register(bus_if->drvr, BRCMF_E_ULP, + brcmf_ulp_event_notify); + } if (bus->sdiodev->ulp) { /* For ULP, after firmware redownload complete -- 2.25.1