09 Jun, 2017

8 commits

  • commit 3f0191b80cf1 ("MLK-14381 mmc: sdhci-esdhc-imx: reset tuning
    circuit when system resume") add tuning reset when the timing is
    MMC_TIMING_LEGACY/MMC_TIMING_MMC_HS/MMC_TIMING_SD_HS. For timing
    MMC_TIMING_MMC_HS, we can not do tuning reset, otherwise HS400
    timing is not right.

    Here is the process of config HS400, it do tuning in HS200 mode,
    then switch to HS mode and 8 bit DDR mode, finally switch to HS400
    mode. If we do tuning reset in HS mode, this will cause HS400 mode
    lost the tuning setting, which will cause CRC error.

    Signed-off-by: Haibo Chen
    (cherry picked from commit 25e7080552a8d681a83e6c328ef5dedf5132afbf)

    Haibo Chen
     
  • Some i.MX SoCs don't define ARCH_MXC, so add COMPILE_TEST to let usdhc driver
    also support for these i.MX SoCs.

    Signed-off-by: Haibo Chen

    Haibo Chen
     
  • commit 70f2d20917bc ("MLK-14884 mmc: sdhci: make DDR50 tuning optionally")
    want to make DDR50 card tuning optionally, but the code logic is not
    right, the tuning of DDR50 card will also be impacted by the flag
    'SDHCI_SDR50_NEEDS_TUNING'. e.g. imx6sl/imx6sx/imx6ul/imx7d default set
    USE_TUNING_SDR50, which means on these SoC, DDR50 card still do tuning
    even haven't the flag 'SDHCI_DDR50_NEEDS_TUNING'.

    This patch fix the logic issue, separate DDR50 and SDR50 card.

    Signed-off-by: Haibo Chen

    Haibo Chen
     
  • After commit 3e3274ab9ff3 ("mmc: sdhci-esdhc-imx: Use common
    sdhci_suspend|resume_host()"), we lost the pins state store and save
    in common sdhci_pltfm_{suspend|resume} API which results in the
    pins state lost in state un-retainable suspend/resume, then
    CMD transfer will meet timeout subsequently.

    Due to sdhci_pltfm_{suspend|resume} API becomes static after
    that commit later, we then do manual pins state save and restore
    in our platform suspend/resume API instead.

    Signed-off-by: Dong Aisheng

    Dong Aisheng
     
  • DDR50 tuning is optinally defined in sd 3.0 spec. Per IC guys
    suggestion, it internally already uses a fixed optimized timing
    and normally does not require tuning.

    Make it optionally and platform can claim SDHCI_DDR50_NEEDS_TUNING
    support if it wants tuning.

    Signed-off-by: Dong Aisheng

    Dong Aisheng
     
  • MMC core code add 'MMC_CAP_RUNTIME_RESUME', postpone the real card
    resume operation from bus_resume to bus_runtime_resume. So after
    system resume, for non-removable-card, it still not really resume.
    At this point, if user cat the ios or clock node, only get zero
    data although the mmc/sd card is still present.

    This patch add mmc_get_card() to make sure card really resume back
    when user cat ios or clock debugfs file node, then user can get the
    correct information.

    Signed-off-by: Haibo Chen

    Haibo Chen
     
  • USDHC tuning circuit should be reset before every time card enumeration
    or re-enumeration.

    On imx7ulp-evk board, for SDR104 card, when system suspend in standby
    mode, and then resume back, the IO timing is still SDR104 which may
    result in card re-enumeration fail in low speed mode (400khz) for some
    cards. And we did meet the issue that in certain probability, SDR104
    card meet mmc command CRC/Timeout error when send CMD2 during mmc bus
    resume.

    This patch reset the tuning circuit when the ios timing is
    MMC_TIMING_LEGACY/MMC_TIMING_MMC_HS/MMC_TIMING_SD_HS, which means both
    mmc_power_up() and mmc_power_off() will reset the tuning circuit.

    This patch can cover the 'commit 374da688c65a ("MLK-12345 mmc:
    sdhci-esdhc-imx: reset tuning circurt when insert sd card")', and is a
    better solution. So use this patch instead.

    Signed-off-by: Haibo Chen
    (cherry picked from commit 84a6b78bc4e2ccd433b25a4261194b93e6f83323)

    Conflicts:
    drivers/mmc/host/sdhci-esdhc-imx.c

    Haibo Chen
     
  • MMC SDHCI maintainer Adrian Hunter Introduce SDHCI flags for signal
    voltage support and set them based on the supported transfer modes,
    except in the case where 3V DDR52 is supported but 1.8V is not.

    This patch add the support to make eMMC DDR52 only work at 3.3v when
    property 'no-1-8-v' defined.

    Signed-off-by: Haibo Chen

    Haibo Chen
     

08 Jun, 2017

9 commits


23 Feb, 2017

23 commits

  • This patch add function sdio_reset_comm() to support bcmdhd wifi
    dirver build-in type.

    Signed-off-by: Haibo Chen

    Haibo Chen
     
  • When CONFIG_MMC=m, compile error shows up

    ERROR: "of_alias_max_index" [drivers/mmc/core/mmc_core.ko] undefined!
    ERROR: "mmc_get_reserved_index" [drivers/mmc/card/mmc_block.ko] undefined!
    ERROR: "mmc_first_nonreserved_index" [drivers/mmc/card/mmc_block.ko] undefined!
    make[1]: *** [__modpost] Error 1
    make: *** [modules] Error 2
    make: *** Waiting for unfinished jobs....

    This patch export the upper three symbol for module runtime load.

    Signed-off-by: Haibo Chen
    (cherry picked from commit 3b2520f17d427b8fa8db37a6d9a4311f20c29036)

    Haibo Chen
     
  • Do sanity check before calling mmc_force_remove.
    BCM WiFi driver will call wifi_card_detect(false) if probe fails
    due to no card exists on board.

    This is needed for Android BSP since Android has builtin WiFi drver
    and some boards may not have WiFi cards pluged.
    Then the kernel dump likes follows may appear.
    ----------------------------------------------
    dhd_module_init in
    Power-up adapter 'DHD generic adapter'
    wifi_platform_bus_enumerate device present 1
    mmc1: mmc_rescan_try_freq: trying to init card at 400000 Hz
    mmc1: mmc_rescan_try_freq: trying to init card at 300000 Hz
    mmc1: mmc_rescan_try_freq: trying to init card at 200000 Hz
    mmc1: mmc_rescan_try_freq: trying to init card at 100000 Hz
    failed to power up DHD generic adapter, 3 retry left
    wifi_platform_bus_enumerate device present 0
    ------------[ cut here ]------------
    Kernel BUG at 8051247c [verbose debug info unavailable]
    Internal error: Oops - BUG: 0 [#1] PREEMPT SMP ARM
    Modules linked in: bcmdhd(+) ov5642_camera ov5640_camera_mipi_int ov5640_camera_int mxc_v4l2_capture ipu_bg_overlay_sdc ipu_still v4l2_int_device mxc_dcic ipu_prp_enc ipu_csi_enc ipu_fg_overlay_sdc evbug
    CPU: 3 PID: 1071 Comm: modprobe Not tainted 4.1.15-01591-g1393481 #1504
    Hardware name: Freescale i.MX6 Quad/DualLite (Device Tree)
    task: a99be880 ti: a8dd8000 task.ti: a8dd8000
    PC is at mmc_sdio_remove+0x70/0x74
    LR is at mmc_sdio_force_remove+0xc/0x34
    pc : [] lr : [] psr: 60070013
    sp : a8dd9d00 ip : 00000000 fp : 00000000
    r10: 7f100c98 r9 : 00000000 r8 : 7f0fc410
    r7 : a8dd9d48 r6 : a83b1800 r5 : 00000000 r4 : a83b1800
    r3 : 00000000 r2 : 00000000 r1 : 809b50c8 r0 : 00000000
    Flags: nZCv IRQs on FIQs on Mode SVC_32 ISA ARM Segment user
    Control: 10c53c7d Table: 38cdc04a DAC: 00000015
    Process modprobe (pid: 1071, stack limit = 0xa8dd8210)
    Stack: (0xa8dd9d00 to 0xa8dda000)
    9d00: 00000000 a83b1800 00000000 00000000 a8dd9d48 8051248c 00000000 7f0ca6cc
    9d20: a99be880 a90e6280 00000003 7f0ca920 fffffdfb a81af810 80bb570c 00000000
    9d40: 00020002 00000000 a8dd9d48 a8dd9d48 00000000 7f100c98 7f100c98 a90e6280
    9d60: fffffdfb 00000008 00000000 7f0fe490 56f19f1c 7f0cabe4 80bb6d74 a81af810
    9d80: 7f0fe248 8037f864 8037f820 80bb6d74 a81af810 00000000 7f0fe248 8037e118
    9da0: a81af810 7f0fe248 a81af844 80b1e8b0 00000000 8037e328 00000000 7f0fe248
    9dc0: 8037e29c 8037c660 a8025c5c a8187a34 7f0fe248 a9547780 00000000 8037d8b4
    9de0: 7f0f5028 7f0fe248 00000000 7f0fe248 00000000 a90e6280 80ba78f4 8037e92c
    9e00: 00000000 7f100c98 00000000 7f0cb02c 00000000 80af7720 80af7720 a90e6280
    9e20: 7f124000 00000000 00000001 80009730 00000000 8040003b abc7db80 800e1c68
    9e40: 00000000 a935c340 8040003a abc83180 ab757000 80af257c 00000001 8040003a
    9e60: 00000001 00000001 a8dd9e7c 80af2260 a8001f00 80af46c0 56f19f1c 800e32a0
    9e80: 7f0fe448 a90e6108 a90e6240 7f0fe448 a90e6100 7f0fe490 56f19f1c 8078b2b0
    9ea0: 7f0fe448 a90e6100 a8dd9f58 a90e6108 00000001 80092dd8 7f0fe454 00007fff
    9ec0: 800902a8 a8928900 7f0fe490 00000000 7f0fe590 000015fa c1754bfc 7f0fe590
    9ee0: c16d8000 000c823c 05de516a 00000000 0000000e 00000000 00000000 00000000
    9f00: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
    9f20: 00000000 00000000 00000000 00000000 00000648 00000000 00000003 01111348
    9f40: 0000017b 8000f644 a8dd8000 00000000 00000073 8009352c c16d8000 000c823c
    9f60: c175456c c17543a5 c17957ec 0007ad30 0008f7c0 00000000 00000000 00000000
    9f80: 0000002a 0000002b 0000001f 00000023 00000014 00000000 01111348 00000000
    9fa0: 00000000 8000f4c0 01111348 00000000 00000003 01111348 00000000 00040000
    9fc0: 01111348 00000000 00000000 0000017b 00000000 01111218 00000073 00000073
    9fe0: 7ec5d950 7ec5d940 0001f0dc 76ecf610 600d0010 00000003 00000000 00000000
    [] (mmc_sdio_remove) from [] (mmc_sdio_force_remove+0xc/0x34)
    [] (mmc_sdio_force_remove) from [] (wifi_platform_bus_enumerate+0x54/0x90 [bcmdhd])
    [] (wifi_platform_bus_enumerate [bcmdhd]) from [] (dhd_wifi_platform_load+0x17c/0x39c [bcmdhd])
    [] (dhd_wifi_platform_load [bcmdhd]) from [] (wifi_plat_dev_drv_probe+0xa4/0x124 [bcmdhd])
    [] (wifi_plat_dev_drv_probe [bcmdhd]) from [] (platform_drv_probe+0x44/0xa4)
    [] (platform_drv_probe) from [] (driver_probe_device+0x174/0x2b4)
    [] (driver_probe_device) from [] (__driver_attach+0x8c/0x90)
    [] (__driver_attach) from [] (bus_for_each_dev+0x6c/0xa0)
    [] (bus_for_each_dev) from [] (bus_add_driver+0x148/0x1f0)
    [] (bus_add_driver) from [] (driver_register+0x78/0xf8)
    [] (driver_register) from [] (dhd_wifi_platform_register_drv+0x1cc/0x20c [bcmdhd])
    [] (dhd_wifi_platform_register_drv [bcmdhd]) from [] (do_one_initcall+0x8c/0x1d4)
    [] (do_one_initcall) from [] (do_init_module+0x5c/0x1a8)
    [] (do_init_module) from [] (load_module+0x177c/0x1d4c)
    [] (load_module) from [] (SyS_finit_module+0x64/0x74)
    [] (SyS_finit_module) from [] (ret_fast_syscall+0x0/0x3c)
    Code: e3a03000 e58631f8 e5863228 e8bd80f8 (e7f001f2)
    ---[ end trace 6f28ec270544e09e ]---
    Segmentation fault
    root@imx6qdlsolo:~#

    Signed-off-by: Dong Aisheng

    Dong Aisheng
     
  • This reverts commit 829b6962f7e3cfc06f7c5c26269fd47ad48cf503.

    Revert this change as it causes a sysfs path to change and therefore
    introduces and ABI regression. More precisely Android's vold is not being
    able to access /sys/module/mmcblk/parameters/perdev_minors any more, since
    the path becomes changed to: "/sys/module/mmc_block/..."

    Fixes: 829b6962f7e3 ("mmc: block: don't use parameter prefix if built as
    module")
    Reported-by: John Stultz
    Cc: Andy Shevchenko
    Signed-off-by: Ulf Hansson

    (cherry picked from commit a5ebb87db84392edfd3142c3a6a78431d820a789)

    Ulf Hansson
     
  • With igore pm notify feature, MMC core will not re-detect card
    after system suspend/resume. This is needed for some special cards
    like Broadcom WiFi which can't work propertly on card re-detect
    after system resume.

    Signed-off-by: Dong Aisheng
    (cherry picked from commit 3a4a074d2ead8044afe42cd0d060fe25564b274c)

    Dong Aisheng
     
  • Change SLV_DLY_TARGET to IC recommended value 0x7(4/1 cycle)
    according to spec.
    The old value 0x1 is not robust and may fail in some critical
    circumstance.

    Signed-off-by: Dong Aisheng

    Dong Aisheng
     
  • Current driver do not clear the tuning related register setting,
    this will impact the timing and let the card inserted later meet
    CRC error.

    Take the DDR50 card as example, if plug out an SDR104 card and
    then plug in this DDR50 card, we will meet the following error log:

    mmc2: new ultra high speed DDR50 SDHC card at address aaaa
    mmcblk2: mmc2:aaaa SE08G 7.40 GiB
    mmcblk2: error -84 transferring data, sector 0, nr 8, cmd response 0x900, card status 0xb00
    mmc2: tried to reset card
    mmcblk2: p1 p2

    Logictally, we should reset the tuning circurt everytime when we
    plug in a sd card.

    Signed-off-by: Haibo Chen

    Haibo Chen
     
  • Currently sdhci driver free irq in host suspend, and call
    request_threaded_irq() in host resume. But during host resume,
    Ctrl+C can impact sdhci host resume, see the error log:

    CPU1 is up
    PM: noirq resume of devices complete after 0.637 msecs imx-sdma 30bd0000.sdma: loaded firmware 4.1
    PM: early resume of devices complete after 0.774 msecs
    dpm_run_callback(): platform_pm_resume+0x0/0x44 returns -4
    PM: Device 30b40000.usdhc failed to resume: error -4
    dpm_run_callback(): platform_pm_resume+0x0/0x44 returns -4
    PM: Device 30b50000.usdhc failed to resume: error -4
    dpm_run_callback(): platform_pm_resume+0x0/0x44 returns -4
    PM: Device 30b60000.usdhc failed to resume: error -4 fec 30be0000.ethernet eth0: Link is Up - 100Mbps/Full - flow control rx/tx
    mmc0: Timeout waiting for hardware interrupt.
    mmc0: Timeout waiting for hardware interrupt.
    mmc0: Timeout waiting for hardware interrupt.
    mmc0: Timeout waiting for hardware interrupt.
    mmc0: Timeout waiting for hardware interrupt.
    mmc0: Timeout waiting for hardware interrupt.
    mmc0: error -110 during resume (card was removed?)
    mmc2: Timeout waiting for hardware interrupt.
    mmc2: Timeout waiting for hardware interrupt.
    mmc2: error -110 during resume (card was removed?)

    In request_threaded_irq-> __setup_irq-> kthread_create
    ->kthread_create_on_node, the comment shows that SIGKILLed will
    impact the kthread create, and return -EINTR.

    This patch replace them with disable|enable_irq(), that will prevent
    IRQs from being propagated to the sdhci driver.

    Signed-off-by: Haibo Chen

    Haibo Chen
     
  • We see CRCs with SLV_DLY_TARGET of 7 during driver runtime suspend/resume
    if disable sw auto retuning. Back to SLV_DLY_TARGET of 1 which is used
    in 3.14 kernel and don't have such issue.

    Signed-off-by: Dong Aisheng

    Dong Aisheng
     
  • When enable WIFi and connected with AP, the system is unable to suspend.
    root@imx6qdlsolo:~# echo standby > /sys/power/state
    PM: Syncing filesystems ... done.
    Freezing user space processes ... (elapsed 0.001 seconds) done.
    Freezing remaining freezable tasks ... (elapsed 0.001 seconds) done.
    dhdsdio_isr: Enter
    dhdsdio_isr: Enter
    dhdsdio_isr: disable SDIO interrupts
    Calling dhdsdio_dpc() from dhdsdio_isr
    dhdsdio_dpc: Enter
    dhdsdio_bussleep: request WAKE (currently SLEEP)

    (Keypress still response here.... )

    It's caused by Broadcom WiFi driver will keep handling SDIO irq even after
    the driver is already suspended.
    This weird behavior will block the MMC host suspend during its irq
    synchronize operation in free_irq(), then the system suspend is blocked
    too and hanged.

    Add SDHCI_QUIRK2_SDIO_IRQ_THREAD for BCM WiFi to use kernel thread
    to process sdio interrupts which won't block system suspend and process
    freeze operation.

    Signed-off-by: Dong Aisheng

    Dong Aisheng
     
  • Some special SDIO devices like Broadcom WiFi driver will keep handling
    SDIO irq even after the driver is already suspended.
    This weird behavior will block the MMC host suspend during its irq
    synchronize operation in free_irq(), then the system suspend is blocked
    too and hanged.

    We add back sdio thread irq support for such WiFi driver to handle
    SDIO irqs since the sdio thread is kernel thread which does not
    block the process freeze operation during suspend.

    Signed-off-by: Dong Aisheng

    Dong Aisheng
     
  • bcmdhd can't support removing host during suspend and
    driver crash when detect card after resume due to no response
    to CMD7.
    It looks bcmdhd has a special requirement to enumerate card
    by itself which is incompatible with current MMC core.
    So implement post-cd feature to allow driver to detect card
    as it wants, then we add back non-removable capability
    to avoid MMC core to redetect card after resume.

    root@imx6qdlsolo:~# echo standby > /sys/power/state
    PM: Syncing filesystems ... done.
    PM: Preparing system for standby sleep
    Freezing user space processes ... (elapsed 0.001 seconds) done.
    Freezing remaining freezable tasks ... (elapsed 0.001 seconds) done.
    PM: Entering standby sleep
    evbug: Event. Dev: input3, Type: 0, Code: 0, Value: 1
    evbug: Event. Dev: input2, Type: 0, Code: 0, Value: 1
    PM: suspend of devices complete after 652.363 msecs
    PM: suspend devices took 0.660 seconds
    PM: late suspend of devices complete after 1.148 msecs
    PM: noirq suspend of devices complete after 1.043 msecs
    Disabling non-boot CPUs ...
    CPU1: shutdown
    Enabling non-boot CPUs ...
    CPU1 is up
    PM: noirq resume of devices complete after 0.534 msecs
    PM: early resume of devices complete after 0.553 msecs
    evbug: Event. Dev: input2, Type: 1, Code: 116, Value: 1
    evbug: Event. Dev: input2, Type: 0, Code: 0, Value: 0
    evbug: Event. Dev: input2, Type: 1, Code: 116, Value: 0
    evbug: Event. Dev: input2, Type: 0, Code: 0, Value: 0
    mmc1: error -110 during resume (card was removed?)
    PM: resume of devices complete after 605.525 msecs
    PM: resume devices took 0.610 seconds
    PM: Finishing wakeup.
    Restarting tasks ... done.
    WARNING: driver bcmsdh_sdmmc did not remove its interrupt handler!
    root@imx6qdlsolo:~# Unable to handle kernel NULL pointer dereference at virtual address 0000022c
    pgd = 80004000
    [0000022c] *pgd=00000000
    Internal error: Oops: 17 [#1] PREEMPT SMP ARM
    Modules linked in: bcmdhd evbug ov5647_camera_mipi mxc_mipi_csi mx6s_capture
    CPU: 1 PID: 780 Comm: kworker/u4:4 Not tainted 4.1.15-01434-g70f4b36 #1310
    Hardware name: Freescale i.MX7 Dual (Device Tree)
    Workqueue: kmmcd mmc_rescan
    task: a974af80 ti: a846e000 task.ti: a846e000
    PC is at _raw_spin_lock_irqsave+0x1c/0x5c
    LR is at get_parent_ip+0x10/0x2c
    pc : [] lr : [] psr: 60050093
    sp : a846fc20 ip : 0001001f fp : a800b000
    r10: 00000000 r9 : 00000001 r8 : 0000022c
    r7 : 00000002 r6 : 0000022c r5 : a0050013 r4 : 0000022c
    r3 : a974af80 r2 : 00000001 r1 : a846fc44 r0 : 00000000
    Flags: nZCv IRQs off FIQs on Mode SVC_32 ISA ARM Segment kernel
    Control: 10c53c7d Table: a951406a DAC: 00000015
    Process kworker/u4:4 (pid: 780, stack limit = 0xa846e210)
    Stack: (0xa846fc20 to 0xa8470000)
    fc20: 00000000 a846fc50 a846fc44 80061808 00000000 000001dc 00000000 805037fc
    fc40: 8d89d5ec 00000000 a974af80 80053e88 00000000 00000000 ab7293c0 00000000
    fc60: 7f09c828 000000c9 7f09c828 a916a804 00000001 0001001f a800b000 7f0698a4
    fc80: a974afc8 00000001 00000000 00000000 00012ebc a974af80 00000001 80ad46c0
    fca0: a974af80 00000000 a8eeccc0 00000001 0001001f a846fd04 00000000 7f099440
    fcc0: a800b000 7f0699c4 a846fcdf 00000000 00000001 7f068834 a937c900 0105c688
    fce0: a846fd04 a8e20000 00000000 00000001 00000000 7f071f08 a846fd04 a80a0000
    fd00: ffffffff 00000000 ffffffff a8e20000 a8e20000 00000000 7f099440 00000000
    fd20: 00000000 7f099440 a800b000 7f072f4c a974af80 00000000 00000000 80778564
    fd40: a846fd54 a9346550 80330028 00000001 a846e000 a8e20000 7f099440 00000000
    fd60: 18005000 a8eeccc0 00000000 7f099440 a800b000 7f073744 a846fd8c 80052130
    fd80: a9273898 00000000 a800b000 a8e20000 7f099440 00000001 a8eec200 a9270000
    fda0: 00000000 7f099440 a800b000 7f07cd3c 80b81100 8040003f a800b000 00000000
    fdc0: 00000000 a8e20000 7f099440 a9270000 a9273000 a9270000 00000000 7f099440
    fde0: a800b000 7f02df4c 00000001 a8e20000 7f099440 a8eec200 00000000 a916e008
    fe00: 00000000 a90bfb00 a800b000 7f074cbc a9270000 7f099440 a8e20000 00000000
    fe20: a8f81610 7f0765ec 7f0765b0 a8eeccc0 a855df40 7f069310 a916a800 a8eec200
    fe40: 7f09b414 7f06a950 7f06a908 a8f81608 a8f81600 8050e8b8 a8f81608 7f09b414
    fe60: 80b22c70 80379744 a974af80 a8f8163c a8f81608 803797d4 00000005 a81ce930
    fe80: a8f81608 8037923c a8f81608 a8f81608 80b93cf4 80376504 a846fea0 800e0e3c
    fea0: 00000000 00000000 a8f81608 000000bd a833f000 00000000 00000000 8050ed04
    fec0: 00000001 8050dd8c 400f8c0f a833f000 ffffff92 a833f000 a81ce600 8050de30
    fee0: 8050ddbc a833f240 a833f1dc 80506048 a90bfb00 a833f240 a800b000 a81ce600
    ff00: 00000000 800462f0 a81ce600 80043c94 00000000 a800b000 a90bfb18 a800b014
    ff20: a846e000 00000088 80b39379 a90bfb00 a800b000 8004654c 80ad4100 a800b164
    ff40: a90bfb00 00000000 a84856c0 a90bfb00 80046500 00000000 00000000 00000000
    ff60: 00000000 8004b1e8 2df9acc7 00000000 b5f3ff89 a90bfb00 00000000 00000000
    ff80: a846ff80 a846ff80 00000000 00000000 a846ff90 a846ff90 a846ffac a84856c0
    ffa0: 8004b10c 00000000 00000000 8000f568 00000000 00000000 00000000 00000000
    ffc0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
    ffe0: 00000000 00000000 00000000 00000000 00000013 00000000 ecd61557 f82769f5
    [] (_raw_spin_lock_irqsave) from [] (add_wait_queue+0x20/0x48)
    [] (add_wait_queue) from [] (__mmc_claim_host+0x58/0x1b0)
    [] (__mmc_claim_host) from [] (sdioh_request_byte+0x1cc/0x2a4 [bcmdhd])
    [] (sdioh_request_byte [bcmdhd]) from [] (sdioh_cfg_write+0x20/0x28 [bcmdhd])
    [] (sdioh_cfg_write [bcmdhd]) from [] (bcmsdh_cfg_write+0x90/0xdc [bcmdhd])
    [] (bcmsdh_cfg_write [bcmdhd]) from [] (dhdsdio_clk_kso_enab+0x38/0x168 [bcmdhd])
    [] (dhdsdio_clk_kso_enab [bcmdhd]) from [] (dhdsdio_clk_devsleep_iovar+0xf4/0x5f4 [bcmdhd])
    [] (dhdsdio_clk_devsleep_iovar [bcmdhd]) from [] (dhdsdio_bussleep+0x2f8/0x4dc [bcmdhd])
    [] (dhdsdio_bussleep [bcmdhd]) from [] (dhd_bus_stop+0x2e8/0x3f0 [bcmdhd])
    [] (dhd_bus_stop [bcmdhd]) from [] (dhd_detach+0x2a4/0x438 [bcmdhd])
    [] (dhd_detach [bcmdhd]) from [] (dhdsdio_release+0x4c/0x1dc [bcmdhd])
    [] (dhdsdio_release [bcmdhd]) from [] (dhdsdio_disconnect+0x3c/0xa0 [bcmdhd])
    [] (dhdsdio_disconnect [bcmdhd]) from [] (bcmsdh_remove+0x3c/0x60 [bcmdhd])
    [] (bcmsdh_remove [bcmdhd]) from [] (bcmsdh_sdmmc_remove+0x48/0x60 [bcmdhd])
    [] (bcmsdh_sdmmc_remove [bcmdhd]) from [] (sdio_bus_remove+0x30/0xf8)
    [] (sdio_bus_remove) from [] (__device_release_driver+0x70/0xe4)
    [] (__device_release_driver) from [] (device_release_driver+0x1c/0x28)
    [] (device_release_driver) from [] (bus_remove_device+0xd8/0x104)
    [] (bus_remove_device) from [] (device_del+0x10c/0x210)
    [] (device_del) from [] (sdio_remove_func+0x1c/0x28)
    [] (sdio_remove_func) from [] (mmc_sdio_remove+0x40/0x70)
    [] (mmc_sdio_remove) from [] (mmc_sdio_detect+0x74/0x100)
    [] (mmc_sdio_detect) from [] (mmc_rescan+0xb8/0x314)
    [] (mmc_rescan) from [] (process_one_work+0x120/0x330)
    [] (process_one_work) from [] (worker_thread+0x4c/0x480)
    [] (worker_thread) from [] (kthread+0xdc/0xf4)
    [] (kthread) from [] (ret_from_fork+0x14/0x2c)
    Code: f10c0080 e3a00001 ebe359b1 f594f000 (e1943f9f)

    Signed-off-by: Dong Aisheng

    Dong Aisheng
     
  • Currently for DDR50 card, we only use the default pin state, and we meet some
    data CRC error. Now we increase the pad eletric drive for DDR50 card, and use
    pins_100mhz. This pad eletric drive pass the two days reboot stress test, over
    12000 times without issue.

    Signed-off-by: Haibo Chen

    Haibo Chen
     
  • On 4.1 kernel, some eMMC on i.MX7D-SDB board can't pass HS400 tuning,
    the same eMMC can pass HS400 tuning on 3.14 kernel. The difference
    is that 4.1 kernel does not have 1ms delay for eMMC during the
    tuning procedure. The root cause still not find, add back the
    1ms delay first.

    Signed-off-by: Haibo Chen

    Haibo Chen
     
  • This will cause meaningless CPU overhead by polling the card at backgroud
    if the CD is broken.
    Most board does not intend to use this function, so remove it.
    Platform driver could add it for test if needed.

    Signed-off-by: Dong Aisheng

    Conflicts:
    drivers/mmc/host/sdhci.c

    Dong Aisheng
     
  • We may meet the following errors with a SD3.0 DDR50 cards during reboot test.
    mmc0: new ultra high speed DDR50 SDHC card at address aaaa
    mmcblk0: mmc0:aaaa SU08G 7.40 GiB
    mmcblk0: error -84 transferring data, sector 0, nr 8, cmd response 0x900, card status 0xb00
    mmcblk0: retrying using single block read
    mmcblk0: error -84 transferring data, sector 0, nr 8, cmd response 0x900, card status 0x0
    end_request: I/O error, dev mmcblk0, sector 0
    .....
    Buffer I/O error on device mmcblk0, logical block 0
    mmcblk0: unable to read partition table

    The root cause is still unknown.
    Since there's an errata of Sandisk eMMC card before that it requires delay for CMD6
    for eMMC DDR mode to work stable, we also suspect the SD3.0 DDR requires similar delay.
    (Still not confirmed by Sandisk)
    By adding the delay, the overnight reboot test(run 2000+ times) did not
    show the issue anymore. Originally it can easy show the error after about 20 times of
    reboot test.

    So this patch would be the temporary workaround for Sandisk SD3.0 DDR50 mode
    unstable issue.

    Signed-off-by: Dong Aisheng
    (cherry picked from commit ef3bce5feb2ed36c9f4483287454d35ae330dbe3)
    (cherry picked from commit c0cbde8a248036fae1768f232385290c23eddbd7)
    (cherry picked from commit 138bab9f78ea2285b6e7c7cd6c8cd956def44003)
    (cherry picked from commit 12d7e80e7505027feed3eb1ee6d037b1e6df249b)
    Signed-off-by: Haibo Chen

    Dong Aisheng
     
  • After adding mega fast support, the default enabled usdhc wakeup will block
    M/F to gate off power domain.
    To avoid this issue, we only claim wakeup capability and reply on user to enable
    it via sysfs according to real needs.
    The drawback of such change is that for SDIO WiFi Wakeup On Wireless feature,
    User has to enable both uSDHC and WiFi WoW wakeup mannually to make
    WoW work well.

    BTW, due to the wakeup feature is controller itself, so we do not need to reply
    on WiFi PM flags to enable it.

    Signed-off-by: Dong Aisheng
    (cherry picked from commit 58f91ff6f6719fef44f5122ae1d8a5df7e0061d5)
    Signed-off-by: Haibo Chen

    Conflicts:
    drivers/mmc/host/sdhci-esdhc-imx.c

    Dong Aisheng
     
  • The usdhc of i.MX6Q/DL can work well under low power mode without
    request high bus freq. So we do not need request bus freq for i.MX6Q/DL.
    It can save power for i.MX6D/DL due to it saves a lot busfreq switch
    cost as well as the CPU time runing on high bus freq after switch
    during low power mode.

    A new flag ESDHC_FLAG_BUSFREQ is added to indicated this requirement.
    Currently only i.MX6SL is using it.

    Signed-off-by: Dong Aisheng
    (cherry picked from commit 3b954ce55b56dfce195d65b84913ff3c0fcb9f82)
    Signed-off-by: Haibo Chen

    Conflicts:
    drivers/mmc/host/sdhci-esdhc-imx.c

    Dong Aisheng
     
  • Do not need to enable the controller card cd interrupt wakeup
    if using GPIO as card detect since it's meaningless.

    Signed-off-by: Dong Aisheng
    (cherry picked from commit e66bb4978fe4b4fb96e81a1a083c16f84f5aa710)
    Signed-off-by: Haibo Chen

    Dong Aisheng
     
  • Except SDHCI_QUIRK_BROKEN_CARD_DETECTION and MMC_CAP_NONREMOVABLE,
    we also do not need to handle controller native card detect interrupt
    for gpio as card detect case.
    If we wrong enabled the card detect interrupt for gpio case,
    it will cause a lot of unexpected card detect interrupts during data transfer
    which should not happen.

    Signed-off-by: Dong Aisheng
    (cherry picked from commit 2bf47f78bee173798e6d6f360b12defd945c936c)
    Signed-off-by: Haibo Chen

    Conflicts:
    drivers/mmc/host/sdhci.c

    Dong Aisheng
     
  • Request BUS_FREQ_HIGH when bus is busy and then release BUS_FREQ_HIGH
    when bus becomes idle.

    Signed-off-by: Dong Aisheng
    (cherry picked from commit 64994f7115573c9ede53b51536b2c15f7cf0112a)
    Signed-off-by: Haibo Chen

    Conflicts:
    drivers/mmc/host/sdhci-esdhc-imx.c

    Dong Aisheng
     
  • - Some sandisk emmc cards need certain delay befor sending cmd13 after cmd6.
    Original CR: ENGR174296 (commit: fd031f9)

    Acked-by: Aisheng Dong
    Signed-off-by: Ryan QIAN
    (cherry picked from commit f942bf1db36355d46f38792601594949f3f2c71b)
    Signed-off-by: Haibo Chen

    Conflicts:
    drivers/mmc/core/mmc_ops.c

    Ryan QIAN
     
  • WiFi driver could call wifi_card_detect function to re-detect card,
    this is required by some special WiFi cards like broadcom WiFi.
    To use this function, a new property is introduced to indicate a wifi host.

    Signed-off-by: Dong Aisheng
    (cherry picked from commit 74e71dd0aebb9e931f02aefa3dd1990cbe642ae4)
    Signed-off-by: Haibo Chen

    Conflicts:
    Documentation/devicetree/bindings/mmc/fsl-imx-esdhc.txt

    Dong Aisheng