From: jow Date: Thu, 9 Sep 2010 23:21:41 +0000 (+0000) Subject: [backfire] merge r22702, r22703 and r22704 X-Git-Url: http://git.archive.openwrt.org/?a=commitdiff_plain;h=2786ed2e1b4ec6e1aab4ff4f9adc3a7013f8e828;p=10.03%2Fopenwrt.git [backfire] merge r22702, r22703 and r22704 git-svn-id: svn://svn.openwrt.org/openwrt/branches/backfire@22994 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- diff --git a/target/linux/generic-2.6/files/drivers/net/phy/rtl8366_smi.c b/target/linux/generic-2.6/files/drivers/net/phy/rtl8366_smi.c index d3e6b25fe..dc83ba7d4 100644 --- a/target/linux/generic-2.6/files/drivers/net/phy/rtl8366_smi.c +++ b/target/linux/generic-2.6/files/drivers/net/phy/rtl8366_smi.c @@ -448,12 +448,53 @@ static int rtl8366_set_pvid(struct rtl8366_smi *smi, unsigned port, return -ENOSPC; } +static int rtl8366_enable_vlan(struct rtl8366_smi *smi, int enable) +{ + int err; + + err = smi->ops->enable_vlan(smi, enable); + if (err) + return err; + + smi->vlan_enabled = enable; + + if (!enable) { + smi->vlan4k_enabled = 0; + err = smi->ops->enable_vlan4k(smi, enable); + } + + return err; +} + +static int rtl8366_enable_vlan4k(struct rtl8366_smi *smi, int enable) +{ + int err; + + if (enable) { + err = smi->ops->enable_vlan(smi, enable); + if (err) + return err; + + smi->vlan_enabled = enable; + } + + err = smi->ops->enable_vlan4k(smi, enable); + if (err) + return err; + + smi->vlan4k_enabled = enable; + return 0; +} + int rtl8366_reset_vlan(struct rtl8366_smi *smi) { struct rtl8366_vlan_mc vlanmc; int err; int i; + rtl8366_enable_vlan(smi, 0); + rtl8366_enable_vlan4k(smi, 0); + /* clear VLAN member configurations */ vlanmc.vid = 0; vlanmc.priority = 0; @@ -931,6 +972,43 @@ int rtl8366_sw_set_vlan_ports(struct switch_dev *dev, struct switch_val *val) } EXPORT_SYMBOL_GPL(rtl8366_sw_set_vlan_ports); +int rtl8366_sw_get_vlan_enable(struct switch_dev *dev, + const struct switch_attr *attr, + struct switch_val *val) +{ + struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev); + + if (attr->ofs > 2) + return -EINVAL; + + if (attr->ofs == 1) + val->value.i = smi->vlan_enabled; + else + val->value.i = smi->vlan4k_enabled; + + return 0; +} +EXPORT_SYMBOL_GPL(rtl8366_sw_get_vlan_enable); + +int rtl8366_sw_set_vlan_enable(struct switch_dev *dev, + const struct switch_attr *attr, + struct switch_val *val) +{ + struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev); + int err; + + if (attr->ofs > 2) + return -EINVAL; + + if (attr->ofs == 1) + err = rtl8366_enable_vlan(smi, val->value.i); + else + err = rtl8366_enable_vlan4k(smi, val->value.i); + + return err; +} +EXPORT_SYMBOL_GPL(rtl8366_sw_set_vlan_enable); + struct rtl8366_smi *rtl8366_smi_alloc(struct device *parent) { struct rtl8366_smi *smi; diff --git a/target/linux/generic-2.6/files/drivers/net/phy/rtl8366_smi.h b/target/linux/generic-2.6/files/drivers/net/phy/rtl8366_smi.h index 2cd4a8ff4..af02cfd20 100644 --- a/target/linux/generic-2.6/files/drivers/net/phy/rtl8366_smi.h +++ b/target/linux/generic-2.6/files/drivers/net/phy/rtl8366_smi.h @@ -45,6 +45,9 @@ struct rtl8366_smi { struct rtl8366_smi_ops *ops; + int vlan_enabled; + int vlan4k_enabled; + char buf[4096]; #ifdef CONFIG_RTL8366S_PHY_DEBUG_FS struct dentry *debugfs_root; @@ -87,6 +90,8 @@ struct rtl8366_smi_ops { int (*get_mib_counter)(struct rtl8366_smi *smi, int counter, int port, unsigned long long *val); int (*is_vlan_valid)(struct rtl8366_smi *smi, unsigned vlan); + int (*enable_vlan)(struct rtl8366_smi *smi, int enable); + int (*enable_vlan4k)(struct rtl8366_smi *smi, int enable); }; struct rtl8366_smi *rtl8366_smi_alloc(struct device *parent); @@ -117,5 +122,11 @@ int rtl8366_sw_get_vlan_info(struct switch_dev *dev, struct switch_val *val); int rtl8366_sw_get_vlan_ports(struct switch_dev *dev, struct switch_val *val); int rtl8366_sw_set_vlan_ports(struct switch_dev *dev, struct switch_val *val); +int rtl8366_sw_get_vlan_enable(struct switch_dev *dev, + const struct switch_attr *attr, + struct switch_val *val); +int rtl8366_sw_set_vlan_enable(struct switch_dev *dev, + const struct switch_attr *attr, + struct switch_val *val); #endif /* _RTL8366_SMI_H */ diff --git a/target/linux/generic-2.6/files/drivers/net/phy/rtl8366rb.c b/target/linux/generic-2.6/files/drivers/net/phy/rtl8366rb.c index d442d2feb..ec196f941 100644 --- a/target/linux/generic-2.6/files/drivers/net/phy/rtl8366rb.c +++ b/target/linux/generic-2.6/files/drivers/net/phy/rtl8366rb.c @@ -554,19 +554,24 @@ static int rtl8366rb_set_mc_index(struct rtl8366_smi *smi, int port, int index) static int rtl8366rb_is_vlan_valid(struct rtl8366_smi *smi, unsigned vlan) { - if (vlan == 0 || vlan >= RTL8366RB_NUM_VLANS) + unsigned max = RTL8366RB_NUM_VLANS; + + if (smi->vlan4k_enabled) + max = RTL8366RB_NUM_VIDS - 1; + + if (vlan == 0 || vlan >= max) return 0; return 1; } -static int rtl8366rb_vlan_set_vlan(struct rtl8366_smi *smi, int enable) +static int rtl8366rb_enable_vlan(struct rtl8366_smi *smi, int enable) { return rtl8366_smi_rmwr(smi, RTL8366RB_SGCR, RTL8366RB_SGCR_EN_VLAN, (enable) ? RTL8366RB_SGCR_EN_VLAN : 0); } -static int rtl8366rb_vlan_set_4ktable(struct rtl8366_smi *smi, int enable) +static int rtl8366rb_enable_vlan4k(struct rtl8366_smi *smi, int enable) { return rtl8366_smi_rmwr(smi, RTL8366RB_SGCR, RTL8366RB_SGCR_EN_VLAN_4KTB, @@ -583,32 +588,6 @@ static int rtl8366rb_sw_reset_mibs(struct switch_dev *dev, RTL8366RB_MIB_CTRL_GLOBAL_RESET); } -static int rtl8366rb_sw_get_vlan_enable(struct switch_dev *dev, - const struct switch_attr *attr, - struct switch_val *val) -{ - struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev); - u32 data; - - if (attr->ofs == 1) { - rtl8366_smi_read_reg(smi, RTL8366RB_SGCR, &data); - - if (data & RTL8366RB_SGCR_EN_VLAN) - val->value.i = 1; - else - val->value.i = 0; - } else if (attr->ofs == 2) { - rtl8366_smi_read_reg(smi, RTL8366RB_SGCR, &data); - - if (data & RTL8366RB_SGCR_EN_VLAN_4KTB) - val->value.i = 1; - else - val->value.i = 0; - } - - return 0; -} - static int rtl8366rb_sw_get_blinkrate(struct switch_dev *dev, const struct switch_attr *attr, struct switch_val *val) @@ -637,18 +616,6 @@ static int rtl8366rb_sw_set_blinkrate(struct switch_dev *dev, val->value.i); } -static int rtl8366rb_sw_set_vlan_enable(struct switch_dev *dev, - const struct switch_attr *attr, - struct switch_val *val) -{ - struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev); - - if (attr->ofs == 1) - return rtl8366rb_vlan_set_vlan(smi, val->value.i); - else - return rtl8366rb_vlan_set_4ktable(smi, val->value.i); -} - static int rtl8366rb_sw_get_learning_enable(struct switch_dev *dev, const struct switch_attr *attr, struct switch_val *val) @@ -822,16 +789,16 @@ static struct switch_attr rtl8366rb_globals[] = { .type = SWITCH_TYPE_INT, .name = "enable_vlan", .description = "Enable VLAN mode", - .set = rtl8366rb_sw_set_vlan_enable, - .get = rtl8366rb_sw_get_vlan_enable, + .set = rtl8366_sw_set_vlan_enable, + .get = rtl8366_sw_get_vlan_enable, .max = 1, .ofs = 1 }, { .type = SWITCH_TYPE_INT, .name = "enable_vlan4k", .description = "Enable VLAN 4K mode", - .set = rtl8366rb_sw_set_vlan_enable, - .get = rtl8366rb_sw_get_vlan_enable, + .set = rtl8366_sw_set_vlan_enable, + .get = rtl8366_sw_get_vlan_enable, .max = 1, .ofs = 2 }, { @@ -920,7 +887,7 @@ static int rtl8366rb_switch_init(struct rtl8366_smi *smi) dev->name = "RTL8366RB"; dev->cpu_port = RTL8366RB_PORT_NUM_CPU; dev->ports = RTL8366RB_NUM_PORTS; - dev->vlans = RTL8366RB_NUM_VLANS; + dev->vlans = RTL8366RB_NUM_VIDS; dev->ops = &rtl8366_ops; dev->devname = dev_name(smi->parent); @@ -1028,6 +995,8 @@ static struct rtl8366_smi_ops rtl8366rb_smi_ops = { .set_mc_index = rtl8366rb_set_mc_index, .get_mib_counter = rtl8366rb_get_mib_counter, .is_vlan_valid = rtl8366rb_is_vlan_valid, + .enable_vlan = rtl8366rb_enable_vlan, + .enable_vlan4k = rtl8366rb_enable_vlan4k, }; static int __init rtl8366rb_probe(struct platform_device *pdev) diff --git a/target/linux/generic-2.6/files/drivers/net/phy/rtl8366s.c b/target/linux/generic-2.6/files/drivers/net/phy/rtl8366s.c index ad631ef72..66dc2db0d 100644 --- a/target/linux/generic-2.6/files/drivers/net/phy/rtl8366s.c +++ b/target/linux/generic-2.6/files/drivers/net/phy/rtl8366s.c @@ -579,13 +579,13 @@ static int rtl8366s_set_mc_index(struct rtl8366_smi *smi, int port, int index) RTL8366S_PORT_VLAN_CTRL_SHIFT(port)); } -static int rtl8366s_vlan_set_vlan(struct rtl8366_smi *smi, int enable) +static int rtl8366s_enable_vlan(struct rtl8366_smi *smi, int enable) { return rtl8366_smi_rmwr(smi, RTL8366S_SGCR, RTL8366S_SGCR_EN_VLAN, (enable) ? RTL8366S_SGCR_EN_VLAN : 0); } -static int rtl8366s_vlan_set_4ktable(struct rtl8366_smi *smi, int enable) +static int rtl8366s_enable_vlan4k(struct rtl8366_smi *smi, int enable) { return rtl8366_smi_rmwr(smi, RTL8366S_VLAN_TB_CTRL_REG, 1, (enable) ? 1 : 0); @@ -593,7 +593,12 @@ static int rtl8366s_vlan_set_4ktable(struct rtl8366_smi *smi, int enable) static int rtl8366s_is_vlan_valid(struct rtl8366_smi *smi, unsigned vlan) { - if (vlan == 0 || vlan >= RTL8366S_NUM_VLANS) + unsigned max = RTL8366S_NUM_VLANS; + + if (smi->vlan4k_enabled) + max = RTL8366S_NUM_VIDS - 1; + + if (vlan == 0 || vlan >= max) return 0; return 1; @@ -608,32 +613,6 @@ static int rtl8366s_sw_reset_mibs(struct switch_dev *dev, return rtl8366_smi_rmwr(smi, RTL8366S_MIB_CTRL_REG, 0, (1 << 2)); } -static int rtl8366s_sw_get_vlan_enable(struct switch_dev *dev, - const struct switch_attr *attr, - struct switch_val *val) -{ - struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev); - u32 data; - - if (attr->ofs == 1) { - rtl8366_smi_read_reg(smi, RTL8366S_SGCR, &data); - - if (data & RTL8366S_SGCR_EN_VLAN) - val->value.i = 1; - else - val->value.i = 0; - } else if (attr->ofs == 2) { - rtl8366_smi_read_reg(smi, RTL8366S_VLAN_TB_CTRL_REG, &data); - - if (data & 0x0001) - val->value.i = 1; - else - val->value.i = 0; - } - - return 0; -} - static int rtl8366s_sw_get_blinkrate(struct switch_dev *dev, const struct switch_attr *attr, struct switch_val *val) @@ -662,18 +641,6 @@ static int rtl8366s_sw_set_blinkrate(struct switch_dev *dev, val->value.i); } -static int rtl8366s_sw_set_vlan_enable(struct switch_dev *dev, - const struct switch_attr *attr, - struct switch_val *val) -{ - struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev); - - if (attr->ofs == 1) - return rtl8366s_vlan_set_vlan(smi, val->value.i); - else - return rtl8366s_vlan_set_4ktable(smi, val->value.i); -} - static int rtl8366s_sw_get_learning_enable(struct switch_dev *dev, const struct switch_attr *attr, struct switch_val *val) @@ -849,16 +816,16 @@ static struct switch_attr rtl8366s_globals[] = { .type = SWITCH_TYPE_INT, .name = "enable_vlan", .description = "Enable VLAN mode", - .set = rtl8366s_sw_set_vlan_enable, - .get = rtl8366s_sw_get_vlan_enable, + .set = rtl8366_sw_set_vlan_enable, + .get = rtl8366_sw_get_vlan_enable, .max = 1, .ofs = 1 }, { .type = SWITCH_TYPE_INT, .name = "enable_vlan4k", .description = "Enable VLAN 4K mode", - .set = rtl8366s_sw_set_vlan_enable, - .get = rtl8366s_sw_get_vlan_enable, + .set = rtl8366_sw_set_vlan_enable, + .get = rtl8366_sw_get_vlan_enable, .max = 1, .ofs = 2 }, { @@ -947,7 +914,7 @@ static int rtl8366s_switch_init(struct rtl8366_smi *smi) dev->name = "RTL8366S"; dev->cpu_port = RTL8366S_PORT_NUM_CPU; dev->ports = RTL8366S_NUM_PORTS; - dev->vlans = RTL8366S_NUM_VLANS; + dev->vlans = RTL8366S_NUM_VIDS; dev->ops = &rtl8366_ops; dev->devname = dev_name(smi->parent); @@ -1055,6 +1022,8 @@ static struct rtl8366_smi_ops rtl8366s_smi_ops = { .set_mc_index = rtl8366s_set_mc_index, .get_mib_counter = rtl8366_get_mib_counter, .is_vlan_valid = rtl8366s_is_vlan_valid, + .enable_vlan = rtl8366s_enable_vlan, + .enable_vlan4k = rtl8366s_enable_vlan4k, }; static int __init rtl8366s_probe(struct platform_device *pdev)