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