generic: rtl8366s: add vlan fid support
[openwrt.git] / target / linux / generic / files / drivers / net / phy / rtl8366s.c
index 896333c..f0c21f7 100644 (file)
@@ -25,6 +25,7 @@
 #define RTL8366S_PHY_NO_MAX    4
 #define RTL8366S_PHY_PAGE_MAX  7
 #define RTL8366S_PHY_ADDR_MAX  31
+#define RTL8366S_PHY_WAN       4
 
 /* Switch Global Configuration register */
 #define RTL8366S_SGCR                          0x0000
@@ -593,7 +594,12 @@ static int rtl8366s_enable_vlan4k(struct rtl8366_smi *smi, int enable)
 
 static int rtl8366s_is_vlan_valid(struct rtl8366_smi *smi, unsigned vlan)
 {
-       if (vlan == 0 || vlan >= RTL8366S_NUM_VLANS)
+       unsigned max = RTL8366S_NUM_VLANS;
+
+       if (smi->vlan4k_enabled)
+               max = RTL8366S_NUM_VIDS - 1;
+
+       if (vlan == 0 || vlan >= max)
                return 0;
 
        return 1;
@@ -877,6 +883,13 @@ static struct switch_attr rtl8366s_vlan[] = {
                .max = 1,
                .set = NULL,
                .get = rtl8366_sw_get_vlan_info,
+       }, {
+               .type = SWITCH_TYPE_INT,
+               .name = "fid",
+               .description = "Get/Set vlan FID",
+               .max = RTL8366S_FIDMAX,
+               .set = rtl8366_sw_set_vlan_fid,
+               .get = rtl8366_sw_get_vlan_fid,
        },
 };
 
@@ -909,7 +922,7 @@ static int rtl8366s_switch_init(struct rtl8366_smi *smi)
        dev->name = "RTL8366S";
        dev->cpu_port = RTL8366S_PORT_NUM_CPU;
        dev->ports = RTL8366S_NUM_PORTS;
-       dev->vlans = RTL8366S_NUM_VLANS;
+       dev->vlans = RTL8366S_NUM_VIDS;
        dev->ops = &rtl8366_ops;
        dev->devname = dev_name(smi->parent);
 
@@ -1021,7 +1034,7 @@ static struct rtl8366_smi_ops rtl8366s_smi_ops = {
        .enable_vlan4k  = rtl8366s_enable_vlan4k,
 };
 
-static int __init rtl8366s_probe(struct platform_device *pdev)
+static int __devinit rtl8366s_probe(struct platform_device *pdev)
 {
        static int rtl8366_smi_version_printed;
        struct rtl8366s_platform_data *pdata;
@@ -1085,6 +1098,10 @@ static int rtl8366s_phy_config_init(struct phy_device *phydev)
 
 static int rtl8366s_phy_config_aneg(struct phy_device *phydev)
 {
+       /* phy 4 might be connected to a second mac, allow aneg config */
+       if (phydev->addr == RTL8366S_PHY_WAN)
+               return genphy_config_aneg(phydev);
+
        return 0;
 }
 
This page took 0.023243 seconds and 4 git commands to generate.