On Mon, Aug 16, 2021 at 4:03 PM Yann Gautier yann.gautier@foss.st.com wrote:
I was just testing your patch on top of mmc/next. Whereas mmc/next is fine, with your patch I fail to pass MMC test 5 (Multi-block write). I've got this error on STM32MP157C-EV1 board: [ 108.956218] mmc0: Starting tests of card mmc0:aaaa... [ 108.959862] mmc0: Test case 5. Multi-block write... [ 108.995615] mmc0: Warning: Host did not wait for busy state to end. [ 109.000483] mmc0: Result: ERROR (-110) Then nothing more happens.
The test was done on an SD-card Sandisk Extreme Pro SDXC UHS-I mark 3, in DDR50 mode.
I'll try to add more traces to see what happens.
What I think happens is: - You are using the MMCI driver (correct?) - My patch augments the driver to not use busydetect until we have determined that the card can do it (after reading extcsd etc) - Before this patch, the MMCI would unconditionally use HW busy detect on any card.
Either we have managed to wire the MMCI driver so that it doesn't work without HW busy detect anymore, you can easily test this by doing this:
diff --git a/drivers/mmc/host/mmci.c b/drivers/mmc/host/mmci.c index 3765e2f4ad98..3a35f65491c8 100644 --- a/drivers/mmc/host/mmci.c +++ b/drivers/mmc/host/mmci.c @@ -270,10 +270,10 @@ static struct variant_data variant_stm32_sdmmc = { .datactrl_any_blocksz = true, .datactrl_mask_sdio = MCI_DPSM_ST_SDIOEN, .stm32_idmabsize_mask = GENMASK(12, 5), - .busy_timeout = true, - .busy_detect = true, - .busy_detect_flag = MCI_STM32_BUSYD0, - .busy_detect_mask = MCI_STM32_BUSYD0ENDMASK, + //.busy_timeout = true, + //.busy_detect = true, + //.busy_detect_flag = MCI_STM32_BUSYD0, + //.busy_detect_mask = MCI_STM32_BUSYD0ENDMASK, .init = sdmmc_variant_init, };
@@ -297,10 +297,10 @@ static struct variant_data variant_stm32_sdmmcv2 = { .datactrl_mask_sdio = MCI_DPSM_ST_SDIOEN, .stm32_idmabsize_mask = GENMASK(16, 5), .dma_lli = true, - .busy_timeout = true, - .busy_detect = true, - .busy_detect_flag = MCI_STM32_BUSYD0, - .busy_detect_mask = MCI_STM32_BUSYD0ENDMASK, + //.busy_timeout = true, + //.busy_detect = true, + //.busy_detect_flag = MCI_STM32_BUSYD0, + //.busy_detect_mask = MCI_STM32_BUSYD0ENDMASK, .init = sdmmc_variant_init,
Or else there is a card that cannot work without busy detect which I find unlikely.
Yours, Linus Walleij