base-files: move xor() from caldata extraction to functions.sh
[openwrt/staging/chunkeey.git] / target / linux / lantiq / base-files / etc / hotplug.d / firmware / 12-ath9k-eeprom
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/upgrade/nand.sh
9
10 ath9k_eeprom_die() {
11 echo "ath9k eeprom: $*"
12 exit 1
13 }
14
15 ath9k_eeprom_extract_raw() {
16 local source=$1
17 local offset=$(($2))
18 local swap=$3
19 local size=4096
20 local bs=1
21 local conv=
22
23 if [ $swap -gt 0 ]; then
24 bs=2
25 conv="conv=swab"
26 size=$((size / bs))
27 offset=$((offset / bs))
28 fi
29
30 dd if=$source of=/lib/firmware/$FIRMWARE bs=$bs skip=$offset count=$size $conv 2>/dev/null || \
31 ath9k_eeprom_die "failed to extract from $mtd"
32 }
33
34 ath9k_eeprom_extract_reverse() {
35 local part=$1
36 local offset=$2
37 local count=$(($3))
38 local mtd
39 local reversed
40 local caldata
41
42 mtd=$(find_mtd_chardev "$part")
43 reversed=$(hexdump -v -s $offset -n $count -e '/1 "%02x "' $mtd)
44
45 for byte in $reversed; do
46 caldata="\x${byte}${caldata}"
47 done
48
49 printf "%b" "$caldata" > /lib/firmware/$FIRMWARE
50 }
51
52 ath9k_eeprom_extract() {
53 local part=$1
54 local offset=$2
55 local swap=$3
56 local mtd
57
58 mtd=$(find_mtd_chardev $part)
59 [ -n "$mtd" ] || \
60 ath9k_eeprom_die "no mtd device found for partition $part"
61
62 ath9k_eeprom_extract_raw $mtd $offset $swap
63 }
64
65 ath9k_ubi_eeprom_extract() {
66 local part=$1
67 local offset=$2
68 local swap=$3
69 local ubidev=$(nand_find_ubi $CI_UBIPART)
70 local ubi
71
72 ubi=$(nand_find_volume $ubidev $part)
73 [ -n "$ubi" ] || \
74 ath9k_eeprom_die "no UBI volume found for $part"
75
76 ath9k_eeprom_extract_raw /dev/$ubi $offset $swap
77 }
78
79 ath9k_patch_fw_mac_crc() {
80 local mac=$1
81 local mac_offset=$2
82 local chksum_offset=$((mac_offset - 10))
83
84 ath9k_patch_fw_mac "${mac}" "${mac_offset}" "${chksum_offset}"
85 }
86
87 ath9k_patch_fw_mac() {
88 local mac=$1
89 local mac_offset=$(($2))
90 local chksum_offset=$3
91 local xor_mac
92 local xor_fw_mac
93 local xor_fw_chksum
94
95 [ -z "$mac" -o -z "$mac_offset" ] && return
96
97 [ -n "$chksum_offset" ] && {
98 xor_mac=${mac//:/}
99 xor_mac="${xor_mac:0:4} ${xor_mac:4:4} ${xor_mac:8:4}"
100
101 xor_fw_mac=$(hexdump -v -n 6 -s $mac_offset -e '/1 "%02x"' /lib/firmware/$FIRMWARE)
102 xor_fw_mac="${xor_fw_mac:0:4} ${xor_fw_mac:4:4} ${xor_fw_mac:8:4}"
103
104 xor_fw_chksum=$(hexdump -v -n 2 -s $chksum_offset -e '/1 "%02x"' /lib/firmware/$FIRMWARE)
105 xor_fw_chksum=$(xor $xor_fw_chksum $xor_fw_mac $xor_mac)
106
107 printf "%b" "\x${xor_fw_chksum:0:2}\x${xor_fw_chksum:2:2}" | \
108 dd of=/lib/firmware/$FIRMWARE conv=notrunc bs=1 seek=$(($chksum_offset)) count=2
109 }
110
111 macaddr_2bin $mac | dd of=/lib/firmware/$FIRMWARE conv=notrunc bs=1 seek=$mac_offset count=6
112 }
113
114 case "$FIRMWARE" in
115 "ath9k-eeprom-pci-0000:00:0e.0.bin" | \
116 "ath9k-eeprom-pci-0000:01:00.0.bin" | \
117 "ath9k-eeprom-pci-0000:02:00.0.bin")
118 board=$(board_name)
119
120 case "$board" in
121 arcadyan,arv7518pw)
122 ath9k_eeprom_extract "boardconfig" 0x400 1
123 ;;
124 arcadyan,arv8539pw22)
125 ath9k_eeprom_extract "art" 0x400 1
126 ;;
127 bt,homehub-v2b)
128 ath9k_eeprom_extract "art" 0x0 1
129 ath9k_patch_fw_mac_crc "00:00:00:00:00:00" 0x20c
130 ;;
131 bt,homehub-v3a)
132 ath9k_eeprom_extract "art-copy" 0x0 1
133 ath9k_patch_fw_mac_crc $(macaddr_add $(mtd_get_mac_ascii uboot_env ethaddr) +2) 0x10c
134 ;;
135 bt,homehub-v5a)
136 ath9k_ubi_eeprom_extract "caldata" 0x1000 0
137 ath9k_patch_fw_mac_crc $(macaddr_add $(mtd_get_mac_binary_ubi caldata 0x110c) +2) 0x10c
138 ;;
139 netgear,dgn3500|netgear,dgn3500b)
140 ath9k_eeprom_extract "calibration" 0xf000 0
141 ath9k_patch_fw_mac_crc $(macaddr_add $(mtd_get_mac_ascii uboot-env ethaddr) +2) 0x20c
142 ;;
143 avm,fritz3370-rev2-hynix|\
144 avm,fritz3370-rev2-micron|\
145 avm,fritz7362sl)
146 ath9k_eeprom_extract_reverse "urlader" 0x1541 0x440
147 ;;
148 avm,fritz7312|avm,fritz7320|avm,fritz7360sl)
149 ath9k_eeprom_extract "urlader" 0x985 0
150 ;;
151 avm,fritz7412)
152 /usr/bin/fritz_cal_extract -i 1 -s 0x1e000 -e 0x207 -l 4096 -o /lib/firmware/$FIRMWARE $(find_mtd_chardev "urlader")
153 ;;
154 tplink,tdw8970|tplink,tdw8980)
155 ath9k_eeprom_extract "boardconfig" 0x21000 0
156 ;;
157 *)
158 ath9k_eeprom_die "board $board is not supported yet"
159 ;;
160 esac
161 ;;
162 esac