iwlwifi: mvm: save low latency causes in an enum
authorSara Sharon <sara.sharon@intel.com>
Wed, 27 Dec 2017 10:16:33 +0000 (12:16 +0200)
committerLuca Coelho <luciano.coelho@intel.com>
Wed, 28 Mar 2018 19:43:40 +0000 (22:43 +0300)
Currently we have a boolean variable for each cause.

This costs space, and requires to check each separately
when determining low latency.

Since we have another cause incoming, convert it to an enum.

While at it, move the retrieval of the prev value and the
assignment of the new value to be inside iwl_mvm_update_low_latency
and save the need for each caller to do it separately.

Signed-off-by: Sara Sharon <sara.sharon@intel.com>
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
drivers/net/wireless/intel/iwlwifi/mvm/debugfs-vif.c
drivers/net/wireless/intel/iwlwifi/mvm/mvm.h
drivers/net/wireless/intel/iwlwifi/mvm/utils.c

index 4e9d1792baf37e43c196b1448963d4917c827488..f7fcf700196bc979ad235b049fef17f2decdf1da 100644 (file)
@@ -1276,7 +1276,6 @@ static ssize_t iwl_dbgfs_low_latency_write(struct ieee80211_vif *vif, char *buf,
 {
        struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
        struct iwl_mvm *mvm = mvmvif->mvm;
-       bool prev;
        u8 value;
        int ret;
 
@@ -1287,9 +1286,7 @@ static ssize_t iwl_dbgfs_low_latency_write(struct ieee80211_vif *vif, char *buf,
                return -EINVAL;
 
        mutex_lock(&mvm->mutex);
-       prev = iwl_mvm_vif_low_latency(mvmvif);
-       mvmvif->low_latency_dbgfs = value;
-       iwl_mvm_update_low_latency(mvm, vif, prev);
+       iwl_mvm_update_low_latency(mvm, vif, value, LOW_LATENCY_DEBUGFS);
        mutex_unlock(&mvm->mutex);
 
        return count;
@@ -1306,9 +1303,9 @@ static ssize_t iwl_dbgfs_low_latency_read(struct file *file,
 
        len = scnprintf(buf, sizeof(buf) - 1,
                        "traffic=%d\ndbgfs=%d\nvcmd=%d\n",
-                       mvmvif->low_latency_traffic,
-                       mvmvif->low_latency_dbgfs,
-                       mvmvif->low_latency_vcmd);
+                       !!(mvmvif->low_latency & LOW_LATENCY_TRAFFIC),
+                       !!(mvmvif->low_latency & LOW_LATENCY_DEBUGFS),
+                       !!(mvmvif->low_latency & LOW_LATENCY_VCMD));
        return simple_read_from_buffer(user_buf, count, ppos, buf, len);
 }
 
index 82445e12aacbcc2dfc5f894d10bc60ff72d90554..d2cf751db68dcc8548919fbef9acc7d9b62e3fdb 100644 (file)
@@ -299,6 +299,18 @@ enum iwl_bt_force_ant_mode {
        BT_FORCE_ANT_MAX,
 };
 
+/**
+* struct iwl_mvm_low_latency_cause - low latency set causes
+* @LOW_LATENCY_TRAFFIC: indicates low latency traffic was detected
+* @LOW_LATENCY_DEBUGFS: low latency mode set from debugfs
+* @LOW_LATENCY_VCMD: low latency mode set from vendor command
+*/
+enum iwl_mvm_low_latency_cause {
+       LOW_LATENCY_TRAFFIC = BIT(0),
+       LOW_LATENCY_DEBUGFS = BIT(1),
+       LOW_LATENCY_VCMD = BIT(2),
+};
+
 /**
 * struct iwl_mvm_vif_bf_data - beacon filtering related data
 * @bf_enabled: indicates if beacon filtering is enabled
@@ -335,9 +347,8 @@ struct iwl_mvm_vif_bf_data {
  * @pm_enabled - Indicate if MAC power management is allowed
  * @monitor_active: indicates that monitor context is configured, and that the
  *     interface should get quota etc.
- * @low_latency_traffic: indicates low latency traffic was detected
- * @low_latency_dbgfs: low latency mode set from debugfs
- * @low_latency_vcmd: low latency mode set from vendor command
+ * @low_latency: indicates low latency is set, see
+ *     enum &iwl_mvm_low_latency_cause for causes.
  * @ps_disabled: indicates that this interface requires PS to be disabled
  * @queue_params: QoS params for this MAC
  * @bcast_sta: station used for broadcast packets. Used by the following
@@ -367,7 +378,7 @@ struct iwl_mvm_vif {
        bool ap_ibss_active;
        bool pm_enabled;
        bool monitor_active;
-       bool low_latency_traffic, low_latency_dbgfs, low_latency_vcmd;
+       u8 low_latency;
        bool ps_disabled;
        struct iwl_mvm_vif_bf_data bf_data;
 
@@ -1756,7 +1767,8 @@ bool iwl_mvm_rx_diversity_allowed(struct iwl_mvm *mvm);
 
 /* Low latency */
 int iwl_mvm_update_low_latency(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
-                              bool value);
+                             bool low_latency,
+                             enum iwl_mvm_low_latency_cause cause);
 /* get SystemLowLatencyMode - only needed for beacon threshold? */
 bool iwl_mvm_low_latency(struct iwl_mvm *mvm);
 /* get VMACLowLatencyMode */
@@ -1772,9 +1784,17 @@ static inline bool iwl_mvm_vif_low_latency(struct iwl_mvm_vif *mvmvif)
         * binding, so this has no real impact. For now, just return
         * the current desired low-latency state.
         */
-       return mvmvif->low_latency_dbgfs ||
-              mvmvif->low_latency_traffic ||
-              mvmvif->low_latency_vcmd;
+       return mvmvif->low_latency;
+}
+
+static inline
+void iwl_mvm_vif_set_low_latency(struct iwl_mvm_vif *mvmvif, bool set,
+                                enum iwl_mvm_low_latency_cause cause)
+{
+       if (set)
+               mvmvif->low_latency |= cause;
+       else
+               mvmvif->low_latency &= ~cause;
 }
 
 /* hw scheduler queue config */
index 70f8b8eb6117ed2b9ea4b1ff7f10b97f3785798e..bebcfb44c8c2c13f0b91d35fbb644436fedac0c8 100644 (file)
@@ -1034,14 +1034,18 @@ bool iwl_mvm_rx_diversity_allowed(struct iwl_mvm *mvm)
 }
 
 int iwl_mvm_update_low_latency(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
-                              bool prev)
+                              bool low_latency,
+                              enum iwl_mvm_low_latency_cause cause)
 {
        struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
        int res;
-       bool low_latency;
+       bool prev;
 
        lockdep_assert_held(&mvm->mutex);
 
+       prev = iwl_mvm_vif_low_latency(mvmvif);
+       iwl_mvm_vif_set_low_latency(mvmvif, low_latency, cause);
+
        low_latency = iwl_mvm_vif_low_latency(mvmvif);
 
        if (low_latency == prev)