Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754201AbYKPPdB (ORCPT ); Sun, 16 Nov 2008 10:33:01 -0500 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1752193AbYKPPct (ORCPT ); Sun, 16 Nov 2008 10:32:49 -0500 Received: from lanfw001a.cxnet.dk ([87.72.215.196]:45762 "EHLO lanfw001a.cxnet.dk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752114AbYKPPcs (ORCPT ); Sun, 16 Nov 2008 10:32:48 -0500 Subject: Re: [PATCH] niu: bitwise or does not imply ordering From: Jesper Dangaard Brouer Reply-To: jdb@comx.dk To: Milton Miller Cc: davem@davemloft.net, segher@kernel.crashing.org, linux-kernel@vger.kernel.org, netdev@vger.kernel.org, Ben Hutchings In-Reply-To: <312268717986b8b45674.846930886.miltonm@bga.com> References: <312268717986b8b45674.846930886.miltonm@bga.com> Content-Type: text/plain Content-Transfer-Encoding: 7bit Organization: ComX Networks A/S Date: Sun, 16 Nov 2008 16:32:05 +0100 Message-Id: <1226849525.8189.6.camel@localhost.localdomain> Mime-Version: 1.0 X-Mailer: Evolution 2.6.3 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2263 Lines: 63 I have tested it on the actual hardware, it works... I actually agree that we should make it explicit, eventhough DaveM seems to disagree on the netdev list. Signed-off-by: Jesper Dangaard Brouer Tested-by: Jesper Dangaard Brouer On Sun, 2008-11-16 at 15:43 -0600, Milton Miller wrote: > commit e23a59e1ca6d177a57a7791b3629db93ff1d9813 (niu: Fix readq > implementation when architecture does not provide one.) reordered the > arguments to a bitwise or to change the emitted code. However, C does > not guarantee the evaluation order. > > Split the line into two statements. While there, reduce some parens > by using two variables. > > Signed-off-By: Milton Miller > Acked-by: Segher Boessenkool > --- > complie tested on ppc6xx_defconfig, I have no hardware. > making the vars u64 saves the later cast with no signficiant codegen difference > > Index: work.git/drivers/net/niu.c > =================================================================== > --- work.git.orig/drivers/net/niu.c 2008-11-16 01:34:44.000000000 -0600 > +++ work.git/drivers/net/niu.c 2008-11-16 02:59:06.000000000 -0600 > @@ -51,7 +51,18 @@ MODULE_VERSION(DRV_MODULE_VERSION); > #ifndef readq > static u64 readq(void __iomem *reg) > { > - return ((u64) readl(reg)) | (((u64) readl(reg + 4UL)) << 32); > + u64 l, u; > + /* > + * The TX_CS register has counters in the upper 32-bits and state > + * bits in the lower 32-bits. A read clears the state bits. > + * > + * Therefore this driver must read the lower word then the upper one > + * when the architecture doesn't have an atomic readq. > + */ > + l = readl(reg); > + u = readl(reg + 4UL); > + > + return l | (u << 32); > } > > static void writeq(u64 val, void __iomem *reg) > -- Med venlig hilsen / Best regards Jesper Brouer ComX Networks A/S Linux Network developer Cand. Scient Datalog / MSc. Author of http://adsl-optimizer.dk LinkedIn: http://www.linkedin.com/in/brouer -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/