208d5f6bff41405a1efb22deb94174ed87f91bdd
[openwrt/openwrt.git] / target / linux / ar71xx / base-files / etc / hotplug.d / firmware / 10-ath9k-eeprom
1 #!/bin/sh
2
3 [ -e /lib/firmware/$FIRMWARE ] && exit 0
4
5 . /lib/functions.sh
6 . /lib/functions/system.sh
7
8 ath9k_eeprom_die() {
9 echo "ath9k eeprom: " "$*"
10 exit 1
11 }
12
13 ath9k_eeprom_extract() {
14 local part=$1
15 local offset=$2
16 local count=$3
17 local mtd
18
19 mtd=$(find_mtd_chardev $part)
20 [ -n "$mtd" ] || \
21 ath9k_eeprom_die "no mtd device found for partition $part"
22
23 dd if=$mtd of=/lib/firmware/$FIRMWARE iflag=skip_bytes bs=$count skip=$offset count=1 2>/dev/null || \
24 ath9k_eeprom_die "failed to extract from $mtd"
25 }
26
27 ath9k_ubi_eeprom_extract() {
28 local part=$1
29 local offset=$2
30 local count=$3
31 local ubidev=$(nand_find_ubi $CI_UBIPART)
32 local ubi
33
34 ubi=$(nand_find_volume $ubidev $part)
35 [ -n "$ubi" ] || \
36 ath9k_eeprom_die "no UBI volume found for $part"
37
38 dd if=/dev/$ubi of=/lib/firmware/$FIRMWARE iflag=skip_bytes bs=$count skip=$offset count=1 2>/dev/null || \
39 ath9k_eeprom_die "failed to extract from $ubi"
40 }
41
42 ath9k_eeprom_extract_reverse() {
43 local part=$1
44 local offset=$2
45 local count=$3
46 local mtd
47 local reversed
48 local caldata
49
50 mtd=$(find_mtd_chardev "$part")
51 reversed=$(hexdump -v -s $offset -n $count -e '/1 "%02x "' $mtd)
52
53 for byte in $reversed; do
54 caldata="\x${byte}${caldata}"
55 done
56
57 printf "%b" "$caldata" > /lib/firmware/$FIRMWARE
58 }
59
60 ath9k_patch_firmware_mac() {
61 local mac=$1
62
63 [ -z "$mac" ] && return
64
65 macaddr_2bin $mac | dd of=/lib/firmware/$FIRMWARE conv=notrunc oflag=seek_bytes bs=6 seek=2 count=1
66 }
67
68 board=$(board_name)
69
70 case "$FIRMWARE" in
71 "soc_wmac.eeprom")
72 case $board in
73 c-55|\
74 c-60)
75 ath9k_eeprom_extract "art" 4096 2048
76 ath9k_patch_firmware_mac $(macaddr_add $(mtd_get_mac_binary art 0) +1)
77 ;;
78 fritz4020|\
79 fritz450e)
80 ath9k_eeprom_extract_reverse "urlader" 5441 1088
81 ;;
82 mr18)
83 . /lib/upgrade/nand.sh
84
85 if [ -n "$(nand_find_volume ubi0 caldata)" ]; then
86 ath9k_ubi_eeprom_extract "caldata" 4096 2048
87 else
88 ath9k_eeprom_extract "odm-caldata" 4096 2048
89 fi
90 ath9k_patch_firmware_mac $(macaddr_add $(mtd_get_mac_binary_ubi board-config 102) +1)
91 ;;
92 r6100 | \
93 wndr3700v4 | \
94 wndr4300)
95 ath9k_eeprom_extract "caldata" 4096 2048
96 ath9k_patch_firmware_mac $(mtd_get_mac_binary caldata 0)
97 ;;
98 rambutan)
99 ath9k_eeprom_extract "art" 4096 2048
100 ;;
101 wlr8100)
102 ath9k_eeprom_extract "art" 4096 2048
103 ath9k_patch_firmware_mac $(mtd_get_mac_ascii u-boot-env "ethaddr")
104 ;;
105 z1)
106 . /lib/upgrade/nand.sh
107
108 if [ -n "$(nand_find_volume ubi0 caldata)" ]; then
109 ath9k_ubi_eeprom_extract "caldata" 4096 2048
110 else
111 ath9k_eeprom_extract "origcaldata" 4096 2048
112 fi
113 ath9k_patch_firmware_mac $(macaddr_add $(mtd_get_mac_binary_ubi board-config 102) +2)
114 ;;
115 *)
116 ath9k_eeprom_die "board $board is not supported yet"
117 ;;
118 esac
119 ;;
120
121 "pci_wmac0.eeprom")
122 case $board in
123 c-55)
124 ath9k_eeprom_extract "art" 20480 2048
125 ath9k_patch_firmware_mac $(macaddr_add $(mtd_get_mac_binary art 0) +2)
126 ;;
127 fritz300e)
128 ath9k_eeprom_extract_reverse "urloader" 5441 1088
129 ;;
130 mr18)
131 . /lib/upgrade/nand.sh
132
133 if [ -n "$(nand_find_volume ubi0 caldata)" ]; then
134 ath9k_ubi_eeprom_extract "caldata" 20480 2048
135 else
136 ath9k_eeprom_extract "odm-caldata" 20480 2048
137 fi
138 ath9k_patch_firmware_mac $(macaddr_add $(mtd_get_mac_binary_ubi board-config 102) +2)
139 ;;
140 wndr3700v4 | \
141 wndr4300)
142 ath9k_eeprom_extract "caldata" 20480 2048
143 ath9k_patch_firmware_mac $(mtd_get_mac_binary caldata 12)
144 ;;
145 z1)
146 . /lib/upgrade/nand.sh
147
148 if [ -n "$(nand_find_volume ubi0 caldata)" ]; then
149 ath9k_ubi_eeprom_extract "caldata" 86016 4096
150 else
151 ath9k_eeprom_extract "origcaldata" 86016 4096
152 fi
153 ath9k_patch_firmware_mac $(macaddr_add $(mtd_get_mac_binary_ubi board-config 102) +3)
154 ;;
155 *)
156 ath9k_eeprom_die "board $board is not supported yet"
157 ;;
158 esac
159 ;;
160
161 "pci_wmac1.eeprom")
162 case $board in
163 mr18)
164 . /lib/upgrade/nand.sh
165
166 if [ -n "$(nand_find_volume ubi0 caldata)" ]; then
167 ath9k_ubi_eeprom_extract "caldata" 36864 2048
168 else
169 ath9k_eeprom_extract "odm-caldata" 36864 2048
170 fi
171 ath9k_patch_firmware_mac $(macaddr_add $(mtd_get_mac_binary_ubi board-config 102) +3)
172 ;;
173 *)
174 ath9k_eeprom_die "board $board is not supported yet"
175 ;;
176 esac
177 ;;
178 esac