mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-23 07:22:33 +00:00
e1ba59ea5c
Reading and writing to and from flash storage is slowed down
enormously by some functions which use a block size of 1.
This patch reworks the extraction scripts to be much faster and
efficient by reading and writing in possibly one big block.
This is based on the initial commit a69e101
for ipq40xx by
Christian Lamparter <chunkeey@gmail.com>.
Speed comparison @ UBNT AC-Mesh (just manually) results
in a time reduction by three orders of magnitude (99.9 %).
> time dd if=/dev/mtd6 of=/lib/firmware/test-slow bs=1 count=4096 skip=4096
4096+0 records in
4096+0 records out
real 0m 16.84s
user 0m 0.07s
sys 0m 13.54s
> time dd if=/dev/mtd6 of=/lib/firmware/test-fast bs=4096 count=1 skip=4096 iflag=skip_bytes
1+0 records in
1+0 records out
real 0m 0.02s
user 0m 0.00s
sys 0m 0.02s
Signed-off-by: Adrian Schmutzler <freifunk@adrianschmutzler.de>
Tested-by: Rosen Penev <rosenp@gmail.com>
185 lines
4.5 KiB
Bash
185 lines
4.5 KiB
Bash
#!/bin/sh
|
|
|
|
. /lib/functions/k2t.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"
|
|
}
|
|
|
|
ath10kcal_die() {
|
|
echo "ath10cal: " "$*"
|
|
exit 1
|
|
}
|
|
|
|
ath10kcal_from_file() {
|
|
local source=$1
|
|
local offset=$2
|
|
local count=$3
|
|
|
|
dd if=$source of=/lib/firmware/$FIRMWARE iflag=skip_bytes bs=$count skip=$offset count=1 2>/dev/null || \
|
|
ath10kcal_die "failed to extract calibration data from $source"
|
|
}
|
|
|
|
ath10kcal_extract() {
|
|
local part=$1
|
|
local offset=$2
|
|
local count=$3
|
|
local mtd
|
|
|
|
mtd=$(find_mtd_chardev $part)
|
|
[ -n "$mtd" ] || \
|
|
ath10kcal_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 || \
|
|
ath10kcal_die "failed to extract calibration data from $mtd"
|
|
}
|
|
|
|
ath10kcal_patch_mac() {
|
|
local mac=$1
|
|
|
|
[ -z "$mac" ] && return
|
|
|
|
macaddr_2bin $mac | dd of=/lib/firmware/$FIRMWARE conv=notrunc oflag=seek_bytes bs=6 seek=6 count=1
|
|
}
|
|
|
|
ath10kcal_patch_mac_crc() {
|
|
local mac=$1
|
|
local mac_offset=6
|
|
local chksum_offset=2
|
|
local xor_mac
|
|
local xor_fw_mac
|
|
local xor_fw_chksum
|
|
|
|
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}"
|
|
|
|
ath10kcal_patch_mac "$mac" && {
|
|
xor_mac=${mac//:/}
|
|
xor_mac="${xor_mac:0:4} ${xor_mac:4:4} ${xor_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
|
|
}
|
|
}
|
|
|
|
[ -e /lib/firmware/$FIRMWARE ] && exit 0
|
|
|
|
. /lib/functions.sh
|
|
. /lib/functions/system.sh
|
|
|
|
board=$(board_name)
|
|
|
|
case "$FIRMWARE" in
|
|
"ath10k/cal-pci-0000:00:00.0.bin")
|
|
case $board in
|
|
devolo,dvl1200e|\
|
|
devolo,dvl1200i|\
|
|
devolo,dvl1750c|\
|
|
devolo,dvl1750e|\
|
|
devolo,dvl1750i)
|
|
ath10kcal_extract "art" 20480 2116
|
|
ath10kcal_patch_mac_crc $(macaddr_add $(mtd_get_mac_binary art 0) -1)
|
|
;;
|
|
dlink,dir-859-a1)
|
|
ath10kcal_extract "art" 20480 2116
|
|
ath10kcal_patch_mac $(mtd_get_mac_ascii devdata "wlan5mac")
|
|
;;
|
|
elecom,wrc-1750ghbk2-i)
|
|
ath10kcal_extract "ART" 20480 2116
|
|
;;
|
|
engenius,epg5000|\
|
|
iodata,wn-ac1167dgr|\
|
|
iodata,wn-ac1600dgr2)
|
|
ath10kcal_extract "art" 20480 2116
|
|
ath10kcal_patch_mac $(macaddr_add $(mtd_get_mac_ascii u-boot-env ethaddr) +1)
|
|
;;
|
|
engenius,ews511ap|\
|
|
glinet,gl-ar750s|\
|
|
glinet,gl-x750|\
|
|
tplink,re450-v2)
|
|
ath10kcal_extract "art" 20480 2116
|
|
ath10kcal_patch_mac $(macaddr_add $(cat /sys/class/net/eth0/address) +1)
|
|
;;
|
|
nec,wg800hp)
|
|
ath10kcal_extract "art" 20480 2116
|
|
ath10kcal_patch_mac_crc $(mtd_get_mac_text board_data 2176)
|
|
;;
|
|
ocedo,koala)
|
|
ath10kcal_extract "art" 20480 2116
|
|
ath10kcal_patch_mac $(mtd_get_mac_binary art 12)
|
|
;;
|
|
openmesh,om5p-ac-v2)
|
|
ath10kcal_extract "ART" 20480 2116
|
|
ath10kcal_patch_mac $(macaddr_add $(cat /sys/class/net/eth0/address) +16)
|
|
;;
|
|
tplink,archer-c2-v3)
|
|
ath10kcal_extract "ART" 20480 2116
|
|
ath10kcal_patch_mac $(macaddr_add $(cat /sys/class/net/eth0/address) -1)
|
|
;;
|
|
tplink,archer-c5-v1|\
|
|
tplink,archer-c7-v2)
|
|
ath10kcal_extract "art" 20480 2116
|
|
ath10kcal_patch_mac $(macaddr_add $(cat /sys/class/net/eth1/address) -1)
|
|
;;
|
|
tplink,archer-a7-v5|\
|
|
tplink,archer-c7-v4|\
|
|
tplink,archer-c7-v5)
|
|
ath10kcal_extract "art" 20480 2116
|
|
ath10kcal_patch_mac $(macaddr_add $(cat /sys/class/net/eth0/address) -1)
|
|
;;
|
|
tplink,re350k-v1)
|
|
ath10kcal_extract "art" 20480 2116
|
|
ath10kcal_patch_mac $(macaddr_add $(cat /sys/class/net/eth0/address) +2)
|
|
;;
|
|
ubnt,unifiac-lite|\
|
|
ubnt,unifiac-mesh|\
|
|
ubnt,unifiac-mesh-pro|\
|
|
ubnt,lap-120|\
|
|
ubnt,nanostation-ac|\
|
|
ubnt,nanostation-ac-loco|\
|
|
ubnt,unifiac-pro)
|
|
ath10kcal_extract "EEPROM" 20480 2116
|
|
;;
|
|
yuncore,a770)
|
|
ath10kcal_extract "art" 20480 2116
|
|
;;
|
|
esac
|
|
;;
|
|
"ath10k/pre-cal-pci-0000:00:00.0.bin")
|
|
case $board in
|
|
phicomm,k2t)
|
|
ath10kcal_extract "art" 20480 12064
|
|
ath10kcal_patch_mac_crc $(k2t_get_mac "5g_mac")
|
|
ln -sf /lib/firmware/ath10k/pre-cal-pci-0000\:00\:00.0.bin \
|
|
/lib/firmware/ath10k/QCA9888/hw2.0/board.bin
|
|
;;
|
|
tplink,archer-c58-v1|\
|
|
tplink,archer-c59-v1|\
|
|
tplink,archer-c6-v2)
|
|
ath10kcal_extract "art" 20480 12064
|
|
ath10kcal_patch_mac_crc $(macaddr_add $(mtd_get_mac_binary mac 8) -1)
|
|
ln -sf /lib/firmware/ath10k/pre-cal-pci-0000\:00\:00.0.bin \
|
|
/lib/firmware/ath10k/QCA9888/hw2.0/board.bin
|
|
;;
|
|
esac
|
|
;;
|
|
*)
|
|
exit 1
|
|
;;
|
|
esac
|