kernel: more fixes for mtk_eth_soc performance optimization
- fix features sync between netdevs
- fix crash in dsa_switch_rcv
Fixes: ceb1451c10 ("kernel: add mediatek soc ethernet performance improvements")
Signed-off-by: Felix Fietkau <nbd@nbd.name>
			
			
This commit is contained in:
		| @@ -45,7 +45,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | |||||||
|  	struct dsa_port *cpu_dp = dev->dsa_ptr; |  	struct dsa_port *cpu_dp = dev->dsa_ptr; | ||||||
|  	struct sk_buff *nskb = NULL; |  	struct sk_buff *nskb = NULL; | ||||||
|  	struct dsa_slave_priv *p; |  	struct dsa_slave_priv *p; | ||||||
| @@ -238,7 +240,21 @@ static int dsa_switch_rcv(struct sk_buff | @@ -238,7 +240,22 @@ static int dsa_switch_rcv(struct sk_buff | ||||||
|  	if (!skb) |  	if (!skb) | ||||||
|  		return 0; |  		return 0; | ||||||
|   |   | ||||||
| @@ -53,14 +53,15 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | |||||||
| +	if (md_dst && md_dst->type == METADATA_HW_PORT_MUX) { | +	if (md_dst && md_dst->type == METADATA_HW_PORT_MUX) { | ||||||
| +		unsigned int port = md_dst->u.port_info.port_id; | +		unsigned int port = md_dst->u.port_info.port_id; | ||||||
| + | + | ||||||
| +		dsa_default_offload_fwd_mark(skb); |  | ||||||
| +		skb_dst_set(skb, NULL); | +		skb_dst_set(skb, NULL); | ||||||
| +		if (!skb_has_extensions(skb)) | +		if (!skb_has_extensions(skb)) | ||||||
| +			skb->slow_gro = 0; | +			skb->slow_gro = 0; | ||||||
| + | + | ||||||
| +		skb->dev = dsa_master_find_slave(dev, 0, port); | +		skb->dev = dsa_master_find_slave(dev, 0, port); | ||||||
| +		if (skb->dev) | +		if (likely(skb->dev)) { | ||||||
|  | +			dsa_default_offload_fwd_mark(skb); | ||||||
| +			nskb = skb; | +			nskb = skb; | ||||||
|  | +		} | ||||||
| +	} else { | +	} else { | ||||||
| +		nskb = cpu_dp->rcv(skb, dev); | +		nskb = cpu_dp->rcv(skb, dev); | ||||||
| +	} | +	} | ||||||
|   | |||||||
| @@ -52,39 +52,43 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | |||||||
|  		} |  		} | ||||||
|   |   | ||||||
|  		skb_record_rx_queue(skb, 0); |  		skb_record_rx_queue(skb, 0); | ||||||
| @@ -2793,15 +2800,25 @@ static netdev_features_t mtk_fix_feature | @@ -2793,15 +2800,30 @@ static netdev_features_t mtk_fix_feature | ||||||
|   |   | ||||||
|  static int mtk_set_features(struct net_device *dev, netdev_features_t features) |  static int mtk_set_features(struct net_device *dev, netdev_features_t features) | ||||||
|  { |  { | ||||||
| -	int err = 0; | -	int err = 0; | ||||||
| - |  | ||||||
| -	if (!((dev->features ^ features) & NETIF_F_LRO)) |  | ||||||
| -		return 0; |  | ||||||
| +	struct mtk_mac *mac = netdev_priv(dev); | +	struct mtk_mac *mac = netdev_priv(dev); | ||||||
| +	struct mtk_eth *eth = mac->hw; | +	struct mtk_eth *eth = mac->hw; | ||||||
| +	netdev_features_t diff = dev->features ^ features; | +	netdev_features_t diff = dev->features ^ features; | ||||||
| +	int i; | +	int i; | ||||||
|  | + | ||||||
|  | +	if ((diff & NETIF_F_LRO) && !(features & NETIF_F_LRO)) | ||||||
|  | +		mtk_hwlro_netdev_disable(dev); | ||||||
|  |   | ||||||
|  | -	if (!((dev->features ^ features) & NETIF_F_LRO)) | ||||||
|  | +	/* Set RX VLAN offloading */ | ||||||
|  | +	if (!(diff & NETIF_F_HW_VLAN_CTAG_RX)) | ||||||
|  |  		return 0; | ||||||
|   |   | ||||||
| -	if (!(features & NETIF_F_LRO)) | -	if (!(features & NETIF_F_LRO)) | ||||||
| +	if ((diff & NETIF_F_LRO) && !(features & NETIF_F_LRO)) | -		mtk_hwlro_netdev_disable(dev); | ||||||
|  		mtk_hwlro_netdev_disable(dev); | +	mtk_w32(eth, !!(features & NETIF_F_HW_VLAN_CTAG_RX), | ||||||
|  | +		MTK_CDMP_EG_CTRL); | ||||||
|   |   | ||||||
| -	return err; | -	return err; | ||||||
| +	/* Set RX VLAN offloading */ |  | ||||||
| +	if (diff & NETIF_F_HW_VLAN_CTAG_RX) |  | ||||||
| +		mtk_w32(eth, !!(features & NETIF_F_HW_VLAN_CTAG_RX), |  | ||||||
| +			MTK_CDMP_EG_CTRL); |  | ||||||
| + |  | ||||||
| +	/* sync features with other MAC */ | +	/* sync features with other MAC */ | ||||||
| +	for (i = 0; i < MTK_MAC_COUNT; i++) | +	for (i = 0; i < MTK_MAC_COUNT; i++) { | ||||||
| +		if (eth->netdev[i] && eth->netdev[i] != dev) | +		if (!eth->netdev[i] || eth->netdev[i] == dev) | ||||||
| +			eth->netdev[i]->features = features; | +			continue; | ||||||
|  | +		eth->netdev[i]->features &= ~NETIF_F_HW_VLAN_CTAG_RX; | ||||||
|  | +		eth->netdev[i]->features |= features & NETIF_F_HW_VLAN_CTAG_RX; | ||||||
|  | +	} | ||||||
| + | + | ||||||
| +	return 0; | +	return 0; | ||||||
|  } |  } | ||||||
|   |   | ||||||
|  /* wait for DMA to finish whatever it is doing before we start using it again */ |  /* wait for DMA to finish whatever it is doing before we start using it again */ | ||||||
| @@ -3083,11 +3100,45 @@ found: | @@ -3083,11 +3105,45 @@ found: | ||||||
|  	return NOTIFY_DONE; |  	return NOTIFY_DONE; | ||||||
|  } |  } | ||||||
|   |   | ||||||
| @@ -131,7 +135,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | |||||||
|   |   | ||||||
|  	err = phylink_of_phy_connect(mac->phylink, mac->of_node, 0); |  	err = phylink_of_phy_connect(mac->phylink, mac->of_node, 0); | ||||||
|  	if (err) { |  	if (err) { | ||||||
| @@ -3417,6 +3468,10 @@ static int mtk_hw_init(struct mtk_eth *e | @@ -3417,6 +3473,10 @@ static int mtk_hw_init(struct mtk_eth *e | ||||||
|  	 */ |  	 */ | ||||||
|  	val = mtk_r32(eth, MTK_CDMQ_IG_CTRL); |  	val = mtk_r32(eth, MTK_CDMQ_IG_CTRL); | ||||||
|  	mtk_w32(eth, val | MTK_CDMQ_STAG_EN, MTK_CDMQ_IG_CTRL); |  	mtk_w32(eth, val | MTK_CDMQ_STAG_EN, MTK_CDMQ_IG_CTRL); | ||||||
| @@ -142,7 +146,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | |||||||
|   |   | ||||||
|  	/* Enable RX VLan Offloading */ |  	/* Enable RX VLan Offloading */ | ||||||
|  	mtk_w32(eth, 1, MTK_CDMP_EG_CTRL); |  	mtk_w32(eth, 1, MTK_CDMP_EG_CTRL); | ||||||
| @@ -3634,6 +3689,12 @@ static int mtk_free_dev(struct mtk_eth * | @@ -3634,6 +3694,12 @@ static int mtk_free_dev(struct mtk_eth * | ||||||
|  		free_netdev(eth->netdev[i]); |  		free_netdev(eth->netdev[i]); | ||||||
|  	} |  	} | ||||||
|   |   | ||||||
|   | |||||||
| @@ -14,7 +14,7 @@ Signed-off-by: René van Dorst <opensource@vdorst.com> | |||||||
|  |  | ||||||
| --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c | --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c | ||||||
| +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c | +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c | ||||||
| @@ -3918,6 +3918,7 @@ static const struct net_device_ops mtk_n | @@ -4021,6 +4021,7 @@ static const struct net_device_ops mtk_n | ||||||
|   |   | ||||||
|  static int mtk_add_mac(struct mtk_eth *eth, struct device_node *np) |  static int mtk_add_mac(struct mtk_eth *eth, struct device_node *np) | ||||||
|  { |  { | ||||||
| @@ -22,7 +22,7 @@ Signed-off-by: René van Dorst <opensource@vdorst.com> | |||||||
|  	const __be32 *_id = of_get_property(np, "reg", NULL); |  	const __be32 *_id = of_get_property(np, "reg", NULL); | ||||||
|  	phy_interface_t phy_mode; |  	phy_interface_t phy_mode; | ||||||
|  	struct phylink *phylink; |  	struct phylink *phylink; | ||||||
| @@ -4046,6 +4047,9 @@ static int mtk_add_mac(struct mtk_eth *e | @@ -4149,6 +4150,9 @@ static int mtk_add_mac(struct mtk_eth *e | ||||||
|  		register_netdevice_notifier(&mac->device_notifier); |  		register_netdevice_notifier(&mac->device_notifier); | ||||||
|  	} |  	} | ||||||
|   |   | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Felix Fietkau
					Felix Fietkau