mmc: sd: fix the maximum au_size for SD3.0
PATCH 1/1 mmc: sd: fix the maximum au_size for SD3.0
Since SD Physical Layer specification V3.0, AU_SIZE is supported up to 0xf. So If SD-card is supported v3.0, then max_au should be 0xf.
--- drivers/mmc/core/sd.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)
drivers/mmc/core/sd.c +8 -2
@@ -215,7 +215,7 @@ static int mmc_decode_scr(struct mmc_card *card)static int mmc_read_ssr (struct mmc_card *card) {unsigned int au, es, et, eo; -int err, i; +int err, i, max_au;u32 *ssr;if (!(card->csd.cmdclass &CCC_APP_SPEC )) {
@@ -239,12 +239,18 @@ static int mmc_read_ssr(struct mmc_card *card)for (i =0 ; i <16 ; i++) ssr[i] =be32_to_cpu (ssr[i]); +/* The value of maximum au_size is supported 0xF since SD3.0 */ +if (card->scr.sda_spec3) + max_au =0xf ; +else + max_au =9 ; +/* * UNSTUFF_BITS only works with four u32s so we have to offset the * bitfield positions accordingly. */ au =UNSTUFF_BITS (ssr,428 -384 ,4 ); -if (au >0 && au <=9 ) { +if (au >0 && au <= max_au) { card->ssr.au =1 << (au +4 ); es =UNSTUFF_BITS (ssr,408 -384 ,16 ); et =UNSTUFF_BITS (ssr,402 -384 ,6 );
Signature · 1 line
1.7.9.5
Chris Ball
AppliedHi Jaehoon,
Pushed to mmc-next for 3.12 with the following minor change, let me know if you disagree:
Quoted 23 lines · Jaehoon Chung
Since SD Physical Layer specification V3.0,
AU_SIZEis supported up to0xf. So If SD-card is supported v3.0, thenmax_aushould be0xf.Signed-off-by Jaehoon Chung <[email protected]>Signed-off-by Kyungmin Park <[email protected]>--- drivers/mmc/core/sd.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)drivers/mmc/core/sd.c +1
-1@@ -215,7 +215,7 @@ static int mmc_decode_scr(struct mmc_card *card)static int mmc_read_ssr (struct mmc_card *card) {unsigned int au, es, et, eo; -int err, i; +int err, i, max_au;u32 *ssr;if (!(card->csd.cmdclass &CCC_APP_SPEC )) {
drivers/mmc/core/sd.c static int mmc_read_ssr(struct mmc_card *card) · line 247
Quoted 9 lines
drivers/mmc/core/sd.c +6
-0@@ -239,12 +239,18 @@ static int mmc_read_ssr(struct mmc_card *card)for (i =0 ; i <16 ; i++) ssr[i] =be32_to_cpu (ssr[i]); +/* The value of maximum au_size is supported 0xF since SD3.0 */ +if (card->scr.sda_spec3) + max_au =0xf ; +else + max_au =9 ; +
/* SD3.0 increases max AU size to 64MB (0xF) from 4MB (0x9) */ max_au = card->scr.sda_spec3 ? 0xF : 0x9;
drivers/mmc/core/sd.c static int mmc_read_ssr(struct mmc_card *card) · line 256
Quoted 10 lines
drivers/mmc/core/sd.c +1
-1/* * UNSTUFF_BITS only works with four u32s so we have to offset the * bitfield positions accordingly. */ au =UNSTUFF_BITS (ssr,428 -384 ,4 ); -if (au >0 && au <=9 ) { +if (au >0 && au <= max_au) { card->ssr.au =1 << (au +4 ); es =UNSTUFF_BITS (ssr,408 -384 ,16 ); et =UNSTUFF_BITS (ssr,402 -384 ,6 );
Thanks,
- Chris.
Signature · 1 line
Chris Ball <[email protected]> <http://printf.net/>
Hi Chris,
Thanks a lot.
Do you have any comment or plan for merging?
https://patchwork.kernel.org/patch/2837942/
https://patchwork.kernel.org/patch/2837943/
https://patchwork.kernel.org/patch/2837944/
https://patchwork.kernel.org/patch/2837945/
Best Regards,
Jaehoon Chung
Quoted 57 lines · Chris Ball
Hi Jaehoon,
Pushed to mmc-next for 3.12 with the following minor change, let me know if you disagree:
Quoted 23 lines · Jaehoon Chung
Since SD Physical Layer specification V3.0,
AU_SIZEis supported up to0xf. So If SD-card is supported v3.0, thenmax_aushould be0xf.Signed-off-by Jaehoon Chung <[email protected]>Signed-off-by Kyungmin Park <[email protected]>--- drivers/mmc/core/sd.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)drivers/mmc/core/sd.c +1
-1@@ -215,7 +215,7 @@ static int mmc_decode_scr(struct mmc_card *card)static int mmc_read_ssr (struct mmc_card *card) {unsigned int au, es, et, eo; -int err, i; +int err, i, max_au;u32 *ssr;if (!(card->csd.cmdclass &CCC_APP_SPEC )) {drivers/mmc/core/sd.c static int mmc_read_ssr(struct mmc_card *card) · line 247
Quoted 9 lines
drivers/mmc/core/sd.c +6
-0@@ -239,12 +239,18 @@ static int mmc_read_ssr(struct mmc_card *card)for (i =0 ; i <16 ; i++) ssr[i] =be32_to_cpu (ssr[i]); +/* The value of maximum au_size is supported 0xF since SD3.0 */ +if (card->scr.sda_spec3) + max_au =0xf ; +else + max_au =9 ; +/* SD3.0 increases max AU size to 64MB (
0xF) from 4MB (0x9) */max_au=card->scr.sda_spec3?0xF:0x9;drivers/mmc/core/sd.c static int mmc_read_ssr(struct mmc_card *card) · line 256
Quoted 10 lines
drivers/mmc/core/sd.c +1
-1/* * UNSTUFF_BITS only works with four u32s so we have to offset the * bitfield positions accordingly. */ au =UNSTUFF_BITS (ssr,428 -384 ,4 ); -if (au >0 && au <=9 ) { +if (au >0 && au <= max_au) { card->ssr.au =1 << (au +4 ); es =UNSTUFF_BITS (ssr,408 -384 ,16 ); et =UNSTUFF_BITS (ssr,402 -384 ,6 );Thanks,
- Chris.