When setting the associated interface down and up again a new
switch device will be registered due to b53_phy_config_init
doing the necessary allocations and registrations.

Instead, register the switch device already in b53_phy_probe.

Signed-off-by: Helmut Schaa <helmut.sc...@googlemail.com>
---
 .../generic/files/drivers/net/phy/b53/b53_common.c |  2 +-
 .../generic/files/drivers/net/phy/b53/b53_mdio.c   | 40 ++++++++--------------
 .../generic/files/drivers/net/phy/b53/b53_priv.h   |  2 ++
 3 files changed, 17 insertions(+), 27 deletions(-)

diff --git a/target/linux/generic/files/drivers/net/phy/b53/b53_common.c 
b/target/linux/generic/files/drivers/net/phy/b53/b53_common.c
index b82bc93..37f520d 100644
--- a/target/linux/generic/files/drivers/net/phy/b53/b53_common.c
+++ b/target/linux/generic/files/drivers/net/phy/b53/b53_common.c
@@ -478,7 +478,7 @@ static void b53_switch_reset_gpio(struct b53_device *dev)
        dev->current_page = 0xff;
 }
 
-static int b53_switch_reset(struct b53_device *dev)
+int b53_switch_reset(struct b53_device *dev)
 {
        u8 mgmt;
 
diff --git a/target/linux/generic/files/drivers/net/phy/b53/b53_mdio.c 
b/target/linux/generic/files/drivers/net/phy/b53/b53_mdio.c
index b86ea1a..e626217 100644
--- a/target/linux/generic/files/drivers/net/phy/b53/b53_mdio.c
+++ b/target/linux/generic/files/drivers/net/phy/b53/b53_mdio.c
@@ -253,56 +253,44 @@ static struct b53_io_ops b53_mdio_ops = {
 
 static int b53_phy_probe(struct phy_device *phydev)
 {
-       struct b53_device dev;
+       struct b53_device *dev;
        int ret;
 
        /* allow the generic phy driver to take over */
        if (phydev->addr != B53_PSEUDO_PHY && phydev->addr != 0)
                return -ENODEV;
 
-       dev.current_page = 0xff;
-       dev.priv = phydev->bus;
-       dev.ops = &b53_mdio_ops;
-       dev.pdata = NULL;
-       mutex_init(&dev.reg_mutex);
+       dev = b53_switch_alloc(&phydev->dev, &b53_mdio_ops, phydev->bus);
+       if (!dev)
+               return -ENOMEM;
 
-       ret = b53_switch_detect(&dev);
-       if (ret)
+       dev->current_page = 0xff;
+
+       ret = b53_switch_register(dev);
+       if (ret) {
+               kfree(dev);
                return ret;
+       }
 
-       if (is5325(&dev) || is5365(&dev))
+       if (is5325(dev) || is5365(dev))
                phydev->supported = SUPPORTED_100baseT_Full;
        else
                phydev->supported = SUPPORTED_1000baseT_Full;
 
        phydev->advertising = phydev->supported;
+       phydev->priv = dev;
 
        return 0;
 }
 
 static int b53_phy_config_init(struct phy_device *phydev)
 {
-       struct b53_device *dev;
-       int ret;
+       struct b53_device *dev = phydev->priv;
 
-       dev = b53_switch_alloc(&phydev->dev, &b53_mdio_ops, phydev->bus);
-       if (!dev)
-               return -ENOMEM;
-
-       /* we don't use page 0xff, so force a page set */
-       dev->current_page = 0xff;
        /* force the ethX as alias */
        dev->sw_dev.alias = phydev->attached_dev->name;
 
-       ret = b53_switch_register(dev);
-       if (ret) {
-               dev_err(dev->dev, "failed to register switch: %i\n", ret);
-               return ret;
-       }
-
-       phydev->priv = dev;
-
-       return 0;
+       return b53_switch_reset(dev);
 }
 
 static void b53_phy_remove(struct phy_device *phydev)
diff --git a/target/linux/generic/files/drivers/net/phy/b53/b53_priv.h 
b/target/linux/generic/files/drivers/net/phy/b53/b53_priv.h
index ce5b530..75b86dc 100644
--- a/target/linux/generic/files/drivers/net/phy/b53/b53_priv.h
+++ b/target/linux/generic/files/drivers/net/phy/b53/b53_priv.h
@@ -180,6 +180,8 @@ int b53_switch_detect(struct b53_device *dev);
 
 int b53_switch_register(struct b53_device *dev);
 
+int b53_switch_reset(struct b53_device *dev);
+
 static inline void b53_switch_remove(struct b53_device *dev)
 {
        unregister_switch(&dev->sw_dev);
-- 
1.8.1.4
_______________________________________________
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel

Reply via email to