[PATCH] mmc: core: Fix mmc_select_hs200() regression in v4.7-rc.

Subsystems: multimedia card (mmc), secure digital (sd) and sdio subsystem, the rest

STALE3749d

5 messages, 3 authors, 2016-06-08 · open the first message on its own page

[PATCH] mmc: core: Fix mmc_select_hs200() regression in v4.7-rc.

From: Peter Griffin <peter.griffin@linaro.org>
Date: 2016-06-07 13:02:34

mmc_select_bus_width() returns bus width (4 or 8) on success or
zero if unsupported. If bus width is set successfully we then wish
to switch to HS200 mode.

This avoids the following error message in v4.70-rc2

[    2.523674] mmc0: mmc_select_hs200 failed, error 3
[    2.528516] mmc0: error 3 whilst initialising MMC card

With this patch card is enumerated correctly

[    2.468065] mmc0: new HS200 MMC card at address 0001
[    2.468335] mmcblk0: mmc0:0001 P1XXXX 7.20 GiB
[    2.468441] mmcblk0boot0: mmc0:0001 P1XXXX partition 1 2.00 MiB
[    2.468552] mmcblk0boot1: mmc0:0001 P1XXXX partition 2 2.00 MiB
[    2.468651] mmcblk0rpmb: mmc0:0001 P1XXXX partition 3 128 KiB
[    2.469269]  mmcblk0: p1

Fixes: 287980e (remove lots of IS_ERR_VALUE abuses)
Signed-off-by: Peter Griffin <peter.griffin@linaro.org>
Cc: Arnd Bergmann <arnd@arndb.de>
---
 drivers/mmc/core/mmc.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c
index c984321..aafb73d 100644
--- a/drivers/mmc/core/mmc.c
+++ b/drivers/mmc/core/mmc.c
@@ -1276,7 +1276,7 @@ static int mmc_select_hs200(struct mmc_card *card)
 	 * switch to HS200 mode if bus width is set successfully.
 	 */
 	err = mmc_select_bus_width(card);
