iwlwifi: mvm: fix quota allocation
authorIlan Peer <ilan.peer@intel.com>
Sun, 19 Jan 2014 09:38:39 +0000 (11:38 +0200)
committerEmmanuel Grumbach <emmanuel.grumbach@intel.com>
Mon, 3 Feb 2014 20:23:37 +0000 (22:23 +0200)
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: Ilan Peer <ilan.peer@intel.com>
Reviewed-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
drivers/net/wireless/iwlwifi/mvm/quota.c

index f07ae483aa31cac19f6cdf3535599599a9f3ec4c..06d8429be1fb598902f705bd73aef530c623e8d7 100644 (file)
@@ -234,15 +234,24 @@ int iwl_mvm_update_quotas(struct iwl_mvm *mvm, struct ieee80211_vif *newvif)
                                break;
                        }
                }
-               if (n_non_lowlat) {
-                       quota = (QUOTA_100 - QUOTA_LOWLAT_MIN) / n_non_lowlat;
-                       quota_rem = QUOTA_100 - n_non_lowlat * quota -
-                                   QUOTA_LOWLAT_MIN;
-               } else {
-                       quota = QUOTA_100;
-                       quota_rem = 0;
-               }
+       }
+
+       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_rem = QUOTA_100 - n_non_lowlat * quota -
+                           QUOTA_LOWLAT_MIN;
        } 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_rem = QUOTA_100 % num_active_macs;
        } else {
@@ -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);
                else if (data.n_low_latency_bindings == 1 && n_non_lowlat &&
                         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);
+
                else
                        cmd.quotas[idx].quota =
                                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])
                        cmd.quotas[idx].max_duration =
                                cpu_to_le32(ll_max_duration);