// SPDX-License-Identifier: BSD-3-Clause-Clear
 /*
  * Copyright (c) 2020 The Linux Foundation. All rights reserved.
- * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2022-2024 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #include <linux/delay.h>
        u8 hdr_8023_bit_mask[ETH_HLEN] = {};
        u8 hdr_80211_pattern[WOW_HDR_LEN] = {};
        u8 hdr_80211_bit_mask[WOW_HDR_LEN] = {};
+       u8 bytemask[WOW_MAX_PATTERN_SIZE] = {};
 
        int total_len = old->pkt_offset + old->pattern_len;
        int hdr_80211_end_offset;
        struct rfc1042_hdr *new_rfc_mask =
                (struct rfc1042_hdr *)(hdr_80211_bit_mask + hdr_len);
        int rfc_len = sizeof(*new_rfc_pattern);
+       int i;
+
+       /* convert bitmask to bytemask */
+       for (i = 0; i < old->pattern_len; i++)
+               if (old->mask[i / 8] & BIT(i % 8))
+                       bytemask[i] = 0xff;
 
        memcpy(hdr_8023_pattern + old->pkt_offset,
               old->pattern, ETH_HLEN - old->pkt_offset);
        memcpy(hdr_8023_bit_mask + old->pkt_offset,
-              old->mask, ETH_HLEN - old->pkt_offset);
+              bytemask, ETH_HLEN - old->pkt_offset);
 
        /* Copy destination address */
        memcpy(new_hdr_pattern->addr1, old_hdr_pattern->h_dest, ETH_ALEN);
                       (void *)old->pattern + ETH_HLEN - old->pkt_offset,
                       total_len - ETH_HLEN);
                memcpy((u8 *)new->mask + new->pattern_len,
-                      (void *)old->mask + ETH_HLEN - old->pkt_offset,
+                      bytemask + ETH_HLEN - old->pkt_offset,
                       total_len - ETH_HLEN);
 
                new->pattern_len += total_len - ETH_HLEN;
        }
 
        for (i = 0; i < wowlan->n_patterns; i++) {
-               u8 bitmask[WOW_MAX_PATTERN_SIZE] = {};
                u8 ath_pattern[WOW_MAX_PATTERN_SIZE] = {};
                u8 ath_bitmask[WOW_MAX_PATTERN_SIZE] = {};
                struct cfg80211_pkt_pattern new_pattern = {};
-               struct cfg80211_pkt_pattern old_pattern = patterns[i];
-               int j;
 
                new_pattern.pattern = ath_pattern;
                new_pattern.mask = ath_bitmask;
                if (patterns[i].pattern_len > WOW_MAX_PATTERN_SIZE)
                        continue;
-               /* convert bytemask to bitmask */
-               for (j = 0; j < patterns[i].pattern_len; j++)
-                       if (patterns[i].mask[j / 8] & BIT(j % 8))
-                               bitmask[j] = 0xff;
-               old_pattern.mask = bitmask;
 
                if (ar->wmi->wmi_ab->wlan_resource_config.rx_decap_mode ==
                    ATH11K_HW_TXRX_NATIVE_WIFI) {
                        if (patterns[i].pkt_offset < ETH_HLEN) {
-                               u8 pattern_ext[WOW_MAX_PATTERN_SIZE] = {};
-
-                               memcpy(pattern_ext, old_pattern.pattern,
-                                      old_pattern.pattern_len);
-                               old_pattern.pattern = pattern_ext;
                                ath11k_wow_convert_8023_to_80211(&new_pattern,
-                                                                &old_pattern);
+                                                                &patterns[i]);
                        } else {
-                               new_pattern = old_pattern;
+                               int j;
+
+                               new_pattern = patterns[i];
+                               new_pattern.mask = ath_bitmask;
+
+                               /* convert bitmask to bytemask */
+                               for (j = 0; j < patterns[i].pattern_len; j++)
+                                       if (patterns[i].mask[j / 8] & BIT(j % 8))
+                                               ath_bitmask[j] = 0xff;
+
                                new_pattern.pkt_offset += WOW_HDR_LEN - ETH_HLEN;
                        }
                }