netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH net-next 0/3]  net: stmmac: add physical port identification support
@ 2025-12-04 16:31 John Madieu
  2025-12-04 16:31 ` [PATCH net-next 1/3] " John Madieu
                   ` (2 more replies)
  0 siblings, 3 replies; 10+ messages in thread
From: John Madieu @ 2025-12-04 16:31 UTC (permalink / raw)
  To: prabhakar.mahadev-lad.rj, andrew+netdev, davem, edumazet, kuba,
	pabeni, robh, krzk+dt, conor+dt, geert+renesas
  Cc: biju.das.jz, claudiu.beznea, linux, magnus.damm, mcoquelin.stm32,
	alexandre.torgue, netdev, linux-renesas-soc, devicetree,
	John Madieu

This series adds physical port identification support to the stmmac driver,
enabling userspace to query hardware-stable identifiers for network interfaces
via ndo_get_phys_port_id() and ndo_get_phys_port_name().

On systems with multiple ethernet controllers sharing the same driver,
physical port identification provides stable identifiers that persist
across reboots and are independent of interface enumeration order.
This is particularly useful for predictable network interface naming
and for correlating interfaces with physical connectors.

The implementation follows a two-tier approach:

1. Generic stmmac support: Default implementations use the permanent MAC
   address as port ID and bus_id for port naming. This provides immediate
   benefit for all stmmac-based platforms.

2. Glue driver override: Platform drivers can provide custom callbacks
   for hardware-specific identification schemes. The Renesas GBETH driver
   implements this to support device tree-based port identification,
   addressing cases where hardware lacks unique identification registers.

The Renesas implementation constructs an 8-byte port identifier from:
- Permanent MAC address (if available) or Renesas OUI (74:90:50) as fallback
- Port index from device tree property or ethernet alias


John Madieu (3):
  net: stmmac: add physical port identification support
  dt-bindings: net: renesas-gbeth: Add port-id property
  net: stmmac: dwmac-renesas-gbeth: add physical port identification

 .../bindings/net/renesas,rzv2h-gbeth.yaml     | 19 +++++++
 .../stmicro/stmmac/dwmac-renesas-gbeth.c      | 56 +++++++++++++++++++
 .../net/ethernet/stmicro/stmmac/stmmac_main.c | 54 ++++++++++++++++++
 include/linux/stmmac.h                        |  5 ++
 4 files changed, 134 insertions(+)

-- 
2.25.1


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

* [PATCH net-next 1/3] net: stmmac: add physical port identification support
  2025-12-04 16:31 [PATCH net-next 0/3] net: stmmac: add physical port identification support John Madieu
@ 2025-12-04 16:31 ` John Madieu
  2025-12-04 16:54   ` Russell King (Oracle)
  2025-12-04 16:31 ` [PATCH net-next 2/3] dt-bindings: net: renesas-gbeth: Add port-id property John Madieu
  2025-12-04 16:31 ` [PATCH net-next 3/3] net: stmmac: dwmac-renesas-gbeth: add physical port identification John Madieu
  2 siblings, 1 reply; 10+ messages in thread
From: John Madieu @ 2025-12-04 16:31 UTC (permalink / raw)
  To: prabhakar.mahadev-lad.rj, andrew+netdev, davem, edumazet, kuba,
	pabeni, robh, krzk+dt, conor+dt, geert+renesas
  Cc: biju.das.jz, claudiu.beznea, linux, magnus.damm, mcoquelin.stm32,
	alexandre.torgue, netdev, linux-renesas-soc, devicetree,
	John Madieu

Implement ndo_get_phys_port_id and ndo_get_phys_port_name callbacks
to provide physical port identification for all stmmac-based devices.

Default implementations use the permanent MAC address for port ID and
bus_id for port name. Glue drivers can override these by setting
get_phys_port_id and get_phys_port_name callbacks in plat_stmmacenet_data.

Signed-off-by: John Madieu <john.madieu.xa@bp.renesas.com>
---
 .../net/ethernet/stmicro/stmmac/stmmac_main.c | 54 +++++++++++++++++++
 include/linux/stmmac.h                        |  5 ++
 2 files changed, 59 insertions(+)

diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
index 15b0c08ebd877..e8f642c9941b6 100644
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
@@ -7151,6 +7151,58 @@ static void stmmac_get_stats64(struct net_device *dev, struct rtnl_link_stats64
 	stats->rx_missed_errors = priv->xstats.rx_missed_cntr;
 }
 
