aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-5.15/9053-amd-xgbe-rx-adaptation-handle-SFP-connectors.patch
diff options
context:
space:
mode:
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.patch129
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
+