/*
 * Copyright (c) 2017-2020 Nordic Semiconductor ASA
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include <stddef.h>
#include <string.h>

#include <toolchain.h>

#include <soc.h>

#include "hal/cpu.h"
#include "hal/cntr.h"
#include "hal/ccm.h"
#include "hal/radio.h"
#include "hal/radio_df.h"

#include "util/memq.h"
#include "util/util.h"
#include "util/dbuf.h"

#include "pdu.h"

#include "lll.h"
#include "lll_clock.h"
#include "lll_internal.h"

#if defined(CONFIG_BT_CTLR_DF)
#include "lll_df_types.h"
#include "lll_df.h"
#endif /* CONFIG_BT_CTLR_DF */

#include "ll_test.h"

#if defined(CONFIG_BT_CTLR_DTM_HCI_DF_IQ_REPORT)
#include "ull_df_types.h"
#include "ull_df_internal.h"
#endif /* CONFIG_BT_CTLR_DTM_HCI_DF_IQ_REPORT */

#define BT_DBG_ENABLED IS_ENABLED(CONFIG_BT_DEBUG_HCI_DRIVER)
#define LOG_MODULE_NAME bt_ctlr_lll_test
#include "common/log.h"
#include "hal/debug.h"

#define CNTR_MIN_DELTA 3

/* Helper definitions for repeated payload sequence */
#define PAYLOAD_11110000 0x0f
#define PAYLOAD_10101010 0x55
#define PAYLOAD_11111111 0xff
#define PAYLOAD_00000000 0x00
#define PAYLOAD_00001111 0xf0
#define PAYLOAD_01010101 0xaa

static const uint32_t test_sync_word = 0x71764129;
static uint8_t        test_phy;
static uint8_t        test_phy_flags;

#if defined(CONFIG_BT_CTLR_DF_CTE_RX)
static uint8_t        test_cte_type;
#endif /* CONFIG_BT_CTLR_DF_CTE_RX */

#if defined(CONFIG_BT_CTLR_DF_CTE_TX) || defined(CONFIG_BT_CTLR_DF_CTE_RX)
static uint8_t        test_cte_len;
#endif  /* CONFIG_BT_CTLR_DF_CTE_TX || CONFIG_BT_CTLR_DF_CTE_RX */

#if defined(CONFIG_BT_CTLR_DTM_HCI_DF_IQ_REPORT)
static uint8_t        test_chan;
static uint8_t        test_slot_duration;
#endif /* CONFIG_BT_CTLR_DTM_HCI_DF_IQ_REPORT */

static uint32_t    tx_tifs;
static uint16_t    test_num_rx;
static bool        started;

/* NOTE: The PRBS9 sequence used as packet payload.
 * The bytes in the sequence are in the right order, but the bits of each byte
 * in the array are reverse from that found by running the PRBS9 algorithm. This
 * is done to transmit MSbit first on air.
 */

