From fb0e42bb80a8d01e1c1a279afb4c1a039a673064 Mon Sep 17 00:00:00 2001 From: Rajkumar Ayyasamy Date: Tue, 28 Nov 2017 15:17:37 +0530 Subject: [PATCH] mmc: Timeout calculation for erase operation The erase timeout has been calculated using the EXT_CSD_TRIM_MULT so that the erase operation with larger block counts are not affected. Change-Id: Ia6dd9318c44b4da315c2b2a82cfabe9eff0aeb41 Signed-off-by: Rajkumar Ayyasamy --- drivers/mmc/mmc.c | 4 +++- drivers/mmc/mmc_write.c | 3 ++- include/mmc.h | 2 ++ 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c index c5cac4ee1d..14206b21db 100644 --- a/drivers/mmc/mmc.c +++ b/drivers/mmc/mmc.c @@ -1235,8 +1235,10 @@ static int mmc_startup(struct mmc *mmc) ext_csd[EXT_CSD_BOOT_MULT]) mmc->part_config = ext_csd[EXT_CSD_PART_CONF]; - if(ext_csd[EXT_CSD_SEC_FEATURE_SUPPORT]) + if(ext_csd[EXT_CSD_SEC_FEATURE_SUPPORT]) { mmc->sec_feature_support = ext_csd[EXT_CSD_SEC_FEATURE_SUPPORT]; + mmc->trim_timeout = 300 * ext_csd[EXT_CSD_TRIM_MULT]; /* In milliseconds */ + } if (part_completed && (ext_csd[EXT_CSD_PARTITIONING_SUPPORT] & ENHNCD_SUPPORT)) mmc->part_attr = ext_csd[EXT_CSD_PARTITIONS_ATTRIBUTE]; diff --git a/drivers/mmc/mmc_write.c b/drivers/mmc/mmc_write.c index 28fad96fdd..5dcb3a7552 100644 --- a/drivers/mmc/mmc_write.c +++ b/drivers/mmc/mmc_write.c @@ -71,12 +71,13 @@ unsigned long mmc_berase(int dev_num, lbaint_t start, lbaint_t blkcnt) u32 start_rem, blkcnt_rem; struct mmc *mmc = find_mmc_device(dev_num); lbaint_t blk = 0, blk_r = 0; - int timeout = 2000; + int timeout; int arg = MMC_ERASE_ARG; if (!mmc) return -1; + timeout = mmc->trim_timeout; if (!(mmc->sec_feature_support & EXT_CSD_SEC_ER_EN)) { return -1; } diff --git a/include/mmc.h b/include/mmc.h index 982d1330bb..20d83f855c 100644 --- a/include/mmc.h +++ b/include/mmc.h @@ -193,6 +193,7 @@ #define EXT_CSD_HC_ERASE_GRP_SIZE 224 /* RO */ #define EXT_CSD_BOOT_MULT 226 /* RO */ #define EXT_CSD_SEC_FEATURE_SUPPORT 231 /* RO */ +#define EXT_CSD_TRIM_MULT 232 /* RO */ #define EXT_CSD_SEC_ER_EN (1 << 0) #define EXT_CSD_SEC_GB_CL_EN (1 << 4) @@ -391,6 +392,7 @@ struct mmc { char preinit; /* start init as early as possible */ int ddr_mode; uchar sec_feature_support; + unsigned int trim_timeout; /* In milliseconds */ }; struct mmc_hwpart_conf {