From patchwork Tue May 24 08:50:17 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Maxime Coquelin X-Patchwork-Id: 9133009 X-Patchwork-Delegate: herbert@gondor.apana.org.au Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 9EB63607D7 for ; Tue, 24 May 2016 08:50:26 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 98B572823B for ; Tue, 24 May 2016 08:50:26 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 8CFB628288; Tue, 24 May 2016 08:50:26 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.8 required=2.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, FREEMAIL_FROM, RCVD_IN_DNSWL_HI, T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id E7DE82824F for ; Tue, 24 May 2016 08:50:25 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754676AbcEXIuX (ORCPT ); Tue, 24 May 2016 04:50:23 -0400 Received: from mail-qk0-f193.google.com ([209.85.220.193]:35813 "EHLO mail-qk0-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753174AbcEXIuT (ORCPT ); Tue, 24 May 2016 04:50:19 -0400 Received: by mail-qk0-f193.google.com with SMTP id z80so1078899qkb.2; Tue, 24 May 2016 01:50:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc; bh=vXZ4OJ+6b/Y+aWr1CzST1xKUPx/v2jd5I7YXm5AtHqE=; b=vqxAGHm6Kb7K4R617fgNPYn2iVylPbu61NtOEzaaUjr/zspsFahsT64iYRKDDxlMJz fNQkKINeDFkrzRgL4ST1ux862toZ+m00K6wqHlcP+bPGBaRTHkDMBAdzHIF2JOB6/cxY afV6qcdDtL5xIcPTnAHCvF8mniAjkkS/yJny7KVQ7LZObJE3HKZEF5IOPUnuZbnXJoAu QgLljDkzO5Ut/7R/XkEusOSgSEn1TBn41wnxdEKcX6hCXcLoFSe2r/hXHezwP8SMCzy9 Vls8VkbF7XBN+ubaACPtUedG+zlLOchZdLTNYrGjcYX2C6EBmaX8FPh0rtt+H85c5kdp RwTg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc; bh=vXZ4OJ+6b/Y+aWr1CzST1xKUPx/v2jd5I7YXm5AtHqE=; b=YqzqNp5bZanI1Fl+iunkrvAaPdpOEhzwi4TIY+3HxOjGXzr+31tBHZWO0UVbmo2jOC oEtrb1fmoeArvJ1ocMFt7DZF23NmBbbnJ4vS5PGux5FCook2n2n0uGqFS9OdLTI3MHOT H17RPQoj+VV4QF4QPgy5GQ2IejfJY/Vk6nKegISVM74tzs+8THdbsEFYDo/lMEb93go/ YtXIUAl77/CepixIVzZI0CMnjWVE5H758/Wsq3XtY32WgIJiU3sPxOgCDcOX0Z9j51bH eMPp6s34CFrWEMnTdMw+Rl71CxZ2lU0h2AE2JX2IBxTaM4RHd0ELb/coPXhBGrC1Cu0r e8HA== X-Gm-Message-State: ALyK8tLmpi4yQTgVLrCCsYsMUbvt7gZAvdKL/wyG1tZ/cMF10A6tONqmtArR+0NlSdKd+kj96fwwLn/Nu6XlIQ== MIME-Version: 1.0 X-Received: by 10.55.168.3 with SMTP id r3mr2243623qke.24.1464079817777; Tue, 24 May 2016 01:50:17 -0700 (PDT) Received: by 10.55.8.142 with HTTP; Tue, 24 May 2016 01:50:17 -0700 (PDT) In-Reply-To: <12548318.auB4PSA3KC@wuerfel> References: <1464007448-25395-1-git-send-email-sudipm.mukherjee@gmail.com> <6297051.TAxtzW5OIB@wuerfel> <12548318.auB4PSA3KC@wuerfel> Date: Tue, 24 May 2016 10:50:17 +0200 Message-ID: Subject: Re: [PATCH] hwrng: stm32 - fix build warning From: Maxime Coquelin To: Arnd Bergmann Cc: "linux-arm-kernel@lists.infradead.org" , Sudip Mukherjee , Matt Mackall , Herbert Xu , "linux-kernel@vger.kernel.org" , linux-crypto@vger.kernel.org Sender: linux-crypto-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-crypto@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP 2016-05-24 10:32 GMT+02:00 Arnd Bergmann : > On Tuesday, May 24, 2016 9:59:41 AM CEST Maxime Coquelin wrote: >> 2016-05-23 22:35 GMT+02:00 Arnd Bergmann : >> > On Monday, May 23, 2016 6:14:08 PM CEST Sudip Mukherjee wrote: >> >> diff --git a/drivers/char/hw_random/stm32-rng.c b/drivers/char/hw_random/stm32-rng.c >> >> index 92a8106..0533370 100644 >> >> --- a/drivers/char/hw_random/stm32-rng.c >> >> +++ b/drivers/char/hw_random/stm32-rng.c >> >> @@ -52,7 +52,7 @@ static int stm32_rng_read(struct hwrng *rng, void *data, size_t max, bool wait) >> >> { >> >> struct stm32_rng_private *priv = >> >> container_of(rng, struct stm32_rng_private, rng); >> >> - u32 sr; >> >> + u32 sr = 0; >> >> int retval = 0; >> >> >> >> pm_runtime_get_sync((struct device *) priv->rng.priv); >> > >> > Does this work as well? >> > >> > diff --git a/drivers/char/hw_random/stm32-rng.c b/drivers/char/hw_random/stm32-rng.c >> > index 92a810648bd0..5c836b0afa40 100644 >> > --- a/drivers/char/hw_random/stm32-rng.c >> > +++ b/drivers/char/hw_random/stm32-rng.c >> > @@ -79,7 +79,7 @@ static int stm32_rng_read(struct hwrng *rng, void *data, size_t max, bool wait) >> > max -= sizeof(u32); >> > } >> > >> > - if (WARN_ONCE(sr & (RNG_SR_SEIS | RNG_SR_CEIS), >> > + if (WARN_ONCE(retval > 0 && (sr & (RNG_SR_SEIS | RNG_SR_CEIS)), >> > "bad RNG status - %x\n", sr)) >> > writel_relaxed(0, priv->base + RNG_SR); >> > >> > I think it would be nicer to not add a bogus initialization. >> Hmm, no sure this nicer. >> The while loop can break before retval is incremented when sr value is >> not expected (sr != RNG_SR_DRDY). >> In that case, we certainly want to print sr value. > > Ah, you are right. > >> Maybe the better way is just to initialize sr with status register content? > >> pm_runtime_get_sync((struct device *) priv->rng.priv); >> >>+ sr = readl_relaxed(priv->base + RNG_SR); >> while (max > sizeof(u32)) { >>- sr = readl_relaxed(priv->base + RNG_SR); >> if (!sr && wait) { >> unsigned int timeout = RNG_TIMEOUT; > > > I think that introduces a bug: you really want to read the status > register on each loop iteration. Actually, I read the status again at the end of the loop. But my implementation isn't good anyway, because I read the status register one time more every time. > > How about moving the error handling into the loop itself? That would be better, indeed, but there is one problem with your below proposal: > > Arnd > > > diff --git a/drivers/char/hw_random/stm32-rng.c b/drivers/char/hw_random/stm32-rng.c > index 92a810648bd0..fceacd809462 100644 > --- a/drivers/char/hw_random/stm32-rng.c > +++ b/drivers/char/hw_random/stm32-rng.c > @@ -59,6 +59,10 @@ static int stm32_rng_read(struct hwrng *rng, void *data, size_t max, bool wait) > > while (max > sizeof(u32)) { > sr = readl_relaxed(priv->base + RNG_SR); > + if (WARN_ONCE(sr & (RNG_SR_SEIS | RNG_SR_CEIS), > + "bad RNG status - %x\n", sr)) > + writel_relaxed(0, priv->base + RNG_SR); > + The error handling should be moved after the last status register read. > if (!sr && wait) { > unsigned int timeout = RNG_TIMEOUT; > > @@ -79,10 +83,6 @@ static int stm32_rng_read(struct hwrng *rng, void *data, size_t max, bool wait) > max -= sizeof(u32); > } > > - if (WARN_ONCE(sr & (RNG_SR_SEIS | RNG_SR_CEIS), > - "bad RNG status - %x\n", sr)) > - writel_relaxed(0, priv->base + RNG_SR); > - > pm_runtime_mark_last_busy((struct device *) priv->rng.priv); > pm_runtime_put_sync_autosuspend((struct device *) priv->rng.priv); break; @@ -79,10 +83,6 @@ static int stm32_rng_read(struct hwrng *rng, void *data, size_t max, bool wait) max -= sizeof(u32); } - if (WARN_ONCE(sr & (RNG_SR_SEIS | RNG_SR_CEIS), - "bad RNG status - %x\n", sr)) - writel_relaxed(0, priv->base + RNG_SR); - pm_runtime_mark_last_busy((struct device *) priv->rng.priv); pm_runtime_put_sync_autosuspend((struct device *) priv->rng.priv); Thanks, Maxime --- To unsubscribe from this list: send the line "unsubscribe linux-crypto" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/drivers/char/hw_random/stm32-rng.c b/drivers/char/hw_random/stm32-rng.c index 92a810648bd0..2a0fc90e4dc3 100644 --- a/drivers/char/hw_random/stm32-rng.c +++ b/drivers/char/hw_random/stm32-rng.c @@ -68,6 +68,10 @@ static int stm32_rng_read(struct hwrng *rng, void *data, size_t max, bool wait) } while (!sr && --timeout); } + if (WARN_ONCE(sr & (RNG_SR_SEIS | RNG_SR_CEIS), + "bad RNG status - %x\n", sr)) + writel_relaxed(0, priv->base + RNG_SR); + /* If error detected or data not ready... */ if (sr != RNG_SR_DRDY)