diff options
author | Yaniv Rosner <yanivr@broadcom.com> | 2013-04-23 21:44:59 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-04-24 16:33:53 -0400 |
commit | ba35a0fd1ff7b5e91a6eee145e56887edffa194c (patch) | |
tree | 4f16baab31f401dc0d69abb1d365e27fedbc4bdf /drivers/net/ethernet/broadcom | |
parent | 2c2d06d5126e62e90aee71da9b85c9d95de6bbe2 (diff) |
bnx2x: Allow RX/TX pause control in autoneg
Currently, when link is configured to auto-negotiate the flow control,
disabling RX/TX pause via ethtool doesn't work.
This fixes the behaviour, advertising asymmetric pause in case either one
is exclusively enabled.
Signed-off-by: Yaniv Rosner <yanivr@broadcom.com>
Signed-off-by: Yuval Mintz <yuvalmin@broadcom.com>
Signed-off-by: Eilon Greenstein <eilong@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/broadcom')
-rw-r--r-- | drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c | 5 | ||||
-rw-r--r-- | drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c | 14 |
2 files changed, 14 insertions, 5 deletions
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c index 88e9b47a3eb6..397537bb4448 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c | |||
@@ -1889,12 +1889,15 @@ static int bnx2x_set_pauseparam(struct net_device *dev, | |||
1889 | bp->link_params.req_flow_ctrl[cfg_idx] = | 1889 | bp->link_params.req_flow_ctrl[cfg_idx] = |
1890 | BNX2X_FLOW_CTRL_AUTO; | 1890 | BNX2X_FLOW_CTRL_AUTO; |
1891 | } | 1891 | } |
1892 | bp->link_params.req_fc_auto_adv = BNX2X_FLOW_CTRL_NONE; | 1892 | bp->link_params.req_fc_auto_adv = 0; |
1893 | if (epause->rx_pause) | 1893 | if (epause->rx_pause) |
1894 | bp->link_params.req_fc_auto_adv |= BNX2X_FLOW_CTRL_RX; | 1894 | bp->link_params.req_fc_auto_adv |= BNX2X_FLOW_CTRL_RX; |
1895 | 1895 | ||
1896 | if (epause->tx_pause) | 1896 | if (epause->tx_pause) |
1897 | bp->link_params.req_fc_auto_adv |= BNX2X_FLOW_CTRL_TX; | 1897 | bp->link_params.req_fc_auto_adv |= BNX2X_FLOW_CTRL_TX; |
1898 | |||
1899 | if (!bp->link_params.req_fc_auto_adv) | ||
1900 | bp->link_params.req_fc_auto_adv |= BNX2X_FLOW_CTRL_NONE; | ||
1898 | } | 1901 | } |
1899 | 1902 | ||
1900 | DP(BNX2X_MSG_ETHTOOL, | 1903 | DP(BNX2X_MSG_ETHTOOL, |
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c index 40f58d73de78..9d64b988ab34 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c | |||
@@ -3426,13 +3426,19 @@ static void bnx2x_calc_ieee_aneg_adv(struct bnx2x_phy *phy, | |||
3426 | 3426 | ||
3427 | switch (phy->req_flow_ctrl) { | 3427 | switch (phy->req_flow_ctrl) { |
3428 | case BNX2X_FLOW_CTRL_AUTO: | 3428 | case BNX2X_FLOW_CTRL_AUTO: |
3429 | if (params->req_fc_auto_adv == BNX2X_FLOW_CTRL_BOTH) | 3429 | switch (params->req_fc_auto_adv) { |
3430 | case BNX2X_FLOW_CTRL_BOTH: | ||
3430 | *ieee_fc |= MDIO_COMBO_IEEE0_AUTO_NEG_ADV_PAUSE_BOTH; | 3431 | *ieee_fc |= MDIO_COMBO_IEEE0_AUTO_NEG_ADV_PAUSE_BOTH; |
3431 | else | 3432 | break; |
3433 | case BNX2X_FLOW_CTRL_RX: | ||
3434 | case BNX2X_FLOW_CTRL_TX: | ||
3432 | *ieee_fc |= | 3435 | *ieee_fc |= |
3433 | MDIO_COMBO_IEEE0_AUTO_NEG_ADV_PAUSE_ASYMMETRIC; | 3436 | MDIO_COMBO_IEEE0_AUTO_NEG_ADV_PAUSE_ASYMMETRIC; |
3437 | break; | ||
3438 | default: | ||
3439 | break; | ||
3440 | } | ||
3434 | break; | 3441 | break; |
3435 | |||
3436 | case BNX2X_FLOW_CTRL_TX: | 3442 | case BNX2X_FLOW_CTRL_TX: |
3437 | *ieee_fc |= MDIO_COMBO_IEEE0_AUTO_NEG_ADV_PAUSE_ASYMMETRIC; | 3443 | *ieee_fc |= MDIO_COMBO_IEEE0_AUTO_NEG_ADV_PAUSE_ASYMMETRIC; |
3438 | break; | 3444 | break; |