Index: backports-20210222_001-4.4.60-b157d2276/drivers/net/wireless/ath/ath11k/qmi.c
===================================================================
--- backports-20210222_001-4.4.60-b157d2276.orig/drivers/net/wireless/ath/ath11k/qmi.c
+++ backports-20210222_001-4.4.60-b157d2276/drivers/net/wireless/ath/ath11k/qmi.c
@@ -3161,6 +3161,12 @@ out_req:
 	return ret;
 }
 
+static const struct firmware *fw_macs;
+const struct firmware* ath11k_get_custom_macs(void)
+{
+	return fw_macs;
+}
+
 static int ath11k_qmi_load_bdf_qmi(struct ath11k_base *ab)
 {
 	char filename[ATH11K_QMI_MAX_BDF_FILE_NAME_SIZE];
@@ -3188,6 +3194,8 @@ static int ath11k_qmi_load_bdf_qmi(struc
 		goto out;
 	}
 
+	request_firmware(&fw_macs, "ath11k-macs", ab->dev);
+
 	/* Load caldata */
 	if(ab->bus_params.fixed_bdf_addr) {
 		snprintf(filename, sizeof(filename),
Index: backports-20210222_001-4.4.60-b157d2276/drivers/net/wireless/ath/ath11k/wmi.c
===================================================================
--- backports-20210222_001-4.4.60-b157d2276.orig/drivers/net/wireless/ath/ath11k/wmi.c
+++ backports-20210222_001-4.4.60-b157d2276/drivers/net/wireless/ath/ath11k/wmi.c
@@ -19,6 +19,7 @@
 #include "hw.h"
 #include "peer.h"
 #include "testmode.h"
+#include <linux/firmware.h>
 
 struct wmi_tlv_policy {
 	size_t min_len;
@@ -7278,11 +7279,14 @@ mem_free:
 	return ret;
 }
 
+const struct firmware* ath11k_get_custom_macs(void);
+
 static int ath11k_wmi_tlv_rdy_parse(struct ath11k_base *ab, u16 tag, u16 len,
 				    const void *ptr, void *data)
 {
 	struct wmi_tlv_rdy_parse *rdy_parse = data;
 	struct wmi_ready_event fixed_param;
+	const struct firmware *fw_entry;
 	struct wmi_mac_addr *addr_list;
 	struct ath11k_pdev *pdev;
 	u32 num_mac_addr;
@@ -7307,6 +7311,19 @@ static int ath11k_wmi_tlv_rdy_parse(stru
 		addr_list = (struct wmi_mac_addr *)ptr;
 		num_mac_addr = rdy_parse->num_extra_mac_addr;
 
+		fw_entry = ath11k_get_custom_macs();
+		if (fw_entry) {
+			printk("applying ath11k-macs\n");
+			if (fw_entry->size >= (ab->num_radios * 6)) {
+				for (i = 0; i < ab->num_radios; i++) {
+					pdev = &ab->pdevs[i];
+		                        ether_addr_copy(pdev->mac_addr, &fw_entry->data[i * 6]);
+				}
+			}
+			ab->pdevs_macaddr_valid = true;
+			return 0;
+		}
+
 		if (!(ab->num_radios > 1 && num_mac_addr >= ab->num_radios))
 			break;
 
