Commit 4bdee6c5 authored by Tejun Heo's avatar Tejun Heo Committed by Jeff Garzik

sata_mv: don't issue two DMA commands concurrently

sata_mv allowed issuing two DMA commands concurrently which the
hardware allows.  Unfortunately, libata core layer isn't ready for
this yet and spews ugly warning message and malfunctions on this.
Don't allow concurrent DMA commands for now.
Signed-off-by: default avatarTejun Heo <tj@kernel.org>
Signed-off-by: default avatarJeff Garzik <jgarzik@redhat.com>
parent 05944bdf
...@@ -1134,30 +1134,16 @@ static int mv_qc_defer(struct ata_queued_cmd *qc) ...@@ -1134,30 +1134,16 @@ static int mv_qc_defer(struct ata_queued_cmd *qc)
if (ap->nr_active_links == 0) if (ap->nr_active_links == 0)
return 0; return 0;
if (pp->pp_flags & MV_PP_FLAG_EDMA_EN) {
/*
* The port is operating in host queuing mode (EDMA).
* It can accomodate a new qc if the qc protocol
* is compatible with the current host queue mode.
*/
if (pp->pp_flags & MV_PP_FLAG_NCQ_EN) {
/* /*
* The host queue (EDMA) is in NCQ mode. * The port is operating in host queuing mode (EDMA) with NCQ
* If the new qc is also an NCQ command, * enabled, allow multiple NCQ commands. EDMA also allows
* then allow the new qc. * queueing multiple DMA commands but libata core currently
* doesn't allow it.
*/ */
if (qc->tf.protocol == ATA_PROT_NCQ) if ((pp->pp_flags & MV_PP_FLAG_EDMA_EN) &&
(pp->pp_flags & MV_PP_FLAG_NCQ_EN) && ata_is_ncq(qc->tf.protocol))
return 0; return 0;
} else {
/*
* The host queue (EDMA) is in non-NCQ, DMA mode.
* If the new qc is also a non-NCQ, DMA command,
* then allow the new qc.
*/
if (qc->tf.protocol == ATA_PROT_DMA)
return 0;
}
}
return ATA_DEFER_PORT; return ATA_DEFER_PORT;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment