Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1a24d4f9 authored by John Hurley's avatar John Hurley Committed by David S. Miller
Browse files

nfp: register flower reprs for egress dev offload



Register a callback for offloading flows that have a repr as their egress
device. The new egdev_register function is added to net-next for the 4.15
release.

Signed-off-by: default avatarJohn Hurley <john.hurley@netronome.com>
Reviewed-by: default avatarJakub Kicinski <jakub.kicinski@netronome.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 743ba5b4
Loading
Loading
Loading
Loading
+18 −0
Original line number Diff line number Diff line
@@ -125,6 +125,21 @@ nfp_flower_repr_netdev_stop(struct nfp_app *app, struct nfp_repr *repr)
	return nfp_flower_cmsg_portmod(repr, false);
}

static int
nfp_flower_repr_netdev_init(struct nfp_app *app, struct net_device *netdev)
{
	return tc_setup_cb_egdev_register(netdev,
					  nfp_flower_setup_tc_egress_cb,
					  netdev_priv(netdev));
}

static void
nfp_flower_repr_netdev_clean(struct nfp_app *app, struct net_device *netdev)
{
	tc_setup_cb_egdev_unregister(netdev, nfp_flower_setup_tc_egress_cb,
				     netdev_priv(netdev));
}

static void nfp_flower_sriov_disable(struct nfp_app *app)
{
	struct nfp_flower_priv *priv = app->priv;
@@ -452,6 +467,9 @@ const struct nfp_app_type app_flower = {
	.vnic_init	= nfp_flower_vnic_init,
	.vnic_clean	= nfp_flower_vnic_clean,

	.repr_init	= nfp_flower_repr_netdev_init,
	.repr_clean	= nfp_flower_repr_netdev_clean,

	.repr_open	= nfp_flower_repr_netdev_open,
	.repr_stop	= nfp_flower_repr_netdev_stop,

+2 −0
Original line number Diff line number Diff line
@@ -196,5 +196,7 @@ void nfp_tunnel_del_ipv4_off(struct nfp_app *app, __be32 ipv4);
void nfp_tunnel_add_ipv4_off(struct nfp_app *app, __be32 ipv4);
void nfp_tunnel_request_route(struct nfp_app *app, struct sk_buff *skb);
void nfp_tunnel_keep_alive(struct nfp_app *app, struct sk_buff *skb);
int nfp_flower_setup_tc_egress_cb(enum tc_setup_type type, void *type_data,
				  void *cb_priv);

#endif
+6 −0
Original line number Diff line number Diff line
@@ -465,6 +465,12 @@ nfp_flower_repr_offload(struct nfp_app *app, struct net_device *netdev,
	return -EOPNOTSUPP;
}

int nfp_flower_setup_tc_egress_cb(enum tc_setup_type type, void *type_data,
				  void *cb_priv)
{
	return -EINVAL;
}

static int nfp_flower_setup_tc_block_cb(enum tc_setup_type type,
					void *type_data, void *cb_priv)
{
+20 −0
Original line number Diff line number Diff line
@@ -76,6 +76,8 @@ extern const struct nfp_app_type app_flower;
 * @vnic_free:	free up app's vNIC state
 * @vnic_init:	vNIC netdev was registered
 * @vnic_clean:	vNIC netdev about to be unregistered
 * @repr_init:	representor about to be registered
 * @repr_clean:	representor about to be unregistered
 * @repr_open:	representor netdev open callback
 * @repr_stop:	representor netdev stop callback
 * @start:	start application logic
@@ -109,6 +111,9 @@ struct nfp_app_type {
	int (*vnic_init)(struct nfp_app *app, struct nfp_net *nn);
	void (*vnic_clean)(struct nfp_app *app, struct nfp_net *nn);

	int (*repr_init)(struct nfp_app *app, struct net_device *netdev);
	void (*repr_clean)(struct nfp_app *app, struct net_device *netdev);

	int (*repr_open)(struct nfp_app *app, struct nfp_repr *repr);
	int (*repr_stop)(struct nfp_app *app, struct nfp_repr *repr);

@@ -212,6 +217,21 @@ static inline int nfp_app_repr_stop(struct nfp_app *app, struct nfp_repr *repr)
	return app->type->repr_stop(app, repr);
}

static inline int
nfp_app_repr_init(struct nfp_app *app, struct net_device *netdev)
{
	if (!app->type->repr_init)
		return 0;
	return app->type->repr_init(app, netdev);
}

static inline void
nfp_app_repr_clean(struct nfp_app *app, struct net_device *netdev)
{
	if (app->type->repr_clean)
		app->type->repr_clean(app, netdev);
}

static inline int nfp_app_start(struct nfp_app *app, struct nfp_net *ctrl)
{
	app->ctrl = ctrl;
+8 −1
Original line number Diff line number Diff line
@@ -258,6 +258,7 @@ const struct net_device_ops nfp_repr_netdev_ops = {
static void nfp_repr_clean(struct nfp_repr *repr)
{
	unregister_netdev(repr->netdev);
	nfp_app_repr_clean(repr->app, repr->netdev);
	dst_release((struct dst_entry *)repr->dst);
	nfp_port_free(repr->port);
}
@@ -306,12 +307,18 @@ int nfp_repr_init(struct nfp_app *app, struct net_device *netdev,
		netdev->hw_features |= NETIF_F_HW_TC;
	}

	err = register_netdev(netdev);
	err = nfp_app_repr_init(app, netdev);
	if (err)
		goto err_clean;

	err = register_netdev(netdev);
	if (err)
		goto err_repr_clean;

	return 0;

err_repr_clean:
	nfp_app_repr_clean(app, netdev);
err_clean:
	dst_release((struct dst_entry *)repr->dst);
	return err;