• Shawn Lin's avatar
    mmc: dw_mmc: return -EILSEQ for EBE and SBE error · e7a1dec1
    Shawn Lin authored
    The following log we found indicate the fact that dw_mmc
    didn't treat EBE or SBE as a similar problem as CRC error.
    -EIO is quite not informative as it may indicate that the device
    is broken rather than that of tuning stuff.
    
    ...
    [ 89.057226] bcmsdh_sdmmc: Failed to Read byte F1:@0x1001f=ff, Err: -5
    [ 89.058811] bcmsdh_sdmmc: Failed to Read byte F1:@0x1001f=ff, Err: -5
    [ 89.059415] bcmsdh_sdmmc: Failed to Read byte F1:@0x1000e=ff, Err: -84
    [ 89.254248] dwmmc_rockchip fe310000.dwmmc: Successfully tuned phase to 199
    [ 89.273912] dhd_set_suspend: Remove extra suspend setting
    [ 89.274478] dhd_enable_packet_filter: enter, value = 0
    64 bytes from 112.90.83.112: icmp_seq=24 ttl=53 time=1321 ms
    64 bytes from 112.90.83.112: icmp_seq=25 ttl=53 time=319 ms
    64 bytes from 112.90.83.112: icmp_seq=26 ttl=53 time=69.8 ms
    64 bytes from 112.90.83.112: icmp_seq=27 ttl=53 time=37.5 ms
    ...
    
    For the host, when failing to sample cmd's response due to
    tuning stuff, we still return -EIO as it's quite vague to figure
    out whether it related to signal or just the broken devices, especially
    for the card type detection when booting kernel as all things go well
    but the cmd set used.
    
    But for the data phase, if receiving the cmd's response which
    carriess data transfer, we should have more confidence that it
    is very probably related to the tuning stuff.
    
    Just as the log shown above, we sometimes suffer too much
    this kind of pain as the dw_mmc return -EIO for the case, so
    mmc-core will not do retune and caller drivers like bcm's wifi
    driver, still retry the failure more and more until dw_mmc
    finally generate CRC.
    
    Adrian suggested that drivers who care the specific cases should
    call mmc_retune_needed rather than doing it in mmc core. It makes
    sense but I'm considering that -EILSEQ actually means illegal sequence
    , so we use it for CRC cases. Meanwhile, SBE/EBE indicate the illegal
    sequence of start bit or end bit for data0~7. So I realize that we should
    use -EILSEQ for them both as well CRC cases.
    Suggested-by: default avatarAdrian Hunter <adrian.hunter@intel.com>
    Signed-off-by: default avatarShawn Lin <shawn.lin@rock-chips.com>
    Signed-off-by: default avatarJaehoon Chung <jh80.chung@samsung.com>
    Signed-off-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
    e7a1dec1
dw_mmc.c 82.2 KB