diff options
author | Gabor Juhos <juhosg@openwrt.org> | 2010-07-15 13:05:47 +0000 |
---|---|---|
committer | Gabor Juhos <juhosg@openwrt.org> | 2010-07-15 13:05:47 +0000 |
commit | 7b6b73dc84151e6e6d66f7362e12c36a15bfa8e8 (patch) | |
tree | bc783410ead924ea35c865a9a4e3101d5a061d64 /target/linux/generic/files/drivers/net/phy/rtl8366_smi.c | |
parent | 80fd673252e26266688fad23b5de059e8e195171 (diff) | |
download | upstream-7b6b73dc84151e6e6d66f7362e12c36a15bfa8e8.tar.gz upstream-7b6b73dc84151e6e6d66f7362e12c36a15bfa8e8.tar.bz2 upstream-7b6b73dc84151e6e6d66f7362e12c36a15bfa8e8.zip |
generic: rtl8366: add common rtl8366_sw_get_vlan_info
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@22203 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'target/linux/generic/files/drivers/net/phy/rtl8366_smi.c')
-rw-r--r-- | target/linux/generic/files/drivers/net/phy/rtl8366_smi.c | 42 |
1 files changed, 42 insertions, 0 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 a45c844cad..e46768f827 100644 --- a/target/linux/generic/files/drivers/net/phy/rtl8366_smi.c +++ b/target/linux/generic/files/drivers/net/phy/rtl8366_smi.c @@ -788,6 +788,48 @@ int rtl8366_sw_get_port_mib(struct switch_dev *dev, } EXPORT_SYMBOL_GPL(rtl8366_sw_get_port_mib); +int rtl8366_sw_get_vlan_info(struct switch_dev *dev, + const struct switch_attr *attr, + struct switch_val *val) +{ + int i; + u32 len = 0; + struct rtl8366_vlan_4k vlan4k; + struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev); + char *buf = smi->buf; + int err; + + if (!smi->ops->is_vlan_valid(smi, val->port_vlan)) + return -EINVAL; + + memset(buf, '\0', sizeof(smi->buf)); + + err = smi->ops->get_vlan_4k(smi, val->port_vlan, &vlan4k); + if (err) + return err; + + len += snprintf(buf + len, sizeof(smi->buf) - len, + "VLAN %d: Ports: '", vlan4k.vid); + + for (i = 0; i < smi->num_ports; i++) { + if (!(vlan4k.member & (1 << i))) + continue; + + len += snprintf(buf + len, sizeof(smi->buf) - len, "%d%s", i, + (vlan4k.untag & (1 << i)) ? "" : "t"); + } + + len += snprintf(buf + len, sizeof(smi->buf) - len, + "', members=%04x, untag=%04x, fid=%u", + vlan4k.member, vlan4k.untag, vlan4k.fid); + + val->value.s = buf; + val->len = len; + + return 0; +} +EXPORT_SYMBOL_GPL(rtl8366_sw_get_vlan_info); + struct rtl8366_smi *rtl8366_smi_alloc(struct device *parent) { struct rtl8366_smi *smi; |