Commit 87183841 authored by Alim Akhtar's avatar Alim Akhtar Committed by Martin K. Petersen

scsi: ufs: Add quirk to fix mishandling utrlclr/utmrlclr

With the correct behavior, setting the bit to '0' indicates clear and '1'
indicates no change. If host controller handles this the other way around,
UFSHCI_QUIRK_BROKEN_REQ_LIST_CLR can be used.

Link: https://lore.kernel.org/r/20200528011658.71590-2-alim.akhtar@samsung.comReviewed-by: default avatarCan Guo <cang@codeaurora.org>
Reviewed-by: default avatarAvri Altman <avri.altman@wdc.com>
Signed-off-by: default avatarSeungwon Jeon <essuuj@gmail.com>
Signed-off-by: default avatarAlim Akhtar <alim.akhtar@samsung.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent b3a9e3b9
...@@ -672,7 +672,11 @@ static inline int ufshcd_get_tr_ocs(struct ufshcd_lrb *lrbp) ...@@ -672,7 +672,11 @@ static inline int ufshcd_get_tr_ocs(struct ufshcd_lrb *lrbp)
*/ */
static inline void ufshcd_utrl_clear(struct ufs_hba *hba, u32 pos) 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);
} }
/** /**
...@@ -682,7 +686,10 @@ static inline void ufshcd_utrl_clear(struct ufs_hba *hba, u32 pos) ...@@ -682,7 +686,10 @@ static inline void ufshcd_utrl_clear(struct ufs_hba *hba, u32 pos)
*/ */
static inline void ufshcd_utmrl_clear(struct ufs_hba *hba, u32 pos) static inline void ufshcd_utmrl_clear(struct ufs_hba *hba, u32 pos)
{ {
ufshcd_writel(hba, ~(1 << pos), REG_UTP_TASK_REQ_LIST_CLEAR); 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);
} }
/** /**
......
...@@ -520,6 +520,11 @@ enum ufshcd_quirks { ...@@ -520,6 +520,11 @@ enum ufshcd_quirks {
* ops (get_ufs_hci_version) to get the correct version. * ops (get_ufs_hci_version) to get the correct version.
*/ */
UFSHCD_QUIRK_BROKEN_UFS_HCI_VERSION = 1 << 5, UFSHCD_QUIRK_BROKEN_UFS_HCI_VERSION = 1 << 5,
/*
* Clear handling for transfer/task request list is just opposite.
*/
UFSHCI_QUIRK_BROKEN_REQ_LIST_CLR = 1 << 6,
}; };
enum ufshcd_caps { enum ufshcd_caps {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment