iwlwifi: mvm: set different pm_timeout for action frames
When building a Tx Command for management frames, we are lacking a check for action frames, for which we should set a different pm_timeout. This cause the fw to stay awake for 100TU after each such frame is transmitted, resulting an excessive power consumption. Signed-off-by: Avri Altman <avri.altman@intel.com> Reviewed-by: Johannes Berg <johannes.berg@intel.com> Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
This commit is contained in:
parent
eed6e97197
commit
b084a35663
@ -124,6 +124,18 @@ enum iwl_tx_flags {
|
||||
TX_CMD_FLG_HCCA_CHUNK = BIT(31)
|
||||
}; /* TX_FLAGS_BITS_API_S_VER_1 */
|
||||
|
||||
/**
|
||||
* enum iwl_tx_pm_timeouts - pm timeout values in TX command
|
||||
* @PM_FRAME_NONE: no need to suspend sleep mode
|
||||
* @PM_FRAME_MGMT: fw suspend sleep mode for 100TU
|
||||
* @PM_FRAME_ASSOC: fw suspend sleep mode for 10sec
|
||||
*/
|
||||
enum iwl_tx_pm_timeouts {
|
||||
PM_FRAME_NONE = 0,
|
||||
PM_FRAME_MGMT = 2,
|
||||
PM_FRAME_ASSOC = 3,
|
||||
};
|
||||
|
||||
/*
|
||||
* TX command security control
|
||||
*/
|
||||
|
@ -153,18 +153,20 @@ void iwl_mvm_set_tx_cmd(struct iwl_mvm *mvm, struct sk_buff *skb,
|
||||
|
||||
if (ieee80211_is_mgmt(fc)) {
|
||||
if (ieee80211_is_assoc_req(fc) || ieee80211_is_reassoc_req(fc))
|
||||
tx_cmd->pm_frame_timeout = cpu_to_le16(3);
|
||||
tx_cmd->pm_frame_timeout = cpu_to_le16(PM_FRAME_ASSOC);
|
||||
else if (ieee80211_is_action(fc))
|
||||
tx_cmd->pm_frame_timeout = cpu_to_le16(PM_FRAME_NONE);
|
||||
else
|
||||
tx_cmd->pm_frame_timeout = cpu_to_le16(2);
|
||||
tx_cmd->pm_frame_timeout = cpu_to_le16(PM_FRAME_MGMT);
|
||||
|
||||
/* The spec allows Action frames in A-MPDU, we don't support
|
||||
* it
|
||||
*/
|
||||
WARN_ON_ONCE(info->flags & IEEE80211_TX_CTL_AMPDU);
|
||||
} else if (info->control.flags & IEEE80211_TX_CTRL_PORT_CTRL_PROTO) {
|
||||
tx_cmd->pm_frame_timeout = cpu_to_le16(2);
|
||||
tx_cmd->pm_frame_timeout = cpu_to_le16(PM_FRAME_MGMT);
|
||||
} else {
|
||||
tx_cmd->pm_frame_timeout = 0;
|
||||
tx_cmd->pm_frame_timeout = cpu_to_le16(PM_FRAME_NONE);
|
||||
}
|
||||
|
||||
if (ieee80211_is_data(fc) && len > mvm->rts_threshold &&
|
||||
|
Loading…
Reference in New Issue
Block a user