netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Lorenzo Bianconi <lorenzo@kernel.org>
To: "Arınç ÜNAL" <arinc.unal@arinc9.com>
Cc: netdev@vger.kernel.org, daniel@makrotopia.org, dqfext@gmail.com,
	sean.wang@mediatek.com, andrew@lunn.ch, f.fainelli@gmail.com,
	olteanv@gmail.com, davem@davemloft.net, edumazet@google.com,
	kuba@kernel.org, pabeni@redhat.com, matthias.bgg@gmail.com,
	angelogioacchino.delregno@collabora.com,
	linux-arm-kernel@lists.infradead.org,
	linux-mediatek@lists.infradead.org, lorenzo.bianconi83@gmail.com,
	robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org,
	devicetree@vger.kernel.org, upstream@airoha.com
Subject: Re: [PATCH net-next 2/2] net: dsa: mt7530: Add EN7581 support
Date: Tue, 30 Jul 2024 15:19:03 +0200	[thread overview]
Message-ID: <ZqjoR-c9b3fjWoRa@lore-desk> (raw)
In-Reply-To: <b4c98268-e436-46d5-8906-2fdaf6e89fed@arinc9.com>

[-- Attachment #1: Type: text/plain, Size: 10550 bytes --]

> On 30/07/2024 10:46, Lorenzo Bianconi wrote:
> > Introduce support for the DSA built-in switch available on the EN7581
> > development board. EN7581 support is similar to MT7988 one except
> > it requires to set MT7530_FORCE_MODE bit in MT753X_PMCR_P register
> > for on cpu port.
> > 
> > Tested-by: Benjamin Larsson <benjamin.larsson@genexis.eu>
> > Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
> > ---
> >   drivers/net/dsa/mt7530-mmio.c |  1 +
> >   drivers/net/dsa/mt7530.c      | 38 +++++++++++++++++++++++++++++++----
> >   drivers/net/dsa/mt7530.h      | 16 ++++++++++-----
> >   3 files changed, 46 insertions(+), 9 deletions(-)
> > 
> > diff --git a/drivers/net/dsa/mt7530-mmio.c b/drivers/net/dsa/mt7530-mmio.c
> > index b74a230a3f13..10dc49961f15 100644
> > --- a/drivers/net/dsa/mt7530-mmio.c
> > +++ b/drivers/net/dsa/mt7530-mmio.c
> > @@ -11,6 +11,7 @@
> >   #include "mt7530.h"
> >   static const struct of_device_id mt7988_of_match[] = {
> > +	{ .compatible = "airoha,en7581-switch", .data = &mt753x_table[ID_EN7581], },
> >   	{ .compatible = "mediatek,mt7988-switch", .data = &mt753x_table[ID_MT7988], },
> >   	{ /* sentinel */ },
> >   };
> > diff --git a/drivers/net/dsa/mt7530.c b/drivers/net/dsa/mt7530.c
> > index ec18e68bf3a8..8adc4561c5b2 100644
> > --- a/drivers/net/dsa/mt7530.c
> > +++ b/drivers/net/dsa/mt7530.c
> > @@ -1152,7 +1152,8 @@ mt753x_cpu_port_enable(struct dsa_switch *ds, int port)
> >   	 * the MT7988 SoC. Trapped frames will be forwarded to the CPU port that
> >   	 * is affine to the inbound user port.
> >   	 */
> > -	if (priv->id == ID_MT7531 || priv->id == ID_MT7988)
> > +	if (priv->id == ID_MT7531 || priv->id == ID_MT7988 ||
> > +	    priv->id == ID_EN7581)
> >   		mt7530_set(priv, MT7531_CFC, MT7531_CPU_PMAP(BIT(port)));
> >   	/* CPU port gets connected to all user ports of
> > @@ -2207,7 +2208,7 @@ mt7530_setup_irq(struct mt7530_priv *priv)
> >   		return priv->irq ? : -EINVAL;
> >   	}
> > -	if (priv->id == ID_MT7988)
> > +	if (priv->id == ID_MT7988 || priv->id == ID_EN7581)
> >   		priv->irq_domain = irq_domain_add_linear(np, MT7530_NUM_PHYS,
> >   							 &mt7988_irq_domain_ops,
> >   							 priv);
> > @@ -2766,7 +2767,7 @@ static void mt7988_mac_port_get_caps(struct dsa_switch *ds, int port,
> >   {
> >   	switch (port) {
> >   	/* Ports which are connected to switch PHYs. There is no MII pinout. */
> > -	case 0 ... 3:
> > +	case 0 ... 4:
> 
> Please create a new function, such as en7581_mac_port_get_caps().

ack, I will do in v2.

> 
> >   		__set_bit(PHY_INTERFACE_MODE_INTERNAL,
> >   			  config->supported_interfaces);
> > @@ -2850,6 +2851,23 @@ mt7531_mac_config(struct dsa_switch *ds, int port, unsigned int mode,
> >   	}
> >   }
> > +static void
> > +en7581_mac_config(struct dsa_switch *ds, int port, unsigned int mode,
> > +		  phy_interface_t interface)
> > +{
> > +	/* BIT(31-27): reserved
> > +	 * BIT(26): TX_CRC_EN: enable(0)/disable(1) CRC insertion
> > +	 * BIT(25): RX_CRC_EN: enable(0)/disable(1) CRC insertion
> > +	 * Since the bits above have a different meaning with respect to the
> > +	 * one described in mt7530.h, set default values.
> > +	 */
> > +	mt7530_clear(ds->priv, MT753X_PMCR_P(port), MT7531_FORCE_MODE_MASK);
> > +	if (dsa_is_cpu_port(ds, port)) {
> > +		/* enable MT7530_FORCE_MODE on cpu port */
> > +		mt7530_set(ds->priv, MT753X_PMCR_P(port), MT7530_FORCE_MODE);
> > +	}
> > +}
> 
> This seems to undo "Clear link settings and enable force mode to force link
> down on all ports until they're enabled later." on mt7531_setup_common()
> and redo it only for the CPU port. It should be so that force mode is
> enabled on all ports. You could position the diff below as a patch before
> this patch. It introduces the MT753X_FORCE_MODE() macro to choose the
> correct constant for the switch model.
> 
> diff --git a/drivers/net/dsa/mt7530.c b/drivers/net/dsa/mt7530.c
> index ec18e68bf3a8..4915264c460f 100644
> --- a/drivers/net/dsa/mt7530.c
> +++ b/drivers/net/dsa/mt7530.c
> @@ -2438,8 +2438,10 @@ mt7530_setup(struct dsa_switch *ds)
>  		/* Clear link settings and enable force mode to force link down
>  		 * on all ports until they're enabled later.
>  		 */
> -		mt7530_rmw(priv, MT753X_PMCR_P(i), PMCR_LINK_SETTINGS_MASK |
> -			   MT7530_FORCE_MODE, MT7530_FORCE_MODE);
> +		mt7530_rmw(priv, MT753X_PMCR_P(i),
> +			   PMCR_LINK_SETTINGS_MASK |
> +				   MT753X_FORCE_MODE(priv->id),
> +			   MT753X_FORCE_MODE(priv->id));
>  		/* Disable forwarding by default on all ports */
>  		mt7530_rmw(priv, MT7530_PCR_P(i), PCR_MATRIX_MASK,
> @@ -2550,8 +2552,10 @@ mt7531_setup_common(struct dsa_switch *ds)
>  		/* Clear link settings and enable force mode to force link down
>  		 * on all ports until they're enabled later.
>  		 */
> -		mt7530_rmw(priv, MT753X_PMCR_P(i), PMCR_LINK_SETTINGS_MASK |
> -			   MT7531_FORCE_MODE_MASK, MT7531_FORCE_MODE_MASK);
> +		mt7530_rmw(priv, MT753X_PMCR_P(i),
> +			   PMCR_LINK_SETTINGS_MASK |
> +				   MT753X_FORCE_MODE(priv->id),
> +			   MT753X_FORCE_MODE(priv->id));
>  		/* Disable forwarding by default on all ports */
>  		mt7530_rmw(priv, MT7530_PCR_P(i), PCR_MATRIX_MASK,
> diff --git a/drivers/net/dsa/mt7530.h b/drivers/net/dsa/mt7530.h
> index 28592123070b..d47d1ce511ba 100644
> --- a/drivers/net/dsa/mt7530.h
> +++ b/drivers/net/dsa/mt7530.h
> @@ -355,6 +355,10 @@ enum mt7530_vlan_port_acc_frm {
>  					 MT7531_FORCE_MODE_TX_FC | \
>  					 MT7531_FORCE_MODE_EEE100 | \
>  					 MT7531_FORCE_MODE_EEE1G)
> +#define  MT753X_FORCE_MODE(id)		((id == ID_MT7531 || \
> +					  id == ID_MT7988) ? \
> +					 MT7531_FORCE_MODE_MASK : \
> +					 MT7530_FORCE_MODE)
>  #define  PMCR_LINK_SETTINGS_MASK	(PMCR_MAC_TX_EN | PMCR_MAC_RX_EN | \
>  					 PMCR_FORCE_EEE1G | \
>  					 PMCR_FORCE_EEE100 | \

