net/mlx5e: Implement mlx5e interface attach/detach callbacks
[sfrench/cifs-2.6.git] / drivers / net / ethernet / mellanox / mlx5 / core / en_rep.c
index 29db4735182a4b172856383b1c8351628544a8cb..3c97da103d30e8abd0adcd2bf8b5bcb021d517cd 100644 (file)
@@ -413,19 +413,50 @@ static struct mlx5e_profile mlx5e_rep_profile = {
 int mlx5e_vport_rep_load(struct mlx5_eswitch *esw,
                         struct mlx5_eswitch_rep *rep)
 {
-       rep->priv_data = mlx5e_create_netdev(esw->dev, &mlx5e_rep_profile, rep);
-       if (!rep->priv_data) {
-               mlx5_core_warn(esw->dev, "Failed to create representor for vport %d\n",
-                              rep->vport);
+       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;
+
 }
 
 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);
 }