e7be0decf6
ar71xx has an init-script for special devices where the ath10k OTP calibration data is stored on the PCIe card's EEPROM (and thus can only be read by ath10k). Unfortunately the OTP data uses the default mac address (= all devices come with the same mac address, which leads to problems when you have multiple of these devices in the same network). To work around this the mac address is patched in the firmware during the first boot of the device. To prevent flash wear this was only done if the ath10k firmware matched a hardcoded md5sum. However, if the md5sum does not match this can mean that either the mac address was already patched (which is fine) - unfortunately it can also mean that the firmware version was updated without updating the hardcoded md5sum. Change the "was the mac address already patched" check to actually compare the mac address inside the ath10k firmware. Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
54 lines
1.3 KiB
Bash
54 lines
1.3 KiB
Bash
#!/bin/sh
|
|
|
|
. /lib/functions/system.sh
|
|
. /lib/ar71xx.sh
|
|
|
|
|
|
do_patch_ath10k_firmware() {
|
|
local firmware_file="/lib/firmware/ath10k/QCA988X/hw2.0/firmware-5.bin"
|
|
|
|
# bail out if firmware does not exist
|
|
[ -f "$firmware_file" ] || {
|
|
return
|
|
}
|
|
|
|
local mac_offset=276
|
|
local mac_length=6
|
|
local default_mac="00:03:07:12:34:56"
|
|
local current_mac="$(hexdump -v -n $mac_length -s $mac_offset -e '5/1 "%02x:" 1/1 "%02x"' $firmware_file 2>/dev/null)"
|
|
|
|
# check if mac address was already patched
|
|
[ "$default_mac" = "$current_mac" ] || {
|
|
return
|
|
}
|
|
|
|
# some boards have bogus mac in otp (= directly in the PCIe card's EEPROM).
|
|
# we have to patch the default mac in the firmware because we cannot change
|
|
# the otp.
|
|
case $(ar71xx_board_name) in
|
|
dgl-5500-a1 | tew-823dru)
|
|
local mac
|
|
mac=$(mtd_get_mac_ascii nvram wlan1_mac)
|
|
|
|
cp $firmware_file /tmp/ath10k-firmware.bin
|
|
macaddr_2bin $mac | dd of=/tmp/ath10k-firmware.bin \
|
|
conv=notrunc bs=1 seek=$mac_offset count=$mac_length
|
|
|
|
;;
|
|
esac
|
|
[ -f /tmp/ath10k-firmware.bin ] || {
|
|
return
|
|
}
|
|
cp /tmp/ath10k-firmware.bin $firmware_file
|
|
rm /tmp/ath10k-firmware.bin
|
|
}
|
|
|
|
check_patch_ath10k_firmware() {
|
|
case $(ar71xx_board_name) in
|
|
dgl-5500-a1 | tew-823dru)
|
|
do_patch_ath10k_firmware
|
|
;;
|
|
esac
|
|
}
|
|
|
|
boot_hook_add preinit_main check_patch_ath10k_firmware
|