static const uint8_t prbs9[] = {
	0xFF, 0xC1, 0xFB, 0xE8, 0x4C, 0x90, 0x72, 0x8B,
	0xE7, 0xB3, 0x51, 0x89, 0x63, 0xAB, 0x23, 0x23,
	0x02, 0x84, 0x18, 0x72, 0xAA, 0x61, 0x2F, 0x3B,
	0x51, 0xA8, 0xE5, 0x37, 0x49, 0xFB, 0xC9, 0xCA,
	0x0C, 0x18, 0x53, 0x2C, 0xFD, 0x45, 0xE3, 0x9A,
	0xE6, 0xF1, 0x5D, 0xB0, 0xB6, 0x1B, 0xB4, 0xBE,
	0x2A, 0x50, 0xEA, 0xE9, 0x0E, 0x9C, 0x4B, 0x5E,
	0x57, 0x24, 0xCC, 0xA1, 0xB7, 0x59, 0xB8, 0x87,
	0xFF, 0xE0, 0x7D, 0x74, 0x26, 0x48, 0xB9, 0xC5,
	0xF3, 0xD9, 0xA8, 0xC4, 0xB1, 0xD5, 0x91, 0x11,
	0x01, 0x42, 0x0C, 0x39, 0xD5, 0xB0, 0x97, 0x9D,
	0x28, 0xD4, 0xF2, 0x9B, 0xA4, 0xFD, 0x64, 0x65,
	0x06, 0x8C, 0x29, 0x96, 0xFE, 0xA2, 0x71, 0x4D,
	0xF3, 0xF8, 0x2E, 0x58, 0xDB, 0x0D, 0x5A, 0x5F,
	0x15, 0x28, 0xF5, 0x74, 0x07, 0xCE, 0x25, 0xAF,
	0x2B, 0x12, 0xE6, 0xD0, 0xDB, 0x2C, 0xDC, 0xC3,
	0x7F, 0xF0, 0x3E, 0x3A, 0x13, 0xA4, 0xDC, 0xE2,
	0xF9, 0x6C, 0x54, 0xE2, 0xD8, 0xEA, 0xC8, 0x88,
	0x00, 0x21, 0x86, 0x9C, 0x6A, 0xD8, 0xCB, 0x4E,
	0x14, 0x6A, 0xF9, 0x4D, 0xD2, 0x7E, 0xB2, 0x32,
	0x03, 0xC6, 0x14, 0x4B, 0x7F, 0xD1, 0xB8, 0xA6,
	0x79, 0x7C, 0x17, 0xAC, 0xED, 0x06, 0xAD, 0xAF,
	0x0A, 0x94, 0x7A, 0xBA, 0x03, 0xE7, 0x92, 0xD7,
	0x15, 0x09, 0x73, 0xE8, 0x6D, 0x16, 0xEE, 0xE1,
	0x3F, 0x78, 0x1F, 0x9D, 0x09, 0x52, 0x6E, 0xF1,
	0x7C, 0x36, 0x2A, 0x71, 0x6C, 0x75, 0x64, 0x44,
	0x80, 0x10, 0x43, 0x4E, 0x35, 0xEC, 0x65, 0x27,
	0x0A, 0xB5, 0xFC, 0x26, 0x69, 0x3F, 0x59, 0x99,
	0x01, 0x63, 0x8A, 0xA5, 0xBF, 0x68, 0x5C, 0xD3,
	0x3C, 0xBE, 0x0B, 0xD6, 0x76, 0x83, 0xD6, 0x57,
	0x05, 0x4A, 0x3D, 0xDD, 0x81, 0x73, 0xC9, 0xEB,
	0x8A, 0x84, 0x39, 0xF4, 0x36, 0x0B, 0xF7};

/* TODO: fill correct prbs15 */
static const uint8_t prbs15[255] = { 0x00, };

static uint8_t tx_req;
static uint8_t volatile tx_ack;

#if defined(CONFIG_BT_CTLR_DF_CTE_RX)
static bool check_rx_cte(bool cte_ready);
#endif /* CONFIG_BT_CTLR_DF_CTE_RX */

#if defined(CONFIG_BT_CTLR_DTM_HCI_DF_IQ_REPORT)
static int create_iq_report(bool crc_ok)
{
	struct node_rx_iq_report *iq_report;
	struct node_rx_ftr *ftr;
	uint8_t sample_cnt;
	uint8_t cte_info;
	uint8_t ant;

	sample_cnt = radio_df_iq_samples_amount_get();

	/* If there are no samples available, the CTEInfo was
	 * not detected and sampling was not started.
	 */
	if (!sample_cnt) {
		return -EINVAL;
	}

	cte_info = radio_df_cte_status_get();
	ant = radio_df_pdu_antenna_switch_pattern_get();
	iq_report = ull_df_iq_report_alloc();
	if (!iq_report) {
		return -ENOBUFS;
	}

	iq_report->hdr.type = NODE_RX_TYPE_DTM_IQ_SAMPLE_REPORT;
	iq_report->sample_count = sample_cnt;
	iq_report->packet_status = ((crc_ok) ? BT_HCI_LE_CTE_CRC_OK :
					       BT_HCI_LE_CTE_CRC_ERR_CTE_BASED_TIME);
	iq_report->rssi_ant_id = ant;
	iq_report->cte_info = *(struct pdu_cte_info *)&cte_info;
	iq_report->local_slot_durations = test_slot_duration;
	iq_report->chan_idx = test_chan;

	ftr = &iq_report->hdr.rx_ftr;
	ftr->param = NULL;
	ftr->rssi = BT_HCI_LE_RSSI_NOT_AVAILABLE;

	ull_rx_put(iq_report->hdr.link, iq_report);

	return 0;
}
#endif /* CONFIG_BT_CTLR_DTM_HCI_DF_IQ_REPORT */

