READ_NATIVE_MAX and SET_MAX were causing timeouts on sata_nv controllers.
Disabling ADMA helped, but that is quite a large hammer to use. Reverting
382a6652e91b34d5480cfc0ed840c196650493d4 also helped, but we might as well
fix it right, instead of disabling the performance gain on cache flushes
by using ADMA mode.
Signed-off-by: Kyle McMartin <[EMAIL PROTECTED]>
---
This patch depends on the Host Protected Area patch Alan sent to linux-ide
this week.
diff --git a/drivers/ata/sata_nv.c b/drivers/ata/sata_nv.c
index 9d9670a..eaf9b76 100644
--- a/drivers/ata/sata_nv.c
+++ b/drivers/ata/sata_nv.c
@@ -1162,6 +1162,20 @@ static void nv_adma_fill_sg(struct ata_queued_cmd *qc,
struct nv_adma_cpb *cpb)
cpb->next_aprd = cpu_to_le64(0);
}
+static int nv_blacklist_adma_for_hpa_cmds(struct ata_taskfile *tf)
+{
+ switch(tf->command) {
+ case ATA_CMD_READ_NATIVE_MAX:
+ case ATA_CMD_READ_NATIVE_MAX_EXT:
+ case ATA_CMD_SET_MAX:
+ case ATA_CMD_SET_MAX_EXT:
+ return 1;
+
+ default:
+ return 0;
+ }
+}
+
static int nv_adma_use_reg_mode(struct ata_queued_cmd *qc)
{
struct nv_adma_port_priv *pp = qc->ap->private_data;
@@ -1173,8 +1187,12 @@ static int nv_adma_use_reg_mode(struct ata_queued_cmd
*qc)
return 1;
if((qc->flags & ATA_QCFLAG_DMAMAP) ||
- (qc->tf.protocol == ATA_PROT_NODATA))
- return 0;
+ (qc->tf.protocol == ATA_PROT_NODATA)) {
+ if (nv_blacklist_adma_for_hpa_cmds(&qc->tf))
+ return 1; /* (SET|READ)_NATIVE_MAX time out in
ADMA mdoe */
+ else
+ return 0;
+ }
return 1;
}
-
To unsubscribe from this list: send the line "unsubscribe linux-ide" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at http://vger.kernel.org/majordomo-info.html