merge rtl8366 switch fix from r22545
authornbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73>
Sun, 8 Aug 2010 20:15:48 +0000 (20:15 +0000)
committernbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73>
Sun, 8 Aug 2010 20:15:48 +0000 (20:15 +0000)
git-svn-id: svn://svn.openwrt.org/openwrt/branches/backfire@22546 3c298f89-4303-0410-b956-a3cf2f4a3e73

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

index 420a5523cfbdbeee187c104f746c125f4f7059f9..ed4834c694120a56e62ff1e63a5a8a065dad187f 100644 (file)
@@ -284,11 +284,11 @@ static int rtl8366rb_hw_init(struct rtl8366_smi *smi)
        /* enable all ports */
        REG_WR(smi, RTL8366RB_PECR, 0);
 
-       /* disable learning for all ports */
-       REG_WR(smi, RTL8366RB_SSCR0, RTL8366RB_PORT_ALL);
+       /* enable learning for all ports */
+       REG_WR(smi, RTL8366RB_SSCR0, 0);
 
-       /* disable auto ageing for all ports */
-       REG_WR(smi, RTL8366RB_SSCR1, RTL8366RB_PORT_ALL);
+       /* enable auto ageing for all ports */
+       REG_WR(smi, RTL8366RB_SSCR1, 0);
 
        /*
         * discard VLAN tagged packets if the port is not a member of
@@ -752,6 +752,41 @@ static int rtl8366rb_sw_set_vlan_enable(struct switch_dev *dev,
                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)
+{
+       struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev);
+       u32 data;
+
+       rtl8366_smi_read_reg(smi, RTL8366RB_SSCR0, &data);
+       val->value.i = !data;
+
+       return 0;
+}
+
+
+static int rtl8366rb_sw_set_learning_enable(struct switch_dev *dev,
+                                      const struct switch_attr *attr,
+                                      struct switch_val *val)
+{
+       struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev);
+       u32 portmask = 0;
+       int err = 0;
+
+       if (!val->value.i)
+               portmask = RTL8366RB_PORT_ALL;
+
+       /* set learning for all ports */
+       REG_WR(smi, RTL8366RB_SSCR0, portmask);
+
+       /* set auto ageing for all ports */
+       REG_WR(smi, RTL8366RB_SSCR1, portmask);
+
+       return 0;
+}
+
+
 static const char *rtl8366rb_speed_str(unsigned speed)
 {
        switch (speed) {
@@ -1016,6 +1051,13 @@ static int rtl8366rb_sw_reset_switch(struct switch_dev *dev)
 
 static struct switch_attr rtl8366rb_globals[] = {
        {
+               .type = SWITCH_TYPE_INT,
+               .name = "enable_learning",
+               .description = "Enable learning, enable aging",
+               .set = rtl8366rb_sw_set_learning_enable,
+               .get = rtl8366rb_sw_get_learning_enable,
+               .max = 1
+       }, {
                .type = SWITCH_TYPE_INT,
                .name = "enable_vlan",
                .description = "Enable VLAN mode",
index 45da8fd8e582b7ebac0acadc0f6d533d942d2e7c..59a5e1a27faa2218b1cb7d337d98e5adea463450 100644 (file)
@@ -294,11 +294,11 @@ static int rtl8366s_hw_init(struct rtl8366_smi *smi)
        /* enable all ports */
        REG_WR(smi, RTL8366S_PECR, 0);
 
-       /* disable learning for all ports */
-       REG_WR(smi, RTL8366S_SSCR0, RTL8366S_PORT_ALL);
+       /* enable learning for all ports */
+       REG_WR(smi, RTL8366S_SSCR0, 0);
 
-       /* disable auto ageing for all ports */
-       REG_WR(smi, RTL8366S_SSCR1, RTL8366S_PORT_ALL);
+       /* enable auto ageing for all ports */
+       REG_WR(smi, RTL8366S_SSCR1, 0);
 
        /*
         * discard VLAN tagged packets if the port is not a member of
@@ -738,6 +738,41 @@ static int rtl8366s_sw_set_vlan_enable(struct switch_dev *dev,
                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)
+{
+       struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev);
+       u32 data;
+
+       rtl8366_smi_read_reg(smi,RTL8366S_SSCR0, &data);
+       val->value.i = !data;
+
+       return 0;
+}
+
+
+static int rtl8366s_sw_set_learning_enable(struct switch_dev *dev,
+                                          const struct switch_attr *attr,
+                                          struct switch_val *val)
+{
+       struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev);
+       u32 portmask = 0;
+       int err = 0;
+
+       if (!val->value.i)
+               portmask = RTL8366S_PORT_ALL;
+
+       /* set learning for all ports */
+       REG_WR(smi, RTL8366S_SSCR0, portmask);
+
+       /* set auto ageing for all ports */
+       REG_WR(smi, RTL8366S_SSCR1, portmask);
+
+       return 0;
+}
+
+
 static const char *rtl8366s_speed_str(unsigned speed)
 {
        switch (speed) {
@@ -1004,6 +1039,13 @@ static int rtl8366s_sw_reset_switch(struct switch_dev *dev)
 
 static struct switch_attr rtl8366s_globals[] = {
        {
+               .type = SWITCH_TYPE_INT,
+               .name = "enable_learning",
+               .description = "Enable learning, enable aging",
+               .set = rtl8366s_sw_set_learning_enable,
+               .get = rtl8366s_sw_get_learning_enable,
+               .max = 1,
+       }, {
                .type = SWITCH_TYPE_INT,
                .name = "enable_vlan",
                .description = "Enable VLAN mode",