static void isr_tx(void *param)
{
	/* Clear radio status and events */
	radio_status_reset();
	radio_tmr_status_reset();

#if defined(HAL_RADIO_GPIO_HAVE_PA_PIN)
	radio_gpio_pa_lna_disable();
#endif /* HAL_RADIO_GPIO_HAVE_PA_PIN */

	/* Exit if radio disabled */
	if (((tx_req - tx_ack) & 0x01) == 0U) {
		tx_ack = tx_req;

		return;
	}

	/* Setup next Tx */
	radio_tmr_tifs_set(tx_tifs);
	radio_switch_complete_and_b2b_tx(test_phy, test_phy_flags, test_phy, test_phy_flags);

	radio_tmr_end_capture();

#if defined(HAL_RADIO_GPIO_HAVE_PA_PIN)
	radio_gpio_pa_setup();
	radio_gpio_pa_lna_enable(radio_tmr_tifs_base_get() +
				 tx_tifs -
				 radio_tx_ready_delay_get(test_phy, test_phy_flags) -
				 HAL_RADIO_GPIO_PA_OFFSET);
#endif /* HAL_RADIO_GPIO_HAVE_PA_PIN */
}

static void isr_rx(void *param)
{
	uint8_t crc_ok = 0U;
	uint8_t trx_done;

#if defined(CONFIG_BT_CTLR_DTM_HCI_DF_IQ_REPORT)
	struct node_rx_iq_report *node_rx;
#endif /* CONFIG_BT_CTLR_DTM_HCI_DF_IQ_REPORT */

#if defined(CONFIG_BT_CTLR_DF_CTE_RX)
	bool cte_ready;
	bool cte_ok = 0;
#endif /* CONFIG_BT_CTLR_DF_CTE_RX */

	/* Read radio status and events */
	trx_done = radio_is_done();
	if (trx_done) {
		crc_ok = radio_crc_is_valid();
#if defined(CONFIG_BT_CTLR_DF_CTE_RX)
		cte_ready = radio_df_cte_ready();
#endif /* CONFIG_BT_CTLR_DF_CTE_RX */
	}

	/* Clear radio status and events */
	radio_status_reset();
	radio_tmr_status_reset();

	/* Exit if radio disabled */
	if (!trx_done) {
		return;
	}

#if defined(CONFIG_BT_CTLR_DTM_HCI_DF_IQ_REPORT)
	if (test_cte_len > 0) {
		/* Get free iq report node for next Rx operation. */
		node_rx = ull_df_iq_report_alloc_peek(1);
		LL_ASSERT(node_rx);

		radio_df_iq_data_packet_set(node_rx->pdu, IQ_SAMPLE_TOTAL_CNT);
	}
#endif /* CONFIG_BT_CTLR_DTM_HCI_DF_IQ_REPORT */

	/* Setup next Rx */
	radio_tmr_tifs_set(EVENT_IFS_US);
	radio_switch_complete_and_b2b_rx(test_phy, test_phy_flags, test_phy, test_phy_flags);

	/* Count Rx-ed packets */
	if (crc_ok) {

#if defined(CONFIG_BT_CTLR_DF_CTE_RX)
		if (test_cte_len > 0) {
			cte_ok = check_rx_cte(cte_ready);
			if (cte_ok) {
				test_num_rx++;
			}
		} else
#endif /* CONFIG_BT_CTLR_DF_CTE_RX */

		{
			test_num_rx++;
		}
	}

#if defined(CONFIG_BT_CTLR_DTM_HCI_DF_IQ_REPORT)
	if (cte_ok) {
		int err;

		err = create_iq_report(crc_ok);
		if (!err) {
			ull_rx_sched();
		}
	}
#endif
}

static uint8_t tx_power_check(int8_t tx_power)
{
	if ((tx_power != BT_HCI_TX_TEST_POWER_MIN_SET) &&
	    (tx_power != BT_HCI_TX_TEST_POWER_MAX_SET) &&
	    ((tx_power < BT_HCI_TX_TEST_POWER_MIN) || (tx_power > BT_HCI_TX_TEST_POWER_MAX))) {
		return BT_HCI_ERR_UNSUPP_FEATURE_PARAM_VAL;
	}

	return BT_HCI_ERR_SUCCESS;
}

static uint8_t tx_power_set(int8_t tx_power)
{
	uint8_t err;

	err = tx_power_check(tx_power);
	if (err) {
		return err;
	}

	if (tx_power == BT_HCI_TX_TEST_POWER_MAX_SET) {
		tx_power = radio_tx_power_max_get();
	} else if (tx_power == BT_HCI_TX_TEST_POWER_MIN_SET) {
		tx_power = radio_tx_power_min_get();
	} else {
		tx_power = radio_tx_power_floor(tx_power);
	}

	radio_tx_power_set(tx_power);

	return err;
}

#if defined(CONFIG_BT_CTLR_DF_CTE_TX)
static uint8_t cte_tx_parameters_check(uint8_t cte_len, uint8_t cte_type,
					uint8_t switch_pattern_len)
{
	if ((cte_type > BT_HCI_LE_AOD_CTE_2US) ||
	    (cte_len < BT_HCI_LE_CTE_LEN_MIN) ||
	    (cte_len > BT_HCI_LE_CTE_LEN_MAX)) {
		return BT_HCI_ERR_UNSUPP_FEATURE_PARAM_VAL;
	}

	if (cte_type != BT_HCI_LE_AOA_CTE) {
		if ((switch_pattern_len < BT_HCI_LE_SWITCH_PATTERN_LEN_MIN) ||
		    (switch_pattern_len > BT_HCI_LE_SWITCH_PATTERN_LEN_MAX)) {
			return BT_HCI_ERR_UNSUPP_FEATURE_PARAM_VAL;
		}
	}

	if ((cte_type == BT_HCI_LE_AOD_CTE_1US) &&
	    !IS_ENABLED(CONFIG_BT_CTLR_DF_ANT_SWITCH_1US)) {
		return BT_HCI_ERR_UNSUPP_FEATURE_PARAM_VAL;
	}

	return BT_HCI_ERR_SUCCESS;
}

static uint8_t cte_tx_init(uint8_t cte_len, uint8_t cte_type, uint8_t switch_pattern_len,
			   const uint8_t *ant_id)
{
	uint8_t err;

	err = cte_tx_parameters_check(cte_len, cte_type, switch_pattern_len);
	if (err) {
		return err;
	}

	if (cte_type == BT_HCI_LE_AOA_CTE) {
		radio_df_mode_set_aoa();
		radio_df_cte_tx_aoa_set(cte_len);
	} else {
#if defined(CONFIG_BT_CTLR_DF_ANT_SWITCH_TX)
		radio_df_mode_set_aod();

		if (cte_type == BT_HCI_LE_AOD_CTE_1US) {
			radio_df_cte_tx_aod_2us_set(cte_len);
		} else {
			radio_df_cte_tx_aod_4us_set(cte_len);
		}

		radio_df_ant_switching_pin_sel_cfg();
		radio_df_ant_switch_pattern_clear();
		radio_df_ant_switch_pattern_set(ant_id, switch_pattern_len);
#else
		return BT_HCI_ERR_UNSUPP_FEATURE_PARAM_VAL;
#endif /* CONFIG_BT_CTLR_DF_ANT_SWITCH_TX */
	}

	return err;
}
#endif /* CONFIG_BT_CTLR_DF_CTE_TX */

