162306a36Sopenharmony_ci// SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
262306a36Sopenharmony_ci/* Copyright (C) 2017-2018 Netronome Systems, Inc. */
362306a36Sopenharmony_ci
462306a36Sopenharmony_ci#include <linux/rtnetlink.h>
562306a36Sopenharmony_ci#include <net/devlink.h>
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci#include "nfpcore/nfp.h"
862306a36Sopenharmony_ci#include "nfpcore/nfp_nsp.h"
962306a36Sopenharmony_ci#include "nfp_app.h"
1062306a36Sopenharmony_ci#include "nfp_main.h"
1162306a36Sopenharmony_ci#include "nfp_port.h"
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_cistatic int
1462306a36Sopenharmony_cinfp_devlink_fill_eth_port(struct nfp_port *port,
1562306a36Sopenharmony_ci			  struct nfp_eth_table_port *copy)
1662306a36Sopenharmony_ci{
1762306a36Sopenharmony_ci	struct nfp_eth_table_port *eth_port;
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ci	eth_port = __nfp_port_get_eth_port(port);
2062306a36Sopenharmony_ci	if (!eth_port)
2162306a36Sopenharmony_ci		return -EINVAL;
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ci	memcpy(copy, eth_port, sizeof(*eth_port));
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ci	return 0;
2662306a36Sopenharmony_ci}
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_cistatic int
2962306a36Sopenharmony_cinfp_devlink_fill_eth_port_from_id(struct nfp_pf *pf,
3062306a36Sopenharmony_ci				  struct devlink_port *dl_port,
3162306a36Sopenharmony_ci				  struct nfp_eth_table_port *copy)
3262306a36Sopenharmony_ci{
3362306a36Sopenharmony_ci	struct nfp_port *port = container_of(dl_port, struct nfp_port, dl_port);
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_ci	return nfp_devlink_fill_eth_port(port, copy);
3662306a36Sopenharmony_ci}
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_cistatic int
3962306a36Sopenharmony_cinfp_devlink_set_lanes(struct nfp_pf *pf, unsigned int idx, unsigned int lanes)
4062306a36Sopenharmony_ci{
4162306a36Sopenharmony_ci	struct nfp_nsp *nsp;
4262306a36Sopenharmony_ci	int ret;
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_ci	nsp = nfp_eth_config_start(pf->cpp, idx);
4562306a36Sopenharmony_ci	if (IS_ERR(nsp))
4662306a36Sopenharmony_ci		return PTR_ERR(nsp);
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_ci	ret = __nfp_eth_set_split(nsp, lanes);
4962306a36Sopenharmony_ci	if (ret) {
5062306a36Sopenharmony_ci		nfp_eth_config_cleanup_end(nsp);
5162306a36Sopenharmony_ci		return ret;
5262306a36Sopenharmony_ci	}
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_ci	ret = nfp_eth_config_commit_end(nsp);
5562306a36Sopenharmony_ci	if (ret < 0)
5662306a36Sopenharmony_ci		return ret;
5762306a36Sopenharmony_ci	if (ret) /* no change */
5862306a36Sopenharmony_ci		return 0;
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_ci	return nfp_net_refresh_port_table_sync(pf);
6162306a36Sopenharmony_ci}
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_cistatic int
6462306a36Sopenharmony_cinfp_devlink_port_split(struct devlink *devlink, struct devlink_port *port,
6562306a36Sopenharmony_ci		       unsigned int count, struct netlink_ext_ack *extack)
6662306a36Sopenharmony_ci{
6762306a36Sopenharmony_ci	struct nfp_pf *pf = devlink_priv(devlink);
6862306a36Sopenharmony_ci	struct nfp_eth_table_port eth_port;
6962306a36Sopenharmony_ci	unsigned int lanes;
7062306a36Sopenharmony_ci	int ret;
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_ci	rtnl_lock();
7362306a36Sopenharmony_ci	ret = nfp_devlink_fill_eth_port_from_id(pf, port, &eth_port);
7462306a36Sopenharmony_ci	rtnl_unlock();
7562306a36Sopenharmony_ci	if (ret)
7662306a36Sopenharmony_ci		return ret;
7762306a36Sopenharmony_ci
7862306a36Sopenharmony_ci	if (eth_port.port_lanes % count)
7962306a36Sopenharmony_ci		return -EINVAL;
8062306a36Sopenharmony_ci
8162306a36Sopenharmony_ci	/* Special case the 100G CXP -> 2x40G split */
8262306a36Sopenharmony_ci	lanes = eth_port.port_lanes / count;
8362306a36Sopenharmony_ci	if (eth_port.lanes == 10 && count == 2)
8462306a36Sopenharmony_ci		lanes = 8 / count;
8562306a36Sopenharmony_ci
8662306a36Sopenharmony_ci	return nfp_devlink_set_lanes(pf, eth_port.index, lanes);
8762306a36Sopenharmony_ci}
8862306a36Sopenharmony_ci
8962306a36Sopenharmony_cistatic int
9062306a36Sopenharmony_cinfp_devlink_port_unsplit(struct devlink *devlink, struct devlink_port *port,
9162306a36Sopenharmony_ci			 struct netlink_ext_ack *extack)
9262306a36Sopenharmony_ci{
9362306a36Sopenharmony_ci	struct nfp_pf *pf = devlink_priv(devlink);
9462306a36Sopenharmony_ci	struct nfp_eth_table_port eth_port;
9562306a36Sopenharmony_ci	unsigned int lanes;
9662306a36Sopenharmony_ci	int ret;
9762306a36Sopenharmony_ci
9862306a36Sopenharmony_ci	rtnl_lock();
9962306a36Sopenharmony_ci	ret = nfp_devlink_fill_eth_port_from_id(pf, port, &eth_port);
10062306a36Sopenharmony_ci	rtnl_unlock();
10162306a36Sopenharmony_ci	if (ret)
10262306a36Sopenharmony_ci		return ret;
10362306a36Sopenharmony_ci
10462306a36Sopenharmony_ci	if (!eth_port.is_split)
10562306a36Sopenharmony_ci		return -EINVAL;
10662306a36Sopenharmony_ci
10762306a36Sopenharmony_ci	/* Special case the 100G CXP -> 2x40G unsplit */
10862306a36Sopenharmony_ci	lanes = eth_port.port_lanes;
10962306a36Sopenharmony_ci	if (eth_port.port_lanes == 8)
11062306a36Sopenharmony_ci		lanes = 10;
11162306a36Sopenharmony_ci
11262306a36Sopenharmony_ci	return nfp_devlink_set_lanes(pf, eth_port.index, lanes);
11362306a36Sopenharmony_ci}
11462306a36Sopenharmony_ci
11562306a36Sopenharmony_cistatic int
11662306a36Sopenharmony_cinfp_devlink_sb_pool_get(struct devlink *devlink, unsigned int sb_index,
11762306a36Sopenharmony_ci			u16 pool_index, struct devlink_sb_pool_info *pool_info)
11862306a36Sopenharmony_ci{
11962306a36Sopenharmony_ci	struct nfp_pf *pf = devlink_priv(devlink);
12062306a36Sopenharmony_ci
12162306a36Sopenharmony_ci	return nfp_shared_buf_pool_get(pf, sb_index, pool_index, pool_info);
12262306a36Sopenharmony_ci}
12362306a36Sopenharmony_ci
12462306a36Sopenharmony_cistatic int
12562306a36Sopenharmony_cinfp_devlink_sb_pool_set(struct devlink *devlink, unsigned int sb_index,
12662306a36Sopenharmony_ci			u16 pool_index,
12762306a36Sopenharmony_ci			u32 size, enum devlink_sb_threshold_type threshold_type,
12862306a36Sopenharmony_ci			struct netlink_ext_ack *extack)
12962306a36Sopenharmony_ci{
13062306a36Sopenharmony_ci	struct nfp_pf *pf = devlink_priv(devlink);
13162306a36Sopenharmony_ci
13262306a36Sopenharmony_ci	return nfp_shared_buf_pool_set(pf, sb_index, pool_index,
13362306a36Sopenharmony_ci				       size, threshold_type);
13462306a36Sopenharmony_ci}
13562306a36Sopenharmony_ci
13662306a36Sopenharmony_cistatic int nfp_devlink_eswitch_mode_get(struct devlink *devlink, u16 *mode)
13762306a36Sopenharmony_ci{
13862306a36Sopenharmony_ci	struct nfp_pf *pf = devlink_priv(devlink);
13962306a36Sopenharmony_ci
14062306a36Sopenharmony_ci	return nfp_app_eswitch_mode_get(pf->app, mode);
14162306a36Sopenharmony_ci}
14262306a36Sopenharmony_ci
14362306a36Sopenharmony_cistatic int nfp_devlink_eswitch_mode_set(struct devlink *devlink, u16 mode,
14462306a36Sopenharmony_ci					struct netlink_ext_ack *extack)
14562306a36Sopenharmony_ci{
14662306a36Sopenharmony_ci	struct nfp_pf *pf = devlink_priv(devlink);
14762306a36Sopenharmony_ci
14862306a36Sopenharmony_ci	return nfp_app_eswitch_mode_set(pf->app, mode);
14962306a36Sopenharmony_ci}
15062306a36Sopenharmony_ci
15162306a36Sopenharmony_cistatic const struct nfp_devlink_versions_simple {
15262306a36Sopenharmony_ci	const char *key;
15362306a36Sopenharmony_ci	const char *hwinfo;
15462306a36Sopenharmony_ci} nfp_devlink_versions_hwinfo[] = {
15562306a36Sopenharmony_ci	{ DEVLINK_INFO_VERSION_GENERIC_BOARD_ID,	"assembly.partno", },
15662306a36Sopenharmony_ci	{ DEVLINK_INFO_VERSION_GENERIC_BOARD_REV,	"assembly.revision", },
15762306a36Sopenharmony_ci	{ DEVLINK_INFO_VERSION_GENERIC_BOARD_MANUFACTURE, "assembly.vendor", },
15862306a36Sopenharmony_ci	{ "board.model", /* code name */		"assembly.model", },
15962306a36Sopenharmony_ci};
16062306a36Sopenharmony_ci
16162306a36Sopenharmony_cistatic int
16262306a36Sopenharmony_cinfp_devlink_versions_get_hwinfo(struct nfp_pf *pf, struct devlink_info_req *req)
16362306a36Sopenharmony_ci{
16462306a36Sopenharmony_ci	unsigned int i;
16562306a36Sopenharmony_ci	int err;
16662306a36Sopenharmony_ci
16762306a36Sopenharmony_ci	for (i = 0; i < ARRAY_SIZE(nfp_devlink_versions_hwinfo); i++) {
16862306a36Sopenharmony_ci		const struct nfp_devlink_versions_simple *info;
16962306a36Sopenharmony_ci		const char *val;
17062306a36Sopenharmony_ci
17162306a36Sopenharmony_ci		info = &nfp_devlink_versions_hwinfo[i];
17262306a36Sopenharmony_ci
17362306a36Sopenharmony_ci		val = nfp_hwinfo_lookup(pf->hwinfo, info->hwinfo);
17462306a36Sopenharmony_ci		if (!val)
17562306a36Sopenharmony_ci			continue;
17662306a36Sopenharmony_ci
17762306a36Sopenharmony_ci		err = devlink_info_version_fixed_put(req, info->key, val);
17862306a36Sopenharmony_ci		if (err)
17962306a36Sopenharmony_ci			return err;
18062306a36Sopenharmony_ci	}
18162306a36Sopenharmony_ci
18262306a36Sopenharmony_ci	return 0;
18362306a36Sopenharmony_ci}
18462306a36Sopenharmony_ci
18562306a36Sopenharmony_cistatic const struct nfp_devlink_versions {
18662306a36Sopenharmony_ci	enum nfp_nsp_versions id;
18762306a36Sopenharmony_ci	const char *key;
18862306a36Sopenharmony_ci} nfp_devlink_versions_nsp[] = {
18962306a36Sopenharmony_ci	{ NFP_VERSIONS_BUNDLE,	DEVLINK_INFO_VERSION_GENERIC_FW_BUNDLE_ID, },
19062306a36Sopenharmony_ci	{ NFP_VERSIONS_BSP,	DEVLINK_INFO_VERSION_GENERIC_FW_MGMT, },
19162306a36Sopenharmony_ci	{ NFP_VERSIONS_CPLD,	"fw.cpld", },
19262306a36Sopenharmony_ci	{ NFP_VERSIONS_APP,	DEVLINK_INFO_VERSION_GENERIC_FW_APP, },
19362306a36Sopenharmony_ci	{ NFP_VERSIONS_UNDI,	DEVLINK_INFO_VERSION_GENERIC_FW_UNDI, },
19462306a36Sopenharmony_ci	{ NFP_VERSIONS_NCSI,	DEVLINK_INFO_VERSION_GENERIC_FW_NCSI, },
19562306a36Sopenharmony_ci	{ NFP_VERSIONS_CFGR,	"chip.init", },
19662306a36Sopenharmony_ci};
19762306a36Sopenharmony_ci
19862306a36Sopenharmony_cistatic int
19962306a36Sopenharmony_cinfp_devlink_versions_get_nsp(struct devlink_info_req *req, bool flash,
20062306a36Sopenharmony_ci			     const u8 *buf, unsigned int size)
20162306a36Sopenharmony_ci{
20262306a36Sopenharmony_ci	unsigned int i;
20362306a36Sopenharmony_ci	int err;
20462306a36Sopenharmony_ci
20562306a36Sopenharmony_ci	for (i = 0; i < ARRAY_SIZE(nfp_devlink_versions_nsp); i++) {
20662306a36Sopenharmony_ci		const struct nfp_devlink_versions *info;
20762306a36Sopenharmony_ci		const char *version;
20862306a36Sopenharmony_ci
20962306a36Sopenharmony_ci		info = &nfp_devlink_versions_nsp[i];
21062306a36Sopenharmony_ci
21162306a36Sopenharmony_ci		version = nfp_nsp_versions_get(info->id, flash, buf, size);
21262306a36Sopenharmony_ci		if (IS_ERR(version)) {
21362306a36Sopenharmony_ci			if (PTR_ERR(version) == -ENOENT)
21462306a36Sopenharmony_ci				continue;
21562306a36Sopenharmony_ci			else
21662306a36Sopenharmony_ci				return PTR_ERR(version);
21762306a36Sopenharmony_ci		}
21862306a36Sopenharmony_ci
21962306a36Sopenharmony_ci		if (flash)
22062306a36Sopenharmony_ci			err = devlink_info_version_stored_put(req, info->key,
22162306a36Sopenharmony_ci							      version);
22262306a36Sopenharmony_ci		else
22362306a36Sopenharmony_ci			err = devlink_info_version_running_put(req, info->key,
22462306a36Sopenharmony_ci							       version);
22562306a36Sopenharmony_ci		if (err)
22662306a36Sopenharmony_ci			return err;
22762306a36Sopenharmony_ci	}
22862306a36Sopenharmony_ci
22962306a36Sopenharmony_ci	return 0;
23062306a36Sopenharmony_ci}
23162306a36Sopenharmony_ci
23262306a36Sopenharmony_cistatic int
23362306a36Sopenharmony_cinfp_devlink_info_get(struct devlink *devlink, struct devlink_info_req *req,
23462306a36Sopenharmony_ci		     struct netlink_ext_ack *extack)
23562306a36Sopenharmony_ci{
23662306a36Sopenharmony_ci	struct nfp_pf *pf = devlink_priv(devlink);
23762306a36Sopenharmony_ci	const char *sn, *vendor, *part;
23862306a36Sopenharmony_ci	struct nfp_nsp *nsp;
23962306a36Sopenharmony_ci	char *buf = NULL;
24062306a36Sopenharmony_ci	int err;
24162306a36Sopenharmony_ci
24262306a36Sopenharmony_ci	vendor = nfp_hwinfo_lookup(pf->hwinfo, "assembly.vendor");
24362306a36Sopenharmony_ci	part = nfp_hwinfo_lookup(pf->hwinfo, "assembly.partno");
24462306a36Sopenharmony_ci	sn = nfp_hwinfo_lookup(pf->hwinfo, "assembly.serial");
24562306a36Sopenharmony_ci	if (vendor && part && sn) {
24662306a36Sopenharmony_ci		char *buf;
24762306a36Sopenharmony_ci
24862306a36Sopenharmony_ci		buf = kmalloc(strlen(vendor) + strlen(part) + strlen(sn) + 1,
24962306a36Sopenharmony_ci			      GFP_KERNEL);
25062306a36Sopenharmony_ci		if (!buf)
25162306a36Sopenharmony_ci			return -ENOMEM;
25262306a36Sopenharmony_ci
25362306a36Sopenharmony_ci		buf[0] = '\0';
25462306a36Sopenharmony_ci		strcat(buf, vendor);
25562306a36Sopenharmony_ci		strcat(buf, part);
25662306a36Sopenharmony_ci		strcat(buf, sn);
25762306a36Sopenharmony_ci
25862306a36Sopenharmony_ci		err = devlink_info_serial_number_put(req, buf);
25962306a36Sopenharmony_ci		kfree(buf);
26062306a36Sopenharmony_ci		if (err)
26162306a36Sopenharmony_ci			return err;
26262306a36Sopenharmony_ci	}
26362306a36Sopenharmony_ci
26462306a36Sopenharmony_ci	nsp = nfp_nsp_open(pf->cpp);
26562306a36Sopenharmony_ci	if (IS_ERR(nsp)) {
26662306a36Sopenharmony_ci		NL_SET_ERR_MSG_MOD(extack, "can't access NSP");
26762306a36Sopenharmony_ci		return PTR_ERR(nsp);
26862306a36Sopenharmony_ci	}
26962306a36Sopenharmony_ci
27062306a36Sopenharmony_ci	if (nfp_nsp_has_versions(nsp)) {
27162306a36Sopenharmony_ci		buf = kzalloc(NFP_NSP_VERSION_BUFSZ, GFP_KERNEL);
27262306a36Sopenharmony_ci		if (!buf) {
27362306a36Sopenharmony_ci			err = -ENOMEM;
27462306a36Sopenharmony_ci			goto err_close_nsp;
27562306a36Sopenharmony_ci		}
27662306a36Sopenharmony_ci
27762306a36Sopenharmony_ci		err = nfp_nsp_versions(nsp, buf, NFP_NSP_VERSION_BUFSZ);
27862306a36Sopenharmony_ci		if (err)
27962306a36Sopenharmony_ci			goto err_free_buf;
28062306a36Sopenharmony_ci
28162306a36Sopenharmony_ci		err = nfp_devlink_versions_get_nsp(req, false,
28262306a36Sopenharmony_ci						   buf, NFP_NSP_VERSION_BUFSZ);
28362306a36Sopenharmony_ci		if (err)
28462306a36Sopenharmony_ci			goto err_free_buf;
28562306a36Sopenharmony_ci
28662306a36Sopenharmony_ci		err = nfp_devlink_versions_get_nsp(req, true,
28762306a36Sopenharmony_ci						   buf, NFP_NSP_VERSION_BUFSZ);
28862306a36Sopenharmony_ci		if (err)
28962306a36Sopenharmony_ci			goto err_free_buf;
29062306a36Sopenharmony_ci
29162306a36Sopenharmony_ci		kfree(buf);
29262306a36Sopenharmony_ci	}
29362306a36Sopenharmony_ci
29462306a36Sopenharmony_ci	nfp_nsp_close(nsp);
29562306a36Sopenharmony_ci
29662306a36Sopenharmony_ci	return nfp_devlink_versions_get_hwinfo(pf, req);
29762306a36Sopenharmony_ci
29862306a36Sopenharmony_cierr_free_buf:
29962306a36Sopenharmony_ci	kfree(buf);
30062306a36Sopenharmony_cierr_close_nsp:
30162306a36Sopenharmony_ci	nfp_nsp_close(nsp);
30262306a36Sopenharmony_ci	return err;
30362306a36Sopenharmony_ci}
30462306a36Sopenharmony_ci
30562306a36Sopenharmony_cistatic int
30662306a36Sopenharmony_cinfp_devlink_flash_update(struct devlink *devlink,
30762306a36Sopenharmony_ci			 struct devlink_flash_update_params *params,
30862306a36Sopenharmony_ci			 struct netlink_ext_ack *extack)
30962306a36Sopenharmony_ci{
31062306a36Sopenharmony_ci	return nfp_flash_update_common(devlink_priv(devlink), params->fw, extack);
31162306a36Sopenharmony_ci}
31262306a36Sopenharmony_ci
31362306a36Sopenharmony_ciconst struct devlink_ops nfp_devlink_ops = {
31462306a36Sopenharmony_ci	.sb_pool_get		= nfp_devlink_sb_pool_get,
31562306a36Sopenharmony_ci	.sb_pool_set		= nfp_devlink_sb_pool_set,
31662306a36Sopenharmony_ci	.eswitch_mode_get	= nfp_devlink_eswitch_mode_get,
31762306a36Sopenharmony_ci	.eswitch_mode_set	= nfp_devlink_eswitch_mode_set,
31862306a36Sopenharmony_ci	.info_get		= nfp_devlink_info_get,
31962306a36Sopenharmony_ci	.flash_update		= nfp_devlink_flash_update,
32062306a36Sopenharmony_ci};
32162306a36Sopenharmony_ci
32262306a36Sopenharmony_cistatic const struct devlink_port_ops nfp_devlink_port_ops = {
32362306a36Sopenharmony_ci	.port_split		= nfp_devlink_port_split,
32462306a36Sopenharmony_ci	.port_unsplit		= nfp_devlink_port_unsplit,
32562306a36Sopenharmony_ci};
32662306a36Sopenharmony_ci
32762306a36Sopenharmony_ciint nfp_devlink_port_register(struct nfp_app *app, struct nfp_port *port)
32862306a36Sopenharmony_ci{
32962306a36Sopenharmony_ci	struct devlink_port_attrs attrs = {};
33062306a36Sopenharmony_ci	struct nfp_eth_table_port eth_port;
33162306a36Sopenharmony_ci	struct devlink *devlink;
33262306a36Sopenharmony_ci	const u8 *serial;
33362306a36Sopenharmony_ci	int serial_len;
33462306a36Sopenharmony_ci	int ret;
33562306a36Sopenharmony_ci
33662306a36Sopenharmony_ci	SET_NETDEV_DEVLINK_PORT(port->netdev, &port->dl_port);
33762306a36Sopenharmony_ci
33862306a36Sopenharmony_ci	rtnl_lock();
33962306a36Sopenharmony_ci	ret = nfp_devlink_fill_eth_port(port, &eth_port);
34062306a36Sopenharmony_ci	rtnl_unlock();
34162306a36Sopenharmony_ci	if (ret)
34262306a36Sopenharmony_ci		return ret;
34362306a36Sopenharmony_ci
34462306a36Sopenharmony_ci	attrs.split = eth_port.is_split;
34562306a36Sopenharmony_ci	attrs.splittable = eth_port.port_lanes > 1 && !attrs.split;
34662306a36Sopenharmony_ci	attrs.lanes = eth_port.port_lanes;
34762306a36Sopenharmony_ci	attrs.flavour = DEVLINK_PORT_FLAVOUR_PHYSICAL;
34862306a36Sopenharmony_ci	attrs.phys.port_number = eth_port.label_port;
34962306a36Sopenharmony_ci	attrs.phys.split_subport_number = eth_port.label_subport;
35062306a36Sopenharmony_ci	serial_len = nfp_cpp_serial(port->app->cpp, &serial);
35162306a36Sopenharmony_ci	memcpy(attrs.switch_id.id, serial, serial_len);
35262306a36Sopenharmony_ci	attrs.switch_id.id_len = serial_len;
35362306a36Sopenharmony_ci	devlink_port_attrs_set(&port->dl_port, &attrs);
35462306a36Sopenharmony_ci
35562306a36Sopenharmony_ci	devlink = priv_to_devlink(app->pf);
35662306a36Sopenharmony_ci
35762306a36Sopenharmony_ci	return devl_port_register_with_ops(devlink, &port->dl_port,
35862306a36Sopenharmony_ci					   port->eth_id, &nfp_devlink_port_ops);
35962306a36Sopenharmony_ci}
36062306a36Sopenharmony_ci
36162306a36Sopenharmony_civoid nfp_devlink_port_unregister(struct nfp_port *port)
36262306a36Sopenharmony_ci{
36362306a36Sopenharmony_ci	devl_port_unregister(&port->dl_port);
36462306a36Sopenharmony_ci}
365