mirror of
				https://github.com/Ysurac/openmptcprouter.git
				synced 2025-03-09 15:40:20 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			86 lines
		
	
	
	
		
			2.9 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			86 lines
		
	
	
	
		
			2.9 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| From 3b4329230db8750bea7a56ef07f07cbbf5fc6c5a Mon Sep 17 00:00:00 2001
 | |
| From: Christian Marangi <ansuelsmth@gmail.com>
 | |
| Date: Tue, 4 Jul 2023 22:50:12 +0200
 | |
| Subject: [PATCH 19/20] net: dsa: qca8k: implement lag_fdb_add/del ops
 | |
| 
 | |
| Implement lag_fdb_add/del ops to correctly support using LAG interface.
 | |
| Qca8k switch supports declaring fdb entry for link aggregation by simply
 | |
| setting the DES_PORT bits to all the LAG member.
 | |
| 
 | |
| Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
 | |
| ---
 | |
|  drivers/net/dsa/qca/qca8k-8xxx.c   |  2 ++
 | |
|  drivers/net/dsa/qca/qca8k-common.c | 48 ++++++++++++++++++++++++++++++
 | |
|  drivers/net/dsa/qca/qca8k.h        |  6 ++++
 | |
|  3 files changed, 56 insertions(+)
 | |
| 
 | |
| --- a/drivers/net/dsa/qca/qca8k-8xxx.c
 | |
| +++ b/drivers/net/dsa/qca/qca8k-8xxx.c
 | |
| @@ -2012,6 +2012,8 @@ static const struct dsa_switch_ops qca8k
 | |
|  	.port_fdb_add		= qca8k_port_fdb_add,
 | |
|  	.port_fdb_del		= qca8k_port_fdb_del,
 | |
|  	.port_fdb_dump		= qca8k_port_fdb_dump,
 | |
| +	.lag_fdb_add		= qca8k_lag_fdb_add,
 | |
| +	.lag_fdb_del		= qca8k_lag_fdb_del,
 | |
|  	.port_mdb_add		= qca8k_port_mdb_add,
 | |
|  	.port_mdb_del		= qca8k_port_mdb_del,
 | |
|  	.port_mirror_add	= qca8k_port_mirror_add,
 | |
| --- a/drivers/net/dsa/qca/qca8k-common.c
 | |
| +++ b/drivers/net/dsa/qca/qca8k-common.c
 | |
| @@ -1215,6 +1215,42 @@ int qca8k_port_lag_leave(struct dsa_swit
 | |
|  	return qca8k_lag_refresh_portmap(ds, port, lag, true);
 | |
|  }
 | |
|  
 | |
| +int qca8k_lag_fdb_add(struct dsa_switch *ds, struct dsa_lag lag,
 | |
| +		      const unsigned char *addr, u16 vid,
 | |
| +		      struct dsa_db db)
 | |
| +{
 | |
| +	struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv;
 | |
| +	struct dsa_port *dp;
 | |
| +	u16 port_mask = 0;
 | |
| +
 | |
| +	/* Set the vid to the port vlan id if no vid is set */
 | |
| +	if (!vid)
 | |
| +		vid = QCA8K_PORT_VID_DEF;
 | |
| +
 | |
| +	dsa_lag_foreach_port(dp, ds->dst, &lag)
 | |
| +		port_mask |= BIT(dp->index);
 | |
| +
 | |
| +	return qca8k_port_fdb_insert(priv, addr, port_mask, vid);
 | |
| +}
 | |
| +
 | |
| +int qca8k_lag_fdb_del(struct dsa_switch *ds, struct dsa_lag lag,
 | |
| +		      const unsigned char *addr, u16 vid,
 | |
| +		      struct dsa_db db)
 | |
| +{
 | |
| +	struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv;
 | |
| +	struct dsa_port *dp;
 | |
| +	u16 port_mask = 0;
 | |
| +
 | |
| +	/* Set the vid to the port vlan id if no vid is set */
 | |
| +	if (!vid)
 | |
| +		vid = QCA8K_PORT_VID_DEF;
 | |
| +
 | |
| +	dsa_lag_foreach_port(dp, ds->dst, &lag)
 | |
| +	port_mask |= BIT(dp->index);
 | |
| +
 | |
| +	return qca8k_fdb_del(priv, addr, port_mask, vid);
 | |
| +}
 | |
| +
 | |
|  int qca8k_read_switch_id(struct qca8k_priv *priv)
 | |
|  {
 | |
|  	u32 val;
 | |
| --- a/drivers/net/dsa/qca/qca8k.h
 | |
| +++ b/drivers/net/dsa/qca/qca8k.h
 | |
| @@ -590,5 +590,11 @@ int qca8k_port_lag_join(struct dsa_switc
 | |
|  			struct netlink_ext_ack *extack);
 | |
|  int qca8k_port_lag_leave(struct dsa_switch *ds, int port,
 | |
|  			 struct dsa_lag lag);
 | |
| +int qca8k_lag_fdb_add(struct dsa_switch *ds, struct dsa_lag lag,
 | |
| +		      const unsigned char *addr, u16 vid,
 | |
| +		      struct dsa_db db);
 | |
| +int qca8k_lag_fdb_del(struct dsa_switch *ds, struct dsa_lag lag,
 | |
| +		      const unsigned char *addr, u16 vid,
 | |
| +		      struct dsa_db db);
 | |
|  
 | |
|  #endif /* __QCA8K_H */
 |