view src/aci2/aci/aci_pei.c @ 662:8cd8fd15a095

SIM speed enhancement re-enabled and made configurable TI's original code supported SIM speed enhancement, but Openmoko had it disabled, and OM's disabling of speed enhancement somehow caused certain SIM cards to start working which didn't work before (OM's bug #666). Because our FC community is much smaller in year 2020 than OM's community was in their day, we are not able to find one of those #666-affected SIMs, thus the real issue they had encountered remains elusive. Thus our solution is to re-enable SIM speed enhancement and simply wait for if and when someone runs into a #666-affected SIM once again. We provide a SIM_allow_speed_enhancement global variable that allows SIM speed enhancement to be enabled or disabled per session, and an /etc/SIM_spenh file in FFS that allows it to enabled or disabled on a non-volatile basis. SIM speed enhancement is now enabled by default.
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 24 May 2020 05:02:28 +0000
parents 094152d97ce7
children
line wrap: on
line source

/*
+-----------------------------------------------------------------------------
|  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 AT Command Interpreter.
+-----------------------------------------------------------------------------
*/

#ifndef ACI_PEI_C
#define ACI_PEI_C

#include "aci_all.h"

#include "ccdapi.h"
#include "cnf_aci.h"
#include "mon_aci.h"  /* mouais... */
#include "P_ACI.val"    /* SKA 2002-09-02 for MAX_CMD_LEN */
#include "line_edit.h"  /* SKA 2002-09-02                 */
#include "aci_cmh.h"
#include "ati_cmd.h"
#include "aci_cmd.h"
#include "aci.h"
#include "aci_mem.h"

#ifndef _SIMULATION_
#include "rv_swe.h"
#ifdef RVM_GIL_SWE
#include "gil/gil_gpf.h" /* MMI_GIL_IND dispatch function */
#endif /* RVM_GIL_SWE */
#endif /* _SIMULATION_ */


#include "psa.h"
#include "psa_cc.h"
#include "psa_mm.h"
#include "psa_sim.h"
#include "psa_mmi.h"
#include "psa_sms.h"
#include "aoc.h"
#include "phb.h"
#include "hl_audio_drv.h"

#include "aci_lst.h"

#ifdef DTI
  #include "dti.h"      /* functionality of the dti library */
  #include "dti_conn_mng.h"
  #include "dti_cntrl_mng.h"
#endif

#ifdef GPRS 
  #include "gprs.h"
  #include "gaci_cmh.h"
  #include "psa_gmm.h"
  #include "psa_sm.h"
  #include "psa_gppp.h"
#endif  /* GPRS */

#ifdef UART
#include "psa_uart.h"
#include "cmh_uart.h"
#endif

#ifdef FF_ATI
  #include "aci_io.h"
#endif

#ifdef FF_PSI
#include "psa_psi.h"
#include "cmh_psi.h"
#endif /*FF_PSI*/

#ifdef FAX_AND_DATA
  #include "aci_fd.h"
  #include "psa_ra.h"
  #include "psa_l2r.h"
#ifdef FF_FAX
  #include "psa_t30.h"
#endif
#endif

#if defined (FF_WAP) || defined (FF_TCP_IP) || defined(FF_GPF_TCPIP)|| defined (FF_SAT_E)
  #include "psa_ppp_w.h"
#endif
#if defined (CO_UDP_IP) || defined (FF_GPF_TCP_IP)
  #include "psa_tcpip.h"
#endif /* defined (CO_UDP_IP) || defined(FF_GPF_TCPIP) */

#include "cmh.h"

#ifdef SIM_TOOLKIT
  #include "psa_sat.h"
#endif

#ifdef MFW
  #include "mfw_acie.h"
#endif

#include "gdi.h"
#include "audio.h"
#include "rx.h"
#include "pwr.h"


#ifdef BT_ADAPTER
  #include "bti.h"
  #include "bti_aci.h"
#endif

#ifdef FF_PKTIO
  #include "psa_pktio.h"
#endif
#ifdef _SIMULATION_
  #include "ati_src_tst.h"
#endif

#if defined FF_EOTD
  #include "ati_src_lc.h"
#endif

#ifdef DTI
  #include "sap_dti.h"
#endif

#include "psa_ss.h"
#ifdef FF_ESIM
#include "psa_aaa.h" /* esim */
#endif

#ifdef FF_MMI_RIV
EXTERN void acia_init(void);
#endif

#ifdef _SIMULATION_
#ifdef FF_ATI_BAT
#include "ati_bat.h"
#endif
#endif

extern const char firmware_version_str[];

#if (MMI != 0)
extern int r2d_is_running;
#endif


/*==== DEFINE =====================================================*/

/*==== EXPORT =====================================================*/

GLOBAL UBYTE mode = 1;
/*
 * instance data base
 */

/*==== PRIVATE ====================================================*/

LOCAL const void pei_not_supported (void *data);

/*==== VARIABLES ==================================================*/
LOCAL BOOL              first_access = TRUE;
LOCAL T_MONITOR         aci_mon;

/*==== FUNCTIONS ==================================================*/

#ifdef SMI
  EXTERN T_PEI_RETURN _pei_init (void);
  EXTERN T_PEI_RETURN _pei_primitive (T_PRIM *prim);
  EXTERN T_PEI_RETURN _pei_exit (void);
  EXTERN T_PEI_RETURN _pei_monitor (void ** monitor);
  EXTERN T_PEI_RETURN _pei_config ( T_PEI_CONFIG inString );
#endif /* SMI */
  EXTERN void tim_exec_timeout (USHORT index);

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-F&D (8411)             MODULE  : RLP_PEI             |
| STATE   : code                       ROUTINE : pei_not_supported   |
+--------------------------------------------------------------------+

  PURPOSE : An unsupported primitive is received.

*/

LOCAL const void pei_not_supported (void *data)
{
  TRACE_FUNCTION ("pei_not_supported()");

  PFREE (data);
}

/*
 *
 * Use MAK_FUNC_0 for primitives which contains no SDU.
 *
 * Use MAK_FUNC_S for primitives which contains a SDU.
 */

/*
 * jumptable for the entity service access point. Contains
 * the processing-function addresses and opcodes of
 * request and response primitives.
 *
 */
