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
This commit is contained in:
Lexi Winter 2024-04-22 16:09:26 -06:00 committed by Warner Losh
parent e96d0d7468
commit 05a95d19cb
2 changed files with 28 additions and 2 deletions

View File

@ -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

View File

@ -91,8 +91,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);
/*
@ -1410,6 +1416,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 &&
@ -1439,6 +1453,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;
/*