[][kernel][common][eth][Fix Aquantia link speed mismatch issue for downshift evnent]

[Description]
Fix Aquantia link speed mismatch issue for downshift evnent.

When PHY driver detects a downshift event, it will read the current
link speed from the vendor register. In the meantime, PHY hardware
clears the downshift event and no longer triggers.
In this case, the PHY driver only reports the correct link speed once,
then always reports the incorrect link speed back to PHY framework.

If without this patch, ethtool might read the incorrect link speed
after downshift event occured.

[Release-log]
N/A


Change-Id: I3012b7c8a92c14cbe25b251049cbcbb4a1ef6c09
Reviewed-on: https://gerrit.mediatek.inc/c/openwrt/feeds/mtk_openwrt_feeds/+/7178227
diff --git a/target/linux/mediatek/patches-5.4/747-net-phy-aquantia-add-AQR113C.patch b/target/linux/mediatek/patches-5.4/747-net-phy-aquantia-add-AQR113C.patch
index 8d01cab..d99d75f 100644
--- a/target/linux/mediatek/patches-5.4/747-net-phy-aquantia-add-AQR113C.patch
+++ b/target/linux/mediatek/patches-5.4/747-net-phy-aquantia-add-AQR113C.patch
@@ -10,20 +10,59 @@
  
  #define MDIO_PHYXS_VEND_IF_STATUS		0xe812
  #define MDIO_PHYXS_VEND_IF_STATUS_TYPE_MASK	GENMASK(7, 3)
-@@ -352,6 +352,13 @@ static int aqr107_read_status(struct phy_device *phydev)
+@@ -268,17 +268,6 @@ static int aqr_read_status(struct phy_device *phydev)
+ 	return genphy_c45_read_status(phydev);
+ }
+ 
+-static int aqr107_read_downshift_event(struct phy_device *phydev)
+-{
+-	int val;
+-
+-	val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_TX_VEND_INT_STATUS1);
+-	if (val < 0)
+-		return val;
+-
+-	return !!(val & MDIO_AN_TX_VEND_INT_STATUS1_DOWNSHIFT);
+-}
+-
+ static int aqr107_read_rate(struct phy_device *phydev)
+ {
+ 	int val;
+@@ -353,13 +342,7 @@ static int aqr107_read_status(struct phy_device *phydev)
  		break;
  	}
  
+-	val = aqr107_read_downshift_event(phydev);
+-	if (val <= 0)
+-		return val;
+-
+-	phydev_warn(phydev, "Downshift occurred! Cabling may be defective.\n");
+-
+-	/* Read downshifted rate from vendor register */
++	/* Read possibly downshifted rate from vendor register */
+ 	return aqr107_read_rate(phydev);
+ }
+ 
+@@ -500,9 +483,6 @@ static int aqr107_config_init(struct phy_device *phydev)
+ 	if (!ret)
+ 		aqr107_chip_info(phydev);
+ 
+-	/* ensure that a latched downshift event is cleared */
+-	aqr107_read_downshift_event(phydev);
+-
+ 	return aqr107_set_downshift(phydev, MDIO_AN_VEND_PROV_DOWNSHIFT_DFLT);
+ }
+ 
+@@ -527,9 +507,6 @@ static int aqcs109_config_init(struct phy_device *phydev)
+ 	if (ret)
+ 		return ret;
+ 
+-	/* ensure that a latched downshift event is cleared */
+-	aqr107_read_downshift_event(phydev);
+-
+ 	return aqr107_set_downshift(phydev, MDIO_AN_VEND_PROV_DOWNSHIFT_DFLT);
+ }
+ 
-+	/* Handle the case when the link speed is unknown */
-+	if (phydev->speed == SPEED_UNKNOWN) {
-+		val = aqr107_read_rate(phydev);
-+		if (val < 0)
-+			return val;
-+	}
-+
- 	val = aqr107_read_downshift_event(phydev);
- 	if (val <= 0)
- 		return val;
 @@ -695,6 +696,24 @@ static struct phy_driver aqr_driver[] = {
  	.ack_interrupt	= aqr_ack_interrupt,
  	.read_status	= aqr_read_status,
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 6eb5bf4..2fe3132 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
@@ -1338,8 +1338,8 @@
 +	aqr_firmware_download(phydev);
 +#endif
 +
- 	/* ensure that a latched downshift event is cleared */
- 	aqr107_read_downshift_event(phydev);
+ 	return aqr107_set_downshift(phydev, MDIO_AN_VEND_PROV_DOWNSHIFT_DFLT);
+ }
  
 @@ -605,6 +609,15 @@ static int aqr107_resume(struct phy_device *phydev)
  				  MDIO_CTRL1_LPOWER);