[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <4F8EB17E.4080401@openwrt.org>
Date: Wed, 18 Apr 2012 14:20:14 +0200
From: Florian Fainelli <florian@...nwrt.org>
To: Jonas Gorski <jonas.gorski@...il.com>
CC: netdev@...r.kernel.org, Eric Dumazet <eric.dumazet@...il.com>,
"David S. Miller" <davem@...emloft.net>
Subject: Re: [PATCH] NET: bcm63xx_enet: move phy_(dis)connect into probe/remove
Le 04/18/12 14:02, Jonas Gorski a écrit :
> Only connect/disconnect the phy during probe and remove, not during open
> and close. The phy seldom changes during the runtime, and disconnecting
> the phy during close will prevent the phy driver from keeping any
> configuration over a down/up cycle.
>
> Signed-off-by: Jonas Gorski<jonas.gorski@...il.com>
Acked-by: Florian Fainelli <florian@...nwrt.org>
> ---
> drivers/net/ethernet/broadcom/bcm63xx_enet.c | 84 +++++++++++++-------------
> 1 files changed, 41 insertions(+), 43 deletions(-)
>
> diff --git a/drivers/net/ethernet/broadcom/bcm63xx_enet.c b/drivers/net/ethernet/broadcom/bcm63xx_enet.c
> index c7ca7ec..2744cf0 100644
> --- a/drivers/net/ethernet/broadcom/bcm63xx_enet.c
> +++ b/drivers/net/ethernet/broadcom/bcm63xx_enet.c
> @@ -784,10 +784,8 @@ static int bcm_enet_open(struct net_device *dev)
> struct bcm_enet_priv *priv;
> struct sockaddr addr;
> struct device *kdev;
> - struct phy_device *phydev;
> int i, ret;
> unsigned int size;
> - char phy_id[MII_BUS_ID_SIZE + 3];
> void *p;
> u32 val;
>
> @@ -795,40 +793,10 @@ static int bcm_enet_open(struct net_device *dev)
> kdev =&priv->pdev->dev;
>
> if (priv->has_phy) {
> - /* connect to PHY */
> - snprintf(phy_id, sizeof(phy_id), PHY_ID_FMT,
> - priv->mii_bus->id, priv->phy_id);
> -
> - phydev = phy_connect(dev, phy_id, bcm_enet_adjust_phy_link, 0,
> - PHY_INTERFACE_MODE_MII);
> -
> - if (IS_ERR(phydev)) {
> - dev_err(kdev, "could not attach to PHY\n");
> - return PTR_ERR(phydev);
> - }
> -
> - /* mask with MAC supported features */
> - phydev->supported&= (SUPPORTED_10baseT_Half |
> - SUPPORTED_10baseT_Full |
> - SUPPORTED_100baseT_Half |
> - SUPPORTED_100baseT_Full |
> - SUPPORTED_Autoneg |
> - SUPPORTED_Pause |
> - SUPPORTED_MII);
> - phydev->advertising = phydev->supported;
> -
> - if (priv->pause_auto&& priv->pause_rx&& priv->pause_tx)
> - phydev->advertising |= SUPPORTED_Pause;
> - else
> - phydev->advertising&= ~SUPPORTED_Pause;
> -
> - dev_info(kdev, "attached PHY at address %d [%s]\n",
> - phydev->addr, phydev->drv->name);
> -
> + /* Reset state */
> priv->old_link = 0;
> priv->old_duplex = -1;
> priv->old_pause = -1;
> - priv->phydev = phydev;
> }
>
> /* mask all interrupts and request them */
> @@ -838,7 +806,7 @@ static int bcm_enet_open(struct net_device *dev)
>
> ret = request_irq(dev->irq, bcm_enet_isr_mac, 0, dev->name, dev);
> if (ret)
> - goto out_phy_disconnect;
> + return ret;
>
> ret = request_irq(priv->irq_rx, bcm_enet_isr_dma, IRQF_DISABLED,
> dev->name, dev);
> @@ -1025,9 +993,6 @@ out_freeirq_rx:
> out_freeirq:
> free_irq(dev->irq, dev);
>
> -out_phy_disconnect:
> - phy_disconnect(priv->phydev);
> -
> return ret;
> }
>
> @@ -1132,12 +1097,6 @@ static int bcm_enet_stop(struct net_device *dev)
> free_irq(priv->irq_rx, dev);
> free_irq(dev->irq, dev);
>
> - /* release phy */
> - if (priv->has_phy) {
> - phy_disconnect(priv->phydev);
> - priv->phydev = NULL;
> - }
> -
> return 0;
> }
>
> @@ -1714,6 +1673,8 @@ static int __devinit bcm_enet_probe(struct platform_device *pdev)
>
> /* MII bus registration */
> if (priv->has_phy) {
> + struct phy_device *phydev;
> + char phy_id[MII_BUS_ID_SIZE + 3];
>
> priv->mii_bus = mdiobus_alloc();
> if (!priv->mii_bus) {
> @@ -1750,6 +1711,38 @@ static int __devinit bcm_enet_probe(struct platform_device *pdev)
> dev_err(&pdev->dev, "unable to register mdio bus\n");
> goto out_free_mdio;
> }
> +
> + /* connect to PHY */
> + snprintf(phy_id, sizeof(phy_id), PHY_ID_FMT,
> + priv->mii_bus->id, priv->phy_id);
> +
> + phydev = phy_connect(dev, phy_id, bcm_enet_adjust_phy_link, 0,
> + PHY_INTERFACE_MODE_MII);
> +
> + if (IS_ERR(phydev)) {
> + dev_err(&pdev->dev, "could not attach to PHY\n");
> + goto out_unregister_mdio;
> + }
> +
> + /* mask with MAC supported features */
> + phydev->supported&= (SUPPORTED_10baseT_Half |
> + SUPPORTED_10baseT_Full |
> + SUPPORTED_100baseT_Half |
> + SUPPORTED_100baseT_Full |
> + SUPPORTED_Autoneg |
> + SUPPORTED_Pause |
> + SUPPORTED_MII);
> + phydev->advertising = phydev->supported;
> +
> + if (priv->pause_auto&& priv->pause_rx&& priv->pause_tx)
> + phydev->advertising |= SUPPORTED_Pause;
> + else
> + phydev->advertising&= ~SUPPORTED_Pause;
> +
> + dev_info(&pdev->dev, "attached PHY at address %d [%s]\n",
> + phydev->addr, phydev->drv->name);
> +
> + priv->phydev = phydev;
> } else {
>
> /* run platform code to initialize PHY device */
> @@ -1795,6 +1788,9 @@ static int __devinit bcm_enet_probe(struct platform_device *pdev)
> return 0;
>
> out_unregister_mdio:
> + if (!IS_ERR_OR_NULL(priv->phydev))
> + phy_disconnect(priv->phydev);
> +
> if (priv->mii_bus) {
> mdiobus_unregister(priv->mii_bus);
> kfree(priv->mii_bus->irq);
> @@ -1845,6 +1841,8 @@ static int __devexit bcm_enet_remove(struct platform_device *pdev)
> enet_writel(priv, 0, ENET_MIISC_REG);
>
> if (priv->has_phy) {
> + phy_disconnect(priv->phydev);
> + priv->phydev = NULL;
> mdiobus_unregister(priv->mii_bus);
> kfree(priv->mii_bus->irq);
> mdiobus_free(priv->mii_bus);
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Powered by blists - more mailing lists