diff g23m/condat/ms/src/aci/psa_simp.c @ 0:509db1a7b7b8

initial import: leo2moko-r1
author Space Falcon <falcon@ivan.Harhan.ORG>
date Mon, 01 Jun 2015 03:24:05 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/g23m/condat/ms/src/aci/psa_simp.c	Mon Jun 01 03:24:05 2015 +0000
@@ -0,0 +1,1448 @@
+/*
++-----------------------------------------------------------------------------
+|  Project :  GSM-PS (6147)
+|  Modul   :  PSA_SIMP
++-----------------------------------------------------------------------------
+|  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 defines the processing functions for the
+|             primitives send to the protocol stack adapter by the
+|             subscriber identity module.
++-----------------------------------------------------------------------------
+*/
+
+#ifndef PSA_SIMP_C
+#define PSA_SIMP_C
+#endif
+
+#include "aci_all.h"
+
+/*==== INCLUDES ===================================================*/
+#include "aci_cmh.h"
+#include "ati_cmd.h"
+#include "aci_cmd.h"
+
+#ifdef FAX_AND_DATA
+#include "aci_fd.h"
+#endif    /* of #ifdef FAX_AND_DATA */
+
+#ifdef DTI
+#include "dti.h"
+#include "dti_conn_mng.h"
+#include "dti_cntrl_mng.h"
+#endif
+
+#include "aci.h"
+#include "psa.h"
+#include "psa_sim.h"
+#include "psa_sms.h"
+#include "psa_mmi.h"
+#include "cmh.h"
+#include "cmh_mm.h"
+#include "cmh_sim.h"
+#include "phb.h"
+#include "aoc.h"
+
+#ifdef SIM_TOOLKIT
+#include "psa_cc.h"
+#include "aci_mem.h"
+#include "psa_sat.h"
+#include "cmh_sat.h"
+#endif /* SIM_TOOLKIT */
+
+#include "aci_ext_pers.h"       /* for SIM locking constants and prototypes. */
+#include "aci_slock.h"    /* for SIM locking constants and prototypes. */
+
+#ifdef SIM_PERS
+#include "general.h" // included for compilation error UINT8 in sec_drv.h
+#include "sec_drv.h" 
+#endif
+/*==== CONSTANTS ==================================================*/
+
+
+/*==== TYPES ======================================================*/
+
+
+/*==== EXPORT =====================================================*/
+
+
+/*==== VARIABLES ==================================================*/
+
+/* Remember the last catched T_SIM_MMI_INSERT_IND, null if the last one as not remembered or freed */
+T_SIM_MMI_INSERT_IND *last_sim_mmi_insert_ind = NULL;
+#ifdef SIM_PERS
+ EXTERN T_SEC_DRV_CONFIGURATION *cfg_data ;
+ EXTERN  T_ACI_SIM_CONFIG aci_slock_sim_config;
+#endif
+ EXTERN void psaSIM_Insert_Continued(T_SIM_MMI_INSERT_IND *sim_mmi_insert_ind);
+
+
+/*==== FUNCTIONS ==================================================*/
+
+
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)         MODULE  : PSA_SIMP                |
+|                                 ROUTINE : psa_sim_read_cnf        |
++-------------------------------------------------------------------+
+
+  PURPOSE : processes the SIM_READ_CNF primitive send by SIM.
+            this is the confirmation to the SIM read data operation.
+
+*/
+GLOBAL const void psa_sim_read_cnf ( T_SIM_READ_CNF *sim_read_cnf )
+{
+  SHORT aId;              /* holds access id */
+
+  TRACE_FUNCTION ("psa_sim_read_cnf()");
+
+/*
+ *-------------------------------------------------------------------
+ * find entry in access parameter table
+ *-------------------------------------------------------------------
+ */
+  aId = psaSIM_atbFindDatFld( sim_read_cnf -> datafield,
+                              ACT_RD_DAT, -1 );
+
+  if( aId NEQ NO_ENTRY )
+  {
+    /*
+     *---------------------------------------------------------------
+     * update access parameter and notify caller
+     *---------------------------------------------------------------
+     */
+    simShrdPrm.atb[aId].errCode = sim_read_cnf -> cause;
+    simShrdPrm.atb[aId].dataLen = sim_read_cnf -> length;
+
+    if( simShrdPrm.atb[aId].exchData )
+      memcpy (simShrdPrm.atb[aId].exchData, sim_read_cnf -> trans_data,
+              sim_read_cnf->length);
+    else
+      simShrdPrm.atb[aId].exchData = sim_read_cnf -> trans_data;
+
+    if( simShrdPrm.atb[aId].rplyCB )
+      simShrdPrm.atb[aId].rplyCB( aId );
+    else
+      simShrdPrm.atb[aId].ntryUsdFlg = FALSE;
+  }
+
+    /*
+     *-------------------------------------------------------------------
+     * free the primitive buffer
+     *-------------------------------------------------------------------
+     */
+  PFREE (sim_read_cnf);
+}
+
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)         MODULE  : PSA_SIMP                |
+|                                 ROUTINE : psa_sim_update_cnf      |
++-------------------------------------------------------------------+
+
+  PURPOSE : processes the SIM_READ_CNF primitive send by SIM.
+            this is the confirmation to the SIM update data operation.
+
+*/
+
+GLOBAL const void psa_sim_update_cnf ( T_SIM_UPDATE_CNF *sim_update_cnf )
+{
+  SHORT aId;              /* holds access id */
+
+  TRACE_FUNCTION ("psa_sim_update_cnf()");
+
+/*
+ *-------------------------------------------------------------------
+ * find entry in access parameter table
+ *-------------------------------------------------------------------
+ */
+  aId = psaSIM_atbFindDatFld( sim_update_cnf -> datafield,
+                              ACT_WR_DAT, -1 );
+  if( aId NEQ NO_ENTRY )
+  {
+    /*
+     *---------------------------------------------------------------
+     * update access parameter and notify caller
+     *---------------------------------------------------------------
+     */
+    simShrdPrm.atb[aId].errCode = sim_update_cnf -> cause;
+
+    if( simShrdPrm.atb[aId].rplyCB )
+      simShrdPrm.atb[aId].rplyCB( aId );
+    else
+      simShrdPrm.atb[aId].ntryUsdFlg = FALSE;
+  }
+/*
+ *-------------------------------------------------------------------
+ * free the primitive buffer
+ *-------------------------------------------------------------------
+ */
+  PFREE (sim_update_cnf);
+
+}
+
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)         MODULE  : PSA_SIMP                |
+|                                 ROUTINE : psa_sim_read_record_cnf |
++-------------------------------------------------------------------+
+
+  PURPOSE : processes the SIM_READ_RECORD_CNF primitive send by SIM.
+            this is the confirmation to the SIM read absolute record
+            operation.
+
+*/
+
+GLOBAL const void psa_sim_read_record_cnf
+                       ( T_SIM_READ_RECORD_CNF *sim_read_record_cnf )
+{
+  SHORT aId;              /* holds access id */
+
+  TRACE_FUNCTION ("psa_sim_read_record_cnf()");
+
+/*
+ *-------------------------------------------------------------------
+ * find entry in access parameter table
+ *-------------------------------------------------------------------
+ */
+  aId = psaSIM_atbFindDatFld( sim_read_record_cnf -> datafield,
+                              ACT_RD_REC,
+                              sim_read_record_cnf -> record );
+
+  if( aId NEQ NO_ENTRY )
+  {
+    /*
+     *---------------------------------------------------------------
+     * update access parameter and notify caller
+     *---------------------------------------------------------------
+     */
+    simShrdPrm.atb[aId].errCode = sim_read_record_cnf -> cause;
+    simShrdPrm.atb[aId].recMax  = sim_read_record_cnf -> max_record;
+    if(simShrdPrm.atb[aId].check_dataLen                       AND
+       simShrdPrm.atb[aId].dataLen < sim_read_record_cnf->length)
+    {
+      TRACE_EVENT_P1("Read record is too big for buffer !!! size: %d", sim_read_record_cnf->length);
+    }
+    else
+    {
+      simShrdPrm.atb[aId].dataLen = sim_read_record_cnf -> length;
+    }
+
+    if( simShrdPrm.atb[aId].exchData )
+
+      memcpy (simShrdPrm.atb[aId].exchData, sim_read_record_cnf -> linear_data,
+            sim_read_record_cnf->length);
+    else
+
+      simShrdPrm.atb[aId].exchData = sim_read_record_cnf -> linear_data;
+
+    if( simShrdPrm.atb[aId].rplyCB )
+      simShrdPrm.atb[aId].rplyCB( aId );
+    else
+      simShrdPrm.atb[aId].ntryUsdFlg = FALSE;
+  }
+/*
+ *-------------------------------------------------------------------
+ * free the primitive buffer
+ *-------------------------------------------------------------------
+ */
+  PFREE (sim_read_record_cnf);
+
+}
+
+
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)        MODULE  : PSA_SIMP                 |
+|                                ROUTINE : psa_sim_update_record_cnf|
++-------------------------------------------------------------------+
+
+  PURPOSE : processes the SIM_READ_CNF primitive send by SIM.
+            this is the confirmation to the SIM update absolute
+            record operation.
+
+*/
+
+GLOBAL const void psa_sim_update_record_cnf
+                    ( T_SIM_UPDATE_RECORD_CNF *sim_update_record_cnf )
+{
+  SHORT aId;              /* holds access id */
+
+  TRACE_FUNCTION ("psa_sim_update_record_cnf()");
+
+/*
+ *-------------------------------------------------------------------
+ * find entry in access parameter table
+ *-------------------------------------------------------------------
+ */
+  aId = psaSIM_atbFindDatFld( sim_update_record_cnf -> datafield,
+                              ACT_WR_REC,
+                              sim_update_record_cnf -> record );
+
+  if( aId NEQ NO_ENTRY )
+  {
+    /*
+     *---------------------------------------------------------------
+     * update access parameter and notify caller
+     *---------------------------------------------------------------
+     */
+    simShrdPrm.atb[aId].errCode = sim_update_record_cnf -> cause;
+
+    if( simShrdPrm.atb[aId].rplyCB )
+      simShrdPrm.atb[aId].rplyCB( aId );
+    else
+      simShrdPrm.atb[aId].ntryUsdFlg = FALSE;
+  }
+/*
+ *-------------------------------------------------------------------
+ * free the primitive buffer
+ *-------------------------------------------------------------------
+ */
+  PFREE (sim_update_record_cnf);
+
+}
+
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)         MODULE  : PSA_SIMP                |
+|                                 ROUTINE : psa_sim_increment_cnf   |
++-------------------------------------------------------------------+
+
+  PURPOSE : processes the SIM_READ_CNF primitive send by SIM.
+            this is the confirmation to the SIM increment data
+            operation.
+
+*/
+
+GLOBAL const void psa_sim_increment_cnf
+                          ( T_SIM_INCREMENT_CNF *sim_increment_cnf )
+{
+  SHORT aId;              /* holds access id */
+
+  TRACE_FUNCTION ("psa_sim_increment_cnf()");
+
+/*
+ *-------------------------------------------------------------------
+ * find entry in access parameter table
+ *-------------------------------------------------------------------
+ */
+  aId = psaSIM_atbFindDatFld( sim_increment_cnf -> datafield,
+                              ACT_INC_DAT, -1 );
+
+  if( aId NEQ NO_ENTRY )
+  {
+    /*
+     *---------------------------------------------------------------
+     * update access parameter and notify caller
+     *---------------------------------------------------------------
+     */
+    simShrdPrm.atb[aId].errCode   = sim_increment_cnf -> cause;
+    simShrdPrm.atb[aId].dataLen   = sim_increment_cnf -> length;
+
+    if( simShrdPrm.atb[aId].exchData )
+
+      memcpy( simShrdPrm.atb[aId].exchData,
+              sim_increment_cnf -> linear_data,
+              sim_increment_cnf -> length );
+    else
+
+      simShrdPrm.atb[aId].exchData = sim_increment_cnf -> linear_data;
+
+    if( simShrdPrm.atb[aId].rplyCB )
+      simShrdPrm.atb[aId].rplyCB( aId );
+    else
+      simShrdPrm.atb[aId].ntryUsdFlg = FALSE;
+  }
+/*
+ *-------------------------------------------------------------------
+ * free the primitive buffer
+ *-------------------------------------------------------------------
+ */
+  PFREE (sim_increment_cnf);
+
+}
+
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)         MODULE  : PSA_SIMP                |
+|                                 ROUTINE : psa_sim_verify_pin_cnf  |
++-------------------------------------------------------------------+
+
+  PURPOSE : processes the SIM_VERIFY_PIN_CNF primitive send by SIM.
+            this is the confirmation to the PIN verify operation.
+
+*/
+
+GLOBAL const void psa_sim_verify_pin_cnf
+                         ( T_SIM_VERIFY_PIN_CNF *sim_verify_pin_cnf )
+{
+
+  TRACE_FUNCTION ("psa_sim_verify_pin_cnf()");
+
+/*
+ *-------------------------------------------------------------------
+ * update shared parameter and notify ACI
+ *-------------------------------------------------------------------
+ */
+  simShrdPrm.rslt   = sim_verify_pin_cnf -> cause;
+  simShrdPrm.pn1Cnt = sim_verify_pin_cnf -> pin_cnt;
+  simShrdPrm.pn2Cnt = sim_verify_pin_cnf -> pin2_cnt;
+  simShrdPrm.pk1Cnt = sim_verify_pin_cnf -> puk_cnt;
+  simShrdPrm.pk2Cnt = sim_verify_pin_cnf -> puk2_cnt;
+
+  TRACE_EVENT_P1("SIM answered with 0x%4.4X", sim_verify_pin_cnf -> cause);
+
+  switch( sim_verify_pin_cnf -> cause )
+  {
+    case( SIM_NO_ERROR ):
+      simShrdPrm.PINStat = PS_RDY;
+      if( sim_verify_pin_cnf -> pin_id EQ PHASE_2_PIN_1 )
+        simShrdPrm.pn1Stat = PS_RDY;
+      else if( sim_verify_pin_cnf -> pin_id EQ PHASE_2_PIN_2 )
+        simShrdPrm.pn2Stat = PS_RDY;
+      break;
+
+    case( SIM_CAUSE_PIN1_EXPECT ):
+      simShrdPrm.PINStat = simShrdPrm.pn1Stat = PS_PIN1;
+      break;
+
+    case( SIM_CAUSE_PIN2_EXPECT ):
+      simShrdPrm.PINStat = simShrdPrm.pn2Stat = PS_PIN2;
+      break;
+
+    case( SIM_CAUSE_PUK1_EXPECT ):
+    case( SIM_CAUSE_PIN1_BLOCKED):
+      simShrdPrm.PINStat = PS_PUK1;
+      break;
+
+    case( SIM_CAUSE_PUK2_EXPECT ):
+    case( SIM_CAUSE_PIN2_BLOCKED):
+      simShrdPrm.PINStat = PS_PUK2;
+      break;
+  }
+
+  cmhSIM_PINVerified();
+
+/*
+ *-------------------------------------------------------------------
+ * free the primitive buffer
+ *-------------------------------------------------------------------
+ */
+  PFREE (sim_verify_pin_cnf);
+
+}
+
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)         MODULE  : PSA_SIMP                |
+|                                 ROUTINE : psa_sim_change_pin_cnf  |
++-------------------------------------------------------------------+
+
+  PURPOSE : processes the SIM_CHANGE_PIN_CNF primitive send by SIM.
+            this is the confirmation to the PIN change operation.
+
+*/
+
+GLOBAL const void psa_sim_change_pin_cnf
+                         ( T_SIM_CHANGE_PIN_CNF *sim_change_pin_cnf )
+{
+
+  TRACE_FUNCTION ("psa_sim_change_pin_cnf()");
+
+/*
+ *-------------------------------------------------------------------
+ * update shared parameter and notify ACI
+ *-------------------------------------------------------------------
+ */
+  simShrdPrm.rslt   = sim_change_pin_cnf -> cause;
+  simShrdPrm.pn1Cnt = sim_change_pin_cnf -> pin_cnt;
+  simShrdPrm.pn2Cnt = sim_change_pin_cnf -> pin2_cnt;
+  simShrdPrm.pk1Cnt = sim_change_pin_cnf -> puk_cnt;
+  simShrdPrm.pk2Cnt = sim_change_pin_cnf -> puk2_cnt;
+
+  switch( sim_change_pin_cnf -> cause )
+  {
+    case( SIM_NO_ERROR ):
+      simShrdPrm.PINStat = PS_RDY;
+      if( sim_change_pin_cnf -> pin_id EQ PHASE_2_PIN_1 )
+        simShrdPrm.pn1Stat = PS_RDY;
+      else if( sim_change_pin_cnf -> pin_id EQ PHASE_2_PIN_2 )
+        simShrdPrm.pn2Stat = PS_RDY;
+      break;
+
+    case( SIM_CAUSE_PIN1_EXPECT ):
+      simShrdPrm.PINStat = simShrdPrm.pn1Stat = PS_PIN1;
+      break;
+
+    case( SIM_CAUSE_PIN2_EXPECT ):
+      simShrdPrm.PINStat = simShrdPrm.pn2Stat = PS_PIN2;
+      break;
+
+    case( SIM_CAUSE_PUK1_EXPECT ):
+    case( SIM_CAUSE_PIN1_BLOCKED):
+      simShrdPrm.PINStat = PS_PUK1;
+      break;
+
+    case( SIM_CAUSE_PUK2_EXPECT ):
+    case( SIM_CAUSE_PIN2_BLOCKED):
+      simShrdPrm.PINStat = PS_PUK2;
+      break;
+  }
+
+
+  cmhSIM_PINChanged();
+
+/*
+ *-------------------------------------------------------------------
+ * free the primitive buffer
+ *-------------------------------------------------------------------
+ */
+  PFREE (sim_change_pin_cnf);
+
+}
+
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)         MODULE  : PSA_SIMP                |
+|                                 ROUTINE : psa_sim_disable_pin_cnf |
++-------------------------------------------------------------------+
+
+  PURPOSE : processes the SIM_DISABLE_PIN_CNF primitive send by SIM.
+            this is the confirmation to the PIN disable operation.
+
+*/
+
+GLOBAL const void psa_sim_disable_pin_cnf
+                      ( T_SIM_DISABLE_PIN_CNF *sim_disable_pin_cnf )
+{
+
+  TRACE_FUNCTION ("psa_sim_disable_pin_cnf()");
+
+/*
+ *-------------------------------------------------------------------
+ * update shared parameter and notify ACI
+ *-------------------------------------------------------------------
+ */
+  simShrdPrm.rslt   = sim_disable_pin_cnf -> cause;
+  simShrdPrm.pn1Cnt = sim_disable_pin_cnf -> pin_cnt;
+  simShrdPrm.pn2Cnt = sim_disable_pin_cnf -> pin2_cnt;
+  simShrdPrm.pk1Cnt = sim_disable_pin_cnf -> puk_cnt;
+  simShrdPrm.pk2Cnt = sim_disable_pin_cnf -> puk2_cnt;
+  
+  switch( sim_disable_pin_cnf -> cause )
+  {
+    case( SIM_CAUSE_PUK1_EXPECT ):
+    case( SIM_CAUSE_PIN1_BLOCKED):
+      simShrdPrm.PINStat = PS_PUK1;
+      break;
+  }
+
+  if( sim_disable_pin_cnf -> cause EQ SIM_NO_ERROR )
+  {
+    simShrdPrm.PEDStat = PEDS_DIS;
+  }
+
+  cmhSIM_PINDisabled();
+
+/*
+ *-------------------------------------------------------------------
+ * free the primitive buffer
+ *-------------------------------------------------------------------
+ */
+  PFREE (sim_disable_pin_cnf);
+
+}
+
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)         MODULE  : PSA_SIMP                |
+|                                 ROUTINE : psa_sim_enable_pin_cnf  |
++-------------------------------------------------------------------+
+
+  PURPOSE : processes the SIM_ENABLE_PIN_CNF primitive send by SIM.
+            this is the confirmation to the PIN enable operation.
+
+*/
+
+GLOBAL const void psa_sim_enable_pin_cnf
+                         ( T_SIM_ENABLE_PIN_CNF *sim_enable_pin_cnf )
+{
+
+  TRACE_FUNCTION ("psa_sim_enable_pin_cnf()");
+
+/*
+ *-------------------------------------------------------------------
+ * update shared parameter and notify ACI
+ *-------------------------------------------------------------------
+ */
+  simShrdPrm.rslt   = sim_enable_pin_cnf -> cause;
+  simShrdPrm.pn1Cnt = sim_enable_pin_cnf -> pin_cnt;
+  simShrdPrm.pn2Cnt = sim_enable_pin_cnf -> pin2_cnt;
+  simShrdPrm.pk1Cnt = sim_enable_pin_cnf -> puk_cnt;
+  simShrdPrm.pk2Cnt = sim_enable_pin_cnf -> puk2_cnt;
+
+  switch( sim_enable_pin_cnf -> cause )
+  {
+    case( SIM_CAUSE_PUK1_EXPECT ):
+    case( SIM_CAUSE_PIN1_BLOCKED):
+      simShrdPrm.PINStat = PS_PUK1;
+     break;
+  }
+
+  if( sim_enable_pin_cnf -> cause EQ SIM_NO_ERROR )
+  {
+    simShrdPrm.PEDStat = PEDS_ENA;
+  }
+
+  cmhSIM_PINEnabled();
+
+/*
+ *-------------------------------------------------------------------
+ * free the primitive buffer
+ *-------------------------------------------------------------------
+ */
+  PFREE (sim_enable_pin_cnf);
+
+}
+
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)         MODULE  : PSA_SIMP                |
+|                                 ROUTINE : psa_sim_unblock_cnf     |
++-------------------------------------------------------------------+
+
+  PURPOSE : processes the SIM_UNBLOCK_CNF primitive send by SIM.
+            this is the confirmation to the card unblock operation.
+
+*/
+
+GLOBAL const void psa_sim_unblock_cnf
+                              ( T_SIM_UNBLOCK_CNF *sim_unblock_cnf )
+{
+
+  TRACE_FUNCTION ("psa_sim_unblock_cnf()");
+
+/*
+ *-------------------------------------------------------------------
+ * update shared parameter and notify ACI
+ *-------------------------------------------------------------------
+ */
+  simShrdPrm.rslt   = sim_unblock_cnf -> cause;
+  simShrdPrm.pn1Cnt = sim_unblock_cnf -> pin_cnt;
+  simShrdPrm.pn2Cnt = sim_unblock_cnf -> pin2_cnt;
+  simShrdPrm.pk1Cnt = sim_unblock_cnf -> puk_cnt;
+  simShrdPrm.pk2Cnt = sim_unblock_cnf -> puk2_cnt;
+
+  TRACE_EVENT_P1("SIM answered with 0x%4.4X", sim_unblock_cnf -> cause);
+
+  switch( sim_unblock_cnf -> cause )
+  {
+    case( SIM_NO_ERROR ):
+      simShrdPrm.PINStat = PS_RDY;
+    
+      if( sim_unblock_cnf -> pin_id EQ PHASE_2_PUK_1 )
+      {
+        simShrdPrm.pn1Stat = PS_RDY;
+        /* 11.11/8.13 "After a successful unblocking attempt the CHV is enabled..." */
+        simShrdPrm.PEDStat = PEDS_ENA;
+      }
+      else if( sim_unblock_cnf -> pin_id EQ PHASE_2_PUK_2 )
+        simShrdPrm.pn2Stat = PS_RDY;
+      break;
+
+    case( SIM_CAUSE_PUK1_EXPECT ):
+      simShrdPrm.PINStat = PS_PUK1;
+      break;
+
+    case( SIM_CAUSE_PUK2_EXPECT ):
+      simShrdPrm.PINStat = PS_PUK2;
+      break;
+  }
+
+  cmhSIM_CardUnblocked();
+
+/*
+ *-------------------------------------------------------------------
+ * free the primitive buffer
+ *-------------------------------------------------------------------
+ */
+  PFREE (sim_unblock_cnf);
+
+}
+
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)         MODULE  : PSA_SIMP                |
+|                                 ROUTINE : psa_sim_sync_cnf        |
++-------------------------------------------------------------------+
+
+  PURPOSE : processes the SIM_SYNC_CNF primitive send by SIM.
+            this is the confirmation to the data synchronization
+            operation.
+
+*/
+
+GLOBAL const void psa_sim_sync_cnf ( T_SIM_SYNC_CNF *sim_sync_cnf )
+{
+
+  TRACE_FUNCTION ("psa_sim_sync_cnf()");
+
+  /* disable SMS */
+  if (simShrdPrm.synCs EQ SYNC_DEACTIVATE)
+  {
+    cmhSMS_disableAccess();
+    psaSIM_Init (ACI_INIT_TYPE_SOFT_OFF);
+    percentCSTAT_indication(STATE_MSG_PBOOK, ENTITY_STATUS_NotReady);
+  }
+
+  /* notify ACI */
+  cmhSIM_SIMSync();
+
+  /* free the primitive buffer */
+  PFREE (sim_sync_cnf);
+
+}
+
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)         MODULE  : PSA_SIMP                |
+|                                 ROUTINE : psa_sim_activate_cnf    |
++-------------------------------------------------------------------+
+
+  PURPOSE : processes the SIM_ACTIVATE_CNF primitive send by SIM.
+            this is the confirmation to the SIM activate operation.
+
+*/
+
+GLOBAL const void psa_sim_activate_cnf
+                            ( T_SIM_ACTIVATE_CNF *sim_activate_cnf )
+{
+  TRACE_FUNCTION ("psa_sim_activate_cnf()");
+
+#ifdef FF_DUAL_SIM
+  if(simShrdPrm.SIM_Selection)
+  {
+    simShrdPrm.rslt = sim_activate_cnf -> cause;
+    simShrdPrm.SIM_Powered_on = sim_activate_cnf->sim_num;
+
+    cmhSIM_SIMSelected();
+    simShrdPrm.SIM_Selection = FALSE;
+
+    PFREE (sim_activate_cnf);
+
+    return;
+
+  }
+#endif /*FF_DUAL_SIM*/
+/*
+ *-------------------------------------------------------------------
+ * update shared parameter and notify ACI
+ *-------------------------------------------------------------------
+ */
+
+  if (simShrdPrm.setPrm[simEntStat.entOwn].actProc EQ SIM_INITIALISATION)
+  {
+    simShrdPrm.pn1Cnt = sim_activate_cnf -> pin_cnt;
+    simShrdPrm.pn2Cnt = sim_activate_cnf -> pin2_cnt;
+    simShrdPrm.pk1Cnt = sim_activate_cnf -> puk_cnt;
+    simShrdPrm.pk2Cnt = sim_activate_cnf -> puk2_cnt;
+  }
+
+  /*
+   * Build emergency call phonebook
+   */
+#ifdef TI_PS_FFS_PHB
+  pb_set_sim_ecc (sim_activate_cnf->cause,
+                  MAX_ECC,
+                  sim_activate_cnf->ec_code);
+#else
+  pb_init();
+  pb_read_ecc(sim_activate_cnf -> cause, MAX_ECC,
+              sim_activate_cnf->ec_code);
+#endif
+
+  simShrdPrm.rslt = sim_activate_cnf -> cause;
+  TRACE_EVENT_P1("SIM answered with 0x%4.4X", sim_activate_cnf -> cause);
+
+  simShrdPrm.atr.len = MINIMUM(sim_activate_cnf->c_atr, MAX_SIM_ATR);
+  memcpy (simShrdPrm.atr.data, sim_activate_cnf -> atr, MINIMUM(sim_activate_cnf->c_atr, MAX_SIM_ATR));
+
+  switch( simShrdPrm.rslt )
+  {
+    case( SIM_NO_ERROR ):
+      simShrdPrm.SIMStat = SS_OK;
+      simShrdPrm.PINStat = simShrdPrm.pn1Stat = PS_RDY;
+      if (simShrdPrm.setPrm[simEntStat.entOwn].actProc EQ SIM_INITIALISATION)
+        simShrdPrm.PEDStat = PEDS_DIS;
+      break;
+
+    case( SIM_CAUSE_PIN1_EXPECT ):
+
+      simShrdPrm.SIMStat = SS_OK;
+      simShrdPrm.PINStat = simShrdPrm.pn1Stat = PS_PIN1;
+      simShrdPrm.PEDStat = PEDS_ENA;
+      break;
+
+    case( SIM_CAUSE_PIN2_EXPECT ):
+
+      simShrdPrm.SIMStat = SS_OK;
+      simShrdPrm.PINStat = simShrdPrm.pn2Stat = PS_PIN2;
+      break;
+
+    case( SIM_CAUSE_PIN1_BLOCKED ):
+    case( SIM_CAUSE_PUK1_EXPECT ):
+
+      simShrdPrm.SIMStat = SS_BLKD;
+      simShrdPrm.PINStat = PS_PUK1;
+      simShrdPrm.PEDStat = PEDS_ENA;
+      break;
+
+    case( SIM_CAUSE_PIN2_BLOCKED ):
+    case( SIM_CAUSE_PUK2_EXPECT ):
+
+      simShrdPrm.SIMStat = SS_BLKD;
+      simShrdPrm.PINStat = PS_PUK2;
+      break;
+
+    case( SIM_CAUSE_PUK1_BLOCKED ):
+      simShrdPrm.SIMStat = SS_INV;
+      simShrdPrm.pn1Stat = NO_VLD_PS;
+      break;
+
+    case( SIM_CAUSE_PUK2_BLOCKED ):
+      simShrdPrm.SIMStat = SS_INV;
+      simShrdPrm.pn2Stat = NO_VLD_PS;
+      break;
+
+    default:
+      if (GET_CAUSE_DEFBY(simShrdPrm.rslt) NEQ DEFBY_CONDAT AND
+          GET_CAUSE_ORIGSIDE(simShrdPrm.rslt) NEQ ORIGSIDE_MS)
+      {
+        /* unexpected result */
+        simShrdPrm.SIMStat = NO_VLD_SS;
+        TRACE_ERROR("psa_sim_activate_cnf: NO_VLD_SS");
+        break;
+      } /* no break: SIM driver error */
+      /*lint -fallthrough*/
+    case( SIM_CAUSE_CARD_REMOVED ):
+      simShrdPrm.SIMStat = SS_URCHB;
+      simShrdPrm.pn1Stat = simShrdPrm.pn2Stat = NO_VLD_PS;
+      break;
+  }
+
+  cmhSIM_SIMActivated();
+
+/*
+ *-------------------------------------------------------------------
+ * free the primitive buffer
+ *-------------------------------------------------------------------
+ */
+  PFREE (sim_activate_cnf);
+
+}
+
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)         MODULE  : PSA_SIMP                |
+|                                 ROUTINE : psa_sim_activate_ind    |
++-------------------------------------------------------------------+
+
+  PURPOSE : processes the SIM_ACTIVATE_IND primitive send by SIM.
+            This is the indication about the recognition of a SIM
+            card after a previous SIM_REMOVE_IND or failed
+            SIM_ACTIVATE_REQ
+*/
+
+GLOBAL const void psa_sim_activate_ind
+                            ( T_SIM_ACTIVATE_IND *sim_activate_ind )
+{
+
+  TRACE_FUNCTION ("psa_sim_activate_ind()");
+
+  simShrdPrm.pn1Cnt = sim_activate_ind -> pin_cnt;
+  simShrdPrm.pn2Cnt = sim_activate_ind -> pin2_cnt;
+  simShrdPrm.pk1Cnt = sim_activate_ind -> puk_cnt;
+  simShrdPrm.pk2Cnt = sim_activate_ind -> puk2_cnt;
+
+  /*
+   * Build emergency call phonebook
+   */
+#ifdef TI_PS_FFS_PHB
+  pb_set_sim_ecc (sim_activate_ind->cause,
+                  MAX_ECC,
+                  sim_activate_ind->ec_code);
+#else
+  pb_read_ecc(sim_activate_ind->cause, MAX_ECC,
+              sim_activate_ind->ec_code);
+#endif
+
+  simShrdPrm.rslt = sim_activate_ind -> cause;
+
+  simShrdPrm.atr.len = MINIMUM(sim_activate_ind->c_atr, MAX_SIM_ATR);
+  memcpy (simShrdPrm.atr.data, sim_activate_ind -> atr, MINIMUM(sim_activate_ind->c_atr, MAX_SIM_ATR));
+
+  switch( simShrdPrm.rslt )
+  {
+    case( SIM_NO_ERROR ):
+      simShrdPrm.rslt    = SIM_NO_ERROR;
+      simShrdPrm.SIMStat = SS_OK;
+      simShrdPrm.PINStat = simShrdPrm.pn1Stat = PS_RDY;
+      simShrdPrm.PEDStat = PEDS_DIS;
+      break;
+
+    case( SIM_CAUSE_PIN1_EXPECT ):
+      simShrdPrm.SIMStat = SS_OK;
+      simShrdPrm.PINStat = simShrdPrm.pn1Stat = PS_PIN1;
+      simShrdPrm.PEDStat = PEDS_ENA;
+      break;
+
+    case( SIM_CAUSE_PIN2_EXPECT ):
+      simShrdPrm.SIMStat = SS_OK;
+      simShrdPrm.PINStat = simShrdPrm.pn2Stat = PS_PIN2;
+      break;
+
+    case( SIM_CAUSE_PIN1_BLOCKED ):
+    case( SIM_CAUSE_PUK1_EXPECT ):
+      simShrdPrm.SIMStat = SS_BLKD;
+      simShrdPrm.PINStat = PS_PUK1;
+      simShrdPrm.PEDStat = PEDS_ENA;
+      break;
+
+    case( SIM_CAUSE_PIN2_BLOCKED ):
+    case( SIM_CAUSE_PUK2_EXPECT ):
+      simShrdPrm.SIMStat = SS_BLKD;
+      simShrdPrm.PINStat = PS_PUK2;
+      break;
+
+    default:            /* unexpected error */
+      simShrdPrm.SIMStat = NO_VLD_SS;
+      simShrdPrm.pn1Stat = simShrdPrm.pn2Stat = NO_VLD_PS;
+  }
+
+  cmhSIM_SIMActivated();
+
+/*
+ *-------------------------------------------------------------------
+ * free the primitive buffer
+ *-------------------------------------------------------------------
+ */
+  PFREE (sim_activate_ind);
+}
+
+
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)         MODULE  : PSA_SIMP                |
+|                                 ROUTINE : psa_sim_mmi_insert_ind  |
++-------------------------------------------------------------------+
+
+  PURPOSE : processes the SIM_MMI_INSERT_IND primitive send by SIM.
+            This is an indication that the SIM card was inserted
+            and verified.
+*/
+
+GLOBAL const void psa_sim_mmi_insert_ind
+                         ( T_SIM_MMI_INSERT_IND *sim_mmi_insert_ind )
+{
+  TRACE_FUNCTION ("psa_sim_mmi_insert_ind()");
+
+/*
+ *-------------------------------------------------------------------
+ * update shared parameter and notify ACI
+ *-------------------------------------------------------------------
+ */
+
+  if(simShrdPrm.PINStat EQ PS_PUK1)
+  {
+    TRACE_ERROR("Simcard is blocked !!! sim_mmi_insert_ind should no come before PUK");
+    PFREE (sim_mmi_insert_ind);
+    return;
+  }
+
+  simShrdPrm.SIMStat = SS_OK;      /* moved here */ /* ACI-SPR-10214 */
+  simShrdPrm.crdPhs  = sim_mmi_insert_ind -> phase;
+  simShrdPrm.crdFun  = sim_mmi_insert_ind -> func;
+  simShrdPrm.imsi    = sim_mmi_insert_ind -> imsi_field;
+
+  memcpy( simShrdPrm.srvTab, sim_mmi_insert_ind -> sim_serv,SRV_TAB_LEN );
+
+  /* disable SMS access (can be SIM Re-Initialosation) */
+  cmhSMS_disableAccess();
+
+  psaSMS_InitParams();      /* Reset SIM Parameters */
+#ifdef SIM_PERS_OTA
+  aci_slock_ota_init();
+#endif
+
+   /* Initialize Advice of Charge */
+  aoc_init (sim_mmi_insert_ind->phase,
+            sim_mmi_insert_ind->sim_serv);
+
+  /*
+   * Start to build phonebook
+   */
+  pb_reset();
+
+#ifndef TI_PS_FFS_PHB  
+  pb_init();
+  pb_update_ecc();
+#endif
+  
+  cmhSIM_Read_AD();  
+  last_sim_mmi_insert_ind = sim_mmi_insert_ind ;
+}
+
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)         MODULE  : PSA_SIMP                |
+|                                 ROUTINE : psa_sim_remove_ind      |
++-------------------------------------------------------------------+
+
+  PURPOSE : processes the SIM_REMOVE_IND primitive send by SIM.
+            this is an indication that the SIM card was removed.
+
+*/
+
+GLOBAL const void psa_sim_remove_ind
+                         ( T_SIM_REMOVE_IND *sim_remove_ind )
+{
+
+  TRACE_FUNCTION ("psa_sim_remove_ind()");
+
+  /*
+   *-------------------------------------------------------------------
+   * disable SMS access
+   *-------------------------------------------------------------------
+   */
+  cmhSMS_disableAccess();
+
+  smsShrdPrm.cbmPrm.cbmHndl = BM0;         /* switch off CBCH */
+  smsShrdPrm.cbmPrm.cbchOwner = OWN_SAT;
+  psaMMI_Cbch();
+  smsShrdPrm.cbmPrm.cbchOwner = OWN_NONE;
+  /*
+   * reset phonebook, AOC, ...
+   */
+  pb_reset();
+  aoc_reset();
+
+  #ifdef SIM_PERS
+ /*
+   * reset aci_slock
+   */
+  aci_slock_reset(); 
+  
+  #endif
+
+
+  /*
+   * erase event list for SAT event download
+   */
+#ifdef SIM_TOOLKIT
+   satShrdPrm.event.list = 0L;
+   satShrdPrm.event.temp_list = 0L; /* in case a setup list was in process */
+#endif /* SIM_TOOLKIT */
+
+  /*
+   * close all open SIM accesses
+   */
+  psaSIM_CloseAtb ((USHORT)((sim_remove_ind->cause EQ SIM_NO_ERROR)?
+                    SIM_CAUSE_SAT_BUSY: sim_remove_ind->cause));
+
+  /* Issue OMAPS00058768: Reset ONSDesc */
+  cmhMM_Reset_ONSDesc();
+
+  /*
+   *-------------------------------------------------------------------
+   * Notification is sent for reason of SIM remove ind and SIM shared 
+   * parameters are reset
+   *-------------------------------------------------------------------
+   */
+  simShrdPrm.rslt    = sim_remove_ind->cause;
+  cmhSIM_SIMRemoved();
+  psaSIM_Init(ACI_INIT_TYPE_SOFT_OFF);
+
+  /*
+   *-------------------------------------------------------------------
+   * free the primitive buffer
+   *-------------------------------------------------------------------
+   */
+  PFREE (sim_remove_ind);
+
+}
+
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)         MODULE  : PSA_SIMP                |
+|                                 ROUTINE : psa_access_cnf          |
++-------------------------------------------------------------------+
+
+  PURPOSE : processes the SIM_ACCESS_IND primitive send by SIM.
+            this is a confirmation to a previous SIM access request.
+
+*/
+
+GLOBAL const void psa_sim_access_cnf
+                         ( T_SIM_ACCESS_CNF *sim_access_cnf )
+{
+  T_SIM_TRNS_RSP_PRM rsp;
+
+  TRACE_FUNCTION ("psa_sim_access_cnf()");
+
+/*
+ *-------------------------------------------------------------------
+ * update shared parameter and notify ACI
+ *-------------------------------------------------------------------
+ */
+  simShrdPrm.rslt = sim_access_cnf -> cause;
+
+  rsp.sw1    = sim_access_cnf -> sw1;
+  rsp.sw2    = sim_access_cnf -> sw2;
+  rsp.rspLen = MINIMUM(sim_access_cnf -> c_trans_data, MAX_SIM_CMD);
+  rsp.rsp    = sim_access_cnf -> trans_data;
+
+  switch( simShrdPrm.rslt )
+  {
+    case( SIM_CAUSE_PIN1_EXPECT ):
+      simShrdPrm.SIMStat = SS_OK;
+      simShrdPrm.PINStat = simShrdPrm.pn1Stat = PS_PIN1;
+      simShrdPrm.PEDStat = PEDS_ENA;
+      break;
+
+    case( SIM_CAUSE_PIN2_EXPECT ):
+      simShrdPrm.SIMStat = SS_OK;
+      simShrdPrm.PINStat = simShrdPrm.pn2Stat = PS_PIN2;
+      break;
+
+    case( SIM_CAUSE_PIN1_BLOCKED ):
+    case( SIM_CAUSE_PUK1_EXPECT ):
+      simShrdPrm.SIMStat = SS_BLKD;
+      simShrdPrm.PINStat = PS_PUK1;
+      simShrdPrm.PEDStat = PEDS_ENA;
+      break;
+
+    case( SIM_CAUSE_PIN2_BLOCKED ):
+    case( SIM_CAUSE_PUK2_EXPECT ):
+      simShrdPrm.SIMStat = SS_BLKD;
+      simShrdPrm.PINStat = PS_PUK2;
+      break;
+  }
+
+  cmhSIM_SIMResponseData( &rsp );
+
+/*
+ *-------------------------------------------------------------------
+ * free the primitive buffer
+ *-------------------------------------------------------------------
+ */
+
+  PFREE (sim_access_cnf);
+
+}
+
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS ()             MODULE  : PSA_SIMP                |
+|                                 ROUTINE : psa_sim_bip_config_cnf  |
++-------------------------------------------------------------------+
+
+  PURPOSE : processes the SIM_BIP_CONFIG_CNF primitive sent by SIM.
+            Signal application about (un-)successful processing of AT_A 
+            command. Clean-up the temporal parameters.
+            The primitive has no content!
+*/
+
+#ifdef FF_SAT_E 
+#ifdef DTI
+GLOBAL const void psa_sim_bip_config_cnf(T_SIM_BIP_CONFIG_CNF *sim_bip_config_cnf)
+{
+
+  T_ACI_SAT_TERM_RESP resp_data;      /* holds terminal response parms */
+  UBYTE res;
+
+  TRACE_FUNCTION("psa_sim_bip_config_cnf()");
+  
+  /* Since there is no content within this primitive, free it */
+  PFREE(sim_bip_config_cnf);
+
+  /* check for OPEN CHANNEL command context, immediate channel */
+  if( satShrdPrm.opchStat EQ OPCH_EST_REQ AND
+      satShrdPrm.cmdDet.cmdType EQ SAT_CMD_OPEN_CHANNEL )
+  {
+    /* command: OPEN CHANNEL IMMEDIATELY */
+    
+    /* init terminal response */
+    psaSAT_InitTrmResp( &resp_data );
+    resp_data.chnStat  = TRUE;
+    resp_data.bufSize  = TRUE;
+    resp_data.bearDesc = TRUE;
+
+    /* check for modification of bearer parameters */
+    res = (satShrdPrm.opchPrmMdf)?RSLT_PERF_MDFIED:
+          (satShrdPrm.opchCCMdfy)?RSLT_PERF_MDFY_SIM:RSLT_PERF_SUCCESS;
+
+    /* send terminal response to SAT */
+    psaSAT_SendTrmResp( res, &resp_data );
+
+    /* finish command AT_A command */
+    R_AT( RAT_OK, satShrdPrm.opchAcptSrc ) ( AT_CMD_A );
+
+    /* log result */
+    cmh_logRslt ( satShrdPrm.opchAcptSrc, RAT_OK, AT_CMD_A, -1, -1, -1 );
+
+    /* reset/free satShrdPrm.opch* parameters */
+    cmhSAT_cleanupOpChnPrms();    
+  }
+  /* check for SEND DATA command context, on-demand channel */
+  else if( satShrdPrm.opchStat EQ OPCH_EST_REQ AND
+           satShrdPrm.cmdDet.cmdType EQ SAT_CMD_SEND_DATA )
+  {
+    /* command: SEND DATA immediately */
+
+    /* NO terminal response and no response to Application needed */
+
+    /* reset/free satShrdPrm.opch* parameters */
+    cmhSAT_cleanupOpChnPrms();
+  }
+
+  /* FREE channel parameter */
+  if (simShrdPrm.sim_dti_chPrm NEQ NULL)
+  {
+    ACI_MFREE(simShrdPrm.sim_dti_chPrm);
+    simShrdPrm.sim_dti_chPrm = NULL;
+    TRACE_EVENT("FREE sim_dti_chPrm");
+  }
+}
+
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS ()             MODULE  : PSA_SIMP                |
+|                                 ROUTINE : psa_sim_bip_cnf         |
++-------------------------------------------------------------------+
+
+  PURPOSE : processes the SIM_BIP_CNF primitive sent by SIM.
+
+*/
+
+GLOBAL const void psa_sim_bip_cnf(T_SIM_BIP_CNF *sim_bip_cnf)
+{
+  /* The callback function is used to proceed the action that has been triggered, 
+   * for instance, OPEN BIP channel. The result given by the bip connection 
+   * qualifier may differ from the intended action, because this is actually 
+   * the indicator whether SIM has processed it correctly! */
+
+  TRACE_FUNCTION ("psa_sim_bip_cnf()");
+
+  if((sim_bip_cnf->bip_conn & simShrdPrm.sim_dti_chPrm->sat_chn_prm.bipConn) > 0)
+  {
+    TRACE_EVENT("psa_sim_bip_cnf: BIP operation successful");
+  }
+  else
+  {
+    TRACE_EVENT("psa_sim_bip_cnf: BIP operation not successful");
+  }
+
+  /* 
+   * go on with requested action           
+   */
+  if( simShrdPrm.sim_dti_chPrm->bip_cb )
+  {
+    /* FREE BIP channel parameter */
+    simShrdPrm.sim_dti_chPrm->bip_cb(sim_bip_cnf->bip_conn, 
+                                     sim_bip_cnf->bip_ch_id);
+  }
+  
+}
+
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS ()             MODULE  : PSA_SIMP                |
+|                                 ROUTINE : psa_sim_dti_cnf         |
++-------------------------------------------------------------------+
+
+  PURPOSE : processes the SIM_DTI_CNF primitive sent by SIM.
+
+*/
+
+GLOBAL const void psa_sim_dti_cnf (T_SIM_DTI_CNF *sim_dti_cnf)
+{
+  UBYTE dti_id; 
+  void (*sat_cb)(UBYTE dtiConn, UBYTE chnId);
+
+  TRACE_FUNCTION ("psa_sim_dti_cnf()");
+
+  if(sim_dti_cnf->dti_conn EQ simShrdPrm.sim_dti_chPrm->sat_chn_prm.dtiConn)
+  {
+    /* REQUEST SUCCESSFUL */ 
+    if( sim_dti_cnf->dti_conn EQ (SIM_DTI_CONNECT) )
+    { 
+      /* SUCCESSFUL DTI CONNECTION */
+      /* 
+       * inform dti manager about successfull connection, 
+       * call cb of DTI initiator 
+       */
+      dti_cntrl_entity_connected (sim_dti_cnf->link_id, DTI_ENTITY_SIM, DTI_OK);
+    }
+    else if( sim_dti_cnf->dti_conn EQ SIM_DTI_DISCONNECT )
+    { 
+      /* SUCCESSFUL DTI DISCONNECTON */
+      /* check whether the BIP channel has to be dropped */
+      if( simShrdPrm.sim_dti_chPrm->sat_chn_prm.bipConn 
+          EQ SIM_BIP_CLOSE_CHANNEL )
+      {
+        /* resetting stored SIM DTI ID */
+        psaSIM_Bip_Req();
+      }
+      /* 
+       *inform dti manager about successfull disconnection, 
+       * call cb of DTI function 
+       */
+      
+      dti_cntrl_entity_disconnected (sim_dti_cnf->link_id, DTI_ENTITY_SIM);
+
+    }
+    /* callback to SAT Source */ 
+    if( simShrdPrm.sim_dti_chPrm->dti_cb )
+    {
+       simShrdPrm.sim_dti_chPrm->dti_cb(sim_dti_cnf->dti_conn,
+                                        sim_dti_cnf->link_id);
+    }
+  }
+  else
+  {
+    /* UNSUCCESSFUL DTI CONNECTION OR DISCONNECTION*/
+    if(sim_dti_cnf->dti_conn EQ SIM_DTI_DISCONNECT)
+    {
+      /* UNSUCCESSFUL CONNECTION */
+      /* inform dti manager that connection request failed */
+      dti_cntrl_entity_connected (sim_dti_cnf->link_id, DTI_ENTITY_SIM, DTI_ERROR);
+    }
+    /* 
+     * error --> callback to SAT Source but not ACI_FREE of 
+     * simShrdPrm.sim_dti_chPrm 
+     */
+    if( simShrdPrm.sim_dti_chPrm->dti_cb )
+    {
+       simShrdPrm.sim_dti_chPrm->dti_cb(sim_dti_cnf->dti_conn,
+                                        sim_dti_cnf->link_id);
+    }
+  }
+  
+  PFREE(sim_dti_cnf);
+}
+
+#endif /* DTI */
+#endif /* #ifdef FF_SAT_E */
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)         MODULE  : PSA_SIMP                |
+|                                 ROUTINE : psa_sim_eventlist_cnf   |
++-------------------------------------------------------------------+
+
+  PURPOSE : processes the SIM_EVENTLIST_CNF primitive sent by SIM.
+            This is the confirmation of the changed
+      data available event status(send in SIM_EVENTLIST_REQ)
+*/
+
+GLOBAL const void psa_sim_eventlist_cnf ( T_SIM_EVENTLIST_CNF *sim_eventlist_cnf )
+{
+
+  TRACE_FUNCTION ("psa_sim_eventlist_cnf()");
+
+  switch(sim_eventlist_cnf->event_data_avail)
+  {
+    case SIM_EVENT_DISABLE:
+    case SIM_EVENT_ENABLE:
+      break;
+    default:
+      TRACE_EVENT("psa_sim_eventlist_cnf:not valid event_data_avail");
+  }
+ /*
+ *-------------------------------------------------------------------
+ * free the primitive buffer
+ *-------------------------------------------------------------------
+ */
+  PFREE (sim_eventlist_cnf);
+
+}
+
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)         MODULE  : PSA_SIMP                |
+|                                 ROUTINE : psa_sim_dti_ind         |
++-------------------------------------------------------------------+
+
+  PURPOSE : processes the SIM_DTI_IND primitive sent by SIM
+            indicating closing of BIP channel and dti connection
+      (because the release timer is expired)
+*/
+#ifdef FF_SAT_E
+#ifdef DTI
+GLOBAL const void psa_sim_dti_bip_ind ( T_SIM_DTI_BIP_IND *sim_dti_bip_ind )
+{
+
+  TRACE_FUNCTION ("psa_sim_dti_bip_ind()");
+
+/* inform SAT Source about bip_ch_id and dti_conn*/
+
+  if((sim_dti_bip_ind->dti_conn NEQ  SIM_DTI_DISCONNECT) OR 
+     (sim_dti_bip_ind->dti_conn NEQ SIM_BIP_CLOSE_CHANNEL)) 
+  {
+    TRACE_FUNCTION ("psa_sim_dti_bip_ind: bip/dti parameter combination received!");
+  }
+
+  cmhSAT_OpChnSIMFail( sim_dti_bip_ind->dti_conn, 
+                       sim_dti_bip_ind->bip_conn, 
+                       sim_dti_bip_ind->bip_ch_id );
+
+/*
+ *-------------------------------------------------------------------
+ * free the primitive buffer
+ *-------------------------------------------------------------------
+ */
+  PFREE (sim_dti_bip_ind);
+
+}
+#endif /* DTI */
+#endif /* #ifdef FF_SAT_E */
+
+/*
++------------------------------------------------------------------------------
+|  Function    : psaSIM_Insert_Continued
++------------------------------------------------------------------------------
+|  Description : For loading phone book 
+|
+|  Parameters  :sim_mmi_insert_ind - Primitive  
+|
+|  Return      :     Void  
+|
++------------------------------------------------------------------------------
+*/
+
+
+void psaSIM_Insert_Continued(T_SIM_MMI_INSERT_IND *sim_mmi_insert_ind )
+{
+#ifdef TI_PS_FFS_PHB
+  /* Inform the phonebook module about all SIM parameters except ECC */
+  pb_inserted_sim (MAX_SRV_TBL,
+                   sim_mmi_insert_ind->sim_serv,
+                   &sim_mmi_insert_ind->imsi_field,
+                   sim_mmi_insert_ind->func,
+                   sim_mmi_insert_ind->phase);
+#else
+  pb_build_req(sim_mmi_insert_ind);
+#endif
+  cmhSIM_SIMInserted();
+}
+/*==== EOF =========================================================*/
+
+