Commit 5abf3154 authored by Mordechay Goodstein's avatar Mordechay Goodstein Committed by Johannes Berg

wifi: iwlwifi: mvm: add primary 80 known for EHT radiotap

Calculate the position of the control channel in the wide channel
based on the chandef, this is used to obtain the value of N in
802.11be D1.5 Table 9-53a in the column PHY MU/MRU index.

To avoid the need to calculate every frame the value, do it once
monitor vif is added.
Signed-off-by: default avatarMordechay Goodstein <mordechay.goodstein@intel.com>
Signed-off-by: default avatarGregory Greenman <gregory.greenman@intel.com>
Link: https://lore.kernel.org/r/20230305124407.fe9a5b58e241.I291ee480252d098f62d9ec39040284d3e521d88e@changeidSigned-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent feb4a0e2
......@@ -1362,6 +1362,28 @@ static void iwl_mvm_channel_switch_disconnect_wk(struct work_struct *wk)
ieee80211_chswitch_done(vif, false);
}
static u8
iwl_mvm_chandef_get_primary_80(struct cfg80211_chan_def *chandef)
{
int data_start;
int control_start;
int bw;
if (chandef->width == NL80211_CHAN_WIDTH_320)
bw = 320;
else if (chandef->width == NL80211_CHAN_WIDTH_160)
bw = 160;
else
return 0;
/* data is bw wide so the start is half the width */
data_start = chandef->center_freq1 - bw / 2;
/* control is 20Mhz width */
control_start = chandef->chan->center_freq - 10;
return (control_start - data_start) / 80;
}
static int iwl_mvm_mac_add_interface(struct ieee80211_hw *hw,
struct ieee80211_vif *vif)
{
......@@ -1478,8 +1500,11 @@ static int iwl_mvm_mac_add_interface(struct ieee80211_hw *hw,
INIT_DELAYED_WORK(&mvmvif->csa_work,
iwl_mvm_channel_switch_disconnect_wk);
if (vif->type == NL80211_IFTYPE_MONITOR)
if (vif->type == NL80211_IFTYPE_MONITOR) {
mvm->monitor_on = true;
mvm->monitor_p80 =
iwl_mvm_chandef_get_primary_80(&vif->bss_conf.chandef);
}
iwl_mvm_vif_dbgfs_register(mvm, vif);
......
......@@ -1096,6 +1096,11 @@ struct iwl_mvm {
/* does a monitor vif exist (only one can exist hence bool) */
bool monitor_on;
/*
* primary channel position relative to he whole bandwidth,
* in steps of 80 MHz
*/
u8 monitor_p80;
/* sniffer data to include in radiotap */
__le16 cur_aid;
......
......@@ -1695,6 +1695,15 @@ static void iwl_mvm_decode_eht_phy_data(struct iwl_mvm *mvm,
iwl_mvm_decode_eht_ru(mvm, rx_status, eht);
/* We only get here in case of IWL_RX_MPDU_PHY_TSF_OVERLOAD is set
* which is on only in case of monitor mode so no need to check monitor
* mode
*/
eht->known |= cpu_to_le32(IEEE80211_RADIOTAP_EHT_KNOWN_PRIMARY_80);
eht->data[1] |=
le32_encode_bits(mvm->monitor_p80,
IEEE80211_RADIOTAP_EHT_DATA1_PRIMARY_80);
usig->common |= cpu_to_le32(IEEE80211_RADIOTAP_EHT_USIG_COMMON_TXOP_KNOWN);
if (phy_data->with_data)
usig->common |= LE32_DEC_ENC(data0, IWL_RX_PHY_DATA0_EHT_TXOP_DUR_MASK,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment