aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/libata-scsi.c
diff options
context:
space:
mode:
authorTejun Heo <htejun@gmail.com>2006-05-15 08:03:48 -0400
committerTejun Heo <htejun@gmail.com>2006-05-15 08:03:48 -0400
commita6e6ce8e8dc907a2cf2b994b0ea4099423f046bf (patch)
treecc308c45c0d2df9e52be69959b9fd189371ad5d7 /drivers/scsi/libata-scsi.c
parente8ee84518c159a663c07bf691ace187527380f61 (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.c46
1 files changed, 46 insertions, 0 deletions
diff --git a/drivers/scsi/libata-scsi.c b/drivers/scsi/libata-scsi.c
index 9bef68c7c1d..996058af1bc 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 */
744int 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