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.com Reviewed-by: Can Guo <cang@codeaurora.org> Reviewed-by: Avri Altman <avri.altman@wdc.com> Signed-off-by: Seungwon Jeon <essuuj@gmail.com> Signed-off-by: Alim Akhtar <alim.akhtar@samsung.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
parent
b3a9e3b962
commit
871838412a
@ -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)
|
||||
{
|
||||
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)
|
||||
*/
|
||||
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 {
|
||||
* ops (get_ufs_hci_version) to get the correct version.
|
||||
*/
|
||||
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 {
|
||||
|
Loading…
Reference in New Issue
Block a user