@@ -226,3 +226,66 @@ void mlx5_devlink_unregister(struct devlink *devlink)
ARRAY_SIZE(mlx5_devlink_params));
devlink_unregister(devlink);
}
+
+bool
+mlx5_devlink_port_supported(const struct mlx5_core_dev *dev,
+ const struct mlx5_vport *vport)
+{
+ return vport->vport == MLX5_VPORT_UPLINK ||
+ vport->vport == MLX5_VPORT_PF ||
+ mlx5_eswitch_is_vf_vport(dev->priv.eswitch, vport->vport);
+}
+
+static unsigned int
+vport_to_devlink_port_index(const struct mlx5_core_dev *dev, u16 vport_num)
+{
+ return (MLX5_CAP_GEN(dev, vhca_id) << 16) | vport_num;
+}
+
+static void get_port_switch_id(struct mlx5_core_dev *dev,
+ struct netdev_phys_item_id *ppid)
+{
+ u64 parent_id;
+
+ parent_id = mlx5_query_nic_system_image_guid(dev);
+ ppid->id_len = sizeof(parent_id);
+ memcpy(ppid->id, &parent_id, sizeof(parent_id));
+}
+
+int mlx5_devlink_port_register(struct mlx5_core_dev *dev,
+ struct mlx5_vport *vport)
+{
+ struct devlink *devlink = priv_to_devlink(dev);
+ struct netdev_phys_item_id ppid = {};
+ unsigned int dl_port_index = 0;
+
+ if (!mlx5_devlink_port_supported(dev, vport))
+ return 0;
+
+ get_port_switch_id(dev, &ppid);
+ memset(&vport->dl_port, 0, sizeof(vport->dl_port));
+
+ dl_port_index = vport_to_devlink_port_index(dev, vport->vport);
+ if (vport->vport == MLX5_VPORT_UPLINK)
+ devlink_port_attrs_set(&vport->dl_port,
+ DEVLINK_PORT_FLAVOUR_PHYSICAL,
+ PCI_FUNC(dev->pdev->devfn), false, 0,
+ &ppid.id[0], ppid.id_len);
+ else if (vport->vport == MLX5_VPORT_PF)
+ devlink_port_attrs_pci_pf_set(&vport->dl_port,
+ &ppid.id[0], ppid.id_len,
+ dev->pdev->devfn);
+ else if (mlx5_eswitch_is_vf_vport(dev->priv.eswitch, vport->vport))
+ devlink_port_attrs_pci_vf_set(&vport->dl_port,
+ &ppid.id[0], ppid.id_len,
+ dev->pdev->devfn,
+ vport->vport - 1);
+ return devlink_port_register(devlink, &vport->dl_port, dl_port_index);
+}
+
+void mlx5_devlink_port_unregister(struct mlx5_core_dev *dev,
+ struct mlx5_vport *vport)
+{
+ if (mlx5_devlink_port_supported(dev, vport))
+ devlink_port_unregister(&vport->dl_port);
+}
@@ -5,10 +5,18 @@
#define __MLX5_DEVLINK_H__
#include <net/devlink.h>
+#include "eswitch.h"
struct devlink *mlx5_devlink_alloc(void);
void mlx5_devlink_free(struct devlink *devlink);
int mlx5_devlink_register(struct devlink *devlink, struct device *dev);
void mlx5_devlink_unregister(struct devlink *devlink);
+bool
+mlx5_devlink_port_supported(const struct mlx5_core_dev *dev,
+ const struct mlx5_vport *vport);
+int mlx5_devlink_port_register(struct mlx5_core_dev *dev,
+ struct mlx5_vport *vport);
+void mlx5_devlink_port_unregister(struct mlx5_core_dev *dev,
+ struct mlx5_vport *vport);
#endif /* __MLX5_DEVLINK_H__ */
@@ -392,19 +392,6 @@ static const struct ethtool_ops mlx5e_uplink_rep_ethtool_ops = {
.set_pauseparam = mlx5e_uplink_rep_set_pauseparam,
};
-static void mlx5e_rep_get_port_parent_id(struct net_device *dev,
- struct netdev_phys_item_id *ppid)
-{
- struct mlx5e_priv *priv;
- u64 parent_id;
-
- priv = netdev_priv(dev);
-
- parent_id = mlx5_query_nic_system_image_guid(priv->mdev);
- ppid->id_len = sizeof(parent_id);
- memcpy(ppid->id, &parent_id, sizeof(parent_id));
-}
-
static void mlx5e_sqs2vport_stop(struct mlx5_eswitch *esw,
struct mlx5_eswitch_rep *rep)
{
@@ -1356,8 +1343,11 @@ static struct devlink_port *mlx5e_get_devlink_port(struct net_device *dev)
{
struct mlx5e_priv *priv = netdev_priv(dev);
struct mlx5e_rep_priv *rpriv = priv->ppriv;
+ struct mlx5_core_dev *mdev = priv->mdev;
+ struct mlx5_vport *vport;
- return &rpriv->dl_port;
+ vport = mlx5_eswitch_get_vport(mdev->priv.eswitch, rpriv->rep->vport);
+ return &vport->dl_port;
}
static const struct net_device_ops mlx5e_netdev_ops_rep = {
@@ -1792,64 +1782,6 @@ static const struct mlx5e_profile mlx5e_uplink_rep_profile = {
.rq_groups = MLX5E_NUM_RQ_GROUPS(REGULAR),
};
-static bool
-is_devlink_port_supported(const struct mlx5_core_dev *dev,
- const struct mlx5e_rep_priv *rpriv)
-{
- return rpriv->rep->vport == MLX5_VPORT_UPLINK ||
- rpriv->rep->vport == MLX5_VPORT_PF ||
- mlx5_eswitch_is_vf_vport(dev->priv.eswitch, rpriv->rep->vport);
-}
-
-static unsigned int
-vport_to_devlink_port_index(const struct mlx5_core_dev *dev, u16 vport_num)
-{
- return (MLX5_CAP_GEN(dev, vhca_id) << 16) | vport_num;
-}
-
-static int register_devlink_port(struct mlx5_core_dev *dev,
- struct mlx5e_rep_priv *rpriv)
-{
- struct devlink *devlink = priv_to_devlink(dev);
- struct mlx5_eswitch_rep *rep = rpriv->rep;
- struct netdev_phys_item_id ppid = {};
- unsigned int dl_port_index = 0;
-
- if (!is_devlink_port_supported(dev, rpriv))
- return 0;
-
- mlx5e_rep_get_port_parent_id(rpriv->netdev, &ppid);
-
- if (rep->vport == MLX5_VPORT_UPLINK) {
- devlink_port_attrs_set(&rpriv->dl_port,
- DEVLINK_PORT_FLAVOUR_PHYSICAL,
- PCI_FUNC(dev->pdev->devfn), false, 0,
- &ppid.id[0], ppid.id_len);
- dl_port_index = vport_to_devlink_port_index(dev, rep->vport);
- } else if (rep->vport == MLX5_VPORT_PF) {
- devlink_port_attrs_pci_pf_set(&rpriv->dl_port,
- &ppid.id[0], ppid.id_len,
- dev->pdev->devfn);
- dl_port_index = rep->vport;
- } else if (mlx5_eswitch_is_vf_vport(dev->priv.eswitch,
- rpriv->rep->vport)) {
- devlink_port_attrs_pci_vf_set(&rpriv->dl_port,
- &ppid.id[0], ppid.id_len,
- dev->pdev->devfn,
- rep->vport - 1);
- dl_port_index = vport_to_devlink_port_index(dev, rep->vport);
- }
-
- return devlink_port_register(devlink, &rpriv->dl_port, dl_port_index);
-}
-
-static void unregister_devlink_port(struct mlx5_core_dev *dev,
- struct mlx5e_rep_priv *rpriv)
-{
- if (is_devlink_port_supported(dev, rpriv))
- devlink_port_unregister(&rpriv->dl_port);
-}
-
/* e-Switch vport representors */
static int
mlx5e_vport_rep_load(struct mlx5_core_dev *dev, struct mlx5_eswitch_rep *rep)
@@ -1857,6 +1789,7 @@ mlx5e_vport_rep_load(struct mlx5_core_dev *dev, struct mlx5_eswitch_rep *rep)
const struct mlx5e_profile *profile;
struct mlx5e_rep_priv *rpriv;
struct net_device *netdev;
+ struct mlx5_vport *vport;
int nch, err;
rpriv = kzalloc(sizeof(*rpriv), GFP_KERNEL);
@@ -1901,7 +1834,8 @@ mlx5e_vport_rep_load(struct mlx5_core_dev *dev, struct mlx5_eswitch_rep *rep)
goto err_detach_netdev;
}
- err = register_devlink_port(dev, rpriv);
+ vport = mlx5_eswitch_get_vport(dev->priv.eswitch, rep->vport);
+ err = mlx5_devlink_port_register(dev, vport);
if (err) {
esw_warn(dev, "Failed to register devlink port %d\n",
rep->vport);
@@ -1915,12 +1849,12 @@ mlx5e_vport_rep_load(struct mlx5_core_dev *dev, struct mlx5_eswitch_rep *rep)
goto err_devlink_cleanup;
}
- if (is_devlink_port_supported(dev, rpriv))
- devlink_port_type_eth_set(&rpriv->dl_port, netdev);
+ if (mlx5_devlink_port_supported(dev, vport))
+ devlink_port_type_eth_set(&vport->dl_port, netdev);
return 0;
err_devlink_cleanup:
- unregister_devlink_port(dev, rpriv);
+ mlx5_devlink_port_unregister(dev, vport);
err_neigh_cleanup:
mlx5e_rep_neigh_cleanup(rpriv);
@@ -1946,11 +1880,13 @@ mlx5e_vport_rep_unload(struct mlx5_eswitch_rep *rep)
struct mlx5e_priv *priv = netdev_priv(netdev);
struct mlx5_core_dev *dev = priv->mdev;
void *ppriv = priv->ppriv;
+ struct mlx5_vport *vport;
- if (is_devlink_port_supported(dev, rpriv))
- devlink_port_type_clear(&rpriv->dl_port);
+ vport = mlx5_eswitch_get_vport(dev->priv.eswitch, rep->vport);
+ if (mlx5_devlink_port_supported(dev, vport))
+ devlink_port_type_clear(&vport->dl_port);
unregister_netdev(netdev);
- unregister_devlink_port(dev, rpriv);
+ mlx5_devlink_port_unregister(dev, vport);
mlx5e_rep_neigh_cleanup(rpriv);
mlx5e_detach_netdev(priv);
if (rep->vport == MLX5_VPORT_UPLINK)
@@ -39,6 +39,7 @@
#include "eswitch.h"
#include "en.h"
#include "lib/port_tun.h"
+#include "devlink.h"
#ifdef CONFIG_MLX5_ESWITCH
struct mlx5e_neigh_update_table {
@@ -90,7 +91,6 @@ struct mlx5e_rep_priv {
struct list_head vport_sqs_list;
struct mlx5_rep_uplink_priv uplink_priv; /* valid for uplink rep */
struct rtnl_link_stats64 prev_vf_vport_stats;
- struct devlink_port dl_port;
};
static inline
@@ -138,6 +138,7 @@ struct mlx5_vport {
bool enabled;
enum mlx5_eswitch_vport_event enabled_events;
+ struct devlink_port dl_port;
};
enum offloads_fdb_flags {