diff mbox series

[5.12] net: broadcom: bcm4908_enet: set MTU on open & on request

Message ID 20210212152135.27030-1-zajec5@gmail.com (mailing list archive)
State Accepted
Commit 14b3b46a67f78ade99eafcbf320105615e948569
Delegated to: Netdev Maintainers
Headers show
Series [5.12] net: broadcom: bcm4908_enet: set MTU on open & on request | expand

Checks

Context Check Description
netdev/cover_letter success Link
netdev/fixes_present success Link
netdev/patch_count success Link
netdev/tree_selection success Guessed tree name to be net-next
netdev/subject_prefix warning Target tree name not specified in the subject
netdev/cc_maintainers success CCed 5 of 5 maintainers
netdev/source_inline success Was 0 now: 0
netdev/verify_signedoff success Link
netdev/module_param success Was 0 now: 0
netdev/build_32bit success Errors and warnings before: 0 this patch: 0
netdev/kdoc success Errors and warnings before: 0 this patch: 0
netdev/verify_fixes success Link
netdev/checkpatch warning WARNING: line length of 92 exceeds 80 columns WARNING: line length of 98 exceeds 80 columns
netdev/build_allmodconfig_warn success Errors and warnings before: 0 this patch: 0
netdev/header_inline success Link
netdev/stable success Stable not CCed

Commit Message

Rafał Miłecki Feb. 12, 2021, 3:21 p.m. UTC
From: Rafał Miłecki <rafal@milecki.pl>

Hardware comes up with default max frame size set to 1518. When using it
with switch it results in actual Ethernet MTU 1492:
1518 - 14 (Ethernet header) - 4 (Broadcom's tag) - 4 (802.1q) - 4 (FCS)

Above means hardware in its default state can't handle standard Ethernet
traffic (MTU 1500).

Define maximum possible Ethernet overhead and always set MAC max frame
length accordingly. This change fixes handling Ethernet frames of length
1506 - 1514.

Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
---
If possible I'd like to get this fix for 5.12.
---
 drivers/net/ethernet/broadcom/bcm4908_enet.c | 31 ++++++++++++++++----
 1 file changed, 25 insertions(+), 6 deletions(-)

Comments

patchwork-bot+netdevbpf@kernel.org Feb. 15, 2021, 11:20 p.m. UTC | #1
Hello:

This patch was applied to netdev/net-next.git (refs/heads/master):

On Fri, 12 Feb 2021 16:21:35 +0100 you wrote:
> From: Rafał Miłecki <rafal@milecki.pl>
> 
> Hardware comes up with default max frame size set to 1518. When using it
> with switch it results in actual Ethernet MTU 1492:
> 1518 - 14 (Ethernet header) - 4 (Broadcom's tag) - 4 (802.1q) - 4 (FCS)
> 
> Above means hardware in its default state can't handle standard Ethernet
> traffic (MTU 1500).
> 
> [...]

Here is the summary with links:
  - [5.12] net: broadcom: bcm4908_enet: set MTU on open & on request
    https://git.kernel.org/netdev/net-next/c/14b3b46a67f7

You are awesome, thank you!
--
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html
diff mbox series

Patch

diff --git a/drivers/net/ethernet/broadcom/bcm4908_enet.c b/drivers/net/ethernet/broadcom/bcm4908_enet.c
index 0da8c8c73ba7..9be33dc98072 100644
--- a/drivers/net/ethernet/broadcom/bcm4908_enet.c
+++ b/drivers/net/ethernet/broadcom/bcm4908_enet.c
@@ -5,6 +5,7 @@ 
 
 #include <linux/delay.h>
 #include <linux/etherdevice.h>
+#include <linux/if_vlan.h>
 #include <linux/interrupt.h>
 #include <linux/module.h>
 #include <linux/of.h>
@@ -29,9 +30,10 @@ 
 						 ENET_DMA_CH_CFG_INT_BUFF_DONE)
 #define ENET_DMA_MAX_BURST_LEN			8 /* in 64 bit words */
 
-#define ENET_MTU_MIN				60
-#define ENET_MTU_MAX				1500 /* Is it possible to support 2044? */
-#define ENET_MTU_MAX_EXTRA_SIZE			32 /* L2 */
+#define ENET_MTU_MAX				ETH_DATA_LEN /* Is it possible to support 2044? */
+#define BRCM_MAX_TAG_LEN			6
+#define ENET_MAX_ETH_OVERHEAD			(ETH_HLEN + BRCM_MAX_TAG_LEN + VLAN_HLEN + \
+						 ETH_FCS_LEN + 4) /* 32 */
 
 struct bcm4908_enet_dma_ring_bd {
 	__le32 ctl;
@@ -135,6 +137,11 @@  static void bcm4908_enet_intrs_ack(struct bcm4908_enet *enet)
 	enet_write(enet, ENET_DMA_CH_RX_CFG + ENET_DMA_CH_CFG_INT_STAT, ENET_DMA_INT_DEFAULTS);
 }
 
