Commit f7cc80b8 authored by Somashekhar Puttagangaiah's avatar Somashekhar Puttagangaiah Committed by Miri Korenblit
Browse files

wifi: iwlwifi: mld: add kunit test for emlsr with bt on



add kunit test to validate entering and exiting
emlsr scenarios when the bt is on with certain
penalty on wifi.

Signed-off-by: default avatarSomashekhar Puttagangaiah <somashekhar.puttagangaiah@intel.com>
Signed-off-by: default avatarMiri Korenblit <miriam.rachel.korenblit@intel.com>
Link: https://patch.msgid.link/20250430155443.6621494fa412.If89b4b2dab308d825ca02284dd8e0030675d7af5@changeid
parent ad883b79
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -640,7 +640,8 @@ s8 iwl_mld_get_emlsr_rssi_thresh(struct iwl_mld *mld,
#define IWL_MLD_BT_COEX_ENABLE_EMLSR_RSSI_THRESH	-63
#define IWL_MLD_BT_COEX_WIFI_LOSS_THRESH		7

static bool
VISIBLE_IF_IWLWIFI_KUNIT
bool
iwl_mld_bt_allows_emlsr(struct iwl_mld *mld, struct ieee80211_bss_conf *link,
			bool check_entry)
{
@@ -669,6 +670,7 @@ iwl_mld_bt_allows_emlsr(struct iwl_mld *mld, struct ieee80211_bss_conf *link,
		      link->link_id, bt_penalty);
	return bt_penalty < IWL_MLD_BT_COEX_WIFI_LOSS_THRESH;
}
EXPORT_SYMBOL_IF_IWLWIFI_KUNIT(iwl_mld_bt_allows_emlsr);

static u32
iwl_mld_emlsr_disallowed_with_link(struct iwl_mld *mld,
+4 −0
Original line number Diff line number Diff line
@@ -161,6 +161,10 @@ struct iwl_mld_link_sel_data {
u32 iwl_mld_emlsr_pair_state(struct ieee80211_vif *vif,
			     struct iwl_mld_link_sel_data *a,
			     struct iwl_mld_link_sel_data *b);

bool iwl_mld_bt_allows_emlsr(struct iwl_mld *mld,
			     struct ieee80211_bss_conf *link,
			     bool entry_criteria);
#endif

#endif /* __iwl_mld_mlo_h__ */
+1 −1
Original line number Diff line number Diff line
# SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
iwlmld-tests-y += module.o hcmd.o utils.o link.o rx.o agg.o link-selection.o
iwlmld-tests-y += module.o hcmd.o utils.o link.o rx.o agg.o link-selection.o emlsr_with_bt.o

ccflags-y += -I$(src)/../
obj-$(CONFIG_IWLWIFI_KUNIT_TESTS) += iwlmld-tests.o
+140 −0
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
/*
 * KUnit tests for link selection functions
 *
 * Copyright (C) 2025 Intel Corporation
 */
#include <kunit/static_stub.h>

#include "utils.h"
#include "mld.h"
#include "mlo.h"

static const struct emlsr_with_bt_test_case {
	const char *desc;
	struct {
		struct iwl_bt_coex_profile_notif notif;
		s32 signal;
		bool check_entry;
	} input;
	bool emlsr_allowed;
} emlsr_with_bt_cases[] = {
	{
		.desc = "BT penalty(exit) with low rssi 4.5: emlsr allowed",
		.input = {
			.notif.wifi_loss_low_rssi[1] = {4, 5},
			.notif.wifi_loss_mid_high_rssi[1] = {7, 9},
			.signal = -69,
			.check_entry = false,
		},
		.emlsr_allowed = true,
	},
	{
		.desc = "BT penalty(exit) from high rssi 5: emlsr allowed",
		.input = {
			.notif.wifi_loss_low_rssi[1] = {7, 9},
			.notif.wifi_loss_mid_high_rssi[1] = {5, 5},
			.signal = -68,
			.check_entry = false,
		},
		.emlsr_allowed = true,
	},
	{
		.desc = "BT penalty(exit) with low rssi 8: emlsr not allowed",
		.input = {
			.notif.wifi_loss_low_rssi[1] = {7, 9},
			.notif.wifi_loss_mid_high_rssi[1] = {4, 5},
			.signal = -69,
			.check_entry = false,
		},
		.emlsr_allowed = false,
	},
	{
		.desc = "BT penalty(exit) from high rssi 9: emlsr not allowed",
		.input = {
			.notif.wifi_loss_low_rssi[1] = {4, 5},
			.notif.wifi_loss_mid_high_rssi[1] = {9, 9},
			.signal = -68,
			.check_entry = false,
		},
		.emlsr_allowed = false,
	},
	{
		.desc = "BT penalty(entry) with low rssi 4.5: emlsr allowed",
		.input = {
			.notif.wifi_loss_low_rssi[1] = {4, 5},
			.notif.wifi_loss_mid_high_rssi[1] = {7, 9},
			.signal = -63,
			.check_entry = true,
		},
		.emlsr_allowed = true,
	},
	{
		.desc = "BT penalty(entry) from high rssi 5: emlsr allowed",
		.input = {
			.notif.wifi_loss_low_rssi[1] = {7, 9},
			.notif.wifi_loss_mid_high_rssi[1] = {5, 5},
			.signal = -62,
			.check_entry = false,
		},
		.emlsr_allowed = true,
	},
	{
		.desc = "BT penalty(entry) with low rssi 8: emlsr not allowed",
		.input = {
			.notif.wifi_loss_low_rssi[1] = {7, 9},
			.notif.wifi_loss_mid_high_rssi[1] = {4, 5},
			.signal = -63,
			.check_entry = false,
		},
		.emlsr_allowed = true,
	},
	{
		.desc = "BT penalty(entry) from high rssi 9: emlsr not allowed",
		.input = {
			.notif.wifi_loss_low_rssi[1] = {4, 5},
			.notif.wifi_loss_mid_high_rssi[1] = {9, 9},
			.signal = -62,
			.check_entry = true,
		},
		.emlsr_allowed = false,
	},
};

KUNIT_ARRAY_PARAM_DESC(emlsr_with_bt, emlsr_with_bt_cases, desc);

static void test_emlsr_with_bt(struct kunit *test)
{
	struct iwl_mld *mld = test->priv;
	const struct emlsr_with_bt_test_case *test_param =
		(const void *)(test->param_value);
	struct ieee80211_vif *vif =
		iwlmld_kunit_add_vif(true, NL80211_IFTYPE_STATION);
	struct ieee80211_bss_conf *link = iwlmld_kunit_add_link(vif, 1);
	bool actual_value = false;

	KUNIT_ALLOC_AND_ASSERT(test, link->bss);

	/* Extract test case parameters */
	link->bss->signal = DBM_TO_MBM(test_param->input.signal);
	memcpy(&mld->last_bt_notif, &test_param->input.notif,
	       sizeof(struct iwl_bt_coex_profile_notif));

	actual_value = iwl_mld_bt_allows_emlsr(mld, link,
					       test_param->input.check_entry);
	/* Assert that the returned value matches the expected emlsr_allowed */
	KUNIT_EXPECT_EQ(test, actual_value, test_param->emlsr_allowed);
}

static struct kunit_case emlsr_with_bt_test_cases[] = {
	KUNIT_CASE_PARAM(test_emlsr_with_bt, emlsr_with_bt_gen_params),
	{},
};

static struct kunit_suite emlsr_with_bt = {
	.name = "iwlmld-emlsr-with-bt-tests",
	.test_cases = emlsr_with_bt_test_cases,
	.init = iwlmld_kunit_test_init,
};

kunit_test_suite(emlsr_with_bt);