difos/target/linux/ath79/base-files/etc/hotplug.d/firmware/10-ath9k-eeprom
Adrian Schmutzler 0aab49d234 treewide: fix hex2dec conversion for MAC address checksum offset
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>
2019-09-29 00:46:13 +02:00

242 lines
5.6 KiB
Bash

#!/bin/sh
[ -e /lib/firmware/$FIRMWARE ] && exit 0
. /lib/functions.sh
. /lib/functions/system.sh
ath9k_eeprom_die() {
echo "ath9k eeprom: " "$*"
exit 1
}
ath9k_eeprom_extract() {
local part=$1
local offset=$(($2))
local count=$(($3))
local mtd
mtd=$(find_mtd_chardev $part)
[ -n "$mtd" ] || \
ath9k_eeprom_die "no mtd device found for partition $part"
dd if=$mtd of=/lib/firmware/$FIRMWARE iflag=skip_bytes bs=$count skip=$offset count=1 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
}
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 oflag=seek_bytes bs=6 seek=$mac_offset count=1
}
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
"ath9k-eeprom-ahb-18100000.wmac.bin")
case $board in
avm,fritz4020)
ath9k_eeprom_extract_reverse "urlader" 0x1541 0x440
;;
dlink,dir-825-c1|\
dlink,dir-835-a1)
ath9k_eeprom_extract "art" 0x1000 0x440
ath9k_patch_fw_mac $(mtd_get_mac_text "mac" 0x4) 0x2
;;
dlink,dir-842-c1|\
dlink,dir-842-c2|\
dlink,dir-842-c3|\
dlink,dir-859-a1|\
nec,wg1200cr|\
wd,mynet-n750)
ath9k_eeprom_extract "art" 0x1000 0x440
ath9k_patch_fw_mac $(mtd_get_mac_ascii devdata "wlan24mac") 0x2
;;
engenius,ecb1750)
ath9k_eeprom_extract "art" 0x1000 0x440
ath9k_patch_fw_mac $(macaddr_add $(mtd_get_mac_ascii u-boot-env "athaddr") +1) 0x2
;;
engenius,epg5000|\
iodata,wn-ac1167dgr|\
iodata,wn-ac1600dgr|\
iodata,wn-ac1600dgr2|\
iodata,wn-ag300dgr)
ath9k_eeprom_extract "art" 0x1000 0x440
ath9k_patch_fw_mac $(mtd_get_mac_ascii u-boot-env ethaddr) 0x2
;;
nec,wg800hp)
ath9k_eeprom_extract "art" 0x1000 0x440
ath9k_patch_fw_mac $(mtd_get_mac_text board_data 0x680) 0x2
;;
qihoo,c301)
ath9k_eeprom_extract "radiocfg" 0x1000 0x440
ath9k_patch_fw_mac $(mtd_get_mac_ascii devdata "wlan24mac") 0x2
;;
*)
ath9k_eeprom_die "board $board is not supported yet"
;;
esac
;;
"ath9k-eeprom-pci-0000:00:00.0.bin")
case $board in
avm,fritz300e)
ath9k_eeprom_extract_reverse "urloader" 0x1541 0x440
;;
buffalo,whr-g301n|\
buffalo,wzr-hp-g302h-a1a0|\
tplink,tl-wr841-v5|\
tplink,tl-wr941-v4)
ath9k_eeprom_extract "art" 0x1000 0xeb8
;;
buffalo,wzr-hp-g450h)
ath9k_eeprom_extract "art" 0x1000 0x440
;;
dlink,dir-825-c1|\
dlink,dir-835-a1)
ath9k_eeprom_extract "art" 0x5000 0x440
ath9k_patch_fw_mac $(macaddr_add $(mtd_get_mac_text "mac" 0x18) 1) 0x2
;;
ocedo,raccoon|\
tplink,tl-wdr3500-v1|\
tplink,tl-wdr3600-v1|\
tplink,tl-wdr4300-v1|\
tplink,tl-wdr4900-v2|\
winchannel,wb2000)
ath9k_eeprom_extract "art" 0x5000 0x440
;;
netgear,wnr612-v2|\
on,n150r|\
pcs,cap324|\
tplink,tl-mr3220-v1|\
tplink,tl-mr3420-v1|\
tplink,tl-wr2543-v1|\
tplink,tl-wr740n-v1|\
tplink,tl-wr740n-v3|\
tplink,tl-wr741-v1|\
tplink,tl-wr743nd-v1|\
tplink,tl-wr841-v7|\
tplink,tl-wr842n-v1|\
ubnt,airrouter|\
ubnt,bullet-m|\
ubnt,nano-m|\
ubnt,rocket-m)
ath9k_eeprom_extract "art" 0x1000 0x1000
;;
pqi,air-pen)
ath9k_eeprom_extract "art" 0x1000 0x7d2
;;
ubnt,unifi)
ath9k_eeprom_extract "art" 0x1000 0x800
;;
wd,mynet-n750)
ath9k_eeprom_extract "art" 0x5000 0x440
ath9k_patch_fw_mac $(mtd_get_mac_ascii devdata "wlan5mac") 0x2
;;
wd,mynet-wifi-rangeextender)
ath9k_eeprom_extract "art" 0x1000 0x1000
ath9k_patch_fw_mac $(nvram get wl0_hwaddr) "$mac" 0x2
;;
*)
ath9k_eeprom_die "board $board is not supported yet"
;;
esac
;;
"ath9k-eeprom-pci-0000:00:11.0.bin")
case $board in
buffalo,wzr-hp-ag300h|\
netgear,wndr3700|\
netgear,wndr3700v2|\
netgear,wndr3800|\
netgear,wndr3800ch)
ath9k_eeprom_extract "art" 0x1000 0xeb8
;;
dlink,dir-825-b1)
ath9k_eeprom_extract "caldata" 0x1000 0xeb8
ath9k_patch_fw_mac_crc $(mtd_get_mac_text "caldata" 0xffa0) 0x20c
;;
*)
ath9k_eeprom_die "board $board is not supported yet"
;;
esac
;;
"ath9k-eeprom-pci-0000:00:12.0.bin")
case $board in
buffalo,wzr-hp-ag300h|\
netgear,wndr3700|\
netgear,wndr3700v2|\
netgear,wndr3800|\
netgear,wndr3800ch)
ath9k_eeprom_extract "art" 0x5000 0xeb8
;;
dlink,dir-825-b1)
ath9k_eeprom_extract "caldata" 0x5000 0xeb8
ath9k_patch_fw_mac_crc $(macaddr_add $(mtd_get_mac_text "caldata" 0xffb4) 1) 0x20c
;;
*)
ath9k_eeprom_die "board $board is not supported yet"
;;
esac
;;
esac