From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 1DFAAC77B76 for ; Fri, 21 Apr 2023 18:59:25 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:Cc:List-Subscribe: List-Help:List-Post:List-Archive:List-Unsubscribe:List-Id:In-Reply-To: Content-Transfer-Encoding:Content-Type:MIME-Version:References:Message-ID: Subject:To:From:Date:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=XglpWxPmNTyeP3VKXyw6q/5B7BF2PKLy4QeJw7uH6Bk=; b=oT18kl2Qj/IYY2g/EzwqOZm9xr f+WFtE4Rm5GoQ3VgmonbMV51Of1qVKioRTuSWdfQ0akLNJRFTlWTKcXsetKX6qzKJ2jpAAi8Yqrsv +crF58oKRZCb39eFmLd3hCCoXn5OKncd0PLjsnFgUJyDVif5GmdkG45tQb8uaNPHsyGc5Jb0Tk3V9 t+ac2K4oTel8Dnu0rxYcjJQU8CzZnRKT49AL1XkOgNgj1JKiDH4Ksrd8f7LyV9QQ34NNeCeDn0FN9 ivXP+fXPHfDNxvLgsanOXTluMnfWlRbl/TnJR5y/Vyx+kAH0m19TsXGdep+k20P2UwvpQLvVCw57V 9UHQiOBA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1ppvyY-00BfpV-0r; Fri, 21 Apr 2023 18:59:18 +0000 Received: from fudo.makrotopia.org ([2a07:2ec0:3002::71]) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1ppvyT-00BfoP-2o; Fri, 21 Apr 2023 18:59:15 +0000 Received: from local by fudo.makrotopia.org with esmtpsa (TLS1.3:TLS_AES_256_GCM_SHA384:256) (Exim 4.96) (envelope-from ) id 1ppvy8-0002kb-09; Fri, 21 Apr 2023 20:58:52 +0200 Date: Fri, 21 Apr 2023 19:58:48 +0100 From: Daniel Golle To: arinc9.unal@gmail.com Subject: Re: [RFC PATCH net-next 21/22] net: dsa: mt7530: get rid of useless error returns on phylink code path Message-ID: References: <20230421143648.87889-1-arinc.unal@arinc9.com> <20230421143648.87889-22-arinc.unal@arinc9.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20230421143648.87889-22-arinc.unal@arinc9.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20230421_115914_061668_DD07BFB8 X-CRM114-Status: GOOD ( 29.53 ) X-BeenThere: linux-mediatek@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Andrew Lunn , Eric Dumazet , erkin.bozoglu@xeront.com, Florian Fainelli , Russell King , Richard van Schagen , Jakub Kicinski , Paolo Abeni , Landen Chao , Richard van Schagen , Sean Wang , DENG Qingfang , linux-mediatek@lists.infradead.org, Matthias Brugger , linux-arm-kernel@lists.infradead.org, AngeloGioacchino Del Regno , =?utf-8?B?QXLEsW7DpyDDnE5BTA==?= , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Vladimir Oltean , "David S. Miller" Sender: "Linux-mediatek" Errors-To: linux-mediatek-bounces+linux-mediatek=archiver.kernel.org@lists.infradead.org On Fri, Apr 21, 2023 at 05:36:47PM +0300, arinc9.unal@gmail.com wrote: > From: Arınç ÜNAL > > Remove error returns on the cases where they are already handled with the > function the mac_port_get_caps member points to. > > mt7531_mac_config() is also called from mt7531_cpu_port_config() outside of > phylink but the port and interface modes are already handled there. > > Change the functions and the mac_port_config function pointer to void now > that there're no error returns anymore. > > Remove mt753x_is_mac_port() that used to help the said error returns. > > On mt7531_mac_config(), switch to if statements to simplify the code. > > Remove internal phy cases from mt753x_phylink_mac_config() as there is no > configuration to be done for them. There's also no need to check the > interface mode as that's already handled with the function the > mac_port_get_caps member points to. > > Tested-by: Arınç ÜNAL > Signed-off-by: Arınç ÜNAL Acked-by: Daniel Golle Tested-by: Daniel Golle (on BPi-R3 MT7986A+MT7531AE, BPi-R64 MT7622+MT7531BE and MT7988A rfb) > --- > drivers/net/dsa/mt7530.c | 81 ++++++++-------------------------------- > drivers/net/dsa/mt7530.h | 2 +- > 2 files changed, 17 insertions(+), 66 deletions(-) > > diff --git a/drivers/net/dsa/mt7530.c b/drivers/net/dsa/mt7530.c > index 8ece3d0d820c..3d19e06061cb 100644 > --- a/drivers/net/dsa/mt7530.c > +++ b/drivers/net/dsa/mt7530.c > @@ -2556,7 +2556,7 @@ static void mt7988_mac_port_get_caps(struct dsa_switch *ds, int port, > } > } > > -static int > +static void > mt7530_mac_config(struct dsa_switch *ds, int port, unsigned int mode, > phy_interface_t interface) > { > @@ -2567,22 +2567,14 @@ mt7530_mac_config(struct dsa_switch *ds, int port, unsigned int mode, > } else if (port == 6) { > mt7530_setup_port6(priv->ds, interface); > } > - > - return 0; > } > > -static int mt7531_rgmii_setup(struct mt7530_priv *priv, u32 port, > - phy_interface_t interface, > - struct phy_device *phydev) > +static void mt7531_rgmii_setup(struct mt7530_priv *priv, u32 port, > + phy_interface_t interface, > + struct phy_device *phydev) > { > u32 val; > > - if (priv->p5_sgmii) { > - dev_err(priv->dev, "RGMII mode is not available for port %d\n", > - port); > - return -EINVAL; > - } > - > val = mt7530_read(priv, MT7531_CLKGEN_CTRL); > val |= GP_CLK_EN; > val &= ~GP_MODE_MASK; > @@ -2610,20 +2602,14 @@ static int mt7531_rgmii_setup(struct mt7530_priv *priv, u32 port, > case PHY_INTERFACE_MODE_RGMII_ID: > break; > default: > - return -EINVAL; > + break; > } > } > - mt7530_write(priv, MT7531_CLKGEN_CTRL, val); > > - return 0; > -} > - > -static bool mt753x_is_mac_port(u32 port) > -{ > - return (port == 5 || port == 6); > + mt7530_write(priv, MT7531_CLKGEN_CTRL, val); > } > > -static int > +static void > mt7531_mac_config(struct dsa_switch *ds, int port, unsigned int mode, > phy_interface_t interface) > { > @@ -2631,42 +2617,21 @@ mt7531_mac_config(struct dsa_switch *ds, int port, unsigned int mode, > struct phy_device *phydev; > struct dsa_port *dp; > > - if (!mt753x_is_mac_port(port)) { > - dev_err(priv->dev, "port %d is not a MAC port\n", port); > - return -EINVAL; > - } > - > - switch (interface) { > - case PHY_INTERFACE_MODE_RGMII: > - case PHY_INTERFACE_MODE_RGMII_ID: > - case PHY_INTERFACE_MODE_RGMII_RXID: > - case PHY_INTERFACE_MODE_RGMII_TXID: > + if (phy_interface_mode_is_rgmii(interface)) { > dp = dsa_to_port(ds, port); > phydev = dp->slave->phydev; > - return mt7531_rgmii_setup(priv, port, interface, phydev); > - case PHY_INTERFACE_MODE_SGMII: > - case PHY_INTERFACE_MODE_NA: > - case PHY_INTERFACE_MODE_1000BASEX: > - case PHY_INTERFACE_MODE_2500BASEX: > - /* handled in SGMII PCS driver */ > - return 0; > - default: > - return -EINVAL; > + mt7531_rgmii_setup(priv, port, interface, phydev); > } > - > - return -EINVAL; > } > > -static int > +static void > mt753x_mac_config(struct dsa_switch *ds, int port, unsigned int mode, > const struct phylink_link_state *state) > { > struct mt7530_priv *priv = ds->priv; > > - if (!priv->info->mac_port_config) > - return 0; > - > - return priv->info->mac_port_config(ds, port, mode, state->interface); > + if (priv->info->mac_port_config) > + priv->info->mac_port_config(ds, port, mode, state->interface); > } > > static struct phylink_pcs * > @@ -2695,30 +2660,18 @@ mt753x_phylink_mac_config(struct dsa_switch *ds, int port, unsigned int mode, > u32 mcr_cur, mcr_new; > > switch (port) { > - case 0 ... 4: /* Internal phy */ > - if (state->interface != PHY_INTERFACE_MODE_GMII && > - state->interface != PHY_INTERFACE_MODE_INTERNAL) > - goto unsupported; > - break; > case 5: /* Port 5, can be used as a CPU port. */ > if (priv->p5_configured) > break; > > - if (mt753x_mac_config(ds, port, mode, state) < 0) > - goto unsupported; > + mt753x_mac_config(ds, port, mode, state); > break; > case 6: /* Port 6, can be used as a CPU port. */ > if (priv->p6_configured) > break; > > - if (mt753x_mac_config(ds, port, mode, state) < 0) > - goto unsupported; > + mt753x_mac_config(ds, port, mode, state); > break; > - default: > -unsupported: > - dev_err(ds->dev, "%s: unsupported %s port: %i\n", > - __func__, phy_modes(state->interface), port); > - return; > } > > mcr_cur = mt7530_read(priv, MT7530_PMCR_P(port)); > @@ -2811,7 +2764,6 @@ mt7531_cpu_port_config(struct dsa_switch *ds, int port) > struct mt7530_priv *priv = ds->priv; > phy_interface_t interface; > int speed; > - int ret; > > switch (port) { > case 5: > @@ -2836,9 +2788,8 @@ mt7531_cpu_port_config(struct dsa_switch *ds, int port) > else > speed = SPEED_1000; > > - ret = mt7531_mac_config(ds, port, MLO_AN_FIXED, interface); > - if (ret) > - return ret; > + mt7531_mac_config(ds, port, MLO_AN_FIXED, interface); > + > mt7530_write(priv, MT7530_PMCR_P(port), > PMCR_CPU_PORT_SETTING(priv->id)); > mt753x_phylink_pcs_link_up(&priv->pcs[port].pcs, MLO_AN_FIXED, > diff --git a/drivers/net/dsa/mt7530.h b/drivers/net/dsa/mt7530.h > index cad9115de22b..ee2b3d2d6258 100644 > --- a/drivers/net/dsa/mt7530.h > +++ b/drivers/net/dsa/mt7530.h > @@ -722,7 +722,7 @@ struct mt753x_info { > void (*mac_port_validate)(struct dsa_switch *ds, int port, > phy_interface_t interface, > unsigned long *supported); > - int (*mac_port_config)(struct dsa_switch *ds, int port, > + void (*mac_port_config)(struct dsa_switch *ds, int port, > unsigned int mode, > phy_interface_t interface); > }; > -- > 2.37.2 > From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id F3D34C77B78 for ; Fri, 21 Apr 2023 19:00:20 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:References: Message-ID:Subject:Cc:To:From:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=t32cUdfHBk7cyAUyCZMulXKdC1ESIS5TMjZzOkf44Cs=; b=0HLPYVR6P0WKIU CT9SR+w8J4GIz/+0+2virG2lTyBjjGYjsRnI30C1XtGe6/IhnozKiEAC9SPmb67Rw42lTwwUT/U3T KXwop43NlYcJ0Yyz44GrM7zLJDrkQyrr3rF1Hk7xlMy8It6SKFP5531jgo3eqFabwEk+uxZp6DvGs oXw7Z79Yb2dpiVy6ukSm19yjSddDSK960o64Gazt1WF8h26ORpDBvavM5+xW2V1DM6glIGW2t0oK+ /9xZfsV43Sh9Nc4gX4iz1eq15mxlKIsH6sneg5vNED4Ru3FYrQPgI/k3mXy6IQ7dQgUpK5GFRfMRl WBBF9ogKNjca4BuhTjrw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1ppvyX-00BfpM-1W; Fri, 21 Apr 2023 18:59:17 +0000 Received: from fudo.makrotopia.org ([2a07:2ec0:3002::71]) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1ppvyT-00BfoP-2o; Fri, 21 Apr 2023 18:59:15 +0000 Received: from local by fudo.makrotopia.org with esmtpsa (TLS1.3:TLS_AES_256_GCM_SHA384:256) (Exim 4.96) (envelope-from ) id 1ppvy8-0002kb-09; Fri, 21 Apr 2023 20:58:52 +0200 Date: Fri, 21 Apr 2023 19:58:48 +0100 From: Daniel Golle To: arinc9.unal@gmail.com Cc: Sean Wang , Landen Chao , DENG Qingfang , Andrew Lunn , Florian Fainelli , Vladimir Oltean , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Matthias Brugger , AngeloGioacchino Del Regno , Russell King , =?utf-8?B?QXLEsW7DpyDDnE5BTA==?= , Richard van Schagen , Richard van Schagen , Frank Wunderlich , erkin.bozoglu@xeront.com, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-mediatek@lists.infradead.org Subject: Re: [RFC PATCH net-next 21/22] net: dsa: mt7530: get rid of useless error returns on phylink code path Message-ID: References: <20230421143648.87889-1-arinc.unal@arinc9.com> <20230421143648.87889-22-arinc.unal@arinc9.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20230421143648.87889-22-arinc.unal@arinc9.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20230421_115914_061668_DD07BFB8 X-CRM114-Status: GOOD ( 29.53 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org T24gRnJpLCBBcHIgMjEsIDIwMjMgYXQgMDU6MzY6NDdQTSArMDMwMCwgYXJpbmM5LnVuYWxAZ21h aWwuY29tIHdyb3RlOgo+IEZyb206IEFyxLFuw6cgw5xOQUwgPGFyaW5jLnVuYWxAYXJpbmM5LmNv bT4KPiAKPiBSZW1vdmUgZXJyb3IgcmV0dXJucyBvbiB0aGUgY2FzZXMgd2hlcmUgdGhleSBhcmUg YWxyZWFkeSBoYW5kbGVkIHdpdGggdGhlCj4gZnVuY3Rpb24gdGhlIG1hY19wb3J0X2dldF9jYXBz IG1lbWJlciBwb2ludHMgdG8uCj4gCj4gbXQ3NTMxX21hY19jb25maWcoKSBpcyBhbHNvIGNhbGxl ZCBmcm9tIG10NzUzMV9jcHVfcG9ydF9jb25maWcoKSBvdXRzaWRlIG9mCj4gcGh5bGluayBidXQg dGhlIHBvcnQgYW5kIGludGVyZmFjZSBtb2RlcyBhcmUgYWxyZWFkeSBoYW5kbGVkIHRoZXJlLgo+ IAo+IENoYW5nZSB0aGUgZnVuY3Rpb25zIGFuZCB0aGUgbWFjX3BvcnRfY29uZmlnIGZ1bmN0aW9u IHBvaW50ZXIgdG8gdm9pZCBub3cKPiB0aGF0IHRoZXJlJ3JlIG5vIGVycm9yIHJldHVybnMgYW55 bW9yZS4KPiAKPiBSZW1vdmUgbXQ3NTN4X2lzX21hY19wb3J0KCkgdGhhdCB1c2VkIHRvIGhlbHAg dGhlIHNhaWQgZXJyb3IgcmV0dXJucy4KPiAKPiBPbiBtdDc1MzFfbWFjX2NvbmZpZygpLCBzd2l0 Y2ggdG8gaWYgc3RhdGVtZW50cyB0byBzaW1wbGlmeSB0aGUgY29kZS4KPiAKPiBSZW1vdmUgaW50 ZXJuYWwgcGh5IGNhc2VzIGZyb20gbXQ3NTN4X3BoeWxpbmtfbWFjX2NvbmZpZygpIGFzIHRoZXJl IGlzIG5vCj4gY29uZmlndXJhdGlvbiB0byBiZSBkb25lIGZvciB0aGVtLiBUaGVyZSdzIGFsc28g bm8gbmVlZCB0byBjaGVjayB0aGUKPiBpbnRlcmZhY2UgbW9kZSBhcyB0aGF0J3MgYWxyZWFkeSBo YW5kbGVkIHdpdGggdGhlIGZ1bmN0aW9uIHRoZQo+IG1hY19wb3J0X2dldF9jYXBzIG1lbWJlciBw b2ludHMgdG8uCj4gCj4gVGVzdGVkLWJ5OiBBcsSxbsOnIMOcTkFMIDxhcmluYy51bmFsQGFyaW5j OS5jb20+Cj4gU2lnbmVkLW9mZi1ieTogQXLEsW7DpyDDnE5BTCA8YXJpbmMudW5hbEBhcmluYzku Y29tPgoKQWNrZWQtYnk6IERhbmllbCBHb2xsZSA8ZGFuaWVsQG1ha3JvdG9waWEub3JnPgpUZXN0 ZWQtYnk6IERhbmllbCBHb2xsZSA8ZGFuaWVsQG1ha3JvdG9waWEub3JnPgoob24gQlBpLVIzIE1U Nzk4NkErTVQ3NTMxQUUsIEJQaS1SNjQgTVQ3NjIyK01UNzUzMUJFIGFuZCBNVDc5ODhBIHJmYikK Cj4gLS0tCj4gIGRyaXZlcnMvbmV0L2RzYS9tdDc1MzAuYyB8IDgxICsrKysrKysrLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KPiAgZHJpdmVycy9uZXQvZHNhL210NzUzMC5oIHwgIDIg Ky0KPiAgMiBmaWxlcyBjaGFuZ2VkLCAxNyBpbnNlcnRpb25zKCspLCA2NiBkZWxldGlvbnMoLSkK PiAKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZHNhL210NzUzMC5jIGIvZHJpdmVycy9uZXQv ZHNhL210NzUzMC5jCj4gaW5kZXggOGVjZTNkMGQ4MjBjLi4zZDE5ZTA2MDYxY2IgMTAwNjQ0Cj4g LS0tIGEvZHJpdmVycy9uZXQvZHNhL210NzUzMC5jCj4gKysrIGIvZHJpdmVycy9uZXQvZHNhL210 NzUzMC5jCj4gQEAgLTI1NTYsNyArMjU1Niw3IEBAIHN0YXRpYyB2b2lkIG10Nzk4OF9tYWNfcG9y dF9nZXRfY2FwcyhzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LAo+ICAJfQo+ICB9Cj4g IAo+IC1zdGF0aWMgaW50Cj4gK3N0YXRpYyB2b2lkCj4gIG10NzUzMF9tYWNfY29uZmlnKHN0cnVj dCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsIHVuc2lnbmVkIGludCBtb2RlLAo+ICAJCSAgcGh5 X2ludGVyZmFjZV90IGludGVyZmFjZSkKPiAgewo+IEBAIC0yNTY3LDIyICsyNTY3LDE0IEBAIG10 NzUzMF9tYWNfY29uZmlnKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsIHVuc2lnbmVk IGludCBtb2RlLAo+ICAJfSBlbHNlIGlmIChwb3J0ID09IDYpIHsKPiAgCQltdDc1MzBfc2V0dXBf cG9ydDYocHJpdi0+ZHMsIGludGVyZmFjZSk7Cj4gIAl9Cj4gLQo+IC0JcmV0dXJuIDA7Cj4gIH0K PiAgCj4gLXN0YXRpYyBpbnQgbXQ3NTMxX3JnbWlpX3NldHVwKHN0cnVjdCBtdDc1MzBfcHJpdiAq cHJpdiwgdTMyIHBvcnQsCj4gLQkJCSAgICAgIHBoeV9pbnRlcmZhY2VfdCBpbnRlcmZhY2UsCj4g LQkJCSAgICAgIHN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYpCj4gK3N0YXRpYyB2b2lkIG10NzUz MV9yZ21paV9zZXR1cChzdHJ1Y3QgbXQ3NTMwX3ByaXYgKnByaXYsIHUzMiBwb3J0LAo+ICsJCQkg ICAgICAgcGh5X2ludGVyZmFjZV90IGludGVyZmFjZSwKPiArCQkJICAgICAgIHN0cnVjdCBwaHlf ZGV2aWNlICpwaHlkZXYpCj4gIHsKPiAgCXUzMiB2YWw7Cj4gIAo+IC0JaWYgKHByaXYtPnA1X3Nn bWlpKSB7Cj4gLQkJZGV2X2Vycihwcml2LT5kZXYsICJSR01JSSBtb2RlIGlzIG5vdCBhdmFpbGFi bGUgZm9yIHBvcnQgJWRcbiIsCj4gLQkJCXBvcnQpOwo+IC0JCXJldHVybiAtRUlOVkFMOwo+IC0J fQo+IC0KPiAgCXZhbCA9IG10NzUzMF9yZWFkKHByaXYsIE1UNzUzMV9DTEtHRU5fQ1RSTCk7Cj4g IAl2YWwgfD0gR1BfQ0xLX0VOOwo+ICAJdmFsICY9IH5HUF9NT0RFX01BU0s7Cj4gQEAgLTI2MTAs MjAgKzI2MDIsMTQgQEAgc3RhdGljIGludCBtdDc1MzFfcmdtaWlfc2V0dXAoc3RydWN0IG10NzUz MF9wcml2ICpwcml2LCB1MzIgcG9ydCwKPiAgCQljYXNlIFBIWV9JTlRFUkZBQ0VfTU9ERV9SR01J SV9JRDoKPiAgCQkJYnJlYWs7Cj4gIAkJZGVmYXVsdDoKPiAtCQkJcmV0dXJuIC1FSU5WQUw7Cj4g KwkJCWJyZWFrOwo+ICAJCX0KPiAgCX0KPiAtCW10NzUzMF93cml0ZShwcml2LCBNVDc1MzFfQ0xL R0VOX0NUUkwsIHZhbCk7Cj4gIAo+IC0JcmV0dXJuIDA7Cj4gLX0KPiAtCj4gLXN0YXRpYyBib29s IG10NzUzeF9pc19tYWNfcG9ydCh1MzIgcG9ydCkKPiAtewo+IC0JcmV0dXJuIChwb3J0ID09IDUg fHwgcG9ydCA9PSA2KTsKPiArCW10NzUzMF93cml0ZShwcml2LCBNVDc1MzFfQ0xLR0VOX0NUUkws IHZhbCk7Cj4gIH0KPiAgCj4gLXN0YXRpYyBpbnQKPiArc3RhdGljIHZvaWQKPiAgbXQ3NTMxX21h Y19jb25maWcoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwgdW5zaWduZWQgaW50IG1v ZGUsCj4gIAkJICBwaHlfaW50ZXJmYWNlX3QgaW50ZXJmYWNlKQo+ICB7Cj4gQEAgLTI2MzEsNDIg KzI2MTcsMjEgQEAgbXQ3NTMxX21hY19jb25maWcoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQg cG9ydCwgdW5zaWduZWQgaW50IG1vZGUsCj4gIAlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2Owo+ ICAJc3RydWN0IGRzYV9wb3J0ICpkcDsKPiAgCj4gLQlpZiAoIW10NzUzeF9pc19tYWNfcG9ydChw b3J0KSkgewo+IC0JCWRldl9lcnIocHJpdi0+ZGV2LCAicG9ydCAlZCBpcyBub3QgYSBNQUMgcG9y dFxuIiwgcG9ydCk7Cj4gLQkJcmV0dXJuIC1FSU5WQUw7Cj4gLQl9Cj4gLQo+IC0Jc3dpdGNoIChp bnRlcmZhY2UpIHsKPiAtCWNhc2UgUEhZX0lOVEVSRkFDRV9NT0RFX1JHTUlJOgo+IC0JY2FzZSBQ SFlfSU5URVJGQUNFX01PREVfUkdNSUlfSUQ6Cj4gLQljYXNlIFBIWV9JTlRFUkZBQ0VfTU9ERV9S R01JSV9SWElEOgo+IC0JY2FzZSBQSFlfSU5URVJGQUNFX01PREVfUkdNSUlfVFhJRDoKPiArCWlm IChwaHlfaW50ZXJmYWNlX21vZGVfaXNfcmdtaWkoaW50ZXJmYWNlKSkgewo+ICAJCWRwID0gZHNh X3RvX3BvcnQoZHMsIHBvcnQpOwo+ICAJCXBoeWRldiA9IGRwLT5zbGF2ZS0+cGh5ZGV2Owo+IC0J CXJldHVybiBtdDc1MzFfcmdtaWlfc2V0dXAocHJpdiwgcG9ydCwgaW50ZXJmYWNlLCBwaHlkZXYp Owo+IC0JY2FzZSBQSFlfSU5URVJGQUNFX01PREVfU0dNSUk6Cj4gLQljYXNlIFBIWV9JTlRFUkZB Q0VfTU9ERV9OQToKPiAtCWNhc2UgUEhZX0lOVEVSRkFDRV9NT0RFXzEwMDBCQVNFWDoKPiAtCWNh c2UgUEhZX0lOVEVSRkFDRV9NT0RFXzI1MDBCQVNFWDoKPiAtCQkvKiBoYW5kbGVkIGluIFNHTUlJ IFBDUyBkcml2ZXIgKi8KPiAtCQlyZXR1cm4gMDsKPiAtCWRlZmF1bHQ6Cj4gLQkJcmV0dXJuIC1F SU5WQUw7Cj4gKwkJbXQ3NTMxX3JnbWlpX3NldHVwKHByaXYsIHBvcnQsIGludGVyZmFjZSwgcGh5 ZGV2KTsKPiAgCX0KPiAtCj4gLQlyZXR1cm4gLUVJTlZBTDsKPiAgfQo+ICAKPiAtc3RhdGljIGlu dAo+ICtzdGF0aWMgdm9pZAo+ICBtdDc1M3hfbWFjX2NvbmZpZyhzdHJ1Y3QgZHNhX3N3aXRjaCAq ZHMsIGludCBwb3J0LCB1bnNpZ25lZCBpbnQgbW9kZSwKPiAgCQkgIGNvbnN0IHN0cnVjdCBwaHls aW5rX2xpbmtfc3RhdGUgKnN0YXRlKQo+ICB7Cj4gIAlzdHJ1Y3QgbXQ3NTMwX3ByaXYgKnByaXYg PSBkcy0+cHJpdjsKPiAgCj4gLQlpZiAoIXByaXYtPmluZm8tPm1hY19wb3J0X2NvbmZpZykKPiAt CQlyZXR1cm4gMDsKPiAtCj4gLQlyZXR1cm4gcHJpdi0+aW5mby0+bWFjX3BvcnRfY29uZmlnKGRz LCBwb3J0LCBtb2RlLCBzdGF0ZS0+aW50ZXJmYWNlKTsKPiArCWlmIChwcml2LT5pbmZvLT5tYWNf cG9ydF9jb25maWcpCj4gKwkJcHJpdi0+aW5mby0+bWFjX3BvcnRfY29uZmlnKGRzLCBwb3J0LCBt b2RlLCBzdGF0ZS0+aW50ZXJmYWNlKTsKPiAgfQo+ICAKPiAgc3RhdGljIHN0cnVjdCBwaHlsaW5r X3BjcyAqCj4gQEAgLTI2OTUsMzAgKzI2NjAsMTggQEAgbXQ3NTN4X3BoeWxpbmtfbWFjX2NvbmZp ZyhzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LCB1bnNpZ25lZCBpbnQgbW9kZSwKPiAg CXUzMiBtY3JfY3VyLCBtY3JfbmV3Owo+ICAKPiAgCXN3aXRjaCAocG9ydCkgewo+IC0JY2FzZSAw IC4uLiA0OiAvKiBJbnRlcm5hbCBwaHkgKi8KPiAtCQlpZiAoc3RhdGUtPmludGVyZmFjZSAhPSBQ SFlfSU5URVJGQUNFX01PREVfR01JSSAmJgo+IC0JCSAgICBzdGF0ZS0+aW50ZXJmYWNlICE9IFBI WV9JTlRFUkZBQ0VfTU9ERV9JTlRFUk5BTCkKPiAtCQkJZ290byB1bnN1cHBvcnRlZDsKPiAtCQli cmVhazsKPiAgCWNhc2UgNTogLyogUG9ydCA1LCBjYW4gYmUgdXNlZCBhcyBhIENQVSBwb3J0LiAq Lwo+ICAJCWlmIChwcml2LT5wNV9jb25maWd1cmVkKQo+ICAJCQlicmVhazsKPiAgCj4gLQkJaWYg KG10NzUzeF9tYWNfY29uZmlnKGRzLCBwb3J0LCBtb2RlLCBzdGF0ZSkgPCAwKQo+IC0JCQlnb3Rv IHVuc3VwcG9ydGVkOwo+ICsJCW10NzUzeF9tYWNfY29uZmlnKGRzLCBwb3J0LCBtb2RlLCBzdGF0 ZSk7Cj4gIAkJYnJlYWs7Cj4gIAljYXNlIDY6IC8qIFBvcnQgNiwgY2FuIGJlIHVzZWQgYXMgYSBD UFUgcG9ydC4gKi8KPiAgCQlpZiAocHJpdi0+cDZfY29uZmlndXJlZCkKPiAgCQkJYnJlYWs7Cj4g IAo+IC0JCWlmIChtdDc1M3hfbWFjX2NvbmZpZyhkcywgcG9ydCwgbW9kZSwgc3RhdGUpIDwgMCkK PiAtCQkJZ290byB1bnN1cHBvcnRlZDsKPiArCQltdDc1M3hfbWFjX2NvbmZpZyhkcywgcG9ydCwg bW9kZSwgc3RhdGUpOwo+ICAJCWJyZWFrOwo+IC0JZGVmYXVsdDoKPiAtdW5zdXBwb3J0ZWQ6Cj4g LQkJZGV2X2Vycihkcy0+ZGV2LCAiJXM6IHVuc3VwcG9ydGVkICVzIHBvcnQ6ICVpXG4iLAo+IC0J CQlfX2Z1bmNfXywgcGh5X21vZGVzKHN0YXRlLT5pbnRlcmZhY2UpLCBwb3J0KTsKPiAtCQlyZXR1 cm47Cj4gIAl9Cj4gIAo+ICAJbWNyX2N1ciA9IG10NzUzMF9yZWFkKHByaXYsIE1UNzUzMF9QTUNS X1AocG9ydCkpOwo+IEBAIC0yODExLDcgKzI3NjQsNiBAQCBtdDc1MzFfY3B1X3BvcnRfY29uZmln KHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQpCj4gIAlzdHJ1Y3QgbXQ3NTMwX3ByaXYg KnByaXYgPSBkcy0+cHJpdjsKPiAgCXBoeV9pbnRlcmZhY2VfdCBpbnRlcmZhY2U7Cj4gIAlpbnQg c3BlZWQ7Cj4gLQlpbnQgcmV0Owo+ICAKPiAgCXN3aXRjaCAocG9ydCkgewo+ICAJY2FzZSA1Ogo+ IEBAIC0yODM2LDkgKzI3ODgsOCBAQCBtdDc1MzFfY3B1X3BvcnRfY29uZmlnKHN0cnVjdCBkc2Ff c3dpdGNoICpkcywgaW50IHBvcnQpCj4gIAllbHNlCj4gIAkJc3BlZWQgPSBTUEVFRF8xMDAwOwo+ ICAKPiAtCXJldCA9IG10NzUzMV9tYWNfY29uZmlnKGRzLCBwb3J0LCBNTE9fQU5fRklYRUQsIGlu dGVyZmFjZSk7Cj4gLQlpZiAocmV0KQo+IC0JCXJldHVybiByZXQ7Cj4gKwltdDc1MzFfbWFjX2Nv bmZpZyhkcywgcG9ydCwgTUxPX0FOX0ZJWEVELCBpbnRlcmZhY2UpOwo+ICsKPiAgCW10NzUzMF93 cml0ZShwcml2LCBNVDc1MzBfUE1DUl9QKHBvcnQpLAo+ICAJCSAgICAgUE1DUl9DUFVfUE9SVF9T RVRUSU5HKHByaXYtPmlkKSk7Cj4gIAltdDc1M3hfcGh5bGlua19wY3NfbGlua191cCgmcHJpdi0+ cGNzW3BvcnRdLnBjcywgTUxPX0FOX0ZJWEVELAo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9k c2EvbXQ3NTMwLmggYi9kcml2ZXJzL25ldC9kc2EvbXQ3NTMwLmgKPiBpbmRleCBjYWQ5MTE1ZGUy MmIuLmVlMmIzZDJkNjI1OCAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL25ldC9kc2EvbXQ3NTMwLmgK PiArKysgYi9kcml2ZXJzL25ldC9kc2EvbXQ3NTMwLmgKPiBAQCAtNzIyLDcgKzcyMiw3IEBAIHN0 cnVjdCBtdDc1M3hfaW5mbyB7Cj4gIAl2b2lkICgqbWFjX3BvcnRfdmFsaWRhdGUpKHN0cnVjdCBk c2Ffc3dpdGNoICpkcywgaW50IHBvcnQsCj4gIAkJCQkgIHBoeV9pbnRlcmZhY2VfdCBpbnRlcmZh Y2UsCj4gIAkJCQkgIHVuc2lnbmVkIGxvbmcgKnN1cHBvcnRlZCk7Cj4gLQlpbnQgKCptYWNfcG9y dF9jb25maWcpKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsCj4gKwl2b2lkICgqbWFj X3BvcnRfY29uZmlnKShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LAo+ICAJCQkgICAg ICAgdW5zaWduZWQgaW50IG1vZGUsCj4gIAkJCSAgICAgICBwaHlfaW50ZXJmYWNlX3QgaW50ZXJm YWNlKTsKPiAgfTsKPiAtLSAKPiAyLjM3LjIKPiAKCl9fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fCmxpbnV4LWFybS1rZXJuZWwgbWFpbGluZyBsaXN0CmxpbnV4 LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9y Zy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LWFybS1rZXJuZWwK From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 790F4C7618E for ; Fri, 21 Apr 2023 18:59:16 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233371AbjDUS7P (ORCPT ); Fri, 21 Apr 2023 14:59:15 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57226 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232311AbjDUS7M (ORCPT ); Fri, 21 Apr 2023 14:59:12 -0400 Received: from fudo.makrotopia.org (fudo.makrotopia.org [IPv6:2a07:2ec0:3002::71]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 2D7BB2D4B; Fri, 21 Apr 2023 11:59:11 -0700 (PDT) Received: from local by fudo.makrotopia.org with esmtpsa (TLS1.3:TLS_AES_256_GCM_SHA384:256) (Exim 4.96) (envelope-from ) id 1ppvy8-0002kb-09; Fri, 21 Apr 2023 20:58:52 +0200 Date: Fri, 21 Apr 2023 19:58:48 +0100 From: Daniel Golle To: arinc9.unal@gmail.com Cc: Sean Wang , Landen Chao , DENG Qingfang , Andrew Lunn , Florian Fainelli , Vladimir Oltean , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Matthias Brugger , AngeloGioacchino Del Regno , Russell King , =?utf-8?B?QXLEsW7DpyDDnE5BTA==?= , Richard van Schagen , Richard van Schagen , Frank Wunderlich , erkin.bozoglu@xeront.com, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-mediatek@lists.infradead.org Subject: Re: [RFC PATCH net-next 21/22] net: dsa: mt7530: get rid of useless error returns on phylink code path Message-ID: References: <20230421143648.87889-1-arinc.unal@arinc9.com> <20230421143648.87889-22-arinc.unal@arinc9.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20230421143648.87889-22-arinc.unal@arinc9.com> Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Fri, Apr 21, 2023 at 05:36:47PM +0300, arinc9.unal@gmail.com wrote: > From: Arınç ÜNAL > > Remove error returns on the cases where they are already handled with the > function the mac_port_get_caps member points to. > > mt7531_mac_config() is also called from mt7531_cpu_port_config() outside of > phylink but the port and interface modes are already handled there. > > Change the functions and the mac_port_config function pointer to void now > that there're no error returns anymore. > > Remove mt753x_is_mac_port() that used to help the said error returns. > > On mt7531_mac_config(), switch to if statements to simplify the code. > > Remove internal phy cases from mt753x_phylink_mac_config() as there is no > configuration to be done for them. There's also no need to check the > interface mode as that's already handled with the function the > mac_port_get_caps member points to. > > Tested-by: Arınç ÜNAL > Signed-off-by: Arınç ÜNAL Acked-by: Daniel Golle Tested-by: Daniel Golle (on BPi-R3 MT7986A+MT7531AE, BPi-R64 MT7622+MT7531BE and MT7988A rfb) > --- > drivers/net/dsa/mt7530.c | 81 ++++++++-------------------------------- > drivers/net/dsa/mt7530.h | 2 +- > 2 files changed, 17 insertions(+), 66 deletions(-) > > diff --git a/drivers/net/dsa/mt7530.c b/drivers/net/dsa/mt7530.c > index 8ece3d0d820c..3d19e06061cb 100644 > --- a/drivers/net/dsa/mt7530.c > +++ b/drivers/net/dsa/mt7530.c > @@ -2556,7 +2556,7 @@ static void mt7988_mac_port_get_caps(struct dsa_switch *ds, int port, > } > } > > -static int > +static void > mt7530_mac_config(struct dsa_switch *ds, int port, unsigned int mode, > phy_interface_t interface) > { > @@ -2567,22 +2567,14 @@ mt7530_mac_config(struct dsa_switch *ds, int port, unsigned int mode, > } else if (port == 6) { > mt7530_setup_port6(priv->ds, interface); > } > - > - return 0; > } > > -static int mt7531_rgmii_setup(struct mt7530_priv *priv, u32 port, > - phy_interface_t interface, > - struct phy_device *phydev) > +static void mt7531_rgmii_setup(struct mt7530_priv *priv, u32 port, > + phy_interface_t interface, > + struct phy_device *phydev) > { > u32 val; > > - if (priv->p5_sgmii) { > - dev_err(priv->dev, "RGMII mode is not available for port %d\n", > - port); > - return -EINVAL; > - } > - > val = mt7530_read(priv, MT7531_CLKGEN_CTRL); > val |= GP_CLK_EN; > val &= ~GP_MODE_MASK; > @@ -2610,20 +2602,14 @@ static int mt7531_rgmii_setup(struct mt7530_priv *priv, u32 port, > case PHY_INTERFACE_MODE_RGMII_ID: > break; > default: > - return -EINVAL; > + break; > } > } > - mt7530_write(priv, MT7531_CLKGEN_CTRL, val); > > - return 0; > -} > - > -static bool mt753x_is_mac_port(u32 port) > -{ > - return (port == 5 || port == 6); > + mt7530_write(priv, MT7531_CLKGEN_CTRL, val); > } > > -static int > +static void > mt7531_mac_config(struct dsa_switch *ds, int port, unsigned int mode, > phy_interface_t interface) > { > @@ -2631,42 +2617,21 @@ mt7531_mac_config(struct dsa_switch *ds, int port, unsigned int mode, > struct phy_device *phydev; > struct dsa_port *dp; > > - if (!mt753x_is_mac_port(port)) { > - dev_err(priv->dev, "port %d is not a MAC port\n", port); > - return -EINVAL; > - } > - > - switch (interface) { > - case PHY_INTERFACE_MODE_RGMII: > - case PHY_INTERFACE_MODE_RGMII_ID: > - case PHY_INTERFACE_MODE_RGMII_RXID: > - case PHY_INTERFACE_MODE_RGMII_TXID: > + if (phy_interface_mode_is_rgmii(interface)) { > dp = dsa_to_port(ds, port); > phydev = dp->slave->phydev; > - return mt7531_rgmii_setup(priv, port, interface, phydev); > - case PHY_INTERFACE_MODE_SGMII: > - case PHY_INTERFACE_MODE_NA: > - case PHY_INTERFACE_MODE_1000BASEX: > - case PHY_INTERFACE_MODE_2500BASEX: > - /* handled in SGMII PCS driver */ > - return 0; > - default: > - return -EINVAL; > + mt7531_rgmii_setup(priv, port, interface, phydev); > } > - > - return -EINVAL; > } > > -static int > +static void > mt753x_mac_config(struct dsa_switch *ds, int port, unsigned int mode, > const struct phylink_link_state *state) > { > struct mt7530_priv *priv = ds->priv; > > - if (!priv->info->mac_port_config) > - return 0; > - > - return priv->info->mac_port_config(ds, port, mode, state->interface); > + if (priv->info->mac_port_config) > + priv->info->mac_port_config(ds, port, mode, state->interface); > } > > static struct phylink_pcs * > @@ -2695,30 +2660,18 @@ mt753x_phylink_mac_config(struct dsa_switch *ds, int port, unsigned int mode, > u32 mcr_cur, mcr_new; > > switch (port) { > - case 0 ... 4: /* Internal phy */ > - if (state->interface != PHY_INTERFACE_MODE_GMII && > - state->interface != PHY_INTERFACE_MODE_INTERNAL) > - goto unsupported; > - break; > case 5: /* Port 5, can be used as a CPU port. */ > if (priv->p5_configured) > break; > > - if (mt753x_mac_config(ds, port, mode, state) < 0) > - goto unsupported; > + mt753x_mac_config(ds, port, mode, state); > break; > case 6: /* Port 6, can be used as a CPU port. */ > if (priv->p6_configured) > break; > > - if (mt753x_mac_config(ds, port, mode, state) < 0) > - goto unsupported; > + mt753x_mac_config(ds, port, mode, state); > break; > - default: > -unsupported: > - dev_err(ds->dev, "%s: unsupported %s port: %i\n", > - __func__, phy_modes(state->interface), port); > - return; > } > > mcr_cur = mt7530_read(priv, MT7530_PMCR_P(port)); > @@ -2811,7 +2764,6 @@ mt7531_cpu_port_config(struct dsa_switch *ds, int port) > struct mt7530_priv *priv = ds->priv; > phy_interface_t interface; > int speed; > - int ret; > > switch (port) { > case 5: > @@ -2836,9 +2788,8 @@ mt7531_cpu_port_config(struct dsa_switch *ds, int port) > else > speed = SPEED_1000; > > - ret = mt7531_mac_config(ds, port, MLO_AN_FIXED, interface); > - if (ret) > - return ret; > + mt7531_mac_config(ds, port, MLO_AN_FIXED, interface); > + > mt7530_write(priv, MT7530_PMCR_P(port), > PMCR_CPU_PORT_SETTING(priv->id)); > mt753x_phylink_pcs_link_up(&priv->pcs[port].pcs, MLO_AN_FIXED, > diff --git a/drivers/net/dsa/mt7530.h b/drivers/net/dsa/mt7530.h > index cad9115de22b..ee2b3d2d6258 100644 > --- a/drivers/net/dsa/mt7530.h > +++ b/drivers/net/dsa/mt7530.h > @@ -722,7 +722,7 @@ struct mt753x_info { > void (*mac_port_validate)(struct dsa_switch *ds, int port, > phy_interface_t interface, > unsigned long *supported); > - int (*mac_port_config)(struct dsa_switch *ds, int port, > + void (*mac_port_config)(struct dsa_switch *ds, int port, > unsigned int mode, > phy_interface_t interface); > }; > -- > 2.37.2 >