|
@@ -1595,6 +1595,24 @@ static unsigned int mv_qc_issue(struct ata_queued_cmd *qc)
|
|
|
|
|
|
if ((qc->tf.protocol != ATA_PROT_DMA) &&
|
|
if ((qc->tf.protocol != ATA_PROT_DMA) &&
|
|
(qc->tf.protocol != ATA_PROT_NCQ)) {
|
|
(qc->tf.protocol != ATA_PROT_NCQ)) {
|
|
|
|
+ static int limit_warnings = 10;
|
|
|
|
+ /*
|
|
|
|
+ * Errata SATA#16, SATA#24: warn if multiple DRQs expected.
|
|
|
|
+ *
|
|
|
|
+ * Someday, we might implement special polling workarounds
|
|
|
|
+ * for these, but it all seems rather unnecessary since we
|
|
|
|
+ * normally use only DMA for commands which transfer more
|
|
|
|
+ * than a single block of data.
|
|
|
|
+ *
|
|
|
|
+ * Much of the time, this could just work regardless.
|
|
|
|
+ * So for now, just log the incident, and allow the attempt.
|
|
|
|
+ */
|
|
|
|
+ if (limit_warnings && (qc->nbytes / qc->sect_size) > 1) {
|
|
|
|
+ --limit_warnings;
|
|
|
|
+ ata_link_printk(qc->dev->link, KERN_WARNING, DRV_NAME
|
|
|
|
+ ": attempting PIO w/multiple DRQ: "
|
|
|
|
+ "this may fail due to h/w errata\n");
|
|
|
|
+ }
|
|
/*
|
|
/*
|
|
* We're about to send a non-EDMA capable command to the
|
|
* We're about to send a non-EDMA capable command to the
|
|
* port. Turn off EDMA so there won't be problems accessing
|
|
* port. Turn off EDMA so there won't be problems accessing
|