mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-05 10:04:12 +08:00
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>
This commit is contained in:
parent
f93f1078d0
commit
1dce589c38
@ -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) {
|
||||
|
@ -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*/
|
||||
|
Loading…
Reference in New Issue
Block a user