]> git.droids-corp.org - dpdk.git/commitdiff
net/bnxt: fix PAM4 link negotiation
authorAjit Khaparde <ajit.khaparde@broadcom.com>
Mon, 2 Nov 2020 02:43:16 +0000 (18:43 -0800)
committerFerruh Yigit <ferruh.yigit@intel.com>
Tue, 3 Nov 2020 22:35:07 +0000 (23:35 +0100)
In some instances link was not coming up if PAM4 signaling is enabled.
Added check to disable autoneg if FW indicates auto speeds are zero.
Use default auto speeds if PAM4 auto speeds is not set.
Added a fix for forced link setting.

Fixes: c23f9ded0391 ("net/bnxt: support 200G PAM4 link")
Signed-off-by: Ajit Khaparde <ajit.khaparde@broadcom.com>
drivers/net/bnxt/bnxt_ethdev.c
drivers/net/bnxt/bnxt_hwrm.c

index 0d26c9d2b0161870979b5f709360d407c68d7ac8..31153518ce31871ddab24e4d8f2c55a3be340b74 100644 (file)
@@ -848,6 +848,10 @@ uint32_t bnxt_get_speed_capabilities(struct bnxt *bp)
        uint32_t link_speed = bp->link_info->support_speeds;
        uint32_t speed_capa = 0;
 
+       /* If PAM4 is configured, use PAM4 supported speed */
+       if (link_speed == 0 && bp->link_info->support_pam4_speeds > 0)
+               link_speed = bp->link_info->support_pam4_speeds;
+
        if (link_speed & HWRM_PORT_PHY_QCFG_OUTPUT_LINK_SPEED_100MB)
                speed_capa |= ETH_LINK_SPEED_100M;
        if (link_speed & HWRM_PORT_PHY_QCFG_OUTPUT_SUPPORT_SPEEDS_100MBHD)
index 84702125cc1be88534258f6c370b5aca381cf0bd..24c33185b499e949a804299e743fd5507cbd403c 100644 (file)
@@ -1272,9 +1272,10 @@ static int bnxt_hwrm_port_phy_cfg(struct bnxt *bp, struct bnxt_link_info *conf)
                                HWRM_PORT_PHY_CFG_IN_EN_FORCE_PAM4_LINK_SPEED;
                                req.force_pam4_link_speed =
                                        rte_cpu_to_le_16(conf->link_speed);
-                       }
-                       req.force_link_speed =
+                       } else {
+                               req.force_link_speed =
                                        rte_cpu_to_le_16(conf->link_speed);
+                       }
                }
                /* AutoNeg - Advertise speeds specified. */
                if (conf->auto_link_speed_mask &&
@@ -1370,6 +1371,11 @@ static int bnxt_hwrm_port_phy_qcfg(struct bnxt *bp,
                    link_info->link_speed, link_info->auto_mode,
                    link_info->auto_link_speed, link_info->auto_link_speed_mask,
                    link_info->support_speeds, link_info->force_link_speed);
+       PMD_DRV_LOG(DEBUG, "Link Signal:%d,PAM::Auto:%x,Support:%x,Force:%x\n",
+                   link_info->link_signal_mode,
+                   link_info->auto_pam4_link_speeds,
+                   link_info->support_pam4_speeds,
+                   link_info->force_pam4_link_speed);
        return rc;
 }
 
@@ -3071,6 +3077,12 @@ int bnxt_set_hwrm_link_config(struct bnxt *bp, bool link_up)
                autoneg = 0;
        }
 
+       /* No auto speeds and no auto_pam4_link. Disable autoneg */
+       if (bp->link_info->auto_link_speed == 0 &&
+           bp->link_info->link_signal_mode &&
+           bp->link_info->auto_pam4_link_speeds == 0)
+               autoneg = 0;
+
        speed = bnxt_parse_eth_link_speed(dev_conf->link_speeds,
                                          bp->link_info->link_signal_mode);
        link_req.phy_flags = HWRM_PORT_PHY_CFG_INPUT_FLAGS_RESET_PHY;
@@ -3116,6 +3128,12 @@ int bnxt_set_hwrm_link_config(struct bnxt *bp, bool link_up)
                        link_req.link_speed = bp->link_info->force_link_speed;
                else
                        link_req.link_speed = bp->link_info->auto_link_speed;
+               /* Auto PAM4 link speed is zero, but auto_link_speed is not
+                * zero. Use the auto_link_speed.
+                */
+               if (bp->link_info->auto_link_speed != 0 &&
+                   bp->link_info->auto_pam4_link_speeds == 0)
+                       link_req.link_speed = bp->link_info->auto_link_speed;
        }
        link_req.duplex = bnxt_parse_eth_link_duplex(dev_conf->link_speeds);
        link_req.auto_pause = bp->link_info->auto_pause;