Commit 6fabed40 authored by Aaradhana Sahu's avatar Aaradhana Sahu Committed by Jeff Johnson
Browse files

wifi: ath: create common testmode_i.h file for ath drivers



User space application requires that the testmode interface
is exactly same between ath drivers. Move testmode_i.h file
in ath directory to ensure that all ath driver uses same testmode
interface instead of duplicating testmode_i.h for each ath drivers.

Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1
Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.3.1-00173-QCAHKSWPL_SILICONZ-1

Signed-off-by: default avatarAaradhana Sahu <quic_aarasahu@quicinc.com>
Reviewed-by: default avatarAditya Kumar Singh <quic_adisi@quicinc.com>
Link: https://patch.msgid.link/20250119083657.1937557-2-quic_aarasahu@quicinc.com


Signed-off-by: default avatarJeff Johnson <jeff.johnson@oss.qualcomm.com>
parent eeadc6ba
Loading
Loading
Loading
Loading
+40 −40
Original line number Diff line number Diff line
// SPDX-License-Identifier: BSD-3-Clause-Clear
/*
 * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
 * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
 * Copyright (c) 2023-2025 Qualcomm Innovation Center, Inc. All rights reserved.
 */

#include "testmode.h"
@@ -10,18 +10,18 @@
#include "wmi.h"
#include "hw.h"
#include "core.h"
#include "testmode_i.h"
#include "../testmode_i.h"

#define ATH11K_FTM_SEGHDR_CURRENT_SEQ		GENMASK(3, 0)
#define ATH11K_FTM_SEGHDR_TOTAL_SEGMENTS	GENMASK(7, 4)

