summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWeiyi Chen <quic_weiyic@quicinc.com>2022-03-14 17:03:26 -0700
committerWeiyi Chen <quic_weiyic@quicinc.com>2022-03-29 22:52:02 -0700
commitd26ada23f91706f1c97a274a01cfc994053c1cb7 (patch)
tree6b598f07882b526e2da9fde86ec1c92927a6e030
parentecd7f76efc9213c6628dfde2550930cbc8003279 (diff)
downloaddatarmnet-d26ada23f91706f1c97a274a01cfc994053c1cb7.tar.gz
rmnet_core: ethtool QMAP stats
Add QMAP(rmnet_ctl) RX/TX stats to the ethtool. Change-Id: I730c6e06aaadba20d56485891408abfa1be8c27a Signed-off-by: Weiyi Chen <quic_weiyic@quicinc.com>
-rw-r--r--core/rmnet_ctl.h5
-rw-r--r--core/rmnet_ctl_client.c16
-rw-r--r--core/rmnet_vnd.c22
3 files changed, 41 insertions, 2 deletions
diff --git a/core/rmnet_ctl.h b/core/rmnet_ctl.h
index 6e59c0f..d4545b3 100644
--- a/core/rmnet_ctl.h
+++ b/core/rmnet_ctl.h
@@ -1,5 +1,6 @@
/* SPDX-License-Identifier: GPL-2.0-only */
/* Copyright (c) 2019-2021, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
*
* RMNET_CTL header
*
@@ -31,8 +32,10 @@ struct rmnet_ctl_client_if {
#ifdef RMNET_LA_PLATFORM
struct rmnet_ctl_client_if *rmnet_ctl_if(void);
+int rmnet_ctl_get_stats(u64 *s, int n);
#else
-inline struct rmnet_ctl_client_if *rmnet_ctl_if(void) {return NULL;};
+static inline struct rmnet_ctl_client_if *rmnet_ctl_if(void) {return NULL;};
+static inline int rmnet_ctl_get_stats(u64 *s, int n) {return 0;};
#endif /* RMNET_LA_PLATFORM */
#endif /* _RMNET_CTL_H_ */
diff --git a/core/rmnet_ctl_client.c b/core/rmnet_ctl_client.c
index b74f06e..e42c52e 100644
--- a/core/rmnet_ctl_client.c
+++ b/core/rmnet_ctl_client.c
@@ -231,3 +231,19 @@ struct rmnet_ctl_client_if *rmnet_ctl_if(void)
return &client_if;
}
EXPORT_SYMBOL(rmnet_ctl_if);
+
+int rmnet_ctl_get_stats(u64 *s, int n)
+{
+ struct rmnet_ctl_dev *dev;
+
+ rcu_read_lock();
+ dev = rcu_dereference(ctl_ep.dev);
+ if (dev && n > 0) {
+ n = min(n, (int)(sizeof(dev->stats) / sizeof(u64)));
+ memcpy(s, &dev->stats, n * sizeof(u64));
+ }
+ rcu_read_unlock();
+
+ return n;
+}
+EXPORT_SYMBOL(rmnet_ctl_get_stats);
diff --git a/core/rmnet_vnd.c b/core/rmnet_vnd.c
index 9c0b39d..e9356d2 100644
--- a/core/rmnet_vnd.c
+++ b/core/rmnet_vnd.c
@@ -33,6 +33,7 @@
#include "rmnet_vnd.h"
#include "rmnet_genl.h"
#include "rmnet_ll.h"
+#include "rmnet_ctl.h"
#include "qmi_rmnet.h"
#include "rmnet_qmi.h"
@@ -565,6 +566,14 @@ static const char rmnet_ll_gstrings_stats[][ETH_GSTRING_LEN] = {
"LL TX FC err",
};
+static const char rmnet_qmap_gstrings_stats[][ETH_GSTRING_LEN] = {
+ "QMAP RX success",
+ "QMAP RX errors",
+ "QMAP TX queued",
+ "QMAP TX errors",
+ "QMAP TX complete (MHI)",
+};
+
static void rmnet_get_strings(struct net_device *dev, u32 stringset, u8 *buf)
{
size_t off = 0;
@@ -580,6 +589,9 @@ static void rmnet_get_strings(struct net_device *dev, u32 stringset, u8 *buf)
off += sizeof(rmnet_port_gstrings_stats);
memcpy(buf + off, &rmnet_ll_gstrings_stats,
sizeof(rmnet_ll_gstrings_stats));
+ off += sizeof(rmnet_ll_gstrings_stats);
+ memcpy(buf + off, &rmnet_qmap_gstrings_stats,
+ sizeof(rmnet_qmap_gstrings_stats));
break;
}
}
@@ -590,7 +602,8 @@ static int rmnet_get_sset_count(struct net_device *dev, int sset)
case ETH_SS_STATS:
return ARRAY_SIZE(rmnet_gstrings_stats) +
ARRAY_SIZE(rmnet_port_gstrings_stats) +
- ARRAY_SIZE(rmnet_ll_gstrings_stats);
+ ARRAY_SIZE(rmnet_ll_gstrings_stats) +
+ ARRAY_SIZE(rmnet_qmap_gstrings_stats);
default:
return -EOPNOTSUPP;
}
@@ -605,6 +618,7 @@ static void rmnet_get_ethtool_stats(struct net_device *dev,
struct rmnet_ll_stats *llp;
struct rmnet_port *port;
size_t off = 0;
+ u64 qmap_s[ARRAY_SIZE(rmnet_qmap_gstrings_stats)];
port = rmnet_get_port(priv->real_dev);
@@ -621,6 +635,12 @@ static void rmnet_get_ethtool_stats(struct net_device *dev,
off += ARRAY_SIZE(rmnet_port_gstrings_stats);
memcpy(data + off, llp,
ARRAY_SIZE(rmnet_ll_gstrings_stats) * sizeof(u64));
+
+ off += ARRAY_SIZE(rmnet_ll_gstrings_stats);
+ memset(qmap_s, 0, sizeof(qmap_s));
+ rmnet_ctl_get_stats(qmap_s, ARRAY_SIZE(rmnet_qmap_gstrings_stats));
+ memcpy(data + off, qmap_s,
+ ARRAY_SIZE(rmnet_qmap_gstrings_stats) * sizeof(u64));
}
static int rmnet_stats_reset(struct net_device *dev)