Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753717AbbHUJhn (ORCPT ); Fri, 21 Aug 2015 05:37:43 -0400 Received: from mailout4.samsung.com ([203.254.224.34]:37540 "EHLO mailout4.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753603AbbHUJhl (ORCPT ); Fri, 21 Aug 2015 05:37:41 -0400 X-AuditID: cbfee691-f79ca6d00000456a-f8-55d6f16309f7 From: Alim Akhtar To: linux-scsi@vger.kernel.org, linux-kernel@vger.kernel.org Cc: vinholikatti@gmail.com, JBottomley@odin.com, Seungwon Jeon Subject: [PATCH 03/10] scsi: ufs: add quirk to fix mishandling utrlclr/utmrlclr Date: Fri, 21 Aug 2015 14:57:54 +0530 Message-id: <1440149281-26336-4-git-send-email-alim.akhtar@samsung.com> X-Mailer: git-send-email 1.7.10.4 In-reply-to: <1440149281-26336-1-git-send-email-alim.akhtar@samsung.com> References: <1440149281-26336-1-git-send-email-alim.akhtar@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrJLMWRmVeSWpSXmKPExsWyRsSkWjf547VQg7uzjCz+r7/NYnF51xw2 i+7rO9gsPty/yGyxY2GVA6vHzll32T0O//jB7NG3ZRWjx+dNcgEsUVw2Kak5mWWpRfp2CVwZ v6dXFTQJV/SumMPcwPiVv4uRk0NCwETi7dl17BC2mMSFe+vZuhi5OIQEVjBKzFkyhxWmaOa2 c8wQiaWMEs93NrFAOD8ZJabO+gxWxSagLXF3+hYmEFtEwEbi/M0HYDazQLjEtQ2zgVZwcAgL +EucfmUBYrIIqEq8bTYAqeAVcJe49P0LC8QuRYnuZxPYQGxOAQ+Ju03zwOJCQDWXLx9jBVkr IdDMLnF91V+wBIuAgMS3yYdYQGZKCMhKbDrADDFHUuLgihssExiFFzAyrGIUTS1ILihOSi8y 1StOzC0uzUvXS87P3cQIDOHT/55N3MF4/4D1IUYBDkYlHt4ZkddChVgTy4orcw8xmgJtmMgs JZqcD4yUvJJ4Q2MzIwtTE1NjI3NLMyVxXh3pn8FCAumJJanZqakFqUXxRaU5qcWHGJk4OKUa GFnDJkXP3rzM6+rU/Uvnlnzy/ih1wnnRB63GZTt3+DS92iN00FB2Z++qbTVvd5Qddndmnnew oC1vz6Wqf2+9otbdFnxmv9u4YxX31In1Yk4b378L3BMt3bPg9bK1DtFv/wQF+1Yrex2Mn7B/ w4338s37F/RYh+++crz4a4f3KXvRIwyaz+RLDh9XYinOSDTUYi4qTgQACe+c9VwCAAA= X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFprGIsWRmVeSWpSXmKPExsVy+t9jAd3kj9dCDb5P0Lb4v/42i8XlXXPY LLqv72Cz+HD/IrPFjoVVDqweO2fdZfc4/OMHs0ffllWMHp83yQWwRDUw2mSkJqakFimk5iXn p2TmpdsqeQfHO8ebmhkY6hpaWpgrKeQl5qbaKrn4BOi6ZeYA7VVSKEvMKQUKBSQWFyvp22Ga EBripmsB0xih6xsSBNdjZIAGEtYwZvyeXlXQJFzRu2IOcwPjV/4uRk4OCQETiZnbzjFD2GIS F+6tZ+ti5OIQEljKKPF8ZxMLhPOTUWLqrM+sIFVsAtoSd6dvYQKxRQRsJM7ffABmMwuES1zb MJu9i5GDQ1jAX+L0KwsQk0VAVeJtswFIBa+Au8Sl719YIHYpSnQ/m8AGYnMKeEjcbZoHFhcC qrl8+RjrBEbeBYwMqxglUguSC4qT0nON8lLL9YoTc4tL89L1kvNzNzGC4+SZ9A7Gw7vcDzEK cDAq8fDOiLwWKsSaWFZcmXuIUYKDWUmE1/oFUIg3JbGyKrUoP76oNCe1+BCjKdBdE5mlRJPz gTGcVxJvaGxibmpsamliYWJmqSTOq2+yKVRIID2xJDU7NbUgtQimj4mDU6qB0YjRsc3w7vy5 hyzsWkMYj0Rc3B9/NebivSmtrtwiIvntSTH5jte6wpfPF3U5uYH50JKTqvoVqSW7jvo7v5oy o91/ydRZ4pJ9qz5N6lp1/1mOgs2NYPF3R746ll5ek/5St/DwH9Z/SX63fq38fu/ED8FL6VJz zFmeimVXefyUn7xnbpr1yZ7JhUosxRmJhlrMRcWJADdehWapAgAA 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: 2609 Lines: 75 From: Seungwon Jeon In the right behavior, setting the bit to '0' indicates clear and '1' indicates no change. If host contoller handles this the other way, UFSHCI_QUIRK_BROKEN_REQ_LIST_CLR can be used. Signed-off-by: Seungwon Jeon Signed-off-by: Alim Akhtar --- drivers/scsi/ufs/ufshcd.c | 20 ++++++++++++++++++-- drivers/scsi/ufs/ufshcd.h | 5 +++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c index f882bf0..b441a39 100644 --- a/drivers/scsi/ufs/ufshcd.c +++ b/drivers/scsi/ufs/ufshcd.c @@ -358,7 +358,23 @@ static inline void ufshcd_put_tm_slot(struct ufs_hba *hba, int slot) */ static inline void ufshcd_utrl_clear(struct ufs_hba *hba, u32 pos) { - ufshcd_writel(hba, ~(1 << pos), REG_UTP_TRANSFER_REQ_LIST_CLEAR); + if (hba->quirks & UFSHCI_QUIRK_BROKEN_REQ_LIST_CLR) + ufshcd_writel(hba, (1 << pos), REG_UTP_TRANSFER_REQ_LIST_CLEAR); + else + ufshcd_writel(hba, ~(1 << pos), REG_UTP_TRANSFER_REQ_LIST_CLEAR); +} + +/** + * ufshcd_utmrl_clear - Clear a bit in UTRMLCLR register + * @hba: per adapter instance + * @pos: position of the bit to be cleared + */ +static inline void ufshcd_utmrl_clear(struct ufs_hba *hba, u32 pos) +{ + if (hba->quirks & UFSHCI_QUIRK_BROKEN_REQ_LIST_CLR) + ufshcd_writel(hba, (1 << pos), REG_UTP_TASK_REQ_LIST_CLEAR); + else + ufshcd_writel(hba, ~(1 << pos), REG_UTP_TASK_REQ_LIST_CLEAR); } /** @@ -3691,7 +3707,7 @@ static int ufshcd_clear_tm_cmd(struct ufs_hba *hba, int tag) goto out; spin_lock_irqsave(hba->host->host_lock, flags); - ufshcd_writel(hba, ~(1 << tag), REG_UTP_TASK_REQ_LIST_CLEAR); + ufshcd_utmrl_clear(hba, tag); spin_unlock_irqrestore(hba->host->host_lock, flags); /* poll for max. 1 sec to clear door bell register by h/w */ diff --git a/drivers/scsi/ufs/ufshcd.h b/drivers/scsi/ufs/ufshcd.h index 1fa5ac1..24245c9 100644 --- a/drivers/scsi/ufs/ufshcd.h +++ b/drivers/scsi/ufs/ufshcd.h @@ -466,6 +466,11 @@ struct ufs_hba { */ #define UFSHCI_QUIRK_BROKEN_UTRD UFS_BIT(6) + /* + * Cleaer handling for transfer/task request list is just opposite. + */ + #define UFSHCI_QUIRK_BROKEN_REQ_LIST_CLR UFS_BIT(7) + unsigned int quirks; /* Deviations from standard UFSHCI spec. */ wait_queue_head_t tm_wq; -- 1.7.10.4 -- 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/