aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/ipq40xx/base-files
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/ipq40xx/base-files')
-rwxr-xr-xtarget/linux/ipq40xx/base-files/etc/board.d/01_leds3
-rwxr-xr-xtarget/linux/ipq40xx/base-files/etc/board.d/02_network4
-rw-r--r--target/linux/ipq40xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata74
-rw-r--r--target/linux/ipq40xx/base-files/lib/preinit/05_set_iface_mac_ipq40xx.sh14
-rw-r--r--target/linux/ipq40xx/base-files/lib/upgrade/platform.sh7
5 files changed, 102 insertions, 0 deletions
diff --git a/target/linux/ipq40xx/base-files/etc/board.d/01_leds b/target/linux/ipq40xx/base-files/etc/board.d/01_leds
index 6a493be3ec..f1f49abb2e 100755
--- a/target/linux/ipq40xx/base-files/etc/board.d/01_leds
+++ b/target/linux/ipq40xx/base-files/etc/board.d/01_leds
@@ -26,6 +26,9 @@ avm,fritzbox-4040)
glinet,gl-b1300)
ucidef_set_led_wlan "wlan" "WLAN" "${boardname}:green:wlan" "phy0tpt"
;;
+meraki,mr33)
+ ucidef_set_interface_lan "eth0"
+ ;;
*)
;;
esac
diff --git a/target/linux/ipq40xx/base-files/etc/board.d/02_network b/target/linux/ipq40xx/base-files/etc/board.d/02_network
index 8f8d67db32..d25a039f2d 100755
--- a/target/linux/ipq40xx/base-files/etc/board.d/02_network
+++ b/target/linux/ipq40xx/base-files/etc/board.d/02_network
@@ -35,6 +35,10 @@ glinet,gl-b1300)
openmesh,a42)
ucidef_set_interfaces_lan_wan "eth1" "eth0"
;;
+
+meraki,mr33)
+ ucidef_set_interface_lan "eth0"
+ ;;
*)
echo "Unsupported hardware. Network interfaces not intialized"
;;
diff --git a/target/linux/ipq40xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata b/target/linux/ipq40xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata
index bc64d5b8ab..4322c4f3fa 100644
--- a/target/linux/ipq40xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata
+++ b/target/linux/ipq40xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata
@@ -1,5 +1,21 @@
#!/bin/sh
+# xor multiple hex values of the same length
+xor() {
+ local val
+ local ret="0x$1"
+ local retlen=${#1}
+
+ shift
+ while [ -n "$1" ]; do
+ val="0x$1"
+ ret=$((ret ^ val))
+ shift
+ done
+
+ printf "%0${retlen}x" "$ret"
+}
+
ath10kcal_die() {
echo "ath10cal: " "$*"
exit 1
@@ -37,6 +53,45 @@ ath10kcal_ubi_extract() {
ath10kcal_die "failed to extract from $ubi"
}
+ath10kcal_patch_mac() {
+ local mac=$1
+
+ [ -z "$mac" ] && return
+
+ macaddr_2bin $mac | dd of=/lib/firmware/$FIRMWARE conv=notrunc bs=1 seek=6 count=6
+}
+
+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
+
+ 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}"
+
+ ath10kcal_patch_mac "$mac" && {
+ 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
+ }
+}
+
+ath10kcal_is_caldata_valid() {
+ local expected="$1"
+
+ magic=$(hexdump -v -n 2 -e '1/1 "%02x"' /lib/firmware/$FIRMWARE)
+ [[ "$magic" == "$expected" ]]
+ return $?
+}
+
[ -e /lib/firmware/$FIRMWARE ] && exit 0
. /lib/functions.sh
@@ -46,6 +101,15 @@ board=$(board_name)
case "$FIRMWARE" in
+"ath10k/cal-pci-0000:01:00.0.bin")
+ case "$board" in
+ meraki,mr33)
+ ath10kcal_ubi_extract "ART" 36864 2116
+ ath10kcal_is_caldata_valid "4408" || ath10kcal_extract "ART" 36864 2116
+ ath10kcal_patch_mac $(macaddr_add $(get_mac_binary "/sys/bus/i2c/devices/0-0050/eeprom" 102) +1)
+ ;;
+ esac
+ ;;
"ath10k/pre-cal-ahb-a000000.wifi.bin")
case "$board" in
asus,rt-ac58u)
@@ -59,6 +123,11 @@ case "$FIRMWARE" in
qcom,ap-dk01.1-c1)
ath10kcal_extract "ART" 4096 12064
;;
+ meraki,mr33)
+ ath10kcal_ubi_extract "ART" 4096 12064
+ ath10kcal_is_caldata_valid "202f" || ath10kcal_extract "ART" 4096 12064
+ ath10kcal_patch_mac_crc $(macaddr_add $(get_mac_binary "/sys/bus/i2c/devices/0-0050/eeprom" 102) +2)
+ ;;
openmesh,a42)
ath10kcal_extract "0:ART" 4096 12064
;;
@@ -77,6 +146,11 @@ case "$FIRMWARE" in
qcom,ap-dk01.1-c1)
ath10kcal_extract "ART" 20480 12064
;;
+ meraki,mr33)
+ ath10kcal_ubi_extract "ART" 20480 12064
+ ath10kcal_is_caldata_valid "202f" || ath10kcal_extract "ART" 20480 12064
+ ath10kcal_patch_mac_crc $(macaddr_add $(get_mac_binary "/sys/bus/i2c/devices/0-0050/eeprom" 102) +3)
+ ;;
openmesh,a42)
ath10kcal_extract "0:ART" 20480 12064
;;
diff --git a/target/linux/ipq40xx/base-files/lib/preinit/05_set_iface_mac_ipq40xx.sh b/target/linux/ipq40xx/base-files/lib/preinit/05_set_iface_mac_ipq40xx.sh
new file mode 100644
index 0000000000..1acd7366c8
--- /dev/null
+++ b/target/linux/ipq40xx/base-files/lib/preinit/05_set_iface_mac_ipq40xx.sh
@@ -0,0 +1,14 @@
+#!/bin/sh
+
+. /lib/functions.sh
+
+preinit_set_mac_address() {
+ case $(board_name) in
+ meraki,mr33)
+ mac_lan=$(get_mac_binary "/sys/bus/i2c/devices/0-0050/eeprom" 102)
+ [ -n "$mac_lan" ] && ip link set dev eth0 address "$mac_lan"
+ ;;
+ esac
+}
+
+boot_hook_add preinit_main preinit_set_mac_address
diff --git a/target/linux/ipq40xx/base-files/lib/upgrade/platform.sh b/target/linux/ipq40xx/base-files/lib/upgrade/platform.sh
index 261c468813..52aa2321e3 100644
--- a/target/linux/ipq40xx/base-files/lib/upgrade/platform.sh
+++ b/target/linux/ipq40xx/base-files/lib/upgrade/platform.sh
@@ -40,6 +40,10 @@ platform_do_upgrade() {
PART_NAME="inactive"
platform_do_upgrade_openmesh "$ARGV"
;;
+ meraki,mr33)
+ CI_KERNPART="part.safe"
+ nand_do_upgrade "$1"
+ ;;
*)
default_do_upgrade "$ARGV"
;;
@@ -52,6 +56,9 @@ platform_nand_pre_upgrade() {
CI_UBIPART="UBI_DEV"
CI_KERNPART="linux"
;;
+ meraki,mr33)
+ CI_KERNPART="part.safe"
+ ;;
esac
}