From 6d1d28a4cc98b9b465f7a0fd2cddfc878f162df0 Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Wed, 1 Feb 2023 18:19:32 +0000 Subject: [realtek] Explicitly disable VLAN offload Some cards seem to have the receive VLAN tag stripping feature enabled by default, which causes received VLAN packets to be misinterpreted as being received by the trunk device. Fix by disabling VLAN tag stripping in the C+ Command Register. Debugged-by: ?????? Tested-by: ?????? Signed-off-by: Michael Brown --- src/drivers/net/realtek.c | 4 ++++ src/drivers/net/realtek.h | 1 + 2 files changed, 5 insertions(+) diff --git a/src/drivers/net/realtek.c b/src/drivers/net/realtek.c index a43efb6..80442ab 100644 --- a/src/drivers/net/realtek.c +++ b/src/drivers/net/realtek.c @@ -1067,11 +1067,15 @@ static void realtek_detect ( struct realtek_nic *rtl ) { * Note that enabling DAC seems to cause bizarre behaviour * (lockups, garbage data on the wire) on some systems, even * if only 32-bit addresses are used. + * + * Disable VLAN offload, since some cards seem to have it + * enabled by default. */ cpcr = readw ( rtl->regs + RTL_CPCR ); cpcr |= ( RTL_CPCR_MULRW | RTL_CPCR_CPRX | RTL_CPCR_CPTX ); if ( sizeof ( physaddr_t ) > sizeof ( uint32_t ) ) cpcr |= RTL_CPCR_DAC; + cpcr &= ~RTL_CPCR_VLAN; writew ( cpcr, rtl->regs + RTL_CPCR ); check_cpcr = readw ( rtl->regs + RTL_CPCR ); diff --git a/src/drivers/net/realtek.h b/src/drivers/net/realtek.h index d4642fd..8eefb6d 100644 --- a/src/drivers/net/realtek.h +++ b/src/drivers/net/realtek.h @@ -230,6 +230,7 @@ enum realtek_legacy_status { #define RTL_CPCR 0xe0 #define RTL_CPCR_DAC 0x0010 /**< PCI Dual Address Cycle Enable */ #define RTL_CPCR_MULRW 0x0008 /**< PCI Multiple Read/Write Enable */ +#define RTL_CPCR_VLAN 0x0040 /**< VLAN tag stripping enable */ #define RTL_CPCR_CPRX 0x0002 /**< C+ receive enable */ #define RTL_CPCR_CPTX 0x0001 /**< C+ transmit enable */ -- cgit v1.1