From: Addy Ke <addy.ke@rock-chips.com> To: robh+dt@kernel.org, pawel.moll@arm.com, mark.rutland@arm.com, ijc+devicetree@hellion.org.uk, galak@codeaurora.org, rdunlap@infradead.org, tgih.jun@samsung.com, jh80.chung@samsung.com, chris@printf.net, ulf.hansson@linaro.org, dinguyen@altera.com, heiko@sntech.de, olof@lixom.net, dianders@chromium.org, sonnyrao@chromium.org, amstan@chromium.org Cc: devicetree@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-mmc@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org, zhenfu.fang@rock-chips.com, cf@rock-chips.com, lintao@rock-chips.com, chenfen@rock-chips.com, zyf@rock-chips.com, xjq@rock-chips.com, huangtao@rock-chips.com, zyw@rock-chips.com, yzq@rock-chips.com, hj@rock-chips.com, kever.yang@rock-chips.com, zhangqing@rock-chips.com, hl@rock-chips.com, Addy Ke <addy.ke@rock-chips.com> Subject: [PATCH] mmc: dw_mmc: fix bug that cause 'Timeout sending command' Date: Thu, 5 Feb 2015 19:13:21 +0800 [thread overview] Message-ID: <1423134801-23219-1-git-send-email-addy.ke@rock-chips.com> (raw) Because of some uncertain factors, such as worse card or worse hardware, DAT[3:0](the data lines) may be pulled down by card, and mmc controller will be in busy state. This should not happend when mmc controller send command to update card clocks. If this happends, mci_send_cmd will be failed and we will get 'Timeout sending command', and then system will be blocked. To avoid this, we need reset mmc controller. Signed-off-by: Addy Ke <addy.ke@rock-chips.com> --- drivers/mmc/host/dw_mmc.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c index 4d2e3c2..b1d6dfb 100644 --- a/drivers/mmc/host/dw_mmc.c +++ b/drivers/mmc/host/dw_mmc.c @@ -100,6 +100,7 @@ struct idmac_desc { }; #endif /* CONFIG_MMC_DW_IDMAC */ +static int dw_mci_card_busy(struct mmc_host *mmc); static bool dw_mci_reset(struct dw_mci *host); static bool dw_mci_ctrl_reset(struct dw_mci *host, u32 reset); @@ -888,6 +889,26 @@ static void mci_send_cmd(struct dw_mci_slot *slot, u32 cmd, u32 arg) cmd, arg, cmd_status); } +static void dw_mci_wait_busy(struct dw_mci_slot *slot) +{ + struct dw_mci *host = slot->host; + unsigned long timeout = jiffies + msecs_to_jiffies(500); + + while (time_before(jiffies, timeout)) { + if (!dw_mci_card_busy(slot->mmc)) + return; + } + dev_err(host->dev, "Data busy (status %#x)\n", + mci_readl(slot->host, STATUS)); + + /* + * Data busy, this should not happend when mmc controller send command + * to update card clocks in non-volt-switch state. If it happends, we + * should reset controller to avoid getting "Timeout sending command". + */ + dw_mci_ctrl_reset(host, SDMMC_CTRL_ALL_RESET_FLAGS); +} + static void dw_mci_setup_bus(struct dw_mci_slot *slot, bool force_clkinit) { struct dw_mci *host = slot->host; @@ -899,6 +920,8 @@ static void dw_mci_setup_bus(struct dw_mci_slot *slot, bool force_clkinit) /* We must continue to set bit 28 in CMD until the change is complete */ if (host->state == STATE_WAITING_CMD11_DONE) sdmmc_cmd_bits |= SDMMC_CMD_VOLT_SWITCH; + else + dw_mci_wait_busy(slot); if (!clock) { mci_writel(host, CLKENA, 0); -- 1.8.3.2
WARNING: multiple messages have this Message-ID (diff)
From: addy.ke@rock-chips.com (Addy Ke) To: linux-arm-kernel@lists.infradead.org Subject: [PATCH] mmc: dw_mmc: fix bug that cause 'Timeout sending command' Date: Thu, 5 Feb 2015 19:13:21 +0800 [thread overview] Message-ID: <1423134801-23219-1-git-send-email-addy.ke@rock-chips.com> (raw) Because of some uncertain factors, such as worse card or worse hardware, DAT[3:0](the data lines) may be pulled down by card, and mmc controller will be in busy state. This should not happend when mmc controller send command to update card clocks. If this happends, mci_send_cmd will be failed and we will get 'Timeout sending command', and then system will be blocked. To avoid this, we need reset mmc controller. Signed-off-by: Addy Ke <addy.ke@rock-chips.com> --- drivers/mmc/host/dw_mmc.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c index 4d2e3c2..b1d6dfb 100644 --- a/drivers/mmc/host/dw_mmc.c +++ b/drivers/mmc/host/dw_mmc.c @@ -100,6 +100,7 @@ struct idmac_desc { }; #endif /* CONFIG_MMC_DW_IDMAC */ +static int dw_mci_card_busy(struct mmc_host *mmc); static bool dw_mci_reset(struct dw_mci *host); static bool dw_mci_ctrl_reset(struct dw_mci *host, u32 reset); @@ -888,6 +889,26 @@ static void mci_send_cmd(struct dw_mci_slot *slot, u32 cmd, u32 arg) cmd, arg, cmd_status); } +static void dw_mci_wait_busy(struct dw_mci_slot *slot) +{ + struct dw_mci *host = slot->host; + unsigned long timeout = jiffies + msecs_to_jiffies(500); + + while (time_before(jiffies, timeout)) { + if (!dw_mci_card_busy(slot->mmc)) + return; + } + dev_err(host->dev, "Data busy (status %#x)\n", + mci_readl(slot->host, STATUS)); + + /* + * Data busy, this should not happend when mmc controller send command + * to update card clocks in non-volt-switch state. If it happends, we + * should reset controller to avoid getting "Timeout sending command". + */ + dw_mci_ctrl_reset(host, SDMMC_CTRL_ALL_RESET_FLAGS); +} + static void dw_mci_setup_bus(struct dw_mci_slot *slot, bool force_clkinit) { struct dw_mci *host = slot->host; @@ -899,6 +920,8 @@ static void dw_mci_setup_bus(struct dw_mci_slot *slot, bool force_clkinit) /* We must continue to set bit 28 in CMD until the change is complete */ if (host->state == STATE_WAITING_CMD11_DONE) sdmmc_cmd_bits |= SDMMC_CMD_VOLT_SWITCH; + else + dw_mci_wait_busy(slot); if (!clock) { mci_writel(host, CLKENA, 0); -- 1.8.3.2
next reply other threads:[~2015-02-05 11:15 UTC|newest] Thread overview: 93+ messages / expand[flat|nested] mbox.gz Atom feed top 2015-02-05 11:13 Addy Ke [this message] 2015-02-05 11:13 ` [PATCH] mmc: dw_mmc: fix bug that cause 'Timeout sending command' Addy Ke 2015-02-09 4:48 ` Ulf Hansson 2015-02-09 4:51 ` Ulf Hansson 2015-02-09 4:51 ` Ulf Hansson 2015-02-09 4:51 ` Ulf Hansson 2015-02-09 6:56 ` Addy 2015-02-09 6:56 ` Addy 2015-02-09 6:56 ` Addy 2015-02-09 7:04 ` Jaehoon Chung 2015-02-09 7:04 ` Jaehoon Chung 2015-02-09 7:04 ` Jaehoon Chung 2015-02-09 9:17 ` addy ke 2015-02-09 9:17 ` addy ke 2015-02-09 9:17 ` addy ke 2015-02-09 7:25 ` [PATCH v2 0/2] about data busy Addy Ke 2015-02-09 7:25 ` Addy Ke 2015-02-09 7:25 ` Addy Ke 2015-02-09 7:25 ` [PATCH v2 1/2] mmc: dw_mmc: fix bug that cause 'Timeout sending command' Addy Ke 2015-02-09 7:25 ` Addy Ke 2015-02-09 10:01 ` Jaehoon Chung 2015-02-09 10:01 ` Jaehoon Chung 2015-02-11 3:07 ` Addy 2015-02-11 3:07 ` Addy 2015-02-10 15:22 ` Alim Akhtar 2015-02-10 15:22 ` Alim Akhtar 2015-02-10 15:22 ` Alim Akhtar 2015-02-11 2:57 ` Addy 2015-02-11 2:57 ` Addy 2015-02-11 2:57 ` Addy 2015-02-11 3:25 ` Ulf Hansson 2015-02-11 3:46 ` Jaehoon Chung 2015-02-11 3:52 ` Ulf Hansson 2015-02-11 11:58 ` Andrzej Hajda 2015-02-11 23:20 ` Alim Akhtar 2015-02-11 23:20 ` Alim Akhtar 2015-02-12 2:28 ` addy ke 2015-02-12 11:10 ` Andrzej Hajda 2015-02-12 13:59 ` Alim Akhtar 2015-02-12 13:59 ` Alim Akhtar 2015-02-13 8:15 ` addy ke 2015-02-12 11:13 ` Andrzej Hajda 2015-02-12 11:13 ` Andrzej Hajda 2015-02-12 13:53 ` Alim Akhtar 2015-02-12 13:53 ` Alim Akhtar 2015-02-09 7:25 ` [PATCH v2 2/2] mmc: dw_mmc: Don't start command while data busy Addy Ke 2015-02-09 7:25 ` Addy Ke 2015-02-13 11:52 ` [PATCH v3 0/3] about " Addy Ke 2015-02-13 11:52 ` Addy Ke 2015-02-13 11:52 ` [PATCH v3 1/3] mmc: dw_mmc: update clock after host reach a stable voltage Addy Ke 2015-02-13 11:52 ` Addy Ke 2015-02-13 11:52 ` [PATCH v3 2/3] mmc: dw_mmc: fix bug that cause 'Timeout sending command' Addy Ke 2015-02-13 11:52 ` Addy Ke 2015-02-13 11:52 ` [PATCH v3 3/3] mmc: dw_mmc: Don't start command while data busy Addy Ke 2015-02-13 11:52 ` Addy Ke 2015-02-14 6:17 ` [PATCH v4 0/3] about " Addy Ke 2015-02-14 6:17 ` Addy Ke 2015-02-14 6:17 ` [PATCH v4 1/3] mmc: dw_mmc: update clock after host reach a stable voltage Addy Ke 2015-02-14 6:17 ` Addy Ke 2015-02-15 23:28 ` Alim Akhtar 2015-02-15 23:28 ` Alim Akhtar 2015-02-19 10:30 ` addy ke 2015-02-19 10:30 ` addy ke 2015-02-19 23:49 ` Doug Anderson 2015-02-19 23:49 ` Doug Anderson 2015-02-20 0:02 ` Russell King - ARM Linux 2015-02-20 0:02 ` Russell King - ARM Linux 2015-02-20 1:04 ` Doug Anderson 2015-02-20 1:04 ` Doug Anderson 2015-02-20 19:05 ` Doug Anderson 2015-02-20 19:05 ` Doug Anderson 2015-02-25 7:52 ` Alim Akhtar 2015-02-25 7:52 ` Alim Akhtar 2015-02-25 9:56 ` Jaehoon Chung 2015-02-25 9:56 ` Jaehoon Chung 2015-02-25 21:05 ` Doug Anderson 2015-02-25 21:05 ` Doug Anderson 2015-02-14 6:17 ` [PATCH v4 2/3] mmc: dw_mmc: fix bug that cause 'Timeout sending command' Addy Ke 2015-02-14 6:17 ` Addy Ke 2015-02-14 6:17 ` [PATCH v4 3/3] mmc: dw_mmc: Don't start command while data busy Addy Ke 2015-02-14 6:17 ` Addy Ke 2015-02-20 0:21 ` Doug Anderson 2015-02-20 0:21 ` Doug Anderson 2015-02-15 11:41 ` [PATCH v4 0/3] about " Javier Martinez Canillas 2015-02-15 11:41 ` Javier Martinez Canillas 2015-02-16 5:48 ` Jaehoon Chung 2015-02-16 5:48 ` Jaehoon Chung 2015-02-16 11:09 ` Javier Martinez Canillas 2015-02-16 11:09 ` Javier Martinez Canillas 2015-02-19 10:55 ` addy ke 2015-02-19 10:55 ` addy ke 2015-02-20 19:03 ` Doug Anderson 2015-02-20 19:03 ` Doug Anderson
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=1423134801-23219-1-git-send-email-addy.ke@rock-chips.com \ --to=addy.ke@rock-chips.com \ --cc=amstan@chromium.org \ --cc=cf@rock-chips.com \ --cc=chenfen@rock-chips.com \ --cc=chris@printf.net \ --cc=devicetree@vger.kernel.org \ --cc=dianders@chromium.org \ --cc=dinguyen@altera.com \ --cc=galak@codeaurora.org \ --cc=heiko@sntech.de \ --cc=hj@rock-chips.com \ --cc=hl@rock-chips.com \ --cc=huangtao@rock-chips.com \ --cc=ijc+devicetree@hellion.org.uk \ --cc=jh80.chung@samsung.com \ --cc=kever.yang@rock-chips.com \ --cc=lintao@rock-chips.com \ --cc=linux-arm-kernel@lists.infradead.org \ --cc=linux-doc@vger.kernel.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-mmc@vger.kernel.org \ --cc=linux-rockchip@lists.infradead.org \ --cc=mark.rutland@arm.com \ --cc=olof@lixom.net \ --cc=pawel.moll@arm.com \ --cc=rdunlap@infradead.org \ --cc=robh+dt@kernel.org \ --cc=sonnyrao@chromium.org \ --cc=tgih.jun@samsung.com \ --cc=ulf.hansson@linaro.org \ --cc=xjq@rock-chips.com \ --cc=yzq@rock-chips.com \ --cc=zhangqing@rock-chips.com \ --cc=zhenfu.fang@rock-chips.com \ --cc=zyf@rock-chips.com \ --cc=zyw@rock-chips.com \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.