kernel: ar83xx: add support to configure per port VLAN priority
Add support to allow for per switch port VLAN priority (PCP) bits for the ar8327/8337 chip using the swconfig utility. Tested on Netgear R7800 Signed-off-by: Tan Hong Hui <hhtan72@yahoo.com>
This commit is contained in:
		 Tan Hong Hui
					Tan Hong Hui
				
			
				
					committed by
					
						 John Crispin
						John Crispin
					
				
			
			
				
	
			
			
			 John Crispin
						John Crispin
					
				
			
						parent
						
							e16cc7a8c8
						
					
				
				
					commit
					1263d07b89
				
			| @@ -462,6 +462,7 @@ struct ar8xxx_priv { | |||||||
| 	bool mirror_tx; | 	bool mirror_tx; | ||||||
| 	int source_port; | 	int source_port; | ||||||
| 	int monitor_port; | 	int monitor_port; | ||||||
|  | 	u8 port_vlan_prio[AR8X16_MAX_PORTS]; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| u32 | u32 | ||||||
|   | |||||||
| @@ -926,10 +926,19 @@ ar8327_setup_port(struct ar8xxx_priv *priv, int port, u32 members) | |||||||
|  |  | ||||||
| 	t = pvid << AR8327_PORT_VLAN0_DEF_SVID_S; | 	t = pvid << AR8327_PORT_VLAN0_DEF_SVID_S; | ||||||
| 	t |= pvid << AR8327_PORT_VLAN0_DEF_CVID_S; | 	t |= pvid << AR8327_PORT_VLAN0_DEF_CVID_S; | ||||||
|  | 	if (priv->vlan && priv->port_vlan_prio[port] > 0) { | ||||||
|  | 		u32 prio = priv->port_vlan_prio[port]; | ||||||
|  |  | ||||||
|  | 		t |= prio << AR8327_PORT_VLAN0_DEF_SPRI_S; | ||||||
|  | 		t |= prio << AR8327_PORT_VLAN0_DEF_CPRI_S; | ||||||
|  | 	} | ||||||
| 	ar8xxx_write(priv, AR8327_REG_PORT_VLAN0(port), t); | 	ar8xxx_write(priv, AR8327_REG_PORT_VLAN0(port), t); | ||||||
|  |  | ||||||
| 	t = AR8327_PORT_VLAN1_PORT_VLAN_PROP; | 	t = AR8327_PORT_VLAN1_PORT_VLAN_PROP; | ||||||
| 	t |= egress << AR8327_PORT_VLAN1_OUT_MODE_S; | 	t |= egress << AR8327_PORT_VLAN1_OUT_MODE_S; | ||||||
|  | 	if (priv->vlan && priv->port_vlan_prio[port] > 0) | ||||||
|  | 		t |= AR8327_PORT_VLAN1_VLAN_PRI_PROP; | ||||||
|  |  | ||||||
| 	ar8xxx_write(priv, AR8327_REG_PORT_VLAN1(port), t); | 	ar8xxx_write(priv, AR8327_REG_PORT_VLAN1(port), t); | ||||||
|  |  | ||||||
| 	t = members; | 	t = members; | ||||||
| @@ -1268,6 +1277,37 @@ ar8327_sw_set_igmp_v3(struct switch_dev *dev, | |||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | static int | ||||||
|  | ar8327_sw_set_port_vlan_prio(struct switch_dev *dev, const struct switch_attr *attr, | ||||||
|  | 			     struct switch_val *val) | ||||||
|  | { | ||||||
|  | 	struct ar8xxx_priv *priv = swdev_to_ar8xxx(dev); | ||||||
|  | 	int port = val->port_vlan; | ||||||
|  |  | ||||||
|  | 	if (port >= dev->ports) | ||||||
|  | 		return -EINVAL; | ||||||
|  | 	if (port == 0 || port == 6) | ||||||
|  | 		return -EOPNOTSUPP; | ||||||
|  | 	if (val->value.i < 0 || val->value.i > 7) | ||||||
|  | 		return -EINVAL; | ||||||
|  |  | ||||||
|  | 	priv->port_vlan_prio[port] = val->value.i; | ||||||
|  |  | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static int | ||||||
|  | ar8327_sw_get_port_vlan_prio(struct switch_dev *dev, const struct switch_attr *attr, | ||||||
|  |                   struct switch_val *val) | ||||||
|  | { | ||||||
|  | 	struct ar8xxx_priv *priv = swdev_to_ar8xxx(dev); | ||||||
|  | 	int port = val->port_vlan; | ||||||
|  |  | ||||||
|  | 	val->value.i = priv->port_vlan_prio[port]; | ||||||
|  |  | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  |  | ||||||
| static const struct switch_attr ar8327_sw_attr_globals[] = { | static const struct switch_attr ar8327_sw_attr_globals[] = { | ||||||
| 	{ | 	{ | ||||||
| 		.type = SWITCH_TYPE_INT, | 		.type = SWITCH_TYPE_INT, | ||||||
| @@ -1389,6 +1429,14 @@ static const struct switch_attr ar8327_sw_attr_port[] = { | |||||||
| 		.get = ar8327_sw_get_port_igmp_snooping, | 		.get = ar8327_sw_get_port_igmp_snooping, | ||||||
| 		.max = 1 | 		.max = 1 | ||||||
| 	}, | 	}, | ||||||
|  | 	{ | ||||||
|  | 		.type = SWITCH_TYPE_INT, | ||||||
|  | 		.name = "vlan_prio", | ||||||
|  | 		.description = "Port VLAN default priority (VLAN PCP) (0-7)", | ||||||
|  | 		.set = ar8327_sw_set_port_vlan_prio, | ||||||
|  | 		.get = ar8327_sw_get_port_vlan_prio, | ||||||
|  | 		.max = 7, | ||||||
|  | 	}, | ||||||
| }; | }; | ||||||
|  |  | ||||||
| static const struct switch_dev_ops ar8327_sw_ops = { | static const struct switch_dev_ops ar8327_sw_ops = { | ||||||
|   | |||||||
| @@ -164,12 +164,18 @@ | |||||||
| #define   AR8327_FRAME_ACK_CTRL_S(_i)		(((_i) % 4) * 8) | #define   AR8327_FRAME_ACK_CTRL_S(_i)		(((_i) % 4) * 8) | ||||||
|  |  | ||||||
| #define AR8327_REG_PORT_VLAN0(_i)		(0x420 + (_i) * 0x8) | #define AR8327_REG_PORT_VLAN0(_i)		(0x420 + (_i) * 0x8) | ||||||
|  | #define   AR8327_PORT_VLAN0_DEF_PRI_MASK	BITS(0, 3) | ||||||
| #define   AR8327_PORT_VLAN0_DEF_SVID		BITS(0, 12) | #define   AR8327_PORT_VLAN0_DEF_SVID		BITS(0, 12) | ||||||
| #define   AR8327_PORT_VLAN0_DEF_SVID_S		0 | #define   AR8327_PORT_VLAN0_DEF_SVID_S		0 | ||||||
|  | #define   AR8327_PORT_VLAN0_DEF_SPRI		BITS(13, 3) | ||||||
|  | #define   AR8327_PORT_VLAN0_DEF_SPRI_S		13 | ||||||
| #define   AR8327_PORT_VLAN0_DEF_CVID		BITS(16, 12) | #define   AR8327_PORT_VLAN0_DEF_CVID		BITS(16, 12) | ||||||
| #define   AR8327_PORT_VLAN0_DEF_CVID_S		16 | #define   AR8327_PORT_VLAN0_DEF_CVID_S		16 | ||||||
|  | #define   AR8327_PORT_VLAN0_DEF_CPRI		BITS(29, 3) | ||||||
|  | #define   AR8327_PORT_VLAN0_DEF_CPRI_S		29 | ||||||
|  |  | ||||||
| #define AR8327_REG_PORT_VLAN1(_i)		(0x424 + (_i) * 0x8) | #define AR8327_REG_PORT_VLAN1(_i)		(0x424 + (_i) * 0x8) | ||||||
|  | #define   AR8327_PORT_VLAN1_VLAN_PRI_PROP	BIT(4) | ||||||
| #define   AR8327_PORT_VLAN1_PORT_VLAN_PROP	BIT(6) | #define   AR8327_PORT_VLAN1_PORT_VLAN_PROP	BIT(6) | ||||||
| #define   AR8327_PORT_VLAN1_OUT_MODE		BITS(12, 2) | #define   AR8327_PORT_VLAN1_OUT_MODE		BITS(12, 2) | ||||||
| #define   AR8327_PORT_VLAN1_OUT_MODE_S		12 | #define   AR8327_PORT_VLAN1_OUT_MODE_S		12 | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user