aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-5.15/9049-net-phy-aquantia-Added-support-for-AQR113-PHY-device.patch
blob: ea263d889f323ef08d85088a2fdc244d66c0297b (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
From 2ef0d79e86eb36f61e98fd9ba62858c5d2689fd9 Mon Sep 17 00:00:00 2001
From: rgaridap <Ramesh.Garidapuri@amd.com>
Date: Thu, 2 Jun 2022 12:43:51 +0530
Subject: [PATCH 49/57] net: phy: aquantia: Added support for AQR113 PHY device

    Add support for AQR113 family

Signed-off-by: Sudheesh Mavila <sudheesh.mavila@amd.com>
Change-Id: Ifacb46293faec6282f41579744ebe2a61b25a19e
---
 drivers/net/phy/aquantia_main.c | 100 ++++++++++++++++++++++++++++++++
 1 file changed, 100 insertions(+)

diff --git a/drivers/net/phy/aquantia_main.c b/drivers/net/phy/aquantia_main.c
index 3221224525ac..f7c10d8fee1f 100644
--- a/drivers/net/phy/aquantia_main.c
+++ b/drivers/net/phy/aquantia_main.c
@@ -22,6 +22,7 @@
 #define PHY_ID_AQR107	0x03a1b4e0
 #define PHY_ID_AQCS109	0x03a1b5c2
 #define PHY_ID_AQR405	0x03a1b4b0
+#define PHY_ID_AQR113   0x31c31c12
 
 #define MDIO_PHYXS_VEND_IF_STATUS		0xe812
 #define MDIO_PHYXS_VEND_IF_STATUS_TYPE_MASK	GENMASK(7, 3)
@@ -255,6 +256,65 @@ static int aqr_config_aneg(struct phy_device *phydev)
 	return genphy_c45_check_and_restart_aneg(phydev, changed);
 }
 
+
+static int aqr113_set_mode(struct phy_device *phydev)
+{
+
+	int val;
+	int fw;
+	int build;
+
+	fw = phy_read_mmd(phydev, MDIO_MMD_VEND1, VEND1_GLOBAL_FW_ID);
+	if (fw < 0)
+		return val;
+	val = phy_read_mmd(phydev, MDIO_MMD_VEND1, VEND1_GLOBAL_RSVD_STAT1);
+	if (val < 0)
+		return val;
+
+	build = FIELD_GET(GENMASK(7,0), val);
+
+	if ((fw == 0x506) && (build = 0x16)) {
+
+		/* set PHY in SGMI mode for 1000M with system side AN disabled*/
+		val = phy_read_mmd(phydev, 0x7, 0xc400);
+		if (linkmode_test_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT, phydev->advertising))
+			val =  val | (3 << 0xe);
+		else
+			 val =  val & (~( 3<< 0xe));
+		phy_write_mmd(phydev, 0x7, 0xc400,val);
+
+
+		/* set PHY in SGMI mode for 2500M with system side AN disabled */
+		val = phy_read_mmd(phydev, 0x7, 0xc400);
+		if (linkmode_test_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT, phydev->advertising))
+			val =  val | (1 << 0xa);
+		else
+			val =  val & (~( 1<< 0xa));
+		phy_write_mmd(phydev, 0x7, 0xc400,val);
+
+	/* clear 5G support */
+		val = phy_read_mmd(phydev, 0x7, 0xc400);
+		val =  val & (~( 1<< 0xb));
+		phy_write_mmd(phydev, 0x7, 0xc400,val);
+
+
+		val = phy_read_mmd(phydev, 0x7, 0x20);
+		if (linkmode_test_bit(ETHTOOL_LINK_MODE_10000baseT_Full_BIT, phydev->advertising))
+			val =  val | (1 << 0xc);
+		else
+			val =  val & (~( 1<< 0xc));
+		phy_write_mmd(phydev, 0x7, 0x20,val);
+
+	} 
+	return 0;
+}
+
+static int aqr113_config_aneg(struct phy_device *phydev)
+{
+	aqr113_set_mode(phydev);
+	return aqr_config_aneg(phydev);
+}
+
 static int aqr_config_intr(struct phy_device *phydev)
 {
 	bool en = phydev->interrupts == PHY_INTERRUPT_ENABLED;
@@ -529,6 +589,32 @@ static int aqr107_config_init(struct phy_device *phydev)
 	return aqr107_set_downshift(phydev, MDIO_AN_VEND_PROV_DOWNSHIFT_DFLT);
 }
 
+static int aqr113_config_init(struct phy_device *phydev)
+{
+	int ret;
+	int val;
+
+	/* Check that the PHY interface type is compatible */
+	if (phydev->interface != PHY_INTERFACE_MODE_SGMII &&
+	    phydev->interface != PHY_INTERFACE_MODE_2500BASEX &&
+	    phydev->interface != PHY_INTERFACE_MODE_10GBASER)
+		return -ENODEV;
+
+	WARN(phydev->interface == PHY_INTERFACE_MODE_10GKR,
+	     "Your devicetree is out of date, please update it. The AQR113 family doesn't support 10GKR, maybe you mean 10GBASER.\n");
+
+	ret = aqr107_wait_reset_complete(phydev);
+	if (!ret)
+		aqr107_chip_info(phydev);
+
+	/* clear 5G support */
+	val = phy_read_mmd(phydev, 0x7, 0xc400);
+	val =  val & (~( 1<< 0xb));
+	phy_write_mmd(phydev, 0x7, 0xc400,val);
+
+	return aqr107_set_downshift(phydev, MDIO_AN_VEND_PROV_DOWNSHIFT_DFLT);
+}
+
 static int aqcs109_config_init(struct phy_device *phydev)
 {
 	int ret;
@@ -673,6 +759,19 @@ static struct phy_driver aqr_driver[] = {
 	.get_stats	= aqr107_get_stats,
 	.link_change_notify = aqr107_link_change_notify,
 },
+
+{
+	PHY_ID_MATCH_MODEL(PHY_ID_AQR113),
+	.name		= "Aquantia AQR113",
+	.probe		= aqr107_probe,
+	.config_init	= aqr113_config_init,
+	.config_aneg    = aqr113_config_aneg,
+	.read_status	= aqr107_read_status,
+	.suspend	= aqr107_suspend,
+	.resume		= aqr107_resume,
+	.get_stats	= aqr107_get_stats,
+},
+
 {
 	PHY_ID_MATCH_MODEL(PHY_ID_AQCS109),
 	.name		= "Aquantia AQCS109",
@@ -709,6 +808,7 @@ static struct mdio_device_id __maybe_unused aqr_tbl[] = {
 	{ PHY_ID_MATCH_MODEL(PHY_ID_AQR105) },
 	{ PHY_ID_MATCH_MODEL(PHY_ID_AQR106) },
 	{ PHY_ID_MATCH_MODEL(PHY_ID_AQR107) },
+	{ PHY_ID_MATCH_MODEL(PHY_ID_AQR113) },
 	{ PHY_ID_MATCH_MODEL(PHY_ID_AQCS109) },
 	{ PHY_ID_MATCH_MODEL(PHY_ID_AQR405) },
 	{ }
-- 
2.37.3