Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933066AbbGJRKm (ORCPT ); Fri, 10 Jul 2015 13:10:42 -0400 Received: from mail-pd0-f174.google.com ([209.85.192.174]:35064 "EHLO mail-pd0-f174.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932590AbbGJRKc (ORCPT ); Fri, 10 Jul 2015 13:10:32 -0400 Date: Fri, 10 Jul 2015 10:10:27 -0700 From: Guenter To: Vivien Didelot Cc: netdev@vger.kernel.org, "David S. Miller" , Andrew Lunn , linux-kernel@vger.kernel.org, kernel@savoirfairelinux.com Subject: Re: [PATCH 1/2] net: dsa: mv88e6xxx: sleep in _mv88e6xxx_stats_wait Message-ID: <20150710171027.GB6585@groeck-UX31A> References: <1436547449-26927-1-git-send-email-vivien.didelot@savoirfairelinux.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1436547449-26927-1-git-send-email-vivien.didelot@savoirfairelinux.com> User-Agent: Mutt/1.5.21 (2010-09-15) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2122 Lines: 67 On Fri, Jul 10, 2015 at 12:57:28PM -0400, Vivien Didelot wrote: > The current _mv88e6xxx_stats_wait function does not sleep while testing > the stats busy bit. Fix this by using the generic _mv88e6xxx_wait > function. > > Note that it requires to move _mv88e6xxx_wait on top of > _mv88e6xxx_stats_wait to avoid undefined reference compilation error. > > Signed-off-by: Vivien Didelot > --- > drivers/net/dsa/mv88e6xxx.c | 52 +++++++++++++++++++-------------------------- > 1 file changed, 22 insertions(+), 30 deletions(-) > > diff --git a/drivers/net/dsa/mv88e6xxx.c b/drivers/net/dsa/mv88e6xxx.c > index f6c7409..7753db1 100644 > --- a/drivers/net/dsa/mv88e6xxx.c > +++ b/drivers/net/dsa/mv88e6xxx.c > @@ -557,19 +557,31 @@ static bool mv88e6xxx_6352_family(struct dsa_switch *ds) > return false; > } > > +/* Must be called with SMI lock held */ > +static int _mv88e6xxx_wait(struct dsa_switch *ds, int reg, int offset, > + u16 mask) > +{ > + unsigned long timeout = jiffies + HZ / 10; > + > + while (time_before(jiffies, timeout)) { > + int ret; > + > + ret = _mv88e6xxx_reg_read(ds, reg, offset); > + if (ret < 0) > + return ret; > + if (!(ret & mask)) > + return 0; > + > + usleep_range(1000, 2000); > + } > + return -ETIMEDOUT; > +} > + > /* Must be called with SMI mutex held */ > static int _mv88e6xxx_stats_wait(struct dsa_switch *ds) > { > - int ret; > - int i; > - > - for (i = 0; i < 10; i++) { > - ret = _mv88e6xxx_reg_read(ds, REG_GLOBAL, GLOBAL_STATS_OP); > - if ((ret & GLOBAL_STATS_OP_BUSY) == 0) > - return 0; > - } Hi Vivien, is this really beneficial and/or needed ? It adds at least 1ms delay to a loop which did not have any delay at all unless the register read itself was sleeping. Is the original function seen to return a timeout error under some circumstances ? Thanks, Guenter -- 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/