LOCAL const T_FUNC sim_table[] = {
  MAK_FUNC_0( psa_sim_read_cnf,               SIM_READ_CNF              ),
  MAK_FUNC_0( psa_sim_update_cnf,             SIM_UPDATE_CNF            ),
  MAK_FUNC_0( psa_sim_read_record_cnf,        SIM_READ_RECORD_CNF       ),
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_0( psa_sim_update_record_cnf,      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( psa_sim_increment_cnf,          SIM_INCREMENT_CNF         ),
  MAK_FUNC_0( psa_sim_verify_pin_cnf,         SIM_VERIFY_PIN_CNF        ),
  MAK_FUNC_0( psa_sim_change_pin_cnf,         SIM_CHANGE_PIN_CNF        ),
  MAK_FUNC_0( psa_sim_disable_pin_cnf,        SIM_DISABLE_PIN_CNF       ),
  MAK_FUNC_0( psa_sim_enable_pin_cnf,         SIM_ENABLE_PIN_CNF        ),
  MAK_FUNC_0( psa_sim_unblock_cnf,            SIM_UNBLOCK_CNF           ),
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_0( psa_sim_mmi_insert_ind,         SIM_MMI_INSERT_IND        ),
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_0( psa_sim_remove_ind,             SIM_REMOVE_IND            ),
  MAK_FUNC_0( psa_sim_sync_cnf,               SIM_SYNC_CNF              ),
  MAK_FUNC_0( psa_sim_activate_cnf,           SIM_ACTIVATE_CNF          ),
  MAK_FUNC_N( pei_not_supported,              0                         ),/*20*/
#ifdef SIM_TOOLKIT
  MAK_FUNC_0( psa_sim_toolkit_ind,            SIM_TOOLKIT_IND           ),
  MAK_FUNC_0( psa_sim_toolkit_cnf,            SIM_TOOLKIT_CNF           ),
#else
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_N( pei_not_supported,              0                         ),
#endif
  MAK_FUNC_0( psa_sim_activate_ind,           SIM_ACTIVATE_IND          ),/*23*/
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_0( psa_sim_access_cnf,             SIM_ACCESS_CNF            ),
#ifdef SIM_TOOLKIT
  MAK_FUNC_0( psa_sim_file_update_ind,        SIM_FILE_UPDATE_IND       ),
#else
  MAK_FUNC_N( pei_not_supported,              0                         ),
#endif
  MAK_FUNC_N( pei_not_supported,              0                         ),/* SIM_GMM_INSERT_IND */
#ifdef FF_SAT_E
  MAK_FUNC_0( psa_sim_dti_cnf,                SIM_DTI_CNF               ),/*28*/
  MAK_FUNC_0( psa_sim_bip_cnf,                SIM_BIP_CNF               ),/*29*/
  MAK_FUNC_0( psa_sim_bip_config_cnf,         SIM_BIP_CONFIG_CNF        ),/*30*/
  MAK_FUNC_0( psa_sim_dti_bip_ind,            SIM_DTI_BIP_IND           ),/*31*/
  MAK_FUNC_0( psa_sim_eventlist_cnf,          SIM_EVENTLIST_CNF         ),/*32*/
#else
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_N( pei_not_supported,              0                         ),
#endif
  MAK_FUNC_N( pei_not_supported,              0                         ) /*33*/
};

LOCAL const T_FUNC mmr_table[] = {
  MAK_FUNC_0( psa_mmr_reg_cnf,                MMR_REG_CNF               ),
  MAK_FUNC_0( psa_mmr_nreg_ind,               MMR_NREG_IND              ),
  MAK_FUNC_0( psa_mmr_nreg_cnf,               MMR_NREG_CNF              ),
  MAK_FUNC_0( psa_mmr_plmn_ind,               MMR_PLMN_IND              ),
  MAK_FUNC_0( psa_mmr_info_ind,               MMR_INFO_IND              ),
  MAK_FUNC_0( psa_mmr_ciphering_ind,          MMR_CIPHERING_IND         ),
  MAK_FUNC_0( psa_mmr_ahplmn_ind,             MMR_AHPLMN_IND            )
};

LOCAL const T_FUNC mncc_table[] = {
  MAK_FUNC_0( psa_mncc_alert_ind,             MNCC_ALERT_IND            ),
  MAK_FUNC_0( psa_mncc_call_proceed_ind,      MNCC_CALL_PROCEED_IND     ),
  MAK_FUNC_0( psa_mncc_disconnect_ind,        MNCC_DISCONNECT_IND       ),
  MAK_FUNC_0( psa_mncc_hold_cnf,              MNCC_HOLD_CNF             ),
  MAK_FUNC_0( psa_mncc_modify_cnf,            MNCC_MODIFY_CNF           ),
  MAK_FUNC_0( psa_mncc_modify_ind,            MNCC_MODIFY_IND           ),
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_0( psa_mncc_progress_ind,          MNCC_PROGRESS_IND         ),
  MAK_FUNC_0( psa_mncc_reject_ind,            MNCC_REJECT_IND           ),
  MAK_FUNC_0( psa_mncc_release_cnf,           MNCC_RELEASE_CNF          ),
  MAK_FUNC_0( psa_mncc_release_ind,           MNCC_RELEASE_IND          ),
  MAK_FUNC_0( psa_mncc_retrieve_cnf,          MNCC_RETRIEVE_CNF         ),
  MAK_FUNC_0( psa_mncc_setup_cnf,             MNCC_SETUP_CNF            ),
  MAK_FUNC_0( psa_mncc_setup_compl_ind,       MNCC_SETUP_COMPL_IND      ),
  MAK_FUNC_0( psa_mncc_setup_ind,             MNCC_SETUP_IND            ),
  MAK_FUNC_0( psa_mncc_start_dtmf_cnf,        MNCC_START_DTMF_CNF       ),
  MAK_FUNC_0( psa_mncc_sync_ind,              MNCC_SYNC_IND             ),
  MAK_FUNC_0( psa_mncc_user_ind,              MNCC_USER_IND             ),
  MAK_FUNC_0( psa_mncc_facility_ind,          MNCC_FACILITY_IND         ),
  MAK_FUNC_0( psa_mncc_bearer_cap_cnf,        MNCC_BEARER_CAP_CNF       ),
  MAK_FUNC_0( psa_mncc_prompt_ind,            MNCC_PROMPT_IND           ),
  MAK_FUNC_0( psa_mncc_recall_ind,            MNCC_RECALL_IND           ),
  MAK_FUNC_0( psa_mncc_status_ind,            MNCC_STATUS_IND           )
};

LOCAL const T_FUNC mnss_table[] = {
  MAK_FUNC_0( psa_mnss_begin_ind,             MNSS_BEGIN_IND            ),
  MAK_FUNC_0( psa_mnss_facility_ind,          MNSS_FACILITY_IND         ),
  MAK_FUNC_0( psa_mnss_end_ind,               MNSS_END_IND              )
};

LOCAL const T_FUNC mnsms_table[] = {
  MAK_FUNC_0( psa_mnsms_delete_cnf,           MNSMS_DELETE_CNF          ),
  MAK_FUNC_0( psa_mnsms_read_cnf,             MNSMS_READ_CNF            ),
  MAK_FUNC_0( psa_mnsms_store_cnf,            MNSMS_STORE_CNF           ),
  MAK_FUNC_0( psa_mnsms_submit_cnf,           MNSMS_SUBMIT_CNF          ),
  MAK_FUNC_0( psa_mnsms_command_cnf,          MNSMS_COMMAND_CNF         ),
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_0( psa_mnsms_report_ind,           MNSMS_REPORT_IND          ),
  MAK_FUNC_0( psa_mnsms_status_ind,           MNSMS_STATUS_IND          ),
  MAK_FUNC_0( psa_mnsms_message_ind,          MNSMS_MESSAGE_IND         ),
  MAK_FUNC_0( psa_mnsms_error_ind,            MNSMS_ERROR_IND           ),
  MAK_FUNC_0( psa_mnsms_resume_cnf,           MNSMS_RESUME_CNF          ),
  MAK_FUNC_0( psa_mnsms_query_cnf,            MNSMS_QUERY_CNF           ),
#ifdef GPRS
  MAK_FUNC_0( psa_mnsms_mo_serv_cnf,          MNSMS_MO_SERV_CNF         ),
#else
  MAK_FUNC_N( pei_not_supported,              0                         ),
#endif /* GPRS */
#ifdef SIM_PERS_OTA
  MAK_FUNC_0( psa_mnsms_OTA_decode_ind,      MNSMS_OTA_DECODE_IND    )
#else 
  MAK_FUNC_N( pei_not_supported,              0                         )
 #endif
};

LOCAL const T_FUNC mmi_table[] = {
  MAK_FUNC_0( psa_mmi_keypad_ind,             MMI_KEYPAD_IND            ),
  MAK_FUNC_0( psa_mmi_cbch_ind,               MMI_CBCH_IND              ),
  MAK_FUNC_0( psa_mmi_rxlev_ind,              MMI_RXLEV_IND             ),
  MAK_FUNC_0( psa_mmi_battery_ind,            MMI_BATTERY_IND           ),
#ifdef SIM_TOOLKIT
  MAK_FUNC_0( psa_sat_cbch_dnl_ind,           MMI_SAT_CBCH_DWNLD_IND    ),
#else
  MAK_FUNC_N( pei_not_supported,              0                         ),
#endif
#ifdef BTE_MOBILE
  MAK_FUNC_0( psa_mmi_bt_cb_notify_ind,       MMI_BT_CB_NOTIFY_IND      ),
#else
  MAK_FUNC_N( pei_not_supported,              0                         ),
#endif
#ifdef RVM_GIL_SWE
  MAK_FUNC_N( pei_not_supported,              0                         ), /* RPD MSG ? */
  MAK_FUNC_0( gil_gpf_dispatch_message,       MMI_GIL_IND               ),
#else
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_N( pei_not_supported,              0                         ),
#endif /* RVM_GIL_SWE */
#ifndef VOCODER_FUNC_INTERFACE
  MAK_FUNC_0( psa_mmi_tch_vocoder_cfg_con,    MMI_TCH_VOCODER_CFG_CON   )
#else
  MAK_FUNC_N( pei_not_supported,              0                         )
#endif
};

#ifdef DTI
LOCAL const T_FUNC dti_dl_table[] = {
  MAK_FUNC_0( dti_lib_dti_dti_connect_ind     ,    DTI2_CONNECT_IND    ),  /* 7700x */
  MAK_FUNC_0( dti_lib_dti_dti_connect_cnf     ,    DTI2_CONNECT_CNF    ),  /* 7701x */
  MAK_FUNC_0( dti_lib_dti_dti_disconnect_ind  ,    DTI2_DISCONNECT_IND ),  /* 7702x */
  MAK_FUNC_0( dti_lib_dti_dti_ready_ind       ,    DTI2_READY_IND      ),  /* 7703x */
  MAK_FUNC_0( dti_lib_dti_dti_data_ind        ,    DTI2_DATA_IND       ),  /* 7704x */
#if defined (_SIMULATION_)
  MAK_FUNC_S( dti_lib_dti_dti_data_test_ind   ,    DTI2_DATA_TEST_IND )
#else /* _SIMULATION_ */
  MAK_FUNC_N( pei_not_supported               ,    0)
#endif /* _SIMULATION_ */
};
#endif /* UART */

#ifdef FF_EM_MODE
LOCAL const T_FUNC em_table[] = {
  MAK_FUNC_0( psa_em_sc_info_cnf,             EM_SC_INFO_CNF            ), /* 0x7E00 */
#ifdef GPRS
  MAK_FUNC_0( psa_em_sc_gprs_info_cnf,        EM_SC_GPRS_INFO_CNF       ), /* 0x7E01 */
#else
  MAK_FUNC_N( pei_not_supported,              EM_SC_GPRS_INFO_CNF       ), /* 0x7E01 */
#endif /* GPRS */
  MAK_FUNC_0( psa_em_nc_info_cnf,             EM_NC_INFO_CNF            ), /* 0x7E02 */
  MAK_FUNC_0( psa_em_loc_pag_info_cnf,        EM_LOC_PAG_INFO_CNF       ), /* 0x7E03 */
  MAK_FUNC_0( psa_em_plmn_info_cnf,           EM_PLMN_INFO_CNF          ), /* 0x7E04 */
  MAK_FUNC_0( psa_em_cip_hop_dtx_info_cnf,    EM_CIP_HOP_DTX_INFO_CNF   ), /* 0x7E05 */
  MAK_FUNC_0( psa_em_power_info_cnf,          EM_POWER_INFO_CNF         ), /* 0x7E06 */
  MAK_FUNC_0( psa_em_identity_info_cnf,       EM_IDENTITY_INFO_CNF      ), /* 0x7E07 */
  MAK_FUNC_0( psa_em_sw_version_info_cnf,     EM_SW_VERSION_INFO_CNF    ), /* 0x7E08 */
  MAK_FUNC_N( pei_not_supported,              0                         ), /* 0x7E09 */
  MAK_FUNC_N( pei_not_supported,              0                         ), /* 0x7E0A */
  MAK_FUNC_0( em_event_trace_ind,             EM_DATA_IND               ), /* 0x7E0B */
  MAK_FUNC_N( pei_not_supported,              0                         ), /* 0x7E0C */
  MAK_FUNC_N( pei_not_supported,              0                         ), /* 0x7E0D */
  MAK_FUNC_N( pei_not_supported,              0                         ), /* 0x7E0E */
  MAK_FUNC_N( pei_not_supported,              0                         ), /* 0x7E0F */
  MAK_FUNC_N( pei_not_supported,              0                         ), /* 0x7E10 */
  MAK_FUNC_N( pei_not_supported,              0                         ), /* 0x7E11 */
  MAK_FUNC_N( pei_not_supported,              0                         ), /* 0x7E12 */
  MAK_FUNC_N( pei_not_supported,              0                         ), /* 0x7E13 */
  MAK_FUNC_N( pei_not_supported,              0                         ), /* 0x7E14 */
  MAK_FUNC_N( pei_not_supported,              0                         ), /* 0x7E15 */
  MAK_FUNC_N( pei_not_supported,              0                         ), /* 0x7E16 */
#ifdef GPRS
  MAK_FUNC_0( psa_em_gmm_info_cnf,            EM_GMM_INFO_CNF           ), /* 0x7E17 */ /*GMM_INFO*/
  MAK_FUNC_0( psa_em_grlc_info_cnf,           EM_GRLC_INFO_CNF          ), /* 0x7E18 */ /*GRLC_INFO*/
#else
  MAK_FUNC_N( pei_not_supported,              EM_GMM_INFO_CNF           ), /* 0x7E17 */
  MAK_FUNC_N( pei_not_supported,              EM_GRLC_INFO_CNF          ), /* 0x7E18 */
#endif /* GPRS */
  MAK_FUNC_0( psa_em_amr_info_cnf,            EM_AMR_INFO_CNF           )  /* 0x7E19 */
};
#endif /* FF_EM_MODE */

#ifdef FF_ATI
/* ES!! #if !defined (MFW) */
LOCAL const T_FUNC aci_table[] = {
  MAK_FUNC_0( aci_aci_cmd_req,                ACI_CMD_REQ               ),
  MAK_FUNC_0( aci_aci_abort_req,              ACI_ABORT_REQ             ),
#ifdef BT_ADAPTER
  MAK_FUNC_0( aci_aci_cmd_res       ,         ACI_CMD_RES               ),
  MAK_FUNC_0( aci_aci_init_res      ,         ACI_INIT_RES              ),
  MAK_FUNC_0( aci_aci_deinit_req    ,         ACI_DEINIT_REQ            ),
  MAK_FUNC_0( aci_aci_open_port_req ,         ACI_OPEN_PORT_REQ         ),
  MAK_FUNC_0( aci_aci_close_port_req,         ACI_CLOSE_PORT_REQ        ),
  MAK_FUNC_0( aci_aci_cmd_req_bt,             ACI_CMD_REQ_BT            ),
  MAK_FUNC_0( aci_aci_cmd_res_bt,             ACI_CMD_RES_BT            ),
  MAK_FUNC_0( aci_aci_abort_req_bt,           ACI_ABORT_REQ_BT          ),
#else
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_N( pei_not_supported,              0                         ),
#endif /* BT_ADAPTER */
  MAK_FUNC_0( aci_aci_trc_ind,                ACI_TRC_IND               ),
  MAK_FUNC_0( aci_aci_ext_ind,                ACI_EXT_IND               ),
#ifdef FF_MMI_RIV
  MAK_FUNC_0( aci_aci_riv_cmd_req,            ACI_RIV_CMD_REQ           )
#else
  MAK_FUNC_N( pei_not_supported,              0                         )
#endif /* FF_MMI_RIV */
};
/* ES!! #endif */
#endif

#ifdef FAX_AND_DATA

LOCAL const T_FUNC ra_table[] = {
  MAK_FUNC_N( pei_not_supported,              0 /* RA_READY_IND       */),
  MAK_FUNC_N( pei_not_supported,              0 /* RA_DATA_IND        */),
  MAK_FUNC_0( psa_ra_activate_cnf,            RA_ACTIVATE_CNF           ),
  MAK_FUNC_0( psa_ra_deactivate_cnf,          RA_DEACTIVATE_CNF         ),
  MAK_FUNC_N( pei_not_supported,              0 /* RA_BREAK_IND       */)
#ifdef FF_FAX
  ,
  MAK_FUNC_0( psa_ra_modify_cnf,              RA_MODIFY_CNF             )
#endif
};

#ifdef DTI
LOCAL const T_FUNC l2r_table[] = {
  MAK_FUNC_0( psa_l2r_activate_cnf,           L2R_ACTIVATE_CNF          ),
  MAK_FUNC_0( psa_l2r_deactivate_cnf,         L2R_DEACTIVATE_CNF        ),
  MAK_FUNC_0( psa_l2r_connect_cnf,            L2R_CONNECT_CNF           ),
  MAK_FUNC_0( psa_l2r_connect_ind,            L2R_CONNECT_IND           ),
  MAK_FUNC_0( psa_l2r_disc_cnf,               L2R_DISC_CNF              ),
  MAK_FUNC_0( psa_l2r_disc_ind,               L2R_DISC_IND              ),
  MAK_FUNC_N( pei_not_supported,              0 /* L2R_READY_IND      */),
  MAK_FUNC_N( pei_not_supported,              0 /* L2R_DATA_IND       */),
  MAK_FUNC_N( pei_not_supported,              0 /* L2R_BREAK_CNF      */),
  MAK_FUNC_N( pei_not_supported,              0 /* L2R_BREAK_IND      */),
  MAK_FUNC_N( psa_l2r_xid_ind,                L2R_XID_IND               ),
  MAK_FUNC_0( psa_l2r_error_ind,              L2R_ERROR_IND             ),
  MAK_FUNC_0( psa_l2r_reset_ind,              L2R_RESET_IND             ),
  MAK_FUNC_0( psa_l2r_statistic_ind,          L2R_STATISTIC_IND         ),
  MAK_FUNC_0( psa_l2r_dti_cnf,                L2R_DTI_CNF               ),
  MAK_FUNC_0( psa_l2r_dti_ind,                L2R_DTI_IND               )
};

#ifdef FF_FAX
LOCAL const T_FUNC t30_table[] = {
  MAK_FUNC_0( psa_t30_cap_ind,                T30_CAP_IND               ),
  MAK_FUNC_0( psa_t30_sgn_ind,                T30_SGN_IND               ),
  MAK_FUNC_0( psa_t30_cmpl_ind,               T30_CMPL_IND              ),
  MAK_FUNC_S( psa_t30_report_ind,             T30_REPORT_IND            ),
  MAK_FUNC_0( psa_t30_error_ind,              T30_ERROR_IND             ),
  MAK_FUNC_0( psa_t30_deactivate_cnf,         T30_DEACTIVATE_CNF        ),
  MAK_FUNC_0( psa_t30_activate_cnf,           T30_ACTIVATE_CNF          ),
  MAK_FUNC_0( psa_t30_preamble_ind,           T30_PREAMBLE_IND          ),
  MAK_FUNC_0( psa_t30_dti_ind,                T30_DTI_IND               ),
  MAK_FUNC_0( psa_t30_dti_cnf,                T30_DTI_CNF               ),
  MAK_FUNC_0( psa_t30_phase_ind,              T30_PHASE_IND             ),
  MAK_FUNC_0( psa_t30_eol_ind,                T30_EOL_IND               ),
  MAK_FUNC_N( pei_not_supported,              0                         )
};
#endif /* FF_FAX */

LOCAL const T_FUNC tra_table[] = {
  MAK_FUNC_0( psa_tra_activate_cnf,           TRA_ACTIVATE_CNF          ),
  MAK_FUNC_0( psa_tra_deactivate_cnf,         TRA_DEACTIVATE_CNF        ),
  MAK_FUNC_0( psa_tra_dti_cnf,                TRA_DTI_CNF               ),
  MAK_FUNC_0( psa_tra_dti_ind,                TRA_DTI_IND               ),
};
#endif /* DTI */
#endif /* FAX_AND_DATA */

#ifdef FF_GPF_TCPIP
LOCAL const T_FUNC tcpip_table[] = {
  MAK_FUNC_0 (psa_tcpip_initialize_cnf,       TCPIP_INITIALIZE_CNF ),  /* 0x00 */
  MAK_FUNC_N (psa_tcpip_shutdown_cnf,           TCPIP_SHUTDOWN_CNF ),  /* 0x01 */
  MAK_FUNC_0 (psa_tcpip_ifconfig_cnf,           TCPIP_IFCONFIG_CNF ),  /* 0x02 */
  MAK_FUNC_0 (psa_tcpip_dti_cnf,                     TCPIP_DTI_CNF )   /* 0x03 */
};
#endif

#ifdef CO_UDP_IP
LOCAL const T_FUNC udpa_table[] = {
  MAK_FUNC_0( psa_udpa_dti_cnf,               UDPA_DTI_CNF              ),
  MAK_FUNC_0( psa_udpa_dti_ind,               UDPA_DTI_IND              ),
  MAK_FUNC_0( psa_udpa_config_cnf,            UDPA_CONFIG_CNF           ),
};
LOCAL const T_FUNC ipa_table[] = {
  MAK_FUNC_0( psa_ipa_dti_cnf,                IPA_DTI_CNF               ),
  MAK_FUNC_0( psa_ipa_dti_ind,                IPA_DTI_IND               ),
  MAK_FUNC_0( psa_ipa_config_cnf,             IPA_CONFIG_CNF            ),
};
#endif /* CO_UDP_IP */

#ifdef FF_WAP
LOCAL const T_FUNC wap_table[] = {
  MAK_FUNC_S( psa_wap_mmi_ind,      WAP_MMI_IND         ),
  MAK_FUNC_S( psa_wap_mmi_req,      WAP_MMI_REQ         ),
  MAK_FUNC_S( psa_wap_mmi_cnf,      WAP_MMI_CNF         ),
  MAK_FUNC_0( psa_wap_dti_cnf,      WAP_DTI_CNF         ),
  MAK_FUNC_0( psa_wap_dti_ind,      WAP_DTI_IND         )
};
#endif /* FF_WAP */

#ifdef FF_GPF_TCPIP
LOCAL const T_FUNC dcm_table[] = {
  MAK_FUNC_0( psa_dcm_open_conn_req,            DCM_OPEN_CONN_REQ       ), /* 0x8000401c */
  MAK_FUNC_0( psa_dcm_close_conn_req,           DCM_CLOSE_CONN_REQ      ), /* 0x8001401c */
  MAK_FUNC_0( psa_dcm_get_current_conn_req ,    DCM_GET_CURRENT_CONN_REQ), /* 0x8002001c */
  MAK_FUNC_N( pei_not_supported,                0                       )
};
#endif /* FF_GPF_TCPIP */

/*LOCAL const T_FUNC ppp_table[] = {
  MAK_FUNC_0( psa_ppp_establish_cnf,          PPP_ESTABLISH_CNF         ),
  MAK_FUNC_0( psa_ppp_terminate_ind,          PPP_TERMINATE_IND         ),
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_0( psa_ppp_dti_connected_ind,       PPP_DTI_CONNECTED_IND    )
};*/
#if defined (UART) AND defined (DTI)
LOCAL const T_FUNC uart_table[] = {
  MAK_FUNC_0( psa_uart_parameters_cnf,    UART_PARAMETERS_CNF   ), /* 0x3400 */
  MAK_FUNC_0( psa_uart_parameters_ind,    UART_PARAMETERS_IND   ), /* 0x3401 */
  MAK_FUNC_0( psa_uart_dti_cnf,           UART_DTI_CNF          ), /* 0x3402 */
  MAK_FUNC_0( psa_uart_dti_ind,  UART_DTI_IND ), /* 0x3403 */
  MAK_FUNC_0( psa_uart_disable_cnf,           UART_DISABLE_CNF          ), /* 0x3404 */
  MAK_FUNC_0( psa_uart_ring_cnf,              UART_RING_CNF             ), /* 0x3405 */
  MAK_FUNC_0( psa_uart_dcd_cnf,               UART_DCD_CNF              ), /* 0x3406 */
  MAK_FUNC_0( psa_uart_escape_cnf,            UART_ESCAPE_CNF           ), /* 0x3407 */
  MAK_FUNC_0( psa_uart_detected_ind,          UART_DETECTED_IND         ), /* 0x3408 */
  MAK_FUNC_0( psa_uart_error_ind,             UART_ERROR_IND            ), /* 0x3409 */
  MAK_FUNC_0( psa_uart_mux_start_cnf,         UART_MUX_START_CNF        ),
  MAK_FUNC_0( psa_uart_mux_dlc_establish_ind, UART_MUX_DLC_ESTABLISH_IND),
  MAK_FUNC_0( psa_uart_mux_dlc_release_ind,   UART_MUX_DLC_RELEASE_IND  ),
  MAK_FUNC_N( pei_not_supported,              0                         ), /* sleep ind */
  MAK_FUNC_N( pei_not_supported,              0                         ), /* wake up ind */
  MAK_FUNC_0( psa_uart_mux_close_ind,         UART_MUX_CLOSE_IND        ),
  MAK_FUNC_N( pei_not_supported,              0                         )
};
#endif

#ifdef GPRS
/* GMMREG */
LOCAL const T_FUNC gmm_table[] = {
  MAK_FUNC_0( psa_gmmreg_attach_cnf,           GMMREG_ATTACH_CNF        ),
  MAK_FUNC_0( psa_gmmreg_attach_rej,           GMMREG_ATTACH_REJ        ),
  MAK_FUNC_0( psa_gmmreg_detach_cnf,           GMMREG_DETACH_CNF        ),
  MAK_FUNC_0( psa_gmmreg_detach_ind,           GMMREG_DETACH_IND        ),
  MAK_FUNC_0( psa_gmmreg_plmn_ind,             GMMREG_PLMN_IND          ),
  MAK_FUNC_0( psa_gmmreg_suspend_ind,          GMMREG_SUSPEND_IND       ),
  MAK_FUNC_0( psa_gmmreg_resume_ind,           GMMREG_RESUME_IND        ),
  MAK_FUNC_0( psa_gmmreg_info_ind,             GMMREG_INFO_IND          ),
  MAK_FUNC_0( psa_gmmreg_ciphering_ind,        GMMREG_CIPHERING_IND     ),
  MAK_FUNC_0( psa_gmmreg_ahplmn_ind,           GMMREG_AHPLMN_IND        )
};  

/* SMREG */
LOCAL const T_FUNC sm_table[] = {
  MAK_FUNC_0( psa_smreg_pdp_activate_cnf,      SMREG_PDP_ACTIVATE_CNF   ),
  MAK_FUNC_0( psa_smreg_pdp_activate_rej,      SMREG_PDP_ACTIVATE_REJ   ),
  MAK_FUNC_0( psa_smreg_pdp_activate_ind,      SMREG_PDP_ACTIVATE_IND   ),
  MAK_FUNC_0( psa_smreg_pdp_deactivate_cnf,    SMREG_PDP_DEACTIVATE_CNF ),
  MAK_FUNC_0( psa_smreg_pdp_deactivate_ind,    SMREG_PDP_DEACTIVATE_IND ),
  MAK_FUNC_0( psa_smreg_pdp_modify_ind,        SMREG_PDP_MODIFY_IND     )
};

/* SN */
LOCAL const T_FUNC sndcp_table[] = {
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_N( psa_sn_count_cnf,               SN_COUNT_CNF              ),
  MAK_FUNC_N( psa_sn_switch_cnf,              SN_SWITCH_CNF             )
};

/* PPP */
/*LOCAL const T_FUNC ppp_table[] = {
  MAK_FUNC_0( psa_ppp_establish_cnf,           PPP_ESTABLISH_CNF        ),
  MAK_FUNC_0( psa_ppp_terminate_ind,           PPP_TERMINATE_IND        ),
  MAK_FUNC_0( psa_ppp_pdp_activate_ind,        PPP_PDP_ACTIVATE_IND     ),
  MAK_FUNC_0( psa_ppp_modification_cnf,        PPP_MODIFICATION_CNF     ),
  MAK_FUNC_0( psa_ppp_dti_connected_ind,       PPP_DTI_CONNECTED_IND    )
};*/

#ifdef FF_PKTIO
LOCAL const T_FUNC mnpkt_table[] = {
  MAK_FUNC_0( psa_pkt_connect_ind,             PKT_CONNECT_IND          ),
  MAK_FUNC_0( psa_pkt_disconnect_ind,          PKT_DISCONNECT_IND       ),
  MAK_FUNC_0( psa_pkt_dti_open_cnf,            PKT_DTI_OPEN_CNF         ),
  MAK_FUNC_0( psa_pkt_modify_cnf,              PKT_MODIFY_CNF           ),
  MAK_FUNC_0( psa_pkt_dti_close_cnf,           PKT_DTI_CLOSE_CNF        ),
  MAK_FUNC_0( psa_pkt_dti_close_ind,           PKT_DTI_CLOSE_IND        )
};
#endif
#endif  /* GPRS */
#if defined (FF_PSI ) AND defined (DTI)
LOCAL const T_FUNC mnpsi_table[] = {
  MAK_FUNC_0( psa_psi_conn_ind,                      PSI_CONN_IND             ),
  MAK_FUNC_0( psa_psi_disconn_ind,             PSI_DISCONN_IND          ),
  MAK_FUNC_0( psa_psi_dti_open_cnf,            PSI_DTI_OPEN_CNF         ),
  MAK_FUNC_0( psa_psi_dti_close_cnf,           PSI_DTI_CLOSE_CNF        ),
  MAK_FUNC_0( psa_psi_dti_close_ind,           PSI_DTI_CLOSE_IND        ),
  MAK_FUNC_0( psa_psi_setconf_cnf,             PSI_SETCONF_CNF          ),
  MAK_FUNC_0( psa_psi_line_state_cnf,          PSI_LINE_STATE_CNF       ),
  MAK_FUNC_0( psa_psi_line_state_ind,          PSI_LINE_STATE_CNF       ),
  MAK_FUNC_0( psa_psi_close_cnf,               PSI_CLOSE_CNF            )
#ifdef _SIMULATION_
  ,
  MAK_FUNC_0( psa_psi_conn_ind_test,            PSI_CONN_IND_TEST)
#endif /*_SIMULATION_ */
};
#endif /*FF_PSI*/
/* PPP */

#if defined FF_WAP || defined GPRS || defined FF_GPF_TCPIP || defined (FF_SAT_E)
LOCAL const T_FUNC ppp_table[] = {
  MAK_FUNC_0( psa_ppp_establish_cnf,           PPP_ESTABLISH_CNF        ),
  MAK_FUNC_0( psa_ppp_terminate_ind,           PPP_TERMINATE_IND        ),
  MAK_FUNC_0( psa_ppp_pdp_activate_ind,        PPP_PDP_ACTIVATE_IND     ),
  MAK_FUNC_0( psa_ppp_modification_cnf,        PPP_MODIFICATION_CNF     ),
  MAK_FUNC_0( psa_ppp_dti_connected_ind,       PPP_DTI_CONNECTED_IND    )
};
#endif /* FF_WAP || GPRS || FF_GPF_TCPIP || FF_SAT_E */

#if defined FF_EOTD
LOCAL const T_FUNC mnlc_table[] = {
  MAK_FUNC_0( psa_mnlc_sms_meas_cnf,             MNLC_SMS_MEAS_CNF        )
};
#endif /* FF_EOTD */

/* BTI */
#ifdef BT_ADAPTER
LOCAL const T_FUNC btp_table[] = {
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_0( psa_btp_dti_ind,                T30_DTI_IND               ),
  MAK_FUNC_0( psa_btp_dti_cnf,                T30_DTI_CNF               )
};
#endif /* BT_ADAPTER */

#if defined(FF_TCP_IP) || defined(FF_ESIM)
LOCAL const T_FUNC aaa_table[] = {
  MAK_FUNC_0( psa_aaa_cmd_req,                AAA_CMD_REQ               ),
  MAK_FUNC_0( psa_aaa_open_port_req,          AAA_OPEN_PORT_REQ         ),
  MAK_FUNC_0( psa_aaa_close_port_req,         AAA_CLOSE_PORT_REQ        ),
  MAK_FUNC_0( psa_aaa_dti_rsp,                AAA_DTI_RES               ),
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_N( pei_not_supported,              0                         ),
  MAK_FUNC_0( psa_aaa_disconnect_rsp,         AAA_DISCONNECT_RES        )
};
#endif

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-F&D (8411)               MODULE  : RLP_PEI           |
| STATE   : code                         ROUTINE : pei_primitive     |
+--------------------------------------------------------------------+

  PURPOSE : Process protocol specific primitive.

*/

LOCAL SHORT pei_primitive (void *ptr)
{
  T_PRIM *prim = ptr;
#ifdef SMI
  T_PEI_RETURN subReturn = PEI_ERROR;
#endif

  /*
   *
   *                                  ACI                                       UPLINK
   *                                   |
   *   +-------------------------------v--------------------------------------+
   *   |                                                                      |
   *   |                              ACI                                     |
   *   |                                                                      |
   *   +--^----^-----^----^----^----^---^---^---^----^------^----^---^----^---+
   *      |    |     |    |    |    |   |   |   |    |      |    |   |    |
   *     SIM MMREG MNCC MNSS MNSMS MMI T30 L2R  RA GMMREG SMREG PPP UART BTI     DOWNLINK
   *      |    |     |    |    |    |   |   |   |    |      |    |   |    |
   *
   */

#ifdef MFW
  extern void mmeFlagHandler(void);
  extern USHORT mfwMmeDrvFlag;
#endif

/*  TRACE_FUNCTION ("pei_primitive()");*/
#ifdef MFW
  if (mfwMmeDrvFlag)
    mmeFlagHandler();
#endif

  if (prim NEQ NULL)
  {
    ULONG            opc = prim->custom.opc;
    USHORT           n;
    const T_FUNC    *table;
#ifdef FF_EM_MODE
    /* This variable is only needed to extract information about the sending
       entity. This is needed especially for testing purposes.
    */
    T_sdu           *em_prim_data;
#endif /* FF_EM_MODE */

    VSI_PPM_REC ((T_PRIM_HEADER*)prim, __FILE__, __LINE__);

#ifndef FF_EM_MODE
    /*
     * To ensure true msc directions for the engineering mode additional
     * information (from which entity the prim is sent) must be provided
     * before PTRACE_IN is called.
    */
    PTRACE_IN (opc);
#endif /* FF_EM_MODE */

#ifdef MFW
    /*
     * MFW "checks" if it needs to handle primitves coming from below before they are
     * potentially still to be handled by ACI
     */
    if (aci_check_primitive (opc, (void*)(&(prim->data))))
    {
      PFREE (P2D(prim));
      return PEI_OK;
    }
#endif

 /*   TRACE_EVENT_P1("opcode: %d", opc);*/
    switch (SAP_NR(opc))
    {
#ifdef FF_ATI
/* ES!! #if !defined (MFW) */
      case ACI_DL:
      case ACI_UL:    table =  aci_table;   n = TAB_SIZE (aci_table);   break;
/* ES!! #endif */
#endif
      case SAP_NR(SIM_UL):   table =  sim_table;   n = TAB_SIZE (sim_table);   break;
      case SAP_NR(MMREG_DL): table =  mmr_table;   n = TAB_SIZE (mmr_table);   break;
      case SAP_NR(MNCC_DL):  table =  mncc_table;  n = TAB_SIZE (mncc_table);  break;
      case SAP_NR(MNSS_DL):  table =  mnss_table;  n = TAB_SIZE (mnss_table);  break;
      case SAP_NR(MNSMS_DL): table =  mnsms_table; n = TAB_SIZE (mnsms_table); break;
#if defined (FF_PKTIO) AND defined (DTI)
      case SAP_NR(PKT_DL):   table =  mnpkt_table; n = TAB_SIZE (mnpkt_table); break;
#endif
#if defined (FF_PSI) AND defined (DTI)
      case SAP_NR(PSI_DL):   table =  mnpsi_table; n = TAB_SIZE (mnpsi_table); break;
#endif /*FF_PSI*/

#ifdef DTI
#if defined(FF_TCP_IP) || defined(FF_ESIM)
      case SAP_NR(AAA_DL):   table =  aaa_table;   n = TAB_SIZE (aaa_table);   break;
#endif
#endif
      case MMI_DL:    table =  mmi_table;   n = TAB_SIZE (mmi_table);   break;
#ifdef DTI
      case DTI2_DL:
        {
          table = dti_dl_table;     n = TAB_SIZE (dti_dl_table);
          /*
           * to be able to distinguish DTI1/DTI2 opcodes,
           * the ones for DTI2 start at 0x50
           */
          opc -= 0x50;
        }
        break;
#endif /* UART */
#ifdef FF_EM_MODE
      case EM_Dl:
                             table =  em_table;    n = TAB_SIZE (em_table);    /*break;*/

        em_prim_data = (T_sdu*) (((char*)&prim->data) + table->soff);

        /*
         * The prim 'EM_DATA_IND' is ambiguous concerning the sending entity.
         * Therefore additional information is provided here.
        */
        if (opc EQ EM_DATA_IND_OPC)
        {
          switch (em_prim_data->l_buf)
          {
            case EM_L1:  TRACE_PRIM_FROM("PL");  break;
            case EM_DL:  TRACE_PRIM_FROM("DL");  break;
            case EM_MM:  TRACE_PRIM_FROM("MM");  break;
            case EM_CC:  TRACE_PRIM_FROM("CC");  break;
            case EM_SS:  TRACE_PRIM_FROM("SS");  break;
            case EM_SMS: TRACE_PRIM_FROM("SMS"); break;
            case EM_SIM: TRACE_PRIM_FROM("SIM"); break;
            default:                             break;
          }
        }
        break;
#endif /* FF_EM_MODE */

#if defined (FAX_AND_DATA) AND defined (DTI)
      case SAP_NR(RA_DL):     table =  ra_table;    n = TAB_SIZE (ra_table);    break;
      case SAP_NR(L2R_DL):    table =  l2r_table;   n = TAB_SIZE (l2r_table);   break;
#ifdef FF_FAX
      case SAP_NR(T30_DL):    table =  t30_table;   n = TAB_SIZE (t30_table);   break;
#endif
      case SAP_NR(TRA_DL):    table =  tra_table;   n = TAB_SIZE (tra_table);   break;
#endif

#ifdef FF_GPF_TCPIP
      case SAP_NR(TCPIP_DL):  table = tcpip_table;  n = TAB_SIZE (tcpip_table); break;
      case SAP_NR(DCM_DL):    table = dcm_table;    n = TAB_SIZE (dcm_table);   break;
#endif

#ifdef CO_UDP_IP
      case SAP_NR(UDPA_DL):   table =  udpa_table;  n = TAB_SIZE (udpa_table);  break;
      case SAP_NR(IPA_DL):    table =  ipa_table;   n = TAB_SIZE (ipa_table);   break;
#endif

#ifdef FF_WAP
      case SAP_NR(WAP_DL):    table =  wap_table;   n = TAB_SIZE (wap_table);   break;
#endif

#if defined (FF_WAP) || defined (GPRS) || defined (FF_SAT_E)
      case PPP_UL:    table =  ppp_table;   n = TAB_SIZE (ppp_table);   break;
#endif

#ifdef GPRS
      case GMMREG_DL: table =  gmm_table;   n = TAB_SIZE (gmm_table);   break;
      case SMREG_DL:  table =  sm_table;    n = TAB_SIZE (sm_table);    break;
      case SN_DL:     table =  sndcp_table; n = TAB_SIZE (sndcp_table); break;
#endif  /* GPRS */

#if defined (UART) AND defined (DTI)
      case UART_UL:   table =  uart_table;  n = TAB_SIZE (uart_table);  break;
#endif /* UART */
#ifdef BT_ADAPTER
      /* BTI DL */
      case BTP_G:     table =  btp_table;   n = TAB_SIZE (btp_table);   break;
#endif /* BT_ADAPTER */
#if defined FF_EOTD
      case SAP_NR(MNLC_DL):   table =  mnlc_table;  n = TAB_SIZE (mnlc_table);  break;
#endif

      default:        table =  NULL;        n = 0;                      break;
    }

#ifdef FF_EM_MODE
    /*
     * Only valid for the engineering mode as described above.
    */
    PTRACE_IN (opc);
#endif /* FF_EM_MODE */

    if (table NEQ 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 */

#if !defined (SMI) AND !defined (MFW)
        if (mode EQ 0 AND
            table NEQ aci_table)
        {
          PSENDX (ACI, P2D(prim));
        }
        else
#endif
        {
#ifdef SMI
          if (table->func EQ (T_VOID_FUNC) pei_not_supported)
          {
            subReturn = _pei_primitive (prim);
          }
          else
#endif
            JUMP (table->func) (P2D(prim));
        }
      }
      else
      {
#ifndef SMI
        pei_not_supported (P2D(prim));
#else
        subReturn = _pei_primitive (prim);
#endif
      }
      return PEI_OK;
    }
#ifdef SMI
    else
    {
      subReturn = _pei_primitive (prim);
    }
#endif

    /*
     * Primitive is no GSM Primitive
     * then forward to the environment
     */
#ifdef SMI
    if (subReturn EQ PEI_ERROR)
    {
#endif
#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
#ifdef SMI
    }
#endif
  }
#ifdef SMI
  else
  {
    subReturn = _pei_primitive (prim);
  }
#endif

  return PEI_OK;
}


