|
| 1 | +#!/bin/sh |
| 2 | +# Based on ar71xx 10-ath9k-eeprom |
| 3 | + |
| 4 | +[ -e /lib/firmware/$FIRMWARE ] && exit 0 |
| 5 | + |
| 6 | +. /lib/functions.sh |
| 7 | +. /lib/functions/system.sh |
| 8 | +. /lib/functions/lantiq.sh |
| 9 | +. /lib/upgrade/nand.sh |
| 10 | + |
| 11 | +# xor multiple hex values of the same length |
| 12 | +xor() { |
| 13 | + local ret="0x$1" |
| 14 | + |
| 15 | + shift 1 |
| 16 | + while [[ "$1" ]]; do |
| 17 | + local val="0x$1" |
| 18 | + ret=$((${ret:-0} ^ ${val:-0})) |
| 19 | + shift 1 |
| 20 | + done |
| 21 | + |
| 22 | + printf "%02x" "$ret" |
| 23 | +} |
| 24 | + |
| 25 | +ath9k_eeprom_die() { |
| 26 | + echo "ath9k eeprom: " "$*" |
| 27 | + exit 1 |
| 28 | +} |
| 29 | + |
| 30 | +ath9k_eeprom_extract_raw() { |
| 31 | + local source=$1 |
| 32 | + local offset=$2 |
| 33 | + local size=4096 |
| 34 | + |
| 35 | + dd if=$source of=/lib/firmware/$FIRMWARE bs=1 skip=$offset count=$size 2>/dev/null || \ |
| 36 | + ath9k_eeprom_die "failed to extract from $mtd" |
| 37 | +} |
| 38 | + |
| 39 | +ath9k_eeprom_extract() { |
| 40 | + local part=$1 |
| 41 | + local offset=$2 |
| 42 | + local mtd |
| 43 | + |
| 44 | + mtd=$(find_mtd_chardev $part) |
| 45 | + [ -n "$mtd" ] || \ |
| 46 | + ath9k_eeprom_die "no mtd device found for partition $part" |
| 47 | + |
| 48 | + ath9k_eeprom_extract_raw $mtd $offset |
| 49 | +} |
| 50 | + |
| 51 | +ath9k_ubi_eeprom_extract() { |
| 52 | + local part=$1 |
| 53 | + local offset=$2 |
| 54 | + local ubidev=$(nand_find_ubi $CI_UBIPART) |
| 55 | + local ubi |
| 56 | + |
| 57 | + ubi=$(nand_find_volume $ubidev $part) |
| 58 | + [ -n "$ubi" ] || \ |
| 59 | + ath9k_eeprom_die "no UBI volume found for $part" |
| 60 | + |
| 61 | + ath9k_eeprom_extract_raw /dev/$ubi $offset |
| 62 | +} |
| 63 | + |
| 64 | +ath9k_patch_firmware_mac() { |
| 65 | + local mac=$1 |
| 66 | + local mac_offset=$2 |
| 67 | + local swap=$3 |
| 68 | + local chksum_offset=$4 |
| 69 | + local xor_mac |
| 70 | + local xor_fw_mac |
| 71 | + local xor_fw_chksum |
| 72 | + |
| 73 | + [ -z "$mac" -o -z "$mac_offset" ] && return |
| 74 | + |
| 75 | + [ $swap -gt 0 ] && mac="${mac:3:2}:${mac:0:2}:${mac:9:2}:${mac:6:2}:${mac:15:2}:${mac:12:2}" |
| 76 | + |
| 77 | + [ -n "$chksum_offset" ] && { |
| 78 | + xor_mac="${mac:0:2}${mac:3:2} ${mac:6:2}${mac:9:2} ${mac:12:2}${mac:15:2}" |
| 79 | + xor_fw_mac=$(hexdump -v -n 6 -s $mac_offset -e '/2 "%04x "' /lib/firmware/$FIRMWARE) |
| 80 | + |
| 81 | + xor_fw_chksum=$(hexdump -v -n 2 -s $chksum_offset -e '/1 "%02x"' /lib/firmware/$FIRMWARE) |
| 82 | + xor_fw_chksum=$(xor $xor_fw_chksum $xor_fw_mac $xor_mac) |
| 83 | + |
| 84 | + echo -ne \\x${xor_fw_chksum:0:2}\\x${xor_fw_chksum:2:2} | \ |
| 85 | + dd of=/lib/firmware/$FIRMWARE conv=notrunc bs=1 seek=$chksum_offset count=2 |
| 86 | + } |
| 87 | + |
| 88 | + macaddr_2bin $mac | dd of=/lib/firmware/$FIRMWARE conv=notrunc bs=1 seek=$mac_offset count=6 |
| 89 | +} |
| 90 | + |
| 91 | +case "$FIRMWARE" in |
| 92 | +"ath9k-eeprom-pci-0000:00:0e.0.bin"|"ath9k-eeprom-pci-0000:01:00.0.bin"|"ath9k-eeprom-pci-0000:02:00.0.bin") |
| 93 | + local board=$(lantiq_board_name) |
| 94 | + case $board in |
| 95 | + ARV7518PW) |
| 96 | + ath9k_eeprom_extract "boardconfig" 1024 |
| 97 | + ;; |
| 98 | + ARV8539PW22) |
| 99 | + ath9k_eeprom_extract "art" 1024 |
| 100 | + ;; |
| 101 | + BTHOMEHUBV2B) |
| 102 | + ath9k_eeprom_extract "art" 0 |
| 103 | + ath9k_patch_firmware_mac "00:00:00:00:00:00" 524 1 514 |
| 104 | + ;; |
| 105 | + BTHOMEHUBV3A) |
| 106 | + ath9k_eeprom_extract "art-copy" 0 |
| 107 | + ath9k_patch_firmware_mac $(macaddr_add $(mtd_get_mac_ascii uboot-env ethaddr) +2) 268 1 258 |
| 108 | + ;; |
| 109 | + BTHOMEHUBV5A) |
| 110 | + ath9k_eeprom_extract "caldata" 4096 |
| 111 | + ;; |
| 112 | + DGN3500*) |
| 113 | + ath9k_eeprom_extract "calibration" 61440 |
| 114 | + ath9k_patch_firmware_mac $(macaddr_add $(mtd_get_mac_ascii uboot-env ethaddr) +2) 524 0 514 |
| 115 | + ;; |
| 116 | + FRITZ3370) |
| 117 | + ath9k_eeprom_extract "urlader" 2437 |
| 118 | + ath9k_patch_firmware_mac "00:00:00:00:00:00" 2 0 |
| 119 | + ;; |
| 120 | + FRITZ7320|FRITZ7360SL) |
| 121 | + ath9k_eeprom_extract "urlader" 2437 |
| 122 | + ath9k_patch_firmware_mac "00:00:00:00:00:00" 268 0 258 |
| 123 | + ;; |
| 124 | + TDW8970|TDW8980) |
| 125 | + ath9k_eeprom_extract "boardconfig" 135168 |
| 126 | + ;; |
| 127 | + *) |
| 128 | + ath9k_eeprom_die "board $board is not supported yet" |
| 129 | + ;; |
| 130 | + esac |
| 131 | + ;; |
| 132 | +esac |
0 commit comments