10-ath9k-eeprom 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. #!/bin/sh
  2. [ -e /lib/firmware/$FIRMWARE ] && exit 0
  3. . /lib/functions.sh
  4. . /lib/functions/system.sh
  5. ath9k_eeprom_die() {
  6. echo "ath9k eeprom: " "$*"
  7. exit 1
  8. }
  9. ath9k_eeprom_extract() {
  10. local part=$1
  11. local offset=$2
  12. local count=$3
  13. local mtd
  14. mtd=$(find_mtd_chardev $part)
  15. [ -n "$mtd" ] || \
  16. ath9k_eeprom_die "no mtd device found for partition $part"
  17. dd if=$mtd of=/lib/firmware/$FIRMWARE bs=1 skip=$offset count=$count 2>/dev/null || \
  18. ath9k_eeprom_die "failed to extract from $mtd"
  19. }
  20. ath9k_eeprom_extract_reverse() {
  21. local part=$1
  22. local offset=$2
  23. local count=$3
  24. local mtd
  25. local reversed
  26. local caldata
  27. mtd=$(find_mtd_chardev "$part")
  28. reversed=$(hexdump -v -s $offset -n $count -e '/1 "%02x "' $mtd)
  29. for byte in $reversed; do
  30. caldata="\x${byte}${caldata}"
  31. done
  32. printf "%b" "$caldata" > /lib/firmware/$FIRMWARE
  33. }
  34. xor() {
  35. local val
  36. local ret="0x$1"
  37. local retlen=${#1}
  38. shift
  39. while [ -n "$1" ]; do
  40. val="0x$1"
  41. ret=$((ret ^ val))
  42. shift
  43. done
  44. printf "%0${retlen}x" "$ret"
  45. }
  46. ath9k_patch_fw_mac() {
  47. local mac=$1
  48. local mac_offset=$2
  49. local chksum_offset=$3
  50. local xor_mac
  51. local xor_fw_mac
  52. local xor_fw_chksum
  53. [ -z "$mac" -o -z "$mac_offset" ] && return
  54. [ -n "$chksum_offset" ] && {
  55. xor_mac=${mac//:/}
  56. xor_mac="${xor_mac:0:4} ${xor_mac:4:4} ${xor_mac:8:4}"
  57. xor_fw_mac=$(hexdump -v -n 6 -s $mac_offset -e '/1 "%02x"' /lib/firmware/$FIRMWARE)
  58. xor_fw_mac="${xor_fw_mac:0:4} ${xor_fw_mac:4:4} ${xor_fw_mac:8:4}"
  59. xor_fw_chksum=$(hexdump -v -n 2 -s $chksum_offset -e '/1 "%02x"' /lib/firmware/$FIRMWARE)
  60. xor_fw_chksum=$(xor $xor_fw_chksum $xor_fw_mac $xor_mac)
  61. printf "%b" "\x${xor_fw_chksum:0:2}\x${xor_fw_chksum:2:2}" | \
  62. dd of=/lib/firmware/$FIRMWARE conv=notrunc bs=1 seek=$chksum_offset count=2
  63. }
  64. macaddr_2bin $mac | dd of=/lib/firmware/$FIRMWARE conv=notrunc bs=1 seek=$mac_offset count=6
  65. }
  66. ath9k_patch_fw_mac_crc() {
  67. local mac=$1
  68. local mac_offset=$2
  69. local chksum_offset=$((mac_offset - 10))
  70. ath9k_patch_fw_mac "${mac}" "${mac_offset}" "${chksum_offset}"
  71. }
  72. board=$(board_name)
  73. case "$FIRMWARE" in
  74. "ath9k-eeprom-ahb-18100000.wmac.bin")
  75. case $board in
  76. avm,fritz4020)
  77. ath9k_eeprom_extract_reverse "urlader" 5441 1088
  78. ;;
  79. dlink,dir-825-c1|\
  80. dlink,dir-835-a1)
  81. ath9k_eeprom_extract "art" 4096 1088
  82. ath9k_patch_fw_mac_crc $(mtd_get_mac_text "mac" 4) 2
  83. ;;
  84. iodata,wn-ac1167dgr|\
  85. iodata,wn-ac1600dgr2|\
  86. iodata,wn-ag300dgr)
  87. ath9k_eeprom_extract "art" 4096 1088
  88. ath9k_patch_fw_mac $(mtd_get_mac_ascii u-boot-env ethaddr) 2
  89. ;;
  90. nec,wg800hp)
  91. ath9k_eeprom_extract "art" 4096 1088
  92. ath9k_patch_fw_mac $(mtd_get_mac_text board_data 1664) 2
  93. ;;
  94. *)
  95. ath9k_eeprom_die "board $board is not supported yet"
  96. ;;
  97. esac
  98. ;;
  99. "ath9k-eeprom-pci-0000:00:00.0.bin")
  100. case $board in
  101. avm,fritz300e)
  102. ath9k_eeprom_extract_reverse "urloader" 5441 1088
  103. ;;
  104. buffalo,whr-g301n|\
  105. buffalo,wzr-hp-g302h-a1a0|\
  106. tplink,tl-wr841-v5|\
  107. tplink,tl-wr941-v4)
  108. ath9k_eeprom_extract "art" 4096 3768
  109. ;;
  110. buffalo,wzr-hp-g450h)
  111. ath9k_eeprom_extract "ART" 4096 1088
  112. ;;
  113. dlink,dir-825-c1|\
  114. dlink,dir-835-a1)
  115. ath9k_eeprom_extract "art" 20480 1088
  116. ath9k_patch_fw_mac_crc $(macaddr_add $(mtd_get_mac_text "mac" 24) 1) 2
  117. ;;
  118. ocedo,raccoon|\
  119. tplink,tl-wdr3600|\
  120. tplink,tl-wdr4300|\
  121. tplink,tl-wdr4900-v2|\
  122. winchannel,wb2000)
  123. ath9k_eeprom_extract "art" 20480 1088
  124. ;;
  125. netgear,wnr612-v2|\
  126. on,n150r|\
  127. pcs,cap324|\
  128. tplink,tl-mr3220-v1|\
  129. tplink,tl-mr3420-v1|\
  130. tplink,tl-wr2543-v1|\
  131. tplink,tl-wr740n-v1|\
  132. tplink,tl-wr740n-v3|\
  133. tplink,tl-wr741-v1|\
  134. tplink,tl-wr743nd-v1|\
  135. tplink,tl-wr841-v7|\
  136. tplink,tl-wr842n-v1|\
  137. ubnt,airrouter|\
  138. ubnt,bullet-m|\
  139. ubnt,nano-m|\
  140. ubnt,rocket-m)
  141. ath9k_eeprom_extract "art" 4096 4096
  142. ;;
  143. pqi,air-pen)
  144. ath9k_eeprom_extract "art" 4096 2002
  145. ;;
  146. ubnt,unifi)
  147. ath9k_eeprom_extract "art" 4096 2048
  148. ;;
  149. wd,mynet-wifi-rangeextender)
  150. ath9k_eeprom_extract "art" 4096 4096
  151. ath9k_patch_fw_mac_crc $(nvram get wl0_hwaddr) "$mac" 2
  152. ;;
  153. *)
  154. ath9k_eeprom_die "board $board is not supported yet"
  155. ;;
  156. esac
  157. ;;
  158. "ath9k-eeprom-pci-0000:00:11.0.bin")
  159. case $board in
  160. buffalo,wzr-hp-ag300h|\
  161. netgear,wndr3700|\
  162. netgear,wndr3700v2|\
  163. netgear,wndr3800)
  164. ath9k_eeprom_extract "art" 4096 3768
  165. ;;
  166. dlink,dir-825-b1)
  167. ath9k_eeprom_extract "caldata" 4096 3768
  168. ath9k_patch_fw_mac_crc $(mtd_get_mac_text "caldata" 65440) 524
  169. ;;
  170. *)
  171. ath9k_eeprom_die "board $board is not supported yet"
  172. ;;
  173. esac
  174. ;;
  175. "ath9k-eeprom-pci-0000:00:12.0.bin")
  176. case $board in
  177. buffalo,wzr-hp-ag300h|\
  178. netgear,wndr3700|\
  179. netgear,wndr3700v2|\
  180. netgear,wndr3800)
  181. ath9k_eeprom_extract "art" 20480 3768
  182. ;;
  183. dlink,dir-825-b1)
  184. ath9k_eeprom_extract "caldata" 20480 3768
  185. ath9k_patch_fw_mac_crc $(macaddr_add $(mtd_get_mac_text "caldata" 65460) 1) 524
  186. ;;
  187. *)
  188. ath9k_eeprom_die "board $board is not supported yet"
  189. ;;
  190. esac
  191. ;;
  192. esac