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