| From 70458f8a6b44daf3ad39f0d9b6d1097c8a7780ed Mon Sep 17 00:00:00 2001 |
| From: Johan Hovold <johan@kernel.org> |
| Date: Fri, 25 Jul 2025 19:12:10 +0200 |
| Subject: net: enetc: fix device and OF node leak at probe |
| |
| From: Johan Hovold <johan@kernel.org> |
| |
| commit 70458f8a6b44daf3ad39f0d9b6d1097c8a7780ed upstream. |
| |
| Make sure to drop the references to the IERB OF node and platform device |
| taken by of_parse_phandle() and of_find_device_by_node() during probe. |
| |
| Fixes: e7d48e5fbf30 ("net: enetc: add a mini driver for the Integrated Endpoint Register Block") |
| Cc: stable@vger.kernel.org # 5.13 |
| Cc: Vladimir Oltean <vladimir.oltean@nxp.com> |
| Signed-off-by: Johan Hovold <johan@kernel.org> |
| Reviewed-by: Simon Horman <horms@kernel.org> |
| Link: https://patch.msgid.link/20250725171213.880-3-johan@kernel.org |
| Signed-off-by: Jakub Kicinski <kuba@kernel.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/net/ethernet/freescale/enetc/enetc_pf.c | 14 ++++++++++++-- |
| 1 file changed, 12 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/net/ethernet/freescale/enetc/enetc_pf.c |
| +++ b/drivers/net/ethernet/freescale/enetc/enetc_pf.c |
| @@ -1179,19 +1179,29 @@ static int enetc_pf_register_with_ierb(s |
| { |
| struct platform_device *ierb_pdev; |
| struct device_node *ierb_node; |
| + int ret; |
| |
| ierb_node = of_find_compatible_node(NULL, NULL, |
| "fsl,ls1028a-enetc-ierb"); |
| - if (!ierb_node || !of_device_is_available(ierb_node)) |
| + if (!ierb_node) |
| return -ENODEV; |
| |
| + if (!of_device_is_available(ierb_node)) { |
| + of_node_put(ierb_node); |
| + return -ENODEV; |
| + } |
| + |
| ierb_pdev = of_find_device_by_node(ierb_node); |
| of_node_put(ierb_node); |
| |
| if (!ierb_pdev) |
| return -EPROBE_DEFER; |
| |
| - return enetc_ierb_register_pf(ierb_pdev, pdev); |
| + ret = enetc_ierb_register_pf(ierb_pdev, pdev); |
| + |
| + put_device(&ierb_pdev->dev); |
| + |
| + return ret; |
| } |
| |
| static struct enetc_si *enetc_psi_create(struct pci_dev *pdev) |