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>
This commit is contained in:
parent
a20a1199a8
commit
71fd570b23
5 changed files with 23 additions and 5 deletions
|
@ -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)
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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 */
|
||||||
};
|
};
|
||||||
|
|
Loading…
Add table
Reference in a new issue