-	if (!err) {
+	if (err > 0) {
 		val = EXT_CSD_TIMING_HS200 |
 		      card->drive_strength << EXT_CSD_DRV_STR_SHIFT;
 		err = __mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
@@ -1583,7 +1583,7 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr,
 	} else if (mmc_card_hs(card)) {
 		/* Select the desired bus width optionally */
 		err = mmc_select_bus_width(card);
-		if (!err) {
+		if (err > 0) {
 			err = mmc_select_hs_ddr(card);
 			if (err)
 				goto free_card;
-- 
1.9.1

Re: [PATCH] mmc: core: Fix mmc_select_hs200() regression in v4.7-rc.

From: Lee Jones <hidden>
Date: 2016-06-07 13:38:11

On Tue, 07 Jun 2016, Peter Griffin wrote:
quoted hunk
mmc_select_bus_width() returns bus width (4 or 8) on success or
zero if unsupported. If bus width is set successfully we then wish
to switch to HS200 mode.

This avoids the following error message in v4.70-rc2

[    2.523674] mmc0: mmc_select_hs200 failed, error 3
[    2.528516] mmc0: error 3 whilst initialising MMC card

With this patch card is enumerated correctly

[    2.468065] mmc0: new HS200 MMC card at address 0001
[    2.468335] mmcblk0: mmc0:0001 P1XXXX 7.20 GiB
[    2.468441] mmcblk0boot0: mmc0:0001 P1XXXX partition 1 2.00 MiB
[    2.468552] mmcblk0boot1: mmc0:0001 P1XXXX partition 2 2.00 MiB
[    2.468651] mmcblk0rpmb: mmc0:0001 P1XXXX partition 3 128 KiB
[    2.469269]  mmcblk0: p1

Fixes: 287980e (remove lots of IS_ERR_VALUE abuses)
Signed-off-by: Peter Griffin <peter.griffin@linaro.org>
Cc: Arnd Bergmann <arnd@arndb.de>
---
 drivers/mmc/core/mmc.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c
index c984321..aafb73d 100644
--- a/drivers/mmc/core/mmc.c
+++ b/drivers/mmc/core/mmc.c
@@ -1276,7 +1276,7 @@ static int mmc_select_hs200(struct mmc_card *card)
 	 * switch to HS200 mode if bus width is set successfully.
 	 */
 	err = mmc_select_bus_width(card);
-	if (!err) {
+	if (err > 0) {
 		val = EXT_CSD_TIMING_HS200 |
 		      card->drive_strength << EXT_CSD_DRV_STR_SHIFT;
 		err = __mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
@@ -1583,7 +1583,7 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr,
 	} else if (mmc_card_hs(card)) {
 		/* Select the desired bus width optionally */
 		err = mmc_select_bus_width(card);
-		if (!err) {
+		if (err > 0) {
 			err = mmc_select_hs_ddr(card);
 			if (err)
 				goto free_card;
Looks like this has already been 'fixed' in -rc2.

Although, this patch does not work for me.

commit f741494363c6c90e6744117d2771bbdf0fb3c455
Author: Chen-Yu Tsai [off-list ref]
Date:   Sun May 29 15:04:42 2016 +0800

    mmc: fix mmc mode selection for HS-DDR and higher
    
    When IS_ERR_VALUE was removed from the mmc core code, it was replaced
    with a simple not-zero check. This does not work, as the value checked
    is the return value for mmc_select_bus_width, which returns the set
    bit width on success. This made eMMC modes higher than HS-DDR unusable.
    
    Fix this by checking for a positive return value instead.
    
    Fixes: 287980e49ffc ("remove lots of IS_ERR_VALUE abuses")
    Cc: Arnd Bergmann [off-list ref]
    Signed-off-by: Chen-Yu Tsai [off-list ref]
    Acked-by: Hans de Goede [off-list ref]
    Reviewed-by: Krzysztof Kozlowski [off-list ref]
    Acked-by: Jaehoon Chung [off-list ref]
    Reviewed-by: Shawn Lin [off-list ref]
    Tested-by: Marcel Ziswiler [off-list ref]
    Tested-by: Bjorn Andersson [off-list ref]
    Signed-off-by: Ulf Hansson [off-list ref]
diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c
index c984321..5d438ad 100644
--- a/drivers/mmc/core/mmc.c
+++ b/drivers/mmc/core/mmc.c
@@ -1276,7 +1276,7 @@ static int mmc_select_hs200(struct mmc_card *card)
 	 * switch to HS200 mode if bus width is set successfully.
 	 */
 	err = mmc_select_bus_width(card);
-	if (!err) {
+	if (err >= 0) {
 		val = EXT_CSD_TIMING_HS200 |
 		      card->drive_strength << EXT_CSD_DRV_STR_SHIFT;
 		err = __mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
@@ -1583,7 +1583,7 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr,
 	} else if (mmc_card_hs(card)) {
 		/* Select the desired bus width optionally */
 		err = mmc_select_bus_width(card);
-		if (!err) {
+		if (err >= 0) {
 			err = mmc_select_hs_ddr(card);
 			if (err)
 				goto free_card;
-- 
Lee Jones
Linaro STMicroelectronics Landing Team Lead
Linaro.org ? Open source software for ARM SoCs
Follow Linaro: Facebook | Twitter | Blog

Re: [PATCH] mmc: core: Fix mmc_select_hs200() regression in v4.7-rc.

From: Peter Griffin <peter.griffin@linaro.org>
Date: 2016-06-07 13:57:11

Hi Lee,

On Tue, 07 Jun 2016, Lee Jones wrote:
On Tue, 07 Jun 2016, Peter Griffin wrote:
quoted
mmc_select_bus_width() returns bus width (4 or 8) on success or
zero if unsupported. If bus width is set successfully we then wish
to switch to HS200 mode.

This avoids the following error message in v4.70-rc2

[    2.523674] mmc0: mmc_select_hs200 failed, error 3
[    2.528516] mmc0: error 3 whilst initialising MMC card

With this patch card is enumerated correctly

[    2.468065] mmc0: new HS200 MMC card at address 0001
[    2.468335] mmcblk0: mmc0:0001 P1XXXX 7.20 GiB
[    2.468441] mmcblk0boot0: mmc0:0001 P1XXXX partition 1 2.00 MiB
[    2.468552] mmcblk0boot1: mmc0:0001 P1XXXX partition 2 2.00 MiB
[    2.468651] mmcblk0rpmb: mmc0:0001 P1XXXX partition 3 128 KiB
[    2.469269]  mmcblk0: p1

Fixes: 287980e (remove lots of IS_ERR_VALUE abuses)
Signed-off-by: Peter Griffin <peter.griffin@linaro.org>
Cc: Arnd Bergmann <arnd@arndb.de>
---
 drivers/mmc/core/mmc.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c
index c984321..aafb73d 100644
--- a/drivers/mmc/core/mmc.c
+++ b/drivers/mmc/core/mmc.c
@@ -1276,7 +1276,7 @@ static int mmc_select_hs200(struct mmc_card *card)
 	 * switch to HS200 mode if bus width is set successfully.
 	 */
 	err = mmc_select_bus_width(card);
-	if (!err) {
+	if (err > 0) {
 		val = EXT_CSD_TIMING_HS200 |
 		      card->drive_strength << EXT_CSD_DRV_STR_SHIFT;
 		err = __mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
@@ -1583,7 +1583,7 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr,
 	} else if (mmc_card_hs(card)) {
 		/* Select the desired bus width optionally */
 		err = mmc_select_bus_width(card);
-		if (!err) {
+		if (err > 0) {
 			err = mmc_select_hs_ddr(card);
 			if (err)
 				goto free_card;
Looks like this has already been 'fixed' in -rc2.
Ah, it seems I was on -rc1, not -rc2
quoted hunk
Although, this patch does not work for me.
    mmc: fix mmc mode selection for HS-DDR and higher
    
    When IS_ERR_VALUE was removed from the mmc core code, it was replaced
    with a simple not-zero check. This does not work, as the value checked
    is the return value for mmc_select_bus_width, which returns the set
    bit width on success. This made eMMC modes higher than HS-DDR unusable.
    
    Fix this by checking for a positive return value instead.
    
    Fixes: 287980e49ffc ("remove lots of IS_ERR_VALUE abuses")
    Cc: Arnd Bergmann [off-list ref]
    Signed-off-by: Chen-Yu Tsai [off-list ref]
    Acked-by: Hans de Goede [off-list ref]
    Reviewed-by: Krzysztof Kozlowski [off-list ref]
    Acked-by: Jaehoon Chung [off-list ref]
    Reviewed-by: Shawn Lin [off-list ref]
    Tested-by: Marcel Ziswiler [off-list ref]
    Tested-by: Bjorn Andersson [off-list ref]
    Signed-off-by: Ulf Hansson [off-list ref]
diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c
index c984321..5d438ad 100644
--- a/drivers/mmc/core/mmc.c
+++ b/drivers/mmc/core/mmc.c
@@ -1276,7 +1276,7 @@ static int mmc_select_hs200(struct mmc_card *card)
 	 * switch to HS200 mode if bus width is set successfully.
 	 */
 	err = mmc_select_bus_width(card);
-	if (!err) {
+	if (err >= 0) {

This patch looks wrong to me, as if zero is returned by mmc_select_bus_width() it
means setting the bus width failed, and you most likely don't want to switch to
hs200 mode.

Ulf - what is your opinion?

regards,

Peter.> 

Re: [PATCH] mmc: core: Fix mmc_select_hs200() regression in v4.7-rc.

From: Ulf Hansson <hidden>
Date: 2016-06-07 21:58:24

On 7 June 2016 at 15:57, Peter Griffin [off-list ref] wrote:
Hi Lee,

On Tue, 07 Jun 2016, Lee Jones wrote:
quoted
On Tue, 07 Jun 2016, Peter Griffin wrote:
quoted
mmc_select_bus_width() returns bus width (4 or 8) on success or
zero if unsupported. If bus width is set successfully we then wish
to switch to HS200 mode.

This avoids the following error message in v4.70-rc2

[    2.523674] mmc0: mmc_select_hs200 failed, error 3
[    2.528516] mmc0: error 3 whilst initialising MMC card

With this patch card is enumerated correctly

[    2.468065] mmc0: new HS200 MMC card at address 0001
[    2.468335] mmcblk0: mmc0:0001 P1XXXX 7.20 GiB
[    2.468441] mmcblk0boot0: mmc0:0001 P1XXXX partition 1 2.00 MiB
[    2.468552] mmcblk0boot1: mmc0:0001 P1XXXX partition 2 2.00 MiB
[    2.468651] mmcblk0rpmb: mmc0:0001 P1XXXX partition 3 128 KiB
[    2.469269]  mmcblk0: p1

Fixes: 287980e (remove lots of IS_ERR_VALUE abuses)
Signed-off-by: Peter Griffin <peter.griffin@linaro.org>
Cc: Arnd Bergmann <arnd@arndb.de>
---
 drivers/mmc/core/mmc.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c
index c984321..aafb73d 100644
--- a/drivers/mmc/core/mmc.c
+++ b/drivers/mmc/core/mmc.c
@@ -1276,7 +1276,7 @@ static int mmc_select_hs200(struct mmc_card *card)
     * switch to HS200 mode if bus width is set successfully.
     */
    err = mmc_select_bus_width(card);
-   if (!err) {
+   if (err > 0) {
            val = EXT_CSD_TIMING_HS200 |
                  card->drive_strength << EXT_CSD_DRV_STR_SHIFT;
            err = __mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
@@ -1583,7 +1583,7 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr,
    } else if (mmc_card_hs(card)) {
            /* Select the desired bus width optionally */
            err = mmc_select_bus_width(card);
-           if (!err) {
+           if (err > 0) {
                    err = mmc_select_hs_ddr(card);
                    if (err)
                            goto free_card;
Looks like this has already been 'fixed' in -rc2.
Ah, it seems I was on -rc1, not -rc2
quoted
Although, this patch does not work for me.
    mmc: fix mmc mode selection for HS-DDR and higher

    When IS_ERR_VALUE was removed from the mmc core code, it was replaced
    with a simple not-zero check. This does not work, as the value checked
    is the return value for mmc_select_bus_width, which returns the set
    bit width on success. This made eMMC modes higher than HS-DDR unusable.

    Fix this by checking for a positive return value instead.

    Fixes: 287980e49ffc ("remove lots of IS_ERR_VALUE abuses")
    Cc: Arnd Bergmann [off-list ref]
    Signed-off-by: Chen-Yu Tsai [off-list ref]
    Acked-by: Hans de Goede [off-list ref]
    Reviewed-by: Krzysztof Kozlowski [off-list ref]
    Acked-by: Jaehoon Chung [off-list ref]
    Reviewed-by: Shawn Lin [off-list ref]
    Tested-by: Marcel Ziswiler [off-list ref]
    Tested-by: Bjorn Andersson [off-list ref]
    Signed-off-by: Ulf Hansson [off-list ref]
diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c
index c984321..5d438ad 100644
--- a/drivers/mmc/core/mmc.c
+++ b/drivers/mmc/core/mmc.c
@@ -1276,7 +1276,7 @@ static int mmc_select_hs200(struct mmc_card *card)
       * switch to HS200 mode if bus width is set successfully.
       */
      err = mmc_select_bus_width(card);
-     if (!err) {
+     if (err >= 0) {

This patch looks wrong to me, as if zero is returned by mmc_select_bus_width() it
means setting the bus width failed, and you most likely don't want to switch to
hs200 mode.

Ulf - what is your opinion?

regards,

Peter.>
The commit above (mmc: fix mmc mode selection for HS-DDR and higher),
simply restored the old behaviour and that was sufficient to solve the
regressions.

Nevertheless I agree, that if mmc_select_bus_width() returns 0, that
should likely mean that we shouldn't try to switch to hs200. If we
want to change that, let's do that in a separate patch on top.
So, do you see a problem in rc2?

Kind regards
Uffe

Re: [PATCH] mmc: core: Fix mmc_select_hs200() regression in v4.7-rc.

From: Peter Griffin <peter.griffin@linaro.org>
Date: 2016-06-08 10:20:56

Hi Ulf,

On Tue, 07 Jun 2016, Ulf Hansson wrote:
On 7 June 2016 at 15:57, Peter Griffin [off-list ref] wrote:
quoted
Hi Lee,

On Tue, 07 Jun 2016, Lee Jones wrote:
quoted
On Tue, 07 Jun 2016, Peter Griffin wrote:
quoted
mmc_select_bus_width() returns bus width (4 or 8) on success or
zero if unsupported. If bus width is set successfully we then wish
to switch to HS200 mode.

This avoids the following error message in v4.70-rc2

[    2.523674] mmc0: mmc_select_hs200 failed, error 3
[    2.528516] mmc0: error 3 whilst initialising MMC card

With this patch card is enumerated correctly

[    2.468065] mmc0: new HS200 MMC card at address 0001
[    2.468335] mmcblk0: mmc0:0001 P1XXXX 7.20 GiB
[    2.468441] mmcblk0boot0: mmc0:0001 P1XXXX partition 1 2.00 MiB
[    2.468552] mmcblk0boot1: mmc0:0001 P1XXXX partition 2 2.00 MiB
[    2.468651] mmcblk0rpmb: mmc0:0001 P1XXXX partition 3 128 KiB
[    2.469269]  mmcblk0: p1

Fixes: 287980e (remove lots of IS_ERR_VALUE abuses)
Signed-off-by: Peter Griffin <peter.griffin@linaro.org>
Cc: Arnd Bergmann <arnd@arndb.de>
---
 drivers/mmc/core/mmc.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c
index c984321..aafb73d 100644
--- a/drivers/mmc/core/mmc.c
+++ b/drivers/mmc/core/mmc.c
@@ -1276,7 +1276,7 @@ static int mmc_select_hs200(struct mmc_card *card)
     * switch to HS200 mode if bus width is set successfully.
     */
    err = mmc_select_bus_width(card);
-   if (!err) {
+   if (err > 0) {
            val = EXT_CSD_TIMING_HS200 |
                  card->drive_strength << EXT_CSD_DRV_STR_SHIFT;
            err = __mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
@@ -1583,7 +1583,7 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr,
    } else if (mmc_card_hs(card)) {
            /* Select the desired bus width optionally */
            err = mmc_select_bus_width(card);
-           if (!err) {
+           if (err > 0) {
                    err = mmc_select_hs_ddr(card);
                    if (err)
                            goto free_card;
Looks like this has already been 'fixed' in -rc2.
Ah, it seems I was on -rc1, not -rc2
quoted
Although, this patch does not work for me.
    mmc: fix mmc mode selection for HS-DDR and higher

    When IS_ERR_VALUE was removed from the mmc core code, it was replaced
    with a simple not-zero check. This does not work, as the value checked
    is the return value for mmc_select_bus_width, which returns the set
    bit width on success. This made eMMC modes higher than HS-DDR unusable.

    Fix this by checking for a positive return value instead.

    Fixes: 287980e49ffc ("remove lots of IS_ERR_VALUE abuses")
    Cc: Arnd Bergmann [off-list ref]
    Signed-off-by: Chen-Yu Tsai [off-list ref]
    Acked-by: Hans de Goede [off-list ref]
    Reviewed-by: Krzysztof Kozlowski [off-list ref]
    Acked-by: Jaehoon Chung [off-list ref]
    Reviewed-by: Shawn Lin [off-list ref]
    Tested-by: Marcel Ziswiler [off-list ref]
    Tested-by: Bjorn Andersson [off-list ref]
    Signed-off-by: Ulf Hansson [off-list ref]
diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c
index c984321..5d438ad 100644
--- a/drivers/mmc/core/mmc.c
+++ b/drivers/mmc/core/mmc.c
@@ -1276,7 +1276,7 @@ static int mmc_select_hs200(struct mmc_card *card)
       * switch to HS200 mode if bus width is set successfully.
       */
      err = mmc_select_bus_width(card);
-     if (!err) {
+     if (err >= 0) {

This patch looks wrong to me, as if zero is returned by mmc_select_bus_width() it
means setting the bus width failed, and you most likely don't want to switch to
hs200 mode.

Ulf - what is your opinion?

regards,

Peter.>
The commit above (mmc: fix mmc mode selection for HS-DDR and higher),
simply restored the old behaviour and that was sufficient to solve the
regressions.

Nevertheless I agree, that if mmc_select_bus_width() returns 0, that
should likely mean that we shouldn't try to switch to hs200. If we
want to change that, let's do that in a separate patch on top.
OK, I will send a v2 patch in a moment.
So, do you see a problem in rc2?
No, despite what the commit message says, I wrote & tested the patch on
v4.7-rc1. A stock v4.7-rc2 enumerates the card correctly on my STi platform.

I think my patch is now only useful if setting the bus width were to fail.

regards,

Peter.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help