/*
+--------------------------------------------------------------------+
| PROJECT : GSM-F&D (8411)              MODULE  : ACI_PEI            |
| STATE   : code                        ROUTINE : pei_init           |
+--------------------------------------------------------------------+

  PURPOSE : Initialize Protocol Stack Entity

*/
LOCAL SHORT pei_init (T_HANDLE handle)
{
#ifdef FF_ATI
#ifdef UART
  EXTERN void urt_init (void);
#endif
#endif

  aci_handle = handle;

  TRACE_FUNCTION ("pei_init()");

  if (hCommSIM < VSI_OK)
  {
    if ((hCommSIM = vsi_c_open (VSI_CALLER SIM_NAME)) < VSI_OK)
      return PEI_ERROR;
  }
#ifdef FF_ESIM
  if (hCommESIM < VSI_OK) /* open channel to ESIM entity */
  {
    if ((hCommESIM = vsi_c_open (VSI_CALLER ESIM_NAME)) < VSI_OK)
      return PEI_ERROR;
  }
#endif
  if (hCommMM < VSI_OK)
  {
    if ((hCommMM = vsi_c_open (VSI_CALLER MM_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;
  }

#ifdef UART
  if (hCommUART < VSI_OK)
  {
    if ((hCommUART = vsi_c_open (VSI_CALLER UART_NAME)) < VSI_OK)
      return PEI_ERROR;
  }
#endif

  if (hCommPL < VSI_OK)
  {
    if ((hCommPL = vsi_c_open (VSI_CALLER PL_NAME)) < VSI_OK)
      return PEI_ERROR;
  }

#if defined FF_EOTD
  if (hCommLC < VSI_OK)
  {
    if ((hCommLC = vsi_c_open (VSI_CALLER LC_NAME)) < VSI_OK)
      return PEI_ERROR;
  }
#endif

#ifdef FF_TCP_IP
/*#ifndef _SIMULATION_*/
  if (hCommAAA < VSI_OK)
  {
    if ((hCommAAA = vsi_c_open (VSI_CALLER AAA_NAME)) < VSI_OK)
      return PEI_ERROR;
  }
/*#endif*/
#endif

#if defined FF_TRACE_OVER_MTST
  if (hCommMTST < VSI_OK)
  {
    if ((hCommMTST = vsi_c_open (VSI_CALLER "MTST")) < VSI_OK)
      return PEI_ERROR;
  }
#endif

  if (hCommACI < VSI_OK)
  {
    if ((hCommACI = vsi_c_open (VSI_CALLER ACI_NAME)) < VSI_OK)
      return PEI_ERROR;
  }

#ifdef FAX_AND_DATA
#ifndef USE_L1FD_FUNC_INTERFACE
  if (hCommRA < VSI_OK)
  {
    if ((hCommRA = vsi_c_open (VSI_CALLER RA_NAME)) < VSI_OK)
      return PEI_ERROR;
  }
#endif
  if (hCommL2R < VSI_OK)
  {
    if ((hCommL2R = vsi_c_open (VSI_CALLER L2R_NAME)) < VSI_OK)
      return PEI_ERROR;
  }

  if (hCommTRA < VSI_OK)
  {
    /* TRA_NAME i.e "L2R" on account of TRA being no real entity */
    if ((hCommTRA = vsi_c_open (VSI_CALLER TRA_NAME)) < VSI_OK)
      return PEI_ERROR;
  }

#ifdef FF_FAX
  if (hCommT30 < VSI_OK)
  {
    if ((hCommT30 = vsi_c_open (VSI_CALLER T30_NAME)) < VSI_OK)
      return PEI_ERROR;
  }
#endif /* FF_FAX */
#endif /* FAX_AND_DATA */

#ifdef FF_GPF_TCPIP
  if (hCommTCPIP < VSI_OK)
  {
    if ((hCommTCPIP = vsi_c_open (VSI_CALLER TCPIP_NAME)) < VSI_OK)
      return PEI_ERROR;
  }
#endif

#if defined (CO_TCPIP_TESTAPP) || defined  (CO_BAT_TESTAPP)
  if (hCommAPP < VSI_OK)
  {
    if ((hCommAPP = vsi_c_open (VSI_CALLER APP_NAME)) < VSI_OK)
      return PEI_ERROR;
  }
#endif

#ifdef CO_UDP_IP
  if (hCommUDP < VSI_OK)
  {
    if ((hCommUDP = vsi_c_open (VSI_CALLER UDP_NAME)) < VSI_OK)
      return PEI_ERROR;
  }
  if (hCommIP < VSI_OK)
  {
    if ((hCommIP = vsi_c_open (VSI_CALLER IP_NAME)) < VSI_OK)
      return PEI_ERROR;
  }
#endif 

#ifdef FF_WAP
  if (hCommWAP < VSI_OK)
  {
    if ((hCommWAP = vsi_c_open (VSI_CALLER WAP_NAME)) < VSI_OK)
      return PEI_ERROR;
  }
#endif

#if defined (FF_WAP) || defined (GPRS) || defined (FF_SAT_E)
  if (hCommPPP < VSI_OK)
  {
    if ((hCommPPP = vsi_c_open (VSI_CALLER PPP_NAME)) < VSI_OK)
      return PEI_ERROR;
  }
#endif

#ifdef FF_EM_MODE
  if (hCommRR < VSI_OK)
  {
    if ((hCommRR = vsi_c_open (VSI_CALLER RR_NAME)) < VSI_OK)
      return PEI_ERROR;
  }
#endif /* FF_EM_MODE */

#if defined (GPRS) AND defined (DTI)
  if (hCommGMM < VSI_OK)
  {
    if ((hCommGMM = vsi_c_open (VSI_CALLER GMM_NAME)) < VSI_OK)
      return PEI_ERROR;
  }
  if (hCommSM < VSI_OK)
  {
    if ((hCommSM = vsi_c_open (VSI_CALLER SM_NAME)) < VSI_OK)
      return PEI_ERROR;
  }
  if (hCommSNDCP < VSI_OK)
  {
    if ((hCommSNDCP = vsi_c_open (VSI_CALLER SNDCP_NAME)) < VSI_OK)
      return PEI_ERROR;
  }

#ifdef FF_PKTIO
  if (hCommPKTIO < VSI_OK)
  {
    if ((hCommPKTIO = vsi_c_open (VSI_CALLER PKTIO_NAME)) < VSI_OK)
    {
      TRACE_EVENT ("cannot open PKTIO");
      return PEI_ERROR;
    }
  }
#endif
#endif /* GPRS */
#ifdef FF_PSI
  if (hCommPSI < VSI_OK)
  {
    if ((hCommPSI = vsi_c_open (VSI_CALLER PSI_NAME)) < VSI_OK)
    {
      TRACE_EVENT ("cannot open PSI");
      return PEI_ERROR;
    }
  }
#endif /*FF_PSI*/
#ifdef BT_ADAPTER
  if (hCommBTI < VSI_OK)
  {
    if ((hCommBTI = vsi_c_open (VSI_CALLER BTI_NAME)) < VSI_OK)
      return PEI_ERROR;
  }
#endif /* BT_ADAPTER */

#ifdef FF_GPF_TCPIP
  if (hCommDCM < VSI_OK)
  {
    if ((hCommDCM = vsi_c_open (VSI_CALLER DCM_NAME)) < VSI_OK)
      return PEI_ERROR;
  }
#endif /* FF_GPF_TCPIP */

  if (hCommL1 < VSI_OK)
  {
  if ((hCommL1 = vsi_c_open (VSI_CALLER L1_NAME)) < VSI_OK)
      return PEI_ERROR;
  }

/* FreeCalypso addition to fix R2D start race condition */
#if (MMI != 0)
  if (!r2d_is_running)
    return PEI_ERROR;
#endif

#ifdef DTI
#ifdef _SIMULATION_
  /*
   * initialize dtilib for this entity
   */
  aci_hDTI = dti_init (
    4,
    handle,
    DTI_DEFAULT_OPTIONS,
    aci_pei_sig_callback
    );
#else
  /*
   * initialize dtilib for this entity
   */
  aci_hDTI = dti_init (
    ACI_INSTANCES * UART_INSTANCES,
    handle,
    DTI_DEFAULT_OPTIONS,
    aci_pei_sig_callback
    );
#endif
#endif /* DTI */

#ifdef DTI
  if(aci_hDTI EQ NULL)
  {
    TRACE_EVENT ("ACI DTI handle is 0");
    return PEI_ERROR;
  }
#endif

#ifdef SMI
  /*
   * initialize the slim man machine interface
   */
  if (_pei_init () EQ PEI_ERROR)
    return PEI_ERROR;
#endif

#ifdef ACI
  audio_Init ( NULL );
/* rx_Init( ) is not needed at the moment for ATI only version...
   causes the software not to start because it needs CST stack to be started first...
  rx_Init    ( NULL ); */
  pwr_Init   ( NULL );
#endif


  /*
   * Initialize BT_ADAPTER
   */
#if defined(FF_ATI) && defined(BT_ADAPTER)
  if (btiaci_init(aci_handle) EQ BTI_NAK)
    return PEI_ERROR;
  btiaci_at_init_req();
#endif

#ifdef FF_ATI
  init_ati ();
#endif /* FF_ATI */

#ifdef UART
  cmhUART_lst_init ();
#endif
#ifdef DTI  
  psaACI_Init();
  dti_cntrl_init();
#endif
#if defined (FF_PSI) AND defined (DTI)
  cmhPSI_lst_init();
#endif /*FF_PSI*/
  /*
   *  initialize CMH's
   */
  cmh_Init  ();
  cmh_Reset ( CMD_SRC_LCL, FALSE );
#ifdef FF_ATI
  cmh_Reset ( CMD_SRC_ATI_1, FALSE );
  cmh_Reset ( CMD_SRC_ATI_2, FALSE );
  cmh_Reset ( CMD_SRC_ATI_3, FALSE );
  cmh_Reset ( CMD_SRC_ATI_4, FALSE );
#ifdef SIM_TOOLKIT
  cmh_Reset ( CMD_SRC_ATI_5, FALSE );
#endif /* SIM_TOOLKIT */
#if defined FF_EOTD
  cmh_Reset ( CMD_SRC_ATI_6, FALSE );
#endif /* FF_EOTD */
#endif /* FF_ATI */

  /*
   *  initialize PSA's
   */
#if defined (SIM_TOOLKIT)
  psaSAT_Init();    /* has to be done first! */
#endif
  psaSS_Init();
#ifdef ACI
  psaMMI_Init();
#endif
  psaCC_Init();
  psaMM_Init();
  psaSIM_Init(ACI_INIT_TYPE_ALL);
  psaMMI_Init();
  psaSMS_Init();

#ifdef FAX_AND_DATA
  psaRA_Init();
  psaL2R_Init();
#ifdef FF_FAX
  psaT30_Init();
#endif /* FF_FAX */
#endif /* FAX_AND_DATA */

#ifdef GPRS
  psa_GPRSInit();
#endif /* GPRS */

#if defined (FF_WAP) || defined (FF_TCP_IP) || defined(FF_GPF_TCPIP)|| defined (FF_SAT_E)
  psaPPP_Init();
#endif /* (FF_WAP) (FF_TCP_IP) (FF_GPF_TCPIP) (FF_SAT_E) */

#if defined(CO_UDP_IP) || defined(FF_GPF_TCPIP)
  psaTCPIP_Init();
#endif /* CO_UDP_IP || FF_GPF_TCPIP */

#if defined(FF_GPF_TCPIP)
  dcm_init() ;
#endif /* FF_GPF_TCPIP */


#ifdef AT_ADAPTER
  psaBTI_Init();
#endif /* AT_ADAPTER */

  /*
   *  Initialize Message Coder Decoder
   */
  ccd_init ();
  /*
   * Initialize the UART module
   */
#ifdef FF_ATI
#ifdef UART
  urt_init ();
#endif
  ati_cmd_init ();
#endif

  /*
   * Initialize Advice of Charge Module
   */
  aoc_init_calltable ();

  /*
   * Initialize phonebook
   */
#ifdef TI_PS_FFS_PHB
  pb_init ();
#else
  phb_Init ();
#endif
  rdlPrm_init();

  /* The high level audio driver is initialised here */
  hl_audio_drv_init();

#if defined(_TARGET_)
  cmhCC_rd_mode_FFS(AUTOM_REP_NOT_PRESENT,READ_RDLmode); /* read redial mode from FFS */
#endif /* _TARGET_*/

#ifdef DTI
#ifdef _SIMULATION_
#ifdef FF_ATI_BAT
  ati_bat_reset();
#endif
  ati_src_tst_init( CMD_SRC_EXT );
#endif
#endif

#if defined FF_EOTD
  ati_src_lc_init( CMD_SRC_EXT );
#endif /*  FF_EOTD */

  /* identify ourselves in the boot message output */
  vsi_o_ttrace(VSI_CALLER TC_SYSTEM, firmware_version_str);

#ifdef MFW
  /*
   * initialise ACI extension handler
   * and start MMI Logic
   */
  aci_ext_init ();
  mmi_main ();
#endif

#ifdef FF_MMI_RIV
  acia_init();
#endif

  return PEI_OK;
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-F&D (8411)              MODULE  : ACI_PEI            |
| STATE   : code                        ROUTINE : pei_timeout        |
+--------------------------------------------------------------------+

  PURPOSE : Process timeout

*/

LOCAL SHORT pei_timeout (USHORT index)
{
  tim_exec_timeout (index);

  return PEI_OK;
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-F&D (8411)             MODULE  : ACI_PEI             |
| STATE   : code                       ROUTINE : mmi_pei_signal      |
+--------------------------------------------------------------------+

  PURPOSE : Functional interface to signal a primitive.

*/

LOCAL SHORT pei_signal ( ULONG  opc, void *primData )
{
#ifdef OPTION_SIGNAL
#ifndef _TMS470
  TRACE_FUNCTION ("pei_signal ()");
#endif /* _TMS470 */

  switch (opc)
  {
#ifdef FF_MMI_RIV
    case ACI_RIV_CMD_REQ:
      aci_aci_riv_cmd_req ((T_ACI_RIV_CMD_REQ *) primData);
      break;
#endif
#ifdef FAX_AND_DATA
    case RA_ACTIVATE_CNF:
      psa_ra_activate_cnf
      (
        (T_RA_ACTIVATE_CNF *) primData
      );
      break;
    case RA_DEACTIVATE_CNF:
      psa_ra_deactivate_cnf
      (
        (T_RA_DEACTIVATE_CNF *) primData
      );
      break;
#ifdef FF_FAX
    case RA_MODIFY_CNF:
      psa_ra_modify_cnf
      (
        (T_RA_MODIFY_CNF *) primData
      );
      break;
#endif /* FF_FAX */
#endif /* FAX_AND_DATA */

#ifdef FF_ATI
/* ES!! #if !defined (MFW) */
    case ACI_CMD_REQ:
      aci_aci_cmd_req
      (
        (T_ACI_CMD_REQ *) primData
      );
      break;
    case ACI_ABORT_REQ:
      aci_aci_abort_req
      (
        (T_ACI_ABORT_REQ *) primData
      );
      break;
#endif /* FF_ATI */
  }
#endif /* OPTION_SIGNAL */

  return PEI_OK;
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-F&D (8411)              MODULE  : ACI_PEI            |
| STATE   : code                        ROUTINE : pei_exit           |
+--------------------------------------------------------------------+

  PURPOSE : Close Resources and terminate

*/
LOCAL SHORT pei_exit (void)
{
  U8 i;

  TRACE_FUNCTION ("pei_exit()");

  /*
   * clean up communication
   */
#ifdef DTI
  /* close all open dti channels */
  dti_cntrl_close_all_connections();

  /*
   * Shut down dtilib communication
   */
  dti_deinit(aci_hDTI);
#endif

#ifdef FF_TRACE_OVER_MTST
  vsi_c_close (VSI_CALLER hCommMTST);
  hCommMTST = VSI_ERROR;
#endif

  vsi_c_close (VSI_CALLER hCommSIM);
  hCommSIM = VSI_ERROR;

  vsi_c_close (VSI_CALLER hCommSIM);
  hCommSIM = VSI_ERROR;

  vsi_c_close (VSI_CALLER hCommMM);
  hCommMM = VSI_ERROR;

  vsi_c_close (VSI_CALLER hCommCC);
  hCommCC = VSI_ERROR;

#ifdef FF_ESIM
  vsi_c_close (VSI_CALLER hCommESIM);
  hCommESIM = VSI_ERROR;
#endif

  vsi_c_close (VSI_CALLER hCommSS);
  hCommSS = VSI_ERROR;

  vsi_c_close (VSI_CALLER hCommSMS);
  hCommSMS = VSI_ERROR;

#ifdef UART
  vsi_c_close (VSI_CALLER hCommDTI);
  hCommDTI = VSI_ERROR;

  vsi_c_close (VSI_CALLER hCommUART);
  hCommUART = VSI_ERROR;
#endif
#ifdef FF_PSI
  vsi_c_close (VSI_CALLER hCommPSI);
  hCommPSI = VSI_ERROR;
#endif /*FF_PSI*/
/*#if defined SMI */
/*  vsi_c_close (VSI_CALLER hCommSMI);*/
/*  hCommSMI = VSI_ERROR;*/
/*#elif defined MFW */
/*  vsi_c_close (VSI_CALLER hCommMMI);*/
/*  hCommMMI = VSI_ERROR;*/
/*#elif defined ACI*/
  vsi_c_close (VSI_CALLER hCommACI);
  hCommACI = VSI_ERROR;
/*#endif*/

  vsi_c_close (VSI_CALLER hCommPL);
  hCommPL = VSI_ERROR;

#if defined FF_EOTD
  vsi_c_close (VSI_CALLER hCommLC);
  hCommLC = VSI_ERROR;
#endif

#ifdef FAX_AND_DATA
#ifndef USE_L1FD_FUNC_INTERFACE
  vsi_c_close (VSI_CALLER hCommRA);
  hCommRA = VSI_ERROR;
#endif
  vsi_c_close (VSI_CALLER hCommL2R);
  hCommL2R = VSI_ERROR;

  vsi_c_close (VSI_CALLER hCommTRA);
  hCommTRA = VSI_ERROR;

#ifdef FF_FAX
  vsi_c_close (VSI_CALLER hCommT30);
  hCommT30 = VSI_ERROR;
#endif /* FF_FAX */
#endif /* FAX_AND_DATA */

#ifdef FF_GPF_TCPIP
  vsi_c_close (VSI_CALLER hCommTCPIP);
  hCommTCPIP = VSI_ERROR;
#endif

#if defined (CO_TCPIP_TESTAPP) || defined  (CO_BAT_TESTAPP)
  vsi_c_close (VSI_CALLER hCommAPP);
  hCommAPP = VSI_ERROR;
#endif

#ifdef CO_UDP_IP
  vsi_c_close (VSI_CALLER hCommUDP);
  hCommUDP = VSI_ERROR;
  vsi_c_close (VSI_CALLER hCommIP);
  hCommIP = VSI_ERROR;
#endif

#ifdef FF_WAP
  vsi_c_close (VSI_CALLER hCommWAP);
  hCommWAP = VSI_ERROR;
#endif

#if defined (FF_WAP) || defined (GPRS) || defined (FF_SAT_E)
  vsi_c_close (VSI_CALLER hCommPPP);
  hCommPPP = VSI_ERROR;
#endif

#ifdef GPRS
  vsi_c_close (VSI_CALLER hCommGMM);
  hCommGMM = VSI_ERROR;

  vsi_c_close (VSI_CALLER hCommSM);
  hCommSM = VSI_ERROR;

  vsi_c_close (VSI_CALLER hCommSNDCP);
  hCommSNDCP = VSI_ERROR;
#ifdef FF_PKTIO
  vsi_c_close (VSI_CALLER hCommPKTIO);
  hCommPKTIO = VSI_ERROR;
#endif
#endif /* GPRS */

#ifdef BT_ADAPTER
  vsi_c_close (VSI_CALLER hCommBTI);
  hCommBTI = VSI_ERROR;
#endif /* BT_ADAPTER */

  vsi_c_close (VSI_CALLER hCommL1);
  hCommL1 = VSI_ERROR;

#ifdef SMI
  _pei_exit ();
#endif

  /*
   * deallocate all channels
   * for non existing channels, this will just return
   */
 #ifdef FF_ATI
  for (i = 1; i < CMD_SRC_MAX; i++)
  {
    ati_finit(i);
  }
#endif /* FF_ATI */

  /* Free still occupied pointers in ccShrdPrm */
  for (i = 0; i < MAX_CALL_NR; i++)
  {
    if (ccShrdPrm.ctb[i] NEQ NULL)
    {
      psaCC_FreeCtbNtry (i);
    }
  }

  /* Deallocation of elements (2nd to last) in linked list PNN */
  while (mmShrdPrm.PNNLst.next NEQ NULL)
  {
    T_pnn_name *nextnext = mmShrdPrm.PNNLst.next->next;
    ACI_MFREE (mmShrdPrm.PNNLst.next);
    mmShrdPrm.PNNLst.next = nextnext;
  }

#ifdef DTI
#ifdef _SIMULATION_

#ifdef SIM_TOOLKIT
  satShrdPrm.run_at_id = -1;
#endif /* SIM_TOOLKIT */

  ati_src_tst_finit();
#endif /* _SIMULATION_ */
#endif /* DTI */

#if defined FF_EOTD
  ati_src_lc_finit();
#endif /*  FF_EOTD */

  rdlPrm_exit();

#ifdef UART
  cmhUART_CleanComParameterList();
#endif


#ifdef FF_PSI
  cmhPSI_clean_all_elem();
  cmhPSI_CleanDcbParameterList();
#endif

#ifdef UART
  cmhUART_lst_exit();
#endif
  
  return PEI_OK;
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-F&D (8411)              MODULE  : ACI_PEI            |
| STATE   : code                        ROUTINE : pei_config         |
+--------------------------------------------------------------------+

  PURPOSE : Dynamic Configuration

*/

#if !defined (NCONFIG)

LOCAL const KW_DATA kwtab[] =
{
  ACI_KEY_SEQUENCE,     KEY_SEQUENCE,
  ACI_KEY_PRESS,        KEY_PRESS,
  ACI_KEY_RELEASE,      KEY_RELEASE,
  ACI_START_AOC,        START_AOC,
  ACI_CPOL_MODE,        CPOL_MODE,
  ACI_CPOL_IDX2,        CPOL_IDX2,
  ACI_ATI_VIA_TIF,      ATI_VIA_TIF,
/* new here*/
#ifdef _SIMULATION_
  ACI_DATA_INPUT,       DATA_INPUT,
#endif /* _SIMULATION_ */
  "",                   0
};

#endif

#ifdef _SIMULATION_

#ifdef UART
EXTERN void cmhUART_startConnection (UBYTE srcId,
                                     T_ACI_DEVICE_TYPE device_type);
#endif /* UART */
EXTERN UBYTE uart_new_source (UBYTE device, UBYTE dlci);
EXTERN void uart_new_source_for_aci_src_tst( UBYTE src_id, UBYTE device, UBYTE dlci );
#endif

LOCAL SHORT pei_config (char *inString)
{
#ifdef FF_ATI
  BOOL alreadyCalled = FALSE;
#endif

#if !defined (NCONFIG)
  char    *s = inString;
  SHORT    valno;
  SHORT    keyno;
  char    *keyw;
  char    *val[10];

  TRACE_FUNCTION ("pei_config()");

#ifdef UART
  if (!strcmp(inString, "UART_19200"))
  {
    cmhUART_SetDataRate((UBYTE) CMD_SRC_ATI, UART_IO_SPEED_19200);
    return PEI_OK;
  }
#endif

  if (!strcmp(inString, "ATI_TRC"))
  { /* AT%CPRIM="MMI","CONFIG ATI_TRC" */
    EXTERN BOOL _g_ati_trc_enabled;
    _g_ati_trc_enabled = TRUE; /* only switch on possible */
    return PEI_OK;
  }

#ifdef _SIMULATION_

#ifdef UART
  if (!strcmp(inString, "START_DTI"))
  {
    int i;
    UBYTE srcId;

    for (i=0;i<UART_INSTANCES;i++)
    {
      srcId = uart_new_source ((UBYTE)i, UART_DLCI_NOT_MULTIPLEXED);
      cmhUART_startConnection (srcId, DEVICE_TYPE_URT);
    }
    return PEI_OK;
  }
  if(!strcmp(inString, "EXPAND_ATI_SRC_TST"))
  {
    UBYTE srcId = ati_src_tst_get_src_id( (UBYTE) CMD_SRC_EXT );

    if ( srcId EQ DTI_MNG_ID_NOTPRESENT )
      return PEI_OK;

    uart_new_source_for_aci_src_tst( srcId, 0, NOT_PRESENT_8BIT );
    cmhUART_startConnection (srcId, DEVICE_TYPE_URT);
    return PEI_OK;
  }

  if(!strncmp(inString, "ADD_TST_SRC", 11)) /* parameter [UART] */
  {
    char *end = inString + 11;
    UBYTE srcId;

    srcId = ati_src_tst_get_src_id( (UBYTE) CMD_SRC_UNKNOWN );

    if ( srcId EQ DTI_MNG_ID_NOTPRESENT )
      return PEI_OK;

    while ( *end EQ ' ' )
      end ++;

    if ( !strcmp( end, "UART"))
    {
      uart_new_source_for_aci_src_tst( srcId, srcId, NOT_PRESENT_8BIT );
      cmhUART_startConnection (srcId, DEVICE_TYPE_URT);
    }

    if ( !strcmp( end, "UART_DP"))  /* for dual port testing */
    {
      static UBYTE device=0;  /* lint: at least init to something */
      uart_new_source_for_aci_src_tst( srcId, device, UART_DLCI_NOT_MULTIPLEXED );
      cmhUART_startConnection (srcId, DEVICE_TYPE_URT);
      device++;
    }

    return PEI_OK;
  }
#endif /* UART */

#ifdef DTI
  if (!strcmp(inString, "STOP_SRC_TST"))
  {
EXTERN void ati_src_tst_finit (void);
    ati_src_tst_finit ();
  }
#endif

#if defined SMI OR defined MFW
  if (!strcmp(inString, "CONC_SMS_TST"))
  {
EXTERN void concSMS_InitForTesting();
      concSMS_InitForTesting();
      return PEI_OK;
  }
#endif /*#if defined SMI OR defined MFW*/

  if (!strcmp(inString, "ENABLE_VOCODER_TST"))
  {
EXTERN void hl_audio_drv_initForTest();
       hl_audio_drv_initForTest();
     return PEI_OK;
  }

#endif /* _SIMULATION_ */

#ifdef GPRS
    /*
     * Class modification
     * Author: ANS
     * initial: 07-Nov-00
     */
    if(!strcmp(inString,"CLASS_CC"))
    {
      default_mobile_class = GMMREG_CLASS_CC;
      return PEI_OK;
    }
    if(!strcmp(inString,"CLASS_CG"))
    {
      default_mobile_class = GMMREG_CLASS_CG;
      return PEI_OK;
    }
    if(!strcmp(inString,"CLASS_BC"))
    {
      default_mobile_class = GMMREG_CLASS_BC;
      return PEI_OK;
    }
    if(!strcmp(inString,"CLASS_BG"))
    {
      default_mobile_class = GMMREG_CLASS_BG;
      return PEI_OK;
    }
    if(!strcmp(inString,"CLASS_B"))
    {
      default_mobile_class = GMMREG_CLASS_B;
      return PEI_OK;
    }
    if(!strcmp(inString,"CLASS_A"))
    {
      default_mobile_class = GMMREG_CLASS_A;
      return PEI_OK;
    }
    /*
     * End Class modification
     */

    /*
     * Attach mode modification
     * Author: BRZ
     * initial: 14-Apr-01
     */
    if(!strcmp(inString,"AUTO_ATTACH"))
    {
      automatic_attach_mode = CGAATT_ATTACH_MODE_AUTOMATIC;
      return PEI_OK;
    }
    if(!strcmp(inString,"MAN_ATTACH"))
    {
      automatic_attach_mode = CGAATT_ATTACH_MODE_MANUAL;
      return PEI_OK;
    }
    if(!strcmp(inString,"AUTO_DETACH"))
    {
      automatic_detach_mode = CGAATT_DETACH_MODE_ON;
      return PEI_OK;
    }
    if(!strcmp(inString,"MAN_DETACH"))
    {
      automatic_detach_mode = CGAATT_DETACH_MODE_OFF;
      return PEI_OK;
    }
    /*
     * End Attach mode modification
     */
#endif

#ifdef MFW
    if (!strncmp("MFWMOB ",s,7))
    {
        mfwExtIn(s+7);
        return PEI_OK;
    }
#endif

#ifdef _SIMULATION_
#ifdef MFW
    /*
     * Only for Windows: define several variants
     * of SIM LOCK pcm content
     */
    if (!strncmp("SIMLOCK",s,7))
    {
      EXTERN UBYTE sim_lock_mode;

      sim_lock_mode = atoi (s+8);
      return PEI_OK;
    }
#endif
#endif

#ifdef FF_TIMEZONE
    /*
     * simulate an incoming MMR_INFO_IND
     */
    if (!strncmp("TIMEZONE_TEST",s,13))
    {
      TRACE_EVENT ("pei_config() TIMEZONE_TEST");
      {
        PALLOC (mmr_info_ind, MMR_INFO_IND); /* is freed in psa_mmr_info_ind */        
        memcpy (mmr_info_ind, 0, sizeof (T_MMR_INFO_IND)); /* clear out all */
        memcpy (mmr_info_ind->short_name.text, "RFT", 3);  /* pseudo short name */
        mmr_info_ind->short_name.v_name  = 1;
        mmr_info_ind->short_name.c_text  = 3;
        memcpy (mmr_info_ind->full_name.text, "Ramsch Fusch Tinneff", 20);  /* pseudo long name  */
        mmr_info_ind->full_name.v_name  = 1;
        mmr_info_ind->full_name.c_text  = 20;
        mmr_info_ind->ntz.v_tz          = 1;
        mmr_info_ind->ntz.tz            = 0x19;  /* simulate -2:45h away from GMT */
        mmr_info_ind->time.v_time       = 1;
        mmr_info_ind->time.day          = 30;    /* 30. February 2004 ;~) */
        mmr_info_ind->time.month        = 02;
        mmr_info_ind->time.year         = 04;
        mmr_info_ind->time.hour         = 11;
        mmr_info_ind->time.minute       = 55;    /* this stuff is really 5 before 12 */
        mmr_info_ind->time.second       = 59;
        mmr_info_ind->plmn.v_plmn       = 1;
        mmr_info_ind->plmn.mcc[0]       = 0x02;
        mmr_info_ind->plmn.mcc[1]       = 0x06;
        mmr_info_ind->plmn.mcc[2]       = 0x02;
        mmr_info_ind->plmn.mnc[0]       = 0x00;
        mmr_info_ind->plmn.mnc[1]       = 0x01;
        mmr_info_ind->plmn.mnc[2]       = 0x0F;
        
        psa_mmr_info_ind(mmr_info_ind);
        return PEI_OK;
      }
    }
#endif

  TRACE_EVENT_P1("pei_config() %s", s);

  tok_init(s);

  /*
   * Parse next keyword and number of variables
   */
  while ((valno = tok_next(&keyw,val)) NEQ TOK_EOCS)
  {
    switch ((keyno = tok_key((KW_DATA *)kwtab,keyw)))
    {
#ifdef MFW
      case KEY_SEQUENCE:
      {
        if (valno EQ 1)
        {
          mfw_keystroke (val[0]);
        }
        else
        {
          TRACE_ERROR ("[PEI_CONFIG]: Wrong Number of Parameters");
        }
        break;
      }
#endif

#ifdef MFW
      case KEY_PRESS:
      {
        if (valno EQ 1)
        {
          mfw_keystroke_long (val[0], 1);
        }
        else
        {
          TRACE_ERROR ("[PEI_CONFIG]: Wrong Number of Parameters");
        }
        break;
      }
#endif

#ifdef MFW
      case KEY_RELEASE:
      {
        if (valno EQ 1)
        {
          mfw_keystroke_long (val[0], 0);
        }
        else
        {
          TRACE_ERROR ("[PEI_CONFIG]: Wrong Number of Parameters");
        }
        break;
      }
#endif

      case START_AOC:
      {
        T_FWD_CHG_ADVICE_INV    charge;
        T_chargingInformation * aoc_para;

        aoc_para = &charge.forwardChargeAdviceArg.chargingInformation;

        TRACE_EVENT ("Set AoC Parameter");

        aoc_para->v_e1 =  TRUE;
        aoc_para->e1.c_e_val  = 1;
        aoc_para->e1.e_val[0] = 60;
        aoc_para->v_e2 =  TRUE;
        aoc_para->e2.c_e_val  = 1;
        aoc_para->e2.e_val[0] = 140;
        aoc_para->v_e3 =  TRUE;
        aoc_para->e3.c_e_val  = 1;
        aoc_para->e3.e_val[0] = 100;
        aoc_para->v_e4 =  TRUE;
        aoc_para->e4.c_e_val  = 1;
        aoc_para->e4.e_val[0] = 250;
        aoc_para->v_e5 =  FALSE;
        aoc_para->e5.c_e_val  = 0;
        aoc_para->e5.e_val[0] = 0;
        aoc_para->v_e6 =  FALSE;
        aoc_para->e6.c_e_val  = 0;
        aoc_para->e6.e_val[0] = 0;
        aoc_para->v_e7 =  TRUE;
        aoc_para->e7.c_e_val  = 2;
        aoc_para->e7.e_val[0] = 0x2;
        aoc_para->e7.e_val[1] = 0x58;

        aoc_parameter(0, &charge);
        aoc_info (0, AOC_START_AOC);
        break;
      }

#ifdef _SIMULATION_
      case CPOL_MODE:
      {
#ifdef FF_ATI
        if (valno EQ 1)
        {
          cpolMode = atoi(val[0]);
        }
        else
        {
          TRACE_ERROR ("[PEI_CONFIG]: Wrong Number of Parameters");
        }
#else
        TRACE_ERROR ("[PEI_CONFIG]: AT Command Interpreter Not Supported");
#endif
        break;
      }

      case CPOL_IDX2:
      {
#ifdef FF_ATI
        if (valno EQ 1)
        {
          cpolIdx2 = atoi(val[0]);
        }
        else
        {
          TRACE_ERROR ("[PEI_CONFIG]: Wrong Number of Parameters");
        }
#else
        TRACE_ERROR ("[PEI_CONFIG]: AT Command Interpreter Not Supported");
#endif
        break;
      }
#endif

#ifdef FF_ATI
#ifdef UART
      case ATI_VIA_TIF:
      {
        EXTERN BOOL atiViaTif;

        if (valno EQ 1)
        {
          if (strcmp (val[0], "ON") EQ 0)
            atiViaTif = TRUE;
          else if (strcmp (val[0], "OFF") EQ 0)
            atiViaTif = FALSE;
          else
            TRACE_ERROR ("[PEI_CONFIG]: Wrong Parameter Value");
        }
        else
        {
          TRACE_ERROR ("[PEI_CONFIG]: Wrong Number of Parameters");
        }
        break;
      }
#endif /* UART */
#endif

      default:
      {
#ifdef FF_ATI
        if ( ( toupper ( inString[0] ) ) EQ 'A' AND
             ( toupper ( inString[1] ) ) EQ 'T'     )
        {
          USHORT len = 0;

          /*
           *---------------------------------------------------------
           * parsing algorithm is not suitable for transparent data
           * transfer, call aciCommand only once
           *---------------------------------------------------------
           */
          if (!alreadyCalled)
          {
            while (inString[len] NEQ ' ' AND inString[len] NEQ '\0')
              len++;

            inString[len] = '\0';

            ati_execute_config_cmd ((UBYTE*)inString, len);
          }

          alreadyCalled = TRUE;
        }
        else
#endif
        {
#ifdef SMI
          return _pei_config (inString);
#else
          TRACE_ERROR ("[PEI_CONFIG]: Illegal Keyword");
#endif
        }
        break;
      }
    }
  }
#endif

  return PEI_OK;
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-F&D (8411)              MODULE  : ACI_PEI            |
| STATE   : code                        ROUTINE : pei_monitor        |
+--------------------------------------------------------------------+

  PURPOSE : Monitoring of physical Parameters

*/
LOCAL SHORT pei_monitor (void ** monitor)
{
  TRACE_FUNCTION ("pei_monitor()");

#ifdef SMI
  _pei_monitor (monitor);
#else
  aci_mon.version = VERSION_ACI;
#endif

  *monitor = &aci_mon;

  return PEI_OK;
}


/*
+--------------------------------------------------------------------+
| PROJECT : GSM-F&D (8411)              MODULE  : ACI_PEI            |
| STATE   : code                        ROUTINE : pei_create         |
+--------------------------------------------------------------------+

  PURPOSE : Create the Protocol Stack Entity

*/

GLOBAL SHORT aci_pei_create (T_PEI_INFO **info)
{
  static const T_PEI_INFO pei_info =
  {
    ACI_NAME,
    {
      pei_init,
      pei_exit,
      pei_primitive,
      pei_timeout,
      pei_signal,
      NULL,             /* no run function     */
      pei_config,
      pei_monitor,
    },
#if defined (ACI)
    3072,     /* Stack Size      */
#endif
#if defined (SMI)
    3072,     /* Stack Size      */
#endif
#if defined (MFW)
    4096,     /* Stack Size      */
#endif
#if defined (FF_MMI_RIV)
    3072,     /* Stack Size      */
#endif
    20,       /* Queue Entries   */
#if defined (ACI)
    100,      /* Priority        */
#endif
#if defined (SMI)
    100,      /* Priority        */
#endif
#if defined (MFW)
    100,      /* Priority        */
#endif
#if defined (FF_MMI_RIV)
    100,      /* Priority        */
#endif

    MAX_ACI_TIMER, /* number of timer */
    0x03|PRIM_NO_SUSPEND /* flags           */
  };

  TRACE_FUNCTION ("pei_create()");

  /*
   *  Close Resources if open
   */

  if (first_access)
    first_access = FALSE;
  else
    pei_exit ();

  /*
   *  Export startup configuration data
   */

  *info = (T_PEI_INFO *)&pei_info;

  return PEI_OK;
}


#endif  /* ACI_PEI_C */