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>
                        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,
 
 
        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;