Updated SDK_2.7.25 from RC32 to thunderbolt_v1

SDK_2.7.25-RC32 -> SDK_2.7.25-thunderbolt_v1

- diffed Marvells RC32 and thunderbolt_v1 Kernel SDK
- replaced paths in diff file to match our folder structure
  - eg. delete "/SDK_XXX/Source/Kernel/linux_feroceon"
- applied patch, manually merged the conflicts in 4 files
  - cpu/mvCpu.c
  - boardEnv/mvBoardEnvLib.c
  - boardEnv/mvBoardEnvSpec.c
  - boardEnv/mvBoardEnvSpec.c

Change-Id: I838a3ac3c01479338609ba7644ac2f0609ccc3ee
diff --git a/arch/arm/mach-feroceon-kw2/core.c b/arch/arm/mach-feroceon-kw2/core.c
index d972a30..613d635 100755
--- a/arch/arm/mach-feroceon-kw2/core.c
+++ b/arch/arm/mach-feroceon-kw2/core.c
@@ -533,7 +533,7 @@
 #ifndef CONFIG_MV_DRAM_DEFAULT_ACCESS_CFG
         /* Support DRAM access configuration for Avanta-MC only */
         if (gBoardId == DB_88F6601_BP_ID || gBoardId == RD_88F6601_MC_ID ||
-	    gBoardId == RD_88F6601_MC2L_ID) {
+	    gBoardId == RD_88F6601_MC2L_ID || gBoardId == RD_88F6601_SFP_ID) {
                 printk("DRAM access: ");
 #ifdef CONFIG_MV_DRAM_XBAR_ACCESS_CFG
                 printk("XBAR\n");
diff --git a/arch/arm/mach-feroceon-kw2/include/mach/system.h b/arch/arm/mach-feroceon-kw2/include/mach/system.h
index 5b5a6b2..782a34b 100644
--- a/arch/arm/mach-feroceon-kw2/include/mach/system.h
+++ b/arch/arm/mach-feroceon-kw2/include/mach/system.h
@@ -31,7 +31,7 @@
 	cpu_do_idle();
 }
 
-#define UPON_SDK_VERSION "uPON_2.7.25_RC32"
+#define UPON_SDK_VERSION "uPON_2.7.25_RC32+thunderbolt_v1"
 
 #ifdef __BIG_ENDIAN
 #define MV_ARM_32BIT_LE(X) ((((X)&0xff)<<24) |                       \
diff --git a/arch/arm/mach-feroceon-kw2/kw2_family/boardEnv/mvBoardEnvLib.c b/arch/arm/mach-feroceon-kw2/kw2_family/boardEnv/mvBoardEnvLib.c
index f358f00..a21298b 100755
--- a/arch/arm/mach-feroceon-kw2/kw2_family/boardEnv/mvBoardEnvLib.c
+++ b/arch/arm/mach-feroceon-kw2/kw2_family/boardEnv/mvBoardEnvLib.c
@@ -160,7 +160,7 @@
 	MV_REG_WRITE(GPP_DATA_OUT_REG(0), BOARD_INFO(boardId)->gppOutValLow);
 	MV_REG_WRITE(GPP_DATA_OUT_REG(1), BOARD_INFO(boardId)->gppOutValMid);
 	if (boardId != DB_88F6601_BP_ID && boardId != RD_88F6601_MC_ID &&
-	   boardId != RD_88F6601_MC2L_ID &&
+	   boardId != RD_88F6601_MC2L_ID && boardId != RD_88F6601_SFP_ID &&
 	   !gfiber_is_any_jack())
 		MV_REG_WRITE(GPP_DATA_OUT_REG(2), BOARD_INFO(boardId)->gppOutValHigh);
 
@@ -168,7 +168,7 @@
 	mvGppPolaritySet(0, 0xFFFFFFFF, BOARD_INFO(boardId)->gppPolarityValLow);
 	mvGppPolaritySet(1, 0xFFFFFFFF, BOARD_INFO(boardId)->gppPolarityValMid);
 	if (boardId != DB_88F6601_BP_ID && boardId != RD_88F6601_MC_ID &&
-	   boardId != RD_88F6601_MC2L_ID &&
+	   boardId != RD_88F6601_MC2L_ID && boardId != RD_88F6601_SFP_ID &&
 	   !gfiber_is_any_jack())
 		mvGppPolaritySet(2, 0xFFFFFFFF, BOARD_INFO(boardId)->gppPolarityValHigh);
 
@@ -176,7 +176,7 @@
 	mvGppTypeSet(0, 0xFFFFFFFF, BOARD_INFO(boardId)->gppOutEnValLow);
 	mvGppTypeSet(1, 0xFFFFFFFF, BOARD_INFO(boardId)->gppOutEnValMid);
 	if (boardId != DB_88F6601_BP_ID && boardId != RD_88F6601_MC_ID &&
-	    boardId != RD_88F6601_MC2L_ID &&
+	    boardId != RD_88F6601_MC2L_ID && boardId != RD_88F6601_SFP_ID &&
 	    !gfiber_is_any_jack())
 		mvGppTypeSet(2, 0xFFFFFFFF, BOARD_INFO(boardId)->gppOutEnValHigh);
 }
@@ -355,6 +355,14 @@
 			return MV_TRUE;
 		return MV_FALSE;
 	}
+	else if (boardId == RD_88F6601_SFP_ID)
+	{
+		if (ethPortNum == 0)
+			return MV_TRUE;
+		else
+			return MV_FALSE;
+	}
+
 	if (boardId == RD_88F6601_MC_ID || boardId == RD_88F6601_MC2L_ID ||
 	    gfiber_is_any_jack())
 		return MV_FALSE;
@@ -655,7 +663,7 @@
 		return MV_ERROR;
 	}
 	if (boardId == RD_88F6601_MC_ID || boardId == RD_88F6601_MC2L_ID ||
-	    boardId == DB_88F6601_BP_ID ||
+	    boardId == DB_88F6601_BP_ID || boardId == RD_88F6601_SFP_ID ||
 	    gfiber_is_any_jack())
 		return 0;
 
@@ -672,7 +680,7 @@
 			numPorts += 1;
 		if (ethCompOpt & (ESC_OPT_RGMIIA_SW_P5 | ESC_OPT_RGMIIA_SW_P6))
 			numPorts += 1;
-		if (ethCompOpt & ESC_OPT_SGMII_2_SW_P1)
+		if (ethCompOpt & ESC_OPT_SGMII)
 			numPorts += 1;
 	}
 
@@ -854,8 +862,9 @@
 			i = 3;
 		}
 		else if (ethCompOpt & ESC_OPT_SGMII_2_SW_P1) {
-			BOARD_INFO(boardId)->pSwitchInfo[swIdx].switchPort[0] = 1;
-			i = 1;
+			BOARD_INFO(boardId)->pSwitchInfo[swIdx].switchPort[0] = -1;
+			BOARD_INFO(boardId)->pSwitchInfo[swIdx].switchPort[1] = 0;
+			i = 2;
 		}
 
 		if (ethCompOpt & ESC_OPT_GEPHY_SW_P0)
@@ -1255,7 +1264,7 @@
 
 	tmpTClkRate = MV_REG_READ(MPP_SAMPLE_AT_RESET(0));
 	if (boardId == RD_88F6601_MC_ID || boardId == RD_88F6601_MC2L_ID ||
-	    boardId == DB_88F6601_BP_ID ||
+	    boardId == DB_88F6601_BP_ID || boardId == RD_88F6601_SFP_ID ||
 	    gfiber_is_any_jack()) {
 		tmpTClkRate &= MSAR_TCLCK_6601_MASK;
 		if (tmpTClkRate)
@@ -1312,7 +1321,7 @@
 	clockSatr = MSAR_CPU_DDR_L2_CLCK_EXTRACT(sar0);
 	i = 0;
 	if (boardId == RD_88F6601_MC_ID || boardId == RD_88F6601_MC2L_ID ||
-	    boardId == DB_88F6601_BP_ID ||
+	    boardId == DB_88F6601_BP_ID || boardId == RD_88F6601_SFP_ID ||
 	    gfiber_is_any_jack()) {
 		while (cpuDdrTbl6601[i].satrValue != -1) {
 			if (cpuDdrTbl6601[i].satrValue == clockSatr) {
@@ -1722,7 +1731,7 @@
 	BOARD_INFO(boardId)->pBoardMppTypeValue->ethSataComplexOpt = ethConfig;
 
 	if (boardId != DB_88F6601_BP_ID && boardId != RD_88F6601_MC_ID &&
-	    boardId != RD_88F6601_MC2L_ID &&
+	    boardId != RD_88F6601_MC2L_ID && boardId != RD_88F6601_SFP_ID &&
 	    !gfiber_is_any_jack()) {
 		/* KW2 only */
 		/* Update link speed for MAC0 / 1 */
@@ -2275,7 +2284,7 @@
 		if (mvBoardSmiScanModeGet(0) == 1)
 			mvOsOutput("       Switch in Single-Chip Address Mode.\n");
 	}
-
+                                 
 	/* 3xFE PHY */
 	if (ethConfig & ESC_OPT_FE3PHY)
 		mvOsOutput("       3xFE PHY Module.\n");
@@ -2355,7 +2364,7 @@
 		return MV_FALSE;
 	}
 	if (boardId == RD_88F6601_MC_ID || boardId == RD_88F6601_MC2L_ID ||
-	    gfiber_is_any_jack()) {
+	    boardId == RD_88F6601_SFP_ID || gfiber_is_any_jack()) {
 		if (ethPortNum == 0)
 			return MV_TRUE;
 		return MV_FALSE;
@@ -2758,6 +2767,8 @@
 		tmpBoardId = RD_88F6601_MC_ID;
 #elif defined(RD_88F6601MC2L)
 		tmpBoardId = RD_88F6601_MC2L_ID;
+#elif defined(RD_88F6601SFP)
+		tmpBoardId = RD_88F6601_SFP_ID;
 
 #elif defined(DB_CUSTOMER)
 		tmpBoardId = DB_CUSTOMER_ID;
@@ -3181,7 +3192,7 @@
 		if (0 == MV_BOARD_6601_CFG_FXS(boardCfg))
 			*modules |= MV_BOARD_MODULE_TDM_1_ID;
 
-		/* Configure XCVR mux */
+		/*   Configure XCVR mux */
 		twsiSlave.slaveAddr.address = MV_BOARD_XCVR_MUX_ADDR;
 		twsiSlave.slaveAddr.type = MV_BOARD_XCVR_MUX_ADDR_TYPE;
 		twsiSlave.validOffset = MV_TRUE;
diff --git a/arch/arm/mach-feroceon-kw2/kw2_family/boardEnv/mvBoardEnvSpec.c b/arch/arm/mach-feroceon-kw2/kw2_family/boardEnv/mvBoardEnvSpec.c
index 7b41233..597be00 100755
--- a/arch/arm/mach-feroceon-kw2/kw2_family/boardEnv/mvBoardEnvSpec.c
+++ b/arch/arm/mach-feroceon-kw2/kw2_family/boardEnv/mvBoardEnvSpec.c
@@ -1097,6 +1097,125 @@
 };
 
 /***************************************************************************
+** RD-88F6601SFP Avanta
+****************************************************************************/
+/* NAND not supported  */
+
+MV_BOARD_TWSI_INFO rd88f6601SFPInfoBoardTwsiDev[] = {
+	/* {{MV_BOARD_DEV_CLASS devClass, MV_U8 twsiDevAddr, MV_U8 twsiDevAddrType}} */
+};
+
+MV_BOARD_MAC_INFO rd88f6601SFPInfoBoardMacInfo[] = {
+	/* {{MV_BOARD_MAC_SPEED boardMacSpeed, MV_U8 boardEthSmiAddr}} */
+	{BOARD_MAC_SPEED_AUTO, 0x0},
+	{BOARD_MAC_SPEED_AUTO, 0x1},
+	{N_A,N_A}
+};
+
+MV_BOARD_MPP_TYPE_INFO rd88f6601SFPInfoBoardMppTypeInfo[] = {
+	{
+		.boardMppTdm = MV_BOARD_AUTO,
+		.ethSataComplexOpt = ESC_OPT_SGMII,
+		.ethPortsMode = 0x0,
+	}
+};
+
+MV_BOARD_GPP_INFO rd88f6601SFPInfoBoardGppInfo[] = {
+	/* {{MV_BOARD_GPP_CLASS devClass, MV_U8 gppPinNum}} */
+//	{BOARD_GPP_PON_XVR_TX, 17},
+	{BOARD_GPP_PON_XVR_TX, 30},
+	{BOARD_GPP_PON_XVR_TX_POWER, 37}, /* should be MPP 9 at FIT design, but now MPP9 is for UART */
+	{BOARD_GPP_PON_XVR_TX_IND, 24},
+};
+
+MV_DEV_CS_INFO rd88f6601SFPInfoBoardDeCsInfo[] = {
+	/*{deviceCS, params, devType, devWidth} */
+#ifdef MV_SPI
+	{SPI_CS0, N_A, BOARD_DEV_SPI_FLASH, 8},		/* SPI DEV */
+#endif
+#if !defined(MV_SPI)
+	{N_A, N_A, N_A, N_A}			/* No device */
+#endif
+};
+
+MV_BOARD_MPP_INFO rd88f6601SFPInfoBoardMppConfigValue[] = {
+	{{
+	  RD_88F6601SFP_MPP0_7,
+	  RD_88F6601SFP_MPP8_15,
+	  RD_88F6601SFP_MPP16_23,
+	  RD_88F6601SFP_MPP24_31,
+	  RD_88F6601SFP_MPP32_37
+	  }
+	 }
+};
+
+MV_BOARD_INFO rd88f6601SFPInfo = {
+	.boardName = "RD-88F6601-BP-FIT-GPON_SFP",
+	.numBoardMppTypeValue = MV_ARRAY_SIZE(rd88f6601SFPInfoBoardMppTypeInfo),
+	.pBoardMppTypeValue = rd88f6601SFPInfoBoardMppTypeInfo,
+	.numBoardMppConfigValue = MV_ARRAY_SIZE(rd88f6601SFPInfoBoardMppConfigValue),
+	.pBoardMppConfigValue = rd88f6601SFPInfoBoardMppConfigValue,
+	.intsGppMaskLow = 0,
+	.intsGppMaskMid = 0,
+	.intsGppMaskHigh = 0,
+	.numBoardDeviceIf = MV_ARRAY_SIZE(rd88f6601SFPInfoBoardDeCsInfo),
+	.pDevCsInfo = rd88f6601SFPInfoBoardDeCsInfo,
+	.numBoardTwsiDev = MV_ARRAY_SIZE(rd88f6601SFPInfoBoardTwsiDev),
+	.pBoardTwsiDev = rd88f6601SFPInfoBoardTwsiDev,
+	.numBoardMacInfo = MV_ARRAY_SIZE(rd88f6601SFPInfoBoardMacInfo),
+	.pBoardMacInfo = rd88f6601SFPInfoBoardMacInfo,
+	.numBoardGppInfo = MV_ARRAY_SIZE(rd88f6601SFPInfoBoardGppInfo),
+	.pBoardGppInfo = rd88f6601SFPInfoBoardGppInfo,
+	.activeLedsNumber = 0,
+	.pLedGppPin = NULL,
+	.ledsPolarity = 0,
+
+	/* GPP values */
+	.gppOutEnValLow = RD_88F6601SFP_GPP_OUT_ENA_LOW,
+	.gppOutEnValMid = RD_88F6601SFP_GPP_OUT_ENA_MID,
+	.gppOutEnValHigh = 0, // Does not exist in 6601
+	.gppOutValLow = RD_88F6601SFP_GPP_OUT_VAL_LOW,
+	.gppOutValMid = RD_88F6601SFP_GPP_OUT_VAL_MID,
+	.gppOutValHigh = 0,
+	.gppPolarityValLow = RD_88F6601SFP_GPP_POL_LOW,
+	.gppPolarityValMid = RD_88F6601SFP_GPP_POL_MID,
+	.gppPolarityValHigh = 0,
+
+	/* External Switch Configuration */
+	.pSwitchInfo = NULL,
+	.switchInfoNum = 0,
+
+	/* PON configuration. */
+	.ponConfigValue = BOARD_GPON_CONFIG,
+
+	/* TDM configuration */
+	/* We hold a different configuration array for each possible slic that
+	 ** can be connected to board.
+	 ** When modules are scanned, then we select the index of the relevant
+	 ** slic's information array.
+	 ** For RD and Customers boards we only need to initialize a single
+	 ** entry of the arrays below, and set the boardTdmInfoIndex to 0.
+	 */
+	.numBoardTdmInfo = {0},
+	.pBoardTdmInt2CsInfo = {NULL},
+	.boardTdmInfoIndex = -1,
+
+	.pBoardSpecInit = NULL,
+
+	.deepIdlePwrUpDelay = 2400,	/* 12uS */
+
+	/* NAND init params */
+	.nandFlashParamsValid = MV_FALSE,
+	.nandFlashReadParams = 0,
+	.nandFlashWriteParams = 0,
+	.nandFlashControl = 0,
+	.pBoardTdmSpiInfo = NULL,
+
+	/* Enable modules auto-detection. */
+	.moduleAutoDetect = MV_FALSE
+};
+
+/***************************************************************************
 ** DB-88F6601-BP Avanta
 ****************************************************************************/
 /* NAND not supported  */
@@ -1877,6 +1996,7 @@
 	&gflt200Info,
 	&gflt110Info,
 	&rd88f6601MC2LInfo,
+	&rd88f6601SFPInfo,
 	&gflt300Info,
 	&gflt400Info,
 };
diff --git a/arch/arm/mach-feroceon-kw2/kw2_family/boardEnv/mvBoardEnvSpec.h b/arch/arm/mach-feroceon-kw2/kw2_family/boardEnv/mvBoardEnvSpec.h
index b739ac7..436f6ae 100755
--- a/arch/arm/mach-feroceon-kw2/kw2_family/boardEnv/mvBoardEnvSpec.h
+++ b/arch/arm/mach-feroceon-kw2/kw2_family/boardEnv/mvBoardEnvSpec.h
@@ -115,9 +115,10 @@
 #define GFLT200_ID			DB_CUSTOMER_ID
 #define GFLT110_ID			(BOARD_ID_BASE+0x8)
 #define RD_88F6601_MC2L_ID		(BOARD_ID_BASE+0x9)
-#define GFLT300_ID			(BOARD_ID_BASE+0xA)
-#define GFLT400_ID			(BOARD_ID_BASE+0xB)
-#define MV_MAX_BOARD_ID			(DB_CUSTOMER_ID + 5)
+#define RD_88F6601_SFP_ID		(BOARD_ID_BASE+0xA)
+#define GFLT300_ID			(BOARD_ID_BASE+0xB)
+#define GFLT400_ID			(BOARD_ID_BASE+0xC)
+#define MV_MAX_BOARD_ID			(DB_CUSTOMER_ID + 6)
 // These are Marvells defines, we should switch to match these in
 // uboot to make future merges easier.
 //#define DB_CUSTOMER_ID			(BOARD_ID_BASE+0x8)
@@ -441,6 +442,7 @@
 #define RD_88F6601_MPP24_31		0x00200650
 #define RD_88F6601_MPP32_37		0x00000000
 
+
 /* GPPs
  1 SPI0_MOSI (out)
  2 SPI0_SCK (out)
@@ -734,4 +736,44 @@
 #define RD_88F6601MC2L_GPP_POL_LOW		(BIT15)
 #define RD_88F6601MC2L_GPP_POL_MID		0x0
 
+/***************************************************************************
+** RD-88F6601-SFP
+****************************************************************************/
+
+#define RD_88F6601SFP_MPP0_7		0x22222220
+#define RD_88F6601SFP_MPP8_15		0x00000002
+#define RD_88F6601SFP_MPP16_23		0x00000000
+#define RD_88F6601SFP_MPP24_31		0x04000000
+#define RD_88F6601SFP_MPP32_37		0x00050000
+
+
+/* GPPs
+ 1 SPI0_MOSI (out)
+ 2 SPI0_SCK (out)
+ 3 SPI0_CSn[0] (out)
+ 4 SPI0_MISO (in)
+ 5 I2C0_SDA (inout)
+ 6 I2C0_SCK (inout)
+ 7 UA0_TXD (out)
+ 8 UA0_RXD (in)
+20 LED_PON
+21 PON_BEN (out)
+24 XVR_Tx_IND
+25 LED_G
+26 LED_Y
+28 NF&SPI_WP
+29 XVR_SD (in)
+33 TX_Fault/TX_indication
+37 TX_PD
+*/
+
+#define RD_88F6601SFP_GPP_OUT_ENA_LOW	~(0x0)
+#define RD_88F6601SFP_GPP_OUT_ENA_MID	~(BIT5)
+
+#define RD_88F6601SFP_GPP_OUT_VAL_LOW	0x0
+#define RD_88F6601SFP_GPP_OUT_VAL_MID	0x0
+
+#define RD_88F6601SFP_GPP_POL_LOW		0x0
+#define RD_88F6601SFP_GPP_POL_MID		0x0
+
 #endif /* __INCmvBoardEnvSpech */
diff --git a/arch/arm/mach-feroceon-kw2/kw2_family/cpu/mvCpu.c b/arch/arm/mach-feroceon-kw2/kw2_family/cpu/mvCpu.c
index 3155d5a..1b2fbb1 100755
--- a/arch/arm/mach-feroceon-kw2/kw2_family/cpu/mvCpu.c
+++ b/arch/arm/mach-feroceon-kw2/kw2_family/cpu/mvCpu.c
@@ -113,7 +113,7 @@
 	/* Search for a matching entry */
 	i = 0;
 	if (boardId == RD_88F6601_MC_ID || boardId == RD_88F6601_MC2L_ID ||
-	    boardId == DB_88F6601_BP_ID ||
+	    boardId == DB_88F6601_BP_ID || boardId == RD_88F6601_SFP_ID ||
 	    gfiber_is_any_jack()) {
 		while (cpuDdrTbl6601[i].satrValue != -1) {
 			if (cpuDdrTbl6601[i].satrValue == clockSatr) {
@@ -165,6 +165,7 @@
 		if (boardId == RD_88F6601_MC_ID ||
 		    boardId == RD_88F6601_MC2L_ID ||
 		    boardId == DB_88F6601_BP_ID ||
+		    boardId == RD_88F6601_SFP_ID ||
 		    gfiber_is_any_jack())
 			return cpuDdrTbl6601[idx].cpuClk;
 		else
@@ -201,6 +202,7 @@
 		if (boardId == RD_88F6601_MC_ID ||
 		    boardId == RD_88F6601_MC2L_ID ||
 		    boardId == RD_88F6601_MC_ID ||
+		    boardId == RD_88F6601_SFP_ID ||
 		    gfiber_is_any_jack())
 			return cpuDdrTbl6601[idx].l2Clk;
 		else
@@ -229,6 +231,7 @@
 
 	if (id == RD_88F6510_SFU_ID || id == DB_88F6601_BP_ID ||
 	    id == RD_88F6601_MC_ID || id == RD_88F6601_MC2L_ID ||
+	    id == RD_88F6601_SFP_ID ||
 	    gfiber_is_any_jack())
 		return MV_FALSE;
 
@@ -363,24 +366,24 @@
 	MV_8 Cpu_Stream_str[MV_PROC_STR_SIZE];
 
 	if (mvCtrlModelGet() != MV_6601_DEV_ID) {
-		mvCpuIfGetL2Mode(L2_En_str);
-		mvCpuIfGetL2EccMode(L2_ECC_str);
-		mvCpuIfGetL2PrefetchMode(L2_Prefetch_str);
+	mvCpuIfGetL2Mode(L2_En_str);
+	mvCpuIfGetL2EccMode(L2_ECC_str);
+	mvCpuIfGetL2PrefetchMode(L2_Prefetch_str);
 	}
 	mvCpuIfGetWriteAllocMode(Write_Alloc_str);
 	mvCpuIfGetCpuStreamMode(Cpu_Stream_str);
 	mvCpuIfPrintCpuRegs();
 
 	if (mvCtrlModelGet() != MV_6601_DEV_ID) {
-		count += mvOsSPrintf(buffer + count + index, "%s\n", L2_En_str);
-		count += mvOsSPrintf(buffer + count + index, "%s\n", L2_ECC_str);
-		count += mvOsSPrintf(buffer + count + index, "%s\n", L2_Prefetch_str);
+	count += mvOsSPrintf(buffer + count + index, "%s\n", L2_En_str);
+	count += mvOsSPrintf(buffer + count + index, "%s\n", L2_ECC_str);
+	count += mvOsSPrintf(buffer + count + index, "%s\n", L2_Prefetch_str);
 	}
 	count += mvOsSPrintf(buffer + count + index, "%s\n", Write_Alloc_str);
 	count += mvOsSPrintf(buffer + count + index, "%s\n", Cpu_Stream_str);
 	count += mvOsSPrintf(buffer + count + index, "CPU Config Reg = 0x%08x\n", MV_REG_READ(CPU_CONFIG_REG));
 	if (mvCtrlModelGet() != MV_6601_DEV_ID)
-		count += mvOsSPrintf(buffer + count + index, "L2 Config Reg = 0x%08x\n", MV_REG_READ(CPU_L2_CONFIG_REG));
+	count += mvOsSPrintf(buffer + count + index, "L2 Config Reg = 0x%08x\n", MV_REG_READ(CPU_L2_CONFIG_REG));
 
 	return count;
 }
diff --git a/arch/arm/mach-feroceon-kw2/kw2_family/ctrlEnv/mvCtrlEnvRegs.h b/arch/arm/mach-feroceon-kw2/kw2_family/ctrlEnv/mvCtrlEnvRegs.h
index c36c68e..69baa40 100755
--- a/arch/arm/mach-feroceon-kw2/kw2_family/ctrlEnv/mvCtrlEnvRegs.h
+++ b/arch/arm/mach-feroceon-kw2/kw2_family/ctrlEnv/mvCtrlEnvRegs.h
@@ -518,6 +518,26 @@
 #define THERMAL_TEMPERATURE_OFFSET 10
 #define THERMAL_TEMPERATURE_MASK (0x1FF << THERMAL_TEMPERATURE_OFFSET)
 
+// LP SERDES PHY AND NETWORKING REGISTERS
+#define ETHERNET_COMPLEX_CTRL_REG_0()		(0x18810)
+#define SOFTWARE_RESET_CTRL_REG()			(0x18220)
+#define GE_MAC_CTRL_REG(port)				(0x72C00 + (port * 0x4000))
+#define ETH_UNIT_CTRL_REG(port)				(0x720B0 + (port * 0x4000))
+#define PORT_MAC_CTRL_REG2(port)			(0x72C08 + (port * 0x4000))
+#define PORT_AUTO_NEG_CTRL_REG(port)		(0x72C0C + (port * 0x4000))
+#define SYNC_PATTERN_REG()					(0x72E90)
+#define SERDES_CONFIG_REG(port)				(0x724A0 + (port * 0x4000))
+#define SERDES_STATUS_REG(port)				(0x724A4 + (port * 0x4000))
+#define ONEMS_CLK_DIVIDER_CTRL_REG(port)	(0x724F4 + (port * 0x4000))
+#define POWER_PLL_CTRL_REG()				(0x72E04)
+#define KVCO_CALIBRATION_CTRL_REG()			(0x72E08)
+#define IMPEDANCE_CALIBRATION_CTRL_REG()	(0x72E0C)
+#define GENERATION_1_SETTING_0_REG()		(0x72E34)
+#define GENERATION_1_SETTING_1_REG()		(0x72E38)
+#define DIGITAL_LOOPBACK_ENABLE_REG()		(0x72E8C)
+#define PHY_ISOLATION_MODE_CTRL_REG()		(0x72E98)
+
+
 #endif /* MV_ASMLANGUAGE */
 
 #ifdef __cplusplus
diff --git a/arch/arm/mach-feroceon-kw2/kw2_family/ctrlEnv/mvCtrlEthCompLib.c b/arch/arm/mach-feroceon-kw2/kw2_family/ctrlEnv/mvCtrlEthCompLib.c
index dc7c5b6..d13f4b6 100755
--- a/arch/arm/mach-feroceon-kw2/kw2_family/ctrlEnv/mvCtrlEthCompLib.c
+++ b/arch/arm/mach-feroceon-kw2/kw2_family/ctrlEnv/mvCtrlEthCompLib.c
@@ -1553,13 +1553,16 @@
 	mvEthernetComplexPreInit(ethCompCfg);
 
 	if (mvCtrlModelGet() == MV_6601_DEV_ID) {
+	#if 1
+		printk("MTL: mvEthCompMac0ToSgmiiConfig bypassed, ethCompCfg=0x%x\n", ethCompCfg);
 		
+	#else
 		/*  MAC0 to GE PHY. */
 		mvEthCompMac0ToGePhyConfig(ethCompCfg, mvBoardPhyAddrGet(0));
 
 		/*  MAC0/1 to SGMII. */
 		mvEthCompMac0ToSgmiiConfig(ethCompCfg);
-
+	#endif
 	} else {
 
 		/*  First, initialize the switch. */
diff --git a/arch/arm/mach-feroceon-kw2/sysmap.c b/arch/arm/mach-feroceon-kw2/sysmap.c
index c6e8fda..36673d4 100755
--- a/arch/arm/mach-feroceon-kw2/sysmap.c
+++ b/arch/arm/mach-feroceon-kw2/sysmap.c
@@ -228,6 +228,7 @@
 		case DB_88F6601_BP_ID:
 		case RD_88F6601_MC_ID:
 		case RD_88F6601_MC2L_ID:
+		case RD_88F6601_SFP_ID:
 			return SYSMAP_88F6601;
 		default:
 			printk("ERROR: can't find system address map\n");
diff --git a/arch/arm/plat-feroceon/mv_drivers_lsp/mv_cph/mv_cph_app.c b/arch/arm/plat-feroceon/mv_drivers_lsp/mv_cph/mv_cph_app.c
index 2fe434a..48a59e7 100755
--- a/arch/arm/plat-feroceon/mv_drivers_lsp/mv_cph/mv_cph_app.c
+++ b/arch/arm/plat-feroceon/mv_drivers_lsp/mv_cph/mv_cph_app.c
@@ -125,6 +125,8 @@
     { TPM_PON_G0_WAN_G1_SINGLE_PORT,    "TPM_PON_G0_WAN_G1_SINGLE_PORTg"},
     { TPM_PON_WAN_G0_G1_LPBK,           "TPM_PON_WAN_G0_G1_LPBK"},
     { TPM_PON_WAN_G0_G1_DUAL_LAN,       "TPM_PON_WAN_G0_G1_DUAL_LAN"},     
+    { TPM_PON_WAN_G0_SINGLE_PORT_SGMII, "TPM_PON_WAN_G0_SINGLE_PORT_SGMII"},
+    { TPM_PON_G1_SGMII_WAN_G0_SINGLE_PORT, "TPM_PON_G1_SGMII_WAN_G0_SINGLE_PORT"},
 };
 
 static MV_ENUM_ARRAY_T g_enum_array_profile_id =
@@ -218,9 +220,9 @@
     MV_STATUS rc = MV_OK;
 
     /* Check the range of profile_id */
-    if (profile_id > TPM_PON_WAN_G0_G1_DUAL_LAN)
+    if (profile_id >= TPM_COMPLEX_PROFILE_LAST)
     {
-        MV_CPH_PRINT(CPH_ERR_LEVEL, "profile_id[%d] is out of range[1~%d] \n", profile_id, TPM_PON_WAN_G0_G1_DUAL_LAN);
+        MV_CPH_PRINT(CPH_ERR_LEVEL, "profile_id[%d] is out of range[1~%d] \n", profile_id, TPM_COMPLEX_PROFILE_LAST-1);
         return MV_OUT_OF_RANGE;
     }
 
@@ -776,6 +778,7 @@
             break;
         case TPM_PON_WAN_G0_INT_SWITCH:
         case TPM_PON_WAN_G0_SINGLE_PORT:            
+        case TPM_PON_WAN_G0_SINGLE_PORT_SGMII:
         case TPM_PON_WAN_G0_G1_LPBK:            
             port_type[MV_APP_GMAC_PORT_0].port_type   = MV_APP_PORT_LAN;
             port_type[MV_APP_GMAC_PORT_0].port_state  = MV_GE_PORT_ACTIVE;
@@ -798,7 +801,8 @@
             port_type[MV_APP_PON_MAC_PORT].port_state = MV_GE_PORT_INVALID;
             break;
         case TPM_PON_G1_WAN_G0_INT_SWITCH:
-        case TPM_PON_G1_WAN_G0_SINGLE_PORT:            
+        case TPM_PON_G1_WAN_G0_SINGLE_PORT:
+        case TPM_PON_G1_SGMII_WAN_G0_SINGLE_PORT:
             port_type[MV_APP_GMAC_PORT_0].port_type   = MV_APP_PORT_LAN;
             port_type[MV_APP_GMAC_PORT_0].port_state  = MV_GE_PORT_ACTIVE;
             port_type[MV_APP_GMAC_PORT_1].port_type   = MV_APP_PORT_WAN;
@@ -1275,6 +1279,8 @@
     BOOL                  state     = FALSE;
     struct sk_buff       *skb_old   = NULL;
     struct sk_buff       *skb_new   = NULL;
+    tpm_eth_complex_profile_t  profile_id  = 0;
+    MV_APP_GMAC_PORT_E         active_port = 0;
     MV_STATUS             rc        = MV_OK;
     
     /* Check whether need to handle broadcast packet */
@@ -1316,6 +1322,16 @@
                 skb_new = skb_old;
                 goto out;
             }
+            /* If WAN interface is GMAC1, remove MH in upstream  */
+            cph_db_get_param(CPH_DB_PARAM_PROFILE_ID, &profile_id);
+            cph_db_get_param(CPH_DB_PARAM_ACTIVE_PORT, &active_port);
+            if ((profile_id == TPM_PON_G1_SGMII_WAN_G0_SINGLE_PORT) && (active_port == MV_APP_GMAC_PORT_1))
+            {
+              skb_old->data += MV_ETH_MH_SIZE;
+              skb_old->tail -= MV_ETH_MH_SIZE;
+              skb_old->len  -= MV_ETH_MH_SIZE;
+          }
+
             mv_net_devs[peer_port]->netdev_ops->ndo_start_xmit(skb_old, mv_net_devs[peer_port]);      
         }
     }
diff --git a/arch/arm/plat-feroceon/mv_drivers_lsp/mv_cph/mv_cph_app.h b/arch/arm/plat-feroceon/mv_drivers_lsp/mv_cph/mv_cph_app.h
index 68a0358..4554a0f 100755
--- a/arch/arm/plat-feroceon/mv_drivers_lsp/mv_cph/mv_cph_app.h
+++ b/arch/arm/plat-feroceon/mv_drivers_lsp/mv_cph/mv_cph_app.h
@@ -191,7 +191,10 @@
     TPM_PON_G1_WAN_G0_SINGLE_PORT,
     TPM_PON_G0_WAN_G1_SINGLE_PORT,
     TPM_PON_WAN_G0_G1_LPBK,
-    TPM_PON_WAN_G0_G1_DUAL_LAN
+    TPM_PON_WAN_G0_G1_DUAL_LAN,
+    TPM_PON_WAN_G0_SINGLE_PORT_SGMII,
+    TPM_PON_G1_SGMII_WAN_G0_SINGLE_PORT,
+    TPM_COMPLEX_PROFILE_LAST,
 } tpm_eth_complex_profile_t;
 
 /* PON type definition
diff --git a/arch/arm/plat-feroceon/mv_drivers_lsp/mv_mtd/sflash.c b/arch/arm/plat-feroceon/mv_drivers_lsp/mv_mtd/sflash.c
index cd7c20a..08463e1 100755
--- a/arch/arm/plat-feroceon/mv_drivers_lsp/mv_mtd/sflash.c
+++ b/arch/arm/plat-feroceon/mv_drivers_lsp/mv_mtd/sflash.c
@@ -185,6 +185,7 @@
 	DB(printk("\n           Device ID       : 0x%04x", sflash->deviceId));
 	DB(printk("\n           Sector Size     : 0x%x", sflash->sectorSize));
 	DB(printk("\n           Sector Number   : %d", sflash->sectorNumber));
+	DB(printk("\n           Name   : %s", mtd->name));
 	
 	printk("SPI Serial flash detected @ 0x%08x, %dKB (%dsec x %dKB)\n",
 	         sflash->baseAddr, ((sflash->sectorNumber * sflash->sectorSize)/1024), 
diff --git a/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/core/gpon/gponOnuDb.c b/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/core/gpon/gponOnuDb.c
index ac63e63..a976a8a 100755
--- a/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/core/gpon/gponOnuDb.c
+++ b/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/core/gpon/gponOnuDb.c
@@ -543,6 +543,46 @@
 
 /*******************************************************************************
 **
+**  onuGponDbXvrSdPolaritySet
+**  ____________________________________________________________________________
+**
+**  DESCRIPTION: The function set onu XVR SD polarity
+**
+**  PARAMETERS:  MV_U32 state
+**
+**  OUTPUTS:	None
+**
+**  RETURNS:	MV_OK or error
+**
+*******************************************************************************/
+MV_STATUS onuGponDbXvrSdPolaritySet(MV_U32 polarity)
+{
+  onuGponDb_s.onuGponGenTbl_s.onuGponXvrSdPolarity = polarity;
+
+  return(MV_OK);
+}
+
+/*******************************************************************************
+**
+**  onuGponDbXvrSdPolarityGet
+**  ____________________________________________________________________________
+**
+**  DESCRIPTION: The function return XVR SD polarity
+**
+**  PARAMETERS:  None
+**
+**  OUTPUTS:	None
+**
+**  RETURNS:	XVR SD polarity 
+**
+*******************************************************************************/
+MV_U32 onuGponDbXvrSdPolarityGet(void)
+{
+  return(onuGponDb_s.onuGponGenTbl_s.onuGponXvrSdPolarity);
+}
+
+/*******************************************************************************
+**
 **  onuGponDbOnuIdOverrideValueGet
 **  ____________________________________________________________________________
 **
diff --git a/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/core/gpon/gponOnuDb.h b/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/core/gpon/gponOnuDb.h
index 9144514..b32b60c 100755
--- a/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/core/gpon/gponOnuDb.h
+++ b/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/core/gpon/gponOnuDb.h
@@ -134,6 +134,7 @@
   MV_U32      onuGponOmccPortOverrideEn;
   MV_BOOL     onuGponDyingGaspEn;
   MV_BOOL     onuGponBwMapDumpEn;
+  MV_U32      onuGponXvrSdPolarity;
 
   ALARMNOTIFYFUNC   alarmCallback;
   STATUSNOTIFYFUNC  statusCallback;
@@ -268,6 +269,8 @@
 MV_U32    onuGponDbOnuSignalDetectGet(void);
 MV_STATUS onuGponDbOnuDsSyncOnSet(MV_U32 state);
 MV_U32    onuGponDbOnuDsSyncOnGet(void);
+MV_STATUS onuGponDbXvrSdPolaritySet(MV_U32 polarity);
+MV_U32    onuGponDbXvrSdPolarityGet(void);
 MV_STATUS onuGponDbOnuIdOverrideSet(MV_BOOL enable);
 MV_BOOL   onuGponDbOnuIdOverrideGet(void);
 MV_STATUS onuGponDbOnuIdOverrideValueSet(MV_U32 onuId);
diff --git a/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/core/gpon/gponOnuInit.c b/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/core/gpon/gponOnuInit.c
index af11474..520a136 100755
--- a/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/core/gpon/gponOnuInit.c
+++ b/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/core/gpon/gponOnuInit.c
@@ -1258,6 +1258,7 @@
   }
 
     ponXvrFunc = funcGponXvrSDStatus(onuInit->ponXvrPolarity);
+    onuGponDbXvrSdPolaritySet(onuInit->ponXvrPolarity);
 
     onuP2PDbXvrBurstEnablePolaritySet(onuInit->p2pXvrBurstEnPolarity);
 
diff --git a/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/core/gpon/gponOnuIsr.c b/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/core/gpon/gponOnuIsr.c
index a610756..ee221a7 100755
--- a/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/core/gpon/gponOnuIsr.c
+++ b/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/core/gpon/gponOnuIsr.c
@@ -302,8 +302,7 @@
     {

         state = ponXvrFunc(interruptStatus, ONU_GPON_XVR_SIGNAL_DETECT_STATUS_MASK);

 

-	  if (state == MV_TRUE)

-	  {

+	  if (state == MV_TRUE) {

 		onuGponPonMngIntrAlarmHandler(ONU_PON_MNGR_LOS_ALARM, MV_FALSE);

 		/* Set signal detect to ON */

 		onuGponDbOnuSignalDetectSet(1);

