diff mbox

mmc: core: Use maximum timeout values in case TACC field is zero

Message ID 1395934368-29207-1-git-send-email-stefan.wahren@i2se.com (mailing list archive)
State New, archived
Headers show

Commit Message

Stefan Wahren March 27, 2014, 3:32 p.m. UTC
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(+)

Comments

Fabio Estevam March 27, 2014, 3:41 p.m. UTC | #1
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
--
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
Stefan Wahren April 2, 2014, 8:42 a.m. UTC | #2
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
--
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
Ulf Hansson April 2, 2014, 11:25 a.m. UTC | #3
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
--
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
Stefan Wahren April 2, 2014, 3:36 p.m. UTC | #4
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
Ulf Hansson April 3, 2014, 7:15 a.m. UTC | #5
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. ***
>
--
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
diff mbox

Patch

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;
 	}
 
 	/*