kernel/prism: add support for PON-ID PLOAM message

Change-Id: I07adb3deab5bf839440c78d51655e7ace5e83130
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 391bc35..0ac16db 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
@@ -3403,3 +3403,217 @@
   return(onuGponDb_s.onuGponGenTbl_s.onuLinkStatusCallback);
 }
 
+/*******************************************************************************
+**
+**  onuGponDbPONIdTypeABitGet
+**  ____________________________________________________________________________
+**
+**  DESCRIPTION: The function returns PON Id type A bit (from PON-ID maintenance)
+**
+**  PARAMETERS:  None
+**
+**  OUTPUTS:     None
+**
+**  RETURNS:     ponIdTypeABit
+**
+*******************************************************************************/
+MV_U8 onuGponDbPONIdTypeABitGet(void)
+{
+  return(onuGponDb_s.onuGponOperParamsTbl_s.onuGponPONIdTypeABit);
+}
+
+/*******************************************************************************
+**
+**  onuGponDbPONIdTypeABitSet
+**  ____________________________________________________________________________
+**
+**  DESCRIPTION: The function sets PON Id type A bit (from PON-ID maintenance)
+**               in the database
+**
+**  PARAMETERS:  MV_U8 ponIdTypeABit
+**
+**  OUTPUTS:     None
+**
+**  RETURNS:     MV_OK
+**
+*******************************************************************************/
+MV_STATUS onuGponDbPONIdTypeABitSet(MV_U8 ponIdTypeABit)
+{
+  onuGponDb_s.onuGponOperParamsTbl_s.onuGponPONIdTypeABit = ponIdTypeABit;
+
+  return(MV_OK);
+}
+
+/*******************************************************************************
+**
+**  onuGponDbPONIdClassTypeGet
+**  ____________________________________________________________________________
+**
+**  DESCRIPTION: The function returns PONIdClassType (from PON-ID maintenance)
+**
+**  PARAMETERS:  None
+**
+**  OUTPUTS:     None
+**
+**  RETURNS:     ponIdClassType
+**
+*******************************************************************************/
+MV_U8 onuGponDbPONIdClassTypeGet(void)
+{
+  return(onuGponDb_s.onuGponOperParamsTbl_s.onuGponPONIdClassType);
+}
+
+/*******************************************************************************
+**
+**  onuGponDbPONIdClassTypeGet
+**  ____________________________________________________________________________
+**
+**  DESCRIPTION: The function returns PONIdClassType (from PON-ID maintenance)
+**
+**  PARAMETERS:  None
+**
+**  OUTPUTS:     None
+**
+**  RETURNS:     ponIdClassType
+**
+*******************************************************************************/
+MV_U8* onuGponDbPONIdClassTypeStrGet(void)
+{
+  MV_U8   *ponIdClassTypeText[] = {"Class A", "Class B","Class B+","Class C","Class C+","reserved"};
+  MV_U8   *ret;
+
+  if (onuGponDb_s.onuGponOperParamsTbl_s.onuGponPONIdClassType > ONU_GPON_PON_ID_TYPE_CLASS_MAX)
+  {
+    ret = ponIdClassTypeText[ONU_GPON_PON_ID_TYPE_CLASS_MAX];
+  }
+  else
+  {
+    ret = ponIdClassTypeText[onuGponDb_s.onuGponOperParamsTbl_s.onuGponPONIdClassType];
+  }
+  return ret;
+}
+
+/*******************************************************************************
+**
+**  onuGponDbPONIdClassTypeSet
+**  ____________________________________________________________________________
+**
+**  DESCRIPTION: The function sets PONIdClassType (from PON-ID maintenance)
+**               in the database
+**
+**  PARAMETERS:  MV_U8 ponIdClassType
+**
+**  OUTPUTS:     None
+**
+**  RETURNS:     MV_OK
+**
+*******************************************************************************/
+MV_STATUS onuGponDbPONIdClassTypeSet(MV_U8 ponIdClassType)
+{
+  MV_STATUS ret = MV_OK;
+
+  if (ponIdClassType > ONU_GPON_PON_ID_TYPE_CLASS_MAX)
+  {
+    ret = MV_BAD_PARAM;
+  }
+  else
+  {
+    onuGponDb_s.onuGponOperParamsTbl_s.onuGponPONIdClassType = ponIdClassType;
+  }
+
+  return(ret);
+}
+
+/*******************************************************************************
+**
+**  onuGponDbPONIdBytesInfoGet
+**  ____________________________________________________________________________
+**
+**  DESCRIPTION: The function returns PONId bytes info array (from PON-ID maintenance)
+**
+**  PARAMETERS:  None
+**
+**  OUTPUTS:     None
+**
+**  RETURNS:     ponIdBytesInfo
+**
+*******************************************************************************/
+void onuGponDbPONIdBytesInfoGet(MV_U8 *ponIdBytesInfo)
+{
+  memcpy(ponIdBytesInfo, &(onuGponDb_s.onuGponOperParamsTbl_s.onuGponPONIdBytesInfo[0]), ONU_GPON_PON_ID_BYTES_LEN);
+}
+
+/*******************************************************************************
+**
+**  onuGponDbPONIdBytesInfoSet
+**  ____________________________________________________________________________
+**
+**  DESCRIPTION: The function sets PONId bytes info array (from PON-ID maintenance)
+**               in the database
+**
+**  PARAMETERS:  MV_U8* ponIdBytesInfo
+**
+**  OUTPUTS:     None
+**
+**  RETURNS:     MV_OK
+**
+*******************************************************************************/
+MV_STATUS onuGponDbPONIdBytesInfoSet(MV_U8 *ponIdBytesInfo)
+{
+  MV_STATUS ret = MV_OK;
+
+  if (ponIdBytesInfo == NULL)
+  {
+    ret = MV_BAD_PARAM;
+  }
+  else
+  {
+    memcpy(&(onuGponDb_s.onuGponOperParamsTbl_s.onuGponPONIdBytesInfo[0]), ponIdBytesInfo, ONU_GPON_PON_ID_BYTES_LEN);
+  }
+
+  return(ret);
+}
+
+/*******************************************************************************
+**
+**  onuGponDbPONIdOpticalLevelGet
+**  ____________________________________________________________________________
+**
+**  DESCRIPTION: The function returns PONId Tx Optical Level (from PON-ID maintenance)
+**
+**  PARAMETERS:  None
+**
+**  OUTPUTS:     None
+**
+**  RETURNS:     onuGponPONIdTxOpticalLevel
+**
+*******************************************************************************/
+MV_U16 onuGponDbPONIdOpticalLevelGet(void)
+{
+  return(onuGponDb_s.onuGponOperParamsTbl_s.onuGponPONIdTxOpticalLevel);
+}
+
+/*******************************************************************************
+**
+**  onuGponDbPONIdOpticalLevelSet
+**  ____________________________________________________________________________
+**
+**  DESCRIPTION: The function sets PONId Tx Optical Level (from PON-ID maintenance)
+**               in the database
+**
+**  PARAMETERS:  MV_U16 ponIdTxOpticalLevel
+**
+**  OUTPUTS:     None
+**
+**  RETURNS:     MV_OK
+**
+*******************************************************************************/
+MV_STATUS onuGponDbPONIdOpticalLevelSet(MV_U16 ponIdTxOpticalLevel)
+{
+  MV_STATUS ret = MV_OK;
+
+  onuGponDb_s.onuGponOperParamsTbl_s.onuGponPONIdTxOpticalLevel = ponIdTxOpticalLevel;
+
+  return(ret);
+}
+
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 535b6ea..5c9ae9f 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
@@ -88,11 +88,14 @@
 /******************************************************************************/
 
 /* GPON Definitions */
-#define ONU_GPON_SN_LEN          (8)
-#define ONU_GPON_PASS_LEN        (10)
-#define ONU_GPON_PREAMBLE_LEN    (3)
-#define ONU_GPON_DELIMITER_LEN   (3)
-#define ONU_GPON_MSG_LEN         (3)
+#define ONU_GPON_SN_LEN                 (8)
+#define ONU_GPON_PASS_LEN               (10)
+#define ONU_GPON_PREAMBLE_LEN           (3)
+#define ONU_GPON_DELIMITER_LEN          (3)
+#define ONU_GPON_MSG_LEN                (3)
+#define ONU_GPON_MSG_LEN                (3)
+#define ONU_GPON_PON_ID_BYTES_LEN       (7)
+#define ONU_GPON_PON_ID_TYPE_CLASS_MAX  (4)
 
 /* Enums
 ------------------------------------------------------------------------------*/
@@ -200,6 +203,10 @@
   MV_BOOL onuGponGemPortSave[GPON_ONU_MAX_GEM_PORTS];

   MV_U8   onuGponPassword[ONU_GPON_PASS_LEN];       /* ONU password */
   MV_U16  onuGponReiSeqNum;                         /* ONU REI sequence number */
+  MV_U8   onuGponPONIdTypeABit;                     /* PON-ID Type A-bit */
+  MV_U8   onuGponPONIdClassType;                    /* PON-ID Class type */
+  MV_U8   onuGponPONIdBytesInfo[ONU_GPON_PON_ID_BYTES_LEN];               /* PON-ID Bytes info*/
+  MV_U16  onuGponPONIdTxOpticalLevel;               /* PON-ID Type TxOpticalLevel */
 }S_OnuGponOperParamsTbl;
 
 /**************************************/
@@ -372,6 +379,15 @@
 MV_U32    onuGponDbTcontResetGet(void);
 MV_VOID   onuGponDbGemRestoreSet(MV_BOOL gem_restore);

 MV_BOOL   onuGponDbGemRestoreGet(MV_VOID);

+MV_U8     onuGponDbPONIdTypeABitGet(void);
+MV_STATUS onuGponDbPONIdTypeABitSet(MV_U8 ponIdTypeABit);
+MV_U8     onuGponDbPONIdClassTypeGet(void);
+MV_U8*    onuGponDbPONIdClassTypeStrGet(void);
+MV_STATUS onuGponDbPONIdClassTypeSet(MV_U8 ponIdClassType);
+void      onuGponDbPONIdBytesInfoGet(MV_U8 *ponIdBytesInfo);
+MV_STATUS onuGponDbPONIdBytesInfoSet(MV_U8 *ponIdBytesInfo);
+MV_U16    onuGponDbPONIdOpticalLevelGet(void);
+MV_STATUS onuGponDbPONIdOpticalLevelSet(MV_U16 ponIdTxOpticalLevel);
 
 /* ONU GPON BW Alloc param table API functions */
 MV_STATUS onuGponDbBwAllocSet(MV_U32 entry, MV_U32 allocId, MV_BOOL valid);
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 773fa42..73ee3ff 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
@@ -1001,6 +1001,7 @@
 
   onuGponGenTbl_p->onuGponStateAndEventTbl[ONU_GPON_EVENT_MSG_SN_MASK][state] = (GPONFUNCPTR)onuGponPonMngSerialNumberMaskMsg;
   onuGponGenTbl_p->onuGponStateAndEventTbl[ONU_GPON_EVENT_MSG_EXT_BURST_LEN][state] = (GPONFUNCPTR)onuGponPonMngExtBurstMsg;
+  onuGponGenTbl_p->onuGponStateAndEventTbl[ONU_GPON_EVENT_MSG_PON_ID][state] = (GPONFUNCPTR)onuGponPonMngPonIdMaintenanceMsg;
   onuGponGenTbl_p->onuGponStateAndEventTbl[ONU_GPON_EVENT_MSG_ASSIGN_ONU_ID][state] = (GPONFUNCPTR)onuGponPonMngOnuIdMsg;
   onuGponGenTbl_p->onuGponStateAndEventTbl[ONU_GPON_EVENT_MSG_DIS_SN][state]        = (GPONFUNCPTR)onuGponPonMngDisSnMsg;
   onuGponGenTbl_p->onuGponStateAndEventTbl[ONU_GPON_EVENT_MSG_PHYSICAL_EQUIP_ERR][state] = (GPONFUNCPTR)onuGponPonMngPhyEquErrMsg;
@@ -1014,6 +1015,7 @@
   onuGponGenTbl_p->onuGponStateAndEventTbl[ONU_GPON_EVENT_MSG_DACT_ONU_ID][state]   = (GPONFUNCPTR)onuGponPonMngDactOnuIdMsg;
   onuGponGenTbl_p->onuGponStateAndEventTbl[ONU_GPON_EVENT_MSG_DIS_SN][state]        = (GPONFUNCPTR)onuGponPonMngDisSnMsg;
   onuGponGenTbl_p->onuGponStateAndEventTbl[ONU_GPON_EVENT_MSG_PHYSICAL_EQUIP_ERR][state] = (GPONFUNCPTR)onuGponPonMngPhyEquErrMsg;
+  onuGponGenTbl_p->onuGponStateAndEventTbl[ONU_GPON_EVENT_MSG_PON_ID][state] = (GPONFUNCPTR)onuGponPonMngPonIdMaintenanceMsg;
 
   /* ONU GPON OPERATION STATE 05 */
   /* --------------------------- */
@@ -1032,6 +1034,7 @@
   onuGponGenTbl_p->onuGponStateAndEventTbl[ONU_GPON_EVENT_MSG_REQ_KEY][state]       = (GPONFUNCPTR)onuGponPonMngReqKeyMsg;
   onuGponGenTbl_p->onuGponStateAndEventTbl[ONU_GPON_EVENT_MSG_BER_INTERVAL][state]  = (GPONFUNCPTR)onuGponPonMngBerIntervalMsg;
   onuGponGenTbl_p->onuGponStateAndEventTbl[ONU_GPON_EVENT_MSG_KEY_SWITCH_TIME][state] = (GPONFUNCPTR)onuGponPonMngKeySwitchTimeMsg;
+  onuGponGenTbl_p->onuGponStateAndEventTbl[ONU_GPON_EVENT_MSG_PON_ID][state] = (GPONFUNCPTR)onuGponPonMngPonIdMaintenanceMsg;
 
   /* ONU GPON POPUP STATE 06 */
   /* ----------------------- */
diff --git a/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/core/gpon/gponOnuMngr.c b/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/core/gpon/gponOnuMngr.c
index 139e964..3fae138 100755
--- a/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/core/gpon/gponOnuMngr.c
+++ b/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/core/gpon/gponOnuMngr.c
@@ -108,7 +108,8 @@
   "PST MESSAGE",        

   "BER INTERVAL",

   "KEY SWITCHING TIME", 

-  "EXTENDED BURST LENGTH"

+  "EXTENDED BURST LENGTH",

+  "PON-ID MAINTENANCE"

 };

 

 extern spinlock_t onuPonIrqLock;

@@ -376,7 +377,7 @@
   if ((onuId == ONU_GPON_BROADCAST_ONU_ID) || (onuId == appOnuId))

   {

     /* Handle valid messages */

-    if ((msgId >= ONU_GPON_DS_MSG_OVERHEAD) && (msgId <= ONU_GPON_DS_MSG_EXT_BURST_LEN))

+    if ((msgId >= ONU_GPON_DS_MSG_OVERHEAD) && (msgId <= ONU_GPON_DS_MSG_LAST))

     {

       /* Call the relevant event function */

       ptrFunc = (onuGponGenTbl_p->onuGponStateAndEventTbl[(msgId)][onuState]);

diff --git a/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/core/gpon/gponOnuMngr.h b/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/core/gpon/gponOnuMngr.h
index 876cf5b..e971604 100755
--- a/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/core/gpon/gponOnuMngr.h
+++ b/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/core/gpon/gponOnuMngr.h
@@ -169,6 +169,7 @@
 void      onuGponPonMngPstMsg(MV_U8 onuId, MV_U8 msgId, MV_U8 *msgData);

 void      onuGponPonMngKeySwitchTimeMsg(MV_U8 onuId, MV_U8 msgId, MV_U8 *msgData);

 void      onuGponPonMngExtBurstMsg(MV_U8 onuId, MV_U8 msgId, MV_U8 *msgData);

+void      onuGponPonMngPonIdMaintenanceMsg(MV_U8 onuId, MV_U8 msgId, MV_U8 *msgData);

 

 void      onuGponPonMngTimerT01Hndl(unsigned long data);

 void      onuGponPonMngTimerT02Hndl(unsigned long data);

diff --git a/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/core/gpon/gponOnuMngrStateMachine.c b/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/core/gpon/gponOnuMngrStateMachine.c
index fdaa147..fece1ec 100755
--- a/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/core/gpon/gponOnuMngrStateMachine.c
+++ b/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/core/gpon/gponOnuMngrStateMachine.c
@@ -2597,6 +2597,53 @@
 
 /*******************************************************************************
 **
+**  onuGponPonMngPonIdMaintenanceMsg
+**  ____________________________________________________________________________
+**
+**  DESCRIPTION: The function is called when PON-ID maintenance message is received
+**               (message 21)
+**
+**  PARAMETERS:  MV_U8 onuId
+**               MV_U8 msgId
+**               MV_U8 *msgData
+**
+**  OUTPUTS:     None
+**
+**  RETURNS:     None
+**
+*******************************************************************************/
+void onuGponPonMngPonIdMaintenanceMsg(MV_U8 onuId, MV_U8 msgId, MV_U8 *msgData)
+{
+  MV_U16	 ponIdTxOpticalLevel;
+  MV_U8		 ponIdTypeAbit;
+  MV_U8		 ponIdClassType;
+  MV_U8		 ponIdBytes[ONU_GPON_PON_ID_BYTES_LEN];
+
+  ponIdTypeAbit = (msgData[0] & 0x80)  >> 7;
+  onuGponDbPONIdTypeABitSet(ponIdTypeAbit);
+
+  ponIdClassType = (msgData[0] & 0x70) >> 4;
+  onuGponDbPONIdClassTypeSet(ponIdClassType);
+
+  memcpy(&(ponIdBytes[0]), &(msgData[1]), ONU_GPON_PON_ID_BYTES_LEN);
+  onuGponDbPONIdBytesInfoSet(&(ponIdBytes[0]));
+
+  ponIdTxOpticalLevel = (MV_U16)(msgData[8] << 8) + (MV_U16)(msgData[9]);
+  onuGponDbPONIdOpticalLevelSet(ponIdTxOpticalLevel);
+
+#ifdef MV_GPON_DEBUG_PRINT
+  mvPonPrint(PON_PRINT_DEBUG, PON_SM_MODULE,
+             "DEBUG: (%s:%d) PON-ID message rcv with ponIdTypeAbit: %d ponIdClassType: 0x%02x ponIdTxOpticalLevel: 0x%04x ponIdBytes[0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x]\n",
+			 __FILE_DESC__, __LINE__,
+			 ponIdTypeAbit, ponIdClassType, ponIdTxOpticalLevel,
+			 ponIdBytes[0], ponIdBytes[1], ponIdBytes[2], ponIdBytes[3],
+			 ponIdBytes[4], ponIdBytes[5], ponIdBytes[6]
+			 );
+#endif /* MV_GPON_DEBUG_PRINT */
+}
+
+/*******************************************************************************
+**
 **  onuGponPonMngTimerT01Hndl
 **  ____________________________________________________________________________
 **
diff --git a/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/core/gpon/gponOnuPm.c b/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/core/gpon/gponOnuPm.c
index 4c78db0..492e1bd 100755
--- a/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/core/gpon/gponOnuPm.c
+++ b/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/core/gpon/gponOnuPm.c
@@ -440,7 +440,7 @@
   rxPloamPm->rxMsgTotalPloamCounter = g_OnuGponSwPm.rxMsgTotalPloamCounter;
 
   for (numOfMsgIdIndex = ONU_GPON_DS_MSG_OVERHEAD;
-       numOfMsgIdIndex <= ONU_GPON_DS_MSG_EXT_BURST_LEN;
+       numOfMsgIdIndex <= ONU_GPON_DS_MSG_LAST;
        numOfMsgIdIndex++)
   {
     rxPloamPm->rxMsgIdPloamCounter[numOfMsgIdIndex] = g_OnuGponSwPm.rxMsgIdPloamCounter[numOfMsgIdIndex];
diff --git a/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/perf/gpon/gponOnuLnxKsUI.c b/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/perf/gpon/gponOnuLnxKsUI.c
index cf45075..0587885 100755
--- a/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/perf/gpon/gponOnuLnxKsUI.c
+++ b/arch/arm/plat-feroceon/mv_drivers_lsp/mv_pon/perf/gpon/gponOnuLnxKsUI.c
@@ -143,6 +143,10 @@
   MV_U32  intDelay,eqdDb,eqdAsic,fDelay;
   MV_U32  snMsg[3], idleMsg[3];
   MV_U8   *mchText[] = {"NO MATCH","MATCH "};
+  MV_U16  ponIdTxOpticalLevel;
+  MV_U8   ponIdTypeAbit;
+  MV_U8   ponIdClassType;
+  MV_U8   ponIdBytes[ONU_GPON_PON_ID_BYTES_LEN];
   int     off = 0;
 
                     onuGponDbSerialNumGet(serialNumber);
@@ -174,6 +178,13 @@
                     onuGponDbSnMsgGet(snMsg);
                     onuGponDbIdleMsgGet(idleMsg);
 
+  // PON-ID Manufacturer info
+  ponIdTypeAbit = onuGponDbPONIdTypeABitGet();
+  ponIdClassType = onuGponDbPONIdClassTypeGet();
+  onuGponDbPONIdBytesInfoGet(&(ponIdBytes[0]));
+  ponIdTxOpticalLevel = onuGponDbPONIdOpticalLevelGet();
+
+
   off += mvOsSPrintf(buf+off, "\n");
   off += mvOsSPrintf(buf+off, "ONT Full Information:\n");
   off += mvOsSPrintf(buf+off, "---------------------\n");
@@ -210,6 +221,13 @@
   off += mvOsSPrintf(buf+off, "Debug Mode:                    %s\n", boolText[onuGponPonMngDebugModeGet()]);
   off += mvOsSPrintf(buf+off, "Overhead Manual Mode:          %s\n", boolText[onuGponPonMngOverheadManualModeGet()]);
 
+  off += mvOsSPrintf(buf+off, "ponIdTypeAbit:                 %d\n", ponIdTypeAbit);
+  off += mvOsSPrintf(buf+off, "ponIdClassType:                %s (%d)\n", onuGponDbPONIdClassTypeStrGet(), ponIdClassType);
+  off += mvOsSPrintf(buf+off, "ponIdTxOpticalLevel:           0x%02X\n", ponIdTxOpticalLevel);
+  off += mvOsSPrintf(buf+off, "ponIdBytes:                    [0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x]\n",
+                                                              ponIdBytes[0], ponIdBytes[1], ponIdBytes[2], ponIdBytes[3],
+                                                              ponIdBytes[4], ponIdBytes[5], ponIdBytes[6]);
+
   return(off);
 }
 
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 c43260a..83e37e1 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
@@ -981,13 +981,13 @@
 }
 
 /*******************************************************************************
-**  **  906
+**
 **  onuPonTxLaserOn
 **  ____________________________________________________________________________
 **
 **  DESCRIPTION: The function turns ON/OFF TX laser using MPP
 **
-**  PARAMETERS:  MV_BOOL on - MV_TRUE - turn TX laser ON, othervise OFF
+**  PARAMETERS:  MV_BOOL on - MV_TRUE - turn TX laser ON, otherwise OFF
 **
 **  OUTPUTS:     None
 **
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 ff48f05..321c32a 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
@@ -178,6 +178,7 @@
 
 MV_STATUS onuP2PDbXvrBurstEnablePolaritySet(MV_U32 val);
 MV_U32    onuP2PDbXvrBurstEnablePolarityGet(void);
+void      onuPonShutDownCallbackFunc(MV_U32 state);
 
 #endif /* PON_FPGA */
 
diff --git a/arch/arm/plat-feroceon/mv_hal/pon/mvPonOnuDefines.h b/arch/arm/plat-feroceon/mv_hal/pon/mvPonOnuDefines.h
index 9620b1d..aee9016 100755
--- a/arch/arm/plat-feroceon/mv_hal/pon/mvPonOnuDefines.h
+++ b/arch/arm/plat-feroceon/mv_hal/pon/mvPonOnuDefines.h
@@ -206,7 +206,8 @@
 #define ONU_GPON_DS_MSG_BER_INTERVAL		(0x12)

 #define ONU_GPON_DS_MSG_KEY_SWITCH_TIME		(0x13)

 #define ONU_GPON_DS_MSG_EXT_BURST_LEN		(0x14)

-#define ONU_GPON_DS_MSG_LAST			(0x14)

+#define ONU_GPON_DS_MSG_PON_ID     			(0x15)

+#define ONU_GPON_DS_MSG_LAST				(ONU_GPON_DS_MSG_PON_ID)

 

 /* Upstream */

 #define ONU_GPON_US_MSG_SN_ONU                 (0x01)

@@ -265,6 +266,7 @@
 #define ONU_GPON_EVENT_MSG_BER_INTERVAL		(ONU_GPON_DS_MSG_BER_INTERVAL)

 #define ONU_GPON_EVENT_MSG_KEY_SWITCH_TIME	(ONU_GPON_DS_MSG_KEY_SWITCH_TIME)

 #define ONU_GPON_EVENT_MSG_EXT_BURST_LEN	(ONU_GPON_DS_MSG_EXT_BURST_LEN)

+#define ONU_GPON_EVENT_MSG_PON_ID	(ONU_GPON_DS_MSG_PON_ID)

 

 /* Alarms */

 #define ONU_GPON_EVENT_ALM_GEN_BASE		(ONU_GPON_ALARM_GEN_BASE)

diff --git a/arch/arm/plat-feroceon/mv_hal/pon/mvPonOnuMac.h b/arch/arm/plat-feroceon/mv_hal/pon/mvPonOnuMac.h
index 5fd3961..6827cd2 100755
--- a/arch/arm/plat-feroceon/mv_hal/pon/mvPonOnuMac.h
+++ b/arch/arm/plat-feroceon/mv_hal/pon/mvPonOnuMac.h
@@ -188,7 +188,7 @@
 #define GPON_BURST_THRESHOLD                (0x4E20)            /* 20000 bytes */
 
 #define MAC_LAST_UPSTREAM_PLOAM             (ONU_GPON_US_MSG_ACK)
-#define MAC_LAST_DOWNSTREAM_PLOAM           (ONU_GPON_DS_MSG_EXT_BURST_LEN)
+#define MAC_LAST_DOWNSTREAM_PLOAM           (ONU_GPON_DS_MSG_LAST)
 
 /* SW FIFO parameters */
 #define GPON_SW_FIFO_SIZE                   (1024)              /* Size of SW FIFO pool for PLOAM messages */