diff src/g23m-gsm/mm/mm_pei.c @ 1:fa8dc04885d8

src/g23m-*: import from Magnetite
author Mychaela Falconia <falcon@freecalypso.org>
date Fri, 16 Oct 2020 06:25:50 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/g23m-gsm/mm/mm_pei.c	Fri Oct 16 06:25:50 2020 +0000
@@ -0,0 +1,980 @@
+/*
++-----------------------------------------------------------------------------
+|  Project :
+|  Modul   :
++-----------------------------------------------------------------------------
+|  Copyright 2002 Texas Instruments Berlin, AG
+|                 All rights reserved.
+|
+|                 This file is confidential and a trade secret of Texas
+|                 Instruments Berlin, AG
+|                 The receipt of or possession of this file does not convey
+|                 any rights to reproduce or disclose its contents or to
+|                 manufacture, use, or sell anything it may describe, in
+|                 whole, or in part, without the specific written consent of
+|                 Texas Instruments Berlin, AG.
++-----------------------------------------------------------------------------
+|  Purpose :  This module implements the process body interface
+|             for the entity MM of the mobile station.
++-----------------------------------------------------------------------------
+*/
+
+
+#ifndef MM_PEI_C
+#define MM_PEI_C
+
+#define ENTITY_MM
+
+
+/*==== INCLUDES ===================================================*/
+#if defined (NEW_FRAME)
+
+#include <string.h>
+#include <stdlib.h>
+#include <stddef.h>
+#include "typedefs.h"
+#include "pcm.h"
+#include "pconst.cdg"
+#include "mconst.cdg"
+#include "message.h"
+#include "ccdapi.h"
+#include "vsi.h"
+#include "custom.h"
+#include "gsm.h"
+#include "prim.h"
+#include "cnf_mm.h"
+#include "mon_mm.h"
+#include "pei.h"
+#include "tok.h"
+#include "mm.h"
+#include "mm_em.h"
+
+#else
+
+#include <string.h>
+#include <stdlib.h>
+#include <stddef.h>
+#include "stddefs.h"
+#include "pcm.h"
+#include "pconst.cdg"
+#include "mconst.cdg"
+#include "message.h"
+#include "ccdapi.h"
+#include "custom.h"
+#include "gsm.h"
+#include "prim.h"
+#include "cnf_mm.h"
+#include "mon_mm.h"
+#include "vsi.h"
+#include "pei.h"
+#include "tok.h"
+#include "mm.h"
+#include "mm_em.h"
+
+#endif
+
+/*==== TEST =====================================================*/
+
+/*==== EXPORT =====================================================*/
+#if defined (NEW_FRAME)
+#ifdef TI_PS_HCOMM_CHANGE
+#else
+GLOBAL T_HANDLE  hCommMMI = VSI_ERROR; /* MMI  Communication  */
+GLOBAL T_HANDLE  hCommCC  = VSI_ERROR; /* CC   Communication  */
+GLOBAL T_HANDLE  hCommSS  = VSI_ERROR; /* SS   Communication  */
+GLOBAL T_HANDLE  hCommSMS = VSI_ERROR; /* SMS  Communication  */
+GLOBAL T_HANDLE  hCommSIM = VSI_ERROR; /* SIM  Communication  */
+GLOBAL T_HANDLE  hCommDL  = VSI_ERROR; /* DL   Communication  */
+GLOBAL T_HANDLE  hCommRR  = VSI_ERROR; /* RR   Communication  */
+#endif /* TI_PS_HCOMM_CHANGE */
+#ifdef GPRS
+GLOBAL T_HANDLE  hCommGMM = VSI_ERROR; /* GMM  Communication  */
+#endif
+GLOBAL T_HANDLE  mm_handle;
+#else
+#ifdef TI_PS_HCOMM_CHANGE
+#else
+GLOBAL T_VSI_CHANDLE  hCommMMI = VSI_ERROR; /* MMI  Communication  */
+GLOBAL T_VSI_CHANDLE  hCommCC  = VSI_ERROR; /* CC   Communication  */
+GLOBAL T_VSI_CHANDLE  hCommSS  = VSI_ERROR; /* SS   Communication  */
+GLOBAL T_VSI_CHANDLE  hCommSMS = VSI_ERROR; /* SMS  Communication  */
+GLOBAL T_VSI_CHANDLE  hCommSIM = VSI_ERROR; /* SIM  Communication  */
+GLOBAL T_VSI_CHANDLE  hCommDL  = VSI_ERROR; /* DL   Communication  */
+GLOBAL T_VSI_CHANDLE  hCommRR  = VSI_ERROR; /* RR   Communication  */
+#endif /* TI_PS_HCOMM_CHANGE */
+GLOBAL T_VSI_THANDLE  mm_act_handle = VSI_ERROR;
+#endif /* NEW_FRAME */
+T_MM_DATA mm_data_base;
+
+/*==== PRIVATE ====================================================*/
+
+LOCAL void pei_not_supported (void *);
+
+/*==== VARIABLES ==================================================*/
+
+#ifdef _SIMULATION_
+LOCAL BOOL              first_access = TRUE;
+#endif /* _SIMULATION_ */
+LOCAL T_MONITOR         mm_mon;
+
+/*==== FUNCTIONS ==================================================*/
+
+#ifdef  GPRS
+LOCAL const T_FUNC mmgmm_table[] = {
+  MAK_FUNC_0 (mm_mmgmm_reg_req       , MMGMM_REG_REQ          ), /* 0x00 */
+  MAK_FUNC_0 (mm_mmgmm_nreg_req      , MMGMM_NREG_REQ         ), /* 0x01 */
+  MAK_FUNC_0 (mm_mmgmm_net_req       , MMGMM_NET_REQ          ), /* 0x02 */
+  MAK_FUNC_0 (mm_mmgmm_plmn_res      , MMGMM_PLMN_RES         ), /* 0x03 */
+  MAK_FUNC_0 (mm_mmgmm_plmn_mode_req , MMGMM_PLMN_MODE_REQ    ), /* 0x04 */
+  MAK_FUNC_0 (mm_mmgmm_auth_rej_req  , MMGMM_AUTH_REJ_REQ     ), /* 0x05 */
+  MAK_FUNC_0 (mm_mmgmm_cm_establish_res,MMGMM_CM_ESTABLISH_RES), /* 0x06 */
+  MAK_FUNC_0 (mm_mmgmm_attach_started_req, MMGMM_ATTACH_STARTED_REQ),
+  MAK_FUNC_0 (mm_mmgmm_attach_acc_req, MMGMM_ATTACH_ACC_REQ   ), /* 0x08 */
+  MAK_FUNC_0 (mm_mmgmm_attach_rej_req, MMGMM_ATTACH_REJ_REQ   ), /* 0x09 */
+  MAK_FUNC_0 (mm_mmgmm_detach_started_req, MMGMM_DETACH_STARTED_REQ),
+  MAK_FUNC_0 (mm_mmgmm_start_t3212_req, MMGMM_START_T3212_REQ ), /* 0x0b */
+  MAK_FUNC_0 (mm_mmgmm_cm_emergency_res,MMGMM_CM_EMERGENCY_RES), /* 0x0c */
+  MAK_FUNC_0 (mm_mmgmm_allowed_req   ,  MMGMM_ALLOWED_REQ     ), /* 0x0d */
+  MAK_FUNC_0 (pei_not_supported      ,  MMGMM_TRIGGER_REQ     )  /* 0x0e */ 
+};
+#else
+LOCAL const T_FUNC mmreg_table[] = {
+  MAK_FUNC_0 (reg_mmr_reg_req        , MMR_REG_REQ            ),
+  MAK_FUNC_0 (reg_mmr_nreg_req       , MMR_NREG_REQ           ),
+  MAK_FUNC_0 (reg_mmr_net_req        , MMR_NET_REQ            ),
+  MAK_FUNC_0 (reg_mmr_plmn_res       , MMR_PLMN_RES           ),
+  MAK_FUNC_0 (reg_mmr_plmn_mode_req  , MMR_PLMN_MODE_REQ      )
+};
+#endif
+
+LOCAL const T_FUNC mmcm_table[] = {
+  MAK_FUNC_0 (mm_mmcm_establish_req  , MMCM_ESTABLISH_REQ     ), /* 0x00 */
+  MAK_FUNC_S (mm_mmcm_data_req       , MMCM_DATA_REQ          ), /* 0x01 */
+  MAK_FUNC_0 (mm_mmcm_release_req    , MMCM_RELEASE_REQ       ), /* 0x02 */
+  MAK_FUNC_0 (mm_mmcm_reestablish_req, MMCM_REESTABLISH_REQ   ), /* 0x03 */
+  MAK_FUNC_0 (mm_mmcm_prompt_res     , MMCM_PROMPT_RES        ), /* 0x04 */
+  MAK_FUNC_0 (mm_mmcm_prompt_rej     , MMCM_PROMPT_REJ        )  /* 0x05 */
+};
+
+LOCAL const T_FUNC mmss_table[] = {
+  MAK_FUNC_0 (mm_mmss_establish_req  , MMSS_ESTABLISH_REQ     ),
+  MAK_FUNC_0 (mm_mmss_release_req    , MMSS_RELEASE_REQ       ),
+  MAK_FUNC_S (mm_mmss_data_req       , MMSS_DATA_REQ          )
+};
+
+LOCAL const T_FUNC mmsms_table[] = {
+  MAK_FUNC_0 (mm_mmsms_establish_req , MMSMS_ESTABLISH_REQ    ),
+  MAK_FUNC_0 (mm_mmsms_release_req   , MMSMS_RELEASE_REQ      ),
+  MAK_FUNC_S (mm_mmsms_data_req      , MMSMS_DATA_REQ         )
+};
+
+LOCAL const T_FUNC sim_table[] = {
+  MAK_FUNC_0 (reg_sim_read_cnf       , SIM_READ_CNF           ), /* 0x00 */
+  MAK_FUNC_0 (pei_not_supported      , SIM_UPDATE_CNF         ),
+  MAK_FUNC_0 (pei_not_supported      , SIM_READ_RECORD_CNF    ),
+  MAK_FUNC_N (pei_not_supported      , 0                      ),
+  MAK_FUNC_0 (pei_not_supported      , SIM_UPDATE_RECORD_CNF  ),
+  MAK_FUNC_N (pei_not_supported      , 0                      ),
+  MAK_FUNC_N (pei_not_supported      , 0                      ),
+  MAK_FUNC_N (pei_not_supported      , 0                      ),
+  MAK_FUNC_0 (pei_not_supported      , SIM_INCREMENT_CNF      ),
+  MAK_FUNC_0 (pei_not_supported      , SIM_VERIFY_PIN_CNF     ),
+  MAK_FUNC_0 (pei_not_supported      , SIM_CHANGE_PIN_CNF     ),
+  MAK_FUNC_0 (pei_not_supported      , SIM_DISABLE_PIN_CNF    ),
+  MAK_FUNC_0 (pei_not_supported      , SIM_ENABLE_PIN_CNF     ),
+  MAK_FUNC_0 (pei_not_supported      , SIM_UNBLOCK_CNF        ),
+  MAK_FUNC_0 (reg_sim_auth_cnf       , SIM_AUTHENTICATION_CNF ),
+  MAK_FUNC_0 (pei_not_supported      , SIM_MMI_INSERT_IND     ),
+  MAK_FUNC_0 (reg_sim_mm_insert_ind  , SIM_MM_INSERT_IND      ),
+  MAK_FUNC_0 (reg_sim_remove_ind     , SIM_REMOVE_IND         ),
+  MAK_FUNC_0 (reg_sim_sync_cnf       , SIM_SYNC_CNF           ),
+  MAK_FUNC_0 (pei_not_supported      , SIM_ACTIVATE_CNF       ),
+  MAK_FUNC_0 (pei_not_supported      , SIM_SMS_INSERT_IND     ), /* 0x14 */
+  MAK_FUNC_0 (pei_not_supported      , SIM_TOOLKIT_IND        ), /* 0x15 */
+  MAK_FUNC_0 (pei_not_supported      , SIM_TOOLKIT_CNF        ), /* 0x16 */
+  MAK_FUNC_0 (pei_not_supported      , SIM_ACTIVATE_IND       ), /* 0x17 */
+  MAK_FUNC_0 (reg_sim_mm_info_ind    , SIM_MM_INFO_IND        ), /* 0x18 */
+  MAK_FUNC_0 (pei_not_supported      , SIM_ACCESS_CNF         ), /* 0x19 */
+  MAK_FUNC_0 (reg_sim_file_upd_ind   , SIM_FILE_UPDATE_IND    )  /* 0x1a */
+};
+
+#ifdef FF_EM_MODE
+LOCAL const T_FUNC em_ul_table[] = {
+  MAK_FUNC_N (pei_not_supported                  , 0                     ), /* 0x3E00 */
+  MAK_FUNC_N (pei_not_supported                  , 0                     ), /* 0x3E01 */
+  MAK_FUNC_N (pei_not_supported                  , 0                     ), /* 0x3E02 */
+  MAK_FUNC_N (pei_not_supported                  , 0                     ), /* 0x3E03 */
+  MAK_FUNC_N (pei_not_supported                  , 0                     ), /* 0x3E04 */
+  MAK_FUNC_N (pei_not_supported                  , 0                     ), /* 0x3E05 */
+  MAK_FUNC_N (pei_not_supported                  , 0                     ), /* 0x3E06 */
+  MAK_FUNC_N (pei_not_supported                  , 0                     ), /* 0x3E07 */
+  MAK_FUNC_N (pei_not_supported                  , 0                     ), /* 0x3E08 */
+  MAK_FUNC_N (pei_not_supported                  , 0                     ), /* 0x3E09 */
+  MAK_FUNC_0 (mm_em_dl_event_req                 , EM_DL_EVENT_REQ       ), /* 0x3E0A */
+  MAK_FUNC_N (pei_not_supported                  , 0                     ), /* 0x3E0B */
+  MAK_FUNC_0 (mm_em_mm_event_req                 , EM_MM_EVENT_REQ       )  /* 0x3E0C */
+};
+
+  LOCAL const T_FUNC em_dl_table[] = {
+    MAK_FUNC_N (pei_not_supported                , 0                     ), /* 0x7E00 */
+    MAK_FUNC_N (pei_not_supported                , 0                     ), /* 0x7E01 */
+    MAK_FUNC_N (pei_not_supported                , 0                     ), /* 0x7E02 */
+    MAK_FUNC_N (pei_not_supported                , 0                     ), /* 0x7E03 */
+    MAK_FUNC_N (pei_not_supported                , 0                     ), /* 0x7E04 */
+    MAK_FUNC_N (pei_not_supported                , 0                     ), /* 0x7E05 */
+    MAK_FUNC_N (pei_not_supported                , 0                     ), /* 0x7E06 */
+    MAK_FUNC_N (pei_not_supported                , 0                     ), /* 0x7E07 */
+    MAK_FUNC_N (pei_not_supported                , 0                     ), /* 0x7E08 */
+    MAK_FUNC_N( pei_not_supported                , 0                     ), /* 0x7E09 */
+    MAK_FUNC_N( pei_not_supported                , 0                     ), /* 0x7E0A */
+    MAK_FUNC_0( pei_not_supported                , EM_DATA_IND           ), /* 0x7E0B */
+  };
+#endif /* FF_EM_MODE */
+
+LOCAL const T_FUNC rr_table[] = {
+  MAK_FUNC_0 (mm_rr_abort_ind            , RR_ABORT_IND           ),
+  MAK_FUNC_0 (mm_rr_activate_cnf         , RR_ACTIVATE_CNF        ),
+  MAK_FUNC_0 (mm_rr_activate_ind         , RR_ACTIVATE_IND        ),
+  MAK_FUNC_S (for_rr_data_ind            , RR_DATA_IND            ),
+  MAK_FUNC_0 (mm_rr_establish_cnf        , RR_ESTABLISH_CNF       ),
+  MAK_FUNC_0 (mm_rr_establish_ind        , RR_ESTABLISH_IND       ),
+  MAK_FUNC_N (pei_not_supported          , 0                      ),
+  MAK_FUNC_0 (mm_rr_release_ind          , RR_RELEASE_IND         ),
+  MAK_FUNC_0 (mm_rr_sync_ind             , RR_SYNC_IND            )
+#if defined (FF_EOTD) AND defined (REL99)
+  ,
+  MAK_FUNC_0 (mm_rr_rrlp_start_ind       , RR_RRLP_START_IND      ),
+  MAK_FUNC_0 (mm_rr_rrlp_stop_ind        , RR_RRLP_STOP_IND       )
+#else
+  ,
+  MAK_FUNC_N (pei_not_supported          , 0                      ),
+  MAK_FUNC_N (pei_not_supported          , 0                      )
+#endif /* (FF_EOTD) AND defined (REL99) */
+};
+
+LOCAL const T_FUNC mdl_table[] = {
+  MAK_FUNC_0 (mm_mdl_error_ind       , MDL_ERROR_IND          )
+};
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)              MODULE  : MM_PEI              |
+| STATE   : code                       ROUTINE : pei_primitive       |
++--------------------------------------------------------------------+
+
+  PURPOSE : Process protocol specific primitive.
+
+*/
+
+#if defined (NEW_FRAME)
+LOCAL SHORT pei_primitive (void * ptr)
+#else
+GLOBAL T_PEI_RETURN pei_primitive (T_PRIM * prim)
+#endif
+{
+  GET_INSTANCE_DATA;
+#if defined (NEW_FRAME)
+  T_PRIM *prim = ptr;
+#endif
+  /*
+   *          |     |     |     |     |
+   *        MMREG  MMCM  MMSS  MMSMS  EM          UPLINK
+   *          |     |     |     |     |
+   *      +---v-----v-----v-----v-----v---+
+   *      |                               |
+   *      |            MM                 |
+   *      |                               |
+   *      +---^---------^--------^--------+
+   *          |         |        |
+   *         SIM        RR      MDL                DOWNLINK
+   *          |         |        |
+   *
+   */
+
+  TRACE_FUNCTION ("pei_primitive()");
+  if (prim NEQ NULL)
+  {
+    ULONG            opc = prim->custom.opc;
+    USHORT           n;
+    const T_FUNC    *table;
+
+#if defined (NEW_FRAME)
+    VSI_PPM_REC ((T_PRIM_HEADER*)prim, __FILE__, __LINE__);
+#endif
+
+    PTRACE_IN (opc);
+
+    switch (SAP_NR(opc))
+    {
+      case SAP_NR(MMCM_UL):  table =   mmcm_table; n = TAB_SIZE ( mmcm_table); break;
+      case SAP_NR(MMSS_UL):  table =   mmss_table; n = TAB_SIZE ( mmss_table); break;
+      case SAP_NR(MMSMS_UL): table =  mmsms_table; n = TAB_SIZE (mmsms_table); break;
+      case SAP_NR(SIM_UL):   table =    sim_table; n = TAB_SIZE (  sim_table); break;
+#ifdef FF_EM_MODE
+      case   EM_Ul:   table =  em_ul_table; n = TAB_SIZE (em_ul_table); break;
+#endif /* FF_EM_MODE */
+      case SAP_NR(RR_DL):    table =     rr_table; n = TAB_SIZE (   rr_table); break;
+      case SAP_NR(MDL_UL):   table =    mdl_table; n = TAB_SIZE (  mdl_table); break;
+#ifdef GPRS
+      case  MMGMM_UL: table =  mmgmm_table; n = TAB_SIZE (mmgmm_table); break;
+#else
+      case SAP_NR(MMREG_UL): table =  mmreg_table; n = TAB_SIZE (mmreg_table); break;
+#endif
+#ifdef FF_EM_MODE
+      case  EM_Dl:  table = em_dl_table;  n = TAB_SIZE (em_dl_table); break;
+#endif /* FF_EM_MODE */
+      default       : table =         NULL; n = 0;                      break;
+    }
+
+    if (table != NULL )
+    {
+      if (PRIM_NR(opc) < n)
+      {
+        table += PRIM_NR(opc);
+#ifdef PALLOC_TRANSITION
+        P_SDU(prim) = table->soff ? (T_sdu*) (((char*)&prim->data) + table->soff) : 0;
+#ifndef NO_COPY_ROUTING
+        P_LEN(prim) = table->size + sizeof (T_PRIM_HEADER);
+#endif /* NO_COPY_ROUTING */
+#endif /* PALLOC_TRANSITION */
+        JUMP (table->func) (P2D(prim));
+
+        while (ENTITY_DATA->use_stored_entries)
+        {
+          ENTITY_DATA->use_stored_entries = FALSE;
+          mm_use_entry();
+        }
+
+      }
+      else
+      {
+        pei_not_supported (P2D(prim));
+      }
+      return PEI_OK;
+    }
+
+#ifdef GSM_ONLY
+    PFREE (P2D(prim))
+    return PEI_ERROR;
+#else
+    if (opc & SYS_MASK)
+      vsi_c_primitive (VSI_CALLER prim);
+    else
+    {
+      PFREE (P2D(prim))
+      return PEI_ERROR;
+    }
+#endif
+  }
+  return PEI_OK;
+}
+
+#if defined (NEW_FRAME)
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)              MODULE  : MM_PEI              |
+| STATE   : code                       ROUTINE : mm_pei_primitive    |
++--------------------------------------------------------------------+
+
+  PURPOSE : used to restart a stored primitive.
+
+*/
+GLOBAL void mm_pei_primitive (T_PRIM * prim)
+{
+  pei_primitive (prim);
+}
+#endif
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (8410)              MODULE  : SMS_PEI             |
+| STATE   : code                       ROUTINE : pei_not_supported   |
++--------------------------------------------------------------------+
+
+  PURPOSE : An unsupported primitive is received.
+
+*/
+
+static void pei_not_supported (void *data)
+{
+  TRACE_FUNCTION ("pei_not_supported()");
+
+  PFREE (data);
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)              MODULE  : MM_PEI              |
+| STATE   : code                       ROUTINE : pei_init            |
++--------------------------------------------------------------------+
+
+  PURPOSE : Initialize Protocol Stack Entity
+
+*/
+
+#if defined (NEW_FRAME)
+LOCAL SHORT pei_init (T_HANDLE handle)
+#else
+GLOBAL T_PEI_RETURN pei_init (void)
+#endif
+{
+#if defined (NEW_FRAME)
+  mm_handle = handle;
+#endif
+
+  TRACE_FUNCTION ("pei_init()");
+
+#ifdef TI_PS_HCOMM_CHANGE
+  if (!cl_hcom_all_handles_open())
+  {
+    return PEI_ERROR;
+  }
+#else /* for hCommHandles backward compatibility */
+  if (hCommMMI < VSI_OK)
+  {
+    /*
+     * Open MMI (Layer 4)
+     */
+
+    if ((hCommMMI = vsi_c_open (VSI_CALLER ACI_NAME)) < VSI_OK)
+      return PEI_ERROR;
+  }
+
+  if (hCommCC < VSI_OK)
+  {
+    if ((hCommCC = vsi_c_open (VSI_CALLER CC_NAME)) < VSI_OK)
+      return PEI_ERROR;
+  }
+
+  if (hCommSS < VSI_OK)
+  {
+    if ((hCommSS = vsi_c_open (VSI_CALLER SS_NAME)) < VSI_OK)
+      return PEI_ERROR;
+  }
+
+  if (hCommSMS < VSI_OK)
+  {
+    if ((hCommSMS = vsi_c_open (VSI_CALLER SMS_NAME)) < VSI_OK)
+      return PEI_ERROR;
+  }
+
+  if (hCommRR < VSI_OK)
+  {
+    if ((hCommRR = vsi_c_open (VSI_CALLER RR_NAME)) < VSI_OK)
+      return PEI_ERROR;
+  }
+
+  if (hCommDL < VSI_OK)
+  {
+    if ((hCommDL = vsi_c_open (VSI_CALLER DL_NAME)) < VSI_OK)
+      return PEI_ERROR;
+  }
+
+  if (hCommSIM < VSI_OK)
+  {
+    if ((hCommSIM = vsi_c_open (VSI_CALLER SIM_NAME)) < VSI_OK)
+      return PEI_ERROR;
+  }
+#endif /* TI_PS_HCOMM_CHANGE */
+#ifdef GPRS
+  if (hCommGMM < VSI_OK)
+  {
+    if ((hCommGMM = vsi_c_open (VSI_CALLER GMM_NAME)) < VSI_OK)
+      return PEI_ERROR;
+  }
+#endif
+
+  /*
+   *  Open Timer Resources
+   */
+
+  mm_init_mm_data ();
+
+#ifdef FF_EM_MODE
+  em_init_mm_event_trace();
+#endif /* FF_EM_MODE */
+
+#if defined (OPTION_TIMER)
+  tim_init_timer ();
+#endif
+  ccd_init ();
+
+  return PEI_OK;
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)              MODULE  : MM_PEI              |
+| STATE   : code                       ROUTINE : pei_timeout         |
++--------------------------------------------------------------------+
+
+  PURPOSE : Process timeout
+
+*/
+#if defined (NEW_FRAME)
+LOCAL SHORT pei_timeout (USHORT index)
+{
+  GET_INSTANCE_DATA;
+
+  tim_exec_timeout (index);
+
+  while (ENTITY_DATA->use_stored_entries)
+  {
+    ENTITY_DATA->use_stored_entries = FALSE;
+    mm_use_entry();
+  }
+
+  return PEI_OK;
+}
+
+#else
+
+GLOBAL T_PEI_RETURN pei_timeout (T_VSI_THANDLE handle)
+{
+  /*
+   * Set Timeout Flag according
+   * to timer handle
+   */
+  if (mm_act_handle NEQ handle)
+    tim_set_timeout_flag (handle, &t_flag);
+
+#ifdef OPTION_TIMEOUT_SYNC
+  while (t_flag)
+  {
+    /*
+     * Handle Timeouts
+     */
+    tim_handle_timeout (&t_flag);
+  }
+#else
+  vsi_c_awake (VSI_CALLER_SINGLE);
+#endif
+
+  while (ENTITY_DATA->use_stored_entries)
+  {
+    ENTITY_DATA->use_stored_entries = FALSE;
+    mm_use_entry();
+  }
+
+  return PEI_OK;
+}
+#endif
+
+#ifdef _SIMULATION_
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)              MODULE  : MM_PEI              |
+| STATE   : code                       ROUTINE : pei_exit            |
++--------------------------------------------------------------------+
+
+  PURPOSE : Close Resources and terminate
+
+*/
+#if defined (NEW_FRAME)
+LOCAL SHORT pei_exit (void)
+#else
+GLOBAL T_PEI_RETURN pei_exit (void)
+#endif
+{
+  TRACE_FUNCTION ("pei_exit()");
+
+  /*
+   * clean up communication
+   */
+#ifdef TI_PS_HCOMM_CHANGE
+#else /* for hCommHandles backward compatibility */
+  vsi_c_close (VSI_CALLER hCommMMI);
+  hCommMMI = VSI_ERROR;
+
+  vsi_c_close (VSI_CALLER hCommCC);
+  hCommCC = VSI_ERROR;
+
+  vsi_c_close (VSI_CALLER hCommSS);
+  hCommSS = VSI_ERROR;
+
+  vsi_c_close (VSI_CALLER hCommSMS);
+  hCommSMS = VSI_ERROR;
+
+  vsi_c_close (VSI_CALLER hCommRR);
+  hCommRR = VSI_ERROR;
+
+  vsi_c_close (VSI_CALLER hCommDL);
+  hCommDL = VSI_ERROR;
+
+  vsi_c_close (VSI_CALLER hCommSIM);
+  hCommSIM = VSI_ERROR;
+#endif /* TI_PS_HCOMM_CHANGE */
+#ifdef GPRS
+  vsi_c_close (VSI_CALLER hCommGMM);
+  hCommGMM = VSI_ERROR;
+#endif
+
+  return PEI_OK;
+}
+#endif /* _SIMULATION_ */
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)              MODULE  : MM_PEI              |
+| STATE   : code                       ROUTINE : pei_config          |
++--------------------------------------------------------------------+
+
+  PURPOSE : Dynamic Configuration
+
+*/
+
+/* Implements Measure#36 */
+#if !defined (NCONFIG)
+LOCAL const KW_DATA kwtab[] = {
+#ifdef OPTION_TIMER
+                   MM_TIMER_SET,        TIMER_SET,
+                   MM_TIMER_RESET,      TIMER_RESET,
+                   MM_TIMER_SPEED_UP,   TIMER_SPEED_UP,
+                   MM_TIMER_SLOW_DOWN,  TIMER_SLOW_DOWN,
+                   MM_TIMER_SUPPRESS,   TIMER_SUPPRESS,
+#endif
+                   MM_T3212_CNT,        T3212_CNT,
+                   MM_USE_STORED_BCCH,  USE_STORED_BCCH,
+                   MM_FFS_RESET_EPLMN,  FFS_RESET_EPLMN,
+                   MM_FFS_READ_EPLMN,   FFS_READ_EPLMN,
+                   MM_FFS_READ_EPLMN_INIT, FFS_READ_EPLMN_INIT,
+                   MM_FFS_WRITE_EPLMN,  FFS_WRITE_EPLMN,
+                   "",                    0
+                  };
+#endif /* (NCONFIG) */
+
+GLOBAL const KW_DATA partab[] = {
+#ifdef OPTION_TIMER
+                   T_REG_NAME,     T_REGISTRATION,
+                   T3210_NAME,     T3210,
+                   T3211_NAME,     T3211,
+                   T3212_NAME,     T3212,
+                   T3213_NAME,     T3213,
+                   T3220_NAME,     T3220,
+                   T3230_NAME,     T3230,
+                   T3240_NAME,     T3240,
+                   T_HPLMN_NAME,   T_HPLMN,
+#ifdef REL99
+                   T3241_NAME,     T3241,
+#endif
+#endif
+                   "",                 0
+                  };
+
+/* Implements Measure#36 */
+#if !defined (NCONFIG)
+#if defined (NEW_FRAME)
+LOCAL SHORT pei_config (T_PEI_CONFIG inString)
+#else
+GLOBAL T_PEI_RETURN pei_config (T_PEI_CONFIG inString,
+                                T_PEI_CONFIG outString)
+#endif
+{
+  GET_INSTANCE_DATA;
+  {
+    char    * s = inString;
+    SHORT     valno;
+    SHORT     keyno;
+    char    * keyw;
+    char    * val [10];
+#if defined (OPTION_TIMER)
+    BOOL      t_man = FALSE;
+    SHORT     t_num;
+    LONG      t_val;
+    UBYTE     t_mod;
+#endif /* #if defined (OPTION_TIMER) */
+
+    TRACE_FUNCTION ("pei_config()");
+
+    TRACE_EVENT (s);
+
+#if defined TM_SPECIAL
+    if (!strcmp (inString, "RESET_2"))
+    {
+      /*
+       * Hardware Reset
+       */
+      csf_hardware_reset_2 ();
+      return PEI_OK;
+    }
+
+    if (!strcmp (inString, "RESET_3"))
+    {
+      /*
+       * Init RF
+       */
+      csf_hardware_reset_3 ();
+      return PEI_OK;
+    }
+#endif /* #if defined TM_SPECIAL */
+
+    tok_init(s);
+
+    /*
+     * Parse next keyword and number of variables
+     */
+    while ((valno = tok_next(&keyw,val)) != TOK_EOCS)
+    {
+      switch ((keyno = tok_key((KW_DATA *)kwtab,keyw)))
+      {
+        case TOK_NOT_FOUND:
+          TRACE_ERROR ("[PEI_CONFIG]: Illegal Keyword");
+          break;
+
+#if defined (OPTION_TIMER)
+        case TIMER_SET:
+          if (valno EQ 2)
+          {
+            t_man = TRUE;
+            t_num = tok_key((KW_DATA *)partab,val[0]);
+            t_mod = TIMER_SET;
+            t_val = atoi(val[1]);
+            if (t_val < 0L)
+              t_val = 0L;
+          }
+          else
+          {
+            TRACE_ERROR ("[PEI_CONFIG]: Wrong Number of Parameters");
+          }
+          break;
+        case TIMER_RESET:
+        case TIMER_SUPPRESS:
+          if (valno == 1)
+          {
+            t_man = TRUE;                          /* Timermanipulation         */
+            t_num = tok_key((KW_DATA *)partab,val[0]);
+            t_mod = (UBYTE)keyno;
+            t_val = 0L;
+          }
+          else
+          {
+            TRACE_ERROR ("[PEI_CONFIG]: Wrong Number of Parameters");
+          }
+          break;
+        case TIMER_SPEED_UP:
+        case TIMER_SLOW_DOWN:
+          if (valno == 2)
+          {
+            t_man = TRUE;
+            t_num = tok_key((KW_DATA *)partab,val[0]);
+            t_mod = (UBYTE)keyno;
+            t_val = atoi(val[1]);
+            if (t_val <= 0L)
+              t_val = 1L;
+          }
+          else
+          {
+            TRACE_ERROR ("[PEI_CONFIG]: Wrong Number of Parameters");
+          }
+          break;
+#endif /* #if defined (OPTION_TIMER) */
+        case T3212_CNT:
+          if (valno == 1)
+            mm_data->t3212_cfg_counter = atoi(val[0]);
+          else
+          {
+            TRACE_ERROR ("[PEI_CONFIG]: Wrong Number of Parameters");
+          }
+          break;
+
+        case USE_STORED_BCCH:
+          mm_data->config_use_stored_bcch = TRUE;
+          TRACE_EVENT ("MS uses stored BCCH lists also with test SIM");
+          break;
+
+        case FFS_RESET_EPLMN:
+          mm_reset_ffs();
+          break;
+
+        case FFS_READ_EPLMN:
+          mm_read_ffs();
+          mm_display_eplmn();
+          break;
+
+        case FFS_READ_EPLMN_INIT:
+          mm_read_ffs_init();
+          break;
+
+        case FFS_WRITE_EPLMN:
+          {
+            UBYTE samplelist[18] ={'S','A','M','P','L','E',' ','L','I','S','T',' ','E','P','L','M','N'};
+            memcpy(mm_data->reg.eqv_plmns.eqv_plmn_list, samplelist, 18);
+            mm_write_eplmn_to_ffs();
+          }
+          break;
+
+        default:
+          break;
+      } /* switch */
+
+#if defined (OPTION_TIMER)
+      /*
+       * If timer manipulation
+       */
+
+      if (t_man)
+      {
+        t_man = FALSE;
+        /*lint -e644 variable may not have been initialized*/
+        if (t_num >= 0)
+          tim_config_timer ( (UBYTE) t_num, t_mod, t_val);
+        else
+        {
+            TRACE_ERROR ("[PEI_CONFIG]: Parameter out of Range");
+        }
+        /*lint +e644 variable may not have been initialized*/
+      } /* if (t_man) */
+#endif /* #if defined (OPTION_TIMER) */
+    } /* while */
+  }
+  return PEI_OK;
+}
+#endif /* (NCONFIG) */
+
+
+#if defined (NEW_FRAME)
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)              MODULE  : MM_PEI              |
+| STATE   : code                       ROUTINE : mm_pei_config       |
++--------------------------------------------------------------------+
+
+  PURPOSE : Dynamic Configuration
+
+*/
+/* Implements Measure#36 */
+#if !defined (NCONFIG)
+GLOBAL SHORT mm_pei_config ( char * inString, char * dummy )
+{
+  pei_config ( inString );
+
+  return PEI_OK;
+}
+#endif /* (NCONFIG) */
+#endif
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)              MODULE  : MM_PEI              |
+| STATE   : code                       ROUTINE : pei_monitor         |
++--------------------------------------------------------------------+
+
+  PURPOSE : Monitoring of physical Parameters
+
+*/
+#if defined (NEW_FRAME)
+LOCAL SHORT pei_monitor (void ** monitor)
+#else
+GLOBAL T_PEI_RETURN pei_monitor (void ** monitor)
+#endif
+{
+  TRACE_FUNCTION ("pei_monitor()");
+
+/* Implements Measure#32: Row 76 */
+
+  *monitor = &mm_mon;
+
+  return PEI_OK;
+}
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)              MODULE  : MM_PEI              |
+| STATE   : code                       ROUTINE : pei_create          |
++--------------------------------------------------------------------+
+
+  PURPOSE : Create the Protocol Stack Entity
+
+*/
+
+
+#if defined (NEW_FRAME)
+
+GLOBAL SHORT mm_pei_create (T_PEI_INFO **info)
+{
+  static const T_PEI_INFO pei_info =
+  {
+    "MM",
+    {
+      pei_init,
+#ifdef _SIMULATION_
+      pei_exit,
+#else
+      NULL,
+#endif
+      pei_primitive,
+      pei_timeout,
+      NULL,             /* no signal function  */
+      NULL,             /* no run function     */
+/* Implements Measure#36 */
+#if defined(NCONFIG)
+      NULL,             /* no pei_config function     */
+#else /* not (NCONFIG) */
+      pei_config,
+#endif /* (NCONFIG) */
+      pei_monitor,
+    },
+    1024,     /* Stack Size      */
+    10,       /* Queue Entries   */
+    195,      /* Priority        */
+    NUM_OF_MM_TIMERS,        /* number of timer */
+    PASSIVE_BODY|COPY_BY_REF|PRIM_NO_SUSPEND /* flags */
+  };
+
+  TRACE_FUNCTION ("pei_create()");
+
+  /*
+   *  Close Resources if open
+   */
+
+#ifdef _SIMULATION_
+  if (first_access)
+    first_access = FALSE;
+  else
+    pei_exit ();
+#endif
+
+  /*
+   *  Export startup configuration data
+   */
+
+  *info = (T_PEI_INFO *)&pei_info;
+
+  pcm_Init ();
+
+  return PEI_OK;
+}
+
+#else
+
+T_PEI_RETURN pei_create (T_VSI_CNAME * name)
+{
+  TRACE_FUNCTION ("pei_create()")
+
+  /*
+   * Close Resources if open
+   */
+
+#ifdef _SIMULATION_
+  if (first_access)
+    first_access = FALSE;
+  else
+    pei_exit ();
+#endif
+
+  /*
+   *  Initialize entity data
+   */
+
+  *name = MM_NAME;
+
+  pcm_Init ();
+
+  return PEI_OK;
+}
+
+#endif
+
+#endif