* [PATCH net-next 0/2] Add support for EN7581 to mt7530 driver
@ 2024-07-30 7:46 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 7:46 ` [PATCH net-next 2/2] net: dsa: mt7530: Add EN7581 support Lorenzo Bianconi
0 siblings, 2 replies; 8+ messages in thread
From: Lorenzo Bianconi @ 2024-07-30 7:46 UTC (permalink / raw)
To: netdev
Cc: arinc.unal, daniel, dqfext, sean.wang, andrew, f.fainelli,
olteanv, davem, edumazet, kuba, pabeni, matthias.bgg,
angelogioacchino.delregno, linux-arm-kernel, linux-mediatek,
lorenzo.bianconi83, robh, krzk+dt, conor+dt, devicetree, upstream
Add EN7581 support to MT7530 DSA driver.
Lorenzo Bianconi (2):
dt-bindings: net: dsa: mediatek,mt7530: Add airoha,en7581-switch
net: dsa: mt7530: Add EN7581 support
.../bindings/net/dsa/mediatek,mt7530.yaml | 9 ++++-
drivers/net/dsa/mt7530-mmio.c | 1 +
drivers/net/dsa/mt7530.c | 38 +++++++++++++++++--
drivers/net/dsa/mt7530.h | 16 +++++---
4 files changed, 54 insertions(+), 10 deletions(-)
--
2.45.2
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH net-next 1/2] dt-bindings: net: dsa: mediatek,mt7530: Add airoha,en7581-switch
2024-07-30 7:46 [PATCH net-next 0/2] Add support for EN7581 to mt7530 driver Lorenzo Bianconi
@ 2024-07-30 7:46 ` Lorenzo Bianconi
2024-07-30 8:57 ` Arınç ÜNAL
2024-07-30 7:46 ` [PATCH net-next 2/2] net: dsa: mt7530: Add EN7581 support Lorenzo Bianconi
1 sibling, 1 reply; 8+ messages in thread
From: Lorenzo Bianconi @ 2024-07-30 7:46 UTC (permalink / raw)
To: netdev
Cc: arinc.unal, daniel, dqfext, sean.wang, andrew, f.fainelli,
olteanv, davem, edumazet, kuba, pabeni, matthias.bgg,
angelogioacchino.delregno, linux-arm-kernel, linux-mediatek,
lorenzo.bianconi83, robh, krzk+dt, conor+dt, devicetree, upstream
Add documentation for the built-in switch which can be found in the
Airoha EN7581 SoC.
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
---
.../devicetree/bindings/net/dsa/mediatek,mt7530.yaml | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/Documentation/devicetree/bindings/net/dsa/mediatek,mt7530.yaml b/Documentation/devicetree/bindings/net/dsa/mediatek,mt7530.yaml
index 7e405ad96eb2..aa89bc89eb45 100644
--- a/Documentation/devicetree/bindings/net/dsa/mediatek,mt7530.yaml
+++ b/Documentation/devicetree/bindings/net/dsa/mediatek,mt7530.yaml
@@ -92,6 +92,10 @@ properties:
Built-in switch of the MT7988 SoC
const: mediatek,mt7988-switch
+ - description:
+ Built-in switch of the Airoha EN7581 SoC
+ const: airoha,en7581-switch
+
reg:
maxItems: 1
@@ -284,7 +288,10 @@ allOf:
- if:
properties:
compatible:
- const: mediatek,mt7988-switch
+ contains:
+ enum:
+ - mediatek,mt7988-switch
+ - airoha,en7581-switch
then:
$ref: "#/$defs/mt7530-dsa-port"
properties:
--
2.45.2
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH net-next 2/2] net: dsa: mt7530: Add EN7581 support
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 7:46 ` Lorenzo Bianconi
2024-07-30 10:21 ` Arınç ÜNAL
1 sibling, 1 reply; 8+ messages in thread
From: Lorenzo Bianconi @ 2024-07-30 7:46 UTC (permalink / raw)
To: netdev
Cc: arinc.unal, daniel, dqfext, sean.wang, andrew, f.fainelli,
olteanv, davem, edumazet, kuba, pabeni, matthias.bgg,
angelogioacchino.delregno, linux-arm-kernel, linux-mediatek,
lorenzo.bianconi83, robh, krzk+dt, conor+dt, devicetree, upstream
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:
__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);
+ }
+}
+
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,
+ },
};
EXPORT_SYMBOL_GPL(mt753x_table);
diff --git a/drivers/net/dsa/mt7530.h b/drivers/net/dsa/mt7530.h
index 28592123070b..d77b898b7187 100644
--- a/drivers/net/dsa/mt7530.h
+++ b/drivers/net/dsa/mt7530.h
@@ -19,6 +19,7 @@ enum mt753x_id {
ID_MT7621 = 1,
ID_MT7531 = 2,
ID_MT7988 = 3,
+ ID_EN7581 = 4,
};
#define NUM_TRGMII_CTRL 5
@@ -64,25 +65,30 @@ enum mt753x_id {
#define MT7531_CPU_PMAP(x) FIELD_PREP(MT7531_CPU_PMAP_MASK, x)
#define MT753X_MIRROR_REG(id) ((id == ID_MT7531 || \
- id == ID_MT7988) ? \
+ id == ID_MT7988 || \
+ id == ID_EN7581) ? \
MT7531_CFC : MT753X_MFC)
#define MT753X_MIRROR_EN(id) ((id == ID_MT7531 || \
- id == ID_MT7988) ? \
+ id == ID_MT7988 || \
+ id == ID_EN7581) ? \
MT7531_MIRROR_EN : MT7530_MIRROR_EN)
#define MT753X_MIRROR_PORT_MASK(id) ((id == ID_MT7531 || \
- id == ID_MT7988) ? \
+ id == ID_MT7988 || \
+ id == ID_EN7581) ? \
MT7531_MIRROR_PORT_MASK : \
MT7530_MIRROR_PORT_MASK)
#define MT753X_MIRROR_PORT_GET(id, val) ((id == ID_MT7531 || \
- id == ID_MT7988) ? \
+ id == ID_MT7988 || \
+ id == ID_EN7581) ? \
MT7531_MIRROR_PORT_GET(val) : \
MT7530_MIRROR_PORT_GET(val))
#define MT753X_MIRROR_PORT_SET(id, val) ((id == ID_MT7531 || \
- id == ID_MT7988) ? \
+ id == ID_MT7988 || \
+ id == ID_EN7581) ? \
MT7531_MIRROR_PORT_SET(val) : \
MT7530_MIRROR_PORT_SET(val))
--
2.45.2
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH net-next 1/2] dt-bindings: net: dsa: mediatek,mt7530: Add airoha,en7581-switch
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
0 siblings, 2 replies; 8+ messages in thread
From: Arınç ÜNAL @ 2024-07-30 8:57 UTC (permalink / raw)
To: Lorenzo Bianconi, netdev
Cc: daniel, dqfext, sean.wang, andrew, f.fainelli, olteanv, davem,
edumazet, kuba, pabeni, matthias.bgg, angelogioacchino.delregno,
linux-arm-kernel, linux-mediatek, lorenzo.bianconi83, robh,
krzk+dt, conor+dt, devicetree, upstream
On 30/07/2024 10:46, Lorenzo Bianconi wrote:
> Add documentation for the built-in switch which can be found in the
> Airoha EN7581 SoC.
>
> Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
> ---
> .../devicetree/bindings/net/dsa/mediatek,mt7530.yaml | 9 ++++++++-
> 1 file changed, 8 insertions(+), 1 deletion(-)
>
> diff --git a/Documentation/devicetree/bindings/net/dsa/mediatek,mt7530.yaml b/Documentation/devicetree/bindings/net/dsa/mediatek,mt7530.yaml
> index 7e405ad96eb2..aa89bc89eb45 100644
> --- a/Documentation/devicetree/bindings/net/dsa/mediatek,mt7530.yaml
> +++ b/Documentation/devicetree/bindings/net/dsa/mediatek,mt7530.yaml
> @@ -92,6 +92,10 @@ properties:
> Built-in switch of the MT7988 SoC
> const: mediatek,mt7988-switch
>
> + - description:
> + Built-in switch of the Airoha EN7581 SoC
> + const: airoha,en7581-switch
> +
> reg:
> maxItems: 1
>
> @@ -284,7 +288,10 @@ allOf:
> - if:
> properties:
> compatible:
> - const: mediatek,mt7988-switch
> + contains:
> + enum:
> + - mediatek,mt7988-switch
> + - airoha,en7581-switch
The compatible string won't be more than one item. So this would be a
better description:
compatible:
oneOf:
- const: mediatek,mt7988-switch
- const: airoha,en7581-switch
Arınç
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH net-next 2/2] net: dsa: mt7530: Add EN7581 support
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
0 siblings, 1 reply; 8+ messages in thread
From: Arınç ÜNAL @ 2024-07-30 10:21 UTC (permalink / raw)
To: Lorenzo Bianconi, netdev
Cc: daniel, dqfext, sean.wang, andrew, f.fainelli, olteanv, davem,
edumazet, kuba, pabeni, matthias.bgg, angelogioacchino.delregno,
linux-arm-kernel, linux-mediatek, lorenzo.bianconi83, robh,
krzk+dt, conor+dt, devicetree, upstream
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().
> __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 | \
> +
> 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.
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.
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ç
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH net-next 1/2] dt-bindings: net: dsa: mediatek,mt7530: Add airoha,en7581-switch
2024-07-30 8:57 ` Arınç ÜNAL
@ 2024-07-30 12:42 ` Lorenzo Bianconi
2024-07-30 20:03 ` Rob Herring
1 sibling, 0 replies; 8+ messages in thread
From: Lorenzo Bianconi @ 2024-07-30 12:42 UTC (permalink / raw)
To: Arınç ÜNAL
Cc: netdev, daniel, dqfext, sean.wang, andrew, f.fainelli, olteanv,
davem, edumazet, kuba, pabeni, matthias.bgg,
angelogioacchino.delregno, linux-arm-kernel, linux-mediatek,
lorenzo.bianconi83, robh, krzk+dt, conor+dt, devicetree, upstream
[-- Attachment #1: Type: text/plain, Size: 1553 bytes --]
> On 30/07/2024 10:46, Lorenzo Bianconi wrote:
> > Add documentation for the built-in switch which can be found in the
> > Airoha EN7581 SoC.
> >
> > Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
> > ---
> > .../devicetree/bindings/net/dsa/mediatek,mt7530.yaml | 9 ++++++++-
> > 1 file changed, 8 insertions(+), 1 deletion(-)
> >
> > diff --git a/Documentation/devicetree/bindings/net/dsa/mediatek,mt7530.yaml b/Documentation/devicetree/bindings/net/dsa/mediatek,mt7530.yaml
> > index 7e405ad96eb2..aa89bc89eb45 100644
> > --- a/Documentation/devicetree/bindings/net/dsa/mediatek,mt7530.yaml
> > +++ b/Documentation/devicetree/bindings/net/dsa/mediatek,mt7530.yaml
> > @@ -92,6 +92,10 @@ properties:
> > Built-in switch of the MT7988 SoC
> > const: mediatek,mt7988-switch
> > + - description:
> > + Built-in switch of the Airoha EN7581 SoC
> > + const: airoha,en7581-switch
> > +
> > reg:
> > maxItems: 1
> > @@ -284,7 +288,10 @@ allOf:
> > - if:
> > properties:
> > compatible:
> > - const: mediatek,mt7988-switch
> > + contains:
> > + enum:
> > + - mediatek,mt7988-switch
> > + - airoha,en7581-switch
>
> The compatible string won't be more than one item. So this would be a
> better description:
>
> compatible:
> oneOf:
> - const: mediatek,mt7988-switch
> - const: airoha,en7581-switch
>
> Arınç
ack, I will fix it in v2.
Regards,
Lorenzo
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 228 bytes --]
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH net-next 2/2] net: dsa: mt7530: Add EN7581 support
2024-07-30 10:21 ` Arınç ÜNAL
@ 2024-07-30 13:19 ` Lorenzo Bianconi
0 siblings, 0 replies; 8+ messages in thread
From: Lorenzo Bianconi @ 2024-07-30 13:19 UTC (permalink / raw)
To: Arınç ÜNAL
Cc: netdev, daniel, dqfext, sean.wang, andrew, f.fainelli, olteanv,
davem, edumazet, kuba, pabeni, matthias.bgg,
angelogioacchino.delregno, linux-arm-kernel, linux-mediatek,
lorenzo.bianconi83, robh, krzk+dt, conor+dt, devicetree, upstream
[-- 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 --]
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH net-next 1/2] dt-bindings: net: dsa: mediatek,mt7530: Add airoha,en7581-switch
2024-07-30 8:57 ` Arınç ÜNAL
2024-07-30 12:42 ` Lorenzo Bianconi
@ 2024-07-30 20:03 ` Rob Herring
1 sibling, 0 replies; 8+ messages in thread
From: Rob Herring @ 2024-07-30 20:03 UTC (permalink / raw)
To: Arınç ÜNAL
Cc: Lorenzo Bianconi, netdev, daniel, dqfext, sean.wang, andrew,
f.fainelli, olteanv, davem, edumazet, kuba, pabeni, matthias.bgg,
angelogioacchino.delregno, linux-arm-kernel, linux-mediatek,
lorenzo.bianconi83, krzk+dt, conor+dt, devicetree, upstream
On Tue, Jul 30, 2024 at 11:57:36AM +0300, Arınç ÜNAL wrote:
> On 30/07/2024 10:46, Lorenzo Bianconi wrote:
> > Add documentation for the built-in switch which can be found in the
> > Airoha EN7581 SoC.
> >
> > Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
> > ---
> > .../devicetree/bindings/net/dsa/mediatek,mt7530.yaml | 9 ++++++++-
> > 1 file changed, 8 insertions(+), 1 deletion(-)
> >
> > diff --git a/Documentation/devicetree/bindings/net/dsa/mediatek,mt7530.yaml b/Documentation/devicetree/bindings/net/dsa/mediatek,mt7530.yaml
> > index 7e405ad96eb2..aa89bc89eb45 100644
> > --- a/Documentation/devicetree/bindings/net/dsa/mediatek,mt7530.yaml
> > +++ b/Documentation/devicetree/bindings/net/dsa/mediatek,mt7530.yaml
> > @@ -92,6 +92,10 @@ properties:
> > Built-in switch of the MT7988 SoC
> > const: mediatek,mt7988-switch
> > + - description:
> > + Built-in switch of the Airoha EN7581 SoC
> > + const: airoha,en7581-switch
> > +
> > reg:
> > maxItems: 1
> > @@ -284,7 +288,10 @@ allOf:
> > - if:
> > properties:
> > compatible:
> > - const: mediatek,mt7988-switch
> > + contains:
> > + enum:
> > + - mediatek,mt7988-switch
> > + - airoha,en7581-switch
>
> The compatible string won't be more than one item. So this would be a
> better description:
>
> compatible:
> oneOf:
> - const: mediatek,mt7988-switch
> - const: airoha,en7581-switch
enum, not oneOf+const
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2024-07-30 20:03 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
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 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).