lkml.org 
[lkml]   [2020]   [May]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v10 01/10] scsi: ufs: add quirk to fix mishandling utrlclr/utmrlclr
    Date
    In the right behavior, setting the bit to '0' indicates clear and '1'
    indicates no change. If host controller handles this the other way,
    UFSHCI_QUIRK_BROKEN_REQ_LIST_CLR can be used.

    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>
    ---
    drivers/scsi/ufs/ufshcd.c | 11 +++++++++--
    drivers/scsi/ufs/ufshcd.h | 5 +++++
    2 files changed, 14 insertions(+), 2 deletions(-)

    diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
    index 698e8d20b4ba..3655b88fc862 100644
    --- a/drivers/scsi/ufs/ufshcd.c
    +++ b/drivers/scsi/ufs/ufshcd.c
    @@ -645,7 +645,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);
    }

    /**
    @@ -655,7 +659,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);
    }

    /**
    diff --git a/drivers/scsi/ufs/ufshcd.h b/drivers/scsi/ufs/ufshcd.h
    index 6ffc08ad85f6..071f0edf3f64 100644
    --- a/drivers/scsi/ufs/ufshcd.h
    +++ b/drivers/scsi/ufs/ufshcd.h
    @@ -518,6 +518,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 {
    --
    2.17.1
    \
     
     \ /
      Last update: 2020-05-28 03:33    [W:4.859 / U:0.572 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site