Skip to content

Commit

Permalink
alc(4): disable MSI-X by default on Killer cards
Browse files Browse the repository at this point in the history
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
  • Loading branch information
llfw committed Apr 18, 2024
1 parent 464b1ab commit bf5c33c
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 2 deletions.
6 changes: 5 additions & 1 deletion share/man/man4/alc.4
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
24 changes: 23 additions & 1 deletion sys/dev/alc/if_alc.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);

/*
Expand Down Expand Up @@ -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.
* */

Check warning on line 1423 in sys/dev/alc/if_alc.c

View workflow job for this annotation

GitHub Actions / Style Checker

Block comments use a trailing */ on a separate line
if (msix_disable == 2)
msix_disable = 1;

/* FALLTHROUGH */
case DEVICEID_ATHEROS_AR8161:
if (pci_get_subvendor(dev) == VENDORID_ATHEROS &&
Expand Down Expand Up @@ -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;

/*
Expand Down

0 comments on commit bf5c33c

Please sign in to comment.