From patchwork Mon Jun 27 09:19:13 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Arnd Bergmann X-Patchwork-Id: 102084 Delivered-To: patch@linaro.org Received: by 10.140.28.4 with SMTP id 4csp971946qgy; Mon, 27 Jun 2016 02:18:17 -0700 (PDT) X-Received: by 10.66.25.133 with SMTP id c5mr32004405pag.103.1467019097840; Mon, 27 Jun 2016 02:18:17 -0700 (PDT) Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id j18si25588621pfk.49.2016.06.27.02.18.16; Mon, 27 Jun 2016 02:18:17 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751764AbcF0JSP (ORCPT + 30 others); Mon, 27 Jun 2016 05:18:15 -0400 Received: from mout.kundenserver.de ([217.72.192.73]:59214 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750736AbcF0JSN (ORCPT ); Mon, 27 Jun 2016 05:18:13 -0400 Received: from wuerfel.lan. ([78.42.132.4]) by mrelayeu.kundenserver.de (mreue102) with ESMTPA (Nemesis) id 0LkyOr-1brtMG06E9-00aoSC; Mon, 27 Jun 2016 11:18:05 +0200 From: Arnd Bergmann To: Florian Fainelli Cc: Arnd Bergmann , "David S. Miller" , netdev@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH] dsa: b53: avoid 'maybe-uninitialized' warning Date: Mon, 27 Jun 2016 11:19:13 +0200 Message-Id: <20160627091926.1377587-1-arnd@arndb.de> X-Mailer: git-send-email 2.9.0 X-Provags-ID: V03:K0:rTqWlHoQM5ee014qrEGg1VohNV00yuA0JUQlCpQVgDebMnRL8f5 og2C/PMKxNJpC417e/e4bSNEobIxaJSRUHxYguZlbaVonKmbGJlNzJhJ8vp3D9TLoGdbUZg xn5vgKlwhxAGq888qI+sZb+JEzSsDWSIa0SW63oyrJ3gLAth24qFNYyln03jj4bskYStBEz lnYG6Uesol2dSIJeffPZw== X-UI-Out-Filterresults: notjunk:1; V01:K0:Qkf6dywfs0I=:/e9O0mYBlc33RN3HFq91Jg s2WgsjzezjIXHon+3WRYCJFomreJeFbamaCG5cF234sWlbnDFr8rQWRUAtnFAVBf71xFBFJdL M2AzDAzRsu0zN6OgHxzWlenCeTZ+n9mIZY/N/QKuNXWAi6Jod4L1S/PT1+upOgbHd7wG033fK e1f/83jxNFrfynb7CncvMmMJ/iUFCeNkUeLq0V6bopnediotzOzfq+VwHCRcEBYzmNp5iAmVV M8YgDYQxs5KpIAQVflWl0EQgobmAXyoz8hYsCGFPJmWXyL8G1hezcu0pxS8lHh4anMuxa/IHY i7EPUjsgkcztxQQWdzixVNhMO241xen13mY41iPN5fadMO4iGYwqhpyBFVOd23tEvD8UH6vEr /2Obm8O3zTY6W4rEtH3ECA523t2BUfapzflfRIV0XZ45Ry4n1qcQNu5qEg0N4JRaiheLq1uDf /HSe9QzbZ5C3BaASBuhwedinFqEyJFlALt06hGeVtKZeCQIH0WpXN1iC3+j4UMf9kgGK9GGqh fvAQDAQeIkDfOLcFIRMmISTm5ZuLnrYHNVsOi8mFAKltdI4YJybJ2pF6RjRjA2Dd26gjo5YsL m5TO0Owf5mroANE2YbLC81Bo7vY+QAqbvnVXEpTq9obJNaVNzfIZx/XlnwF0yAzTsLMoNkSe5 Zmp6u8CT+sFKdx7oahN3IRpH2t7iTPHGpHWvooDRD4pmSSX3LVgzYEf3xhUhw1v9QXOU= Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org In some configurations, gcc produces a warning for correct code in this driver: drivers/net/dsa/b53/b53_mmap.c: In function 'b53_mmap_read64': drivers/net/dsa/b53/b53_mmap.c:107:10: error: 'hi' may be used uninitialized in this function [-Werror=maybe-uninitialized] *val = ((u64)hi << 32) | lo; ^~~~~~~ drivers/net/dsa/b53/b53_mmap.c: In function 'b53_mmap_read48': drivers/net/dsa/b53/b53_mmap.c:91:11: error: 'hi' may be used uninitialized in this function [-Werror=maybe-uninitialized] *val = ((u64)hi << 32) | lo; ^~~~~~~ drivers/net/dsa/b53/b53_mmap.c:83:11: error: 'hi' may be used uninitialized in this function [-Werror=maybe-uninitialized] *val = ((u64)hi << 16) | lo; I have seen the warning before and at the time thought I had fixed it with 55e7f6abe131 ("dsa: b53: fix big-endian register access"), however it now came back in a different randconfig build that happens to have different inlining decisions in the compiler. The mistake that gcc makes here is that it thinks the second call to readl() might fail because the address 'reg + 4' is not a multiple of four despite having knowing that 'reg' itself is a multiple of four. By open-coding the two reads without the redundant alignment check, we can avoid the warning and produce slightly better object code, but get slightly longer source code instead. Signed-off-by: Arnd Bergmann --- drivers/net/dsa/b53/b53_mmap.c | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) -- 2.9.0 diff --git a/drivers/net/dsa/b53/b53_mmap.c b/drivers/net/dsa/b53/b53_mmap.c index b70daf9174d4..21f1068b0804 100644 --- a/drivers/net/dsa/b53/b53_mmap.c +++ b/drivers/net/dsa/b53/b53_mmap.c @@ -70,6 +70,8 @@ static int b53_mmap_read32(struct b53_device *dev, u8 page, u8 reg, u32 *val) static int b53_mmap_read48(struct b53_device *dev, u8 page, u8 reg, u64 *val) { + u8 __iomem *regs = dev->priv; + if (WARN_ON(reg % 2)) return -EINVAL; @@ -77,16 +79,26 @@ static int b53_mmap_read48(struct b53_device *dev, u8 page, u8 reg, u64 *val) u16 lo; u32 hi; - b53_mmap_read16(dev, page, reg, &lo); - b53_mmap_read32(dev, page, reg + 2, &hi); + if (dev->pdata && dev->pdata->big_endian) { + lo = ioread16be(regs + (page << 8) + reg); + hi = ioread32be(regs + (page << 8) + reg + 2); + } else { + lo = readw(regs + (page << 8) + reg); + hi = readl(regs + (page << 8) + reg + 2); + } *val = ((u64)hi << 16) | lo; } else { u32 lo; u16 hi; - b53_mmap_read32(dev, page, reg, &lo); - b53_mmap_read16(dev, page, reg + 4, &hi); + if (dev->pdata && dev->pdata->big_endian) { + lo = ioread32be(regs + (page << 8) + reg); + hi = ioread16be(regs + (page << 8) + reg + 4); + } else { + lo = readl(regs + (page << 8) + reg); + hi = readw(regs + (page << 8) + reg + 4); + } *val = ((u64)hi << 32) | lo; } @@ -96,13 +108,19 @@ static int b53_mmap_read48(struct b53_device *dev, u8 page, u8 reg, u64 *val) static int b53_mmap_read64(struct b53_device *dev, u8 page, u8 reg, u64 *val) { + u8 __iomem *regs = dev->priv; u32 hi, lo; if (WARN_ON(reg % 4)) return -EINVAL; - b53_mmap_read32(dev, page, reg, &lo); - b53_mmap_read32(dev, page, reg + 4, &hi); + if (dev->pdata && dev->pdata->big_endian) { + lo = ioread32be(regs + (page << 8) + reg); + hi = ioread32be(regs + (page << 8) + reg + 4); + } else { + lo = readl(regs + (page << 8) + reg); + hi = readl(regs + (page << 8) + reg + 4); + } *val = ((u64)hi << 32) | lo;