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
|
From 05b20dda7c5f05f489b47af497325f0ade1f8216 Mon Sep 17 00:00:00 2001
From: rgaridap <Ramesh.Garidapuri@amd.com>
Date: Thu, 2 Jun 2022 21:45:05 +0530
Subject: [PATCH 52/57] amd-xgbe: rx-adap finetunings
- As per Vignesh's suggestion avoid re-enabling pll ctrl for mailbox
cmds 4,1 and 3,1
- Also, correct the logic to skip pll re-enabling for cmd 0 and 5
- fine tune adaptation and link status logic
Signed-off-by: Raju Rangoju <Raju.Rangoju@amd.com>
Change-Id: I9e03fff90407a475610648d6386eaa9e9d2855b1
---
drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c | 41 +++++++++++++--------
1 file changed, 25 insertions(+), 16 deletions(-)
diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c b/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c
index de53e636b049..1035696b295f 100644
--- a/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c
+++ b/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c
@@ -387,6 +387,8 @@ struct xgbe_phy_data {
/* I2C, MDIO and GPIO lines are muxed, so only one device at a time */
static DEFINE_MUTEX(xgbe_phy_comm_lock);
+static void xgbe_phy_perform_ratechange(struct xgbe_prv_data *pdata,
+ unsigned int cmd, unsigned int sub_cmd);
static enum xgbe_an_mode xgbe_phy_an_mode(struct xgbe_prv_data *pdata);
static void xgbe_phy_rrc(struct xgbe_prv_data *pdata);
static void xgbe_phy_set_mode(struct xgbe_prv_data *pdata, enum xgbe_mode mode);
@@ -2132,6 +2134,11 @@ static void xgbe_phy_pll_ctrl(struct xgbe_prv_data *pdata, bool enable)
}
}
+static inline void _xgbe_mode_set(struct xgbe_prv_data *pdata, enum xgbe_mode mode)
+{
+ xgbe_phy_perform_ratechange(pdata, mode == XGBE_MODE_KR ? 4 : 3, 1);
+}
+
static void xgbe_phy_rx_adaptation(struct xgbe_prv_data *pdata)
{
/*
@@ -2155,7 +2162,7 @@ static void xgbe_phy_rx_adaptation(struct xgbe_prv_data *pdata)
int reg;
struct xgbe_phy_data *phy_data;
-#define MAX_RX_ADAPT_RETRIES 5
+#define MAX_RX_ADAPT_RETRIES 1
rx_adapt_reinit:
reg = XMDIO_READ_BITS(pdata, MDIO_MMD_PMAPMD, MDIO_PMA_RX_LSTS,
@@ -2209,7 +2216,7 @@ static void xgbe_phy_rx_adaptation(struct xgbe_prv_data *pdata)
pdata->rx_adapt_retries = 0;
return;
}
- xgbe_phy_set_mode(pdata, phy_data->cur_mode);
+ _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__);
@@ -2269,11 +2276,13 @@ static void xgbe_phy_perform_ratechange(struct xgbe_prv_data *pdata,
netif_dbg(pdata, link, pdata->netdev, "%s Enabling RX adaptation\n", __func__);
pdata->mode_set = 1;
xgbe_phy_rx_adaptation(pdata);
+ /* return from here to avoid enabling PLL ctrl during adaptation phase */
+ return;
}
reenable_pll:
/* Enable PLL re-initialization, not needed for phy_poweroff (0,0) */
- if (cmd != 0)
+ if ((cmd != 0) && (cmd !=5))
xgbe_phy_pll_ctrl(pdata, true);
}
@@ -2929,21 +2938,21 @@ static int xgbe_phy_link_status(struct xgbe_prv_data *pdata, int *an_restart)
reg = XMDIO_READ(pdata, MDIO_MMD_PCS, MDIO_STAT1);
if (pdata->en_rx_adap) {
- if (reg & MDIO_STAT1_LSTATUS) {
- if (pdata->rx_adapt_done)
- return 1;
- else
- xgbe_phy_rx_adaptation(pdata);
- } else {
- if (pdata->mode_set)
- xgbe_phy_rx_adaptation(pdata);
- else {
- pdata->mode_set = 0;
- pdata->rx_adapt_done = 0;
- xgbe_phy_set_mode(pdata, phy_data->cur_mode);
- }
+ /* if there's a link and adaptation is done, declare link up */
+ if ((reg & MDIO_STAT1_LSTATUS) && (pdata->rx_adapt_done))
+ return 1;
+ /* If either of link not set or adaptation not done, retrigger the
+ * mode set. However, if the mode is already set, just do adaptation */
+ if (pdata->mode_set)
+ xgbe_phy_rx_adaptation(pdata);
+ else {
+ pdata->rx_adapt_done = 0;
+ xgbe_phy_set_mode(pdata, phy_data->cur_mode);
}
+ /* check again for the link and adaptation status */
+ if ((reg & MDIO_STAT1_LSTATUS) && (pdata->rx_adapt_done))
+ return 1;
} else if (reg & MDIO_STAT1_LSTATUS)
return 1;
--
2.37.3
|