• Douglas Anderson's avatar
    mmc: core: API to temporarily disable retuning for SDIO CRC errors · 2ea45484
    Douglas Anderson authored
    commit 0a55f4ab upstream.
    
    Normally when the MMC core sees an "-EILSEQ" error returned by a host
    controller then it will trigger a retuning of the card.  This is
    generally a good idea.
    
    However, if a command is expected to sometimes cause transfer errors
    then these transfer errors shouldn't cause a re-tuning.  This
    re-tuning will be a needless waste of time.  One example case where a
    transfer is expected to cause errors is when transitioning between
    idle (sometimes referred to as "sleep" in Broadcom code) and active
    state on certain Broadcom WiFi SDIO cards.  Specifically if the card
    was already transitioning between states when the command was sent it
    could cause an error on the SDIO bus.
    
    Let's add an API that the SDIO function drivers can call that will
    temporarily disable the auto-tuning functionality.  Then we can add a
    call to this in the Broadcom WiFi driver and any other driver that
    might have similar needs.
    
    NOTE: this makes the assumption that the card is already tuned well
    enough that it's OK to disable the auto-retuning during one of these
    error-prone situations.  Presumably the driver code performing the
    error-prone transfer knows how to recover / retry from errors.  ...and
    after we can get back to a state where transfers are no longer
    error-prone then we can enable the auto-retuning again.  If we truly
    find ourselves in a case where the card needs to be retuned sometimes
    to handle one of these error-prone transfers then we can always try a
    few transfers first without auto-retuning and then re-try with
    auto-retuning if the first few fail.
    
    Without this change on rk3288-veyron-minnie I periodically see this in
    the logs of a machine just sitting there idle:
      dwmmc_rockchip ff0d0000.dwmmc: Successfully tuned phase to XYZ
    
    Cc: stable@vger.kernel.org #v4.18+
    Signed-off-by: default avatarDouglas Anderson <dianders@chromium.org>
    Acked-by: default avatarAdrian Hunter <adrian.hunter@intel.com>
    Acked-by: default avatarKalle Valo <kvalo@codeaurora.org>
    Signed-off-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    2ea45484
sdio_io.c 20 KB