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
This commit is contained in:
parent
31dc805f88
commit
d64888ffc0
1 changed files with 12 additions and 17 deletions
|
@ -1851,7 +1851,6 @@ ar8216_config_init(struct phy_device *phydev)
|
||||||
{
|
{
|
||||||
struct ar8216_priv *priv = phydev->priv;
|
struct ar8216_priv *priv = phydev->priv;
|
||||||
struct net_device *dev = phydev->attached_dev;
|
struct net_device *dev = phydev->attached_dev;
|
||||||
struct switch_dev *swdev;
|
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (WARN_ON(!priv))
|
if (WARN_ON(!priv))
|
||||||
|
@ -1872,24 +1871,15 @@ ar8216_config_init(struct phy_device *phydev)
|
||||||
return 0;
|
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;
|
priv->init = true;
|
||||||
|
|
||||||
ret = priv->chip->hw_init(priv);
|
ret = priv->chip->hw_init(priv);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto err_unregister_switch;
|
return ret;
|
||||||
|
|
||||||
ret = ar8216_sw_reset_switch(&priv->dev);
|
ret = ar8216_sw_reset_switch(&priv->dev);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto err_unregister_switch;
|
return ret;
|
||||||
|
|
||||||
/* VID fixup only needed on ar8216 */
|
/* VID fixup only needed on ar8216 */
|
||||||
if (chip_is_ar8216(priv)) {
|
if (chip_is_ar8216(priv)) {
|
||||||
|
@ -1904,11 +1894,6 @@ ar8216_config_init(struct phy_device *phydev)
|
||||||
ar8xxx_mib_start(priv);
|
ar8xxx_mib_start(priv);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
err_unregister_switch:
|
|
||||||
unregister_switch(&priv->dev);
|
|
||||||
err:
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
@ -2004,6 +1989,7 @@ static int
|
||||||
ar8216_probe(struct phy_device *phydev)
|
ar8216_probe(struct phy_device *phydev)
|
||||||
{
|
{
|
||||||
struct ar8216_priv *priv;
|
struct ar8216_priv *priv;
|
||||||
|
struct switch_dev *swdev;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
/* skip PHYs at unused adresses */
|
/* skip PHYs at unused adresses */
|
||||||
|
@ -2028,6 +2014,15 @@ ar8216_probe(struct phy_device *phydev)
|
||||||
if (ret)
|
if (ret)
|
||||||
goto free_priv;
|
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:
|
found:
|
||||||
if (phydev->addr == 0) {
|
if (phydev->addr == 0) {
|
||||||
if (ar8xxx_has_gige(priv)) {
|
if (ar8xxx_has_gige(priv)) {
|
||||||
|
|
Loading…
Reference in a new issue