blob: f4969c8d4633e3d8518dc1b81bbc44c459bd9725 [file] [log] [blame]
developer0caf1462024-05-31 18:09:32 +08001diff --git a/drivers/net/phy/Kconfig b/drivers/net/phy/Kconfig
2index 3c2ea9f..e5a8b70 100644
3--- a/drivers/net/phy/Kconfig
4+++ b/drivers/net/phy/Kconfig
5@@ -412,11 +412,25 @@ choice
6 endchoice
7
8 config AQUANTIA_PHY_FW_FILE
9- string "FW File"
10+ string "Default PHY FW File"
11 depends on AQUANTIA_PHY
12 default "Rhe-05.06-Candidate7-AQR_Mediatek_23B_StartOff_ID45623_VER36657.cld"
13 ---help---
14- Currently supports the Aquantia AQR113c
15+ This is the default FW.
16+
17+config AQUANTIA_PHY_FW_FILE_AQR113C
18+ string "AQR113C PHY FW File"
19+ depends on AQUANTIA_PHY
20+ default "Rhe-05.06-Candidate7-AQR_Mediatek_23B_StartOff_ID45623_VER36657.cld"
21+ ---help---
22+ This FW is for AQR113C
23+
24+config AQUANTIA_PHY_FW_FILE_CUX3410
25+ string "CUX3410 PHY FW File"
26+ depends on AQUANTIA_PHY
27+ default "AQR-G4_v5.7.0-AQR_EVB_Generic_X3410_StdCfg_MDISwap_USX_ID46316_VER2148.cld"
28+ ---help---
29+ This FW is for CUX3410
30
31 config AQUANTIA_PHY_MIB
32 tristate "MIB Read Enable"
33diff --git a/drivers/net/phy/aquantia.h b/drivers/net/phy/aquantia.h
34index 03d6744..d7e6786 100644
35--- a/drivers/net/phy/aquantia.h
36+++ b/drivers/net/phy/aquantia.h
37@@ -9,6 +9,16 @@
38 #include <linux/device.h>
39 #include <linux/phy.h>
40
41+#define PHY_ID_AQ1202 0x03a1b445
42+#define PHY_ID_AQ2104 0x03a1b460
43+#define PHY_ID_AQR105 0x03a1b4a2
44+#define PHY_ID_AQR106 0x03a1b4d0
45+#define PHY_ID_AQR107 0x03a1b4e0
46+#define PHY_ID_AQCS109 0x03a1b5c2
47+#define PHY_ID_AQR405 0x03a1b4b0
48+#define PHY_ID_AQR113C 0x31c31c12
49+#define PHY_ID_CUX3410 0x31c31dd3
50+
51 #define MDIO_AN_VEND_PROV_DOWNSHIFT_DFLT 4
52
53 #define PMAPMD_RSVD_VEND_PROV 0xe400
54diff --git a/drivers/net/phy/aquantia_firmware.c b/drivers/net/phy/aquantia_firmware.c
55index f37bee1..55a9a29 100644
56--- a/drivers/net/phy/aquantia_firmware.c
57+++ b/drivers/net/phy/aquantia_firmware.c
58@@ -19,6 +19,8 @@
59 #endif
60
61 #define AQR_FIRMWARE CONFIG_AQUANTIA_PHY_FW_FILE
62+#define AQR113C_FIRMWARE CONFIG_AQUANTIA_PHY_FW_FILE_AQR113C
63+#define CUX3410_FIRMWARE CONFIG_AQUANTIA_PHY_FW_FILE_CUX3410
64
65 /* Vendor specific 1, MDIO_MMD_VEND1 */
66 #define VEND1_STD_CONTROL1 0x0000
67@@ -923,6 +925,18 @@ int aqr_firmware_heartbeat_thread(void *data)
68 return ret;
69 }
70
71+static char* aqr_firmware_name_get(u32 phy_id)
72+{
73+ switch (phy_id) {
74+ case PHY_ID_AQR113C:
75+ return AQR113C_FIRMWARE;
76+ case PHY_ID_CUX3410:
77+ return CUX3410_FIRMWARE;
78+ default:
79+ return AQR_FIRMWARE;
80+ }
81+}
82+
83 static void aqr_firmware_download_cb(const struct firmware *fw, void *context)
84 {
85 struct phy_device **phydevs = context;
86@@ -931,6 +945,8 @@ static void aqr_firmware_download_cb(const struct firmware *fw, void *context)
87 struct aqr107_priv *priv = phydevs[0]->priv;
88 int result[MAX_GANGLOAD_DEVICES];
89 int i, num_phydevs = 0, ret = 0;
90+ u32 phy_id = phydevs[0]->drv->phy_id;
91+ char *firmware_name = aqr_firmware_name_get(phy_id);
92
93 if (!fw)
94 return;
95@@ -957,7 +973,7 @@ retry:
96
97 dev = &phydevs[i]->mdio.dev;
98 dev_err(dev, "failed to download firmware %s, ret: %d\n",
99- AQR_FIRMWARE, ret);
100+ firmware_name, ret);
101 goto retry;
102 }
103 }
104@@ -1005,6 +1021,8 @@ static int aqr_firmware_download_single(struct phy_device *phydev, bool force_re
105 struct device *dev = &phydev->mdio.dev;
106 const struct firmware *fw;
107 int ret = 0;
108+ u32 phy_id = phydev->drv->phy_id;
109+ char *firmware_name = aqr_firmware_name_get(phy_id);
110
111 if (priv->fw_initialized == true && force_reload == false)
112 return 0;
113@@ -1016,10 +1034,10 @@ static int aqr_firmware_download_single(struct phy_device *phydev, bool force_re
114 priv->fw_dl_mode = FW_DL_SINGLE;
115 priv->heartbeat = -1;
116
117- ret = request_firmware(&fw, AQR_FIRMWARE, dev);
118+ ret = request_firmware(&fw, firmware_name, dev);
119 if (ret) {
120 dev_err(dev, "failed to request firmware %s, ret: %d\n",
121- AQR_FIRMWARE, ret);
122+ firmware_name, ret);
123 }
124
125 aqr_firmware_download_cb(fw, priv->phydevs);
126@@ -1032,6 +1050,8 @@ static int aqr_firmware_gandload_thread(void *data)
127 struct phy_device **phydevs = data;
128 struct device *dev = &phydevs[0]->mdio.dev;
129 int ret = 0;
130+ u32 phy_id = phydevs[0]->drv->phy_id;
131+ char *firmware_name = aqr_firmware_name_get(phy_id);
132
133 for (;;) {
134 if (kthread_should_stop())
135@@ -1040,11 +1060,11 @@ static int aqr_firmware_gandload_thread(void *data)
136 /* either maximum gangload phy devices or timeout is reached */
137 if (gangload == MAX_GANGLOAD_DEVICES ||
138 time_after(jiffies, gangload_timeout)) {
139- ret = request_firmware_nowait(THIS_MODULE, true, AQR_FIRMWARE, dev,
140+ ret = request_firmware_nowait(THIS_MODULE, true, firmware_name, dev,
141 GFP_KERNEL, phydevs, aqr_firmware_download_cb);
142 if (ret) {
143 dev_err(dev, "failed to request firmware %s, ret: %d\n",
144- AQR_FIRMWARE, ret);
145+ firmware_name, ret);
146 }
147 break;
148 }
149diff --git a/drivers/net/phy/aquantia_main.c b/drivers/net/phy/aquantia_main.c
150index f445ef9..208fc7d 100644
151--- a/drivers/net/phy/aquantia_main.c
152+++ b/drivers/net/phy/aquantia_main.c
153@@ -17,16 +17,6 @@
154
155 #include "aquantia.h"
156
157-#define PHY_ID_AQ1202 0x03a1b445
158-#define PHY_ID_AQ2104 0x03a1b460
159-#define PHY_ID_AQR105 0x03a1b4a2
160-#define PHY_ID_AQR106 0x03a1b4d0
161-#define PHY_ID_AQR107 0x03a1b4e0
162-#define PHY_ID_AQCS109 0x03a1b5c2
163-#define PHY_ID_AQR405 0x03a1b4b0
164-#define PHY_ID_AQR113C 0x31c31c12
165-#define PHY_ID_CUX3410 0x31c31dd3
166-
167 #define MDIO_PHYXS_VEND_IF_STATUS 0xe812
168 #define MDIO_PHYXS_VEND_IF_STATUS_TYPE_MASK GENMASK(7, 3)
169 #define MDIO_PHYXS_VEND_IF_STATUS_TYPE_KR 0
170@@ -489,7 +479,7 @@ void aqr107_chip_info(struct phy_device *phydev)
171 build_id = FIELD_GET(VEND1_GLOBAL_RSVD_STAT1_FW_BUILD_ID, val);
172 prov_id = FIELD_GET(VEND1_GLOBAL_RSVD_STAT1_PROV_ID, val);
173
174- phydev_dbg(phydev, "FW %u.%u, Build %u, Provisioning %u\n",
175+ phydev_info(phydev, "FW %u.%u, Build %u, Provisioning %u\n",
176 fw_major, fw_minor, build_id, prov_id);
177 }
178