Commit 4ea3e221 authored by Rosen Penev's avatar Rosen Penev Committed by Jakub Kicinski
Browse files

net: hisilicon: hns3: use ethtool string helpers



The latter is the preferred way to copy ethtool strings.

Avoids manually incrementing the pointer. Cleans up the code quite well.

Signed-off-by: default avatarRosen Penev <rosenp@gmail.com>
Reviewed-by: default avatarJijie Shao <shaojijie@huawei.com>
Tested-by: default avatarJijie Shao <shaojijie@huawei.com>
Link: https://patch.msgid.link/20241104204823.297277-1-rosenp@gmail.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 4069dcb7
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -677,7 +677,7 @@ struct hnae3_ae_ops {
	void (*get_mac_stats)(struct hnae3_handle *handle,
			      struct hns3_mac_stats *mac_stats);
	void (*get_strings)(struct hnae3_handle *handle,
			    u32 stringset, u8 *data);
			    u32 stringset, u8 **data);
	int (*get_sset_count)(struct hnae3_handle *handle, int stringset);

	void (*get_regs)(struct hnae3_handle *handle, u32 *version,
+3 −8
Original line number Diff line number Diff line
@@ -36,27 +36,22 @@ int hclge_comm_tqps_get_sset_count(struct hnae3_handle *handle)
}
EXPORT_SYMBOL_GPL(hclge_comm_tqps_get_sset_count);

u8 *hclge_comm_tqps_get_strings(struct hnae3_handle *handle, u8 *data)
void hclge_comm_tqps_get_strings(struct hnae3_handle *handle, u8 **data)
{
	struct hnae3_knic_private_info *kinfo = &handle->kinfo;
	u8 *buff = data;
	u16 i;

	for (i = 0; i < kinfo->num_tqps; i++) {
		struct hclge_comm_tqp *tqp =
			container_of(kinfo->tqp[i], struct hclge_comm_tqp, q);
		snprintf(buff, ETH_GSTRING_LEN, "txq%u_pktnum_rcd", tqp->index);
		buff += ETH_GSTRING_LEN;
		ethtool_sprintf(data, "txq%u_pktnum_rcd", tqp->index);
	}

	for (i = 0; i < kinfo->num_tqps; i++) {
		struct hclge_comm_tqp *tqp =
			container_of(kinfo->tqp[i], struct hclge_comm_tqp, q);
		snprintf(buff, ETH_GSTRING_LEN, "rxq%u_pktnum_rcd", tqp->index);
		buff += ETH_GSTRING_LEN;
		ethtool_sprintf(data, "rxq%u_pktnum_rcd", tqp->index);
	}

	return buff;
}
EXPORT_SYMBOL_GPL(hclge_comm_tqps_get_strings);

+1 −1
Original line number Diff line number Diff line
@@ -32,7 +32,7 @@ struct hclge_comm_tqp {

u64 *hclge_comm_tqps_get_stats(struct hnae3_handle *handle, u64 *data);
int hclge_comm_tqps_get_sset_count(struct hnae3_handle *handle);
u8 *hclge_comm_tqps_get_strings(struct hnae3_handle *handle, u8 *data);
void hclge_comm_tqps_get_strings(struct hnae3_handle *handle, u8 **data);
void hclge_comm_reset_tqp_stats(struct hnae3_handle *handle);
int hclge_comm_tqps_update_stats(struct hnae3_handle *handle,
				 struct hclge_comm_hw *hw);
+17 −37
Original line number Diff line number Diff line
@@ -509,54 +509,37 @@ static int hns3_get_sset_count(struct net_device *netdev, int stringset)
	}
}

static void *hns3_update_strings(u8 *data, const struct hns3_stats *stats,
		u32 stat_count, u32 num_tqps, const char *prefix)
static void hns3_update_strings(u8 **data, const struct hns3_stats *stats,
				u32 stat_count, u32 num_tqps,
				const char *prefix)
{
#define MAX_PREFIX_SIZE (6 + 4)
	u32 size_left;
	u32 i, j;
	u32 n1;

	for (i = 0; i < num_tqps; i++) {
		for (j = 0; j < stat_count; j++) {
			data[ETH_GSTRING_LEN - 1] = '\0';

			/* first, prepend the prefix string */
			n1 = scnprintf(data, MAX_PREFIX_SIZE, "%s%u_",
				       prefix, i);
			size_left = (ETH_GSTRING_LEN - 1) - n1;

			/* now, concatenate the stats string to it */
			strncat(data, stats[j].stats_string, size_left);
			data += ETH_GSTRING_LEN;
		}
	}

	return data;
	for (i = 0; i < num_tqps; i++)
		for (j = 0; j < stat_count; j++)
			ethtool_sprintf(data, "%s%u_%s", prefix, i,
					stats[j].stats_string);
}

