From patchwork Wed Nov 16 05:04:42 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kiwoong Kim X-Patchwork-Id: 9430893 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 216766047D for ; Wed, 16 Nov 2016 05:04:46 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 116922877C for ; Wed, 16 Nov 2016 05:04:46 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 0138728DEA; Wed, 16 Nov 2016 05:04:45 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.9 required=2.0 tests=BAYES_00,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 5A9CC2877C for ; Wed, 16 Nov 2016 05:04:45 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1750778AbcKPFEo convert rfc822-to-8bit (ORCPT ); Wed, 16 Nov 2016 00:04:44 -0500 Received: from mailout4.samsung.com ([203.254.224.34]:43752 "EHLO mailout4.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750697AbcKPFEo (ORCPT ); Wed, 16 Nov 2016 00:04:44 -0500 Received: from epcpsbgm2new.samsung.com (epcpsbgm2 [203.254.230.27]) by mailout4.samsung.com (Oracle Communications Messaging Server 7.0.5.31.0 64bit (built May 5 2014)) with ESMTP id <0OGP0225UY3P7T80@mailout4.samsung.com> for linux-scsi@vger.kernel.org; Wed, 16 Nov 2016 14:04:42 +0900 (KST) X-AuditID: cbfee61b-f796f6d000004092-a4-582be8eab77a Received: from epmmp1.local.host ( [203.254.227.16]) by epcpsbgm2new.samsung.com (EPCPMTA) with SMTP id 88.4D.16530.AE8EB285; Wed, 16 Nov 2016 14:04:42 +0900 (KST) Received: from DOKWMADKIM02 ([12.36.166.218]) by mmp1.samsung.com (Oracle Communications Messaging Server 7.0.5.31.0 64bit (built May 5 2014)) with ESMTPA id <0OGP009DHY3UEJ90@mmp1.samsung.com>; Wed, 16 Nov 2016 14:04:42 +0900 (KST) From: Kiwoong Kim To: linux-scsi@vger.kernel.org Cc: cpgs@samsung.com, HeonGwang Chu Subject: [PATCH v3] ufs: introduce UFSHCD_QUIRK_BROKEN_HCE quirk Date: Wed, 16 Nov 2016 14:04:42 +0900 Message-id: <000501d23fc6$f0dfa9b0$d29efd10$@samsung.com> MIME-version: 1.0 Content-type: text/plain; charset=UTF-8 Content-transfer-encoding: 8BIT X-Mailer: Microsoft Outlook 15.0 Thread-index: AdI/xrzmHOkXOUyjTpiGDSlx0gk1Eg== Content-language: ko X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFprLIsWRmVeSWpSXmKPExsVy+t9jAd1XL7QjDK4tULB4eUjTYvaFJkaL 7us72ByYPfq2rGL0+LxJLoApys0mIzUxJbVIITUvOT8lMy/dVik0xE3XQkkhLzE31VYpQtc3 JEhJoSwxpxTIMzJAAw7OAe7BSvp2CW4ZK390Mhc0SFYsbpvH1MC4UKSLkZNDQsBE4vCy2WwQ tpjEhXvrgWwuDiGBpYwSVx7eZIVw3jNKvHj9nxGkik1AU+LpzalMILaIgJzE5uVfWUBsZgEL iZ9rX4BNEhZwkGj48hksziKgKnHj2VewXl4BS4mXD1cyQ9iCEj8m34PqVZeYNG8RM4StLfHk 3QVWiIsUJHZ/OsoKsUtP4vGj14wQNSIS+168Y5zAKDALyahZSEbNQjJqFpKWBYwsqxglUguS C4qT0nON8lLL9YoTc4tL89L1kvNzNzGCo+aZ9A7Gw7vcDzEKcDAq8fAuUNeOEGJNLCuuzD3E KMHBrCTC++8uUIg3JbGyKrUoP76oNCe1+BCjKdCzE5mlRJPzgRGdVxJvaGJuYm5sYGFuaWli pCTO2zj7WbiQQHpiSWp2ampBahFMHxMHp1QDo+3W4hVhORq2/y6pyhdeNU7+Wlj/cX5694Wa 2pinoWf/6gpolbDb+hz6ZK26L7Bpd0ff7+vTrE/+Ndik05L0+uOU2c9bmIOsl+roLKqZl3lL 95C/tLsgc/jENIO8FWd6lx+3dXfsu7tqu2/uNMt8lYptWgxpjgm+3VZLp1+7UFtZvnL3k+9n lFiKMxINtZiLihMBDcq4NbACAAA= X-MTR: 20000000000000000@CPGS Sender: linux-scsi-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-scsi@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Some UFS host controllers might not be able to reset UIC by setting HCE to 1. Those controllers should invoke 'DME reset' and 'DME enable' in order instead. Signed-off-by: Kiwoong Kim Reviewed-by: Subhash Jadavani --- drivers/scsi/ufs/ufshcd.c | 44 +++++++++++++++++++++++++++++++++++++++++++- drivers/scsi/ufs/ufshcd.h | 7 +++++++ 2 files changed, 50 insertions(+), 1 deletion(-) diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c index c9cf011..8aac98f 100644 --- a/drivers/scsi/ufs/ufshcd.c +++ b/drivers/scsi/ufs/ufshcd.c @@ -2477,6 +2477,37 @@ static inline void ufshcd_add_delay_before_dme_cmd(struct ufs_hba *hba) usleep_range(min_sleep_time_us, min_sleep_time_us + 50); } +static int ufshcd_dme_reset(struct ufs_hba *hba) +{ + struct uic_command uic_cmd = {0}; + int ret; + + uic_cmd.command = UIC_CMD_DME_RESET; + uic_cmd.argument1 = 0x1; + + ret = ufshcd_send_uic_cmd(hba, &uic_cmd); + if (ret) + dev_err(hba->dev, + "dme-reset: error code %d\n", ret); + + return ret; +} + +static int ufshcd_dme_enable(struct ufs_hba *hba) +{ + struct uic_command uic_cmd = {0}; + int ret; + + uic_cmd.command = UIC_CMD_DME_ENABLE; + + ret = ufshcd_send_uic_cmd(hba, &uic_cmd); + if (ret) + dev_err(hba->dev, + "dme-enable: error code %d\n", ret); + + return ret; +} + /** * ufshcd_dme_set_attr - UIC command for DME_SET, DME_PEER_SET * @hba: per adapter instance @@ -3084,6 +3115,7 @@ static inline void ufshcd_hba_stop(struct ufs_hba *hba, bool can_sleep) static int ufshcd_hba_enable(struct ufs_hba *hba) { int retry; + int ret = 0; /* * msleep of 1 and 5 used in this function might result in msleep(20), @@ -3100,6 +3132,9 @@ static int ufshcd_hba_enable(struct ufs_hba *hba) ufshcd_vops_hce_enable_notify(hba, PRE_CHANGE); + if (hba->quirks & UFSHCD_QUIRK_BROKEN_HCE) + goto use_dme; + /* start controller initialization sequence */ ufshcd_hba_start(hba); @@ -3128,12 +3163,19 @@ static int ufshcd_hba_enable(struct ufs_hba *hba) msleep(5); } +use_dme: /* enable UIC related interrupts */ ufshcd_enable_intr(hba, UFSHCD_UIC_MASK); + if (hba->quirks & UFSHCD_QUIRK_BROKEN_HCE) { + ret = ufshcd_dme_reset(hba); + if (!ret) + ret = ufshcd_dme_enable(hba); + } + ufshcd_vops_hce_enable_notify(hba, POST_CHANGE); - return 0; + return ret; } static int ufshcd_disable_tx_lcc(struct ufs_hba *hba, bool peer) diff --git a/drivers/scsi/ufs/ufshcd.h b/drivers/scsi/ufs/ufshcd.h index 9838598..dfa17ac 100644 --- a/drivers/scsi/ufs/ufshcd.h +++ b/drivers/scsi/ufs/ufshcd.h @@ -498,6 +498,13 @@ struct ufs_hba { */ #define UFSHCD_QUIRK_BROKEN_REQ_LIST_CLR UFS_BIT(8) + /* + * This quirk needs to be enabled if the host contoller can't reset + * UIC by setting HCE to 1. Those controllers should invoke + * DME reset and DME enable in order. + */ + #define UFSHCD_QUIRK_BROKEN_HCE UFS_BIT(9) + unsigned int quirks; /* Deviations from standard UFSHCI spec. */ /* Device deviations from standard UFS device spec. */