|
@@ -268,10 +268,30 @@ static void iwl_mvm_power_configure_uapsd(struct iwl_mvm *mvm,
|
|
|
IWL_MVM_PS_HEAVY_RX_THLD_PERCENT;
|
|
|
}
|
|
|
|
|
|
+static void iwl_mvm_binding_iterator(void *_data, u8 *mac,
|
|
|
+ struct ieee80211_vif *vif)
|
|
|
+{
|
|
|
+ unsigned long *data = _data;
|
|
|
+ struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
|
|
|
+
|
|
|
+ if (!mvmvif->phy_ctxt)
|
|
|
+ return;
|
|
|
+
|
|
|
+ if (vif->type == NL80211_IFTYPE_STATION ||
|
|
|
+ vif->type == NL80211_IFTYPE_AP)
|
|
|
+ __set_bit(mvmvif->phy_ctxt->id, data);
|
|
|
+}
|
|
|
+
|
|
|
static bool iwl_mvm_power_allow_uapsd(struct iwl_mvm *mvm,
|
|
|
struct ieee80211_vif *vif)
|
|
|
{
|
|
|
struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
|
|
|
+ unsigned long phy_ctxt_counter = 0;
|
|
|
+
|
|
|
+ ieee80211_iterate_active_interfaces_atomic(mvm->hw,
|
|
|
+ IEEE80211_IFACE_ITER_NORMAL,
|
|
|
+ iwl_mvm_binding_iterator,
|
|
|
+ &phy_ctxt_counter);
|
|
|
|
|
|
if (!memcmp(mvmvif->uapsd_misbehaving_bssid, vif->bss_conf.bssid,
|
|
|
ETH_ALEN))
|
|
@@ -289,6 +309,13 @@ static bool iwl_mvm_power_allow_uapsd(struct iwl_mvm *mvm,
|
|
|
IEEE80211_P2P_OPPPS_ENABLE_BIT))
|
|
|
return false;
|
|
|
|
|
|
+ /*
|
|
|
+ * Avoid using uAPSD if client is in DCM -
|
|
|
+ * low latency issue in Miracast
|
|
|
+ */
|
|
|
+ if (hweight8(phy_ctxt_counter) >= 2)
|
|
|
+ return false;
|
|
|
+
|
|
|
return true;
|
|
|
}
|
|
|
|