diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-5.15/9053-amd-xgbe-rx-adaptation-handle-SFP-connectors.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-5.15/9053-amd-xgbe-rx-adaptation-handle-SFP-connectors.patch | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-5.15/9053-amd-xgbe-rx-adaptation-handle-SFP-connectors.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-5.15/9053-amd-xgbe-rx-adaptation-handle-SFP-connectors.patch new file mode 100644 index 00000000..a2c9325e --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-5.15/9053-amd-xgbe-rx-adaptation-handle-SFP-connectors.patch @@ -0,0 +1,129 @@ +From f8f3f4cab4c58884fdf00fc7163d6090c5bcd286 Mon Sep 17 00:00:00 2001 +From: Raju Rangoju <Raju.Rangoju@amd.com> +Date: Sat, 18 Jun 2022 00:40:53 +0530 +Subject: [PATCH 53/57] amd-xgbe: rx-adaptation - handle SFP+ connectors + +Add changes to fix the regression for Fiber optic cables (SFP+ conectors). +Also handle the 1G BEL modules. + +Signed-off-by: Raju Rangoju <Raju.Rangoju@amd.com> +Change-Id: I7f57a00890dae2e36e5f8578e576fc53a01cff5f +--- + drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c | 50 ++++++++++++--------- + 1 file changed, 30 insertions(+), 20 deletions(-) + +diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c b/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c +index 1035696b295f..22b2202a6d0f 100644 +--- a/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c ++++ b/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c +@@ -2306,16 +2306,39 @@ static void xgbe_phy_power_off(struct xgbe_prv_data *pdata) + netif_dbg(pdata, link, pdata->netdev, "phy powered off\n"); + } + ++static bool enable_rx_adap(struct xgbe_prv_data *pdata, enum xgbe_mode mode) ++{ ++ struct xgbe_phy_data *phy_data = pdata->phy_data; ++ ++ if ((pdata->vdata->is_yc) && ++ (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_10000)) { ++ if ((phy_data->redrv) && ++ ((phy_data->redrv_model == XGBE_PHY_REDRV_MODEL_4223) || ++ (phy_data->redrv_model == XGBE_PHY_REDRV_MODEL_4227))) ++ return false; ++ ++ if (mode == XGBE_MODE_KR) { ++ if (!((phy_data->mdio_an_mode) || ++ (phy_data->port_mode == XGBE_PORT_MODE_BACKPLANE_NO_AUTONEG))) ++ return false; ++ } ++ ++ pdata->en_rx_adap = 1; ++ return true; ++ } else ++ return false; ++} ++ + static void xgbe_phy_sfi_mode(struct xgbe_prv_data *pdata) + { + struct xgbe_phy_data *phy_data = pdata->phy_data; + + xgbe_phy_set_redrv_mode(pdata); +- + /* 10G/SFI */ + if (phy_data->sfp_cable != XGBE_SFP_CABLE_PASSIVE) { ++ pdata->en_rx_adap = 0; + xgbe_phy_perform_ratechange(pdata, 3, 0); +- } else if ((phy_data->sfp_cable == XGBE_SFP_CABLE_PASSIVE) && (pdata->en_rx_adap)) { ++ } else if ((phy_data->sfp_cable == XGBE_SFP_CABLE_PASSIVE) && (enable_rx_adap(pdata, XGBE_MODE_SFI))) { + xgbe_phy_perform_ratechange(pdata, 3, 1); + } else { + if (phy_data->sfp_cable_len <= 1) +@@ -2394,7 +2417,7 @@ static void xgbe_phy_kr_mode(struct xgbe_prv_data *pdata) + xgbe_phy_set_redrv_mode(pdata); + + /* 10G/KR */ +- if (pdata->en_rx_adap) { ++ if (enable_rx_adap(pdata, XGBE_MODE_KR)) { + xgbe_phy_perform_ratechange(pdata, 4, 1); + } else + xgbe_phy_perform_ratechange(pdata, 4, 0); +@@ -2911,8 +2934,11 @@ static int xgbe_phy_link_status(struct xgbe_prv_data *pdata, int *an_restart) + return 0; + } + +- if (phy_data->sfp_mod_absent || phy_data->sfp_rx_los) ++ if (phy_data->sfp_mod_absent || phy_data->sfp_rx_los) { ++ if (pdata->en_rx_adap) ++ pdata->rx_adapt_done = 0; + return 0; ++ } + } + + if (phy_data->phydev) { +@@ -3472,16 +3498,6 @@ static void xgbe_phy_exit(struct xgbe_prv_data *pdata) + mdiobus_unregister(phy_data->mii); + } + +-static bool enable_rx_adap(struct xgbe_phy_data *phy_data) +-{ +- +- if ((phy_data->redrv) && +- ((phy_data->redrv_model == XGBE_PHY_REDRV_MODEL_4223) || +- (phy_data->redrv_model == XGBE_PHY_REDRV_MODEL_4227))) +- return false; +- return true; +-} +- + static int xgbe_phy_init(struct xgbe_prv_data *pdata) + { + struct ethtool_link_ksettings *lks = &pdata->phy.lks; +@@ -3596,8 +3612,6 @@ static int xgbe_phy_init(struct xgbe_prv_data *pdata) + if (pdata->fec_ability & MDIO_PMA_10GBR_FECABLE_ABLE) + XGBE_SET_SUP(lks, 10000baseR_FEC); + phy_data->start_mode = XGBE_MODE_KR; +- if ((pdata->vdata->is_yc) && enable_rx_adap(phy_data)) +- pdata->en_rx_adap = 1; + } + + phy_data->phydev_mode = XGBE_MDIO_MODE_NONE; +@@ -3700,8 +3714,6 @@ static int xgbe_phy_init(struct xgbe_prv_data *pdata) + if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_10000) { + XGBE_SET_SUP(lks, 10000baseT_Full); + phy_data->start_mode = XGBE_MODE_KR; +- if (pdata->vdata->is_yc) +- pdata->en_rx_adap = 1; + } + + phy_data->phydev_mode = XGBE_MDIO_MODE_CL45; +@@ -3740,8 +3752,6 @@ static int xgbe_phy_init(struct xgbe_prv_data *pdata) + phy_data->start_mode = XGBE_MODE_SGMII_1000; + if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_10000) { + phy_data->start_mode = XGBE_MODE_SFI; +- if ((pdata->vdata->is_yc) && enable_rx_adap(phy_data)) +- pdata->en_rx_adap = 1; + } + + phy_data->phydev_mode = XGBE_MDIO_MODE_CL22; +-- +2.37.3 + |