diff options
| author | juhosg <juhosg@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2011-09-21 11:47:38 +0000 | 
|---|---|---|
| committer | juhosg <juhosg@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2011-09-21 11:47:38 +0000 | 
| commit | a176de7d8d0b2a2292ed8a4dfc96624a20043964 (patch) | |
| tree | 9de1d096abbea267e4487416dafc065e3fbaedc8 /target/linux/generic/files/drivers/net | |
| parent | 25ead84c946e2f3b87531bd6c099f45cdbed08e6 (diff) | |
generic: jumbo frames support for rtl8366s
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
Diffstat (limited to 'target/linux/generic/files/drivers/net')
| -rw-r--r-- | target/linux/generic/files/drivers/net/phy/rtl8366s.c | 51 | 
1 files changed, 51 insertions, 0 deletions
diff --git a/target/linux/generic/files/drivers/net/phy/rtl8366s.c b/target/linux/generic/files/drivers/net/phy/rtl8366s.c index e2d8402cf..30916589b 100644 --- a/target/linux/generic/files/drivers/net/phy/rtl8366s.c +++ b/target/linux/generic/files/drivers/net/phy/rtl8366s.c @@ -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,  	},  };  | 
