Skip to content
Snippets Groups Projects
  • Thomas Hebb's avatar
    mmc: rtsx_pci: Fix long reads when clock is prescaled · a6da39dc
    Thomas Hebb authored
    
    [ Upstream commit 3ac5e452 ]
    
    For unexplained reasons, the prescaler register for this device needs to
    be cleared (set to 1) while performing a data read or else the command
    will hang. This does not appear to affect the real clock rate sent out
    on the bus, so I assume it's purely to work around a hardware bug.
    
    During normal operation, the prescaler is already set to 1, so nothing
    needs to be done. However, in "initial mode" (which is used for sub-MHz
    clock speeds, like the core sets while enumerating cards), it's set to
    128 and so we need to reset it during data reads. We currently fail to
    do this for long reads.
    
    This has no functional affect on the driver's operation currently
    written, as the MMC core always sets a clock above 1MHz before
    attempting any long reads. However, the core could conceivably set any
    clock speed at any time and the driver should still work, so I think
    this fix is worthwhile.
    
    I personally encountered this issue while performing data recovery on an
    external chip. My connections had poor signal integrity, so I modified
    the core code to reduce the clock speed. Without this change, I saw the
    card enumerate but was unable to actually read any data.
    
    Writes don't seem to work in the situation described above even with
    this change (and even if the workaround is extended to encompass data
    write commands). I was not able to find a way to get them working.
    
    Signed-off-by: default avatarThomas Hebb <tommyhebb@gmail.com>
    Link: https://lore.kernel.org/r/2fef280d8409ab0100c26c6ac7050227defd098d.1627818365.git.tommyhebb@gmail.com
    
    
    Signed-off-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
    Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
    a6da39dc
Code owners
Assign users and groups as approvers for specific file changes. Learn more.