ack, fine. I will merge this change in v2.

> 
> > +
> >   static struct phylink_pcs *
> >   mt753x_phylink_mac_select_pcs(struct phylink_config *config,
> >   			      phy_interface_t interface)
> > @@ -2880,7 +2898,8 @@ mt753x_phylink_mac_config(struct phylink_config *config, unsigned int mode,
> >   	priv = ds->priv;
> > -	if ((port == 5 || port == 6) && priv->info->mac_port_config)
> > +	if ((port == 5 || port == 6 || priv->id == ID_EN7581) &&
> > +	    priv->info->mac_port_config)
> >   		priv->info->mac_port_config(ds, port, mode, state->interface);
> >   	/* Are we connected to external phy */
> > @@ -3220,6 +3239,17 @@ const struct mt753x_info mt753x_table[] = {
> >   		.phy_write_c45 = mt7531_ind_c45_phy_write,
> >   		.mac_port_get_caps = mt7988_mac_port_get_caps,
> >   	},
> > +	[ID_EN7581] = {
> > +		.id = ID_EN7581,
> > +		.pcs_ops = &mt7530_pcs_ops,
> > +		.sw_setup = mt7988_setup,
> > +		.phy_read_c22 = mt7531_ind_c22_phy_read,
> > +		.phy_write_c22 = mt7531_ind_c22_phy_write,
> > +		.phy_read_c45 = mt7531_ind_c45_phy_read,
> > +		.phy_write_c45 = mt7531_ind_c45_phy_write,
> > +		.mac_port_get_caps = mt7988_mac_port_get_caps,
> > +		.mac_port_config = en7581_mac_config,
> > +	},
> 
> Let me lend a hand; you can apply this diff on top of this patch.

Thx :)

