]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
bnxt_en: Improve flow control autoneg with Firmware 1.2.1 interface.
authorMichael Chan <michael.chan@broadcom.com>
Tue, 5 Apr 2016 18:08:56 +0000 (14:08 -0400)
committerChuck Anderson <chuck.anderson@oracle.com>
Thu, 7 Jul 2016 00:37:13 +0000 (17:37 -0700)
Orabug: 23221795

Make use of the new AUTONEG_PAUSE bit in the new interface to better
control autoneg flow control settings, independent of RX and TX
advertisement settings.

Signed-off-by: Michael Chan <michael.chan@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
(cherry picked from commit c9ee9516c161da2d072e035907aa35a35dfa68a8)
Signed-off-by: Brian Maly <brian.maly@oracle.com>
drivers/net/ethernet/broadcom/bnxt/bnxt.c
drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c

index c7e76269196027c49070f6688305d969e6212bf9..c851904a4cf86f128620150f93bba72c819ce77a 100644 (file)
@@ -4679,6 +4679,9 @@ static void
 bnxt_hwrm_set_pause_common(struct bnxt *bp, struct hwrm_port_phy_cfg_input *req)
 {
        if (bp->link_info.autoneg & BNXT_AUTONEG_FLOW_CTRL) {
+               if (bp->hwrm_spec_code >= 0x10201)
+                       req->auto_pause =
+                               PORT_PHY_CFG_REQ_AUTO_PAUSE_AUTONEG_PAUSE;
                if (bp->link_info.req_flow_ctrl & BNXT_LINK_PAUSE_RX)
                        req->auto_pause |= PORT_PHY_CFG_REQ_AUTO_PAUSE_RX;
                if (bp->link_info.req_flow_ctrl & BNXT_LINK_PAUSE_TX)
@@ -4692,6 +4695,11 @@ bnxt_hwrm_set_pause_common(struct bnxt *bp, struct hwrm_port_phy_cfg_input *req)
                        req->force_pause |= PORT_PHY_CFG_REQ_FORCE_PAUSE_TX;
                req->enables |=
                        cpu_to_le32(PORT_PHY_CFG_REQ_ENABLES_FORCE_PAUSE);
+               if (bp->hwrm_spec_code >= 0x10201) {
+                       req->auto_pause = req->force_pause;
+                       req->enables |= cpu_to_le32(
+                               PORT_PHY_CFG_REQ_ENABLES_AUTO_PAUSE);
+               }
        }
 }
 
@@ -4778,7 +4786,8 @@ static int bnxt_update_phy_setting(struct bnxt *bp)
                return rc;
        }
        if ((link_info->autoneg & BNXT_AUTONEG_FLOW_CTRL) &&
-           link_info->auto_pause_setting != link_info->req_flow_ctrl)
+           (link_info->auto_pause_setting & BNXT_LINK_PAUSE_BOTH) !=
+           link_info->req_flow_ctrl)
                update_pause = true;
        if (!(link_info->autoneg & BNXT_AUTONEG_FLOW_CTRL) &&
            link_info->force_pause_setting != link_info->req_flow_ctrl)
@@ -5986,15 +5995,24 @@ static int bnxt_probe_phy(struct bnxt *bp)
 
        /*initialize the ethool setting copy with NVM settings */
        if (BNXT_AUTO_MODE(link_info->auto_mode)) {
-               link_info->autoneg = BNXT_AUTONEG_SPEED |
-                                    BNXT_AUTONEG_FLOW_CTRL;
+               link_info->autoneg = BNXT_AUTONEG_SPEED;
+               if (bp->hwrm_spec_code >= 0x10201) {
+                       if (link_info->auto_pause_setting &
+                           PORT_PHY_CFG_REQ_AUTO_PAUSE_AUTONEG_PAUSE)
+                               link_info->autoneg |= BNXT_AUTONEG_FLOW_CTRL;
+               } else {
+                       link_info->autoneg |= BNXT_AUTONEG_FLOW_CTRL;
+               }
                link_info->advertising = link_info->auto_link_speeds;
-               link_info->req_flow_ctrl = link_info->auto_pause_setting;
        } else {
                link_info->req_link_speed = link_info->force_link_speed;
                link_info->req_duplex = link_info->duplex_setting;
-               link_info->req_flow_ctrl = link_info->force_pause_setting;
        }
+       if (link_info->autoneg & BNXT_AUTONEG_FLOW_CTRL)
+               link_info->req_flow_ctrl =
+                       link_info->auto_pause_setting & BNXT_LINK_PAUSE_BOTH;
+       else
+               link_info->req_flow_ctrl = link_info->force_pause_setting;
        return rc;
 }
 
index 62f022f150dadfe59711fd0c318bd3ffc6cb3012..1944e02fe4fb8762c7f5e281b1a4e9cb1aeb65fc 100644 (file)
@@ -901,7 +901,9 @@ static int bnxt_set_pauseparam(struct net_device *dev,
                        return -EINVAL;
 
                link_info->autoneg |= BNXT_AUTONEG_FLOW_CTRL;
-               link_info->req_flow_ctrl |= BNXT_LINK_PAUSE_BOTH;
+               if (bp->hwrm_spec_code >= 0x10201)
+                       link_info->req_flow_ctrl =
+                               PORT_PHY_CFG_REQ_AUTO_PAUSE_AUTONEG_PAUSE;
        } else {
                /* when transition from auto pause to force pause,
                 * force a link change
@@ -909,17 +911,13 @@ static int bnxt_set_pauseparam(struct net_device *dev,
                if (link_info->autoneg & BNXT_AUTONEG_FLOW_CTRL)
                        link_info->force_link_chng = true;
                link_info->autoneg &= ~BNXT_AUTONEG_FLOW_CTRL;
-               link_info->req_flow_ctrl &= ~BNXT_LINK_PAUSE_BOTH;
+               link_info->req_flow_ctrl = 0;
        }
        if (epause->rx_pause)
                link_info->req_flow_ctrl |= BNXT_LINK_PAUSE_RX;
-       else
-               link_info->req_flow_ctrl &= ~BNXT_LINK_PAUSE_RX;
 
        if (epause->tx_pause)
                link_info->req_flow_ctrl |= BNXT_LINK_PAUSE_TX;
-       else
-               link_info->req_flow_ctrl &= ~BNXT_LINK_PAUSE_TX;
 
        if (netif_running(dev))
                rc = bnxt_hwrm_set_pause(bp);