@@ -315,7 +314,6 @@
 #ifndef PON_FPGA

 		onuGponIsrXvrReset();

 		onuGponIsrXvrResetStateSet(MV_TRUE);

-		//onuGponPonMngIntrMessageHandler();

 #endif /* PON_FPGA */

 	  }

 	  else if (state == MV_FALSE)

@@ -342,6 +340,22 @@
     if (interruptEvent & ONU_GPON_LOF_ALARM_MASK)

     {

       state = (interruptStatus & ONU_GPON_LOF_ALARM_MASK) ? MV_TRUE : MV_FALSE;

+	  if ((ONU_GPON_XVR_SD_LOW_ACTIVE == onuGponDbXvrSdPolarityGet()) &&

+	  (state != MV_TRUE)) {

+            onuGponPonMngIntrAlarmHandler(ONU_PON_MNGR_LOS_ALARM, MV_FALSE);

+            /* Set signal detect to ON */

+            onuGponDbOnuSignalDetectSet(1);

+

+#ifdef MV_GPON_DEBUG_PRINT

+            mvPonPrint(PON_PRINT_DEBUG, PON_ISR_MODULE,

+                        "DEBUG: (%s:%d) Set signal detect to ON = 1 \n", __FILE_DESC__, __LINE__);

+#endif /* MV_GPON_DEBUG_PRINT */

+#ifndef PON_FPGA

+            onuGponIsrXvrReset();

+            onuGponIsrXvrResetStateSet(MV_TRUE);

+            //onuGponPonMngIntrMessageHandler();

+#endif /* PON_FPGA */

+      }

       onuGponPonMngIntrAlarmHandler(ONU_PON_MNGR_LOF_ALARM, state);

 

       onuGponSyncLog(ONU_GPON_LOG_INTERRUPT_LOF, state, 0, 0);

diff --git a/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/core/gpon/gponOnuIsr.h b/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/core/gpon/gponOnuIsr.h
index 11ee96b..3d0f780 100755
--- a/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/core/gpon/gponOnuIsr.h
+++ b/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/core/gpon/gponOnuIsr.h
@@ -150,6 +150,12 @@
   ONU_GPON_ISR_TYPE_MAX

 }E_OnuGponIsrTypes;

 

+typedef enum

+{

+  ONU_GPON_XVR_SD_HIGH_ACTIVE = 0,

+  ONU_GPON_XVR_SD_LOW_ACTIVE

+}E_OnuGponXvrSdPolarity;

+

 /* Typedefs

 ------------------------------------------------------------------------------*/

 typedef struct

diff --git a/arch/arm/plat-feroceon/mv_drivers_lsp/mv_tpm/core/tpm_db.c b/arch/arm/plat-feroceon/mv_drivers_lsp/mv_tpm/core/tpm_db.c
index 97d033e..0019b1b 100755
--- a/arch/arm/plat-feroceon/mv_drivers_lsp/mv_tpm/core/tpm_db.c
+++ b/arch/arm/plat-feroceon/mv_drivers_lsp/mv_tpm/core/tpm_db.c
@@ -478,6 +478,23 @@
 		gmac1 = TPM_GMAC_FUNC_NONE;
 		break;
 
