aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-5.15/9058-amd-xgbe-AIC2-rx-adaption-software-tuning-enablement.patch
blob: d56d3f14d26872d785bb49f3f67f548e58f686af (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
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
From 2f8aa57b60992e0ea49f2d597f844c01623e7782 Mon Sep 17 00:00:00 2001
From: rgaridap <Ramesh.Garidapuri@amd.com>
Date: Tue, 23 Aug 2022 16:17:29 +0530
Subject: [PATCH] amd-xgbe:AIC2 rx-adaption software tuning enablement

Change-Id: Ib7b6b8db42767a49f848428ac5e03790983e3d3a
---
 drivers/net/ethernet/amd/xgbe/xgbe-mdio.c   |  4 --
 drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c | 67 +++++++++++++++++----
 drivers/net/ethernet/amd/xgbe/xgbe.h        |  1 +
 drivers/net/phy/aquantia_main.c             |  5 +-
 4 files changed, 61 insertions(+), 16 deletions(-)

diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c b/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c
index d0b2179e9078..c3fdcbb1df98 100755
--- a/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c
+++ b/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c
@@ -1309,10 +1309,6 @@ static bool xgbe_phy_aneg_done(struct xgbe_prv_data *pdata)
 	if (pdata->an_mode == XGBE_AN_MODE_MDIO) {
 		if(pdata->phy.link)
 			pdata->an_result = XGBE_AN_COMPLETE;
-		else {
-				netif_dbg(pdata, link, pdata->netdev, "xgbe_phy_aneg_done : *******  Forcing next mode ******* \n");
-			pdata->an_result = XGBE_AN_NO_LINK;
-		}
 	}
 	return (pdata->an_result == XGBE_AN_COMPLETE);
 }
diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c b/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c
index 278e0509cd19..b067f8216710 100644
--- a/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c
+++ b/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c
@@ -1868,7 +1868,7 @@ static enum xgbe_mode xgbe_phy_mdio_an_outcome(struct xgbe_prv_data *pdata)
 				mode = XGBE_MODE_KX_2500;
 			break;
 		default:
-			mode = XGBE_MODE_KR;
+			mode = XGBE_MODE_UNKNOWN;
 		break;
 		}
 	}
@@ -1970,6 +1970,7 @@ static int xgbe_phy_an_config(struct xgbe_prv_data *pdata)
 	struct ethtool_link_ksettings *lks = &pdata->phy.lks;
 	struct xgbe_phy_data *phy_data = pdata->phy_data;
 	int ret;
+	unsigned long link_timeout;
 
 	ret = xgbe_phy_find_phy_device(pdata);
 	if (ret)
@@ -1986,9 +1987,14 @@ static int xgbe_phy_an_config(struct xgbe_prv_data *pdata)
 		phy_data->phydev->speed = pdata->phy.speed;
 		phy_data->phydev->duplex = pdata->phy.duplex;
 	}
+	netif_dbg(pdata, link, pdata->netdev, " phy_start_aneg \n");
 
-	ret = phy_start_aneg(phy_data->phydev);
-
+	link_timeout = pdata->phy_link_check + (XGBE_LINK_TIMEOUT*2 * HZ);
+	if (time_after(jiffies, link_timeout)) {
+		ret = phy_start_aneg(phy_data->phydev);
+		pdata->phy_link_check = jiffies;
+	}
+	
 	return ret;
 }
 
@@ -2174,7 +2180,7 @@ static void xgbe_phy_rx_adaptation(struct xgbe_prv_data *pdata)
 		reg = XMDIO_READ_BITS(pdata, MDIO_MMD_PMAPMD, MDIO_PMA_RX_EQ_CTRL4, 0xffffffff);
 		netif_dbg(pdata, link, pdata->netdev, "%s MDIO_PMA_RX_EQ_CTRL4 current data 0x%x\n",
 				__func__, reg);
-
+		
 		/* step 2: force PCS to send RX_ADAPT Req to PHY */
 		XMDIO_WRITE_BITS(pdata, MDIO_MMD_PMAPMD, MDIO_PMA_RX_EQ_CTRL4,
 				 XGBE_PMA_RX_AD_REQ_MASK, XGBE_PMA_RX_AD_REQ_ENABLE);
@@ -2202,7 +2208,7 @@ static void xgbe_phy_rx_adaptation(struct xgbe_prv_data *pdata)
 			reg = XMDIO_READ(pdata, MDIO_MMD_PCS, MDIO_STAT1);
 			if (reg & MDIO_STAT1_LSTATUS) {
 				/* If the block lock is found, declare the link up */
-				netif_dbg(pdata, link, pdata->netdev, "%s block_lock done\n", __func__);
+				netif_dbg(pdata, link, pdata->netdev, "%s block_lock done and link is up\n", __func__);
 				pdata->rx_adapt_done = 1;
 				pdata->mode_set = 0;
 				return;
@@ -2216,7 +2222,10 @@ static void xgbe_phy_rx_adaptation(struct xgbe_prv_data *pdata)
 				pdata->rx_adapt_retries = 0;
 				return;
 			}
