Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 71fd570b authored by Don Skidmore's avatar Don Skidmore Committed by David S. Miller
Browse files

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: default avatarDon Skidmore <donald.c.skidmore@intel.com>
Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent a20a1199
Loading
Loading
Loading
Loading
+2 −1
Original line number Original line Diff line number Diff line
@@ -411,7 +411,8 @@ static s32 ixgbe_setup_fc_82598(struct ixgbe_hw *hw, s32 packetbuf_num)


	/* Decide whether to use autoneg or not. */
	/* Decide whether to use autoneg or not. */
	hw->mac.ops.check_link(hw, &speed, &link_up, false);
	hw->mac.ops.check_link(hw, &speed, &link_up, false);
	if (hw->phy.multispeed_fiber && (speed == IXGBE_LINK_SPEED_1GB_FULL))
	if (!hw->fc.disable_fc_autoneg && hw->phy.multispeed_fiber &&
	    (speed == IXGBE_LINK_SPEED_1GB_FULL))
		ret_val = ixgbe_fc_autoneg(hw);
		ret_val = ixgbe_fc_autoneg(hw);


	if (ret_val)
	if (ret_val)
+2 −1
Original line number Original line Diff line number Diff line
@@ -1937,7 +1937,8 @@ s32 ixgbe_setup_fc_generic(struct ixgbe_hw *hw, s32 packetbuf_num)


	/* Decide whether to use autoneg or not. */
	/* Decide whether to use autoneg or not. */
	hw->mac.ops.check_link(hw, &speed, &link_up, false);
	hw->mac.ops.check_link(hw, &speed, &link_up, false);
	if (hw->phy.multispeed_fiber && (speed == IXGBE_LINK_SPEED_1GB_FULL))
	if (!hw->fc.disable_fc_autoneg && hw->phy.multispeed_fiber &&
	    (speed == IXGBE_LINK_SPEED_1GB_FULL))
		ret_val = ixgbe_fc_autoneg(hw);
		ret_val = ixgbe_fc_autoneg(hw);


	if (ret_val)
	if (ret_val)
+16 −3
Original line number Original line Diff line number Diff line
@@ -234,7 +234,16 @@ static void ixgbe_get_pauseparam(struct net_device *netdev,
	struct ixgbe_adapter *adapter = netdev_priv(netdev);
	struct ixgbe_adapter *adapter = netdev_priv(netdev);
	struct ixgbe_hw *hw = &adapter->hw;
	struct ixgbe_hw *hw = &adapter->hw;


	pause->autoneg = (hw->fc.current_mode == ixgbe_fc_full ? 1 : 0);
	/*
	 * Flow Control Autoneg isn't on if
	 *  - we didn't ask for it OR
	 *  - it failed, we know this by tx & rx being off
	 */
	if (hw->fc.disable_fc_autoneg ||
	    (hw->fc.current_mode == ixgbe_fc_none))
		pause->autoneg = 0;
	else
		pause->autoneg = 1;


	if (hw->fc.current_mode == ixgbe_fc_rx_pause) {
	if (hw->fc.current_mode == ixgbe_fc_rx_pause) {
		pause->rx_pause = 1;
		pause->rx_pause = 1;
@@ -252,8 +261,12 @@ static int ixgbe_set_pauseparam(struct net_device *netdev,
	struct ixgbe_adapter *adapter = netdev_priv(netdev);
	struct ixgbe_adapter *adapter = netdev_priv(netdev);
	struct ixgbe_hw *hw = &adapter->hw;
	struct ixgbe_hw *hw = &adapter->hw;


	if ((pause->autoneg == AUTONEG_ENABLE) ||
	if (pause->autoneg != AUTONEG_ENABLE)
	    (pause->rx_pause && pause->tx_pause))
		hw->fc.disable_fc_autoneg = true;
	else
		hw->fc.disable_fc_autoneg = false;

	if (pause->rx_pause && pause->tx_pause)
		hw->fc.requested_mode = ixgbe_fc_full;
		hw->fc.requested_mode = ixgbe_fc_full;
	else if (pause->rx_pause && !pause->tx_pause)
	else if (pause->rx_pause && !pause->tx_pause)
		hw->fc.requested_mode = ixgbe_fc_rx_pause;
		hw->fc.requested_mode = ixgbe_fc_rx_pause;
+2 −0
Original line number Original line Diff line number Diff line
@@ -3167,10 +3167,12 @@ static int __devinit ixgbe_sw_init(struct ixgbe_adapter *adapter)


	/* default flow control settings */
	/* default flow control settings */
	hw->fc.requested_mode = ixgbe_fc_full;
	hw->fc.requested_mode = ixgbe_fc_full;
	hw->fc.current_mode = ixgbe_fc_full;	/* init for ethtool output */
	hw->fc.high_water = IXGBE_DEFAULT_FCRTH;
	hw->fc.high_water = IXGBE_DEFAULT_FCRTH;
	hw->fc.low_water = IXGBE_DEFAULT_FCRTL;
	hw->fc.low_water = IXGBE_DEFAULT_FCRTL;
	hw->fc.pause_time = IXGBE_DEFAULT_FCPAUSE;
	hw->fc.pause_time = IXGBE_DEFAULT_FCPAUSE;
	hw->fc.send_xon = true;
	hw->fc.send_xon = true;
	hw->fc.disable_fc_autoneg = false;


	/* enable itr by default in dynamic mode */
	/* enable itr by default in dynamic mode */
	adapter->itr_setting = 1;
	adapter->itr_setting = 1;
+1 −0
Original line number Original line Diff line number Diff line
@@ -2005,6 +2005,7 @@ struct ixgbe_fc_info {
	u16 pause_time; /* Flow Control Pause timer */
	u16 pause_time; /* Flow Control Pause timer */
	bool send_xon; /* Flow control send XON */
	bool send_xon; /* Flow control send XON */
	bool strict_ieee; /* Strict IEEE mode */
	bool strict_ieee; /* Strict IEEE mode */
	bool disable_fc_autoneg; /* Turn off autoneg FC mode */
	enum ixgbe_fc_mode current_mode; /* FC mode in effect */
	enum ixgbe_fc_mode current_mode; /* FC mode in effect */
	enum ixgbe_fc_mode requested_mode; /* FC mode requested by caller */
	enum ixgbe_fc_mode requested_mode; /* FC mode requested by caller */
};
};