|
@@ -1134,30 +1134,16 @@ static int mv_qc_defer(struct ata_queued_cmd *qc)
|
|
|
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;
|
|
|
}
|
|
|
|