#if defined(CONFIG_BT_CTLR_DF_CTE_RX)
static uint8_t cte_rx_parameters_check(uint8_t expected_cte_len, uint8_t expected_cte_type,
					uint8_t slot_duration, uint8_t switch_pattern_len)
{
	if ((expected_cte_type > BT_HCI_LE_AOD_CTE_2US) ||
	    (expected_cte_len < BT_HCI_LE_CTE_LEN_MIN) ||
	    (expected_cte_len > BT_HCI_LE_CTE_LEN_MAX)) {
		return BT_HCI_ERR_UNSUPP_FEATURE_PARAM_VAL;
	}

	if (expected_cte_type == BT_HCI_LE_AOA_CTE) {
		if ((switch_pattern_len < BT_HCI_LE_SWITCH_PATTERN_LEN_MIN) ||
		    (switch_pattern_len > BT_HCI_LE_SWITCH_PATTERN_LEN_MAX)) {
			return BT_HCI_ERR_UNSUPP_FEATURE_PARAM_VAL;
		}

		if ((slot_duration == 0) ||
		    (slot_duration > BT_HCI_LE_ANTENNA_SWITCHING_SLOT_2US)) {
			return BT_HCI_ERR_UNSUPP_FEATURE_PARAM_VAL;
		}
	}

	if ((slot_duration == BT_HCI_LE_ANTENNA_SWITCHING_SLOT_1US) &&
	    (!IS_ENABLED(CONFIG_BT_CTLR_DF_CTE_RX_SAMPLE_1US))) {
		return BT_HCI_ERR_UNSUPP_FEATURE_PARAM_VAL;
	}

	return BT_HCI_ERR_SUCCESS;
}

static uint8_t cte_rx_init(uint8_t expected_cte_len, uint8_t expected_cte_type,
			   uint8_t slot_duration, uint8_t switch_pattern_len,
			   const uint8_t *ant_ids, uint8_t phy)
{
	uint8_t err;
	uint8_t cte_phy = (phy == BT_HCI_LE_RX_PHY_1M) ? PHY_1M : PHY_2M;

	err = cte_rx_parameters_check(expected_cte_len, expected_cte_type,
				      slot_duration, switch_pattern_len);
	if (err) {
		return err;
	}

	if (slot_duration == BT_HCI_LE_ANTENNA_SWITCHING_SLOT_1US) {
#if defined(CONFIG_BT_CTLR_DF_ANT_SWITCH_1US)
		radio_df_cte_rx_2us_switching(true, cte_phy);
#else
		return BT_HCI_ERR_UNSUPP_FEATURE_PARAM_VAL;
#endif /* CONFIG_BT_CTLR_DF_ANT_SWITCH_1US */
	} else {
		radio_df_cte_rx_4us_switching(true, cte_phy);
	}

#if defined(CONFIG_BT_CTLR_DF_ANT_SWITCH_RX)
	radio_df_ant_switching_pin_sel_cfg();
	radio_df_ant_switch_pattern_clear();
	radio_df_ant_switch_pattern_set(ant_ids, switch_pattern_len);
#else
	return BT_HCI_ERR_UNSUPP_FEATURE_PARAM_VAL;
#endif /* CONFIG_BT_CTLR_DF_ANT_SWITCH_RX */

#if defined(CONFIG_BT_CTLR_DTM_HCI_DF_IQ_REPORT)
	struct node_rx_iq_report *node_rx;

	node_rx = ull_df_iq_report_alloc_peek(1);
	LL_ASSERT(node_rx);

	radio_df_iq_data_packet_set(node_rx->pdu, IQ_SAMPLE_TOTAL_CNT);
#else
	radio_df_iq_data_packet_set(NULL, 0);
#endif

	return err;
}

