 f584fb2f7e
			
		
	
	f584fb2f7e
	
	
	
		
			
			Import some accepted and pending upstream patches for mtk_eth_soc, replacing some semantically equivalent local patches and fixing issues when operating the PCS in 1G SGMII mode. Signed-off-by: Daniel Golle <daniel@makrotopia.org>
		
			
				
	
	
		
			94 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			94 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| From: Felix Fietkau <nbd@nbd.name>
 | |
| Date: Thu, 3 Nov 2022 17:49:44 +0100
 | |
| Subject: [PATCH] net: ethernet: mediatek: ppe: assign per-port queues
 | |
|  for offloaded traffic
 | |
| 
 | |
| Keeps traffic sent to the switch within link speed limits
 | |
| 
 | |
| Signed-off-by: Felix Fietkau <nbd@nbd.name>
 | |
| ---
 | |
| 
 | |
| --- a/drivers/net/ethernet/mediatek/mtk_ppe.c
 | |
| +++ b/drivers/net/ethernet/mediatek/mtk_ppe.c
 | |
| @@ -445,6 +445,24 @@ static inline bool mtk_foe_entry_usable(
 | |
|  	       FIELD_GET(MTK_FOE_IB1_STATE, entry->ib1) != MTK_FOE_STATE_BIND;
 | |
|  }
 | |
|  
 | |
| +int mtk_foe_entry_set_queue(struct mtk_eth *eth, struct mtk_foe_entry *entry,
 | |
| +			    unsigned int queue)
 | |
| +{
 | |
| +	u32 *ib2 = mtk_foe_entry_ib2(eth, entry);
 | |
| +
 | |
| +	if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) {
 | |
| +		*ib2 &= ~MTK_FOE_IB2_QID_V2;
 | |
| +		*ib2 |= FIELD_PREP(MTK_FOE_IB2_QID_V2, queue);
 | |
| +		*ib2 |= MTK_FOE_IB2_PSE_QOS_V2;
 | |
| +	} else {
 | |
| +		*ib2 &= ~MTK_FOE_IB2_QID;
 | |
| +		*ib2 |= FIELD_PREP(MTK_FOE_IB2_QID, queue);
 | |
| +		*ib2 |= MTK_FOE_IB2_PSE_QOS;
 | |
| +	}
 | |
| +
 | |
| +	return 0;
 | |
| +}
 | |
| +
 | |
|  static bool
 | |
|  mtk_flow_entry_match(struct mtk_eth *eth, struct mtk_flow_entry *entry,
 | |
|  		     struct mtk_foe_entry *data)
 | |
| --- a/drivers/net/ethernet/mediatek/mtk_ppe.h
 | |
| +++ b/drivers/net/ethernet/mediatek/mtk_ppe.h
 | |
| @@ -69,7 +69,9 @@ enum {
 | |
|  #define MTK_FOE_IB2_DSCP		GENMASK(31, 24)
 | |
|  
 | |
|  /* CONFIG_MEDIATEK_NETSYS_V2 */
 | |
| +#define MTK_FOE_IB2_QID_V2			GENMASK(6, 0)
 | |
|  #define MTK_FOE_IB2_PORT_MG_V2		BIT(7)
 | |
| +#define MTK_FOE_IB2_PSE_QOS_V2		BIT(8)
 | |
|  #define MTK_FOE_IB2_DEST_PORT_V2	GENMASK(12, 9)
 | |
|  #define MTK_FOE_IB2_MULTICAST_V2	BIT(13)
 | |
|  #define MTK_FOE_IB2_WDMA_WINFO_V2	BIT(19)
 | |
| @@ -369,6 +371,8 @@ int mtk_foe_entry_set_pppoe(struct mtk_e
 | |
|  			    int sid);
 | |
|  int mtk_foe_entry_set_wdma(struct mtk_eth *eth, struct mtk_foe_entry *entry,
 | |
|  			   int wdma_idx, int txq, int bss, int wcid);
 | |
| +int mtk_foe_entry_set_queue(struct mtk_eth *eth, struct mtk_foe_entry *entry,
 | |
| +			    unsigned int queue);
 | |
|  int mtk_foe_entry_commit(struct mtk_ppe *ppe, struct mtk_flow_entry *entry);
 | |
|  void mtk_foe_entry_clear(struct mtk_ppe *ppe, struct mtk_flow_entry *entry);
 | |
|  int mtk_foe_entry_idle_time(struct mtk_ppe *ppe, struct mtk_flow_entry *entry);
 | |
| --- a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c
 | |
| +++ b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c
 | |
| @@ -188,7 +188,7 @@ mtk_flow_set_output_device(struct mtk_et
 | |
|  			   int *wed_index)
 | |
|  {
 | |
|  	struct mtk_wdma_info info = {};
 | |
| -	int pse_port, dsa_port;
 | |
| +	int pse_port, dsa_port, queue;
 | |
|  
 | |
|  	if (mtk_flow_get_wdma_info(dev, dest_mac, &info) == 0) {
 | |
|  		mtk_foe_entry_set_wdma(eth, foe, info.wdma_idx, info.queue,
 | |
| @@ -212,8 +212,6 @@ mtk_flow_set_output_device(struct mtk_et
 | |
|  	}
 | |
|  
 | |
|  	dsa_port = mtk_flow_get_dsa_port(&dev);
 | |
| -	if (dsa_port >= 0)
 | |
| -		mtk_foe_entry_set_dsa(eth, foe, dsa_port);
 | |
|  
 | |
|  	if (dev == eth->netdev[0])
 | |
|  		pse_port = 1;
 | |
| @@ -222,6 +220,14 @@ mtk_flow_set_output_device(struct mtk_et
 | |
|  	else
 | |
|  		return -EOPNOTSUPP;
 | |
|  
 | |
| +	if (dsa_port >= 0) {
 | |
| +		mtk_foe_entry_set_dsa(eth, foe, dsa_port);
 | |
| +		queue = 3 + dsa_port;
 | |
| +	} else {
 | |
| +		queue = pse_port - 1;
 | |
| +	}
 | |
| +	mtk_foe_entry_set_queue(eth, foe, queue);
 | |
| +
 | |
|  out:
 | |
|  	mtk_foe_entry_set_pse_port(eth, foe, pse_port);
 | |
|  
 |