+static void bcm4908_enet_set_mtu(struct bcm4908_enet *enet, int mtu)
+{
+	enet_umac_write(enet, UMAC_MAX_FRAME_LEN, mtu + ENET_MAX_ETH_OVERHEAD);
+}
+
 /***
  * DMA
  */
@@ -246,7 +253,7 @@  static int bcm4908_enet_dma_alloc_rx_buf(struct bcm4908_enet *enet, unsigned int
 	u32 tmp;
 	int err;
 
-	slot->len = ENET_MTU_MAX + ENET_MTU_MAX_EXTRA_SIZE;
+	slot->len = ENET_MTU_MAX + ENET_MAX_ETH_OVERHEAD;
 
 	slot->skb = netdev_alloc_skb(enet->netdev, slot->len);
 	if (!slot->skb)
@@ -374,6 +381,8 @@  static void bcm4908_enet_gmac_init(struct bcm4908_enet *enet)
 {
 	u32 cmd;
 
+	bcm4908_enet_set_mtu(enet, enet->netdev->mtu);
+
 	cmd = enet_umac_read(enet, UMAC_CMD);
 	enet_umac_write(enet, UMAC_CMD, cmd | CMD_SW_RESET);
 	enet_umac_write(enet, UMAC_CMD, cmd & ~CMD_SW_RESET);
@@ -559,7 +568,7 @@  static int bcm4908_enet_poll(struct napi_struct *napi, int weight)
 
 		len = (ctl & DMA_CTL_LEN_DESC_BUFLENGTH) >> DMA_CTL_LEN_DESC_BUFLENGTH_SHIFT;
 
-		if (len < ENET_MTU_MIN ||
+		if (len < ETH_ZLEN ||
 		    (ctl & (DMA_CTL_STATUS_SOP | DMA_CTL_STATUS_EOP)) != (DMA_CTL_STATUS_SOP | DMA_CTL_STATUS_EOP)) {
 			enet->netdev->stats.rx_dropped++;
 			break;
@@ -583,11 +592,21 @@  static int bcm4908_enet_poll(struct napi_struct *napi, int weight)
 	return handled;
 }
 
+static int bcm4908_enet_change_mtu(struct net_device *netdev, int new_mtu)
+{
+	struct bcm4908_enet *enet = netdev_priv(netdev);
+
+	bcm4908_enet_set_mtu(enet, new_mtu);
+
+	return 0;
+}
+
 static const struct net_device_ops bcm4908_enet_netdev_ops = {
 	.ndo_open = bcm4908_enet_open,
 	.ndo_stop = bcm4908_enet_stop,
 	.ndo_start_xmit = bcm4908_enet_start_xmit,
 	.ndo_set_mac_address = eth_mac_addr,
+	.ndo_change_mtu = bcm4908_enet_change_mtu,
 };
 
 static int bcm4908_enet_probe(struct platform_device *pdev)
@@ -625,7 +644,7 @@  static int bcm4908_enet_probe(struct platform_device *pdev)
 	eth_hw_addr_random(netdev);
 	netdev->netdev_ops = &bcm4908_enet_netdev_ops;
 	netdev->min_mtu = ETH_ZLEN;
-	netdev->mtu = ENET_MTU_MAX;
+	netdev->mtu = ETH_DATA_LEN;
 	netdev->max_mtu = ENET_MTU_MAX;
 	netif_napi_add(netdev, &enet->napi, bcm4908_enet_poll, 64);