bool untagged = vlan->flags & BRIDGE_VLAN_INFO_UNTAGGED;
        bool pvid = vlan->flags & BRIDGE_VLAN_INFO_PVID;
        struct b53_vlan *vl;
+       u16 old_pvid, new_pvid;
        int err;
 
        err = b53_vlan_prepare(ds, port, vlan);
        if (err)
                return err;
 
+       b53_read16(dev, B53_VLAN_PAGE, B53_VLAN_PORT_DEF_TAG(port), &old_pvid);
+       if (pvid)
+               new_pvid = vlan->vid;
+       else if (!pvid && vlan->vid == old_pvid)
+               new_pvid = b53_default_pvid(dev);
+       else
+               new_pvid = old_pvid;
+
        vl = &dev->vlans[vlan->vid];
 
        b53_get_vlan_entry(dev, vlan->vid, vl);
        b53_set_vlan_entry(dev, vlan->vid, vl);
        b53_fast_age_vlan(dev, vlan->vid);
 
-       if (pvid && !dsa_is_cpu_port(ds, port)) {
+       if (!dsa_is_cpu_port(ds, port) && new_pvid != old_pvid) {
                b53_write16(dev, B53_VLAN_PAGE, B53_VLAN_PORT_DEF_TAG(port),
-                           vlan->vid);
+                           new_pvid);
                b53_fast_age_vlan(dev, vlan->vid);
        }