openwrtv4/target/linux/brcm2708/patches-4.4/0497-bcm2835-sdhost-Don-t-exit-cmd-wait-loop-on-error.patch
Álvaro Fernández Rojas 2b1c6b21b5 brcm2708: update linux 4.4 patches to latest version
As usual these patches were extracted and rebased from the raspberry pi repo:
https://github.com/raspberrypi/linux/tree/rpi-4.4.y

Also adds support for Raspberry Pi Compute Module 3 (untested).

Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
2016-09-10 14:54:26 +02:00

63 lines
2.1 KiB
Diff

From 0ca1a9040cff3ace3d7fce5cdd83f1cbaa8da50c Mon Sep 17 00:00:00 2001
From: Phil Elwell <phil@raspberrypi.org>
Date: Fri, 2 Sep 2016 17:21:42 +0100
Subject: [PATCH] bcm2835-sdhost: Don't exit cmd wait loop on error
The FAIL flag can be set in the CMD register before command processing
is complete, leading to spurious "failed to complete" errors. This has
the effect of promoting harmless CRC7 errors during CMD1 processing
into errors that can delay and even prevent booting.
Also:
1) Convert the last KERN_ERROR message in the register dumping to
KERN_INFO.
2) Remove an unnecessary reset call from bcm2835_sdhost_add_host.
See: https://github.com/raspberrypi/linux/pull/1492
Signed-off-by: Phil Elwell <phil@raspberrypi.org>
---
drivers/mmc/host/bcm2835-sdhost.c | 10 +++-------
1 file changed, 3 insertions(+), 7 deletions(-)
--- a/drivers/mmc/host/bcm2835-sdhost.c
+++ b/drivers/mmc/host/bcm2835-sdhost.c
@@ -373,7 +373,7 @@ static void bcm2835_sdhost_dumpregs(stru
pr_info("%s: SDRSP2 0x%08x\n",
mmc_hostname(host->mmc),
bcm2835_sdhost_read(host, SDRSP2));
- pr_err("%s: SDRSP3 0x%08x\n",
+ pr_info("%s: SDRSP3 0x%08x\n",
mmc_hostname(host->mmc),
bcm2835_sdhost_read(host, SDRSP3));
pr_info("%s: SDHSTS 0x%08x\n",
@@ -1183,9 +1183,8 @@ static void bcm2835_sdhost_finish_comman
retries = 1; // We've already waited long enough this time
}
- retries = host->cmd_quick_poll_retries;
for (sdcmd = bcm2835_sdhost_read(host, SDCMD);
- (sdcmd & SDCMD_NEW_FLAG) && !(sdcmd & SDCMD_FAIL_FLAG) && retries;
+ (sdcmd & SDCMD_NEW_FLAG) && retries;
retries--) {
cpu_relax();
sdcmd = bcm2835_sdhost_read(host, SDCMD);
@@ -1208,8 +1207,7 @@ static void bcm2835_sdhost_finish_comman
usleep_range(1, 10);
spin_lock_irqsave(&host->lock, *irq_flags);
sdcmd = bcm2835_sdhost_read(host, SDCMD);
- if (!(sdcmd & SDCMD_NEW_FLAG) ||
- (sdcmd & SDCMD_FAIL_FLAG))
+ if (!(sdcmd & SDCMD_NEW_FLAG))
break;
}
}
@@ -1892,8 +1890,6 @@ int bcm2835_sdhost_add_host(struct bcm28
mmc = host->mmc;
- bcm2835_sdhost_reset_internal(host);
-
mmc->f_max = host->max_clk;
mmc->f_min = host->max_clk / SDCDIV_MAX_CDIV;