On 9/5/2024 3:01 PM, Bart Van Assche wrote:
Expand the ufshcd_device_init(hba, true) call and remove all code that
depends on init_dev_params == false. This change prepares for combining
the two scsi_add_host() calls.
Signed-off-by: Bart Van Assche <bvanassche@xxxxxxx>
---
drivers/ufs/core/ufshcd.c | 43 ++++++++++++++++++++++++++++++++++++++-
1 file changed, 42 insertions(+), 1 deletion(-)
diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
index 843566720afa..014bc74390af 100644
--- a/drivers/ufs/core/ufshcd.c
+++ b/drivers/ufs/core/ufshcd.c
@@ -10602,7 +10602,48 @@ int ufshcd_init(struct ufs_hba *hba, void __iomem *mmio_base, unsigned int irq)
*/
ufshcd_set_ufs_dev_active(hba);
- err = ufshcd_device_init(hba, /*init_dev_params=*/true);
+ err = ufshcd_activate_link(hba);
+ if (err)
+ goto out_disable;
+
+ /* Verify device initialization by sending NOP OUT UPIU. */
+ err = ufshcd_verify_dev_init(hba);
+ if (err)
+ goto out_disable;
+
+ /* Initiate UFS initialization and waiting for completion. */
+ err = ufshcd_complete_dev_init(hba);
+ if (err)
+ goto out_disable;
+
+ /*
+ * Initialize UFS device parameters used by driver, these
+ * parameters are associated with UFS descriptors.
+ */
+ err = ufshcd_device_params_init(hba);
+ if (err)
+ goto out_disable;
+ if (is_mcq_supported(hba)) {
+ ufshcd_mcq_enable(hba);
+ err = ufshcd_alloc_mcq(hba);
+ if (!err) {
+ ufshcd_config_mcq(hba);
+ } else {
+ /* Continue with SDB mode */
+ ufshcd_mcq_disable(hba);
+ use_mcq_mode = false;
If ufshcd_alloc_mcq() fails here, sdb mode is used. The scsi_add_host()
is also called for sdb mode. Later on, when the ufshcd_add_scsi_host()
function is called, we will call scsi_add_host() again for sdb mode.
Therefore, scsi_add_host() would be called twice.
+ dev_err(hba->dev, "MCQ mode is disabled, err=%d\n",
+ err);
+ }
+ err = scsi_add_host(host, hba->dev);
+ if (err) {
+ dev_err(hba->dev, "scsi_add_host failed\n");
+ goto out_disable;
+ }
+ hba->scsi_host_added = true;
+ }
+
+ err = ufshcd_post_device_init(hba);
if (err)
goto out_disable;