Currently, the b53 MDIO switch driver registers the switch on
config-init and not on device probe. Because of this, the switch
gets added every time the associated interface comes up.
This commit fixes this behavior by registering the switch on device
probe.
Compile- and run-tested on OCEDO Koala.
Signed-off-by: David Bauer <mail@david-bauer.net>
static int b53_phy_probe(struct phy_device *phydev)
{
static int b53_phy_probe(struct phy_device *phydev)
{
+ struct b53_device *dev;
int ret;
/* allow the generic phy driver to take over */
if (phydev->mdio.addr != B53_PSEUDO_PHY && phydev->mdio.addr != 0)
return -ENODEV;
int ret;
/* allow the generic phy driver to take over */
if (phydev->mdio.addr != B53_PSEUDO_PHY && phydev->mdio.addr != 0)
return -ENODEV;
- dev.current_page = 0xff;
- dev.priv = phydev->mdio.bus;
- dev.ops = &b53_mdio_ops;
- dev.pdata = NULL;
- mutex_init(&dev.reg_mutex);
+ dev = b53_switch_alloc(&phydev->mdio.dev, &b53_mdio_ops, phydev->mdio.bus);
+ if (!dev)
+ return -ENOMEM;
- ret = b53_switch_detect(&dev);
+ dev->current_page = 0xff;
+ dev->priv = phydev->mdio.bus;
+ dev->ops = &b53_mdio_ops;
+ dev->pdata = NULL;
+ mutex_init(&dev->reg_mutex);
+
+ ret = b53_switch_detect(dev);
- 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->supported = SUPPORTED_100baseT_Full;
else
phydev->supported = SUPPORTED_1000baseT_Full;
phydev->advertising = phydev->supported;
+ 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;
}
static int b53_phy_config_init(struct phy_device *phydev)
{
return 0;
}
static int b53_phy_config_init(struct phy_device *phydev)
{
- struct b53_device *dev;
- int ret;
-
- dev = b53_switch_alloc(&phydev->mdio.dev, &b53_mdio_ops, phydev->mdio.bus);
- if (!dev)
- return -ENOMEM;
+ struct b53_device *dev = phydev->priv;
/* 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;
/* 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;
-