diff options
| author | juhosg <juhosg@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2010-06-08 20:18:38 +0000 | 
|---|---|---|
| committer | juhosg <juhosg@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2010-06-08 20:18:38 +0000 | 
| commit | 27c4924de89ab58db82de5bf5b34781ff2665a45 (patch) | |
| tree | 1e8806f5b6ff60c27e4c9988927e7b1f0d6b306a /target/linux/generic-2.6/files/drivers/net/phy | |
| parent | d46e7c8da5b9c38a12ad9451eb83d65517c7b39d (diff) | |
ip17xx: Add VLAN tag field
Since IP175D uses tag-based VLANs, we need an ability to set VLAN tag
of every VLAN.
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@21718 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'target/linux/generic-2.6/files/drivers/net/phy')
| -rw-r--r-- | target/linux/generic-2.6/files/drivers/net/phy/ip175c.c | 45 | 
1 files changed, 44 insertions, 1 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 187fcfeaf..706c973c1 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 @@ -278,6 +278,7 @@ struct ip175c_state {  	int num_vlans;  	struct vlan_state {  		unsigned int ports; +		unsigned int tag;	// VLAN tag (IP175D only)  	} vlans[MAX_VLANS];  	const struct register_mappings *regs;  	reg proc_mii; 	// phy/reg for the low level register access via swconfig @@ -743,8 +744,10 @@ static void ip175c_reset_vlan_config(struct ip175c_state *state)  	state->remove_tag = (state->vlan_enabled ? ((1<<state->regs->NUM_PORTS)-1) : 0x0000);  	state->add_tag = 0x0000; -	for (i = 0; i < MAX_VLANS; i++) +	for (i = 0; i < MAX_VLANS; i++) {  		state->vlans[i].ports = 0x0000; +		state->vlans[i].tag = (i ? i : 16); +	}  	for (i = 0; i < MAX_PORTS; i++)  		state->ports[i].pvid = 0;  } @@ -1012,6 +1015,34 @@ static int ip175c_read_name(struct switch_dev *dev, const struct switch_attr *at  	return 0;  } +static int ip175c_get_tag(struct switch_dev *dev, const struct switch_attr *attr, struct switch_val *val) +{ +	struct ip175c_state *state = dev->priv; +	int vlan = val->port_vlan; + +	if (vlan < 0 || vlan >= MAX_VLANS) +		return -EINVAL; + +	val->value.i = state->vlans[vlan].tag; +	return 0; +} + +static int ip175c_set_tag(struct switch_dev *dev, const struct switch_attr *attr, struct switch_val *val) +{ +	struct ip175c_state *state = dev->priv; +	int vlan = val->port_vlan; +	int tag = val->value.i; + +	if (vlan < 0 || vlan >= MAX_VLANS) +		return -EINVAL; + +	if (tag < 0 || tag > 4095) +		return -EINVAL; + +	state->vlans[vlan].tag = tag; +	return state->regs->update_state(state); +} +  static int ip175c_set_port_speed(struct switch_dev *dev, const struct switch_attr *attr, struct switch_val *val)  {  	struct ip175c_state *state = dev->priv; @@ -1162,6 +1193,10 @@ enum Globals {  	IP175C_REGISTER_ERRNO,  }; +enum Vlans { +	IP175C_VLAN_TAG, +}; +  static const struct switch_attr ip175c_global[] = {  	[IP175C_ENABLE_VLAN] = {  		.id = IP175C_ENABLE_VLAN, @@ -1207,6 +1242,14 @@ static const struct switch_attr ip175c_global[] = {  };  static const struct switch_attr ip175c_vlan[] = { +	[IP175C_VLAN_TAG] = { +		.id = IP175C_VLAN_TAG, +		.type = SWITCH_TYPE_INT, +		.description = "VLAN tag (0-4095) [IP175D only]", +		.name = "tag", +		.get = ip175c_get_tag, +		.set = ip175c_set_tag, +	}  };  static const struct switch_attr ip175c_port[] = { | 
