generic: rtl8366_smi: only assign pvid if no pvid was set yet
authorJonas Gorski <jogo@openwrt.org>
Fri, 18 Jan 2013 15:19:11 +0000 (15:19 +0000)
committerJonas Gorski <jogo@openwrt.org>
Fri, 18 Jan 2013 15:19:11 +0000 (15:19 +0000)
Only assign a pvid if the current pvid is 0. Fixes using mixed tagged
and untagged traffic on a port and the untagged vlan isn't the last one
of which the port is a member.

Tested on RTL8366S and RTL8367R.

Fixes #8501.

Signed-off-by: Jonas Gorski <jogo@openwrt.org>
SVN-Revision: 35227

target/linux/generic/files/drivers/net/phy/rtl8366_smi.c

index 804e827dbdb48ddf2fe53e3bd19e8b9fc964beac..d433908131fec723414839c26c68379fb802f994 100644 (file)
@@ -1109,6 +1109,7 @@ int rtl8366_sw_set_vlan_ports(struct switch_dev *dev, struct switch_val *val)
 
        port = &val->value.ports[0];
        for (i = 0; i < val->len; i++, port++) {
+               int pvid;
                member |= BIT(port->id);
 
                if (!(port->flags & BIT(SWITCH_PORT_FLAG_TAGGED)))
@@ -1118,9 +1119,14 @@ int rtl8366_sw_set_vlan_ports(struct switch_dev *dev, struct switch_val *val)
                 * To ensure that we have a valid MC entry for this VLAN,
                 * initialize the port VLAN ID here.
                 */
-               err = rtl8366_set_pvid(smi, port->id, val->port_vlan);
+               err = rtl8366_get_pvid(smi, port->id, &pvid);
                if (err < 0)
                        return err;
+               if (pvid == 0) {
+                       err = rtl8366_set_pvid(smi, port->id, val->port_vlan);
+                       if (err < 0)
+                               return err;
+               }
        }
 
        return rtl8366_set_vlan(smi, val->port_vlan, member, untag, 0);