diff --git a/arch/arm/mach-imx/mac.c b/arch/arm/mach-imx/mac.c
index 3b1496b20383c389f509a26788dcb4ba67bad3cc..7da11e5cdeb4e0ec1cc8dbe07ab8fd2e91920146 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;
 }