From 4e1bb59cfbe9252b5845638f0fa84008fb5f698a Mon Sep 17 00:00:00 2001 From: avishad verma Date: Thu, 29 Sep 2022 03:40:34 -0500 Subject: [PATCH 161/296] brcmfmac: SDIO Rev31 changes in rmmod sequence Signed-off-by: Shelley Yang --- .../broadcom/brcm80211/brcmfmac/sdio.c | 33 +++++++++++++++++-- .../broadcom/brcm80211/brcmfmac/sdio.h | 4 +++ 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c index a53a44a9e8ce..0ca4ac33b4bb 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c @@ -5344,10 +5344,37 @@ void brcmf_sdio_remove(struct brcmf_sdio *bus) if (bus->ci->blhs) bus->ci->blhs->init(bus->ci); - /* Reset the PMU, backplane and all the - * cores by using the PMUWatchdogCounter. + + /* Configure registers to trigger WLAN reset on + * "SDIO Soft Reset", and set RES bit to trigger + * SDIO as well as WLAN reset + * (instead of using PMU/CC Watchdog register) */ - brcmf_chip_reset_watchdog(bus->ci); + if (bus->ci->ccsec) { + struct brcmf_sdio_dev *sdiodev; + int err = 0; + u32 reg_val = 0; + + sdiodev = bus->sdiodev; + /* Set card control so an SDIO card reset + *does a WLAN backplane reset */ + reg_val = brcmf_sdiod_func0_rb(sdiodev, + SDIO_CCCR_BRCM_CARDCTRL, + &err); + reg_val |= SDIO_CCCR_BRCM_CARDCTRL_WLANRESET; + + brcmf_sdiod_func0_wb(sdiodev, SDIO_CCCR_BRCM_CARDCTRL, + reg_val, &err); + brcmf_sdiod_func0_wb(sdiodev, SDIO_CCCR_ABORT, + sdiodev->func1->num |\ + SDIO_IO_CARD_RESET, + NULL); + } else { + /* Reset the PMU, backplane and all the + * cores by using the PMUWatchdogCounter. + */ + brcmf_chip_reset_watchdog(bus->ci); + } if (bus->ci->blhs) bus->ci->blhs->post_wdreset(bus->ci); diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h index 0b4426792785..c3eee08a3084 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h @@ -128,6 +128,10 @@ #define SBSDIO_FUNC1_MISC_REG_START 0x10000 /* f1 misc register start */ #define SBSDIO_FUNC1_MISC_REG_LIMIT 0x1001F /* f1 misc register end */ +/* Sdio Core Rev 31 */ +/* Hard Reset SDIO core, output soft reset signal which should cause backplane reset */ +#define SDIO_IO_CARD_RESET 0x08 + /* function 1 OCP space */ /* sb offset addr is <= 15 bits, 32k */ -- 2.25.1