diff options
author | Albert Lee <albertcc@tw.ibm.com> | 2007-06-07 03:49:22 -0400 |
---|---|---|
committer | Jeff Garzik <jeff@garzik.org> | 2007-06-09 23:08:11 -0400 |
commit | 1dce589c38c36ae69614840ee230183f3a7d43c5 (patch) | |
tree | b236f4ee06cca72bc07d88f6fbbf87ddc6b8ab83 | |
parent | f93f1078d08e0f63a6a4bdaa154de3642fc03d5d (diff) |
libata passthru: support PIO multi commands
support the pass through of PIO multi commands.
Signed-off-by: Albert Lee <albertcc@tw.ibm.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
-rw-r--r-- | drivers/ata/libata-scsi.c | 20 | ||||
-rw-r--r-- | include/linux/ata.h | 2 |
2 files changed, 17 insertions, 5 deletions
diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c index f70431a4c9e9..8a66ca5f9530 100644 --- a/drivers/ata/libata-scsi.c +++ b/drivers/ata/libata-scsi.c | |||
@@ -2551,10 +2551,6 @@ static unsigned int ata_scsi_pass_thru(struct ata_queued_cmd *qc) | |||
2551 | if (tf->protocol == ATA_PROT_DMA && dev->dma_mode == 0) | 2551 | if (tf->protocol == ATA_PROT_DMA && dev->dma_mode == 0) |
2552 | goto invalid_fld; | 2552 | goto invalid_fld; |
2553 | 2553 | ||
2554 | if (cdb[1] & 0xe0) | ||
2555 | /* PIO multi not supported yet */ | ||
2556 | goto invalid_fld; | ||
2557 | |||
2558 | /* | 2554 | /* |
2559 | * 12 and 16 byte CDBs use different offsets to | 2555 | * 12 and 16 byte CDBs use different offsets to |
2560 | * provide the various register values. | 2556 | * provide the various register values. |
@@ -2606,6 +2602,22 @@ static unsigned int ata_scsi_pass_thru(struct ata_queued_cmd *qc) | |||
2606 | tf->device = qc->dev->devno ? | 2602 | tf->device = qc->dev->devno ? |
2607 | tf->device | ATA_DEV1 : tf->device & ~ATA_DEV1; | 2603 | tf->device | ATA_DEV1 : tf->device & ~ATA_DEV1; |
2608 | 2604 | ||
2605 | /* sanity check for pio multi commands */ | ||
2606 | if ((cdb[1] & 0xe0) && !is_multi_taskfile(tf)) | ||
2607 | goto invalid_fld; | ||
2608 | |||
2609 | if (is_multi_taskfile(tf)) { | ||
2610 | unsigned int multi_count = 1 << (cdb[1] >> 5); | ||
2611 | |||
2612 | /* compare the passed through multi_count | ||
2613 | * with the cached multi_count of libata | ||
2614 | */ | ||
2615 | if (multi_count != dev->multi_count) | ||
2616 | ata_dev_printk(dev, KERN_WARNING, | ||
2617 | "invalid multi_count %u ignored\n", | ||
2618 | multi_count); | ||
2619 | } | ||
2620 | |||
2609 | /* READ/WRITE LONG use a non-standard sect_size */ | 2621 | /* READ/WRITE LONG use a non-standard sect_size */ |
2610 | qc->sect_size = ATA_SECT_SIZE; | 2622 | qc->sect_size = ATA_SECT_SIZE; |
2611 | switch (tf->command) { | 2623 | switch (tf->command) { |
diff --git a/include/linux/ata.h b/include/linux/ata.h index edb31bfff68f..3e95e5c402d4 100644 --- a/include/linux/ata.h +++ b/include/linux/ata.h | |||
@@ -249,7 +249,7 @@ enum ata_tf_protocols { | |||
249 | /* ATA taskfile protocols */ | 249 | /* ATA taskfile protocols */ |
250 | ATA_PROT_UNKNOWN, /* unknown/invalid */ | 250 | ATA_PROT_UNKNOWN, /* unknown/invalid */ |
251 | ATA_PROT_NODATA, /* no data */ | 251 | ATA_PROT_NODATA, /* no data */ |
252 | ATA_PROT_PIO, /* PIO single sector */ | 252 | ATA_PROT_PIO, /* PIO data xfer */ |
253 | ATA_PROT_DMA, /* DMA */ | 253 | ATA_PROT_DMA, /* DMA */ |
254 | ATA_PROT_NCQ, /* NCQ */ | 254 | ATA_PROT_NCQ, /* NCQ */ |
255 | ATA_PROT_ATAPI, /* packet command, PIO data xfer*/ | 255 | ATA_PROT_ATAPI, /* packet command, PIO data xfer*/ |