mdio: Advertise pause (flow control) settings even if autoneg is off
authorBen Hutchings <bhutchings@solarflare.com>
Mon, 12 Oct 2009 09:26:17 +0000 (09:26 +0000)
committerDavid S. Miller <davem@davemloft.net>
Tue, 13 Oct 2009 06:59:07 +0000 (23:59 -0700)
Currently, if pause autoneg is off we do not set either pause
advertising flag.  If autonegotiation of speed and duplex settings is
enabled, there is no way for the link partner to distinguish this from
our refusing to use pause frames.

We should instead set the advertising flags according to the forced
mode so that the link partner can follow our lead.  This is consistent
with the behaviour of other drivers.

Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/mdio.c

index 21f8754fcf4c128f6b4f6b4aee6678ff83f69bef..c0db9d753006b126f48712429e6ca0d8bd85d821 100644 (file)
@@ -344,11 +344,9 @@ void mdio45_ethtool_spauseparam_an(const struct mdio_if_info *mdio,
 
        old_adv = mdio->mdio_read(mdio->dev, mdio->prtad, MDIO_MMD_AN,
                                  MDIO_AN_ADVERTISE);
-       adv = old_adv & ~(ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM);
-       if (ecmd->autoneg)
-               adv |= mii_advertise_flowctrl(
-                       (ecmd->rx_pause ? FLOW_CTRL_RX : 0) |
-                       (ecmd->tx_pause ? FLOW_CTRL_TX : 0));
+       adv = ((old_adv & ~(ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM)) |
+              mii_advertise_flowctrl((ecmd->rx_pause ? FLOW_CTRL_RX : 0) |
+                                     (ecmd->tx_pause ? FLOW_CTRL_TX : 0)));
        if (adv != old_adv) {
                mdio->mdio_write(mdio->dev, mdio->prtad, MDIO_MMD_AN,
                                 MDIO_AN_ADVERTISE, adv);