|
|
|
@ -1940,6 +1940,17 @@ static int mmc_startup_v4(struct mmc *mmc) |
|
|
|
|
u64 capacity; |
|
|
|
|
bool has_parts = false; |
|
|
|
|
bool part_completed; |
|
|
|
|
static const u32 mmc_versions[] = { |
|
|
|
|
MMC_VERSION_4, |
|
|
|
|
MMC_VERSION_4_1, |
|
|
|
|
MMC_VERSION_4_2, |
|
|
|
|
MMC_VERSION_4_3, |
|
|
|
|
MMC_VERSION_4_41, |
|
|
|
|
MMC_VERSION_4_5, |
|
|
|
|
MMC_VERSION_5_0, |
|
|
|
|
MMC_VERSION_5_1 |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
ALLOC_CACHE_ALIGN_BUFFER(u8, ext_csd, MMC_MAX_BLOCK_LEN); |
|
|
|
|
|
|
|
|
|
if (IS_SD(mmc) || (mmc->version < MMC_VERSION_4)) |
|
|
|
@ -1957,7 +1968,12 @@ static int mmc_startup_v4(struct mmc *mmc) |
|
|
|
|
return -ENOMEM; |
|
|
|
|
memcpy(mmc->ext_csd, ext_csd, MMC_MAX_BLOCK_LEN); |
|
|
|
|
|
|
|
|
|
if (ext_csd[EXT_CSD_REV] >= 2) { |
|
|
|
|
if (ext_csd[EXT_CSD_REV] > ARRAY_SIZE(mmc_versions)) |
|
|
|
|
return -EINVAL; |
|
|
|
|
|
|
|
|
|
mmc->version = mmc_versions[ext_csd[EXT_CSD_REV]]; |
|
|
|
|
|
|
|
|
|
if (mmc->version >= MMC_VERSION_4_2) { |
|
|
|
|
/*
|
|
|
|
|
* According to the JEDEC Standard, the value of |
|
|
|
|
* ext_csd's capacity is valid if the value is more |
|
|
|
@ -1972,30 +1988,6 @@ static int mmc_startup_v4(struct mmc *mmc) |
|
|
|
|
mmc->capacity_user = capacity; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
switch (ext_csd[EXT_CSD_REV]) { |
|
|
|
|
case 1: |
|
|
|
|
mmc->version = MMC_VERSION_4_1; |
|
|
|
|
break; |
|
|
|
|
case 2: |
|
|
|
|
mmc->version = MMC_VERSION_4_2; |
|
|
|
|
break; |
|
|
|
|
case 3: |
|
|
|
|
mmc->version = MMC_VERSION_4_3; |
|
|
|
|
break; |
|
|
|
|
case 5: |
|
|
|
|
mmc->version = MMC_VERSION_4_41; |
|
|
|
|
break; |
|
|
|
|
case 6: |
|
|
|
|
mmc->version = MMC_VERSION_4_5; |
|
|
|
|
break; |
|
|
|
|
case 7: |
|
|
|
|
mmc->version = MMC_VERSION_5_0; |
|
|
|
|
break; |
|
|
|
|
case 8: |
|
|
|
|
mmc->version = MMC_VERSION_5_1; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* The partition data may be non-zero but it is only
|
|
|
|
|
* effective if PARTITION_SETTING_COMPLETED is set in |
|
|
|
|
* EXT_CSD, so ignore any data if this bit is not set, |
|
|
|
|