On 05/27/2013 06:41 AM, [email protected] wrote: > From: Peter Crosthwaite <[email protected]> > > 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 <[email protected]> > --- > 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 <[email protected]> -- Best wishes, Igor Mitsyanko email: [email protected]