static u8 *hns3_get_strings_tqps(struct hnae3_handle *handle, u8 *data)
static void hns3_get_strings_tqps(struct hnae3_handle *handle, u8 **data)
{
	struct hnae3_knic_private_info *kinfo = &handle->kinfo;
	const char tx_prefix[] = "txq";
	const char rx_prefix[] = "rxq";

	/* get strings for Tx */
	data = hns3_update_strings(data, hns3_txq_stats, HNS3_TXQ_STATS_COUNT,
	hns3_update_strings(data, hns3_txq_stats, HNS3_TXQ_STATS_COUNT,
			    kinfo->num_tqps, tx_prefix);

	/* get strings for Rx */
	data = hns3_update_strings(data, hns3_rxq_stats, HNS3_RXQ_STATS_COUNT,
	hns3_update_strings(data, hns3_rxq_stats, HNS3_RXQ_STATS_COUNT,
			    kinfo->num_tqps, rx_prefix);

	return data;
}

static void hns3_get_strings(struct net_device *netdev, u32 stringset, u8 *data)
{
	struct hnae3_handle *h = hns3_get_handle(netdev);
	const struct hnae3_ae_ops *ops = h->ae_algo->ops;
	char *buff = (char *)data;
	int i;

	if (!ops->get_strings)
@@ -564,18 +547,15 @@ static void hns3_get_strings(struct net_device *netdev, u32 stringset, u8 *data)

	switch (stringset) {
	case ETH_SS_STATS:
		buff = hns3_get_strings_tqps(h, buff);
		ops->get_strings(h, stringset, (u8 *)buff);
		hns3_get_strings_tqps(h, &data);
		ops->get_strings(h, stringset, &data);
		break;
	case ETH_SS_TEST:
		ops->get_strings(h, stringset, data);
		ops->get_strings(h, stringset, &data);
		break;
	case ETH_SS_PRIV_FLAGS:
		for (i = 0; i < HNS3_PRIV_FLAGS_LEN; i++) {
			snprintf(buff, ETH_GSTRING_LEN, "%s",
				 hns3_priv_flags[i].name);
			buff += ETH_GSTRING_LEN;
		}
		for (i = 0; i < HNS3_PRIV_FLAGS_LEN; i++)
			ethtool_puts(&data, hns3_priv_flags[i].name);
		break;
	default:
		break;
+20 −30
Original line number Diff line number Diff line
@@ -595,25 +595,21 @@ static u64 *hclge_comm_get_stats(struct hclge_dev *hdev,
	return buf;
}

static u8 *hclge_comm_get_strings(struct hclge_dev *hdev, u32 stringset,
static void hclge_comm_get_strings(struct hclge_dev *hdev, u32 stringset,
				   const struct hclge_comm_stats_str strs[],
				  int size, u8 *data)
				   int size, u8 **data)
{
	char *buff = (char *)data;
	u32 i;

	if (stringset != ETH_SS_STATS)
		return buff;
		return;

	for (i = 0; i < size; i++) {
		if (strs[i].stats_num > hdev->ae_dev->dev_specs.mac_stats_num)
			continue;

		snprintf(buff, ETH_GSTRING_LEN, "%s", strs[i].desc);
		buff = buff + ETH_GSTRING_LEN;
		ethtool_puts(data, strs[i].desc);
	}

	return (u8 *)buff;
}

static void hclge_update_stats_for_all(struct hclge_dev *hdev)
@@ -718,44 +714,38 @@ static int hclge_get_sset_count(struct hnae3_handle *handle, int stringset)
}

static void hclge_get_strings(struct hnae3_handle *handle, u32 stringset,
			      u8 *data)
			      u8 **data)
{
	struct hclge_vport *vport = hclge_get_vport(handle);
	struct hclge_dev *hdev = vport->back;
	u8 *p = (char *)data;
	const char *str;
	int size;

	if (stringset == ETH_SS_STATS) {
		size = ARRAY_SIZE(g_mac_stats_string);
		p = hclge_comm_get_strings(hdev, stringset, g_mac_stats_string,
					   size, p);
		p = hclge_comm_tqps_get_strings(handle, p);
		hclge_comm_get_strings(hdev, stringset, g_mac_stats_string,
				       size, data);
		hclge_comm_tqps_get_strings(handle, data);
	} else if (stringset == ETH_SS_TEST) {
		if (handle->flags & HNAE3_SUPPORT_EXTERNAL_LOOPBACK) {
			memcpy(p, hns3_nic_test_strs[HNAE3_LOOP_EXTERNAL],
			       ETH_GSTRING_LEN);
			p += ETH_GSTRING_LEN;
			str = hns3_nic_test_strs[HNAE3_LOOP_EXTERNAL];
			ethtool_puts(data, str);
		}
		if (handle->flags & HNAE3_SUPPORT_APP_LOOPBACK) {
			memcpy(p, hns3_nic_test_strs[HNAE3_LOOP_APP],
			       ETH_GSTRING_LEN);
			p += ETH_GSTRING_LEN;
			str = hns3_nic_test_strs[HNAE3_LOOP_APP];
			ethtool_puts(data, str);
		}
		if (handle->flags & HNAE3_SUPPORT_SERDES_SERIAL_LOOPBACK) {
			memcpy(p, hns3_nic_test_strs[HNAE3_LOOP_SERIAL_SERDES],
			       ETH_GSTRING_LEN);
			p += ETH_GSTRING_LEN;
			str = hns3_nic_test_strs[HNAE3_LOOP_SERIAL_SERDES];
			ethtool_puts(data, str);
		}
		if (handle->flags & HNAE3_SUPPORT_SERDES_PARALLEL_LOOPBACK) {
			memcpy(p,
			       hns3_nic_test_strs[HNAE3_LOOP_PARALLEL_SERDES],
			       ETH_GSTRING_LEN);
			p += ETH_GSTRING_LEN;
			str = hns3_nic_test_strs[HNAE3_LOOP_PARALLEL_SERDES];
			ethtool_puts(data, str);
		}
		if (handle->flags & HNAE3_SUPPORT_PHY_LOOPBACK) {
			memcpy(p, hns3_nic_test_strs[HNAE3_LOOP_PHY],
			       ETH_GSTRING_LEN);
			p += ETH_GSTRING_LEN;
			str = hns3_nic_test_strs[HNAE3_LOOP_PHY];
			ethtool_puts(data, str);
		}
	}
}
Loading