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