void mlx5e_vport_rep_unload(struct mlx5_eswitch *esw, struct mlx5_eswitch_rep *rep) { struct mlx5e_priv *priv = rep->priv_data; struct net_device *netdev = priv->netdev; mlx5e_detach_netdev(esw->dev, netdev); mlx5e_destroy_netdev(esw->dev, priv); }
void mlx5e_vport_rep_unload(struct mlx5_eswitch *esw, struct mlx5_eswitch_rep *rep) { struct net_device *netdev = rep->netdev; unregister_netdev(netdev); mlx5e_detach_netdev(esw->dev, netdev); mlx5e_destroy_netdev(esw->dev, netdev_priv(netdev)); }
void mlx5_rdma_netdev_free(struct net_device *netdev) { struct mlx5e_priv *priv = mlx5i_epriv(netdev); struct mlx5i_priv *ipriv = priv->ppriv; const struct mlx5e_profile *profile = priv->profile; mlx5e_detach_netdev(priv); profile->cleanup(priv); destroy_workqueue(priv->wq); if (!ipriv->sub_interface) { mlx5i_pkey_qpn_ht_cleanup(netdev); mlx5e_destroy_mdev_resources(priv->mdev); } free_netdev(netdev); }
int mlx5e_vport_rep_load(struct mlx5_eswitch *esw, struct mlx5_eswitch_rep *rep) { struct net_device *netdev; int err; netdev = mlx5e_create_netdev(esw->dev, &mlx5e_rep_profile, rep); if (!netdev) { pr_warn("Failed to create representor netdev for vport %d\n", rep->vport); return -EINVAL; } rep->priv_data = netdev_priv(netdev); err = mlx5e_attach_netdev(esw->dev, netdev); if (err) { pr_warn("Failed to attach representor netdev for vport %d\n", rep->vport); goto err_destroy_netdev; } err = register_netdev(netdev); if (err) { pr_warn("Failed to register representor netdev for vport %d\n", rep->vport); goto err_detach_netdev; } return 0; err_detach_netdev: mlx5e_detach_netdev(esw->dev, netdev); err_destroy_netdev: mlx5e_destroy_netdev(esw->dev, rep->priv_data); return err; }