1d1e879ecSMiri Korenblit /* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
2d1e879ecSMiri Korenblit /*
3d1e879ecSMiri Korenblit * Copyright (C) 2024-2025 Intel Corporation
4d1e879ecSMiri Korenblit */
5d1e879ecSMiri Korenblit
6d1e879ecSMiri Korenblit #ifndef __iwl_mld_kunit_utils_h__
7d1e879ecSMiri Korenblit #define __iwl_mld_kunit_utils_h__
8d1e879ecSMiri Korenblit
9d1e879ecSMiri Korenblit #include <net/mac80211.h>
10d1e879ecSMiri Korenblit #include <kunit/test-bug.h>
11d1e879ecSMiri Korenblit
12d1e879ecSMiri Korenblit struct iwl_mld;
13d1e879ecSMiri Korenblit
14d1e879ecSMiri Korenblit int iwlmld_kunit_test_init(struct kunit *test);
15d1e879ecSMiri Korenblit
16de5ca699SMiri Korenblit struct iwl_mld_kunit_link {
17de5ca699SMiri Korenblit u8 id;
18de5ca699SMiri Korenblit enum nl80211_band band;
19de5ca699SMiri Korenblit enum nl80211_chan_width bandwidth;
20de5ca699SMiri Korenblit };
21de5ca699SMiri Korenblit
22d1e879ecSMiri Korenblit enum nl80211_iftype;
23d1e879ecSMiri Korenblit
24d1e879ecSMiri Korenblit struct ieee80211_vif *iwlmld_kunit_add_vif(bool mlo, enum nl80211_iftype type);
25d1e879ecSMiri Korenblit
26d1e879ecSMiri Korenblit struct ieee80211_bss_conf *
27d1e879ecSMiri Korenblit iwlmld_kunit_add_link(struct ieee80211_vif *vif, int link_id);
28d1e879ecSMiri Korenblit
29d1e879ecSMiri Korenblit #define KUNIT_ALLOC_AND_ASSERT_SIZE(test, ptr, size) \
30d1e879ecSMiri Korenblit do { \
31d1e879ecSMiri Korenblit (ptr) = kunit_kzalloc((test), (size), GFP_KERNEL); \
32d1e879ecSMiri Korenblit KUNIT_ASSERT_NOT_NULL((test), (ptr)); \
33d1e879ecSMiri Korenblit } while (0)
34d1e879ecSMiri Korenblit
35d1e879ecSMiri Korenblit #define KUNIT_ALLOC_AND_ASSERT(test, ptr) \
36d1e879ecSMiri Korenblit KUNIT_ALLOC_AND_ASSERT_SIZE(test, ptr, sizeof(*(ptr)))
37d1e879ecSMiri Korenblit
38d1e879ecSMiri Korenblit #define CHANNEL(_name, _band, _freq) \
39d1e879ecSMiri Korenblit static struct ieee80211_channel _name = { \
40d1e879ecSMiri Korenblit .band = (_band), \
41d1e879ecSMiri Korenblit .center_freq = (_freq), \
42d1e879ecSMiri Korenblit .hw_value = (_freq), \
43d1e879ecSMiri Korenblit }
44d1e879ecSMiri Korenblit
45d1e879ecSMiri Korenblit #define CHANDEF(_name, _channel, _freq1, _width) \
46d1e879ecSMiri Korenblit __maybe_unused static struct cfg80211_chan_def _name = { \
47d1e879ecSMiri Korenblit .chan = &(_channel), \
48d1e879ecSMiri Korenblit .center_freq1 = (_freq1), \
49d1e879ecSMiri Korenblit .width = (_width), \
50d1e879ecSMiri Korenblit }
51d1e879ecSMiri Korenblit
52d1e879ecSMiri Korenblit CHANNEL(chan_2ghz, NL80211_BAND_2GHZ, 2412);
53d1e879ecSMiri Korenblit CHANNEL(chan_5ghz, NL80211_BAND_5GHZ, 5200);
54d1e879ecSMiri Korenblit CHANNEL(chan_6ghz, NL80211_BAND_6GHZ, 6115);
55d1e879ecSMiri Korenblit /* Feel free to add more */
56d1e879ecSMiri Korenblit
57d1e879ecSMiri Korenblit CHANDEF(chandef_2ghz, chan_2ghz, 2412, NL80211_CHAN_WIDTH_20);
58d1e879ecSMiri Korenblit CHANDEF(chandef_5ghz, chan_5ghz, 5200, NL80211_CHAN_WIDTH_40);
59d1e879ecSMiri Korenblit CHANDEF(chandef_6ghz, chan_6ghz, 6115, NL80211_CHAN_WIDTH_160);
60d1e879ecSMiri Korenblit /* Feel free to add more */
61d1e879ecSMiri Korenblit
62d1e879ecSMiri Korenblit //struct cfg80211_chan_def;
63d1e879ecSMiri Korenblit
64d1e879ecSMiri Korenblit struct ieee80211_chanctx_conf *
65d1e879ecSMiri Korenblit iwlmld_kunit_add_chanctx_from_def(struct cfg80211_chan_def *def);
66d1e879ecSMiri Korenblit
67d1e879ecSMiri Korenblit static inline struct ieee80211_chanctx_conf *
iwlmld_kunit_add_chanctx(enum nl80211_band band,enum nl80211_chan_width width)68*2907c039SMiri Korenblit iwlmld_kunit_add_chanctx(enum nl80211_band band, enum nl80211_chan_width width)
69d1e879ecSMiri Korenblit {
70*2907c039SMiri Korenblit struct cfg80211_chan_def chandef;
71d1e879ecSMiri Korenblit
72d1e879ecSMiri Korenblit switch (band) {
73d1e879ecSMiri Korenblit case NL80211_BAND_2GHZ:
74*2907c039SMiri Korenblit chandef = chandef_2ghz;
75d1e879ecSMiri Korenblit break;
76d1e879ecSMiri Korenblit case NL80211_BAND_5GHZ:
77*2907c039SMiri Korenblit chandef = chandef_5ghz;
78d1e879ecSMiri Korenblit break;
79d1e879ecSMiri Korenblit default:
80d1e879ecSMiri Korenblit case NL80211_BAND_6GHZ:
81*2907c039SMiri Korenblit chandef = chandef_6ghz;
82d1e879ecSMiri Korenblit break;
83d1e879ecSMiri Korenblit }
84d1e879ecSMiri Korenblit
85*2907c039SMiri Korenblit chandef.width = width;
86*2907c039SMiri Korenblit
87*2907c039SMiri Korenblit return iwlmld_kunit_add_chanctx_from_def(&chandef);
88d1e879ecSMiri Korenblit }
89d1e879ecSMiri Korenblit
90d1e879ecSMiri Korenblit void iwlmld_kunit_assign_chanctx_to_link(struct ieee80211_vif *vif,
91d1e879ecSMiri Korenblit struct ieee80211_bss_conf *link,
92d1e879ecSMiri Korenblit struct ieee80211_chanctx_conf *ctx);
93d1e879ecSMiri Korenblit
94d1e879ecSMiri Korenblit /* Allocate a sta, initialize it and move it to the wanted state */
95d1e879ecSMiri Korenblit struct ieee80211_sta *iwlmld_kunit_setup_sta(struct ieee80211_vif *vif,
96d1e879ecSMiri Korenblit enum ieee80211_sta_state state,
97d1e879ecSMiri Korenblit int link_id);
98d1e879ecSMiri Korenblit
99de5ca699SMiri Korenblit struct ieee80211_vif *
100de5ca699SMiri Korenblit iwlmld_kunit_setup_mlo_assoc(u16 valid_links,
101de5ca699SMiri Korenblit struct iwl_mld_kunit_link *assoc_link);
102de5ca699SMiri Korenblit
103de5ca699SMiri Korenblit struct ieee80211_vif *
104de5ca699SMiri Korenblit iwlmld_kunit_setup_non_mlo_assoc(struct iwl_mld_kunit_link *assoc_link);
105d1e879ecSMiri Korenblit
106d1e879ecSMiri Korenblit struct iwl_rx_packet *
107d1e879ecSMiri Korenblit _iwl_mld_kunit_create_pkt(const void *notif, size_t notif_sz);
108d1e879ecSMiri Korenblit
109d1e879ecSMiri Korenblit #define iwl_mld_kunit_create_pkt(_notif) \
110d1e879ecSMiri Korenblit _iwl_mld_kunit_create_pkt(&(_notif), sizeof(_notif))
111d1e879ecSMiri Korenblit
112de5ca699SMiri Korenblit struct ieee80211_vif *
113de5ca699SMiri Korenblit iwlmld_kunit_assoc_emlsr(struct iwl_mld_kunit_link *link1,
114de5ca699SMiri Korenblit struct iwl_mld_kunit_link *link2);
115d1e879ecSMiri Korenblit
116d1e879ecSMiri Korenblit struct element *iwlmld_kunit_gen_element(u8 id, const void *data, size_t len);
117d1e879ecSMiri Korenblit
118d1e879ecSMiri Korenblit /**
119d1e879ecSMiri Korenblit * iwlmld_kunit_get_phy_of_link - Get the phy of a link
120d1e879ecSMiri Korenblit *
121d1e879ecSMiri Korenblit * @vif: The vif to get the phy from.
122d1e879ecSMiri Korenblit * @link_id: The id of the link to get the phy for.
123d1e879ecSMiri Korenblit *
124d1e879ecSMiri Korenblit * given a vif and link id, return the phy pointer of that link.
125d1e879ecSMiri Korenblit * This assumes that the link exists, and that it had a chanctx
126d1e879ecSMiri Korenblit * assigned.
127d1e879ecSMiri Korenblit * If this is not the case, the test will fail.
128d1e879ecSMiri Korenblit *
129d1e879ecSMiri Korenblit * Return: phy pointer.
130d1e879ecSMiri Korenblit */
131d1e879ecSMiri Korenblit struct iwl_mld_phy *iwlmld_kunit_get_phy_of_link(struct ieee80211_vif *vif,
132d1e879ecSMiri Korenblit u8 link_id);
133d1e879ecSMiri Korenblit
134d1e879ecSMiri Korenblit #endif /* __iwl_mld_kunit_utils_h__ */
135