diff options
| author | juhosg <juhosg@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2010-08-18 16:00:37 +0000 | 
|---|---|---|
| committer | juhosg <juhosg@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2010-08-18 16:00:37 +0000 | 
| commit | 356b45cef33154bbf0e6f0d7cd67018365c0d013 (patch) | |
| tree | 2371cd307dd6a5aeae863c58df69bb9cea040b38 /target/linux/generic/files/drivers | |
| parent | 3b7b50fb893533a1f072fc549f6b0d42a4dbdf00 (diff) | |
generic: rtl8366: add generic code to enable VLANs
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@22703 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'target/linux/generic/files/drivers')
4 files changed, 95 insertions, 84 deletions
| diff --git a/target/linux/generic/files/drivers/net/phy/rtl8366_smi.c b/target/linux/generic/files/drivers/net/phy/rtl8366_smi.c index c827cd20e..9b70a9282 100644 --- a/target/linux/generic/files/drivers/net/phy/rtl8366_smi.c +++ b/target/linux/generic/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; @@ -922,6 +963,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/files/drivers/net/phy/rtl8366_smi.h b/target/linux/generic/files/drivers/net/phy/rtl8366_smi.h index 1e2ebdaa0..af02cfd20 100644 --- a/target/linux/generic/files/drivers/net/phy/rtl8366_smi.h +++ b/target/linux/generic/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; @@ -119,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/files/drivers/net/phy/rtl8366rb.c b/target/linux/generic/files/drivers/net/phy/rtl8366rb.c index 27ceda142..a0a7df794 100644 --- a/target/linux/generic/files/drivers/net/phy/rtl8366rb.c +++ b/target/linux/generic/files/drivers/net/phy/rtl8366rb.c @@ -583,32 +583,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 +611,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_enable_vlan(smi, val->value.i); -	else -		return rtl8366rb_enable_vlan4k(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 +784,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  	}, { diff --git a/target/linux/generic/files/drivers/net/phy/rtl8366s.c b/target/linux/generic/files/drivers/net/phy/rtl8366s.c index ab9bcc255..896333c93 100644 --- a/target/linux/generic/files/drivers/net/phy/rtl8366s.c +++ b/target/linux/generic/files/drivers/net/phy/rtl8366s.c @@ -608,32 +608,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 +636,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_enable_vlan(smi, val->value.i); -	else -		return rtl8366s_enable_vlan4k(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 +811,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  	}, { | 
