stmmac: fix adjust link call in case of a switch is attached
authorGiuseppe CAVALLARO <peppe.cavallaro@st.com>
Tue, 5 Apr 2016 06:46:57 +0000 (08:46 +0200)
committerDavid S. Miller <davem@davemloft.net>
Wed, 6 Apr 2016 20:34:03 +0000 (16:34 -0400)
While initializing the phy, the stmmac driver sets the
PHY_IGNORE_INTERRUPT so the PAL won't call the adjust hook
that is needed, on some platforms, e.g. STi, to invoke the glue.

The patch allows the PAL to poll the stmmac_adjust_link just one time
in case of a switch is attached, setting later the PHY_IGNORE_INTERRUPT
flag.
Moving this kind of logic inside the adjust_link it makes sense to
anticipate the check for EEE that will never initialized in this
scenario.

Reported-by: Gabriel Fernandez <gabriel.fernandez@linaro.org>
Signed-off-by: Giuseppe Cavallaro <peppe.cavallaro@st.com>
Tested-by: Gabriel Fernandez <gabriel.fernandez@linaro.org>
Cc: Alexandre TORGUE <alexandre.torgue@st.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c

index 78464fa..fcbd4be 100644 (file)
@@ -288,10 +288,6 @@ bool stmmac_eee_init(struct stmmac_priv *priv)
            (priv->pcs == STMMAC_PCS_RTBI))
                goto out;
 
-       /* Never init EEE in case of a switch is attached */
-       if (priv->phydev->is_pseudo_fixed_link)
-               goto out;
-
        /* MAC core supports the EEE feature. */
        if (priv->dma_cap.eee) {
                int tx_lpi_timer = priv->tx_lpi_timer;
@@ -771,10 +767,16 @@ static void stmmac_adjust_link(struct net_device *dev)
 
        spin_unlock_irqrestore(&priv->lock, flags);
 
-       /* At this stage, it could be needed to setup the EEE or adjust some
-        * MAC related HW registers.
-        */
-       priv->eee_enabled = stmmac_eee_init(priv);
+       if (phydev->is_pseudo_fixed_link)
+               /* Stop PHY layer to call the hook to adjust the link in case
+                * of a switch is attached to the stmmac driver.
+                */
+               phydev->irq = PHY_IGNORE_INTERRUPT;
+       else
+               /* At this stage, init the EEE if supported.
+                * Never called in case of fixed_link.
+                */
+               priv->eee_enabled = stmmac_eee_init(priv);
 }
 
 /**
@@ -865,10 +867,6 @@ static int stmmac_init_phy(struct net_device *dev)
                return -ENODEV;
        }
 
-       /* If attached to a switch, there is no reason to poll phy handler */
-       if (phydev->is_pseudo_fixed_link)
-               phydev->irq = PHY_IGNORE_INTERRUPT;
-
        pr_debug("stmmac_init_phy:  %s: attached to PHY (UID 0x%x)"
                 " Link = %d\n", dev->name, phydev->phy_id, phydev->link);