> 
> diff --git a/drivers/net/dsa/mt7530.c b/drivers/net/dsa/mt7530.c
> index b18b98a53a7d..f5766d8ae360 100644
> --- a/drivers/net/dsa/mt7530.c
> +++ b/drivers/net/dsa/mt7530.c
> @@ -2768,6 +2768,28 @@ static void mt7531_mac_port_get_caps(struct dsa_switch *ds, int port,
>  static void mt7988_mac_port_get_caps(struct dsa_switch *ds, int port,
>  				     struct phylink_config *config)
> +{
> +	switch (port) {
> +	/* Ports which are connected to switch PHYs. There is no MII pinout. */
> +	case 0 ... 3:
> +		__set_bit(PHY_INTERFACE_MODE_INTERNAL,
> +			  config->supported_interfaces);
> +
> +		config->mac_capabilities |= MAC_10 | MAC_100 | MAC_1000FD;
> +		break;
> +
> +	/* Port 6 is connected to SoC's XGMII MAC. There is no MII pinout. */
> +	case 6:
> +		__set_bit(PHY_INTERFACE_MODE_INTERNAL,
> +			  config->supported_interfaces);
> +
> +		config->mac_capabilities |= MAC_10000FD;
> +		break;
> +	}
> +}
> +
> +static void en7581_mac_port_get_caps(struct dsa_switch *ds, int port,
> +				     struct phylink_config *config)
>  {
>  	switch (port) {
>  	/* Ports which are connected to switch PHYs. There is no MII pinout. */
> @@ -2855,23 +2877,6 @@ mt7531_mac_config(struct dsa_switch *ds, int port, unsigned int mode,
>  	}
>  }
> -static void
> -en7581_mac_config(struct dsa_switch *ds, int port, unsigned int mode,
> -		  phy_interface_t interface)
> -{
> -	/* BIT(31-27): reserved
> -	 * BIT(26): TX_CRC_EN: enable(0)/disable(1) CRC insertion
> -	 * BIT(25): RX_CRC_EN: enable(0)/disable(1) CRC insertion
> -	 * Since the bits above have a different meaning with respect to the
> -	 * one described in mt7530.h, set default values.
> -	 */
> -	mt7530_clear(ds->priv, MT753X_PMCR_P(port), MT7531_FORCE_MODE_MASK);
> -	if (dsa_is_cpu_port(ds, port)) {
> -		/* enable MT7530_FORCE_MODE on cpu port */
> -		mt7530_set(ds->priv, MT753X_PMCR_P(port), MT7530_FORCE_MODE);
> -	}
> -}
> -
>  static struct phylink_pcs *
>  mt753x_phylink_mac_select_pcs(struct phylink_config *config,
>  			      phy_interface_t interface)
> @@ -2902,8 +2907,7 @@ mt753x_phylink_mac_config(struct phylink_config *config, unsigned int mode,
>  	priv = ds->priv;
> -	if ((port == 5 || port == 6 || priv->id == ID_EN7581) &&
> -	    priv->info->mac_port_config)
> +	if ((port == 5 || port == 6) && priv->info->mac_port_config)
>  		priv->info->mac_port_config(ds, port, mode, state->interface);
>  	/* Are we connected to external phy */
> @@ -3251,8 +3255,7 @@ const struct mt753x_info mt753x_table[] = {
>  		.phy_write_c22 = mt7531_ind_c22_phy_write,
>  		.phy_read_c45 = mt7531_ind_c45_phy_read,
>  		.phy_write_c45 = mt7531_ind_c45_phy_write,
> -		.mac_port_get_caps = mt7988_mac_port_get_caps,
> -		.mac_port_config = en7581_mac_config,
> +		.mac_port_get_caps = en7581_mac_port_get_caps,
>  	},
>  };
>  EXPORT_SYMBOL_GPL(mt753x_table);
> 
> I don't know this hardware so please make sure the comments on
> en7581_mac_port_get_caps() are correct. I didn't compile this so please
> make sure it works.

ack, I tested it and it works fine.

Regards,
Lorenzo

> 
> By the way, is this supposed to be AN7581? There's EN7580 but no EN7581 on
> the Airoha website.
> 
> https://www.airoha.com/products/y1cQz8EpjIKhbK61
> 
> Arınç

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 228 bytes --]

      reply	other threads:[~2024-07-30 13:19 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-07-30  7:46 [PATCH net-next 0/2] Add support for EN7581 to mt7530 driver Lorenzo Bianconi
2024-07-30  7:46 ` [PATCH net-next 1/2] dt-bindings: net: dsa: mediatek,mt7530: Add airoha,en7581-switch Lorenzo Bianconi
2024-07-30  8:57   ` Arınç ÜNAL
2024-07-30 12:42     ` Lorenzo Bianconi
2024-07-30 20:03     ` Rob Herring
2024-07-30  7:46 ` [PATCH net-next 2/2] net: dsa: mt7530: Add EN7581 support Lorenzo Bianconi
2024-07-30 10:21   ` Arınç ÜNAL
2024-07-30 13:19     ` Lorenzo Bianconi [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=ZqjoR-c9b3fjWoRa@lore-desk \
    --to=lorenzo@kernel.org \
    --cc=andrew@lunn.ch \
    --cc=angelogioacchino.delregno@collabora.com \
    --cc=arinc.unal@arinc9.com \
    --cc=conor+dt@kernel.org \
    --cc=daniel@makrotopia.org \
    --cc=davem@davemloft.net \
    --cc=devicetree@vger.kernel.org \
    --cc=dqfext@gmail.com \
    --cc=edumazet@google.com \
    --cc=f.fainelli@gmail.com \
    --cc=krzk+dt@kernel.org \
    --cc=kuba@kernel.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-mediatek@lists.infradead.org \
    --cc=lorenzo.bianconi83@gmail.com \
    --cc=matthias.bgg@gmail.com \
    --cc=netdev@vger.kernel.org \
    --cc=olteanv@gmail.com \
    --cc=pabeni@redhat.com \
    --cc=robh@kernel.org \
    --cc=sean.wang@mediatek.com \
    --cc=upstream@airoha.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).