Message ID | 20240516012210.128307-1-marex@denx.de (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [1/2] hwrng: stm32 - use pm_runtime_resume_and_get() | expand |
On 5/16/24 03:20, Marek Vasut wrote: > include/linux/pm_runtime.h pm_runtime_get_sync() description suggests to > ... consider using pm_runtime_resume_and_get() instead of it, especially > if its return value is checked by the caller, as this is likely to result > in cleaner code. > > This is indeed better, switch to pm_runtime_resume_and_get() which > correctly suspends the device again in case of failure. Also add error > checking into the RNG driver in case pm_runtime_resume_and_get() does > fail, which is currently not done, and it does detect sporadic -EACCES > error return after resume, which would otherwise lead to a hang due to > register access on un-resumed hardware. Now the read simply errors out > and the system does not hang. > > Signed-off-by: Marek Vasut <marex@denx.de> > --- > Cc: "Uwe Kleine-König" <u.kleine-koenig@pengutronix.de> > Cc: Alexandre Torgue <alexandre.torgue@foss.st.com> > Cc: Gatien Chevallier <gatien.chevallier@foss.st.com> > Cc: Herbert Xu <herbert@gondor.apana.org.au> > Cc: Marek Vasut <marex@denx.de> > Cc: Maxime Coquelin <mcoquelin.stm32@gmail.com> > Cc: Olivia Mackall <olivia@selenic.com> > Cc: Rob Herring <robh@kernel.org> > Cc: Yang Yingliang <yangyingliang@huawei.com> > Cc: kernel@dh-electronics.com > Cc: linux-arm-kernel@lists.infradead.org > Cc: linux-crypto@vger.kernel.org > Cc: linux-stm32@st-md-mailman.stormreply.com > --- > drivers/char/hw_random/stm32-rng.c | 4 +++- > 1 file changed, 3 insertions(+), 1 deletion(-) > > diff --git a/drivers/char/hw_random/stm32-rng.c b/drivers/char/hw_random/stm32-rng.c > index 0e903d6e22e30..6dec4adc49853 100644 > --- a/drivers/char/hw_random/stm32-rng.c > +++ b/drivers/char/hw_random/stm32-rng.c > @@ -187,7 +187,9 @@ static int stm32_rng_read(struct hwrng *rng, void *data, size_t max, bool wait) > int retval = 0, err = 0; > u32 sr; > > - pm_runtime_get_sync((struct device *) priv->rng.priv); > + retval = pm_runtime_resume_and_get((struct device *)priv->rng.priv); > + if (retval) > + return retval; > > if (readl_relaxed(priv->base + RNG_SR) & RNG_SR_SEIS) > stm32_rng_conceal_seed_error(rng); Hi Marek, I'll check in other stm32 drivers as well. Acked-by: Gatien Chevallier <gatien.chevallier@foss.st.com> Thanks, Gatien
diff --git a/drivers/char/hw_random/stm32-rng.c b/drivers/char/hw_random/stm32-rng.c index 0e903d6e22e30..6dec4adc49853 100644 --- a/drivers/char/hw_random/stm32-rng.c +++ b/drivers/char/hw_random/stm32-rng.c @@ -187,7 +187,9 @@ static int stm32_rng_read(struct hwrng *rng, void *data, size_t max, bool wait) int retval = 0, err = 0; u32 sr; - pm_runtime_get_sync((struct device *) priv->rng.priv); + retval = pm_runtime_resume_and_get((struct device *)priv->rng.priv); + if (retval) + return retval; if (readl_relaxed(priv->base + RNG_SR) & RNG_SR_SEIS) stm32_rng_conceal_seed_error(rng);
include/linux/pm_runtime.h pm_runtime_get_sync() description suggests to ... consider using pm_runtime_resume_and_get() instead of it, especially if its return value is checked by the caller, as this is likely to result in cleaner code. This is indeed better, switch to pm_runtime_resume_and_get() which correctly suspends the device again in case of failure. Also add error checking into the RNG driver in case pm_runtime_resume_and_get() does fail, which is currently not done, and it does detect sporadic -EACCES error return after resume, which would otherwise lead to a hang due to register access on un-resumed hardware. Now the read simply errors out and the system does not hang. Signed-off-by: Marek Vasut <marex@denx.de> --- Cc: "Uwe Kleine-König" <u.kleine-koenig@pengutronix.de> Cc: Alexandre Torgue <alexandre.torgue@foss.st.com> Cc: Gatien Chevallier <gatien.chevallier@foss.st.com> Cc: Herbert Xu <herbert@gondor.apana.org.au> Cc: Marek Vasut <marex@denx.de> Cc: Maxime Coquelin <mcoquelin.stm32@gmail.com> Cc: Olivia Mackall <olivia@selenic.com> Cc: Rob Herring <robh@kernel.org> Cc: Yang Yingliang <yangyingliang@huawei.com> Cc: kernel@dh-electronics.com Cc: linux-arm-kernel@lists.infradead.org Cc: linux-crypto@vger.kernel.org Cc: linux-stm32@st-md-mailman.stormreply.com --- drivers/char/hw_random/stm32-rng.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)