X-Git-Url: http://git.rohieb.name/openwrt.git/blobdiff_plain/c5552ad03973839d83d32d7108f20c00f192633b..9044daabf76946a3e02bfbe33920796f5a495136:/target/linux/generic/files/drivers/net/phy/rtl8306.c diff --git a/target/linux/generic/files/drivers/net/phy/rtl8306.c b/target/linux/generic/files/drivers/net/phy/rtl8306.c index 901b5b2f8..78ded0ace 100644 --- a/target/linux/generic/files/drivers/net/phy/rtl8306.c +++ b/target/linux/generic/files/drivers/net/phy/rtl8306.c @@ -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);