| From 4bdee6c5103696a2729d3db2f235d202191788e4 Mon Sep 17 00:00:00 2001 |
| From: Tejun Heo <htejun@gmail.com> |
| Date: Wed, 13 Aug 2008 20:24:16 +0900 |
| Subject: sata_mv: don't issue two DMA commands concurrently |
| |
| From: Tejun Heo <htejun@gmail.com> |
| |
| commit 4bdee6c5103696a2729d3db2f235d202191788e4 upstream |
| |
| 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: Tejun Heo <tj@kernel.org> |
| Signed-off-by: Jeff Garzik <jgarzik@redhat.com> |
| Cc: Martin Michlmayr <tbm@cyrius.com> |
| Cc: Mark Lord <liml@rtr.ca> |
| Cc: Artem Bokhan <aptem@ngs.ru> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/ata/sata_mv.c | 34 ++++++++++------------------------ |
| 1 file changed, 10 insertions(+), 24 deletions(-) |
| |
| --- a/drivers/ata/sata_mv.c |
| +++ b/drivers/ata/sata_mv.c |
| @@ -1134,30 +1134,16 @@ static int mv_qc_defer(struct ata_queued |
| if (ap->nr_active_links == 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. |
| - * If the new qc is also an NCQ command, |
| - * then allow the new qc. |
| - */ |
| - if (qc->tf.protocol == ATA_PROT_NCQ) |
| - 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; |
| - } |
| - } |
| + /* |
| + * The port is operating in host queuing mode (EDMA) with NCQ |
| + * enabled, allow multiple NCQ commands. EDMA also allows |
| + * queueing multiple DMA commands but libata core currently |
| + * doesn't allow it. |
| + */ |
| + 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 ATA_DEFER_PORT; |
| } |
| |