Changeset 42653


Ignore:
Timestamp:
2014-09-23T12:19:58+02:00 (3 years ago)
Author:
nbd
Message:

ar71xx: ar8216: tagged+untagged on ar8327 (#12181)

This allows tagged and untagged traffic together on the same port on ar8327
switch devices.

I looked at the first attempt to do this in r40777 (ar71xx: Fix tagged+untagged
operation on AR8327N (#12181)). I also set the vlan and port egress policies
like that change. But I change vlan_tagged in an less intrusive way. The
tagged/untagged decision is now based on the following rules:

  • if vid != pvid then traffic is always tagged
  • if vid == pvid then vlan_tagged stores if the traffic should be tagged

Tested on TP-Link WDR-3600 (ar8327N).

Signed-off-by: Valentin Spreckels <Valentin.Spreckels@…>

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/target/linux/generic/files/drivers/net/phy/ar8216.c

    r42652 r42653  
    17491749                else if (priv->vlan == 0) 
    17501750                        mode = AR8327_VTU_FUNC0_EG_MODE_KEEP; 
    1751                 else if (priv->vlan_tagged & BIT(i)) 
     1751                else if ((priv->vlan_tagged & BIT(i)) || (priv->vlan_id[priv->pvid[i]] != vid)) 
    17521752                        mode = AR8327_VTU_FUNC0_EG_MODE_TAG; 
    17531753                else 
     
    17681768        if (priv->vlan) { 
    17691769                pvid = priv->vlan_id[priv->pvid[port]]; 
    1770                 if (priv->vlan_tagged & (1 << port)) 
    1771                         egress = AR8327_PORT_VLAN1_OUT_MODE_TAG; 
    1772                 else 
    1773                         egress = AR8327_PORT_VLAN1_OUT_MODE_UNTAG; 
     1770                egress = AR8327_PORT_VLAN1_OUT_MODE_UNMOD; 
    17741771                ingress = AR8216_IN_SECURE; 
    17751772        } else { 
     
    19041901 
    19051902static int 
     1903ar8327_sw_get_ports(struct switch_dev *dev, struct switch_val *val) 
     1904{ 
     1905        struct ar8xxx_priv *priv = swdev_to_ar8xxx(dev); 
     1906        u8 ports = priv->vlan_table[val->port_vlan]; 
     1907        int i; 
     1908 
     1909        val->len = 0; 
     1910        for (i = 0; i < dev->ports; i++) { 
     1911                struct switch_port *p; 
     1912 
     1913                if (!(ports & (1 << i))) 
     1914                        continue; 
     1915 
     1916                p = &val->value.ports[val->len++]; 
     1917                p->id = i; 
     1918                if ((priv->vlan_tagged & (1 << i)) || (priv->pvid[i] != val->port_vlan)) 
     1919                        p->flags = (1 << SWITCH_PORT_FLAG_TAGGED); 
     1920                else 
     1921                        p->flags = 0; 
     1922        } 
     1923        return 0; 
     1924} 
     1925 
     1926static int 
    19061927ar8xxx_sw_set_ports(struct switch_dev *dev, struct switch_val *val) 
    19071928{ 
     
    19271948                                priv->vlan_table[j] &= ~(1 << p->id); 
    19281949                        } 
     1950                } 
     1951 
     1952                *vt |= 1 << p->id; 
     1953        } 
     1954        return 0; 
     1955} 
     1956 
     1957static int 
     1958ar8327_sw_set_ports(struct switch_dev *dev, struct switch_val *val) 
     1959{ 
     1960        struct ar8xxx_priv *priv = swdev_to_ar8xxx(dev); 
     1961        u8 *vt = &priv->vlan_table[val->port_vlan]; 
     1962        int i, j; 
     1963 
     1964        *vt = 0; 
     1965        for (i = 0; i < val->len; i++) { 
     1966                struct switch_port *p = &val->value.ports[i]; 
     1967 
     1968                if (p->flags & (1 << SWITCH_PORT_FLAG_TAGGED)) { 
     1969                        if (val->port_vlan == priv->pvid[p->id]) { 
     1970                                priv->vlan_tagged |= (1 << p->id); 
     1971                        } 
     1972                } else { 
     1973                        priv->vlan_tagged &= ~(1 << p->id); 
     1974                        priv->pvid[p->id] = val->port_vlan; 
    19291975                } 
    19301976 
     
    24762522        .get_port_pvid = ar8xxx_sw_get_pvid, 
    24772523        .set_port_pvid = ar8xxx_sw_set_pvid, 
    2478         .get_vlan_ports = ar8xxx_sw_get_ports, 
    2479         .set_vlan_ports = ar8xxx_sw_set_ports, 
     2524        .get_vlan_ports = ar8327_sw_get_ports, 
     2525        .set_vlan_ports = ar8327_sw_set_ports, 
    24802526        .apply_config = ar8xxx_sw_hw_apply, 
    24812527        .reset_switch = ar8xxx_sw_reset_switch, 
Note: See TracChangeset for help on using the changeset viewer.