* [PATCH] mmc: core: Use maximum timeout values in case TACC field is zero
@ 2014-03-27 15:32 Stefan Wahren
2014-03-27 15:41 ` Fabio Estevam
2014-04-02 11:25 ` Ulf Hansson
0 siblings, 2 replies; 6+ messages in thread
From: Stefan Wahren @ 2014-03-27 15:32 UTC (permalink / raw)
To: fabio.estevam; +Cc: chris, otavio, Peter.Chen, Kernel, linux-mmc
When plugging a specific micro SD card at MMC socket of a custom i.MX28 board,
we get the following kernel warning:
WARNING: CPU: 0 PID: 30 at drivers/mmc/host/mxs-mmc.c:342 mxs_mmc_start_cmd+0x34c/0x378()
Modules linked in:
CPU: 0 PID: 30 Comm: kworker/u2:1 Not tainted 3.14.0-rc5 #8
Workqueue: kmmcd mmc_rescan
[<c0015420>] (unwind_backtrace) from [<c0012cb0>] (show_stack+0x10/0x14)
[<c0012cb0>] (show_stack) from [<c001daf8>] (warn_slowpath_common+0x6c/0x8c)
[<c001daf8>] (warn_slowpath_common) from [<c001db34>] (warn_slowpath_null+0x1c/0x24)
[<c001db34>] (warn_slowpath_null) from [<c0349478>] (mxs_mmc_start_cmd+0x34c/0x378)
[<c0349478>] (mxs_mmc_start_cmd) from [<c0338fa0>] (mmc_start_request+0xc4/0xf4)
[<c0338fa0>] (mmc_start_request) from [<c03390b4>] (mmc_wait_for_req+0x50/0x164)
[<c03390b4>] (mmc_wait_for_req) from [<c03405b8>] (mmc_app_send_scr+0x158/0x1c8)
[<c03405b8>] (mmc_app_send_scr) from [<c033ee1c>] (mmc_sd_setup_card+0x80/0x3c8)
[<c033ee1c>] (mmc_sd_setup_card) from [<c033f788>] (mmc_sd_init_card+0x124/0x66c)
[<c033f788>] (mmc_sd_init_card) from [<c033fd7c>] (mmc_attach_sd+0xac/0x174)
[<c033fd7c>] (mmc_attach_sd) from [<c033a658>] (mmc_rescan+0x25c/0x2d8)
[<c033a658>] (mmc_rescan) from [<c003597c>] (process_one_work+0x1b4/0x4ec)
[<c003597c>] (process_one_work) from [<c0035de4>] (worker_thread+0x130/0x464)
[<c0035de4>] (worker_thread) from [<c003c824>] (kthread+0xb4/0xd0)
[<c003c824>] (kthread) from [<c000f420>] (ret_from_fork+0x14/0x34)
The error is due to an invalid value in CSD register of a specific 2GB micro
SD card. The CSD version of this card is 1.0 but the TACC field has the invalid
value 0. Since the kernel is making use of this TACC field to calculate the
SD card timeout, an invalid value 0 leads to a warning at mxs_ns_to_ssp_ticks()
and later the following misleading error messages appears in a loop:
mxs-mmc 80010000.ssp: card claims to support voltages below defined range
mxs-mmc 80010000.ssp: no support for card's volts
mmc0: error -22 whilst initialising MMC card
This error is only found on this 2GB SD card on mxs platform.
On x86 this card works without any problems.
The following patch based on the work of Peter Chen and Otavio Salvador. It
catches the case that the determined timeout is still 0 and set it's to a
valid value.
Successful tested on a i.MX28 board.
Signed-off-by: Stefan Wahren <stefan.wahren@i2se.com>
---
drivers/mmc/core/core.c | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c
index 098374b..a9cd996 100644
--- a/drivers/mmc/core/core.c
+++ b/drivers/mmc/core/core.c
@@ -815,6 +815,10 @@ void mmc_set_data_timeout(struct mmc_data *data, const struct mmc_card *card)
data->timeout_ns = limit_us * 1000;
data->timeout_clks = 0;
}
+
+ /* assign limit value if invalid */
+ if (data->timeout_ns == 0)
+ data->timeout_ns = limit_us * 1000;
}
/*
--
1.7.10.4
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH] mmc: core: Use maximum timeout values in case TACC field is zero
2014-03-27 15:32 [PATCH] mmc: core: Use maximum timeout values in case TACC field is zero Stefan Wahren
@ 2014-03-27 15:41 ` Fabio Estevam
2014-04-02 8:42 ` Stefan Wahren
2014-04-02 11:25 ` Ulf Hansson
1 sibling, 1 reply; 6+ messages in thread
From: Fabio Estevam @ 2014-03-27 15:41 UTC (permalink / raw)
To: Stefan Wahren
Cc: Fabio Estevam, Chris Ball, Otavio Salvador, Peter Chen,
Sascha Hauer, linux-mmc@vger.kernel.org
On Thu, Mar 27, 2014 at 12:32 PM, Stefan Wahren <stefan.wahren@i2se.com> wrote:
> When plugging a specific micro SD card at MMC socket of a custom i.MX28 board,
> we get the following kernel warning:
>
> WARNING: CPU: 0 PID: 30 at drivers/mmc/host/mxs-mmc.c:342 mxs_mmc_start_cmd+0x34c/0x378()
> Modules linked in:
> CPU: 0 PID: 30 Comm: kworker/u2:1 Not tainted 3.14.0-rc5 #8
> Workqueue: kmmcd mmc_rescan
> [<c0015420>] (unwind_backtrace) from [<c0012cb0>] (show_stack+0x10/0x14)
> [<c0012cb0>] (show_stack) from [<c001daf8>] (warn_slowpath_common+0x6c/0x8c)
> [<c001daf8>] (warn_slowpath_common) from [<c001db34>] (warn_slowpath_null+0x1c/0x24)
> [<c001db34>] (warn_slowpath_null) from [<c0349478>] (mxs_mmc_start_cmd+0x34c/0x378)
> [<c0349478>] (mxs_mmc_start_cmd) from [<c0338fa0>] (mmc_start_request+0xc4/0xf4)
> [<c0338fa0>] (mmc_start_request) from [<c03390b4>] (mmc_wait_for_req+0x50/0x164)
> [<c03390b4>] (mmc_wait_for_req) from [<c03405b8>] (mmc_app_send_scr+0x158/0x1c8)
> [<c03405b8>] (mmc_app_send_scr) from [<c033ee1c>] (mmc_sd_setup_card+0x80/0x3c8)
> [<c033ee1c>] (mmc_sd_setup_card) from [<c033f788>] (mmc_sd_init_card+0x124/0x66c)
> [<c033f788>] (mmc_sd_init_card) from [<c033fd7c>] (mmc_attach_sd+0xac/0x174)
> [<c033fd7c>] (mmc_attach_sd) from [<c033a658>] (mmc_rescan+0x25c/0x2d8)
> [<c033a658>] (mmc_rescan) from [<c003597c>] (process_one_work+0x1b4/0x4ec)
> [<c003597c>] (process_one_work) from [<c0035de4>] (worker_thread+0x130/0x464)
> [<c0035de4>] (worker_thread) from [<c003c824>] (kthread+0xb4/0xd0)
> [<c003c824>] (kthread) from [<c000f420>] (ret_from_fork+0x14/0x34)
>
> The error is due to an invalid value in CSD register of a specific 2GB micro
> SD card. The CSD version of this card is 1.0 but the TACC field has the invalid
> value 0. Since the kernel is making use of this TACC field to calculate the
> SD card timeout, an invalid value 0 leads to a warning at mxs_ns_to_ssp_ticks()
> and later the following misleading error messages appears in a loop:
>
> mxs-mmc 80010000.ssp: card claims to support voltages below defined range
> mxs-mmc 80010000.ssp: no support for card's volts
> mmc0: error -22 whilst initialising MMC card
>
> This error is only found on this 2GB SD card on mxs platform.
> On x86 this card works without any problems.
Thanks for the patch, Stefan.
>
> The following patch based on the work of Peter Chen and Otavio Salvador. It
It was Peter Chan, not Peter Chen.
Regards,
Fabio Estevam
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] mmc: core: Use maximum timeout values in case TACC field is zero
2014-03-27 15:41 ` Fabio Estevam
@ 2014-04-02 8:42 ` Stefan Wahren
0 siblings, 0 replies; 6+ messages in thread
From: Stefan Wahren @ 2014-04-02 8:42 UTC (permalink / raw)
To: Fabio Estevam
Cc: Fabio Estevam, Chris Ball, Otavio Salvador, Sascha Hauer,
linux-mmc@vger.kernel.org
Am 27.03.2014 16:41, schrieb Fabio Estevam:
> On Thu, Mar 27, 2014 at 12:32 PM, Stefan Wahren <stefan.wahren@i2se.com> wrote:
>> When plugging a specific micro SD card at MMC socket of a custom i.MX28 board,
>> we get the following kernel warning:
>>
>> WARNING: CPU: 0 PID: 30 at drivers/mmc/host/mxs-mmc.c:342 mxs_mmc_start_cmd+0x34c/0x378()
>> Modules linked in:
>> CPU: 0 PID: 30 Comm: kworker/u2:1 Not tainted 3.14.0-rc5 #8
>> Workqueue: kmmcd mmc_rescan
>> [<c0015420>] (unwind_backtrace) from [<c0012cb0>] (show_stack+0x10/0x14)
>> [<c0012cb0>] (show_stack) from [<c001daf8>] (warn_slowpath_common+0x6c/0x8c)
>> [<c001daf8>] (warn_slowpath_common) from [<c001db34>] (warn_slowpath_null+0x1c/0x24)
>> [<c001db34>] (warn_slowpath_null) from [<c0349478>] (mxs_mmc_start_cmd+0x34c/0x378)
>> [<c0349478>] (mxs_mmc_start_cmd) from [<c0338fa0>] (mmc_start_request+0xc4/0xf4)
>> [<c0338fa0>] (mmc_start_request) from [<c03390b4>] (mmc_wait_for_req+0x50/0x164)
>> [<c03390b4>] (mmc_wait_for_req) from [<c03405b8>] (mmc_app_send_scr+0x158/0x1c8)
>> [<c03405b8>] (mmc_app_send_scr) from [<c033ee1c>] (mmc_sd_setup_card+0x80/0x3c8)
>> [<c033ee1c>] (mmc_sd_setup_card) from [<c033f788>] (mmc_sd_init_card+0x124/0x66c)
>> [<c033f788>] (mmc_sd_init_card) from [<c033fd7c>] (mmc_attach_sd+0xac/0x174)
>> [<c033fd7c>] (mmc_attach_sd) from [<c033a658>] (mmc_rescan+0x25c/0x2d8)
>> [<c033a658>] (mmc_rescan) from [<c003597c>] (process_one_work+0x1b4/0x4ec)
>> [<c003597c>] (process_one_work) from [<c0035de4>] (worker_thread+0x130/0x464)
>> [<c0035de4>] (worker_thread) from [<c003c824>] (kthread+0xb4/0xd0)
>> [<c003c824>] (kthread) from [<c000f420>] (ret_from_fork+0x14/0x34)
>>
>> The error is due to an invalid value in CSD register of a specific 2GB micro
>> SD card. The CSD version of this card is 1.0 but the TACC field has the invalid
>> value 0. Since the kernel is making use of this TACC field to calculate the
>> SD card timeout, an invalid value 0 leads to a warning at mxs_ns_to_ssp_ticks()
>> and later the following misleading error messages appears in a loop:
>>
>> mxs-mmc 80010000.ssp: card claims to support voltages below defined range
>> mxs-mmc 80010000.ssp: no support for card's volts
>> mmc0: error -22 whilst initialising MMC card
>>
>> This error is only found on this 2GB SD card on mxs platform.
>> On x86 this card works without any problems.
> Thanks for the patch, Stefan.
>
>> The following patch based on the work of Peter Chen and Otavio Salvador. It
> It was Peter Chan, not Peter Chen.
Oops, i will fix that but i don't have his mail address.
Beside that, are there any other opinions about this patch?
>
> Regards,
>
> Fabio Estevam
Best regards,
Stefan Wahren
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] mmc: core: Use maximum timeout values in case TACC field is zero
2014-03-27 15:32 [PATCH] mmc: core: Use maximum timeout values in case TACC field is zero Stefan Wahren
2014-03-27 15:41 ` Fabio Estevam
@ 2014-04-02 11:25 ` Ulf Hansson
2014-04-02 15:36 ` Stefan Wahren
1 sibling, 1 reply; 6+ messages in thread
From: Ulf Hansson @ 2014-04-02 11:25 UTC (permalink / raw)
To: Stefan Wahren
Cc: Fabio Estevam, Chris Ball, otavio, Peter.Chen, Kernel, linux-mmc
On 27 March 2014 16:32, Stefan Wahren <stefan.wahren@i2se.com> wrote:
> When plugging a specific micro SD card at MMC socket of a custom i.MX28 board,
> we get the following kernel warning:
>
> WARNING: CPU: 0 PID: 30 at drivers/mmc/host/mxs-mmc.c:342 mxs_mmc_start_cmd+0x34c/0x378()
> Modules linked in:
> CPU: 0 PID: 30 Comm: kworker/u2:1 Not tainted 3.14.0-rc5 #8
> Workqueue: kmmcd mmc_rescan
> [<c0015420>] (unwind_backtrace) from [<c0012cb0>] (show_stack+0x10/0x14)
> [<c0012cb0>] (show_stack) from [<c001daf8>] (warn_slowpath_common+0x6c/0x8c)
> [<c001daf8>] (warn_slowpath_common) from [<c001db34>] (warn_slowpath_null+0x1c/0x24)
> [<c001db34>] (warn_slowpath_null) from [<c0349478>] (mxs_mmc_start_cmd+0x34c/0x378)
> [<c0349478>] (mxs_mmc_start_cmd) from [<c0338fa0>] (mmc_start_request+0xc4/0xf4)
> [<c0338fa0>] (mmc_start_request) from [<c03390b4>] (mmc_wait_for_req+0x50/0x164)
> [<c03390b4>] (mmc_wait_for_req) from [<c03405b8>] (mmc_app_send_scr+0x158/0x1c8)
> [<c03405b8>] (mmc_app_send_scr) from [<c033ee1c>] (mmc_sd_setup_card+0x80/0x3c8)
> [<c033ee1c>] (mmc_sd_setup_card) from [<c033f788>] (mmc_sd_init_card+0x124/0x66c)
> [<c033f788>] (mmc_sd_init_card) from [<c033fd7c>] (mmc_attach_sd+0xac/0x174)
> [<c033fd7c>] (mmc_attach_sd) from [<c033a658>] (mmc_rescan+0x25c/0x2d8)
> [<c033a658>] (mmc_rescan) from [<c003597c>] (process_one_work+0x1b4/0x4ec)
> [<c003597c>] (process_one_work) from [<c0035de4>] (worker_thread+0x130/0x464)
> [<c0035de4>] (worker_thread) from [<c003c824>] (kthread+0xb4/0xd0)
> [<c003c824>] (kthread) from [<c000f420>] (ret_from_fork+0x14/0x34)
>
> The error is due to an invalid value in CSD register of a specific 2GB micro
> SD card. The CSD version of this card is 1.0 but the TACC field has the invalid
> value 0. Since the kernel is making use of this TACC field to calculate the
> SD card timeout, an invalid value 0 leads to a warning at mxs_ns_to_ssp_ticks()
> and later the following misleading error messages appears in a loop:
>
> mxs-mmc 80010000.ssp: card claims to support voltages below defined range
> mxs-mmc 80010000.ssp: no support for card's volts
> mmc0: error -22 whilst initialising MMC card
>
> This error is only found on this 2GB SD card on mxs platform.
> On x86 this card works without any problems.
>
> The following patch based on the work of Peter Chen and Otavio Salvador. It
> catches the case that the determined timeout is still 0 and set it's to a
> valid value.
>
> Successful tested on a i.MX28 board.
>
> Signed-off-by: Stefan Wahren <stefan.wahren@i2se.com>
> ---
> drivers/mmc/core/core.c | 4 ++++
> 1 file changed, 4 insertions(+)
>
> diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c
> index 098374b..a9cd996 100644
> --- a/drivers/mmc/core/core.c
> +++ b/drivers/mmc/core/core.c
> @@ -815,6 +815,10 @@ void mmc_set_data_timeout(struct mmc_data *data, const struct mmc_card *card)
> data->timeout_ns = limit_us * 1000;
> data->timeout_clks = 0;
> }
> +
> + /* assign limit value if invalid */
> + if (data->timeout_ns == 0)
Shouldn't you be checking the local variable "timeout_us" instead?
Or are you saying that tacc_clks is correct for this SD card but not tacc_ns?
We also have MMC_QUIRK_LONG_READ_TIME. Inventing one for WRITE as well
and then add this card for both quirks is another option to solve the
problem. Not sure which one I prefer yet. :-)
Kind regards
Ulf Hansson
> + data->timeout_ns = limit_us * 1000;
> }
>
> /*
> --
> 1.7.10.4
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] mmc: core: Use maximum timeout values in case TACC field is zero
2014-04-02 11:25 ` Ulf Hansson
@ 2014-04-02 15:36 ` Stefan Wahren
2014-04-03 7:15 ` Ulf Hansson
0 siblings, 1 reply; 6+ messages in thread
From: Stefan Wahren @ 2014-04-02 15:36 UTC (permalink / raw)
To: Ulf Hansson
Cc: Fabio Estevam, Chris Ball, otavio, Peter.Chen, Kernel, linux-mmc
Hi Ulf,
Am 02.04.2014 13:25, schrieb Ulf Hansson:
> On 27 March 2014 16:32, Stefan Wahren <stefan.wahren@i2se.com> wrote:
>> When plugging a specific micro SD card at MMC socket of a custom i.MX28 board,
>> we get the following kernel warning:
>>
>> WARNING: CPU: 0 PID: 30 at drivers/mmc/host/mxs-mmc.c:342 mxs_mmc_start_cmd+0x34c/0x378()
>> Modules linked in:
>> CPU: 0 PID: 30 Comm: kworker/u2:1 Not tainted 3.14.0-rc5 #8
>> Workqueue: kmmcd mmc_rescan
>> [<c0015420>] (unwind_backtrace) from [<c0012cb0>] (show_stack+0x10/0x14)
>> [<c0012cb0>] (show_stack) from [<c001daf8>] (warn_slowpath_common+0x6c/0x8c)
>> [<c001daf8>] (warn_slowpath_common) from [<c001db34>] (warn_slowpath_null+0x1c/0x24)
>> [<c001db34>] (warn_slowpath_null) from [<c0349478>] (mxs_mmc_start_cmd+0x34c/0x378)
>> [<c0349478>] (mxs_mmc_start_cmd) from [<c0338fa0>] (mmc_start_request+0xc4/0xf4)
>> [<c0338fa0>] (mmc_start_request) from [<c03390b4>] (mmc_wait_for_req+0x50/0x164)
>> [<c03390b4>] (mmc_wait_for_req) from [<c03405b8>] (mmc_app_send_scr+0x158/0x1c8)
>> [<c03405b8>] (mmc_app_send_scr) from [<c033ee1c>] (mmc_sd_setup_card+0x80/0x3c8)
>> [<c033ee1c>] (mmc_sd_setup_card) from [<c033f788>] (mmc_sd_init_card+0x124/0x66c)
>> [<c033f788>] (mmc_sd_init_card) from [<c033fd7c>] (mmc_attach_sd+0xac/0x174)
>> [<c033fd7c>] (mmc_attach_sd) from [<c033a658>] (mmc_rescan+0x25c/0x2d8)
>> [<c033a658>] (mmc_rescan) from [<c003597c>] (process_one_work+0x1b4/0x4ec)
>> [<c003597c>] (process_one_work) from [<c0035de4>] (worker_thread+0x130/0x464)
>> [<c0035de4>] (worker_thread) from [<c003c824>] (kthread+0xb4/0xd0)
>> [<c003c824>] (kthread) from [<c000f420>] (ret_from_fork+0x14/0x34)
>>
>> The error is due to an invalid value in CSD register of a specific 2GB micro
>> SD card. The CSD version of this card is 1.0 but the TACC field has the invalid
>> value 0. Since the kernel is making use of this TACC field to calculate the
>> SD card timeout, an invalid value 0 leads to a warning at mxs_ns_to_ssp_ticks()
>> and later the following misleading error messages appears in a loop:
>>
>> mxs-mmc 80010000.ssp: card claims to support voltages below defined range
>> mxs-mmc 80010000.ssp: no support for card's volts
>> mmc0: error -22 whilst initialising MMC card
>>
>> This error is only found on this 2GB SD card on mxs platform.
>> On x86 this card works without any problems.
>>
>> The following patch based on the work of Peter Chen and Otavio Salvador. It
>> catches the case that the determined timeout is still 0 and set it's to a
>> valid value.
>>
>> Successful tested on a i.MX28 board.
>>
>> Signed-off-by: Stefan Wahren <stefan.wahren@i2se.com>
>> ---
>> drivers/mmc/core/core.c | 4 ++++
>> 1 file changed, 4 insertions(+)
>>
>> diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c
>> index 098374b..a9cd996 100644
>> --- a/drivers/mmc/core/core.c
>> +++ b/drivers/mmc/core/core.c
>> @@ -815,6 +815,10 @@ void mmc_set_data_timeout(struct mmc_data *data, const struct mmc_card *card)
>> data->timeout_ns = limit_us * 1000;
>> data->timeout_clks = 0;
>> }
>> +
>> + /* assign limit value if invalid */
>> + if (data->timeout_ns == 0)
> Shouldn't you be checking the local variable "timeout_us" instead?
you're right.
> Or are you saying that tacc_clks is correct for this SD card but not tacc_ns?
No, like many other of the fields they are zero (here is a dump with
this specific sd card):
root@duckbill:/sys/class/block/mmcblk0/device# grep "" * 2>/dev/null
cid:0000005553442020000000000000583f
csd:00000032535a83bfedb7ffbf1680003f
date:08/2005
erase_size:512
fwrev:0x0
hwrev:0x0
manfid:0x000000
name:USD
oemid:0x0000
preferred_erase_size:4194304
scr:0225000000000000
serial:0x00000000
type:SD
uevent:DRIVER=mmcblk
uevent:MMC_TYPE=SD
uevent:MMC_NAME=USD
uevent:MODALIAS=mmc:block
May be this has an influence on your preferred option.
Thanks for your feedback.
Best regards
Stefan Wahren
>
> We also have MMC_QUIRK_LONG_READ_TIME. Inventing one for WRITE as well
> and then add this card for both quirks is another option to solve the
> problem. Not sure which one I prefer yet. :-)
>
> Kind regards
> Ulf Hansson
>
>> + data->timeout_ns = limit_us * 1000;
>> }
>>
>> /*
>> --
>> 1.7.10.4
>>
>> --
>> To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
>> the body of a message to majordomo@vger.kernel.org
>> More majordomo info at http://vger.kernel.org/majordomo-info.html
> --
> To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
--
Software-Entwickler / software developer
I2SE GmbH Tel: +49 (0) 341 355667-00
Friedrich-Ebert-Str. 61 Fax: +49 (0) 341 355667-02
04109 Leipzig
Germany
Web: http://www.i2se.com/ Mail: info@i2se.com
VAT No.: DE 811528334
Amtsgericht Leipzig HRB 23784
Geschäftsführer/CEO: Carsten Ziermann
*** Diese E-Mail ist allein für den bezeichneten Adressaten bestimmt. Sie kann rechtlich vertrauliche Informationen enthalten. Wenn Sie diese E-Mail irrtümlich erhalten haben, informieren Sie bitte unverzüglich den Absender per E-Mail und löschen Sie diese E-Mail von Ihrem Computer, ohne Kopien anzufertigen.
Vielen Dank. ***
*** This email is for the exclusive use of the addressee. It may contain legally privileged information. If you have received this message in error, please notify the sender by email immediately and delete the message from your computer without making any copies.
Thank you. ***
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] mmc: core: Use maximum timeout values in case TACC field is zero
2014-04-02 15:36 ` Stefan Wahren
@ 2014-04-03 7:15 ` Ulf Hansson
0 siblings, 0 replies; 6+ messages in thread
From: Ulf Hansson @ 2014-04-03 7:15 UTC (permalink / raw)
To: Stefan Wahren
Cc: Fabio Estevam, Chris Ball, Otavio Salvador, Peter.Chen, Kernel,
linux-mmc
On 2 April 2014 17:36, Stefan Wahren <stefan.wahren@i2se.com> wrote:
> Hi Ulf,
>
> Am 02.04.2014 13:25, schrieb Ulf Hansson:
>> On 27 March 2014 16:32, Stefan Wahren <stefan.wahren@i2se.com> wrote:
>>> When plugging a specific micro SD card at MMC socket of a custom i.MX28 board,
>>> we get the following kernel warning:
>>>
>>> WARNING: CPU: 0 PID: 30 at drivers/mmc/host/mxs-mmc.c:342 mxs_mmc_start_cmd+0x34c/0x378()
>>> Modules linked in:
>>> CPU: 0 PID: 30 Comm: kworker/u2:1 Not tainted 3.14.0-rc5 #8
>>> Workqueue: kmmcd mmc_rescan
>>> [<c0015420>] (unwind_backtrace) from [<c0012cb0>] (show_stack+0x10/0x14)
>>> [<c0012cb0>] (show_stack) from [<c001daf8>] (warn_slowpath_common+0x6c/0x8c)
>>> [<c001daf8>] (warn_slowpath_common) from [<c001db34>] (warn_slowpath_null+0x1c/0x24)
>>> [<c001db34>] (warn_slowpath_null) from [<c0349478>] (mxs_mmc_start_cmd+0x34c/0x378)
>>> [<c0349478>] (mxs_mmc_start_cmd) from [<c0338fa0>] (mmc_start_request+0xc4/0xf4)
>>> [<c0338fa0>] (mmc_start_request) from [<c03390b4>] (mmc_wait_for_req+0x50/0x164)
>>> [<c03390b4>] (mmc_wait_for_req) from [<c03405b8>] (mmc_app_send_scr+0x158/0x1c8)
>>> [<c03405b8>] (mmc_app_send_scr) from [<c033ee1c>] (mmc_sd_setup_card+0x80/0x3c8)
>>> [<c033ee1c>] (mmc_sd_setup_card) from [<c033f788>] (mmc_sd_init_card+0x124/0x66c)
>>> [<c033f788>] (mmc_sd_init_card) from [<c033fd7c>] (mmc_attach_sd+0xac/0x174)
>>> [<c033fd7c>] (mmc_attach_sd) from [<c033a658>] (mmc_rescan+0x25c/0x2d8)
>>> [<c033a658>] (mmc_rescan) from [<c003597c>] (process_one_work+0x1b4/0x4ec)
>>> [<c003597c>] (process_one_work) from [<c0035de4>] (worker_thread+0x130/0x464)
>>> [<c0035de4>] (worker_thread) from [<c003c824>] (kthread+0xb4/0xd0)
>>> [<c003c824>] (kthread) from [<c000f420>] (ret_from_fork+0x14/0x34)
>>>
>>> The error is due to an invalid value in CSD register of a specific 2GB micro
>>> SD card. The CSD version of this card is 1.0 but the TACC field has the invalid
>>> value 0. Since the kernel is making use of this TACC field to calculate the
>>> SD card timeout, an invalid value 0 leads to a warning at mxs_ns_to_ssp_ticks()
>>> and later the following misleading error messages appears in a loop:
>>>
>>> mxs-mmc 80010000.ssp: card claims to support voltages below defined range
>>> mxs-mmc 80010000.ssp: no support for card's volts
>>> mmc0: error -22 whilst initialising MMC card
>>>
>>> This error is only found on this 2GB SD card on mxs platform.
>>> On x86 this card works without any problems.
>>>
>>> The following patch based on the work of Peter Chen and Otavio Salvador. It
>>> catches the case that the determined timeout is still 0 and set it's to a
>>> valid value.
>>>
>>> Successful tested on a i.MX28 board.
>>>
>>> Signed-off-by: Stefan Wahren <stefan.wahren@i2se.com>
>>> ---
>>> drivers/mmc/core/core.c | 4 ++++
>>> 1 file changed, 4 insertions(+)
>>>
>>> diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c
>>> index 098374b..a9cd996 100644
>>> --- a/drivers/mmc/core/core.c
>>> +++ b/drivers/mmc/core/core.c
>>> @@ -815,6 +815,10 @@ void mmc_set_data_timeout(struct mmc_data *data, const struct mmc_card *card)
>>> data->timeout_ns = limit_us * 1000;
>>> data->timeout_clks = 0;
>>> }
>>> +
>>> + /* assign limit value if invalid */
>>> + if (data->timeout_ns == 0)
>> Shouldn't you be checking the local variable "timeout_us" instead?
>
> you're right.
>
>> Or are you saying that tacc_clks is correct for this SD card but not tacc_ns?
>
> No, like many other of the fields they are zero (here is a dump with
> this specific sd card):
>
> root@duckbill:/sys/class/block/mmcblk0/device# grep "" * 2>/dev/null
> cid:0000005553442020000000000000583f
> csd:00000032535a83bfedb7ffbf1680003f
> date:08/2005
> erase_size:512
> fwrev:0x0
> hwrev:0x0
> manfid:0x000000
> name:USD
> oemid:0x0000
> preferred_erase_size:4194304
> scr:0225000000000000
> serial:0x00000000
> type:SD
> uevent:DRIVER=mmcblk
> uevent:MMC_TYPE=SD
> uevent:MMC_NAME=USD
> uevent:MODALIAS=mmc:block
>
> May be this has an influence on your preferred option.
Hi Stefan,
Since we can check the local variable "timeout_us" instead, I am happy
to keep it as you have proposed in this patch. That should thus fix
problems for all broken SD cards.
Kind regards
Ulf Hansson
>
> Thanks for your feedback.
>
> Best regards
> Stefan Wahren
>
>>
>> We also have MMC_QUIRK_LONG_READ_TIME. Inventing one for WRITE as well
>> and then add this card for both quirks is another option to solve the
>> problem. Not sure which one I prefer yet. :-)
>>
>> Kind regards
>> Ulf Hansson
>>
>>> + data->timeout_ns = limit_us * 1000;
>>> }
>>>
>>> /*
>>> --
>>> 1.7.10.4
>>>
>>> --
>>> To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
>>> the body of a message to majordomo@vger.kernel.org
>>> More majordomo info at http://vger.kernel.org/majordomo-info.html
>> --
>> To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
>> the body of a message to majordomo@vger.kernel.org
>> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
>
> --
> Software-Entwickler / software developer
>
> I2SE GmbH Tel: +49 (0) 341 355667-00
> Friedrich-Ebert-Str. 61 Fax: +49 (0) 341 355667-02
> 04109 Leipzig
> Germany
> Web: http://www.i2se.com/ Mail: info@i2se.com
> VAT No.: DE 811528334
> Amtsgericht Leipzig HRB 23784
> Geschäftsführer/CEO: Carsten Ziermann
>
> *** Diese E-Mail ist allein für den bezeichneten Adressaten bestimmt. Sie kann rechtlich vertrauliche Informationen enthalten. Wenn Sie diese E-Mail irrtümlich erhalten haben, informieren Sie bitte unverzüglich den Absender per E-Mail und löschen Sie diese E-Mail von Ihrem Computer, ohne Kopien anzufertigen.
> Vielen Dank. ***
>
> *** This email is for the exclusive use of the addressee. It may contain legally privileged information. If you have received this message in error, please notify the sender by email immediately and delete the message from your computer without making any copies.
> Thank you. ***
>
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2014-04-03 7:15 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-03-27 15:32 [PATCH] mmc: core: Use maximum timeout values in case TACC field is zero Stefan Wahren
2014-03-27 15:41 ` Fabio Estevam
2014-04-02 8:42 ` Stefan Wahren
2014-04-02 11:25 ` Ulf Hansson
2014-04-02 15:36 ` Stefan Wahren
2014-04-03 7:15 ` Ulf Hansson
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.