Skip to content

Commit 2333f65

Browse files
dthompsojacobmartin0
authored andcommitted
net: lan743x: permit VLAN-tagged packets up to configured MTU
BugLink: https://bugs.launchpad.net/bugs/2156928 VLAN-tagged interfaces on lan743x devices were previously unreachable via SSH and failed to respond to large ping packets (e.g. "ping -s 1469" given MTU=1500). In these scenarios, "ethtool -S" reports non-zero "RX Oversize Frame Errors". According to Microchip AN2948, the MAC_RX FSE (VLAN field size enforcement) bit determines whether frames with VLAN tags exceeding the base MTU plus tag length are discarded. The driver must set the MAC_RX.FSE bit before setting MAC_RX.RXEN to allow VLAN-tagged frames up to the interface MTU, preventing them from being treated as oversized. As a result, both the base and VLAN-tagged interfaces can use the same MTU without receive errors. Fixes: 23f0703 ("lan743x: Add main source files for new lan743x driver") Signed-off-by: David Thompson <davthompson@nvidia.com> Reviewed-by: Thangaraj Samynathan <Thangaraj.s@microchip.com> Reviewed-by: Nicolai Buchwitz <nb@tipi-net.de> Tested-by: Nicolai Buchwitz <nb@tipi-net.de> # lan7430 on arm64 (RevPi Link: https://patch.msgid.link/20260529210300.433135-1-davthompson@nvidia.com Signed-off-by: Jakub Kicinski <kuba@kernel.org> (cherry picked from commit 8173d22) Signed-off-by: David Thompson <davthompson@nvidia.com> Acked-by: Matthew R. Ochs <mochs@nvidia.com> Acked-by: Carol L Soto <csoto@nvidia.com> Signed-off-by: Brad Figg <bfigg@nvidia.com>
1 parent 21a4060 commit 2333f65

2 files changed

Lines changed: 33 additions & 0 deletions

File tree

drivers/net/ethernet/microchip/lan743x_main.c

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1218,6 +1218,36 @@ static void lan743x_mac_set_address(struct lan743x_adapter *adapter,
12181218
dev_dbg(&adapter->pdev->dev, "MAC address set to %pM\n", addr);
12191219
}
12201220

1221+
static void lan743x_mac_rx_enable_fse(struct lan743x_adapter *adapter)
1222+
{
1223+
u32 mac_rx;
1224+
bool rxen;
1225+
1226+
mac_rx = lan743x_csr_read(adapter, MAC_RX);
1227+
if (mac_rx & MAC_RX_FSE_)
1228+
return;
1229+
1230+
rxen = mac_rx & MAC_RX_RXEN_;
1231+
if (rxen) {
1232+
mac_rx &= ~MAC_RX_RXEN_;
1233+
lan743x_csr_write(adapter, MAC_RX, mac_rx);
1234+
lan743x_csr_wait_for_bit(adapter, MAC_RX, MAC_RX_RXD_,
1235+
1, 1000, 20000, 100);
1236+
}
1237+
1238+
/* Per AN2948, hardware prevents modification of the FSE bit while the
1239+
* MAC receiver is enabled (RXEN bit set). Use separate register write
1240+
* to assert the FSE bit before enabling the RXEN bit in MAC_RX
1241+
*/
1242+
mac_rx |= MAC_RX_FSE_;
1243+
lan743x_csr_write(adapter, MAC_RX, mac_rx);
1244+
1245+
if (rxen) {
1246+
mac_rx |= MAC_RX_RXEN_;
1247+
lan743x_csr_write(adapter, MAC_RX, mac_rx);
1248+
}
1249+
}
1250+
12211251
static int lan743x_mac_init(struct lan743x_adapter *adapter)
12221252
{
12231253
bool mac_address_valid = true;
@@ -1257,6 +1287,8 @@ static int lan743x_mac_init(struct lan743x_adapter *adapter)
12571287
lan743x_mac_set_address(adapter, adapter->mac_address);
12581288
eth_hw_addr_set(netdev, adapter->mac_address);
12591289

1290+
lan743x_mac_rx_enable_fse(adapter);
1291+
12601292
return 0;
12611293
}
12621294

drivers/net/ethernet/microchip/lan743x_main.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,7 @@
182182
#define MAC_RX (0x104)
183183
#define MAC_RX_MAX_SIZE_SHIFT_ (16)
184184
#define MAC_RX_MAX_SIZE_MASK_ (0x3FFF0000)
185+
#define MAC_RX_FSE_ BIT(2)
185186
#define MAC_RX_RXD_ BIT(1)
186187
#define MAC_RX_RXEN_ BIT(0)
187188

0 commit comments

Comments
 (0)