* [PATCH net-next v6 0/6] net: dsa: lantiq: add support for Intel GSW150
@ 2026-01-22 16:38 Daniel Golle
2026-01-22 16:38 ` [PATCH net-next v6 1/6] dt-bindings: net: dsa: lantiq,gswip: use correct node name Daniel Golle
` (6 more replies)
0 siblings, 7 replies; 8+ messages in thread
From: Daniel Golle @ 2026-01-22 16:38 UTC (permalink / raw)
To: Hauke Mehrtens, Andrew Lunn, Vladimir Oltean, David S. Miller,
Eric Dumazet, Jakub Kicinski, Paolo Abeni, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Russell King, netdev,
devicetree, linux-kernel
Cc: Chen Minqiang, Xinfa Deng
The Intel GSW150 Ethernet Switch (aka. Lantiq PEB7084) is the predecessor of
MaxLinear's GSW1xx series of switches. It shares most features, but has a
slightly different port layout and different MII interfaces.
Adding support for this switch to the mxl-gsw1xx driver is quite trivial.
---
Changes since v5:
* rebase on top of current net-next
* update Kconfig to mention GSW150
* allow configuring RGMII slewrate introduced by commit dbf24ab58fec3
("net: dsa: mxl-gsw1xx: Support R(G)MII slew rate configuration")
Changes since v4:
* fix wrong indexes in array default initializers
Changes since v3:
* spell out mii_cfg and mii_pcdu values in struct gswip_hw_info instead
of using default initializer which requires diag exception
Changes since v2:
* enclose the gswip_hw_info initializers in compiler diag exception
to prevent triggering -Woverride-init
Changes since initial submission:
* add patch fixing node naming convention for dt-bindings
* introduce GSWIP_MAX_PORTS macro
* don't assert SGMII PCS reset in case chip doesn't have SGMII
* use case ranges in phylink_get_caps
Daniel Golle (6):
dt-bindings: net: dsa: lantiq,gswip: use correct node name
dt-bindings: net: dsa: lantiq,gswip: add Intel GSW150
net: dsa: lantiq: allow arbitrary MII registers
net: dsa: lantiq: clean up phylink_get_caps switch statement
net: dsa: mxl-gsw1xx: only setup SerDes PCS if it exists
net: dsa: mxl-gsw1xx: add support for Intel GSW150
.../bindings/net/dsa/lantiq,gswip.yaml | 6 +-
drivers/net/dsa/lantiq/Kconfig | 4 +-
drivers/net/dsa/lantiq/lantiq_gswip.c | 46 ++++--
drivers/net/dsa/lantiq/lantiq_gswip.h | 6 +-
drivers/net/dsa/lantiq/lantiq_gswip_common.c | 27 +---
drivers/net/dsa/lantiq/mxl-gsw1xx.c | 151 ++++++++++++++----
drivers/net/dsa/lantiq/mxl-gsw1xx.h | 2 +
7 files changed, 168 insertions(+), 74 deletions(-)
--
2.52.0
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH net-next v6 1/6] dt-bindings: net: dsa: lantiq,gswip: use correct node name
2026-01-22 16:38 [PATCH net-next v6 0/6] net: dsa: lantiq: add support for Intel GSW150 Daniel Golle
@ 2026-01-22 16:38 ` Daniel Golle
2026-01-22 16:38 ` [PATCH net-next v6 2/6] dt-bindings: net: dsa: lantiq,gswip: add Intel GSW150 Daniel Golle
` (5 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Daniel Golle @ 2026-01-22 16:38 UTC (permalink / raw)
To: Hauke Mehrtens, Andrew Lunn, Vladimir Oltean, David S. Miller,
Eric Dumazet, Jakub Kicinski, Paolo Abeni, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Russell King, netdev,
devicetree, linux-kernel
Cc: Chen Minqiang, Xinfa Deng
Ethernet PHYs should use nodes named 'ethernet-phy@'.
Rename the Ethernet PHY nodes in the example to comply.
Signed-off-by: Daniel Golle <daniel@makrotopia.org>
Reviewed-by: Rob Herring (Arm) <robh@kernel.org>
---
v6: rebase on top of current net-next
v5: no changes
v4: no changes
v3: no changes
v2: new patch
Documentation/devicetree/bindings/net/dsa/lantiq,gswip.yaml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/Documentation/devicetree/bindings/net/dsa/lantiq,gswip.yaml b/Documentation/devicetree/bindings/net/dsa/lantiq,gswip.yaml
index 37d64b8a76ac7..027a91d276158 100644
--- a/Documentation/devicetree/bindings/net/dsa/lantiq,gswip.yaml
+++ b/Documentation/devicetree/bindings/net/dsa/lantiq,gswip.yaml
@@ -338,7 +338,7 @@ examples:
#address-cells = <1>;
#size-cells = <0>;
- switchphy0: switchphy@0 {
+ switchphy0: ethernet-phy@0 {
reg = <0>;
leds {
@@ -353,7 +353,7 @@ examples:
};
};
- switchphy1: switchphy@1 {
+ switchphy1: ethernet-phy@1 {
reg = <1>;
leds {
--
2.52.0
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH net-next v6 2/6] dt-bindings: net: dsa: lantiq,gswip: add Intel GSW150
2026-01-22 16:38 [PATCH net-next v6 0/6] net: dsa: lantiq: add support for Intel GSW150 Daniel Golle
2026-01-22 16:38 ` [PATCH net-next v6 1/6] dt-bindings: net: dsa: lantiq,gswip: use correct node name Daniel Golle
@ 2026-01-22 16:38 ` Daniel Golle
2026-01-22 16:39 ` [PATCH net-next v6 3/6] net: dsa: lantiq: allow arbitrary MII registers Daniel Golle
` (4 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Daniel Golle @ 2026-01-22 16:38 UTC (permalink / raw)
To: Hauke Mehrtens, Andrew Lunn, Vladimir Oltean, David S. Miller,
Eric Dumazet, Jakub Kicinski, Paolo Abeni, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Russell King, netdev,
devicetree, linux-kernel
Cc: Chen Minqiang, Xinfa Deng
Add compatible strings for the Intel GSW150 which is apparently
identical or at least compatible with the Lantiq PEB7084 Ethernet
switch IC.
Signed-off-by: Daniel Golle <daniel@makrotopia.org>
Reviewed-by: Rob Herring (Arm) <robh@kernel.org>
---
v6: rebase on top of current net-next
v5: no changes
v4: no changes
v3: no changes
v2: no changes
Documentation/devicetree/bindings/net/dsa/lantiq,gswip.yaml | 2 ++
1 file changed, 2 insertions(+)
diff --git a/Documentation/devicetree/bindings/net/dsa/lantiq,gswip.yaml b/Documentation/devicetree/bindings/net/dsa/lantiq,gswip.yaml
index 027a91d276158..f601e5f9fa6ad 100644
--- a/Documentation/devicetree/bindings/net/dsa/lantiq,gswip.yaml
+++ b/Documentation/devicetree/bindings/net/dsa/lantiq,gswip.yaml
@@ -19,6 +19,8 @@ maintainers:
properties:
compatible:
enum:
+ - intel,gsw150
+ - lantiq,peb7084
- lantiq,xrx200-gswip
- lantiq,xrx300-gswip
- lantiq,xrx330-gswip
--
2.52.0
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH net-next v6 3/6] net: dsa: lantiq: allow arbitrary MII registers
2026-01-22 16:38 [PATCH net-next v6 0/6] net: dsa: lantiq: add support for Intel GSW150 Daniel Golle
2026-01-22 16:38 ` [PATCH net-next v6 1/6] dt-bindings: net: dsa: lantiq,gswip: use correct node name Daniel Golle
2026-01-22 16:38 ` [PATCH net-next v6 2/6] dt-bindings: net: dsa: lantiq,gswip: add Intel GSW150 Daniel Golle
@ 2026-01-22 16:39 ` Daniel Golle
2026-01-22 16:39 ` [PATCH net-next v6 4/6] net: dsa: lantiq: clean up phylink_get_caps switch statement Daniel Golle
` (3 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Daniel Golle @ 2026-01-22 16:39 UTC (permalink / raw)
To: Hauke Mehrtens, Andrew Lunn, Vladimir Oltean, David S. Miller,
Eric Dumazet, Jakub Kicinski, Paolo Abeni, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Russell King, netdev,
devicetree, linux-kernel
Cc: Chen Minqiang, Xinfa Deng
The Lantiq GSWIP and MaxLinear GSW1xx drivers are currently relying on a
hard-coded mapping of MII ports to their respective MII_CFG and MII_PCDU
registers and only allow applying an offset to the port index.
While this is sufficient for the currently supported hardware, the very
similar Intel GSW150 (aka. Lantiq PEB7084) cannot be described using
this arrangement.
Introduce two arrays to specify the MII_CFG and MII_PCDU registers for
each port, replacing the current bitmap used to safeguard MII ports as
well as the port index offset.
Signed-off-by: Daniel Golle <daniel@makrotopia.org>
---
v6: rebase on top of current net-next
v5: fix wrong indexes in array initializers
v4: spell out mii_cfg and mii_pcdu values in struct gswip_hw_info instead
of using default initializer which requires diag exception
v3: enclose the gswip_hw_info initializers in compiler diag exception
to prevent triggering -Woverride-init
v2: introduce GSWIP_MAX_PORTS macro
drivers/net/dsa/lantiq/lantiq_gswip.c | 34 ++++++++++++++----
drivers/net/dsa/lantiq/lantiq_gswip.h | 6 ++--
drivers/net/dsa/lantiq/lantiq_gswip_common.c | 27 +++------------
drivers/net/dsa/lantiq/mxl-gsw1xx.c | 36 ++++++++++++++++----
4 files changed, 66 insertions(+), 37 deletions(-)
diff --git a/drivers/net/dsa/lantiq/lantiq_gswip.c b/drivers/net/dsa/lantiq/lantiq_gswip.c
index b094001a7c805..0377fc0079b54 100644
--- a/drivers/net/dsa/lantiq/lantiq_gswip.c
+++ b/drivers/net/dsa/lantiq/lantiq_gswip.c
@@ -463,10 +463,22 @@ static void gswip_shutdown(struct platform_device *pdev)
}
static const struct gswip_hw_info gswip_xrx200 = {
- .max_ports = 7,
+ .max_ports = GSWIP_MAX_PORTS,
.allowed_cpu_ports = BIT(6),
- .mii_ports = BIT(0) | BIT(1) | BIT(5),
- .mii_port_reg_offset = 0,
+ .mii_cfg = {
+ [0] = GSWIP_MII_CFGp(0),
+ [1] = GSWIP_MII_CFGp(1),
+ [2 ... 4] = -1,
+ [5] = GSWIP_MII_CFGp(5),
+ [6] = -1,
+ },
+ .mii_pcdu = {
+ [0] = GSWIP_MII_PCDU0,
+ [1] = GSWIP_MII_PCDU1,
+ [2 ... 4] = -1,
+ [5] = GSWIP_MII_PCDU5,
+ [6] = -1,
+ },
.phylink_get_caps = gswip_xrx200_phylink_get_caps,
.pce_microcode = &gswip_pce_microcode,
.pce_microcode_size = ARRAY_SIZE(gswip_pce_microcode),
@@ -474,10 +486,20 @@ static const struct gswip_hw_info gswip_xrx200 = {
};
static const struct gswip_hw_info gswip_xrx300 = {
- .max_ports = 7,
+ .max_ports = GSWIP_MAX_PORTS,
.allowed_cpu_ports = BIT(6),
- .mii_ports = BIT(0) | BIT(5),
- .mii_port_reg_offset = 0,
+ .mii_cfg = {
+ [0] = GSWIP_MII_CFGp(0),
+ [1 ... 4] = -1,
+ [5] = GSWIP_MII_CFGp(5),
+ [6] = -1,
+ },
+ .mii_pcdu = {
+ [0] = GSWIP_MII_PCDU0,
+ [1 ... 4] = -1,
+ [5] = GSWIP_MII_PCDU5,
+ [6] = -1,
+ },
.phylink_get_caps = gswip_xrx300_phylink_get_caps,
.pce_microcode = &gswip_pce_microcode,
.pce_microcode_size = ARRAY_SIZE(gswip_pce_microcode),
diff --git a/drivers/net/dsa/lantiq/lantiq_gswip.h b/drivers/net/dsa/lantiq/lantiq_gswip.h
index 8fc4c7cc5283a..bc3686faad0d6 100644
--- a/drivers/net/dsa/lantiq/lantiq_gswip.h
+++ b/drivers/net/dsa/lantiq/lantiq_gswip.h
@@ -243,6 +243,8 @@
#define GSWIP_VLAN_UNAWARE_PVID 0
+#define GSWIP_MAX_PORTS 7
+
struct gswip_pce_microcode {
u16 val_3;
u16 val_2;
@@ -253,8 +255,8 @@ struct gswip_pce_microcode {
struct gswip_hw_info {
int max_ports;
unsigned int allowed_cpu_ports;
- unsigned int mii_ports;
- int mii_port_reg_offset;
+ s16 mii_cfg[GSWIP_MAX_PORTS];
+ s16 mii_pcdu[GSWIP_MAX_PORTS];
bool supports_2500m;
const struct gswip_pce_microcode (*pce_microcode)[];
size_t pce_microcode_size;
diff --git a/drivers/net/dsa/lantiq/lantiq_gswip_common.c b/drivers/net/dsa/lantiq/lantiq_gswip_common.c
index 17a61e445f00f..0e8eedf64d3a3 100644
--- a/drivers/net/dsa/lantiq/lantiq_gswip_common.c
+++ b/drivers/net/dsa/lantiq/lantiq_gswip_common.c
@@ -118,15 +118,11 @@ static u32 gswip_switch_r_timeout(struct gswip_priv *priv, u32 offset,
static void gswip_mii_mask_cfg(struct gswip_priv *priv, u32 mask, u32 set,
int port)
{
- int reg_port;
-
/* MII_CFG register only exists for MII ports */
- if (!(priv->hw_info->mii_ports & BIT(port)))
+ if (priv->hw_info->mii_cfg[port] == -1)
return;
- reg_port = port + priv->hw_info->mii_port_reg_offset;
-
- regmap_write_bits(priv->mii, GSWIP_MII_CFGp(reg_port), mask,
+ regmap_write_bits(priv->mii, priv->hw_info->mii_cfg[port], mask,
set);
}
@@ -610,28 +606,13 @@ static void gswip_mii_delay_setup(struct gswip_priv *priv, struct dsa_port *dp,
u32 tx_delay = GSWIP_MII_PCDU_TXDLY_DEFAULT;
u32 rx_delay = GSWIP_MII_PCDU_RXDLY_DEFAULT;
struct device_node *port_dn = dp->dn;
- u16 mii_pcdu_reg;
/* As MII_PCDU registers only exist for MII ports, silently return
* unless the port is an MII port
*/
- if (!(priv->hw_info->mii_ports & BIT(dp->index)))
+ if (priv->hw_info->mii_pcdu[dp->index] == -1)
return;
- switch (dp->index + priv->hw_info->mii_port_reg_offset) {
- case 0:
- mii_pcdu_reg = GSWIP_MII_PCDU0;
- break;
- case 1:
- mii_pcdu_reg = GSWIP_MII_PCDU1;
- break;
- case 5:
- mii_pcdu_reg = GSWIP_MII_PCDU5;
- break;
- default:
- return;
- }
-
/* legacy code to set default delays according to the interface mode */
switch (interface) {
case PHY_INTERFACE_MODE_RGMII_ID:
@@ -652,7 +633,7 @@ static void gswip_mii_delay_setup(struct gswip_priv *priv, struct dsa_port *dp,
of_property_read_u32(port_dn, "rx-internal-delay-ps", &rx_delay);
of_property_read_u32(port_dn, "tx-internal-delay-ps", &tx_delay);
- regmap_write_bits(priv->mii, mii_pcdu_reg,
+ regmap_write_bits(priv->mii, priv->hw_info->mii_pcdu[dp->index],
GSWIP_MII_PCDU_TXDLY_MASK |
GSWIP_MII_PCDU_RXDLY_MASK,
GSWIP_MII_PCDU_TXDLY(tx_delay) |
diff --git a/drivers/net/dsa/lantiq/mxl-gsw1xx.c b/drivers/net/dsa/lantiq/mxl-gsw1xx.c
index 6afc7539fefbe..c9cc277e382c2 100644
--- a/drivers/net/dsa/lantiq/mxl-gsw1xx.c
+++ b/drivers/net/dsa/lantiq/mxl-gsw1xx.c
@@ -739,8 +739,16 @@ static void gsw1xx_shutdown(struct mdio_device *mdiodev)
static const struct gswip_hw_info gsw12x_data = {
.max_ports = GSW1XX_PORTS,
.allowed_cpu_ports = BIT(GSW1XX_MII_PORT) | BIT(GSW1XX_SGMII_PORT),
- .mii_ports = BIT(GSW1XX_MII_PORT),
- .mii_port_reg_offset = -GSW1XX_MII_PORT,
+ .mii_cfg = {
+ [0 ... GSW1XX_MII_PORT - 1] = -1,
+ [GSW1XX_MII_PORT] = GSWIP_MII_CFGp(0),
+ [GSW1XX_MII_PORT + 1 ... GSWIP_MAX_PORTS - 1] = -1,
+ },
+ .mii_pcdu = {
+ [0 ... GSW1XX_MII_PORT - 1] = -1,
+ [GSW1XX_MII_PORT] = GSWIP_MII_PCDU0,
+ [GSW1XX_MII_PORT + 1 ... GSWIP_MAX_PORTS - 1] = -1,
+ },
.mac_select_pcs = gsw1xx_phylink_mac_select_pcs,
.phylink_get_caps = &gsw1xx_phylink_get_caps,
.supports_2500m = true,
@@ -753,8 +761,16 @@ static const struct gswip_hw_info gsw12x_data = {
static const struct gswip_hw_info gsw140_data = {
.max_ports = GSW1XX_PORTS,
.allowed_cpu_ports = BIT(GSW1XX_MII_PORT) | BIT(GSW1XX_SGMII_PORT),
- .mii_ports = BIT(GSW1XX_MII_PORT),
- .mii_port_reg_offset = -GSW1XX_MII_PORT,
+ .mii_cfg = {
+ [0 ... GSW1XX_MII_PORT - 1] = -1,
+ [GSW1XX_MII_PORT] = GSWIP_MII_CFGp(0),
+ [GSW1XX_MII_PORT + 1 ... GSWIP_MAX_PORTS - 1] = -1,
+ },
+ .mii_pcdu = {
+ [0 ... GSW1XX_MII_PORT - 1] = -1,
+ [GSW1XX_MII_PORT] = GSWIP_MII_PCDU0,
+ [GSW1XX_MII_PORT + 1 ... GSWIP_MAX_PORTS - 1] = -1,
+ },
.mac_select_pcs = gsw1xx_phylink_mac_select_pcs,
.phylink_get_caps = &gsw1xx_phylink_get_caps,
.supports_2500m = true,
@@ -767,8 +783,16 @@ static const struct gswip_hw_info gsw140_data = {
static const struct gswip_hw_info gsw141_data = {
.max_ports = GSW1XX_PORTS,
.allowed_cpu_ports = BIT(GSW1XX_MII_PORT) | BIT(GSW1XX_SGMII_PORT),
- .mii_ports = BIT(GSW1XX_MII_PORT),
- .mii_port_reg_offset = -GSW1XX_MII_PORT,
+ .mii_cfg = {
+ [0 ... GSW1XX_MII_PORT - 1] = -1,
+ [GSW1XX_MII_PORT] = GSWIP_MII_CFGp(0),
+ [GSW1XX_MII_PORT + 1 ... GSWIP_MAX_PORTS - 1] = -1,
+ },
+ .mii_pcdu = {
+ [0 ... GSW1XX_MII_PORT - 1] = -1,
+ [GSW1XX_MII_PORT] = GSWIP_MII_PCDU0,
+ [GSW1XX_MII_PORT + 1 ... GSWIP_MAX_PORTS - 1] = -1,
+ },
.mac_select_pcs = gsw1xx_phylink_mac_select_pcs,
.phylink_get_caps = gsw1xx_phylink_get_caps,
.port_setup = gsw1xx_port_setup,
--
2.52.0
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH net-next v6 4/6] net: dsa: lantiq: clean up phylink_get_caps switch statement
2026-01-22 16:38 [PATCH net-next v6 0/6] net: dsa: lantiq: add support for Intel GSW150 Daniel Golle
` (2 preceding siblings ...)
2026-01-22 16:39 ` [PATCH net-next v6 3/6] net: dsa: lantiq: allow arbitrary MII registers Daniel Golle
@ 2026-01-22 16:39 ` Daniel Golle
2026-01-22 16:39 ` [PATCH net-next v6 5/6] net: dsa: mxl-gsw1xx: only setup SerDes PCS if it exists Daniel Golle
` (2 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Daniel Golle @ 2026-01-22 16:39 UTC (permalink / raw)
To: Hauke Mehrtens, Andrew Lunn, Vladimir Oltean, David S. Miller,
Eric Dumazet, Jakub Kicinski, Paolo Abeni, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Russell King, netdev,
devicetree, linux-kernel
Cc: Chen Minqiang, Xinfa Deng
Use case ranges for phylink_get_caps and remove the redundant "port N:"
from the comments.
Suggested-by: Vladimir Oltean <olteanv@gmail.com>
Signed-off-by: Daniel Golle <daniel@makrotopia.org>
---
v6: rebase on top of current net-next
v5: no changes
v4: no changes
v3: no changes
v2: new patch
drivers/net/dsa/lantiq/lantiq_gswip.c | 12 +++---------
drivers/net/dsa/lantiq/mxl-gsw1xx.c | 11 +++++------
2 files changed, 8 insertions(+), 15 deletions(-)
diff --git a/drivers/net/dsa/lantiq/lantiq_gswip.c b/drivers/net/dsa/lantiq/lantiq_gswip.c
index 0377fc0079b54..4d699d8c16f91 100644
--- a/drivers/net/dsa/lantiq/lantiq_gswip.c
+++ b/drivers/net/dsa/lantiq/lantiq_gswip.c
@@ -33,8 +33,7 @@ static void gswip_xrx200_phylink_get_caps(struct dsa_switch *ds, int port,
struct phylink_config *config)
{
switch (port) {
- case 0:
- case 1:
+ case 0 ... 1:
phy_interface_set_rgmii(config->supported_interfaces);
__set_bit(PHY_INTERFACE_MODE_MII,
config->supported_interfaces);
@@ -44,9 +43,7 @@ static void gswip_xrx200_phylink_get_caps(struct dsa_switch *ds, int port,
config->supported_interfaces);
break;
- case 2:
- case 3:
- case 4:
+ case 2 ... 4:
case 6:
__set_bit(PHY_INTERFACE_MODE_INTERNAL,
config->supported_interfaces);
@@ -75,10 +72,7 @@ static void gswip_xrx300_phylink_get_caps(struct dsa_switch *ds, int port,
config->supported_interfaces);
break;
- case 1:
- case 2:
- case 3:
- case 4:
+ case 1 ... 4:
case 6:
__set_bit(PHY_INTERFACE_MODE_INTERNAL,
config->supported_interfaces);
diff --git a/drivers/net/dsa/lantiq/mxl-gsw1xx.c b/drivers/net/dsa/lantiq/mxl-gsw1xx.c
index c9cc277e382c2..ba72111a53ad0 100644
--- a/drivers/net/dsa/lantiq/mxl-gsw1xx.c
+++ b/drivers/net/dsa/lantiq/mxl-gsw1xx.c
@@ -511,14 +511,12 @@ static void gsw1xx_phylink_get_caps(struct dsa_switch *ds, int port,
MAC_10 | MAC_100 | MAC_1000;
switch (port) {
- case 0:
- case 1:
- case 2:
- case 3:
+ case 0 ... 3: /* built-in PHYs */
__set_bit(PHY_INTERFACE_MODE_INTERNAL,
config->supported_interfaces);
break;
- case 4: /* port 4: SGMII */
+
+ case 4: /* SGMII */
__set_bit(PHY_INTERFACE_MODE_SGMII,
config->supported_interfaces);
__set_bit(PHY_INTERFACE_MODE_1000BASEX,
@@ -529,7 +527,8 @@ static void gsw1xx_phylink_get_caps(struct dsa_switch *ds, int port,
config->mac_capabilities |= MAC_2500FD;
}
return; /* no support for EEE on SGMII port */
- case 5: /* port 5: RGMII or RMII */
+
+ case 5: /* RGMII or RMII */
__set_bit(PHY_INTERFACE_MODE_RMII,
config->supported_interfaces);
phy_interface_set_rgmii(config->supported_interfaces);
--
2.52.0
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH net-next v6 5/6] net: dsa: mxl-gsw1xx: only setup SerDes PCS if it exists
2026-01-22 16:38 [PATCH net-next v6 0/6] net: dsa: lantiq: add support for Intel GSW150 Daniel Golle
` (3 preceding siblings ...)
2026-01-22 16:39 ` [PATCH net-next v6 4/6] net: dsa: lantiq: clean up phylink_get_caps switch statement Daniel Golle
@ 2026-01-22 16:39 ` Daniel Golle
2026-01-22 16:39 ` [PATCH net-next v6 6/6] net: dsa: mxl-gsw1xx: add support for Intel GSW150 Daniel Golle
2026-01-27 11:10 ` [PATCH net-next v6 0/6] net: dsa: lantiq: " patchwork-bot+netdevbpf
6 siblings, 0 replies; 8+ messages in thread
From: Daniel Golle @ 2026-01-22 16:39 UTC (permalink / raw)
To: Hauke Mehrtens, Andrew Lunn, Vladimir Oltean, David S. Miller,
Eric Dumazet, Jakub Kicinski, Paolo Abeni, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Russell King, netdev,
devicetree, linux-kernel
Cc: Chen Minqiang, Xinfa Deng
Older Intel GSW150 chip doesn't have a SGMII/1000Base-X/2500Base-X PCS.
Prepare for supporting Intel GSW150 by skipping PCS reset and
initialization in case no .mac_select_pcs operation is defined.
Signed-off-by: Daniel Golle <daniel@makrotopia.org>
---
v6: rebase on top of current net-next
v5: no changes
v4: no changes
v3: no changes
v2: new patch
drivers/net/dsa/lantiq/mxl-gsw1xx.c | 37 ++++++++++++++++++-----------
1 file changed, 23 insertions(+), 14 deletions(-)
diff --git a/drivers/net/dsa/lantiq/mxl-gsw1xx.c b/drivers/net/dsa/lantiq/mxl-gsw1xx.c
index ba72111a53ad0..c6fa93229349a 100644
--- a/drivers/net/dsa/lantiq/mxl-gsw1xx.c
+++ b/drivers/net/dsa/lantiq/mxl-gsw1xx.c
@@ -615,6 +615,28 @@ static struct regmap *gsw1xx_regmap_init(struct gsw1xx_priv *priv,
priv, &config);
}
+static int gsw1xx_serdes_pcs_init(struct gsw1xx_priv *priv)
+{
+ /* do nothing if the chip doesn't have a SerDes PCS */
+ if (!priv->gswip.hw_info->mac_select_pcs)
+ return 0;
+
+ priv->pcs.ops = &gsw1xx_pcs_ops;
+ priv->pcs.poll = true;
+ __set_bit(PHY_INTERFACE_MODE_SGMII,
+ priv->pcs.supported_interfaces);
+ __set_bit(PHY_INTERFACE_MODE_1000BASEX,
+ priv->pcs.supported_interfaces);
+ if (priv->gswip.hw_info->supports_2500m)
+ __set_bit(PHY_INTERFACE_MODE_2500BASEX,
+ priv->pcs.supported_interfaces);
+ priv->tbi_interface = PHY_INTERFACE_MODE_NA;
+
+ /* assert SGMII reset to power down SGMII unit */
+ return regmap_set_bits(priv->shell, GSW1XX_SHELL_RST_REQ,
+ GSW1XX_RST_REQ_SGMII_SHELL);
+}
+
static int gsw1xx_probe(struct mdio_device *mdiodev)
{
struct device *dev = &mdiodev->dev;
@@ -667,20 +689,7 @@ static int gsw1xx_probe(struct mdio_device *mdiodev)
if (IS_ERR(priv->shell))
return PTR_ERR(priv->shell);
- priv->pcs.ops = &gsw1xx_pcs_ops;
- priv->pcs.poll = true;
- __set_bit(PHY_INTERFACE_MODE_SGMII,
- priv->pcs.supported_interfaces);
- __set_bit(PHY_INTERFACE_MODE_1000BASEX,
- priv->pcs.supported_interfaces);
- if (priv->gswip.hw_info->supports_2500m)
- __set_bit(PHY_INTERFACE_MODE_2500BASEX,
- priv->pcs.supported_interfaces);
- priv->tbi_interface = PHY_INTERFACE_MODE_NA;
-
- /* assert SGMII reset to power down SGMII unit */
- ret = regmap_set_bits(priv->shell, GSW1XX_SHELL_RST_REQ,
- GSW1XX_RST_REQ_SGMII_SHELL);
+ ret = gsw1xx_serdes_pcs_init(priv);
if (ret < 0)
return ret;
--
2.52.0
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH net-next v6 6/6] net: dsa: mxl-gsw1xx: add support for Intel GSW150
2026-01-22 16:38 [PATCH net-next v6 0/6] net: dsa: lantiq: add support for Intel GSW150 Daniel Golle
` (4 preceding siblings ...)
2026-01-22 16:39 ` [PATCH net-next v6 5/6] net: dsa: mxl-gsw1xx: only setup SerDes PCS if it exists Daniel Golle
@ 2026-01-22 16:39 ` Daniel Golle
2026-01-27 11:10 ` [PATCH net-next v6 0/6] net: dsa: lantiq: " patchwork-bot+netdevbpf
6 siblings, 0 replies; 8+ messages in thread
From: Daniel Golle @ 2026-01-22 16:39 UTC (permalink / raw)
To: Hauke Mehrtens, Andrew Lunn, Vladimir Oltean, David S. Miller,
Eric Dumazet, Jakub Kicinski, Paolo Abeni, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Russell King, netdev,
devicetree, linux-kernel
Cc: Chen Minqiang, Xinfa Deng
Add support for the Intel GSW150 (aka. Lantiq PEB7084) switch IC to
the mxl-gsw1xx driver. This switch comes with 5 Gigabit Ethernet
copper ports (Intel XWAY PHY11G (xRX v1.2 integrated) PHYs) as well as
one GMII/RGMII and one RGMII port.
Signed-off-by: Daniel Golle <daniel@makrotopia.org>
---
v6:
* rebase on top of current net-next
* update Kconfig to mention GSW150
* allow configuring RGMII slewrate introduced by commit dbf24ab58fec3
("net: dsa: mxl-gsw1xx: Support R(G)MII slew rate configuration")
v5: no changes
v4: spell out mii_cfg and mii_pcdu values in struct gswip_hw_info instead
of using default initializer which requires diag exception
v3: enclose the gswip_hw_info initializers in compiler diag exception
to prevent triggering -Woverride-init
v2: clean-up phylink_get_caps
drivers/net/dsa/lantiq/Kconfig | 4 +-
drivers/net/dsa/lantiq/mxl-gsw1xx.c | 67 ++++++++++++++++++++++++++---
drivers/net/dsa/lantiq/mxl-gsw1xx.h | 2 +
3 files changed, 67 insertions(+), 6 deletions(-)
diff --git a/drivers/net/dsa/lantiq/Kconfig b/drivers/net/dsa/lantiq/Kconfig
index 4a9771be5d588..bad13817af257 100644
--- a/drivers/net/dsa/lantiq/Kconfig
+++ b/drivers/net/dsa/lantiq/Kconfig
@@ -16,9 +16,11 @@ config NET_DSA_MXL_GSW1XX
select NET_DSA_TAG_MXL_GSW1XX
select NET_DSA_LANTIQ_COMMON
help
- This enables support for the MaxLinear GSW1xx family of 1GE switches
+ This enables support for the Intel/MaxLinear GSW1xx family of 1GE
+ switches.
GSW120 4 port, 2 PHYs, RGMII & SGMII/2500Base-X
GSW125 4 port, 2 PHYs, RGMII & SGMII/2500Base-X, industrial temperature
GSW140 6 port, 4 PHYs, RGMII & SGMII/2500Base-X
GSW141 6 port, 4 PHYs, RGMII & SGMII
GSW145 6 port, 4 PHYs, RGMII & SGMII/2500Base-X, industrial temperature
+ GSW150 7 port, 5 PHYs, 1x GMII/RGMII, 1x RGMII
diff --git a/drivers/net/dsa/lantiq/mxl-gsw1xx.c b/drivers/net/dsa/lantiq/mxl-gsw1xx.c
index c6fa93229349a..79cf72cc77be9 100644
--- a/drivers/net/dsa/lantiq/mxl-gsw1xx.c
+++ b/drivers/net/dsa/lantiq/mxl-gsw1xx.c
@@ -502,6 +502,14 @@ static const struct phylink_pcs_ops gsw1xx_pcs_ops = {
.pcs_link_up = gsw1xx_pcs_link_up,
};
+static void gsw1xx_phylink_get_lpi_caps(struct phylink_config *config)
+{
+ config->lpi_capabilities = MAC_100FD | MAC_1000FD;
+ config->lpi_timer_default = 20;
+ memcpy(config->lpi_interfaces, config->supported_interfaces,
+ sizeof(config->lpi_interfaces));
+}
+
static void gsw1xx_phylink_get_caps(struct dsa_switch *ds, int port,
struct phylink_config *config)
{
@@ -535,10 +543,32 @@ static void gsw1xx_phylink_get_caps(struct dsa_switch *ds, int port,
break;
}
- config->lpi_capabilities = MAC_100FD | MAC_1000FD;
- config->lpi_timer_default = 20;
- memcpy(config->lpi_interfaces, config->supported_interfaces,
- sizeof(config->lpi_interfaces));
+ gsw1xx_phylink_get_lpi_caps(config);
+}
+
+static void gsw150_phylink_get_caps(struct dsa_switch *ds, int port,
+ struct phylink_config *config)
+{
+ config->mac_capabilities = MAC_ASYM_PAUSE | MAC_SYM_PAUSE |
+ MAC_10 | MAC_100 | MAC_1000;
+
+ switch (port) {
+ case 0 ... 4: /* built-in PHYs */
+ __set_bit(PHY_INTERFACE_MODE_INTERNAL,
+ config->supported_interfaces);
+ break;
+
+ case 5: /* GMII or RGMII */
+ __set_bit(PHY_INTERFACE_MODE_GMII,
+ config->supported_interfaces);
+ fallthrough;
+
+ case 6: /* RGMII */
+ phy_interface_set_rgmii(config->supported_interfaces);
+ break;
+ }
+
+ gsw1xx_phylink_get_lpi_caps(config);
}
static struct phylink_pcs *gsw1xx_phylink_mac_select_pcs(struct phylink_config *config,
@@ -809,11 +839,38 @@ static const struct gswip_hw_info gsw141_data = {
.tag_protocol = DSA_TAG_PROTO_MXL_GSW1XX,
};
+static const struct gswip_hw_info gsw150_data = {
+ .max_ports = GSW150_PORTS,
+ .allowed_cpu_ports = BIT(5) | BIT(6),
+ .mii_cfg = {
+ [0 ... 4] = -1,
+ [5] = 0,
+ [6] = 10,
+ },
+ .mii_pcdu = {
+ [0 ... 4] = -1,
+ [5] = 1,
+ [6] = 11,
+ },
+ .phylink_get_caps = gsw150_phylink_get_caps,
+ /* There is only a single RGMII_SLEW_CFG register in GSW150 and it is
+ * unknown if RGMII slew configuration affects both RGMII ports
+ * or only port 5. Use .port_setup which assumes it affects port 5
+ * for now.
+ */
+ .port_setup = gsw1xx_port_setup,
+ .pce_microcode = &gsw1xx_pce_microcode,
+ .pce_microcode_size = ARRAY_SIZE(gsw1xx_pce_microcode),
+ .tag_protocol = DSA_TAG_PROTO_MXL_GSW1XX,
+};
+
/*
* GSW125 is the industrial temperature version of GSW120.
* GSW145 is the industrial temperature version of GSW140.
*/
static const struct of_device_id gsw1xx_of_match[] = {
+ { .compatible = "intel,gsw150", .data = &gsw150_data },
+ { .compatible = "lantiq,peb7084", .data = &gsw150_data },
{ .compatible = "maxlinear,gsw120", .data = &gsw12x_data },
{ .compatible = "maxlinear,gsw125", .data = &gsw12x_data },
{ .compatible = "maxlinear,gsw140", .data = &gsw140_data },
@@ -837,5 +894,5 @@ static struct mdio_driver gsw1xx_driver = {
mdio_module_driver(gsw1xx_driver);
MODULE_AUTHOR("Daniel Golle <daniel@makrotopia.org>");
-MODULE_DESCRIPTION("Driver for MaxLinear GSW1xx ethernet switch");
+MODULE_DESCRIPTION("Driver for Intel/MaxLinear GSW1xx Ethernet switch");
MODULE_LICENSE("GPL");
diff --git a/drivers/net/dsa/lantiq/mxl-gsw1xx.h b/drivers/net/dsa/lantiq/mxl-gsw1xx.h
index 8c0298b2b7663..d1fded56e9678 100644
--- a/drivers/net/dsa/lantiq/mxl-gsw1xx.h
+++ b/drivers/net/dsa/lantiq/mxl-gsw1xx.h
@@ -10,6 +10,8 @@
#include <linux/bitfield.h>
#define GSW1XX_PORTS 6
+#define GSW150_PORTS 7
+
/* Port used for RGMII or optional RMII */
#define GSW1XX_MII_PORT 5
/* Port used for SGMII */
--
2.52.0
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH net-next v6 0/6] net: dsa: lantiq: add support for Intel GSW150
2026-01-22 16:38 [PATCH net-next v6 0/6] net: dsa: lantiq: add support for Intel GSW150 Daniel Golle
` (5 preceding siblings ...)
2026-01-22 16:39 ` [PATCH net-next v6 6/6] net: dsa: mxl-gsw1xx: add support for Intel GSW150 Daniel Golle
@ 2026-01-27 11:10 ` patchwork-bot+netdevbpf
6 siblings, 0 replies; 8+ messages in thread
From: patchwork-bot+netdevbpf @ 2026-01-27 11:10 UTC (permalink / raw)
To: Daniel Golle
Cc: hauke, andrew, olteanv, davem, edumazet, kuba, pabeni, robh,
krzk+dt, conor+dt, linux, netdev, devicetree, linux-kernel,
ptpt52, xinfa.deng
Hello:
This series was applied to netdev/net-next.git (main)
by Paolo Abeni <pabeni@redhat.com>:
On Thu, 22 Jan 2026 16:38:36 +0000 you wrote:
> The Intel GSW150 Ethernet Switch (aka. Lantiq PEB7084) is the predecessor of
> MaxLinear's GSW1xx series of switches. It shares most features, but has a
> slightly different port layout and different MII interfaces.
> Adding support for this switch to the mxl-gsw1xx driver is quite trivial.
> ---
> Changes since v5:
> * rebase on top of current net-next
> * update Kconfig to mention GSW150
> * allow configuring RGMII slewrate introduced by commit dbf24ab58fec3
> ("net: dsa: mxl-gsw1xx: Support R(G)MII slew rate configuration")
>
> [...]
Here is the summary with links:
- [net-next,v6,1/6] dt-bindings: net: dsa: lantiq,gswip: use correct node name
https://git.kernel.org/netdev/net-next/c/b6d6f017022f
- [net-next,v6,2/6] dt-bindings: net: dsa: lantiq,gswip: add Intel GSW150
https://git.kernel.org/netdev/net-next/c/e7e354aa496b
- [net-next,v6,3/6] net: dsa: lantiq: allow arbitrary MII registers
https://git.kernel.org/netdev/net-next/c/338375118514
- [net-next,v6,4/6] net: dsa: lantiq: clean up phylink_get_caps switch statement
https://git.kernel.org/netdev/net-next/c/6d6228402249
- [net-next,v6,5/6] net: dsa: mxl-gsw1xx: only setup SerDes PCS if it exists
https://git.kernel.org/netdev/net-next/c/99f465889a60
- [net-next,v6,6/6] net: dsa: mxl-gsw1xx: add support for Intel GSW150
https://git.kernel.org/netdev/net-next/c/afe813fd89ec
You are awesome, thank you!
--
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2026-01-27 11:10 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-01-22 16:38 [PATCH net-next v6 0/6] net: dsa: lantiq: add support for Intel GSW150 Daniel Golle
2026-01-22 16:38 ` [PATCH net-next v6 1/6] dt-bindings: net: dsa: lantiq,gswip: use correct node name Daniel Golle
2026-01-22 16:38 ` [PATCH net-next v6 2/6] dt-bindings: net: dsa: lantiq,gswip: add Intel GSW150 Daniel Golle
2026-01-22 16:39 ` [PATCH net-next v6 3/6] net: dsa: lantiq: allow arbitrary MII registers Daniel Golle
2026-01-22 16:39 ` [PATCH net-next v6 4/6] net: dsa: lantiq: clean up phylink_get_caps switch statement Daniel Golle
2026-01-22 16:39 ` [PATCH net-next v6 5/6] net: dsa: mxl-gsw1xx: only setup SerDes PCS if it exists Daniel Golle
2026-01-22 16:39 ` [PATCH net-next v6 6/6] net: dsa: mxl-gsw1xx: add support for Intel GSW150 Daniel Golle
2026-01-27 11:10 ` [PATCH net-next v6 0/6] net: dsa: lantiq: " patchwork-bot+netdevbpf
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox