public inbox for linux-mmc@vger.kernel.org
 help / color / mirror / Atom feed
From: Evgeniy Didin <Evgeniy.Didin@synopsys.com>
To: "linux-mmc@vger.kernel.org" <linux-mmc@vger.kernel.org>
Cc: "ulf.hansson@linaro.org" <ulf.hansson@linaro.org>,
	"shawn.lin@rock-chips.com" <shawn.lin@rock-chips.com>,
	Alexey Brodkin <Alexey.Brodkin@synopsys.com>,
	"andy.shevchenko@gmail.com" <andy.shevchenko@gmail.com>,
	"dianders@chromium.org" <dianders@chromium.org>,
	"Jisheng.Zhang@synaptics.com" <Jisheng.Zhang@synaptics.com>,
	"linux-snps-arc@lists.infradead.org"
	<linux-snps-arc@lists.infradead.org>,
	Eugeniy Paltsev <Eugeniy.Paltsev@synopsys.com>
Subject: mmc: dw_mmc: DRTO interrupt cause driver switch to PIO mode
Date: Wed, 28 Feb 2018 16:11:02 +0000	[thread overview]
Message-ID: <1519834261.8992.8.camel@synopsys.com> (raw)

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
_______________________________________________
linux-snps-arc mailing list
linux-snps-arc@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-snps-arc

             reply	other threads:[~2018-02-28 16:11 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-02-28 16:11 Evgeniy Didin [this message]
2018-03-05  9:24 ` mmc: dw_mmc: DRTO interrupt cause driver switch to PIO mode Shawn Lin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1519834261.8992.8.camel@synopsys.com \
    --to=evgeniy.didin@synopsys.com \
    --cc=Alexey.Brodkin@synopsys.com \
    --cc=Eugeniy.Paltsev@synopsys.com \
    --cc=Jisheng.Zhang@synaptics.com \
    --cc=andy.shevchenko@gmail.com \
    --cc=dianders@chromium.org \
    --cc=linux-mmc@vger.kernel.org \
    --cc=linux-snps-arc@lists.infradead.org \
    --cc=shawn.lin@rock-chips.com \
    --cc=ulf.hansson@linaro.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox