[U-Boot] [PATCH] mmc: Handle switch error status bit in MMC card status

MMC switch command for unsupported feature (e.g. bus width) sets a switch error bit in card status. This bit should be checked, and, if it's set, no access with new controller settings should be performed.
Signed-off-by: Andrew Gabbasov andrew_gabbasov@mentor.com --- drivers/mmc/mmc.c | 4 +++- include/mmc.h | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-)
diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c index 8ab0bc9..16105bc 100644 --- a/drivers/mmc/mmc.c +++ b/drivers/mmc/mmc.c @@ -155,6 +155,8 @@ int mmc_send_status(struct mmc *mmc, int timeout) #endif return TIMEOUT; } + if (cmd.response[0] & MMC_STATUS_SWITCH_ERROR) + return SWITCH_ERR;
return 0; } @@ -505,7 +507,7 @@ static int mmc_change_freq(struct mmc *mmc) err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_HS_TIMING, 1);
if (err) - return err; + return ((err == SWITCH_ERR) ? 0 : err);
/* Now check to see that it worked */ err = mmc_send_ext_csd(mmc, ext_csd); diff --git a/include/mmc.h b/include/mmc.h index e95a237..d5833f8 100644 --- a/include/mmc.h +++ b/include/mmc.h @@ -53,6 +53,7 @@ #define COMM_ERR -18 /* Communications Error */ #define TIMEOUT -19 #define IN_PROGRESS -20 /* operation is in progress */ +#define SWITCH_ERR -21 /* Card reports failure to switch mode */
#define MMC_CMD_GO_IDLE_STATE 0 #define MMC_CMD_SEND_OP_COND 1 @@ -108,6 +109,7 @@ #define SECURE_ERASE 0x80000000
#define MMC_STATUS_MASK (~0x0206BF7F) +#define MMC_STATUS_SWITCH_ERROR (1 << 7) #define MMC_STATUS_RDY_FOR_DATA (1 << 8) #define MMC_STATUS_CURR_STATE (0xf << 9) #define MMC_STATUS_ERROR (1 << 19)

Hi Andrew,
In general looks good; only a small nag.
On Mar 24, 2014, at 9:39 AM, Andrew Gabbasov wrote:
MMC switch command for unsupported feature (e.g. bus width) sets a switch error bit in card status. This bit should be checked, and, if it's set, no access with new controller settings should be performed.
Signed-off-by: Andrew Gabbasov andrew_gabbasov@mentor.com
drivers/mmc/mmc.c | 4 +++- include/mmc.h | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-)
diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c index 8ab0bc9..16105bc 100644 --- a/drivers/mmc/mmc.c +++ b/drivers/mmc/mmc.c @@ -155,6 +155,8 @@ int mmc_send_status(struct mmc *mmc, int timeout) #endif return TIMEOUT; }
if (cmd.response[0] & MMC_STATUS_SWITCH_ERROR)
return SWITCH_ERR;
return 0;
} @@ -505,7 +507,7 @@ static int mmc_change_freq(struct mmc *mmc) err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_HS_TIMING, 1);
if (err)
return err;
return ((err == SWITCH_ERR) ? 0 : err);
Change to:
return err == SWITCH_ERR ? 0 : err;
No need for parentheses.
/* Now check to see that it worked */ err = mmc_send_ext_csd(mmc, ext_csd); diff --git a/include/mmc.h b/include/mmc.h index e95a237..d5833f8 100644 --- a/include/mmc.h +++ b/include/mmc.h @@ -53,6 +53,7 @@ #define COMM_ERR -18 /* Communications Error */ #define TIMEOUT -19 #define IN_PROGRESS -20 /* operation is in progress */ +#define SWITCH_ERR -21 /* Card reports failure to switch mode */
#define MMC_CMD_GO_IDLE_STATE 0 #define MMC_CMD_SEND_OP_COND 1 @@ -108,6 +109,7 @@ #define SECURE_ERASE 0x80000000
#define MMC_STATUS_MASK (~0x0206BF7F) +#define MMC_STATUS_SWITCH_ERROR (1 << 7) #define MMC_STATUS_RDY_FOR_DATA (1 << 8) #define MMC_STATUS_CURR_STATE (0xf << 9)
#define MMC_STATUS_ERROR (1 << 19)
1.7.10.4
Regards
-- Pantelis