static const struct nla_policy ath11k_tm_policy[ATH11K_TM_ATTR_MAX + 1] = {
	[ATH11K_TM_ATTR_CMD]		= { .type = NLA_U32 },
	[ATH11K_TM_ATTR_DATA]		= { .type = NLA_BINARY,
					    .len = ATH11K_TM_DATA_MAX_LEN },
	[ATH11K_TM_ATTR_WMI_CMDID]	= { .type = NLA_U32 },
	[ATH11K_TM_ATTR_VERSION_MAJOR]	= { .type = NLA_U32 },
	[ATH11K_TM_ATTR_VERSION_MINOR]	= { .type = NLA_U32 },
static const struct nla_policy ath11k_tm_policy[ATH_TM_ATTR_MAX + 1] = {
	[ATH_TM_ATTR_CMD]		= { .type = NLA_U32 },
	[ATH_TM_ATTR_DATA]		= { .type = NLA_BINARY,
					    .len = ATH_TM_DATA_MAX_LEN },
	[ATH_TM_ATTR_WMI_CMDID]		= { .type = NLA_U32 },
	[ATH_TM_ATTR_VERSION_MAJOR]	= { .type = NLA_U32 },
	[ATH_TM_ATTR_VERSION_MINOR]	= { .type = NLA_U32 },
};

static struct ath11k *ath11k_tm_get_ar(struct ath11k_base *ab)
@@ -73,9 +73,9 @@ static void ath11k_tm_wmi_event_unsegmented(struct ath11k_base *ab, u32 cmd_id,
		goto out;
	}

	if (nla_put_u32(nl_skb, ATH11K_TM_ATTR_CMD, ATH11K_TM_CMD_WMI) ||
	    nla_put_u32(nl_skb, ATH11K_TM_ATTR_WMI_CMDID, cmd_id) ||
	    nla_put(nl_skb, ATH11K_TM_ATTR_DATA, skb->len, skb->data)) {
	if (nla_put_u32(nl_skb, ATH_TM_ATTR_CMD, ATH_TM_CMD_WMI) ||
	    nla_put_u32(nl_skb, ATH_TM_ATTR_WMI_CMDID, cmd_id) ||
	    nla_put(nl_skb, ATH_TM_ATTR_DATA, skb->len, skb->data)) {
		ath11k_warn(ab, "failed to populate testmode unsegmented event\n");
		kfree_skb(nl_skb);
		goto out;
@@ -140,7 +140,7 @@ static int ath11k_tm_process_event(struct ath11k_base *ab, u32 cmd_id,

	data_pos = ab->testmode.data_pos;

	if ((data_pos + datalen) > ATH11K_FTM_EVENT_MAX_BUF_LENGTH) {
	if ((data_pos + datalen) > ATH_FTM_EVENT_MAX_BUF_LENGTH) {
		ath11k_warn(ab, "Invalid ftm event length at %d: %d\n",
			    data_pos, datalen);
		ret = -EINVAL;
@@ -172,10 +172,10 @@ static int ath11k_tm_process_event(struct ath11k_base *ab, u32 cmd_id,
		goto out;
	}

	if (nla_put_u32(nl_skb, ATH11K_TM_ATTR_CMD,
			ATH11K_TM_CMD_WMI_FTM) ||
	    nla_put_u32(nl_skb, ATH11K_TM_ATTR_WMI_CMDID, cmd_id) ||
	    nla_put(nl_skb, ATH11K_TM_ATTR_DATA, data_pos,
	if (nla_put_u32(nl_skb, ATH_TM_ATTR_CMD,
			ATH_TM_CMD_WMI_FTM) ||
	    nla_put_u32(nl_skb, ATH_TM_ATTR_WMI_CMDID, cmd_id) ||
	    nla_put(nl_skb, ATH_TM_ATTR_DATA, data_pos,
		    &ab->testmode.eventdata[0])) {
		ath11k_warn(ab, "failed to populate segmented testmode event");
		kfree_skb(nl_skb);
@@ -235,23 +235,23 @@ static int ath11k_tm_cmd_get_version(struct ath11k *ar, struct nlattr *tb[])

	ath11k_dbg(ar->ab, ATH11K_DBG_TESTMODE,
		   "cmd get version_major %d version_minor %d\n",
		   ATH11K_TESTMODE_VERSION_MAJOR,
		   ATH11K_TESTMODE_VERSION_MINOR);
		   ATH_TESTMODE_VERSION_MAJOR,
		   ATH_TESTMODE_VERSION_MINOR);

	skb = cfg80211_testmode_alloc_reply_skb(ar->hw->wiphy,
						nla_total_size(sizeof(u32)));
	if (!skb)
		return -ENOMEM;

	ret = nla_put_u32(skb, ATH11K_TM_ATTR_VERSION_MAJOR,
			  ATH11K_TESTMODE_VERSION_MAJOR);
	ret = nla_put_u32(skb, ATH_TM_ATTR_VERSION_MAJOR,
			  ATH_TESTMODE_VERSION_MAJOR);
	if (ret) {
		kfree_skb(skb);
		return ret;
	}

	ret = nla_put_u32(skb, ATH11K_TM_ATTR_VERSION_MINOR,
			  ATH11K_TESTMODE_VERSION_MINOR);
	ret = nla_put_u32(skb, ATH_TM_ATTR_VERSION_MINOR,
			  ATH_TESTMODE_VERSION_MINOR);
	if (ret) {
		kfree_skb(skb);
		return ret;
@@ -277,7 +277,7 @@ static int ath11k_tm_cmd_testmode_start(struct ath11k *ar, struct nlattr *tb[])
		goto err;
	}

	ar->ab->testmode.eventdata = kzalloc(ATH11K_FTM_EVENT_MAX_BUF_LENGTH,
	ar->ab->testmode.eventdata = kzalloc(ATH_FTM_EVENT_MAX_BUF_LENGTH,
					     GFP_KERNEL);
	if (!ar->ab->testmode.eventdata) {
		ret = -ENOMEM;
@@ -310,25 +310,25 @@ static int ath11k_tm_cmd_wmi(struct ath11k *ar, struct nlattr *tb[],

	mutex_lock(&ar->conf_mutex);

	if (!tb[ATH11K_TM_ATTR_DATA]) {
	if (!tb[ATH_TM_ATTR_DATA]) {
		ret = -EINVAL;
		goto out;
	}

	if (!tb[ATH11K_TM_ATTR_WMI_CMDID]) {
	if (!tb[ATH_TM_ATTR_WMI_CMDID]) {
		ret = -EINVAL;
		goto out;
	}

	buf = nla_data(tb[ATH11K_TM_ATTR_DATA]);
	buf_len = nla_len(tb[ATH11K_TM_ATTR_DATA]);
	buf = nla_data(tb[ATH_TM_ATTR_DATA]);
	buf_len = nla_len(tb[ATH_TM_ATTR_DATA]);
	if (!buf_len) {
		ath11k_warn(ar->ab, "No data present in testmode wmi command\n");
		ret = -EINVAL;
		goto out;
	}

	cmd_id = nla_get_u32(tb[ATH11K_TM_ATTR_WMI_CMDID]);
	cmd_id = nla_get_u32(tb[ATH_TM_ATTR_WMI_CMDID]);

	/* Make sure that the buffer length is long enough to
	 * hold TLV and pdev/vdev id.
@@ -409,13 +409,13 @@ static int ath11k_tm_cmd_wmi_ftm(struct ath11k *ar, struct nlattr *tb[])
		goto out;
	}

	if (!tb[ATH11K_TM_ATTR_DATA]) {
	if (!tb[ATH_TM_ATTR_DATA]) {
		ret = -EINVAL;
		goto out;
	}

	buf = nla_data(tb[ATH11K_TM_ATTR_DATA]);
	buf_len = nla_len(tb[ATH11K_TM_ATTR_DATA]);
	buf = nla_data(tb[ATH_TM_ATTR_DATA]);
	buf_len = nla_len(tb[ATH_TM_ATTR_DATA]);
	cmd_id = WMI_PDEV_UTF_CMDID;

	ath11k_dbg(ar->ab, ATH11K_DBG_TESTMODE,
@@ -476,25 +476,25 @@ int ath11k_tm_cmd(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
		  void *data, int len)
{
	struct ath11k *ar = hw->priv;
	struct nlattr *tb[ATH11K_TM_ATTR_MAX + 1];
	struct nlattr *tb[ATH_TM_ATTR_MAX + 1];
	int ret;

	ret = nla_parse(tb, ATH11K_TM_ATTR_MAX, data, len, ath11k_tm_policy,
	ret = nla_parse(tb, ATH_TM_ATTR_MAX, data, len, ath11k_tm_policy,
			NULL);
	if (ret)
		return ret;

	if (!tb[ATH11K_TM_ATTR_CMD])
	if (!tb[ATH_TM_ATTR_CMD])
		return -EINVAL;

	switch (nla_get_u32(tb[ATH11K_TM_ATTR_CMD])) {
	case ATH11K_TM_CMD_GET_VERSION:
	switch (nla_get_u32(tb[ATH_TM_ATTR_CMD])) {
	case ATH_TM_CMD_GET_VERSION:
		return ath11k_tm_cmd_get_version(ar, tb);
	case ATH11K_TM_CMD_WMI:
	case ATH_TM_CMD_WMI:
		return ath11k_tm_cmd_wmi(ar, tb, vif);
	case ATH11K_TM_CMD_TESTMODE_START:
	case ATH_TM_CMD_TESTMODE_START:
		return ath11k_tm_cmd_testmode_start(ar, tb);
	case ATH11K_TM_CMD_WMI_FTM:
	case ATH_TM_CMD_WMI_FTM:
		return ath11k_tm_cmd_wmi_ftm(ar, tb);
	default:
		return -EOPNOTSUPP;
+27 −27
Original line number Diff line number Diff line
/* SPDX-License-Identifier: BSD-3-Clause-Clear */
/*
 * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
 * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
 * Copyright (c) 2023-2025 Qualcomm Innovation Center, Inc. All rights reserved.
 */

/* "API" level of the ath11k testmode interface. Bump it after every
/* "API" level of the ath testmode interface. Bump it after every
 * incompatible interface change.
 */
#define ATH11K_TESTMODE_VERSION_MAJOR 1
#define ATH_TESTMODE_VERSION_MAJOR 1

/* Bump this after every _compatible_ interface change, for example
 * addition of a new command or an attribute.
 */
#define ATH11K_TESTMODE_VERSION_MINOR 1
#define ATH_TESTMODE_VERSION_MINOR 1

#define ATH11K_TM_DATA_MAX_LEN		5000
#define ATH11K_FTM_EVENT_MAX_BUF_LENGTH 2048
#define ATH_TM_DATA_MAX_LEN		5000
#define ATH_FTM_EVENT_MAX_BUF_LENGTH	2048

enum ath11k_tm_attr {
	__ATH11K_TM_ATTR_INVALID		= 0,
	ATH11K_TM_ATTR_CMD			= 1,
	ATH11K_TM_ATTR_DATA			= 2,
	ATH11K_TM_ATTR_WMI_CMDID		= 3,
	ATH11K_TM_ATTR_VERSION_MAJOR		= 4,
	ATH11K_TM_ATTR_VERSION_MINOR		= 5,
	ATH11K_TM_ATTR_WMI_OP_VERSION		= 6,
enum ath_tm_attr {
	__ATH_TM_ATTR_INVALID		= 0,
	ATH_TM_ATTR_CMD			= 1,
	ATH_TM_ATTR_DATA		= 2,
	ATH_TM_ATTR_WMI_CMDID		= 3,
	ATH_TM_ATTR_VERSION_MAJOR	= 4,
	ATH_TM_ATTR_VERSION_MINOR	= 5,
	ATH_TM_ATTR_WMI_OP_VERSION	= 6,

	/* keep last */
	__ATH11K_TM_ATTR_AFTER_LAST,
	ATH11K_TM_ATTR_MAX		= __ATH11K_TM_ATTR_AFTER_LAST - 1,
	__ATH_TM_ATTR_AFTER_LAST,
	ATH_TM_ATTR_MAX			= __ATH_TM_ATTR_AFTER_LAST - 1,
};

/* All ath11k testmode interface commands specified in
 * ATH11K_TM_ATTR_CMD
/* All ath testmode interface commands specified in
 * ATH_TM_ATTR_CMD
 */
enum ath11k_tm_cmd {
	/* Returns the supported ath11k testmode interface version in
	 * ATH11K_TM_ATTR_VERSION. Always guaranteed to work. User space
enum ath_tm_cmd {
	/* Returns the supported ath testmode interface version in
	 * ATH_TM_ATTR_VERSION. Always guaranteed to work. User space
	 * uses this to verify it's using the correct version of the
	 * testmode interface
	 */
	ATH11K_TM_CMD_GET_VERSION = 0,
	ATH_TM_CMD_GET_VERSION = 0,

	/* The command used to transmit a WMI command to the firmware and
	 * the event to receive WMI events from the firmware. Without
	 * struct wmi_cmd_hdr header, only the WMI payload. Command id is
	 * provided with ATH11K_TM_ATTR_WMI_CMDID and payload in
	 * ATH11K_TM_ATTR_DATA.
	 * provided with ATH_TM_ATTR_WMI_CMDID and payload in
	 * ATH_TM_ATTR_DATA.
	 */
	ATH11K_TM_CMD_WMI = 1,
	ATH_TM_CMD_WMI = 1,

	/* Boots the UTF firmware, the netdev interface must be down at the
	 * time.
	 */
	ATH11K_TM_CMD_TESTMODE_START = 2,
	ATH_TM_CMD_TESTMODE_START = 2,

	/* The command used to transmit a FTM WMI command to the firmware
	 * and the event to receive WMI events from the firmware. The data
@@ -62,5 +62,5 @@ enum ath11k_tm_cmd {
	 * The data payload size could be large and the driver needs to
	 * send segmented data to firmware.
	 */
	ATH11K_TM_CMD_WMI_FTM = 3,
	ATH_TM_CMD_WMI_FTM = 3,
};