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. The default value is 0.
.It Va hw.alc.msix_disable .It Va hw.alc.msix_disable
This tunable disables MSI-X support on the Ethernet hardware. 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 .El
.Sh SYSCTL VARIABLES .Sh SYSCTL VARIABLES
The following variables are available as both The following variables are available as both

View file

@ -91,8 +91,14 @@ MODULE_DEPEND(alc, miibus, 1, 1, 1);
/* Tunables. */ /* Tunables. */
static int msi_disable = 0; static int msi_disable = 0;
static int msix_disable = 0;
TUNABLE_INT("hw.alc.msi_disable", &msi_disable); 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); TUNABLE_INT("hw.alc.msix_disable", &msix_disable);
/* /*
@ -1410,6 +1416,14 @@ alc_attach(device_t dev)
case DEVICEID_ATHEROS_E2400: case DEVICEID_ATHEROS_E2400:
case DEVICEID_ATHEROS_E2500: case DEVICEID_ATHEROS_E2500:
sc->alc_flags |= ALC_FLAG_E2X00; 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 */ /* FALLTHROUGH */
case DEVICEID_ATHEROS_AR8161: case DEVICEID_ATHEROS_AR8161:
if (pci_get_subvendor(dev) == VENDORID_ATHEROS && if (pci_get_subvendor(dev) == VENDORID_ATHEROS &&
@ -1439,6 +1453,14 @@ alc_attach(device_t dev)
default: default:
break; 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; sc->alc_flags |= ALC_FLAG_JUMBO;
/* /*