Hello everyone, We have made some research of how driver behaves in case when changes [1] are not applied. Here in [2] was metioned that while transfering data after interrupt has happend driver went to PIO mode, that is not expected. Here is log: | Running : 4M-check-reassembly-tcp-cmykw2-rotatew2.out -v0 -w1 | - Info: Finished target initialization. | mmcblk0: error -110 transferring data, sector 320544, nr 2048, cmd response | 0x900, card status 0x0 | mmc_host mmc0: Bus speed (slot 0) = 50000000Hz (slot req 400000Hz, actual | 396825HZ div = 63) | mmc_host mmc0: Bus speed (slot 0) = 50000000Hz (slot req 25000000Hz, actual | 25000000HZ div = 1) | ------------[ cut here ]------------ | softirq: huh, entered softirq 6 TASKLET 6f6a9412 with preempt_count 00000101, | exited with 00000100? | WARNING: CPU: 2 PID: 0 at ../lib/scatterlist.c:652 sg_miter_next+0x28/0x20c | Modules linked in: | CPU: 2 PID: 0 Comm: swapper/2 Not tainted 4.15.0 #57 | | Stack Trace: | arc_unwind_core.constprop.1+0xd0/0xf4 | dump_stack+0x68/0x80 | warn_slowpath_null+0x4e/0xec | sg_miter_next+0x28/0x20c > dw_mci_read_data_pio+0x44/0x190 | dw_mmc f000a000.mmc: Unexpected interrupt latency | dw_mci_interrupt+0x3ee/0x530 | __handle_irq_event_percpu+0x56/0x150 | handle_irq_event+0x34/0x78 | handle_level_irq+0x8e/0x120 | generic_handle_irq+0x1c/0x2c | idu_cascade_isr+0x30/0x6c | __handle_domain_irq+0x72/0xc8 | ret_from_exception+0x0/0x8 |---[ end trace 2a58c9af6c25fe51 ]--- If I correctly understand behaviour, after interrupt has occurred, driver was in state "BUSY", than it checks status in dw_mci_data_complete() where SDMMC_INT_DRTO is set (drto_ms is not correct). After that function dw_mci_reset() is called. As I see after reset driver tries to restart, dw_mci_idmac_start_dma() called in which dw_mci_prepare_desc32() is called. In that function descriptors states are checked, where one of descriptor is OWN-ed because we got interrupt while transferring data. After that driver jumps to "err_own_bit:", where it reinits IDMAC, but return value is -EINVAL, and afterall driver went into PIO mode: `dw_mci_submit_data_dma: fall back to PIO mode for current transfer"` The problem is in checking descriptors statuses in IDMAC initialization, which are dirty. What do you think about clearing them in dw_mci_reset()? Also I have checked how SDcard works in PIO mode, for that I made: git diff drivers/mmc/host/dw_mmc.c @@ -2924,7 +2924,7 @@ static void dw_mci_init_dma(struct dw_mci *host) goto no_dma; } - + goto no_dma; /* Determine which DMA interface to use */ It doesn't work well: | Synopsys Designware Multimedia Card Interface Driver | dw_mmc f000a000.mmc: 'num-slots' was deprecated. | dw_mmc f000a000.mmc: Using PIO mode. | dw_mmc f000a000.mmc: Version ID is 290a | dw_mmc f000a000.mmc: DW MMC controller at irq 12,32 bit host data width,16 deep fifo ... | # mount /dev/mmcblk0p2 2 | EXT4-fs (mmcblk0p2): couldn't mount as ext3 due to feature incompatibilities | EXT4-fs (mmcblk0p2): couldn't mount as ext2 due to feature incompatibilities | EXT4-fs (mmcblk0p2): mounted filesystem with ordered data mode. Opts: (null) | # cp 2/big_buck_bunny_1080p_h264.mov /tmp | INFO: task kworker/3:1H:131 blocked for more than 10 seconds. | Not tainted 4.16.0-rc2-00064-gaf3e79d29555-dirty #2 | "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. | kworker/3:1H D 0 131 2 0x00000000 | Workqueue: kblockd blk_mq_run_work_fn | | Stack Trace: | __switch_to+0x0/0xac | __schedule+0x1c4/0x598 | schedule+0x28/0x78 | mmc_blk_rw_wait+0x96/0xf8 | mmc_blk_mq_issue_rq+0x51a/0x880 | mmc_mq_queue_rq+0x136/0x1f8 | blk_mq_dispatch_rq_list+0xb0/0x5e8 | blk_mq_do_dispatch_sched+0x4c/0x9c | blk_mq_sched_dispatch_requests+0xf0/0x15c | blk_mq_run_work_fn+0x78/0x130 | process_one_work+0x194/0x338 | worker_thread+0xf0/0x464 | kthread+0x116/0x13c | ret_from_fork+0x18/0x1c |INFO: task kworker/3:1H:131 blocked for more than 10 seconds. | Not tainted 4.16.0-rc2-00064-gaf3e79d29555-dirty #2 |"echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. |kworker/3:1H D 0 131 2 0x00000000 |Workqueue: kblockd blk_mq_run_work_fn I guess that is not expected. I am wondering was that mode have been tested? Best regards, Evgeniy Didin [1] : https://www.spinics.net/lists/kernel/msg2734310.html ; [2] : https://www.spinics.net/lists/linux-mmc/msg48010.html��.n��������+%����;��w��{.n�����{��i��)��jg��������ݢj����G�������j:+v���w�m������w�������h�����٥