diff --git a/drivers/rpmsg/qcom_glink_native.c b/drivers/rpmsg/qcom_glink_native.c index 54b9ced25052..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; @@ -1246,8 +1248,11 @@ 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); + glink_resume_pkt = true; pm_system_wakeup(); + } /* To wakeup any blocking writers */ wake_up_all(&glink->tx_avail_notify); 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