aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAníbal Limón <anibal.limon@linaro.org>2021-10-21 09:01:53 -0500
committerAníbal Limón <anibal.limon@linaro.org>2021-10-21 09:01:53 -0500
commit354e9958d8ac76d8ea9d8b058edc8c568708c002 (patch)
treef57d340bd77ea2accae0fc7a2752a2fa8f783f2e
parenta5584c6b20b76589bfe4076aa60089b3e3d1f8f7 (diff)
Revert "[WIP] net: qrtr: Add support for MHI endpoint"
This reverts commit 4a03b09711adf6415bdce850ed624e12c717d099.
-rw-r--r--net/qrtr/Kconfig7
-rw-r--r--net/qrtr/Makefile2
-rw-r--r--net/qrtr/mhi-ep.c145
-rw-r--r--net/qrtr/ns.c4
-rw-r--r--net/qrtr/qrtr.c70
5 files changed, 6 insertions, 222 deletions
diff --git a/net/qrtr/Kconfig b/net/qrtr/Kconfig
index 7d843e5dd88a..b4020b84760f 100644
--- a/net/qrtr/Kconfig
+++ b/net/qrtr/Kconfig
@@ -35,11 +35,4 @@ config QRTR_MHI
Say Y here to support MHI based ipcrouter channels. MHI is the
transport used for communicating to external modems.
-config QRTR_MHI_EP
- tristate "MHI Endpoint IPC Router channels"
- depends on MHI_BUS_EP
- help
- Say Y here to support MHI Endpoint based ipcrouter channels. MHI is
- the transport used for communicating to external modems.
-
endif # QRTR
diff --git a/net/qrtr/Makefile b/net/qrtr/Makefile
index 49db0e1dba66..1b1411d158a7 100644
--- a/net/qrtr/Makefile
+++ b/net/qrtr/Makefile
@@ -7,5 +7,3 @@ obj-$(CONFIG_QRTR_TUN) += qrtr-tun.o
qrtr-tun-y := tun.o
obj-$(CONFIG_QRTR_MHI) += qrtr-mhi.o
qrtr-mhi-y := mhi.o
-obj-$(CONFIG_QRTR_MHI_EP) += qrtr-mhi-ep.o
-qrtr-mhi-ep-y := mhi-ep.o
diff --git a/net/qrtr/mhi-ep.c b/net/qrtr/mhi-ep.c
deleted file mode 100644
index 3837179d5025..000000000000
--- a/net/qrtr/mhi-ep.c
+++ /dev/null
@@ -1,145 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Copyright (c) 2018-2020, The Linux Foundation. All rights reserved.
- */
-
-#include <linux/mhi_ep.h>
-#include <linux/mod_devicetable.h>
-#include <linux/module.h>
-#include <linux/skbuff.h>
-#include <net/sock.h>
-
-#include "qrtr.h"
-
-struct qrtr_mhi_dev {
- struct qrtr_endpoint ep;
- struct mhi_ep_device *mhi_dev;
- struct device *dev;
- struct completion out_tre;
- struct mutex out_lock;
-};
-
-/* Callback from host to notify available buffers to queue */
-static void qcom_mhi_qrtr_dl_callback(struct mhi_ep_device *mhi_dev,
- struct mhi_result *mhi_res)
-{
- struct qrtr_mhi_dev *qdev = dev_get_drvdata(&mhi_dev->dev);
- struct sk_buff *skb = mhi_res->buf_addr;
-
- mutex_lock(&qdev->out_lock);
- complete_all(&qdev->out_tre);
- mutex_unlock(&qdev->out_lock);
-}
-
-static void qcom_mhi_qrtr_ul_callback(struct mhi_ep_device *mhi_dev,
- struct mhi_result *mhi_res)
-{
- struct qrtr_mhi_dev *qdev = dev_get_drvdata(&mhi_dev->dev);
- int rc;
-
- /* TODO */
- if (!qdev)
- return;
-
- rc = qrtr_endpoint_post(&qdev->ep, mhi_res->buf_addr,
- mhi_res->bytes_xferd);
- if (rc == -EINVAL)
- dev_err(qdev->dev, "invalid ipcrouter packet\n");
-}
-
-/* Send data over MHI */
-static int qcom_mhi_qrtr_send(struct qrtr_endpoint *ep, struct sk_buff *skb)
-{
- struct qrtr_mhi_dev *qdev = container_of(ep, struct qrtr_mhi_dev, ep);
- int rc;
-
- if (skb->sk)
- sock_hold(skb->sk);
-
- rc = skb_linearize(skb);
- if (rc)
- goto free_skb;
-
- wait_for_completion(&qdev->out_tre);
-
- rc = mhi_ep_queue_skb(qdev->mhi_dev, DMA_FROM_DEVICE, skb, skb->len,
- MHI_EOT);
- if (rc)
- goto free_skb;
-
- reinit_completion(&qdev->out_tre);
- consume_skb(skb);
-
- return rc;
-
-free_skb:
- if (skb->sk)
- sock_put(skb->sk);
- kfree_skb(skb);
-
- return rc;
-}
-
-static int qcom_mhi_qrtr_probe(struct mhi_ep_device *mhi_dev,
- const struct mhi_device_id *id)
-{
- struct qrtr_mhi_dev *qdev;
- int rc;
-
- /* start channels */
-// rc = mhi_ep_prepare_for_transfer(mhi_dev);
-// if (rc)
-// return rc;
-
- qdev = devm_kzalloc(&mhi_dev->dev, sizeof(*qdev), GFP_KERNEL);
- if (!qdev)
- return -ENOMEM;
-
- qdev->mhi_dev = mhi_dev;
- qdev->dev = &mhi_dev->dev;
- init_completion(&qdev->out_tre);
- mutex_init(&qdev->out_lock);
- qdev->ep.xmit = qcom_mhi_qrtr_send;
-
- dev_set_drvdata(&mhi_dev->dev, qdev);
- rc = qrtr_endpoint_register(&qdev->ep, QRTR_EP_NID_AUTO);
- if (rc)
- return rc;
-
- dev_dbg(qdev->dev, "Qualcomm MHI QRTR driver probed\n");
-
- return 0;
-}
-
-static void qcom_mhi_qrtr_remove(struct mhi_ep_device *mhi_dev)
-{
- struct qrtr_mhi_dev *qdev = dev_get_drvdata(&mhi_dev->dev);
-
- qrtr_endpoint_unregister(&qdev->ep);
-// mhi_unprepare_from_transfer(mhi_dev);
- dev_set_drvdata(&mhi_dev->dev, NULL);
-}
-
-static const struct mhi_device_id qcom_mhi_qrtr_id_table[] = {
- { .chan = "IPCR" },
- {}
-};
-MODULE_DEVICE_TABLE(mhi, qcom_mhi_qrtr_id_table);
-
-static struct mhi_ep_driver qcom_mhi_qrtr_driver = {
- .probe = qcom_mhi_qrtr_probe,
- .remove = qcom_mhi_qrtr_remove,
- .dl_xfer_cb = qcom_mhi_qrtr_dl_callback,
- .ul_xfer_cb = qcom_mhi_qrtr_ul_callback,
- .id_table = qcom_mhi_qrtr_id_table,
- .driver = {
- .name = "qcom_mhi_qrtr",
- },
-};
-
-module_mhi_ep_driver(qcom_mhi_qrtr_driver);
-
-MODULE_AUTHOR("Chris Lew <clew@codeaurora.org>");
-MODULE_AUTHOR("Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>");
-MODULE_DESCRIPTION("Qualcomm IPC-Router MHI interface driver");
-MODULE_LICENSE("GPL v2");
diff --git a/net/qrtr/ns.c b/net/qrtr/ns.c
index 8d00dfe8139e..1990d496fcfc 100644
--- a/net/qrtr/ns.c
+++ b/net/qrtr/ns.c
@@ -775,8 +775,10 @@ int qrtr_ns_init(void)
}
qrtr_ns.workqueue = alloc_workqueue("qrtr_ns_handler", WQ_UNBOUND, 1);
- if (!qrtr_ns.workqueue)
+ if (!qrtr_ns.workqueue) {
+ ret = -ENOMEM;
goto err_sock;
+ }
qrtr_ns.sock->sk->sk_data_ready = qrtr_ns_data_ready;
diff --git a/net/qrtr/qrtr.c b/net/qrtr/qrtr.c
index 57fc0e7c1c5c..ec2322529727 100644
--- a/net/qrtr/qrtr.c
+++ b/net/qrtr/qrtr.c
@@ -97,7 +97,7 @@ static inline struct qrtr_sock *qrtr_sk(struct sock *sk)
return container_of(sk, struct qrtr_sock, sk);
}
-static unsigned int qrtr_local_nid = 2;
+static unsigned int qrtr_local_nid = 1;
/* for node ids */
static RADIX_TREE(qrtr_nodes, GFP_ATOMIC);
@@ -132,11 +132,6 @@ struct qrtr_node {
struct sk_buff_head rx_queue;
struct list_head item;
- struct work_struct say_hello;
- struct workqueue_struct *wq;
- struct task_struct *task;
-
- atomic_t hello_sent;
};
/**
@@ -348,15 +343,6 @@ static int qrtr_node_enqueue(struct qrtr_node *node, struct sk_buff *skb,
size_t len = skb->len;
int rc, confirm_rx;
- if (!atomic_read(&node->hello_sent) && type != QRTR_TYPE_HELLO) {
- kfree_skb(skb);
- return rc;
- }
- if (atomic_read(&node->hello_sent) && type == QRTR_TYPE_HELLO) {
- kfree_skb(skb);
- return 0;
- }
-
confirm_rx = qrtr_tx_wait(node, to->sq_node, to->sq_port, type);
if (confirm_rx < 0) {
kfree_skb(skb);
@@ -390,10 +376,6 @@ static int qrtr_node_enqueue(struct qrtr_node *node, struct sk_buff *skb,
kfree_skb(skb);
mutex_unlock(&node->ep_lock);
}
-
- if (!rc && type == QRTR_TYPE_HELLO)
- atomic_inc(&node->hello_sent);
-
/* Need to ensure that a subsequent message carries the otherwise lost
* confirm_rx flag if we dropped this one */
if (rc && confirm_rx)
@@ -454,7 +436,7 @@ int qrtr_endpoint_post(struct qrtr_endpoint *ep, const void *data, size_t len)
struct qrtr_sock *ipc;
struct sk_buff *skb;
struct qrtr_cb *cb;
- unsigned int size;
+ size_t size;
unsigned int ver;
size_t hdrlen;
@@ -583,33 +565,6 @@ static struct sk_buff *qrtr_alloc_ctrl_packet(struct qrtr_ctrl_pkt **pkt,
return skb;
}
-static void qrtr_hello_work(struct work_struct *work)
-{
- struct sockaddr_qrtr from = {AF_QIPCRTR, 0, QRTR_PORT_CTRL};
- struct sockaddr_qrtr to = {AF_QIPCRTR, 0, QRTR_PORT_CTRL};
- struct qrtr_ctrl_pkt *pkt;
- struct qrtr_node *node;
- struct qrtr_sock *ctrl;
- struct sk_buff *skb;
-
- ctrl = qrtr_port_lookup(QRTR_PORT_CTRL);
- if (!ctrl)
- return;
-
- skb = qrtr_alloc_ctrl_packet(&pkt, GFP_KERNEL);
- if (!skb) {
- qrtr_port_put(ctrl);
- return;
- }
-
- node = container_of(work, struct qrtr_node, say_hello);
- pkt->cmd = cpu_to_le32(QRTR_TYPE_HELLO);
- from.sq_node = qrtr_local_nid;
-
- qrtr_node_enqueue(node, skb, QRTR_TYPE_HELLO, &from, &to);
- qrtr_port_put(ctrl);
-}
-
/**
* qrtr_endpoint_register() - register a new endpoint
* @ep: endpoint to register
@@ -635,15 +590,9 @@ int qrtr_endpoint_register(struct qrtr_endpoint *ep, unsigned int nid)
node->nid = QRTR_EP_NID_AUTO;
node->ep = ep;
- INIT_WORK(&node->say_hello, qrtr_hello_work);
- node->wq = alloc_ordered_workqueue("qrtr_wq", 0);
- if (!node->wq)
- return -ENOMEM;
-
INIT_RADIX_TREE(&node->qrtr_tx_flow, GFP_KERNEL);
mutex_init(&node->qrtr_tx_lock);
- atomic_set(&node->hello_sent, 0);
qrtr_node_assign(node, nid);
mutex_lock(&qrtr_node_lock);
@@ -651,8 +600,6 @@ int qrtr_endpoint_register(struct qrtr_endpoint *ep, unsigned int nid)
mutex_unlock(&qrtr_node_lock);
ep->node = node;
- queue_work(node->wq, &node->say_hello);
-
return 0;
}
EXPORT_SYMBOL_GPL(qrtr_endpoint_register);
@@ -810,7 +757,7 @@ static void qrtr_reset_ports(void)
xa_for_each_start(&qrtr_ports, index, ipc, 1) {
sock_hold(&ipc->sk);
ipc->sk.sk_err = ENETRESET;
- ipc->sk.sk_error_report(&ipc->sk);
+ sk_error_report(&ipc->sk);
sock_put(&ipc->sk);
}
rcu_read_unlock();
@@ -848,17 +795,6 @@ static int __qrtr_bind(struct socket *sock,
if (port == QRTR_PORT_CTRL)
qrtr_reset_ports();
- if (port == QRTR_PORT_CTRL) {
- struct radix_tree_iter iter;
- struct qrtr_node *node;
- void __rcu **slot;
-
- radix_tree_for_each_slot(slot, &qrtr_nodes, &iter, 0) {
- node = *slot;
- atomic_set(&node->hello_sent, 0);
- }
- }
-
return 0;
}