forked from Openwrt/openwrt
c2c741ccce
Initial backport of at803x PHY driver cleanup. This is in preparation for split and addition of new PHY Family based on at803x needed for ipq807x and other IPQ Series SoC. Other affected patch are automatically refreshed with make target/linux/refresh Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
79 lines
2.4 KiB
Diff
79 lines
2.4 KiB
Diff
From 30dd62191d3dd97c08f7f9dc9ce77ffab457e4fb Mon Sep 17 00:00:00 2001
|
|
From: Christian Marangi <ansuelsmth@gmail.com>
|
|
Date: Fri, 8 Dec 2023 15:51:56 +0100
|
|
Subject: [PATCH 09/13] net: phy: at803x: move specific at8031 config_intr to
|
|
dedicated function
|
|
|
|
Move specific at8031 config_intr bits to dedicated function to make
|
|
at803x_config_initr more generic.
|
|
|
|
This is needed in preparation for PHY driver split as qca8081 share the
|
|
same function to setup interrupts.
|
|
|
|
Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
|
Signed-off-by: David S. Miller <davem@davemloft.net>
|
|
---
|
|
drivers/net/phy/at803x.c | 30 ++++++++++++++++++++++++------
|
|
1 file changed, 24 insertions(+), 6 deletions(-)
|
|
|
|
--- a/drivers/net/phy/at803x.c
|
|
+++ b/drivers/net/phy/at803x.c
|
|
@@ -990,7 +990,6 @@ static int at803x_ack_interrupt(struct p
|
|
|
|
static int at803x_config_intr(struct phy_device *phydev)
|
|
{
|
|
- struct at803x_priv *priv = phydev->priv;
|
|
int err;
|
|
int value;
|
|
|
|
@@ -1007,10 +1006,6 @@ static int at803x_config_intr(struct phy
|
|
value |= AT803X_INTR_ENABLE_DUPLEX_CHANGED;
|
|
value |= AT803X_INTR_ENABLE_LINK_FAIL;
|
|
value |= AT803X_INTR_ENABLE_LINK_SUCCESS;
|
|
- if (priv->is_fiber) {
|
|
- value |= AT803X_INTR_ENABLE_LINK_FAIL_BX;
|
|
- value |= AT803X_INTR_ENABLE_LINK_SUCCESS_BX;
|
|
- }
|
|
|
|
err = phy_write(phydev, AT803X_INTR_ENABLE, value);
|
|
} else {
|
|
@@ -1617,6 +1612,29 @@ static int at8031_set_wol(struct phy_dev
|
|
return ret;
|
|
}
|
|
|
|
+static int at8031_config_intr(struct phy_device *phydev)
|
|
+{
|
|
+ struct at803x_priv *priv = phydev->priv;
|
|
+ int err, value = 0;
|
|
+
|
|
+ if (phydev->interrupts == PHY_INTERRUPT_ENABLED &&
|
|
+ priv->is_fiber) {
|
|
+ /* Clear any pending interrupts */
|
|
+ err = at803x_ack_interrupt(phydev);
|
|
+ if (err)
|
|
+ return err;
|
|
+
|
|
+ value |= AT803X_INTR_ENABLE_LINK_FAIL_BX;
|
|
+ value |= AT803X_INTR_ENABLE_LINK_SUCCESS_BX;
|
|
+
|
|
+ err = phy_set_bits(phydev, AT803X_INTR_ENABLE, value);
|
|
+ if (err)
|
|
+ return err;
|
|
+ }
|
|
+
|
|
+ return at803x_config_intr(phydev);
|
|
+}
|
|
+
|
|
static int qca83xx_config_init(struct phy_device *phydev)
|
|
{
|
|
u8 switch_revision;
|
|
@@ -2137,7 +2155,7 @@ static struct phy_driver at803x_driver[]
|
|
.write_page = at803x_write_page,
|
|
.get_features = at803x_get_features,
|
|
.read_status = at803x_read_status,
|
|
- .config_intr = at803x_config_intr,
|
|
+ .config_intr = at8031_config_intr,
|
|
.handle_interrupt = at803x_handle_interrupt,
|
|
.get_tunable = at803x_get_tunable,
|
|
.set_tunable = at803x_set_tunable,
|