mirror of
git://projects.qi-hardware.com/openwrt-xburst.git
synced 2024-08-20 08:38:03 +03:00
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
This commit is contained in:
parent
d46e7c8da5
commit
27c4924de8
@ -278,6 +278,7 @@ struct ip175c_state {
|
|||||||
int num_vlans;
|
int num_vlans;
|
||||||
struct vlan_state {
|
struct vlan_state {
|
||||||
unsigned int ports;
|
unsigned int ports;
|
||||||
|
unsigned int tag; // VLAN tag (IP175D only)
|
||||||
} vlans[MAX_VLANS];
|
} vlans[MAX_VLANS];
|
||||||
const struct register_mappings *regs;
|
const struct register_mappings *regs;
|
||||||
reg proc_mii; // phy/reg for the low level register access via swconfig
|
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->remove_tag = (state->vlan_enabled ? ((1<<state->regs->NUM_PORTS)-1) : 0x0000);
|
||||||
state->add_tag = 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].ports = 0x0000;
|
||||||
|
state->vlans[i].tag = (i ? i : 16);
|
||||||
|
}
|
||||||
for (i = 0; i < MAX_PORTS; i++)
|
for (i = 0; i < MAX_PORTS; i++)
|
||||||
state->ports[i].pvid = 0;
|
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;
|
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)
|
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;
|
struct ip175c_state *state = dev->priv;
|
||||||
@ -1162,6 +1193,10 @@ enum Globals {
|
|||||||
IP175C_REGISTER_ERRNO,
|
IP175C_REGISTER_ERRNO,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum Vlans {
|
||||||
|
IP175C_VLAN_TAG,
|
||||||
|
};
|
||||||
|
|
||||||
static const struct switch_attr ip175c_global[] = {
|
static const struct switch_attr ip175c_global[] = {
|
||||||
[IP175C_ENABLE_VLAN] = {
|
[IP175C_ENABLE_VLAN] = {
|
||||||
.id = 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[] = {
|
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[] = {
|
static const struct switch_attr ip175c_port[] = {
|
||||||
|
Loading…
Reference in New Issue
Block a user