[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20251204163729.3036329-2-john.madieu.xa@bp.renesas.com>
Date: Thu, 4 Dec 2025 16:37:27 +0000
From: John Madieu <john.madieu.xa@...renesas.com>
To: prabhakar.mahadev-lad.rj@...renesas.com,
andrew+netdev@...n.ch,
davem@...emloft.net,
edumazet@...gle.com,
kuba@...nel.org,
pabeni@...hat.com,
robh@...nel.org,
krzk+dt@...nel.org,
conor+dt@...nel.org,
geert+renesas@...der.be
Cc: biju.das.jz@...renesas.com,
claudiu.beznea@...on.dev,
linux@...linux.org.uk,
magnus.damm@...il.com,
mcoquelin.stm32@...il.com,
alexandre.torgue@...s.st.com,
netdev@...r.kernel.org,
linux-renesas-soc@...r.kernel.org,
devicetree@...r.kernel.org,
John Madieu <john.madieu.xa@...renesas.com>
Subject: [PATCH net-next 1/3] net: stmmac: add physical port identification support
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@...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
Powered by blists - more mailing lists