All of lore.kernel.org
 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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.