diff mbox series

scsi: ufs: core: Check LSDBS cap when !mcq

Message ID 20240704033829epcms2p818bb2892b4ec9536c85c1a7de925fc73@epcms2p8 (mailing list archive)
State Superseded
Headers show
Series scsi: ufs: core: Check LSDBS cap when !mcq | expand

Commit Message

Kyoungrul Kim July 4, 2024, 3:38 a.m. UTC
if the user set use_mcq_mode to 0, the host will activate the lsdb mode
unconditionally even when the lsdbs of device hci cap is 0. so it makes
timeout cmds and fail to device probing.

To prevent that problem. check the lsdbs cap when mcq is not supported
case.

Signed-off-by: k831.kim <k831.kim@samsung.com>
---
 drivers/ufs/core/ufshcd.c | 7 +++++++
 include/ufs/ufshcd.h      | 1 +
 include/ufs/ufshci.h      | 1 +
 3 files changed, 9 insertions(+)

Comments

Bart Van Assche July 4, 2024, 5:41 p.m. UTC | #1
On 7/3/24 8:38 PM, Kyoungrul Kim wrote:
> diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
> index 1b65e6ae4137..c706645c0914 100644
> --- a/drivers/ufs/core/ufshcd.c
> +++ b/drivers/ufs/core/ufshcd.c
> @@ -2413,6 +2413,7 @@ static inline int ufshcd_hba_capabilities(struct ufs_hba *hba)
>   	}
>   
>   	hba->mcq_sup = FIELD_GET(MASK_MCQ_SUPPORT, hba->capabilities);
> +	hba->lsdb_sup = FIELD_GET(MASK_LSDB_SUPPORT, hba->capabilities);
>   	if (!hba->mcq_sup)
>   		return 0;
>   
> @@ -10449,6 +10450,12 @@ int ufshcd_init(struct ufs_hba *hba, void __iomem *mmio_base, unsigned int irq)
>   	}
>   
>   	if (!is_mcq_supported(hba)) {
> +		if (!hba->lsdb_sup) {
> +			dev_err(hba->dev, "%s: failed to initialize (legacy doorbell mode not supported\n",
> +				__func__, hba->lsdb_sup);
> +			err = -EINVAL;
> +			goto out_disable;
> +		}
>   		err = scsi_add_host(host, hba->dev);
>   		if (err) {
>   			dev_err(hba->dev, "scsi_add_host failed\n");
> diff --git a/include/ufs/ufshcd.h b/include/ufs/ufshcd.h
> index bad88bd91995..fd391f6eee73 100644
> --- a/include/ufs/ufshcd.h
> +++ b/include/ufs/ufshcd.h
> @@ -1074,6 +1074,7 @@ struct ufs_hba {
>   	bool ext_iid_sup;
>   	bool scsi_host_added;
>   	bool mcq_sup;
> +	bool lsdb_sup;
>   	bool mcq_enabled;
>   	struct ufshcd_res_info res[RES_MAX];
>   	void __iomem *mcq_base;
> diff --git a/include/ufs/ufshci.h b/include/ufs/ufshci.h
> index 385e1c6b8d60..22ba85e81d8c 100644
> --- a/include/ufs/ufshci.h
> +++ b/include/ufs/ufshci.h
> @@ -75,6 +75,7 @@ enum {
>   	MASK_OUT_OF_ORDER_DATA_DELIVERY_SUPPORT	= 0x02000000,
>   	MASK_UIC_DME_TEST_MODE_SUPPORT		= 0x04000000,
>   	MASK_CRYPTO_SUPPORT			= 0x10000000,
> +	MASK_LSDB_SUPPORT			= 0x20000000,
>   	MASK_MCQ_SUPPORT			= 0x40000000,
>   };

The LSDB bit is defined in the UFSHCI 4.0 specification but not in the
UFSHCI 3.0 specification. Has this patch been tested on a setup with a
UFSHCI 3.0 controller? I think that this patch breaks UFSHCI 3.0
support.

Bart.
Kyoungrul Kim July 5, 2024, 12:20 a.m. UTC | #2
I apologize for the mistake in the allocation of LSDBS Bit 0-1.
I plan to fix it, lsdbs value 0 support lsdb and 1 not support lsdb.
I believe this change will not break UFSHCI3.0 because LSDBS bit is a reserved bit and its reset value is 0.
 
 
--------- Original Message ---------
Sender : Bart Van Assche <bvanassche@acm.org>
Date : 2024-07-05 02:41 (GMT+9)
Title : Re: [PATCH] scsi: ufs: core: Check LSDBS cap when !mcq
 
On 7/3/24 8:38 PM, Kyoungrul Kim wrote:
> diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
> index 1b65e6ae4137..c706645c0914 100644
> --- a/drivers/ufs/core/ufshcd.c
> +++ b/drivers/ufs/core/ufshcd.c
> @@ -2413,6 +2413,7 @@ static inline int ufshcd_hba_capabilities(struct ufs_hba *hba)
>           }

>           hba->mcq_sup = FIELD_GET(MASK_MCQ_SUPPORT, hba->capabilities);
> +        hba->lsdb_sup = FIELD_GET(MASK_LSDB_SUPPORT, hba->capabilities);
>           if (!hba->mcq_sup)
>                   return 0;

> @@ -10449,6 +10450,12 @@ int ufshcd_init(struct ufs_hba *hba, void __iomem *mmio_base, unsigned int irq)
>           }

>           if (!is_mcq_supported(hba)) {
> +                if (!hba->lsdb_sup) {
> +                        dev_err(hba->dev, "%s: failed to initialize (legacy doorbell mode not supported\n",
> +                                __func__, hba->lsdb_sup);
> +                        err = -EINVAL;
> +                        goto out_disable;
> +                }
>                   err = scsi_add_host(host, hba->dev);
>                   if (err) {
>                           dev_err(hba->dev, "scsi_add_host failed\n");
> diff --git a/include/ufs/ufshcd.h b/include/ufs/ufshcd.h
> index bad88bd91995..fd391f6eee73 100644
> --- a/include/ufs/ufshcd.h
> +++ b/include/ufs/ufshcd.h
> @@ -1074,6 +1074,7 @@ struct ufs_hba {
>           bool ext_iid_sup;
>           bool scsi_host_added;
>           bool mcq_sup;
> +        bool lsdb_sup;
>           bool mcq_enabled;
>           struct ufshcd_res_info res[RES_MAX];
>           void __iomem *mcq_base;
> diff --git a/include/ufs/ufshci.h b/include/ufs/ufshci.h
> index 385e1c6b8d60..22ba85e81d8c 100644
> --- a/include/ufs/ufshci.h
> +++ b/include/ufs/ufshci.h
> @@ -75,6 +75,7 @@ enum {
>           MASK_OUT_OF_ORDER_DATA_DELIVERY_SUPPORT        = 0x02000000,
>           MASK_UIC_DME_TEST_MODE_SUPPORT                = 0x04000000,
>           MASK_CRYPTO_SUPPORT                        = 0x10000000,
> +        MASK_LSDB_SUPPORT                        = 0x20000000,
>           MASK_MCQ_SUPPORT                        = 0x40000000,
>  };

The LSDB bit is defined in the UFSHCI 4.0 specification but not in the
UFSHCI 3.0 specification. Has this patch been tested on a setup with a
UFSHCI 3.0 controller? I think that this patch breaks UFSHCI 3.0
support.

Bart.
diff mbox series

Patch

diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
index 1b65e6ae4137..c706645c0914 100644
--- a/drivers/ufs/core/ufshcd.c
+++ b/drivers/ufs/core/ufshcd.c
@@ -2413,6 +2413,7 @@  static inline int ufshcd_hba_capabilities(struct ufs_hba *hba)
 	}
 
 	hba->mcq_sup = FIELD_GET(MASK_MCQ_SUPPORT, hba->capabilities);
+	hba->lsdb_sup = FIELD_GET(MASK_LSDB_SUPPORT, hba->capabilities);
 	if (!hba->mcq_sup)
 		return 0;
 
@@ -10449,6 +10450,12 @@  int ufshcd_init(struct ufs_hba *hba, void __iomem *mmio_base, unsigned int irq)
 	}
 
 	if (!is_mcq_supported(hba)) {
+		if (!hba->lsdb_sup) {
+			dev_err(hba->dev, "%s: failed to initialize (legacy doorbell mode not supported\n",
+				__func__, hba->lsdb_sup);
+			err = -EINVAL;
+			goto out_disable;
+		}
 		err = scsi_add_host(host, hba->dev);
 		if (err) {
 			dev_err(hba->dev, "scsi_add_host failed\n");
diff --git a/include/ufs/ufshcd.h b/include/ufs/ufshcd.h
index bad88bd91995..fd391f6eee73 100644
--- a/include/ufs/ufshcd.h
+++ b/include/ufs/ufshcd.h
@@ -1074,6 +1074,7 @@  struct ufs_hba {
 	bool ext_iid_sup;
 	bool scsi_host_added;
 	bool mcq_sup;
+	bool lsdb_sup;
 	bool mcq_enabled;
 	struct ufshcd_res_info res[RES_MAX];
 	void __iomem *mcq_base;
diff --git a/include/ufs/ufshci.h b/include/ufs/ufshci.h
index 385e1c6b8d60..22ba85e81d8c 100644
--- a/include/ufs/ufshci.h
+++ b/include/ufs/ufshci.h
@@ -75,6 +75,7 @@  enum {
 	MASK_OUT_OF_ORDER_DATA_DELIVERY_SUPPORT	= 0x02000000,
 	MASK_UIC_DME_TEST_MODE_SUPPORT		= 0x04000000,
 	MASK_CRYPTO_SUPPORT			= 0x10000000,
+	MASK_LSDB_SUPPORT			= 0x20000000,
 	MASK_MCQ_SUPPORT			= 0x40000000,
 };