Commit 44cef0c0 authored by Zhang Qilong's avatar Zhang Qilong Committed by Marc Kleine-Budde

can: c_can: c_can_power_up(): fix error handling

In the error handling in c_can_power_up(), there are two bugs:

1) c_can_pm_runtime_get_sync() will increase usage counter if device is not
   empty. Forgetting to call c_can_pm_runtime_put_sync() will result in a
   reference leak here.

2) c_can_reset_ram() operation will set start bit when enable is true. We
   should clear it in the error handling.

We fix it by adding c_can_pm_runtime_put_sync() for 1), and
c_can_reset_ram(enable is false) for 2) in the error handling.

Fixes: 82120032 ("can: c_can: Add d_can suspend resume support")
Fixes: 52cde85a ("can: c_can: Add d_can raminit support")
Signed-off-by: default avatarZhang Qilong <zhangqilong3@huawei.com>
Link: https://lore.kernel.org/r/20201128133922.3276973-2-zhangqilong3@huawei.com
[mkl: return "0" instead of "ret"]
Signed-off-by: default avatarMarc Kleine-Budde <mkl@pengutronix.de>
parent c2d095ef
...@@ -1295,13 +1295,23 @@ int c_can_power_up(struct net_device *dev) ...@@ -1295,13 +1295,23 @@ int c_can_power_up(struct net_device *dev)
time_after(time_out, jiffies)) time_after(time_out, jiffies))
cpu_relax(); cpu_relax();
if (time_after(jiffies, time_out)) if (time_after(jiffies, time_out)) {
return -ETIMEDOUT; ret = -ETIMEDOUT;
goto err_out;
}
ret = c_can_start(dev); ret = c_can_start(dev);
if (!ret) if (ret)
goto err_out;
c_can_irq_control(priv, true); c_can_irq_control(priv, true);
return 0;
err_out:
c_can_reset_ram(priv, false);
c_can_pm_runtime_put_sync(priv);
return ret; return ret;
} }
EXPORT_SYMBOL_GPL(c_can_power_up); EXPORT_SYMBOL_GPL(c_can_power_up);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment