aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/broadcom
diff options
context:
space:
mode:
authorYaniv Rosner <yanivr@broadcom.com>2013-04-23 21:44:59 -0400
committerDavid S. Miller <davem@davemloft.net>2013-04-24 16:33:53 -0400
commitba35a0fd1ff7b5e91a6eee145e56887edffa194c (patch)
tree4f16baab31f401dc0d69abb1d365e27fedbc4bdf /drivers/net/ethernet/broadcom
parent2c2d06d5126e62e90aee71da9b85c9d95de6bbe2 (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.c5
-rw-r--r--drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c14
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;