cxgb4: do not return DUPLEX_UNKNOWN when link is down
authorGanesh Goudar <ganeshgr@chelsio.com>
Fri, 13 Jul 2018 12:26:55 +0000 (17:56 +0530)
committerDavid S. Miller <davem@davemloft.net>
Mon, 16 Jul 2018 20:43:10 +0000 (13:43 -0700)
We were returning DUPLEX_UNKNOWN in get_link_ksettings() when
the link was down.  Unfortunately, this causes a problem when
"ethtool -s autoneg on" is issued for a link which is down because
the ethtool code first reads the settings and then reapplies them
with only the changes provided on the command line. Which results
in us diving into set_link_ksettings() with DUPLEX_UNKNOWN which is
not DUPLEX_FULL, so set_link_ksettings() throws an -EINVAL error.
do not return DUPLEX_UNKNOWN to fix the issue.

Signed-off-by: Casey Leedom <leedom@chelsio.com>
Signed-off-by: Ganesh Goudar <ganeshgr@chelsio.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/chelsio/cxgb4/cxgb4_ethtool.c

index a14a290a56ee05913b925e2843df1cb2468a4254..d07230c892a546d6e2a31f7cddb2f51116cd9035 100644 (file)
@@ -628,13 +628,10 @@ static int get_link_ksettings(struct net_device *dev,
        fw_caps_to_lmm(pi->port_type, pi->link_cfg.lpacaps,
                       link_ksettings->link_modes.lp_advertising);
 
-       if (netif_carrier_ok(dev)) {
-               base->speed = pi->link_cfg.speed;
-               base->duplex = DUPLEX_FULL;
-       } else {
-               base->speed = SPEED_UNKNOWN;
-               base->duplex = DUPLEX_UNKNOWN;
-       }
+       base->speed = (netif_carrier_ok(dev)
+                      ? pi->link_cfg.speed
+                      : SPEED_UNKNOWN);
+       base->duplex = DUPLEX_FULL;
 
        if (pi->link_cfg.fc & PAUSE_RX) {
                if (pi->link_cfg.fc & PAUSE_TX) {