+	case TPM_PON_WAN_G0_SINGLE_PORT_SGMII:
+		pon = TPM_GMAC_FUNC_WAN;
+		gmac0 = TPM_GMAC_FUNC_LAN;
+		gmac1 = TPM_GMAC_FUNC_NONE;
+		break;
+
+	case TPM_PON_G1_SGMII_WAN_G0_SINGLE_PORT:
+	  gmac0 = TPM_GMAC_FUNC_LAN;
+	  if (TPM_ENUM_GMAC_1 == tpm_db.init_misc.active_wan) {
+	    pon = TPM_GMAC_FUNC_NONE;
+	    gmac1 = TPM_GMAC_FUNC_WAN;
+	  }else{
+	    gmac1 = TPM_GMAC_FUNC_NONE;
+	    pon = TPM_GMAC_FUNC_WAN;
+	  }
+    break;
+
 	case TPM_G0_WAN_G1_INT_SWITCH:
 		pon = TPM_GMAC_FUNC_NONE;
 		gmac0 = TPM_GMAC_FUNC_WAN;
@@ -599,6 +616,7 @@
 {
 	switch (tpm_db.eth_cmplx_profile) {
 	case TPM_PON_WAN_G0_SINGLE_PORT:
+	case TPM_PON_WAN_G0_SINGLE_PORT_SGMII:
 	case TPM_PON_WAN_G1_SINGLE_PORT:
 	case TPM_PON_WAN_G0_G1_LPBK:
 		tpm_db.max_uni_port_nr = TPM_SRC_PORT_UNI_0;
@@ -607,6 +625,7 @@
 	case TPM_PON_G0_WAN_G1_SINGLE_PORT:
 	case TPM_PON_G1_WAN_G0_SINGLE_PORT:
 	case TPM_PON_WAN_G0_G1_DUAL_LAN:
+	case TPM_PON_G1_SGMII_WAN_G0_SINGLE_PORT:
 		tpm_db.max_uni_port_nr = TPM_SRC_PORT_UNI_1;
        	break;
 
diff --git a/arch/arm/plat-feroceon/mv_drivers_lsp/mv_tpm/core/tpm_init.c b/arch/arm/plat-feroceon/mv_drivers_lsp/mv_tpm/core/tpm_init.c
index b72eb6d..a6da59d 100755
--- a/arch/arm/plat-feroceon/mv_drivers_lsp/mv_tpm/core/tpm_init.c
+++ b/arch/arm/plat-feroceon/mv_drivers_lsp/mv_tpm/core/tpm_init.c
@@ -127,21 +127,74 @@
 	(((TPM_ENUM_PMAC == gmac) && (TPM_NONE != tpm_init.pon_type)) ||	\
 	 ((1 == tpm_init.gmac_port_conf[gmac].valid) && (TPM_GMAC_CON_DISC != tpm_init.gmac_port_conf[gmac].conn)))
 
-uint32_t opt_tbl[] = { 	ESC_OPT_RGMIIA_MAC0, ESC_OPT_RGMIIA_MAC1, ESC_OPT_RGMIIA_SW_P5, ESC_OPT_RGMIIA_SW_P6,
-			 	ESC_OPT_RGMIIB_MAC0, ESC_OPT_MAC0_2_SW_P4, ESC_OPT_MAC1_2_SW_P5, ESC_OPT_GEPHY_MAC1,
-			    	ESC_OPT_GEPHY_SW_P0, ESC_OPT_GEPHY_SW_P5, ESC_OPT_FE3PHY, ESC_OPT_SGMII_2_SW_P1, ESC_OPT_SGMII,
-				ESC_OPT_QSGMII,	ESC_OPT_SATA, ESC_OPT_SGMII_2_5 };
-char *opt_str_tlb[] = { "RGMIIA_MAC0", "RGMIIA_MAC1", "RGMIIA_SW_P5", "RGMIIA_SW_P6",
-		 	"RGMIIB_MAC0", "MAC0_2_SW_P4", "MAC1_2_SW_P5", "GEPHY_MAC1",
-		    	"GEPHY_SW_P0", "GEPHY_SW_P5", "FE3PHY", "PCS", "SGMII", "QSGMII", "SATA" , "SGMII_2_5"};
-char *prof_str_tlb[] = { "", "PON_WAN_DUAL_MAC_INT_SWITCH", 	"PON_WAN_G0_INT_SWITCH",
-			"PON_WAN_G1_LAN_G0_INT_SWITCH", 	"G0_WAN_G1_INT_SWITCH",
-		 	"G1_WAN_G0_INT_SWITCH", 		"PON_G1_WAN_G0_INT_SWITCH",
-			"PON_G0_WAN_G1_INT_SWITCH",		"PON_WAN_DUAL_MAC_EXT_SWITCH",
-		    	"PON_WAN_G1_MNG_EXT_SWITCH",		"PON_WAN_G0_SINGLE_PORT",
-			"PON_WAN_G1_SINGLE_PORT",		"PON_G1_WAN_G0_SINGLE_PORT",
-			"PON_G0_WAN_G1_SINGLE_PORT",		"PON_WAN_G0_G1_LPBK",
-			"TPM_PON_WAN_G0_G1_DUAL_LAN"};
+uint32_t opt_tbl[] = {
+    ESC_OPT_RGMIIA_MAC0,
+    ESC_OPT_RGMIIA_MAC1,
+    ESC_OPT_RGMIIA_SW_P5,
+    ESC_OPT_RGMIIA_SW_P6,
+    ESC_OPT_RGMIIB_MAC0,
+    ESC_OPT_MAC0_2_SW_P4,
+    ESC_OPT_MAC1_2_SW_P5,
+    ESC_OPT_GEPHY_MAC1,
+    ESC_OPT_GEPHY_SW_P0,
+    ESC_OPT_GEPHY_SW_P5,
+    ESC_OPT_FE3PHY,
+    ESC_OPT_SGMII_2_SW_P1,
+    ESC_OPT_SGMII,
+    ESC_OPT_QSGMII,
+    ESC_OPT_SATA,
+    ESC_OPT_SGMII_2_5,
+    ESC_OPT_GEPHY_MAC0,
+    ESC_OPT_LP_SERDES_FE_GE_PHY,
+    ESC_OPT_AUTO,
+    ESC_OPT_ILLEGAL,
+    ESC_OPT_ALL
+};
+
+char *opt_str_tlb[] = {
+    "RGMIIA_MAC0",
+    "RGMIIA_MAC1",
+    "RGMIIA_SW_P5",
+    "RGMIIA_SW_P6",
+    "RGMIIB_MAC0",
+    "MAC0_2_SW_P4",
+    "MAC1_2_SW_P5",
+    "GEPHY_MAC1",
+    "GEPHY_SW_P0",
+    "GEPHY_SW_P5",
+    "FE3PHY",
+    "PCS",
+    "SGMII",
+    "QSGMII",
+    "SATA" ,
+    "SGMII_2_5",
+    "GEPHY_MAC0",
+    "LP_SERDES_FE_GE_PHY",
+    "AUTO",
+    "ILLEGAL",
+    "ALL"
+};
+
+char *prof_str_tlb[] = {
+    "",                                     // 0
+    "PON_WAN_DUAL_MAC_INT_SWITCH",          // 1
+    "PON_WAN_G0_INT_SWITCH",                // 2
+    "PON_WAN_G1_LAN_G0_INT_SWITCH",         // 3
+    "G0_WAN_G1_INT_SWITCH",                 // 4
+    "G1_WAN_G0_INT_SWITCH",                 // 5
+    "PON_G1_WAN_G0_INT_SWITCH",             // 6
+    "PON_G0_WAN_G1_INT_SWITCH",             // 7
+    "PON_WAN_DUAL_MAC_EXT_SWITCH",          // 8
+    "PON_WAN_G1_MNG_EXT_SWITCH",            // 9
+    "PON_WAN_G0_SINGLE_PORT",               // 10
+    "PON_WAN_G1_SINGLE_PORT",               // 11
+    "PON_G1_WAN_G0_SINGLE_PORT",            // 12
+    "PON_G0_WAN_G1_SINGLE_PORT",            // 13
+    "PON_WAN_G0_G1_LPBK",                   // 14
+    "TPM_PON_WAN_G0_G1_DUAL_LAN",           // 15
+    "TPM_PON_WAN_G0_SINGLE_PORT_SGMII",     // 16
+    "TPM_PON_G1_SGMII_WAN_G0_SINGLE_PORT",  // 17
+};
 
 static tpm_pnc_range_lookup_map_t pnc_range_lookup_tbl[TPM_MAX_NUM_RANGES] = {
 /*  Range_num             lu_id  last_range  valid */
@@ -568,11 +621,13 @@
 {
 	if (tpm_init.switch_init == MV_TPM_UN_INITIALIZED_INIT_PARAM) {
 		if (   tpm_init.eth_cmplx_profile == TPM_PON_WAN_G0_SINGLE_PORT
+			|| tpm_init.eth_cmplx_profile == TPM_PON_WAN_G0_SINGLE_PORT_SGMII
 		    || tpm_init.eth_cmplx_profile == TPM_PON_WAN_G1_SINGLE_PORT
 		    || tpm_init.eth_cmplx_profile == TPM_PON_G1_WAN_G0_SINGLE_PORT
 		    || tpm_init.eth_cmplx_profile == TPM_PON_G0_WAN_G1_SINGLE_PORT
 		    || tpm_init.eth_cmplx_profile == TPM_PON_WAN_G0_G1_LPBK
-		    || tpm_init.eth_cmplx_profile == TPM_PON_WAN_G0_G1_DUAL_LAN)
+		    || tpm_init.eth_cmplx_profile == TPM_PON_WAN_G0_G1_DUAL_LAN
+		    || tpm_init.eth_cmplx_profile == TPM_PON_G1_SGMII_WAN_G0_SINGLE_PORT )
 			tpm_init.switch_init = 0;
 		else
 			tpm_init.switch_init = 1;
@@ -599,8 +654,8 @@
 	char buff[1024];
 	uint32_t profile[7]= {0};
 
-	off += sprintf(buff+off, "\nSelected Eth Complex Profile: %s", prof_str_tlb[tpm_init.eth_cmplx_profile]);
-	off += sprintf(buff+off, "\nHW enabled options:\n\t");
+	off += sprintf(buff+off, "\nSelected Eth Complex Profile: %s %d", prof_str_tlb[tpm_init.eth_cmplx_profile], tpm_init.eth_cmplx_profile);
+	off += sprintf(buff+off, "\nHW enabled options: 0x%x\n\t", hwEthCmplx);
 	for (i = 0;  i<sizeof(opt_tbl)/sizeof(uint32_t); i++) {
 		if (opt_tbl[i] & hwEthCmplx)
 			off += sprintf(buff+off, "%s ", opt_str_tlb[i]);
@@ -671,6 +726,15 @@
 		profile[0] = ESC_OPT_RGMIIB_MAC0;
 		break;
 
+	case TPM_PON_G1_SGMII_WAN_G0_SINGLE_PORT:
+	  profile[0] = ESC_OPT_RGMIIB_MAC0;
+	  profile[1] = ESC_OPT_SGMII | ESC_OPT_SGMII_2_5;
+	  break;
+
+	case TPM_PON_WAN_G0_SINGLE_PORT_SGMII:
+		profile[0] = ESC_OPT_SGMII;
+		break;
+
 	case TPM_PON_WAN_G1_SINGLE_PORT:
 		profile[0] = ESC_OPT_RGMIIB_MAC0 | ESC_OPT_RGMIIA_MAC1;
 		profile[1] = ESC_OPT_RGMIIB_MAC0 | ESC_OPT_GEPHY_MAC1;
@@ -1247,6 +1311,66 @@
 			tpm_init.eth_port_conf[i].valid = TPM_FALSE;
 		break;
 
+	case TPM_PON_WAN_G0_SINGLE_PORT_SGMII:
+		if (1 == tpm_init.virt_uni_info.enabled)
+			goto virt_uni_err;
+
+		if (!VALID_ONLY((ESC_OPT_SGMII), hwEthCmplx))
+			goto setup_err;
+
+		tpm_init.gmac_port_conf[0].valid = TPM_TRUE;
+		tpm_init.gmac_port_conf[0].port_src = TPM_SRC_PORT_UNI_0;
+		tpm_init.gmac_port_conf[0].conn = TPM_GMAC_CON_SGMII;
+
+		tpm_init.gmac_port_conf[1].valid = TPM_FALSE;
+		tpm_init.gmac_port_conf[1].conn = TPM_GMAC_CON_DISC;
+
+		tpm_init.gmac_port_conf[2].valid = TPM_TRUE;
+		tpm_init.gmac_port_conf[2].port_src = TPM_SRC_PORT_WAN;
+
+		tpm_init.eth_port_conf[0].valid = TPM_TRUE;
+		tpm_init.eth_port_conf[0].port_src = TPM_SRC_PORT_UNI_0;
+		tpm_init.eth_port_conf[0].chip_connect = TPM_CONN_DISC;
+		tpm_init.eth_port_conf[0].int_connect = TPM_INTCON_GMAC0;
+
+		for (i=1 ; i < TPM_MAX_NUM_ETH_PORTS; i++)
+			tpm_init.eth_port_conf[i].valid = TPM_FALSE;
+		break;
+
+  case TPM_PON_G1_SGMII_WAN_G0_SINGLE_PORT:
+    if (1 == tpm_init.virt_uni_info.enabled)
+      goto virt_uni_err;
+
+    if (!VALID_ONLY((ESC_OPT_GEPHY_MAC0 | ESC_OPT_SGMII_2_5), hwEthCmplx) &&
+        !VALID_ONLY((ESC_OPT_GEPHY_MAC0 | ESC_OPT_SGMII    ), hwEthCmplx)
+        )
+      goto setup_err;
+
+    tpm_init.gmac_port_conf[0].valid = TPM_TRUE;
+    tpm_init.gmac_port_conf[0].port_src = TPM_SRC_PORT_UNI_0;
+    tpm_init.gmac_port_conf[0].conn = TPM_GMAC_CON_RGMII2;
+
+    tpm_init.gmac_port_conf[1].valid = TPM_TRUE;
+    tpm_init.gmac_port_conf[1].conn = TPM_SRC_PORT_WAN;
+    tpm_init.gmac_port_conf[1].conn = TPM_GMAC_CON_SGMII;
+
+    tpm_init.gmac_port_conf[2].valid = TPM_TRUE;
+    tpm_init.gmac_port_conf[2].port_src = TPM_SRC_PORT_WAN;
+
+    tpm_init.eth_port_conf[0].valid = TPM_TRUE;
+    tpm_init.eth_port_conf[0].port_src = TPM_SRC_PORT_UNI_0;
+    tpm_init.eth_port_conf[0].chip_connect = TPM_CONN_RGMII2;
+    tpm_init.eth_port_conf[0].int_connect = TPM_INTCON_GMAC0;
+
+    tpm_init.eth_port_conf[1].valid = TPM_TRUE;
+    tpm_init.eth_port_conf[1].port_src = TPM_SRC_PORT_WAN;
+    tpm_init.eth_port_conf[1].chip_connect = TPM_CONN_DISC;
+    tpm_init.eth_port_conf[1].int_connect = TPM_INTCON_GMAC1;
+
+    for (i=2 ; i < TPM_MAX_NUM_ETH_PORTS; i++)
+      tpm_init.eth_port_conf[i].valid = TPM_FALSE;
+    break;
+
 	case TPM_PON_WAN_G1_SINGLE_PORT:
 		if (1 == tpm_init.virt_uni_info.enabled)
 			goto virt_uni_err;
@@ -1739,14 +1863,14 @@
 	}
 
 	/********************** GMAC_0 connectivity validation *************************************/
-	if ((tpm_init.gmac_port_conf[0].conn < TPM_GMAC_CON_DISC) || (tpm_init.gmac_port_conf[0].conn > TPM_GMAC_CON_GE_PHY)) {
+	if ((tpm_init.gmac_port_conf[0].conn < TPM_GMAC_CON_DISC) || (tpm_init.gmac_port_conf[0].conn > TPM_GMAC_CON_SGMII)) {
 		TPM_OS_FATAL(TPM_INIT_MOD,
 			     "\n GMAC_0 connectivity: wrong init value(%d) => legal values <0-7> \n",
 			     tpm_init.gmac_port_conf[0].conn);
 		return (TPM_FAIL);
 	}
 	/********************** GMAC_1 connectivity validation *************************************/
-	if ((tpm_init.gmac_port_conf[1].conn < TPM_GMAC_CON_DISC) || (tpm_init.gmac_port_conf[1].conn > TPM_GMAC_CON_GE_PHY)) {
+	if ((tpm_init.gmac_port_conf[1].conn < TPM_GMAC_CON_DISC) || (tpm_init.gmac_port_conf[1].conn > TPM_GMAC_CON_SGMII)) {
 		TPM_OS_FATAL(TPM_INIT_MOD,
 			     "\n GMAC_1 connectivity: wrong init value(%d) => legal values <0-7> \n",
 			     tpm_init.gmac_port_conf[1].conn);
@@ -2221,11 +2345,13 @@
 			return (TPM_FAIL);
 		}
 	} else if ((tpm_init.eth_cmplx_profile == TPM_PON_WAN_G0_SINGLE_PORT ||
+			tpm_init.eth_cmplx_profile == TPM_PON_WAN_G0_SINGLE_PORT_SGMII ||
 		    tpm_init.eth_cmplx_profile == TPM_PON_WAN_G1_SINGLE_PORT ||
 		    tpm_init.eth_cmplx_profile == TPM_PON_G1_WAN_G0_SINGLE_PORT ||
 		    tpm_init.eth_cmplx_profile == TPM_PON_G0_WAN_G1_SINGLE_PORT ||
 		    tpm_init.eth_cmplx_profile == TPM_PON_WAN_G0_G1_LPBK ||
-		    tpm_init.eth_cmplx_profile == TPM_PON_WAN_G0_G1_DUAL_LAN)
+		    tpm_init.eth_cmplx_profile == TPM_PON_WAN_G0_G1_DUAL_LAN ||
+		    tpm_init.eth_cmplx_profile == TPM_PON_G1_SGMII_WAN_G0_SINGLE_PORT)
 		 && tpm_init.switch_init == 1) {
 			TPM_OS_FATAL(TPM_INIT_MOD,
 					"\n Switch can not be Init at this profile: [%d]! \n", tpm_init.eth_cmplx_profile);
@@ -2573,13 +2699,13 @@
 
 	/* virt uni not enabled */
 	if (virt_uni_info.enabled == 0) {
-		/* Convert UNI_Vector to Amber Vector, applies to uni_0..7, uni_vector from 0x00 to 0xFF */
-		for (i = 0; i < TPM_TX_MAX_MH_REGS; i++) {
-			amber_port_vector = tpm_init_uni_amber_vec_map(i + 1);
-			tpm_db_port_vector_tbl_info_set(i, i + 1, amber_port_vector, 0);
-		}
-		return TPM_DB_OK;
-       }
+	  /* Convert UNI_Vector to Amber Vector, applies to uni_0..7, uni_vector from 0x00 to 0xFF */
+	  for (i = 0; i < TPM_TX_MAX_MH_REGS; i++) {
+	    amber_port_vector = tpm_init_uni_amber_vec_map(i + 1);
+	    tpm_db_port_vector_tbl_info_set(i, i + 1, amber_port_vector, 0);
+	  }
+	  return TPM_DB_OK;
+	}
 
 	/* virt uni enabled */
 
@@ -3161,11 +3287,13 @@
 	case TPM_PON_WAN_DUAL_MAC_EXT_SWITCH:
 	case TPM_PON_WAN_G1_MNG_EXT_SWITCH:
 	case TPM_PON_WAN_G0_SINGLE_PORT:
+	case TPM_PON_WAN_G0_SINGLE_PORT_SGMII:
 	case TPM_PON_WAN_G1_SINGLE_PORT:
 	case TPM_PON_G1_WAN_G0_SINGLE_PORT:
 	case TPM_PON_G0_WAN_G1_SINGLE_PORT:
 	case TPM_PON_WAN_G0_G1_LPBK:
 	case TPM_PON_WAN_G0_G1_DUAL_LAN:
+	case TPM_PON_G1_SGMII_WAN_G0_SINGLE_PORT:
 		return (TPM_OK);
        default:
        	break;
@@ -3829,6 +3957,8 @@
 {
 	uint32_t regVal;
 
+	printk("GMAC port(%d) is invalid\n", port);
+
 	if (port > TPM_MAX_GMAC) {
 		TPM_OS_ERROR(TPM_INIT_MOD, "GMAC port(%d) is invalid\n", port);
 		return TPM_FAIL;
diff --git a/arch/arm/plat-feroceon/mv_drivers_lsp/mv_tpm/core/tpm_pkt_proc_logic.c b/arch/arm/plat-feroceon/mv_drivers_lsp/mv_tpm/core/tpm_pkt_proc_logic.c
index 21c8a80..7b2d153 100755
--- a/arch/arm/plat-feroceon/mv_drivers_lsp/mv_tpm/core/tpm_pkt_proc_logic.c
+++ b/arch/arm/plat-feroceon/mv_drivers_lsp/mv_tpm/core/tpm_pkt_proc_logic.c
@@ -899,7 +899,7 @@
 				if (((gmac_bm & TPM_BM_GMAC_0) && (tx_owner != TPM_Q_OWNER_GMAC0)) ||
 				    ((gmac_bm & TPM_BM_GMAC_1) && (tx_owner != TPM_Q_OWNER_GMAC1)) ||
 				    ((gmac_bm & TPM_BM_PMAC) && (tx_owner != TPM_Q_OWNER_PMAC))) {
-					TPM_OS_ERROR(TPM_TPM_LOG_MOD, "Target Queue Owner Invalid, gmac_bm: [%d], tx_owner: [%d]\n",
+					TPM_OS_ERROR(TPM_TPM_LOG_MOD, "Target Queue Owner Invalid, gmac_bm: [0x%x], tx_owner: [%d]\n",
 									gmac_bm, tx_owner);
 					return(ERR_FRWD_INVALID);
 				}
@@ -7094,7 +7094,7 @@
 
 		/* if port is valid */
 		if(!tpm_db_eth_port_valid(src_port)) {
-			TPM_OS_ERROR(TPM_TPM_LOG_MOD, "dest_port(0x%x) is not valid\n", dst_port);
+			TPM_OS_ERROR(TPM_TPM_LOG_MOD, "dest_port(0x%x) - src_port(%d) is not valid\n", dst_port, src_port);
 			return ERR_MC_DST_PORT_INVALID;
 		}
 	}
diff --git a/arch/arm/plat-feroceon/mv_drivers_lsp/mv_tpm/core/tpm_print.c b/arch/arm/plat-feroceon/mv_drivers_lsp/mv_tpm/core/tpm_print.c
index 7fc477a..d9948af 100755
--- a/arch/arm/plat-feroceon/mv_drivers_lsp/mv_tpm/core/tpm_print.c
+++ b/arch/arm/plat-feroceon/mv_drivers_lsp/mv_tpm/core/tpm_print.c
@@ -144,6 +144,7 @@
 	BuildEnumString(TPM_GMAC_CON_RGMII1),
 	BuildEnumString(TPM_GMAC_CON_RGMII2),
 	BuildEnumString(TPM_GMAC_CON_GE_PHY),
+	BuildEnumString(TPM_GMAC_CON_SGMII),
 };
 
 db_enum_string_t tpm_db_gmac_func_str[] = {
diff --git a/arch/arm/plat-feroceon/mv_drivers_lsp/mv_tpm/core/tpm_types.h b/arch/arm/plat-feroceon/mv_drivers_lsp/mv_tpm/core/tpm_types.h
index 89a4375..ca167a3 100755
--- a/arch/arm/plat-feroceon/mv_drivers_lsp/mv_tpm/core/tpm_types.h
+++ b/arch/arm/plat-feroceon/mv_drivers_lsp/mv_tpm/core/tpm_types.h
@@ -768,11 +768,13 @@
 *	TPM_PHY_SPEED_10_MBPS   - 10Mbps
 *	TPM_PHY_SPEED_100_MBPS	- 100Mbps
 *	TPM_PHY_SPEED_1000_MBPS - 1000Mbps
+*	TPM_PHY_SPEED_1000_MBPS - 2500Mbps
 */
 typedef enum {
 	TPM_PHY_SPEED_10_MBPS,
 	TPM_PHY_SPEED_100_MBPS,
-	TPM_PHY_SPEED_1000_MBPS
+	TPM_PHY_SPEED_1000_MBPS,
+	TPM_PHY_SPEED_2500_MBPS,
 } tpm_phy_speed_t;
 
 /* switch mirror type */
@@ -1027,7 +1029,10 @@
 	TPM_PON_G1_WAN_G0_SINGLE_PORT,
 	TPM_PON_G0_WAN_G1_SINGLE_PORT,
 	TPM_PON_WAN_G0_G1_LPBK,
-	TPM_PON_WAN_G0_G1_DUAL_LAN
+	TPM_PON_WAN_G0_G1_DUAL_LAN,
+	TPM_PON_WAN_G0_SINGLE_PORT_SGMII,
+  TPM_PON_G1_SGMII_WAN_G0_SINGLE_PORT,
+  TPM_COMPLEX_PROFILE_LAST,
 } tpm_eth_complex_profile_t;
 
 typedef enum {
@@ -1083,7 +1088,8 @@
 	TPM_GMAC_CON_SWITCH_6,	/* Amber Switch Port #6 */
 	TPM_GMAC_CON_RGMII1,
 	TPM_GMAC_CON_RGMII2,
-	TPM_GMAC_CON_GE_PHY	/* Internal Gig PHY */
+	TPM_GMAC_CON_GE_PHY,	/* Internal Gig PHY */
+	TPM_GMAC_CON_SGMII,
 } tpm_init_gmac_conn_t;
 
 typedef enum {
diff --git a/arch/arm/plat-feroceon/mv_drivers_lsp/mv_tpm/plat/tpm_switch_mgr.c b/arch/arm/plat-feroceon/mv_drivers_lsp/mv_tpm/plat/tpm_switch_mgr.c
index 46cf9ca..1d993d0 100644
--- a/arch/arm/plat-feroceon/mv_drivers_lsp/mv_tpm/plat/tpm_switch_mgr.c
+++ b/arch/arm/plat-feroceon/mv_drivers_lsp/mv_tpm/plat/tpm_switch_mgr.c
@@ -167,21 +167,37 @@
     }
 
     /* Check gmac port connection info */
-    for (i = 0; i < TPM_MAX_NUM_GMACS; i++) {
-        if (TPM_DB_OK != tpm_db_gmac_conn_conf_get(i, &gmac_conn_info)) {
+    for (i = 0; i < TPM_MAX_NUM_GMACS; i++)
+    {
+        if (TPM_DB_OK != tpm_db_gmac_conn_conf_get(i, &gmac_conn_info))
+        {
             printk(KERN_ERR "ERROR: (%s:%d) Gmac port(%d) connection info get failed\n", __FUNCTION__, __LINE__, i);
             return ERR_PHY_SRC_PORT_CONN_INVALID;
         }
-        if (TPM_TRUE == gmac_conn_info.valid && src_port == gmac_conn_info.port_src) {
-            /* PHY access directly */
-            *phy_access_way = PHY_SMI_MASTER_CPU;
-            /*get PHY addr on GMAC*/
-            *phy_direct_addr = mvBoardPhyAddrGet(i);
+        if (TPM_TRUE == gmac_conn_info.valid && src_port == gmac_conn_info.port_src)
+        {
+        	if(gmac_conn_info.conn == TPM_GMAC_CON_SGMII)
+        	{
+				/* No PHY available */
+				*phy_access_way = PHY_SGMII;
 
-            if (trace_sw_dbg_flag)
-                printk(KERN_INFO "Port%d PHY access directly, phyaddr %d\n", src_port, *phy_direct_addr);
+				if (trace_sw_dbg_flag)
+					printk(KERN_INFO "Port%d SGMII connection, no PHY\n", src_port, *phy_direct_addr);
 
-            return TPM_RC_OK;
+				return TPM_RC_OK;
+        	}
+        	else // We keep the original code for the rest of cases
+        	{
+				/* PHY access directly */
+				*phy_access_way = PHY_SMI_MASTER_CPU;
+				/*get PHY addr on GMAC*/
+				*phy_direct_addr = mvBoardPhyAddrGet(i);
+
+				if (trace_sw_dbg_flag)
+					printk(KERN_INFO "Port%d PHY access directly, phyaddr %d\n", src_port, *phy_direct_addr);
+
+				return TPM_RC_OK;
+        	}
         }
     }
 
@@ -334,7 +350,9 @@
                 return retVal;
             }
         }
-    } else {
+    }
+    else if (PHY_SGMII != phy_access_way)
+    {
         printk(KERN_ERR "PHY not connected to GMAC\n");
         retVal = ERR_GENERAL;
         return retVal;
@@ -5077,6 +5095,10 @@
                "Port%d PHY access way check failed\n", src_port);
         return retVal;
     }
+    // Possible connection ways:
+    //  -RGMII phy accessed directly
+    //  -RGMII phy accessed through a switch
+    //  -SGMII - No autoneg available
     /* PHY accessed directly, call lsp API */
     if (PHY_SMI_MASTER_CPU == phy_access_way) {
         if (mvEthPhyAutoNegoSet(phy_direct_addr, state)) {
@@ -5084,12 +5106,15 @@
                    "ERROR: (%s:%d) PHY LSP API call failed on port(%d)\n", __FUNCTION__, __LINE__, src_port);
             retVal = ERR_PHY_SRC_PORT_CONN_INVALID;
         }
-        if (state && (retVal == TPM_RC_OK)) {
-            if (mvEthPhyAdvertiseSet(phy_direct_addr, lsp_mode)) {
-                printk(KERN_ERR
-                       "ERROR: (%s:%d) PHY LSP API call failed on port(%d)\n", __FUNCTION__, __LINE__, src_port);
-                retVal = ERR_PHY_SRC_PORT_CONN_INVALID;
-            }
+
+        if(retVal == TPM_RC_OK )
+        {
+        	// Enable always advertisement
+			if (mvEthPhyAdvertiseSet(phy_direct_addr, lsp_mode)) {
+				printk(KERN_ERR
+					   "ERROR: (%s:%d) PHY LSP API call failed on port(%d)\n", __FUNCTION__, __LINE__, src_port);
+				retVal = ERR_PHY_SRC_PORT_CONN_INVALID;
+			}
         }
         /* Update GMAC speed, duplex and flow control */
         retVal = tpm_sw_set_gmac_speed_duplex_fc(owner_id, src_port, (state ? true : false));
@@ -5097,7 +5122,9 @@
             printk(KERN_ERR "Failed to update GMAC config with port%d\n", src_port);
             return retVal;
         }
-    } else {
+    }
+    else if (PHY_SMI_MASTER_SWT == phy_access_way)
+    {
         /* PHY accessed through switch, as original do */
         lPort = tpm_db_eth_port_switch_port_get(src_port);
         if (lPort == TPM_DB_ERR_PORT_NUM)
@@ -5119,6 +5146,9 @@
             }
         }
     }
+    else if (PHY_SGMII == phy_access_way)
+    {  /* nothing to do*/ }
+
     if (trace_sw_dbg_flag)
     {
         printk(KERN_INFO
@@ -5262,7 +5292,7 @@
         } else {
             mode = TPM_SPEED_AUTO_DUPLEX_AUTO;
         }
-    } else {
+    } else if (PHY_SMI_MASTER_SWT == phy_access_way){
         /* PHY accessed through switch, as original do */
         lPort = tpm_db_eth_port_switch_port_get(src_port);
         if (lPort == TPM_DB_ERR_PORT_NUM)
@@ -5278,6 +5308,8 @@
                    "%s:%d: function failed\r\n", __FUNCTION__,__LINE__);
         }
     }
