Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

net: ethernet: mediatek: support setting MTU

MT762x HW, except for MT7628, supports frame length up to 2048
(maximum length on GDM), so allow setting MTU up to 2030.

Also set the default frame length to the hardware default 1518.

Signed-off-by: DENG Qingfang <dqfext@gmail.com>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Link: https://lore.kernel.org/r/20210125042046.5599-1-dqfext@gmail.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

authored by

DENG Qingfang and committed by
Jakub Kicinski
4fd59792 8d21c882

+47 -8
+38 -5
drivers/net/ethernet/mediatek/mtk_eth_soc.c
··· 353 353 /* Setup gmac */ 354 354 mcr_cur = mtk_r32(mac->hw, MTK_MAC_MCR(mac->id)); 355 355 mcr_new = mcr_cur; 356 - mcr_new |= MAC_MCR_MAX_RX_1536 | MAC_MCR_IPG_CFG | MAC_MCR_FORCE_MODE | 356 + mcr_new |= MAC_MCR_IPG_CFG | MAC_MCR_FORCE_MODE | 357 357 MAC_MCR_BACKOFF_EN | MAC_MCR_BACKPR_EN | MAC_MCR_FORCE_LINK; 358 358 359 359 /* Only update control register when needed! */ ··· 759 759 static inline int mtk_max_frag_size(int mtu) 760 760 { 761 761 /* make sure buf_size will be at least MTK_MAX_RX_LENGTH */ 762 - if (mtu + MTK_RX_ETH_HLEN < MTK_MAX_RX_LENGTH) 763 - mtu = MTK_MAX_RX_LENGTH - MTK_RX_ETH_HLEN; 762 + if (mtu + MTK_RX_ETH_HLEN < MTK_MAX_RX_LENGTH_2K) 763 + mtu = MTK_MAX_RX_LENGTH_2K - MTK_RX_ETH_HLEN; 764 764 765 765 return SKB_DATA_ALIGN(MTK_RX_HLEN + mtu) + 766 766 SKB_DATA_ALIGN(sizeof(struct skb_shared_info)); ··· 771 771 int buf_size = frag_size - NET_SKB_PAD - NET_IP_ALIGN - 772 772 SKB_DATA_ALIGN(sizeof(struct skb_shared_info)); 773 773 774 - WARN_ON(buf_size < MTK_MAX_RX_LENGTH); 774 + WARN_ON(buf_size < MTK_MAX_RX_LENGTH_2K); 775 775 776 776 return buf_size; 777 777 } ··· 2499 2499 mtk_rx_irq_disable(eth, ~0); 2500 2500 } 2501 2501 2502 + static int mtk_change_mtu(struct net_device *dev, int new_mtu) 2503 + { 2504 + int length = new_mtu + MTK_RX_ETH_HLEN; 2505 + struct mtk_mac *mac = netdev_priv(dev); 2506 + struct mtk_eth *eth = mac->hw; 2507 + u32 mcr_cur, mcr_new; 2508 + 2509 + if (!MTK_HAS_CAPS(eth->soc->caps, MTK_SOC_MT7628)) { 2510 + mcr_cur = mtk_r32(mac->hw, MTK_MAC_MCR(mac->id)); 2511 + mcr_new = mcr_cur & ~MAC_MCR_MAX_RX_MASK; 2512 + 2513 + if (length <= 1518) 2514 + mcr_new |= MAC_MCR_MAX_RX(MAC_MCR_MAX_RX_1518); 2515 + else if (length <= 1536) 2516 + mcr_new |= MAC_MCR_MAX_RX(MAC_MCR_MAX_RX_1536); 2517 + else if (length <= 1552) 2518 + mcr_new |= MAC_MCR_MAX_RX(MAC_MCR_MAX_RX_1552); 2519 + else 2520 + mcr_new |= MAC_MCR_MAX_RX(MAC_MCR_MAX_RX_2048); 2521 + 2522 + if (mcr_new != mcr_cur) 2523 + mtk_w32(mac->hw, mcr_new, MTK_MAC_MCR(mac->id)); 2524 + } 2525 + 2526 + dev->mtu = new_mtu; 2527 + 2528 + return 0; 2529 + } 2530 + 2502 2531 static int mtk_do_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) 2503 2532 { 2504 2533 struct mtk_mac *mac = netdev_priv(dev); ··· 2824 2795 .ndo_set_mac_address = mtk_set_mac_address, 2825 2796 .ndo_validate_addr = eth_validate_addr, 2826 2797 .ndo_do_ioctl = mtk_do_ioctl, 2798 + .ndo_change_mtu = mtk_change_mtu, 2827 2799 .ndo_tx_timeout = mtk_tx_timeout, 2828 2800 .ndo_get_stats64 = mtk_get_stats64, 2829 2801 .ndo_fix_features = mtk_fix_features, ··· 2926 2896 eth->netdev[id]->irq = eth->irq[0]; 2927 2897 eth->netdev[id]->dev.of_node = np; 2928 2898 2929 - eth->netdev[id]->max_mtu = MTK_MAX_RX_LENGTH - MTK_RX_ETH_HLEN; 2899 + if (MTK_HAS_CAPS(eth->soc->caps, MTK_SOC_MT7628)) 2900 + eth->netdev[id]->max_mtu = MTK_MAX_RX_LENGTH - MTK_RX_ETH_HLEN; 2901 + else 2902 + eth->netdev[id]->max_mtu = MTK_MAX_RX_LENGTH_2K - MTK_RX_ETH_HLEN; 2930 2903 2931 2904 return 0; 2932 2905
+9 -3
drivers/net/ethernet/mediatek/mtk_eth_soc.h
··· 17 17 #include <linux/phylink.h> 18 18 19 19 #define MTK_QDMA_PAGE_SIZE 2048 20 - #define MTK_MAX_RX_LENGTH 1536 20 + #define MTK_MAX_RX_LENGTH 1536 21 + #define MTK_MAX_RX_LENGTH_2K 2048 21 22 #define MTK_TX_DMA_BUF_LEN 0x3fff 22 23 #define MTK_DMA_SIZE 256 23 24 #define MTK_NAPI_WEIGHT 64 24 25 #define MTK_MAC_COUNT 2 25 - #define MTK_RX_ETH_HLEN (VLAN_ETH_HLEN + VLAN_HLEN + ETH_FCS_LEN) 26 + #define MTK_RX_ETH_HLEN (ETH_HLEN + ETH_FCS_LEN) 26 27 #define MTK_RX_HLEN (NET_SKB_PAD + MTK_RX_ETH_HLEN + NET_IP_ALIGN) 27 28 #define MTK_DMA_DUMMY_DESC 0xffffffff 28 29 #define MTK_DEFAULT_MSG_ENABLE (NETIF_MSG_DRV | \ ··· 321 320 322 321 /* Mac control registers */ 323 322 #define MTK_MAC_MCR(x) (0x10100 + (x * 0x100)) 324 - #define MAC_MCR_MAX_RX_1536 BIT(24) 323 + #define MAC_MCR_MAX_RX_MASK GENMASK(25, 24) 324 + #define MAC_MCR_MAX_RX(_x) (MAC_MCR_MAX_RX_MASK & ((_x) << 24)) 325 + #define MAC_MCR_MAX_RX_1518 0x0 326 + #define MAC_MCR_MAX_RX_1536 0x1 327 + #define MAC_MCR_MAX_RX_1552 0x2 328 + #define MAC_MCR_MAX_RX_2048 0x3 325 329 #define MAC_MCR_IPG_CFG (BIT(18) | BIT(16)) 326 330 #define MAC_MCR_FORCE_MODE BIT(15) 327 331 #define MAC_MCR_TX_EN BIT(14)