]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
scsi: ufs: core: Maximum RTT supported by the host driver
authorAvri Altman <avri.altman@wdc.com>
Thu, 30 May 2024 14:25:08 +0000 (17:25 +0300)
committerMartin K. Petersen <martin.petersen@oracle.com>
Fri, 31 May 2024 00:34:38 +0000 (20:34 -0400)
Allow platform vendors to take precedence having their own max rtt support.
This makes sense because the host controller's nortt characteristic may
vary among vendors.

while at it, set this value for Mediatek, as requested by Peter -
https://lore.kernel.org/all/0a57d6bab739d6a10584f2baba115d00dfc9c94c.camel@mediatek.com/

Signed-off-by: Avri Altman <avri.altman@wdc.com>
Link: https://lore.kernel.org/r/20240530142510.734-3-avri.altman@wdc.com
Reviewed-by: Peter Wang <peter.wang@mediatek.com>
Reviewed-by: Bart Van Assche <bvanassche@acm.org>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/ufs/core/ufshcd.c
drivers/ufs/host/ufs-mediatek.c
drivers/ufs/host/ufs-mediatek.h
include/ufs/ufshcd.h

index dda6d7e44436bddeebaaad5f1fcff733211193c0..41bf2e249c83813763eb5d2751dcf5255b668e14 100644 (file)
@@ -8131,6 +8131,8 @@ static void ufshcd_set_rtt(struct ufs_hba *hba)
        struct ufs_dev_info *dev_info = &hba->dev_info;
        u32 rtt = 0;
        u32 dev_rtt = 0;
+       int host_rtt_cap = hba->vops && hba->vops->max_num_rtt ?
+                          hba->vops->max_num_rtt : hba->nortt;
 
        /* RTT override makes sense only for UFS-4.0 and above */
        if (dev_info->wspecversion < 0x400)
@@ -8146,7 +8148,8 @@ static void ufshcd_set_rtt(struct ufs_hba *hba)
        if (dev_rtt != DEFAULT_MAX_NUM_RTT)
                return;
 
-       rtt = min_t(int, dev_info->rtt_cap, hba->nortt);
+       rtt = min_t(int, dev_info->rtt_cap, host_rtt_cap);
+
        if (rtt == dev_rtt)
                return;
 
index c4f997196c57afcb3ebfc878c93fd2915b51f4ee..c7a0ab9b1f59d048443e636b94c1d65b42116dd5 100644 (file)
@@ -1785,6 +1785,7 @@ static int ufs_mtk_config_esi(struct ufs_hba *hba)
  */
 static const struct ufs_hba_variant_ops ufs_hba_mtk_vops = {
        .name                = "mediatek.ufshci",
+       .max_num_rtt         = MTK_MAX_NUM_RTT,
        .init                = ufs_mtk_init,
        .get_ufs_hci_version = ufs_mtk_get_ufs_hci_version,
        .setup_clocks        = ufs_mtk_setup_clocks,
index 3ff17e95afab31569ec21408b19087e01d86c4d8..05d76a6bd772648ab2458f46bf85d17deaa58900 100644 (file)
@@ -189,4 +189,7 @@ struct ufs_mtk_host {
 /* MTK delay of autosuspend: 500 ms */
 #define MTK_RPM_AUTOSUSPEND_DELAY_MS 500
 
+/* MTK RTT support number */
+#define MTK_MAX_NUM_RTT 2
+
 #endif /* !_UFS_MEDIATEK_H */
index d74bd2d67b061c98890806d1891fd914d36a2ee7..ef04ec8aad69af51c78d0ea61ca6617e0b646812 100644 (file)
@@ -295,6 +295,7 @@ struct ufs_pwr_mode_info {
 /**
  * struct ufs_hba_variant_ops - variant specific callbacks
  * @name: variant name
+ * @max_num_rtt: maximum RTT supported by the host
  * @init: called when the driver is initialized
  * @exit: called to cleanup everything done in init
  * @get_ufs_hci_version: called to get UFS HCI version
@@ -332,6 +333,7 @@ struct ufs_pwr_mode_info {
  */
 struct ufs_hba_variant_ops {
        const char *name;
+       int     max_num_rtt;
        int     (*init)(struct ufs_hba *);
        void    (*exit)(struct ufs_hba *);
        u32     (*get_ufs_hci_version)(struct ufs_hba *);