+    else if (PHY_SGMII == phy_access_way)
+    {  /* nothing to do*/ }
 
     if(GT_TRUE == state)
         *autoneg_state = true;
@@ -5346,13 +5378,17 @@
         return retVal;
     }
     /* PHY accessed directly, call lsp API */
-    if (PHY_SMI_MASTER_CPU == phy_access_way) {
-        if (mvEthPhyRestartAN(phy_direct_addr, 0)) {
+    if (PHY_SMI_MASTER_CPU == phy_access_way)
+    {
+        if (mvEthPhyRestartAN(phy_direct_addr, 0))
+        {
             printk(KERN_ERR
                    "ERROR: (%s:%d) PHY LSP API call failed on port(%d)\n", __FUNCTION__, __LINE__, src_port);
             retVal = ERR_PHY_SRC_PORT_CONN_INVALID;
         }
-    } else {
+    }
+    else if (PHY_SMI_MASTER_SWT == phy_access_way)
+    {
         /* PHY accessed through switch, as original do */
         lPort = tpm_db_eth_port_switch_port_get(src_port);
         if (lPort == TPM_DB_ERR_PORT_NUM)
@@ -5368,6 +5404,8 @@
                     "%s:%d: function failed\r\n", __FUNCTION__,__LINE__);
         }
     }
