Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ixgbe: fix ethtool -A|a behavior

We were basicly ignoring ethtool users request for FC autoneg
and replying to queries with a "best guess". This patch
enables the driver to store if we want to enable/disable
autoneg FC and do the correct behavior.

Signed-off-by: Don Skidmore <donald.c.skidmore@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Don Skidmore and committed by
David S. Miller
71fd570b a20a1199

+23 -5
+2 -1
drivers/net/ixgbe/ixgbe_82598.c
··· 411 411 412 412 /* Decide whether to use autoneg or not. */ 413 413 hw->mac.ops.check_link(hw, &speed, &link_up, false); 414 - if (hw->phy.multispeed_fiber && (speed == IXGBE_LINK_SPEED_1GB_FULL)) 414 + if (!hw->fc.disable_fc_autoneg && hw->phy.multispeed_fiber && 415 + (speed == IXGBE_LINK_SPEED_1GB_FULL)) 415 416 ret_val = ixgbe_fc_autoneg(hw); 416 417 417 418 if (ret_val)
+2 -1
drivers/net/ixgbe/ixgbe_common.c
··· 1937 1937 1938 1938 /* Decide whether to use autoneg or not. */ 1939 1939 hw->mac.ops.check_link(hw, &speed, &link_up, false); 1940 - if (hw->phy.multispeed_fiber && (speed == IXGBE_LINK_SPEED_1GB_FULL)) 1940 + if (!hw->fc.disable_fc_autoneg && hw->phy.multispeed_fiber && 1941 + (speed == IXGBE_LINK_SPEED_1GB_FULL)) 1941 1942 ret_val = ixgbe_fc_autoneg(hw); 1942 1943 1943 1944 if (ret_val)
+16 -3
drivers/net/ixgbe/ixgbe_ethtool.c
··· 234 234 struct ixgbe_adapter *adapter = netdev_priv(netdev); 235 235 struct ixgbe_hw *hw = &adapter->hw; 236 236 237 - pause->autoneg = (hw->fc.current_mode == ixgbe_fc_full ? 1 : 0); 237 + /* 238 + * Flow Control Autoneg isn't on if 239 + * - we didn't ask for it OR 240 + * - it failed, we know this by tx & rx being off 241 + */ 242 + if (hw->fc.disable_fc_autoneg || 243 + (hw->fc.current_mode == ixgbe_fc_none)) 244 + pause->autoneg = 0; 245 + else 246 + pause->autoneg = 1; 238 247 239 248 if (hw->fc.current_mode == ixgbe_fc_rx_pause) { 240 249 pause->rx_pause = 1; ··· 261 252 struct ixgbe_adapter *adapter = netdev_priv(netdev); 262 253 struct ixgbe_hw *hw = &adapter->hw; 263 254 264 - if ((pause->autoneg == AUTONEG_ENABLE) || 265 - (pause->rx_pause && pause->tx_pause)) 255 + if (pause->autoneg != AUTONEG_ENABLE) 256 + hw->fc.disable_fc_autoneg = true; 257 + else 258 + hw->fc.disable_fc_autoneg = false; 259 + 260 + if (pause->rx_pause && pause->tx_pause) 266 261 hw->fc.requested_mode = ixgbe_fc_full; 267 262 else if (pause->rx_pause && !pause->tx_pause) 268 263 hw->fc.requested_mode = ixgbe_fc_rx_pause;
+2
drivers/net/ixgbe/ixgbe_main.c
··· 3167 3167 3168 3168 /* default flow control settings */ 3169 3169 hw->fc.requested_mode = ixgbe_fc_full; 3170 + hw->fc.current_mode = ixgbe_fc_full; /* init for ethtool output */ 3170 3171 hw->fc.high_water = IXGBE_DEFAULT_FCRTH; 3171 3172 hw->fc.low_water = IXGBE_DEFAULT_FCRTL; 3172 3173 hw->fc.pause_time = IXGBE_DEFAULT_FCPAUSE; 3173 3174 hw->fc.send_xon = true; 3175 + hw->fc.disable_fc_autoneg = false; 3174 3176 3175 3177 /* enable itr by default in dynamic mode */ 3176 3178 adapter->itr_setting = 1;
+1
drivers/net/ixgbe/ixgbe_type.h
··· 2005 2005 u16 pause_time; /* Flow Control Pause timer */ 2006 2006 bool send_xon; /* Flow control send XON */ 2007 2007 bool strict_ieee; /* Strict IEEE mode */ 2008 + bool disable_fc_autoneg; /* Turn off autoneg FC mode */ 2008 2009 enum ixgbe_fc_mode current_mode; /* FC mode in effect */ 2009 2010 enum ixgbe_fc_mode requested_mode; /* FC mode requested by caller */ 2010 2011 };