lkml.org 
[lkml]   [2020]   [Sep]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.4 060/129] net: gemini: Fix another missing clk_disable_unprepare() in probe
    Date
    From: Dan Carpenter <dan.carpenter@oracle.com>

    [ Upstream commit eb0f3bc463d59d86402f19c59aa44e82dc3fab6d ]

    We recently added some calls to clk_disable_unprepare() but we missed
    the last error path if register_netdev() fails.

    I made a couple cleanups so we avoid mistakes like this in the future.
    First I reversed the "if (!ret)" condition and pulled the code in one
    indent level. Also, the "port->netdev = NULL;" is not required because
    "port" isn't used again outside this function so I deleted that line.

    Fixes: 4d5ae32f5e1e ("net: ethernet: Add a driver for Gemini gigabit ethernet")
    Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/net/ethernet/cortina/gemini.c | 34 +++++++++++++--------------
    1 file changed, 17 insertions(+), 17 deletions(-)

    diff --git a/drivers/net/ethernet/cortina/gemini.c b/drivers/net/ethernet/cortina/gemini.c
    index 28d4c54505f9a..c9fb1ec625d8b 100644
    --- a/drivers/net/ethernet/cortina/gemini.c
    +++ b/drivers/net/ethernet/cortina/gemini.c
    @@ -2445,8 +2445,8 @@ static int gemini_ethernet_port_probe(struct platform_device *pdev)
    port->reset = devm_reset_control_get_exclusive(dev, NULL);
    if (IS_ERR(port->reset)) {
    dev_err(dev, "no reset\n");
    - clk_disable_unprepare(port->pclk);
    - return PTR_ERR(port->reset);
    + ret = PTR_ERR(port->reset);
    + goto unprepare;
    }
    reset_control_reset(port->reset);
    usleep_range(100, 500);
    @@ -2501,25 +2501,25 @@ static int gemini_ethernet_port_probe(struct platform_device *pdev)
    IRQF_SHARED,
    port_names[port->id],
    port);
    - if (ret) {
    - clk_disable_unprepare(port->pclk);
    - return ret;
    - }
    + if (ret)
    + goto unprepare;

    ret = register_netdev(netdev);
    - if (!ret) {
    + if (ret)
    + goto unprepare;
    +
    + netdev_info(netdev,
    + "irq %d, DMA @ 0x%pap, GMAC @ 0x%pap\n",
    + port->irq, &dmares->start,
    + &gmacres->start);
    + ret = gmac_setup_phy(netdev);
    + if (ret)
    netdev_info(netdev,
    - "irq %d, DMA @ 0x%pap, GMAC @ 0x%pap\n",
    - port->irq, &dmares->start,
    - &gmacres->start);
    - ret = gmac_setup_phy(netdev);
    - if (ret)
    - netdev_info(netdev,
    - "PHY init failed, deferring to ifup time\n");
    - return 0;
    - }
    + "PHY init failed, deferring to ifup time\n");
    + return 0;

    - port->netdev = NULL;
    +unprepare:
    + clk_disable_unprepare(port->pclk);
    return ret;
    }

    --
    2.25.1


    \
     
     \ /
      Last update: 2020-09-08 21:53    [W:4.055 / U:0.628 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site