xref: /linux/drivers/net/wireless/intel/iwlwifi/tests/utils.c (revision 8be4d31cb8aaeea27bde4b7ddb26e28a89062ebf)
1*40840afaSBenjamin Berg // SPDX-License-Identifier: GPL-2.0-only
2*40840afaSBenjamin Berg /*
3*40840afaSBenjamin Berg  * KUnit tests for utilities
4*40840afaSBenjamin Berg  *
5*40840afaSBenjamin Berg  * Copyright (C) 2024-2025 Intel Corporation
6*40840afaSBenjamin Berg  */
7*40840afaSBenjamin Berg #include "../iwl-utils.h"
8*40840afaSBenjamin Berg #include <kunit/test.h>
9*40840afaSBenjamin Berg 
10*40840afaSBenjamin Berg MODULE_IMPORT_NS("IWLWIFI");
11*40840afaSBenjamin Berg 
12*40840afaSBenjamin Berg static const struct average_neg_db_case {
13*40840afaSBenjamin Berg 	const char *desc;
14*40840afaSBenjamin Berg 	u8 neg_dbm[22];
15*40840afaSBenjamin Berg 	s8 result;
16*40840afaSBenjamin Berg } average_neg_db_cases[] = {
17*40840afaSBenjamin Berg 	{
18*40840afaSBenjamin Berg 		.desc = "Smallest possible value, all filled",
19*40840afaSBenjamin Berg 		.neg_dbm = {
20*40840afaSBenjamin Berg 			128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
21*40840afaSBenjamin Berg 			128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
22*40840afaSBenjamin Berg 			128, 128
23*40840afaSBenjamin Berg 		},
24*40840afaSBenjamin Berg 		.result = -128,
25*40840afaSBenjamin Berg 	},
26*40840afaSBenjamin Berg 	{
27*40840afaSBenjamin Berg 		.desc = "Biggest possible value, all filled",
28*40840afaSBenjamin Berg 		.neg_dbm = {
29*40840afaSBenjamin Berg 			0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
30*40840afaSBenjamin Berg 			0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
31*40840afaSBenjamin Berg 			0, 0,
32*40840afaSBenjamin Berg 		},
33*40840afaSBenjamin Berg 		.result = 0,
34*40840afaSBenjamin Berg 	},
35*40840afaSBenjamin Berg 	{
36*40840afaSBenjamin Berg 		.desc = "Smallest possible value, partial filled",
37*40840afaSBenjamin Berg 		.neg_dbm = {
38*40840afaSBenjamin Berg 			128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
39*40840afaSBenjamin Berg 			0xff, 0xff, 0xff, 0xff, 0xff,
40*40840afaSBenjamin Berg 			0xff, 0xff, 0xff, 0xff, 0xff,
41*40840afaSBenjamin Berg 			0xff, 0xff,
42*40840afaSBenjamin Berg 		},
43*40840afaSBenjamin Berg 		.result = -128,
44*40840afaSBenjamin Berg 	},
45*40840afaSBenjamin Berg 	{
46*40840afaSBenjamin Berg 		.desc = "Biggest possible value, partial filled",
47*40840afaSBenjamin Berg 		.neg_dbm = {
48*40840afaSBenjamin Berg 			0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
49*40840afaSBenjamin Berg 			0xff, 0xff, 0xff, 0xff, 0xff,
50*40840afaSBenjamin Berg 			0xff, 0xff, 0xff, 0xff, 0xff,
51*40840afaSBenjamin Berg 			0xff, 0xff,
52*40840afaSBenjamin Berg 		},
53*40840afaSBenjamin Berg 		.result = 0,
54*40840afaSBenjamin Berg 	},
55*40840afaSBenjamin Berg 	{
56*40840afaSBenjamin Berg 		.desc = "Adding -80dBm to -75dBm until it is still rounded to -79dBm",
57*40840afaSBenjamin Berg 		.neg_dbm = {
58*40840afaSBenjamin Berg 			75, 80, 80, 80, 80, 80, 80, 80, 80, 80,
59*40840afaSBenjamin Berg 			80, 80, 80, 80, 80, 80, 80, 0xff, 0xff, 0xff,
60*40840afaSBenjamin Berg 			0xff, 0xff,
61*40840afaSBenjamin Berg 		},
62*40840afaSBenjamin Berg 		.result = -79,
63*40840afaSBenjamin Berg 	},
64*40840afaSBenjamin Berg 	{
65*40840afaSBenjamin Berg 		.desc = "Adding -80dBm to -75dBm until it is just rounded to -80dBm",
66*40840afaSBenjamin Berg 		.neg_dbm = {
67*40840afaSBenjamin Berg 			75, 80, 80, 80, 80, 80, 80, 80, 80, 80,
68*40840afaSBenjamin Berg 			80, 80, 80, 80, 80, 80, 80, 80, 0xff, 0xff,
69*40840afaSBenjamin Berg 			0xff, 0xff,
70*40840afaSBenjamin Berg 		},
71*40840afaSBenjamin Berg 		.result = -80,
72*40840afaSBenjamin Berg 	},
73*40840afaSBenjamin Berg };
74*40840afaSBenjamin Berg 
KUNIT_ARRAY_PARAM_DESC(average_neg_db,average_neg_db_cases,desc)75*40840afaSBenjamin Berg KUNIT_ARRAY_PARAM_DESC(average_neg_db, average_neg_db_cases, desc)
76*40840afaSBenjamin Berg 
77*40840afaSBenjamin Berg static void test_average_neg_db(struct kunit *test)
78*40840afaSBenjamin Berg {
79*40840afaSBenjamin Berg 	const struct average_neg_db_case *params = test->param_value;
80*40840afaSBenjamin Berg 	u8 reversed[ARRAY_SIZE(params->neg_dbm)];
81*40840afaSBenjamin Berg 	int i;
82*40840afaSBenjamin Berg 
83*40840afaSBenjamin Berg 	/* Test the values in the given order */
84*40840afaSBenjamin Berg 	KUNIT_ASSERT_EQ(test,
85*40840afaSBenjamin Berg 			iwl_average_neg_dbm(params->neg_dbm,
86*40840afaSBenjamin Berg 					    ARRAY_SIZE(params->neg_dbm)),
87*40840afaSBenjamin Berg 			params->result);
88*40840afaSBenjamin Berg 
89*40840afaSBenjamin Berg 	/* Test in reverse order */
90*40840afaSBenjamin Berg 	for (i = 0; i < ARRAY_SIZE(params->neg_dbm); i++)
91*40840afaSBenjamin Berg 		reversed[ARRAY_SIZE(params->neg_dbm) - i - 1] =
92*40840afaSBenjamin Berg 			params->neg_dbm[i];
93*40840afaSBenjamin Berg 	KUNIT_ASSERT_EQ(test,
94*40840afaSBenjamin Berg 			iwl_average_neg_dbm(reversed,
95*40840afaSBenjamin Berg 					    ARRAY_SIZE(params->neg_dbm)),
96*40840afaSBenjamin Berg 			params->result);
97*40840afaSBenjamin Berg }
98*40840afaSBenjamin Berg 
99*40840afaSBenjamin Berg static struct kunit_case average_db_case[] = {
100*40840afaSBenjamin Berg 	KUNIT_CASE_PARAM(test_average_neg_db, average_neg_db_gen_params),
101*40840afaSBenjamin Berg 	{}
102*40840afaSBenjamin Berg };
103*40840afaSBenjamin Berg 
104*40840afaSBenjamin Berg static struct kunit_suite average_db = {
105*40840afaSBenjamin Berg 	.name = "iwl-average-db",
106*40840afaSBenjamin Berg 	.test_cases = average_db_case,
107*40840afaSBenjamin Berg };
108*40840afaSBenjamin Berg 
109*40840afaSBenjamin Berg kunit_test_suite(average_db);
110