summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDarrick J. Wong <djwong@us.ibm.com>2006-10-14 01:56:25 +0200
committerJames Bottomley <jejb@mulgrave.localdomain>2007-07-18 18:14:07 +0200
commitbdab4e877819cc8b682797901c8b37567fec3c5e (patch)
tree3e89b181f0f42ff1c07635d132ed175b16a1f732
parent[SCSI] aic94xx: SATA tag mask not set correctly (diff)
downloadlinux-bdab4e877819cc8b682797901c8b37567fec3c5e.tar.xz
linux-bdab4e877819cc8b682797901c8b37567fec3c5e.zip
[SCSI] libsas: support NCQ for SATA disks
This patch adds SATAII NCQ support to libsas. Both the use_ncq and the dma_xfer flags in ata_task must be set for NCQ to work correctly on the Adaptec SAS controller. The rest of the patch adds ATA_FLAG_NCQ to sata_port_info and sets up ap->scsi_host so that ata_setup_ncq doesn't crash. Please note that this patch is against the aic94xx-sas git tree, not scsi-misc. Thanks also to James Bottomley for providing an earlier version of this patch from which to work. I've tested this patch on a x206m with a ST380819AS SATA2 disk plugged into the Adaptec SAS controller. The drive came up with a queue depth of 31, and I successfully ran an I/O flood test to coerce libata into sending multiple commands simultaneously. A kernel probe recorded the maximum tag number that had been seen before and after the flood test; before the test it was 2 and after it was 30, as I expected. Signed-off-by: Darrick J. Wong <djwong@us.ibm.com> Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
-rw-r--r--drivers/scsi/libsas/sas_scsi_host.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/drivers/scsi/libsas/sas_scsi_host.c b/drivers/scsi/libsas/sas_scsi_host.c
index 3220b3fc6b20..274e7eb47f37 100644
--- a/drivers/scsi/libsas/sas_scsi_host.c
+++ b/drivers/scsi/libsas/sas_scsi_host.c
@@ -828,8 +828,14 @@ static unsigned int sas_ata_qc_issue(struct ata_queued_cmd *qc)
task->ata_task.retry_count = 1;
task->task_state_flags = SAS_TASK_STATE_PENDING;
- if (qc->tf.protocol == ATA_PROT_DMA)
+ switch (qc->tf.protocol) {
+ case ATA_PROT_NCQ:
+ task->ata_task.use_ncq = 1;
+ /* fall through */
+ case ATA_PROT_DMA:
task->ata_task.dma_xfer = 1;
+ break;
+ }
if (sas_ha->lldd_max_execute_num < 2)
res = i->dft->lldd_execute_task(task, 1, GFP_ATOMIC);
@@ -962,7 +968,7 @@ static struct ata_port_operations sas_sata_ops = {
static struct ata_port_info sata_port_info = {
.flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | ATA_FLAG_SATA_RESET |
- ATA_FLAG_MMIO | ATA_FLAG_PIO_DMA,
+ ATA_FLAG_MMIO | ATA_FLAG_PIO_DMA | ATA_FLAG_NCQ,
.pio_mask = 0x1f, /* PIO0-4 */
.mwdma_mask = 0x07, /* MWDMA0-2 */
.udma_mask = ATA_UDMA6,
@@ -1031,6 +1037,7 @@ int sas_target_alloc(struct scsi_target *starget)
ap->private_data = found_dev;
ap->cbl = ATA_CBL_SATA;
+ ap->scsi_host = shost;
found_dev->sata_dev.ap = ap;
}