From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756190AbbJAIVa (ORCPT ); Thu, 1 Oct 2015 04:21:30 -0400 Received: from mailout4.samsung.com ([203.254.224.34]:46934 "EHLO mailout4.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752403AbbJAIV1 (ORCPT ); Thu, 1 Oct 2015 04:21:27 -0400 X-AuditID: cbfee691-f79d66d000001509-ce-560ced05dcee From: Alim Akhtar To: linux-scsi@vger.kernel.org, linux-kernel@vger.kernel.org Cc: JBottomley@odin.com, vinholikatti@gmail.com, amit.daniel@samsung.com, essuuj@gmail.com, devicetree@vger.kernel.org Subject: [PATCH v3 04/13] scsi: ufs: add quirk to fix mishandling utrlclr/utmrlclr Date: Thu, 01 Oct 2015 13:39:21 +0530 Message-id: <1443686970-28104-5-git-send-email-alim.akhtar@samsung.com> X-Mailer: git-send-email 1.7.10.4 In-reply-to: <1443686970-28104-1-git-send-email-alim.akhtar@samsung.com> References: <1443686970-28104-1-git-send-email-alim.akhtar@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFrrCLMWRmVeSWpSXmKPExsWyRsSkRpf1LU+Ywca9UhYNV0Ms5h85x2qx /MISJov/62+zWFzeNYfNovv6DjaLHQurHNg9ds66y+5x+McPZo++LasYPT5vkgtgieKySUnN ySxLLdK3S+DKeLPlGEtBq3DF/2vX2BoYP/N3MXJySAiYSJz6f5odwhaTuHBvPVsXIxeHkMAK Rollv1+zwxRdWX+DCSIxi1Hi9vLHzBDOT0aJBeufM4JUsQloS9ydvoUJxBYRsJE4f/MBmM0s UCFx68wEFhBbWCBE4srjf2BxFgFViRmHN4HZvALuErd+PoDapijR/WwC0BkcHJwCHhLfFoWC hIWASj7cXc4IsldCoJ9d4uKLY2wQcwQkvk0+xAJSLyEgK7HpADPEGEmJgytusExgFF7AyLCK UTS1ILmgOCm9yFSvODG3uDQvXS85P3cTIzCwT/97NnEH4/0D1ocYBTgYlXh4JdJ5woRYE8uK K3MPMZoCbZjILCWanA+Mn7ySeENjMyMLUxNTYyNzSzMlcV4d6Z/BQgLpiSWp2ampBalF8UWl OanFhxiZODilGhhjbaVaZTd9CJ+9tqbG6EtSrcjh9QeqNk4T7O1sbT4jMys387zv/DbTNdxl a87sCbY7ZKN6o3R37FLLLK8U++g9xqrlyk+PJfKFGy6N9PxumCr45ydXWYLxRfetNQ9SympX XWYtO5MjdX1f2yutO3sP80hkuOpsb9PuXWy1dH939I4t34JnMSqxFGckGmoxFxUnAgCTGmS0 ZwIAAA== X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrIIsWRmVeSWpSXmKPExsVy+t9jQV3WtzxhBhNPc1s0XA2xmH/kHKvF 8gtLmCz+r7/NYnF51xw2i+7rO9gsdiyscmD32DnrLrvH4R8/mD36tqxi9Pi8SS6AJaqB0SYj NTEltUghNS85PyUzL91WyTs43jne1MzAUNfQ0sJcSSEvMTfVVsnFJ0DXLTMH6AAlhbLEnFKg UEBicbGSvh2mCaEhbroWMI0Rur4hQXA9RgZoIGENY8abLcdYClqFK/5fu8bWwPiZv4uRk0NC wETiyvobTBC2mMSFe+vZuhi5OIQEZjFK3F7+mBnC+ckosWD9c0aQKjYBbYm707eAdYgI2Eic v/kAzGYWqJC4dWYCC4gtLBAiceXxP7A4i4CqxIzDm8BsXgF3iVs/H7BDbFOU6H42AWgbBwen gIfEt0WhIGEhoJIPd5czTmDkXcDIsIpRIrUguaA4KT3XMC+1XK84Mbe4NC9dLzk/dxMjOHqe Se1gPLjL/RCjAAejEg/vgRSeMCHWxLLiytxDjBIczEoivAfvAYV4UxIrq1KL8uOLSnNSiw8x mgLdNZFZSjQ5HxjZeSXxhsYm5qbGppYmFiZmlkrivDcOMYQJCaQnlqRmp6YWpBbB9DFxcEo1 MJbx7mx7+0z+2bqp+U4qRQKZl7Lbt0qnPpfSmF3N0HR60/s7/p3mbudfZXpEqdXX3BfdXSEl bvVmjcS7padZl8wVSPOcd/0L35vOkLQcGZWzsnOTnqa/Puj54W7ceQvNvbMuH3bgFnfdnHlF 6wzn/4Q1+ypYvvrJ3gn6HXjTf5bsYnY31S96O5VYijMSDbWYi4oTAaUsW/O0AgAA 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 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 | 21 +++++++++++++++++++-- drivers/scsi/ufs/ufshcd.h | 5 +++++ 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c index 90f76e7..d41d57d 100644 --- a/drivers/scsi/ufs/ufshcd.c +++ b/drivers/scsi/ufs/ufshcd.c @@ -358,7 +358,24 @@ 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 +3708,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 2f96abe..3702b92 100644 --- a/drivers/scsi/ufs/ufshcd.h +++ b/drivers/scsi/ufs/ufshcd.h @@ -466,6 +466,11 @@ struct ufs_hba { */ #define UFSHCI_QUIRK_BYTE_ALIGN_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