drivers/net/ethernet/netronome/nfp/nfp_devlink.c
Source file repositories/reference/linux-study-clean/drivers/net/ethernet/netronome/nfp/nfp_devlink.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/net/ethernet/netronome/nfp/nfp_devlink.c- Extension
.c- Size
- 9152 bytes
- Lines
- 370
- Domain
- Driver Families
- Bucket
- drivers/net
- Inferred role
- Driver Families: implementation source
- Status
- source implementation candidate
Why This File Exists
Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Allocates kernel memory; connect allocation flags and lifetime to context constraints.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/rtnetlink.hnet/devlink.hnfpcore/nfp.hnfpcore/nfp_nsp.hnfp_app.hnfp_main.hnfp_port.h
Detected Declarations
function nfp_devlink_fill_eth_portfunction nfp_devlink_fill_eth_port_from_idfunction nfp_devlink_set_lanesfunction nfp_devlink_port_splitfunction nfp_devlink_port_unsplitfunction nfp_devlink_sb_pool_getfunction nfp_devlink_sb_pool_setfunction nfp_devlink_eswitch_mode_getfunction nfp_devlink_eswitch_mode_setfunction nfp_devlink_versions_get_hwinfofunction nfp_devlink_versions_get_nspfunction nfp_devlink_info_getfunction nfp_devlink_flash_updatefunction nfp_devlink_port_registerfunction nfp_devlink_port_unregister
Annotated Snippet
if (IS_ERR(version)) {
if (PTR_ERR(version) == -ENOENT)
continue;
else
return PTR_ERR(version);
}
if (flash)
err = devlink_info_version_stored_put(req, info->key,
version);
else
err = devlink_info_version_running_put(req, info->key,
version);
if (err)
return err;
}
return 0;
}
static int
nfp_devlink_info_get(struct devlink *devlink, struct devlink_info_req *req,
struct netlink_ext_ack *extack)
{
struct nfp_pf *pf = devlink_priv(devlink);
const char *sn, *vendor, *part;
struct nfp_nsp *nsp;
char *buf = NULL;
int err;
vendor = nfp_hwinfo_lookup(pf->hwinfo, "assembly.vendor");
part = nfp_hwinfo_lookup(pf->hwinfo, "assembly.partno");
sn = nfp_hwinfo_lookup(pf->hwinfo, "assembly.serial");
if (vendor && part && sn) {
char *buf;
buf = kmalloc(strlen(vendor) + strlen(part) + strlen(sn) + 1,
GFP_KERNEL);
if (!buf)
return -ENOMEM;
buf[0] = '\0';
strcat(buf, vendor);
strcat(buf, part);
strcat(buf, sn);
err = devlink_info_serial_number_put(req, buf);
kfree(buf);
if (err)
return err;
}
nsp = nfp_nsp_open(pf->cpp);
if (IS_ERR(nsp)) {
NL_SET_ERR_MSG_MOD(extack, "can't access NSP");
return PTR_ERR(nsp);
}
if (nfp_nsp_has_versions(nsp)) {
buf = kzalloc(NFP_NSP_VERSION_BUFSZ, GFP_KERNEL);
if (!buf) {
err = -ENOMEM;
goto err_close_nsp;
}
err = nfp_nsp_versions(nsp, buf, NFP_NSP_VERSION_BUFSZ);
if (err)
goto err_free_buf;
err = nfp_devlink_versions_get_nsp(req, false,
buf, NFP_NSP_VERSION_BUFSZ);
if (err)
goto err_free_buf;
err = nfp_devlink_versions_get_nsp(req, true,
buf, NFP_NSP_VERSION_BUFSZ);
if (err)
goto err_free_buf;
kfree(buf);
}
nfp_nsp_close(nsp);
return nfp_devlink_versions_get_hwinfo(pf, req);
err_free_buf:
kfree(buf);
err_close_nsp:
nfp_nsp_close(nsp);
Annotation
- Immediate include surface: `linux/rtnetlink.h`, `net/devlink.h`, `nfpcore/nfp.h`, `nfpcore/nfp_nsp.h`, `nfp_app.h`, `nfp_main.h`, `nfp_port.h`.
- Detected declarations: `function nfp_devlink_fill_eth_port`, `function nfp_devlink_fill_eth_port_from_id`, `function nfp_devlink_set_lanes`, `function nfp_devlink_port_split`, `function nfp_devlink_port_unsplit`, `function nfp_devlink_sb_pool_get`, `function nfp_devlink_sb_pool_set`, `function nfp_devlink_eswitch_mode_get`, `function nfp_devlink_eswitch_mode_set`, `function nfp_devlink_versions_get_hwinfo`.
- Atlas domain: Driver Families / drivers/net.
- Implementation status: source implementation candidate.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.