iwlwifi: mvm: update iwl_wowlan_patterns_cmd
authorEmmanuel Grumbach <emmanuel.grumbach@intel.com>
Mon, 21 Jun 2021 07:37:32 +0000 (10:37 +0300)
committerLuca Coelho <luciano.coelho@intel.com>
Tue, 22 Jun 2021 13:57:57 +0000 (16:57 +0300)
We need to pass the station id to tell the firmware
on which station we want to configure the patterns.

Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
Link: https://lore.kernel.org/r/iwlwifi.20210621103449.73eceb822890.I37347afbc01497a8a9e4d4afe4fa9a965abd31ac@changeid
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
drivers/net/wireless/intel/iwlwifi/fw/api/d3.h
drivers/net/wireless/intel/iwlwifi/mvm/d3.c

index a9e8f30..4dbf241 100644 (file)
@@ -318,13 +318,23 @@ struct iwl_wowlan_patterns_cmd {
        /**
         * @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
         */
        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 {
        IWL_WOWLAN_WAKEUP_MAGIC_PACKET                  = BIT(0),
index 7b13c4f..8e5814a 100644 (file)
@@ -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,
+                                struct ieee80211_vif *vif,
                                 struct cfg80211_wowlan *wowlan)
 {
+       struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
        struct iwl_wowlan_patterns_cmd *pattern_cmd;
        struct iwl_host_cmd cmd = {
                .id = WOWLAN_PATTERNS,
                .dataflags[0] = IWL_HCMD_DFL_NOCOPY,
        };
        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)
                return 0;
@@ -408,11 +413,13 @@ static int iwl_mvm_send_patterns(struct iwl_mvm *mvm,
        cmd.len[0] = sizeof(*pattern_cmd) +
                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)
                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++) {
                int mask_len = DIV_ROUND_UP(wowlan->patterns[i].pattern_len, 8);
@@ -887,7 +894,7 @@ iwl_mvm_wowlan_config(struct iwl_mvm *mvm,
 
        if (fw_has_api(&mvm->fw->ucode_capa,
                       IWL_UCODE_TLV_API_WOWLAN_TCP_SYN_WAKE))
-               ret = iwl_mvm_send_patterns(mvm, wowlan);
+               ret = iwl_mvm_send_patterns(mvm, vif, wowlan);
        else
                ret = iwl_mvm_send_patterns_v1(mvm, wowlan);
        if (ret)