All of lore.kernel.org
 help / color / mirror / Atom feed
From: Dong Aisheng <aisheng.dong@nxp.com>
To: linux-mmc@vger.kernel.org
Cc: ulf.hansson@linaro.org, chris@printf.net, shawnguo@kernel.org,
	adrian.hunter@intel.com, linux-arm-kernel@lists.infradead.org,
	aisheng.dong@nxp.com, haibo.chen@nxp.com, dongas86@gmail.com
Subject: [PATCH 09/23] mmc: sdhci: fix incorrect get data interrupt during no data transfer
Date: Sat, 16 Apr 2016 01:29:33 +0800	[thread overview]
Message-ID: <1460741387-23815-10-git-send-email-aisheng.dong@nxp.com> (raw)
In-Reply-To: <1460741387-23815-1-git-send-email-aisheng.dong@nxp.com>

Current code will report the wrong data interrupt got when no
data operation in progress assumed by getting !host->data in
sdhci_data_irq().

For a data command handling process, the driver will call
sdhci_finish_data() and clear host->data in case any data error,
then card finish_tasklet will do the rest controller reset work.

Before the tasklet got run, however, controllers may report the
TC(Transfer Complete) interrupt (SDHCI_INT_DATA_END) a bit later
than data CRC error and data end bit error interrupts for single
block transfer or the last block of multiblock transfer.

Controller usually detects and generates data CRC/end bit error
interrupts once one block on the bus is transferred completely.
For single block transfer, since there's only one bock to transfer,
the controller will report transfer complete interrupt as well,
but until the data in controller FIFO has been successfully
transferred to memory. The time gap of TC and CRC interrupt depends on
the system busy state at that point and memory bus access speed.

So it is possible when TC interrupt generated, host->data is already
equal to NULL due to cleared by former CRC/Data End Bit error which
is reasonable.

Thus we DO NOT report the weird data interrupt event for this case.

Else we may easily see warning below during SD3.0 card manually tuning
process (calling mmc_send_tuning() which is a single block transfer)
mmc0: Got data interrupt 0x00000002 even though no data operation was in progress

The detailed command log is as follows:
[ 1657.920983] mmc0: starting CMD19 arg 00000000 flags 00000035
[ 1657.921009] mmc0:     blksz 64 blocks 1 flags 00000200 tsac 150 ms nsac 0
[ 1657.921085] sdhci [sdhci_irq()]: *** mmc0 got interrupt: 0x00200001
[ 1657.921112] sdhci [sdhci_irq()]: *** mmc0 got interrupt: 0x00000002
[ 1657.921131] mmc0: Got data interrupt 0x00000002 even though no data operation was in progress.
[ 1657.929761] sdhci: =========== REGISTER DUMP (mmc0)===========
[ 1657.929780] sdhci: Sys addr: 0x3d5d6380 | Version:  0x00000002
[ 1657.929796] sdhci: Blk size: 0x00000040 | Blk cnt:  0x00000001
[ 1657.929814] sdhci: Argument: 0x00000000 | Trn mode: 0x00000013
[ 1657.929831] sdhci: Present:  0x01fd8008 | Host ctl: 0x00000023
[ 1657.929847] sdhci: Power:    0x00000002 | Blk gap:  0x00000080
[ 1657.929863] sdhci: Wake-up:  0x00000008 | Clock:    0x0000000f
[ 1657.929879] sdhci: Timeout:  0x0000000f | Int stat: 0x00000000
[ 1657.929896] sdhci: Int enab: 0x107f008b | Sig enab: 0x107f008b
[ 1657.929914] sdhci: AC12 err: 0x00000000 | Slot int: 0x00000003
[ 1657.929932] sdhci: Caps:     0x07eb0000 | Caps_1:   0x00002007
[ 1657.929949] sdhci: Cmd:      0x0000133a | Max curr: 0x00ffffff
[ 1657.929965] sdhci: Host ctl2: 0x000000c8
[ 1657.929981] sdhci: ADMA Err: 0x00000000 | ADMA Ptr: 0x8f042208
[ 1657.929995] sdhci: ===========================================
[ 1657.930156] mmc0: req done (CMD19): 0: 00000900 00000000 00000000 00000000
[ 1657.930179] mmc0:     0 bytes transferred: -84

It shows we first have a data CRC error interrupt then a data transfer
complete interrupt.
Then we got the !host->data case in sdhci_data_irq().

CC: stable <stable@vger.kernel.org>
Signed-off-by: Dong Aisheng <aisheng.dong@nxp.com>
---
 drivers/mmc/host/sdhci.c | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
