ramips: mt7621: fix mtu setting with kernel 4.14
Since kernel 4.10 commit 61e84623ace3 ("net: centralize net_device
min/max MTU checking"), the range of mtu is [min_mtu, max_mtu], which
is [68, 1500] by default.
It's necessary to set a max_mtu if a mtu > 1500 is supported.
Signed-off-by: Mathias Kresin <dev@kresin.me>
(backported from 5da2c68d00)
			
			
This commit is contained in:
		
				
					committed by
					
						
						Jo-Philipp Wich
					
				
			
			
				
	
			
			
			
						parent
						
							3a507b2f9b
						
					
				
				
					commit
					b81774cff8
				
			@@ -1384,20 +1384,12 @@ static int fe_change_mtu(struct net_device *dev, int new_mtu)
 | 
				
			|||||||
	int frag_size, old_mtu;
 | 
						int frag_size, old_mtu;
 | 
				
			||||||
	u32 fwd_cfg;
 | 
						u32 fwd_cfg;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!(priv->flags & FE_FLAG_JUMBO_FRAME))
 | 
					 | 
				
			||||||
		return eth_change_mtu(dev, new_mtu);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (IS_ENABLED(CONFIG_SOC_MT7621))
 | 
					 | 
				
			||||||
		if (new_mtu > 2048)
 | 
					 | 
				
			||||||
			return -EINVAL;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	frag_size = fe_max_frag_size(new_mtu);
 | 
					 | 
				
			||||||
	if (new_mtu < 68 || frag_size > PAGE_SIZE)
 | 
					 | 
				
			||||||
		return -EINVAL;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	old_mtu = dev->mtu;
 | 
						old_mtu = dev->mtu;
 | 
				
			||||||
	dev->mtu = new_mtu;
 | 
						dev->mtu = new_mtu;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (!(priv->flags & FE_FLAG_JUMBO_FRAME))
 | 
				
			||||||
 | 
							return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* return early if the buffer sizes will not change */
 | 
						/* return early if the buffer sizes will not change */
 | 
				
			||||||
	if (old_mtu <= ETH_DATA_LEN && new_mtu <= ETH_DATA_LEN)
 | 
						if (old_mtu <= ETH_DATA_LEN && new_mtu <= ETH_DATA_LEN)
 | 
				
			||||||
		return 0;
 | 
							return 0;
 | 
				
			||||||
@@ -1419,6 +1411,7 @@ static int fe_change_mtu(struct net_device *dev, int new_mtu)
 | 
				
			|||||||
		if (new_mtu <= ETH_DATA_LEN) {
 | 
							if (new_mtu <= ETH_DATA_LEN) {
 | 
				
			||||||
			fwd_cfg &= ~FE_GDM1_JMB_EN;
 | 
								fwd_cfg &= ~FE_GDM1_JMB_EN;
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
 | 
								frag_size = fe_max_frag_size(new_mtu);
 | 
				
			||||||
			fwd_cfg &= ~(FE_GDM1_JMB_LEN_MASK << FE_GDM1_JMB_LEN_SHIFT);
 | 
								fwd_cfg &= ~(FE_GDM1_JMB_LEN_MASK << FE_GDM1_JMB_LEN_SHIFT);
 | 
				
			||||||
			fwd_cfg |= (DIV_ROUND_UP(frag_size, 1024) <<
 | 
								fwd_cfg |= (DIV_ROUND_UP(frag_size, 1024) <<
 | 
				
			||||||
			FE_GDM1_JMB_LEN_SHIFT) | FE_GDM1_JMB_EN;
 | 
								FE_GDM1_JMB_LEN_SHIFT) | FE_GDM1_JMB_EN;
 | 
				
			||||||
@@ -1552,6 +1545,9 @@ static int fe_probe(struct platform_device *pdev)
 | 
				
			|||||||
	netdev->vlan_features = netdev->hw_features & ~NETIF_F_HW_VLAN_CTAG_TX;
 | 
						netdev->vlan_features = netdev->hw_features & ~NETIF_F_HW_VLAN_CTAG_TX;
 | 
				
			||||||
	netdev->features |= netdev->hw_features;
 | 
						netdev->features |= netdev->hw_features;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (IS_ENABLED(CONFIG_SOC_MT7621))
 | 
				
			||||||
 | 
							netdev->max_mtu = 2048;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* fake rx vlan filter func. to support tx vlan offload func */
 | 
						/* fake rx vlan filter func. to support tx vlan offload func */
 | 
				
			||||||
	if (fe_reg_table[FE_REG_FE_DMA_VID_BASE])
 | 
						if (fe_reg_table[FE_REG_FE_DMA_VID_BASE])
 | 
				
			||||||
		netdev->features |= NETIF_F_HW_VLAN_CTAG_FILTER;
 | 
							netdev->features |= NETIF_F_HW_VLAN_CTAG_FILTER;
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user