+    else if (PHY_SGMII == phy_access_way)
+    {  /* nothing to do*/ }
 
     if (trace_sw_dbg_flag)
     {
@@ -5434,13 +5472,16 @@
         return retVal;
     }
     /* PHY accessed directly, call lsp API */
-    if (PHY_SMI_MASTER_CPU == phy_access_way) {
+    if (PHY_SMI_MASTER_CPU == phy_access_way)
+    {
         if (mvEthPhySetAdminState(phy_direct_addr, (int)state)) {
             printk(KERN_ERR
                    "ERROR: (%s:%d) PHY LSP API call failed on port(%d)\n", __FUNCTION__, __LINE__, src_port);
             retVal = ERR_PHY_SRC_PORT_CONN_INVALID;
         }
-    } else {
+    }
+    else if (PHY_SMI_MASTER_SWT == phy_access_way)
+    {
         /* PHY accessed through switch, as original do */
         lPort = tpm_db_eth_port_switch_port_get(src_port);
         if (lPort == TPM_DB_ERR_PORT_NUM)
@@ -5462,6 +5503,8 @@
             }
         }
     }
+    else if (PHY_SGMII == phy_access_way)
+    {  /* nothing to do*/ }
 
     if (trace_sw_dbg_flag)
     {
@@ -5521,13 +5564,16 @@
         return retVal;
     }
     /* PHY accessed directly, call lsp API */
-    if (PHY_SMI_MASTER_CPU == phy_access_way) {
+    if (PHY_SMI_MASTER_CPU == phy_access_way)
+    {
         if (mvEthPhyGetAdminState(phy_direct_addr, (int *)&state)) {
             printk(KERN_ERR
                    "ERROR: (%s:%d) PHY LSP API call failed on port(%d)\n", __FUNCTION__, __LINE__, src_port);
             retVal = ERR_PHY_SRC_PORT_CONN_INVALID;
         }
-    } else {
+    }
+    else if (PHY_SMI_MASTER_SWT == phy_access_way)
+    {
         /* PHY accessed through switch, as original do */
         lPort = tpm_db_eth_port_switch_port_get(src_port);
         if (lPort == TPM_DB_ERR_PORT_NUM)
@@ -5543,6 +5589,8 @@
                    "%s:%d: function failed\r\n", __FUNCTION__,__LINE__);
         }
     }
+    else if (PHY_SGMII == phy_access_way)
+    {  /* nothing to do*/ }
 
     if(state == GT_TRUE)
         *phy_port_state = true;
@@ -5607,9 +5655,12 @@
         return retVal;
     }
     /* PHY accessed directly, call lsp API */
-    if (PHY_SMI_MASTER_CPU == phy_access_way) {
+    if (PHY_SMI_MASTER_CPU == phy_access_way)
+    {
         state = (GT_BOOL)mvEthPhyCheckLink(phy_direct_addr);
-    } else {
+    }
+    else if (PHY_SMI_MASTER_SWT == phy_access_way)
+    {
         /* PHY accessed through switch, as original do */
         lPort = tpm_db_eth_port_switch_port_get(src_port);
         if (lPort == TPM_DB_ERR_PORT_NUM)
@@ -5625,6 +5676,8 @@
                    "%s:%d: function failed\r\n", __FUNCTION__,__LINE__);
         }
     }
+    else if (PHY_SGMII == phy_access_way)
+    {  /* nothing to do*/ }
 
     if(state == GT_TRUE)
         *port_link_status = true;
@@ -5693,7 +5746,8 @@
         return retVal;
     }
     /* PHY accessed directly, call lsp API */
-    if (PHY_SMI_MASTER_CPU == phy_access_way) {
+    if (PHY_SMI_MASTER_CPU == phy_access_way)
+    {
         if (mvEthPhyDuplexOperGet(phy_direct_addr, (int *)&status_valid, (int *)&state)) {
             printk(KERN_ERR
                    "ERROR: (%s:%d) PHY LSP API call failed on port(%d)\n", __FUNCTION__, __LINE__, src_port);
@@ -5705,7 +5759,9 @@
                    "ERROR: (%s:%d) PHY duplex status is not valid on port(%d)\n", __FUNCTION__, __LINE__, src_port);
             retVal = ERR_PHY_STATUS_UNKNOWN;
         }
-    } else {
+    }
+    else if (PHY_SMI_MASTER_SWT == phy_access_way)
+    {
         /* PHY accessed through switch, as original do */
         lPort = tpm_db_eth_port_switch_port_get(src_port);
         if (lPort == TPM_DB_ERR_PORT_NUM)
@@ -5721,6 +5777,8 @@
                    "%s:%d: function failed\r\n", __FUNCTION__,__LINE__);
         }
     }
+    else if (PHY_SGMII == phy_access_way)
+    {  /* nothing to do*/ }
 
     if(state == GT_TRUE)
         *port_duplex_status = true;
@@ -5789,7 +5847,8 @@
         return retVal;
     }
     /* PHY accessed directly, call lsp API */
-    if (PHY_SMI_MASTER_CPU == phy_access_way) {
+    if (PHY_SMI_MASTER_CPU == phy_access_way)
+    {
         if (mvEthPhySpeedOperGet(phy_direct_addr, (uint32_t *)&tmpSpeed)) {
             printk(KERN_ERR
                    "ERROR: (%s:%d) PHY LSP API call failed on port(%d)\n", __FUNCTION__, __LINE__, src_port);
@@ -5801,7 +5860,9 @@
                    "ERROR: (%s:%d) PHY speed status is not valid on port(%d)\n", __FUNCTION__, __LINE__, src_port);
             retVal = ERR_PHY_STATUS_UNKNOWN;
         }
-    } else {
+    }
+    else if (PHY_SMI_MASTER_SWT == phy_access_way)
+    {
         /* PHY accessed through switch, as original do */
         lPort = tpm_db_eth_port_switch_port_get(src_port);
         if (lPort == TPM_DB_ERR_PORT_NUM)
@@ -5817,6 +5878,8 @@
                    "%s:%d: function failed\r\n", __FUNCTION__,__LINE__);
         }
     }
+    else if (PHY_SGMII == phy_access_way)
+    {  /* nothing to do*/ }
 
     *speed = (uint32_t)tmpSpeed;
 
@@ -5888,7 +5951,8 @@
         return retVal;
     }
     /* PHY accessed directly, call lsp API */
-    if (PHY_SMI_MASTER_CPU == phy_access_way) {
+    if (PHY_SMI_MASTER_CPU == phy_access_way)
+    {
         if (tpm_db_switch_init_get(&switch_init) != TPM_DB_OK) {
             printk(KERN_ERR "ERROR: (%s:%d) tpm_db_switch_init_get Failed\n", __FUNCTION__, __LINE__);
             retVal = ERR_GENERAL;
@@ -5951,7 +6015,9 @@
                    "ERROR: (%s:%d) PHY LSP API call failed on port(%d)\n", __FUNCTION__, __LINE__, src_port);
             retVal = ERR_PHY_SRC_PORT_CONN_INVALID;
         }
-    } else {
+    }
+    else if (PHY_SMI_MASTER_SWT == phy_access_way)
+    {
         /* PHY accessed through switch, as original do */
         lPort = tpm_db_eth_port_switch_port_get(src_port);
         if (lPort == TPM_DB_ERR_PORT_NUM)
@@ -5973,6 +6039,8 @@
             }
         }
     }
+    else if (PHY_SGMII == phy_access_way)
+    {  /* nothing to do*/ }
 
     if (trace_sw_dbg_flag)
     {
@@ -6030,13 +6098,16 @@
         return retVal;
     }
     /* PHY accessed directly, call lsp API */
-    if (PHY_SMI_MASTER_CPU == phy_access_way) {
+    if (PHY_SMI_MASTER_CPU == phy_access_way)
+    {
         if (mvEthPhyPauseAdminGet(phy_direct_addr, (uint32_t *)&pause_state)) {
             printk(KERN_ERR
                    "ERROR: (%s:%d) PHY LSP API call failed on port(%d)\n", __FUNCTION__, __LINE__, src_port);
             retVal = ERR_PHY_SRC_PORT_CONN_INVALID;
         }
-    } else {
+    }
+    else if (PHY_SMI_MASTER_SWT == phy_access_way)
+    {
         /* PHY accessed through switch, as original do */
         lPort = tpm_db_eth_port_switch_port_get(src_port);
         if (lPort == TPM_DB_ERR_PORT_NUM)
@@ -6052,6 +6123,8 @@
                    "%s:%d: function failed\r\n", __FUNCTION__,__LINE__);
         }
     }
+    else if (PHY_SGMII == phy_access_way)
+    {  /* nothing to do*/ }
 
     if(pause_state == GT_PHY_NO_PAUSE)
         *state = false;
@@ -6149,27 +6222,30 @@
                    "Port%d PHY access way check failed\n", src_port);
             return retVal;
         }
-        for (gmac_port = TPM_ENUM_GMAC_0; gmac_port < TPM_MAX_NUM_GMACS; gmac_port++) {
-            if (phy_direct_addr == mvBoardPhyAddrGet(gmac_port))
-                break;
-        }
-        if (gmac_port == TPM_MAX_NUM_GMACS) {
-            printk(KERN_ERR "ERROR: (%s:%d) Can not find gmac port\n", __FUNCTION__, __LINE__);
-            retVal = ERR_GENERAL;
-            return retVal;
-        }
+        if(PHY_SMI_MASTER_CPU == phy_access_way)
+        {
+			for (gmac_port = TPM_ENUM_GMAC_0; gmac_port < TPM_MAX_NUM_GMACS; gmac_port++) {
+				if (phy_direct_addr == mvBoardPhyAddrGet(gmac_port))
+					break;
+			}
+			if (gmac_port == TPM_MAX_NUM_GMACS) {
+				printk(KERN_ERR "ERROR: (%s:%d) Can not find gmac port\n", __FUNCTION__, __LINE__);
+				retVal = ERR_GENERAL;
+				return retVal;
+			}
 
-        /* Get GMAC Flow Control state */
-        if (mvNetaFlowCtrlGet((int)gmac_port, &fc_mode) != MV_OK) {
-            printk(KERN_ERR "ERROR: (%s:%d) Can not find gmac port\n", __FUNCTION__, __LINE__);
-            retVal = ERR_GENERAL;
-            return retVal;
-        }
+			/* Get GMAC Flow Control state */
+			if (mvNetaFlowCtrlGet((int)gmac_port, &fc_mode) != MV_OK) {
+				printk(KERN_ERR "ERROR: (%s:%d) Can not find gmac port\n", __FUNCTION__, __LINE__);
+				retVal = ERR_GENERAL;
+				return retVal;
+			}
 
-        if (fc_mode == MV_ETH_FC_DISABLE)
-            *state = false;
-        else
-            *state = true;
+			if (fc_mode == MV_ETH_FC_DISABLE)
+				*state = false;
+			else
+				*state = true;
+        }
     }
 
     if (trace_sw_dbg_flag)
@@ -6318,7 +6394,9 @@
                    "==ENTER==%s: mode[%d] invalid\n\r", __FUNCTION__,mode);
             retVal = ERR_GENERAL;
         }
-    } else {
+    }
+    else if (PHY_SMI_MASTER_SWT == phy_access_way)
+    {
         /* PHY accessed through switch, as original do */
         lPort = tpm_db_eth_port_switch_port_get(src_port);
         if (lPort == TPM_DB_ERR_PORT_NUM)
@@ -6373,6 +6451,8 @@
                    "%s:%d: function failed\r\n", __FUNCTION__,__LINE__);
         }
     }
+    else if (PHY_SGMII == phy_access_way)
+    {  /* nothing to do*/ }
 
     if (trace_sw_dbg_flag)
     {
@@ -6449,7 +6529,9 @@
                    "==ENTER==%s: mode[%d] invalid\n\r", __FUNCTION__,mode);
             retVal = ERR_GENERAL;
         }
