summaryrefslogtreecommitdiff
path: root/target/linux
diff options
context:
space:
mode:
authorjuhosg <juhosg@3c298f89-4303-0410-b956-a3cf2f4a3e73>2010-06-08 20:18:34 +0000
committerjuhosg <juhosg@3c298f89-4303-0410-b956-a3cf2f4a3e73>2010-06-08 20:18:34 +0000
commitd46e7c8da5b9c38a12ad9451eb83d65517c7b39d (patch)
treeb691f4508c94c8f79140d333a7168b32ce847714 /target/linux
parent29b4b3c0093af5966b7859d62589fe6c5c3f9cfd (diff)
ip17xx: Maintain state->remove_tag incrementally
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> git-svn-id: svn://svn.openwrt.org/openwrt/trunk@21717 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'target/linux')
-rw-r--r--target/linux/generic-2.6/files/drivers/net/phy/ip175c.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/target/linux/generic-2.6/files/drivers/net/phy/ip175c.c b/target/linux/generic-2.6/files/drivers/net/phy/ip175c.c
index 572659117a..187fcfeaf5 100644
--- a/target/linux/generic-2.6/files/drivers/net/phy/ip175c.c
+++ b/target/linux/generic-2.6/files/drivers/net/phy/ip175c.c
@@ -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;
}
}