linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/2] Fixes for command errors during tuning
@ 2019-02-26 16:16 Faiz Abbas
  2019-02-26 16:16 ` [PATCH 1/2] mmc: sdhci: Add platform_cmd_err() to sdhci_ops Faiz Abbas
  2019-02-26 16:16 ` [PATCH 2/2] mmc: sdhci-omap: Don't finish_mrq() on a command error during tuning Faiz Abbas
  0 siblings, 2 replies; 5+ messages in thread
From: Faiz Abbas @ 2019-02-26 16:16 UTC (permalink / raw)
  To: linux-kernel, linux-mmc, linux-omap
  Cc: ulf.hansson, kishon, adrian.hunter, faiz_abbas

These patches fix the following error message in dra7xx boards:

[4.833198] mmc1: Got data interrupt 0x00000002 even though no data
operation was in progress.

Tested with 100 times boot tests on dra71x-evm, dra72x-evm and
dra7xx-evm.

Faiz Abbas (2):
  mmc: sdhci: Add platform_cmd_err() to sdhci_ops
  mmc: sdhci-omap: Don't finish_mrq() on a command error during tuning

 drivers/mmc/host/sdhci-omap.c | 24 +++++++++++++++++++++++
 drivers/mmc/host/sdhci.c      | 37 ++++++++++++++++++++++-------------
 drivers/mmc/host/sdhci.h      |  4 ++++
 3 files changed, 51 insertions(+), 14 deletions(-)

-- 
2.19.2


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH 1/2] mmc: sdhci: Add platform_cmd_err() to sdhci_ops
  2019-02-26 16:16 [PATCH 0/2] Fixes for command errors during tuning Faiz Abbas
@ 2019-02-26 16:16 ` Faiz Abbas
  2019-02-26 16:16 ` [PATCH 2/2] mmc: sdhci-omap: Don't finish_mrq() on a command error during tuning Faiz Abbas
  1 sibling, 0 replies; 5+ messages in thread
From: Faiz Abbas @ 2019-02-26 16:16 UTC (permalink / raw)
  To: linux-kernel, linux-mmc, linux-omap
  Cc: ulf.hansson, kishon, adrian.hunter, faiz_abbas

Some platforms might need a custom method for handling command error
interrupts. Add a callback to sdhci_ops to facilitate the same. Move
default command error handling to its own non-static function so it can
be called from platform drivers. Also make sdhci_finish_command()
non-static.

Fixes: 5b0d62108b46 ("mmc: sdhci-omap: Add platform specific reset
callback")
Signed-off-by: Faiz Abbas <faiz_abbas@ti.com>
---
 drivers/mmc/host/sdhci.c | 37 +++++++++++++++++++++++--------------
 drivers/mmc/host/sdhci.h |  4 ++++
 2 files changed, 27 insertions(+), 14 deletions(-)

diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
index eba9bcc92ad3..12302432605c 100644
--- a/drivers/mmc/host/sdhci.c
+++ b/drivers/mmc/host/sdhci.c
@@ -1440,7 +1440,7 @@ static void sdhci_read_rsp_136(struct sdhci_host *host, struct mmc_command *cmd)
 	}
 }
 
