Blame view
net/qrtr/smd.c
2.66 KB
bdabad3e3 net: Add Qualcomm... |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
/* * Copyright (c) 2015, Sony Mobile Communications Inc. * Copyright (c) 2013, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and * only version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. */ #include <linux/module.h> #include <linux/skbuff.h> |
5052de8de soc: qcom: smd: T... |
17 |
#include <linux/rpmsg.h> |
bdabad3e3 net: Add Qualcomm... |
18 19 20 21 22 |
#include "qrtr.h" struct qrtr_smd_dev { struct qrtr_endpoint ep; |
5052de8de soc: qcom: smd: T... |
23 |
struct rpmsg_endpoint *channel; |
f79a917e6 Merge tag 'qcom-s... |
24 |
struct device *dev; |
bdabad3e3 net: Add Qualcomm... |
25 26 27 |
}; /* from smd to qrtr */ |
5052de8de soc: qcom: smd: T... |
28 29 |
static int qcom_smd_qrtr_callback(struct rpmsg_device *rpdev, void *data, int len, void *priv, u32 addr) |
bdabad3e3 net: Add Qualcomm... |
30 |
{ |
5052de8de soc: qcom: smd: T... |
31 |
struct qrtr_smd_dev *qdev = dev_get_drvdata(&rpdev->dev); |
bdabad3e3 net: Add Qualcomm... |
32 33 34 35 36 37 38 |
int rc; if (!qdev) return -EAGAIN; rc = qrtr_endpoint_post(&qdev->ep, data, len); if (rc == -EINVAL) { |
f79a917e6 Merge tag 'qcom-s... |
39 40 |
dev_err(qdev->dev, "invalid ipcrouter packet "); |
bdabad3e3 net: Add Qualcomm... |
41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
/* 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; |
5052de8de soc: qcom: smd: T... |
57 |
rc = rpmsg_send(qdev->channel, skb->data, skb->len); |
bdabad3e3 net: Add Qualcomm... |
58 59 60 61 62 63 64 65 |
out: if (rc) kfree_skb(skb); else consume_skb(skb); return rc; } |
5052de8de soc: qcom: smd: T... |
66 |
static int qcom_smd_qrtr_probe(struct rpmsg_device *rpdev) |
bdabad3e3 net: Add Qualcomm... |
67 68 69 |
{ struct qrtr_smd_dev *qdev; int rc; |
5052de8de soc: qcom: smd: T... |
70 |
qdev = devm_kzalloc(&rpdev->dev, sizeof(*qdev), GFP_KERNEL); |
bdabad3e3 net: Add Qualcomm... |
71 72 |
if (!qdev) return -ENOMEM; |
5052de8de soc: qcom: smd: T... |
73 74 |
qdev->channel = rpdev->ept; qdev->dev = &rpdev->dev; |
bdabad3e3 net: Add Qualcomm... |
75 76 77 78 79 |
qdev->ep.xmit = qcom_smd_qrtr_send; rc = qrtr_endpoint_register(&qdev->ep, QRTR_EP_NID_AUTO); if (rc) return rc; |
5052de8de soc: qcom: smd: T... |
80 |
dev_set_drvdata(&rpdev->dev, qdev); |
bdabad3e3 net: Add Qualcomm... |
81 |
|
5052de8de soc: qcom: smd: T... |
82 83 |
dev_dbg(&rpdev->dev, "Qualcomm SMD QRTR driver probed "); |
bdabad3e3 net: Add Qualcomm... |
84 85 86 |
return 0; } |
5052de8de soc: qcom: smd: T... |
87 |
static void qcom_smd_qrtr_remove(struct rpmsg_device *rpdev) |
bdabad3e3 net: Add Qualcomm... |
88 |
{ |
5052de8de soc: qcom: smd: T... |
89 |
struct qrtr_smd_dev *qdev = dev_get_drvdata(&rpdev->dev); |
bdabad3e3 net: Add Qualcomm... |
90 91 |
qrtr_endpoint_unregister(&qdev->ep); |
5052de8de soc: qcom: smd: T... |
92 |
dev_set_drvdata(&rpdev->dev, NULL); |
bdabad3e3 net: Add Qualcomm... |
93 |
} |
5052de8de soc: qcom: smd: T... |
94 |
static const struct rpmsg_device_id qcom_smd_qrtr_smd_match[] = { |
bdabad3e3 net: Add Qualcomm... |
95 96 97 |
{ "IPCRTR" }, {} }; |
5052de8de soc: qcom: smd: T... |
98 |
static struct rpmsg_driver qcom_smd_qrtr_driver = { |
bdabad3e3 net: Add Qualcomm... |
99 100 101 |
.probe = qcom_smd_qrtr_probe, .remove = qcom_smd_qrtr_remove, .callback = qcom_smd_qrtr_callback, |
5052de8de soc: qcom: smd: T... |
102 103 |
.id_table = qcom_smd_qrtr_smd_match, .drv = { |
bdabad3e3 net: Add Qualcomm... |
104 |
.name = "qcom_smd_qrtr", |
bdabad3e3 net: Add Qualcomm... |
105 106 |
}, }; |
5052de8de soc: qcom: smd: T... |
107 |
module_rpmsg_driver(qcom_smd_qrtr_driver); |
bdabad3e3 net: Add Qualcomm... |
108 109 110 |
MODULE_DESCRIPTION("Qualcomm IPC-Router SMD interface driver"); MODULE_LICENSE("GPL v2"); |