diff options
author | Aníbal Limón <anibal.limon@linaro.org> | 2021-10-21 09:01:53 -0500 |
---|---|---|
committer | Aníbal Limón <anibal.limon@linaro.org> | 2021-10-21 09:01:53 -0500 |
commit | 354e9958d8ac76d8ea9d8b058edc8c568708c002 (patch) | |
tree | f57d340bd77ea2accae0fc7a2752a2fa8f783f2e | |
parent | a5584c6b20b76589bfe4076aa60089b3e3d1f8f7 (diff) |
Revert "[WIP] net: qrtr: Add support for MHI endpoint"
This reverts commit 4a03b09711adf6415bdce850ed624e12c717d099.
-rw-r--r-- | net/qrtr/Kconfig | 7 | ||||
-rw-r--r-- | net/qrtr/Makefile | 2 | ||||
-rw-r--r-- | net/qrtr/mhi-ep.c | 145 | ||||
-rw-r--r-- | net/qrtr/ns.c | 4 | ||||
-rw-r--r-- | net/qrtr/qrtr.c | 70 |
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; } |