]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blob
1205c26fca062f891ab88c5a12fcb9cfce6d812b
[thirdparty/kernel/stable-queue.git] /
1 From 2ca6b2767c36bc9ee62a79cb26cae7231b896c0f Mon Sep 17 00:00:00 2001
2 From: Sasha Levin <sashal@kernel.org>
3 Date: Thu, 4 Jun 2020 22:32:39 -0500
4 Subject: can: xilinx_can: handle failure cases of pm_runtime_get_sync
5
6 From: Navid Emamdoost <navid.emamdoost@gmail.com>
7
8 [ Upstream commit 79c43333bdd5a7026a5aab606b53053b643585e7 ]
9
10 Calling pm_runtime_get_sync increments the counter even in case of
11 failure, causing incorrect ref count. Call pm_runtime_put if
12 pm_runtime_get_sync fails.
13
14 Signed-off-by: Navid Emamdoost <navid.emamdoost@gmail.com>
15 Link: https://lore.kernel.org/r/20200605033239.60664-1-navid.emamdoost@gmail.com
16 Fixes: 4716620d1b62 ("can: xilinx: Convert to runtime_pm")
17 Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
18 Signed-off-by: Sasha Levin <sashal@kernel.org>
19 ---
20 drivers/net/can/xilinx_can.c | 6 +++---
21 1 file changed, 3 insertions(+), 3 deletions(-)
22
23 diff --git a/drivers/net/can/xilinx_can.c b/drivers/net/can/xilinx_can.c
24 index c1dbab8c896d5..748ff70f6a7bf 100644
25 --- a/drivers/net/can/xilinx_can.c
26 +++ b/drivers/net/can/xilinx_can.c
27 @@ -1391,7 +1391,7 @@ static int xcan_open(struct net_device *ndev)
28 if (ret < 0) {
29 netdev_err(ndev, "%s: pm_runtime_get failed(%d)\n",
30 __func__, ret);
31 - return ret;
32 + goto err;
33 }
34
35 ret = request_irq(ndev->irq, xcan_interrupt, priv->irq_flags,
36 @@ -1475,6 +1475,7 @@ static int xcan_get_berr_counter(const struct net_device *ndev,
37 if (ret < 0) {
38 netdev_err(ndev, "%s: pm_runtime_get failed(%d)\n",
39 __func__, ret);
40 + pm_runtime_put(priv->dev);
41 return ret;
42 }
43
44 @@ -1789,7 +1790,7 @@ static int xcan_probe(struct platform_device *pdev)
45 if (ret < 0) {
46 netdev_err(ndev, "%s: pm_runtime_get failed(%d)\n",
47 __func__, ret);
48 - goto err_pmdisable;
49 + goto err_disableclks;
50 }
51
52 if (priv->read_reg(priv, XCAN_SR_OFFSET) != XCAN_SR_CONFIG_MASK) {
53 @@ -1824,7 +1825,6 @@ static int xcan_probe(struct platform_device *pdev)
54
55 err_disableclks:
56 pm_runtime_put(priv->dev);
57 -err_pmdisable:
58 pm_runtime_disable(&pdev->dev);
59 err_free:
60 free_candev(ndev);
61 --
62 2.27.0
63