diff options
author | Tejun Heo <htejun@gmail.com> | 2006-05-15 08:03:48 -0400 |
---|---|---|
committer | Tejun Heo <htejun@gmail.com> | 2006-05-15 08:03:48 -0400 |
commit | a6e6ce8e8dc907a2cf2b994b0ea4099423f046bf (patch) | |
tree | cc308c45c0d2df9e52be69959b9fd189371ad5d7 /drivers/scsi/libata-scsi.c | |
parent | e8ee84518c159a663c07bf691ace187527380f61 (diff) |
[PATCH] libata-ncq: implement NCQ device configuration
Now that all NCQ related stuff are in place, implement NCQ device
configuration and bump ATA_MAX_QUEUE to 32 thus activating NCQ
support.
Original implementation is from Jens Axboe.
Signed-off-by: Tejun Heo <htejun@gmail.com>
Diffstat (limited to 'drivers/scsi/libata-scsi.c')
-rw-r--r-- | drivers/scsi/libata-scsi.c | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/drivers/scsi/libata-scsi.c b/drivers/scsi/libata-scsi.c index 9bef68c7c1de..996058af1bcd 100644 --- a/drivers/scsi/libata-scsi.c +++ b/drivers/scsi/libata-scsi.c | |||
@@ -41,6 +41,7 @@ | |||
41 | #include <scsi/scsi_eh.h> | 41 | #include <scsi/scsi_eh.h> |
42 | #include <scsi/scsi_device.h> | 42 | #include <scsi/scsi_device.h> |
43 | #include <scsi/scsi_request.h> | 43 | #include <scsi/scsi_request.h> |
44 | #include <scsi/scsi_tcq.h> | ||
44 | #include <scsi/scsi_transport.h> | 45 | #include <scsi/scsi_transport.h> |
45 | #include <linux/libata.h> | 46 | #include <linux/libata.h> |
46 | #include <linux/hdreg.h> | 47 | #include <linux/hdreg.h> |
@@ -684,6 +685,14 @@ static void ata_scsi_dev_config(struct scsi_device *sdev, | |||
684 | request_queue_t *q = sdev->request_queue; | 685 | request_queue_t *q = sdev->request_queue; |
685 | blk_queue_max_hw_segments(q, q->max_hw_segments - 1); | 686 | blk_queue_max_hw_segments(q, q->max_hw_segments - 1); |
686 | } | 687 | } |
688 | |||
689 | if (dev->flags & ATA_DFLAG_NCQ) { | ||
690 | int depth; | ||
691 | |||
692 | depth = min(sdev->host->can_queue, ata_id_queue_depth(dev->id)); | ||
693 | depth = min(ATA_MAX_QUEUE - 1, depth); | ||
694 | scsi_adjust_queue_depth(sdev, MSG_SIMPLE_TAG, depth); | ||
695 | } | ||
687 | } | 696 | } |
688 | 697 | ||
689 | /** | 698 | /** |
@@ -718,6 +727,43 @@ int ata_scsi_slave_config(struct scsi_device *sdev) | |||
718 | } | 727 | } |
719 | 728 | ||
720 | /** | 729 | /** |
730 | * ata_scsi_change_queue_depth - SCSI callback for queue depth config | ||
731 | * @sdev: SCSI device to configure queue depth for | ||
732 | * @queue_depth: new queue depth | ||
733 | * | ||
734 | * This is libata standard hostt->change_queue_depth callback. | ||
735 | * SCSI will call into this callback when user tries to set queue | ||
736 | * depth via sysfs. | ||
737 | * | ||
738 | * LOCKING: | ||
739 | * SCSI layer (we don't care) | ||
740 | * | ||
741 | * RETURNS: | ||
742 | * Newly configured queue depth. | ||
743 | */ | ||
744 | int ata_scsi_change_queue_depth(struct scsi_device *sdev, int queue_depth) | ||
745 | { | ||
746 | struct ata_port *ap = ata_shost_to_port(sdev->host); | ||
747 | struct ata_device *dev; | ||
748 | int max_depth; | ||
749 | |||
750 | if (queue_depth < 1) | ||
751 | return sdev->queue_depth; | ||
752 | |||
753 | dev = ata_scsi_find_dev(ap, sdev); | ||
754 | if (!dev || !ata_dev_enabled(dev)) | ||
755 | return sdev->queue_depth; | ||
756 | |||
757 | max_depth = min(sdev->host->can_queue, ata_id_queue_depth(dev->id)); | ||
758 | max_depth = min(ATA_MAX_QUEUE - 1, max_depth); | ||
759 | if (queue_depth > max_depth) | ||
760 | queue_depth = max_depth; | ||
761 | |||
762 | scsi_adjust_queue_depth(sdev, MSG_SIMPLE_TAG, queue_depth); | ||
763 | return queue_depth; | ||
764 | } | ||
765 | |||
766 | /** | ||
721 | * ata_scsi_start_stop_xlat - Translate SCSI START STOP UNIT command | 767 | * ata_scsi_start_stop_xlat - Translate SCSI START STOP UNIT command |
722 | * @qc: Storage for translated ATA taskfile | 768 | * @qc: Storage for translated ATA taskfile |
723 | * @scsicmd: SCSI command to translate | 769 | * @scsicmd: SCSI command to translate |