Commit 0b35991a authored by Emmanuel Grumbach's avatar Emmanuel Grumbach Committed by Luca Coelho

iwlwifi: mvm: update iwl_wowlan_patterns_cmd

We need to pass the station id to tell the firmware
on which station we want to configure the patterns.
Signed-off-by: default avatarEmmanuel Grumbach <emmanuel.grumbach@intel.com>
Signed-off-by: default avatarLuca Coelho <luciano.coelho@intel.com>
Link: https://lore.kernel.org/r/iwlwifi.20210621103449.73eceb822890.I37347afbc01497a8a9e4d4afe4fa9a965abd31ac@changeidSigned-off-by: default avatarLuca Coelho <luciano.coelho@intel.com>
parent b60bc716
...@@ -318,13 +318,23 @@ struct iwl_wowlan_patterns_cmd { ...@@ -318,13 +318,23 @@ struct iwl_wowlan_patterns_cmd {
/** /**
* @n_patterns: number of patterns * @n_patterns: number of patterns
*/ */
__le32 n_patterns; u8 n_patterns;
/**
* @n_patterns: sta_id
*/
u8 sta_id;
/**
* @reserved: reserved for alignment
*/
__le16 reserved;
/** /**
* @patterns: the patterns, array length in @n_patterns * @patterns: the patterns, array length in @n_patterns
*/ */
struct iwl_wowlan_pattern_v2 patterns[]; struct iwl_wowlan_pattern_v2 patterns[];
} __packed; /* WOWLAN_PATTERN_ARRAY_API_S_VER_2 */ } __packed; /* WOWLAN_PATTERN_ARRAY_API_S_VER_3 */
enum iwl_wowlan_wakeup_filters { enum iwl_wowlan_wakeup_filters {
IWL_WOWLAN_WAKEUP_MAGIC_PACKET = BIT(0), IWL_WOWLAN_WAKEUP_MAGIC_PACKET = BIT(0),
......
...@@ -393,14 +393,19 @@ static int iwl_mvm_send_patterns_v1(struct iwl_mvm *mvm, ...@@ -393,14 +393,19 @@ static int iwl_mvm_send_patterns_v1(struct iwl_mvm *mvm,
} }
static int iwl_mvm_send_patterns(struct iwl_mvm *mvm, static int iwl_mvm_send_patterns(struct iwl_mvm *mvm,
struct ieee80211_vif *vif,
struct cfg80211_wowlan *wowlan) struct cfg80211_wowlan *wowlan)
{ {
struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
struct iwl_wowlan_patterns_cmd *pattern_cmd; struct iwl_wowlan_patterns_cmd *pattern_cmd;
struct iwl_host_cmd cmd = { struct iwl_host_cmd cmd = {
.id = WOWLAN_PATTERNS, .id = WOWLAN_PATTERNS,
.dataflags[0] = IWL_HCMD_DFL_NOCOPY, .dataflags[0] = IWL_HCMD_DFL_NOCOPY,
}; };
int i, err; int i, err;
int ver = iwl_fw_lookup_cmd_ver(mvm->fw, LONG_GROUP,
WOWLAN_PATTERNS,
IWL_FW_CMD_VER_UNKNOWN);
if (!wowlan->n_patterns) if (!wowlan->n_patterns)
return 0; return 0;
...@@ -408,11 +413,13 @@ static int iwl_mvm_send_patterns(struct iwl_mvm *mvm, ...@@ -408,11 +413,13 @@ static int iwl_mvm_send_patterns(struct iwl_mvm *mvm,
cmd.len[0] = sizeof(*pattern_cmd) + cmd.len[0] = sizeof(*pattern_cmd) +
wowlan->n_patterns * sizeof(struct iwl_wowlan_pattern_v2); wowlan->n_patterns * sizeof(struct iwl_wowlan_pattern_v2);
pattern_cmd = kmalloc(cmd.len[0], GFP_KERNEL); pattern_cmd = kzalloc(cmd.len[0], GFP_KERNEL);
if (!pattern_cmd) if (!pattern_cmd)
return -ENOMEM; return -ENOMEM;
pattern_cmd->n_patterns = cpu_to_le32(wowlan->n_patterns); pattern_cmd->n_patterns = wowlan->n_patterns;
if (ver >= 3)
pattern_cmd->sta_id = mvmvif->ap_sta_id;
for (i = 0; i < wowlan->n_patterns; i++) { for (i = 0; i < wowlan->n_patterns; i++) {
int mask_len = DIV_ROUND_UP(wowlan->patterns[i].pattern_len, 8); int mask_len = DIV_ROUND_UP(wowlan->patterns[i].pattern_len, 8);
...@@ -887,7 +894,7 @@ iwl_mvm_wowlan_config(struct iwl_mvm *mvm, ...@@ -887,7 +894,7 @@ iwl_mvm_wowlan_config(struct iwl_mvm *mvm,
if (fw_has_api(&mvm->fw->ucode_capa, if (fw_has_api(&mvm->fw->ucode_capa,
IWL_UCODE_TLV_API_WOWLAN_TCP_SYN_WAKE)) IWL_UCODE_TLV_API_WOWLAN_TCP_SYN_WAKE))
ret = iwl_mvm_send_patterns(mvm, wowlan); ret = iwl_mvm_send_patterns(mvm, vif, wowlan);
else else
ret = iwl_mvm_send_patterns_v1(mvm, wowlan); ret = iwl_mvm_send_patterns_v1(mvm, wowlan);
if (ret) if (ret)
......
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