Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932573AbbBIKBM (ORCPT ); Mon, 9 Feb 2015 05:01:12 -0500 Received: from mailout1.samsung.com ([203.254.224.24]:22725 "EHLO mailout1.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932196AbbBIKBH (ORCPT ); Mon, 9 Feb 2015 05:01:07 -0500 X-AuditID: cbfee68f-f791c6d000004834-bf-54d885601091 Message-id: <54D88560.4050808@samsung.com> Date: Mon, 09 Feb 2015 19:01:04 +0900 From: Jaehoon Chung User-Agent: Mozilla/5.0 (X11; Linux i686; rv:31.0) Gecko/20100101 Thunderbird/31.3.0 MIME-version: 1.0 To: Addy Ke , 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, 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, djkurtz@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 Subject: Re: [PATCH v2 1/2] mmc: dw_mmc: fix bug that cause 'Timeout sending command' References: <1423134801-23219-1-git-send-email-addy.ke@rock-chips.com> <1423466726-20833-1-git-send-email-addy.ke@rock-chips.com> <1423466726-20833-2-git-send-email-addy.ke@rock-chips.com> In-reply-to: <1423466726-20833-2-git-send-email-addy.ke@rock-chips.com> Content-type: text/plain; charset=windows-1252 Content-transfer-encoding: 7bit X-Brightmail-Tracker: H4sIAAAAAAAAA02Sa0yTZxTH9/R539eXDrJnVeBZjZKQmShTtALuLDPGZIk+H5bMOSbGEFnB N9VwEVsgYBxjCwxlQQqaoB1QipUVQnEpRghaBYTUu1SUi2IhsBnkErksSMXZtWVGv53L//zO /yRHxIphXikeSsuQtGnqlHBBzjWsiD6yQV3QH7vJWoig1vNSBnljZTwUHB8XYOzsDR70Pc0I jJ33eLhb2y6A48E5DD+fMfJQMmniwTMywUPXxCMOFv68heFi9UsM98brEFwqdwtQMb0fbKO9 PJh+NXPQ01ohQKenBMHssAfD+T6nDG71zQmgL7dyMDVYzkGBvXMZ/HXnLILpIScGhzUOyqoV UNloFuBx6YBXPzmGIX9xVAbG4Ra8/VNWYNcLrKGqAbHf85wc6zlZLGN1f/wjsCZLBLPVnxDY YO8Vb2b+iT288QvP+sdNMvav4RrHTl6sR6y5twqzOdvqXR/tk289IKUcypK0G7f9ID9YcdPI pbtCsi9YJpblIZOiCAWIlETTgamHeCkOod2uC0IRkosKch7RZ7ONsrci83E7XmrUIPrCXcb5 Ggoygej1nj2+OIhEUIvjuXdAFDmyhvY5vvaVBbKeNs87/JxgsoeWDozyS/KP6cIpF+djriCF mLotfyNfgskkpiOPZzgfaDmJoyULmqXFbYi6Xr9CvukAspO2WPV+DSaRdMgZ4StjEkabGqb8 RimZDaBPWvP9RjlC6PypDr+eklXU1vb/xZ/Qdks/p0chhvc8Gd5RDe9RqxGuR8FSelK6LlGj jYrUqVN1mWmayKTDqTbkfbzbb56VtKCnbV92ICKi8MCg7rm+WAWvztLlpHagGK+JUqwMTjrs /dW0jARV1JbNEBMdE7X58y+2hIcGmZTu7xREo86QkiUpXdImaDNTJF0HkokByjy0RmN3jS62 14TFi8l7449qqrZ9qMpN1hcH1p0O3l3rtndVKpxdGofnidz8vLhVW5gYUtj6zVpVdcJi5lcf LKxmOaofBw1VRVuvrot+lMuzF9+PbUhsvHnbmB1XFDlzP+fc3Le88urKHYHXsnIss5/VHQtl 1jOX81uKu8Pe/NZuStWEc7qDalUE1urU/wGXkW4RcwMAAA== X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrFJsWRmVeSWpSXmKPExsVy+t9jAd2E1hshBsenGVos+/+dyaLhxSRW i9aOV2wWL2aeYLWYcHk7o8X8I+dYLc4uO8hmcfzSYmaLxhnzWS363yxktfj/6DWrxdHXV1ks fmw4xWyxZcF3Zotzr1YyWmyb/pPNYs6HOItNj6+xWixsW8JicXnXHDaLI//7GS0+PfjPbLH0 +kUmi1PXP7NZTJi+lsXi7Z3pLBate4+wWzw5M5PR4sP9i8wWx9eGW0xaIGQxd90SNotbE28C 1b95wWzR8vsxk8X8BzuYHVQ8WvdOYPNYM28No8fshossHpf7epk8Vi7/wuaxeYWWx6ZVnWwe d67tAfKW1HtcOdHE6nHj1UImj7+z9rN49G1Zxeix/do8Zo/Pm+QC+KMaGG0yUhNTUosUUvOS 81My89JtlbyD453jTc0MDHUNLS3MlRTyEnNTbZVcfAJ03TJzgKGopFCWmFMKFApILC5W0rfD NCE0xE3XAqYxQtc3JAiux8gADSSsYcyYc3I+S8E9sYr1K16zNzAuFOpi5OSQEDCRWNKxlxnC FpO4cG89WxcjF4eQwCJGifc/J7GAJIQEXjNKHL4cBmLzCmhJrDj+kqmLkYODRUBV4vpxH5Aw m4COxPZvx5lAbFGBMImJNx+zQpQLSvyYfI8FZKaIQDuzxM8VTxlBHGaBN8wSj259ZAEZJCwQ LtH/Ix1i8QFGiXt/fjGCdHMKuEvsWDsBrIZZQE/i/kUtkDCzgLzE5jVvmScwCsxCsmMWQtUs JFULGJlXMYqmFiQXFCel5xrpFSfmFpfmpesl5+duYgSn02fSOxhXNVgcYhTgYFTi4b3w+XqI EGtiWXFl7iFGCQ5mJRHe7xk3QoR4UxIrq1KL8uOLSnNSiw8xmgIDYCKzlGhyPjDV55XEGxqb mBlZGpkbWhgZmyuJ8yrZt4UICaQnlqRmp6YWpBbB9DFxcEo1MKbd3OLU9ZFj2+o474eryiw9 olk9Y6asWiQUqvjFS6k7b9dh3xemt1Vm5/0RXySW/cNuhczSpFPBb+Q29WqsSN+09tLsk66y C15cknyYbrLV9hhv2dbWqn1Owor7lbzC0v4dWZFjvHe2sMs3a6fkMyuecgS2rcqMrDrdyLal Y9cB1+9nGptOxSuxFGckGmoxFxUnAgBx6HE+vQMAAA== DLP-Filter: Pass X-MTR: 20000000000000000@CPGS X-CFilter-Loop: Reflected Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3069 Lines: 91 Hi, Addy. On 02/09/2015 04:25 PM, Addy Ke wrote: > 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 > --- > drivers/mmc/host/dw_mmc.c | 28 ++++++++++++++++++++++++++++ > 1 file changed, 28 insertions(+) > > diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c > index 4d2e3c2..b0b57e3 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,31 @@ 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); > + > + do { > + if (!dw_mci_card_busy(slot->mmc)) > + return; > + cpu_relax(); > + } while (time_before(jiffies, timeout)); > + > + 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); If reset is failed, then dw_mci_ctrl_reset should return "false". ret = dw_mci_ctrl_reset(); WARN_ON(!ret || dw_mci_card_busy(slot->mmc)); Is it right? In my experiment, if reset is failed or card is busy, eMMC can't work anymore..right? I think this patch is reasonable to prevent blocking issue. Best Regards, Jaehoon Chung > + > + /* Fail to reset controller or still data busy, WARN_ON! */ > + WARN_ON(dw_mci_card_busy(slot->mmc)); > +} > + > static void dw_mci_setup_bus(struct dw_mci_slot *slot, bool force_clkinit) > { > struct dw_mci *host = slot->host; > @@ -899,6 +925,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); > -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/