index 40e3551..2eb0e34 100644
--- a/drivers/mmc/host/sdhci.c
+++ b/drivers/mmc/host/sdhci.c
@@ -2325,6 +2325,17 @@ static void sdhci_data_irq(struct sdhci_host *host, u32 intmask)
 			}
 		}
 
+		/*
+		 * The "data complete" interrupt is possible to happen a bit
+		 * later than CRC error and data end bit error interrupts
+		 * separately for single block transfer or the last block of
+		 * multiblock transfer. For this case, we DO NOT report the
+		 * weird data interrupt event.
+		 */
+		if ((intmask & SDHCI_INT_DATA_END) &&
+		    (host->mrq && host->mrq->data && host->mrq->data->error))
+			return;
+
 		pr_err("%s: Got data interrupt 0x%08x even though no data operation was in progress.\n",
 		       mmc_hostname(host->mmc), (unsigned)intmask);
 		sdhci_dumpregs(host);
-- 
1.9.1


WARNING: multiple messages have this Message-ID (diff)
From: aisheng.dong@nxp.com (Dong Aisheng)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 09/23] mmc: sdhci: fix incorrect get data interrupt during no data transfer
Date: Sat, 16 Apr 2016 01:29:33 +0800	[thread overview]
Message-ID: <1460741387-23815-10-git-send-email-aisheng.dong@nxp.com> (raw)
In-Reply-To: <1460741387-23815-1-git-send-email-aisheng.dong@nxp.com>

Current code will report the wrong data interrupt got when no
data operation in progress assumed by getting !host->data in
sdhci_data_irq().

For a data command handling process, the driver will call
sdhci_finish_data() and clear host->data in case any data error,
then card finish_tasklet will do the rest controller reset work.

Before the tasklet got run, however, controllers may report the
TC(Transfer Complete) interrupt (SDHCI_INT_DATA_END) a bit later
than data CRC error and data end bit error interrupts for single
block transfer or the last block of multiblock transfer.

Controller usually detects and generates data CRC/end bit error
interrupts once one block on the bus is transferred completely.
For single block transfer, since there's only one bock to transfer,
the controller will report transfer complete interrupt as well,
but until the data in controller FIFO has been successfully
transferred to memory. The time gap of TC and CRC interrupt depends on
the system busy state at that point and memory bus access speed.

So it is possible when TC interrupt generated, host->data is already
equal to NULL due to cleared by former CRC/Data End Bit error which
is reasonable.

Thus we DO NOT report the weird data interrupt event for this case.

Else we may easily see warning below during SD3.0 card manually tuning
process (calling mmc_send_tuning() which is a single block transfer)
mmc0: Got data interrupt 0x00000002 even though no data operation was in progress

The detailed command log is as follows:
[ 1657.920983] mmc0: starting CMD19 arg 00000000 flags 00000035
[ 1657.921009] mmc0:     blksz 64 blocks 1 flags 00000200 tsac 150 ms nsac 0
[ 1657.921085] sdhci [sdhci_irq()]: *** mmc0 got interrupt: 0x00200001
[ 1657.921112] sdhci [sdhci_irq()]: *** mmc0 got interrupt: 0x00000002
[ 1657.921131] mmc0: Got data interrupt 0x00000002 even though no data operation was in progress.
[ 1657.929761] sdhci: =========== REGISTER DUMP (mmc0)===========
[ 1657.929780] sdhci: Sys addr: 0x3d5d6380 | Version:  0x00000002
[ 1657.929796] sdhci: Blk size: 0x00000040 | Blk cnt:  0x00000001
[ 1657.929814] sdhci: Argument: 0x00000000 | Trn mode: 0x00000013
[ 1657.929831] sdhci: Present:  0x01fd8008 | Host ctl: 0x00000023
[ 1657.929847] sdhci: Power:    0x00000002 | Blk gap:  0x00000080
[ 1657.929863] sdhci: Wake-up:  0x00000008 | Clock:    0x0000000f
[ 1657.929879] sdhci: Timeout:  0x0000000f | Int stat: 0x00000000
[ 1657.929896] sdhci: Int enab: 0x107f008b | Sig enab: 0x107f008b
[ 1657.929914] sdhci: AC12 err: 0x00000000 | Slot int: 0x00000003
[ 1657.929932] sdhci: Caps:     0x07eb0000 | Caps_1:   0x00002007
[ 1657.929949] sdhci: Cmd:      0x0000133a | Max curr: 0x00ffffff
[ 1657.929965] sdhci: Host ctl2: 0x000000c8
[ 1657.929981] sdhci: ADMA Err: 0x00000000 | ADMA Ptr: 0x8f042208
[ 1657.929995] sdhci: ===========================================
[ 1657.930156] mmc0: req done (CMD19): 0: 00000900 00000000 00000000 00000000
[ 1657.930179] mmc0:     0 bytes transferred: -84

