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