Encapsulate link speed update logic. These settings affect only the maccfg2 and ecntrl regs.
Signed-off-by: Claudiu Manoil <claudiu.man...@nxp.com> --- drivers/net/ethernet/freescale/gianfar.c | 92 +++++++++++++++++--------------- 1 file changed, 49 insertions(+), 43 deletions(-) diff --git a/drivers/net/ethernet/freescale/gianfar.c b/drivers/net/ethernet/freescale/gianfar.c index 5be52d8..46880a9 100644 --- a/drivers/net/ethernet/freescale/gianfar.c +++ b/drivers/net/ethernet/freescale/gianfar.c @@ -3672,6 +3672,54 @@ static u32 gfar_get_flowctrl_cfg(struct gfar_private *priv) return val; } +static void gfar_update_link_speed(struct gfar_private *priv) +{ + struct gfar __iomem *regs = priv->gfargrp[0].regs; + struct phy_device *phydev = priv->ndev->phydev; + u32 maccfg2, ecntrl; + + maccfg2 = gfar_read(®s->maccfg2); + ecntrl = gfar_read(®s->ecntrl); + + if (phydev->duplex != priv->oldduplex) { + if (!(phydev->duplex)) + maccfg2 &= ~(MACCFG2_FULL_DUPLEX); + else + maccfg2 |= MACCFG2_FULL_DUPLEX; + + priv->oldduplex = phydev->duplex; + } + + if (phydev->speed != priv->oldspeed) { + switch (phydev->speed) { + case 1000: + maccfg2 = ((maccfg2 & ~(MACCFG2_IF)) | MACCFG2_GMII); + + ecntrl &= ~(ECNTRL_R100); + break; + case 100: + case 10: + maccfg2 = ((maccfg2 & ~(MACCFG2_IF)) | MACCFG2_MII); + + /* Reduced mode distinguishes between 10 and 100 */ + if (phydev->speed == SPEED_100) + ecntrl |= ECNTRL_R100; + else + ecntrl &= ~(ECNTRL_R100); + break; + default: + netif_warn(priv, link, priv->ndev, + "Invalid link speed!\n"); + break; + } + + priv->oldspeed = phydev->speed; + } + + gfar_write(®s->maccfg2, maccfg2); + gfar_write(®s->ecntrl, ecntrl); +} + static noinline void gfar_update_link_state(struct gfar_private *priv) { struct gfar __iomem *regs = priv->gfargrp[0].regs; @@ -3685,49 +3733,9 @@ static noinline void gfar_update_link_state(struct gfar_private *priv) if (phydev->link) { u32 tempval1 = gfar_read(®s->maccfg1); - u32 tempval = gfar_read(®s->maccfg2); - u32 ecntrl = gfar_read(®s->ecntrl); u32 tx_flow_oldval = (tempval1 & MACCFG1_TX_FLOW); - if (phydev->duplex != priv->oldduplex) { - if (!(phydev->duplex)) - tempval &= ~(MACCFG2_FULL_DUPLEX); - else - tempval |= MACCFG2_FULL_DUPLEX; - - priv->oldduplex = phydev->duplex; - } - - if (phydev->speed != priv->oldspeed) { - switch (phydev->speed) { - case 1000: - tempval = - ((tempval & ~(MACCFG2_IF)) | MACCFG2_GMII); - - ecntrl &= ~(ECNTRL_R100); - break; - case 100: - case 10: - tempval = - ((tempval & ~(MACCFG2_IF)) | MACCFG2_MII); - - /* Reduced mode distinguishes - * between 10 and 100 - */ - if (phydev->speed == SPEED_100) - ecntrl |= ECNTRL_R100; - else - ecntrl &= ~(ECNTRL_R100); - break; - default: - netif_warn(priv, link, priv->ndev, - "Ack! Speed (%d) is not 10/100/1000!\n", - phydev->speed); - break; - } - - priv->oldspeed = phydev->speed; - } + gfar_update_link_speed(priv); tempval1 &= ~(MACCFG1_TX_FLOW | MACCFG1_RX_FLOW); tempval1 |= gfar_get_flowctrl_cfg(priv); @@ -3749,8 +3757,6 @@ static noinline void gfar_update_link_state(struct gfar_private *priv) priv->tx_actual_en = 0; gfar_write(®s->maccfg1, tempval1); - gfar_write(®s->maccfg2, tempval); - gfar_write(®s->ecntrl, ecntrl); if (!priv->oldlink) priv->oldlink = 1; -- 2.7.4