]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
scsi: ufs: core: Introduce ufshcd_add_scsi_host()
authorBart Van Assche <bvanassche@acm.org>
Wed, 16 Oct 2024 20:11:57 +0000 (13:11 -0700)
committerMartin K. Petersen <martin.petersen@oracle.com>
Fri, 25 Oct 2024 19:30:21 +0000 (15:30 -0400)
Move the code for adding a SCSI host and also the code for managing TMF
tags from ufshcd_init() into a new function called
ufshcd_add_scsi_host(). This patch prepares for combining the two
scsi_add_host() calls into a single call. No functionality has been
changed.

Reviewed-by: Avri Altman <avri.altman@wdc.com>
Reviewed-by: Bean Huo <beanhuo@micron.com>
Reviewed-by: Bao D. Nguyen <quic_nguyenb@quicinc.com>
Signed-off-by: Bart Van Assche <bvanassche@acm.org>
Link: https://lore.kernel.org/r/20241016201249.2256266-2-bvanassche@acm.org
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/ufs/core/ufshcd.c

index 9458ecc1c10e3d4fdd5eca4d41f4d0d3cdf4e163..7660d354640862ecfa62e570f6df8014dadcbb5f 100644 (file)
@@ -10333,6 +10333,62 @@ static const struct blk_mq_ops ufshcd_tmf_ops = {
        .queue_rq = ufshcd_queue_tmf,
 };
 
+static int ufshcd_add_scsi_host(struct ufs_hba *hba)
+{
+       int err;
+
+       if (!is_mcq_supported(hba)) {
+               if (!hba->lsdb_sup) {
+                       dev_err(hba->dev,
+                               "%s: failed to initialize (legacy doorbell mode not supported)\n",
+                               __func__);
+                       return -EINVAL;
+               }
+               err = scsi_add_host(hba->host, hba->dev);
+               if (err) {
+                       dev_err(hba->dev, "scsi_add_host failed\n");
+                       return err;
+               }
+               hba->scsi_host_added = true;
+       }
+
+       hba->tmf_tag_set = (struct blk_mq_tag_set) {
+               .nr_hw_queues   = 1,
+               .queue_depth    = hba->nutmrs,
+               .ops            = &ufshcd_tmf_ops,
+               .flags          = BLK_MQ_F_NO_SCHED,
+       };
+       err = blk_mq_alloc_tag_set(&hba->tmf_tag_set);
+       if (err < 0)
+               goto remove_scsi_host;
+       hba->tmf_queue = blk_mq_alloc_queue(&hba->tmf_tag_set, NULL, NULL);
+       if (IS_ERR(hba->tmf_queue)) {
+               err = PTR_ERR(hba->tmf_queue);
+               goto free_tmf_tag_set;
+       }
+       hba->tmf_rqs = devm_kcalloc(hba->dev, hba->nutmrs,
+                                   sizeof(*hba->tmf_rqs), GFP_KERNEL);
+       if (!hba->tmf_rqs) {
+               err = -ENOMEM;
+               goto free_tmf_queue;
+       }
+
+       return 0;
+
+free_tmf_queue:
+       blk_mq_destroy_queue(hba->tmf_queue);
+       blk_put_queue(hba->tmf_queue);
+
+free_tmf_tag_set:
+       blk_mq_free_tag_set(&hba->tmf_tag_set);
+
+remove_scsi_host:
+       if (hba->scsi_host_added)
+               scsi_remove_host(hba->host);
+
+       return err;
+}
+
 /**
  * ufshcd_init - Driver initialization routine
  * @hba: per-adapter instance
@@ -10464,41 +10520,9 @@ int ufshcd_init(struct ufs_hba *hba, void __iomem *mmio_base, unsigned int irq)
                hba->is_irq_enabled = true;
        }
 
-       if (!is_mcq_supported(hba)) {
-               if (!hba->lsdb_sup) {
-                       dev_err(hba->dev, "%s: failed to initialize (legacy doorbell mode not supported)\n",
-                               __func__);
-                       err = -EINVAL;
-                       goto out_disable;
-               }
-               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;
-       }
-
-       hba->tmf_tag_set = (struct blk_mq_tag_set) {
-               .nr_hw_queues   = 1,
-               .queue_depth    = hba->nutmrs,
-               .ops            = &ufshcd_tmf_ops,
-               .flags          = BLK_MQ_F_NO_SCHED,
-       };
-       err = blk_mq_alloc_tag_set(&hba->tmf_tag_set);
-       if (err < 0)
-               goto out_remove_scsi_host;
-       hba->tmf_queue = blk_mq_alloc_queue(&hba->tmf_tag_set, NULL, NULL);
-       if (IS_ERR(hba->tmf_queue)) {
-               err = PTR_ERR(hba->tmf_queue);
-               goto free_tmf_tag_set;
-       }
-       hba->tmf_rqs = devm_kcalloc(hba->dev, hba->nutmrs,
-                                   sizeof(*hba->tmf_rqs), GFP_KERNEL);
-       if (!hba->tmf_rqs) {
-               err = -ENOMEM;
-               goto free_tmf_queue;
-       }
+       err = ufshcd_add_scsi_host(hba);
+       if (err)
+               goto out_disable;
 
        /* Reset the attached device */
        ufshcd_device_reset(hba);
@@ -10556,9 +10580,7 @@ int ufshcd_init(struct ufs_hba *hba, void __iomem *mmio_base, unsigned int irq)
 free_tmf_queue:
        blk_mq_destroy_queue(hba->tmf_queue);
        blk_put_queue(hba->tmf_queue);
-free_tmf_tag_set:
        blk_mq_free_tag_set(&hba->tmf_tag_set);
-out_remove_scsi_host:
        if (hba->scsi_host_added)
                scsi_remove_host(hba->host);
 out_disable: