bnx2x: Allow RX/TX pause control in autoneg
authorYaniv Rosner <yanivr@broadcom.com>
Wed, 24 Apr 2013 01:44:59 +0000 (01:44 +0000)
committerDavid S. Miller <davem@davemloft.net>
Wed, 24 Apr 2013 20:33:53 +0000 (16:33 -0400)
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>
drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c
drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c

index 88e9b47a3eb6a2255c687fb4b43f54e164b58686..397537bb44483cd2ce4a0de546a7d93d2b794cb8 100644 (file)
@@ -1889,12 +1889,15 @@ static int bnx2x_set_pauseparam(struct net_device *dev,
                        bp->link_params.req_flow_ctrl[cfg_idx] =
                                BNX2X_FLOW_CTRL_AUTO;
                }
-               bp->link_params.req_fc_auto_adv = BNX2X_FLOW_CTRL_NONE;
+               bp->link_params.req_fc_auto_adv = 0;
                if (epause->rx_pause)
                        bp->link_params.req_fc_auto_adv |= BNX2X_FLOW_CTRL_RX;
 
                if (epause->tx_pause)
                        bp->link_params.req_fc_auto_adv |= BNX2X_FLOW_CTRL_TX;
+
+               if (!bp->link_params.req_fc_auto_adv)
+                       bp->link_params.req_fc_auto_adv |= BNX2X_FLOW_CTRL_NONE;
        }
 
        DP(BNX2X_MSG_ETHTOOL,
index 40f58d73de78ae297f38fe7397d3cc35eaf7a28e..9d64b988ab34e03be950a9da2f8642770b35586b 100644 (file)
@@ -3426,13 +3426,19 @@ static void bnx2x_calc_ieee_aneg_adv(struct bnx2x_phy *phy,
 
        switch (phy->req_flow_ctrl) {
        case BNX2X_FLOW_CTRL_AUTO:
-               if (params->req_fc_auto_adv == BNX2X_FLOW_CTRL_BOTH)
+               switch (params->req_fc_auto_adv) {
+               case BNX2X_FLOW_CTRL_BOTH:
                        *ieee_fc |= MDIO_COMBO_IEEE0_AUTO_NEG_ADV_PAUSE_BOTH;
-               else
+                       break;
+               case BNX2X_FLOW_CTRL_RX:
+               case BNX2X_FLOW_CTRL_TX:
                        *ieee_fc |=
-                       MDIO_COMBO_IEEE0_AUTO_NEG_ADV_PAUSE_ASYMMETRIC;
+                               MDIO_COMBO_IEEE0_AUTO_NEG_ADV_PAUSE_ASYMMETRIC;
+                       break;
+               default:
+                       break;
+               }
                break;
-
        case BNX2X_FLOW_CTRL_TX:
                *ieee_fc |= MDIO_COMBO_IEEE0_AUTO_NEG_ADV_PAUSE_ASYMMETRIC;
                break;