generic: jumbo frames support for rtl8366s
authorjuhosg <juhosg@3c298f89-4303-0410-b956-a3cf2f4a3e73>
Wed, 21 Sep 2011 11:47:38 +0000 (11:47 +0000)
committerjuhosg <juhosg@3c298f89-4303-0410-b956-a3cf2f4a3e73>
Wed, 21 Sep 2011 11:47:38 +0000 (11:47 +0000)
This patch adds the option to enable jumbo frames on the rtl8366s
switch. This is almost exactly the same as the first patch at
https://dev.openwrt.org/ticket/7977 and it has been requested
in a comment there.

I have tested this and it successfully allows devices on the switch
using jumbo frames to communicate.

Signed-off-by: Ash Hughes <ashley.hughes@blueyonder.co.uk>
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@28267 3c298f89-4303-0410-b956-a3cf2f4a3e73

target/linux/generic/files/drivers/net/phy/rtl8366s.c

index e2d8402..3091658 100644 (file)
@@ -655,6 +655,49 @@ static int rtl8366s_sw_set_blinkrate(struct switch_dev *dev,
                                val->value.i);
 }
 
+static int rtl8366s_sw_get_max_length(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_SGCR, &data);
+
+       val->value.i = ((data & (RTL8366S_SGCR_MAX_LENGTH_MASK)) >> 4);
+
+       return 0;
+}
+
+static int rtl8366s_sw_set_max_length(struct switch_dev *dev,
+                                       const struct switch_attr *attr,
+                                       struct switch_val *val)
+{
+       struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev);
+       char length_code;
+
+       switch (val->value.i) {
+               case 0:
+                       length_code = RTL8366S_SGCR_MAX_LENGTH_1522;
+                       break;
+               case 1:
+                       length_code = RTL8366S_SGCR_MAX_LENGTH_1536;
+                       break;
+               case 2:
+                       length_code = RTL8366S_SGCR_MAX_LENGTH_1552;
+                       break;
+               case 3:
+                       length_code = RTL8366S_SGCR_MAX_LENGTH_16000;
+                       break;
+               default:
+                       return -EINVAL;
+       }
+
+       return rtl8366_smi_rmwr(smi, RTL8366S_SGCR,
+                       RTL8366S_SGCR_MAX_LENGTH_MASK,
+                       length_code);
+}
+
 static int rtl8366s_sw_get_learning_enable(struct switch_dev *dev,
                                           const struct switch_attr *attr,
                                           struct switch_val *val)
@@ -863,6 +906,14 @@ static struct switch_attr rtl8366s_globals[] = {
                .set = rtl8366s_sw_set_blinkrate,
                .get = rtl8366s_sw_get_blinkrate,
                .max = 5
+       }, {
+               .type = SWITCH_TYPE_INT,
+               .name = "max_length",
+               .description = "Get/Set the maximum length of valid packets"
+               " (0 = 1522, 1 = 1536, 2 = 1552, 3 = 16000 (9216?))",
+               .set = rtl8366s_sw_set_max_length,
+               .get = rtl8366s_sw_get_max_length,
+               .max = 3,
        },
 };