mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-25 16:31:13 +00:00
51fb186cb3
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 @ TP-Link TL-WDR4300 (just manually) results
in a time reduction by three orders of magnitude (99.9 %).
> time dd if=/dev/mtd3 of=/lib/firmware/test-slow bs=1 count=4096 skip=4096
4096+0 records in
4096+0 records out
real 0m 15.85s
user 0m 0.06s
sys 0m 13.28s
> time dd if=/dev/mtd3 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>
179 lines
4.0 KiB
Bash
179 lines
4.0 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_ubi_eeprom_extract() {
|
|
local part=$1
|
|
local offset=$2
|
|
local count=$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"
|
|
|
|
dd if=/dev/$ubi of=/lib/firmware/$FIRMWARE iflag=skip_bytes bs=$count skip=$offset count=1 2>/dev/null || \
|
|
ath9k_eeprom_die "failed to extract from $ubi"
|
|
}
|
|
|
|
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_patch_firmware_mac() {
|
|
local mac=$1
|
|
|
|
[ -z "$mac" ] && return
|
|
|
|
macaddr_2bin $mac | dd of=/lib/firmware/$FIRMWARE conv=notrunc oflag=seek_bytes bs=6 seek=2 count=1
|
|
}
|
|
|
|
board=$(board_name)
|
|
|
|
case "$FIRMWARE" in
|
|
"soc_wmac.eeprom")
|
|
case $board in
|
|
c-55|\
|
|
c-60)
|
|
ath9k_eeprom_extract "art" 4096 2048
|
|
ath9k_patch_firmware_mac $(macaddr_add $(mtd_get_mac_binary art 0) +1)
|
|
;;
|
|
fritz4020|\
|
|
fritz450e)
|
|
ath9k_eeprom_extract_reverse "urlader" 5441 1088
|
|
;;
|
|
mr18)
|
|
. /lib/upgrade/nand.sh
|
|
|
|
if [ -n "$(nand_find_volume ubi0 caldata)" ]; then
|
|
ath9k_ubi_eeprom_extract "caldata" 4096 2048
|
|
else
|
|
ath9k_eeprom_extract "odm-caldata" 4096 2048
|
|
fi
|
|
ath9k_patch_firmware_mac $(macaddr_add $(mtd_get_mac_binary_ubi board-config 102) +1)
|
|
;;
|
|
r6100 | \
|
|
wndr3700v4 | \
|
|
wndr4300)
|
|
ath9k_eeprom_extract "caldata" 4096 2048
|
|
ath9k_patch_firmware_mac $(mtd_get_mac_binary caldata 0)
|
|
;;
|
|
rambutan)
|
|
ath9k_eeprom_extract "art" 4096 2048
|
|
;;
|
|
wlr8100)
|
|
ath9k_eeprom_extract "art" 4096 2048
|
|
ath9k_patch_firmware_mac $(mtd_get_mac_ascii u-boot-env "ethaddr")
|
|
;;
|
|
z1)
|
|
. /lib/upgrade/nand.sh
|
|
|
|
if [ -n "$(nand_find_volume ubi0 caldata)" ]; then
|
|
ath9k_ubi_eeprom_extract "caldata" 4096 2048
|
|
else
|
|
ath9k_eeprom_extract "origcaldata" 4096 2048
|
|
fi
|
|
ath9k_patch_firmware_mac $(macaddr_add $(mtd_get_mac_binary_ubi board-config 102) +2)
|
|
;;
|
|
*)
|
|
ath9k_eeprom_die "board $board is not supported yet"
|
|
;;
|
|
esac
|
|
;;
|
|
|
|
"pci_wmac0.eeprom")
|
|
case $board in
|
|
c-55)
|
|
ath9k_eeprom_extract "art" 20480 2048
|
|
ath9k_patch_firmware_mac $(macaddr_add $(mtd_get_mac_binary art 0) +2)
|
|
;;
|
|
fritz300e)
|
|
ath9k_eeprom_extract_reverse "urloader" 5441 1088
|
|
;;
|
|
mr18)
|
|
. /lib/upgrade/nand.sh
|
|
|
|
if [ -n "$(nand_find_volume ubi0 caldata)" ]; then
|
|
ath9k_ubi_eeprom_extract "caldata" 20480 2048
|
|
else
|
|
ath9k_eeprom_extract "odm-caldata" 20480 2048
|
|
fi
|
|
ath9k_patch_firmware_mac $(macaddr_add $(mtd_get_mac_binary_ubi board-config 102) +2)
|
|
;;
|
|
wndr3700v4 | \
|
|
wndr4300)
|
|
ath9k_eeprom_extract "caldata" 20480 2048
|
|
ath9k_patch_firmware_mac $(mtd_get_mac_binary caldata 12)
|
|
;;
|
|
z1)
|
|
. /lib/upgrade/nand.sh
|
|
|
|
if [ -n "$(nand_find_volume ubi0 caldata)" ]; then
|
|
ath9k_ubi_eeprom_extract "caldata" 86016 4096
|
|
else
|
|
ath9k_eeprom_extract "origcaldata" 86016 4096
|
|
fi
|
|
ath9k_patch_firmware_mac $(macaddr_add $(mtd_get_mac_binary_ubi board-config 102) +3)
|
|
;;
|
|
*)
|
|
ath9k_eeprom_die "board $board is not supported yet"
|
|
;;
|
|
esac
|
|
;;
|
|
|
|
"pci_wmac1.eeprom")
|
|
case $board in
|
|
mr18)
|
|
. /lib/upgrade/nand.sh
|
|
|
|
if [ -n "$(nand_find_volume ubi0 caldata)" ]; then
|
|
ath9k_ubi_eeprom_extract "caldata" 36864 2048
|
|
else
|
|
ath9k_eeprom_extract "odm-caldata" 36864 2048
|
|
fi
|
|
ath9k_patch_firmware_mac $(macaddr_add $(mtd_get_mac_binary_ubi board-config 102) +3)
|
|
;;
|
|
*)
|
|
ath9k_eeprom_die "board $board is not supported yet"
|
|
;;
|
|
esac
|
|
;;
|
|
esac
|