[][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);
  }