-static void sdhci_finish_command(struct sdhci_host *host)
+void sdhci_finish_command(struct sdhci_host *host)
 {
 	struct mmc_command *cmd = host->cmd;
 
@@ -2772,6 +2772,25 @@ static void sdhci_timeout_data_timer(struct timer_list *t)
  *                                                                           *
 \*****************************************************************************/
 
+void sdhci_cmd_err(struct sdhci_host *host, u32 intmask, u32 *intmask_p)
+{
+		if (intmask & SDHCI_INT_TIMEOUT)
+			host->cmd->error = -ETIMEDOUT;
+		else
+			host->cmd->error = -EILSEQ;
+
+		/* Treat data command CRC error the same as data CRC error */
+		if (host->cmd->data &&
+		    (intmask & (SDHCI_INT_CRC | SDHCI_INT_TIMEOUT)) ==
+		     SDHCI_INT_CRC) {
+			host->cmd = NULL;
+			*intmask_p |= SDHCI_INT_DATA_CRC;
+			return;
+		}
+
+		sdhci_finish_mrq(host, host->cmd->mrq);
+}
+
 static void sdhci_cmd_irq(struct sdhci_host *host, u32 intmask, u32 *intmask_p)
 {
 	/* Handle auto-CMD12 error */
@@ -2805,21 +2824,11 @@ static void sdhci_cmd_irq(struct sdhci_host *host, u32 intmask, u32 *intmask_p)
 
 	if (intmask & (SDHCI_INT_TIMEOUT | SDHCI_INT_CRC |
 		       SDHCI_INT_END_BIT | SDHCI_INT_INDEX)) {
-		if (intmask & SDHCI_INT_TIMEOUT)
-			host->cmd->error = -ETIMEDOUT;
+		if (host->ops->platform_cmd_err)
+			host->ops->platform_cmd_err(host, intmask, intmask_p);
 		else
-			host->cmd->error = -EILSEQ;
+			sdhci_cmd_err(host, intmask, intmask_p);
 
-		/* Treat data command CRC error the same as data CRC error */
-		if (host->cmd->data &&
-		    (intmask & (SDHCI_INT_CRC | SDHCI_INT_TIMEOUT)) ==
-		     SDHCI_INT_CRC) {
-			host->cmd = NULL;
-			*intmask_p |= SDHCI_INT_DATA_CRC;
-			return;
-		}
-
-		sdhci_finish_mrq(host, host->cmd->mrq);
 		return;
 	}
 
diff --git a/drivers/mmc/host/sdhci.h b/drivers/mmc/host/sdhci.h
index 6cc9a3c2ac66..523a47c4efa4 100644
--- a/drivers/mmc/host/sdhci.h
+++ b/drivers/mmc/host/sdhci.h
@@ -639,6 +639,8 @@ struct sdhci_ops {
 	void	(*voltage_switch)(struct sdhci_host *host);
 	void	(*adma_write_desc)(struct sdhci_host *host, void **desc,
 				   dma_addr_t addr, int len, unsigned int cmd);
+	void	(*platform_cmd_err)(struct sdhci_host *host, u32 intmask,
+				    u32 *intmask_p);
 };
 
 #ifdef CONFIG_MMC_SDHCI_IO_ACCESSORS
@@ -792,5 +794,7 @@ void sdhci_start_tuning(struct sdhci_host *host);
 void sdhci_end_tuning(struct sdhci_host *host);
 void sdhci_reset_tuning(struct sdhci_host *host);
 void sdhci_send_tuning(struct sdhci_host *host, u32 opcode);
+void sdhci_cmd_err(struct sdhci_host *host, u32 intmask, u32 *intmask_p);
+void sdhci_finish_command(struct sdhci_host *host);
 
 #endif /* __SDHCI_HW_H */
-- 
2.19.2


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH 2/2] mmc: sdhci-omap: Don't finish_mrq() on a command error during tuning
  2019-02-26 16:16 [PATCH 0/2] Fixes for command errors during tuning Faiz Abbas
  2019-02-26 16:16 ` [PATCH 1/2] mmc: sdhci: Add platform_cmd_err() to sdhci_ops Faiz Abbas
@ 2019-02-26 16:16 ` Faiz Abbas
  2019-03-01  7:22   ` kbuild test robot
  1 sibling, 1 reply; 5+ messages in thread
From: Faiz Abbas @ 2019-02-26 16:16 UTC (permalink / raw)
  To: linux-kernel, linux-mmc, linux-omap
  Cc: ulf.hansson, kishon, adrian.hunter, faiz_abbas

commit 5b0d62108b46 ("mmc: sdhci-omap: Add platform specific reset
callback") skips data resets during tuning operation. Because of this,
a data error or data finish interrupt might still arrive after a command
error has been handled and the mrq ended. This ends up with a "mmc0: Got
data interrupt 0x00000002 even though no data operation was in progress"
error message.

Fix this by adding a platform specific callback for command errors. Mark
the mrq as a failure but wait for a data interrupt instead of calling
finish_mrq().

Fixes: 5b0d62108b46 ("mmc: sdhci-omap: Add platform specific reset
callback")
Signed-off-by: Faiz Abbas <faiz_abbas@ti.com>
---
 drivers/mmc/host/sdhci-omap.c | 24 ++++++++++++++++++++++++
 1 file changed, 24 insertions(+)

diff --git a/drivers/mmc/host/sdhci-omap.c b/drivers/mmc/host/sdhci-omap.c
index c11c18a9aacb..f73ded5cc527 100644
--- a/drivers/mmc/host/sdhci-omap.c
+++ b/drivers/mmc/host/sdhci-omap.c
@@ -797,6 +797,29 @@ void sdhci_omap_reset(struct sdhci_host *host, u8 mask)
 	sdhci_reset(host, mask);
 }
 
+void sdhci_omap_cmd_err(struct sdhci_host *host, u32 intmask, u32 *intmask_p)
+{
+	struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
+	struct sdhci_omap_host *omap_host = sdhci_pltfm_priv(pltfm_host);
+
+	if (omap_host->is_tuning) {
+		/*
+		 * Since we are not resetting data lines during tuning
+		 * operation, data error or data complete interrupts
+		 * might still arrive. Mark this request as a failure
+		 * but still wait for the data interrupt
+		 */
+		if (intmask & SDHCI_INT_TIMEOUT)
+			host->cmd->error = -ETIMEDOUT;
+		else
+			host->cmd->error = -EILSEQ;
+
+		sdhci_finish_command(host);
+	} else {
+		sdhci_cmd_err(host, intmask, intmask_p);
+	}
+}
+
 static struct sdhci_ops sdhci_omap_ops = {
 	.set_clock = sdhci_omap_set_clock,
 	.set_power = sdhci_omap_set_power,
@@ -807,6 +830,7 @@ static struct sdhci_ops sdhci_omap_ops = {
 	.platform_send_init_74_clocks = sdhci_omap_init_74_clocks,
 	.reset = sdhci_omap_reset,
 	.set_uhs_signaling = sdhci_omap_set_uhs_signaling,
+	.platform_cmd_err = sdhci_omap_cmd_err,
 };
 
 static int sdhci_omap_set_capabilities(struct sdhci_omap_host *omap_host)
-- 
2.19.2


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH 2/2] mmc: sdhci-omap: Don't finish_mrq() on a command error during tuning
  2019-02-26 16:16 ` [PATCH 2/2] mmc: sdhci-omap: Don't finish_mrq() on a command error during tuning Faiz Abbas
@ 2019-03-01  7:22   ` kbuild test robot
  2019-03-01  8:14     ` Faiz Abbas
  0 siblings, 1 reply; 5+ messages in thread
From: kbuild test robot @ 2019-03-01  7:22 UTC (permalink / raw)
  To: Faiz Abbas
  Cc: kbuild-all, linux-kernel, linux-mmc, linux-omap, ulf.hansson,
	kishon, adrian.hunter, faiz_abbas

[-- Attachment #1: Type: text/plain, Size: 1358 bytes --]

Hi Faiz,

Thank you for the patch! Yet something to improve:

[auto build test ERROR on ulf.hansson-mmc/next]
[also build test ERROR on v5.0-rc8 next-20190228]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]

url:    https://github.com/0day-ci/linux/commits/Faiz-Abbas/Fixes-for-command-errors-during-tuning/20190228-083200
base:   git://git.kernel.org/pub/scm/linux/kernel/git/ulfh/mmc.git next
config: ia64-allmodconfig (attached as .config)
compiler: ia64-linux-gcc (GCC) 8.2.0
reproduce:
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # save the attached .config to linux build tree
        GCC_VERSION=8.2.0 make.cross ARCH=ia64 

All errors (new ones prefixed by >>):

   ERROR: "ia64_delay_loop" [drivers/spi/spi-thunderx.ko] undefined!
   ERROR: "__sw_hweight8" [drivers/net/wireless/mediatek/mt76/mt76.ko] undefined!
   ERROR: "ia64_delay_loop" [drivers/net/phy/mdio-cavium.ko] undefined!
>> ERROR: "sdhci_cmd_err" [drivers/mmc/host/sdhci-omap.ko] undefined!
>> ERROR: "sdhci_finish_command" [drivers/mmc/host/sdhci-omap.ko] undefined!

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation

[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 52751 bytes --]

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH 2/2] mmc: sdhci-omap: Don't finish_mrq() on a command error during tuning
  2019-03-01  7:22   ` kbuild test robot
@ 2019-03-01  8:14     ` Faiz Abbas
  0 siblings, 0 replies; 5+ messages in thread
