From 21cc8cf384ccdf8cd371e932b2070d7286704407 Mon Sep 17 00:00:00 2001
From: Troy Kisky <troy.kisky@boundarydevices.com>
Date: Thu, 14 May 2015 13:02:44 -0700
Subject: [PATCH] mx6: soc: add dev_id to mac_from_fuse value

---
 arch/arm/mach-imx/mac.c | 47 ++++++++++++++++++++++-------------------
 1 file changed, 25 insertions(+), 22 deletions(-)

diff --git a/arch/arm/mach-imx/mac.c b/arch/arm/mach-imx/mac.c
index 3b1496b2038..7da11e5cdeb 100644
--- a/arch/arm/mach-imx/mac.c
+++ b/arch/arm/mach-imx/mac.c
@@ -28,33 +28,36 @@ void imx_get_mac_from_fuse(int dev_id, unsigned char *mac)
 	struct imx_mac_fuse *fuse;
 	u32 offset;
 	bool has_second_mac;
+	u32 value_high, value_low;
 
 	offset = is_mx6() ? MAC_FUSE_MX6_OFFSET : MAC_FUSE_MX7_OFFSET;
 	fuse = (struct imx_mac_fuse *)(ulong)(OCOTP_BASE_ADDR + offset);
 	has_second_mac = is_mx7() || is_mx6sx() || is_mx6ul() || is_mx6ull();
 
 	if (has_second_mac && dev_id == 1) {
-		u32 value = readl(&fuse->mac_addr2);
-
-		mac[0] = value >> 24;
-		mac[1] = value >> 16;
-		mac[2] = value >> 8;
-		mac[3] = value;
-
-		value = readl(&fuse->mac_addr1);
-		mac[4] = value >> 24;
-		mac[5] = value >> 16;
-
-	} else {
-		u32 value = readl(&fuse->mac_addr1);
-
-		mac[0] = value >> 8;
-		mac[1] = value;
-
-		value = readl(&fuse->mac_addr0);
-		mac[2] = value >> 24;
-		mac[3] = value >> 16;
-		mac[4] = value >> 8;
-		mac[5] = value;
+		value_high = readl(&fuse->mac_addr2);
+		value_low = readl(&fuse->mac_addr1) >> 16;
+
+		value_low |= (value_high << 16);
+		value_high >>= 16;
+		if (value_low | value_high) {
+			dev_id--;
+			goto valid;
+		}
+	}
+	value_high = readl(&fuse->mac_addr1);
+	value_low = readl(&fuse->mac_addr0);
+valid:
+	if ((dev_id > 0) && (value_low | value_high)) {
+		u32 prev = value_low;
+		value_low += dev_id;
+		if (value_low < prev)
+			value_high++;
 	}
+	mac[0] = value_high >> 8;
+	mac[1] = value_high;
+	mac[2] = value_low >> 24;
+	mac[3] = value_low >> 16;
+	mac[4] = value_low >> 8;
+	mac[5] = value_low;
 }
-- 
GitLab