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
|