It shows we first have a data CRC error interrupt then a data transfer
complete interrupt.
Then we got the !host->data case in sdhci_data_irq().

CC: stable <stable@vger.kernel.org>
Signed-off-by: Dong Aisheng <aisheng.dong@nxp.com>
---
 drivers/mmc/host/sdhci.c | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
index 40e3551..2eb0e34 100644
--- a/drivers/mmc/host/sdhci.c
+++ b/drivers/mmc/host/sdhci.c
@@ -2325,6 +2325,17 @@ static void sdhci_data_irq(struct sdhci_host *host, u32 intmask)
 			}
 		}
 
+		/*
+		 * The "data complete" interrupt is possible to happen a bit
+		 * later than CRC error and data end bit error interrupts
+		 * separately for single block transfer or the last block of
+		 * multiblock transfer. For this case, we DO NOT report the
+		 * weird data interrupt event.
+		 */
+		if ((intmask & SDHCI_INT_DATA_END) &&
+		    (host->mrq && host->mrq->data && host->mrq->data->error))
+			return;
+
 		pr_err("%s: Got data interrupt 0x%08x even though no data operation was in progress.\n",
 		       mmc_hostname(host->mmc), (unsigned)intmask);
 		sdhci_dumpregs(host);
-- 
1.9.1

  parent reply	other threads:[~2016-04-15 17:51 UTC|newest]

