@@ -594,6 +594,38 @@ struct ethtool_mm_stats {
u64 MACMergeHoldCount;
};
+/**
+ * struct ethtool_ulp_ddp_stats - ULP DDP offload statistics
+ * @rx_nvmeotcp_sk_add: number of sockets successfully prepared for offloading.
+ * @rx_nvmeotcp_sk_add_fail: number of sockets that failed to be prepared for offloading.
+ * @rx_nvmeotcp_sk_del: number of sockets where offloading has been removed.
+ * @rx_nvmeotcp_ddp_setup: number of NVMeTCP PDU successfully prepared for Direct Data Placement.
+ * @rx_nvmeotcp_ddp_setup_fail: number of PDUs that failed DDP preparation.
+ * @rx_nvmeotcp_ddp_teardown: number of PDUs done with DDP.
+ * @rx_nvmeotcp_drop: number of PDUs dropped.
+ * @rx_nvmeotcp_resync: number of resync.
+ * @rx_nvmeotcp_packets: number of offloaded PDUs.
+ * @rx_nvmeotcp_bytes: number of offloaded bytes.
+ */
+struct ethtool_ulp_ddp_stats {
+ u64 rx_nvmeotcp_sk_add;
+ u64 rx_nvmeotcp_sk_add_fail;
+ u64 rx_nvmeotcp_sk_del;
+ u64 rx_nvmeotcp_ddp_setup;
+ u64 rx_nvmeotcp_ddp_setup_fail;
+ u64 rx_nvmeotcp_ddp_teardown;
+ u64 rx_nvmeotcp_drop;
+ u64 rx_nvmeotcp_resync;
+ u64 rx_nvmeotcp_packets;
+ u64 rx_nvmeotcp_bytes;
+
+ /*
+ * add new stats at the end and keep in sync with
+ * - ETHTOOL_ULP_DDP_STATS_* enum in uapi
+ * - ulp_ddp_stats_name stringset
+ */
+};
+
/**
* struct ethtool_ops - optional netdev operations
* @cap_link_lanes_supported: indicates if the driver supports lanes
@@ -681,6 +681,8 @@ enum ethtool_link_ext_substate_module {
* @ETH_SS_STATS_ETH_MAC: names of IEEE 802.3 MAC statistics
* @ETH_SS_STATS_ETH_CTRL: names of IEEE 802.3 MAC Control statistics
* @ETH_SS_STATS_RMON: names of RMON statistics
+ * @ETH_SS_ULP_DDP_CAPS: names of ULP DDP capabilities
+ * @ETH_SS_ULP_DDP_STATS: names of ULP DDP statistics
*
* @ETH_SS_COUNT: number of defined string sets
*/
@@ -706,6 +708,8 @@ enum ethtool_stringset {
ETH_SS_STATS_ETH_MAC,
ETH_SS_STATS_ETH_CTRL,
ETH_SS_STATS_RMON,
+ ETH_SS_ULP_DDP_CAPS,
+ ETH_SS_ULP_DDP_STATS,
/* add new constants above here */
ETH_SS_COUNT
@@ -975,6 +975,28 @@ enum {
ETHTOOL_A_MM_MAX = (__ETHTOOL_A_MM_CNT - 1)
};
+/* ULP DDP */
+
+enum {
+ ETHTOOL_A_ULP_DDP_STATS_UNSPEC,
+ ETHTOOL_A_ULP_DDP_STATS_PAD,
+
+ ETHTOOL_A_ULP_DDP_STATS_RX_NVMEOTCP_SK_ADD,
+ ETHTOOL_A_ULP_DDP_STATS_RX_NVMEOTCP_SK_ADD_FAIL,
+ ETHTOOL_A_ULP_DDP_STATS_RX_NVMEOTCP_SK_DEL,
+ ETHTOOL_A_ULP_DDP_STATS_RX_NVMEOTCP_DDP_SETUP,
+ ETHTOOL_A_ULP_DDP_STATS_RX_NVMEOTCP_DDP_SETUP_FAIL,
+ ETHTOOL_A_ULP_DDP_STATS_RX_NVMEOTCP_DDP_TEARDOWN,
+ ETHTOOL_A_ULP_DDP_STATS_RX_NVMEOTCP_DROP,
+ ETHTOOL_A_ULP_DDP_STATS_RX_NVMEOTCP_RESYNC,
+ ETHTOOL_A_ULP_DDP_STATS_RX_NVMEOTCP_PACKETS,
+ ETHTOOL_A_ULP_DDP_STATS_RX_NVMEOTCP_BYTES,
+
+ /* add new constants above here */
+ __ETHTOOL_A_ULP_DDP_STATS_CNT,
+ ETHTOOL_A_ULP_DDP_STATS_MAX = __ETHTOOL_A_ULP_DDP_STATS_CNT - 1
+};
+
/* generic netlink info */
#define ETHTOOL_GENL_NAME "ethtool"
#define ETHTOOL_GENL_VERSION 1
@@ -5,6 +5,7 @@
#include <linux/phy.h>
#include <linux/rtnetlink.h>
#include <linux/ptp_clock_kernel.h>
+#include <net/ulp_ddp_caps.h>
#include "common.h"
@@ -465,6 +466,28 @@ const char udp_tunnel_type_names[][ETH_GSTRING_LEN] = {
static_assert(ARRAY_SIZE(udp_tunnel_type_names) ==
__ETHTOOL_UDP_TUNNEL_TYPE_CNT);
+const char ulp_ddp_caps_names[][ETH_GSTRING_LEN] = {
+ [ULP_DDP_C_NVME_TCP_BIT] = "nvme-tcp-ddp",
+ [ULP_DDP_C_NVME_TCP_DDGST_RX_BIT] = "nvme-tcp-ddgst-rx-offload",
+};
+static_assert(ARRAY_SIZE(ulp_ddp_caps_names) == ULP_DDP_C_COUNT);
+
+const char ulp_ddp_stats_names[][ETH_GSTRING_LEN] = {
+ [ETHTOOL_A_ULP_DDP_STATS_UNSPEC] = "unspec",
+ [ETHTOOL_A_ULP_DDP_STATS_PAD] = "pad",
+ [ETHTOOL_A_ULP_DDP_STATS_RX_NVMEOTCP_SK_ADD] = "rx_nvmeotcp_sk_add",
+ [ETHTOOL_A_ULP_DDP_STATS_RX_NVMEOTCP_SK_ADD_FAIL] = "rx_nvmeotcp_sk_add_fail",
+ [ETHTOOL_A_ULP_DDP_STATS_RX_NVMEOTCP_SK_DEL] = "rx_nvmeotcp_sk_del",
+ [ETHTOOL_A_ULP_DDP_STATS_RX_NVMEOTCP_DDP_SETUP] = "rx_nvmeotcp_ddp_setup",
+ [ETHTOOL_A_ULP_DDP_STATS_RX_NVMEOTCP_DDP_SETUP_FAIL] = "rx_nvmeotcp_ddp_setup_fail",
+ [ETHTOOL_A_ULP_DDP_STATS_RX_NVMEOTCP_DDP_TEARDOWN] = "rx_nvmeotcp_ddp_teardown",
+ [ETHTOOL_A_ULP_DDP_STATS_RX_NVMEOTCP_DROP] = "rx_nvmeotcp_drop",
+ [ETHTOOL_A_ULP_DDP_STATS_RX_NVMEOTCP_RESYNC] = "rx_nvmeotcp_resync",
+ [ETHTOOL_A_ULP_DDP_STATS_RX_NVMEOTCP_PACKETS] = "rx_nvmeotcp_packets",
+ [ETHTOOL_A_ULP_DDP_STATS_RX_NVMEOTCP_BYTES] = "rx_nvmeotcp_bytes",
+};
+static_assert(ARRAY_SIZE(ulp_ddp_stats_names) == __ETHTOOL_A_ULP_DDP_STATS_CNT);
+
/* return false if legacy contained non-0 deprecated fields
* maxtxpkt/maxrxpkt. rest of ksettings always updated
*/
@@ -36,6 +36,8 @@ extern const char sof_timestamping_names[][ETH_GSTRING_LEN];
extern const char ts_tx_type_names[][ETH_GSTRING_LEN];
extern const char ts_rx_filter_names[][ETH_GSTRING_LEN];
extern const char udp_tunnel_type_names[][ETH_GSTRING_LEN];
+extern const char ulp_ddp_caps_names[][ETH_GSTRING_LEN];
+extern const char ulp_ddp_stats_names[][ETH_GSTRING_LEN];
int __ethtool_get_link(struct net_device *dev);
@@ -2,6 +2,7 @@
#include <linux/ethtool.h>
#include <linux/phy.h>
+#include <net/ulp_ddp_caps.h>
#include "netlink.h"
#include "common.h"
@@ -105,6 +106,16 @@ static const struct strset_info info_template[] = {
.count = __ETHTOOL_A_STATS_RMON_CNT,
.strings = stats_rmon_names,
},
+ [ETH_SS_ULP_DDP_CAPS] = {
+ .per_dev = false,
+ .count = ULP_DDP_C_COUNT,
+ .strings = ulp_ddp_caps_names,
+ },
+ [ETH_SS_ULP_DDP_STATS] = {
+ .per_dev = false,
+ .count = __ETHTOOL_A_ULP_DDP_STATS_CNT,
+ .strings = ulp_ddp_stats_names,
+ },
};
struct strset_req_info {