Search Linux Wireless

Re: [PATCH 06/20] wifi: iwlwifi: mvm: handle TPE advertised by AP

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 09.08.24 20:25, Rory Little wrote:
>
> We noticed that our transmit throughput dropped by ~20-30% and bisected
> the issue to this patch. We will dig around a bit more to investigate
> why this seems to be happening...

Rory Little: was this ever resolved? I noticed the patch you send to
which Johannes replied to stating a similar fix is already in -rc1. But
you reported this a few days after -rc1 was out, which makes me wonder
if this really is resolved.

If it is: apologies for the noise in advance.

Ciao, Thorsten (wearing his 'the Linux kernel's regression tracker' hat)

> On 5/27/24 09:06, Miri Korenblit wrote:
>> From: Johannes Berg <johannes.berg@xxxxxxxxx>
>>
>> 6 GHz BSS SP client shall respect TX power limits advertised
>> by the AP in TPE elements, send the data to the firmware using
>> the AP_TX_POWER_CONSTRAINTS_CMD command, so do that.
>>
>> Co-developed-by: Mukesh Sisodiya <mukesh.sisodiya@xxxxxxxxx>
>> Signed-off-by: Mukesh Sisodiya <mukesh.sisodiya@xxxxxxxxx>
>> Signed-off-by: Johannes Berg <johannes.berg@xxxxxxxxx>
>> Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@xxxxxxxxx>
>> ---
>>   .../net/wireless/intel/iwlwifi/mvm/mac80211.c | 11 ++++
>>   .../wireless/intel/iwlwifi/mvm/mld-mac80211.c | 55 ++++++++++++++++---
>>   drivers/net/wireless/intel/iwlwifi/mvm/mvm.h  |  6 ++
>>   3 files changed, 63 insertions(+), 9 deletions(-)
>>
>> diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
>> b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
>> index 752fdb6a783f..88bc0baabf7e 100644
>> --- a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
>> +++ b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
>> @@ -2768,6 +2768,13 @@ iwl_mvm_bss_info_changed_station_common(struct
>> iwl_mvm *mvm,
>>         if (changes & BSS_CHANGED_BANDWIDTH)
>>           iwl_mvm_update_link_smps(vif, link_conf);
>> +
>> +    if (changes & BSS_CHANGED_TPE) {
>> +        IWL_DEBUG_CALIB(mvm, "Changing TPE\n");
>> +        iwl_mvm_send_ap_tx_power_constraint_cmd(mvm, vif,
>> +                            link_conf,
>> +                            false);
>> +    }
>>   }
>>     static void iwl_mvm_bss_info_changed_station(struct iwl_mvm *mvm,
>> @@ -5122,6 +5129,10 @@ static int __iwl_mvm_assign_vif_chanctx(struct
>> iwl_mvm *mvm,
>>           }
>>             iwl_mvm_update_quotas(mvm, false, NULL);
>> +
>> +        iwl_mvm_send_ap_tx_power_constraint_cmd(mvm, vif,
>> +                            link_conf,
>> +                            false);
>>       }
>>         goto out;
>> diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mld-mac80211.c
>> b/drivers/net/wireless/intel/iwlwifi/mvm/mld-mac80211.c
>> index 00433d1c8564..b2b6dbdcc44f 100644
>> --- a/drivers/net/wireless/intel/iwlwifi/mvm/mld-mac80211.c
>> +++ b/drivers/net/wireless/intel/iwlwifi/mvm/mld-mac80211.c
>> @@ -345,6 +345,11 @@ __iwl_mvm_mld_assign_vif_chanctx(struct iwl_mvm
>> *mvm,
>>           rcu_read_unlock();
>>       }
>>   +    if (vif->type == NL80211_IFTYPE_STATION)
>> +        iwl_mvm_send_ap_tx_power_constraint_cmd(mvm, vif,
>> +                            link_conf,
>> +                            false);
>> +
>>       /* then activate */
>>       ret = iwl_mvm_link_changed(mvm, vif, link_conf,
>>                      LINK_CONTEXT_MODIFY_ACTIVE |
>> @@ -524,9 +529,37 @@ static void
>> iwl_mvm_mld_unassign_vif_chanctx(struct ieee80211_hw *hw,
>>   }
>>     static void
>> +iwl_mvm_tpe_sta_cmd_data(struct iwl_txpower_constraints_cmd *cmd,
>> +             const struct ieee80211_bss_conf *bss_info)
>> +{
>> +    u8 i;
>> +
>> +    /*
>> +     * NOTE: the 0 here is IEEE80211_TPE_CAT_6GHZ_DEFAULT,
>> +     * we fully ignore IEEE80211_TPE_CAT_6GHZ_SUBORDINATE
>> +     */
>> +
>> +    BUILD_BUG_ON(ARRAY_SIZE(cmd->psd_pwr) !=
>> +             ARRAY_SIZE(bss_info->tpe.psd_local[0].power));
>> +
>> +    /* if not valid, mac80211 puts default (max value) */
>> +    for (i = 0; i < ARRAY_SIZE(cmd->psd_pwr); i++)
>> +        cmd->psd_pwr[i] = min(bss_info->tpe.psd_local[0].power[i],
>> +                      bss_info->tpe.psd_reg_client[0].power[i]);
>> +
>> +    BUILD_BUG_ON(ARRAY_SIZE(cmd->eirp_pwr) !=
>> +             ARRAY_SIZE(bss_info->tpe.max_local[0].power));
>> +
>> +    for (i = 0; i < ARRAY_SIZE(cmd->eirp_pwr); i++)
>> +        cmd->eirp_pwr[i] = min(bss_info->tpe.max_local[0].power[i],
>> +                       bss_info->tpe.max_reg_client[0].power[i]);
>> +}
>> +
>> +void
>>   iwl_mvm_send_ap_tx_power_constraint_cmd(struct iwl_mvm *mvm,
>>                       struct ieee80211_vif *vif,
>> -                    struct ieee80211_bss_conf *bss_conf)
>> +                    struct ieee80211_bss_conf *bss_conf,
>> +                    bool is_ap)
>>   {
>>       struct iwl_txpower_constraints_cmd cmd = {};
>>       struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
>> @@ -546,19 +579,22 @@ iwl_mvm_send_ap_tx_power_constraint_cmd(struct
>> iwl_mvm *mvm,
>>           link_info->fw_link_id == IWL_MVM_FW_LINK_ID_INVALID)
>>           return;
>>   -    if (bss_conf->chanreq.oper.chan->band != NL80211_BAND_6GHZ ||
>> -        bss_conf->chanreq.oper.chan->flags &
>> -            IEEE80211_CHAN_NO_6GHZ_VLP_CLIENT)
>> +    if (bss_conf->chanreq.oper.chan->band != NL80211_BAND_6GHZ)
>>           return;
>>         cmd.link_id = cpu_to_le16(link_info->fw_link_id);
>> -    /*
>> -     * Currently supporting VLP Soft AP only.
>> -     */
>> -    cmd.ap_type = cpu_to_le16(IWL_6GHZ_AP_TYPE_VLP);
>>       memset(cmd.psd_pwr, DEFAULT_TPE_TX_POWER, sizeof(cmd.psd_pwr));
>>       memset(cmd.eirp_pwr, DEFAULT_TPE_TX_POWER, sizeof(cmd.eirp_pwr));
>>   +    if (is_ap) {
>> +        cmd.ap_type = cpu_to_le16(IWL_6GHZ_AP_TYPE_VLP);
>> +    } else if (bss_conf->power_type == IEEE80211_REG_UNSET_AP) {
>> +        return;
>> +    } else {
>> +        cmd.ap_type = cpu_to_le16(bss_conf->power_type - 1);
>> +        iwl_mvm_tpe_sta_cmd_data(&cmd, bss_conf);
>> +    }
>> +
>>       ret = iwl_mvm_send_cmd_pdu(mvm,
>>                      WIDE_ID(PHY_OPS_GROUP,
>>                          AP_TX_POWER_CONSTRAINTS_CMD),
>> @@ -580,7 +616,8 @@ static int iwl_mvm_mld_start_ap_ibss(struct
>> ieee80211_hw *hw,
>>       guard(mvm)(mvm);
>>         if (vif->type == NL80211_IFTYPE_AP)
>> -        iwl_mvm_send_ap_tx_power_constraint_cmd(mvm, vif, link_conf);
>> +        iwl_mvm_send_ap_tx_power_constraint_cmd(mvm, vif,
>> +                            link_conf, true);
>>         /* Send the beacon template */
>>       ret = iwl_mvm_mac_ctxt_beacon_changed(mvm, vif, link_conf);
>> diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h
>> b/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h
>> index f3d9b8355c6b..9b939225990a 100644
>> --- a/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h
>> +++ b/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h
>> @@ -2962,4 +2962,10 @@ iwl_mvm_bt_coex_calculate_esr_mode(struct
>> iwl_mvm *mvm,
>>                      bool primary);
>>   int iwl_mvm_esr_non_bss_link(struct iwl_mvm *mvm, struct
>> ieee80211_vif *vif,
>>                    unsigned int link_id, bool active);
>> +
>> +void
>> +iwl_mvm_send_ap_tx_power_constraint_cmd(struct iwl_mvm *mvm,
>> +                    struct ieee80211_vif *vif,
>> +                    struct ieee80211_bss_conf *bss_conf,
>> +                    bool is_ap);
>>   #endif /* __IWL_MVM_H__ */
> 

--
Everything you wanna know about Linux kernel regression tracking:
https://linux-regtracking.leemhuis.info/about/#tldr
If I did something stupid, please tell me, as explained on that page.

#regzbot poke




[Index of Archives]     [Linux Host AP]     [ATH6KL]     [Linux Wireless Personal Area Network]     [Linux Bluetooth]     [Wireless Regulations]     [Linux Netdev]     [Kernel Newbies]     [Linux Kernel]     [IDE]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite Hiking]     [MIPS Linux]     [ARM Linux]     [Linux RAID]

  Powered by Linux