Hi Pantelis,
From: Pantelis Antoniou [panto@antoniou-consulting.com] Sent: Wednesday, April 02, 2014 14:14 To: Gabbasov, Andrew Cc: u-boot@lists.denx.de Subject: Re: [U-Boot] [PATCH] mmc: Handle switch error status bit in MMC card status
Hi Andrew,
In general looks good; only a small nag.
On Mar 24, 2014, at 9:39 AM, Andrew Gabbasov wrote:
MMC switch command for unsupported feature (e.g. bus width) sets a switch error bit in card status. This bit should be checked, and, if it's set, no access with new controller settings should be performed.
Signed-off-by: Andrew Gabbasov andrew_gabbasov@mentor.com
drivers/mmc/mmc.c | 4 +++- include/mmc.h | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-)
diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c index 8ab0bc9..16105bc 100644 --- a/drivers/mmc/mmc.c +++ b/drivers/mmc/mmc.c @@ -155,6 +155,8 @@ int mmc_send_status(struct mmc *mmc, int timeout) #endif return TIMEOUT; }
if (cmd.response[0] & MMC_STATUS_SWITCH_ERROR)
return SWITCH_ERR; return 0;
} @@ -505,7 +507,7 @@ static int mmc_change_freq(struct mmc *mmc) err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_HS_TIMING, 1);
if (err)
return err;
return ((err == SWITCH_ERR) ? 0 : err);
Change to:
return err == SWITCH_ERR ? 0 : err;
No need for parentheses.
Thank you for the review. I'm sending a v2 patch with his change and also re-based to current master head.
Thanks!
Best regards, Andrew
/* Now check to see that it worked */ err = mmc_send_ext_csd(mmc, ext_csd);
diff --git a/include/mmc.h b/include/mmc.h index e95a237..d5833f8 100644 --- a/include/mmc.h +++ b/include/mmc.h @@ -53,6 +53,7 @@ #define COMM_ERR -18 /* Communications Error */ #define TIMEOUT -19 #define IN_PROGRESS -20 /* operation is in progress */ +#define SWITCH_ERR -21 /* Card reports failure to switch mode */
#define MMC_CMD_GO_IDLE_STATE 0 #define MMC_CMD_SEND_OP_COND 1 @@ -108,6 +109,7 @@ #define SECURE_ERASE 0x80000000
#define MMC_STATUS_MASK (~0x0206BF7F) +#define MMC_STATUS_SWITCH_ERROR (1 << 7) #define MMC_STATUS_RDY_FOR_DATA (1 << 8) #define MMC_STATUS_CURR_STATE (0xf << 9)
#define MMC_STATUS_ERROR (1 << 19)
1.7.10.4
Regards
-- Pantelis

Hi Pantelis, ________________________________________
From: Gabbasov, Andrew Sent: Thursday, April 03, 2014 13:32 To: Pantelis Antoniou Cc: u-boot@lists.denx.de Subject: RE: [U-Boot] [PATCH] mmc: Handle switch error status bit in MMC card status
Hi Pantelis,
From: Pantelis Antoniou [panto@antoniou-consulting.com] Sent: Wednesday, April 02, 2014 14:14 To: Gabbasov, Andrew Cc: u-boot@lists.denx.de Subject: Re: [U-Boot] [PATCH] mmc: Handle switch error status bit in MMC card status
Hi Andrew,
In general looks good; only a small nag.
On Mar 24, 2014, at 9:39 AM, Andrew Gabbasov wrote:
MMC switch command for unsupported feature (e.g. bus width) sets a switch error bit in card status. This bit should be checked, and, if it's set, no access with new controller settings should be performed.
[ skipped ]
@@ -505,7 +507,7 @@ static int mmc_change_freq(struct mmc *mmc) err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_HS_TIMING, 1);
if (err)
return err;
return ((err == SWITCH_ERR) ? 0 : err);
Change to:
return err == SWITCH_ERR ? 0 : err;
No need for parentheses.
Thank you for the review. I'm sending a v2 patch with his change and also re-based to current master head.
Did you have a chance to look at the v2 patch (sent separately)? WIll you Ack it?
Thanks!
Best regards, Andrew
participants (3)
-
Andrew Gabbasov
-
Gabbasov, Andrew
-
Pantelis Antoniou