From: Faiz Abbas @ 2019-03-01  8:14 UTC (permalink / raw)
  To: kbuild test robot
  Cc: kbuild-all, linux-kernel, linux-mmc, linux-omap, ulf.hansson,
	kishon, adrian.hunter

Hi,

On 01/03/19 12:52 PM, kbuild test robot wrote:
> Hi Faiz,
> 
> Thank you for the patch! Yet something to improve:
> 
> [auto build test ERROR on ulf.hansson-mmc/next]
> [also build test ERROR on v5.0-rc8 next-20190228]
> [if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
> 
> url:    https://github.com/0day-ci/linux/commits/Faiz-Abbas/Fixes-for-command-errors-during-tuning/20190228-083200
> base:   git://git.kernel.org/pub/scm/linux/kernel/git/ulfh/mmc.git next
> config: ia64-allmodconfig (attached as .config)
> compiler: ia64-linux-gcc (GCC) 8.2.0
> reproduce:
>         wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
>         chmod +x ~/bin/make.cross
>         # save the attached .config to linux build tree
>         GCC_VERSION=8.2.0 make.cross ARCH=ia64 
> 
> All errors (new ones prefixed by >>):
> 
>    ERROR: "ia64_delay_loop" [drivers/spi/spi-thunderx.ko] undefined!
>    ERROR: "__sw_hweight8" [drivers/net/wireless/mediatek/mt76/mt76.ko] undefined!
>    ERROR: "ia64_delay_loop" [drivers/net/phy/mdio-cavium.ko] undefined!
>>> ERROR: "sdhci_cmd_err" [drivers/mmc/host/sdhci-omap.ko] undefined!
>>> ERROR: "sdhci_finish_command" [drivers/mmc/host/sdhci-omap.ko] undefined!

Looks like EXPORT_SYMBOL_GPL is required here. Will add in v2.

Thanks,
Faiz

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2019-03-01  8:11 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-02-26 16:16 [PATCH 0/2] Fixes for command errors during tuning Faiz Abbas
2019-02-26 16:16 ` [PATCH 1/2] mmc: sdhci: Add platform_cmd_err() to sdhci_ops Faiz Abbas
2019-02-26 16:16 ` [PATCH 2/2] mmc: sdhci-omap: Don't finish_mrq() on a command error during tuning Faiz Abbas
2019-03-01  7:22   ` kbuild test robot
2019-03-01  8:14     ` Faiz Abbas

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).