@@ -272,6 +272,38 @@ scsi_change_max_queue_depth(struct scsi_device *sdev, int depth)
}
/**
+ * shost_change_max_queue_depths - helper to walk all devices on a
+ * shost and change their max queue depth.
+ * @shost: shost whose devices we want to iterate over.
+ * @depth: number of commands allowed to be queued to the driver
+ *
+ * Validates the shost allows a change of queue depth, the value is valid,
+ * then traverses over all devices and sets their maximum queue depth.
+ */
+int shost_change_max_queue_depths(struct Scsi_Host *shost, int depth)
+{
+ struct scsi_device *sdev;
+ int retval;
+
+ if (!shost->hostt->change_queue_depth)
+ return -ENXIO;
+
+ if (depth < 1 || depth > shost->can_queue)
+ return -EINVAL;
+
+ shost_for_each_device(sdev, shost) {
+ retval = scsi_change_max_queue_depth(sdev, depth);
+ if (retval != 0)
+ sdev_printk(KERN_INFO, sdev,
+ "failed to set queue depth to %d (err %d)",
+ depth, retval);
+ }
+
+ return 0;
+}
+EXPORT_SYMBOL(shost_change_max_queue_depths);
+
+/**
* scsi_track_queue_full - track QUEUE_FULL events to adjust queue depth
* @sdev: SCSI Device in question
* @depth: Current number of outstanding SCSI commands on this device,
@@ -392,6 +392,7 @@ extern struct scsi_device *__scsi_iterate_devices(struct Scsi_Host *,
extern int scsi_change_queue_depth(struct scsi_device *, int);
extern int scsi_track_queue_full(struct scsi_device *, int);
+extern int shost_change_max_queue_depths(struct Scsi_Host *shost, int depth);
extern int scsi_set_medium_removal(struct scsi_device *, char);
Create a helper routine to loop through all devices on an shost and change their current and maximum queue depth. The helper is created such that is lldd callable. Signed-off-by: James Smart <jsmart2021@gmail.com> --- v3: fix spaces change ENOTSUPP to ENXIO --- drivers/scsi/scsi.c | 32 ++++++++++++++++++++++++++++++++ include/scsi/scsi_device.h | 1 + 2 files changed, 33 insertions(+)