From 50d57a982c47969485382f923af5fa233ef5861e Mon Sep 17 00:00:00 2001 From: AmadeusGhost <42570690+AmadeusGhost@users.noreply.github.com> Date: Sat, 30 Jan 2021 12:18:02 +0800 Subject: [PATCH] treewide: use upstream caldata script --- package/base-files/files/lib/functions.sh | 20 +- .../base-files/files/lib/functions/caldata.sh | 171 ++++++++++++++ .../base-files/files/lib/functions/system.sh | 29 ++- .../etc/hotplug.d/firmware/10-ath9k-eeprom | 61 +---- .../etc/hotplug.d/firmware/11-ath10k-caldata | 219 ++++++------------ .../etc/hotplug.d/firmware/11-ath10k-caldata | 136 +++-------- .../etc/hotplug.d/firmware/11-ath10k-caldata | 38 +-- .../etc/hotplug.d/firmware/12-ath9k-eeprom | 140 +---------- .../etc/hotplug.d/firmware/12-ath9k-eeprom | 141 ++--------- .../etc/hotplug.d/firmware/10-ath9k-eeprom | 49 +--- .../etc/hotplug.d/firmware/10-rt2x00-eeprom | 48 +--- 11 files changed, 369 insertions(+), 683 deletions(-) create mode 100644 package/base-files/files/lib/functions/caldata.sh diff --git a/package/base-files/files/lib/functions.sh b/package/base-files/files/lib/functions.sh index 9561bd0502..f528b10ac8 100644 --- a/package/base-files/files/lib/functions.sh +++ b/package/base-files/files/lib/functions.sh @@ -16,6 +16,22 @@ NO_EXPORT=1 LOAD_STATE=1 LIST_SEP=" " +# 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" +} + append() { local var="$1" local value="$2" @@ -310,7 +326,7 @@ group_add_next() { gids=$(cat ${IPKG_INSTROOT}/etc/group | cut -d: -f3) gid=65536 while [ -n "$(echo "$gids" | grep "^$gid$")" ] ; do - gid=$((gid + 1)) + gid=$((gid + 1)) done group_add $1 $gid echo $gid @@ -338,7 +354,7 @@ user_add() { uids=$(cat ${IPKG_INSTROOT}/etc/passwd | cut -d: -f3) uid=65536 while [ -n "$(echo "$uids" | grep "^$uid$")" ] ; do - uid=$((uid + 1)) + uid=$((uid + 1)) done } [ -z "$gid" ] && gid=$uid diff --git a/package/base-files/files/lib/functions/caldata.sh b/package/base-files/files/lib/functions/caldata.sh new file mode 100644 index 0000000000..2177cf8415 --- /dev/null +++ b/package/base-files/files/lib/functions/caldata.sh @@ -0,0 +1,171 @@ +# Copyright (C) 2019 OpenWrt.org + +. /lib/functions.sh +. /lib/functions/system.sh + +caldata_dd() { + local source=$1 + local target=$2 + local count=$(($3)) + local offset=$(($4)) + + dd if=$source of=$target iflag=skip_bytes,fullblock bs=$count skip=$offset count=1 2>/dev/null + return $? +} + +caldata_die() { + echo "caldata: " "$*" + exit 1 +} + +caldata_extract() { + local part=$1 + local offset=$(($2)) + local count=$(($3)) + local mtd + + mtd=$(find_mtd_chardev $part) + [ -n "$mtd" ] || caldata_die "no mtd device found for partition $part" + + caldata_dd $mtd /lib/firmware/$FIRMWARE $count $offset || \ + caldata_die "failed to extract calibration data from $mtd" +} + +caldata_extract_ubi() { + local part=$1 + local offset=$(($2)) + local count=$(($3)) + local ubidev + local ubi + + . /lib/upgrade/nand.sh + + ubidev=$(nand_find_ubi $CI_UBIPART) + ubi=$(nand_find_volume $ubidev $part) + [ -n "$ubi" ] || caldata_die "no UBI volume found for $part" + + caldata_dd /dev/$ubi /lib/firmware/$FIRMWARE $count $offset || \ + caldata_die "failed to extract calibration data from $ubi" +} + +caldata_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 +} + +caldata_from_file() { + local source=$1 + local offset=$(($2)) + local count=$(($3)) + local target=$4 + + [ -n "$target" ] || target=/lib/firmware/$FIRMWARE + + caldata_dd $source $target $count $offset || \ + caldata_die "failed to extract calibration data from $source" +} + +caldata_sysfsload_from_file() { + local source=$1 + local offset=$(($2)) + local count=$(($3)) + local target_dir="/sys/$DEVPATH" + local target="$target_dir/data" + + [ -d "$target_dir" ] || \ + caldata_die "no sysfs dir to write: $target" + + echo 1 > "$target_dir/loading" + caldata_dd $source $target $count $offset + if [ $? != 0 ]; then + echo 1 > "$target_dir/loading" + caldata_die "failed to extract calibration data from $source" + else + echo 0 > "$target_dir/loading" + fi +} + +caldata_valid() { + local expected="$1" + local target=$2 + + [ -n "$target" ] || target=/lib/firmware/$FIRMWARE + + magic=$(hexdump -v -n 2 -e '1/1 "%02x"' $target) + [ "$magic" = "$expected" ] + return $? +} + +caldata_patch_chksum() { + local mac=$1 + local mac_offset=$(($2)) + local chksum_offset=$(($3)) + local target=$4 + local xor_mac + local xor_fw_mac + local xor_fw_chksum + + 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=$target conv=notrunc bs=1 seek=$chksum_offset count=2 +} + +caldata_patch_mac() { + local mac=$1 + local mac_offset=$(($2)) + local chksum_offset=$3 + local target=$4 + + [ -z "$mac" -o -z "$mac_offset" ] && return + + [ -n "$target" ] || target=/lib/firmware/$FIRMWARE + + [ -n "$chksum_offset" ] && caldata_patch_chksum "$mac" "$mac_offset" "$chksum_offset" "$target" + + macaddr_2bin $mac | dd of=$target conv=notrunc oflag=seek_bytes bs=6 seek=$mac_offset count=1 || \ + caldata_die "failed to write MAC address to eeprom file" +} + +ath9k_patch_mac() { + local mac=$1 + local target=$2 + + caldata_patch_mac "$mac" 0x2 "" "$target" +} + +ath9k_patch_mac_crc() { + local mac=$1 + local mac_offset=$2 + local chksum_offset=$((mac_offset - 10)) + local target=$4 + + caldata_patch_mac "$mac" "$mac_offset" "$chksum_offset" "$target" +} + +ath10k_patch_mac() { + local mac=$1 + local target=$2 + + caldata_patch_mac "$mac" 0x6 0x2 "$target" +} diff --git a/package/base-files/files/lib/functions/system.sh b/package/base-files/files/lib/functions/system.sh index eb3d54e911..80e417182a 100755 --- a/package/base-files/files/lib/functions/system.sh +++ b/package/base-files/files/lib/functions/system.sh @@ -81,7 +81,7 @@ mtd_get_mac_ascii() { mtd_get_mac_text() { local mtdname=$1 - local offset=$2 + local offset=$(($2)) local part local mac_dirty @@ -145,10 +145,33 @@ macaddr_add() { echo $oui:$nic } -macaddr_setbit_la() { +macaddr_geteui() { local mac=$1 + local sep=$2 - printf "%02x:%s" $((0x${mac%%:*} | 0x02)) ${mac#*:} + echo ${mac:9:2}$sep${mac:12:2}$sep${mac:15:2} +} + +macaddr_setbit() { + local mac=$1 + local bit=${2:-0} + + [ $bit -gt 0 -a $bit -le 48 ] || return + + printf "%012x" $(( 0x${mac//:/} | 2**(48-bit) )) | sed -e 's/\(.\{2\}\)/\1:/g' -e 's/:$//' +} + +macaddr_unsetbit() { + local mac=$1 + local bit=${2:-0} + + [ $bit -gt 0 -a $bit -le 48 ] || return + + printf "%012x" $(( 0x${mac//:/} & ~(2**(48-bit)) )) | sed -e 's/\(.\{2\}\)/\1:/g' -e 's/:$//' +} + +macaddr_setbit_la() { + macaddr_setbit $1 7 } macaddr_unsetbit_mc() { diff --git a/target/linux/apm821xx/base-files/etc/hotplug.d/firmware/10-ath9k-eeprom b/target/linux/apm821xx/base-files/etc/hotplug.d/firmware/10-ath9k-eeprom index cdc2ba9bfc..dcdcf4dc45 100644 --- a/target/linux/apm821xx/base-files/etc/hotplug.d/firmware/10-ath9k-eeprom +++ b/target/linux/apm821xx/base-files/etc/hotplug.d/firmware/10-ath9k-eeprom @@ -2,50 +2,7 @@ [ -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_patch_firmware_mac() { - local mac=$1 - - [ -z "$mac" ] && return - - macaddr_2bin $mac | dd of=/lib/firmware/$FIRMWARE conv=notrunc bs=1 seek=2 count=6 -} +. /lib/functions/caldata.sh board=$(board_name) @@ -56,14 +13,14 @@ case "$FIRMWARE" in . /lib/upgrade/nand.sh if [ -n "$(nand_find_volume ubi0 caldata)" ]; then - ath9k_ubi_eeprom_extract "caldata" 4096 4096 + caldata_extract_ubi "caldata" 0x1000 0x1000 else - ath9k_eeprom_extract "wifi_data" 4096 4096 - ath9k_patch_firmware_mac $(mtd_get_mac_binary wifi_data 0) + caldata_extract "wifi_data" 0x1000 0x1000 + ath9k_patch_mac $(mtd_get_mac_binary wifi_data 0x0) fi ;; *) - ath9k_eeprom_die "board $board is not supported yet" + caldata_die "board $board is not supported yet" ;; esac ;; @@ -74,14 +31,14 @@ case "$FIRMWARE" in . /lib/upgrade/nand.sh if [ -n "$(nand_find_volume ubi0 caldata)" ]; then - ath9k_ubi_eeprom_extract "caldata" 20480 4096 + caldata_extract_ubi "caldata" 0x5000 0x1000 else - ath9k_eeprom_extract "wifi_data" 20480 4096 - ath9k_patch_firmware_mac $(mtd_get_mac_binary wifi_data 12) + caldata_extract "wifi_data" 0x5000 0x1000 + ath9k_patch_mac $(mtd_get_mac_binary wifi_data 0xc) fi ;; *) - ath9k_eeprom_die "board $board is not supported yet" + caldata_die "board $board is not supported yet" ;; esac ;; diff --git a/target/linux/ipq40xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata b/target/linux/ipq40xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata index 4055940c9c..c96ca1e893 100644 --- a/target/linux/ipq40xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata +++ b/target/linux/ipq40xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata @@ -1,95 +1,8 @@ #!/bin/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_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_ubi_extract() { - local part=$1 - local offset=$2 - local count=$3 - local ubidev - local ubi - - . /lib/upgrade/nand.sh - - ubidev=$(nand_find_ubi $CI_UBIPART) - ubi=$(nand_find_volume $ubidev $part) - [ -n "$ubi" ] || \ - ath10kcal_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 || \ - ath10kcal_die "failed to extract from $ubi" -} - -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 - - [ -z "$mac" ] && return - - 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}" - - macaddr_2bin $mac | dd of=/lib/firmware/$FIRMWARE conv=notrunc bs=1 seek=6 count=6 - - 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 -} - -ath10kcal_is_caldata_valid() { - local expected="$1" - - magic=$(hexdump -v -n 2 -e '1/1 "%02x"' /lib/firmware/$FIRMWARE) - [[ "$magic" == "$expected" ]] - return $? -} - [ -e /lib/firmware/$FIRMWARE ] && exit 0 -. /lib/functions.sh -. /lib/functions/system.sh +. /lib/functions/caldata.sh board=$(board_name) @@ -97,22 +10,22 @@ case "$FIRMWARE" in "ath10k/cal-pci-0000:01:00.0.bin") case "$board" in meraki,mr33) - ath10kcal_ubi_extract "ART" 36864 2116 - ath10kcal_is_caldata_valid "4408" || ath10kcal_extract "ART" 36864 2116 - ath10kcal_patch_mac_crc $(macaddr_add $(get_mac_binary "/sys/bus/i2c/devices/0-0050/eeprom" 102) +1) + caldata_extract_ubi "ART" 0x9000 0x844 + caldata_valid "4408" || caldata_extract "ART" 0x9000 0x844 + ath10k_patch_mac $(macaddr_add $(get_mac_binary "/sys/bus/i2c/devices/0-0050/eeprom" 0x66) +1) ;; esac ;; "ath10k/pre-cal-pci-0000:01:00.0.bin") case "$board" in asus,map-ac2200) - ath10kcal_ubi_extract "Factory" 36864 12064 + caldata_extract_ubi "Factory" 0x9000 0x2f20 ln -sf /lib/firmware/ath10k/pre-cal-pci-0000\:00\:00.0.bin \ /lib/firmware/ath10k/QCA9888/hw2.0/board.bin ;; asus,rt-acrh17) CI_UBIPART=UBI_DEV - ath10kcal_ubi_extract "Factory" 36864 12064 + caldata_extract_ubi "Factory" 0x9000 0x2f20 ;; avm,fritzrepeater-3000) /usr/bin/fritz_cal_extract -i 1 -s 0x3D000 -e 0x212 -l 12064 -o /lib/firmware/$FIRMWARE $(find_mtd_chardev "urlader0") || \ @@ -123,20 +36,20 @@ case "$FIRMWARE" in /usr/bin/fritz_cal_extract -i 1 -s 0x3C000 -e 0x212 -l 12064 -o /lib/firmware/$FIRMWARE $(find_mtd_chardev "urlader1") ;; buffalo,wtr-m2133hp) - ath10kcal_extract "ART" 36864 12064 - ath10kcal_patch_mac_crc $(mtd_get_mac_binary ORGDATA 50) + caldata_extract "ART" 0x9000 0x2f20 + ath10k_patch_mac $(mtd_get_mac_binary ORGDATA 0x32) ;; engenius,eap2200 |\ openmesh,a62) - ath10kcal_extract "0:ART" 36864 12064 + caldata_extract "0:ART" 0x9000 0x2f20 ;; linksys,ea8300) - ath10kcal_extract "ART" 36864 12064 + caldata_extract "ART" 0x9000 0x2f20 # OEM assigns 4 sequential MACs - ath10kcal_patch_mac_crc $(macaddr_setbit_la $(macaddr_add "$(cat /sys/class/net/eth0/address)" +4)) + ath10k_patch_mac $(macaddr_setbit_la $(macaddr_add "$(cat /sys/class/net/eth0/address)" 4)) ;; p2w,r619ac) - ath10kcal_extract "ART" 36864 12064 + caldata_extract "ART" 0x9000 0x2f20 ;; esac ;; @@ -155,21 +68,21 @@ case "$FIRMWARE" in mobipromo,cm520-79f |\ p2w,r619ac |\ qcom,ap-dk01.1-c1) - ath10kcal_extract "ART" 4096 12064 + caldata_extract "ART" 0x1000 0x2f20 ;; aruba,ap-303 |\ aruba,ap-303h |\ aruba,ap-365) - ath10kcal_extract "ART" 4096 12064 - ath10kcal_patch_mac_crc $(mtd_get_mac_binary mfginfo 29) + caldata_extract "ART" 0x1000 0x2f20 + ath10k_patch_mac $(mtd_get_mac_binary mfginfo 0x1D) ;; asus,map-ac2200) - ath10kcal_ubi_extract "Factory" 4096 12064 + caldata_extract_ubi "Factory" 0x1000 0x2f20 ;; asus,rt-acrh17 |\ asus,rt-ac58u) CI_UBIPART=UBI_DEV - ath10kcal_ubi_extract "Factory" 4096 12064 + caldata_extract_ubi "Factory" 0x1000 0x2f20 ;; avm,fritzbox-4040) /usr/bin/fritz_cal_extract -i 1 -s 0x400 -e 0x207 -l 12064 -o /lib/firmware/$FIRMWARE $(find_mtd_chardev "urlader_config") @@ -185,8 +98,8 @@ case "$FIRMWARE" in /usr/bin/fritz_cal_extract -i 1 -s 0x3D000 -e 0x207 -l 12064 -o /lib/firmware/$FIRMWARE $(find_mtd_chardev "urlader1") ;; buffalo,wtr-m2133hp) - ath10kcal_extract "ART" 4096 12064 - ath10kcal_patch_mac_crc $(mtd_get_mac_binary ORGDATA 38) + caldata_extract "ART" 0x1000 0x2f20 + ath10k_patch_mac $(mtd_get_mac_binary ORGDATA 0x26) ;; cellc,rtl30vw |\ compex,wpj419 |\ @@ -199,47 +112,47 @@ case "$FIRMWARE" in qxwlan,e2600ac-c1 |\ qxwlan,e2600ac-c2 |\ unielec,u4019-32m) - ath10kcal_extract "0:ART" 4096 12064 + caldata_extract "0:ART" 0x1000 0x2f20 ;; dlink,dap-2610) - ath10kcal_extract "ART" 4096 12064 - ath10kcal_patch_mac_crc $(mtd_get_mac_ascii bdcfg wlanmac) + caldata_extract "ART" 0x1000 0x2f20 + ath10k_patch_mac $(mtd_get_mac_ascii bdcfg wlanmac) ;; engenius,emd1) - ath10kcal_extract "0:ART" 4096 12064 - ath10kcal_patch_mac_crc $(mtd_get_mac_ascii 0:APPSBLENV wlanaddr) + caldata_extract "0:ART" 0x1000 0x2f20 + ath10k_patch_mac $(mtd_get_mac_ascii 0:APPSBLENV wlanaddr) ;; engenius,emr3500) - ath10kcal_extract "0:ART" 4096 12064 - ath10kcal_patch_mac_crc $(mtd_get_mac_ascii 0:APPSBLENV ethaddr) + caldata_extract "0:ART" 0x1000 0x2f20 + ath10k_patch_mac $(mtd_get_mac_ascii 0:APPSBLENV ethaddr) ;; engenius,ens620ext) - ath10kcal_extract "ART" 4096 12064 - ath10kcal_patch_mac_crc $(macaddr_add $(mtd_get_mac_ascii u-boot-env ethaddr) +2) + caldata_extract "ART" 0x1000 0x2f20 + ath10k_patch_mac $(macaddr_add $(mtd_get_mac_ascii u-boot-env ethaddr) +2) ;; hiwifi,c526a) - ath10kcal_extract "ART" 4096 12064 - ath10kcal_patch_mac_crc $(macaddr_add $(mtd_get_mac_ascii bdinfo "Vfac_mac ") +2) + caldata_extract "ART" 0x1000 0x2f20 + ath10k_patch_mac $(macaddr_add $(mtd_get_mac_ascii bdinfo "Vfac_mac ") +2) ;; linksys,ea8300) - ath10kcal_extract "ART" 4096 12064 - ath10kcal_patch_mac_crc $(macaddr_add "$(cat /sys/class/net/eth0/address)" +2) + caldata_extract "ART" 0x1000 0x2f20 + ath10k_patch_mac $(macaddr_add "$(cat /sys/class/net/eth0/address)" +2) ;; meraki,mr33) - ath10kcal_ubi_extract "ART" 4096 12064 - ath10kcal_is_caldata_valid "202f" || ath10kcal_extract "ART" 4096 12064 - ath10kcal_patch_mac_crc $(macaddr_add $(get_mac_binary "/sys/bus/i2c/devices/0-0050/eeprom" 102) +2) + caldata_extract_ubi "ART" 0x1000 0x2f20 + caldata_valid "202f" || caldata_extract "ART" 0x1000 0x2f20 + ath10k_patch_mac $(macaddr_add $(get_mac_binary "/sys/bus/i2c/devices/0-0050/eeprom" 0x66) +2) ;; netgear,ex6100v2 |\ netgear,ex6150v2 |\ netgear,ex6200v2) - ath10kcal_extract "ART" 4096 12064 - ath10kcal_patch_mac_crc $(mtd_get_mac_binary dnidata 0) + caldata_extract "ART" 0x1000 0x2f20 + ath10k_patch_mac $(mtd_get_mac_binary dnidata 0x0) ;; zyxel,nbg6617 |\ zyxel,wre6606) - ath10kcal_extract "ART" 4096 12064 - ath10kcal_patch_mac_crc $(macaddr_add $(cat /sys/class/net/eth0/address) -2) + caldata_extract "ART" 0x1000 0x2f20 + ath10k_patch_mac $(macaddr_add $(cat /sys/class/net/eth0/address) -2) ;; esac ;; @@ -258,20 +171,20 @@ case "$FIRMWARE" in mobipromo,cm520-79f |\ p2w,r619ac |\ qcom,ap-dk01.1-c1) - ath10kcal_extract "ART" 20480 12064 + caldata_extract "ART" 0x5000 0x2f20 ;; aruba,ap-303 |\ aruba,ap-303h |\ aruba,ap-365) - ath10kcal_extract "ART" 20480 12064 - ath10kcal_patch_mac_crc $(macaddr_add $(mtd_get_mac_binary mfginfo 29) +1) + caldata_extract "ART" 0x5000 0x2f20 + ath10k_patch_mac $(macaddr_add $(mtd_get_mac_binary mfginfo 0x1D) +1) ;; asus,map-ac2200) - ath10kcal_ubi_extract "Factory" 20480 12064 + caldata_extract_ubi "Factory" 0x5000 0x2f20 ;; asus,rt-ac58u) CI_UBIPART=UBI_DEV - ath10kcal_ubi_extract "Factory" 20480 12064 + caldata_extract_ubi "Factory" 0x5000 0x2f20 ;; avm,fritzbox-4040) /usr/bin/fritz_cal_extract -i 1 -s 0x400 -e 0x208 -l 12064 -o /lib/firmware/$FIRMWARE $(find_mtd_chardev "urlader_config") @@ -287,8 +200,8 @@ case "$FIRMWARE" in /usr/bin/fritz_cal_extract -i 1 -s 0x3C000 -e 0x208 -l 12064 -o /lib/firmware/$FIRMWARE $(find_mtd_chardev "urlader1") ;; buffalo,wtr-m2133hp) - ath10kcal_extract "ART" 20480 12064 - ath10k_patch_mac $(mtd_get_mac_binary ORGDATA 44) + caldata_extract "ART" 0x5000 0x2f20 + ath10k_patch_mac $(mtd_get_mac_binary ORGDATA 0x2c) ;; cellc,rtl30vw |\ compex,wpj419 |\ @@ -301,47 +214,47 @@ case "$FIRMWARE" in qxwlan,e2600ac-c1 |\ qxwlan,e2600ac-c2 |\ unielec,u4019-32m) - ath10kcal_extract "0:ART" 20480 12064 + caldata_extract "0:ART" 0x5000 0x2f20 ;; dlink,dap-2610) - ath10kcal_extract "ART" 20480 12064 - ath10kcal_patch_mac_crc $(mtd_get_mac_ascii bdcfg wlanmac_a) + caldata_extract "ART" 0x5000 0x2f20 + ath10k_patch_mac $(mtd_get_mac_ascii bdcfg wlanmac_a) ;; engenius,emd1) - ath10kcal_extract "0:ART" 20480 12064 - ath10kcal_patch_mac_crc $(macaddr_add $(mtd_get_mac_ascii 0:APPSBLENV wlanaddr) +1) + caldata_extract "0:ART" 0x5000 0x2f20 + ath10k_patch_mac $(macaddr_add $(mtd_get_mac_ascii 0:APPSBLENV wlanaddr) +1) ;; engenius,emr3500) - ath10kcal_extract "0:ART" 20480 12064 - ath10kcal_patch_mac_crc $(macaddr_add $(mtd_get_mac_ascii 0:APPSBLENV ethaddr) +1) + caldata_extract "0:ART" 0x5000 0x2f20 + ath10k_patch_mac $(macaddr_add $(mtd_get_mac_ascii 0:APPSBLENV ethaddr) +1) ;; engenius,ens620ext) - ath10kcal_extract "ART" 20480 12064 - ath10kcal_patch_mac_crc $(macaddr_add $(mtd_get_mac_ascii u-boot-env ethaddr) +3) + caldata_extract "ART" 0x5000 0x2f20 + ath10k_patch_mac $(macaddr_add $(mtd_get_mac_ascii u-boot-env ethaddr) +3) ;; hiwifi,c526a) - ath10kcal_extract "ART" 20480 12064 - ath10kcal_patch_mac_crc $(macaddr_add $(mtd_get_mac_ascii bdinfo "Vfac_mac ") +3) + caldata_extract "ART" 0x5000 0x2f20 + ath10k_patch_mac $(macaddr_add $(mtd_get_mac_ascii bdinfo "Vfac_mac ") +3) ;; linksys,ea8300) - ath10kcal_extract "ART" 20480 12064 - ath10kcal_patch_mac_crc $(macaddr_add "$(cat /sys/class/net/eth0/address)" +3) + caldata_extract "ART" 0x5000 0x2f20 + ath10k_patch_mac $(macaddr_add "$(cat /sys/class/net/eth0/address)" +3) ;; meraki,mr33) - ath10kcal_ubi_extract "ART" 20480 12064 - ath10kcal_is_caldata_valid "202f" || ath10kcal_extract "ART" 20480 12064 - ath10kcal_patch_mac_crc $(macaddr_add $(get_mac_binary "/sys/bus/i2c/devices/0-0050/eeprom" 102) +3) + caldata_extract_ubi "ART" 0x5000 0x2f20 + caldata_valid "202f" || caldata_extract "ART" 0x5000 0x2f20 + ath10k_patch_mac $(macaddr_add $(get_mac_binary "/sys/bus/i2c/devices/0-0050/eeprom" 0x66) +3) ;; netgear,ex6100v2 |\ netgear,ex6150v2 |\ netgear,ex6200v2) - ath10kcal_extract "ART" 20480 12064 - ath10kcal_patch_mac_crc $(mtd_get_mac_binary dnidata 12) + caldata_extract "ART" 0x5000 0x2f20 + ath10k_patch_mac $(mtd_get_mac_binary dnidata 0xc) ;; zyxel,nbg6617 |\ zyxel,wre6606) - ath10kcal_extract "ART" 20480 12064 - ath10kcal_patch_mac_crc $(macaddr_add $(cat /sys/class/net/eth0/address) -1) + caldata_extract "ART" 0x5000 0x2f20 + ath10k_patch_mac $(macaddr_add $(cat /sys/class/net/eth0/address) -1) ;; esac ;; diff --git a/target/linux/ipq806x/base-files/etc/hotplug.d/firmware/11-ath10k-caldata b/target/linux/ipq806x/base-files/etc/hotplug.d/firmware/11-ath10k-caldata index dc6be46879..457fac6b02 100644 --- a/target/linux/ipq806x/base-files/etc/hotplug.d/firmware/11-ath10k-caldata +++ b/target/linux/ipq806x/base-files/etc/hotplug.d/firmware/11-ath10k-caldata @@ -1,78 +1,8 @@ #!/bin/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 bs=1 skip=$offset count=$count 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 bs=1 skip=$offset count=$count 2>/dev/null || \ - ath10kcal_die "failed to extract calibration data from $mtd" -} - -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 - - [ -z "$mac" ] && return - - 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}" - - macaddr_2bin $mac | dd of=/lib/firmware/$FIRMWARE conv=notrunc bs=1 seek=6 count=6 - - 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 +. /lib/functions/caldata.sh board=$(board_name) @@ -80,86 +10,86 @@ case "$FIRMWARE" in "ath10k/cal-pci-0000:01:00.0.bin") case "$board" in ruijie,rg-mtfi-m520) - ath10kcal_extract "ART" 4096 2116 - ath10kcal_patch_mac_crc $(macaddr_add $(mtd_get_mac_ascii PRODUCTINFO ethaddr) +2) + caldata_extract "ART" 0x1000 0x844 + ath10k_patch_mac $(macaddr_add $(mtd_get_mac_ascii PRODUCTINFO ethaddr) +2) ;; esac ;; "ath10k/cal-pci-0001:01:00.0.bin") case "$board" in ruijie,rg-mtfi-m520) - ath10kcal_extract "ART" 20480 2116 - ath10kcal_patch_mac_crc $(macaddr_add $(mtd_get_mac_ascii PRODUCTINFO ethaddr) +3) + caldata_extract "ART" 0x5000 0x844 + ath10k_patch_mac $(macaddr_add $(mtd_get_mac_ascii PRODUCTINFO ethaddr) +3) ;; esac ;; "ath10k/pre-cal-pci-0000:01:00.0.bin") case $board in buffalo,wxr-2533dhp) - ath10kcal_extract "ART" 4096 12064 - ath10kcal_patch_mac_crc $(mtd_get_mac_binary ART 30) + caldata_extract "ART" 0x1000 0x2f20 + ath10k_patch_mac $(mtd_get_mac_binary ART 0x1e) ;; linksys,ea7500-v1 |\ linksys,ea8500) - ath10kcal_extract "art" 4096 12064 - ath10kcal_patch_mac_crc $(macaddr_add $(mtd_get_mac_ascii devinfo hw_mac_addr) +1) + caldata_extract "art" 0x1000 0x2f20 + ath10k_patch_mac $(macaddr_add $(mtd_get_mac_ascii devinfo hw_mac_addr) +1) ;; nec,wg2600hp) - ath10kcal_extract "ART" 4096 12064 - ath10kcal_patch_mac_crc $(macaddr_add $(mtd_get_mac_binary PRODUCTDATA 12) +1) + caldata_extract "ART" 0x1000 0x2f20 + ath10k_patch_mac $(mtd_get_mac_binary PRODUCTDATA 0x12) ;; netgear,d7800 |\ netgear,r7500v2 |\ netgear,r7800) - ath10kcal_extract "art" 4096 12064 - ath10kcal_patch_mac_crc $(macaddr_add $(mtd_get_mac_binary art 6) +1) + caldata_extract "art" 0x1000 0x2f20 + ath10k_patch_mac $(macaddr_add $(mtd_get_mac_binary art 0x6) +1) ;; tplink,c2600) - ath10kcal_extract "radio" 4096 12064 - ath10kcal_patch_mac_crc $(macaddr_add $(mtd_get_mac_binary default-mac 8) -1) + caldata_extract "radio" 0x1000 0x2f20 + ath10k_patch_mac $(macaddr_add $(mtd_get_mac_binary default-mac 0x8) -1) ;; tplink,vr2600v) - ath10kcal_extract "ART" 4096 12064 - ath10kcal_patch_mac_crc $(macaddr_add $(mtd_get_mac_binary default-mac 0) -1) + caldata_extract "ART" 0x1000 0x2f20 + ath10k_patch_mac $(macaddr_add $(mtd_get_mac_binary default-mac 0x0) -1) ;; zyxel,nbg6817) - ath10kcal_extract "0:ART" 4096 12064 - ath10kcal_patch_mac_crc $(macaddr_add $(mtd_get_mac_ascii 0:APPSBLENV ethaddr) +1) + caldata_extract "0:ART" 0x1000 0x2f20 + ath10k_patch_mac $(macaddr_add $(mtd_get_mac_ascii 0:APPSBLENV ethaddr) +1) ;; esac ;; "ath10k/pre-cal-pci-0001:01:00.0.bin") case $board in buffalo,wxr-2533dhp) - ath10kcal_extract "ART" 20480 12064 - ath10kcal_patch_mac_crc $(mtd_get_mac_binary ART 24) + caldata_extract "ART" 0x5000 0x2f20 + ath10k_patch_mac $(mtd_get_mac_binary ART 0x18) ;; linksys,ea7500-v1 |\ linksys,ea8500) - ath10kcal_extract "art" 20480 12064 - ath10kcal_patch_mac_crc $(macaddr_add $(mtd_get_mac_ascii devinfo hw_mac_addr) +2) + caldata_extract "art" 0x5000 0x2f20 + ath10k_patch_mac $(macaddr_add $(mtd_get_mac_ascii devinfo hw_mac_addr) +2) ;; nec,wg2600hp) - ath10kcal_extract "ART" 20480 12064 - ath10kcal_patch_mac_crc $(mtd_get_mac_binary PRODUCTDATA 12) + caldata_extract "ART" 0x5000 0x2f20 + ath10k_patch_mac $(mtd_get_mac_binary PRODUCTDATA 0xc) ;; netgear,d7800 |\ netgear,r7500v2 |\ netgear,r7800) - ath10kcal_extract "art" 20480 12064 - ath10kcal_patch_mac_crc $(macaddr_add $(mtd_get_mac_binary art 6) +2) + caldata_extract "art" 0x5000 0x2f20 + ath10k_patch_mac $(macaddr_add $(mtd_get_mac_binary art 0x6) +2) ;; tplink,c2600) - ath10kcal_extract "radio" 20480 12064 - ath10kcal_patch_mac_crc $(mtd_get_mac_binary default-mac 8) + caldata_extract "radio" 0x5000 0x2f20 + ath10k_patch_mac $(mtd_get_mac_binary default-mac 0x8) ;; tplink,vr2600v) - ath10kcal_extract "ART" 20480 12064 - ath10kcal_patch_mac_crc $(mtd_get_mac_binary default-mac 0) + caldata_extract "ART" 0x5000 0x2f20 + ath10k_patch_mac $(mtd_get_mac_binary default-mac 0x0) ;; zyxel,nbg6817) - ath10kcal_extract "0:ART" 20480 12064 - ath10kcal_patch_mac_crc $(mtd_get_mac_ascii 0:APPSBLENV ethaddr) + caldata_extract "0:ART" 0x5000 0x2f20 + ath10k_patch_mac $(mtd_get_mac_ascii 0:APPSBLENV ethaddr) ;; esac ;; diff --git a/target/linux/lantiq/xrx200/base-files/etc/hotplug.d/firmware/11-ath10k-caldata b/target/linux/lantiq/xrx200/base-files/etc/hotplug.d/firmware/11-ath10k-caldata index 6b4d09dd33..4202187d4f 100644 --- a/target/linux/lantiq/xrx200/base-files/etc/hotplug.d/firmware/11-ath10k-caldata +++ b/target/linux/lantiq/xrx200/base-files/etc/hotplug.d/firmware/11-ath10k-caldata @@ -1,49 +1,19 @@ #!/bin/sh -# Based on ar71xx 11-ath10k-caldata and 10-rt2x00-eeprom [ -e /lib/firmware/$FIRMWARE ] && exit 0 -. /lib/functions.sh -. /lib/functions/system.sh -. /lib/upgrade/nand.sh - -ath10k_caldata_die() { - echo "ath10k caldata: " "$*" - exit 1 -} - -ath10k_caldata_extract_ubi() { - 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" ] || \ - ath10k_caldata_die "no UBI volume found for $part" - - dd if=/dev/$ubi of=/lib/firmware/$FIRMWARE bs=1 skip=$offset count=$count 2>/dev/null || \ - ath10k_caldata_die "failed to extract from $ubi" -} - -ath10k_caldata_set_macaddr() { - local macaddr=$1 - - macaddr_2bin $macaddr | dd of=/lib/firmware/$FIRMWARE \ - conv=notrunc bs=1 seek=6 count=6 -} +. /lib/functions/caldata.sh case "$FIRMWARE" in "ath10k/cal-pci-0000:02:00.0.bin") board=$(board_name) case $board in bt,homehub-v5a) - ath10k_caldata_extract_ubi "caldata" 20480 2116 - ath10k_caldata_set_macaddr $(macaddr_add $(mtd_get_mac_binary_ubi caldata 4364) +3) + caldata_extract_ubi "caldata" 0x5000 0x844 + ath10k_patch_mac $(macaddr_add $(mtd_get_mac_binary_ubi caldata 0x110c) +3) ;; *) - ath10k_caldata_die "board $board is not supported yet" + caldata_die "board $board is not supported yet" ;; esac ;; diff --git a/target/linux/lantiq/xrx200/base-files/etc/hotplug.d/firmware/12-ath9k-eeprom b/target/linux/lantiq/xrx200/base-files/etc/hotplug.d/firmware/12-ath9k-eeprom index 0027bc3966..ee8cc3879a 100644 --- a/target/linux/lantiq/xrx200/base-files/etc/hotplug.d/firmware/12-ath9k-eeprom +++ b/target/linux/lantiq/xrx200/base-files/etc/hotplug.d/firmware/12-ath9k-eeprom @@ -1,131 +1,8 @@ #!/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 -} +. /lib/functions/caldata.sh case "$FIRMWARE" in "ath9k-eeprom-pci-0000:00:0e.0.bin" | \ @@ -137,25 +14,26 @@ case "$FIRMWARE" in avm,fritz3370-rev2-hynix|\ avm,fritz3370-rev2-micron|\ avm,fritz7362sl) - ath9k_eeprom_extract_reverse "urlader" 5441 1088 + caldata_extract_reverse "urlader" 0x1541 0x440 ;; - avm,fritz7360sl) - ath9k_eeprom_extract "urlader" 2437 0 + avm,fritz7360sl|\ + avm,fritz7360-v2) + caldata_extract "urlader" 0x985 0x1000 ;; avm,fritz7412|\ avm,fritz7430) /usr/bin/fritz_cal_extract -i 1 -s 0x1e000 -e 0x207 -l 4096 -o /lib/firmware/$FIRMWARE $(find_mtd_chardev "urlader") ;; bt,homehub-v5a) - ath9k_ubi_eeprom_extract "caldata" 4096 0 - ath9k_patch_fw_mac_crc $(macaddr_add $(mtd_get_mac_binary_ubi caldata 4364) +2) 268 + caldata_extract_ubi "caldata" 0x1000 0x1000 + ath9k_patch_mac_crc $(macaddr_add $(mtd_get_mac_binary_ubi caldata 0x110c) +2) 0x10c ;; tplink,tdw8970|\ tplink,tdw8980) - ath9k_eeprom_extract "boardconfig" 135168 0 + caldata_extract "boardconfig" 0x21000 0x1000 ;; *) - ath9k_eeprom_die "board $board is not supported yet" + caldata_die "board $board is not supported yet" ;; esac ;; diff --git a/target/linux/lantiq/xway/base-files/etc/hotplug.d/firmware/12-ath9k-eeprom b/target/linux/lantiq/xway/base-files/etc/hotplug.d/firmware/12-ath9k-eeprom index 5af3ab2c0e..9aea4eed64 100644 --- a/target/linux/lantiq/xway/base-files/etc/hotplug.d/firmware/12-ath9k-eeprom +++ b/target/linux/lantiq/xway/base-files/etc/hotplug.d/firmware/12-ath9k-eeprom @@ -1,130 +1,23 @@ #!/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 +. /lib/functions/caldata.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() { +caldata_extract_swap() { 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" + [ -n "$mtd" ] || caldata_die "no mtd device found for partition $part" - ath9k_eeprom_extract_raw $mtd $offset $swap -} + offset=$(($offset / 2)) + count=$(($count / 2)) -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 + dd if=$mtd of=/lib/firmware/$FIRMWARE bs=2 skip=$offset count=$count conv=swab 2>/dev/null || \ + caldata_die "failed to extract calibration data from $mtd" } case "$FIRMWARE" in @@ -135,28 +28,28 @@ case "$FIRMWARE" in case "$board" in arcadyan,arv7518pw) - ath9k_eeprom_extract "boardconfig" 1024 1 + caldata_extract_swap "boardconfig" 0x400 0x1000 ;; arcadyan,arv8539pw22) - ath9k_eeprom_extract "art" 1024 1 + caldata_extract_swap "art" 0x400 0x1000 ;; bt,homehub-v2b) - ath9k_eeprom_extract "art" 0 1 - ath9k_patch_fw_mac_crc "00:00:00:00:00:00" 524 + caldata_extract_swap "art" 0x0 0x1000 + ath9k_patch_mac_crc "00:00:00:00:00:00" 0x20c ;; bt,homehub-v3a) - ath9k_eeprom_extract "art-copy" 0 1 - ath9k_patch_fw_mac_crc $(macaddr_add $(mtd_get_mac_ascii u-boot-env ethaddr) +2) 268 + caldata_extract_swap "art-copy" 0x0 0x1000 + ath9k_patch_mac_crc $(macaddr_add $(mtd_get_mac_ascii u-boot-env ethaddr) +2) 0x10c ;; netgear,dgn3500|netgear,dgn3500b) - ath9k_eeprom_extract "calibration" 61440 0 - ath9k_patch_fw_mac_crc $(macaddr_add $(mtd_get_mac_ascii u-boot-env ethaddr) +2) 524 + caldata_extract "calibration" 0xf000 0x1000 + ath9k_patch_mac_crc $(macaddr_add $(mtd_get_mac_ascii u-boot-env ethaddr) +2) 0x20c ;; avm,fritz7312|avm,fritz7320) - ath9k_eeprom_extract "urlader" 2437 0 + caldata_extract "urlader" 0x985 0x1000 ;; *) - ath9k_eeprom_die "board $board is not supported yet" + caldata_die "board $board is not supported yet" ;; esac ;; diff --git a/target/linux/mpc85xx/base-files/etc/hotplug.d/firmware/10-ath9k-eeprom b/target/linux/mpc85xx/base-files/etc/hotplug.d/firmware/10-ath9k-eeprom index 3e6488b4c7..be6ee40389 100644 --- a/target/linux/mpc85xx/base-files/etc/hotplug.d/firmware/10-ath9k-eeprom +++ b/target/linux/mpc85xx/base-files/etc/hotplug.d/firmware/10-ath9k-eeprom @@ -1,41 +1,8 @@ #!/bin/sh -FW_FILE="/lib/firmware/$FIRMWARE" +[ -e /lib/firmware/$FIRMWARE ] && exit 0 -ath9k_eeprom_die() { - echo "ath9k eeprom: " "$*" >&2 - 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 bs=$offset skip=1 count=1 2>/dev/null | dd of=$FW_FILE bs=$count count=1 2>/dev/null || \ - ath9k_eeprom_die "failed to extract from $mtd" -} - -tpl_set_wireless_mac() -{ - local offset=$1 - local mac - - mac=$(mtd_get_mac_binary u-boot 326656) - mac=$(macaddr_add $mac $offset) - - macaddr_2bin $mac | dd bs=1 count=6 seek=2 conv=notrunc of=$FW_FILE 2>/dev/null -} - -[ -e $FW_FILE ] && exit 0 - -. /lib/functions.sh -. /lib/functions/system.sh +. /lib/functions/caldata.sh board=$(board_name) @@ -43,11 +10,11 @@ case "$FIRMWARE" in "pci_wmac0.eeprom") case $board in tplink,tl-wdr4900-v1) - ath9k_eeprom_extract "caldata" 4096 2048 - tpl_set_wireless_mac 0 + caldata_extract "caldata" 0x1000 0x800 + ath9k_patch_mac $(mtd_get_mac_binary u-boot 0x4fc00) ;; *) - ath9k_eeprom_die "board $board is not supported yet" + caldata_die "board $board is not supported yet" ;; esac ;; @@ -55,11 +22,11 @@ case "$FIRMWARE" in "pci_wmac1.eeprom") case $board in tplink,tl-wdr4900-v1) - ath9k_eeprom_extract "caldata" 20480 2048 - tpl_set_wireless_mac -1 + caldata_extract "caldata" 0x5000 0x800 + ath9k_patch_mac $(macaddr_add $(mtd_get_mac_binary u-boot 0x4fc00) -1) ;; *) - ath9k_eeprom_die "board $board is not supported yet" + caldata_die "board $board is not supported yet" ;; esac ;; diff --git a/target/linux/ramips/mt7620/base-files/etc/hotplug.d/firmware/10-rt2x00-eeprom b/target/linux/ramips/mt7620/base-files/etc/hotplug.d/firmware/10-rt2x00-eeprom index 1ae3e665f4..291f89f41d 100644 --- a/target/linux/ramips/mt7620/base-files/etc/hotplug.d/firmware/10-rt2x00-eeprom +++ b/target/linux/ramips/mt7620/base-files/etc/hotplug.d/firmware/10-rt2x00-eeprom @@ -1,23 +1,8 @@ #!/bin/sh -rt2x00_eeprom_die() { - echo "rt2x00 eeprom: " "$*" - exit 1 -} +[ -e /lib/firmware/$FIRMWARE ] && exit 0 -rt2x00_eeprom_extract() { - local part=$1 - local offset=$2 - local count=$3 - local mtd - - mtd=$(find_mtd_part $part) - [ -n "$mtd" ] || \ - rt2x00_eeprom_die "no mtd device found for partition $part" - - dd if=$mtd of=/lib/firmware/$FIRMWARE bs=1 skip=$offset count=$count 2>/dev/null || \ - rt2x00_eeprom_die "failed to extract from $mtd" -} +. /lib/functions/caldata.sh jboot_eeprom_extract() { local part=$1 @@ -26,29 +11,12 @@ jboot_eeprom_extract() { mtd=$(find_mtd_part $part) [ -n "$mtd" ] || \ - rt2x00_eeprom_die "no mtd device found for partition $part" + caldata_die "no mtd device found for partition $part" jboot_config_read -i $mtd -o $offset -e /lib/firmware/$FIRMWARE 2>/dev/null || \ - rt2x00_eeprom_die "failed to extract from $mtd" + caldata_die "failed to extract from $mtd" } -rt2x00_eeprom_set_macaddr() { - local macaddr=$1 - - [ -n "$macaddr" ] || \ - rt2x00_eeprom_die "invalid wlan mac address" - - macaddr_2bin $macaddr | dd of=/lib/firmware/$FIRMWARE \ - conv=notrunc bs=1 seek=4 count=6 2>/dev/null || \ - rt2x00_eeprom_die "failed to write mac address to eeprom file" -} - -FW="/lib/firmware/$FIRMWARE" -[ -e "$FW" ] && exit 0 - -. /lib/functions.sh -. /lib/functions/system.sh - board=$(board_name) case "$FIRMWARE" in @@ -65,15 +33,15 @@ case "$FIRMWARE" in wan_mac=$(jboot_config_read -m -i $(find_mtd_part "config") -o 0xE000) wifi_mac=$(macaddr_add "$wan_mac" 1) jboot_eeprom_extract "config" 0xE000 - rt2x00_eeprom_set_macaddr $wifi_mac + caldata_patch_mac $wifi_mac 0x4 ;; dovado,tiny-ac) wifi_mac=$(mtd_get_mac_ascii u-boot-env INIC_MAC_ADDR) - rt2x00_eeprom_extract "factory" 0 512 - rt2x00_eeprom_set_macaddr $wifi_mac + caldata_extract "factory" 0x0 0x200 + caldata_patch_mac $wifi_mac 0x4 ;; *) - rt2x00_eeprom_die "Please define mtd-eeprom in $board DTS file!" + caldata_die "Please define mtd-eeprom in $board DTS file!" ;; esac ;;