1
1
openwrt/target/linux/airoha/patches-6.18/801-01-net-phy-add-PHY_DETACH_NO_HW_RESET-PHY-flag.patch
Kenneth Kasilag 8f21d26411
airoha: 6.18: refresh patches
Refreshed automatically with `make target/linux/refresh V=s`.

Signed-off-by: Kenneth Kasilag <kenneth@kasilag.me>
Link: https://github.com/openwrt/openwrt/pull/21019
Signed-off-by: Jonas Jelonek <jelonek.jonas@gmail.com>
2026-06-03 09:06:34 +02:00

130 lines
4.6 KiB
Diff

From f2c6f8711c3866caafee997cfa60af4f38879be0 Mon Sep 17 00:00:00 2001
From: Christian Marangi <ansuelsmth@gmail.com>
Date: Wed, 25 Jun 2025 00:45:11 +0200
Subject: [PATCH 1/2] net: phy: add PHY_DETACH_NO_HW_RESET PHY flag
Some PHY require a firmware to correctly work and such firmware might
get reset when the GPIO reset is assert.
This is the case for the Aeonsemi PHY where when the PHY is torn down,
phy_detach() is called that assert the GPIO reset pin resetting the
firmware.
To handle this introduce a flag, PHY_DETACH_NO_HW_RESET that instruct
phy_detach() to skip asserting the GPIO reset on detaching the PHY.
The PHY is still reset in all other case where it's removed or the PHY
fails to probe.
Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
---
drivers/net/phy/as21xxx.c | 10 ++++++++++
drivers/net/phy/phy_device.c | 3 ++-
include/linux/phy.h | 1 +
3 files changed, 13 insertions(+), 1 deletion(-)
--- a/drivers/net/phy/as21xxx.c
+++ b/drivers/net/phy/as21xxx.c
@@ -965,6 +965,7 @@ static struct phy_driver as21xxx_drivers
.led_hw_control_set = as21xxx_led_hw_control_set,
.led_hw_control_get = as21xxx_led_hw_control_get,
.led_polarity_set = as21xxx_led_polarity_set,
+ .flags = PHY_DETACH_NO_RESET,
},
{
PHY_ID_MATCH_EXACT(PHY_ID_AS21011PB1),
@@ -977,6 +978,7 @@ static struct phy_driver as21xxx_drivers
.led_hw_control_set = as21xxx_led_hw_control_set,
.led_hw_control_get = as21xxx_led_hw_control_get,
.led_polarity_set = as21xxx_led_polarity_set,
+ .flags = PHY_DETACH_NO_RESET,
},
{
PHY_ID_MATCH_EXACT(PHY_ID_AS21010PB1),
@@ -989,6 +991,7 @@ static struct phy_driver as21xxx_drivers
.led_hw_control_set = as21xxx_led_hw_control_set,
.led_hw_control_get = as21xxx_led_hw_control_get,
.led_polarity_set = as21xxx_led_polarity_set,
+ .flags = PHY_DETACH_NO_RESET,
},
{
PHY_ID_MATCH_EXACT(PHY_ID_AS21010JB1),
@@ -1001,6 +1004,7 @@ static struct phy_driver as21xxx_drivers
.led_hw_control_set = as21xxx_led_hw_control_set,
.led_hw_control_get = as21xxx_led_hw_control_get,
.led_polarity_set = as21xxx_led_polarity_set,
+ .flags = PHY_DETACH_NO_RESET,
},
{
PHY_ID_MATCH_EXACT(PHY_ID_AS21210PB1),
@@ -1013,6 +1017,7 @@ static struct phy_driver as21xxx_drivers
.led_hw_control_set = as21xxx_led_hw_control_set,
.led_hw_control_get = as21xxx_led_hw_control_get,
.led_polarity_set = as21xxx_led_polarity_set,
+ .flags = PHY_DETACH_NO_RESET,
},
{
PHY_ID_MATCH_EXACT(PHY_ID_AS21510JB1),
@@ -1025,6 +1030,7 @@ static struct phy_driver as21xxx_drivers
.led_hw_control_set = as21xxx_led_hw_control_set,
.led_hw_control_get = as21xxx_led_hw_control_get,
.led_polarity_set = as21xxx_led_polarity_set,
+ .flags = PHY_DETACH_NO_RESET,
},
{
PHY_ID_MATCH_EXACT(PHY_ID_AS21510PB1),
@@ -1037,6 +1043,7 @@ static struct phy_driver as21xxx_drivers
.led_hw_control_set = as21xxx_led_hw_control_set,
.led_hw_control_get = as21xxx_led_hw_control_get,
.led_polarity_set = as21xxx_led_polarity_set,
+ .flags = PHY_DETACH_NO_RESET,
},
{
PHY_ID_MATCH_EXACT(PHY_ID_AS21511JB1),
@@ -1049,6 +1056,7 @@ static struct phy_driver as21xxx_drivers
.led_hw_control_set = as21xxx_led_hw_control_set,
.led_hw_control_get = as21xxx_led_hw_control_get,
.led_polarity_set = as21xxx_led_polarity_set,
+ .flags = PHY_DETACH_NO_RESET,
},
{
PHY_ID_MATCH_EXACT(PHY_ID_AS21210JB1),
@@ -1061,6 +1069,7 @@ static struct phy_driver as21xxx_drivers
.led_hw_control_set = as21xxx_led_hw_control_set,
.led_hw_control_get = as21xxx_led_hw_control_get,
.led_polarity_set = as21xxx_led_polarity_set,
+ .flags = PHY_DETACH_NO_RESET,
},
{
PHY_ID_MATCH_EXACT(PHY_ID_AS21511PB1),
@@ -1073,6 +1082,7 @@ static struct phy_driver as21xxx_drivers
.led_hw_control_set = as21xxx_led_hw_control_set,
.led_hw_control_get = as21xxx_led_hw_control_get,
.led_polarity_set = as21xxx_led_polarity_set,
+ .flags = PHY_DETACH_NO_RESET,
},
};
module_phy_driver(as21xxx_drivers);
--- a/drivers/net/phy/phy_device.c
+++ b/drivers/net/phy/phy_device.c
@@ -1882,7 +1882,8 @@ void phy_detach(struct phy_device *phyde
}
/* Assert the reset signal */
- phy_device_reset(phydev, 1);
+ if (!phydev->drv || !(phydev->drv->flags & PHY_DETACH_NO_HW_RESET))
+ phy_device_reset(phydev, 1);
/*
* The phydev might go away on the put_device() below, so avoid
--- a/include/linux/phy.h
+++ b/include/linux/phy.h
@@ -64,6 +64,7 @@ extern const int phy_basic_ports_array[3
#define PHY_RST_AFTER_CLK_EN 0x00000002
#define PHY_POLL_CABLE_TEST 0x00000004
#define PHY_ALWAYS_CALL_SUSPEND 0x00000008
+#define PHY_DETACH_NO_HW_RESET 0x00000010
#define MDIO_DEVICE_IS_PHY 0x80000000
/**