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:
		 Mathias Kresin
					Mathias Kresin
				
			
				
					committed by
					
						 Jo-Philipp Wich
						Jo-Philipp Wich
					
				
			
			
				
	
			
			
			 Jo-Philipp Wich
						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