net/mlx5: E-Switch, Add callback to get representor device
authorMark Bloch <markb@mellanox.com>
Wed, 27 Sep 2017 07:24:18 +0000 (07:24 +0000)
committerSaeed Mahameed <saeedm@mellanox.com>
Fri, 23 Feb 2018 20:36:38 +0000 (12:36 -0800)
Add a callback interface to get a protocol device (per representor type).
The Ethernet representors will expose their netdev via this interface.

This functionality can be later used by IB representor in order to find the
corresponding net device representor.

Signed-off-by: Mark Bloch <markb@mellanox.com>
Reviewed-by: Or Gerlitz <ogerlitz@mellanox.com>
Signed-off-by: Leon Romanovsky <leon@kernel.org>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
drivers/net/ethernet/mellanox/mlx5/core/en_rep.c
drivers/net/ethernet/mellanox/mlx5/core/eswitch.h
drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c

index 363d8dcb7f174e4b084f93a9379218753a4e41d8..ea4b255380a2f9274ef57430483d67c113ef70dc 100644 (file)
@@ -1156,6 +1156,15 @@ mlx5e_vport_rep_unload(struct mlx5_eswitch_rep *rep)
        kfree(ppriv); /* mlx5e_rep_priv */
 }
 
+static void *mlx5e_vport_rep_get_proto_dev(struct mlx5_eswitch_rep *rep)
+{
+       struct mlx5e_rep_priv *rpriv;
+
+       rpriv = mlx5e_rep_to_rep_priv(rep);
+
+       return rpriv->netdev;
+}
+
 static void mlx5e_rep_register_vf_vports(struct mlx5e_priv *priv)
 {
        struct mlx5_core_dev *mdev = priv->mdev;
@@ -1168,6 +1177,7 @@ static void mlx5e_rep_register_vf_vports(struct mlx5e_priv *priv)
 
                rep_if.load = mlx5e_vport_rep_load;
                rep_if.unload = mlx5e_vport_rep_unload;
+               rep_if.get_proto_dev = mlx5e_vport_rep_get_proto_dev;
                mlx5_eswitch_register_vport_rep(esw, vport, &rep_if, REP_ETH);
        }
 }
@@ -1195,6 +1205,7 @@ void mlx5e_register_vport_reps(struct mlx5e_priv *priv)
 
        rep_if.load = mlx5e_nic_rep_load;
        rep_if.unload = mlx5e_nic_rep_unload;
+       rep_if.get_proto_dev = mlx5e_vport_rep_get_proto_dev;
        rep_if.priv = rpriv;
        INIT_LIST_HEAD(&rpriv->vport_sqs_list);
        mlx5_eswitch_register_vport_rep(esw, 0, &rep_if, REP_ETH); /* UPLINK PF vport*/
index 2fa037066b2f7bacb74cbcb9676a6096cf369eab..4dfb1da435a4051c35ce92eaba8e772a05c7baa1 100644 (file)
@@ -150,6 +150,7 @@ struct mlx5_eswitch_rep_if {
        int                    (*load)(struct mlx5_core_dev *dev,
                                       struct mlx5_eswitch_rep *rep);
        void                   (*unload)(struct mlx5_eswitch_rep *rep);
+       void                   *(*get_proto_dev)(struct mlx5_eswitch_rep *rep);
        void                    *priv;
        bool                   valid;
 };
@@ -286,6 +287,10 @@ void mlx5_eswitch_unregister_vport_rep(struct mlx5_eswitch *esw,
                                       int vport_index,
                                       u8 rep_type);
 void *mlx5_eswitch_get_uplink_priv(struct mlx5_eswitch *esw, u8 rep_type);
+void *mlx5_eswitch_get_proto_dev(struct mlx5_eswitch *esw,
+                                int vport,
+                                u8 rep_type);
+void *mlx5_eswitch_uplink_get_proto_dev(struct mlx5_eswitch *esw, u8 rep_type);
 
 int mlx5_eswitch_add_vlan_action(struct mlx5_eswitch *esw,
                                 struct mlx5_esw_flow_attr *attr);
index 99f583a15cc388b9171cd198b1e644a6a97b5168..06623c8e92a2bf8ff7a2625993985eeab1b3809e 100644 (file)
@@ -1160,6 +1160,7 @@ void mlx5_eswitch_register_vport_rep(struct mlx5_eswitch *esw,
 
        rep_if->load   = __rep_if->load;
        rep_if->unload = __rep_if->unload;
+       rep_if->get_proto_dev = __rep_if->get_proto_dev;
        rep_if->priv = __rep_if->priv;
 
        rep_if->valid = true;
@@ -1188,3 +1189,26 @@ void *mlx5_eswitch_get_uplink_priv(struct mlx5_eswitch *esw, u8 rep_type)
        rep = &offloads->vport_reps[UPLINK_REP_INDEX];
        return rep->rep_if[rep_type].priv;
 }
+
+void *mlx5_eswitch_get_proto_dev(struct mlx5_eswitch *esw,
+                                int vport,
+                                u8 rep_type)
+{
+       struct mlx5_esw_offload *offloads = &esw->offloads;
+       struct mlx5_eswitch_rep *rep;
+
+       if (vport == FDB_UPLINK_VPORT)
+               vport = UPLINK_REP_INDEX;
+
+       rep = &offloads->vport_reps[vport];
+
+       if (rep->rep_if[rep_type].valid &&
+           rep->rep_if[rep_type].get_proto_dev)
+               return rep->rep_if[rep_type].get_proto_dev(rep);
+       return NULL;
+}
+
+void *mlx5_eswitch_uplink_get_proto_dev(struct mlx5_eswitch *esw, u8 rep_type)
+{
+       return mlx5_eswitch_get_proto_dev(esw, UPLINK_REP_INDEX, rep_type);
+}