static bool check_rx_cte(bool cte_ready)
{
	uint8_t cte_status;
	struct pdu_cte_info *cte_info;

	cte_status = radio_df_cte_status_get();
	cte_info = (struct pdu_cte_info *)&cte_status;

	if ((cte_info->type != test_cte_type) || (cte_info->time != test_cte_len)) {
		return false;
	}

	return true;
}
#endif /* CONFIG_BT_CTLR_DF_CTE_RX */

static uint32_t calculate_tifs(uint8_t len)
{
	uint32_t interval;
	uint32_t transmit_time;

#if defined(CONFIG_BT_CTLR_DF_CTE_TX)
	/* Include additional byte for the CTEInfo field and CTE length in microseconds. */
	transmit_time = PDU_US((test_cte_len > 0) ? (len + 1) : len, 0, test_phy, test_phy_flags) +
			CTE_LEN_US(test_cte_len);
#else
	transmit_time = PDU_US(len, 0, test_phy, test_phy_flags);
#endif /* CONFIG_BT_CTLR_DF_CTE_TX */

	/* Ble Core Specification Vol 6 Part F 4.1.6
	 * LE Test packet interval: I(L) = ceil((L + 249) / 625) * 625 us
	 * where L is an LE Test packet length in microseconds unit.
	 */
	interval = ceiling_fraction((transmit_time + 249), SCAN_INT_UNIT_US) * SCAN_INT_UNIT_US;

	return interval - transmit_time;
}

static uint8_t init(uint8_t chan, uint8_t phy, int8_t tx_power,
		    bool cte, void (*isr)(void *))
{
	int err;
	uint8_t ret;

	if (started) {
		return BT_HCI_ERR_CMD_DISALLOWED;
	}

	/* start coarse timer */
	cntr_start();

	/* Setup resources required by Radio */
	err = lll_hfclock_on_wait();
	LL_ASSERT(err >= 0);

	/* Reset Radio h/w */
	radio_reset();
	radio_isr_set(isr, NULL);

#if defined(CONFIG_BT_CTLR_DF)
	/* Reset  Radio DF */
	radio_df_reset();
#endif

	/* Store value needed in Tx/Rx ISR */
	if (phy < BT_HCI_LE_TX_PHY_CODED_S2) {
		test_phy = BIT(phy - 1);
		test_phy_flags = 1U;
	} else {
		test_phy = BIT(2);
		test_phy_flags = 0U;
	}

	/* Setup Radio in Tx/Rx */
	/* NOTE: No whitening in test mode. */
	radio_phy_set(test_phy, test_phy_flags);

	ret = tx_power_set(tx_power);

	radio_freq_chan_set((chan << 1) + 2);
	radio_aa_set((uint8_t *)&test_sync_word);
	radio_crc_configure(0x65b, PDU_AC_CRC_IV);
	radio_pkt_configure(RADIO_PKT_CONF_LENGTH_8BIT, PDU_DTM_PAYLOAD_SIZE_MAX,
			    RADIO_PKT_CONF_PHY(test_phy) |
			    RADIO_PKT_CONF_PDU_TYPE(IS_ENABLED(CONFIG_BT_CTLR_DF_CTE_TX) ?
								RADIO_PKT_CONF_PDU_TYPE_DC :
								RADIO_PKT_CONF_PDU_TYPE_AC) |
			    RADIO_PKT_CONF_CTE(cte ? RADIO_PKT_CONF_CTE_ENABLED :
						     RADIO_PKT_CONF_CTE_DISABLED));

	return ret;
}

