mirror of
https://github.com/VIKINGYFY/immortalwrt.git
synced 2025-12-16 17:15:26 +00:00
Backport phylink patches for PCS/PHY caps OPs. This makes it easier to align future generic PCS patch and permit supporting special PHY that needs specific tune if "in-band" mode is enabled (for example Aeonsemi PHYs) This is also mainly using the upstream version of the Mediatek patch 739-net-add-negotiation-of-in-band-capabilities. All affected patch automatically refreshed. Link: https://github.com/openwrt/openwrt/pull/20461 Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
80 lines
2.6 KiB
Diff
80 lines
2.6 KiB
Diff
From 5d58a890c02770ba8d790b1f3c6e8c0e20514dc2 Mon Sep 17 00:00:00 2001
|
|
From: "Russell King (Oracle)" <rmk+kernel@armlinux.org.uk>
|
|
Date: Tue, 3 Dec 2024 15:31:18 +0000
|
|
Subject: [PATCH 07/13] net: phy: add phy_config_inband()
|
|
|
|
Add a method to configure the PHY's in-band mode.
|
|
|
|
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
|
|
Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
|
|
Link: https://patch.msgid.link/E1tIUru-006IUI-08@rmk-PC.armlinux.org.uk
|
|
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
|
---
|
|
drivers/net/phy/phy.c | 32 ++++++++++++++++++++++++++++++++
|
|
include/linux/phy.h | 6 ++++++
|
|
2 files changed, 38 insertions(+)
|
|
|
|
--- a/drivers/net/phy/phy.c
|
|
+++ b/drivers/net/phy/phy.c
|
|
@@ -1070,6 +1070,38 @@ unsigned int phy_inband_caps(struct phy_
|
|
EXPORT_SYMBOL_GPL(phy_inband_caps);
|
|
|
|
/**
|
|
+ * phy_config_inband - configure the desired PHY in-band mode
|
|
+ * @phydev: the phy_device struct
|
|
+ * @modes: in-band modes to configure
|
|
+ *
|
|
+ * Description: disables, enables or enables-with-bypass in-band signalling
|
|
+ * between the PHY and host system.
|
|
+ *
|
|
+ * Returns: zero on success, or negative errno value.
|
|
+ */
|
|
+int phy_config_inband(struct phy_device *phydev, unsigned int modes)
|
|
+{
|
|
+ int err;
|
|
+
|
|
+ if (!!(modes & LINK_INBAND_DISABLE) +
|
|
+ !!(modes & LINK_INBAND_ENABLE) +
|
|
+ !!(modes & LINK_INBAND_BYPASS) != 1)
|
|
+ return -EINVAL;
|
|
+
|
|
+ mutex_lock(&phydev->lock);
|
|
+ if (!phydev->drv)
|
|
+ err = -EIO;
|
|
+ else if (!phydev->drv->config_inband)
|
|
+ err = -EOPNOTSUPP;
|
|
+ else
|
|
+ err = phydev->drv->config_inband(phydev, modes);
|
|
+ mutex_unlock(&phydev->lock);
|
|
+
|
|
+ return err;
|
|
+}
|
|
+EXPORT_SYMBOL(phy_config_inband);
|
|
+
|
|
+/**
|
|
* _phy_start_aneg - start auto-negotiation for this PHY device
|
|
* @phydev: the phy_device struct
|
|
*
|
|
--- a/include/linux/phy.h
|
|
+++ b/include/linux/phy.h
|
|
@@ -980,6 +980,11 @@ struct phy_driver {
|
|
phy_interface_t interface);
|
|
|
|
/**
|
|
+ * @config_inband: configure in-band mode for the PHY
|
|
+ */
|
|
+ int (*config_inband)(struct phy_device *phydev, unsigned int modes);
|
|
+
|
|
+ /**
|
|
* @get_rate_matching: Get the supported type of rate matching for a
|
|
* particular phy interface. This is used by phy consumers to determine
|
|
* whether to advertise lower-speed modes for that interface. It is
|
|
@@ -1860,6 +1865,7 @@ int phy_start_aneg(struct phy_device *ph
|
|
int phy_aneg_done(struct phy_device *phydev);
|
|
unsigned int phy_inband_caps(struct phy_device *phydev,
|
|
phy_interface_t interface);
|
|
+int phy_config_inband(struct phy_device *phydev, unsigned int modes);
|
|
int phy_speed_down(struct phy_device *phydev, bool sync);
|
|
int phy_speed_up(struct phy_device *phydev);
|
|
bool phy_check_valid(int speed, int duplex, unsigned long *features);
|