netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH net-next] net: dsa: mt7530: fix support for MT7531BE
@ 2023-04-11  0:11 Daniel Golle
  2023-04-11 15:44 ` Jesse Brandeburg
  2023-04-11 19:30 ` Arınç ÜNAL
  0 siblings, 2 replies; 5+ messages in thread
From: Daniel Golle @ 2023-04-11  0:11 UTC (permalink / raw)
  To: netdev, linux-mediatek, linux-arm-kernel, linux-kernel, Sean Wang,
	Landen Chao, DENG Qingfang, Arınç ÜNAL,
	Russell King, AngeloGioacchino Del Regno, Matthias Brugger,
	Paolo Abeni, Jakub Kicinski, Eric Dumazet, David S. Miller,
	Vladimir Oltean, Florian Fainelli, Andrew Lunn

There are two variants of the MT7531 switch IC which got different
features (and pins) regarding port 5:
 * MT7531AE: SGMII/1000Base-X/2500Base-X SerDes
 * MT7531BE: RGMII

Moving the creation of the SerDes PCS from mt753x_setup to mt7530_probe
with commit 6de285229773 ("net: dsa: mt7530: move SGMII PCS creation to
mt7530_probe function") works fine for MT7531AE which got two instances
of mtk-pcs-lynxi, however, MT7531BE requires mt7531_pll_setup to setup
clocks before the single PCS on port 6 (usually used as CPU port)
starts to work and hence the PCS creation failed on MT7531BE.

Fix this by introducing a pointer to mt7531_create_sgmii function in
struct mt7530_priv and call it again at the end of mt753x_setup like it
was before commit 6de285229773 ("net: dsa: mt7530: move SGMII PCS
creation to mt7530_probe function").

Fixes: 6de285229773 ("net: dsa: mt7530: move SGMII PCS creation to mt7530_probe function")
Signed-off-by: Daniel Golle <daniel@makrotopia.org>
---
 drivers/net/dsa/mt7530-mdio.c | 14 +++++++-------
 drivers/net/dsa/mt7530.c      |  6 ++++++
 drivers/net/dsa/mt7530.h      |  4 ++++
 3 files changed, 17 insertions(+), 7 deletions(-)

diff --git a/drivers/net/dsa/mt7530-mdio.c b/drivers/net/dsa/mt7530-mdio.c
index 34a547b88e497..f17eab67d15fa 100644
--- a/drivers/net/dsa/mt7530-mdio.c
+++ b/drivers/net/dsa/mt7530-mdio.c
@@ -81,14 +81,17 @@ static const struct regmap_bus mt7530_regmap_bus = {
 };
 
 static int
-mt7531_create_sgmii(struct mt7530_priv *priv)
+mt7531_create_sgmii(struct mt7530_priv *priv, bool dual_sgmii)
 {
 	struct regmap_config *mt7531_pcs_config[2];
 	struct phylink_pcs *pcs;
 	struct regmap *regmap;
 	int i, ret = 0;
 
-	for (i = 0; i < 2; i++) {
+	/* MT7531AE has two SGMII units for port 5 and port 6
+	 * MT7531BE has only one SGMII unit for port 6
+	 */
+	for (i = dual_sgmii ? 0 : 1; i < 2; i++) {
 		mt7531_pcs_config[i] = devm_kzalloc(priv->dev,
 						    sizeof(struct regmap_config),
 						    GFP_KERNEL);
@@ -208,11 +211,8 @@ mt7530_probe(struct mdio_device *mdiodev)
 	if (IS_ERR(priv->regmap))
 		return PTR_ERR(priv->regmap);
 
-	if (priv->id == ID_MT7531) {
-		ret = mt7531_create_sgmii(priv);
-		if (ret)
-			return ret;
-	}
+	if (priv->id == ID_MT7531)
+		priv->create_sgmii = mt7531_create_sgmii;
 
 	return dsa_register_switch(priv->ds);
 }
diff --git a/drivers/net/dsa/mt7530.c b/drivers/net/dsa/mt7530.c
index e4bb5037d3525..c680873819b01 100644
--- a/drivers/net/dsa/mt7530.c
+++ b/drivers/net/dsa/mt7530.c
@@ -3018,6 +3018,12 @@ mt753x_setup(struct dsa_switch *ds)
 	if (ret && priv->irq)
 		mt7530_free_irq_common(priv);
 
+	if (priv->create_sgmii) {
+		ret = priv->create_sgmii(priv, mt7531_dual_sgmii_supported(priv));
+		if (ret && priv->irq)
+			mt7530_free_irq(priv);
+	}
+
 	return ret;
 }
 
diff --git a/drivers/net/dsa/mt7530.h b/drivers/net/dsa/mt7530.h
index 01db5c9724fa8..6e89578b4de02 100644
--- a/drivers/net/dsa/mt7530.h
+++ b/drivers/net/dsa/mt7530.h
@@ -752,6 +752,8 @@ struct mt753x_info {
  * @irq:		IRQ number of the switch
  * @irq_domain:		IRQ domain of the switch irq_chip
  * @irq_enable:		IRQ enable bits, synced to SYS_INT_EN
+ *
+ * @create_sgmii:	Pointer to function creating SGMII PCS instance(s)
  */
 struct mt7530_priv {
 	struct device		*dev;
@@ -778,6 +780,8 @@ struct mt7530_priv {
 	int irq;
 	struct irq_domain *irq_domain;
 	u32 irq_enable;
+
+	int (*create_sgmii)(struct mt7530_priv *priv, bool dual_sgmii);
 };
 
 struct mt7530_hw_vlan_entry {
-- 
2.40.0


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH net-next] net: dsa: mt7530: fix support for MT7531BE
  2023-04-11  0:11 [PATCH net-next] net: dsa: mt7530: fix support for MT7531BE Daniel Golle
@ 2023-04-11 15:44 ` Jesse Brandeburg
  2023-04-11 19:30 ` Arınç ÜNAL
  1 sibling, 0 replies; 5+ messages in thread
From: Jesse Brandeburg @ 2023-04-11 15:44 UTC (permalink / raw)
  To: Daniel Golle, netdev, linux-mediatek, linux-arm-kernel,
	linux-kernel, Sean Wang, Landen Chao, DENG Qingfang,
	Arınç ÜNAL, Russell King,
	AngeloGioacchino Del Regno, Matthias Brugger, Paolo Abeni,
	Jakub Kicinski, Eric Dumazet, David S. Miller, Vladimir Oltean,
	Florian Fainelli, Andrew Lunn

On 4/10/2023 5:11 PM, Daniel Golle wrote:
> There are two variants of the MT7531 switch IC which got different
> features (and pins) regarding port 5:
>  * MT7531AE: SGMII/1000Base-X/2500Base-X SerDes
>  * MT7531BE: RGMII
> 
> Moving the creation of the SerDes PCS from mt753x_setup to mt7530_probe
> with commit 6de285229773 ("net: dsa: mt7530: move SGMII PCS creation to
> mt7530_probe function") works fine for MT7531AE which got two instances
> of mtk-pcs-lynxi, however, MT7531BE requires mt7531_pll_setup to setup
> clocks before the single PCS on port 6 (usually used as CPU port)
> starts to work and hence the PCS creation failed on MT7531BE.
> 
> Fix this by introducing a pointer to mt7531_create_sgmii function in
> struct mt7530_priv and call it again at the end of mt753x_setup like it
> was before commit 6de285229773 ("net: dsa: mt7530: move SGMII PCS
> creation to mt7530_probe function").
> 
> Fixes: 6de285229773 ("net: dsa: mt7530: move SGMII PCS creation to mt7530_probe function")
> Signed-off-by: Daniel Golle <daniel@makrotopia.org>
> ---
>  drivers/net/dsa/mt7530-mdio.c | 14 +++++++-------
>  drivers/net/dsa/mt7530.c      |  6 ++++++
>  drivers/net/dsa/mt7530.h      |  4 ++++
>  3 files changed, 17 insertions(+), 7 deletions(-)
> 
> diff --git a/drivers/net/dsa/mt7530-mdio.c b/drivers/net/dsa/mt7530-mdio.c
> index 34a547b88e497..f17eab67d15fa 100644
> --- a/drivers/net/dsa/mt7530-mdio.c
> +++ b/drivers/net/dsa/mt7530-mdio.c
> @@ -81,14 +81,17 @@ static const struct regmap_bus mt7530_regmap_bus = {
>  };
>  
>  static int
> -mt7531_create_sgmii(struct mt7530_priv *priv)
> +mt7531_create_sgmii(struct mt7530_priv *priv, bool dual_sgmii)
>  {
>  	struct regmap_config *mt7531_pcs_config[2];

[1] use = {};

>  	struct phylink_pcs *pcs;
>  	struct regmap *regmap;
>  	int i, ret = 0;
>  
> -	for (i = 0; i < 2; i++) {
> +	/* MT7531AE has two SGMII units for port 5 and port 6
> +	 * MT7531BE has only one SGMII unit for port 6
> +	 */
> +	for (i = dual_sgmii ? 0 : 1; i < 2; i++) {
>  		mt7531_pcs_config[i] = devm_kzalloc(priv->dev,

hm, I don't like this, you're no longer initializing array[0] if
dual_sgmii is set. This seems like a recipe for disaster.

you could initialize the array to NULL above when allocating this on the
stack? [1]


>  						    sizeof(struct regmap_config),
>  						    GFP_KERNEL);
> @@ -208,11 +211,8 @@ mt7530_probe(struct mdio_device *mdiodev)
>  	if (IS_ERR(priv->regmap))
>  		return PTR_ERR(priv->regmap);
>  
> -	if (priv->id == ID_MT7531) {
> -		ret = mt7531_create_sgmii(priv);
> -		if (ret)
> -			return ret;
> -	}
> +	if (priv->id == ID_MT7531)
> +		priv->create_sgmii = mt7531_create_sgmii;
>  
>  	return dsa_register_switch(priv->ds);
>  }
> diff --git a/drivers/net/dsa/mt7530.c b/drivers/net/dsa/mt7530.c
> index e4bb5037d3525..c680873819b01 100644
> --- a/drivers/net/dsa/mt7530.c
> +++ b/drivers/net/dsa/mt7530.c
> @@ -3018,6 +3018,12 @@ mt753x_setup(struct dsa_switch *ds)
>  	if (ret && priv->irq)
>  		mt7530_free_irq_common(priv);
>  
> +	if (priv->create_sgmii) {
> +		ret = priv->create_sgmii(priv, mt7531_dual_sgmii_supported(priv));
> +		if (ret && priv->irq)
> +			mt7530_free_irq(priv);
> +	}
> +
>  	return ret;
>  }
>  
> diff --git a/drivers/net/dsa/mt7530.h b/drivers/net/dsa/mt7530.h
> index 01db5c9724fa8..6e89578b4de02 100644
> --- a/drivers/net/dsa/mt7530.h
> +++ b/drivers/net/dsa/mt7530.h
> @@ -752,6 +752,8 @@ struct mt753x_info {
>   * @irq:		IRQ number of the switch
>   * @irq_domain:		IRQ domain of the switch irq_chip
>   * @irq_enable:		IRQ enable bits, synced to SYS_INT_EN
> + *

no extra blank line needed here.

> + * @create_sgmii:	Pointer to function creating SGMII PCS instance(s)
>   */
>  struct mt7530_priv {
>  	struct device		*dev;
> @@ -778,6 +780,8 @@ struct mt7530_priv {
>  	int irq;
>  	struct irq_domain *irq_domain;
>  	u32 irq_enable;
> +
> +	int (*create_sgmii)(struct mt7530_priv *priv, bool dual_sgmii);
>  };
>  
>  struct mt7530_hw_vlan_entry {


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH net-next] net: dsa: mt7530: fix support for MT7531BE
  2023-04-11  0:11 [PATCH net-next] net: dsa: mt7530: fix support for MT7531BE Daniel Golle
  2023-04-11 15:44 ` Jesse Brandeburg
@ 2023-04-11 19:30 ` Arınç ÜNAL
  2023-04-11 19:43   ` Daniel Golle
  1 sibling, 1 reply; 5+ messages in thread
From: Arınç ÜNAL @ 2023-04-11 19:30 UTC (permalink / raw)
  To: Daniel Golle, netdev, linux-mediatek, linux-arm-kernel,
	linux-kernel, Sean Wang, Landen Chao, DENG Qingfang, Russell King,
	AngeloGioacchino Del Regno, Matthias Brugger, Paolo Abeni,
	Jakub Kicinski, Eric Dumazet, David S. Miller, Vladimir Oltean,
	Florian Fainelli, Andrew Lunn

On 11.04.2023 03:11, Daniel Golle wrote:
> There are two variants of the MT7531 switch IC which got different
> features (and pins) regarding port 5:
>   * MT7531AE: SGMII/1000Base-X/2500Base-X SerDes
>   * MT7531BE: RGMII
> 
> Moving the creation of the SerDes PCS from mt753x_setup to mt7530_probe
> with commit 6de285229773 ("net: dsa: mt7530: move SGMII PCS creation to
> mt7530_probe function") works fine for MT7531AE which got two instances
> of mtk-pcs-lynxi, however, MT7531BE requires mt7531_pll_setup to setup
> clocks before the single PCS on port 6 (usually used as CPU port)
> starts to work and hence the PCS creation failed on MT7531BE.
> 
> Fix this by introducing a pointer to mt7531_create_sgmii function in
> struct mt7530_priv and call it again at the end of mt753x_setup like it
> was before commit 6de285229773 ("net: dsa: mt7530: move SGMII PCS
> creation to mt7530_probe function").

If I understand correctly, this patch does two things.

Run mt7531_create_sgmii() from mt753x_setup(), after mt7531_setup() and 
mt7531_setup_common() is run so that PCS on MT7531BE works.

Run the PCS creation code inside the loop only once if 
mt7531_dual_sgmii_supported() is false so it doesn't set the nonexistent 
port 5 SGMII on MT7531BE.

Regarding the first part:
I was actually in the middle of moving the code until after 
mt7530_pll_setup() and mt7531_pll_setup() on mt7530_setup() and 
mt7531_setup() to mt7530_probe(). To me it makes more sense to run them 
on mt7530_probe() as there's a good amount of duplicate code on 
mt7530_setup() and mt7531_setup().

This will resolve the problem here, and make my future work regarding 
the PHY muxing feature on the MT7530 switch possible to do.

Regarding the second part:
I'll take your changes to my current RFC patch series while addressing 
Jesse's suggestion if this is fine by you.

Arınç

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH net-next] net: dsa: mt7530: fix support for MT7531BE
  2023-04-11 19:30 ` Arınç ÜNAL
@ 2023-04-11 19:43   ` Daniel Golle
  2023-04-11 19:50     ` Arınç ÜNAL
  0 siblings, 1 reply; 5+ messages in thread
From: Daniel Golle @ 2023-04-11 19:43 UTC (permalink / raw)
  To: Arınç ÜNAL
  Cc: netdev, linux-mediatek, linux-arm-kernel, linux-kernel, Sean Wang,
	Landen Chao, DENG Qingfang, Russell King,
	AngeloGioacchino Del Regno, Matthias Brugger, Paolo Abeni,
	Jakub Kicinski, Eric Dumazet, David S. Miller, Vladimir Oltean,
	Florian Fainelli, Andrew Lunn

On Tue, Apr 11, 2023 at 10:30:06PM +0300, Arınç ÜNAL wrote:
> On 11.04.2023 03:11, Daniel Golle wrote:
> > There are two variants of the MT7531 switch IC which got different
> > features (and pins) regarding port 5:
> >   * MT7531AE: SGMII/1000Base-X/2500Base-X SerDes
> >   * MT7531BE: RGMII
> > 
> > Moving the creation of the SerDes PCS from mt753x_setup to mt7530_probe
> > with commit 6de285229773 ("net: dsa: mt7530: move SGMII PCS creation to
> > mt7530_probe function") works fine for MT7531AE which got two instances
> > of mtk-pcs-lynxi, however, MT7531BE requires mt7531_pll_setup to setup
> > clocks before the single PCS on port 6 (usually used as CPU port)
> > starts to work and hence the PCS creation failed on MT7531BE.
> > 
> > Fix this by introducing a pointer to mt7531_create_sgmii function in
> > struct mt7530_priv and call it again at the end of mt753x_setup like it
> > was before commit 6de285229773 ("net: dsa: mt7530: move SGMII PCS
> > creation to mt7530_probe function").
> 
> If I understand correctly, this patch does two things.
> 
> Run mt7531_create_sgmii() from mt753x_setup(), after mt7531_setup() and
> mt7531_setup_common() is run so that PCS on MT7531BE works.

> 
> Run the PCS creation code inside the loop only once if
> mt7531_dual_sgmii_supported() is false so it doesn't set the nonexistent
> port 5 SGMII on MT7531BE.

Yes, both is correct.

> 
> Regarding the first part:
> I was actually in the middle of moving the code until after
> mt7530_pll_setup() and mt7531_pll_setup() on mt7530_setup() and
> mt7531_setup() to mt7530_probe(). To me it makes more sense to run them on
> mt7530_probe() as there's a good amount of duplicate code on mt7530_setup()
> and mt7531_setup().

I thought about doing that as well, however, note that you will have to
move all the reset and regulator setup procedure to mt7530_probe() as
well then, as PLL setup currently happens after that, and that's
probably for a reason.

As the reset and regulator setup works differently on MT7530 and
MT7531, and depending on whether it's a standalone IC package or MCM, I
believe changes unifying this will have to be tested on a lot of
boards...

> 
> This will resolve the problem here, and make my future work regarding the
> PHY muxing feature on the MT7530 switch possible to do.
> 
> Regarding the second part:
> I'll take your changes to my current RFC patch series while addressing
> Jesse's suggestion if this is fine by you.

Yes, I'd appreciate that and I'm ready to test and review once you post
your updated series.

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH net-next] net: dsa: mt7530: fix support for MT7531BE
  2023-04-11 19:43   ` Daniel Golle
@ 2023-04-11 19:50     ` Arınç ÜNAL
  0 siblings, 0 replies; 5+ messages in thread
From: Arınç ÜNAL @ 2023-04-11 19:50 UTC (permalink / raw)
  To: Daniel Golle
  Cc: netdev, linux-mediatek, linux-arm-kernel, linux-kernel, Sean Wang,
	Landen Chao, DENG Qingfang, Russell King,
	AngeloGioacchino Del Regno, Matthias Brugger, Paolo Abeni,
	Jakub Kicinski, Eric Dumazet, David S. Miller, Vladimir Oltean,
	Florian Fainelli, Andrew Lunn

On 11.04.2023 22:43, Daniel Golle wrote:
> On Tue, Apr 11, 2023 at 10:30:06PM +0300, Arınç ÜNAL wrote:
>> On 11.04.2023 03:11, Daniel Golle wrote:
>>> There are two variants of the MT7531 switch IC which got different
>>> features (and pins) regarding port 5:
>>>    * MT7531AE: SGMII/1000Base-X/2500Base-X SerDes
>>>    * MT7531BE: RGMII
>>>
>>> Moving the creation of the SerDes PCS from mt753x_setup to mt7530_probe
>>> with commit 6de285229773 ("net: dsa: mt7530: move SGMII PCS creation to
>>> mt7530_probe function") works fine for MT7531AE which got two instances
>>> of mtk-pcs-lynxi, however, MT7531BE requires mt7531_pll_setup to setup
>>> clocks before the single PCS on port 6 (usually used as CPU port)
>>> starts to work and hence the PCS creation failed on MT7531BE.
>>>
>>> Fix this by introducing a pointer to mt7531_create_sgmii function in
>>> struct mt7530_priv and call it again at the end of mt753x_setup like it
>>> was before commit 6de285229773 ("net: dsa: mt7530: move SGMII PCS
>>> creation to mt7530_probe function").
>>
>> If I understand correctly, this patch does two things.
>>
>> Run mt7531_create_sgmii() from mt753x_setup(), after mt7531_setup() and
>> mt7531_setup_common() is run so that PCS on MT7531BE works.
> 
>>
>> Run the PCS creation code inside the loop only once if
>> mt7531_dual_sgmii_supported() is false so it doesn't set the nonexistent
>> port 5 SGMII on MT7531BE.
> 
> Yes, both is correct.
> 
>>
>> Regarding the first part:
>> I was actually in the middle of moving the code until after
>> mt7530_pll_setup() and mt7531_pll_setup() on mt7530_setup() and
>> mt7531_setup() to mt7530_probe(). To me it makes more sense to run them on
>> mt7530_probe() as there's a good amount of duplicate code on mt7530_setup()
>> and mt7531_setup().
> 
> I thought about doing that as well, however, note that you will have to
> move all the reset and regulator setup procedure to mt7530_probe() as
> well then, as PLL setup currently happens after that, and that's
> probably for a reason.
> 
> As the reset and regulator setup works differently on MT7530 and
> MT7531, and depending on whether it's a standalone IC package or MCM, I
> believe changes unifying this will have to be tested on a lot of
> boards...

Not if we don't change the behaviour at all for both switches, which is 
what I intend to do.

> 
>>
>> This will resolve the problem here, and make my future work regarding the
>> PHY muxing feature on the MT7530 switch possible to do.
>>
>> Regarding the second part:
>> I'll take your changes to my current RFC patch series while addressing
>> Jesse's suggestion if this is fine by you.
> 
> Yes, I'd appreciate that and I'm ready to test and review once you post
> your updated series.

Sounds good, cheers.

Arınç

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2023-04-11 19:51 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-04-11  0:11 [PATCH net-next] net: dsa: mt7530: fix support for MT7531BE Daniel Golle
2023-04-11 15:44 ` Jesse Brandeburg
2023-04-11 19:30 ` Arınç ÜNAL
2023-04-11 19:43   ` Daniel Golle
2023-04-11 19:50     ` Arınç ÜNAL

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).