mirror of
				git://git.openwrt.org/openwrt/openwrt.git
				synced 2025-11-03 22:44:27 -05:00 
			
		
		
		
	Fixes issues on MT7621 and MT7623 switch ports, and PHY ports on all SoC Signed-off-by: Felix Fietkau <nbd@nbd.name>
		
			
				
	
	
		
			43 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			43 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
From: Felix Fietkau <nbd@nbd.name>
 | 
						|
Date: Wed, 29 Mar 2023 16:02:54 +0200
 | 
						|
Subject: [PATCH] net: ethernet: mtk_eth_soc: fix remaining throughput
 | 
						|
 regression
 | 
						|
 | 
						|
Based on further tests, it seems that the QDMA shaper is not able to
 | 
						|
perform shaping close to the MAC link rate without throughput loss.
 | 
						|
This cannot be compensated by increasing the shaping rate, so it seems
 | 
						|
to be an internal limit.
 | 
						|
 | 
						|
Fix the remaining throughput regression by detecting that condition and
 | 
						|
limiting shaping to ports with lower link speed.
 | 
						|
 | 
						|
This patch intentionally ignores link speed gain from TRGMII, because
 | 
						|
even on such links, shaping to 1000 Mbit/s incurs some throughput
 | 
						|
degradation.
 | 
						|
 | 
						|
Fixes: f63959c7eec3 ("net: ethernet: mtk_eth_soc: implement multi-queue support for per-port queues")
 | 
						|
Reported-by: Frank Wunderlich <frank-w@public-files.de>
 | 
						|
Signed-off-by: Felix Fietkau <nbd@nbd.name>
 | 
						|
---
 | 
						|
 | 
						|
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
 | 
						|
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
 | 
						|
@@ -667,6 +667,7 @@ static void mtk_mac_link_up(struct phyli
 | 
						|
 		 MAC_MCR_FORCE_RX_FC);
 | 
						|
 
 | 
						|
 	/* Configure speed */
 | 
						|
+	mac->speed = speed;
 | 
						|
 	switch (speed) {
 | 
						|
 	case SPEED_2500:
 | 
						|
 	case SPEED_1000:
 | 
						|
@@ -3145,6 +3146,9 @@ found:
 | 
						|
 	if (dp->index >= MTK_QDMA_NUM_QUEUES)
 | 
						|
 		return NOTIFY_DONE;
 | 
						|
 
 | 
						|
+	if (mac->speed > 0 && mac->speed <= s.base.speed)
 | 
						|
+		s.base.speed = 0;
 | 
						|
+
 | 
						|
 	mtk_set_queue_speed(eth, dp->index + 3, s.base.speed);
 | 
						|
 
 | 
						|
 	return NOTIFY_DONE;
 |