Message ID | CAEgOgz6GvAQ0ZsOtMvj1zi8dfC7+5+SPeNDO3BqNy6MyoNyzaA@mail.gmail.com |
---|---|
State | New |
Headers | show |
On 05/27/2013 06:41 AM, peter.crosthwaite@xilinx.com wrote: > From: Peter Crosthwaite <peter.crosthwaite@xilinx.com> > > QEMU models two (of the three) ACMD41 has two modes, "inquiry" and > "first". The selection logic for which of the two is incorrect - it > compares != 0 for the entire argument value rather than only bits 23:0 > as per the spec. Fix. > > Signed-off-by: Peter Crosthwaite <peter.crosthwaite@xilinx.com> > --- > Changed since v2: > Macroified magic number > Added explanatory comment (PMM review) > Changed since v1: > Total rewrite > > hw/sd/sd.c | 11 +++++++++-- > 1 file changed, 9 insertions(+), 2 deletions(-) > > diff --git a/hw/sd/sd.c b/hw/sd/sd.c > index 2e0ef3e..a10313b 100644 > --- a/hw/sd/sd.c > +++ b/hw/sd/sd.c > @@ -43,6 +43,8 @@ do { fprintf(stderr, "SD: " fmt , ## __VA_ARGS__); } while (0) > #define DPRINTF(fmt, ...) do {} while(0) > #endif > > +#define ACMD41_ENQUIRY_MASK 0x00ffffff > + > typedef enum { > sd_r0 = 0, /* no response */ > sd_r1, /* normal response command */ > @@ -1277,9 +1279,14 @@ static sd_rsp_type_t sd_app_command(SDState *sd, > } > switch (sd->state) { > case sd_idle_state: > - /* We accept any voltage. 10000 V is nothing. */ > - if (req.arg) > + /* We accept any voltage. 10000 V is nothing. > + * > + * We don't model init delay so just advance straight to ready state > + * unless its an enquiry ACMD41 (bits 23:0 == 0). > + */ > + if (req.arg & ACMD41_ENQUIRY_MASK) { > sd->state = sd_ready_state; > + } > > return sd_r3; > > Reviewed-by: Igor Mitsyanko <i.mitsyanko@gmail.com> -- Best wishes, Igor Mitsyanko email: i.mitsyanko@gmail.com
--- a/drivers/mmc/core/sd_ops.c +++ b/drivers/mmc/core/sd_ops.c @@ -161,7 +161,9 @@ int mmc_send_app_op_cond(struct mmc_host *host, u32 ocr, u32 *rocr) cmd.arg = ocr; cmd.flags = MMC_RSP_SPI_R1 | MMC_RSP_R3 | MMC_CMD_BCR; - for (i = 100; i; i--) { + int busyness = 0; + for (i = 150; i; i--) { + mmc_delay(10); err = mmc_wait_for_app_cmd(host, NULL, &cmd, MMC_CMD_RETRIES); if (err)