diff mbox series

[OpenWrt-Devel,4/5] ath79: add ath9k calibration data MAC addresses patching

Message ID 6e4e3edda15a3a4584a41215d263db6ac2a309d2.1533936232.git.chunkeey@gmail.com
State Accepted
Delegated to: Mathias Kresin
Headers show
Series [OpenWrt-Devel,1/5] packages: nvram: make it possible to include it for ath79 targets | expand

Commit Message

Christian Lamparter Aug. 10, 2018, 9:24 p.m. UTC
This patch copies over the MAC patching helper functions from lantiq's
target/linux/lantiq/base-files/etc/hotplug.d/firmware/12-ath9k-eeprom
file.

Not all vendors bothered to write the correct MAC addresses for the
ath9k wifi into the calibration data. And while ath9k does have some
special dt-properties to extract the addresses from a fixed position,
there are still devices that require userspace to edit or modify
the caldata.

In my case, the MAC address for the Wi-Fi device is stored in an
unsorted key-value based "nvram" database and there's an existing
userspace tool to extract the data.

Signed-off-by: Christian Lamparter <chunkeey@gmail.com>
---
 .../etc/hotplug.d/firmware/10-ath9k-eeprom    | 50 +++++++++++++++++++
 1 file changed, 50 insertions(+)

Comments

Mathias Kresin Aug. 11, 2018, 8:23 p.m. UTC | #1
10.08.2018 23:24, Christian Lamparter:
> This patch copies over the MAC patching helper functions from lantiq's
> target/linux/lantiq/base-files/etc/hotplug.d/firmware/12-ath9k-eeprom
> file.
> 
> Not all vendors bothered to write the correct MAC addresses for the
> ath9k wifi into the calibration data. And while ath9k does have some
> special dt-properties to extract the addresses from a fixed position,
> there are still devices that require userspace to edit or modify
> the caldata.
> 
> In my case, the MAC address for the Wi-Fi device is stored in an
> unsorted key-value based "nvram" database and there's an existing
> userspace tool to extract the data.
> 
> Signed-off-by: Christian Lamparter <chunkeey@gmail.com>

I committed this one since it was the most complete version of what was 
implemented by two PRs requiring the firmware mac address patching as well.

Unfortunately, I haven't had the time to check your other patches yet.

Mathias
Christian Lamparter Aug. 12, 2018, 1:08 p.m. UTC | #2
On Saturday, August 11, 2018 10:23:16 PM CEST Mathias Kresin wrote:
> 10.08.2018 23:24, Christian Lamparter:
> > This patch copies over the MAC patching helper functions from lantiq's
> > target/linux/lantiq/base-files/etc/hotplug.d/firmware/12-ath9k-eeprom
> > file.
> > 
> > Not all vendors bothered to write the correct MAC addresses for the
> > ath9k wifi into the calibration data. And while ath9k does have some
> > special dt-properties to extract the addresses from a fixed position,
> > there are still devices that require userspace to edit or modify
> > the caldata.
> > 
> > In my case, the MAC address for the Wi-Fi device is stored in an
> > unsorted key-value based "nvram" database and there's an existing
> > userspace tool to extract the data.
> > 
> > Signed-off-by: Christian Lamparter <chunkeey@gmail.com>
> 
> Unfortunately, I haven't had the time to check your other patches yet.
Please hold off until v2 next week. I made the changes Jonas requested
for the cybertan_part and as a result the partitions-node in the dts has
changed as well.

Christian
diff mbox series

Patch

diff --git a/target/linux/ath79/base-files/etc/hotplug.d/firmware/10-ath9k-eeprom b/target/linux/ath79/base-files/etc/hotplug.d/firmware/10-ath9k-eeprom
index e8adcf613a..08151388cc 100644
--- a/target/linux/ath79/base-files/etc/hotplug.d/firmware/10-ath9k-eeprom
+++ b/target/linux/ath79/base-files/etc/hotplug.d/firmware/10-ath9k-eeprom
@@ -42,6 +42,56 @@  ath9k_eeprom_extract_reverse() {
 	printf "%b" "$caldata" > /lib/firmware/$FIRMWARE
 }
 
+xor() {
+	local val
+	local ret="0x$1"
+	local retlen=${#1}
+
+	shift
+	while [ -n "$1" ]; do
+		val="0x$1"
+		ret=$((ret ^ val))
+		shift
+	done
+
+	printf "%0${retlen}x" "$ret"
+}
+
+ath9k_patch_fw_mac() {
+	local mac=$1
+	local mac_offset=$2
+	local chksum_offset=$3
+	local xor_mac
+	local xor_fw_mac
+	local xor_fw_chksum
+
+	[ -z "$mac" -o -z "$mac_offset" ] && return
+
+	[ -n "$chksum_offset" ] && {
+		xor_mac=${mac//:/}
+		xor_mac="${xor_mac:0:4} ${xor_mac:4:4} ${xor_mac:8:4}"
+
+		xor_fw_mac=$(hexdump -v -n 6 -s $mac_offset -e '/1 "%02x"' /lib/firmware/$FIRMWARE)
+		xor_fw_mac="${xor_fw_mac:0:4} ${xor_fw_mac:4:4} ${xor_fw_mac:8:4}"
+
+		xor_fw_chksum=$(hexdump -v -n 2 -s $chksum_offset -e '/1 "%02x"' /lib/firmware/$FIRMWARE)
+		xor_fw_chksum=$(xor $xor_fw_chksum $xor_fw_mac $xor_mac)
+
+		printf "%b" "\x${xor_fw_chksum:0:2}\x${xor_fw_chksum:2:2}" | \
+			dd of=/lib/firmware/$FIRMWARE conv=notrunc bs=1 seek=$chksum_offset count=2
+	}
+
+	macaddr_2bin $mac | dd of=/lib/firmware/$FIRMWARE conv=notrunc bs=1 seek=$mac_offset count=6
+}
+
+ath9k_patch_fw_mac_crc() {
+	local mac=$1
+	local mac_offset=$2
+	local chksum_offset=$((mac_offset - 10))
+
+	ath9k_patch_fw_mac "${mac}" "${mac_offset}" "${chksum_offset}"
+}
+
 board=$(board_name)
 
 case "$FIRMWARE" in