From e8f1603d7b2923fac52bf8abd658d0ef9c8a6f7f Mon Sep 17 00:00:00 2001 From: Deepak Kumar Singh Date: Thu, 25 Mar 2021 16:24:56 +0530 Subject: [PATCH 1/2] rpmsg: glink: add print for wakeup from suspend Add kernel message when glink irq wakes up system from suspend, so that it is easy to identify wakeup source. Change-Id: I20b91d4d31446042b4057c811c6ee68a471c6048 Signed-off-by: Deepak Kumar Singh --- drivers/rpmsg/qcom_glink_native.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/rpmsg/qcom_glink_native.c b/drivers/rpmsg/qcom_glink_native.c index 54b9ced25052..84b2c52c1835 100644 --- a/drivers/rpmsg/qcom_glink_native.c +++ b/drivers/rpmsg/qcom_glink_native.c @@ -1246,8 +1246,10 @@ static irqreturn_t qcom_glink_native_intr(int irq, void *data) unsigned int cmd; int ret = 0; - if (should_wake) + if (should_wake) { + pr_info("%s: %d triggered %s\n", __func__, irq, glink->irqname); pm_system_wakeup(); + } /* To wakeup any blocking writers */ wake_up_all(&glink->tx_avail_notify); From 9e2b485c1dac18329d895b6e150f7076c16e2fcb Mon Sep 17 00:00:00 2001 From: Deepak Kumar Singh Date: Tue, 18 May 2021 14:24:54 +0530 Subject: [PATCH 2/2] net: qrtr: log rx packet causing system wakeup Log qrtr rx packet in kernel logs which caused system wakeup. This will help to easily identify wakeup packet. Change-Id: I4a6a35dd4d5449a671464c00f90712a79d6044fe Signed-off-by: Deepak Kumar Singh --- drivers/rpmsg/qcom_glink_native.c | 3 +++ drivers/rpmsg/qcom_glink_native.h | 1 + net/qrtr/ns.c | 21 ++++++++++++++++++++- net/qrtr/qrtr.c | 27 ++++++++++++++++++++++++++- net/qrtr/qrtr.h | 2 ++ 5 files changed, 52 insertions(+), 2 deletions(-) diff --git a/drivers/rpmsg/qcom_glink_native.c b/drivers/rpmsg/qcom_glink_native.c index 84b2c52c1835..a725b0148305 100644 --- a/drivers/rpmsg/qcom_glink_native.c +++ b/drivers/rpmsg/qcom_glink_native.c @@ -56,6 +56,8 @@ do { \ #define RPM_GLINK_CID_MAX 65536 static int should_wake; +int glink_resume_pkt; +EXPORT_SYMBOL(glink_resume_pkt); struct glink_msg { __le16 cmd; @@ -1248,6 +1250,7 @@ static irqreturn_t qcom_glink_native_intr(int irq, void *data) if (should_wake) { pr_info("%s: %d triggered %s\n", __func__, irq, glink->irqname); + glink_resume_pkt = true; pm_system_wakeup(); } /* To wakeup any blocking writers */ diff --git a/drivers/rpmsg/qcom_glink_native.h b/drivers/rpmsg/qcom_glink_native.h index 7a83d7bfe153..07ef522ea870 100644 --- a/drivers/rpmsg/qcom_glink_native.h +++ b/drivers/rpmsg/qcom_glink_native.h @@ -28,6 +28,7 @@ struct qcom_glink_pipe { struct qcom_glink; extern const struct dev_pm_ops glink_native_pm_ops; +extern int glink_resume_pkt; struct qcom_glink *qcom_glink_native_probe(struct device *dev, unsigned long features, diff --git a/net/qrtr/ns.c b/net/qrtr/ns.c index 41d24d412f5d..d138ca1d27bc 100644 --- a/net/qrtr/ns.c +++ b/net/qrtr/ns.c @@ -1,7 +1,7 @@ // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause /* * Copyright (c) 2015, Sony Mobile Communications Inc. - * Copyright (c) 2013, 2020, The Linux Foundation. All rights reserved. + * Copyright (c) 2013, 2020-2021, The Linux Foundation. All rights reserved. * Copyright (c) 2020, Linaro Ltd. */ @@ -98,6 +98,25 @@ static struct qrtr_node *node_get(unsigned int node_id) return node; } +unsigned int qrtr_get_service_id(unsigned int node_id, unsigned int port_id) +{ + struct qrtr_server *srv; + struct qrtr_node *node; + unsigned long index; + + node = node_get(node_id); + if (!node) + return 0; + + xa_for_each(&node->servers, index, srv) { + if (srv->node == node_id && srv->port == port_id) + return srv->service; + } + + return 0; +} +EXPORT_SYMBOL(qrtr_get_service_id); + static int server_match(const struct qrtr_server *srv, const struct qrtr_server_filter *f) { diff --git a/net/qrtr/qrtr.c b/net/qrtr/qrtr.c index d5f77efbd149..af1d35e1566d 100644 --- a/net/qrtr/qrtr.c +++ b/net/qrtr/qrtr.c @@ -1,7 +1,7 @@ // SPDX-License-Identifier: GPL-2.0-only /* * Copyright (c) 2015, Sony Mobile Communications Inc. - * Copyright (c) 2013, 2018-2019 The Linux Foundation. All rights reserved. + * Copyright (c) 2013, 2018-2019, 2021, The Linux Foundation. All rights reserved. */ #include #include @@ -40,6 +40,11 @@ #define AID_VENDOR_QRTR KGIDT_INIT(2906) +#if defined(CONFIG_RPMSG_QCOM_GLINK_NATIVE) +extern bool glink_resume_pkt; +#endif +extern unsigned int qrtr_get_service_id(unsigned int node_id, + unsigned int port_id); /** * struct qrtr_hdr_v1 - (I|R)PCrouter packet header version 1 * @version: protocol version @@ -269,6 +274,23 @@ static void qrtr_log_tx_msg(struct qrtr_node *node, struct qrtr_hdr_v1 *hdr, } } +#if defined(CONFIG_RPMSG_QCOM_GLINK_NATIVE) +static void qrtr_log_resume_pkt(struct qrtr_cb *cb, u64 pl_buf) +{ + unsigned int service_id; + + if (glink_resume_pkt) { + glink_resume_pkt = false; + service_id = qrtr_get_service_id(cb->src_node, cb->src_port); + pr_info("[QRTR RESUME PKT]:src[0x%x:0x%x] dst[0x%x:0x%x] [%08x %08x]: service[0x%x]\n", + cb->src_node, cb->src_port, + cb->dst_node, cb->dst_port, + (unsigned int)pl_buf, (unsigned int)(pl_buf >> 32), + service_id); + } +} +#endif + static void qrtr_log_rx_msg(struct qrtr_node *node, struct sk_buff *skb) { struct qrtr_ctrl_pkt pkt = {0,}; @@ -287,6 +309,9 @@ static void qrtr_log_rx_msg(struct qrtr_node *node, struct sk_buff *skb) skb->len, cb->confirm_rx, cb->src_node, cb->src_port, cb->dst_node, cb->dst_port, (unsigned int)pl_buf, (unsigned int)(pl_buf >> 32)); +#if defined(CONFIG_RPMSG_QCOM_GLINK_NATIVE) + qrtr_log_resume_pkt(cb, pl_buf); +#endif } else { skb_copy_bits(skb, 0, &pkt, sizeof(pkt)); if (cb->type == QRTR_TYPE_NEW_SERVER || diff --git a/net/qrtr/qrtr.h b/net/qrtr/qrtr.h index fba24c530146..8784f5eecb34 100644 --- a/net/qrtr/qrtr.h +++ b/net/qrtr/qrtr.h @@ -38,4 +38,6 @@ void qrtr_ns_init(void); void qrtr_ns_remove(void); int qrtr_peek_pkt_size(const void *data); + +unsigned int qrtr_get_service_id(unsigned int node_id, unsigned int port_id); #endif