summaryrefslogtreecommitdiffstats
path: root/target/linux/ipq806x/base-files/etc/hotplug.d/firmware/11-ath10k-caldata
blob: c0fb1db16d8791fd9762e54eec996e307b24821f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#!/bin/sh

. /lib/functions.sh

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/system.sh

board=$(board_name)

case "$FIRMWARE" in
"ath10k/pre-cal-pci-0000:01:00.0.bin")
	case $board in
	buffalo,wxr-2533dhp)
		ath10kcal_extract "ART" 0x1000 0x2f20
		ath10kcal_patch_mac_crc $(mtd_get_mac_binary ART 0x1e)
		;;
	linksys,ea8500)
		ath10kcal_extract "art" 0x1000 0x2f20
		ath10kcal_patch_mac_crc $(macaddr_add $(mtd_get_mac_ascii devinfo hw_mac_addr) +1)
		;;
	nec,wg2600hp)
		ath10kcal_extract "ART" 0x1000 0x2f20
		ath10kcal_patch_mac_crc $(macaddr_add $(mtd_get_mac_binary PRODUCTDATA 0xc) +1)
		;;
	netgear,d7800 |\
	netgear,r7500v2 |\
	netgear,r7800)
		ath10kcal_extract "art" 0x1000 0x2f20
		ath10kcal_patch_mac_crc $(macaddr_add $(mtd_get_mac_binary art 0x6) +1)
		;;
	tplink,c2600)
		ath10kcal_extract "radio" 0x1000 0x2f20
		ath10kcal_patch_mac_crc $(macaddr_add $(mtd_get_mac_binary default-mac 0x8) -1)
		;;
	tplink,vr2600v)
		ath10kcal_extract "ART" 0x1000 0x2f20
		ath10kcal_patch_mac_crc $(macaddr_add $(mtd_get_mac_binary default-mac 0x0) -1)
		;;
	zyxel,nbg6817)
		ath10kcal_extract "0:ART" 0x1000 0x2f20
		ath10kcal_patch_mac_crc $(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" 0x5000 0x2f20
		ath10kcal_patch_mac_crc $(mtd_get_mac_binary ART 0x18)
		;;
	linksys,ea8500)
		ath10kcal_extract "art" 0x5000 0x2f20
		ath10kcal_patch_mac_crc $(macaddr_add $(mtd_get_mac_ascii devinfo hw_mac_addr) +2)
		;;
	nec,wg2600hp)
		ath10kcal_extract "ART" 0x5000 0x2f20
		ath10kcal_patch_mac_crc $(mtd_get_mac_binary PRODUCTDATA 0xc)
		;;
	netgear,d7800 |\
	netgear,r7500v2 |\
	netgear,r7800)
		ath10kcal_extract "art" 0x5000 0x2f20
		ath10kcal_patch_mac_crc $(macaddr_add $(mtd_get_mac_binary art 0x6) +2)
		;;
	tplink,c2600)
		ath10kcal_extract "radio" 0x5000 0x2f20
		ath10kcal_patch_mac_crc $(mtd_get_mac_binary default-mac 0x8)
		;;
	tplink,vr2600v)
		ath10kcal_extract "ART" 0x5000 0x2f20
		ath10kcal_patch_mac_crc $(mtd_get_mac_binary default-mac 0x0)
		;;
	zyxel,nbg6817)
		ath10kcal_extract "0:ART" 0x5000 0x2f20
		ath10kcal_patch_mac_crc $(mtd_get_mac_ascii 0:APPSBLENV ethaddr)
		;;
	esac
	;;
*)
	exit 1
	;;
esac