Johnny Hughes
2019-02-04 c1f36c28393a7bb126cbf436cd6a4077a5b5c313
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
From b3caf78626b230ecd05182b56884f682ac1e43b2 Mon Sep 17 00:00:00 2001
From: Maxime Chevallier <maxime.chevallier@bootlin.com>
Date: Wed, 25 Apr 2018 20:21:16 +0200
Subject: [PATCH 45/46] net: mvpp2: Fix clk error path in mvpp2_probe
 
When clk_prepare_enable fails for the axi_clk, the mg_clk isn't properly
cleaned up. Add another jump label to handle that case, and make sure we
jump to it in the later error cases.
 
Fixes: 4792ea04bcd0 ("net: mvpp2: Fix clock resource by adding an optional bus clock")
Signed-off-by: Maxime Chevallier <maxime.chevallier@bootlin.com>
Acked-by: Gregory CLEMENT <gregory.clement@bootlin.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
(cherry picked from commit 45f972adb7f4db2d7f02af728ccd104113336074)
Signed-off-by: Marcin Wojtas <mw@semihalf.com>
---
 drivers/net/ethernet/marvell/mvpp2.c | 15 ++++++++-------
 1 file changed, 8 insertions(+), 7 deletions(-)
 
diff --git a/drivers/net/ethernet/marvell/mvpp2.c b/drivers/net/ethernet/marvell/mvpp2.c
index 4202f9b..0c2f048 100644
--- a/drivers/net/ethernet/marvell/mvpp2.c
+++ b/drivers/net/ethernet/marvell/mvpp2.c
@@ -8774,12 +8774,12 @@ static int mvpp2_probe(struct platform_device *pdev)
         if (IS_ERR(priv->axi_clk)) {
             err = PTR_ERR(priv->axi_clk);
             if (err == -EPROBE_DEFER)
-                goto err_gop_clk;
+                goto err_mg_clk;
             priv->axi_clk = NULL;
         } else {
             err = clk_prepare_enable(priv->axi_clk);
             if (err < 0)
-                goto err_gop_clk;
+                goto err_mg_clk;
         }
 
         /* Get system's tclk rate */
@@ -8793,7 +8793,7 @@ static int mvpp2_probe(struct platform_device *pdev)
     if (priv->hw_version == MVPP22) {
         err = dma_set_mask(&pdev->dev, MVPP2_DESC_DMA_MASK);
         if (err)
-            goto err_mg_clk;
+            goto err_axi_clk;
         /* Sadly, the BM pools all share the same register to
          * store the high 32 bits of their address. So they
          * must all have the same high 32 bits, which forces
@@ -8801,14 +8801,14 @@ static int mvpp2_probe(struct platform_device *pdev)
          */
         err = dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(32));
         if (err)
-            goto err_mg_clk;
+            goto err_axi_clk;
     }
 
     /* Initialize network controller */
     err = mvpp2_init(pdev, priv);
     if (err < 0) {
         dev_err(&pdev->dev, "failed to initialize controller\n");
-        goto err_mg_clk;
+        goto err_axi_clk;
     }
 
     /* Initialize ports */
@@ -8821,7 +8821,7 @@ static int mvpp2_probe(struct platform_device *pdev)
     if (priv->port_count == 0) {
         dev_err(&pdev->dev, "no ports enabled\n");
         err = -ENODEV;
-        goto err_mg_clk;
+        goto err_axi_clk;
     }
 
     /* Statistics must be gathered regularly because some of them (like
@@ -8849,8 +8849,9 @@ static int mvpp2_probe(struct platform_device *pdev)
             mvpp2_port_remove(priv->port_list[i]);
         i++;
     }
-err_mg_clk:
+err_axi_clk:
     clk_disable_unprepare(priv->axi_clk);
+err_mg_clk:
     if (priv->hw_version == MVPP22)
         clk_disable_unprepare(priv->mg_clk);
 err_gop_clk:
-- 
2.7.4