git: 07f3a9eb1c35 - stable/14 - alc(4): disable MSI-X by default on Killer cards

From: Warner Losh <imp_at_FreeBSD.org>
Date: Tue, 21 May 2024 19:50:05 UTC
The branch stable/14 has been updated by imp:

URL: https://cgit.FreeBSD.org/src/commit/?id=07f3a9eb1c35cab2d371895f9ed5bc33d27e1815

commit 07f3a9eb1c35cab2d371895f9ed5bc33d27e1815
Author:     Lexi Winter <lexi@le-Fay.ORG>
AuthorDate: 2024-04-22 22:09:26 +0000
Commit:     Warner Losh <imp@FreeBSD.org>
CommitDate: 2024-05-21 19:43:34 +0000

    alc(4): disable MSI-X by default on Killer cards
    
    Several users with alc(4)-based "Killer" Ethernet cards have reported
    issues with this driver not passing traffic, which are solved by
    disabling MSI-X using the provided tunable.
    
    To work around this issue, disable MSI-X by default on this card.
    
    This is done by having msix_disable default to 2, which means
    "auto-detect".  The user can still override this to either 0 or 1 as
    desired.
    
    Since these are slow (1Gbps) Ethernet ICs used in low-end systems, it's
    unlikely this will cause any practical performance issues; on the other
    hand, the card not working by default likely causes issues for many new
    FreeBSD users who find their network port doesn't work and have no idea
    why.
    
    PR:             230807
    MFC after:      1 week
    
    Reviewed by: imp
    Pull Request: https://github.com/freebsd/freebsd-src/pull/1185
    
    (cherry picked from commit 05a95d19cb248203acdd4e069d3eedfe597c3b49)
---
 share/man/man4/alc.4 |  6 +++++-
 sys/dev/alc/if_alc.c | 24 +++++++++++++++++++++++-
 2 files changed, 28 insertions(+), 2 deletions(-)

diff --git a/share/man/man4/alc.4 b/share/man/man4/alc.4
index 478558657799..5ce5ce97d68a 100644
--- a/share/man/man4/alc.4
+++ b/share/man/man4/alc.4
@@ -136,7 +136,11 @@ This tunable disables MSI support on the Ethernet hardware.
 The default value is 0.
 .It Va hw.alc.msix_disable
 This tunable disables MSI-X support on the Ethernet hardware.
-The default value is 0.
+The default value is 2, which means to enable or disable MSI-X based on the
+card type; for "Killer" cards (E2x00) MSI-X will be disabled, while on other
+cards it will be enabled.
+Set this to 0 to force MSI-X to be enabled, or 1 to force it to be disabled
+regardless of card type.
 .El
 .Sh SYSCTL VARIABLES
 The following variables are available as both
diff --git a/sys/dev/alc/if_alc.c b/sys/dev/alc/if_alc.c
index be52822e1c51..2943be7063b5 100644
--- a/sys/dev/alc/if_alc.c
+++ b/sys/dev/alc/if_alc.c
@@ -92,8 +92,14 @@ MODULE_DEPEND(alc, miibus, 1, 1, 1);
 
 /* Tunables. */
 static int msi_disable = 0;
-static int msix_disable = 0;
 TUNABLE_INT("hw.alc.msi_disable", &msi_disable);
+
+/*
+ * The default value of msix_disable is 2, which means to decide whether to
+ * enable MSI-X in alc_attach() depending on the card type.  The operator can
+ * set this to 0 or 1 to override the default.
+ */
+static int msix_disable = 2;
 TUNABLE_INT("hw.alc.msix_disable", &msix_disable);
 
 /*
@@ -1411,6 +1417,14 @@ alc_attach(device_t dev)
 	case DEVICEID_ATHEROS_E2400:
 	case DEVICEID_ATHEROS_E2500:
 		sc->alc_flags |= ALC_FLAG_E2X00;
+
+		/*
+		 * Disable MSI-X by default on Killer devices, since this is
+		 * reported by several users to not work well.
+		 */
+		if (msix_disable == 2)
+			msix_disable = 1;
+
 		/* FALLTHROUGH */
 	case DEVICEID_ATHEROS_AR8161:
 		if (pci_get_subvendor(dev) == VENDORID_ATHEROS &&
@@ -1440,6 +1454,14 @@ alc_attach(device_t dev)
 	default:
 		break;
 	}
+
+	/*
+	 * The default value of msix_disable is 2, which means auto-detect.  If
+	 * we didn't auto-detect it, default to enabling it.
+	 */
+	if (msix_disable == 2)
+		msix_disable = 0;
+
 	sc->alc_flags |= ALC_FLAG_JUMBO;
 
 	/*