mmc: Fix decoding of SCR & function switch data on little-endian machines
authorYauhen Kharuzhy <jekhor@gmail.com>
Wed, 6 May 2009 21:43:30 +0000 (00:43 +0300)
committerAndy Fleming <afleming@freescale.com>
Tue, 2 Jun 2009 22:20:04 +0000 (17:20 -0500)
SCR & switch data are read from card as big-endian words and should be
converted to CPU byte order.

Signed-off-by: Yauhen Kharuzhy <jekhor@gmail.com>
Signed-off-by: Andy Fleming <afleming@freescale.com>
drivers/mmc/mmc.c

index 64a311dcc2a2211319bb2d22994484c396053516..8c736ce4974357649d79050d68cede82c954da61 100644 (file)
@@ -487,8 +487,8 @@ retry_scr:
                return err;
        }
 
-       mmc->scr[0] = scr[0];
-       mmc->scr[1] = scr[1];
+       mmc->scr[0] = __be32_to_cpu(scr[0]);
+       mmc->scr[1] = __be32_to_cpu(scr[1]);
 
        switch ((mmc->scr[0] >> 24) & 0xf) {
                case 0:
@@ -518,7 +518,7 @@ retry_scr:
                        return err;
 
                /* The high-speed function is busy.  Try again */
-               if (!switch_status[7] & SD_HIGHSPEED_BUSY)
+               if (!(__be32_to_cpu(switch_status[7]) & SD_HIGHSPEED_BUSY))
                        break;
        }
 
@@ -526,7 +526,7 @@ retry_scr:
                mmc->card_caps |= MMC_MODE_4BIT;
 
        /* If high-speed isn't supported, we return */
-       if (!(switch_status[3] & SD_HIGHSPEED_SUPPORTED))
+       if (!(__be32_to_cpu(switch_status[3]) & SD_HIGHSPEED_SUPPORTED))
                return 0;
 
        err = sd_switch(mmc, SD_SWITCH_SWITCH, 0, 1, (u8 *)&switch_status);
@@ -534,7 +534,7 @@ retry_scr:
        if (err)
                return err;
 
-       if ((switch_status[4] & 0x0f000000) == 0x01000000)
+       if ((__be32_to_cpu(switch_status[4]) & 0x0f000000) == 0x01000000)
                mmc->card_caps |= MMC_MODE_HS;
 
        return 0;