On 2 April 2014 17:36, Stefan Wahren <stefan.wahren@xxxxxxxx> wrote: > Hi Ulf, > > Am 02.04.2014 13:25, schrieb Ulf Hansson: >> On 27 March 2014 16:32, Stefan Wahren <stefan.wahren@xxxxxxxx> 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@xxxxxxxx> >>> --- >>> 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@xxxxxxxxxxxxxxx >>> 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@xxxxxxxxxxxxxxx >> 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@xxxxxxxx > 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@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html