static void payload_set(uint8_t type, uint8_t len, uint8_t cte_len, uint8_t cte_type)
{
	struct pdu_dtm *pdu = radio_pkt_scratch_get();

	pdu->type = type;
	pdu->length = len;

#if defined(CONFIG_BT_CTLR_DF_CTE_TX)
	pdu->cp = cte_len ? 1U : 0U;
	pdu->cte_info.time = cte_len;
	pdu->cte_info.type = cte_type;
#else
	ARG_UNUSED(cte_len);
	ARG_UNUSED(cte_type);
#endif /* CONFIG_BT_CTLR_DF_CTE_TX */

	switch (type) {
	case BT_HCI_TEST_PKT_PAYLOAD_PRBS9:
		(void)memcpy(pdu->payload, prbs9, len);
		break;

	case BT_HCI_TEST_PKT_PAYLOAD_11110000:
		(void)memset(pdu->payload, PAYLOAD_11110000, len);
		break;

	case BT_HCI_TEST_PKT_PAYLOAD_10101010:
		(void)memset(pdu->payload, PAYLOAD_10101010, len);
		break;

	case BT_HCI_TEST_PKT_PAYLOAD_PRBS15:
		(void)memcpy(pdu->payload, prbs15, len);
		break;

	case BT_HCI_TEST_PKT_PAYLOAD_11111111:
		(void)memset(pdu->payload, PAYLOAD_11111111, len);
		break;

	case BT_HCI_TEST_PKT_PAYLOAD_00000000:
		(void)memset(pdu->payload, PAYLOAD_00000000, len);
		break;

	case BT_HCI_TEST_PKT_PAYLOAD_00001111:
		(void)memset(pdu->payload, PAYLOAD_00001111, len);
		break;

	case BT_HCI_TEST_PKT_PAYLOAD_01010101:
		(void)memset(pdu->payload, PAYLOAD_01010101, len);
		break;
	}

	radio_pkt_tx_set(pdu);
}

uint8_t ll_test_tx(uint8_t chan, uint8_t len, uint8_t type, uint8_t phy,
		   uint8_t cte_len, uint8_t cte_type, uint8_t switch_pattern_len,
		   const uint8_t *ant_id, int8_t tx_power)
{
	uint32_t start_us;
	uint8_t err;
	const bool cte_request = (cte_len > 0) ? true : false;

	if ((type > BT_HCI_TEST_PKT_PAYLOAD_01010101) || !phy ||
	    (phy > BT_HCI_LE_TX_PHY_CODED_S2)) {
		return BT_HCI_ERR_UNSUPP_FEATURE_PARAM_VAL;
	}

	err = init(chan, phy, tx_power, cte_request, isr_tx);
	if (err) {
		return err;
	}

	/* Configure Constant Tone Extension */
	if (cte_request) {
#if defined(CONFIG_BT_CTLR_DF_CTE_TX)
		if (phy > BT_HCI_LE_TX_PHY_2M) {
			return BT_HCI_ERR_CMD_DISALLOWED;
		}

		err = cte_tx_init(cte_len, cte_type, switch_pattern_len, ant_id);
		if (err) {
			return err;
		}
#else
		return BT_HCI_ERR_CMD_DISALLOWED;
#endif /* CONFIG_BT_CTLR_DF_CTE_TX */
	}

	tx_req++;

	payload_set(type, len, cte_len, cte_type);

#if defined(CONFIG_BT_CTLR_DF_CTE_TX)
	/* Store CTE parameters needed in Tx ISR */
	test_cte_len = cte_len;
#endif /* CONFIG_BT_CTLR_DF_CTE_TX */

	tx_tifs = calculate_tifs(len);

	radio_tmr_tifs_set(tx_tifs);
	radio_switch_complete_and_b2b_tx(test_phy, test_phy_flags, test_phy, test_phy_flags);

	start_us = radio_tmr_start(1, cntr_cnt_get() + CNTR_MIN_DELTA, 0);
	radio_tmr_end_capture();

#if defined(HAL_RADIO_GPIO_HAVE_PA_PIN)
	radio_gpio_pa_setup();
	radio_gpio_pa_lna_enable(start_us +
				 radio_tx_ready_delay_get(test_phy,
							  test_phy_flags) -
				 HAL_RADIO_GPIO_PA_OFFSET);
#else /* !HAL_RADIO_GPIO_HAVE_PA_PIN */
	ARG_UNUSED(start_us);
#endif /* !HAL_RADIO_GPIO_HAVE_PA_PIN */

	started = true;

	return BT_HCI_ERR_SUCCESS;
}

