Fix the way the local advertising flow options are determined
authorPavaluca Matei-B46610 <matei.pavaluca@freescale.com>
Mon, 27 Oct 2014 08:42:43 +0000 (10:42 +0200)
committerDavid S. Miller <davem@davemloft.net>
Wed, 29 Oct 2014 18:33:16 +0000 (14:33 -0400)
Local flow control options needed in order to resolve the negotiation
are incorrectly calculated.

Previously 'mii_advertise_flowctrl' was called to determine the local advertising
options, but these were determined based on FLOW_CTRL_RX/TX flags which are
never set through ethtool.
The patch simply translates from ethtool flow options to mii flow options.

Signed-off-by: Pavaluca Matei <matei.pavaluca@freescale.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/freescale/gianfar.c

index 2485b742ba704e44efe00d384846a4b5e72972d7..329efcad4fe03a7779895c0fd79d8616bf0f4f12 100644 (file)
@@ -3373,7 +3373,11 @@ static u32 gfar_get_flowctrl_cfg(struct gfar_private *priv)
                if (phydev->asym_pause)
                        rmt_adv |= LPA_PAUSE_ASYM;
 
-               lcl_adv = mii_advertise_flowctrl(phydev->advertising);
+               lcl_adv = 0;
+               if (phydev->advertising & ADVERTISED_Pause)
+                       lcl_adv |= ADVERTISE_PAUSE_CAP;
+               if (phydev->advertising & ADVERTISED_Asym_Pause)
+                       lcl_adv |= ADVERTISE_PAUSE_ASYM;
 
                flowctrl = mii_resolve_flowctrl_fdx(lcl_adv, rmt_adv);
                if (flowctrl & FLOW_CTRL_TX)