xref: /linux/drivers/net/wireless/intel/iwlwifi/mld/phy.h (revision 4f9786035f9e519db41375818e1d0b5f20da2f10)
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 #ifndef __iwl_mld_phy_h__
6d1e879ecSMiri Korenblit #define __iwl_mld_phy_h__
7d1e879ecSMiri Korenblit 
8d1e879ecSMiri Korenblit #include "mld.h"
9d1e879ecSMiri Korenblit 
10d1e879ecSMiri Korenblit /**
11d1e879ecSMiri Korenblit  * struct iwl_mld_phy - PHY configuration parameters
12d1e879ecSMiri Korenblit  *
13d1e879ecSMiri Korenblit  * @fw_id: fw id of the phy.
14d1e879ecSMiri Korenblit  * @chandef: the last chandef that mac80211 configured the driver
15d1e879ecSMiri Korenblit  *	with. Used to detect a no-op when the chanctx changes.
16d1e879ecSMiri Korenblit  * @channel_load_by_us: channel load on this channel caused by
17d1e879ecSMiri Korenblit  *	the NIC itself, as indicated by firmware
18e8670620SMiri Korenblit  * @avg_channel_load_not_by_us: averaged channel load on this channel caused by
19e8670620SMiri Korenblit  *	others. This value is invalid when in EMLSR (due to FW limitations)
20e8670620SMiri Korenblit  * @mld: pointer to the MLD context
21d1e879ecSMiri Korenblit  */
22d1e879ecSMiri Korenblit struct iwl_mld_phy {
23d1e879ecSMiri Korenblit 	/* Add here fields that need clean up on hw restart */
24d1e879ecSMiri Korenblit 	struct_group(zeroed_on_hw_restart,
25d1e879ecSMiri Korenblit 		u8 fw_id;
26d1e879ecSMiri Korenblit 		struct cfg80211_chan_def chandef;
27d1e879ecSMiri Korenblit 	);
28d1e879ecSMiri Korenblit 	/* And here fields that survive a hw restart */
29d1e879ecSMiri Korenblit 	u32 channel_load_by_us;
30e8670620SMiri Korenblit 	u32 avg_channel_load_not_by_us;
31e8670620SMiri Korenblit 	struct iwl_mld *mld;
32d1e879ecSMiri Korenblit };
33d1e879ecSMiri Korenblit 
34d1e879ecSMiri Korenblit static inline struct iwl_mld_phy *
35d1e879ecSMiri Korenblit iwl_mld_phy_from_mac80211(struct ieee80211_chanctx_conf *channel)
36d1e879ecSMiri Korenblit {
37d1e879ecSMiri Korenblit 	return (void *)channel->drv_priv;
38d1e879ecSMiri Korenblit }
39d1e879ecSMiri Korenblit 
40d1e879ecSMiri Korenblit /* Cleanup function for struct iwl_mld_phy, will be called in restart */
41d1e879ecSMiri Korenblit static inline void
42d1e879ecSMiri Korenblit iwl_mld_cleanup_phy(struct iwl_mld *mld, struct iwl_mld_phy *phy)
43d1e879ecSMiri Korenblit {
44d1e879ecSMiri Korenblit 	CLEANUP_STRUCT(phy);
45d1e879ecSMiri Korenblit }
46d1e879ecSMiri Korenblit 
47d1e879ecSMiri Korenblit int iwl_mld_allocate_fw_phy_id(struct iwl_mld *mld);
48d1e879ecSMiri Korenblit int iwl_mld_phy_fw_action(struct iwl_mld *mld,
49d1e879ecSMiri Korenblit 			  struct ieee80211_chanctx_conf *ctx, u32 action);
50d1e879ecSMiri Korenblit struct cfg80211_chan_def *
51*fd04fbeeSJohannes Berg iwl_mld_get_chandef_from_chanctx(struct iwl_mld *mld,
52*fd04fbeeSJohannes Berg 				 struct ieee80211_chanctx_conf *ctx);
53d1e879ecSMiri Korenblit u8 iwl_mld_get_fw_ctrl_pos(const struct cfg80211_chan_def *chandef);
54d1e879ecSMiri Korenblit 
55d1e879ecSMiri Korenblit #endif /* __iwl_mld_phy_h__ */
56