iwlwifi: mvm: save low latency causes in an enum

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>
This commit is contained in:
Sara Sharon 2017-12-27 12:16:33 +02:00 committed by Luca Coelho
parent 8f27036a0e
commit 9b137866f9
3 changed files with 38 additions and 17 deletions

View 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_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
struct iwl_mvm *mvm = mvmvif->mvm; struct iwl_mvm *mvm = mvmvif->mvm;
bool prev;
u8 value; u8 value;
int ret; int ret;
@ -1287,9 +1286,7 @@ static ssize_t iwl_dbgfs_low_latency_write(struct ieee80211_vif *vif, char *buf,
return -EINVAL; return -EINVAL;
mutex_lock(&mvm->mutex); mutex_lock(&mvm->mutex);
prev = iwl_mvm_vif_low_latency(mvmvif); iwl_mvm_update_low_latency(mvm, vif, value, LOW_LATENCY_DEBUGFS);
mvmvif->low_latency_dbgfs = value;
iwl_mvm_update_low_latency(mvm, vif, prev);
mutex_unlock(&mvm->mutex); mutex_unlock(&mvm->mutex);
return count; return count;
@ -1306,9 +1303,9 @@ static ssize_t iwl_dbgfs_low_latency_read(struct file *file,
len = scnprintf(buf, sizeof(buf) - 1, len = scnprintf(buf, sizeof(buf) - 1,
"traffic=%d\ndbgfs=%d\nvcmd=%d\n", "traffic=%d\ndbgfs=%d\nvcmd=%d\n",
mvmvif->low_latency_traffic, !!(mvmvif->low_latency & LOW_LATENCY_TRAFFIC),
mvmvif->low_latency_dbgfs, !!(mvmvif->low_latency & LOW_LATENCY_DEBUGFS),
mvmvif->low_latency_vcmd); !!(mvmvif->low_latency & LOW_LATENCY_VCMD));
return simple_read_from_buffer(user_buf, count, ppos, buf, len); return simple_read_from_buffer(user_buf, count, ppos, buf, len);
} }

View File

@ -299,6 +299,18 @@ enum iwl_bt_force_ant_mode {
BT_FORCE_ANT_MAX, 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 * struct iwl_mvm_vif_bf_data - beacon filtering related data
* @bf_enabled: indicates if beacon filtering is enabled * @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 * @pm_enabled - Indicate if MAC power management is allowed
* @monitor_active: indicates that monitor context is configured, and that the * @monitor_active: indicates that monitor context is configured, and that the
* interface should get quota etc. * interface should get quota etc.
* @low_latency_traffic: indicates low latency traffic was detected * @low_latency: indicates low latency is set, see
* @low_latency_dbgfs: low latency mode set from debugfs * enum &iwl_mvm_low_latency_cause for causes.
* @low_latency_vcmd: low latency mode set from vendor command
* @ps_disabled: indicates that this interface requires PS to be disabled * @ps_disabled: indicates that this interface requires PS to be disabled
* @queue_params: QoS params for this MAC * @queue_params: QoS params for this MAC
* @bcast_sta: station used for broadcast packets. Used by the following * @bcast_sta: station used for broadcast packets. Used by the following
@ -367,7 +378,7 @@ struct iwl_mvm_vif {
bool ap_ibss_active; bool ap_ibss_active;
bool pm_enabled; bool pm_enabled;
bool monitor_active; bool monitor_active;
bool low_latency_traffic, low_latency_dbgfs, low_latency_vcmd; u8 low_latency;
bool ps_disabled; bool ps_disabled;
struct iwl_mvm_vif_bf_data bf_data; struct iwl_mvm_vif_bf_data bf_data;
@ -1756,7 +1767,8 @@ bool iwl_mvm_rx_diversity_allowed(struct iwl_mvm *mvm);
/* Low latency */ /* Low latency */
int iwl_mvm_update_low_latency(struct iwl_mvm *mvm, struct ieee80211_vif *vif, 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? */ /* get SystemLowLatencyMode - only needed for beacon threshold? */
bool iwl_mvm_low_latency(struct iwl_mvm *mvm); bool iwl_mvm_low_latency(struct iwl_mvm *mvm);
/* get VMACLowLatencyMode */ /* 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 * binding, so this has no real impact. For now, just return
* the current desired low-latency state. * the current desired low-latency state.
*/ */
return mvmvif->low_latency_dbgfs || return mvmvif->low_latency;
mvmvif->low_latency_traffic || }
mvmvif->low_latency_vcmd;
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 */ /* hw scheduler queue config */

View 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, 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); struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
int res; int res;
bool low_latency; bool prev;
lockdep_assert_held(&mvm->mutex); 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); low_latency = iwl_mvm_vif_low_latency(mvmvif);
if (low_latency == prev) if (low_latency == prev)