aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNicolas Dechesne <ndechesne@users.noreply.github.com>2021-02-09 13:59:55 +0100
committerGitHub <noreply@github.com>2021-02-09 13:59:55 +0100
commit8db924061c0d1630cb1da0a0c29e519db56f9964 (patch)
tree2ea3ac26631a3a7cefe872501acb5ea27052d607
parent6f227121f2384082bcbc12bd574115131986ec35 (diff)
parent0063f92ce3cc741dee8484e31f44587bc91330eb (diff)
downloadmeta-qcom-8db924061c0d1630cb1da0a0c29e519db56f9964.tar.gz
meta-qcom-8db924061c0d1630cb1da0a0c29e519db56f9964.tar.bz2
meta-qcom-8db924061c0d1630cb1da0a0c29e519db56f9964.zip
Merge pull request #255 from lumag/dunfell-board-data
DB845 & RB5 WiFi board data support for dunfell
-rw-r--r--recipes-bsp/firmware/firmware-qcom-dragonboard845c_20190529180356-v4.bb15
-rw-r--r--recipes-bsp/firmware/firmware-qcom-rb5_20210118133815-v2.bb16
-rw-r--r--recipes-devtools/qca-swiss-army-knife/qca-swiss-army-knife/0001-ath10k-bdencoder-Switch-to-python3.patch146
-rw-r--r--recipes-devtools/qca-swiss-army-knife/qca-swiss-army-knife/0001-read-powers-port-to-python3.patch212
-rw-r--r--recipes-devtools/qca-swiss-army-knife/qca-swiss-army-knife/0002-ath10k-bdencoder-Add-option-to-switch-to-ath11k-mode.patch116
-rw-r--r--recipes-devtools/qca-swiss-army-knife/qca-swiss-army-knife/0002-ath10k-fwencoder-port-to-python3.patch272
-rw-r--r--recipes-devtools/qca-swiss-army-knife/qca-swiss-army-knife/0003-scripts-port-to-python3.patch34
-rw-r--r--recipes-devtools/qca-swiss-army-knife/qca-swiss-army-knife/ath10k-generate-board-2_json.sh (renamed from recipes-bsp/firmware/firmware-qcom-dragonboard845c/generate_board-2_json.sh)19
-rw-r--r--recipes-devtools/qca-swiss-army-knife/qca-swiss-army-knife/ath11k-generate-board-2_json.sh23
-rw-r--r--recipes-devtools/qca-swiss-army-knife/qca-swiss-army-knife_git.bb32
-rw-r--r--recipes-kernel/linux-firmware/linux-firmware_%.bbappend4
11 files changed, 871 insertions, 18 deletions
diff --git a/recipes-bsp/firmware/firmware-qcom-dragonboard845c_20190529180356-v4.bb b/recipes-bsp/firmware/firmware-qcom-dragonboard845c_20190529180356-v4.bb
index 91fb2e1..fbc9187 100644
--- a/recipes-bsp/firmware/firmware-qcom-dragonboard845c_20190529180356-v4.bb
+++ b/recipes-bsp/firmware/firmware-qcom-dragonboard845c_20190529180356-v4.bb
@@ -3,26 +3,19 @@ DESCRIPTION = "QCOM Firmware for DragonBoard 845c"
LICENSE = "Proprietary"
LIC_FILES_CHKSUM = "file://LICENSE.qcom.txt;md5=cbbe399f2c983ad51768f4561587f000"
-SRC_URI = "https://releases.linaro.org/96boards/dragonboard845c/qualcomm/firmware/RB3_firmware_${PV}.zip \
- git://github.com/alimon/qca-swiss-army-knife \
- file://generate_board-2_json.sh"
+SRC_URI = "https://releases.linaro.org/96boards/dragonboard845c/qualcomm/firmware/RB3_firmware_${PV}.zip;subdir=${BP}"
SRC_URI[md5sum] = "ad69855a1275547b16d94a1b5405ac62"
SRC_URI[sha256sum] = "4289d2f2a7124b104d0274879e702aae9b1e50c42eec3747f8584c6744ef65e3"
-SRCREV = "0c01a2abc3e9855b71f0fbea2c335011104d9ec0"
COMPATIBLE_MACHINE = "(dragonboard-845c)"
PACKAGE_ARCH = "${MACHINE_ARCH}"
-DEPENDS += "bash-native"
+DEPENDS += "qca-swiss-army-knife-native"
inherit python3native
-S = "${WORKDIR}"
-
do_compile() {
# Build board-2.bin needed by WiFi
- mkdir -p bdf
- cp ./38-bdwlan_split/bdwlan*.* bdf
- bash generate_board-2_json.sh bdf board-2.json
- python3 git/tools/scripts/ath10k/ath10k-bdencoder -c board-2.json -o board-2.bin
+ ath10k-generate-board-2_json.sh ./38-bdwlan_split board-2.json
+ python3 "${STAGING_BINDIR_NATIVE}/ath10k-bdencoder" -c board-2.json -o board-2.bin
}
do_install() {
diff --git a/recipes-bsp/firmware/firmware-qcom-rb5_20210118133815-v2.bb b/recipes-bsp/firmware/firmware-qcom-rb5_20210118133815-v2.bb
index fbd7f4f..da3f19b 100644
--- a/recipes-bsp/firmware/firmware-qcom-rb5_20210118133815-v2.bb
+++ b/recipes-bsp/firmware/firmware-qcom-rb5_20210118133815-v2.bb
@@ -15,10 +15,18 @@ SRC_URI = " \
SRC_URI[md5sum] = "d9289f59fe4f93ce433707294c9286ca"
SRC_URI[sha256sum] = "9d7b42916d83c8f721258175b8d7a9ed758ebe02228d36099e6ea1a2b2a556d3"
+DEPENDS += "qca-swiss-army-knife-native"
+
PACKAGE_ARCH = "${MACHINE_ARCH}"
VENUS_FW = "vpu-1.0"
+do_compile() {
+ # Build board-2.bin needed by WiFi
+ ath11k-generate-board-2_json.sh ./38-bdwlan_split board-2.json
+ python3 "${STAGING_BINDIR_NATIVE}/ath10k-bdencoder" -m ath11k -c board-2.json -o board-2.bin
+}
+
do_install() {
install -d ${D}${nonarch_base_libdir}/firmware/qcom/sm8250
@@ -36,7 +44,7 @@ do_install() {
install -m 0444 ./33-venus_split/venus.b* ./33-venus_split/venus.mdt ${D}${nonarch_base_libdir}/firmware/qcom/${VENUS_FW}
install -d ${D}${nonarch_base_libdir}/firmware/ath11k/QCA6390/hw2.0/
- install -m 0444 ./38-bdwlan_split/bdwlan.e04 ${D}${nonarch_base_libdir}/firmware/ath11k/QCA6390/hw2.0/board.bin
+ install -m 0444 ${S}/board-2.bin ${D}${nonarch_base_libdir}/firmware/ath11k/QCA6390/hw2.0/board-2.bin
install -d ${D}${sysconfdir}/
install -m 0644 LICENSE.qcom.txt ${D}${sysconfdir}/QCOM-LINUX-BOARD-SUPPORT-LICENSE-${PN}
@@ -55,3 +63,9 @@ RCONFLICTS_${PN} += "linux-firmware-qcom-adreno-a650"
RPROVIDES_${PN} += "linux-firmware-qcom-${VENUS_FW}"
RREPLACES_${PN} += "linux-firmware-qcom-${VENUS_FW}"
RCONFLICTS_${PN} += "linux-firmware-qcom-${VENUS_FW}"
+
+inherit update-alternatives
+
+ALTERNATIVE_${PN} = "qca6390-board2"
+ALTERNATIVE_LINK_NAME[qca6390-board2] = "/lib/firmware/ath11k/QCA6390/hw2.0/board-2.bin"
+ALTERNATIVE_PRIORITY = "100"
diff --git a/recipes-devtools/qca-swiss-army-knife/qca-swiss-army-knife/0001-ath10k-bdencoder-Switch-to-python3.patch b/recipes-devtools/qca-swiss-army-knife/qca-swiss-army-knife/0001-ath10k-bdencoder-Switch-to-python3.patch
new file mode 100644
index 0000000..3be757b
--- /dev/null
+++ b/recipes-devtools/qca-swiss-army-knife/qca-swiss-army-knife/0001-ath10k-bdencoder-Switch-to-python3.patch
@@ -0,0 +1,146 @@
+From 71d960adea6e5287ac80e976e58865f59328f6c4 Mon Sep 17 00:00:00 2001
+From: Sven Eckelmann <sven@narfation.org>
+Date: Wed, 14 Oct 2020 15:52:02 +0200
+Subject: [PATCH 1/2] ath10k-bdencoder: Switch to python3
+
+Python 2.x is EOL since January 2020. The first distributions already
+started to drop the interpreters from their next distribution release. Just
+add some minor changes to make it python3 compatible.
+
+Signed-off-by: Sven Eckelmann <sven@narfation.org>
+---
+ tools/scripts/ath10k/ath10k-bdencoder | 35 ++++++++++++++-------------
+ 1 file changed, 18 insertions(+), 17 deletions(-)
+
+diff --git a/tools/scripts/ath10k/ath10k-bdencoder b/tools/scripts/ath10k/ath10k-bdencoder
+index 5f41a6be9446..1635e87b6f5f 100755
+--- a/tools/scripts/ath10k/ath10k-bdencoder
++++ b/tools/scripts/ath10k/ath10k-bdencoder
+@@ -1,4 +1,4 @@
+-#!/usr/bin/python
++#!/usr/bin/python3
+ #
+ # Copyright (c) 2015 Qualcomm Atheros, Inc.
+ # Copyright (c) 2018, The Linux Foundation. All rights reserved.
+@@ -33,7 +33,7 @@ import mailbox
+ MAX_BUF_LEN = 2000000
+
+ # the signature length also includes null byte and padding
+-ATH10K_BOARD_SIGNATURE = "QCA-ATH10K-BOARD"
++ATH10K_BOARD_SIGNATURE = b"QCA-ATH10K-BOARD"
+ ATH10K_BOARD_SIGNATURE_LEN = 20
+
+ PADDING_MAGIC = 0x6d
+@@ -83,7 +83,7 @@ def add_ie(buf, offset, id, value):
+ def xclip(msg):
+ p = subprocess.Popen(['xclip', '-selection', 'clipboard'],
+ stdin=subprocess.PIPE)
+- p.communicate(msg)
++ p.communicate(msg.encode())
+
+
+ # to workaround annoying python feature of returning negative hex values
+@@ -105,7 +105,8 @@ class BoardName():
+ def parse_ie(buf, offset, length):
+ self = BoardName()
+ fmt = '<%ds' % length
+- (self.name, ) = struct.unpack_from(fmt, buf, offset)
++ (name, ) = struct.unpack_from(fmt, buf, offset)
++ self.name = name.decode()
+
+ logging.debug('BoardName.parse_ie(): offset %d length %d self %s' %
+ (offset, length, self))
+@@ -310,7 +311,7 @@ class BoardContainer:
+ allnames.append(name)
+
+ def _add_signature(self, buf, offset):
+- signature = ATH10K_BOARD_SIGNATURE + '\0'
++ signature = ATH10K_BOARD_SIGNATURE + b'\0'
+ length = len(signature)
+ pad_len = padding_needed(length)
+ length = length + pad_len
+@@ -321,7 +322,7 @@ class BoardContainer:
+ struct.pack_into('<B', padding, i, PADDING_MAGIC)
+
+ fmt = '<%ds%ds' % (len(signature), pad_len)
+- struct.pack_into(fmt, buf, offset, signature.encode(), padding.raw)
++ struct.pack_into(fmt, buf, offset, signature, padding.raw)
+ offset += length
+
+ # make sure ATH10K_BOARD_SIGNATURE_LEN is correct
+@@ -445,7 +446,7 @@ def cmd_extract(args):
+ b['data'] = filename
+ mapping.append(b)
+
+- f = open(filename, 'w')
++ f = open(filename, 'wb')
+ f.write(board.data.data)
+ f.close()
+
+@@ -483,11 +484,11 @@ def diff_boardfiles(filename1, filename2, diff):
+
+ container1 = BoardContainer().open(filename1)
+ (temp1_fd, temp1_pathname) = tempfile.mkstemp()
+- os.write(temp1_fd, container1.get_summary(sort=True))
++ os.write(temp1_fd, container1.get_summary(sort=True).encode())
+
+ container2 = BoardContainer().open(filename2)
+ (temp2_fd, temp2_pathname) = tempfile.mkstemp()
+- os.write(temp2_fd, container2.get_summary(sort=True))
++ os.write(temp2_fd, container2.get_summary(sort=True).encode())
+
+ # this function is used both with --diff and --diffstat
+ if diff:
+@@ -509,7 +510,7 @@ def diff_boardfiles(filename1, filename2, diff):
+ print('Failed to run wdiff: %s' % (e))
+ return 1
+
+- result += '%s\n' % (output)
++ result += '%s\n' % (output.decode())
+
+ # create simple statistics about changes in board images
+
+@@ -577,7 +578,7 @@ def cmd_add_board(args):
+ new_filename = args.add_board[1]
+ new_names = args.add_board[2:]
+
+- f = open(new_filename, 'r')
++ f = open(new_filename, 'rb')
+ new_data = f.read()
+ f.close()
+
+@@ -620,15 +621,15 @@ def cmd_add_mbox(args):
+ name = filename.rstrip(BIN_SUFFIX)
+ board_files[name] = part.get_payload(decode=True)
+
+- print 'Found mail "%s" with %d board files' % (msg['Subject'],
+- len(board_files))
++ print('Found mail "%s" with %d board files' % (msg['Subject'],
++ len(board_files)))
+
+ # copy the original file for diff
+ (temp_fd, temp_pathname) = tempfile.mkstemp()
+ shutil.copyfile(board_filename, temp_pathname)
+
+ container = BoardContainer.open(board_filename)
+- for name, data in board_files.iteritems():
++ for name, data in board_files.items():
+ names = [name]
+ container.add_board(data, names)
+
+@@ -650,9 +651,9 @@ def cmd_add_mbox(args):
+
+ os.remove(temp_pathname)
+
+- print '----------------------------------------------'
+- print applied_msg
+- print '----------------------------------------------'
++ print('----------------------------------------------')
++ print(applied_msg)
++ print('----------------------------------------------')
+
+ xclip(applied_msg)
+
+--
+2.29.2
+
diff --git a/recipes-devtools/qca-swiss-army-knife/qca-swiss-army-knife/0001-read-powers-port-to-python3.patch b/recipes-devtools/qca-swiss-army-knife/qca-swiss-army-knife/0001-read-powers-port-to-python3.patch
new file mode 100644
index 0000000..5c69e81
--- /dev/null
+++ b/recipes-devtools/qca-swiss-army-knife/qca-swiss-army-knife/0001-read-powers-port-to-python3.patch
@@ -0,0 +1,212 @@
+From 4ffa07ff681c628750ba7c66e8a97f5f57b35fa0 Mon Sep 17 00:00:00 2001
+From: Dmitry Baryshkov <dbaryshkov@gmail.com>
+Date: Thu, 17 Dec 2020 00:37:39 +0300
+Subject: [PATCH 1/3] read-powers: port to python3
+
+Signed-off-by: Dmitry Baryshkov <dbaryshkov@gmail.com>
+---
+ tools/scripts/ath9k/read-powers | 74 ++++++++++++++++-----------------
+ 1 file changed, 37 insertions(+), 37 deletions(-)
+
+diff --git a/tools/scripts/ath9k/read-powers b/tools/scripts/ath9k/read-powers
+index 1d430e78b695..535747db8f0b 100755
+--- a/tools/scripts/ath9k/read-powers
++++ b/tools/scripts/ath9k/read-powers
+@@ -1,4 +1,4 @@
+-#!/usr/bin/python
++#!/usr/bin/env python3
+ #
+ # Copyright (c) 2010 Atheros Communications Inc.
+ #
+@@ -117,7 +117,7 @@ def powertx_rate1 (val):
+ ofdm_rates["12"] = (val >> 16) & 0xff
+ ofdm_rates["18"] = (val >> 24) & 0xff
+
+- print "%010s: 0x%08x" % ("Rate 1", val)
++ print("%010s: 0x%08x" % ("Rate 1", val))
+
+ def powertx_rate2 (val):
+ ofdm_rates["24"] = (val >> 0) & 0xff;
+@@ -125,7 +125,7 @@ def powertx_rate2 (val):
+ ofdm_rates["48"] = (val >> 16) & 0xff
+ ofdm_rates["54"] = (val >> 24) & 0xff
+
+- print "%010s: 0x%08x" % ("Rate 2", val)
++ print("%010s: 0x%08x" % ("Rate 2", val))
+
+ def powertx_rate3 (val):
+ cck_rates["1L"] = (val >> 0) & 0xff;
+@@ -134,7 +134,7 @@ def powertx_rate3 (val):
+ cck_rates["2L"] = (val >> 16) & 0xff;
+ cck_rates["2S"] = (val >> 24) & 0xff;
+
+- print "%010s: 0x%08x" % ("Rate 3", val)
++ print("%010s: 0x%08x" % ("Rate 3", val))
+
+ def powertx_rate4 (val):
+ cck_rates["5.5L"] = (val >> 0) & 0xff;
+@@ -142,7 +142,7 @@ def powertx_rate4 (val):
+ cck_rates["11L"] = (val >> 16) & 0xff
+ cck_rates["11S"] = (val >> 24) & 0xff
+
+- print "%010s: 0x%08x" % ("Rate 4", val)
++ print("%010s: 0x%08x" % ("Rate 4", val))
+
+ def powertx_rate5 (val):
+ mcs_rates_ht20["0"] = (val >> 0) & 0xff;
+@@ -165,7 +165,7 @@ def powertx_rate5 (val):
+
+ mcs_rates_ht20["5"] = (val >> 24) & 0xff
+
+- print "%010s: 0x%08x" % ("Rate 5", val)
++ print("%010s: 0x%08x" % ("Rate 5", val))
+
+ def powertx_rate6 (val):
+ mcs_rates_ht20["6"] = (val >> 0) & 0xff;
+@@ -173,7 +173,7 @@ def powertx_rate6 (val):
+ mcs_rates_ht20["12"] = (val >> 16) & 0xff
+ mcs_rates_ht20["13"] = (val >> 24) & 0xff
+
+- print "%010s: 0x%08x" % ("Rate 6", val)
++ print("%010s: 0x%08x" % ("Rate 6", val))
+
+ def powertx_rate7 (val):
+ mcs_rates_ht40["0"] = (val >> 0) & 0xff;
+@@ -196,7 +196,7 @@ def powertx_rate7 (val):
+
+ mcs_rates_ht40["5"] = (val >> 24) & 0xff
+
+- print "%010s: 0x%08x" % ("Rate 7", val)
++ print("%010s: 0x%08x" % ("Rate 7", val))
+
+ def powertx_rate8 (val):
+ mcs_rates_ht40["6"] = (val >> 0) & 0xff;
+@@ -204,7 +204,7 @@ def powertx_rate8 (val):
+ mcs_rates_ht40["12"] = (val >> 16) & 0xff
+ mcs_rates_ht40["13"] = (val >> 24) & 0xff
+
+- print "%010s: 0x%08x" % ("Rate 8", val)
++ print("%010s: 0x%08x" % ("Rate 8", val))
+
+ # What is 40 dup CCK, 40 dup OFDM, 20 ext cck, 20 ext ODFM ?
+ def powertx_rate9 (val):
+@@ -213,7 +213,7 @@ def powertx_rate9 (val):
+ ext_dup_rates["20 ext CCK"] = (val >> 16) & 0xff
+ ext_dup_rates["20 ext OFDM"] = (val >> 24) & 0xff
+
+- print "%010s: 0x%08x" % ("Rate 9", val)
++ print("%010s: 0x%08x" % ("Rate 9", val))
+
+ def powertx_rate10 (val):
+ mcs_rates_ht20["14"] = (val >> 0) & 0xff;
+@@ -221,7 +221,7 @@ def powertx_rate10 (val):
+ mcs_rates_ht20["20"] = (val >> 16) & 0xff
+ mcs_rates_ht20["21"] = (val >> 24) & 0xff
+
+- print "%010s: 0x%08x" % ("Rate 10", val)
++ print("%010s: 0x%08x" % ("Rate 10", val))
+
+ def powertx_rate11 (val):
+ mcs_rates_ht20["22"] = (val >> 0) & 0xff;
+@@ -230,7 +230,7 @@ def powertx_rate11 (val):
+ mcs_rates_ht40["22"] = (val >> 16) & 0xff
+ mcs_rates_ht40["23"] = (val >> 24) & 0xff
+
+- print "%010s: 0x%08x" % ("Rate 11", val)
++ print("%010s: 0x%08x" % ("Rate 11", val))
+
+ def powertx_rate12 (val):
+ mcs_rates_ht40["14"] = (val >> 0) & 0xff;
+@@ -238,7 +238,7 @@ def powertx_rate12 (val):
+ mcs_rates_ht40["20"] = (val >> 16) & 0xff
+ mcs_rates_ht40["21"] = (val >> 24) & 0xff
+
+- print "%010s: 0x%08x" % ("Rate 12", val)
++ print("%010s: 0x%08x" % ("Rate 12", val))
+
+ registers = {
+ "0x00a3c0" : powertx_rate1,
+@@ -256,43 +256,43 @@ registers = {
+ }
+
+ def process_cck_rates():
+- print "CCK Rates"
+- print "======================"
+- for rate, double_dbm in cck_rates.iteritems():
++ print("CCK Rates")
++ print("======================")
++ for rate, double_dbm in cck_rates.items():
+ dbm = "%.2f dBm" % (double_dbm / 2)
+- print "%010s %010s" % (rate + " Mbps", dbm)
++ print("%010s %010s" % (rate + " Mbps", dbm))
+
+ def process_ofdm_rates():
+- print "OFDM Rates"
+- print "======================"
+- for rate, double_dbm in sorted(map(lambda (k,v): (int(k,0), v), ofdm_rates.iteritems())):
++ print("OFDM Rates")
++ print("======================")
++ for rate, double_dbm in sorted(ofdm_rates.items(), key=lambda i: int(i[0], 0)):
+ rate_s = "%s" % rate
+ dbm = "%.02f dBm" % (double_dbm / 2)
+- print "%010s %010s" % (rate_s + " Mbps", dbm)
++ print("%010s %010s" % (rate_s + " Mbps", dbm))
+
+ def process_mcs_ht20_rates():
+- print "MCS20 Rates"
+- print "======================"
+- for rate, double_dbm in sorted(map(lambda (k,v): (int(k,0), v), mcs_rates_ht20.iteritems())):
++ print("MCS20 Rates")
++ print("======================")
++ for rate, double_dbm in sorted(mcs_rates_ht20.items(), key=lambda i: int(i[0], 0)):
+ rate_s = "%s" % rate
+ dbm = "%.02f dBm" % (double_dbm / 2)
+- print "%010s %010s" % ("MCS" + rate_s, dbm)
++ print("%010s %010s" % ("MCS" + rate_s, dbm))
+
+
+ def process_mcs_ht40_rates():
+- print "MCS40 Rates"
+- print "======================"
+- for rate, double_dbm in sorted(map(lambda (k,v): (int(k,0), v), mcs_rates_ht40.iteritems())):
++ print("MCS40 Rates")
++ print("======================")
++ for rate, double_dbm in sorted(mcs_rates_ht40.items(), key=lambda i: int(i[0], 0)):
+ rate_s = "%s" % rate
+ dbm = "%.2f dBm" % (double_dbm / 2)
+- print "%010s %010s" % ("MCS" + rate_s, dbm)
++ print("%010s %010s" % ("MCS" + rate_s, dbm))
+
+ def process_ext_dup_rates():
+- print "EXT-DUP Rates"
+- print "=========================="
+- for rate, double_dbm in ext_dup_rates.iteritems():
++ print("EXT-DUP Rates")
++ print("==========================")
++ for rate, double_dbm in ext_dup_rates.items():
+ dbm = "%.2f dBm" % (double_dbm / 2)
+- print "%015s %010s" % (rate, dbm)
++ print("%015s %010s" % (rate, dbm))
+
+ def print_power_reg (reg, val):
+ if not reg in map(lambda x: int(x, 0), registers.keys()):
+@@ -300,12 +300,12 @@ def print_power_reg (reg, val):
+ registers.get("0x%06x" % reg)(val)
+
+ try:
+- print "Power register"
+- print "======================"
++ print("Power register")
++ print("======================")
+ for line in sys.stdin.readlines():
+- reg, val = map(lambda x: int(x, 0), string.split(line))
++ reg, val = map(lambda x: int(x, 0), line.split())
+ print_power_reg(reg, val)
+- print "-------------------------------------"
++ print("-------------------------------------")
+
+ process_cck_rates()
+ process_ofdm_rates()
+--
+2.29.2
+
diff --git a/recipes-devtools/qca-swiss-army-knife/qca-swiss-army-knife/0002-ath10k-bdencoder-Add-option-to-switch-to-ath11k-mode.patch b/recipes-devtools/qca-swiss-army-knife/qca-swiss-army-knife/0002-ath10k-bdencoder-Add-option-to-switch-to-ath11k-mode.patch
new file mode 100644
index 0000000..b5aa1c8
--- /dev/null
+++ b/recipes-devtools/qca-swiss-army-knife/qca-swiss-army-knife/0002-ath10k-bdencoder-Add-option-to-switch-to-ath11k-mode.patch
@@ -0,0 +1,116 @@
+From 68fd447a4d1e137307927fb9c0d9e05c6559bc96 Mon Sep 17 00:00:00 2001
+From: Sven Eckelmann <sven@narfation.org>
+Date: Wed, 14 Oct 2020 17:26:19 +0200
+Subject: [PATCH 2/2] ath10k-bdencoder: Add option to switch to ath11k mode
+
+The board-2.bin also exists on ath11k but there is no encoder available at
+the moment. Just use an option to change the two positions where the ath11k
+differs from the ath10k board-2.bin
+
+Signed-off-by: Sven Eckelmann <sven@narfation.org>
+[DB: fixed firmware url]
+Signed-off-by: Dmitry Baryshkov <dbaryshkov@gmail.com>
+---
+ tools/scripts/ath10k/ath10k-bdencoder | 35 ++++++++++++++++++++++++---
+ 1 file changed, 31 insertions(+), 4 deletions(-)
+
+diff --git a/tools/scripts/ath10k/ath10k-bdencoder b/tools/scripts/ath10k/ath10k-bdencoder
+index 1635e87b6f5f..d613f6340bf9 100755
+--- a/tools/scripts/ath10k/ath10k-bdencoder
++++ b/tools/scripts/ath10k/ath10k-bdencoder
+@@ -34,6 +34,8 @@ MAX_BUF_LEN = 2000000
+
+ # the signature length also includes null byte and padding
+ ATH10K_BOARD_SIGNATURE = b"QCA-ATH10K-BOARD"
++ATH11K_BOARD_SIGNATURE = b"QCA-ATH11K-BOARD"
++BOARD_SIGNATURE = b''
+ ATH10K_BOARD_SIGNATURE_LEN = 20
+
+ PADDING_MAGIC = 0x6d
+@@ -44,6 +46,7 @@ TYPE_LENGTH_SIZE = 8
+ BIN_SUFFIX = '.bin'
+
+ ATH10K_FIRMWARE_URL = 'https://github.com/kvalo/ath10k-firmware/commit'
++ATH11K_FIRMWARE_URL = 'https://github.com/kvalo/ath11k-firmware/commit'
+
+ ATH10K_BD_IE_BOARD = 0
+ ATH10K_BD_IE_BOARD_EXT = 1
+@@ -311,7 +314,7 @@ class BoardContainer:
+ allnames.append(name)
+
+ def _add_signature(self, buf, offset):
+- signature = ATH10K_BOARD_SIGNATURE + b'\0'
++ signature = BOARD_SIGNATURE + b'\0'
+ length = len(signature)
+ pad_len = padding_needed(length)
+ length = length + pad_len
+@@ -343,10 +346,10 @@ class BoardContainer:
+
+ offset = 0
+
+- fmt = '<%dsb' % (len(ATH10K_BOARD_SIGNATURE))
++ fmt = '<%dsb' % (len(BOARD_SIGNATURE))
+ (signature, null) = struct.unpack_from(fmt, buf, offset)
+
+- if signature != ATH10K_BOARD_SIGNATURE or null != 0:
++ if signature != BOARD_SIGNATURE or null != 0:
+ print("invalid signature found in %s" % name)
+ return 1
+
+@@ -600,6 +603,11 @@ def git_get_head_id():
+
+
+ def cmd_add_mbox(args):
++ if args.mode == 10:
++ firmware_url = ATH10K_FIRMWARE_URL
++ elif args.mode == 11:
++ firmware_url = ATH11K_FIRMWARE_URL
++
+ board_filename = args.add_mbox[0]
+ mbox_filename = args.add_mbox[1]
+
+@@ -658,8 +666,19 @@ def cmd_add_mbox(args):
+ xclip(applied_msg)
+
+
++def mode_parse(v):
++ if v == 'ath10k':
++ return 10
++ elif v == 'ath11k':
++ return 11
++ else:
++ raise argparse.ArgumentTypeError('ath10k or ath11k expected.')
++
++
+ def main():
+- description = '''ath10k board-N.bin files manegement tool
++ global BOARD_SIGNATURE
++
++ description = '''ath10k/ath11k board-N.bin files management tool
+
+ ath10k-bdencoder is for creating (--create), listing (--info) and
+ comparing (--diff, --diffstat) ath10k board-N.bin files. The
+@@ -709,12 +728,20 @@ can use --extract switch to see examples from real board-N.bin files.
+ parser.add_argument("-o", "--output", metavar="BOARD_FILE",
+ help='name of the output file, otherwise the default is: %s' %
+ (DEFAULT_BOARD_FILE))
++ parser.add_argument("-m", "--mode", metavar='MODE',
++ help='select between ath10k and ath11k mode (default: ath10k)',
++ default=10, type=mode_parse)
+
+ args = parser.parse_args()
+
+ if args.verbose:
+ logging.basicConfig(level=logging.DEBUG)
+
++ if args.mode == 10:
++ BOARD_SIGNATURE = ATH10K_BOARD_SIGNATURE
++ elif args.mode == 11:
++ BOARD_SIGNATURE = ATH11K_BOARD_SIGNATURE
++
+ if args.create:
+ return cmd_create(args)
+ elif args.extract:
+--
+2.29.2
+
diff --git a/recipes-devtools/qca-swiss-army-knife/qca-swiss-army-knife/0002-ath10k-fwencoder-port-to-python3.patch b/recipes-devtools/qca-swiss-army-knife/qca-swiss-army-knife/0002-ath10k-fwencoder-port-to-python3.patch
new file mode 100644
index 0000000..1c3c648
--- /dev/null
+++ b/recipes-devtools/qca-swiss-army-knife/qca-swiss-army-knife/0002-ath10k-fwencoder-port-to-python3.patch
@@ -0,0 +1,272 @@
+From 3d23932fd812e1ec7a989ca7e594fcf04d42c8a6 Mon Sep 17 00:00:00 2001
+From: Dmitry Baryshkov <dbaryshkov@gmail.com>
+Date: Thu, 17 Dec 2020 01:32:47 +0300
+Subject: [PATCH 2/3] ath10k-fwencoder: port to python3
+
+Signed-off-by: Dmitry Baryshkov <dbaryshkov@gmail.com>
+---
+ tools/scripts/ath10k/ath10k-fwencoder | 70 +++++++++++++--------------
+ 1 file changed, 35 insertions(+), 35 deletions(-)
+
+diff --git a/tools/scripts/ath10k/ath10k-fwencoder b/tools/scripts/ath10k/ath10k-fwencoder
+index 6934a694e832..bbbe0344f014 100755
+--- a/tools/scripts/ath10k/ath10k-fwencoder
++++ b/tools/scripts/ath10k/ath10k-fwencoder
+@@ -1,4 +1,4 @@
+-#!/usr/bin/python
++#!/usr/bin/env python3
+ #
+ # Copyright (c) 2012-2015 Qualcomm Atheros, Inc.
+ #
+@@ -30,7 +30,7 @@ import hashlib
+
+ DEFAULT_FW_API_VERSION = 4
+
+-ATH10K_SIGNATURE = "QCA-ATH10K"
++ATH10K_SIGNATURE = b"QCA-ATH10K"
+ MAX_LEN = 2000000
+
+ ATH10K_FW_IE_FW_VERSION = 0
+@@ -327,7 +327,7 @@ class Ath10kFirmwareContainer(object):
+ elif is_int(s):
+ version = s
+ else:
+- print 'Error: Invalid HTT OP version: %s' % s
++ print('Error: Invalid HTT OP version: %s' % s)
+ return 1
+
+ self.htt_op_version = version
+@@ -337,7 +337,7 @@ class Ath10kFirmwareContainer(object):
+
+ # find value from the dict
+ try:
+- name = [key for key, value in htt_op_version_map.iteritems()
++ name = [key for key, value in htt_op_version_map.items()
+ if value == version][0]
+ except IndexError:
+ name = str(version)
+@@ -353,7 +353,7 @@ class Ath10kFirmwareContainer(object):
+ elif is_int(s):
+ version = s
+ else:
+- print 'Error: Invalid WMI OP version: %s' % s
++ print('Error: Invalid WMI OP version: %s' % s)
+ return 1
+
+ self.wmi_op_version = version
+@@ -363,7 +363,7 @@ class Ath10kFirmwareContainer(object):
+
+ # find value from the dict
+ try:
+- name = [key for key, value in wmi_op_version_map.iteritems()
++ name = [key for key, value in wmi_op_version_map.items()
+ if value == version][0]
+ except IndexError:
+ name = str(version)
+@@ -376,7 +376,7 @@ class Ath10kFirmwareContainer(object):
+ enabled = []
+ for capa in self.features:
+ if capa not in feature_map:
+- print "Error: '%s' not found from the feature map" % capa
++ print("Error: '%s' not found from the feature map" % capa)
+ return 1
+
+ enabled.append(feature_map[capa])
+@@ -434,7 +434,7 @@ class Ath10kFirmwareContainer(object):
+ self.fw_version = fw_version
+ # reserve one byte for null
+ if len(self.fw_version) > ETHTOOL_FWVERS_LEN - 1:
+- print 'Firmware version string too long: %d' % (len(self.fw_version))
++ print('Firmware version string too long: %d' % (len(self.fw_version)))
+ return 1
+
+ def get_fw_version(self):
+@@ -500,7 +500,7 @@ class Ath10kFirmwareContainer(object):
+ elif e == ATH10K_FW_IE_FW_CODE_SWAP_IMAGE:
+ self.fw_code_swap_image = c.elements[e]
+ else:
+- print "Unknown IE: ", e
++ print("Unknown IE: ", e)
+
+ def save(self, filename):
+ self.container = FirmwareContainer(ATH10K_SIGNATURE)
+@@ -585,7 +585,7 @@ def write_file(filename, buf):
+ def info(options, args):
+
+ if len(args) != 1:
+- print 'Filename missing'
++ print('Filename missing')
+ return 1
+
+ filename = args[0]
+@@ -593,13 +593,13 @@ def info(options, args):
+ c = Ath10kFirmwareContainer()
+ c.load(filename)
+
+- print c.get_summary()
++ print(c.get_summary())
+
+
+ def dump(options, args):
+
+ if len(args) != 1:
+- print 'Filename missing'
++ print('Filename missing')
+ return 1
+
+ filename = args[0]
+@@ -607,34 +607,34 @@ def dump(options, args):
+ c = Ath10kFirmwareContainer()
+ c.load(filename)
+
+- print "ath10k-fwencoder --create \\"
++ print("ath10k-fwencoder --create \\")
+
+ if c.get_fw_version():
+- print "--firmware-version=%s \\" % c.get_fw_version()
++ print("--firmware-version=%s \\" % c.get_fw_version())
+
+ if c.get_timestamp() and options.show_timestamp:
+- print "--timestamp=%u \\" % c.get_timestamp()
++ print("--timestamp=%u \\" % c.get_timestamp())
+
+ if c.get_features():
+- print "--features=%s \\" % c.get_features()
++ print("--features=%s \\" % c.get_features())
+
+ if c.get_fw_image():
+ name = "athwlan.bin"
+- print "--firmware=%s \\" % name
++ print("--firmware=%s \\" % name)
+
+ if c.get_otp_image():
+ name = "otp.bin"
+- print "--otp=%s \\" % name
++ print("--otp=%s \\" % name)
+
+ if c.get_wmi_op_version():
+- print '--set-wmi-op-version=%s \\' % c.get_wmi_op_version()
++ print('--set-wmi-op-version=%s \\' % c.get_wmi_op_version())
+
+ if c.get_htt_op_version():
+- print '--set-htt-op-version=%s \\' % (c.get_htt_op_version())
++ print('--set-htt-op-version=%s \\' % (c.get_htt_op_version()))
+
+ if c.get_fw_code_swap_image():
+ name = "athwlan.codeswap.bin"
+- print "--firmware-codeswap=%s \\" % name
++ print("--firmware-codeswap=%s \\" % name)
+
+ print
+
+@@ -642,7 +642,7 @@ def dump(options, args):
+ def extract(options, args):
+
+ if len(args) != 1:
+- print 'Filename missing'
++ print('Filename missing')
+ return 1
+
+ filename = args[0]
+@@ -653,24 +653,24 @@ def extract(options, args):
+ if c.get_fw_image():
+ name = "athwlan.bin"
+ write_file(name, c.get_fw_image())
+- print '%s extracted: %d B' % (name, len(c.get_fw_image()))
++ print('%s extracted: %d B' % (name, len(c.get_fw_image())))
+
+ if c.get_otp_image():
+ name = "otp.bin"
+ write_file(name, c.get_otp_image())
+- print '%s extracted: %d B' % (name, len(c.get_otp_image()))
++ print('%s extracted: %d B' % (name, len(c.get_otp_image())))
+
+ if c.get_fw_code_swap_image():
+ name = "athwlan.codeswap.bin"
+ write_file(name, c.get_fw_code_swap_image())
+- print '%s extracted: %d B' % (name, len(c.get_fw_code_swap_image()))
++ print('%s extracted: %d B' % (name, len(c.get_fw_code_swap_image())))
+
+ print
+
+
+ def modify(options, args):
+ if len(args) != 1:
+- print 'Filename missing'
++ print('Filename missing')
+ return 1
+
+ filename = args[0]
+@@ -710,7 +710,7 @@ def modify(options, args):
+
+ file_len = c.save(filename)
+
+- print '%s modified: %d B' % (filename, file_len)
++ print('%s modified: %d B' % (filename, file_len))
+
+
+ def create(options):
+@@ -752,25 +752,25 @@ def create(options):
+
+ file_len = c.save(output)
+
+- print '%s created: %d B' % (output, file_len)
++ print('%s created: %d B' % (output, file_len))
+
+
+ def cmd_crc32(options, args):
+ if len(args) != 1:
+- print 'Filename missing'
++ print('Filename missing')
+ return 1
+
+ filename = args[0]
+
+ f = open(filename, 'r')
+ buf = f.read()
+- print '%08x' % (_crc32(buf))
++ print('%08x' % (_crc32(buf)))
+ f.close()
+
+
+ def cmd_diff(options, args):
+ if len(args) != 2:
+- print 'Usage: ath10k-fwencoder --diff FILE FILE'
++ print('Usage: ath10k-fwencoder --diff FILE FILE')
+ return 1
+
+ filename1 = args[0]
+@@ -804,7 +804,7 @@ def cmd_diff(options, args):
+ logger.error('Failed to run wdiff: %s' % (e))
+ return 1
+
+- print output
++ print(output)
+
+ os.close(temp1_fd)
+ os.close(temp2_fd)
+@@ -896,10 +896,10 @@ def main():
+ try:
+ return create(options)
+ except FWEncoderError as e:
+- print 'Create failed: %s' % e
++ print('Create failed: %s' % e)
+ sys.exit(2)
+ except Exception as e:
+- print 'Create failed: %s' % e
++ print('Create failed: %s' % e)
+ traceback.print_exc()
+ sys.exit(3)
+ elif options.dump:
+@@ -915,7 +915,7 @@ def main():
+ elif options.diff:
+ return cmd_diff(options, args)
+ else:
+- print 'Action command missing'
++ print('Action command missing')
+ return 1
+
+ if __name__ == "__main__":
+--
+2.29.2
+
diff --git a/recipes-devtools/qca-swiss-army-knife/qca-swiss-army-knife/0003-scripts-port-to-python3.patch b/recipes-devtools/qca-swiss-army-knife/qca-swiss-army-knife/0003-scripts-port-to-python3.patch
new file mode 100644
index 0000000..bfdad9f
--- /dev/null
+++ b/recipes-devtools/qca-swiss-army-knife/qca-swiss-army-knife/0003-scripts-port-to-python3.patch
@@ -0,0 +1,34 @@
+From 26ca6eff75f78fec9efff4a69fca7103b97f1ab1 Mon Sep 17 00:00:00 2001
+From: Dmitry Baryshkov <dbaryshkov@gmail.com>
+Date: Thu, 17 Dec 2020 01:33:01 +0300
+Subject: [PATCH 3/3] scripts: port to python3
+
+Signed-off-by: Dmitry Baryshkov <dbaryshkov@gmail.com>
+---
+ tools/scripts/ath10k/ath10k-fw-repo | 2 +-
+ tools/scripts/ath11k/ath11k-fw-repo | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/tools/scripts/ath10k/ath10k-fw-repo b/tools/scripts/ath10k/ath10k-fw-repo
+index 00b6d859209a..4cf044c04c5a 100755
+--- a/tools/scripts/ath10k/ath10k-fw-repo
++++ b/tools/scripts/ath10k/ath10k-fw-repo
+@@ -1,4 +1,4 @@
+-#!/usr/bin/python
++#!/usr/bin/env python3
+ #
+ # Copyright (c) 2016 Qualcomm Atheros, Inc.
+ # Copyright (c) 2018, The Linux Foundation. All rights reserved.
+diff --git a/tools/scripts/ath11k/ath11k-fw-repo b/tools/scripts/ath11k/ath11k-fw-repo
+index 1ac6023aaf12..51ca33c5dd7b 100755
+--- a/tools/scripts/ath11k/ath11k-fw-repo
++++ b/tools/scripts/ath11k/ath11k-fw-repo
+@@ -1,4 +1,4 @@
+-#!/usr/bin/python
++#!/usr/bin/env python3
+ #
+ # Copyright (c) 2016 Qualcomm Atheros, Inc.
+ # Copyright (c) 2018,2020 The Linux Foundation. All rights reserved.
+--
+2.29.2
+
diff --git a/recipes-bsp/firmware/firmware-qcom-dragonboard845c/generate_board-2_json.sh b/recipes-devtools/qca-swiss-army-knife/qca-swiss-army-knife/ath10k-generate-board-2_json.sh
index 3a1d532..373689f 100644
--- a/recipes-bsp/firmware/firmware-qcom-dragonboard845c/generate_board-2_json.sh
+++ b/recipes-devtools/qca-swiss-army-knife/qca-swiss-army-knife/ath10k-generate-board-2_json.sh
@@ -1,20 +1,27 @@
+#!/bin/sh
+
JSON="$2"
iter=0
echo "[" > "${JSON}"
for file in $1/bdwlan.*; do
- [[ $file == *.txt ]] && continue
+ case `basename "${file}"` in
+ *.txt)
+ continue
+ ;;
+ bdwlan.bin)
+ file_ext="ff"
+ ;;
+ bdwlan.*)
+ file_ext="$(basename "${file}" | sed -E 's:^.*\.b?0*([0-9a-f]+)$:\1:')"
+ ;;
+ esac
iter=$((iter+1))
[ $iter -ne 1 ] && echo " }," >> "${JSON}"
echo " {" >> "${JSON}"
echo " \"data\": \"$file\"," >> "${JSON}"
- if [[ $file == */bdwlan.bin ]]; then
- file_ext="ff"
- else
- file_ext="$(printf '%x\n' "$(basename "${file}" | sed -E 's:^.*\.b?([0-9a-f]*)$:0x\1:')")"
- fi
echo " \"names\": [\"bus=snoc,qmi-board-id=${file_ext}\"]" >> "${JSON}"
done
diff --git a/recipes-devtools/qca-swiss-army-knife/qca-swiss-army-knife/ath11k-generate-board-2_json.sh b/recipes-devtools/qca-swiss-army-knife/qca-swiss-army-knife/ath11k-generate-board-2_json.sh
new file mode 100644
index 0000000..0e3cc10
--- /dev/null
+++ b/recipes-devtools/qca-swiss-army-knife/qca-swiss-army-knife/ath11k-generate-board-2_json.sh
@@ -0,0 +1,23 @@
+#!/bin/sh
+
+JSON="$2"
+
+iter=0
+echo "[" > "${JSON}"
+for file in $1/bdwlan.elf $1/bdwlan.e* ; do
+ iter=$((iter+1))
+ [ $iter -ne 1 ] && echo " }," >> "${JSON}"
+
+ echo " {" >> "${JSON}"
+ echo " \"data\": \"$file\"," >> "${JSON}"
+ if [ `basename $file` = "bdwlan.elf" ]; then
+ file_ext="255"
+ else
+ file_ext="$(( $(basename "${file}" | sed -E 's:^.*\.e?([0-9a-f]*)$:0x\1:') ))"
+ fi
+ echo " \"names\": [\"bus=pci,qmi-chip-id=0,qmi-board-id=${file_ext}\"]" >> "${JSON}"
+done
+
+echo " }" >> "${JSON}"
+echo "]" >> "${JSON}"
+
diff --git a/recipes-devtools/qca-swiss-army-knife/qca-swiss-army-knife_git.bb b/recipes-devtools/qca-swiss-army-knife/qca-swiss-army-knife_git.bb
new file mode 100644
index 0000000..6a31f7a
--- /dev/null
+++ b/recipes-devtools/qca-swiss-army-knife/qca-swiss-army-knife_git.bb
@@ -0,0 +1,32 @@
+SUMMARY = "A set of utilities to help QCA driver development."
+HOMEPAGE = "https://github.com/qca/qca-swiss-army-knife"
+SECTION = "devel"
+
+LICENSE = "ISC"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=884c3f3a874b2a0cfa283c7db0e5d604"
+
+SRCREV = "5ede3cc07e9a52f115101c28f833242b772eeaab"
+SRC_URI = " \
+ git://github.com/qca/${BPN}.git;branch=master;protocol=https \
+ file://0001-ath10k-bdencoder-Switch-to-python3.patch \
+ file://0002-ath10k-bdencoder-Add-option-to-switch-to-ath11k-mode.patch \
+ file://0001-read-powers-port-to-python3.patch \
+ file://0002-ath10k-fwencoder-port-to-python3.patch \
+ file://0003-scripts-port-to-python3.patch \
+ file://ath10k-generate-board-2_json.sh \
+ file://ath11k-generate-board-2_json.sh \
+"
+
+PV = "0.0+${SRCPV}"
+S = "${WORKDIR}/git"
+
+do_install () {
+ install -d ${D}/${bindir}
+ install -m 0755 tools/scripts/*/* ${D}/${bindir}
+ install -m 0755 ${WORKDIR}/ath10k-generate-board-2_json.sh ${D}/${bindir}
+ install -m 0755 ${WORKDIR}/ath11k-generate-board-2_json.sh ${D}/${bindir}
+}
+
+BBCLASSEXTEND = "native nativesdk"
+
+RDEPENDS_${PN} += "perl python3-core"
diff --git a/recipes-kernel/linux-firmware/linux-firmware_%.bbappend b/recipes-kernel/linux-firmware/linux-firmware_%.bbappend
new file mode 100644
index 0000000..3679a64
--- /dev/null
+++ b/recipes-kernel/linux-firmware/linux-firmware_%.bbappend
@@ -0,0 +1,4 @@
+inherit update-alternatives
+
+ALTERNATIVE_${PN}-ath11k = "qca6390-board2"
+ALTERNATIVE_LINK_NAME[qca6390-board2] = "/lib/firmware/ath11k/QCA6390/hw2.0/board-2.bin"