Commit 7b4fe06c authored by Ilan Peer's avatar Ilan Peer Committed by Emmanuel Grumbach

iwlwifi: mvm: fix quota allocation

Divide the maximal quota between all the data interfaces even in the
case of a single low latency binding without any other non low latency
interfaces, so that afterwards the quota allocation (which considers
the number of data interfaces) will be correct.
Signed-off-by: default avatarIlan Peer <ilan.peer@intel.com>
Reviewed-by: default avatarJohannes Berg <johannes.berg@intel.com>
Signed-off-by: default avatarEmmanuel Grumbach <emmanuel.grumbach@intel.com>
parent 2d675e52
...@@ -234,15 +234,24 @@ int iwl_mvm_update_quotas(struct iwl_mvm *mvm, struct ieee80211_vif *newvif) ...@@ -234,15 +234,24 @@ int iwl_mvm_update_quotas(struct iwl_mvm *mvm, struct ieee80211_vif *newvif)
break; break;
} }
} }
if (n_non_lowlat) { }
if (data.n_low_latency_bindings == 1 && n_non_lowlat) {
/*
* Reserve quota for the low latency binding in case that
* there are several data bindings but only a single
* low latency one. Split the rest of the quota equally
* between the other data interfaces.
*/
quota = (QUOTA_100 - QUOTA_LOWLAT_MIN) / n_non_lowlat; quota = (QUOTA_100 - QUOTA_LOWLAT_MIN) / n_non_lowlat;
quota_rem = QUOTA_100 - n_non_lowlat * quota - quota_rem = QUOTA_100 - n_non_lowlat * quota -
QUOTA_LOWLAT_MIN; QUOTA_LOWLAT_MIN;
} else {
quota = QUOTA_100;
quota_rem = 0;
}
} else if (num_active_macs) { } else if (num_active_macs) {
/*
* There are 0 or more than 1 low latency bindings, or all the
* data interfaces belong to the single low latency binding.
* Split the quota equally between the data interfaces.
*/
quota = QUOTA_100 / num_active_macs; quota = QUOTA_100 / num_active_macs;
quota_rem = QUOTA_100 % num_active_macs; quota_rem = QUOTA_100 % num_active_macs;
} else { } else {
...@@ -262,11 +271,22 @@ int iwl_mvm_update_quotas(struct iwl_mvm *mvm, struct ieee80211_vif *newvif) ...@@ -262,11 +271,22 @@ int iwl_mvm_update_quotas(struct iwl_mvm *mvm, struct ieee80211_vif *newvif)
cmd.quotas[idx].quota = cpu_to_le32(0); cmd.quotas[idx].quota = cpu_to_le32(0);
else if (data.n_low_latency_bindings == 1 && n_non_lowlat && else if (data.n_low_latency_bindings == 1 && n_non_lowlat &&
data.low_latency[i]) data.low_latency[i])
/*
* There is more than one binding, but only one of the
* bindings is in low latency. For this case, allocate
* the minimal required quota for the low latency
* binding.
*/
cmd.quotas[idx].quota = cpu_to_le32(QUOTA_LOWLAT_MIN); cmd.quotas[idx].quota = cpu_to_le32(QUOTA_LOWLAT_MIN);
else else
cmd.quotas[idx].quota = cmd.quotas[idx].quota =
cpu_to_le32(quota * data.n_interfaces[i]); cpu_to_le32(quota * data.n_interfaces[i]);
WARN_ONCE(le32_to_cpu(cmd.quotas[idx].quota) > QUOTA_100,
"Binding=%d, quota=%u > max=%u\n",
idx, le32_to_cpu(cmd.quotas[idx].quota), QUOTA_100);
if (data.n_interfaces[i] && !data.low_latency[i]) if (data.n_interfaces[i] && !data.low_latency[i])
cmd.quotas[idx].max_duration = cmd.quotas[idx].max_duration =
cpu_to_le32(ll_max_duration); cpu_to_le32(ll_max_duration);
......
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