From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751749AbcF0JSP (ORCPT ); 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 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 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(-) 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; -- 2.9.0