Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

brcmfmac: setup SDIO reset behavior

Set device in a manner that SDIO I/O card reset
will lead to WLAN backplane and PMU state reset.

Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
Reviewed-by: Arend van Spriel <arend@broadcom.com>
Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com>
Signed-off-by: Piotr Haber <phaber@broadcom.com>
Signed-off-by: Arend van Spriel <arend@broadcom.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>

authored by

Piotr Haber and committed by
John W. Linville
1e9ab4dd 1640f28f

+36 -7
+31 -7
drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c
··· 3635 3635 int err = 0; 3636 3636 int reg_addr; 3637 3637 u32 reg_val; 3638 - u8 idx; 3639 3638 3640 3639 bus->alp_only = true; 3641 3640 ··· 3685 3686 goto fail; 3686 3687 } 3687 3688 3688 - /* Set core control so an SDIO reset does a backplane reset */ 3689 - idx = brcmf_sdio_chip_getinfidx(bus->ci, BCMA_CORE_SDIO_DEV); 3690 - reg_addr = bus->ci->c_inf[idx].base + 3691 - offsetof(struct sdpcmd_regs, corecontrol); 3692 - reg_val = brcmf_sdio_regrl(bus->sdiodev, reg_addr, NULL); 3693 - brcmf_sdio_regwl(bus->sdiodev, reg_addr, reg_val | CC_BPRESEN, NULL); 3689 + /* Set card control so an SDIO card reset does a WLAN backplane reset */ 3690 + reg_val = brcmf_sdio_regrb(bus->sdiodev, 3691 + SDIO_CCCR_BRCM_CARDCTRL, &err); 3692 + if (err) 3693 + goto fail; 3694 + 3695 + reg_val |= SDIO_CCCR_BRCM_CARDCTRL_WLANRESET; 3696 + 3697 + brcmf_sdio_regwb(bus->sdiodev, 3698 + SDIO_CCCR_BRCM_CARDCTRL, reg_val, &err); 3699 + if (err) 3700 + goto fail; 3701 + 3702 + /* set PMUControl so a backplane reset does PMU state reload */ 3703 + reg_addr = CORE_CC_REG(bus->ci->c_inf[0].base, 3704 + pmucontrol); 3705 + reg_val = brcmf_sdio_regrl(bus->sdiodev, 3706 + reg_addr, 3707 + &err); 3708 + if (err) 3709 + goto fail; 3710 + 3711 + reg_val |= (BCMA_CC_PMU_CTL_RES_RELOAD << BCMA_CC_PMU_CTL_RES_SHIFT); 3712 + 3713 + brcmf_sdio_regwl(bus->sdiodev, 3714 + reg_addr, 3715 + reg_val, 3716 + &err); 3717 + if (err) 3718 + goto fail; 3719 + 3694 3720 3695 3721 sdio_release_host(bus->sdiodev->func[1]); 3696 3722
+2
drivers/net/wireless/brcm80211/brcmfmac/sdio_host.h
··· 52 52 #define SDIO_CCCR_BRCM_CARDCAP_CMD14_SUPPORT 0x02 53 53 #define SDIO_CCCR_BRCM_CARDCAP_CMD14_EXT 0x04 54 54 #define SDIO_CCCR_BRCM_CARDCAP_CMD_NODEC 0x08 55 + #define SDIO_CCCR_BRCM_CARDCTRL 0xf1 56 + #define SDIO_CCCR_BRCM_CARDCTRL_WLANRESET 0x02 55 57 #define SDIO_CCCR_BRCM_SEPINT 0xf2 56 58 57 59 #define SDIO_SEPINT_MASK 0x01
+3
include/linux/bcma/bcma_driver_chipcommon.h
··· 316 316 #define BCMA_CC_PMU_CTL 0x0600 /* PMU control */ 317 317 #define BCMA_CC_PMU_CTL_ILP_DIV 0xFFFF0000 /* ILP div mask */ 318 318 #define BCMA_CC_PMU_CTL_ILP_DIV_SHIFT 16 319 + #define BCMA_CC_PMU_CTL_RES 0x00006000 /* reset control mask */ 320 + #define BCMA_CC_PMU_CTL_RES_SHIFT 13 321 + #define BCMA_CC_PMU_CTL_RES_RELOAD 0x2 /* reload POR values */ 319 322 #define BCMA_CC_PMU_CTL_PLL_UPD 0x00000400 320 323 #define BCMA_CC_PMU_CTL_NOILPONW 0x00000200 /* No ILP on wait */ 321 324 #define BCMA_CC_PMU_CTL_HTREQEN 0x00000100 /* HT req enable */