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)
|
if (qc->dev->flags & ATA_DFLAG_CDB_INTR)
|
||||||
break;
|
break;
|
||||||
/*FALLTHROUGH*/
|
/*FALLTHROUGH*/
|
||||||
|
case ATA_PROT_NODATA:
|
||||||
|
if (qc->tf.flags & ATA_TFLAG_POLLING)
|
||||||
|
break;
|
||||||
|
/*FALLTHROUGH*/
|
||||||
case ATA_PROT_ATAPI_DMA:
|
case ATA_PROT_ATAPI_DMA:
|
||||||
case ATA_PROT_DMA:
|
case ATA_PROT_DMA:
|
||||||
case ATA_PROT_NODATA:
|
|
||||||
pdc_packet_start(qc);
|
pdc_packet_start(qc);
|
||||||
return 0;
|
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)
|
static void pdc_tf_load_mmio(struct ata_port *ap, const struct ata_taskfile *tf)
|
||||||
{
|
{
|
||||||
WARN_ON (tf->protocol == ATA_PROT_DMA ||
|
WARN_ON (tf->protocol == ATA_PROT_DMA ||
|
||||||
tf->protocol == ATA_PROT_NODATA);
|
tf->protocol == ATA_PROT_ATAPI_DMA);
|
||||||
ata_tf_load(ap, tf);
|
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)
|
static void pdc_exec_command_mmio(struct ata_port *ap, const struct ata_taskfile *tf)
|
||||||
{
|
{
|
||||||
WARN_ON (tf->protocol == ATA_PROT_DMA ||
|
WARN_ON (tf->protocol == ATA_PROT_DMA ||
|
||||||
tf->protocol == ATA_PROT_NODATA);
|
tf->protocol == ATA_PROT_ATAPI_DMA);
|
||||||
ata_exec_command(ap, tf);
|
ata_exec_command(ap, tf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue