Module Name:    src
Committed By:   abs
Date:           Sun Sep 10 14:04:28 UTC 2023

Modified Files:
        src/sys/conf: files
        src/sys/dev/ic: ahcisata_core.c ahcisatavar.h
        src/sys/dev/pci: ahcisata_pci.c

Log Message:
Rework AHCISATA_EXTRA_DELAY for kern/56737

- Remove AHCI_QUIRK_EXTRA_DELAY as issue appears to be drive and
  not controller related
- Replace AHCISATA_EXTRA_DELAY with AHCISATA_REMOVE_EXTRA_DELAY,
  so defaulting to enabling the extra delay, as the downside of
  slower probing on systems which do not need it is less than having
  other systems intermittently fail to probe and attach drives
- Also allow disabling extra delay with AHCISATA_EXTRA_DELAY_MS = 0

We should return to this code to work out which of the extra delays
are needed, and how long they need to be. It may be that faster
systems are more likely to trigger the issue (I've only seen it on
a 13th gen i7-13700, though only tested on a limited set)

XXX pullup -10


To generate a diff of this commit:
cvs rdiff -u -r1.1308 -r1.1309 src/sys/conf/files
cvs rdiff -u -r1.107 -r1.108 src/sys/dev/ic/ahcisata_core.c
cvs rdiff -u -r1.27 -r1.28 src/sys/dev/ic/ahcisatavar.h
cvs rdiff -u -r1.69 -r1.70 src/sys/dev/pci/ahcisata_pci.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/conf/files
diff -u src/sys/conf/files:1.1308 src/sys/conf/files:1.1309
--- src/sys/conf/files:1.1308	Sun Sep  3 19:38:58 2023
+++ src/sys/conf/files	Sun Sep 10 14:04:28 2023
@@ -1,4 +1,4 @@
-#	$NetBSD: files,v 1.1308 2023/09/03 19:38:58 andvar Exp $
+#	$NetBSD: files,v 1.1309 2023/09/10 14:04:28 abs Exp $
 #	@(#)files.newconf	7.5 (Berkeley) 5/10/93
 
 version 	20171118
@@ -1062,7 +1062,7 @@ device	njata: ata, ata_piobm, wdc_common
 file	dev/ic/ninjaata32.c		njata
 
 # AHCI-compatible SATA controllers
-defflag	opt_ahcisata.h	AHCISATA_EXTRA_DELAY
+defflag	opt_ahcisata.h	AHCISATA_REMOVE_EXTRA_DELAY
 defparam opt_ahcisata.h	AHCISATA_EXTRA_DELAY_MS
 define ahcisata_core
 file dev/ic/ahcisata_core.c ahcisata_core

Index: src/sys/dev/ic/ahcisata_core.c
diff -u src/sys/dev/ic/ahcisata_core.c:1.107 src/sys/dev/ic/ahcisata_core.c:1.108
--- src/sys/dev/ic/ahcisata_core.c:1.107	Mon Aug  1 07:37:18 2022
+++ src/sys/dev/ic/ahcisata_core.c	Sun Sep 10 14:04:28 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: ahcisata_core.c,v 1.107 2022/08/01 07:37:18 mlelstv Exp $	*/
+/*	$NetBSD: ahcisata_core.c,v 1.108 2023/09/10 14:04:28 abs Exp $	*/
 
 /*
  * Copyright (c) 2006 Manuel Bouyer.
@@ -26,7 +26,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ahcisata_core.c,v 1.107 2022/08/01 07:37:18 mlelstv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ahcisata_core.c,v 1.108 2023/09/10 14:04:28 abs Exp $");
 
 #include <sys/types.h>
 #include <sys/malloc.h>
@@ -119,15 +119,11 @@ static const struct scsipi_bustype ahci_
 #define	AHCISATA_EXTRA_DELAY_MS	500	/* XXX need to adjust */
 #endif
 
-#ifdef AHCISATA_EXTRA_DELAY
+#if !defined(AHCISATA_REMOVE_EXTRA_DELAY) && AHCISATA_EXTRA_DELAY_MS > 0
 #define	AHCISATA_DO_EXTRA_DELAY(sc, chp, msg, flags)			\
     ata_delay(chp, AHCISATA_EXTRA_DELAY_MS, msg, flags)
 #else
-#define	AHCISATA_DO_EXTRA_DELAY(sc, chp, msg, flags)			\
-    do {								\
-	if ((sc)->sc_ahci_quirks & AHCI_QUIRK_EXTRA_DELAY)		\
-		ata_delay(chp, AHCISATA_EXTRA_DELAY_MS, msg, flags);	\
-    } while (0)
+#define	AHCISATA_DO_EXTRA_DELAY(sc, chp, msg, flags) do { } while (0)
 #endif
 
 const struct ata_bustype ahci_ata_bustype = {

Index: src/sys/dev/ic/ahcisatavar.h
diff -u src/sys/dev/ic/ahcisatavar.h:1.27 src/sys/dev/ic/ahcisatavar.h:1.28
--- src/sys/dev/ic/ahcisatavar.h:1.27	Fri Nov 19 23:46:55 2021
+++ src/sys/dev/ic/ahcisatavar.h	Sun Sep 10 14:04:28 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: ahcisatavar.h,v 1.27 2021/11/19 23:46:55 rin Exp $	*/
+/*	$NetBSD: ahcisatavar.h,v 1.28 2023/09/10 14:04:28 abs Exp $	*/
 
 /*
  * Copyright (c) 2006 Manuel Bouyer.
@@ -59,7 +59,6 @@ struct ahci_softc {
 #define AHCI_PCI_QUIRK_BAD64	__BIT(1)  /* broken 64-bit DMA */
 #define AHCI_QUIRK_BADPMP	__BIT(2)  /* broken PMP support, ignore */
 #define AHCI_QUIRK_BADNCQ	__BIT(3)  /* possibly broken NCQ support, ignore */
-#define AHCI_QUIRK_EXTRA_DELAY	__BIT(4)  /* needs extra delay */
 
 	uint32_t sc_ahci_cap;	/* copy of AHCI_CAP */
 	int sc_ncmds; /* number of command slots */

Index: src/sys/dev/pci/ahcisata_pci.c
diff -u src/sys/dev/pci/ahcisata_pci.c:1.69 src/sys/dev/pci/ahcisata_pci.c:1.70
--- src/sys/dev/pci/ahcisata_pci.c:1.69	Mon Jul 31 11:24:32 2023
+++ src/sys/dev/pci/ahcisata_pci.c	Sun Sep 10 14:04:28 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: ahcisata_pci.c,v 1.69 2023/07/31 11:24:32 tnn Exp $	*/
+/*	$NetBSD: ahcisata_pci.c,v 1.70 2023/09/10 14:04:28 abs Exp $	*/
 
 /*
  * Copyright (c) 2006 Manuel Bouyer.
@@ -26,7 +26,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ahcisata_pci.c,v 1.69 2023/07/31 11:24:32 tnn Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ahcisata_pci.c,v 1.70 2023/09/10 14:04:28 abs Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_ahcisata_pci.h"
@@ -197,46 +197,13 @@ static const struct ahci_pci_quirk ahci_
 	{ PCI_VENDOR_ASMEDIA, PCI_PRODUCT_ASMEDIA_ASM1061_11,
 	    AHCI_PCI_QUIRK_FORCE },
 	{ PCI_VENDOR_ASMEDIA, PCI_PRODUCT_ASMEDIA_ASM1061_12,
-	    AHCI_PCI_QUIRK_FORCE | AHCI_QUIRK_EXTRA_DELAY },
+	    AHCI_PCI_QUIRK_FORCE },
 	{ PCI_VENDOR_AMD, PCI_PRODUCT_AMD_HUDSON_SATA,
 	    AHCI_PCI_QUIRK_FORCE },
 	{ PCI_VENDOR_AMD, PCI_PRODUCT_AMD_HUDSON_SATA_AHCI,
 	    AHCI_QUIRK_BADPMP },
 	{ PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801JI_SATA_AHCI,
 	    AHCI_QUIRK_BADPMP },
-
-    /* extra delay */
-	{ PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_C600_AHCI,
-	    AHCI_QUIRK_EXTRA_DELAY },
-	{ PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_7SER_MO_SATA_AHCI,
-	    AHCI_QUIRK_EXTRA_DELAY },
-	{ PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_BSW_AHCI,
-	    AHCI_QUIRK_EXTRA_DELAY },
-	{ PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_8SER_DT_SATA_AHCI,
-	    AHCI_QUIRK_EXTRA_DELAY },
-	{ PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_9SERIES_SATA_AHCI,
-	    AHCI_QUIRK_EXTRA_DELAY },
-	{ PCI_VENDOR_AMD, PCI_PRODUCT_AMD_FCH_SATA_D, AHCI_QUIRK_EXTRA_DELAY },
-	{ PCI_VENDOR_ASMEDIA, PCI_PRODUCT_ASMEDIA_ASM106X,
-	    AHCI_QUIRK_EXTRA_DELAY },
-
-#if 0
-	/*
-	 * XXX Non-reproducible failures reported. May need extra-delay quirk.
-	 */
-	{ PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_BAYTRAIL_SATA_AHCI_0,
-	    AHCI_QUIRK_EXTRA_DELAY },
-	{ PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_BAYTRAIL_SATA_AHCI_1,
-	    AHCI_QUIRK_EXTRA_DELAY },
-	{ PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801I_SATA_4,
-	    AHCI_QUIRK_EXTRA_DELAY },
-	{ PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801I_SATA_5,
-	    AHCI_QUIRK_EXTRA_DELAY },
-	{ PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801I_SATA_6,
-	    AHCI_QUIRK_EXTRA_DELAY },
-	{ PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801I_SATA_7,
-	    AHCI_QUIRK_EXTRA_DELAY },
-#endif
 };
 
 struct ahci_pci_softc {

Reply via email to