aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/brcm2708/patches-3.10/0038-Lazy-CRC-quirk-Implemented-retrying-mechanisms-for-S.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/brcm2708/patches-3.10/0038-Lazy-CRC-quirk-Implemented-retrying-mechanisms-for-S.patch')
-rw-r--r--target/linux/brcm2708/patches-3.10/0038-Lazy-CRC-quirk-Implemented-retrying-mechanisms-for-S.patch234
1 files changed, 0 insertions, 234 deletions
diff --git a/target/linux/brcm2708/patches-3.10/0038-Lazy-CRC-quirk-Implemented-retrying-mechanisms-for-S.patch b/target/linux/brcm2708/patches-3.10/0038-Lazy-CRC-quirk-Implemented-retrying-mechanisms-for-S.patch
deleted file mode 100644
index 7f660f4275..0000000000
--- a/target/linux/brcm2708/patches-3.10/0038-Lazy-CRC-quirk-Implemented-retrying-mechanisms-for-S.patch
+++ /dev/null
@@ -1,234 +0,0 @@
-From d94e2bd60b27f2ff7d6e9ff7ee43848bb2090c06 Mon Sep 17 00:00:00 2001
-From: dero <de@ro>
-Date: Mon, 19 Nov 2012 12:46:06 +0100
-Subject: [PATCH 038/196] Lazy CRC quirk: Implemented retrying mechanisms for
- SD SSR and SCR, disabled missing_status and spurious CRC ACMD51 quirks by
- default (should be fixed by the retrying-mechanishm)
-
----
- drivers/mmc/core/sd.c | 115 +++++++++++++++++++++++++++++++++------
- drivers/mmc/host/sdhci-bcm2708.c | 11 +++-
- 2 files changed, 108 insertions(+), 18 deletions(-)
-
-diff --git a/drivers/mmc/core/sd.c b/drivers/mmc/core/sd.c
-index 9e645e1..1ee6cf3 100644
---- a/drivers/mmc/core/sd.c
-+++ b/drivers/mmc/core/sd.c
-@@ -13,6 +13,8 @@
- #include <linux/err.h>
- #include <linux/slab.h>
- #include <linux/stat.h>
-+#include <linux/jiffies.h>
-+#include <linux/nmi.h>
-
- #include <linux/mmc/host.h>
- #include <linux/mmc/card.h>
-@@ -58,6 +60,15 @@ static const unsigned int tacc_mant[] = {
- __res & __mask; \
- })
-
-+// timeout for tries
-+static const unsigned long retry_timeout_ms= 10*1000;
-+
-+// try at least 10 times, even if timeout is reached
-+static const int retry_min_tries= 10;
-+
-+// delay between tries
-+static const unsigned long retry_delay_ms= 10;
-+
- /*
- * Given the decoded CSD structure, decode the raw CID to our CID structure.
- */
-@@ -210,12 +221,62 @@ static int mmc_decode_scr(struct mmc_card *card)
- }
-
- /*
-- * Fetch and process SD Status register.
-+ * Fetch and process SD Configuration Register.
-+ */
-+static int mmc_read_scr(struct mmc_card *card)
-+{
-+ unsigned long timeout_at;
-+ int err, tries;
-+
-+ timeout_at= jiffies + msecs_to_jiffies( retry_timeout_ms );
-+ tries= 0;
-+
-+ while( tries < retry_min_tries || time_before( jiffies, timeout_at ) )
-+ {
-+ unsigned long delay_at;
-+ tries++;
-+
-+ err = mmc_app_send_scr(card, card->raw_scr);
-+ if( !err )
-+ break; // sucess!!!
-+
-+ touch_nmi_watchdog(); // we are still alive!
-+
-+ // delay
-+ delay_at= jiffies + msecs_to_jiffies( retry_delay_ms );
-+ while( time_before( jiffies, delay_at ) )
-+ {
-+ mdelay( 1 );
-+ touch_nmi_watchdog(); // we are still alive!
-+ }
-+ }
-+
-+ if( err)
-+ {
-+ pr_err("%s: failed to read SD Configuration register (SCR) after %d tries during %lu ms, error %d\n", mmc_hostname(card->host), tries, retry_timeout_ms, err );
-+ return err;
-+ }
-+
-+ if( tries > 1 )
-+ {
-+ pr_info("%s: could read SD Configuration register (SCR) at the %dth attempt\n", mmc_hostname(card->host), tries );
-+ }
-+
-+ err = mmc_decode_scr(card);
-+ if (err)
-+ return err;
-+
-+ return err;
-+}
-+
-+/*
-+ * Fetch and process SD Status Register.
- */
- static int mmc_read_ssr(struct mmc_card *card)
- {
-+ unsigned long timeout_at;
- unsigned int au, es, et, eo;
-- int err, i;
-+ int err, i, tries;
- u32 *ssr;
-
- if (!(card->csd.cmdclass & CCC_APP_SPEC)) {
-@@ -227,15 +288,41 @@ static int mmc_read_ssr(struct mmc_card *card)
- ssr = kmalloc(64, GFP_KERNEL);
- if (!ssr)
- return -ENOMEM;
--
-- err = mmc_app_sd_status(card, ssr);
-- if (err) {
-- pr_warning("%s: problem reading SD Status "
-- "register.\n", mmc_hostname(card->host));
-- err = 0;
-+
-+ timeout_at= jiffies + msecs_to_jiffies( retry_timeout_ms );
-+ tries= 0;
-+
-+ while( tries < retry_min_tries || time_before( jiffies, timeout_at ) )
-+ {
-+ unsigned long delay_at;
-+ tries++;
-+
-+ err= mmc_app_sd_status(card, ssr);
-+ if( !err )
-+ break; // sucess!!!
-+
-+ touch_nmi_watchdog(); // we are still alive!
-+
-+ // delay
-+ delay_at= jiffies + msecs_to_jiffies( retry_delay_ms );
-+ while( time_before( jiffies, delay_at ) )
-+ {
-+ mdelay( 1 );
-+ touch_nmi_watchdog(); // we are still alive!
-+ }
-+ }
-+
-+ if( err)
-+ {
-+ pr_err("%s: failed to read SD Status register (SSR) after %d tries during %lu ms, error %d\n", mmc_hostname(card->host), tries, retry_timeout_ms, err );
- goto out;
- }
-
-+ if( tries > 1 )
-+ {
-+ pr_info("%s: could read SD Status register (SSR) at the %dth attempt\n", mmc_hostname(card->host), tries );
-+ }
-+
- for (i = 0; i < 16; i++)
- ssr[i] = be32_to_cpu(ssr[i]);
-
-@@ -808,15 +895,11 @@ int mmc_sd_setup_card(struct mmc_host *host, struct mmc_card *card,
-
- if (!reinit) {
- /*
-- * Fetch SCR from card.
-+ * Fetch and decode SD Configuration register.
- */
-- err = mmc_app_send_scr(card, card->raw_scr);
-- if (err)
-- return err;
--
-- err = mmc_decode_scr(card);
-- if (err)
-- return err;
-+ err = mmc_read_scr(card);
-+ if( err )
-+ return err;
-
- /*
- * Fetch and process SD Status register.
-diff --git a/drivers/mmc/host/sdhci-bcm2708.c b/drivers/mmc/host/sdhci-bcm2708.c
-index ffd7310..3556ed3 100644
---- a/drivers/mmc/host/sdhci-bcm2708.c
-+++ b/drivers/mmc/host/sdhci-bcm2708.c
-@@ -137,6 +137,7 @@ static bool allow_highspeed = 1;
- static int emmc_clock_freq = BCM2708_EMMC_CLOCK_FREQ;
- static bool sync_after_dma = 1;
- static bool missing_status = 1;
-+static bool spurious_crc_acmd51 = 0;
- bool enable_llm = 1;
-
- #if 0
-@@ -1103,7 +1104,7 @@ static unsigned int sdhci_bcm2708_quirk_extra_ints(struct sdhci_host *host)
- return 1;
- }
-
--static unsigned int sdhci_bcm2708_quirk_spurious_crc(struct sdhci_host *host)
-+static unsigned int sdhci_bcm2708_quirk_spurious_crc_acmd51(struct sdhci_host *host)
- {
- return 1;
- }
-@@ -1149,7 +1150,6 @@ static struct sdhci_ops sdhci_bcm2708_ops = {
- .pdma_reset = sdhci_bcm2708_platdma_reset,
- #endif
- .extra_ints = sdhci_bcm2708_quirk_extra_ints,
-- .spurious_crc_acmd51 = sdhci_bcm2708_quirk_spurious_crc,
- .voltage_broken = sdhci_bcm2708_quirk_voltage_broken,
- .uhs_broken = sdhci_bcm2708_uhs_broken,
- };
-@@ -1194,6 +1194,11 @@ static int sdhci_bcm2708_probe(struct platform_device *pdev)
- sdhci_bcm2708_ops.missing_status = sdhci_bcm2708_missing_status;
- }
-
-+ if( spurious_crc_acmd51 ) {
-+ sdhci_bcm2708_ops.spurious_crc_acmd51 = sdhci_bcm2708_quirk_spurious_crc_acmd51;
-+ }
-+
-+
- printk("sdhci: %s low-latency mode\n",enable_llm?"Enable":"Disable");
-
- host->hw_name = "BCM2708_Arasan";
-@@ -1389,6 +1394,7 @@ module_param(allow_highspeed, bool, 0444);
- module_param(emmc_clock_freq, int, 0444);
- module_param(sync_after_dma, bool, 0444);
- module_param(missing_status, bool, 0444);
-+module_param(spurious_crc_acmd51, bool, 0444);
- module_param(enable_llm, bool, 0444);
- module_param(cycle_delay, int, 0444);
-
-@@ -1401,6 +1407,7 @@ MODULE_PARM_DESC(allow_highspeed, "Allow high speed transfers modes");
- MODULE_PARM_DESC(emmc_clock_freq, "Specify the speed of emmc clock");
- MODULE_PARM_DESC(sync_after_dma, "Block in driver until dma complete");
- MODULE_PARM_DESC(missing_status, "Use the missing status quirk");
-+MODULE_PARM_DESC(spurious_crc_acmd51, "Use the spurious crc quirk for reading SCR (ACMD51)");
- MODULE_PARM_DESC(enable_llm, "Enable low-latency mode");
-
-
---
-1.9.1
-