net/nfc/nci/core.c
Source file repositories/reference/linux-study-clean/net/nfc/nci/core.c
File Facts
- System
- Linux kernel
- Corpus path
net/nfc/nci/core.c- Extension
.c- Size
- 40179 bytes
- Lines
- 1643
- Domain
- Networking Core
- Bucket
- Sockets, Protocols, Packet Path, And Network Policy
- Inferred role
- Networking Core: exported/initcall integration point
- Status
- integration implementation candidate
Why This File Exists
Networking stack implementation surface: socket APIs, protocol dispatch, packet flow, routing, filtering, and network namespaces.
- Networking stack implementation surface: socket APIs, protocol dispatch, packet flow, routing, filtering, and network namespaces.
- Exports symbols or registers init work; inspect boot/module ordering and who consumes the exported contract.
- Uses kernel synchronization; read lock ordering, sleepability, and interrupt context assumptions before translating.
- 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/module.hlinux/kernel.hlinux/types.hlinux/workqueue.hlinux/completion.hlinux/export.hlinux/sched.hlinux/bitops.hlinux/skbuff.hlinux/kcov.h../nfc.hnet/nfc/nci.hnet/nfc/nci_core.hlinux/nfc.h
Detected Declarations
struct core_conn_create_datastruct nci_set_config_paramstruct nci_rf_discover_paramstruct nci_rf_discover_select_paramstruct nci_cmd_paramstruct nci_loopback_datafunction list_for_each_entryfunction nci_get_conn_info_by_dest_type_paramsfunction list_for_each_entryfunction nci_req_completefunction nci_req_cancelfunction __nci_requestfunction nci_requestfunction nci_reset_reqfunction nci_init_reqfunction nci_init_complete_reqfunction nci_set_config_reqfunction nci_rf_discover_reqfunction nci_rf_discover_select_reqfunction nci_rf_deactivate_reqfunction nci_generic_reqfunction nci_prop_cmdfunction nci_core_cmdfunction nci_core_resetfunction nci_core_initfunction nci_send_data_reqfunction nci_nfcc_loopback_cbfunction nci_nfcc_loopbackfunction nci_open_devicefunction nci_close_devicefunction nci_cmd_timerfunction nci_data_timerfunction nci_dev_upfunction nci_dev_downfunction nci_set_configfunction nci_nfcee_discover_reqfunction nci_nfcee_discoverfunction nci_nfcee_mode_set_reqfunction nci_nfcee_mode_setfunction nci_core_conn_create_reqfunction nci_core_conn_createfunction nci_core_conn_close_reqfunction nci_core_conn_closefunction nci_set_target_atsfunction nci_set_local_general_bytesfunction nci_set_listen_parametersfunction nci_start_pollfunction nci_stop_poll
Annotated Snippet
struct core_conn_create_data {
int length;
struct nci_core_conn_create_cmd *cmd;
};
static void nci_cmd_work(struct work_struct *work);
static void nci_rx_work(struct work_struct *work);
static void nci_tx_work(struct work_struct *work);
struct nci_conn_info *nci_get_conn_info_by_conn_id(struct nci_dev *ndev,
int conn_id)
{
struct nci_conn_info *conn_info;
list_for_each_entry(conn_info, &ndev->conn_info_list, list) {
if (conn_info->conn_id == conn_id)
return conn_info;
}
return NULL;
}
int nci_get_conn_info_by_dest_type_params(struct nci_dev *ndev, u8 dest_type,
const struct dest_spec_params *params)
{
const struct nci_conn_info *conn_info;
list_for_each_entry(conn_info, &ndev->conn_info_list, list) {
if (conn_info->dest_type == dest_type) {
if (!params)
return conn_info->conn_id;
if (params->id == conn_info->dest_params->id &&
params->protocol == conn_info->dest_params->protocol)
return conn_info->conn_id;
}
}
return -EINVAL;
}
EXPORT_SYMBOL(nci_get_conn_info_by_dest_type_params);
/* ---- NCI requests ---- */
void nci_req_complete(struct nci_dev *ndev, int result)
{
if (ndev->req_status == NCI_REQ_PEND) {
ndev->req_result = result;
ndev->req_status = NCI_REQ_DONE;
complete(&ndev->req_completion);
}
}
EXPORT_SYMBOL(nci_req_complete);
static void nci_req_cancel(struct nci_dev *ndev, int err)
{
if (ndev->req_status == NCI_REQ_PEND) {
ndev->req_result = err;
ndev->req_status = NCI_REQ_CANCELED;
complete(&ndev->req_completion);
}
}
/* Execute request and wait for completion. */
static int __nci_request(struct nci_dev *ndev,
void (*req)(struct nci_dev *ndev, const void *opt),
const void *opt, __u32 timeout)
{
int rc = 0;
long completion_rc;
ndev->req_status = NCI_REQ_PEND;
reinit_completion(&ndev->req_completion);
req(ndev, opt);
completion_rc =
wait_for_completion_interruptible_timeout(&ndev->req_completion,
timeout);
pr_debug("wait_for_completion return %ld\n", completion_rc);
if (completion_rc > 0) {
switch (ndev->req_status) {
case NCI_REQ_DONE:
rc = nci_to_errno(ndev->req_result);
break;
case NCI_REQ_CANCELED:
rc = -ndev->req_result;
break;
Annotation
- Immediate include surface: `linux/module.h`, `linux/kernel.h`, `linux/types.h`, `linux/workqueue.h`, `linux/completion.h`, `linux/export.h`, `linux/sched.h`, `linux/bitops.h`.
- Detected declarations: `struct core_conn_create_data`, `struct nci_set_config_param`, `struct nci_rf_discover_param`, `struct nci_rf_discover_select_param`, `struct nci_cmd_param`, `struct nci_loopback_data`, `function list_for_each_entry`, `function nci_get_conn_info_by_dest_type_params`, `function list_for_each_entry`, `function nci_req_complete`.
- Atlas domain: Networking Core / Sockets, Protocols, Packet Path, And Network Policy.
- Implementation status: integration implementation candidate.
- Synchronization appears in or near this file; preserve lock ordering, sleepability, and interrupt-context constraints.
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.