lkml.org 
[lkml]   [2020]   [Aug]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.7 098/124] scsi: ufs-pci: Add quirk for broken auto-hibernate for Intel EHL
    Date
    From: Adrian Hunter <adrian.hunter@intel.com>

    [ Upstream commit 8da76f71fef7d8a1a72af09d48899573feb60065 ]

    Intel EHL UFS host controller advertises auto-hibernate capability but it
    does not work correctly. Add a quirk for that.

    [mkp: checkpatch fix]

    Link: https://lore.kernel.org/r/20200810141024.28859-1-adrian.hunter@intel.com
    Fixes: 8c09d7527697 ("scsi: ufshdc-pci: Add Intel PCI IDs for EHL")
    Acked-by: Stanley Chu <stanley.chu@mediatek.com>
    Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/scsi/ufs/ufshcd-pci.c | 16 ++++++++++++++--
    drivers/scsi/ufs/ufshcd.h | 9 ++++++++-
    2 files changed, 22 insertions(+), 3 deletions(-)

    diff --git a/drivers/scsi/ufs/ufshcd-pci.c b/drivers/scsi/ufs/ufshcd-pci.c
    index 8f78a81514991..b220666774ce8 100644
    --- a/drivers/scsi/ufs/ufshcd-pci.c
    +++ b/drivers/scsi/ufs/ufshcd-pci.c
    @@ -67,11 +67,23 @@ static int ufs_intel_link_startup_notify(struct ufs_hba *hba,
    return err;
    }

    +static int ufs_intel_ehl_init(struct ufs_hba *hba)
    +{
    + hba->quirks |= UFSHCD_QUIRK_BROKEN_AUTO_HIBERN8;
    + return 0;
    +}
    +
    static struct ufs_hba_variant_ops ufs_intel_cnl_hba_vops = {
    .name = "intel-pci",
    .link_startup_notify = ufs_intel_link_startup_notify,
    };

    +static struct ufs_hba_variant_ops ufs_intel_ehl_hba_vops = {
    + .name = "intel-pci",
    + .init = ufs_intel_ehl_init,
    + .link_startup_notify = ufs_intel_link_startup_notify,
    +};
    +
    #ifdef CONFIG_PM_SLEEP
    /**
    * ufshcd_pci_suspend - suspend power management function
    @@ -200,8 +212,8 @@ static const struct dev_pm_ops ufshcd_pci_pm_ops = {
    static const struct pci_device_id ufshcd_pci_tbl[] = {
    { PCI_VENDOR_ID_SAMSUNG, 0xC00C, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
    { PCI_VDEVICE(INTEL, 0x9DFA), (kernel_ulong_t)&ufs_intel_cnl_hba_vops },
    - { PCI_VDEVICE(INTEL, 0x4B41), (kernel_ulong_t)&ufs_intel_cnl_hba_vops },
    - { PCI_VDEVICE(INTEL, 0x4B43), (kernel_ulong_t)&ufs_intel_cnl_hba_vops },
    + { PCI_VDEVICE(INTEL, 0x4B41), (kernel_ulong_t)&ufs_intel_ehl_hba_vops },
    + { PCI_VDEVICE(INTEL, 0x4B43), (kernel_ulong_t)&ufs_intel_ehl_hba_vops },
    { } /* terminate list */
    };

    diff --git a/drivers/scsi/ufs/ufshcd.h b/drivers/scsi/ufs/ufshcd.h
    index 59ca93b64bb08..ccbeae4f8325d 100644
    --- a/drivers/scsi/ufs/ufshcd.h
    +++ b/drivers/scsi/ufs/ufshcd.h
    @@ -547,6 +547,12 @@ enum ufshcd_quirks {
    * OCS FATAL ERROR with device error through sense data
    */
    UFSHCD_QUIRK_BROKEN_OCS_FATAL_ERROR = 1 << 10,
    +
    + /*
    + * This quirk needs to be enabled if the host controller has
    + * auto-hibernate capability but it doesn't work.
    + */
    + UFSHCD_QUIRK_BROKEN_AUTO_HIBERN8 = 1 << 11,
    };

    enum ufshcd_caps {
    @@ -796,7 +802,8 @@ return true;

    static inline bool ufshcd_is_auto_hibern8_supported(struct ufs_hba *hba)
    {
    - return (hba->capabilities & MASK_AUTO_HIBERN8_SUPPORT);
    + return (hba->capabilities & MASK_AUTO_HIBERN8_SUPPORT) &&
    + !(hba->quirks & UFSHCD_QUIRK_BROKEN_AUTO_HIBERN8);
    }

    static inline bool ufshcd_is_auto_hibern8_enabled(struct ufs_hba *hba)
    --
    2.25.1


    \
     
     \ /
      Last update: 2020-08-24 10:44    [W:4.070 / U:0.148 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site