net/qrtr/smd.c
Source file repositories/reference/linux-study-clean/net/qrtr/smd.c
File Facts
- System
- Linux kernel
- Corpus path
net/qrtr/smd.c- Extension
.c- Size
- 2335 bytes
- Lines
- 112
- Domain
- Networking Core
- Bucket
- Sockets, Protocols, Packet Path, And Network Policy
- Inferred role
- Networking Core: implementation source
- Status
- source 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.
- 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/skbuff.hlinux/rpmsg.hqrtr.h
Detected Declarations
struct qrtr_smd_devfunction qcom_smd_qrtr_callbackfunction qcom_smd_qrtr_sendfunction qcom_smd_qrtr_probefunction qcom_smd_qrtr_remove
Annotated Snippet
struct qrtr_smd_dev {
struct qrtr_endpoint ep;
struct rpmsg_endpoint *channel;
struct device *dev;
};
/* from smd to qrtr */
static int qcom_smd_qrtr_callback(struct rpmsg_device *rpdev,
void *data, int len, void *priv, u32 addr)
{
struct qrtr_smd_dev *qdev = dev_get_drvdata(&rpdev->dev);
int rc;
if (!qdev)
return -EAGAIN;
rc = qrtr_endpoint_post(&qdev->ep, data, len);
if (rc == -EINVAL) {
dev_err(qdev->dev, "invalid ipcrouter packet\n");
/* return 0 to let smd drop the packet */
rc = 0;
}
return rc;
}
/* from qrtr to smd */
static int qcom_smd_qrtr_send(struct qrtr_endpoint *ep, struct sk_buff *skb)
{
struct qrtr_smd_dev *qdev = container_of(ep, struct qrtr_smd_dev, ep);
int rc;
rc = skb_linearize(skb);
if (rc)
goto out;
rc = rpmsg_send(qdev->channel, skb->data, skb->len);
out:
if (rc)
kfree_skb(skb);
else
consume_skb(skb);
return rc;
}
static int qcom_smd_qrtr_probe(struct rpmsg_device *rpdev)
{
struct qrtr_smd_dev *qdev;
int rc;
qdev = devm_kzalloc(&rpdev->dev, sizeof(*qdev), GFP_KERNEL);
if (!qdev)
return -ENOMEM;
qdev->channel = rpdev->ept;
qdev->dev = &rpdev->dev;
qdev->ep.xmit = qcom_smd_qrtr_send;
rc = qrtr_endpoint_register(&qdev->ep, QRTR_EP_NID_AUTO);
if (rc)
return rc;
dev_set_drvdata(&rpdev->dev, qdev);
dev_dbg(&rpdev->dev, "Qualcomm SMD QRTR driver probed\n");
return 0;
}
static void qcom_smd_qrtr_remove(struct rpmsg_device *rpdev)
{
struct qrtr_smd_dev *qdev = dev_get_drvdata(&rpdev->dev);
qrtr_endpoint_unregister(&qdev->ep);
dev_set_drvdata(&rpdev->dev, NULL);
}
static const struct rpmsg_device_id qcom_smd_qrtr_smd_match[] = {
{ "IPCRTR" },
{}
};
static struct rpmsg_driver qcom_smd_qrtr_driver = {
.probe = qcom_smd_qrtr_probe,
.remove = qcom_smd_qrtr_remove,
.callback = qcom_smd_qrtr_callback,
.id_table = qcom_smd_qrtr_smd_match,
.drv = {
Annotation
- Immediate include surface: `linux/module.h`, `linux/skbuff.h`, `linux/rpmsg.h`, `qrtr.h`.
- Detected declarations: `struct qrtr_smd_dev`, `function qcom_smd_qrtr_callback`, `function qcom_smd_qrtr_send`, `function qcom_smd_qrtr_probe`, `function qcom_smd_qrtr_remove`.
- Atlas domain: Networking Core / Sockets, Protocols, Packet Path, And Network Policy.
- 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.