Sdio card sleep processing sdio card removed solution, sdioremoved

Source: Internet
Author: User

Sdio card sleep processing sdio card removed solution, sdioremoved
Sdio card removed will appear when debugging several sdio card suspend recently.
Either the device crashes or the module does not work properly. The root cause is that sleep is not properly handled.
Yesterday, I finally found a solution on the Broadcom Nic.
1: nonremovable needs to be set on the host, and the software setting: mmc-> caps | =
MMC_CAP_NONREMOVABLE;
2: keep power needs to be set on the host, and the software is set when sdio card suspend is used.
Set: host-> pm_flags | = MMC_PM_KEEP_POWER;

At present, the 4G network card, Broadcom network card, and sdio encrypted tcard that I have come into contact with will display card
Removed problem.

In Supplement 2, host keep power must be set in sdio card pm:


         static int XXX_suspend(struct device *pdev){     struct sdio_func *func = dev_to_sdio_func(pdev);     /* keep power while host suspended */     ret = sdio_set_host_pm_flags(func, MMC_PM_KEEP_POWER);     if (ret) {         sd_err(("%s: error while trying to keep power\n", __FUNCTION__));         return ret;     }     return 0;}static const struct dev_pm_ops XXX_pm_ops = {     .suspend    = XXX_suspend,     .resume        = XXX_resume,};


It took some time today to figure out the reason for card removed.

The error 1 occurs because pm_notify calls msm_rescan during resume.
If nonremovable is set, the system will run into detect, and the system will detect the card removed,
Then, the removal operation is performed.

