On 13/03/2023 14:55, Marc Gonzalez wrote: > Still trying to bisect this heisenbug into submission... :( > > So far, I've pared it down to mmc_attach_sdio() > > When probe WORKS, mmc_attach_sdio() returns 0. > When probe FAILS, mmc_attach_sdio() returns ETIMEDOUT > via mmc_send_io_op_cond(host, 0, &ocr); > > Wrapping mmc_send_io_op_cond() in a loop > makes it work on the second try. Almost there, I think, I hope :) DT prop "post-power-on-delay-ms" looks like what I needed all along. It exists both for host (default 10 ms) and for pwrseq_simple (default 0 apparently). /* * Apply power to the MMC stack. This is a two-stage process. * First, we enable power to the card without the clock running. * We then wait a bit for the power to stabilise. Finally, * enable the bus drivers and clock to the card. * * We must _NOT_ enable the clock prior to power stablising. * * If a host does all the power sequencing itself, ignore the * initial MMC_POWER_UP stage. */ void mmc_power_up(struct mmc_host *host, u32 ocr) Calls: mmc_delay(host->ios.power_delay_ms); mmc_pwrseq_post_power_on(host); => msleep(pwrseq->post_power_on_delay_ms); ... mmc_delay(host->ios.power_delay_ms); QUESTION: It's not clear to me why we sleep twice for host->ios.power_delay_ms? Looks like all I need is to add post-power-on-delay-ms = <100>; to sdio_pwrseq: sdio-pwrseq { compatible = "mmc-pwrseq-simple"; reset-gpios = <&gpio GPIOX_6 GPIO_ACTIVE_LOW>; clocks = <&wifi32k>; clock-names = "ext_clock"; }; Will revert all my stabs in the dark, and boot the board 100 times to check if this does the trick. Regards