wifi: iwlwifi: mvm: allow UAPSD when in SCM
authorAvraham Stern <avraham.stern@intel.com>
Fri, 10 May 2024 14:06:31 +0000 (17:06 +0300)
committerJohannes Berg <johannes.berg@intel.com>
Thu, 23 May 2024 08:50:00 +0000 (10:50 +0200)
Allow UAPSD when P2P and BSS interfaces share the same channel.

Signed-off-by: Avraham Stern <avraham.stern@intel.com>
Reviewed-by: Luciano Coelho <luciano.coelho@intel.com>
Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com>
Link: https://msgid.link/20240510170500.1ec19d432497.Id6de5337c878fa70e85bfcf6f4e0e34ce60756fb@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
drivers/net/wireless/intel/iwlwifi/mvm/power.c

index 72f4480ae7f5c1ece9ca659856e5c0739d805db8..cc7176b0be4fc043f10b931ff0d5630919cc5374 100644 (file)
@@ -212,7 +212,7 @@ static void iwl_mvm_power_configure_uapsd(struct iwl_mvm *mvm,
 }
 
 struct iwl_allow_uapsd_iface_iterator_data {
-       struct ieee80211_vif *exclude_vif;
+       struct ieee80211_vif *current_vif;
        bool allow_uapsd;
 };
 
@@ -220,9 +220,12 @@ static void iwl_mvm_allow_uapsd_iterator(void *_data, u8 *mac,
                                         struct ieee80211_vif *vif)
 {
        struct iwl_allow_uapsd_iface_iterator_data *data = _data;
+       struct iwl_mvm_vif *other_mvmvif = iwl_mvm_vif_from_mac80211(vif);
+       struct iwl_mvm_vif *curr_mvmvif =
+               iwl_mvm_vif_from_mac80211(data->current_vif);
 
        /* exclude the given vif */
-       if (vif == data->exclude_vif)
+       if (vif == data->current_vif)
                return;
 
        switch (vif->type) {
@@ -232,7 +235,12 @@ static void iwl_mvm_allow_uapsd_iterator(void *_data, u8 *mac,
                data->allow_uapsd = false;
                break;
        case NL80211_IFTYPE_STATION:
-               if (vif->cfg.assoc)
+               /* allow UAPSD if P2P interface and BSS station interface share
+                * the same channel.
+                */
+               if (vif->cfg.assoc && other_mvmvif->deflink.phy_ctxt &&
+                   curr_mvmvif->deflink.phy_ctxt &&
+                   other_mvmvif->deflink.phy_ctxt->id != curr_mvmvif->deflink.phy_ctxt->id)
                        data->allow_uapsd = false;
                break;
 
@@ -246,7 +254,7 @@ static bool iwl_mvm_power_allow_uapsd(struct iwl_mvm *mvm,
 {
        struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
        struct iwl_allow_uapsd_iface_iterator_data data = {
-               .exclude_vif = vif,
+               .current_vif = vif,
                .allow_uapsd = true,
        };