Thread overview: 170+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-04-15 17:29 [PATCH 00/23] a few sdhci/imx clean up and fix patches Dong Aisheng
2016-04-15 17:29 ` Dong Aisheng
2016-04-15 17:29 ` [PATCH 01/23] mmc: sdhci: removed unneeded function wrappers Dong Aisheng
2016-04-15 17:29   ` Dong Aisheng
2016-04-22 10:27   ` Adrian Hunter
2016-04-22 10:27     ` Adrian Hunter
2016-05-10  6:32     ` Adrian Hunter
2016-05-10  6:32       ` Adrian Hunter
2016-05-10  9:46   ` Ulf Hansson
2016-05-10  9:46     ` Ulf Hansson
2016-04-15 17:29 ` [PATCH 02/23] mmc: sdhci: move sdhci_get_cd() forward to avoid declaration Dong Aisheng
2016-04-15 17:29   ` Dong Aisheng
2016-04-22 10:27   ` Adrian Hunter
2016-04-22 10:27     ` Adrian Hunter
2016-04-24  9:17     ` Dong Aisheng
2016-04-24  9:17       ` Dong Aisheng
2016-04-27 20:26       ` Adrian Hunter
2016-04-27 20:26         ` Adrian Hunter
2016-04-15 17:29 ` [PATCH 03/23] mmc: core: fix a comment typo Dong Aisheng
2016-04-15 17:29   ` Dong Aisheng
2016-04-22 10:28   ` Adrian Hunter
2016-04-22 10:28     ` Adrian Hunter
2016-04-15 17:29 ` [PATCH 04/23] mmc: sdhci: re-factor sdhci_start_signal_voltage() Dong Aisheng
2016-04-15 17:29   ` Dong Aisheng
2016-04-22 11:43   ` Adrian Hunter
2016-04-22 11:43     ` Adrian Hunter
2016-04-24  9:14     ` Dong Aisheng
2016-04-24  9:14       ` Dong Aisheng
2016-04-27 20:26       ` Adrian Hunter
2016-04-27 20:26         ` Adrian Hunter
2016-04-28  3:09         ` Dong Aisheng
2016-04-28  3:09           ` Dong Aisheng
2016-04-28  6:39           ` Adrian Hunter
2016-04-28  6:39             ` Adrian Hunter
2016-04-28  7:15             ` Jaehoon Chung
2016-04-28  7:15               ` Jaehoon Chung
2016-04-28  7:44               ` Adrian Hunter
2016-04-28  7:44                 ` Adrian Hunter
2016-04-28  8:30                 ` Jaehoon Chung
2016-04-28  8:30                   ` Jaehoon Chung
2016-04-28 14:09                   ` Dong Aisheng
2016-04-28 14:09                     ` Dong Aisheng
2016-04-28 23:06                     ` Jaehoon Chung
2016-04-28 23:06                       ` Jaehoon Chung
2016-04-28 13:14             ` Dong Aisheng
2016-04-28 13:14               ` Dong Aisheng
2016-04-28 13:36               ` Adrian Hunter
2016-04-28 13:36                 ` Adrian Hunter
2016-04-28 14:28                 ` Dong Aisheng
2016-04-28 14:28                   ` Dong Aisheng
2016-04-29  7:32                   ` Adrian Hunter
2016-04-29  7:32                     ` Adrian Hunter
2016-04-29  7:57                     ` Dong Aisheng
2016-04-29  7:57                       ` Dong Aisheng
2016-04-15 17:29 ` [PATCH 05/23] mmc: core: mmc_regulator_set_vqmmc not return error if vqmmc/vmmc not exist Dong Aisheng
2016-04-15 17:29   ` Dong Aisheng
2016-04-15 17:29 ` [PATCH 06/23] mmc: sdhci: using common mmc_regulator_set_vqmmc() Dong Aisheng
2016-04-15 17:29   ` Dong Aisheng
2016-04-22 11:48   ` Adrian Hunter
2016-04-22 11:48     ` Adrian Hunter
2016-04-24  9:25     ` Dong Aisheng
2016-04-24  9:25       ` Dong Aisheng
2016-04-15 17:29 ` [PATCH 07/23] mmc: sdhci: check SDHCI_QUIRK2_NO_1_8_V when do voltage switch Dong Aisheng
2016-04-15 17:29   ` Dong Aisheng
2016-04-22 12:30   ` Adrian Hunter
2016-04-22 12:30     ` Adrian Hunter
2016-04-24  9:56     ` Dong Aisheng
2016-04-24  9:56       ` Dong Aisheng
2016-04-27 20:27       ` Adrian Hunter
2016-04-27 20:27         ` Adrian Hunter
2016-04-28 13:24         ` Dong Aisheng
2016-04-28 13:24           ` Dong Aisheng
2016-04-15 17:29 ` [PATCH 08/23] mmc: sdhci: rename quirk SDHCI_QUIRK_MULTIBLOCK_READ_ACMD12 Dong Aisheng
2016-04-15 17:29   ` Dong Aisheng
2016-04-22 12:33   ` Adrian Hunter
2016-04-22 12:33     ` Adrian Hunter
2016-04-24 10:00     ` Dong Aisheng
2016-04-24 10:00       ` Dong Aisheng
2016-04-15 17:29 ` Dong Aisheng [this message]
2016-04-15 17:29   ` [PATCH 09/23] mmc: sdhci: fix incorrect get data interrupt during no data transfer Dong Aisheng
2016-05-10  6:51   ` Adrian Hunter
2016-05-10  6:51     ` Adrian Hunter
2016-05-17  4:31     ` Ritesh Harjani
2016-05-17  4:31       ` Ritesh Harjani
2016-05-17  5:58       ` Adrian Hunter
2016-05-17  5:58         ` Adrian Hunter
2016-05-26 14:59         ` Ritesh Harjani
2016-05-26 14:59           ` Ritesh Harjani
2016-05-26 11:41     ` Dong Aisheng
2016-05-26 11:41       ` Dong Aisheng
2016-05-26 11:59       ` Adrian Hunter
2016-05-26 11:59         ` Adrian Hunter
2016-04-15 17:29 ` [PATCH 10/23] mmc: core: disable auto retune during card detection process Dong Aisheng
2016-04-15 17:29   ` Dong Aisheng
2016-04-22 12:48   ` Adrian Hunter
2016-04-22 12:48     ` Adrian Hunter
2016-04-24 10:47     ` Dong Aisheng
2016-04-24 10:47       ` Dong Aisheng
2016-04-28  7:04       ` Adrian Hunter
2016-04-28  7:04         ` Adrian Hunter
2016-04-28 13:22         ` Dong Aisheng
2016-04-28 13:22           ` Dong Aisheng
2016-04-29  6:54           ` Adrian Hunter
2016-04-29  6:54             ` Adrian Hunter
2016-04-29  7:42             ` Dong Aisheng
2016-04-29  7:42               ` Dong Aisheng
2016-05-10  6:55               ` Adrian Hunter
2016-05-10  6:55                 ` Adrian Hunter
2016-05-31 10:18                 ` Dong Aisheng
2016-05-31 10:18                   ` Dong Aisheng
2016-04-15 17:29 ` [PATCH 11/23] mmc: sdhci-esdhci-imx: remove SDHCI_QUIRK_BROKEN_TIMEOUT_VAL Dong Aisheng
2016-04-15 17:29   ` Dong Aisheng
2016-05-10  9:30   ` Adrian Hunter
2016-05-10  9:30     ` Adrian Hunter
2016-04-15 17:29 ` [PATCH 12/23] mmc: sdhci-esdhc-imx: add esdhc specific suspend resume callback Dong Aisheng
2016-04-15 17:29   ` Dong Aisheng
2016-05-10  9:35   ` Adrian Hunter
2016-05-10  9:35     ` Adrian Hunter
2016-04-15 17:29 ` [PATCH 13/23] mmc: sdhci-esdhc-imx: restore watermark level setting after resume Dong Aisheng
2016-04-15 17:29   ` Dong Aisheng
2016-05-10  9:30   ` Adrian Hunter
2016-05-10  9:30     ` Adrian Hunter
2016-05-31  7:18     ` Dong Aisheng
2016-05-31  7:18       ` Dong Aisheng
2016-04-15 17:29 ` [PATCH 14/23] mmc: sdhci-esdhci-imx: disable DLL delay line settings explicitly Dong Aisheng
2016-04-15 17:29   ` Dong Aisheng
2016-05-10 11:02   ` Adrian Hunter
2016-05-10 11:02     ` Adrian Hunter
2016-04-15 17:29 ` [PATCH 15/23] mmc: sdhci-esdhc-imx: support setting tuning start point Dong Aisheng
2016-04-15 17:29   ` Dong Aisheng
2016-05-10 11:17   ` Adrian Hunter
2016-05-10 11:17     ` Adrian Hunter
2016-04-15 17:29 ` [PATCH 16/23] doc: dt: fsl-imx-esdhc: add set tuning start point binding Dong Aisheng
2016-04-15 17:29   ` Dong Aisheng
2016-04-15 17:29 ` [PATCH 17/23] mmc: sdhci: add standard hw auto retuning support Dong Aisheng
2016-04-15 17:29   ` Dong Aisheng
2016-05-10  8:35   ` Adrian Hunter
2016-05-10  8:35     ` Adrian Hunter
2016-05-26 12:11     ` Dong Aisheng
2016-05-26 12:11       ` Dong Aisheng
2016-04-15 17:29 ` [PATCH 18/23] mmc: sdhci-esdhc-imx: enable hw auto retuning for STD_TUNING Dong Aisheng
2016-04-15 17:29   ` Dong Aisheng
2016-05-10 11:19   ` Adrian Hunter
2016-05-10 11:19     ` Adrian Hunter
2016-05-26 12:21     ` Dong Aisheng
2016-05-26 12:21       ` Dong Aisheng
2016-04-15 17:29 ` [PATCH 19/23] mmc: sdhci-esdhc-imx: enable hw auto retuning for MAN_TUNING Dong Aisheng
2016-04-15 17:29   ` Dong Aisheng
2016-05-10 11:24   ` Adrian Hunter
2016-05-10 11:24     ` Adrian Hunter
2016-04-15 17:29 ` [PATCH 20/23] mmc: sdhci-esdhc-imx: fix strobe DLL lock wrong clock issue Dong Aisheng
2016-04-15 17:29   ` Dong Aisheng
2016-05-10 12:03   ` Adrian Hunter
2016-05-10 12:03     ` Adrian Hunter
2016-05-26 11:47     ` Dong Aisheng
2016-05-26 11:47       ` Dong Aisheng
2016-04-15 17:29 ` [PATCH 21/23] mmc: sdhci-esdhc-imx: factor out hw related intialization into function Dong Aisheng
2016-04-15 17:29   ` Dong Aisheng
2016-05-10 12:15   ` Adrian Hunter
2016-05-10 12:15     ` Adrian Hunter
2016-05-26 11:45     ` Dong Aisheng
2016-05-26 11:45       ` Dong Aisheng
2016-04-15 17:29 ` [PATCH 22/23] mmc: sdhci-esdhc-imx: move tuning static configuration into hwinit function Dong Aisheng
2016-04-15 17:29   ` Dong Aisheng
2016-05-10 13:07   ` Adrian Hunter
2016-05-10 13:07     ` Adrian Hunter
2016-04-15 17:29 ` [PATCH 23/23] mmc: sdhci-esdhc-imx: clear tuning bits during hwinit Dong Aisheng
2016-04-15 17:29   ` Dong Aisheng
2016-05-10 13:10   ` Adrian Hunter
2016-05-10 13:10     ` Adrian Hunter

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=1460741387-23815-10-git-send-email-aisheng.dong@nxp.com \
    --to=aisheng.dong@nxp.com \
    --cc=adrian.hunter@intel.com \
    --cc=chris@printf.net \
    --cc=dongas86@gmail.com \
    --cc=haibo.chen@nxp.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-mmc@vger.kernel.org \
    --cc=shawnguo@kernel.org \
    --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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.