ar71xx: reclaim the 'user_property' partition on WHR-* boards
[openwrt.git] / target / linux / generic / files / drivers / net / phy / rtl8306.c
index 901b5b2..78ded0a 100644 (file)
@@ -56,6 +56,7 @@ struct rtl_priv {
        int do_cpu;
        struct mii_bus *bus;
        char hwname[sizeof(RTL_NAME_UNKNOWN)];
+       bool fixup;
 };
 
 struct rtl_phyregs {
@@ -250,17 +251,15 @@ static const struct rtl_reg rtl_regs[] = {
 };
 
 
-/* IFXMIPS compat stuff - remove after PHY layer migration */
-static struct switch_dev rtldev;
-/* END IFXMIPS compat stuff */
-
-
 static inline void
 rtl_set_page(struct rtl_priv *priv, unsigned int page)
 {
        struct mii_bus *bus = priv->bus;
        u16 pgsel;
 
+       if (priv->fixup)
+               return;
+
        if (priv->page == page)
                return;
 
@@ -706,64 +705,6 @@ rtl_set_ports(struct switch_dev *dev, struct switch_val *val)
        return 0;
 }
 
-static int
-rtl8306_config_init(struct phy_device *pdev)
-{
-       struct net_device *netdev = pdev->attached_dev;
-       struct rtl_priv *priv = pdev->priv;
-       struct switch_dev *dev = &priv->dev;
-       struct switch_val val;
-       unsigned int chipid, chipver, chiptype;
-       int err;
-
-       /* Only init the switch for the primary PHY */
-       if (pdev->addr != 0)
-               return 0;
-
-       val.value.i = 1;
-       memcpy(&priv->dev, &rtldev, sizeof(struct switch_dev));
-       priv->do_cpu = 0;
-       priv->page = -1;
-       priv->bus = pdev->bus;
-
-       dev->priv = priv;
-
-       chipid = rtl_get(dev, RTL_REG_CHIPID);
-       chipver = rtl_get(dev, RTL_REG_CHIPVER);
-       chiptype = rtl_get(dev, RTL_REG_CHIPTYPE);
-       switch(chiptype) {
-       case 0:
-       case 2:
-               strncpy(priv->hwname, RTL_NAME_S, sizeof(priv->hwname));
-               priv->type = RTL_TYPE_S;
-               break;
-       case 1:
-               strncpy(priv->hwname, RTL_NAME_SD, sizeof(priv->hwname));
-               priv->type = RTL_TYPE_SD;
-               break;
-       case 3:
-               strncpy(priv->hwname, RTL_NAME_SDM, sizeof(priv->hwname));
-               priv->type = RTL_TYPE_SDM;
-               break;
-       default:
-               strncpy(priv->hwname, RTL_NAME_UNKNOWN, sizeof(priv->hwname));
-               break;
-       }
-
-       dev->name = priv->hwname;
-       rtl_hw_init(dev);
-
-       printk(KERN_INFO "Registering %s switch with Chip ID: 0x%04x, version: 0x%04x\n", priv->hwname, chipid, chipver);
-
-       err = register_switch(dev, netdev);
-       if (err < 0) {
-               kfree(priv);
-               return err;
-       }
-
-       return 0;
-}
-
 static struct switch_attr rtl_globals[] = {
        {
                .type = SWITCH_TYPE_INT,
@@ -892,16 +833,12 @@ static struct switch_attr rtl_vlan[] = {
        {
                RTL_VLAN_REGATTR(VID),
                .name = "vid",
-               .description = "VLAN ID",
+               .description = "VLAN ID (1-4095)",
                .max = 4095,
        },
 };
 
-/* template */
-static struct switch_dev rtldev = {
-       .cpu_port = RTL8306_PORT_CPU,
-       .ports = RTL8306_NUM_PORTS,
-       .vlans = RTL8306_NUM_VLANS,
+static const struct switch_dev_ops rtl8306_ops = {
        .attr_global = {
                .attr = rtl_globals,
                .n_attr = ARRAY_SIZE(rtl_globals),
@@ -920,6 +857,65 @@ static struct switch_dev rtldev = {
        .apply_config = rtl_hw_apply,
 };
 
+static int
+rtl8306_config_init(struct phy_device *pdev)
+{
+       struct net_device *netdev = pdev->attached_dev;
+       struct rtl_priv *priv = pdev->priv;
+       struct switch_dev *dev = &priv->dev;
+       struct switch_val val;
+       unsigned int chipid, chipver, chiptype;
+       int err;
+
+       /* Only init the switch for the primary PHY */
+       if (pdev->addr != 0)
+               return 0;
+
+       val.value.i = 1;
+       priv->dev.cpu_port = RTL8306_PORT_CPU;
+       priv->dev.ports = RTL8306_NUM_PORTS;
+       priv->dev.vlans = RTL8306_NUM_VLANS;
+       priv->dev.ops = &rtl8306_ops;
+       priv->do_cpu = 0;
+       priv->page = -1;
+       priv->bus = pdev->bus;
+
+       chipid = rtl_get(dev, RTL_REG_CHIPID);
+       chipver = rtl_get(dev, RTL_REG_CHIPVER);
+       chiptype = rtl_get(dev, RTL_REG_CHIPTYPE);
+       switch(chiptype) {
+       case 0:
+       case 2:
+               strncpy(priv->hwname, RTL_NAME_S, sizeof(priv->hwname));
+               priv->type = RTL_TYPE_S;
+               break;
+       case 1:
+               strncpy(priv->hwname, RTL_NAME_SD, sizeof(priv->hwname));
+               priv->type = RTL_TYPE_SD;
+               break;
+       case 3:
+               strncpy(priv->hwname, RTL_NAME_SDM, sizeof(priv->hwname));
+               priv->type = RTL_TYPE_SDM;
+               break;
+       default:
+               strncpy(priv->hwname, RTL_NAME_UNKNOWN, sizeof(priv->hwname));
+               break;
+       }
+
+       dev->name = priv->hwname;
+       rtl_hw_init(dev);
+
+       printk(KERN_INFO "Registering %s switch with Chip ID: 0x%04x, version: 0x%04x\n", priv->hwname, chipid, chipver);
+
+       err = register_switch(dev, netdev);
+       if (err < 0) {
+               kfree(priv);
+               return err;
+       }
+
+       return 0;
+}
+
 
 static int
 rtl8306_fixup(struct phy_device *pdev)
@@ -931,6 +927,8 @@ rtl8306_fixup(struct phy_device *pdev)
        if (pdev->addr != 0 && pdev->addr != 4)
                return 0;
 
+       memset(&priv, 0, sizeof(priv));
+       priv.fixup = true;
        priv.page = -1;
        priv.bus = pdev->bus;
        chipid = rtl_get(&priv.dev, RTL_REG_CHIPID);
This page took 0.026504 seconds and 4 git commands to generate.