ip17xx: Maintain state->remove_tag incrementally
authorGabor Juhos <juhosg@openwrt.org>
Tue, 8 Jun 2010 20:18:34 +0000 (20:18 +0000)
committerGabor Juhos <juhosg@openwrt.org>
Tue, 8 Jun 2010 20:18:34 +0000 (20:18 +0000)
So far, state->remove_tag was sometimes updated incrementally, sometimes
left to correct_vlan_state() to recalculate. Since I want to avoid use of
correct_vlan_state() for IP175D, this patch fixes the only two remaining
places which leave state->remove_tag inconsistent with state->add_tag
and it drops the recalculation.

Signed-off-by: Martin Mares <mj@ucw.cz>
Signed-off-by: Patrick Horn <patrick.horn@gmail.com>
SVN-Revision: 21717

target/linux/generic-2.6/files/drivers/net/phy/ip175c.c

index 572659117aec3e9bac0b707186142f953d14666c..187fcfeaf59fad92716c85fdb53b03eabcea7227 100644 (file)
@@ -696,7 +696,6 @@ static void ip175c_correct_vlan_state(struct ip175c_state *state)
                                state->ports[i].shareports |= state->vlans[j].ports;
                }
        }
-       state->remove_tag = ((~state->add_tag) & ((1<<state->regs->NUM_PORTS)-1));
 }
 
 static int ip175c_update_state(struct ip175c_state *state)
@@ -742,7 +741,7 @@ static void ip175c_reset_vlan_config(struct ip175c_state *state)
 {
        int i;
 
-       state->remove_tag = 0x0000;
+       state->remove_tag = (state->vlan_enabled ? ((1<<state->regs->NUM_PORTS)-1) : 0x0000);
        state->add_tag = 0x0000;
        for (i = 0; i < MAX_VLANS; i++)
                state->vlans[i].ports = 0x0000;
@@ -821,12 +820,14 @@ static int ip175c_set_ports(struct switch_dev *dev, struct switch_val *val)
 
        state->vlans[val->port_vlan].ports = 0;
        for (i = 0; i < val->len; i++) {
-               int bitmask = (1<<val->value.ports[i].id);
+               unsigned int bitmask = (1<<val->value.ports[i].id);
                state->vlans[val->port_vlan].ports |= bitmask;
                if (val->value.ports[i].flags & (1<<SWITCH_PORT_FLAG_TAGGED)) {
                        state->add_tag |= bitmask;
+                       state->remove_tag &= (~bitmask);
                } else {
                        state->add_tag &= (~bitmask);
+                       state->remove_tag |= bitmask;
                }
        }