aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorShankar Athanikar <shankar.ma@samsung.com>2022-02-11 17:34:49 +0530
committerUlf Hansson <ulf.hansson@linaro.org>2022-02-17 16:15:21 +0100
commit4303889c8bd9a2357587eb6ebacecb70098a264d (patch)
treea300c055c8b48085137d20cb45aa94316cd61822
parent4637a7c0df49ba349f9f0e4ab0828133fc06cc81 (diff)
downloadmmc-utils-4303889c8bd9a2357587eb6ebacecb70098a264d.tar.gz
Enhancement to do_status_get() function for detailed Response info
This enhancement covers detailed status register decoding with ERROR/STATUS information when host sends CMD13(with SQS=0) Signed-off-by: Shankar Athanikar <shankar.ma@samsung.com> Reviewed-by: Mohan Raj Veerasamy <mohanraj.v@samsung.com> Link: https://lore.kernel.org/r/20220211120449.195052-1-shankar.ma@samsung.com Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
-rw-r--r--mmc.h22
-rw-r--r--mmc_cmds.c85
2 files changed, 107 insertions, 0 deletions
diff --git a/mmc.h b/mmc.h
index 2ff6e66..25d6864 100644
--- a/mmc.h
+++ b/mmc.h
@@ -41,6 +41,28 @@
[1] Discard Enable
[0] Identify Write Blocks for
Erase (or TRIM Enable) R1b */
+
+#define R1_OUT_OF_RANGE (1 << 31) /* er, c */
+#define R1_ADDRESS_ERROR (1 << 30) /* erx, c */
+#define R1_BLOCK_LEN_ERROR (1 << 29) /* er, c */
+#define R1_ERASE_SEQ_ERROR (1 << 28) /* er, c */
+#define R1_ERASE_PARAM (1 << 27) /* ex, c */
+#define R1_WP_VIOLATION (1 << 26) /* erx, c */
+#define R1_CARD_IS_LOCKED (1 << 25) /* sx, a */
+#define R1_LOCK_UNLOCK_FAILED (1 << 24) /* erx, c */
+#define R1_COM_CRC_ERROR (1 << 23) /* er, b */
+#define R1_ILLEGAL_COMMAND (1 << 22) /* er, b */
+#define R1_CARD_ECC_FAILED (1 << 21) /* ex, c */
+#define R1_CC_ERROR (1 << 20) /* erx, c */
+#define R1_ERROR (1 << 19) /* erx, c */
+#define R1_CID_CSD_OVERWRITE (1 << 16) /* erx, c, CID/CSD overwrite */
+#define R1_WP_ERASE_SKIP (1 << 15) /* sx, c */
+#define R1_CARD_ECC_DISABLED (1 << 14) /* sx, a */
+#define R1_ERASE_RESET (1 << 13) /* sr, c */
+#define R1_READY_FOR_DATA (1 << 8) /* sx, a */
+#define R1_EXCEPTION_EVENT (1 << 6) /* sr, a */
+#define R1_APP_CMD (1 << 5) /* sr, c */
+
/*
* EXT_CSD fields
*/
diff --git a/mmc_cmds.c b/mmc_cmds.c
index 508ddad..49d3e32 100644
--- a/mmc_cmds.c
+++ b/mmc_cmds.c
@@ -848,6 +848,8 @@ int do_status_get(int nargs, char **argv)
__u32 response;
int fd, ret;
char *device;
+ const char *str;
+ __u8 state;
if (nargs != 2) {
fprintf(stderr, "Usage: mmc status get </path/to/mmcblkX>\n");
@@ -870,6 +872,89 @@ int do_status_get(int nargs, char **argv)
printf("SEND_STATUS response: 0x%08x\n", response);
+ if (response & R1_OUT_OF_RANGE)
+ printf("ERROR: ADDRESS_OUT_OF_RANGE\n");
+ if (response & R1_ADDRESS_ERROR)
+ printf("ERROR: ADDRESS_MISALIGN\n");
+ if (response & R1_BLOCK_LEN_ERROR)
+ printf("ERROR: BLOCK_LEN_ERROR\n");
+ if (response & R1_ERASE_SEQ_ERROR)
+ printf("ERROR: ERASE_SEQ_ERROR\n");
+ if (response & R1_ERASE_PARAM)
+ printf("ERROR: ERASE_PARAM_ERROR\n");
+ if (response & R1_WP_VIOLATION)
+ printf("ERROR: WP_VOILATION\n");
+ if (response & R1_CARD_IS_LOCKED)
+ printf("STATUS: DEVICE_IS_LOCKED\n");
+ if (response & R1_LOCK_UNLOCK_FAILED)
+ printf("ERROR: LOCK_UNLOCK_IS_FAILED\n");
+ if (response & R1_COM_CRC_ERROR)
+ printf("ERROR: COM_CRC_ERROR\n");
+ if (response & R1_ILLEGAL_COMMAND)
+ printf("ERROR: ILLEGAL_COMMAND\n");
+ if (response & R1_CARD_ECC_FAILED)
+ printf("ERROR: DEVICE_ECC_FAILED\n");
+ if (response & R1_CC_ERROR)
+ printf("ERROR: CC_ERROR\n");
+ if (response & R1_ERROR)
+ printf("ERROR: ERROR\n");
+ if (response & R1_CID_CSD_OVERWRITE)
+ printf("ERROR: CID/CSD OVERWRITE\n");
+ if (response & R1_WP_ERASE_SKIP)
+ printf("ERROR: WP_ERASE_SKIP\n");
+ if (response & R1_ERASE_RESET)
+ printf("ERROR: ERASE_RESET\n");
+
+ state = (response >> 9) & 0xF;
+ switch (state) {
+ case 0:
+ str = "IDLE";
+ break;
+ case 1:
+ str = "READY";
+ break;
+ case 2:
+ str = "IDENT";
+ break;
+ case 3:
+ str = "STDBY";
+ break;
+ case 4:
+ str = "TRANS";
+ break;
+ case 5:
+ str = "DATA";
+ break;
+ case 6:
+ str = "RCV";
+ break;
+ case 7:
+ str = "PRG";
+ break;
+ case 8:
+ str = "DIS";
+ break;
+ case 9:
+ str = "BTST";
+ break;
+ case 10:
+ str = "SLP";
+ break;
+ default:
+ printf("Attention : Device state is INVALID: Kindly check the Response\n");
+ goto out_free;
+ }
+
+ printf("DEVICE STATE: %s\n", str);
+ if (response & R1_READY_FOR_DATA)
+ printf("STATUS: READY_FOR_DATA\n");
+ if (response & R1_SWITCH_ERROR)
+ printf("ERROR: SWITCH_ERROR\n");
+ if (response & R1_EXCEPTION_EVENT)
+ printf("STATUS: EXCEPTION_EVENT\n"); /* Check EXCEPTION_EVENTS_STATUS fields for further actions */
+ if (response & R1_APP_CMD)
+ printf("STATUS: APP_CMD\n");
+out_free:
close(fd);
return ret;
}