From cfee3f2eeecc75abed3294a8b949c2ca48c3c08c Mon Sep 17 00:00:00 2001 From: Christian Lamparter Date: Sun, 6 Feb 2022 01:42:01 +0100 Subject: [PATCH] ipq40xx: dynamically build board-2.bin for Mikrotik Mikrotik devices ship with the boardfile data right on the board itself. This script takes the data from the sysfs firmware "wlan_data" to generate a custom board-2.bin for the ath10k driver to work with. The qcom,ath10k-calibration-variant in each device's device-tree file are being removed as well. Signed-off-by: Christian Lamparter --- .../etc/hotplug.d/firmware/11-ath10k-caldata | 50 +++++++++++++++++++ .../arch/arm/boot/dts/qcom-ipq4018-cap-ac.dts | 4 -- .../arm/boot/dts/qcom-ipq4018-hap-ac2.dts | 4 -- .../arm/boot/dts/qcom-ipq4018-sxtsq-5-ac.dts | 2 - .../arm/boot/dts/qcom-ipq4019-hap-ac3.dts | 4 -- 5 files changed, 50 insertions(+), 14 deletions(-) diff --git a/target/linux/ipq40xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata b/target/linux/ipq40xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata index e0b4eed6f2..0182823bc2 100644 --- a/target/linux/ipq40xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata +++ b/target/linux/ipq40xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata @@ -6,6 +6,46 @@ board=$(board_name) +board2_add_entry() +{ + local file="$1" + local offset="$(($2))" + local size="$(($3))" + + local id=$(dd iflag=skip_bytes if="$file" bs=1 count=1 skip=$((offset+32)) | hexdump -e '1/1 "%02d"') + + # Qualcomm IDs are in the range of 16 to 30 it seems - taken from the board-2.bin + # This is there to skip the missing 2G on the SXTSQ 5 AC + [ "$id" -ge 16 -a "$id" -le 30 ] || return 0 + + printf "\x00\x00\x00\x00\x58\x2f\x00\x00\x00\x00\x00\x00\x25\x00\x00\x00" + printf "bus=ahb,bmi-chip-id=0,bmi-board-id=${id}\x00\x00\x00" + printf "\x01\x00\x00\x00\x20\x2f\x00\x00" + + dd iflag=skip_bytes,fullblock if="$file" bs="$size" count=1 skip="$offset" >> "/lib/firmware/$FIRMWARE" +} + +board2_create_for_mikrotik() +{ + wlan_data="/sys/firmware/mikrotik/hard_config/wlan_data" + + [ -f "$wlan_data" ] && { + ( + printf "QCA-ATH10K-BOARD\x00\x00\x00\x00" + board2_add_entry "$wlan_data" 0x2f20 0x2f20 + board2_add_entry "$wlan_data" 0xaf20 0x2f20 + ) >> "/lib/firmware/$FIRMWARE" + } || true + + [ -d "$wlan_data" ] && { + ( + printf "QCA-ATH10K-BOARD\x00\x00\x00\x00" + board2_add_entry "$wlan_data/data_0" 0x2f20 0x2f20 + board2_add_entry "$wlan_data/data_2" 0x2f20 0x2f20 + ) >> "/lib/firmware/$FIRMWARE" + } || true +} + case "$FIRMWARE" in "ath10k/cal-pci-0000:01:00.0.bin") case "$board" in @@ -238,6 +278,16 @@ case "$FIRMWARE" in ;; esac ;; +"ath10k/QCA4019/hw1.0/board-2.bin") +case "$board" in + mikrotik,cap-ac |\ + mikrotik,hap-ac2 |\ + mikrotik,hap-ac3 |\ + mikrotik,sxtsq-5-ac) + board2_create_for_mikrotik + ;; + esac + ;; *) exit 1 ;; diff --git a/target/linux/ipq40xx/files/arch/arm/boot/dts/qcom-ipq4018-cap-ac.dts b/target/linux/ipq40xx/files/arch/arm/boot/dts/qcom-ipq4018-cap-ac.dts index 1afbf97f39..3ebcb3ba5f 100644 --- a/target/linux/ipq40xx/files/arch/arm/boot/dts/qcom-ipq4018-cap-ac.dts +++ b/target/linux/ipq40xx/files/arch/arm/boot/dts/qcom-ipq4018-cap-ac.dts @@ -239,12 +239,8 @@ &wifi0 { status = "okay"; - - qcom,ath10k-calibration-variant = "MikroTik-cAP-ac"; }; &wifi1 { status = "okay"; - - qcom,ath10k-calibration-variant = "MikroTik-cAP-ac"; }; diff --git a/target/linux/ipq40xx/files/arch/arm/boot/dts/qcom-ipq4018-hap-ac2.dts b/target/linux/ipq40xx/files/arch/arm/boot/dts/qcom-ipq4018-hap-ac2.dts index d03409b556..829028b527 100644 --- a/target/linux/ipq40xx/files/arch/arm/boot/dts/qcom-ipq4018-hap-ac2.dts +++ b/target/linux/ipq40xx/files/arch/arm/boot/dts/qcom-ipq4018-hap-ac2.dts @@ -262,12 +262,8 @@ &wifi0 { status = "okay"; - - qcom,ath10k-calibration-variant = "MikroTik-hAP-ac2"; }; &wifi1 { status = "okay"; - - qcom,ath10k-calibration-variant = "MikroTik-hAP-ac2"; }; diff --git a/target/linux/ipq40xx/files/arch/arm/boot/dts/qcom-ipq4018-sxtsq-5-ac.dts b/target/linux/ipq40xx/files/arch/arm/boot/dts/qcom-ipq4018-sxtsq-5-ac.dts index fd11229dbb..f777295177 100644 --- a/target/linux/ipq40xx/files/arch/arm/boot/dts/qcom-ipq4018-sxtsq-5-ac.dts +++ b/target/linux/ipq40xx/files/arch/arm/boot/dts/qcom-ipq4018-sxtsq-5-ac.dts @@ -225,8 +225,6 @@ &wifi1 { status = "okay"; - - qcom,ath10k-calibration-variant = "MikroTik-SXTsq-5-ac"; }; &gmac0 { diff --git a/target/linux/ipq40xx/files/arch/arm/boot/dts/qcom-ipq4019-hap-ac3.dts b/target/linux/ipq40xx/files/arch/arm/boot/dts/qcom-ipq4019-hap-ac3.dts index 9aa58ffcb4..ebf169d032 100644 --- a/target/linux/ipq40xx/files/arch/arm/boot/dts/qcom-ipq4019-hap-ac3.dts +++ b/target/linux/ipq40xx/files/arch/arm/boot/dts/qcom-ipq4019-hap-ac3.dts @@ -317,12 +317,8 @@ &wifi0 { status = "okay"; - - qcom,ath10k-calibration-variant = "MikroTik-hAP-ac3"; }; &wifi1 { status = "okay"; - - qcom,ath10k-calibration-variant = "MikroTik-hAP-ac3"; }; -- 2.30.2