mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-22 06:57:57 +00:00
21f0ab503c
These are used by both the armsr (EFI boot) and
layerscape targets for phylink-controlled SFP
support on NXP DPAA2 platforms (LS1088,LS2088,LX2160).
This is in place of commit a7bd96c98f
("layerscape: add patches for SFP support on DPAA2 platforms")
in the main branch. armsr in main started at kernel 6.1
so there is not an equivalent 5.15 commit to cherry pick.
Signed-off-by: Mathew McBride <matt@traverse.com.au>
75 lines
2.4 KiB
Diff
75 lines
2.4 KiB
Diff
From d5af37ae22f0364be9ded773d737dd6e5b207b10 Mon Sep 17 00:00:00 2001
|
|
From: Ioana Ciornei <ioana.ciornei@nxp.com>
|
|
Date: Thu, 21 Nov 2019 21:15:25 +0200
|
|
Subject: [PATCH 3/4] dpaa2-eth: do not hold rtnl_lock on phylink_create() or
|
|
_destroy()
|
|
|
|
The rtnl_lock should not be held when calling phylink_create() or
|
|
phylink_destroy() since it leads to the deadlock listed below:
|
|
|
|
[ 18.656576] rtnl_lock+0x18/0x20
|
|
[ 18.659798] sfp_bus_add_upstream+0x28/0x90
|
|
[ 18.663974] phylink_create+0x2cc/0x828
|
|
[ 18.667803] dpaa2_mac_connect+0x14c/0x2a8
|
|
[ 18.671890] dpaa2_eth_connect_mac+0x94/0xd8
|
|
|
|
Fix this by moving the _lock() and _unlock() calls just outside of
|
|
phylink_of_phy_connect() and phylink_disconnect_phy().
|
|
|
|
Fixes: 719479230893 ("dpaa2-eth: add MAC/PHY support through phylink")
|
|
Reported-by: Russell King <linux@armlinux.org.uk>
|
|
Signed-off-by: Ioana Ciornei <ioana.ciornei@nxp.com>
|
|
Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
|
|
---
|
|
drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c | 4 ----
|
|
drivers/net/ethernet/freescale/dpaa2/dpaa2-mac.c | 4 ++++
|
|
2 files changed, 4 insertions(+), 4 deletions(-)
|
|
|
|
--- a/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c
|
|
+++ b/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c
|
|
@@ -4217,12 +4217,10 @@ static irqreturn_t dpni_irq0_handler_thr
|
|
dpaa2_eth_set_mac_addr(netdev_priv(net_dev));
|
|
dpaa2_eth_update_tx_fqids(priv);
|
|
|
|
- rtnl_lock();
|
|
if (dpaa2_eth_has_mac(priv))
|
|
dpaa2_eth_disconnect_mac(priv);
|
|
else
|
|
dpaa2_eth_connect_mac(priv);
|
|
- rtnl_unlock();
|
|
}
|
|
|
|
return IRQ_HANDLED;
|
|
@@ -4516,9 +4514,7 @@ static int dpaa2_eth_remove(struct fsl_m
|
|
#endif
|
|
|
|
unregister_netdev(net_dev);
|
|
- rtnl_lock();
|
|
dpaa2_eth_disconnect_mac(priv);
|
|
- rtnl_unlock();
|
|
|
|
dpaa2_eth_dl_port_del(priv);
|
|
dpaa2_eth_dl_traps_unregister(priv);
|
|
--- a/drivers/net/ethernet/freescale/dpaa2/dpaa2-mac.c
|
|
+++ b/drivers/net/ethernet/freescale/dpaa2/dpaa2-mac.c
|
|
@@ -357,7 +357,9 @@ int dpaa2_mac_connect(struct dpaa2_mac *
|
|
if (mac->pcs)
|
|
phylink_set_pcs(mac->phylink, &mac->pcs->pcs);
|
|
|
|
+ rtnl_lock();
|
|
err = phylink_fwnode_phy_connect(mac->phylink, dpmac_node, 0);
|
|
+ rtnl_unlock();
|
|
if (err) {
|
|
netdev_err(net_dev, "phylink_fwnode_phy_connect() = %d\n", err);
|
|
goto err_phylink_destroy;
|
|
@@ -378,7 +380,9 @@ void dpaa2_mac_disconnect(struct dpaa2_m
|
|
if (!mac->phylink)
|
|
return;
|
|
|
|
+ rtnl_lock();
|
|
phylink_disconnect_phy(mac->phylink);
|
|
+ rtnl_unlock();
|
|
phylink_destroy(mac->phylink);
|
|
dpaa2_pcs_destroy(mac);
|
|
}
|