aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-5.15/9053-amd-xgbe-rx-adaptation-handle-SFP-connectors.patch
blob: a2c9325efe0b13555e0b90ec81dad8475f249799 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
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