Commit 903d2b9f authored by Michael Walle's avatar Michael Walle Committed by Jakub Kicinski
Browse files

net: ethernet: ti: am65-cpsw: fix port_np reference counting



A reference to the device tree node is stored in a private struct, thus
the reference count has to be incremented. Also, decrement the count on
device removal and in the error path.

Fixes: 93a76530 ("net: ethernet: ti: introduce am65x/j721e gigabit eth subsystem driver")
Signed-off-by: default avatarMichael Walle <mwalle@kernel.org>
Reviewed-by: default avatarSimon Horman <horms@kernel.org>
Link: https://patch.msgid.link/20250414083942.4015060-1-mwalle@kernel.org


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 688abe10
Loading
Loading
Loading
Loading
+14 −1
Original line number Diff line number Diff line
@@ -2666,7 +2666,7 @@ static int am65_cpsw_nuss_init_slave_ports(struct am65_cpsw_common *common)
				of_property_read_bool(port_np, "ti,mac-only");

		/* get phy/link info */
		port->slave.port_np = port_np;
		port->slave.port_np = of_node_get(port_np);
		ret = of_get_phy_mode(port_np, &port->slave.phy_if);
		if (ret) {
			dev_err(dev, "%pOF read phy-mode err %d\n",
@@ -2720,6 +2720,17 @@ static void am65_cpsw_nuss_phylink_cleanup(struct am65_cpsw_common *common)
	}
}

static void am65_cpsw_remove_dt(struct am65_cpsw_common *common)
{
	struct am65_cpsw_port *port;
	int i;

	for (i = 0; i < common->port_num; i++) {
		port = &common->ports[i];
		of_node_put(port->slave.port_np);
	}
}

static int
am65_cpsw_nuss_init_port_ndev(struct am65_cpsw_common *common, u32 port_idx)
{
@@ -3622,6 +3633,7 @@ static int am65_cpsw_nuss_probe(struct platform_device *pdev)
	am65_cpsw_nuss_cleanup_ndev(common);
	am65_cpsw_nuss_phylink_cleanup(common);
	am65_cpts_release(common->cpts);
	am65_cpsw_remove_dt(common);
err_of_clear:
	if (common->mdio_dev)
		of_platform_device_destroy(common->mdio_dev, NULL);
@@ -3661,6 +3673,7 @@ static void am65_cpsw_nuss_remove(struct platform_device *pdev)
	am65_cpsw_nuss_phylink_cleanup(common);
	am65_cpts_release(common->cpts);
	am65_cpsw_disable_serdes_phy(common);
	am65_cpsw_remove_dt(common);

	if (common->mdio_dev)
		of_platform_device_destroy(common->mdio_dev, NULL);