generic ar8xxx: increase VLAN table for AR83x7
authorDavid Bauer <mail@david-bauer.net>
Sun, 24 Nov 2019 19:53:39 +0000 (20:53 +0100)
committerDavid Bauer <mail@david-bauer.net>
Sat, 30 Nov 2019 15:49:05 +0000 (16:49 +0100)
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@david-bauer.net>
target/linux/generic/files/drivers/net/phy/ar8216.c
target/linux/generic/files/drivers/net/phy/ar8216.h
target/linux/generic/files/drivers/net/phy/ar8327.c

index 683241cf1cee041ace2934b5963f63a68e44ec2f..5ace4e0b15c82e3f948a410443a575f3f7b8e477 100644 (file)
@@ -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 */
index 93170d5863c482b00ec3b7291713c4ec2f793f23..bf34fdb77509a65b9c1c79f87a592df05c5edb05 100644 (file)
@@ -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;
index 1878585b0c59f6e48636947c272f8612d4911ad8..4cbfa4d234b2b8668510b3513b0472406b605127 100644 (file)
@@ -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,