mirror of
https://github.com/openwrt/openwrt.git
synced 2026-06-17 12:40:16 +04:00
627cd79e1c
While implementing standalone PCS support for DSA, it was found that making the MAC driver passing the available_pcs array is limiting and problematic for memory handling and allocation. To better handle this, change the logic and make phylink allocate the struct and make the MAC driver implement a function in phylink_config .fill_available_pcs to fill the PCS array. Update the Airoha and Mediatek driver to reflect this new implementation. Link: https://github.com/openwrt/openwrt/pull/23413 Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
65 lines
2.4 KiB
Diff
65 lines
2.4 KiB
Diff
From 4b1dde131a237455e41985fdc95306cd2f1b8a0a Mon Sep 17 00:00:00 2001
|
|
From: Christian Marangi <ansuelsmth@gmail.com>
|
|
Date: Fri, 9 May 2025 16:36:22 +0200
|
|
Subject: [PATCH 7/7] net: phylink: add .pcs_link_down PCS OP
|
|
|
|
Permit for PCS driver to define specific operation to torn down the link
|
|
between the MAC and the PCS.
|
|
|
|
This might be needed for some PCS that reset counter or require special
|
|
reset to correctly work if the link needs to be restored later.
|
|
|
|
On phylink_link_down() call, the additional phylink_pcs_link_down() will
|
|
be called before .mac_link_down to torn down the link.
|
|
|
|
PCS driver will need to define .pcs_link_down to make use of this.
|
|
|
|
Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
|
---
|
|
drivers/net/phy/phylink.c | 8 ++++++++
|
|
include/linux/phylink.h | 2 ++
|
|
2 files changed, 10 insertions(+)
|
|
|
|
--- a/drivers/net/phy/phylink.c
|
|
+++ b/drivers/net/phy/phylink.c
|
|
@@ -1033,6 +1033,12 @@ static void phylink_pcs_link_up(struct p
|
|
pcs->ops->pcs_link_up(pcs, neg_mode, interface, speed, duplex);
|
|
}
|
|
|
|
+static void phylink_pcs_link_down(struct phylink_pcs *pcs)
|
|
+{
|
|
+ if (pcs && pcs->ops->pcs_link_down)
|
|
+ pcs->ops->pcs_link_down(pcs);
|
|
+}
|
|
+
|
|
static void phylink_pcs_disable_eee(struct phylink_pcs *pcs)
|
|
{
|
|
if (pcs && pcs->ops->pcs_disable_eee)
|
|
@@ -1725,6 +1731,8 @@ static void phylink_link_down(struct phy
|
|
|
|
phylink_deactivate_lpi(pl);
|
|
|
|
+ phylink_pcs_link_down(pl->pcs);
|
|
+
|
|
pl->mac_ops->mac_link_down(pl->config, pl->act_link_an_mode,
|
|
pl->cur_interface);
|
|
phylink_info(pl, "Link is Down\n");
|
|
--- a/include/linux/phylink.h
|
|
+++ b/include/linux/phylink.h
|
|
@@ -499,6 +499,7 @@ struct phylink_pcs {
|
|
* @pcs_an_restart: restart 802.3z BaseX autonegotiation.
|
|
* @pcs_link_up: program the PCS for the resolved link configuration
|
|
* (where necessary).
|
|
+ * @pcs_link_down: torn down link between MAC and PCS.
|
|
* @pcs_disable_eee: optional notification to PCS that EEE has been disabled
|
|
* at the MAC.
|
|
* @pcs_enable_eee: optional notification to PCS that EEE will be enabled at
|
|
@@ -526,6 +527,7 @@ struct phylink_pcs_ops {
|
|
void (*pcs_an_restart)(struct phylink_pcs *pcs);
|
|
void (*pcs_link_up)(struct phylink_pcs *pcs, unsigned int neg_mode,
|
|
phy_interface_t interface, int speed, int duplex);
|
|
+ void (*pcs_link_down)(struct phylink_pcs *pcs);
|
|
void (*pcs_disable_eee)(struct phylink_pcs *pcs);
|
|
void (*pcs_enable_eee)(struct phylink_pcs *pcs);
|
|
int (*pcs_pre_init)(struct phylink_pcs *pcs);
|