diff options
Diffstat (limited to 'target/linux/sunxi/patches-4.1/140-mmc-sdio-reliability-fix.patch')
-rw-r--r-- | target/linux/sunxi/patches-4.1/140-mmc-sdio-reliability-fix.patch | 86 |
1 files changed, 0 insertions, 86 deletions
diff --git a/target/linux/sunxi/patches-4.1/140-mmc-sdio-reliability-fix.patch b/target/linux/sunxi/patches-4.1/140-mmc-sdio-reliability-fix.patch deleted file mode 100644 index 76bc222..0000000 --- a/target/linux/sunxi/patches-4.1/140-mmc-sdio-reliability-fix.patch +++ /dev/null @@ -1,86 +0,0 @@ -From 8a7013f47196abed7e6a40e93d1de1639cd46228 Mon Sep 17 00:00:00 2001 -From: Hans de Goede <hdegoede@redhat.com> -Date: Fri, 10 Jul 2015 17:03:03 +0200 -Subject: [PATCH] mmc: sunxi: Don't start commands while the card is busy - -Some sdio wifi modules have not been working reliable with the sunxi-mmc -host code. This turns out to be caused by it starting new commands while -the card signals that it is still busy processing a previous command. - -This commit fixes this, thereby fixing the wifi reliability issues on -the Cubietruck and other sunxi boards using sdio wifi. - -Reported-by: Eugene K <sigintmailru@gmail.com> -Suggested-by: Eugene K <sigintmailru@gmail.com> -Cc: Eugene K <sigintmailru@gmail.com> -Cc: Arend van Spriel <arend@broadcom.com> -Signed-off-by: Hans de Goede <hdegoede@redhat.com> ---- -Changes in v2: --Properly accredit Eugene K for coming up with the fix for this ---- - drivers/mmc/host/sunxi-mmc.c | 32 ++++++++++++++++++++++++++++++++ - 1 file changed, 32 insertions(+) - ---- a/drivers/mmc/host/sunxi-mmc.c -+++ b/drivers/mmc/host/sunxi-mmc.c -@@ -289,6 +289,24 @@ static int sunxi_mmc_init_host(struct mm - return 0; - } - -+/* Wait for card to report ready before starting a new cmd */ -+static int sunxi_mmc_wait_card_ready(struct sunxi_mmc_host *host) -+{ -+ unsigned long expire = jiffies + msecs_to_jiffies(500); -+ u32 rval; -+ -+ do { -+ rval = mmc_readl(host, REG_STAS); -+ } while (time_before(jiffies, expire) && (rval & SDXC_CARD_DATA_BUSY)); -+ -+ if (rval & SDXC_CARD_DATA_BUSY) { -+ dev_err(mmc_dev(host->mmc), "Error R1 ready timeout\n"); -+ return -EIO; -+ } -+ -+ return 0; -+} -+ - static void sunxi_mmc_init_idma_des(struct sunxi_mmc_host *host, - struct mmc_data *data) - { -@@ -383,6 +401,8 @@ static void sunxi_mmc_send_manual_stop(s - u32 arg, cmd_val, ri; - unsigned long expire = jiffies + msecs_to_jiffies(1000); - -+ sunxi_mmc_wait_card_ready(host); -+ - cmd_val = SDXC_START | SDXC_RESP_EXPIRE | - SDXC_STOP_ABORT_CMD | SDXC_CHECK_RESPONSE_CRC; - -@@ -597,6 +617,11 @@ static int sunxi_mmc_oclk_onoff(struct s - { - unsigned long expire = jiffies + msecs_to_jiffies(250); - u32 rval; -+ int ret; -+ -+ ret = sunxi_mmc_wait_card_ready(host); -+ if (ret) -+ return ret; - - rval = mmc_readl(host, REG_CLKCR); - rval &= ~(SDXC_CARD_CLOCK_ON | SDXC_LOW_POWER_ON); -@@ -784,6 +809,13 @@ static void sunxi_mmc_request(struct mmc - mmc_request_done(mmc, mrq); - return; - } -+ -+ ret = sunxi_mmc_wait_card_ready(host); -+ if (ret) { -+ mrq->cmd->error = ret; -+ mmc_request_done(mmc, mrq); -+ return; -+ } - - if (data) { - ret = sunxi_mmc_map_dma(host, data); |