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