3737#include <net/act_api.h>
3838#include <net/netevent.h>
3939#include <net/arp.h>
40+ #include <net/devlink.h>
4041
4142#include "eswitch.h"
4243#include "en.h"
@@ -1119,32 +1120,6 @@ static int mlx5e_rep_close(struct net_device *dev)
11191120 return ret ;
11201121}
11211122
1122- static int mlx5e_rep_get_phys_port_name (struct net_device * dev ,
1123- char * buf , size_t len )
1124- {
1125- struct mlx5e_priv * priv = netdev_priv (dev );
1126- struct mlx5e_rep_priv * rpriv = priv -> ppriv ;
1127- struct mlx5_eswitch_rep * rep = rpriv -> rep ;
1128- unsigned int fn ;
1129- int ret ;
1130-
1131- fn = PCI_FUNC (priv -> mdev -> pdev -> devfn );
1132- if (fn >= MLX5_MAX_PORTS )
1133- return - EOPNOTSUPP ;
1134-
1135- if (rep -> vport == MLX5_VPORT_UPLINK )
1136- ret = snprintf (buf , len , "p%d" , fn );
1137- else if (rep -> vport == MLX5_VPORT_PF )
1138- ret = snprintf (buf , len , "pf%d" , fn );
1139- else
1140- ret = snprintf (buf , len , "pf%dvf%d" , fn , rep -> vport - 1 );
1141-
1142- if (ret >= len )
1143- return - EOPNOTSUPP ;
1144-
1145- return 0 ;
1146- }
1147-
11481123static int
11491124mlx5e_rep_setup_tc_cls_flower (struct mlx5e_priv * priv ,
11501125 struct tc_cls_flower_offload * cls_flower , int flags )
@@ -1298,26 +1273,33 @@ static int mlx5e_uplink_rep_set_vf_vlan(struct net_device *dev, int vf, u16 vlan
12981273 return 0 ;
12991274}
13001275
1276+ static struct devlink_port * mlx5e_get_devlink_port (struct net_device * dev )
1277+ {
1278+ struct mlx5e_priv * priv = netdev_priv (dev );
1279+ struct mlx5e_rep_priv * rpriv = priv -> ppriv ;
1280+
1281+ return & rpriv -> dl_port ;
1282+ }
1283+
13011284static const struct net_device_ops mlx5e_netdev_ops_rep = {
13021285 .ndo_open = mlx5e_rep_open ,
13031286 .ndo_stop = mlx5e_rep_close ,
13041287 .ndo_start_xmit = mlx5e_xmit ,
1305- .ndo_get_phys_port_name = mlx5e_rep_get_phys_port_name ,
13061288 .ndo_setup_tc = mlx5e_rep_setup_tc ,
1289+ .ndo_get_devlink_port = mlx5e_get_devlink_port ,
13071290 .ndo_get_stats64 = mlx5e_rep_get_stats ,
13081291 .ndo_has_offload_stats = mlx5e_rep_has_offload_stats ,
13091292 .ndo_get_offload_stats = mlx5e_rep_get_offload_stats ,
13101293 .ndo_change_mtu = mlx5e_rep_change_mtu ,
1311- .ndo_get_port_parent_id = mlx5e_rep_get_port_parent_id ,
13121294};
13131295
13141296static const struct net_device_ops mlx5e_netdev_ops_uplink_rep = {
13151297 .ndo_open = mlx5e_open ,
13161298 .ndo_stop = mlx5e_close ,
13171299 .ndo_start_xmit = mlx5e_xmit ,
13181300 .ndo_set_mac_address = mlx5e_uplink_rep_set_mac ,
1319- .ndo_get_phys_port_name = mlx5e_rep_get_phys_port_name ,
13201301 .ndo_setup_tc = mlx5e_rep_setup_tc ,
1302+ .ndo_get_devlink_port = mlx5e_get_devlink_port ,
13211303 .ndo_get_stats64 = mlx5e_get_stats ,
13221304 .ndo_has_offload_stats = mlx5e_rep_has_offload_stats ,
13231305 .ndo_get_offload_stats = mlx5e_rep_get_offload_stats ,
@@ -1330,7 +1312,6 @@ static const struct net_device_ops mlx5e_netdev_ops_uplink_rep = {
13301312 .ndo_get_vf_config = mlx5e_get_vf_config ,
13311313 .ndo_get_vf_stats = mlx5e_get_vf_stats ,
13321314 .ndo_set_vf_vlan = mlx5e_uplink_rep_set_vf_vlan ,
1333- .ndo_get_port_parent_id = mlx5e_rep_get_port_parent_id ,
13341315 .ndo_set_features = mlx5e_set_features ,
13351316};
13361317
@@ -1731,6 +1712,55 @@ static const struct mlx5e_profile mlx5e_uplink_rep_profile = {
17311712 .max_tc = MLX5E_MAX_NUM_TC ,
17321713};
17331714
1715+ static bool
1716+ is_devlink_port_supported (const struct mlx5_core_dev * dev ,
1717+ const struct mlx5e_rep_priv * rpriv )
1718+ {
1719+ return rpriv -> rep -> vport == MLX5_VPORT_UPLINK ||
1720+ rpriv -> rep -> vport == MLX5_VPORT_PF ||
1721+ mlx5_eswitch_is_vf_vport (dev -> priv .eswitch , rpriv -> rep -> vport );
1722+ }
1723+
1724+ static int register_devlink_port (struct mlx5_core_dev * dev ,
1725+ struct mlx5e_rep_priv * rpriv )
1726+ {
1727+ struct devlink * devlink = priv_to_devlink (dev );
1728+ struct mlx5_eswitch_rep * rep = rpriv -> rep ;
1729+ struct netdev_phys_item_id ppid = {};
1730+ int ret ;
1731+
1732+ if (!is_devlink_port_supported (dev , rpriv ))
1733+ return 0 ;
1734+
1735+ ret = mlx5e_rep_get_port_parent_id (rpriv -> netdev , & ppid );
1736+ if (ret )
1737+ return ret ;
1738+
1739+ if (rep -> vport == MLX5_VPORT_UPLINK )
1740+ devlink_port_attrs_set (& rpriv -> dl_port ,
1741+ DEVLINK_PORT_FLAVOUR_PHYSICAL ,
1742+ PCI_FUNC (dev -> pdev -> devfn ), false, 0 ,
1743+ & ppid .id [0 ], ppid .id_len );
1744+ else if (rep -> vport == MLX5_VPORT_PF )
1745+ devlink_port_attrs_pci_pf_set (& rpriv -> dl_port ,
1746+ & ppid .id [0 ], ppid .id_len ,
1747+ dev -> pdev -> devfn );
1748+ else if (mlx5_eswitch_is_vf_vport (dev -> priv .eswitch , rpriv -> rep -> vport ))
1749+ devlink_port_attrs_pci_vf_set (& rpriv -> dl_port ,
1750+ & ppid .id [0 ], ppid .id_len ,
1751+ dev -> pdev -> devfn ,
1752+ rep -> vport - 1 );
1753+
1754+ return devlink_port_register (devlink , & rpriv -> dl_port , rep -> vport );
1755+ }
1756+
1757+ static void unregister_devlink_port (struct mlx5_core_dev * dev ,
1758+ struct mlx5e_rep_priv * rpriv )
1759+ {
1760+ if (is_devlink_port_supported (dev , rpriv ))
1761+ devlink_port_unregister (& rpriv -> dl_port );
1762+ }
1763+
17341764/* e-Switch vport representors */
17351765static int
17361766mlx5e_vport_rep_load (struct mlx5_core_dev * dev , struct mlx5_eswitch_rep * rep )
@@ -1782,15 +1812,27 @@ mlx5e_vport_rep_load(struct mlx5_core_dev *dev, struct mlx5_eswitch_rep *rep)
17821812 goto err_detach_netdev ;
17831813 }
17841814
1815+ err = register_devlink_port (dev , rpriv );
1816+ if (err ) {
1817+ esw_warn (dev , "Failed to register devlink port %d\n" ,
1818+ rep -> vport );
1819+ goto err_neigh_cleanup ;
1820+ }
1821+
17851822 err = register_netdev (netdev );
17861823 if (err ) {
17871824 pr_warn ("Failed to register representor netdev for vport %d\n" ,
17881825 rep -> vport );
1789- goto err_neigh_cleanup ;
1826+ goto err_devlink_cleanup ;
17901827 }
17911828
1829+ if (is_devlink_port_supported (dev , rpriv ))
1830+ devlink_port_type_eth_set (& rpriv -> dl_port , netdev );
17921831 return 0 ;
17931832
1833+ err_devlink_cleanup :
1834+ unregister_devlink_port (dev , rpriv );
1835+
17941836err_neigh_cleanup :
17951837 mlx5e_rep_neigh_cleanup (rpriv );
17961838
@@ -1813,9 +1855,13 @@ mlx5e_vport_rep_unload(struct mlx5_eswitch_rep *rep)
18131855 struct mlx5e_rep_priv * rpriv = mlx5e_rep_to_rep_priv (rep );
18141856 struct net_device * netdev = rpriv -> netdev ;
18151857 struct mlx5e_priv * priv = netdev_priv (netdev );
1858+ struct mlx5_core_dev * dev = priv -> mdev ;
18161859 void * ppriv = priv -> ppriv ;
18171860
1861+ if (is_devlink_port_supported (dev , rpriv ))
1862+ devlink_port_type_clear (& rpriv -> dl_port );
18181863 unregister_netdev (netdev );
1864+ unregister_devlink_port (dev , rpriv );
18191865 mlx5e_rep_neigh_cleanup (rpriv );
18201866 mlx5e_detach_netdev (priv );
18211867 if (rep -> vport == MLX5_VPORT_UPLINK )
0 commit comments