Patch "mmc: sdhci: Fix CMD line reset interfering with ongoing data transfer" has been added to the 4.8-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
mmc: sdhci: Fix CMD line reset interfering with ongoing data transfer
to the 4.8-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
mmc-sdhci-fix-cmd-line-reset-interfering-with-ongoing-data-transfer.patch
and it can be found in the queue-4.8 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
6ebebeab5185f50d55c6a24d0abe47e5dac1b191Mon Sep 17 00:00:00 2001
From: Adrian Hunter <[email protected]>
Date: Wed, 2 Nov 2016 15:49:08 +0200
Subject: mmc: sdhci: Fix CMD line reset interfering with ongoing data transfer
From: Adrian Hunter <[email protected]>
commit 6ebebeab5185f50d55c6a24d0abe47e5dac1b191 upstream.
CMD line reset during an ongoing data transfer can cause the data transfer to hang. Fix by delaying the reset until the data transfer is finished.
--- drivers/mmc/host/sdhci.c | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-)
drivers/mmc/host/sdhci.c +16 -7
@@ -2269,10 +2269,8 @@ static bool sdhci_request_done(struct sdfor (i =0 ; i <SDHCI_MAX_MRQS ; i++) { mrq = host->mrqs_done[i]; -if (mrq) { - host->mrqs_done[i] =NULL ; +if (mrq)break ; - } }if (!mrq) {
@@ -2303,6 +2301,17 @@ static bool sdhci_request_done(struct sd* upon error conditions. */ if (sdhci_needs_reset (host, mrq)) { +/* +* Do not finish until command and data lines are available for +* reset. Note there can only be one other mrq, so it cannot +* also be in mrqs_done, otherwise host->cmd and host->data_cmd +* would both be null. +*/ +if (host->cmd || host->data_cmd) { +spin_unlock_irqrestore (&host->lock, flags); +return true; + } +/* Some controllers need this kick or reset won't work here */ if (host->quirks &SDHCI_QUIRK_CLOCK_BEFORE_RESET )/* This is to force an update */
@@ -2310,10 +2319,8 @@ static bool sdhci_request_done(struct sd/* Spec says we should do both at the same time, but Ricoh controllers do not like that. */ -if (!host->cmd) -sdhci_do_reset (host,SDHCI_RESET_CMD ); -if (!host->data_cmd) -sdhci_do_reset (host,SDHCI_RESET_DATA ); +sdhci_do_reset (host,SDHCI_RESET_CMD ); +sdhci_do_reset (host,SDHCI_RESET_DATA ); host->pending_reset = false; }
@@ -2321,6 +2328,8 @@ static bool sdhci_request_done(struct sdif (!sdhci_has_requests (host))sdhci_led_deactivate (host); + host->mrqs_done[i] =NULL ; +mmiowb ();spin_unlock_irqrestore (&host->lock, flags);
Patches currently in stable-queue which might be from [email protected] are
queue-4.8/mmc-sdhci-fix-cmd-line-reset-interfering-with-ongoing-data-transfer.patch queue-4.8/mmc-sdhci-fix-unexpected-data-interrupt-handling.patch