From: Kimito Sakata <kimito.sakata@xxxxxxxxxx> Replaced unused pointer with NULL on calls to strtol(). Added logic to print High Capacity mode parameters of Erase unit size, Erase Timeout, Write protect Group Size if the EXT_CSD_ERASE_GrOUP_DEF bit 0 is enabled. Tested on X86 but the changes should work on all platforms. Co-developed-by: Bean Huo <beanhuo@xxxxxxxxxx> Signed-off-by: Kimito Sakata <kimito.sakata@xxxxxxxxxx> Reviewed-by: Kenneth Gibbons <kenny.gibbons@xxxxxxxxxx> Changelog: V3--V4: 1. Replace unused pointer var with NULL. 2. Added msg if ERASE_GROUP_DEF enabled for HC. v2--v3: 1. Remove redundant ifndef V1--V2: 1. refactor Kimito's original patch 2. change to use MMC_IOC_MULTI_CMD 3. add checkup if eMMC devie supports secure erase/trim --- mmc_cmds.c | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/mmc_cmds.c b/mmc_cmds.c index 3e36ff2..afa85b7 100644 --- a/mmc_cmds.c +++ b/mmc_cmds.c @@ -2518,6 +2518,22 @@ static int erase(int dev_fd, __u32 argin, __u32 start, __u32 end) { int ret = 0; struct mmc_ioc_multi_cmd *multi_cmd; + __u8 ext_csd[512]; + + + ret = read_extcsd(dev_fd, ext_csd); + if (ret) { + fprintf(stderr, "Could not read EXT_CSD\n"); + exit(1); + } + if (ext_csd[EXT_CSD_ERASE_GROUP_DEF] & 0x01) { + fprintf(stderr, "High Capacity Erase Unit Size=%d bytes\n" \ + "High Capacity Erase Timeout=%d ms\n" \ + "High Capacity Write Protect Group Size=%d bytes\n", + ext_csd[224]*0x80000, + ext_csd[223]*300, + ext_csd[221]*ext_csd[224]*0x80000); + } multi_cmd = calloc(1, sizeof(struct mmc_ioc_multi_cmd) + 3 * sizeof(struct mmc_ioc_cmd)); @@ -2559,7 +2575,6 @@ int do_erase(int nargs, char **argv) { int dev_fd, ret; char *print_str; - char **eptr = NULL; __u8 ext_csd[512], checkup_mask = 0; __u32 arg, start, end; @@ -2569,14 +2584,14 @@ int do_erase(int nargs, char **argv) } if (strstr(argv[2], "0x") || strstr(argv[2], "0X")) - start = strtol(argv[2], eptr, 16); + start = strtol(argv[2], NULL, 16); else - start = strtol(argv[2], eptr, 10); + start = strtol(argv[2], NULL, 10); if (strstr(argv[3], "0x") || strstr(argv[3], "0X")) - end = strtol(argv[3], eptr, 16); + end = strtol(argv[3], NULL, 16); else - end = strtol(argv[3], eptr, 10); + end = strtol(argv[3], NULL, 10); if (end < start) { fprintf(stderr, "erase start [0x%08x] > erase end [0x%08x]\n", -- 2.31.1