uint8_t ll_test_rx(uint8_t chan, uint8_t phy, uint8_t mod_idx, uint8_t expected_cte_len,
		   uint8_t expected_cte_type, uint8_t slot_duration, uint8_t switch_pattern_len,
		   const uint8_t *ant_ids)
{
	uint8_t err;
	const bool cte_expected = (expected_cte_len > 0) ? true : false;

	if (!phy || (phy > BT_HCI_LE_RX_PHY_CODED)) {
		return BT_HCI_ERR_UNSUPP_FEATURE_PARAM_VAL;
	}

	err = init(chan, phy, BT_HCI_TX_TEST_POWER_MAX_SET, cte_expected, isr_rx);
	if (err) {
		return err;
	}

	if (cte_expected) {
#if defined(CONFIG_BT_CTLR_DF_CTE_RX)
		if (phy == BT_HCI_LE_RX_PHY_CODED) {
			return BT_HCI_ERR_CMD_DISALLOWED;
		}

		err = cte_rx_init(expected_cte_len, expected_cte_type, slot_duration,
				  switch_pattern_len, ant_ids, phy);
		if (err) {
			return err;
		}
#else
		return BT_HCI_ERR_CMD_DISALLOWED;
#endif /* CONFIG_BT_CTLR_DF_CTE_RX */
	}

#if defined(CONFIG_BT_CTLR_DF_CTE_RX)
	/* Store CTE parameters needed in Rx ISR */
	test_cte_type = expected_cte_type;
	test_cte_len = expected_cte_len;
#endif /* CONFIG_BT_CTLR_DF_CTE_RX */

#if defined(CONFIG_BT_CTLR_DTM_HCI_DF_IQ_REPORT)
	test_chan = chan;
	test_slot_duration = slot_duration;
#endif /* CONFIG_BT_CTLR_DTM_HCI_DF_IQ_REPORT */

	radio_pkt_rx_set(radio_pkt_scratch_get());
	radio_tmr_tifs_set(EVENT_IFS_US);
	radio_switch_complete_and_b2b_rx(test_phy, test_phy_flags, test_phy, test_phy_flags);
	radio_tmr_start(0, cntr_cnt_get() + CNTR_MIN_DELTA, 0);

#if defined(HAL_RADIO_GPIO_HAVE_LNA_PIN)
	radio_gpio_lna_on();
#endif /* !HAL_RADIO_GPIO_HAVE_LNA_PIN */

	started = true;

	return BT_HCI_ERR_SUCCESS;
}

uint8_t ll_test_end(uint16_t *num_rx)
{
	int err;
	uint8_t ack;

	if (!started) {
		return BT_HCI_ERR_CMD_DISALLOWED;
	}

	/* Return packets Rx-ed/Completed */
	*num_rx = test_num_rx;
	test_num_rx = 0U;

	/* Disable Radio, if in Rx test */
	ack = tx_ack;
	if (tx_req == ack) {
		radio_disable();
	} else {
		/* Wait for Tx to complete */
		tx_req = ack + 2;
		while (tx_req != tx_ack) {
			cpu_sleep();
		}
	}

	/* Stop packet timer */
	radio_tmr_stop();

	/* Release resources acquired for Radio */
	err = lll_hfclock_off();
	LL_ASSERT(err >= 0);

	/* Stop coarse timer */
	cntr_stop();

#if defined(HAL_RADIO_GPIO_HAVE_LNA_PIN)
	radio_gpio_lna_off();
#endif /* !HAL_RADIO_GPIO_HAVE_LNA_PIN */

	started = false;

	return BT_HCI_ERR_SUCCESS;
}
