[][kernel][common][eth][Update MDI Reversal feature for the Aquantia PHY driver]
[Description]
Refactor MDI Reversal feature for the Aquantia PHY driver.
Kindly determine the most suitable configuration based on the hardware
design.
1. MDI Reversed
mdi-reversal = /bits/ 16 <1>;
2. MDI Normal
mdi-reversal = /bits/ 16 <0>;
If without this patch, kernel cannot configure MDI Reversal of the
Aquantia PHY device by the DTS.
[Release-log]
N/A
Change-Id: I23cc00e810f1a6b37749b225eb25fe142a5b2f72
Reviewed-on: https://gerrit.mediatek.inc/c/openwrt/feeds/mtk_openwrt_feeds/+/7534218
diff --git a/target/linux/mediatek/patches-5.4/751-net-phy-aquantia-add-firmware-download.patch b/target/linux/mediatek/patches-5.4/751-net-phy-aquantia-add-firmware-download.patch
index f6e0f95..0e38dad 100644
--- a/target/linux/mediatek/patches-5.4/751-net-phy-aquantia-add-firmware-download.patch
+++ b/target/linux/mediatek/patches-5.4/751-net-phy-aquantia-add-firmware-download.patch
@@ -2,31 +2,13 @@
index 7b49c94..5a79af2 100644
--- a/drivers/net/phy/Kconfig
+++ b/drivers/net/phy/Kconfig
-@@ -372,7 +372,56 @@ config AMD_PHY
+@@ -372,7 +372,38 @@ config AMD_PHY
config AQUANTIA_PHY
tristate "Aquantia PHYs"
---help---
- Currently supports the Aquantia AQ1202, AQ2104, AQR105, AQR405
+ Currently supports the Aquantia AQ1202, AQ2104, AQR105, AQR405, AQR113C
+
-+config AQUANTIA_PHY_MDI_SWAP
-+ tristate "MDI Swap Enable"
-+ depends on AQUANTIA_PHY
-+ ---help---
-+ Currently supports the Aquantia AQR113C
-+
-+choice
-+ prompt "Swap mode"
-+ default AQUANTIA_PHY_MDI_REVERSED
-+ depends on AQUANTIA_PHY_MDI_SWAP
-+
-+ config AQUANTIA_PHY_MDI_NORMAL
-+ bool "Normal"
-+
-+ config AQUANTIA_PHY_MDI_REVERSED
-+ bool "Reversed"
-+endchoice
-+
+config AQUANTIA_PHY_FW_DOWNLOAD
+ tristate "Firmware Download Enable"
+ depends on AQUANTIA_PHY
@@ -155,7 +137,7 @@
index 0000000..622557c
--- /dev/null
+++ b/drivers/net/phy/aquantia_firmware.c
-@@ -0,0 +1,1092 @@
+@@ -0,0 +1,1090 @@
+// SPDX-License-Identifier: GPL-2.0
+/* FW download driver for Aquantia PHY
+ */
@@ -1129,9 +1111,7 @@
+
+ aqr107_chip_info(phydevs[i]);
+
-+#ifdef CONFIG_AQUANTIA_PHY_MDI_SWAP
+ aqr107_config_mdi(phydevs[i]);
-+#endif
+
+ aqr107_set_downshift(phydevs[i],
+ MDIO_AN_VEND_PROV_DOWNSHIFT_DFLT);
@@ -1252,7 +1232,7 @@
index a8c828b..d98757f 100644
--- a/drivers/net/phy/aquantia_main.c
+++ b/drivers/net/phy/aquantia_main.c
-@@ -8,6 +8,7 @@
+@@ -8,10 +8,12 @@
*/
#include <linux/kernel.h>
@@ -1260,6 +1240,11 @@
#include <linux/module.h>
#include <linux/delay.h>
#include <linux/bitfield.h>
+ #include <linux/phy.h>
++#include <linux/of.h>
+
+ #include "aquantia.h"
+
@@ -39,7 +40,6 @@
#define MDIO_AN_VEND_PROV_2500BASET_FULL BIT(10)
#define MDIO_AN_VEND_PROV_DOWNSHIFT_EN BIT(4)
@@ -1337,25 +1322,29 @@
{
u8 fw_major, fw_minor, build_id, prov_id;
int val;
-@@ -505,6 +444,17 @@ static void aqr107_chip_info(struct phy_device *phydev)
+@@ -505,6 +444,21 @@ static void aqr107_chip_info(struct phy_device *phydev)
fw_major, fw_minor, build_id, prov_id);
}
+int aqr107_config_mdi(struct phy_device *phydev)
+{
-+#ifdef CONFIG_AQUANTIA_PHY_MDI_REVERSED
-+ return phy_modify_mmd(phydev, MDIO_MMD_PMAPMD, PMAPMD_RSVD_VEND_PROV,
-+ PMAPMD_RSVD_VEND_PROV_MDI_CONF, 1);
-+#else
++ struct device_node *np = phydev->mdio.dev.of_node;
++ u16 val;
++
++ if (of_property_read_u16(np, "mdi-reversal", &val))
++ return -ENOENT;
++
++ if (!FIELD_FIT(PMAPMD_RSVD_VEND_PROV_MDI_CONF, val))
++ return -E2BIG;
++
+ return phy_modify_mmd(phydev, MDIO_MMD_PMAPMD, PMAPMD_RSVD_VEND_PROV,
-+ PMAPMD_RSVD_VEND_PROV_MDI_CONF, 0);
-+#endif
++ PMAPMD_RSVD_VEND_PROV_MDI_CONF, val);
+}
+
static int aqr107_config_init(struct phy_device *phydev)
{
int ret;
-@@ -520,6 +470,14 @@ static int aqr107_config_init(struct phy_device *phydev)
+@@ -520,6 +470,12 @@ static int aqr107_config_init(struct phy_device *phydev)
ret = aqr107_wait_reset_complete(phydev);
if (!ret)
aqr107_chip_info(phydev);
@@ -1364,9 +1353,7 @@
+ return aqr_firmware_download(phydev);
+#endif
+
-+#ifdef CONFIG_AQUANTIA_PHY_MDI_SWAP
+ aqr107_config_mdi(phydev);
-+#endif
return aqr107_set_downshift(phydev, MDIO_AN_VEND_PROV_DOWNSHIFT_DFLT);
}