From: Greg Kroah-Hartman Date: Thu, 6 Feb 2014 23:50:24 +0000 (-0800) Subject: 3.10-stable patches X-Git-Tag: v3.4.80~84 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=c6af9cf9515800e8a633af3baa29c15661c70425;p=thirdparty%2Fkernel%2Fstable-queue.git 3.10-stable patches added patches: mmc-atmel-mci-fix-timeout-errors-in-sdio-mode-when-using-dma.patch mmc-fix-host-release-issue-after-discard-operation.patch --- diff --git a/queue-3.10/mmc-atmel-mci-fix-timeout-errors-in-sdio-mode-when-using-dma.patch b/queue-3.10/mmc-atmel-mci-fix-timeout-errors-in-sdio-mode-when-using-dma.patch new file mode 100644 index 00000000000..34d2780034f --- /dev/null +++ b/queue-3.10/mmc-atmel-mci-fix-timeout-errors-in-sdio-mode-when-using-dma.patch @@ -0,0 +1,50 @@ +From 66b512eda74d59b17eac04c4da1b38d82059e6c9 Mon Sep 17 00:00:00 2001 +From: Ludovic Desroches +Date: Wed, 20 Nov 2013 16:01:11 +0100 +Subject: mmc: atmel-mci: fix timeout errors in SDIO mode when using DMA + +From: Ludovic Desroches + +commit 66b512eda74d59b17eac04c4da1b38d82059e6c9 upstream. + +With some SDIO devices, timeout errors can happen when reading data. +To solve this issue, the DMA transfer has to be activated before sending +the command to the device. This order is incorrect in PDC mode. So we +have to take care if we are using DMA or PDC to know when to send the +MMC command. + +Signed-off-by: Ludovic Desroches +Acked-by: Nicolas Ferre +Signed-off-by: Chris Ball +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/mmc/host/atmel-mci.c | 13 ++++++++++++- + 1 file changed, 12 insertions(+), 1 deletion(-) + +--- a/drivers/mmc/host/atmel-mci.c ++++ b/drivers/mmc/host/atmel-mci.c +@@ -1188,11 +1188,22 @@ static void atmci_start_request(struct a + iflags |= ATMCI_CMDRDY; + cmd = mrq->cmd; + cmdflags = atmci_prepare_command(slot->mmc, cmd); +- atmci_send_command(host, cmd, cmdflags); ++ ++ /* ++ * DMA transfer should be started before sending the command to avoid ++ * unexpected errors especially for read operations in SDIO mode. ++ * Unfortunately, in PDC mode, command has to be sent before starting ++ * the transfer. ++ */ ++ if (host->submit_data != &atmci_submit_data_dma) ++ atmci_send_command(host, cmd, cmdflags); + + if (data) + host->submit_data(host, data); + ++ if (host->submit_data == &atmci_submit_data_dma) ++ atmci_send_command(host, cmd, cmdflags); ++ + if (mrq->stop) { + host->stop_cmdr = atmci_prepare_command(slot->mmc, mrq->stop); + host->stop_cmdr |= ATMCI_CMDR_STOP_XFER; diff --git a/queue-3.10/mmc-fix-host-release-issue-after-discard-operation.patch b/queue-3.10/mmc-fix-host-release-issue-after-discard-operation.patch new file mode 100644 index 00000000000..0e693109756 --- /dev/null +++ b/queue-3.10/mmc-fix-host-release-issue-after-discard-operation.patch @@ -0,0 +1,66 @@ +From f662ae48ae67dfd42739e65750274fe8de46240a Mon Sep 17 00:00:00 2001 +From: Ray Jui +Date: Sat, 26 Oct 2013 11:03:44 -0700 +Subject: mmc: fix host release issue after discard operation + +From: Ray Jui + +commit f662ae48ae67dfd42739e65750274fe8de46240a upstream. + +Under function mmc_blk_issue_rq, after an MMC discard operation, +the MMC request data structure may be freed in memory. Later in +the same function, the check of req->cmd_flags & MMC_REQ_SPECIAL_MASK +is dangerous and invalid. It causes the MMC host not to be released +when it should. + +This patch fixes the issue by marking the special request down before +the discard/flush operation. + +Reported by: Harold (SoonYeal) Yang +Signed-off-by: Ray Jui +Reviewed-by: Seungwon Jeon +Acked-by: Seungwon Jeon +Signed-off-by: Chris Ball +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/mmc/card/block.c | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +--- a/drivers/mmc/card/block.c ++++ b/drivers/mmc/card/block.c +@@ -1931,6 +1931,7 @@ static int mmc_blk_issue_rq(struct mmc_q + struct mmc_card *card = md->queue.card; + struct mmc_host *host = card->host; + unsigned long flags; ++ unsigned int cmd_flags = req ? req->cmd_flags : 0; + + if (req && !mq->mqrq_prev->req) + /* claim host only for the first request */ +@@ -1946,7 +1947,7 @@ static int mmc_blk_issue_rq(struct mmc_q + } + + mq->flags &= ~MMC_QUEUE_NEW_REQUEST; +- if (req && req->cmd_flags & REQ_DISCARD) { ++ if (cmd_flags & REQ_DISCARD) { + /* complete ongoing async transfer before issuing discard */ + if (card->host->areq) + mmc_blk_issue_rw_rq(mq, NULL); +@@ -1955,7 +1956,7 @@ static int mmc_blk_issue_rq(struct mmc_q + ret = mmc_blk_issue_secdiscard_rq(mq, req); + else + ret = mmc_blk_issue_discard_rq(mq, req); +- } else if (req && req->cmd_flags & REQ_FLUSH) { ++ } else if (cmd_flags & REQ_FLUSH) { + /* complete ongoing async transfer before issuing flush */ + if (card->host->areq) + mmc_blk_issue_rw_rq(mq, NULL); +@@ -1971,7 +1972,7 @@ static int mmc_blk_issue_rq(struct mmc_q + + out: + if ((!req && !(mq->flags & MMC_QUEUE_NEW_REQUEST)) || +- (req && (req->cmd_flags & MMC_REQ_SPECIAL_MASK))) ++ (cmd_flags & MMC_REQ_SPECIAL_MASK)) + /* + * Release host when there are no more requests + * and after special request(discard, flush) is done. diff --git a/queue-3.10/series b/queue-3.10/series index b2dbc22c8d6..1903fad3c04 100644 --- a/queue-3.10/series +++ b/queue-3.10/series @@ -11,3 +11,5 @@ audit-correct-a-type-mismatch-in-audit_syscall_exit.patch mm-memory-failure.c-shift-page-lock-from-head-page-to-tail-page-after-thp-split.patch mm-page-writeback.c-fix-dirty_balance_reserve-subtraction-from-dirtyable-memory.patch mm-page-writeback.c-do-not-count-anon-pages-as-dirtyable-memory.patch +mmc-fix-host-release-issue-after-discard-operation.patch +mmc-atmel-mci-fix-timeout-errors-in-sdio-mode-when-using-dma.patch