[OpenWrt-Devel] [PATCH] generic ar8xxx: increase VLAN table for AR83x7

Martin Weinelt martin at darmstadt.freifunk.net
Sun Nov 24 18:29:16 EST 2019


Tested-by: Martin Weinelt <martin at linuxlounge.net>

On 11/24/19 11:21 PM, David Bauer wrote:
> The Atheros AR8327 and AR8337 have (according to their datasheet) a
> VLAN table with a maximum of 4096 entries.
> 
> Currently, there's a hard limit of 128 VLANs, which is the same as
> for most other Atheros switches. Increase this limit only for the
> AR83x7 series and modify some shared functions to allow them to work
> with a variable max VLAN count.
> 
> Signed-off-by: David Bauer <mail at david-bauer.net>
> ---
>   target/linux/generic/files/drivers/net/phy/ar8216.c | 10 +++++-----
>   target/linux/generic/files/drivers/net/phy/ar8216.h |  8 ++++++--
>   target/linux/generic/files/drivers/net/phy/ar8327.c |  4 ++--
>   3 files changed, 13 insertions(+), 9 deletions(-)
> 
> diff --git a/target/linux/generic/files/drivers/net/phy/ar8216.c b/target/linux/generic/files/drivers/net/phy/ar8216.c
> index 683241cf1c..5ace4e0b15 100644
> --- a/target/linux/generic/files/drivers/net/phy/ar8216.c
> +++ b/target/linux/generic/files/drivers/net/phy/ar8216.c
> @@ -1204,7 +1204,7 @@ ar8xxx_sw_set_vid(struct switch_dev *dev, const struct switch_attr *attr,
>   {
>   	struct ar8xxx_priv *priv = swdev_to_ar8xxx(dev);
>   
> -	if (val->port_vlan >= AR8X16_MAX_VLANS)
> +	if (val->port_vlan >= dev->vlans)
>   		return -EINVAL;
>   
>   	priv->vlan_id[val->port_vlan] = val->value.i;
> @@ -1237,7 +1237,7 @@ ar8xxx_sw_get_ports(struct switch_dev *dev, struct switch_val *val)
>   	u8 ports;
>   	int i;
>   
> -	if (val->port_vlan >= AR8X16_MAX_VLANS)
> +	if (val->port_vlan >= dev->vlans)
>   		return -EINVAL;
>   
>   	ports = priv->vlan_table[val->port_vlan];
> @@ -1277,7 +1277,7 @@ ar8xxx_sw_set_ports(struct switch_dev *dev, struct switch_val *val)
>   
>   			/* make sure that an untagged port does not
>   			 * appear in other vlans */
> -			for (j = 0; j < AR8X16_MAX_VLANS; j++) {
> +			for (j = 0; j < dev->vlans; j++) {
>   				if (j == val->port_vlan)
>   					continue;
>   				priv->vlan_table[j] &= ~(1 << p->id);
> @@ -1356,7 +1356,7 @@ ar8xxx_sw_hw_apply(struct switch_dev *dev)
>   	if (!priv->init) {
>   		/* calculate the port destination masks and load vlans
>   		 * into the vlan translation unit */
> -		for (j = 0; j < AR8X16_MAX_VLANS; j++) {
> +		for (j = 0; j < dev->vlans; j++) {
>   			u8 vp = priv->vlan_table[j];
>   
>   			if (!vp)
> @@ -1409,7 +1409,7 @@ ar8xxx_sw_reset_switch(struct switch_dev *dev)
>   	memset(&priv->vlan, 0, sizeof(struct ar8xxx_priv) -
>   		offsetof(struct ar8xxx_priv, vlan));
>   
> -	for (i = 0; i < AR8X16_MAX_VLANS; i++)
> +	for (i = 0; i < dev->vlans; i++)
>   		priv->vlan_id[i] = i;
>   
>   	/* Configure all ports */
> diff --git a/target/linux/generic/files/drivers/net/phy/ar8216.h b/target/linux/generic/files/drivers/net/phy/ar8216.h
> index 93170d5863..bf34fdb775 100644
> --- a/target/linux/generic/files/drivers/net/phy/ar8216.h
> +++ b/target/linux/generic/files/drivers/net/phy/ar8216.h
> @@ -31,6 +31,9 @@
>   
>   /* size of the vlan table */
>   #define AR8X16_MAX_VLANS	128
> +#define AR83X7_MAX_VLANS	4096
> +#define AR8XXX_MAX_VLANS	AR83X7_MAX_VLANS
> +
>   #define AR8X16_PROBE_RETRIES	10
>   #define AR8X16_MAX_PORTS	8
>   
> @@ -504,8 +507,9 @@ struct ar8xxx_priv {
>   
>   	/* all fields below are cleared on reset */
>   	bool vlan;
> -	u16 vlan_id[AR8X16_MAX_VLANS];
> -	u8 vlan_table[AR8X16_MAX_VLANS];
> +
> +	u16 vlan_id[AR8XXX_MAX_VLANS];
> +	u8 vlan_table[AR8XXX_MAX_VLANS];
>   	u8 vlan_tagged;
>   	u16 pvid[AR8X16_MAX_PORTS];
>   	int arl_age_time;
> diff --git a/target/linux/generic/files/drivers/net/phy/ar8327.c b/target/linux/generic/files/drivers/net/phy/ar8327.c
> index 1878585b0c..4cbfa4d234 100644
> --- a/target/linux/generic/files/drivers/net/phy/ar8327.c
> +++ b/target/linux/generic/files/drivers/net/phy/ar8327.c
> @@ -1481,7 +1481,7 @@ const struct ar8xxx_chip ar8327_chip = {
>   
>   	.name = "Atheros AR8327",
>   	.ports = AR8327_NUM_PORTS,
> -	.vlans = AR8X16_MAX_VLANS,
> +	.vlans = AR83X7_MAX_VLANS,
>   	.swops = &ar8327_sw_ops,
>   
>   	.reg_port_stats_start = 0x1000,
> @@ -1518,7 +1518,7 @@ const struct ar8xxx_chip ar8337_chip = {
>   
>   	.name = "Atheros AR8337",
>   	.ports = AR8327_NUM_PORTS,
> -	.vlans = AR8X16_MAX_VLANS,
> +	.vlans = AR83X7_MAX_VLANS,
>   	.swops = &ar8327_sw_ops,
>   
>   	.reg_port_stats_start = 0x1000,
> 

-- 
Und im übrigen bin ich der Meinung, dass Geräte mit weniger als 8MB 
Flash und 64MB RAM zerstört werden müssen.
-- frei nach Marcus Porcious Cato der Ältere

_______________________________________________
openwrt-devel mailing list
openwrt-devel at lists.openwrt.org
https://lists.openwrt.org/mailman/listinfo/openwrt-devel


More information about the openwrt-devel mailing list