Add laser enabling code.
- Change pon type to PON_NONE in board config since WDMPON is P2P PON.
- If the driver mode is not changed, return OK in IOCTL handler.
- Add code to enable TX laser. We use BOARD_GPP_PON_XVR_TX which is
currently not used for the chip 88F6601 A0.
Change-Id: Idcc35bb25bf41c8677984b227e5b937979edf10e
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 7367ea4..7e8ca8c 100755
--- a/arch/arm/mach-feroceon-kw2/kw2_family/boardEnv/mvBoardEnvSpec.c
+++ b/arch/arm/mach-feroceon-kw2/kw2_family/boardEnv/mvBoardEnvSpec.c
@@ -1204,6 +1204,7 @@
/* {{MV_BOARD_GPP_CLASS devClass, MV_U8 gppPinNum}} */
/*{BOARD_GPP_PON_XVR_TX, 17, 0},*/
/*{BOARD_GPP_PON_XVR_TX_IND, 24, 0},*/
+ {BOARD_GPP_PON_XVR_TX, 21, 1},
{BOARD_GPP_PON_XVR_TX_POWER, 37, 1},
};
@@ -1278,7 +1279,7 @@
.switchInfoNum = 0,
/* PON configuration. */
- .ponConfigValue = BOARD_GPON_CONFIG,
+ .ponConfigValue = BOARD_PON_NONE,
/* TDM configuration */
/* We hold a different configuration array for each possible slic that
diff --git a/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/core/epon/eponOnuAlrm.c b/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/core/epon/eponOnuAlrm.c
index 3bf0dae..9c670b9 100755
--- a/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/core/epon/eponOnuAlrm.c
+++ b/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/core/epon/eponOnuAlrm.c
@@ -228,6 +228,7 @@
{
linkStatusCallback(MV_TRUE);
}
+ onuPonTxLaserOn(MV_TRUE);
}
onuEponPreviousAlarm = onuEponCurrentAlarmState;
diff --git a/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/core/epon/eponOnuIsr.c b/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/core/epon/eponOnuIsr.c
index 6242d8d..ede0df9 100755
--- a/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/core/epon/eponOnuIsr.c
+++ b/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/core/epon/eponOnuIsr.c
@@ -1164,6 +1164,11 @@
{
linkStatusCallback(MV_TRUE);
}
+ /* TODO(kedong): Enable laser when the RX is ready. Need to be cleaned up
+ * when wavelength selection code is ready.
+ */
+ onuPonTxLaserOn(MV_TRUE);
+
#endif
return(MV_OK);
diff --git a/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/core/epon/eponOnuMngr.c b/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/core/epon/eponOnuMngr.c
index c889c69..9327c8f 100755
--- a/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/core/epon/eponOnuMngr.c
+++ b/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/core/epon/eponOnuMngr.c
@@ -629,6 +629,10 @@
if (onuEponForceTxDownStateGet(0) != MV_TRUE)
linkStatusCallback(MV_FALSE);
}
+ /* TODO(kedong): Disable laser when the RX is gone. Need to be cleaned up
+ * when wavelength selection code is ready.
+ */
+ onuPonTxLaserOn(MV_FALSE);
if (onuEponDbOnuHoldoverStateGet() != ONU_HOLDOVER_NOT_ACTIVE)
{
diff --git a/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/perf/ponOnuLnxKsMI.c b/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/perf/ponOnuLnxKsMI.c
index 34e3840..60a9653 100755
--- a/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/perf/ponOnuLnxKsMI.c
+++ b/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/perf/ponOnuLnxKsMI.c
@@ -249,13 +249,25 @@
goto ioctlErr;
}
ponDev.drvMode = drvMode;
-
} else {
+ ret = get_user(drvMode, (E_PonDriverMode __user *)arg);
+ if (ret != 0) {
+ mvPonPrint(PON_PRINT_ERROR, PON_API_MODULE,
+ "ERROR: (%s:%d) copy from user failed\n", __FILE_DESC__, __LINE__);
+ goto ioctlErr;
+ }
+ if (ponDev.drvMode == drvMode) {
+ mvPonPrint(PON_PRINT_INFO, PON_API_MODULE,
+ "INFO: (%s:%d) Same driver mode, no change\n",
+ __FILE_DESC__, __LINE__);
+ ret = 0;
+ } else {
/* Switching between EPON-GPON modes requires reboot initiated by US application */
- mvPonPrint(PON_PRINT_ERROR, PON_API_MODULE,
- "ERROR: (%s:%d) command MVPON_IOCTL_INIT is not supported in this mode\n",
- __FILE_DESC__, __LINE__);
- goto ioctlErr;
+ mvPonPrint(PON_PRINT_ERROR, PON_API_MODULE,
+ "ERROR: (%s:%d) command MVPON_IOCTL_INIT is not supported in this mode\n",
+ __FILE_DESC__, __LINE__);
+ goto ioctlErr;
+ }
}
break;
diff --git a/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/plat/ponOnuBoard.c b/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/plat/ponOnuBoard.c
index a9f877e..3e6cc2b 100755
--- a/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/plat/ponOnuBoard.c
+++ b/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/plat/ponOnuBoard.c
@@ -850,4 +850,41 @@
return(status);
}
+/*******************************************************************************
+**
+** onuPonTxLaserOn
+** ____________________________________________________________________________
+**
+** DESCRIPTION: The function turns ON/OFF TX laser using MPP
+**
+** PARAMETERS: MV_BOOL on - MV_TRUE - turn TX laser ON, othervise OFF
+**
+** OUTPUTS: None
+**
+** RETURNS: MV_OK or error
+**
+*******************************************************************************/
+MV_STATUS onuPonTxLaserOn(MV_BOOL on)
+{
+ MV_STATUS status;
+ MV_U32 gpioGroup, gpioMask;
+ MV_U8 gpioPolarity;
+ MV_U32 trans_value = 0;
+ MV_U32 board_id = mvBoardIdGet();
+
+ if (GFLT200_ID == board_id) {
+ PON_GPIO_GET(BOARD_GPP_PON_XVR_TX, gpioGroup, gpioMask);
+ if (gpioMask == PON_GPIO_NOT_USED)
+ return(MV_ERROR);
+ gpioPolarity = mvBoardGpioPolarityGet(BOARD_GPP_PON_XVR_TX);
+ if ((on && gpioPolarity) || (!on && !gpioPolarity))
+ status = mvGppValueSet(gpioGroup, gpioMask, gpioMask);
+ else
+ status = mvGppValueSet(gpioGroup, gpioMask, 0);
+ transmit_up = on;
+ }
+
+ return(MV_OK);
+}
+
#endif /* PON_FPGA */
diff --git a/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/plat/ponOnuBoard.h b/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/plat/ponOnuBoard.h
index 1231b55..ec15f89 100755
--- a/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/plat/ponOnuBoard.h
+++ b/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/plat/ponOnuBoard.h
@@ -146,6 +146,7 @@
void onuPonPatternBurstTimerHndl(void);
MV_STATUS onuPonTxPowerOn(MV_BOOL txOn);
MV_STATUS onuPonTxPowerControlInit(void);
+MV_STATUS onuPonTxLaserOn(MV_BOOL txOn);
#endif /* PON_FPGA */