Commit d7604d76 authored by Pierre Ossman's avatar Pierre Ossman

mmc: read ext_csd version number

Make sure we do not try to parse a structure we do not
understand.
Signed-off-by: default avatarPierre Ossman <drzeus@drzeus.cx>
parent adf66a0d
...@@ -161,6 +161,7 @@ static int mmc_read_ext_csd(struct mmc_card *card) ...@@ -161,6 +161,7 @@ static int mmc_read_ext_csd(struct mmc_card *card)
{ {
int err; int err;
u8 *ext_csd; u8 *ext_csd;
unsigned int ext_csd_struct;
BUG_ON(!card); BUG_ON(!card);
...@@ -209,13 +210,22 @@ static int mmc_read_ext_csd(struct mmc_card *card) ...@@ -209,13 +210,22 @@ static int mmc_read_ext_csd(struct mmc_card *card)
goto out; goto out;
} }
card->ext_csd.sectors = ext_csd_struct = ext_csd[EXT_CSD_REV];
ext_csd[EXT_CSD_SEC_CNT + 0] << 0 | if (ext_csd_struct > 2) {
ext_csd[EXT_CSD_SEC_CNT + 1] << 8 | printk("%s: unrecognised EXT_CSD structure version %d\n",
ext_csd[EXT_CSD_SEC_CNT + 2] << 16 | mmc_hostname(card->host), ext_csd_struct);
ext_csd[EXT_CSD_SEC_CNT + 3] << 24; return -EINVAL;
if (card->ext_csd.sectors) }
mmc_card_set_blockaddr(card);
if (ext_csd_struct >= 2) {
card->ext_csd.sectors =
ext_csd[EXT_CSD_SEC_CNT + 0] << 0 |
ext_csd[EXT_CSD_SEC_CNT + 1] << 8 |
ext_csd[EXT_CSD_SEC_CNT + 2] << 16 |
ext_csd[EXT_CSD_SEC_CNT + 3] << 24;
if (card->ext_csd.sectors)
mmc_card_set_blockaddr(card);
}
switch (ext_csd[EXT_CSD_CARD_TYPE]) { switch (ext_csd[EXT_CSD_CARD_TYPE]) {
case EXT_CSD_CARD_TYPE_52 | EXT_CSD_CARD_TYPE_26: case EXT_CSD_CARD_TYPE_52 | EXT_CSD_CARD_TYPE_26:
......
...@@ -227,6 +227,7 @@ struct _mmc_csd { ...@@ -227,6 +227,7 @@ struct _mmc_csd {
#define EXT_CSD_BUS_WIDTH 183 /* R/W */ #define EXT_CSD_BUS_WIDTH 183 /* R/W */
#define EXT_CSD_HS_TIMING 185 /* R/W */ #define EXT_CSD_HS_TIMING 185 /* R/W */
#define EXT_CSD_CARD_TYPE 196 /* RO */ #define EXT_CSD_CARD_TYPE 196 /* RO */
#define EXT_CSD_REV 192 /* RO */
#define EXT_CSD_SEC_CNT 212 /* RO, 4 bytes */ #define EXT_CSD_SEC_CNT 212 /* RO, 4 bytes */
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment