diff mbox series

[04/14] iwlwifi: mvm: allow UAPSD when in SCM

Message ID 20240510170500.1ec19d432497.Id6de5337c878fa70e85bfcf6f4e0e34ce60756fb@changeid (mailing list archive)
State Accepted
Delegated to: Johannes Berg
Headers show
Series wifi: iwlwifi: updates - 2024-05-10 | expand

Commit Message

Miri Korenblit May 10, 2024, 2:06 p.m. UTC
From: Avraham Stern <avraham.stern@intel.com>

Allow UAPSD when P2P and BSS interfaces share the same channel.

Signed-off-by: Avraham Stern <avraham.stern@intel.com>
Reviewed-by: Coelho, Luciano <luciano.coelho@intel.com>
Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com>
---
 drivers/net/wireless/intel/iwlwifi/mvm/power.c | 16 ++++++++++++----
 1 file changed, 12 insertions(+), 4 deletions(-)
diff mbox series

Patch

diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/power.c b/drivers/net/wireless/intel/iwlwifi/mvm/power.c
index 72f4480ae7f5..cc7176b0be4f 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/power.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/power.c
@@ -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,
 	};