]> git.baikalelectronics.ru Git - kernel.git/commitdiff
ath11k: support loading ELF board files
authorBen Greear <greearb@candelatech.com>
Tue, 29 Sep 2020 17:15:29 +0000 (20:15 +0300)
committerKalle Valo <kvalo@codeaurora.org>
Thu, 1 Oct 2020 19:30:53 +0000 (22:30 +0300)
The QCA6390 board I have, model 8291M-PR comes with an ELF board file.  To get
this to at least somewhat work, I renamed bdwlan.e04 to 'board.bin' and then
added this patch to check for ELF magic string in the beginning of the file.
If that is found, use type ELF.  After this the driver loads.

Tested-on: QCA6390 hw2.0 PCI WLAN.HST.1.0.1-01740-QCAHSTSWPLZ_V2_TO_X86-1

Signed-off-by: Ben Greear <greearb@candelatech.com>
[kvalo@codeaurora.org: use elf.h, minor cleanup]
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
Link: https://lore.kernel.org/r/1601399736-3210-2-git-send-email-kvalo@codeaurora.org
drivers/net/wireless/ath/ath11k/qmi.c

index b906b50ee57e5fefa1ed588124eac9ca903d180f..9144f28b37d12bc2fe6891d7e81464d01da0f8ae 100644 (file)
@@ -3,6 +3,8 @@
  * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
  */
 
+#include <linux/elf.h>
+
 #include "qmi.h"
 #include "core.h"
 #include "debug.h"
@@ -1990,6 +1992,7 @@ static int ath11k_qmi_load_bdf_qmi(struct ath11k_base *ab)
        struct qmi_txn txn = {};
        int ret;
        const u8 *temp;
+       int bdf_type;
 
        req = kzalloc(sizeof(*req), GFP_KERNEL);
        if (!req)
@@ -2006,6 +2009,13 @@ static int ath11k_qmi_load_bdf_qmi(struct ath11k_base *ab)
        temp = bd.data;
        remaining = bd.len;
 
+       if (bd.len >= SELFMAG && memcmp(bd.data, ELFMAG, SELFMAG) == 0)
+               bdf_type = ATH11K_QMI_BDF_TYPE_ELF;
+       else
+               bdf_type = ATH11K_QMI_BDF_TYPE_BIN;
+
+       ath11k_dbg(ab, ATH11K_DBG_QMI, "qmi bdf_type %d\n", bdf_type);
+
        while (remaining) {
                req->valid = 1;
                req->file_id_valid = 1;
@@ -2015,7 +2025,7 @@ static int ath11k_qmi_load_bdf_qmi(struct ath11k_base *ab)
                req->seg_id_valid = 1;
                req->data_valid = 1;
                req->data_len = ATH11K_QMI_MAX_BDF_FILE_NAME_SIZE;
-               req->bdf_type = ATH11K_QMI_BDF_TYPE_BIN;
+               req->bdf_type = bdf_type;
                req->bdf_type_valid = 1;
                req->end_valid = 1;
                req->end = 0;