Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932945AbdC2XNE (ORCPT ); Wed, 29 Mar 2017 19:13:04 -0400 Received: from vps0.lunn.ch ([178.209.37.122]:39950 "EHLO vps0.lunn.ch" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753026AbdC2XNC (ORCPT ); Wed, 29 Mar 2017 19:13:02 -0400 Date: Thu, 30 Mar 2017 01:12:51 +0200 From: Andrew Lunn To: sean.wang@mediatek.com Cc: f.fainelli@gmail.com, vivien.didelot@savoirfairelinux.com, matthias.bgg@gmail.com, robh+dt@kernel.org, mark.rutland@arm.com, devicetree@vger.kernel.org, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, linux-mediatek@lists.infradead.org, davem@davemloft.net, Landen.Chao@mediatek.com, keyhaede@gmail.com, objelf@gmail.com Subject: Re: [PATCH net-next v3 5/5] net-next: dsa: add dsa support for Mediatek MT7530 switch Message-ID: <20170329231251.GH28922@lunn.ch> References: <1490780303-18598-1-git-send-email-sean.wang@mediatek.com> <1490780303-18598-6-git-send-email-sean.wang@mediatek.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1490780303-18598-6-git-send-email-sean.wang@mediatek.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: 1543 Lines: 60 > +static struct mt7530_priv *lpriv; Hi Sean Why do you need this global variable? What if somebody has two switches connected? > +static void mt7530_port_disable(struct dsa_switch *ds, int port, > + struct phy_device *phy); > +static int mt7530_cpu_port_enable(struct mt7530_priv *priv, > + int port); It is better to move the functions around than have forward declarations. > +static u32 > +_mt7530_read(u32 reg) > +{ > + struct mt7530_priv *priv = lpriv; > + struct mii_bus *bus = priv->bus; > + u32 val; > + > + mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); > + > + val = mt7530_mii_read(priv, reg); > + > + mutex_unlock(&bus->mdio_lock); > + > + return val; > +} > + > +static u32 > +mt7530_read(struct mt7530_priv *priv, u32 reg) > +{ > + return _mt7530_read(reg); > +} So here you would pass priv to _mt7530_read(). > +static int > +mt7530_fdb_cmd(struct mt7530_priv *priv, enum mt7530_fdb_cmd cmd, u32 *rsp) > +{ > + u32 val; > + int ret; > + > + /* Set the command operating upon the MAC address entries */ > + val = ATC_BUSY | ATC_MAT(0) | cmd; > + mt7530_write(priv, MT7530_ATC, val); > + > + ret = readx_poll_timeout(_mt7530_read, MT7530_ATC, val, > + !(val & ATC_BUSY), 20, 20000); This is where your need for lpriv comes, you can only pass a single argument. But you can work around it. readx_poll_timeout is a #define. So there is no type check for _mt7530_read, or the arg passed to it. So pass a struct containing the address and priv. I think you can then kill of your global lpriv. Andrew