diff options
| -rw-r--r-- | drivers/scsi/aacraid/linit.c | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/drivers/scsi/aacraid/linit.c b/drivers/scsi/aacraid/linit.c index a270a3f00647..6f92d077679f 100644 --- a/drivers/scsi/aacraid/linit.c +++ b/drivers/scsi/aacraid/linit.c | |||
| @@ -446,6 +446,43 @@ static int aac_slave_configure(struct scsi_device *sdev) | |||
| 446 | return 0; | 446 | return 0; |
| 447 | } | 447 | } |
| 448 | 448 | ||
| 449 | /** | ||
| 450 | * aac_change_queue_depth - alter queue depths | ||
| 451 | * @sdev: SCSI device we are considering | ||
| 452 | * @depth: desired queue depth | ||
| 453 | * | ||
| 454 | * Alters queue depths for target device based on the host adapter's | ||
| 455 | * total capacity and the queue depth supported by the target device. | ||
| 456 | */ | ||
| 457 | |||
| 458 | static int aac_change_queue_depth(struct scsi_device *sdev, int depth) | ||
| 459 | { | ||
| 460 | if (sdev->tagged_supported && (sdev->type == TYPE_DISK) && | ||
| 461 | (sdev_channel(sdev) == CONTAINER_CHANNEL)) { | ||
| 462 | struct scsi_device * dev; | ||
| 463 | struct Scsi_Host *host = sdev->host; | ||
| 464 | unsigned num = 0; | ||
| 465 | |||
| 466 | __shost_for_each_device(dev, host) { | ||
| 467 | if (dev->tagged_supported && (dev->type == TYPE_DISK) && | ||
| 468 | (sdev_channel(dev) == CONTAINER_CHANNEL)) | ||
| 469 | ++num; | ||
| 470 | ++num; | ||
| 471 | } | ||
| 472 | if (num >= host->can_queue) | ||
| 473 | num = host->can_queue - 1; | ||
| 474 | if (depth > (host->can_queue - num)) | ||
| 475 | depth = host->can_queue - num; | ||
| 476 | if (depth > 256) | ||
| 477 | depth = 256; | ||
| 478 | else if (depth < 2) | ||
| 479 | depth = 2; | ||
| 480 | scsi_adjust_queue_depth(sdev, MSG_ORDERED_TAG, depth); | ||
| 481 | } else | ||
| 482 | scsi_adjust_queue_depth(sdev, 0, 1); | ||
| 483 | return sdev->queue_depth; | ||
| 484 | } | ||
| 485 | |||
| 449 | static int aac_ioctl(struct scsi_device *sdev, int cmd, void __user * arg) | 486 | static int aac_ioctl(struct scsi_device *sdev, int cmd, void __user * arg) |
| 450 | { | 487 | { |
| 451 | struct aac_dev *dev = (struct aac_dev *)sdev->host->hostdata; | 488 | struct aac_dev *dev = (struct aac_dev *)sdev->host->hostdata; |
| @@ -844,6 +881,7 @@ static struct scsi_host_template aac_driver_template = { | |||
| 844 | .bios_param = aac_biosparm, | 881 | .bios_param = aac_biosparm, |
| 845 | .shost_attrs = aac_attrs, | 882 | .shost_attrs = aac_attrs, |
| 846 | .slave_configure = aac_slave_configure, | 883 | .slave_configure = aac_slave_configure, |
| 884 | .change_queue_depth = aac_change_queue_depth, | ||
| 847 | .eh_abort_handler = aac_eh_abort, | 885 | .eh_abort_handler = aac_eh_abort, |
| 848 | .eh_host_reset_handler = aac_eh_reset, | 886 | .eh_host_reset_handler = aac_eh_reset, |
| 849 | .can_queue = AAC_NUM_IO_FIB, | 887 | .can_queue = AAC_NUM_IO_FIB, |