-    } else {
+    }
+    else if (PHY_SMI_MASTER_SWT == phy_access_way)
+    {
         /* PHY accessed through switch, as original do */
         lPort = tpm_db_eth_port_switch_port_get(src_port);
         if (lPort == TPM_DB_ERR_PORT_NUM)
@@ -6475,6 +6557,8 @@
                    "%s:%d: function failed\r\n", __FUNCTION__,__LINE__);
         }
     }
+    else if (PHY_SGMII == phy_access_way)
+    {  /* nothing to do*/ }
 
     if(state == GT_TRUE)
     {
@@ -6568,7 +6652,9 @@
                 return retVal;
             }
         }
-    } else {
+    }
+    else if (PHY_SMI_MASTER_SWT == phy_access_way)
+    {
         /* PHY accessed through switch, as original do */
         lPort = tpm_db_eth_port_switch_port_get(src_port);
         if (lPort == TPM_DB_ERR_PORT_NUM)
@@ -6584,6 +6670,8 @@
                    "%s:%d: function failed\r\n", __FUNCTION__,__LINE__);
         }
     }
+    else if (PHY_SGMII == phy_access_way)
+    {  /* nothing to do*/ }
 
     if (trace_sw_dbg_flag)
     {
@@ -6651,7 +6739,9 @@
                    "ERROR: (%s:%d) PHY LSP API call failed on port(%d)\n", __FUNCTION__, __LINE__, src_port);
             retVal = ERR_PHY_SRC_PORT_CONN_INVALID;
         }
-    } else {
+    }
+    else if (PHY_SMI_MASTER_SWT == phy_access_way)
+    {
         /* PHY accessed through switch, as original do */
         lPort = tpm_db_eth_port_switch_port_get(src_port);
         if (lPort == TPM_DB_ERR_PORT_NUM)
@@ -6673,6 +6763,8 @@
                     "==EXIT== %s:enable[%d]\n\r",__FUNCTION__,  *enable);
         }
     }
+    else if (PHY_SGMII == phy_access_way)
+    {  /* nothing to do*/ }
 
     if(state == GT_TRUE)
     {
@@ -6750,7 +6842,9 @@
                 return retVal;
             }
         }
-    } else {
+    }
+    else if (PHY_SMI_MASTER_SWT == phy_access_way)
+    {
         /* PHY accessed through switch, as original do */
         lPort = tpm_db_eth_port_switch_port_get(src_port);
         if (lPort == TPM_DB_ERR_PORT_NUM)
@@ -6766,6 +6860,8 @@
                    "%s:%d: function failed\r\n", __FUNCTION__,__LINE__);
         }
     }
+    else if (PHY_SGMII == phy_access_way)
+    {  /* nothing to do*/ }
 
     if (trace_sw_dbg_flag)
     {
@@ -6835,7 +6931,9 @@
                    "ERROR: (%s:%d) PHY LSP API call failed on port(%d)\n", __FUNCTION__, __LINE__, src_port);
             retVal = ERR_PHY_SRC_PORT_CONN_INVALID;
         }
-    } else {
+    }
+    else if (PHY_SMI_MASTER_SWT == phy_access_way)
+    {
         /* PHY accessed through switch, as original do */
         lPort = tpm_db_eth_port_switch_port_get(src_port);
         if (lPort == TPM_DB_ERR_PORT_NUM)
@@ -6853,6 +6951,8 @@
 
         *speed = (tpm_phy_speed_t)lSpeed;
     }
+    else if (PHY_SGMII == phy_access_way)
+    {  /* nothing to do*/ }
 
     if (trace_sw_dbg_flag)
     {
@@ -7563,20 +7663,26 @@
         tpm_swport_pm_1->alignmentErrorCounter           = 0;
         tpm_swport_pm_1->internalMacReceiveErrorCounter  = statsCounterSet.InMACRcvErr;
     } else {
-        /* check PHY access way */
         retVal = tpm_phy_access_check(src_port, &phy_access_way, &phy_direct_addr);
         if (retVal != TPM_RC_OK) {
             printk(KERN_ERR
                    "Port%d PHY access way check failed\n", src_port);
             return retVal;
         }
-        for (gmac_port = TPM_ENUM_GMAC_0; gmac_port < TPM_MAX_NUM_GMACS; gmac_port++) {
-            if (phy_direct_addr == mvBoardPhyAddrGet(gmac_port))
-                break;
+        if (PHY_SMI_MASTER_CPU == phy_access_way)/* check PHY access way */
+        {
+			for (gmac_port = TPM_ENUM_GMAC_0; gmac_port < TPM_MAX_NUM_GMACS; gmac_port++) {
+				if (phy_direct_addr == mvBoardPhyAddrGet(gmac_port))
+					break;
+			}
+			if (gmac_port == TPM_MAX_NUM_GMACS) {
+				printk(KERN_ERR "ERROR: (%s:%d) Can not find gmac port\n", __FUNCTION__, __LINE__);
+				return ERR_GENERAL;
+			}
         }
-        if (gmac_port == TPM_MAX_NUM_GMACS) {
-            printk(KERN_ERR "ERROR: (%s:%d) Can not find gmac port\n", __FUNCTION__, __LINE__);
-            return ERR_GENERAL;
+        else if (PHY_SGMII == phy_access_way)
+        {
+        	gmac_port = 0;
         }
 
         /* Read counter from GMAC */
@@ -7586,7 +7692,7 @@
             return ERR_GENERAL;
         }
 
-	g_mc_tpm_swport_pm_1.fcsErrors                       += tpm_swport_pm_1->fcsErrors;
+        g_mc_tpm_swport_pm_1.fcsErrors                       += tpm_swport_pm_1->fcsErrors;
         g_mc_tpm_swport_pm_1.excessiveCollisionCounter       += tpm_swport_pm_1->excessiveCollisionCounter;
         g_mc_tpm_swport_pm_1.lateCollisionCounter            += tpm_swport_pm_1->lateCollisionCounter;
         g_mc_tpm_swport_pm_1.frameTooLongs                   += tpm_swport_pm_1->frameTooLongs;
@@ -7760,13 +7866,20 @@
                    "Port%d PHY access way check failed\n", src_port);
             return retVal;
         }
-        for (gmac_port = TPM_ENUM_GMAC_0; gmac_port < TPM_MAX_NUM_GMACS; gmac_port++) {
-            if (phy_direct_addr == mvBoardPhyAddrGet(gmac_port))
-                break;
+        if (PHY_SMI_MASTER_CPU == phy_access_way)/* check PHY access way */
+        {
+			for (gmac_port = TPM_ENUM_GMAC_0; gmac_port < TPM_MAX_NUM_GMACS; gmac_port++) {
+				if (phy_direct_addr == mvBoardPhyAddrGet(gmac_port))
+					break;
+			}
+			if (gmac_port == TPM_MAX_NUM_GMACS) {
+				printk(KERN_ERR "ERROR: (%s:%d) Can not find gmac port\n", __FUNCTION__, __LINE__);
+				return ERR_GENERAL;
+			}
         }
-        if (gmac_port == TPM_MAX_NUM_GMACS) {
-            printk(KERN_ERR "ERROR: (%s:%d) Can not find gmac port\n", __FUNCTION__, __LINE__);
-            return ERR_GENERAL;
+        else if (PHY_SGMII == phy_access_way)
+        {
+        	gmac_port = 0;
         }
 
         /* Read counter from GMAC */
@@ -8123,7 +8236,9 @@
                 return retVal;
             }
         }
-    } else {
+    }
+    else if (PHY_SGMII == phy_access_way)
+    {
         /* PHY accessed through switch, as original do */
         lPort = tpm_db_eth_port_switch_port_get(src_port);
         if (lPort == TPM_DB_ERR_PORT_NUM)
diff --git a/arch/arm/plat-feroceon/mv_drivers_lsp/mv_tpm/plat/tpm_switch_mgr.h b/arch/arm/plat-feroceon/mv_drivers_lsp/mv_tpm/plat/tpm_switch_mgr.h
index 0f6141c..53aca50 100755
--- a/arch/arm/plat-feroceon/mv_drivers_lsp/mv_tpm/plat/tpm_switch_mgr.h
+++ b/arch/arm/plat-feroceon/mv_drivers_lsp/mv_tpm/plat/tpm_switch_mgr.h
@@ -116,6 +116,7 @@
 typedef enum {
         PHY_SMI_MASTER_CPU,/*Phy directly accessed through LSP function*/
         PHY_SMI_MASTER_SWT,/*Phy accessed through switch*/
+        PHY_SGMII,/*No Phy, direct SGMII connection*/
 } tpm_phy_ctrl_t;
 
 /*******************************************************************************
diff --git a/arch/arm/plat-feroceon/mv_hal/sflash/mvSFlash.c b/arch/arm/plat-feroceon/mv_hal/sflash/mvSFlash.c
index 71e0abf..d328ae4 100755
--- a/arch/arm/plat-feroceon/mv_hal/sflash/mvSFlash.c
+++ b/arch/arm/plat-feroceon/mv_hal/sflash/mvSFlash.c
@@ -281,6 +281,31 @@
      MV_MX25L6405_MAX_FAST_SPI_FREQ,
      MV_MX25L6405_FAST_READ_DUMMY_BYTES
     },
+    /* Macronix MXIC MX25L12805E SPI flash, 16MB, 256 sectors of 64K each */
+    {
+     MV_MX25L_WREN_CMND_OPCD,
+     MV_MX25L_WRDI_CMND_OPCD,
+     MV_MX25L_RDID_CMND_OPCD,
+     MV_MX25L_RDSR_CMND_OPCD,
+     MV_MX25L_WRSR_CMND_OPCD,
+     MV_MX25L_READ_CMND_OPCD,
+     MV_MX25L_FAST_RD_CMND_OPCD,
+     MV_MX25L_PP_CMND_OPCD,
+     MV_MX25L_SE_CMND_OPCD,
+     MV_MX25L_BE_CMND_OPCD,
+     MV_MX25L_RES_CMND_OPCD,
+     MV_MX25L_DP_CMND_OPCD,
+     MV_MX25L_EN4B_CMND_OPCD,
+     MV_MX25L12805E_SECTOR_SIZE,
+     MV_MX25L12805E_SECTOR_NUMBER,
+     MV_MXIC_PAGE_SIZE,
+     "MXIC MX25L12805E",
+     MV_MXIC_MANF_ID,
+     MV_MX25L12805E_DEVICE_ID,
+     MV_MX25L12805E_MAX_SPI_FREQ,
+     MV_MX25L12805E_MAX_FAST_SPI_FREQ,
+     MV_MX25L12805E_FAST_READ_DUMMY_BYTES
+    },
     /* Macronix MXIC MX25L25635E SPI flash, 32MB, 512 sectors of 64K each */
     {
      MV_MX25L_WREN_CMND_OPCD,
@@ -330,6 +355,56 @@
      MV_S25FL128_MAX_SPI_FREQ,
      MV_M25P128_MAX_FAST_SPI_FREQ,
      MV_M25P128_FAST_READ_DUMMY_BYTES
+    },
+   /* WINBOND M25Q128 SPI flash, 16MB, 256 sectors of 64K each */
+    {
+     MV_W25Q_WREN_CMND_OPCD,
+     MV_W25Q_WRDI_CMND_OPCD,
+     MV_W25Q_RDID_CMND_OPCD,
+     MV_W25Q_RDSR_CMND_OPCD,
+     MV_W25Q_WRSR_CMND_OPCD,
+     MV_W25Q_READ_CMND_OPCD,
+     MV_W25Q_FAST_RD_CMND_OPCD,
+     MV_W25Q_PP_CMND_OPCD,
+     MV_W25Q_SE_CMND_OPCD,
+     MV_W25Q_BE_CMND_OPCD,
+     MV_W25Q_RES_CMND_OPCD,
+     MV_SFLASH_NO_SPECIFIC_OPCD,    /* power save not supported */
+	 MV_SFLASH_NO_SPECIFIC_OPCD,
+     MV_W25Q128_SECTOR_SIZE,
+     MV_W25Q128_SECTOR_NUMBER,
+     MV_W25Q_PAGE_SIZE,
+     "WINBOND W25Q128",
+     MV_WINBOND_MANF_ID,
+     MV_W25Q128_DEVICE_ID,
+     MV_W25Q128_MAX_SPI_FREQ,
+     MV_W25Q128_MAX_FAST_SPI_FREQ,
+     MV_W25Q128_FAST_READ_DUMMY_BYTES
+    },
+    /* WINBOND M25Q256 SPI flash, 16MB, 512 sectors of 64K each */
+     {
+      MV_W25Q_WREN_CMND_OPCD,
+      MV_W25Q_WRDI_CMND_OPCD,
+      MV_W25Q_RDID_CMND_OPCD,
+      MV_W25Q_RDSR_CMND_OPCD,
+      MV_W25Q_WRSR_CMND_OPCD,
+      MV_W25Q_READ_4B_CMND_OPCD,
+      MV_W25Q_FAST_RD_4B_CMND_OPCD,
+      MV_W25Q_PP_CMND_OPCD,
+      MV_W25Q_SE_CMND_OPCD,
+      MV_W25Q_BE_CMND_OPCD,
+      MV_W25Q_RES_CMND_OPCD,
+      MV_SFLASH_NO_SPECIFIC_OPCD,    /* power save not supported */
+      MV_W25Q_EN4B_CMND_OPCD,
+      MV_W25Q256_SECTOR_SIZE,
+      MV_W25Q256_SECTOR_NUMBER,
+      MV_W25Q_PAGE_SIZE,
+      "WINBOND W25Q256",
+      MV_WINBOND_MANF_ID,
+      MV_W25Q256_DEVICE_ID,
+      MV_W25Q256_MAX_SPI_FREQ,
+      MV_W25Q256_MAX_FAST_SPI_FREQ,
+      MV_W25Q256_FAST_READ_DUMMY_BYTES
     }
 };
 
@@ -638,7 +713,7 @@
 	mvOsPrintf("%s ERROR: Failed to get the SFlash ID!\n", __func__);
 	return ret;
     }
