sata_promise: use TF interface for polling NODATA commands
sata_promise uses two different command modes - packet and TF. Packet mode is intelligent low-overhead mode while TF is the same old taskfile interface. As with other advanced interface (ahci/sil24), ATA_TFLAG_POLLING has no effect in packet mode. However, PIO commands are issued using TF interface in polling mode, so pdc_interrupt() considers interrupts spurious if ATA_TFLAG_POLLING is set. This is broken for polling NODATA commands because command is issued using packet mode but the interrupt handler ignores it due to ATA_TFLAG_POLLING. Fix pdc_qc_issue_prot() such that ATA/ATAPI NODATA commands are issued using TF interface if ATA_TFLAG_POLLING is set. This patch fixes detection failure introduced by polling SETXFERMODE. Signed-off-by: Tejun Heo <htejun@gmail.com> Acked-by: Mikael Pettersson <mikpe@it.uu.se> Acked-by: Jeff Garzik <jeff@garzik.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
7b4dc1fdb8
commit
51b94d2a5a
|
@ -784,9 +784,12 @@ static unsigned int pdc_qc_issue_prot(struct ata_queued_cmd *qc)
|
|||
if (qc->dev->flags & ATA_DFLAG_CDB_INTR)
|
||||
break;
|
||||
/*FALLTHROUGH*/
|
||||
case ATA_PROT_NODATA:
|
||||
if (qc->tf.flags & ATA_TFLAG_POLLING)
|
||||
break;
|
||||
/*FALLTHROUGH*/
|
||||
case ATA_PROT_ATAPI_DMA:
|
||||
case ATA_PROT_DMA:
|
||||
case ATA_PROT_NODATA:
|
||||
pdc_packet_start(qc);
|
||||
return 0;
|
||||
|
||||
|
@ -800,7 +803,7 @@ static unsigned int pdc_qc_issue_prot(struct ata_queued_cmd *qc)
|
|||
static void pdc_tf_load_mmio(struct ata_port *ap, const struct ata_taskfile *tf)
|
||||
{
|
||||
WARN_ON (tf->protocol == ATA_PROT_DMA ||
|
||||
tf->protocol == ATA_PROT_NODATA);
|
||||
tf->protocol == ATA_PROT_ATAPI_DMA);
|
||||
ata_tf_load(ap, tf);
|
||||
}
|
||||
|
||||
|
@ -808,7 +811,7 @@ static void pdc_tf_load_mmio(struct ata_port *ap, const struct ata_taskfile *tf)
|
|||
static void pdc_exec_command_mmio(struct ata_port *ap, const struct ata_taskfile *tf)
|
||||
{
|
||||
WARN_ON (tf->protocol == ATA_PROT_DMA ||
|
||||
tf->protocol == ATA_PROT_NODATA);
|
||||
tf->protocol == ATA_PROT_ATAPI_DMA);
|
||||
ata_exec_command(ap, tf);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue