mirror of
https://github.com/torvalds/linux.git
synced 2026-11-07 06:17:02 +01:00
bus: fsl-mc: drop the fwnode links of the dpmacs nodes
A DPMAC node under dpmacs/ is never the fwnode of any device: the fsl-mc bus creates dpmac.N objects without one, then dpaa2-mac finds its node in dpmacs/ at connect time. fw_devlink therefore attaches the supplier links of those nodes (phys, ...) to the nearest ancestor device, the fsl-mc bus, as SYNC_STATE_ONLY proxies. device_link_add() refuses such a link once the consumer has probed, and fw_devlink logs the refusal as an error. On an LX2160A board with 4x25G DPMACs for which phys = <&serdes_1 N>, the Serdes PHY binds after the bus and then at every boot it shows: fsl_mc_bus 80c000000.fsl-mc: Failed to create device link (0x180) with supplier 1ea0000.phy for /soc/fsl-mc@80c000000/dpmacs/ethernet@3 once per port! To fix it, when the root MC bus probes, purge the fwnode links of every child of its dpmacs node, so fw_devlink has no supplier link left to proxy to the bus and no longer tries to create those device links. Signed-off-by: Vincent Jardin <vjardin@free.fr> Reviewed-by: Ioana Ciornei <ioana.ciornei@nxp.com> Tested-by: Ioana Ciornei <ioana.ciornei@nxp.com> # LX2160ARDB Link: https://lore.kernel.org/r/20260930-for-upstream-fsl-mc-dpmac-fwnode-links-v2-1-13f7b6ef000f@free.fr Signed-off-by: Christophe Leroy (CS GROUP) <chleroy@kernel.org>
This commit is contained in:
parent
46201d760c
commit
4258e8f444
|
|
@ -11,6 +11,7 @@
|
|||
#define pr_fmt(fmt) "fsl-mc: " fmt
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/fwnode.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/ioport.h>
|
||||
|
|
@ -1033,6 +1034,20 @@ static int fsl_mc_firmware_check(struct platform_device *pdev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void fsl_mc_purge_dpmac_fwnode_links(struct device *dev)
|
||||
{
|
||||
struct device_node *dpmacs, *child;
|
||||
|
||||
dpmacs = of_get_child_by_name(dev->of_node, "dpmacs");
|
||||
if (!dpmacs)
|
||||
return;
|
||||
|
||||
for_each_child_of_node(dpmacs, child)
|
||||
fwnode_links_purge(of_fwnode_handle(child));
|
||||
|
||||
of_node_put(dpmacs);
|
||||
}
|
||||
|
||||
/*
|
||||
* fsl_mc_bus_probe - callback invoked when the root MC bus is being
|
||||
* added
|
||||
|
|
@ -1134,6 +1149,8 @@ static int fsl_mc_bus_probe(struct platform_device *pdev)
|
|||
&mc->num_translation_ranges);
|
||||
if (error < 0)
|
||||
goto error_cleanup_mc_io;
|
||||
|
||||
fsl_mc_purge_dpmac_fwnode_links(&pdev->dev);
|
||||
}
|
||||
|
||||
error = dprc_get_container_id(mc_io, 0, &container_id);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user