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

2014-05-23 Thread Pantelis Antoniou
Hi Andrew,

On Apr 3, 2014, at 12:34 PM, 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_gabba...@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 16051e5..a850085 100644
 --- a/drivers/mmc/mmc.c
 +++ b/drivers/mmc/mmc.c
 @@ -150,6 +150,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;
 }
 @@ -501,7 +503,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 c0a1d9e..213c112 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  0x8000
 
 #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
 

Applied,

Thanks 

--Pantelis

Acked-by: Pantelis Antoniou pa...@antoniou-consulting.com


___
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot


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

2014-04-03 Thread Andrew Gabbasov
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_gabba...@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 16051e5..a850085 100644
--- a/drivers/mmc/mmc.c
+++ b/drivers/mmc/mmc.c
@@ -150,6 +150,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;
 }
@@ -501,7 +503,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 c0a1d9e..213c112 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   0x8000
 
 #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

___
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot