scsi: mpi3mr: Add change queue depth support
authorKashyap Desai <kashyap.desai@broadcom.com>
Thu, 20 May 2021 15:25:35 +0000 (20:55 +0530)
committerMartin K. Petersen <martin.petersen@oracle.com>
Wed, 2 Jun 2021 04:56:17 +0000 (00:56 -0400)
Link: https://lore.kernel.org/r/20210520152545.2710479-15-kashyap.desai@broadcom.com
Cc: sathya.prakash@broadcom.com
Reviewed-by: Hannes Reinecke <hare@suse.de>
Reviewed-by: Tomas Henzl <thenzl@redhat.com>
Reviewed-by: Himanshu Madhani <himanshu.madhani@oracle.com>
Signed-off-by: Kashyap Desai <kashyap.desai@broadcom.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/mpi3mr/mpi3mr.h
drivers/scsi/mpi3mr/mpi3mr_os.c

index 65886f3..cecd779 100644 (file)
@@ -146,6 +146,9 @@ extern struct list_head mrioc_list;
 /* Command retry count definitions */
 #define MPI3MR_DEV_RMHS_RETRY_COUNT 3
 
+/* Default target device queue depth */
+#define MPI3MR_DEFAULT_SDEV_QD 32
+
 /* SGE Flag definition */
 #define MPI3MR_SGEFLAGS_SYSTEM_SIMPLE_END_OF_LIST \
        (MPI3_SGE_FLAGS_ELEMENT_TYPE_SIMPLE | MPI3_SGE_FLAGS_DLAS_SYSTEM | \
index f3cc383..0a0e42d 100644 (file)
@@ -644,6 +644,33 @@ out:
 }
 
 /**
+ * mpi3mr_change_queue_depth- Change QD callback handler
+ * @sdev: SCSI device reference
+ * @q_depth: Queue depth
+ *
+ * Validate and limit QD and call scsi_change_queue_depth.
+ *
+ * Return: return value of scsi_change_queue_depth
+ */
+static int mpi3mr_change_queue_depth(struct scsi_device *sdev,
+       int q_depth)
+{
+       struct scsi_target *starget = scsi_target(sdev);
+       struct Scsi_Host *shost = dev_to_shost(&starget->dev);
+       int retval = 0;
+
+       if (!sdev->tagged_supported)
+               q_depth = 1;
+       if (q_depth > shost->can_queue)
+               q_depth = shost->can_queue;
+       else if (!q_depth)
+               q_depth = MPI3MR_DEFAULT_SDEV_QD;
+       retval = scsi_change_queue_depth(sdev, q_depth);
+
+       return retval;
+}
+
+/**
  * mpi3mr_update_sdev - Update SCSI device information
  * @sdev: SCSI device reference
  * @data: target device reference
@@ -663,6 +690,7 @@ mpi3mr_update_sdev(struct scsi_device *sdev, void *data)
        if (!tgtdev)
                return;
 
+       mpi3mr_change_queue_depth(sdev, tgtdev->q_depth);
        switch (tgtdev->dev_type) {
        case MPI3_DEVICE_DEVFORM_PCIE:
                /*The block layer hw sector size = 512*/
@@ -2623,6 +2651,7 @@ static int mpi3mr_slave_configure(struct scsi_device *sdev)
        if (!tgt_dev)
                return -ENXIO;
 
+       mpi3mr_change_queue_depth(sdev, tgt_dev->q_depth);
        switch (tgt_dev->dev_type) {
        case MPI3_DEVICE_DEVFORM_PCIE:
                /*The block layer hw sector size = 512*/
@@ -2876,6 +2905,7 @@ static struct scsi_host_template mpi3mr_driver_template = {
        .slave_destroy                  = mpi3mr_slave_destroy,
        .scan_finished                  = mpi3mr_scan_finished,
        .scan_start                     = mpi3mr_scan_start,
+       .change_queue_depth             = mpi3mr_change_queue_depth,
        .eh_device_reset_handler        = mpi3mr_eh_dev_reset,
        .eh_target_reset_handler        = mpi3mr_eh_target_reset,
        .eh_host_reset_handler          = mpi3mr_eh_host_reset,