forked from openwrt/openwrt
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
generic: phy: aquantia: add pending patch to force MDI pair order
Import pending patch to force MDI pair order. Signed-off-by: Daniel Golle <[email protected]>
- Loading branch information
Showing
4 changed files
with
112 additions
and
8 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -15,7 +15,7 @@ Signed-off-by: Alex Marginean <[email protected]> | |
|
||
--- a/drivers/net/phy/aquantia/aquantia_main.c | ||
+++ b/drivers/net/phy/aquantia/aquantia_main.c | ||
@@ -90,6 +90,29 @@ | ||
@@ -96,6 +96,29 @@ | ||
#define AQR107_OP_IN_PROG_SLEEP 1000 | ||
#define AQR107_OP_IN_PROG_TIMEOUT 100000 | ||
|
||
|
@@ -45,7 +45,7 @@ Signed-off-by: Alex Marginean <[email protected]> | |
static int aqr107_get_sset_count(struct phy_device *phydev) | ||
{ | ||
return AQR107_SGMII_STAT_SZ; | ||
@@ -196,6 +219,51 @@ static int aqr_config_aneg(struct phy_de | ||
@@ -202,6 +225,51 @@ static int aqr_config_aneg(struct phy_de | ||
return genphy_c45_check_and_restart_aneg(phydev, changed); | ||
} | ||
|
||
|
@@ -97,7 +97,7 @@ Signed-off-by: Alex Marginean <[email protected]> | |
static int aqr_config_intr(struct phy_device *phydev) | ||
{ | ||
bool en = phydev->interrupts == PHY_INTERRUPT_ENABLED; | ||
@@ -815,7 +883,7 @@ static struct phy_driver aqr_driver[] = | ||
@@ -848,7 +916,7 @@ static struct phy_driver aqr_driver[] = | ||
PHY_ID_MATCH_MODEL(PHY_ID_AQR112), | ||
.name = "Aquantia AQR112", | ||
.probe = aqr107_probe, | ||
|
@@ -106,7 +106,7 @@ Signed-off-by: Alex Marginean <[email protected]> | |
.config_intr = aqr_config_intr, | ||
.handle_interrupt = aqr_handle_interrupt, | ||
.get_tunable = aqr107_get_tunable, | ||
@@ -838,7 +906,7 @@ static struct phy_driver aqr_driver[] = | ||
@@ -871,7 +939,7 @@ static struct phy_driver aqr_driver[] = | ||
PHY_ID_MATCH_MODEL(PHY_ID_AQR412), | ||
.name = "Aquantia AQR412", | ||
.probe = aqr107_probe, | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -14,7 +14,7 @@ Signed-off-by: Alex Marginean <[email protected]> | |
|
||
--- a/drivers/net/phy/aquantia/aquantia_main.c | ||
+++ b/drivers/net/phy/aquantia/aquantia_main.c | ||
@@ -252,10 +252,16 @@ static int aqr_config_aneg_set_prot(stru | ||
@@ -258,10 +258,16 @@ static int aqr_config_aneg_set_prot(stru | ||
phy_write_mmd(phydev, MDIO_MMD_VEND1, AQUANTIA_VND1_GSTART_RATE, | ||
aquantia_syscfg[if_type].start_rate); | ||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -12,7 +12,7 @@ Signed-off-by: Daniel Golle <[email protected]> | |
|
||
--- a/drivers/net/phy/aquantia/aquantia_main.c | ||
+++ b/drivers/net/phy/aquantia/aquantia_main.c | ||
@@ -30,6 +30,8 @@ | ||
@@ -31,6 +31,8 @@ | ||
#define PHY_ID_AQR113C 0x31c31c12 | ||
#define PHY_ID_AQR114C 0x31c31c22 | ||
#define PHY_ID_AQR813 0x31c31cb2 | ||
|
@@ -21,7 +21,7 @@ Signed-off-by: Daniel Golle <[email protected]> | |
|
||
#define MDIO_PHYXS_VEND_IF_STATUS 0xe812 | ||
#define MDIO_PHYXS_VEND_IF_STATUS_TYPE_MASK GENMASK(7, 3) | ||
@@ -1022,6 +1024,30 @@ static struct phy_driver aqr_driver[] = | ||
@@ -1055,6 +1057,30 @@ static struct phy_driver aqr_driver[] = | ||
.led_hw_control_get = aqr_phy_led_hw_control_get, | ||
.led_polarity_set = aqr_phy_led_polarity_set, | ||
}, | ||
|
@@ -52,7 +52,7 @@ Signed-off-by: Daniel Golle <[email protected]> | |
}; | ||
|
||
module_phy_driver(aqr_driver); | ||
@@ -1042,6 +1068,8 @@ static struct mdio_device_id __maybe_unu | ||
@@ -1075,6 +1101,8 @@ static struct mdio_device_id __maybe_unu | ||
{ PHY_ID_MATCH_MODEL(PHY_ID_AQR113C) }, | ||
{ PHY_ID_MATCH_MODEL(PHY_ID_AQR114C) }, | ||
{ PHY_ID_MATCH_MODEL(PHY_ID_AQR813) }, | ||
|
104 changes: 104 additions & 0 deletions
104
target/linux/generic/pending-6.6/752-net-phy-aquantia-allow-forcing-order-of-MDI-pairs.patch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,104 @@ | ||
From 49d46df79404a37685e0f32deb36506f5723e3a0 Mon Sep 17 00:00:00 2001 | ||
From: Daniel Golle <[email protected]> | ||
Date: Wed, 28 Aug 2024 23:52:09 +0100 | ||
Subject: [PATCH] net: phy: aquantia: allow forcing order of MDI pairs | ||
|
||
Despite supporting Auto MDI-X, it looks like Aquantia only supports | ||
swapping pair (1,2) with pair (3,6) like it used to be for MDI-X on | ||
100MBit/s networks. | ||
|
||
When all 4 pairs are in use (for 1000MBit/s or faster) the link does not | ||
come up with pair order is not configured correctly, either using | ||
MDI_CFG pin or using the "PMA Receive Reserved Vendor Provisioning 1" | ||
register. | ||
|
||
Normally, the order of MDI pairs being either ABCD or DCBA is configured | ||
by pulling the MDI_CFG pin. | ||
|
||
However, some hardware designs require overriding the value configured | ||
by that bootstrap pin. The PHY allows doing that by setting a bit in | ||
"PMA Receive Reserved Vendor Provisioning 1" register which allows | ||
ignoring the state of the MDI_CFG pin and another bit configuring | ||
whether the order of MDI pairs should be normal (ABCD) or reverse | ||
(DCBA). Pair polarity is not affected and remains identical in both | ||
settings. | ||
|
||
Introduce property "marvell,mdi-cfg-order" which allows forcing either | ||
normal or reverse order of the MDI pairs from DT. | ||
|
||
If the property isn't present, the behavior is unchanged and MDI pair | ||
order configuration is untouched (ie. either the result of MDI_CFG pin | ||
pull-up/pull-down, or pair order override already configured by the | ||
bootloader before Linux is started). | ||
|
||
Forcing normal pair order is required on the Adtran SDG-8733A Wi-Fi 7 | ||
residential gateway. | ||
|
||
Signed-off-by: Daniel Golle <[email protected]> | ||
--- | ||
drivers/net/phy/aquantia/aquantia_main.c | 33 ++++++++++++++++++++++++ | ||
1 file changed, 33 insertions(+) | ||
|
||
--- a/drivers/net/phy/aquantia/aquantia_main.c | ||
+++ b/drivers/net/phy/aquantia/aquantia_main.c | ||
@@ -11,6 +11,7 @@ | ||
#include <linux/module.h> | ||
#include <linux/delay.h> | ||
#include <linux/bitfield.h> | ||
+#include <linux/of.h> | ||
#include <linux/phy.h> | ||
|
||
#include "aquantia.h" | ||
@@ -70,6 +71,11 @@ | ||
#define MDIO_AN_TX_VEND_INT_MASK2 0xd401 | ||
#define MDIO_AN_TX_VEND_INT_MASK2_LINK BIT(0) | ||
|
||
+#define PMAPMD_RSVD_VEND_PROV 0xe400 | ||
+#define PMAPMD_RSVD_VEND_PROV_MDI_CONF GENMASK(1, 0) | ||
+#define PMAPMD_RSVD_VEND_PROV_MDI_REVERSE BIT(0) | ||
+#define PMAPMD_RSVD_VEND_PROV_MDI_FORCE BIT(1) | ||
+ | ||
#define MDIO_AN_RX_LP_STAT1 0xe820 | ||
#define MDIO_AN_RX_LP_STAT1_1000BASET_FULL BIT(15) | ||
#define MDIO_AN_RX_LP_STAT1_1000BASET_HALF BIT(14) | ||
@@ -497,6 +503,29 @@ static int aqr107_wait_processor_intensi | ||
return 0; | ||
} | ||
|
||
+static int aqr107_config_mdi(struct phy_device *phydev) | ||
+{ | ||
+ struct device_node *np = phydev->mdio.dev.of_node; | ||
+ u32 mdi_conf; | ||
+ int ret; | ||
+ | ||
+ ret = of_property_read_u32(np, "marvell,mdi-cfg-order", &mdi_conf); | ||
+ | ||
+ /* Do nothing in case property "marvell,mdi-cfg-order" is not present */ | ||
+ if (ret == -ENOENT) | ||
+ return 0; | ||
+ | ||
+ if (ret) | ||
+ return ret; | ||
+ | ||
+ if (mdi_conf & ~PMAPMD_RSVD_VEND_PROV_MDI_REVERSE) | ||
+ return -EINVAL; | ||
+ | ||
+ return phy_modify_mmd(phydev, MDIO_MMD_PMAPMD, PMAPMD_RSVD_VEND_PROV, | ||
+ PMAPMD_RSVD_VEND_PROV_MDI_CONF, | ||
+ mdi_conf | PMAPMD_RSVD_VEND_PROV_MDI_FORCE); | ||
+} | ||
+ | ||
static int aqr107_config_init(struct phy_device *phydev) | ||
{ | ||
struct aqr107_priv *priv = phydev->priv; | ||
@@ -535,6 +564,10 @@ static int aqr107_config_init(struct phy | ||
if (ret) | ||
return ret; | ||
|
||
+ ret = aqr107_config_mdi(phydev); | ||
+ if (ret) | ||
+ return ret; | ||
+ | ||
/* Restore LED polarity state after reset */ | ||
for_each_set_bit(led_active_low, &priv->leds_active_low, AQR_MAX_LEDS) { | ||
ret = aqr_phy_led_active_low_set(phydev, led_active_low, true); |