Module Name:    src
Committed By:   jdolecek
Date:           Mon May 25 19:05:30 UTC 2020

Modified Files:
        src/sys/dev/ata: ata.c

Log Message:
disable downgrade of ATA mode from DMA, as generally not relevant
any more - while it has been instrumental to inadvertedly discover
driver bugs in PIO mode under QEMU recently, generally the switch
more hurts than helps, so now only warn when DMA errors happen

code kept under ATA_DOWNGRADE_MODE ifdef, disabled by default


To generate a diff of this commit:
cvs rdiff -u -r1.158 -r1.159 src/sys/dev/ata/ata.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/ata/ata.c
diff -u src/sys/dev/ata/ata.c:1.158 src/sys/dev/ata/ata.c:1.159
--- src/sys/dev/ata/ata.c:1.158	Mon May 25 18:29:25 2020
+++ src/sys/dev/ata/ata.c	Mon May 25 19:05:30 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: ata.c,v 1.158 2020/05/25 18:29:25 jdolecek Exp $	*/
+/*	$NetBSD: ata.c,v 1.159 2020/05/25 19:05:30 jdolecek Exp $	*/
 
 /*
  * Copyright (c) 1998, 2001 Manuel Bouyer.  All rights reserved.
@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ata.c,v 1.158 2020/05/25 18:29:25 jdolecek Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ata.c,v 1.159 2020/05/25 19:05:30 jdolecek Exp $");
 
 #include "opt_ata.h"
 
@@ -84,7 +84,7 @@ int atadebug_mask = ATADEBUG_MASK;
 #define ATADEBUG_PRINT(args, level)
 #endif
 
-#if NATA_DMA
+#if defined(ATA_DOWNGRADE_MODE) && NATA_DMA
 static int	ata_downgrade_mode(struct ata_drive_datas *, int);
 #endif
 
@@ -965,8 +965,19 @@ ata_dmaerr(struct ata_drive_datas *drvp,
 	 */
 	drvp->n_dmaerrs++;
 	if (drvp->n_dmaerrs >= NERRS_MAX && drvp->n_xfers <= NXFER) {
+#ifdef ATA_DOWNGRADE_MODE
 		ata_downgrade_mode(drvp, flags);
 		drvp->n_dmaerrs = NERRS_MAX-1;
+#else
+		static struct timeval last;
+		static const struct timeval serrintvl = { 300, 0 };
+
+		if (ratecheck(&last, &serrintvl)) {
+			aprint_error_dev(drvp->drv_softc,
+			    "excessive DMA errors - %d in last %d transfers\n",
+			    drvp->n_dmaerrs, drvp->n_xfers);
+		}
+#endif
 		drvp->n_xfers = 0;
 		return;
 	}
@@ -1752,7 +1763,7 @@ ata_print_modes(struct ata_channel *chp)
 	}
 }
 
-#if NATA_DMA
+#if defined(ATA_DOWNGRADE_MODE) && NATA_DMA
 /*
  * downgrade the transfer mode of a drive after an error. return 1 if
  * downgrade was possible, 0 otherwise.
@@ -1809,7 +1820,7 @@ ata_downgrade_mode(struct ata_drive_data
 	ata_thread_run(chp, flags, ATACH_TH_RESET, ATACH_NODRIVE);
 	return 1;
 }
-#endif	/* NATA_DMA */
+#endif	/* ATA_DOWNGRADE_MODE && NATA_DMA */
 
 /*
  * Probe drive's capabilities, for use by the controller later

Reply via email to