Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=1dce589c38c36ae69614840ee230183f3a7d43c5
Commit:     1dce589c38c36ae69614840ee230183f3a7d43c5
Parent:     f93f1078d08e0f63a6a4bdaa154de3642fc03d5d
Author:     Albert Lee <[EMAIL PROTECTED]>
AuthorDate: Thu Jun 7 15:49:22 2007 +0800
Committer:  Jeff Garzik <[EMAIL PROTECTED]>
CommitDate: Sat Jun 9 23:08:11 2007 -0400

    libata passthru: support PIO multi commands
    
      support the pass through of PIO multi commands.
    
    Signed-off-by: Albert Lee <[EMAIL PROTECTED]>
    Signed-off-by: Jeff Garzik <[EMAIL PROTECTED]>
---
 drivers/ata/libata-scsi.c |   20 ++++++++++++++++----
 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 f70431a..8a66ca5 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)
        if (tf->protocol == ATA_PROT_DMA && dev->dma_mode == 0)
                goto invalid_fld;
 
-       if (cdb[1] & 0xe0)
-               /* PIO multi not supported yet */
-               goto invalid_fld;
-
        /*
         * 12 and 16 byte CDBs use different offsets to
         * provide the various register values.
@@ -2606,6 +2602,22 @@ static unsigned int ata_scsi_pass_thru(struct 
ata_queued_cmd *qc)
                tf->device = qc->dev->devno ?
                        tf->device | ATA_DEV1 : tf->device & ~ATA_DEV1;
 
+       /* sanity check for pio multi commands */
+       if ((cdb[1] & 0xe0) && !is_multi_taskfile(tf))
+               goto invalid_fld;
+
+       if (is_multi_taskfile(tf)) {
+               unsigned int multi_count = 1 << (cdb[1] >> 5);
+
+               /* compare the passed through multi_count
+                * with the cached multi_count of libata
+                */
+               if (multi_count != dev->multi_count)
+                       ata_dev_printk(dev, KERN_WARNING,
+                                      "invalid multi_count %u ignored\n",
+                                      multi_count);
+       }       
+
        /* READ/WRITE LONG use a non-standard sect_size */
        qc->sect_size = ATA_SECT_SIZE;
        switch (tf->command) {
diff --git a/include/linux/ata.h b/include/linux/ata.h
index edb31bf..3e95e5c 100644
--- a/include/linux/ata.h
+++ b/include/linux/ata.h
@@ -249,7 +249,7 @@ enum ata_tf_protocols {
        /* ATA taskfile protocols */
        ATA_PROT_UNKNOWN,       /* unknown/invalid */
        ATA_PROT_NODATA,        /* no data */
-       ATA_PROT_PIO,           /* PIO single sector */
+       ATA_PROT_PIO,           /* PIO data xfer */
        ATA_PROT_DMA,           /* DMA */
        ATA_PROT_NCQ,           /* NCQ */
        ATA_PROT_ATAPI,         /* packet command, PIO data xfer*/
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to