From 2524febf7927a1bf430d64b7790feb126023e3d1 Mon Sep 17 00:00:00 2001
From: Adrian Schmutzler <freifunk@adrianschmutzler.de>
Date: Fri, 19 Jan 2018 12:58:40 +0100
Subject: [PATCH] ar71xx: Add TP-Link Pharos v2 board detection

Add support for detecting TP-Link Pharos v2 boards.
They use different format in product-info partition than v1 boards.

Code was written mostly by Alexander Couzens <lynxis@fe80.eu>

Signed-off-by: Robert Marko <robimarko@gmail.com>
Signed-off-by: Adrian Schmutzler <freifunk@adrianschmutzler.de>
---
 target/linux/ar71xx/base-files/lib/ar71xx.sh  | 24 ++++++++++++++-----
 .../ar71xx/base-files/lib/upgrade/platform.sh | 23 +++++++++++-------
 2 files changed, 33 insertions(+), 14 deletions(-)

diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh b/target/linux/ar71xx/base-files/lib/ar71xx.sh
index b8f9a705ee..63b7a4f108 100755
--- a/target/linux/ar71xx/base-files/lib/ar71xx.sh
+++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh
@@ -371,7 +371,7 @@ tplink_pharos_get_model_string() {
 }
 
 tplink_pharos_board_detect() {
-	local model_string="$(tplink_pharos_get_model_string | tr -d '\r')"
+	local model_string="$1"
 	local oIFS="$IFS"; IFS=":"; set -- $model_string; IFS="$oIFS"
 
 	local model="${1%%\(*}"
@@ -379,6 +379,14 @@ tplink_pharos_board_detect() {
 	AR71XX_MODEL="TP-Link $model v$2"
 }
 
+tplink_pharos_v2_get_model_string() {
+	local part
+	part=$(find_mtd_part 'product-info')
+	[ -z "$part" ] && return 1
+
+	dd if=$part bs=1 skip=4360 count=64 2>/dev/null | tr -d '\r\0' | head -n 1
+}
+
 ar71xx_board_detect() {
 	local machine
 	local name
@@ -563,14 +571,18 @@ ar71xx_board_detect() {
 		;;
 	*"CPE210/220")
 		name="cpe210"
-		tplink_pharos_board_detect
+		tplink_pharos_board_detect "$(tplink_pharos_get_model_string | tr -d '\r')"
+		;;
+	*"CPE210 v2")
+		name="cpe210-v2"
+		tplink_pharos_board_detect "$(tplink_pharos_v2_get_model_string)"
 		;;
 	*"CPE505N")
 		name="cpe505n"
 		;;
 	*"CPE510/520")
 		name="cpe510"
-		tplink_pharos_board_detect
+		tplink_pharos_board_detect "$(tplink_pharos_get_model_string | tr -d '\r')"
 		;;
 	*"CPE830")
 		name="cpe830"
@@ -671,7 +683,7 @@ ar71xx_board_detect() {
 		;;
 	*"EAP120")
 		name="eap120"
-		tplink_pharos_board_detect
+		tplink_pharos_board_detect "$(tplink_pharos_get_model_string | tr -d '\r')"
 		;;
 	*"EAP300 v2")
 		name="eap300v2"
@@ -1370,11 +1382,11 @@ ar71xx_board_detect() {
 		;;
 	*"WBS210")
 		name="wbs210"
-		tplink_pharos_board_detect
+		tplink_pharos_board_detect "$(tplink_pharos_get_model_string | tr -d '\r')"
 		;;
 	*"WBS510")
 		name="wbs510"
-		tplink_pharos_board_detect
+		tplink_pharos_board_detect "$(tplink_pharos_get_model_string | tr -d '\r')"
 		;;
 	"WeIO"*)
 		name="weio"
diff --git a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh
index a7968b5bb0..41e60d7f01 100755
--- a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh
+++ b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh
@@ -97,10 +97,11 @@ tplink_pharos_check_support_list() {
 	local image="$1"
 	local offset="$2"
 	local model="$3"
+	local trargs="$4"
 
 	# Here $image is given to dd directly instead of using get_image;
 	# otherwise the skip will take almost a second (as dd can't seek)
-	dd if="$image" bs=1 skip=$offset count=1024 2>/dev/null | (
+	dd if="$image" bs=1 skip=$offset count=1024 2>/dev/null | tr -d "$trargs" | (
 		while IFS= read -r line; do
 			[ "$line" = "$model" ] && exit 0
 		done
@@ -110,17 +111,19 @@ tplink_pharos_check_support_list() {
 }
 
 tplink_pharos_check_image() {
-	local magic_long="$(get_magic_long "$1")"
-	[ "$magic_long" != "7f454c46" ] && {
-		echo "Invalid image magic '$magic_long'"
+	local image_magic="$(get_magic_long "$1")"
+	local board_magic="$2"
+	[ "$image_magic" != "$board_magic" ] && {
+		echo "Invalid image magic '$image_magic'. Expected '$board_magic'."
 		return 1
 	}
 
-	local model_string="$(tplink_pharos_get_model_string)"
+	local model_string="$3"
+	local trargs="$4"
 
 	# New images have the support list at 7802888, old ones at 1511432
-	tplink_pharos_check_support_list "$1" 7802888 "$model_string" || \
-	tplink_pharos_check_support_list "$1" 1511432 "$model_string" || {
+	tplink_pharos_check_support_list "$1" 7802888 "$model_string" "$trargs" || \
+	tplink_pharos_check_support_list "$1" 1511432 "$model_string" "$trargs" || {
 		echo "Unsupported image (model not in support-list)"
 		return 1
 	}
@@ -579,7 +582,11 @@ platform_check_image() {
 	eap120|\
 	wbs210|\
 	wbs510)
-		tplink_pharos_check_image "$1" && return 0
+		tplink_pharos_check_image "$1" "7f454c46" "$(tplink_pharos_get_model_string)" '' && return 0
+		return 1
+		;;
+	cpe210-v2)
+		tplink_pharos_check_image "$1" "01000000" "$(tplink_pharos_v2_get_model_string)" '\0\xff\r' && return 0
 		return 1
 		;;
 	a40|\
-- 
2.30.2