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 {