forked from luck/tmp_suning_uos_patched
net/mlx5: Add Representors registration API
Introduce E-Switch registration/unregister representors functions. Those functions are called by the mlx5e driver when the PF NIC is created upon pci probe action regardless of the E-Switch mode (NONE, LEGACY or OFFLOADS). Adding basic E-Switch database that will hold the vport represntors upon creation. This patch doesn't add any new functionality. Signed-off-by: Hadar Hen Zion <hadarh@mellanox.com> Signed-off-by: Saeed Mahameed <saeedm@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
6bfd390ba5
commit
127ea380ac
|
@ -571,7 +571,7 @@ enum {
|
|||
struct mlx5e_profile {
|
||||
void (*init)(struct mlx5_core_dev *mdev,
|
||||
struct net_device *netdev,
|
||||
const struct mlx5e_profile *profile);
|
||||
const struct mlx5e_profile *profile, void *ppriv);
|
||||
void (*cleanup)(struct mlx5e_priv *priv);
|
||||
int (*init_rx)(struct mlx5e_priv *priv);
|
||||
void (*cleanup_rx)(struct mlx5e_priv *priv);
|
||||
|
@ -618,6 +618,7 @@ struct mlx5e_priv {
|
|||
struct mlx5e_tstamp tstamp;
|
||||
u16 q_counter;
|
||||
const struct mlx5e_profile *profile;
|
||||
void *ppriv;
|
||||
};
|
||||
|
||||
enum mlx5e_link_mode {
|
||||
|
|
|
@ -2880,7 +2880,8 @@ void mlx5e_set_rx_cq_mode_params(struct mlx5e_params *params, u8 cq_period_mode)
|
|||
|
||||
static void mlx5e_build_nic_netdev_priv(struct mlx5_core_dev *mdev,
|
||||
struct net_device *netdev,
|
||||
const struct mlx5e_profile *profile)
|
||||
const struct mlx5e_profile *profile,
|
||||
void *ppriv)
|
||||
{
|
||||
struct mlx5e_priv *priv = netdev_priv(netdev);
|
||||
u32 link_speed = 0;
|
||||
|
@ -2962,6 +2963,7 @@ static void mlx5e_build_nic_netdev_priv(struct mlx5_core_dev *mdev,
|
|||
priv->netdev = netdev;
|
||||
priv->params.num_channels = profile->max_nch(mdev);
|
||||
priv->profile = profile;
|
||||
priv->ppriv = ppriv;
|
||||
|
||||
#ifdef CONFIG_MLX5_CORE_EN_DCB
|
||||
mlx5e_ets_init(priv);
|
||||
|
@ -3126,18 +3128,25 @@ static int mlx5e_create_umr_mkey(struct mlx5e_priv *priv)
|
|||
|
||||
static void mlx5e_nic_init(struct mlx5_core_dev *mdev,
|
||||
struct net_device *netdev,
|
||||
const struct mlx5e_profile *profile)
|
||||
const struct mlx5e_profile *profile,
|
||||
void *ppriv)
|
||||
{
|
||||
struct mlx5e_priv *priv = netdev_priv(netdev);
|
||||
|
||||
mlx5e_build_nic_netdev_priv(mdev, netdev, profile);
|
||||
mlx5e_build_nic_netdev_priv(mdev, netdev, profile, ppriv);
|
||||
mlx5e_build_nic_netdev(netdev);
|
||||
mlx5e_vxlan_init(priv);
|
||||
}
|
||||
|
||||
static void mlx5e_nic_cleanup(struct mlx5e_priv *priv)
|
||||
{
|
||||
struct mlx5_core_dev *mdev = priv->mdev;
|
||||
struct mlx5_eswitch *esw = mdev->priv.eswitch;
|
||||
|
||||
mlx5e_vxlan_cleanup(priv);
|
||||
|
||||
if (MLX5_CAP_GEN(mdev, vport_group_manager))
|
||||
mlx5_eswitch_unregister_vport_rep(esw, 0);
|
||||
}
|
||||
|
||||
static int mlx5e_init_nic_rx(struct mlx5e_priv *priv)
|
||||
|
@ -3229,6 +3238,8 @@ static void mlx5e_nic_enable(struct mlx5e_priv *priv)
|
|||
{
|
||||
struct net_device *netdev = priv->netdev;
|
||||
struct mlx5_core_dev *mdev = priv->mdev;
|
||||
struct mlx5_eswitch *esw = mdev->priv.eswitch;
|
||||
struct mlx5_eswitch_rep rep;
|
||||
|
||||
if (mlx5e_vxlan_allowed(mdev)) {
|
||||
rtnl_lock();
|
||||
|
@ -3238,6 +3249,12 @@ static void mlx5e_nic_enable(struct mlx5e_priv *priv)
|
|||
|
||||
mlx5e_enable_async_events(priv);
|
||||
queue_work(priv->wq, &priv->set_rx_mode_work);
|
||||
|
||||
if (MLX5_CAP_GEN(mdev, vport_group_manager)) {
|
||||
rep.vport = 0;
|
||||
rep.priv_data = priv;
|
||||
mlx5_eswitch_register_vport_rep(esw, &rep);
|
||||
}
|
||||
}
|
||||
|
||||
static void mlx5e_nic_disable(struct mlx5e_priv *priv)
|
||||
|
@ -3261,7 +3278,7 @@ static const struct mlx5e_profile mlx5e_nic_profile = {
|
|||
};
|
||||
|
||||
static void *mlx5e_create_netdev(struct mlx5_core_dev *mdev,
|
||||
const struct mlx5e_profile *profile)
|
||||
const struct mlx5e_profile *profile, void *ppriv)
|
||||
{
|
||||
struct net_device *netdev;
|
||||
struct mlx5e_priv *priv;
|
||||
|
@ -3276,7 +3293,7 @@ static void *mlx5e_create_netdev(struct mlx5_core_dev *mdev,
|
|||
return NULL;
|
||||
}
|
||||
|
||||
profile->init(mdev, netdev, profile);
|
||||
profile->init(mdev, netdev, profile, ppriv);
|
||||
|
||||
netif_carrier_off(netdev);
|
||||
|
||||
|
@ -3343,8 +3360,27 @@ static void *mlx5e_create_netdev(struct mlx5_core_dev *mdev,
|
|||
return NULL;
|
||||
}
|
||||
|
||||
static void mlx5e_register_vport_rep(struct mlx5_core_dev *mdev)
|
||||
{
|
||||
struct mlx5_eswitch *esw = mdev->priv.eswitch;
|
||||
int total_vfs = MLX5_TOTAL_VPORTS(mdev);
|
||||
int vport;
|
||||
|
||||
if (!MLX5_CAP_GEN(mdev, vport_group_manager))
|
||||
return;
|
||||
|
||||
for (vport = 1; vport < total_vfs; vport++) {
|
||||
struct mlx5_eswitch_rep rep;
|
||||
|
||||
rep.vport = vport;
|
||||
mlx5_eswitch_register_vport_rep(esw, &rep);
|
||||
}
|
||||
}
|
||||
|
||||
static void *mlx5e_add(struct mlx5_core_dev *mdev)
|
||||
{
|
||||
struct mlx5_eswitch *esw = mdev->priv.eswitch;
|
||||
void *ppriv = NULL;
|
||||
void *ret;
|
||||
|
||||
if (mlx5e_check_required_hca_cap(mdev))
|
||||
|
@ -3353,7 +3389,12 @@ static void *mlx5e_add(struct mlx5_core_dev *mdev)
|
|||
if (mlx5e_create_mdev_resources(mdev))
|
||||
return NULL;
|
||||
|
||||
ret = mlx5e_create_netdev(mdev, &mlx5e_nic_profile);
|
||||
mlx5e_register_vport_rep(mdev);
|
||||
|
||||
if (MLX5_CAP_GEN(mdev, vport_group_manager))
|
||||
ppriv = &esw->offloads.vport_reps[0];
|
||||
|
||||
ret = mlx5e_create_netdev(mdev, &mlx5e_nic_profile, ppriv);
|
||||
if (!ret) {
|
||||
mlx5e_destroy_mdev_resources(mdev);
|
||||
return NULL;
|
||||
|
@ -3394,9 +3435,16 @@ static void mlx5e_destroy_netdev(struct mlx5_core_dev *mdev, struct mlx5e_priv *
|
|||
|
||||
static void mlx5e_remove(struct mlx5_core_dev *mdev, void *vpriv)
|
||||
{
|
||||
struct mlx5_eswitch *esw = mdev->priv.eswitch;
|
||||
int total_vfs = MLX5_TOTAL_VPORTS(mdev);
|
||||
struct mlx5e_priv *priv = vpriv;
|
||||
int vport;
|
||||
|
||||
mlx5e_destroy_netdev(mdev, priv);
|
||||
|
||||
for (vport = 1; vport < total_vfs; vport++)
|
||||
mlx5_eswitch_unregister_vport_rep(esw, vport);
|
||||
|
||||
mlx5e_destroy_mdev_resources(mdev);
|
||||
}
|
||||
|
||||
|
|
|
@ -1663,6 +1663,14 @@ int mlx5_eswitch_init(struct mlx5_core_dev *dev)
|
|||
goto abort;
|
||||
}
|
||||
|
||||
esw->offloads.vport_reps =
|
||||
kzalloc(total_vports * sizeof(struct mlx5_eswitch_rep),
|
||||
GFP_KERNEL);
|
||||
if (!esw->offloads.vport_reps) {
|
||||
err = -ENOMEM;
|
||||
goto abort;
|
||||
}
|
||||
|
||||
mutex_init(&esw->state_lock);
|
||||
|
||||
for (vport_num = 0; vport_num < total_vports; vport_num++) {
|
||||
|
@ -1687,6 +1695,7 @@ int mlx5_eswitch_init(struct mlx5_core_dev *dev)
|
|||
destroy_workqueue(esw->work_queue);
|
||||
kfree(esw->l2_table.bitmap);
|
||||
kfree(esw->vports);
|
||||
kfree(esw->offloads.vport_reps);
|
||||
kfree(esw);
|
||||
return err;
|
||||
}
|
||||
|
@ -1704,6 +1713,7 @@ void mlx5_eswitch_cleanup(struct mlx5_eswitch *esw)
|
|||
destroy_workqueue(esw->work_queue);
|
||||
kfree(esw->l2_table.bitmap);
|
||||
kfree(esw->mc_promisc);
|
||||
kfree(esw->offloads.vport_reps);
|
||||
kfree(esw->vports);
|
||||
kfree(esw);
|
||||
}
|
||||
|
|
|
@ -156,9 +156,17 @@ enum {
|
|||
SRIOV_OFFLOADS
|
||||
};
|
||||
|
||||
|
||||
struct mlx5_eswitch_rep {
|
||||
u16 vport;
|
||||
void *priv_data;
|
||||
bool valid;
|
||||
};
|
||||
|
||||
struct mlx5_esw_offload {
|
||||
struct mlx5_flow_table *ft_offloads;
|
||||
struct mlx5_flow_group *vport_rx_group;
|
||||
struct mlx5_eswitch_rep *vport_reps;
|
||||
};
|
||||
|
||||
struct mlx5_eswitch {
|
||||
|
@ -208,6 +216,10 @@ mlx5_eswitch_create_vport_rx_rule(struct mlx5_eswitch *esw, int vport, u32 tirn)
|
|||
|
||||
int mlx5_devlink_eswitch_mode_set(struct devlink *devlink, u16 mode);
|
||||
int mlx5_devlink_eswitch_mode_get(struct devlink *devlink, u16 *mode);
|
||||
void mlx5_eswitch_register_vport_rep(struct mlx5_eswitch *esw,
|
||||
struct mlx5_eswitch_rep *rep);
|
||||
void mlx5_eswitch_unregister_vport_rep(struct mlx5_eswitch *esw,
|
||||
int vport);
|
||||
|
||||
#define MLX5_DEBUG_ESWITCH_MASK BIT(3)
|
||||
|
||||
|
|
|
@ -451,3 +451,22 @@ int mlx5_devlink_eswitch_mode_get(struct devlink *devlink, u16 *mode)
|
|||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void mlx5_eswitch_register_vport_rep(struct mlx5_eswitch *esw,
|
||||
struct mlx5_eswitch_rep *rep)
|
||||
{
|
||||
struct mlx5_esw_offload *offloads = &esw->offloads;
|
||||
|
||||
memcpy(&offloads->vport_reps[rep->vport], rep,
|
||||
sizeof(struct mlx5_eswitch_rep));
|
||||
|
||||
offloads->vport_reps[rep->vport].valid = true;
|
||||
}
|
||||
|
||||
void mlx5_eswitch_unregister_vport_rep(struct mlx5_eswitch *esw,
|
||||
int vport)
|
||||
{
|
||||
struct mlx5_esw_offload *offloads = &esw->offloads;
|
||||
|
||||
offloads->vport_reps[vport].valid = false;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user