+/**
+ * stmmac_get_phys_port_id - Get physical port identification
+ * @dev: net device structure
+ * @ppid: pointer to physical port id structure
+ *
+ * Returns a unique physical port identifier. If the platform provides
+ * a custom callback, it is used. Otherwise, the permanent MAC address
+ * serves as the default identifier.
+ *
+ * Return: 0 on success, negative error code otherwise
+ */
+static int stmmac_get_phys_port_id(struct net_device *dev,
+				   struct netdev_phys_item_id *ppid)
+{
+	struct stmmac_priv *priv = netdev_priv(dev);
+
+	/* Allow glue driver to override */
+	if (priv->plat->get_phys_port_id)
+		return priv->plat->get_phys_port_id(dev, ppid);
+
+	/* Default: use permanent MAC address as port ID */
+	ppid->id_len = ETH_ALEN;
+	memcpy(ppid->id, dev->perm_addr, ETH_ALEN);
+
+	return 0;
+}
+
+/**
+ * stmmac_get_phys_port_name - Get physical port name
+ * @dev: net device structure
+ * @name: buffer to store the port name
+ * @len: length of the buffer
+ *
+ * Returns a human-readable physical port name. If the platform provides
+ * a custom callback, it is used. Otherwise, a default name based on
+ * the bus_id is generated.
+ *
+ * Return: 0 on success, negative error code otherwise
+ */
+static int stmmac_get_phys_port_name(struct net_device *dev,
+				     char *name, size_t len)
+{
+	struct stmmac_priv *priv = netdev_priv(dev);
+
+	/* Allow glue driver to override */
+	if (priv->plat->get_phys_port_name)
+		return priv->plat->get_phys_port_name(dev, name, len);
+
+	/* Default: use bus_id as port identifier */
+	return snprintf(name, len, "p%d", priv->plat->bus_id) >= len ? -EINVAL : 0;
+}
+
 static const struct net_device_ops stmmac_netdev_ops = {
 	.ndo_open = stmmac_open,
 	.ndo_start_xmit = stmmac_xmit,
@@ -7172,6 +7224,8 @@ static const struct net_device_ops stmmac_netdev_ops = {
 	.ndo_xsk_wakeup = stmmac_xsk_wakeup,
 	.ndo_hwtstamp_get = stmmac_hwtstamp_get,
 	.ndo_hwtstamp_set = stmmac_hwtstamp_set,
+	.ndo_get_phys_port_id = stmmac_get_phys_port_id,
+	.ndo_get_phys_port_name = stmmac_get_phys_port_name,
 };
 
 static void stmmac_reset_subtask(struct stmmac_priv *priv)
diff --git a/include/linux/stmmac.h b/include/linux/stmmac.h
index 4f70a6551e68c..2b98c2d354804 100644
--- a/include/linux/stmmac.h
+++ b/include/linux/stmmac.h
@@ -277,6 +277,11 @@ struct plat_stmmacenet_data {
 	void (*pcs_exit)(struct stmmac_priv *priv);
 	struct phylink_pcs *(*select_pcs)(struct stmmac_priv *priv,
 					  phy_interface_t interface);
+	/* Physical port identification callbacks (optional, for glue driver override) */
+	int (*get_phys_port_id)(struct net_device *ndev,
+				struct netdev_phys_item_id *ppid);
+	int (*get_phys_port_name)(struct net_device *ndev,
+				  char *name, size_t len);
 	void *bsp_priv;
 	struct clk *stmmac_clk;
 	struct clk *pclk;
-- 
2.25.1


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

* [PATCH net-next 2/3] dt-bindings: net: renesas-gbeth: Add port-id property
  2025-12-04 16:31 [PATCH net-next 0/3] net: stmmac: add physical port identification support John Madieu
  2025-12-04 16:31 ` [PATCH net-next 1/3] " John Madieu
@ 2025-12-04 16:31 ` John Madieu
  2025-12-04 16:31 ` [PATCH net-next 3/3] net: stmmac: dwmac-renesas-gbeth: add physical port identification John Madieu
  2 siblings, 0 replies; 10+ messages in thread
From: John Madieu @ 2025-12-04 16:31 UTC (permalink / raw)
  To: prabhakar.mahadev-lad.rj, andrew+netdev, davem, edumazet, kuba,
	pabeni, robh, krzk+dt, conor+dt, geert+renesas
  Cc: biju.das.jz, claudiu.beznea, linux, magnus.damm, mcoquelin.stm32,
	alexandre.torgue, netdev, linux-renesas-soc, devicetree,
	John Madieu

Add optional port-id property to identify ethernet ports on RZ/V2H
SoCs. The hardware doesn't provide unique identification registers
for multiple ethernet instances, so this property allows explicit
port identification from the device tree.

Signed-off-by: John Madieu <john.madieu.xa@bp.renesas.com>
---
 .../bindings/net/renesas,rzv2h-gbeth.yaml     | 19 +++++++++++++++++++
 1 file changed, 19 insertions(+)

diff --git a/Documentation/devicetree/bindings/net/renesas,rzv2h-gbeth.yaml b/Documentation/devicetree/bindings/net/renesas,rzv2h-gbeth.yaml
index bd53ab300f500..bb59c6a925d3f 100644
--- a/Documentation/devicetree/bindings/net/renesas,rzv2h-gbeth.yaml
+++ b/Documentation/devicetree/bindings/net/renesas,rzv2h-gbeth.yaml
@@ -117,6 +117,23 @@ properties:
           - description: AXI power-on system reset
           - description: AHB reset
 
+  renesas,port-id:
+    $ref: /schemas/types.yaml#/definitions/uint32
+    description:
+      Optional unique port identifier for this ethernet interface.
+      Used for physical port identification (phys_port_id, phys_port_name).
+      If not specified, the ethernet alias index is used as fallback.
+    minimum: 0
+    maximum: 255
+
+  renesas,port-name:
+    $ref: /schemas/types.yaml#/definitions/string
+    description:
+      Optional custom name for the physical port. Used by
+      ndo_get_phys_port_name() for interface naming.
+      If not specified, "p<N>" format is used where N is the port-id
+      or ethernet alias index.
+
   pcs-handle:
     description:
       phandle pointing to a PCS sub-node compatible with
@@ -230,6 +247,8 @@ examples:
         snps,txpbl = <32>;
         snps,rxpbl = <32>;
         phy-handle = <&phy0>;
+        renesas,port-id = <0>;
+        renesas,port-name = "mgmt";
 
         stmmac_axi_setup: stmmac-axi-config {
             snps,lpi_en;
-- 
2.25.1


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

* [PATCH net-next 3/3] net: stmmac: dwmac-renesas-gbeth: add physical port identification
  2025-12-04 16:31 [PATCH net-next 0/3] net: stmmac: add physical port identification support John Madieu
  2025-12-04 16:31 ` [PATCH net-next 1/3] " John Madieu
  2025-12-04 16:31 ` [PATCH net-next 2/3] dt-bindings: net: renesas-gbeth: Add port-id property John Madieu
@ 2025-12-04 16:31 ` John Madieu
  2025-12-04 17:04   ` Russell King (Oracle)
  2 siblings, 1 reply; 10+ messages in thread
From: John Madieu @ 2025-12-04 16:31 UTC (permalink / raw)
  To: prabhakar.mahadev-lad.rj, andrew+netdev, davem, edumazet, kuba,
	pabeni, robh, krzk+dt, conor+dt, geert+renesas
  Cc: biju.das.jz, claudiu.beznea, linux, magnus.damm, mcoquelin.stm32,
	alexandre.torgue, netdev, linux-renesas-soc, devicetree,
	John Madieu

Implement ndo_get_phys_port_id() and ndo_get_phys_port_name() callbacks
for the Renesas RZ/G3E GBETH driver.

The port ID is an 8-byte identifier constructed from:
- Permanent MAC address if available (addr_assign_type == NET_ADDR_PERM)
- Renesas OUI (74:90:50) as fallback for random/generated MACs
- Port index from 'port-id' DT property or ethernet alias

The port name resolution follows this hierarchy:
- 'port-name' DT property if specified (allows custom names like "mgmt")
- "p<N>" format using 'port-id' DT property
- "p<N>" format using ethernet alias index as fallback

Signed-off-by: John Madieu <john.madieu.xa@bp.renesas.com>
---
 .../stmicro/stmmac/dwmac-renesas-gbeth.c      | 56 +++++++++++++++++++
 1 file changed, 56 insertions(+)

diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-renesas-gbeth.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-renesas-gbeth.c
index bc7bb975803ca..5acb65b0e4f06 100644
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-renesas-gbeth.c
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-renesas-gbeth.c
@@ -16,7 +16,9 @@
 #include <linux/clk.h>
 #include <linux/device.h>
 #include <linux/module.h>
+#include <linux/netdevice.h>
 #include <linux/of.h>
+#include <linux/of_net.h>
 #include <linux/pcs-rzn1-miic.h>
 #include <linux/platform_device.h>
 #include <linux/reset.h>
@@ -91,6 +93,57 @@ static struct phylink_pcs *renesas_gmac_select_pcs(struct stmmac_priv *priv,
 	return priv->hw->phylink_pcs;
 }
 
+static int renesas_gbeth_get_port_id(struct device *dev)
+{
+	int port_id;
+
+	if (!device_property_read_u32(dev, "renesas,port-id", &port_id))
+		return port_id;
+
+	port_id = of_alias_get_id(dev_of_node(dev), "ethernet");
+
+	return port_id < 0 ? 0 : port_id;
+}
+
+static int renesas_gbeth_get_phys_port_name(struct net_device *ndev,
+					    char *name, size_t len)
+{
+	struct stmmac_priv *priv = netdev_priv(ndev);
+	struct renesas_gbeth *gbeth = priv->plat->bsp_priv;
+	const char *port_name;
+
+	if (!device_property_read_string(gbeth->dev, "renesas,port-name", &port_name))
+		return snprintf(name, len, "%s", port_name) >= len ? -EINVAL : 0;
+
+	return snprintf(name, len, "p%d", renesas_gbeth_get_port_id(gbeth->dev)) >= len ? -EINVAL : 0;
+}
+
+static int renesas_gbeth_get_phys_port_id(struct net_device *ndev,
+					  struct netdev_phys_item_id *ppid)
+{
+	struct stmmac_priv *priv = netdev_priv(ndev);
+	struct renesas_gbeth *gbeth = priv->plat->bsp_priv;
+	u8 *id = ppid->id;
+
+	if (ndev->addr_assign_type == NET_ADDR_PERM) {
+		memcpy(id, ndev->perm_addr, ETH_ALEN);
+	} else {
+		/* Fallback: Renesas OUI prefix (74:90:50) */
+		id[0] = 0x74;
+		id[1] = 0x90;
+		id[2] = 0x50;
+		id[3] = 0x00;
+		id[4] = 0x00;
+		id[5] = 0x00;
+	}
+
+	id[6] = renesas_gbeth_get_port_id(gbeth->dev) & 0xff;
+	id[7] = 0x00;
+	ppid->id_len = 8;
+
+	return 0;
+}
+
 static int renesas_gbeth_init(struct platform_device *pdev, void *priv)
 {
 	struct plat_stmmacenet_data *plat_dat;
@@ -194,6 +247,9 @@ static int renesas_gbeth_probe(struct platform_device *pdev)
 		plat_dat->select_pcs = renesas_gmac_select_pcs;
 	}
 
+	plat_dat->get_phys_port_id = renesas_gbeth_get_phys_port_id;
+	plat_dat->get_phys_port_name = renesas_gbeth_get_phys_port_name;
+
 	return devm_stmmac_pltfr_probe(pdev, plat_dat, &stmmac_res);
 }
 
-- 
2.25.1


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

* [PATCH net-next 1/3] net: stmmac: add physical port identification support
  2025-12-04 16:37 [PATCH net-next 0/3] net: stmmac: add physical port identification support John Madieu
@ 2025-12-04 16:37 ` John Madieu
  2025-12-05  6:41   ` kernel test robot
  2025-12-05  7:34   ` kernel test robot
  0 siblings, 2 replies; 10+ messages in thread
From: John Madieu @ 2025-12-04 16:37 UTC (permalink / raw)
  To: prabhakar.mahadev-lad.rj, andrew+netdev, davem, edumazet, kuba,
	pabeni, robh, krzk+dt, conor+dt, geert+renesas
  Cc: biju.das.jz, claudiu.beznea, linux, magnus.damm, mcoquelin.stm32,
	alexandre.torgue, netdev, linux-renesas-soc, devicetree,
	John Madieu

Implement ndo_get_phys_port_id and ndo_get_phys_port_name callbacks
to provide physical port identification for all stmmac-based devices.

Default implementations use the permanent MAC address for port ID and
bus_id for port name. Glue drivers can override these by setting
get_phys_port_id and get_phys_port_name callbacks in plat_stmmacenet_data.

Signed-off-by: John Madieu <john.madieu.xa@bp.renesas.com>
---
 .../net/ethernet/stmicro/stmmac/stmmac_main.c | 54 +++++++++++++++++++
 include/linux/stmmac.h                        |  5 ++
 2 files changed, 59 insertions(+)

diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
index 15b0c08ebd877..e8f642c9941b6 100644
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
@@ -7151,6 +7151,58 @@ static void stmmac_get_stats64(struct net_device *dev, struct rtnl_link_stats64
 	stats->rx_missed_errors = priv->xstats.rx_missed_cntr;
 }
 
+/**
+ * stmmac_get_phys_port_id - Get physical port identification
+ * @dev: net device structure
+ * @ppid: pointer to physical port id structure
+ *
+ * Returns a unique physical port identifier. If the platform provides
+ * a custom callback, it is used. Otherwise, the permanent MAC address
+ * serves as the default identifier.
+ *
+ * Return: 0 on success, negative error code otherwise
+ */
+static int stmmac_get_phys_port_id(struct net_device *dev,
+				   struct netdev_phys_item_id *ppid)
+{
+	struct stmmac_priv *priv = netdev_priv(dev);
+
+	/* Allow glue driver to override */
+	if (priv->plat->get_phys_port_id)
+		return priv->plat->get_phys_port_id(dev, ppid);
+
+	/* Default: use permanent MAC address as port ID */
+	ppid->id_len = ETH_ALEN;
+	memcpy(ppid->id, dev->perm_addr, ETH_ALEN);
+
+	return 0;
+}
+
+/**
+ * stmmac_get_phys_port_name - Get physical port name
+ * @dev: net device structure
+ * @name: buffer to store the port name
+ * @len: length of the buffer
+ *
+ * Returns a human-readable physical port name. If the platform provides
+ * a custom callback, it is used. Otherwise, a default name based on
+ * the bus_id is generated.
+ *
+ * Return: 0 on success, negative error code otherwise
+ */
+static int stmmac_get_phys_port_name(struct net_device *dev,
+				     char *name, size_t len)
+{
+	struct stmmac_priv *priv = netdev_priv(dev);
+
+	/* Allow glue driver to override */
+	if (priv->plat->get_phys_port_name)
+		return priv->plat->get_phys_port_name(dev, name, len);
+
+	/* Default: use bus_id as port identifier */
+	return snprintf(name, len, "p%d", priv->plat->bus_id) >= len ? -EINVAL : 0;
+}
+
 static const struct net_device_ops stmmac_netdev_ops = {
 	.ndo_open = stmmac_open,
 	.ndo_start_xmit = stmmac_xmit,
@@ -7172,6 +7224,8 @@ static const struct net_device_ops stmmac_netdev_ops = {
 	.ndo_xsk_wakeup = stmmac_xsk_wakeup,
 	.ndo_hwtstamp_get = stmmac_hwtstamp_get,
 	.ndo_hwtstamp_set = stmmac_hwtstamp_set,
+	.ndo_get_phys_port_id = stmmac_get_phys_port_id,
+	.ndo_get_phys_port_name = stmmac_get_phys_port_name,
 };
 
 static void stmmac_reset_subtask(struct stmmac_priv *priv)
diff --git a/include/linux/stmmac.h b/include/linux/stmmac.h
index 4f70a6551e68c..2b98c2d354804 100644
--- a/include/linux/stmmac.h
+++ b/include/linux/stmmac.h
@@ -277,6 +277,11 @@ struct plat_stmmacenet_data {
 	void (*pcs_exit)(struct stmmac_priv *priv);
 	struct phylink_pcs *(*select_pcs)(struct stmmac_priv *priv,
 					  phy_interface_t interface);
+	/* Physical port identification callbacks (optional, for glue driver override) */
+	int (*get_phys_port_id)(struct net_device *ndev,
+				struct netdev_phys_item_id *ppid);
+	int (*get_phys_port_name)(struct net_device *ndev,
+				  char *name, size_t len);
 	void *bsp_priv;
 	struct clk *stmmac_clk;
 	struct clk *pclk;
-- 
2.25.1


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

* [PATCH net-next 1/3] net: stmmac: add physical port identification support
  2025-12-04 16:40 [PATCH net-next 0/3] " John Madieu
@ 2025-12-04 16:40 ` John Madieu
  0 siblings, 0 replies; 10+ messages in thread
From: John Madieu @ 2025-12-04 16:40 UTC (permalink / raw)
  To: prabhakar.mahadev-lad.rj, andrew+netdev, davem, edumazet, kuba,
	pabeni, robh, krzk+dt, conor+dt, geert+renesas
  Cc: biju.das.jz, claudiu.beznea, linux, magnus.damm, mcoquelin.stm32,
	alexandre.torgue, netdev, linux-renesas-soc, devicetree,
	John Madieu

Implement ndo_get_phys_port_id and ndo_get_phys_port_name callbacks
to provide physical port identification for all stmmac-based devices.

Default implementations use the permanent MAC address for port ID and
bus_id for port name. Glue drivers can override these by setting
get_phys_port_id and get_phys_port_name callbacks in plat_stmmacenet_data.

Signed-off-by: John Madieu <john.madieu.xa@bp.renesas.com>
---
 .../net/ethernet/stmicro/stmmac/stmmac_main.c | 54 +++++++++++++++++++
 include/linux/stmmac.h                        |  5 ++
 2 files changed, 59 insertions(+)

diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
index 15b0c08ebd877..e8f642c9941b6 100644
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
@@ -7151,6 +7151,58 @@ static void stmmac_get_stats64(struct net_device *dev, struct rtnl_link_stats64
 	stats->rx_missed_errors = priv->xstats.rx_missed_cntr;
 }
 
+/**
+ * stmmac_get_phys_port_id - Get physical port identification
+ * @dev: net device structure
+ * @ppid: pointer to physical port id structure
+ *
+ * Returns a unique physical port identifier. If the platform provides
+ * a custom callback, it is used. Otherwise, the permanent MAC address
+ * serves as the default identifier.
+ *
+ * Return: 0 on success, negative error code otherwise
+ */
+static int stmmac_get_phys_port_id(struct net_device *dev,
+				   struct netdev_phys_item_id *ppid)
+{
+	struct stmmac_priv *priv = netdev_priv(dev);
+
+	/* Allow glue driver to override */
+	if (priv->plat->get_phys_port_id)
+		return priv->plat->get_phys_port_id(dev, ppid);
+
+	/* Default: use permanent MAC address as port ID */
+	ppid->id_len = ETH_ALEN;
+	memcpy(ppid->id, dev->perm_addr, ETH_ALEN);
+
+	return 0;
+}
+
+/**
+ * stmmac_get_phys_port_name - Get physical port name
+ * @dev: net device structure
+ * @name: buffer to store the port name
+ * @len: length of the buffer
+ *
+ * Returns a human-readable physical port name. If the platform provides
+ * a custom callback, it is used. Otherwise, a default name based on
+ * the bus_id is generated.
+ *
+ * Return: 0 on success, negative error code otherwise
+ */
+static int stmmac_get_phys_port_name(struct net_device *dev,
+				     char *name, size_t len)
+{
+	struct stmmac_priv *priv = netdev_priv(dev);
+
+	/* Allow glue driver to override */
+	if (priv->plat->get_phys_port_name)
+		return priv->plat->get_phys_port_name(dev, name, len);
+
+	/* Default: use bus_id as port identifier */
+	return snprintf(name, len, "p%d", priv->plat->bus_id) >= len ? -EINVAL : 0;
+}
+
 static const struct net_device_ops stmmac_netdev_ops = {
 	.ndo_open = stmmac_open,
 	.ndo_start_xmit = stmmac_xmit,
@@ -7172,6 +7224,8 @@ static const struct net_device_ops stmmac_netdev_ops = {
 	.ndo_xsk_wakeup = stmmac_xsk_wakeup,
 	.ndo_hwtstamp_get = stmmac_hwtstamp_get,
 	.ndo_hwtstamp_set = stmmac_hwtstamp_set,
+	.ndo_get_phys_port_id = stmmac_get_phys_port_id,
+	.ndo_get_phys_port_name = stmmac_get_phys_port_name,
 };
 
 static void stmmac_reset_subtask(struct stmmac_priv *priv)
diff --git a/include/linux/stmmac.h b/include/linux/stmmac.h
index 4f70a6551e68c..2b98c2d354804 100644
--- a/include/linux/stmmac.h
+++ b/include/linux/stmmac.h
@@ -277,6 +277,11 @@ struct plat_stmmacenet_data {
 	void (*pcs_exit)(struct stmmac_priv *priv);
 	struct phylink_pcs *(*select_pcs)(struct stmmac_priv *priv,
 					  phy_interface_t interface);
+	/* Physical port identification callbacks (optional, for glue driver override) */
+	int (*get_phys_port_id)(struct net_device *ndev,
+				struct netdev_phys_item_id *ppid);
+	int (*get_phys_port_name)(struct net_device *ndev,
+				  char *name, size_t len);
 	void *bsp_priv;
 	struct clk *stmmac_clk;
 	struct clk *pclk;
-- 
2.25.1


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

* Re: [PATCH net-next 1/3] net: stmmac: add physical port identification support
  2025-12-04 16:31 ` [PATCH net-next 1/3] " John Madieu
@ 2025-12-04 16:54   ` Russell King (Oracle)
  0 siblings, 0 replies; 10+ messages in thread
From: Russell King (Oracle) @ 2025-12-04 16:54 UTC (permalink / raw)
  To: John Madieu
  Cc: prabhakar.mahadev-lad.rj, andrew+netdev, davem, edumazet, kuba,
	pabeni, robh, krzk+dt, conor+dt, geert+renesas, biju.das.jz,
	claudiu.beznea, magnus.damm, mcoquelin.stm32, alexandre.torgue,
	netdev, linux-renesas-soc, devicetree

On Thu, Dec 04, 2025 at 04:31:20PM +0000, John Madieu wrote:
> +static int stmmac_get_phys_port_name(struct net_device *dev,
> +				     char *name, size_t len)
> +{
> +	struct stmmac_priv *priv = netdev_priv(dev);
> +
> +	/* Allow glue driver to override */
> +	if (priv->plat->get_phys_port_name)
> +		return priv->plat->get_phys_port_name(dev, name, len);
> +
> +	/* Default: use bus_id as port identifier */
> +	return snprintf(name, len, "p%d", priv->plat->bus_id) >= len ? -EINVAL : 0;

priv->plat->bus_id may not be stable - for example, if a SoC describes
two stmmac ethernet, but omits the ethernet aliases, then plat->bus_id
is assigned in order that stmmac_probe_config_dt() is called for each
device.

How important is it that the phys_port_name is stable across boots?
If it should be stable, then I think we should not report it if we end
up falling back to the "assign in order of stmmac_probe_config_dt()".

-- 
RMK's Patch system: https://www.armlinux.org.uk/developer/patches/
FTTP is here! 80Mbps down 10Mbps up. Decent connectivity at last!

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

* Re: [PATCH net-next 3/3] net: stmmac: dwmac-renesas-gbeth: add physical port identification
  2025-12-04 16:31 ` [PATCH net-next 3/3] net: stmmac: dwmac-renesas-gbeth: add physical port identification John Madieu
@ 2025-12-04 17:04   ` Russell King (Oracle)
  0 siblings, 0 replies; 10+ messages in thread
From: Russell King (Oracle) @ 2025-12-04 17:04 UTC (permalink / raw)
  To: John Madieu
  Cc: prabhakar.mahadev-lad.rj, andrew+netdev, davem, edumazet, kuba,
	pabeni, robh, krzk+dt, conor+dt, geert+renesas, biju.das.jz,
	claudiu.beznea, magnus.damm, mcoquelin.stm32, alexandre.torgue,
	netdev, linux-renesas-soc, devicetree

On Thu, Dec 04, 2025 at 04:31:22PM +0000, John Madieu wrote:
> +static int renesas_gbeth_get_port_id(struct device *dev)
> +{
> +	int port_id;
> +
> +	if (!device_property_read_u32(dev, "renesas,port-id", &port_id))
> +		return port_id;
> +
> +	port_id = of_alias_get_id(dev_of_node(dev), "ethernet");
> +
> +	return port_id < 0 ? 0 : port_id;
> +}

You fall back to the ethernet alias, which is essentially what
devm_stmmac_probe_config_dt() will assign to plat->bus_id. So, is
there any reason we can't just use plat->bus_id ? Why do we need a
special property?

I really don't like the idea that, with the proposal here, we'll
likely see the stmmac platform glue spawn more platform specific
code. This doesn't scale.

So, the next question: should there be a standard way to describe
these attributes, rather than having lots of vendor specific
properties describing the same information? Should this be part
of the generic binding, iow
Documentation/devicetree/bindings/net/ethernet-controller.yaml ?

-- 
RMK's Patch system: https://www.armlinux.org.uk/developer/patches/
FTTP is here! 80Mbps down 10Mbps up. Decent connectivity at last!

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

* Re: [PATCH net-next 1/3] net: stmmac: add physical port identification support
  2025-12-04 16:37 ` [PATCH net-next 1/3] " John Madieu
@ 2025-12-05  6:41   ` kernel test robot
  2025-12-05  7:34   ` kernel test robot
  1 sibling, 0 replies; 10+ messages in thread
From: kernel test robot @ 2025-12-05  6:41 UTC (permalink / raw)
  To: John Madieu, prabhakar.mahadev-lad.rj, andrew+netdev, davem,
	edumazet, kuba, pabeni, robh, krzk+dt, conor+dt, geert+renesas
  Cc: llvm, oe-kbuild-all, biju.das.jz, claudiu.beznea, linux,
	magnus.damm, mcoquelin.stm32, alexandre.torgue, netdev,
	linux-renesas-soc, devicetree, John Madieu

Hi John,

kernel test robot noticed the following build warnings:

[auto build test WARNING on robh/for-next]
[also build test WARNING on net/main linus/master v6.18 next-20251204]
[cannot apply to net-next/main]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/John-Madieu/dt-bindings-net-renesas-gbeth-Add-port-id-property/20251205-013825
base:   https://git.kernel.org/pub/scm/linux/kernel/git/robh/linux.git for-next
patch link:    https://lore.kernel.org/r/20251204163729.3036329-2-john.madieu.xa%40bp.renesas.com
patch subject: [PATCH net-next 1/3] net: stmmac: add physical port identification support
config: hexagon-randconfig-001-20251205 (https://download.01.org/0day-ci/archive/20251205/202512051431.9gYpDLdA-lkp@intel.com/config)
compiler: clang version 22.0.0git (https://github.com/llvm/llvm-project d8b43edf552840e59a22a7f3cc332697bd434782)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20251205/202512051431.9gYpDLdA-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202512051431.9gYpDLdA-lkp@intel.com/

All warnings (new ones prefixed by >>):

   In file included from drivers/net/ethernet/stmicro/stmmac/dwmac4_descs.c:11:
>> include/linux/stmmac.h:273:12: warning: declaration of 'struct netdev_phys_item_id' will not be visible outside of this function [-Wvisibility]
     273 |                                 struct netdev_phys_item_id *ppid);
         |                                        ^
   1 warning generated.


vim +273 include/linux/stmmac.h

   188	
   189	struct plat_stmmacenet_data {
   190		int bus_id;
   191		int phy_addr;
   192		/* MAC ----- optional PCS ----- SerDes ----- optional PHY ----- Media
   193		 *                                       ^
   194		 *                                  phy_interface
   195		 *
   196		 * The Synopsys dwmac core only covers the MAC and an optional
   197		 * integrated PCS. Where the integrated PCS is used with a SerDes,
   198		 * e.g. for 1000base-X or Cisco SGMII, the connection between the
   199		 * PCS and SerDes will be TBI.
   200		 *
   201		 * Where the Synopsys dwmac core has been instantiated with multiple
   202		 * interface modes, these are selected via core-external configuration
   203		 * which is sampled when the dwmac core is reset. How this is done is
   204		 * platform glue specific, but this defines the interface used from
   205		 * the Synopsys dwmac core to the rest of the SoC.
   206		 *
   207		 * Where PCS other than the optional integrated Synopsys dwmac PCS
   208		 * is used, this counts as "the rest of the SoC" in the above
   209		 * paragraph.
   210		 *
   211		 * phy_interface is the PHY-side interface - the interface used by
   212		 * an attached PHY or SFP etc. This is equivalent to the interface
   213		 * that phylink uses.
   214		 */
   215		phy_interface_t phy_interface;
   216		struct stmmac_mdio_bus_data *mdio_bus_data;
   217		struct device_node *phy_node;
   218		struct fwnode_handle *port_node;
   219		struct device_node *mdio_node;
   220		struct stmmac_dma_cfg *dma_cfg;
   221		struct stmmac_safety_feature_cfg *safety_feat_cfg;
   222		int clk_csr;
   223		int has_gmac;
   224		int enh_desc;
   225		int tx_coe;
   226		int rx_coe;
   227		int bugged_jumbo;
   228		int pmt;
   229		int force_sf_dma_mode;
   230		int force_thresh_dma_mode;
   231		int riwt_off;
   232		int max_speed;
   233		int maxmtu;
   234		int multicast_filter_bins;
   235		int unicast_filter_entries;
   236		int tx_fifo_size;
   237		int rx_fifo_size;
   238		u32 host_dma_width;
   239		u32 rx_queues_to_use;
   240		u32 tx_queues_to_use;
   241		u8 rx_sched_algorithm;
   242		u8 tx_sched_algorithm;
   243		struct stmmac_rxq_cfg rx_queues_cfg[MTL_MAX_RX_QUEUES];
   244		struct stmmac_txq_cfg tx_queues_cfg[MTL_MAX_TX_QUEUES];
   245		void (*get_interfaces)(struct stmmac_priv *priv, void *bsp_priv,
   246				       unsigned long *interfaces);
   247		int (*set_clk_tx_rate)(void *priv, struct clk *clk_tx_i,
   248				       phy_interface_t interface, int speed);
   249		void (*fix_mac_speed)(void *priv, int speed, unsigned int mode);
   250		int (*fix_soc_reset)(struct stmmac_priv *priv, void __iomem *ioaddr);
   251		int (*serdes_powerup)(struct net_device *ndev, void *priv);
   252		void (*serdes_powerdown)(struct net_device *ndev, void *priv);
   253		int (*mac_finish)(struct net_device *ndev,
   254				  void *priv,
   255				  unsigned int mode,
   256				  phy_interface_t interface);
   257		void (*ptp_clk_freq_config)(struct stmmac_priv *priv);
   258		int (*init)(struct platform_device *pdev, void *priv);
   259		void (*exit)(struct platform_device *pdev, void *priv);
   260		int (*suspend)(struct device *dev, void *priv);
   261		int (*resume)(struct device *dev, void *priv);
   262		struct mac_device_info *(*setup)(void *priv);
   263		int (*clks_config)(void *priv, bool enabled);
   264		int (*crosststamp)(ktime_t *device, struct system_counterval_t *system,
   265				   void *ctx);
   266		void (*dump_debug_regs)(void *priv);
   267		int (*pcs_init)(struct stmmac_priv *priv);
   268		void (*pcs_exit)(struct stmmac_priv *priv);
   269		struct phylink_pcs *(*select_pcs)(struct stmmac_priv *priv,
   270						  phy_interface_t interface);
   271		/* Physical port identification callbacks (optional, for glue driver override) */
   272		int (*get_phys_port_id)(struct net_device *ndev,
 > 273					struct netdev_phys_item_id *ppid);

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

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

* Re: [PATCH net-next 1/3] net: stmmac: add physical port identification support
  2025-12-04 16:37 ` [PATCH net-next 1/3] " John Madieu
  2025-12-05  6:41   ` kernel test robot
@ 2025-12-05  7:34   ` kernel test robot
  1 sibling, 0 replies; 10+ messages in thread
From: kernel test robot @ 2025-12-05  7:34 UTC (permalink / raw)
  To: John Madieu, prabhakar.mahadev-lad.rj, andrew+netdev, davem,
	edumazet, kuba, pabeni, robh, krzk+dt, conor+dt, geert+renesas
  Cc: oe-kbuild-all, biju.das.jz, claudiu.beznea, linux, magnus.damm,
	mcoquelin.stm32, alexandre.torgue, netdev, linux-renesas-soc,
	devicetree, John Madieu

Hi John,

kernel test robot noticed the following build warnings:

[auto build test WARNING on robh/for-next]
[also build test WARNING on net/main linus/master v6.18 next-20251204]
[cannot apply to net-next/main]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/John-Madieu/dt-bindings-net-renesas-gbeth-Add-port-id-property/20251205-013825
base:   https://git.kernel.org/pub/scm/linux/kernel/git/robh/linux.git for-next
patch link:    https://lore.kernel.org/r/20251204163729.3036329-2-john.madieu.xa%40bp.renesas.com
patch subject: [PATCH net-next 1/3] net: stmmac: add physical port identification support
config: parisc-randconfig-001-20251205 (https://download.01.org/0day-ci/archive/20251205/202512051514.VMlIccSV-lkp@intel.com/config)
compiler: hppa-linux-gcc (GCC) 8.5.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20251205/202512051514.VMlIccSV-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202512051514.VMlIccSV-lkp@intel.com/

All warnings (new ones prefixed by >>):

   In file included from drivers/net/ethernet/stmicro/stmmac/norm_desc.c:11:
>> include/linux/stmmac.h:273:12: warning: 'struct netdev_phys_item_id' declared inside parameter list will not be visible outside of this definition or declaration
        struct netdev_phys_item_id *ppid);
               ^~~~~~~~~~~~~~~~~~~


vim +273 include/linux/stmmac.h

   188	
   189	struct plat_stmmacenet_data {
   190		int bus_id;
   191		int phy_addr;
   192		/* MAC ----- optional PCS ----- SerDes ----- optional PHY ----- Media
   193		 *                                       ^
   194		 *                                  phy_interface
   195		 *
   196		 * The Synopsys dwmac core only covers the MAC and an optional
   197		 * integrated PCS. Where the integrated PCS is used with a SerDes,
   198		 * e.g. for 1000base-X or Cisco SGMII, the connection between the
   199		 * PCS and SerDes will be TBI.
   200		 *
   201		 * Where the Synopsys dwmac core has been instantiated with multiple
   202		 * interface modes, these are selected via core-external configuration
   203		 * which is sampled when the dwmac core is reset. How this is done is
   204		 * platform glue specific, but this defines the interface used from
   205		 * the Synopsys dwmac core to the rest of the SoC.
   206		 *
   207		 * Where PCS other than the optional integrated Synopsys dwmac PCS
   208		 * is used, this counts as "the rest of the SoC" in the above
   209		 * paragraph.
   210		 *
   211		 * phy_interface is the PHY-side interface - the interface used by
   212		 * an attached PHY or SFP etc. This is equivalent to the interface
   213		 * that phylink uses.
   214		 */
   215		phy_interface_t phy_interface;
   216		struct stmmac_mdio_bus_data *mdio_bus_data;
   217		struct device_node *phy_node;
   218		struct fwnode_handle *port_node;
   219		struct device_node *mdio_node;
   220		struct stmmac_dma_cfg *dma_cfg;
   221		struct stmmac_safety_feature_cfg *safety_feat_cfg;
   222		int clk_csr;
   223		int has_gmac;
   224		int enh_desc;
   225		int tx_coe;
   226		int rx_coe;
   227		int bugged_jumbo;
   228		int pmt;
   229		int force_sf_dma_mode;
   230		int force_thresh_dma_mode;
   231		int riwt_off;
   232		int max_speed;
   233		int maxmtu;
   234		int multicast_filter_bins;
   235		int unicast_filter_entries;
   236		int tx_fifo_size;
   237		int rx_fifo_size;
   238		u32 host_dma_width;
   239		u32 rx_queues_to_use;
   240		u32 tx_queues_to_use;
   241		u8 rx_sched_algorithm;
   242		u8 tx_sched_algorithm;
   243		struct stmmac_rxq_cfg rx_queues_cfg[MTL_MAX_RX_QUEUES];
   244		struct stmmac_txq_cfg tx_queues_cfg[MTL_MAX_TX_QUEUES];
   245		void (*get_interfaces)(struct stmmac_priv *priv, void *bsp_priv,
   246				       unsigned long *interfaces);
   247		int (*set_clk_tx_rate)(void *priv, struct clk *clk_tx_i,
   248				       phy_interface_t interface, int speed);
   249		void (*fix_mac_speed)(void *priv, int speed, unsigned int mode);
   250		int (*fix_soc_reset)(struct stmmac_priv *priv, void __iomem *ioaddr);
   251		int (*serdes_powerup)(struct net_device *ndev, void *priv);
   252		void (*serdes_powerdown)(struct net_device *ndev, void *priv);
   253		int (*mac_finish)(struct net_device *ndev,
   254				  void *priv,
   255				  unsigned int mode,
   256				  phy_interface_t interface);
   257		void (*ptp_clk_freq_config)(struct stmmac_priv *priv);
   258		int (*init)(struct platform_device *pdev, void *priv);
   259		void (*exit)(struct platform_device *pdev, void *priv);
   260		int (*suspend)(struct device *dev, void *priv);
   261		int (*resume)(struct device *dev, void *priv);
   262		struct mac_device_info *(*setup)(void *priv);
   263		int (*clks_config)(void *priv, bool enabled);
   264		int (*crosststamp)(ktime_t *device, struct system_counterval_t *system,
   265				   void *ctx);
   266		void (*dump_debug_regs)(void *priv);
   267		int (*pcs_init)(struct stmmac_priv *priv);
   268		void (*pcs_exit)(struct stmmac_priv *priv);
   269		struct phylink_pcs *(*select_pcs)(struct stmmac_priv *priv,
   270						  phy_interface_t interface);
   271		/* Physical port identification callbacks (optional, for glue driver override) */
   272		int (*get_phys_port_id)(struct net_device *ndev,
 > 273					struct netdev_phys_item_id *ppid);

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

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

end of thread, other threads:[~2025-12-05  7:35 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-12-04 16:31 [PATCH net-next 0/3] net: stmmac: add physical port identification support John Madieu
2025-12-04 16:31 ` [PATCH net-next 1/3] " John Madieu
2025-12-04 16:54   ` Russell King (Oracle)
2025-12-04 16:31 ` [PATCH net-next 2/3] dt-bindings: net: renesas-gbeth: Add port-id property John Madieu
2025-12-04 16:31 ` [PATCH net-next 3/3] net: stmmac: dwmac-renesas-gbeth: add physical port identification John Madieu
2025-12-04 17:04   ` Russell King (Oracle)
  -- strict thread matches above, loose matches on Subject: below --
2025-12-04 16:37 [PATCH net-next 0/3] net: stmmac: add physical port identification support John Madieu
2025-12-04 16:37 ` [PATCH net-next 1/3] " John Madieu
2025-12-05  6:41   ` kernel test robot
2025-12-05  7:34   ` kernel test robot
2025-12-04 16:40 [PATCH net-next 0/3] " John Madieu
2025-12-04 16:40 ` [PATCH net-next 1/3] " John Madieu

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