blob: 7b5aaba97245245be9aab26b2f527de0356c298e [file] [log] [blame]
/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
/*
* Copyright (C) 2013-2014, 2018, 2023 Intel Corporation
* Copyright (C) 2013-2014 Intel Mobile Communications GmbH
*/
#ifndef __IWL_TESTMODE_H__
#define __IWL_TESTMODE_H__
#ifdef CPTCFG_NL80211_TESTMODE
/**
* enum iwl_testmode_attrs - testmode attributes inside
* NL80211_ATTR_TESTDATA
* @IWL_TM_ATTR_UNSPEC: (invalid attribute)
* @IWL_TM_ATTR_CMD: sub command, see &enum iwl_testmode_commands (u32)
* @IWL_TM_ATTR_NOA_DURATION: requested NoA duration (u32)
* @IWL_TM_ATTR_BEACON_FILTER_STATE: beacon filter state (0 or 1, u32)
* @NUM_IWL_TM_ATTRS: number of attributes in the enum
* @IWL_TM_ATTR_MAX: max amount of attributes
*/
enum iwl_testmode_attrs {
IWL_TM_ATTR_UNSPEC,
IWL_TM_ATTR_CMD,
IWL_TM_ATTR_NOA_DURATION,
IWL_TM_ATTR_BEACON_FILTER_STATE,
/* keep last */
NUM_IWL_TM_ATTRS,
IWL_TM_ATTR_MAX = NUM_IWL_TM_ATTRS - 1,
};
/**
* enum iwl_testmode_commands - trans testmode commands
* @IWL_TM_CMD_SET_NOA: set NoA on GO vif for testing
* @IWL_TM_CMD_SET_BEACON_FILTER: turn beacon filtering off/on
*/
enum iwl_testmode_commands {
IWL_TM_CMD_SET_NOA,
IWL_TM_CMD_SET_BEACON_FILTER,
};
#endif
#ifdef CPTCFG_IWLWIFI_DEVICE_TESTMODE
struct iwl_host_cmd;
struct iwl_rx_cmd_buffer;
struct iwl_testmode {
struct iwl_trans *trans;
const struct iwl_fw *fw;
/* the mutex of the op_mode */
struct mutex *mutex;
void *op_mode;
int (*send_hcmd)(void *op_mode, struct iwl_host_cmd *host_cmd);
u32 fw_major_ver;
u32 fw_minor_ver;
};
/**
* struct iwl_tm_data - A data packet for testmode usages
* @data: Pointer to be casted to relevant data type
* (According to usage)
* @len: Size of data in bytes
*
* This data structure is used for sending/receiving data packets
* between internal testmode interfaces
*/
struct iwl_tm_data {
void *data;
u32 len;
};
void iwl_tm_init(struct iwl_trans *trans, const struct iwl_fw *fw,
struct mutex *mutex, void *op_mode);
void iwl_tm_set_fw_ver(struct iwl_trans *trans, u32 fw_major_ver,
u32 fw_minor_var);
int iwl_tm_execute_cmd(struct iwl_testmode *testmode, u32 cmd,
struct iwl_tm_data *data_in,
struct iwl_tm_data *data_out);
#define ADDR_IN_AL_MSK (0x80000000)
#define GET_AL_ADDR(ofs) (ofs & ~(ADDR_IN_AL_MSK))
#define IS_AL_ADDR(ofs) (!!(ofs & (ADDR_IN_AL_MSK)))
#endif
#endif /* __IWL_TESTMODE_H__ */