-			_xgbe_mode_set(pdata, phy_data->cur_mode);
+
+			if ((phy_data->cur_mode == XGBE_MODE_KR) ||( phy_data->cur_mode == XGBE_MODE_SFI))
+				pdata->hw_if.set_speed(pdata, SPEED_10000);
+			_xgbe_mode_set(pdata, phy_data->cur_mode);
 		}
 	} else {
 		netif_dbg(pdata, link, pdata->netdev, "%s either RX_VALID or LF_SIGDET is not set, issuing rrc\n",__func__);
@@ -2310,6 +2319,12 @@ static bool enable_rx_adap(struct xgbe_prv_data *pdata, enum xgbe_mode mode)
 {
 	struct xgbe_phy_data *phy_data = pdata->phy_data;
 
+	if ((phy_data->mdio_an_mode) && (mode == XGBE_MODE_KR)) {
+		pdata->en_rx_adap = 1;
+		netif_dbg(pdata, link, pdata->netdev, " pdata->en_rx_adap %d\n", pdata->en_rx_adap);
+		return true;
+	}
+
 	if ((pdata->vdata->is_yc) &&
 	    (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_10000)) {
 		if ((phy_data->redrv) &&
@@ -2415,7 +2430,6 @@ static void xgbe_phy_kr_mode(struct xgbe_prv_data *pdata)
 	struct xgbe_phy_data *phy_data = pdata->phy_data;
 
 	xgbe_phy_set_redrv_mode(pdata);
-
 	/* 10G/KR */
 	if (enable_rx_adap(pdata, XGBE_MODE_KR)) {
 		xgbe_phy_perform_ratechange(pdata, 4, 1);
@@ -2922,6 +2936,7 @@ static int xgbe_phy_link_status(struct xgbe_prv_data *pdata, int *an_restart)
 	struct xgbe_phy_data *phy_data = pdata->phy_data;
 	unsigned int reg;
 	int ret;
+	enum xgbe_mode mode = XGBE_MODE_UNKNOWN;
 
 	*an_restart = 0;
 
@@ -2948,13 +2963,41 @@ static int xgbe_phy_link_status(struct xgbe_prv_data *pdata, int *an_restart)
 			return 0;
 
 		if ((pdata->phy.autoneg == AUTONEG_ENABLE) &&
-		    !phy_aneg_done(phy_data->phydev))
+		    !phy_aneg_done(phy_data->phydev)) {
+		    if (enable_rx_adap(pdata, XGBE_MODE_KR))
+				pdata->rx_adapt_done = 0;
+			pdata->an_result = XGBE_AN_READY;
+			if (!test_bit(XGBE_LINK_INIT, &pdata->dev_state)) {
+				netif_carrier_off(pdata->netdev);
+				*an_restart = 1;
+			} /*should not restart AN within 5 seconds for AQR, AQR will restart after 15s
+			 or keep 10 sec between AN restart*/
 			return 0;
+		} else {
+				pdata->an_result = XGBE_AN_COMPLETE;
+		}
 
-		if (!phy_data->phydev->link)
+
+		if (!phy_data->phydev->link) {
+			if (enable_rx_adap(pdata, XGBE_MODE_KR))
+				pdata->rx_adapt_done = 0;
 			return 0;
-		if (pdata->an_mode == XGBE_AN_MODE_MDIO)
-			return 1;
+		}
+		if (pdata->an_mode == XGBE_AN_MODE_MDIO) {
+			mode  = xgbe_phy_mdio_an_outcome(pdata);
+				/* Set MAC to 10G speed and set mode to enable Rx adaptation*/
+				if(mode == XGBE_MODE_KR) {
+					enable_rx_adap(pdata, XGBE_MODE_KR);
+					if(pdata->rx_adapt_done == 0) {
+						pdata->hw_if.set_speed(pdata, SPEED_10000);
+						xgbe_phy_set_mode(pdata, mode);
+						if(pdata->rx_adapt_done == 0)
+						xgbe_phy_rx_adaptation(pdata);
+					}
+				}
+			if(mode == XGBE_MODE_UNKNOWN)
+				return 0;
+		}
 	}
 
 	/* Link status is latched low, so read once to clear
@@ -2976,6 +3019,8 @@ static int xgbe_phy_link_status(struct xgbe_prv_data *pdata, int *an_restart)
 			xgbe_phy_set_mode(pdata, phy_data->cur_mode);
 		}
 
+		reg = XMDIO_READ(pdata, MDIO_MMD_PCS, MDIO_STAT1);
+		reg = XMDIO_READ(pdata, MDIO_MMD_PCS, MDIO_STAT1);
 		/* check again for the link and adaptation status */
 		if ((reg & MDIO_STAT1_LSTATUS) && (pdata->rx_adapt_done))
 			       return 1;
diff --git a/drivers/net/ethernet/amd/xgbe/xgbe.h b/drivers/net/ethernet/amd/xgbe/xgbe.h
index 895712fcbbd3..2c244aa15c27 100644
--- a/drivers/net/ethernet/amd/xgbe/xgbe.h
+++ b/drivers/net/ethernet/amd/xgbe/xgbe.h
@@ -1241,6 +1241,7 @@ struct xgbe_prv_data {
 	struct xgbe_phy phy;
 	int mdio_mmd;
 	unsigned long link_check;
+	unsigned long phy_link_check;
 	struct completion mdio_complete;
 
 	unsigned int kr_redrv;
diff --git a/drivers/net/phy/aquantia_main.c b/drivers/net/phy/aquantia_main.c
index 402b93829c86..28329c281e75 100755
--- a/drivers/net/phy/aquantia_main.c
+++ b/drivers/net/phy/aquantia_main.c
@@ -299,6 +299,7 @@ static int aqr113_set_mode(struct phy_device *phydev)
 
 static int aqr113_config_aneg(struct phy_device *phydev)
 {
+	phydev_dbg(phydev, " AQR AN start ");
 	aqr113_set_mode(phydev);
 	return aqr_config_aneg(phydev);
 }
@@ -457,7 +458,9 @@ static int aqr107_read_status(struct phy_device *phydev)
 	}
 
 	/* Read possibly downshifted rate from vendor register */
-	return aqr107_read_rate(phydev);
+	ret = aqr107_read_rate(phydev);
+
+	return ret;
 }
 
 static int aqr107_get_downshift(struct phy_device *phydev, u8 *data)
-- 
2.37.3