|
|
@@ -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_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);
|
|
|
|
|
|
t = AR8327_PORT_VLAN1_PORT_VLAN_PROP;
|
|
|
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);
|
|
|
|
|
|
t = members;
|
|
|
@@ -1268,6 +1277,37 @@ ar8327_sw_set_igmp_v3(struct switch_dev *dev,
|
|
|
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[] = {
|
|
|
{
|
|
|
.type = SWITCH_TYPE_INT,
|
|
|
@@ -1389,6 +1429,14 @@ static const struct switch_attr ar8327_sw_attr_port[] = {
|
|
|
.get = ar8327_sw_get_port_igmp_snooping,
|
|
|
.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 = {
|