-
+printk("MTL SPI device manf = 0x%X, dev = 0x%X\n", manf, dev);
     /* loop over the whole table and look for the appropriate SFLASH */
     for (indx = 0; indx < MV_ARRAY_SIZE(sflash); indx++) {
 	if ((manf == sflash[indx].manufacturerId) && (dev == sflash[indx].deviceId)) {
@@ -662,20 +737,24 @@
     /* Enable 4B address mode in case needed and supported */
     flSize = (pFlinfo->sectorSize  * pFlinfo->sectorNumber);
     if (flSize > _16M) {
-	cmndLength = 5;
-    	if (sflash[pFlinfo->index].opcdEn4B != MV_SFLASH_NO_SPECIFIC_OPCD) {
-		mvOsPrintf("%s: Enabling 4-Byte address mode\n", __func__);
+    	cmndLength = 5;
+    	if (sflash[pFlinfo->index].opcdEn4B != MV_SFLASH_NO_SPECIFIC_OPCD)
+    	{
+			mvOsPrintf("%s: Enabling 4-Byte address mode\n", __func__);
 
-	 	cmd = sflash[pFlinfo->index].opcdEn4B;
+			cmd = sflash[pFlinfo->index].opcdEn4B;
 
-		/*  mvSpiWriteThenWrite(MV_SFLASH_RES_CMND_LENGTH) */
-		ret = mvSysSflashCommandSet(NULL, &cmd, 1, SYS_SFLASH_TRANS_ATOMIC);
-		
-		if (ret != MV_OK)
-			return ret;
-	}
-    } else
-	cmndLength = 4;
+			/*  mvSpiWriteThenWrite(MV_SFLASH_RES_CMND_LENGTH) */
+			ret = mvSysSflashCommandSet(NULL, &cmd, 1, SYS_SFLASH_TRANS_ATOMIC);
+
+			if (ret != MV_OK)
+				return ret;
+    	}
+    }
+    else
+    {
+    	cmndLength = 4;
+    }
 
     /* Set the SPI frequency to the MAX allowed for the device for best performance */
     /*  mvSpiBaudRateSet(sflash[pFlinfo->index].spiMaxFreq) */
@@ -1297,7 +1376,52 @@
 	    DB(mvOsPrintf("%s WARNING: Invaild parameter WP region!\n", __func__);)
 	    return MV_BAD_PARAM;
 	}
-    } else {
+    }else if (pFlinfo->manufacturerId == MV_WINBOND_MANF_ID) {
+	/* check if the manufacturer is SPANSION then the WP is 4bits */
+	switch (wpRegion) {
+	case MV_WP_NONE:
+	    wpMask = MV_W25Q_STATUS_BP_NONE;
+	    break;
+
+	case MV_WP_UPR_1OF128:
+	    DB(mvOsPrintf("%s WARNING: Invaild option for this flash chip!\n", __func__);)
+	    return MV_NOT_SUPPORTED;
+
+	case MV_WP_UPR_1OF64:
+	    wpMask = MV_W25Q_STATUS_BP_1_OF_64;
+	    break;
+
+	case MV_WP_UPR_1OF32:
+	    wpMask = MV_W25Q_STATUS_BP_1_OF_32;
+	    break;
+
+	case MV_WP_UPR_1OF16:
+	    wpMask = MV_W25Q_STATUS_BP_1_OF_16;
+	    break;
+
+	case MV_WP_UPR_1OF8:
+	    wpMask = MV_W25Q_STATUS_BP_1_OF_8;
+	    break;
+
+	case MV_WP_UPR_1OF4:
+	    wpMask = MV_W25Q_STATUS_BP_1_OF_4;
+	    break;
+
+	case MV_WP_UPR_1OF2:
+	    wpMask = MV_W25Q_STATUS_BP_1_OF_2;
+	    break;
+
+	case MV_WP_ALL:
+	    wpMask = MV_W25Q_STATUS_BP_ALL;
+	    break;
+
+
+	default:
+	    DB(mvOsPrintf("%s WARNING: Invaild parameter WP region!\n", __func__);)
+	    return MV_BAD_PARAM;
+	}
+    }
+	else {
 	DB(mvOsPrintf("%s WARNING: Invaild parameter Manufacturer ID!\n", __func__);)
 	return MV_BAD_PARAM;
     }
@@ -1467,7 +1591,48 @@
 	    DB(mvOsPrintf("%s WARNING: Unidentified WP region in h/w!\n", __func__);)
 	    return MV_BAD_VALUE;
 	}
-    } else {
+    } 
+	else if (pFlinfo->manufacturerId == MV_WINBOND_MANF_ID) {
+		/* Check if the chip is an SPANSION flash; then WP supports only 3 bits */
+	switch ((reg & MV_W25Q_STATUS_REG_WP_MASK)) {
+	case MV_W25Q_STATUS_BP_NONE:
+	    *pWpRegion = MV_WP_NONE;
+	    break;
+
+	case MV_W25Q_STATUS_BP_1_OF_64:
+	    *pWpRegion = MV_WP_UPR_1OF64;
+	    break;
+
+	case MV_W25Q_STATUS_BP_1_OF_32:
+	    *pWpRegion = MV_WP_UPR_1OF32;
+	    break;
+
+	case MV_W25Q_STATUS_BP_1_OF_16:
+	    *pWpRegion = MV_WP_UPR_1OF16;
+	    break;
+
+	case MV_W25Q_STATUS_BP_1_OF_8:
+	    *pWpRegion = MV_WP_UPR_1OF8;
+	    break;
+
+	case MV_W25Q_STATUS_BP_1_OF_4:
+	    *pWpRegion = MV_WP_UPR_1OF4;
+	    break;
+
+	case MV_W25Q_STATUS_BP_1_OF_2:
+	    *pWpRegion = MV_WP_UPR_1OF2;
+	    break;
+
+	case MV_W25Q_STATUS_BP_ALL:
+	    *pWpRegion = MV_WP_ALL;
+	    break;
+
+	default:
+	    DB(mvOsPrintf("%s WARNING: Unidentified WP region in h/w!\n", __func__);)
+	    return MV_BAD_VALUE;
+	}
+    }
+	else {
 	DB(mvOsPrintf("%s WARNING: Invaild parameter Manufacturer ID!\n", __func__);)
 	return MV_BAD_PARAM;
     }
diff --git a/arch/arm/plat-feroceon/mv_hal/sflash/mvSFlashSpec.h b/arch/arm/plat-feroceon/mv_hal/sflash/mvSFlashSpec.h
index b999e5b..030a303 100755
--- a/arch/arm/plat-feroceon/mv_hal/sflash/mvSFlashSpec.h
+++ b/arch/arm/plat-feroceon/mv_hal/sflash/mvSFlashSpec.h
@@ -189,6 +189,10 @@
 #define     MV_MX25L6405_MAX_SPI_FREQ           20000000    /* 20MHz */
 #define     MV_MX25L6405_MAX_FAST_SPI_FREQ      50000000    /* 50MHz */
 #define     MV_MX25L6405_FAST_READ_DUMMY_BYTES   1
+#define     MV_MX25L12805E_DEVICE_ID             0x2018
+#define     MV_MX25L12805E_MAX_SPI_FREQ          20000000    /* 20MHz */
+#define     MV_MX25L12805E_MAX_FAST_SPI_FREQ     50000000    /* 50MHz */
+#define     MV_MX25L12805E_FAST_READ_DUMMY_BYTES 1
 #define     MV_MX25L25635E_DEVICE_ID             0x2019
 #define     MV_MX25L25635E_MAX_SPI_FREQ          20000000    /* 20MHz */
 #define     MV_MX25L25635E_MAX_FAST_SPI_FREQ     50000000    /* 50MHz */
@@ -199,10 +203,12 @@
 #define     MV_MX25L1605_SECTOR_SIZE            0x10000 /* 64K */
 #define     MV_MX25L3205_SECTOR_SIZE            0x10000 /* 64K */
 #define     MV_MX25L6405_SECTOR_SIZE            0x10000 /* 64K */
+#define     MV_MX25L12805E_SECTOR_SIZE          0x10000 /* 64K */
 #define     MV_MX25L25635E_SECTOR_SIZE          0x10000 /* 64K */
 #define     MV_MX25L1605_SECTOR_NUMBER          32
 #define     MV_MX25L3205_SECTOR_NUMBER          64
 #define     MV_MX25L6405_SECTOR_NUMBER          128
+#define     MV_MX25L12805E_SECTOR_NUMBER        256
 #define     MV_MX25L25635E_SECTOR_NUMBER        512
 
 #define		MV_MXIC_PAGE_SIZE			        0x100   /* 256 byte */
@@ -274,6 +280,76 @@
 #define     	MV_S25FL_STATUS_BP_1_OF_2           	(0x07 << MV_SFLASH_STATUS_REG_WP_OFFSET)
 #define     	MV_S25FL_STATUS_BP_ALL              	(0x0F << MV_SFLASH_STATUS_REG_WP_OFFSET)
 
+
+
+/************************************/
+/* WINBOND W25Qxxx Device Specific  */
+/************************************/
+
+/* Manufacturer IDs and Device IDs for SFLASHs supported by the driver */
+#define		MV_WINBOND_MANF_ID					0xEF
+#define     MV_W25Q128_DEVICE_ID                0x4018
+#define     MV_W25Q128_MAX_SPI_FREQ             20000000    /* 20MHz */
+#define     MV_W25Q128_MAX_FAST_SPI_FREQ        50000000    /* 50MHz */
+#define     MV_W25Q128_FAST_READ_DUMMY_BYTES    1
+
+#define     MV_W25Q256_DEVICE_ID                0x4019
+#define     MV_W25Q256_MAX_SPI_FREQ             20000000    /* 20MHz */
+#define     MV_W25Q256_MAX_FAST_SPI_FREQ        50000000    /* 50MHz */
+#define     MV_W25Q256_FAST_READ_DUMMY_BYTES    1
+
+/* Sector Sizes and population per device model*/
+#define     MV_W25Q128_SECTOR_SIZE              0x10000 /* 64K */
+#define     MV_W25Q128_SECTOR_NUMBER            256
+#define	    MV_W25Q_PAGE_SIZE					0x100   /* 256 byte */
+
+#define     MV_W25Q256_SECTOR_SIZE              0x10000 /* 64K */
+#define     MV_W25Q256_SECTOR_NUMBER            512		/* In the datasheet named block instead of sector */
+#define		MV_W25Q_FAST_RD_4B_CMND_OPCD		0x0C	/* Fast Read */
+#define		MV_W25Q_READ_4B_CMND_OPCD		    0x03	/* Sequential Read */
+#define	    MV_W25Q_PAGE_SIZE					0x100   /* 256 byte */
+
+#define     MV_W25Q256_SECTOR_SIZE              0x10000 /* 64K */
+#define     MV_W25Q256_SECTOR_NUMBER            512		/* In the datasheet named block instead of sector */
+#define		MV_W25Q_FAST_RD_4B_CMND_OPCD		0x0C	/* Fast Read */
+#define		MV_W25Q_READ_4B_CMND_OPCD		    0x03	/* Sequential Read */
+#define		MV_W25Q_WREN_CMND_OPCD			    0x06	/* Write Enable */
+#define		MV_W25Q_WRDI_CMND_OPCD			    0x04	/* Write Disable */
+#define		MV_W25Q_RDID_CMND_OPCD			    0x9F	/* Read ID */
+#define		MV_W25Q_RDSR_CMND_OPCD			    0x05	/* Read Status Register */
+#define		MV_W25Q_WRSR_CMND_OPCD			    0x01	/* Write Status Register */
+#define		MV_W25Q_READ_CMND_OPCD			    0x03	/* Sequential Read */
+#define		MV_W25Q_FAST_RD_CMND_OPCD		    0x0B	/* Fast Read */
+#define		MV_W25Q_PP_CMND_OPCD			    0x02	/* Page Program */
+#define		MV_W25Q_SE_CMND_OPCD			    0xD8	/* Sector Erase */
+#define		MV_W25Q_BE_CMND_OPCD			    0xC7	/* Bulk Erase */
+#define		MV_W25Q_RES_CMND_OPCD			    0xAB	/* Read Electronic Signature */
+#define		MV_W25Q_EN4B_CMND_OPCD			    0xB7	/* Enable 4-byte mode */
+
+/* Status Register Write Protect Bit Masks - 3bits */
+#define		MV_W25Q_STATUS_REG_WP_MASK	        (0x07 << MV_SFLASH_STATUS_REG_WP_OFFSET)
+#define     MV_W25Q_STATUS_BP_NONE              (0x00 << MV_SFLASH_STATUS_REG_WP_OFFSET)
+#define     MV_W25Q_STATUS_BP_1_OF_64           (0x01 << MV_SFLASH_STATUS_REG_WP_OFFSET)
+#define     MV_W25Q_STATUS_BP_1_OF_32           (0x02 << MV_SFLASH_STATUS_REG_WP_OFFSET)
+#define     MV_W25Q_STATUS_BP_1_OF_16           (0x03 << MV_SFLASH_STATUS_REG_WP_OFFSET)
+#define     MV_W25Q_STATUS_BP_1_OF_8            (0x04 << MV_SFLASH_STATUS_REG_WP_OFFSET)
+#define     MV_W25Q_STATUS_BP_1_OF_4            (0x05 << MV_SFLASH_STATUS_REG_WP_OFFSET)
+#define     MV_W25Q_STATUS_BP_1_OF_2            (0x06 << MV_SFLASH_STATUS_REG_WP_OFFSET)
+#define     MV_W25Q_STATUS_BP_ALL               (0x07 << MV_SFLASH_STATUS_REG_WP_OFFSET)
+
+/* Status Register Write Protect Bit Masks - 4bits */
+#define		MV_W25Q256_STATUS_REG_WP_MASK	        (0x0F << MV_SFLASH_STATUS_REG_WP_OFFSET)
+#define     MV_W25Q256_STATUS_BP_NONE              (0x00 << MV_SFLASH_STATUS_REG_WP_OFFSET)
+#define     MV_W25Q256_STATUS_BP_1_OF_128          (0x03 << MV_SFLASH_STATUS_REG_WP_OFFSET)
+#define     MV_W25Q256_STATUS_BP_1_OF_64           (0x04 << MV_SFLASH_STATUS_REG_WP_OFFSET)
+#define     MV_W25Q256_STATUS_BP_1_OF_32           (0x05 << MV_SFLASH_STATUS_REG_WP_OFFSET)
+#define     MV_W25Q256_STATUS_BP_1_OF_16           (0x06 << MV_SFLASH_STATUS_REG_WP_OFFSET)
+#define     MV_W25Q256_STATUS_BP_1_OF_8            (0x07 << MV_SFLASH_STATUS_REG_WP_OFFSET)
+#define     MV_W25Q256_STATUS_BP_1_OF_4            (0x08 << MV_SFLASH_STATUS_REG_WP_OFFSET)
+#define     MV_W25Q256_STATUS_BP_1_OF_2            (0x09 << MV_SFLASH_STATUS_REG_WP_OFFSET)
+#define     MV_W25Q256_STATUS_BP_ALL               (0x0C << MV_SFLASH_STATUS_REG_WP_OFFSET)
+
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/kernel/timeconst.pl b/kernel/timeconst.pl
index eb51d76..0461239 100644
--- a/kernel/timeconst.pl
+++ b/kernel/timeconst.pl
@@ -370,7 +370,7 @@
 	}
 
 	@val = @{$canned_values{$hz}};
-	if (!defined(@val)) {
+	if (!@val) {
 		@val = compute_values($hz);
 	}
 	output($hz, @val);