• Daniel Mack's avatar
    libertas: fix suspend and resume for SDIO connected cards · 7444a809
    Daniel Mack authored
    Prior to commit 573185cc ("mmc: core: Invoke sdio func driver's PM
    callbacks from the sdio bus"), the MMC core used to call into the power
    management functions of SDIO clients itself and removed the card if the
    return code was non-zero. IOW, the mmc handled errors gracefully and didn't
    upchain them to the pm core.
    
    Since this change, the mmc core relies on generic power management
    functions which treat all errors as a reason to cancel the suspend
    immediately. This causes suspend attempts to fail when the libertas
    driver is loaded.
    
    To fix this, power down the card explicitly in if_sdio_suspend() when we
    know we're about to lose power and return success. Also set a flag in these
    cases, and power up the card again in if_sdio_resume().
    
    Fixes: 573185cc ("mmc: core: Invoke sdio func driver's PM callbacks from the sdio bus")
    Cc: <stable@vger.kernel.org>
    Signed-off-by: default avatarDaniel Mack <daniel@zonque.org>
    Reviewed-by: default avatarChris Ball <chris@printf.net>
    Reviewed-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
    Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
    7444a809
if_sdio.c 31.3 KB