mirror of
https://github.com/openwrt/openwrt.git
synced 2025-01-21 20:08:24 +00:00
0aab49d234
If chksum_offset is converted by $(($...)) at the beginning, the
check [ -n "$chksum_offset" ] will always return true, as the
conversion yields "0" for an empty argument, and [ -n "0" ] is
true.
With this patch, the variable is not converted before the check,
but only when it's used in dd.
No conversion is done for use in hexdump, as this can deal with
hex value offsets.
Fixes: b133e466b0
("treewide: convert WiFi caldata size and offset to hexadecimal")
Signed-off-by: Adrian Schmutzler <freifunk@adrianschmutzler.de>
179 lines
4.1 KiB
Bash
179 lines
4.1 KiB
Bash
#!/bin/sh
|
|
# Based on ar71xx 10-ath9k-eeprom
|
|
|
|
[ -e /lib/firmware/$FIRMWARE ] && exit 0
|
|
|
|
. /lib/functions.sh
|
|
. /lib/functions/system.sh
|
|
. /lib/upgrade/nand.sh
|
|
|
|
# xor multiple hex values of the same length
|
|
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_eeprom_die() {
|
|
echo "ath9k eeprom: $*"
|
|
exit 1
|
|
}
|
|
|
|
ath9k_eeprom_extract_raw() {
|
|
local source=$1
|
|
local offset=$(($2))
|
|
local swap=$3
|
|
local size=4096
|
|
local bs=1
|
|
local conv=
|
|
|
|
if [ $swap -gt 0 ]; then
|
|
bs=2
|
|
conv="conv=swab"
|
|
size=$((size / bs))
|
|
offset=$((offset / bs))
|
|
fi
|
|
|
|
dd if=$source of=/lib/firmware/$FIRMWARE bs=$bs skip=$offset count=$size $conv 2>/dev/null || \
|
|
ath9k_eeprom_die "failed to extract from $mtd"
|
|
}
|
|
|
|
ath9k_eeprom_extract_reverse() {
|
|
local part=$1
|
|
local offset=$2
|
|
local count=$(($3))
|
|
local mtd
|
|
local reversed
|
|
local caldata
|
|
|
|
mtd=$(find_mtd_chardev "$part")
|
|
reversed=$(hexdump -v -s $offset -n $count -e '/1 "%02x "' $mtd)
|
|
|
|
for byte in $reversed; do
|
|
caldata="\x${byte}${caldata}"
|
|
done
|
|
|
|
printf "%b" "$caldata" > /lib/firmware/$FIRMWARE
|
|
}
|
|
|
|
ath9k_eeprom_extract() {
|
|
local part=$1
|
|
local offset=$2
|
|
local swap=$3
|
|
local mtd
|
|
|
|
mtd=$(find_mtd_chardev $part)
|
|
[ -n "$mtd" ] || \
|
|
ath9k_eeprom_die "no mtd device found for partition $part"
|
|
|
|
ath9k_eeprom_extract_raw $mtd $offset $swap
|
|
}
|
|
|
|
ath9k_ubi_eeprom_extract() {
|
|
local part=$1
|
|
local offset=$2
|
|
local swap=$3
|
|
local ubidev=$(nand_find_ubi $CI_UBIPART)
|
|
local ubi
|
|
|
|
ubi=$(nand_find_volume $ubidev $part)
|
|
[ -n "$ubi" ] || \
|
|
ath9k_eeprom_die "no UBI volume found for $part"
|
|
|
|
ath9k_eeprom_extract_raw /dev/$ubi $offset $swap
|
|
}
|
|
|
|
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}"
|
|
}
|
|
|
|
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
|
|
}
|
|
|
|
case "$FIRMWARE" in
|
|
"ath9k-eeprom-pci-0000:00:0e.0.bin" | \
|
|
"ath9k-eeprom-pci-0000:01:00.0.bin" | \
|
|
"ath9k-eeprom-pci-0000:02:00.0.bin")
|
|
board=$(board_name)
|
|
|
|
case "$board" in
|
|
arcadyan,arv7518pw)
|
|
ath9k_eeprom_extract "boardconfig" 0x400 1
|
|
;;
|
|
arcadyan,arv8539pw22)
|
|
ath9k_eeprom_extract "art" 0x400 1
|
|
;;
|
|
bt,homehub-v2b)
|
|
ath9k_eeprom_extract "art" 0x0 1
|
|
ath9k_patch_fw_mac_crc "00:00:00:00:00:00" 0x20c
|
|
;;
|
|
bt,homehub-v3a)
|
|
ath9k_eeprom_extract "art-copy" 0x0 1
|
|
ath9k_patch_fw_mac_crc $(macaddr_add $(mtd_get_mac_ascii uboot_env ethaddr) +2) 0x10c
|
|
;;
|
|
bt,homehub-v5a)
|
|
ath9k_ubi_eeprom_extract "caldata" 0x1000 0
|
|
ath9k_patch_fw_mac_crc $(macaddr_add $(mtd_get_mac_binary_ubi caldata 0x110c) +2) 0x10c
|
|
;;
|
|
netgear,dgn3500|netgear,dgn3500b)
|
|
ath9k_eeprom_extract "calibration" 0xf000 0
|
|
ath9k_patch_fw_mac_crc $(macaddr_add $(mtd_get_mac_ascii uboot-env ethaddr) +2) 0x20c
|
|
;;
|
|
avm,fritz3370-rev2-hynix|\
|
|
avm,fritz3370-rev2-micron|\
|
|
avm,fritz7362sl)
|
|
ath9k_eeprom_extract_reverse "urlader" 0x1541 0x440
|
|
;;
|
|
avm,fritz7312|avm,fritz7320|avm,fritz7360sl)
|
|
ath9k_eeprom_extract "urlader" 0x985 0
|
|
;;
|
|
avm,fritz7412)
|
|
/usr/bin/fritz_cal_extract -i 1 -s 0x1e000 -e 0x207 -l 4096 -o /lib/firmware/$FIRMWARE $(find_mtd_chardev "urlader")
|
|
;;
|
|
tplink,tdw8970|tplink,tdw8980)
|
|
ath9k_eeprom_extract "boardconfig" 0x21000 0
|
|
;;
|
|
*)
|
|
ath9k_eeprom_die "board $board is not supported yet"
|
|
;;
|
|
esac
|
|
;;
|
|
esac
|