Void mmc_rescan (struct work_struct * work) {struct mmc_host * host = container_of (work, struct mmc_host, detect. work); bool extend_wakelock = false; if (host-> rescan_disable) return; mmc_bus_get (host);/** if there is a _ removable _ card registered, check whether it is * still present */if (host-> bus_ops & host-> bus_ops-> detect &&! Host-> bus_dead &&! (Host-> caps & MMC_CAP_NONREMOVABLE) host-> bus_ops-> detect (host); ---------} The following is the call information printed by dump_stack: <4> [48.709320] [<c0013d4c>] (unwind_backtrace + 0x0/0x11c) from [<bf011d74>] (dhdsdio_disconnect + 0xc/0x10c [bcmdhd]) <4> [48.720214] [<bf011d74>] (dhdsdio_disconnect + 0xc/0x10c [bcmdhd]) from [<bf01f9a8>] (bcmsdh_remove + 0x1c/0x98 [bcmdhd]) <4> [1, 48.730041] [<bf01f9a8>] (bcmsdh_remove + 0x1c/0x98 [bcmdhd]) from [<bf001a00>] (bcmsdh_sdmmc_remove + 0x28/0x70 [bcmdhd]) <4> [48.740600] [<bf001a00>] (bcmsdh_sdmmc_remove + 0x28/0x70 [bcmdhd]) from [<c05855e0>] (sdio_bus_remove + 0x38/0 xf0) <4> [48.753021] [<c05855e0>] (sdio_bus_remove + 0x38/0 xf0) from [<c03a26c8>] (_ device_release_driver + 0x9c/0xe0) <4> [48.762725] [<c03a26c8>] (_ device_release_driver + 0x9c/0xe0) from [<c03a2728>] (device_release_driver + 0x1c/0x28) <4> [48.771881] [<c03a2728>] (device_release_driver + 0x1c/0x28) from [<c03a21f8>] (bus_remove_device + 0x124/0x140) <4> [48.781829] [<c03a21f8>] (bus_remove_device + 0x124/0x140) from [<c039fe30>] (device_del + 0x108/0 x16c) <4> [48.790802] [<c039fe30>] (device_del + 0x108/0 x16c) from [<c058596c>] (sdio_remove_func + 0x1c/0x28) <4> [1, 48.799560] [<c058596c>] (sdio_remove_func + 0x1c/0x28) from [<c0584bfc>] (mmc_sdio_remove + 0x3c/0x68) <4> [1, 48.808593] [<c0584bfc>] (mmc_sdio_remove + 0x3c/0x68) from [<c0584cb4>] (mmc_sdio_detect + 0x8c/0xb4) <4> [1, 48.817565] [<c0584cb4>] (mmc_sdio_detect + 0x8c/0xb4) from [<c057e0c8>] (mmc_rescan + 0x7c/0x2d8) <4> [48.826141] [<c057e0c8>] (mmc_rescan + 0x7c/0x2d8) from [<c0099dd8>] (process_one_work + 0x27c/0x484) <4> [48.834991] [<c0099dd8>] (process_one_work + 0x27c/0x484) from [<c009a1f0>] (worker_thread + 0x210/0 x3b0) <4> [48.844177] [<c009a1f0>] (worker_thread + 0x210/0 x3b0) from [<c009e08c>] (kthread + 0x80/0 x8c) <4> [48.852355] [<c009e08c>] (kthread + 0x80/0 x8c) from [<c000eaa8>] (kernel_thread_exit + 0x0/0x8) <6> [49.083587] mmc2: card 0001 removed


The cause of the 2 error is that when sdio resume is not set
After running sdio reset and go idle (CMD 0), the first CMD that enters init_card will not respond, that is
After these two operations, the card is abnormal.

Static int mmc_sdio_resume (struct mmc_host * host) {int I, err = 0; BUG_ON (! Host); BUG_ON (! Host-> card);/* Basic card reinitialization. */mmc_claim_host (host);/* No need to reinitialize powered-resumed nonremovable cards */if (mmc_card_is_removable (host) |! Mmc_card_keep_power (host) {sdio_reset (host); mmc_go_idle (host); err = forward (host, host-> ocr, host-> card, mmc_card_keep_power (host )); ---------} The following figure shows the dump_stack () printing information: <4> [55.269378] [<c0013d4c>] (unwind_backtrace + 0x0/0x11c) from [<c057d650>] (mmc_resume_host + 0xec/0x15c) <4> [55.269439] [<c057d650>] (mmc_resume_host + 0xec/0x15c) from [<c058bfdc>] (msmsdcc_runtime_resume + 0xb8/0x17c) <4> [5 5.269500] [<c058bfdc>] (msmsdcc_runtime_resume + 0xb8/0x17c) from [<c058c2ac>] (msmsdcc_pm_resume + 0x44/0 xa8) <4> [55.269561] [<c058c2ac>] (msmsdcc_pm_resume + 0x44/0 xa8) from [<c03a4074>] (platform_pm_resume + 0x40/0x54) <4> [55.269653] [<c03a4074>] (platform_pm_resume + 0x40/0x54) from [<c03a8160>] (dpm_run_callback + 0x44/0 x7c) <4> [55.269683] [<c03a8160>] (dpm_run_callback + 0x44/0 x7c) from [<c03a8c6>] (devi Ce_resume + 0x140/0x184) <4> [55.269744] [<c03a8c6>] (device_resume + 0x140/0x184) from [<c03a94ec>] (dpm_resume + 0xfc/0x234) <4> [55.269805] [<c03a94ec>] (dpm_resume + 0xfc/0x234) from [<c03a97f0>] (dpm_resume_end + 0xc/0x18) <4> [55.269866] [<c03a97f0>] (dpm_resume_end + 0xc/0x18) from [<c00b63bc>] (suspend_devices_and_enter + 0x240/0x314) <4> [55.269927] [<c00b63bc>] (suspend_devices_and_enter + 0x240/0x314) fro M [<c00b65b0>] (pm_suspend + 0x120/0x200) <4> [55.269958] [<c00b65b0>] (pm_suspend + 0x120/0x200) from [<c00b7508>] (suspend + 0x68/0x180) <4> [55.270019] [<c00b7508>] (suspend + 0x68/0x180) from [<c0099dd8>] (process_one_work + 0x27c/0x484) <4> [55.270080] [<c0099dd8>] (process_one_work + 0x27c/0x484) from [<c009a1f0>] (worker_thread + 0x210/0 x3b0) <4> [55.270141] [<c009a1f0>] (worker_thread + 0x210/0 x3b0) from [<c0 09e08c>] (kthread + 0x80/0 x8c) <4> [55.270202] [<c009e08c>] (kthread + 0x80/0 x8c) from [<c000eaa8>] (kernel_thread_exit + 0x0/0x8) <4> [55.270233] mmc2: error-110 during resume (card was removed ?)





Help: For SDIO Card 10/SD Memory Card 20/High Speed MMC 42 standard rate problems

The time pulse rate is the transmission speed equivalent to the frequency per second.
The transmission speed of each second is different, so the time pulse rate is such a interval
The speed statement is OK later.
The so-called speed is generally the maximum value that can be reached, and the actual stable speed may be slightly lower

What is SDIO wlanka? Main purpose?

The wireless network card belongs to the SDIO slot, that is, only devices that support the SDIO slot can use it. The SDIO interface is the SD card interface, but not the SD card reader supports SDIO. the readers of Microsoft PPC handheld computers generally support SDIO. Because the current USB interface is widely used, SDIO has few devices and interfaces.

Related Article

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.