diff options
author | Gabor Juhos <juhosg@openwrt.org> | 2013-02-14 14:01:24 +0000 |
---|---|---|
committer | Gabor Juhos <juhosg@openwrt.org> | 2013-02-14 14:01:24 +0000 |
commit | d64888ffc09247d51786931ca0b1bddeffd8efbf (patch) | |
tree | 244d3b512bad657782d44fd791cf0eff0ee0e04a /target/linux/generic/files/drivers | |
parent | 31dc805f8815375916b999b4ce70acf485c9ea0b (diff) | |
download | upstream-d64888ffc09247d51786931ca0b1bddeffd8efbf.tar.gz upstream-d64888ffc09247d51786931ca0b1bddeffd8efbf.tar.bz2 upstream-d64888ffc09247d51786931ca0b1bddeffd8efbf.zip |
generic: ar8216: register the switch from the probe routine
Currently the switch gets registered when an ethernet
driver connects to a PHY of the switch. This method does
not work with the ethernet drivers which are connecting
to the PHY from their ndo_open callback. With those
ethernet drivers, the driver tries to register the switch
each time when the etherned device is opened and this causes
a deadlock.
Move the switch registration into the probe routine to fix
this problem.
Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
SVN-Revision: 35602
Diffstat (limited to 'target/linux/generic/files/drivers')
-rw-r--r-- | target/linux/generic/files/drivers/net/phy/ar8216.c | 29 |
1 files changed, 12 insertions, 17 deletions
diff --git a/target/linux/generic/files/drivers/net/phy/ar8216.c b/target/linux/generic/files/drivers/net/phy/ar8216.c index 811e406f3a..97a2cca6c0 100644 --- a/target/linux/generic/files/drivers/net/phy/ar8216.c +++ b/target/linux/generic/files/drivers/net/phy/ar8216.c @@ -1851,7 +1851,6 @@ ar8216_config_init(struct phy_device *phydev) { struct ar8216_priv *priv = phydev->priv; struct net_device *dev = phydev->attached_dev; - struct switch_dev *swdev; int ret; if (WARN_ON(!priv)) @@ -1872,24 +1871,15 @@ ar8216_config_init(struct phy_device *phydev) return 0; } - swdev = &priv->dev; - swdev->alias = dev_name(&priv->mii_bus->dev); - ret = register_switch(swdev, NULL); - if (ret) - goto err; - - pr_info("%s: %s switch registered on %s\n", - swdev->devname, swdev->name, dev_name(&priv->mii_bus->dev)); - priv->init = true; ret = priv->chip->hw_init(priv); if (ret) - goto err_unregister_switch; + return ret; ret = ar8216_sw_reset_switch(&priv->dev); if (ret) - goto err_unregister_switch; + return ret; /* VID fixup only needed on ar8216 */ if (chip_is_ar8216(priv)) { @@ -1904,11 +1894,6 @@ ar8216_config_init(struct phy_device *phydev) ar8xxx_mib_start(priv); return 0; - -err_unregister_switch: - unregister_switch(&priv->dev); -err: - return ret; } static int @@ -2004,6 +1989,7 @@ static int ar8216_probe(struct phy_device *phydev) { struct ar8216_priv *priv; + struct switch_dev *swdev; int ret; /* skip PHYs at unused adresses */ @@ -2028,6 +2014,15 @@ ar8216_probe(struct phy_device *phydev) if (ret) goto free_priv; + swdev = &priv->dev; + swdev->alias = dev_name(&priv->mii_bus->dev); + ret = register_switch(swdev, NULL); + if (ret) + goto free_priv; + + pr_info("%s: %s switch registered on %s\n", + swdev->devname, swdev->name, dev_name(&priv->mii_bus->dev)); + found: if (phydev->addr == 0) { if (ar8xxx_has_gige(priv)) { |