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

Commit 4612bebf authored by Jakub Kicinski's avatar Jakub Kicinski Committed by Daniel Borkmann
Browse files

nfp: add .ndo_init() and .ndo_uninit() callbacks



BPF code should unregister the offload capabilities from .ndo_uninit(),
to make sure the operation is atomic with unlist_netdevice().  Plumb
the init/uninit NDOs for vNICs and representors.

Signed-off-by: default avatarJakub Kicinski <jakub.kicinski@netronome.com>
Reviewed-by: default avatarQuentin Monnet <quentin.monnet@netronome.com>
Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
parent d6d60713
Loading
Loading
Loading
Loading
+17 −0
Original line number Diff line number Diff line
@@ -86,6 +86,23 @@ const char *nfp_app_mip_name(struct nfp_app *app)
	return nfp_mip_name(app->pf->mip);
}

int nfp_app_ndo_init(struct net_device *netdev)
{
	struct nfp_app *app = nfp_app_from_netdev(netdev);

	if (!app || !app->type->ndo_init)
		return 0;
	return app->type->ndo_init(app, netdev);
}

void nfp_app_ndo_uninit(struct net_device *netdev)
{
	struct nfp_app *app = nfp_app_from_netdev(netdev);

	if (app && app->type->ndo_uninit)
		app->type->ndo_uninit(app, netdev);
}

u64 *nfp_app_port_get_stats(struct nfp_port *port, u64 *data)
{
	if (!port || !port->app || !port->app->type->port_get_stats)
+8 −0
Original line number Diff line number Diff line
@@ -78,6 +78,8 @@ extern const struct nfp_app_type app_abm;
 * @init:	perform basic app checks and init
 * @clean:	clean app state
 * @extra_cap:	extra capabilities string
 * @ndo_init:	vNIC and repr netdev .ndo_init
 * @ndo_uninit:	vNIC and repr netdev .ndo_unint
 * @vnic_alloc:	allocate vNICs (assign port types, etc.)
 * @vnic_free:	free up app's vNIC state
 * @vnic_init:	vNIC netdev was registered
@@ -117,6 +119,9 @@ struct nfp_app_type {

	const char *(*extra_cap)(struct nfp_app *app, struct nfp_net *nn);

	int (*ndo_init)(struct nfp_app *app, struct net_device *netdev);
	void (*ndo_uninit)(struct nfp_app *app, struct net_device *netdev);

	int (*vnic_alloc)(struct nfp_app *app, struct nfp_net *nn,
			  unsigned int id);
	void (*vnic_free)(struct nfp_app *app, struct nfp_net *nn);
@@ -200,6 +205,9 @@ static inline void nfp_app_clean(struct nfp_app *app)
		app->type->clean(app);
}

int nfp_app_ndo_init(struct net_device *netdev);
void nfp_app_ndo_uninit(struct net_device *netdev);

static inline int nfp_app_vnic_alloc(struct nfp_app *app, struct nfp_net *nn,
				     unsigned int id)
{
+2 −0
Original line number Diff line number Diff line
@@ -3480,6 +3480,8 @@ static int nfp_net_set_mac_address(struct net_device *netdev, void *addr)
}

const struct net_device_ops nfp_net_netdev_ops = {
	.ndo_init		= nfp_app_ndo_init,
	.ndo_uninit		= nfp_app_ndo_uninit,
	.ndo_open		= nfp_net_netdev_open,
	.ndo_stop		= nfp_net_netdev_close,
	.ndo_start_xmit		= nfp_net_tx,
+2 −0
Original line number Diff line number Diff line
@@ -262,6 +262,8 @@ static int nfp_repr_open(struct net_device *netdev)
}

const struct net_device_ops nfp_repr_netdev_ops = {
	.ndo_init		= nfp_app_ndo_init,
	.ndo_uninit		= nfp_app_ndo_uninit,
	.ndo_open		= nfp_repr_open,
	.ndo_stop		= nfp_repr_stop,
	.ndo_start_xmit		= nfp_repr_xmit,