diff g23m/condat/ms/src/aci/cmh_ccr.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/cmh_ccr.c	Mon Jun 01 03:24:05 2015 +0000
@@ -0,0 +1,5316 @@
+/*
++-----------------------------------------------------------------------------
+|  Project :  GSM-PS (6147)
+|  Modul   :  CMH_CCR
++-----------------------------------------------------------------------------
+|  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 functions which are responsible
+|             for the responses of the protocol stack adapter for
+|             call control.
++-----------------------------------------------------------------------------
+*/
+
+#ifndef CMH_CCR_C
+#define CMH_CCR_C
+#endif
+
+/*==== INCLUDES ===================================================*/
+
+#include "aci_all.h"
+#include "aci_cmh.h"
+#include "ati_cmd.h"
+#include "aci_cmd.h"
+#include "aci_mem.h"
+#include "phb.h"
+#include "l4_tim.h"
+#include "aci_lst.h"
+
+
+#ifdef FAX_AND_DATA
+#include "aci_fd.h"
+#endif    /* of #ifdef FAX_AND_DATA */
+
+#include "aci.h"
+#include "psa.h"
+#include "ksd.h"
+#include "psa_cc.h"
+#include "psa_ss.h"
+#include "psa_util.h"
+#include "cmh.h"
+#include "cmh_cc.h"
+#include "cmh_ss.h"
+
+#ifdef FF_ATI
+#include "aci_io.h"
+#endif   /* of #ifdef FF_ATI */
+
+#ifdef UART
+#include "dti.h"      /* functionality of the dti library */
+#include "dti_conn_mng.h"
+#include "dti_cntrl_mng.h"
+#endif
+
+#ifdef FAX_AND_DATA
+
+#include "psa_ra.h"
+#include "cmh_ra.h"
+#include "psa_l2r.h"
+#include "cmh_l2r.h"
+#include "psa_tra.h"
+
+#ifdef FF_FAX
+#include "psa_t30.h"
+#include "cmh_t30.h"
+#endif /* FF_FAX */
+
+#endif /* FAX_AND_DATA */
+
+#ifdef SIM_TOOLKIT
+#include "psa_sat.h"
+#include "cmh_sat.h"
+#include "psa_sim.h"
+#endif    /* of #ifdef SIM_TOOLKIT */
+
+#include "aoc.h"
+#include "audio.h"
+
+#if defined (FF_WAP) || defined (FF_TCP_IP) || defined (FF_GPF_TCPIP) || defined (FF_SAT_E)
+#include "wap_aci.h"
+#include "psa_ppp_w.h"
+#include "cmh_ppp.h"
+#endif /* of FF_WAP or FF_TCP_IP || FF_GPF_TCPIP FF_SAT_E */
+
+#if defined (CO_UDP_IP) || defined (FF_GPF_TCPIP)
+#include "psa_tcpip.h"
+#include "cmh_ipa.h"
+#endif /* CO_UDP_IP || FF_GPF_TCPIP */
+
+#ifdef FF_GPF_TCPIP
+#include "dcm_utils.h"
+#include "dcm_state.h"
+#include "dcm_env.h"
+#endif
+#include "dcm_f.h"
+#ifdef UART
+#include "psa_uart.h"
+#include "cmh_uart.h"
+#endif /*UART*/
+
+#ifdef FF_PSI
+#include "psa_psi.h"
+#include "cmh_psi.h"
+#endif /*FF_PSI*/
+
+#include "cmh_phb.h"
+
+#include "psa_sim.h"
+#include "cmh_sim.h"
+
+/*==== CONSTANTS ==================================================*/
+
+/*==== TYPES ======================================================*/
+
+/*==== EXPORT =====================================================*/
+
+/*==== VARIABLES ==================================================*/
+
+#if defined (FF_WAP) || defined (FF_TCP_IP) || defined (FF_GPF_TCPIP) || defined (FF_SAT_E)
+ULONG ipAddress;
+
+GLOBAL SHORT cmhCC_PPP_Established (ULONG ip_address,USHORT max_receive_unit,
+                                    ULONG dns1, ULONG dns2);
+GLOBAL SHORT cmhCC_PPP_Terminated (void);
+#endif
+
+#ifdef CO_UDP_IP 
+GLOBAL SHORT cmhCC_IPA_Configurated (void);
+GLOBAL SHORT cmhCC_UDPA_Configurated (void);
+GLOBAL SHORT cmhCC_UDPA_Deconfigurated (void);
+#endif /* CO_UDP_IP */
+
+
+/*==== FUNCTIONS ==================================================*/
+
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)    MODULE  : CMH_CCR                      |
+|                            ROUTINE : cmhCC_CallAlerted            |
++-------------------------------------------------------------------+
+
+  PURPOSE : called party is alerted
+
+*/
+
+GLOBAL void cmhCC_CallAlerted ( SHORT cId )
+{
+  T_CC_CALL_TBL *ctb = ccShrdPrm.ctb[cId];
+  UBYTE idx;
+
+  TRACE_FUNCTION ("cmhCC_CallAlerted()");
+
+/*
+ *-------------------------------------------------------------------
+ * process event
+ *-------------------------------------------------------------------
+ */
+  if (ctb->prgDesc EQ PROG_NOT_PRES)
+  {
+    for( idx = 0; idx < CMD_SRC_MAX; idx++ )
+    {
+      R_AT( RAT_CPI, idx )
+        ( cId+1,
+          CPI_MSG_Alert,
+          (ctb->inBndTns)? CPI_IBT_True: CPI_IBT_False,
+          (ccShrdPrm.TCHasg)? CPI_TCH_True: CPI_TCH_False,
+          ctb->curCs);
+    }
+  }
+  return;
+}
+
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)    MODULE  : CMH_CCR                      |
+|                            ROUTINE : cmhCC_CallProceeding         |
++-------------------------------------------------------------------+
+
+  PURPOSE : call proceed indication
+
+*/
+
+GLOBAL void cmhCC_CallProceeding ( SHORT cId )
+{
+  T_CC_CALL_TBL *ctb = ccShrdPrm.ctb[cId];
+  T_ACI_CPI_MSG msgType;
+  SHORT idx;
+
+  TRACE_FUNCTION ("cmhCC_CallProceeding()");
+
+/*
+ *-------------------------------------------------------------------
+ * process event
+ *-------------------------------------------------------------------
+ */
+  switch( ccShrdPrm.msgType )
+  {
+  case( MT_SETUP ): msgType = CPI_MSG_Setup; break;
+  case( MT_DISC  ):
+    switch (ctb->calStat)
+    {
+    case NO_VLD_CS:
+    case CS_ACT_REQ:
+    case CS_CPL_REQ:
+    case CS_DSC_REQ:
+      break;
+    default:
+      return;
+    }
+    msgType = CPI_MSG_Disc;
+    break;
+  case( MT_ALRT  ): msgType = CPI_MSG_Alert; break;
+  case( MT_PROC  ): msgType = CPI_MSG_Proc;  break;
+  case( MT_PROGR ): msgType = CPI_MSG_Progr; break;
+  /* case( MT_CONN  ): msgType = CPI_MSG_Conn;  break; */
+  case( MT_CONN  ): return; /* CPI is generated in cmhCC_CallConnected */
+  default:          TRACE_EVENT("UNEXP MSG TYPE IN CC SHRD PARM");
+                    return;
+  }
+
+/*  ctb->curCs = MNCC_CAUSE_NO_MS_CAUSE; */
+  for( idx = 0; idx < CMD_SRC_MAX; idx++ )
+  {
+    R_AT( RAT_CPI, idx )
+      ( cId+1,
+        msgType,
+        (ctb->inBndTns)? CPI_IBT_True: CPI_IBT_False,
+        (ccShrdPrm.TCHasg)? CPI_TCH_True: CPI_TCH_False,
+        ctb->curCs);
+  }
+
+  return;
+}
+
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)    MODULE  : CMH_CCR                      |
+|                            ROUTINE : cmhCC_CallConnected          |
++-------------------------------------------------------------------+
+
+  PURPOSE : call is connected
+
+*/
+
+GLOBAL void cmhCC_CallConnected ( SHORT cId )
+{
+  T_CC_CALL_TBL *ctb = ccShrdPrm.ctb[cId];
+  T_CC_CMD_PRM * pCCCmdPrm;   /* points to CC command parameters */
+  CHAR numBuf[MAX_CC_CALLING_NUMBER+1]; /* buffers calling number + '\0' */
+  CHAR subBuf[SUB_LENGTH+1];  /* buffers subaddress 'subaddress\0' */
+  T_ACI_TOA toaBuf;           /* buffers type of address */
+  T_ACI_TOS tosBuf;           /* buffers type of subaddress */
+  UBYTE cmdBuf;               /* buffers current command */
+  UBYTE srcBuf;               /* buffers current command source */
+  SHORT idx;
+  T_CC_CALL_TYPE calltype = cmhCC_getcalltype(cId);
+
+  TRACE_FUNCTION ("cmhCC_CallConnected()");
+
+  /* check for command context */
+  switch(ctb->curCmd)
+  {
+  case(AT_CMD_D):
+  case(AT_CMD_A):
+  case(AT_CMD_CHLD):
+    break;
+
+  default:
+    TRACE_EVENT_P1("cmhCC_CallConnected(): wrong command context %d", ctb->curCmd);
+    return;
+  }
+
+  /* call progress information */
+  for( idx = 0; idx < CMD_SRC_MAX; idx++ )
+  {
+    R_AT( RAT_CPI, idx )
+      (cId+1,
+       CPI_MSG_Conn,
+       (ctb->inBndTns)? CPI_IBT_True: CPI_IBT_False,
+       (ccShrdPrm.TCHasg)? CPI_TCH_True: CPI_TCH_False,
+       ctb->curCs);
+  }
+
+  /* process event for D, A and +CHLD command */
+  pCCCmdPrm = &cmhPrm[ctb->curSrc].ccCmdPrm;
+
+  if (ctb->curCmd EQ AT_CMD_D)
+  {
+    /* Check if user allows Connected Line Presentation: FTA 31.1.3.1 */
+    switch (ctb->clgPty.present)
+    {
+      case (PRES_PRES_ALLOW): /* presentation allowed FTA 31.1.3.1 */
+        TRACE_EVENT ("cmhCC_CallConnected(): presentation allowed !");
+        break;
+
+      case (PRES_NOT_PRES):
+        TRACE_EVENT ("cmhCC_CallConnected(): presentation not present !");
+        break;
+
+      case (PRES_PRES_REST): /* presentation restricted FTA 31.1.4.2 procedure 1 */
+        TRACE_EVENT ("cmhCC_CallConnected(): presentation restricted !");
+        /*
+         * R_AT( RAT_COLR, ccShrdPrm.???.???.??? )
+         *  ( COLR_STAT_??? );
+         */
+        break;
+
+      case (PRES_NUMB_NOT_AVAIL): /* number not available due to interworking FTA 31.1.4.2 procedure 2 */
+        TRACE_EVENT ("cmhCC_CallConnected(): number not available due to interworking !");
+        /*
+         * R_AT( RAT_COLR, ccShrdPrm.???.???.??? )
+         *  ( COLR_STAT_??? );
+         */
+        break;
+
+      default:
+        TRACE_EVENT ("[ERR] cmhCC_CallConnected(): pCtbNtry->clgPty.present = UNKNOWN");
+        return;
+
+    }
+
+    if ((ctb->clgPty.present NEQ PRES_NOT_PRES)  /* any .present indicator received from MSC? */
+    AND (ctb->clgPty.c_num EQ 0) )               /* but no number available? */
+    {
+      ;   /* do nothig */
+    }
+    else
+    {
+      /*
+       * This function call (rAT_PlusCOLP) informs MWF/BMI about
+       * presentation of the called number on display.
+       * If MFW did not receive this function call, then it should
+       * not display the number after querying the call state with
+       * qAT_PercentCAL() where it gets the typed in called number, unfortunately
+       */
+      R_AT( RAT_COLP, ctb->curSrc )
+        ( COLP_STAT_NotPresent,
+          psaCC_ctbClrAdr2Num( cId, numBuf, sizeof (numBuf) ),
+          cmhCC_ctbGetClrNumTyp( cId, &toaBuf ),
+          psaCC_ctbClrAdr2Sub( cId, subBuf ),
+          cmhCC_ctbGetClrSubTyp( cId, &tosBuf ),
+          psaCC_ctbGetAlpha( cId) );
+    }
+  }
+
+
+  /* reset CMOD to single mode */
+  ccShrdPrm.CMODmode = CMOD_MOD_Single;
+
+  switch(calltype)
+  {
+  /* Speech Call */
+  case( VOICE_CALL ):
+    cmdBuf = ctb->curCmd;
+    srcBuf = ctb->curSrc;
+
+    /* reset CMOD to single mode */
+    if( ctb->BC[1].bearer_serv NEQ BEARER_SERV_NOT_PRES )
+    {
+      ccShrdPrm.CMODmode = CMOD_MOD_Single;
+    }
+
+    /*
+     *  check if connect is expected
+     */
+    if( cmhCC_tstAndUnflagCall( cId, &(pCCCmdPrm -> mltyCncFlg)))
+    {
+      if( pCCCmdPrm -> mltyCncFlg EQ 0 )  /* if last call */
+      {
+
+#ifdef SIM_TOOLKIT
+        if( ctb->SATinv )
+        {
+          cmhSAT_CallCncted();
+          ctb->SATinv = FALSE; /* unsent */
+        }
+#endif /* SIM_TOOLKIT */
+        if(!cmhCC_atdsendok(cId)) /* if OK hasn't been sent right after MNCC_SETUP_REQ, then send it now */
+        {
+          /* needed for RAT_OK in MFW... Temp until tasks are separated */
+          cmhCC_PrepareCmdEnd (cId, NULL, NULL);
+
+          R_AT( RAT_OK, srcBuf ) ( cmdBuf );
+        }
+
+        /* log result */
+        cmh_logRslt ( srcBuf, RAT_OK, cmdBuf, (SHORT)(cId+1), -1, -1 );
+      }
+    }
+    cmhCC_PrepareCmdEnd (cId, NULL, NULL);
+    break;
+
+#if defined (FAX_AND_DATA) AND defined (DTI)
+
+  /* in case of a supported data call */
+  case(TRANS_CALL):
+  case(NON_TRANS_CALL):
+  case(FAX_CALL):
+#ifdef FF_TCP_IP
+  /* PPP call initialisation (AAA - PPP - L2R) */
+  case(PPP_CALL):
+#endif /* FF_TCP_IP */
+   /* wait for TCH if not assigned */
+    if( ccShrdPrm.TCHasg )
+    {
+      /* activate RA connection: in case of failure clear call ! */
+      ccShrdPrm.datStat = DS_ACT_REQ;
+
+      if (cmhRA_Activate( ctb->curSrc, ctb->curCmd, cId ) NEQ AT_EXCT)
+      {
+        TRACE_EVENT("RA ACTIVATION FAILURE -> DISC CALL");
+        ccShrdPrm.datStat = DS_IDL;
+        ctb->nrmCs = MNCC_CAUSE_CALL_CLEAR;
+        psaCC_ClearCall (cId);
+#if defined (SIM_TOOLKIT) AND defined (FF_SAT_E)
+          /* check impact for SAT commands */
+        cmhSAT_OpChnCSDDown( cId, TPL_NONE );
+#endif /* SIM TOOLKIT AND FF_SAT_E */
+      }
+    }
+    break;
+
+#if defined(CO_UDP_IP) OR defined(FF_GPF_TCPIP)
+#ifdef CO_UDP_IP
+  case(UDPIP_CALL):
+#endif
+#ifdef FF_GPF_TCPIP
+  case(TCPIP_CALL):
+#endif
+    /* wait for TCH if not assigned */
+    if( ccShrdPrm.TCHasg )
+    {
+      if (wap_state NEQ Wap_Not_Init) /* release call */
+      {
+        TRACE_EVENT("FATAL ERROR in cmhCC_CallConnected: WAP Call already in process");
+        ctb->nrmCs = MNCC_CAUSE_CALL_CLEAR;
+        psaCC_ClearCall (cId);
+#if defined (SIM_TOOLKIT) AND defined (FF_SAT_E)  
+        cmhSAT_OpChnCSDDown( cId, UDP );
+#endif /* SIM TOOLKIT AND FF_SAT_E */
+        break;
+      }
+      else
+      {
+        TRACE_EVENT("WAP call initialisation");
+#if defined (SIM_TOOLKIT) AND defined (FF_SAT_E)
+        if( cmhSAT_OpChnChckCSD(UDP) )
+        {
+          psaTCPIP_Activate(ctb->curSrc, 0,
+                            cId,
+                            TCPIP_ACT_OPTION_V4 | TCPIP_ACT_OPTION_UDP,
+                            TCPIP_CONNECTION_TYPE_CSD_WAP,
+                            cmhSAT_OpChnUDPActiveCsd) ;
+        }
+        else
+#endif /* SIM TOOLKIT AND FF_SAT_E */
+        {
+          if(is_gpf_tcpip_call())
+          {
+            psaTCPIP_Activate(ctb->curSrc, 0 /* Change this! */,
+                            cId,
+                              TCPIP_ACT_OPTION_V4 | TCPIP_ACT_OPTION_TCPIP,
+                            TCPIP_CONNECTION_TYPE_CSD_WAP,
+                            psaTCPIP_act_csd_callback) ;
+        }
+          else
+          {
+            psaTCPIP_Activate(ctb->curSrc, 0 /* Change this! */,
+                              cId,
+                              TCPIP_ACT_OPTION_V4 | TCPIP_ACT_OPTION_UDP,
+                              TCPIP_CONNECTION_TYPE_CSD_WAP,
+                              psaTCPIP_act_csd_callback) ;
+          }
+        }
+      }
+    }
+    break;
+#endif /* defined(WAP) OR defined(FF_GPF_TCPIP) */
+
+ /* in case of an unsupported data call */
+  case(UNSUP_DATA_CALL):
+    TRACE_EVENT("UNSUPPORTED DATA CALL -> DISC CALL");
+    ctb->nrmCs = MNCC_CAUSE_CALL_CLEAR;
+    psaCC_ClearCall (cId);
+#if defined (SIM_TOOLKIT) AND defined (FF_SAT_E) 
+    /* check impact for SAT commands */
+    cmhSAT_OpChnCSDDown( cId, TPL_NONE );
+#endif /* SIM TOOLKIT AND SAT_SAT_E */
+    break;
+
+#endif  /* of #ifdef FAX_AND_DATA */
+
+  default:
+    TRACE_ERROR("Wrong call type");
+  }
+}
+
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)    MODULE  : CMH_CCR                      |
+|                            ROUTINE : process_CHLDaddInfo          |
++-------------------------------------------------------------------+
+
+  PURPOSE : Local function: processes parameter CHLDaddInfo (continue action that
+            had to wait for a call to be connected first).
+*/
+/* Held call is being disconnected */
+#define DISCONNECT_HELD (0)
+/* Call is being put on hold */
+#define CALL_HELD       (1)
+/* Multyparty call is being put on hold */
+#define MTPTY_HELD      (2)
+
+LOCAL void process_CHLDaddInfo( UBYTE srcId, UBYTE context )
+{
+  /* param context allows to differentiate some special case */
+  SHORT addId;
+  T_CC_CMD_PRM *pCCCmdPrm = &cmhPrm[srcId].ccCmdPrm;
+
+  TRACE_FUNCTION("process_CHLDaddInfo( )");
+
+  for( addId = 0; !((pCCCmdPrm -> mltyCncFlg >> addId) & 0x01); addId++ )
+    ;
+
+  switch( CHLDaddInfo )
+  {
+    case( CHLD_ADD_INFO_ACC_CAL ):
+      cmhCC_AcceptCall(addId, srcId, AT_CMD_CHLD);
+      return;
+
+    case (CHLD_ADD_INFO_DIAL_CAL):
+      cmhCC_NewCall(addId, srcId, AT_CMD_D);
+      return;
+
+    case( CHLD_ADD_INFO_RTV_CAL ):
+      if(context NEQ CALL_HELD)
+      {
+        cmhCC_RetrieveCall(addId, srcId);
+        return;
+      }
+      break;
+
+    case (NO_CHLD_ADD_INFO):
+      if(context EQ DISCONNECT_HELD)
+      {
+        return; /* May happen for CCBS recall, disconnecting the active call */
+      }
+      break;
+  }
+
+  TRACE_EVENT("UNEXP ADD CHLD INFO");
+}
+
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)    MODULE  : CMH_CCR                      |
+|                            ROUTINE : cmhCC_CallDisconnected       |
++-------------------------------------------------------------------+
+
+  PURPOSE : call is disconnected: process event for D and A command, abort command or no command
+*/
+
+#ifdef SIM_TOOLKIT
+LOCAL void cmhCC_CallDisc_whiledialling_sat(SHORT cId, BOOL *send_atresult)
+{
+  T_CC_CALL_TBL *ctb = ccShrdPrm.ctb[cId];
+  UBYTE         network_cause;
+
+  if( !ctb->SATinv )
+  {
+    return;
+  }
+
+  TRACE_FUNCTION("cmhCC_CallDisc_whiledialling_sat");
+
+  switch(ctb->curCmd)
+  {
+  case( AT_CMD_A ):
+    /* if connect is expected */
+    if( cmhPrm[ctb->curSrc].ccCmdPrm.mltyCncFlg NEQ 0 )
+    {
+      if( ctb->SATinv & SAT_REDIAL )
+      {
+        ctb->calStat = CS_SAT_REQ;
+        return;
+      }
+
+      /* return network error cause GSM 11.14 / 12.12.3 */
+      if(GET_CAUSE_VALUE(ctb->nrmCs) EQ NOT_PRESENT_8BIT)
+      {
+        network_cause = ADD_NO_CAUSE;
+      }
+      else
+        network_cause = GET_CAUSE_VALUE(ctb->nrmCs)|0x80;
+
+      *send_atresult = cmhSAT_NtwErr(network_cause);
+    }
+    break;
+
+  case( AT_CMD_ABRT ):
+    /* if disconnect is expected */
+    if( cmhPrm[ctb->curSrc].ccCmdPrm.mltyDscFlg NEQ 0 )
+    {
+      cmhSAT_UserClear();
+    }
+    break;
+#ifdef FF_SAT_E
+  default:
+    cmhSAT_OpChnCSDDown( cId, TPL_DONT_CARE );
+    break;
+#endif /* FF_SAT_E */
+  }
+}
+#endif /*#ifdef SIM_TOOLKIT*/
+/*
++------------------------------------------------------------------------------
+|   Function    :  cmhCC_CallDisc_connectingphase
++------------------------------------------------------------------------------
+|   Description :  This function checks on call type and disconnects the
+|                  different calltypes.
+|
+|   Parameters  :  call id
+|
+|   Return      :
+|
++------------------------------------------------------------------------------
+*/
+
+LOCAL void cmhCC_CallDisc_connectingphase ( SHORT cId )
+{
+  T_CC_CALL_TYPE calltype = cmhCC_getcalltype(cId);
+  T_CC_CALL_TBL  *ctb     = ccShrdPrm.ctb[cId];
+  BOOL           atRslt   = TRUE;        /* flags to send a AT result code */
+
+  TRACE_FUNCTION("cmhCC_CallDisc_connectingphase");
+
+  /* reset CMOD to single mode */
+  ccShrdPrm.CMODmode = CMOD_MOD_Single;
+
+#ifdef SIM_TOOLKIT
+  /* handling of SAT invoked call */
+  cmhCC_CallDisc_whiledialling_sat(cId, &atRslt);
+#endif /* SIM_TOOLKIT */
+
+  /* Unflag Multiconnect/disconnect Flags */
+  if( ctb->curSrc NEQ CMD_SRC_NONE )
+  {
+    cmhCC_tstAndUnflagCall( cId,
+                            &cmhPrm[ctb->curSrc].ccCmdPrm.mltyCncFlg );
+    cmhCC_tstAndUnflagCall( cId,
+                            &cmhPrm[ctb->curSrc].ccCmdPrm.mltyDscFlg );
+  }
+
+  /* CCBS handling */
+  if( ctb->curCmd EQ AT_CMD_D      AND
+      ctb->CCBSstat EQ CCBSS_PSSBL )
+  {
+    cmhrat_ccbs( CMD_SRC_MAX, CCBS_IND_Possible,
+                 CCBS_STAT_NotPresent, NULL );
+  }
+
+  switch( calltype )
+  {
+    case( VOICE_CALL ): /* voice call */
+      /* CSSU indications handling */
+      if( ctb->calStat EQ CS_HLD )
+      {
+        if( ctb->curCmd NEQ AT_CMD_NONE )
+        {
+           send_CSSX_notification(cId,
+                              CSSX_CODE_HeldCallRel,
+                              ACI_NumParmNotPresent,
+                              NULL, NULL, NULL, NULL);
+        }
+      }
+      break;
+
+#if defined (FAX_AND_DATA) AND defined (DTI)
+    case(TRANS_CALL):
+      if( ccShrdPrm.datStat NEQ DS_IDL )
+      {
+        ccShrdPrm.datStat = DS_STOP_REQ;
+        cmhTRA_Deactivate ();
+        return;
+      }
+      break;
+
+    case(NON_TRANS_CALL):
+      if( ccShrdPrm.datStat NEQ DS_IDL )
+      {
+        ccShrdPrm.datStat = DS_STOP_REQ;
+        cmhL2R_Deactivate ();
+        return;
+      }
+      break;
+
+#ifdef FF_FAX
+    case( FAX_CALL ):
+      if( ccShrdPrm.datStat NEQ DS_IDL )
+      {
+        ccShrdPrm.datStat = DS_STOP_REQ;
+        cmhT30_Deactivate ();
+        return;
+      }
+      break;
+#endif /* FF_FAX */
+
+#ifdef CO_UDP_IP 
+    case(UDPIP_CALL):
+    /* check if a UDP/IP call is in process... If yes then end call */
+      if (ccShrdPrm.datStat NEQ DS_IDL)
+      {
+        ccShrdPrm.datStat = DS_STOP_REQ;
+
+        /* Check command context to know if lower layers of PPP already are down or not */
+        if(ctb->curCmd EQ AT_CMD_NONE OR
+           ctb->curCmd EQ AT_CMD_D )
+        {
+          /* If PPP connected - send terminate request to PPP */
+          if(pppShrdPrm.state EQ PPP_ESTABLISHED)
+          {
+            cmhPPP_Terminate(DWN);
+          }
+          return;
+        }
+      }
+      break;
+#endif  /* CO_UDP_IP */
+
+#endif /* of #ifdef FAX_AND_DATA */
+  }
+
+  /* Command is done: send response to user if not suppressed */
+  /* if(atRslt) cmhCC_SndDiscRsn( cId ); */  /* to pass 26.8.1.2.8.1 */
+}
+
+LOCAL void call_disconnected_data_call(T_CC_CALL_TYPE calltype, SHORT cId)
+{
+  TRACE_FUNCTION("call_disconnected_data_call");
+
+  /* Local disconnection for PPP if peer shuts down the line
+     instead of normal PPP shutdown */
+  switch( calltype )
+  {
+#if defined (FAX_AND_DATA) AND defined (DTI)
+ /* check if a WAP call is in process... If yes then end call */
+#if defined(CO_UDP_IP) || defined(FF_TCP_IP)
+
+#ifdef CO_UDP_IP
+  case(UDPIP_CALL):
+#endif /* CO_UDP_IP */
+
+#if defined(FF_GPF_TCPIP)
+  case (TCPIP_CALL):
+#endif /* FF_GPF_TCPIP */
+
+#ifdef FF_TCP_IP
+  case PPP_CALL:
+  pppShrdPrm.is_PPP_CALL = FALSE;
+  TRACE_EVENT ("is_PPP_CALL resetted");
+#endif /* FF_TCP_IP */
+
+    if (ccShrdPrm.datStat NEQ DS_IDL)
+    {
+      ccShrdPrm.datStat = DS_STOP_REQ;
+
+      /* Only local disconnection is possible in this case, the call is already disconnected !
+      if(pppShrdPrm.state EQ PPP_ESTABLISHED)
+        cmhPPP_Terminate(UP); */
+
+      if((pppShrdPrm.state EQ PPP_ESTABLISHED) OR
+         (pppShrdPrm.state EQ PPP_ESTABLISH)   OR
+         (pppShrdPrm.state EQ PPP_TERMINATE))
+      {
+        cmhPPP_Terminate(DWN);
+      }
+      else if (wap_state > Wap_Not_Init      AND
+               wap_state <= UDPA_Deactivation)
+      {
+        cmhPPP_Terminated();   /* Trigger termination of TCPIP if PPP did not yet start (ACI-FIX-9317)*/
+      }
+    }
+    break;
+#endif  /* of WAP || FF_TCP_IP || SAT E */
+
+  case(TRANS_CALL):
+  case(NON_TRANS_CALL):
+    if( ccShrdPrm.datStat NEQ DS_IDL )
+    {
+      ccShrdPrm.datStat = DS_STOP_REQ;
+      if(calltype EQ TRANS_CALL)
+      {
+        cmhTRA_Deactivate ();
+      }
+      else
+      {
+        cmhL2R_Deactivate ();
+      }
+    }
+    break;
+#endif /* FAX_AND_DATA */
+
+  default:
+    break;
+  } /* end switch */
+} /* end switch */
+
+LOCAL void cmhCC_CallDisc_userinitiated ( SHORT cId )
+{
+  T_CC_CMD_PRM * pCCCmdPrm;   /* points to CC command parameters */
+  T_CC_CALL_TYPE calltype = cmhCC_getcalltype(cId);
+  T_CC_CALL_TBL  *ctb     = ccShrdPrm.ctb[cId];
+#ifdef FF_PSI
+  T_ACI_DTI_PRC_PSI  *src_infos = NULL;
+#endif /*FF_PSI*/
+  UBYTE cmdBuf;               /* buffers current command */
+  UBYTE srcBuf;               /* buffers current command source */
+
+  TRACE_FUNCTION("cmhCC_CallDisc_userinitiated");
+
+  /* process event for H and +CHUP command */
+  pCCCmdPrm = &cmhPrm[ctb->curSrc].ccCmdPrm;
+
+  /* reset CMOD to single mode */
+  ccShrdPrm.CMODmode = CMOD_MOD_Single;
+
+  call_disconnected_data_call(calltype, cId);
+
+  cmhCC_PrepareCmdEnd (cId, &cmdBuf, &srcBuf);
+
+  /* if ATH before the call is connected, the flag must be cleared */
+  cmhCC_tstAndUnflagCall (cId, &(pCCCmdPrm -> mltyCncFlg));
+
+  /* check if disconnect is expected */
+  if( cmhCC_tstAndUnflagCall( cId, &(pCCCmdPrm -> mltyDscFlg)))
+  {
+#if defined (FF_WAP) || defined (FF_SAT_E)
+    /* Check if the WAP stack is down  */
+    if((pCCCmdPrm -> mltyDscFlg EQ 0)               AND
+       (ccShrdPrm.wapStat       EQ CC_WAP_STACK_DOWN))
+#else
+    if( pCCCmdPrm -> mltyDscFlg EQ 0 )
+#endif /* WAP || SAT E */
+    /****************/
+    /* if last call */
+    /****************/
+    {
+#ifdef SIM_TOOLKIT
+      if( ctb->SATinv )
+      {
+        cmhSAT_StartPendingCall( );
+      }
+      else
+#endif  /* SIM_TOOLKIT */
+      {
+        if (cmdBuf EQ AT_CMD_Z)
+        {
+          cmh_Reset ( srcBuf, TRUE );
+          R_AT(RAT_Z, srcBuf)();
+        }
+#if defined (FF_PSI) AND defined (DTI)
+        src_infos = find_element (psi_src_params, srcBuf, cmhPSItest_srcId);
+        if (src_infos EQ NULL)
+#endif /*FF_PSI*/
+#ifdef UART
+        {
+           if (uartShrdPrm.dtr_clearcall EQ TRUE)
+           {
+              uartShrdPrm.dtr_clearcall = FALSE;
+              R_AT( RAT_NO_CARRIER, srcBuf ) ( cmdBuf, cId+1 );
+              cmh_logRslt ( srcBuf,
+              RAT_NO_CARRIER, cmdBuf, (SHORT)(cId+1), -1, -1 );
+           }
+           else
+           {
+              R_AT( RAT_OK, srcBuf ) ( cmdBuf );
+
+              /* log result */
+              cmh_logRslt ( srcBuf,
+              RAT_OK, cmdBuf, (SHORT)(cId+1), -1, -1 );
+          }
+        }
+#endif /*UART*/
+#if defined (FF_PSI) AND defined (DTI)
+        else
+        {
+           if (psiShrdPrm.dtr_clearcall EQ TRUE)
+           {
+              psiShrdPrm.dtr_clearcall = FALSE;
+              R_AT( RAT_NO_CARRIER, srcBuf ) ( cmdBuf, cId+1 );
+              cmh_logRslt ( srcBuf,
+              RAT_NO_CARRIER, cmdBuf, (SHORT)(cId+1), -1, -1 );
+           }
+           else
+           {
+              R_AT( RAT_OK, srcBuf ) ( cmdBuf );
+
+              /* log result */
+              cmh_logRslt ( srcBuf,
+              RAT_OK, cmdBuf, (SHORT)(cId+1), -1, -1 );
+          }
+         }
+#endif /*FF_PSI*/
+        }
+      }
+   }
+
+  /* inform call owner about disconnect */
+  if( srcBuf EQ ctb->calOwn
+#ifdef SIM_TOOLKIT
+    AND
+      !ctb->SATinv )
+#else
+    )
+#endif
+  {
+    /* do nothing: owner knows already... */
+    /* EXCEPT if !ctb->SATinv: a SAT call setup has been started, and all previous
+    calls had to be disconnected (because of SAT command qualifer) */
+  }
+  else
+  {
+    R_AT( RAT_NO_CARRIER, ctb->calOwn ) ( AT_CMD_NONE, cId+1 );
+    cmh_logRslt ( srcBuf, RAT_NO_CARRIER, cmdBuf,
+                  (SHORT)(cId+1), -1, -1 );
+  }
+}
+
+/* process disconnection of an held call: +CHLD command context */
+LOCAL void cmhCC_CallDisc_heldcall ( SHORT cId )
+{
+  T_CC_CMD_PRM * pCCCmdPrm;   /* points to CC command parameters */
+  T_CC_CALL_TYPE calltype = cmhCC_getcalltype(cId);
+  T_CC_CALL_TBL  *ctb     = ccShrdPrm.ctb[cId];
+  UBYTE cmdBuf;               /* buffers current command */
+  UBYTE srcBuf;               /* buffers current command source */
+
+  TRACE_FUNCTION("cmhCC_CallDisc_heldcall");
+
+  pCCCmdPrm = &cmhPrm[ctb->curSrc].ccCmdPrm;
+
+  cmhCC_PrepareCmdEnd (cId, &cmdBuf, &srcBuf);
+
+  if( pCCCmdPrm -> mltyDscFlg EQ 0 AND
+      pCCCmdPrm -> mltyCncFlg EQ 0     )  /* if last call */
+  {
+    R_AT( RAT_OK, srcBuf ) ( cmdBuf );
+
+    /* log result */
+    cmh_logRslt ( srcBuf, RAT_OK,
+                  cmdBuf, (SHORT)(cId+1), -1, -1 );
+  }
+  /* check if disconnect is expected */
+  else if( cmhCC_tstAndUnflagCall( cId, &(pCCCmdPrm -> mltyDscFlg)))
+  {
+    if( pCCCmdPrm -> CHLDmode EQ CHLD_MOD_RelActAndAcpt AND
+        pCCCmdPrm -> mltyCncFlg AND pCCCmdPrm -> mltyDscFlg EQ 0 )
+    {
+      process_CHLDaddInfo( srcBuf, DISCONNECT_HELD );
+    }
+    else if( pCCCmdPrm -> CHLDmode EQ CHLD_MOD_Ect )
+    {
+      cmhCC_tstAndUnflagCall( cId, &(pCCCmdPrm -> mltyCncFlg)); /* now disconnected */
+    }
+
+    if( pCCCmdPrm -> mltyDscFlg EQ 0 AND
+        pCCCmdPrm -> mltyCncFlg EQ 0     )  /* if last call */
+    {
+      R_AT( RAT_OK, srcBuf ) ( cmdBuf );
+
+      /* log result */
+      cmh_logRslt ( srcBuf, RAT_OK,
+                    cmdBuf, (SHORT)(cId+1), -1, -1 );
+    }
+  }
+  /* check if disconnect is unexpected */
+  else if( cmhCC_tstAndUnflagCall( cId, &(pCCCmdPrm -> mltyCncFlg)))
+  {
+    pCCCmdPrm -> mltyCncFlg = 0;        /* unflag calls */
+
+    R_AT( RAT_CME, srcBuf ) ( cmdBuf, CME_ERR_NotPresent );
+
+    /* log result */
+    cmh_logRslt ( srcBuf, RAT_CME, cmdBuf,
+                  -1, -1, CME_ERR_NotPresent );
+  }
+
+  /* inform call owner about disconnect */
+  if( srcBuf NEQ (UBYTE)CMD_SRC_NONE       AND
+      srcBuf NEQ ctb->calOwn )
+  {
+    R_AT( RAT_NO_CARRIER, ctb->calOwn ) ( AT_CMD_NONE, cId+1 );
+  }
+}
+
+/* process event for the +CTFR command.*/
+LOCAL void cmhCC_CallDisc_transferedcall ( SHORT cId )
+{
+  T_CC_CMD_PRM   *pCCCmdPrm;   /* points to CC command parameters */
+  T_CC_CALL_TYPE calltype = cmhCC_getcalltype(cId);
+  T_CC_CALL_TBL  *ctb     = ccShrdPrm.ctb[cId];
+  UBYTE          cmdBuf;       /* buffers current command */
+  UBYTE          srcBuf;       /* buffers current command source */
+  RAT_ID         rat_id;
+  T_ACI_CME_ERR  cme_err;
+
+  TRACE_FUNCTION("cmhCC_CallDisc_transferedcall");
+
+  /* Get a pointer to the appropriate CC call table entry */
+  pCCCmdPrm = &cmhPrm[ctb->curSrc].ccCmdPrm;
+
+  /* End of command execution here */
+  cmhCC_PrepareCmdEnd (cId, &cmdBuf, &srcBuf);
+
+  (void)cmhCC_tstAndUnflagCall( cId, &(pCCCmdPrm -> mltyDscFlg));
+
+  switch (ctb->CDStat)
+  {
+    case CD_Succeeded:
+      rat_id  = RAT_OK;
+      cme_err = -1;
+      break;
+
+    case CD_Requested: /* No answer from the network */
+      rat_id  = RAT_CME;
+      cme_err = CME_ERR_Timeout;
+      break;
+
+    case CD_Failed: /* SS transaction failed */
+      rat_id  = RAT_CME;
+      cme_err = CME_ERR_OpNotSupp;
+      break;
+
+    default: /* Unexpected here */
+      rat_id  = RAT_CME;
+      cme_err = CME_ERR_Unknown;
+      break;
+  }
+
+  if(rat_id EQ RAT_OK)
+  {
+    R_AT( RAT_OK, srcBuf ) ( cmdBuf );
+  }
+  else if(rat_id EQ RAT_CME)
+  {
+    R_AT( RAT_CME, srcBuf ) ( cmdBuf, cme_err );
+  }
+  cmh_logRslt( srcBuf,         rat_id, cmdBuf,
+               (SHORT)(cId+1), -1,     cme_err );
+
+  ctb->CDStat = NO_VLD_CD;
+}
+
+GLOBAL void cmhCC_CallDisconnected ( SHORT cId )
+{
+  UBYTE          idx;
+  #if defined(FF_GPF_TCPIP)
+  T_CC_CALL_TYPE calltype = cmhCC_getcalltype(cId);
+  #endif /* FF_GPF_TCPIP */
+  T_CC_CALL_TBL  *ctb = ccShrdPrm.ctb[cId];
+  UBYTE callId = 0;
+  UBYTE i = 0;
+  UBYTE mptyId = 0;
+
+  TRACE_FUNCTION ("cmhCC_CallDisconnected()");
+
+  /* inform advice of charge module */
+  aoc_info (cId, AOC_STOP_TIME);
+
+#if defined(FF_GPF_TCPIP)
+  /* Needed if user stops call setup before app got connection conf */
+ if (calltype EQ TCPIP_CALL)
+ {
+    T_DCM_STATUS_IND_MSG msg;
+    msg.hdr.msg_id = DCM_NEXT_CMD_STOP_MSG;
+    msg.result     = DCM_PS_CONN_BROKEN;
+    dcm_send_message(msg, DCM_SUB_WAIT_SATDN_CNF);
+ }
+#endif /* FF_GPF_TCPIP */
+
+  /*
+   *----------------------------------------------------------------
+   * call progress information
+   *----------------------------------------------------------------
+   */
+  for( idx = 0; idx < CMD_SRC_MAX; idx++ )
+  {
+    R_AT( RAT_CPI, idx )
+      ( cId+1,
+        CPI_MSG_Disc,
+        (ctb->inBndTns)? CPI_IBT_True: CPI_IBT_False,
+        (ccShrdPrm.TCHasg)? CPI_TCH_True: CPI_TCH_False,
+        ctb->curCs);
+  }
+
+  /*************************
+  call was not serviced yet
+  ***************************/
+  if( ctb->calOwn EQ OWN_NONE    AND
+      ctb->curCmd EQ AT_CMD_NONE )
+  {
+    psaCC_phbAddNtry ( LMN, cId, CT_MTC, NULL );  /* add call to LMN PB */
+
+#ifdef FF_ATI
+    io_setRngInd (IO_RING_OFF, CRING_TYP_NotPresent, CRING_TYP_NotPresent ); /* V.24 Ring Indicator Line */
+#endif
+
+    for( idx = 0; idx < CMD_SRC_MAX; idx++ )
+    {
+      R_AT( RAT_CRING_OFF, idx )( cId+1 );
+    }
+    return;
+  }
+
+  /*************************
+   check for command context
+  ***************************/
+  switch( ctb->curCmd )
+  {
+    case( AT_CMD_NONE ):
+    case( AT_CMD_A ):
+    case( AT_CMD_D ):
+    case( AT_CMD_ABRT ):
+      cmhCC_CallDisc_connectingphase(cId);
+      break;
+
+    case( AT_CMD_H ):
+    case( AT_CMD_Z ):
+    case( AT_CMD_CHUP ):
+
+#ifdef FF_FAX
+    case( AT_CMD_FKS ):
+    case( AT_CMD_FDT ):
+    case( AT_CMD_FDR ):
+#endif /* FF_FAX */
+
+      cmhCC_CallDisc_userinitiated(cId);
+      break;
+
+    case( AT_CMD_CHLD ):
+      cmhCC_CallDisc_heldcall(cId);
+      break;
+
+    case( AT_CMD_CTFR ):
+      cmhCC_CallDisc_transferedcall(cId);
+      break;
+  } /* switch */
+
+  if ( ctb NEQ NULL AND ctb->mptyStat NEQ CS_IDL)
+  {
+    for(;callId < MAX_CALL_NR; callId++)
+    {
+      if (psaCC_ctb(callId) NEQ NULL AND
+          psaCC_ctb(callId)->mptyStat EQ CS_ACT )
+      {
+        i++;
+        if (callId NEQ cId)
+        {
+          mptyId = callId;
+        }
+      }
+    }
+    if (i EQ 2)
+    {
+      psaCC_ctb(mptyId)->mptyStat = CS_IDL;
+    }
+  }
+
+/* PATCH BE 03.07.00
+ * DO NOT declare the call table entry as unused:
+  do not free call table at this time then every second MTC will fail if early
+  assignment is used. */
+
+  return;
+}
+
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)    MODULE  : CMH_CCR                      |
+|                            ROUTINE : cmhCC_CallReleased           |
++-------------------------------------------------------------------+
+
+  PURPOSE : call is released
+
+*/
+
+GLOBAL void cmhCC_CallReleased ( SHORT cId )
+{
+  UBYTE cmdBuf;               /* buffers current command */
+  UBYTE srcBuf;               /* buffers current command source */
+  T_CC_CMD_PRM   *pCCCmdPrm;   /* points to CC command parameters */
+  T_CC_CALL_TYPE calltype = cmhCC_getcalltype(cId);
+  T_CC_CALL_TBL  *ctb = ccShrdPrm.ctb[cId];
+  UBYTE idx;
+  UBYTE callId = 0;
+  UBYTE i = 0;
+  UBYTE mptyId = 0;
+
+  TRACE_FUNCTION ("cmhCC_CallReleased()");
+
+  /* inform advice of charge module */
+  aoc_info (cId, AOC_STOP_TIME);
+
+#if defined(FF_GPF_TCPIP)
+  /* This will happen if network got lost during a CSD call */
+  if (calltype EQ TCPIP_CALL)
+  {
+    T_DCM_STATUS_IND_MSG msg;
+    msg.hdr.msg_id = DCM_ERROR_IND_MSG;
+    msg.result     = DCM_PS_CONN_BROKEN;
+    dcm_send_message(msg, DCM_SUB_WAIT_SATDN_CNF);
+  }
+#endif /* FF_GPF_TCPIP */
+
+  /* check for command context */
+  switch( ctb->curCmd )
+  {
+  case( AT_CMD_A ):
+  case( AT_CMD_D ):
+  case( AT_CMD_NONE ):
+    /* process event for A, D or no command */
+
+    /* handling for CCBS prolonged session */
+
+    if( ctb->curSrc NEQ CMD_SRC_NONE )
+    {
+    cmhCC_tstAndUnflagCall( cId, &cmhPrm[ctb->curSrc].ccCmdPrm.mltyCncFlg );
+    cmhCC_tstAndUnflagCall( cId, &cmhPrm[ctb->curSrc].ccCmdPrm.mltyDscFlg );
+    }
+      
+    if (ctb->CCBSstat EQ CCBSS_PSSBL )
+    {
+      cmhrat_ccbs (CMD_SRC_MAX, CCBS_IND_PossibilityTimedOut,
+        CCBS_STAT_NotPresent, NULL );
+      break;  /* skip the rest */
+    }
+    if (ctb->CCBSstat EQ CCBSS_REQ)
+    {
+      break;  /* skip the rest */
+    }
+    if (ctb->calType EQ CT_NI_MOC)
+    {
+      cmhrat_ccbs( CMD_SRC_MAX, CCBS_IND_RecallTimedOut,
+        CCBS_STAT_NotPresent, NULL );
+      break;  /* skip the rest */
+    }
+
+    /*  call clean up */
+    switch( calltype )
+    {
+    case( VOICE_CALL ):
+      ;
+      break;
+
+#ifdef FF_GPF_TCPIP
+    case( TCPIP_CALL ):
+      if( ccShrdPrm.datStat NEQ DS_IDL )
+      {
+        ccShrdPrm.datStat = DS_STOP_REQ;
+        pppShrdPrm.state = PPP_UNDEFINED; /* Otherwise PPP and TCPIP doesn't go down well */
+        cmhPPP_Terminate(DWN);
+        ctb->curCmd = AT_CMD_NONE;
+      }
+      break;
+#endif /* FF_GPF_TCPIP */
+
+#if defined (FAX_AND_DATA) AND defined (DTI)
+    case( TRANS_CALL ):
+      if( ccShrdPrm.datStat NEQ DS_IDL )
+      {
+        ccShrdPrm.datStat = DS_STOP_REQ;
+        cmhTRA_Deactivate ();
+      }
+      break;
+
+    case( NON_TRANS_CALL ):
+      if( ccShrdPrm.datStat NEQ DS_IDL )
+      {
+        ccShrdPrm.datStat = DS_STOP_REQ;
+        cmhL2R_Deactivate ();
+      }
+      break;
+
+#ifdef CO_UDP_IP
+    case( UDPIP_CALL ):
+      if( ccShrdPrm.datStat NEQ DS_IDL )
+      {
+        ccShrdPrm.datStat = DS_STOP_REQ;
+        cmhPPP_Terminate(DWN);
+        ctb->curCmd = AT_CMD_NONE;
+      }
+      break;
+#endif  /* CO_UDP_IP */
+
+#ifdef FF_FAX
+    case( FAX_CALL ):
+      if( ccShrdPrm.datStat NEQ DS_IDL )
+      {
+        ccShrdPrm.datStat = DS_STOP_REQ;
+        cmhT30_Deactivate ();
+      }
+#endif /* FF_FAX */
+#endif /* FAX_AND_DATA */
+
+    }
+    cmhCC_SndDiscRsn( cId );
+    break;
+
+    case( AT_CMD_H ):
+    case( AT_CMD_Z ):
+    case( AT_CMD_CHUP ):
+    case( AT_CMD_ABRT ):
+    case( AT_CMD_CHLD ):
+
+#ifdef FF_FAX
+    case( AT_CMD_FKS ):
+    case( AT_CMD_FDT ):
+    case( AT_CMD_FDR ):
+#endif
+    /*
+    *----------------------------------------------------------------
+    * process event for H, Z and +CHUP command
+    *----------------------------------------------------------------
+      */
+      /*
+      * Bugfix for DISCONNECT_IND in CC U3 with PROGRESS_IND #8
+      */
+      cmdBuf = ctb->curCmd;
+      srcBuf = ctb->curSrc;
+      pCCCmdPrm = &cmhPrm[srcBuf].ccCmdPrm;
+
+      cmhCC_tstAndUnflagCall( cId, &(pCCCmdPrm->mltyCncFlg) );
+      cmhCC_tstAndUnflagCall( cId, &(pCCCmdPrm->mltyDscFlg) );
+
+      if ( cmdBuf EQ AT_CMD_Z           AND
+        pCCCmdPrm -> mltyDscFlg EQ 0 )
+      {
+        cmh_Reset ( srcBuf, TRUE );
+        R_AT( RAT_Z, srcBuf)();
+      }
+
+      cmhCC_PrepareCmdEnd (cId, NULL, NULL);
+
+      if (ctb->curCmd NEQ AT_CMD_CHLD)      /* Do not emmit OK for CHLD since this would
+                                               occour in multiple OKs for a multi-party call */
+      {
+        R_AT( RAT_OK, srcBuf ) ( cmdBuf );
+      }
+
+      /* log result */
+      cmh_logRslt ( srcBuf, RAT_OK, cmdBuf, (SHORT)(cId+1), -1, -1 );
+      break;
+  }
+
+  /* call progress information */
+  for( idx = 0; idx < CMD_SRC_MAX; idx++ )
+  {
+    R_AT(RAT_CPI, idx)( cId+1,
+      CPI_MSG_Rls,
+      (ctb->inBndTns)? CPI_IBT_True: CPI_IBT_False,
+      (ccShrdPrm.TCHasg)? CPI_TCH_True: CPI_TCH_False,
+      ctb->curCs);
+  }
+  if ( ctb NEQ NULL AND ctb->mptyStat NEQ CS_IDL)
+  {
+    for(;callId < MAX_CALL_NR; callId++)
+    {
+      if (psaCC_ctb(callId) NEQ NULL AND
+          psaCC_ctb(callId)->mptyStat EQ CS_ACT )
+      {
+        i++;
+        if (callId NEQ cId)
+        {
+          mptyId = callId;
+        }
+      }
+    }
+    if (i EQ 2)
+    {
+      psaCC_ctb(mptyId)->mptyStat = CS_IDL;
+    }
+  }
+
+  if (rdlPrm.rdlcId NEQ cId)
+  { /* if redialling is active no clean cId entry */
+    /* declare the call table entry as unused */
+    psaCC_FreeCtbNtry (cId);
+  }
+  return;
+}
+
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)    MODULE  : CMH_CCR                  |
+| ROUTINE : cmhCC_CallReleaseIndication                                |
++-------------------------------------------------------------------+
+
+  PURPOSE : call release indication to give out correct call process information
+                 interface so that psa function can report a release ind
+*/
+
+GLOBAL void cmhCC_CPIReleaseMsg ( SHORT cId )
+{
+  T_CC_CALL_TBL *ctb = ccShrdPrm.ctb[cId];
+  UBYTE idx;
+
+  TRACE_FUNCTION ("cmhCC_CPIReleaseMsg()");
+
+  /* call progress information */
+  for( idx = 0; idx < CMD_SRC_MAX; idx++ )
+  {
+    R_AT(RAT_CPI, idx)( cId+1,
+      CPI_MSG_Rls,
+      (ctb->inBndTns)? CPI_IBT_True: CPI_IBT_False,
+      (ccShrdPrm.TCHasg)? CPI_TCH_True: CPI_TCH_False,
+      ctb->curCs);
+  }
+
+  return;
+}
+
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)    MODULE  : CMH_CCR                      |
+|                            ROUTINE : cmhCC_CPIrejectMsg           |
++-------------------------------------------------------------------+
+
+  PURPOSE : interface so that psa function can report a reject ind.
+
+*/
+GLOBAL void cmhCC_CPIrejectMsg ( SHORT cId )
+{
+
+  UBYTE idx;
+  T_CC_CALL_TBL *ctb = ccShrdPrm.ctb[cId];
+
+  TRACE_FUNCTION ("cmhCC_CPIrejectMsg()");
+
+  for( idx = 0; idx < CMD_SRC_MAX; idx++ )
+  {
+    R_AT(RAT_CPI, idx)( cId+1,
+      CPI_MSG_Rjct,
+      (ctb->inBndTns)? CPI_IBT_True: CPI_IBT_False,
+      (ccShrdPrm.TCHasg)? CPI_TCH_True: CPI_TCH_False,
+      ctb->curCs);
+  }
+    /*************************
+  call was not serviced yet
+  ***************************/
+  if( ctb->calOwn EQ OWN_NONE    AND
+      ctb->curCmd EQ AT_CMD_NONE )
+  {
+    psaCC_phbAddNtry ( LMN, cId, CT_MTC, NULL );  /* add call to LMN PB */
+
+#ifdef AT_INTERPRETER
+    io_setRngInd (IO_RING_OFF, CRING_TYP_NotPresent, CRING_TYP_NotPresent ); /* V.24 Ring Indicator Line */
+#endif
+
+    for( idx = 0; idx < CMD_SRC_MAX; idx++ )
+    {
+      R_AT( RAT_CRING_OFF, idx )( cId+1 );
+    }
+    return;
+  }
+
+  return;
+}
+
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)    MODULE  : CMH_CCR                      |
+|                            ROUTINE : cmhCC_CallModified           |
++-------------------------------------------------------------------+
+
+  PURPOSE : call was modified
+
+*/
+
+GLOBAL void cmhCC_CallModified ( SHORT cId )
+{
+#if defined (FAX_AND_DATA)
+  T_CC_CALL_TBL *ctb = ccShrdPrm.ctb[cId];
+  T_CC_CALL_TYPE calltype = cmhCC_getcalltype(cId);
+  UBYTE cmdBuf;               /* buffers current command */
+  UBYTE srcBuf;               /* buffers current command source */
+
+  TRACE_FUNCTION ("cmhCC_CallModified()");
+
+  /* check for command context */
+  switch (ctb->curCmd )
+  {
+    case( AT_CMD_D ):
+    case( AT_CMD_A ):
+    case( AT_CMD_H ):
+      /* process event for D, A and H command */
+      cmdBuf = ctb->curCmd;
+      srcBuf = ctb->curSrc;
+      break;
+
+    default:
+      cmdBuf = AT_CMD_NONE;
+      srcBuf = ctb->calOwn;
+      break;
+  }
+
+  /* determine modifaction status */
+  switch (ctb->rslt)
+  {
+    /* successful modification */
+    case( MNCC_CAUSE_MODIFY_SUCCESS ):
+
+      switch( calltype )
+      {
+        /* modified to speech call */
+        case( VOICE_CALL ):
+          cmhCC_PrepareCmdEnd (cId, NULL, NULL);
+
+          R_AT( RAT_OK, srcBuf ) ( cmdBuf );
+
+          /* log result */
+          cmh_logRslt ( srcBuf, RAT_OK,
+                        cmdBuf, (SHORT)(cId+1), -1, -1 );
+          break;
+
+        /*  modified to transparent or non-transparent or fax data call */
+        case( TRANS_CALL ):
+        case( NON_TRANS_CALL ):
+        case( FAX_CALL ):
+          ccShrdPrm.datStat = DS_ACT_REQ;
+
+          if( cmhRA_Activate  ( srcBuf, cmdBuf, cId ) NEQ AT_EXCT )
+          {
+            ctb->nrmCs = MNCC_CAUSE_CALL_CLEAR;
+            psaCC_ClearCall (cId);
+          }
+          break;
+      }
+      break;
+
+    /* unsuccessful modification */
+    case( MNCC_CAUSE_MS_TIMER ):
+    default: /* network can send any cause */
+
+      TRACE_EVENT_P1 ("MODIFICATION FAILURE: cause=%d",ctb->rslt);
+
+
+      R_AT( RAT_CME, srcBuf ) ( cmdBuf, CME_ERR_NotPresent );
+
+      /* log result */
+      cmh_logRslt ( srcBuf, RAT_CME, cmdBuf, -1, -1,
+                    CME_ERR_NotPresent );
+
+      if( calltype EQ TRANS_CALL     OR
+          calltype EQ NON_TRANS_CALL OR
+          calltype EQ FAX_CALL )
+      {
+        /* back to transparent or non-transparent or fax data call */
+        ccShrdPrm.datStat = DS_REST_REQ;
+
+        if( cmhRA_Activate  ( srcBuf, cmdBuf, cId ) NEQ AT_EXCT )
+        {
+          ctb->nrmCs = MNCC_CAUSE_CALL_CLEAR;
+          psaCC_ClearCall (cId);
+        }
+      }
+      break;
+  }
+#endif /* FAX_AND_DATA */
+}
+
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)    MODULE  : CMH_CCR                      |
+|                            ROUTINE : cmhCC_DTMFsent               |
++-------------------------------------------------------------------+
+
+  PURPOSE : confirmation for sent DTMF
+
+*/
+
+LOCAL void dtmf_sent_after_vts ( SHORT cId )
+{
+  T_CC_CALL_TBL *ctb = ccShrdPrm.ctb[cId];
+  UBYTE current_cmd_source = ctb->dtmfSrc; /* buffers current command source */
+
+  TRACE_FUNCTION ("dtmf_sent_after_vts()");
+
+  ctb->dtmfCmd = AT_CMD_NONE;
+  ctb->dtmfSrc = CMD_SRC_NONE;
+
+  ccShrdPrm.dtmf.cId = NO_ENTRY;
+  ccShrdPrm.dtmf.cnt = 0;
+
+  if ((GET_CAUSE_VALUE(ctb->nrmCs) NEQ NOT_PRESENT_8BIT) AND
+      (ctb->nrmCs NEQ MNCC_CAUSE_DTMF_START_SUCCESS) AND
+      (ctb->nrmCs NEQ MNCC_CAUSE_DTMF_STOP_SUCCESS))
+  {
+    TRACE_EVENT_P1("DTMF response cause value: %d", ctb->nrmCs);
+    R_AT( RAT_CME, current_cmd_source ) ( AT_CMD_VTS, CME_ERR_NotPresent );
+    return;
+  }
+
+  R_AT( RAT_OK, current_cmd_source ) ( AT_CMD_VTS );
+}
+
+LOCAL void dtmf_sent_within_number ( SHORT cId )
+{
+  BOOL  dtmf_sent;    /* result of sending of next DTMF char */
+
+  TRACE_FUNCTION ("dtmf_sent_within_number()");
+
+  if ((ccShrdPrm.dtmf.cId NEQ cId) OR
+      !is_call_ok_for_dtmf(cId))
+  {
+    TRACE_EVENT_P2("Wrong cId for send DTMF. ccShrdPrm.dtmf.cId: %d, cId: %d", ccShrdPrm.dtmf.cId, cId);
+    return;
+  }
+
+  while( ccShrdPrm.dtmf.cnt                      AND
+         ccShrdPrm.dtmf.cur < ccShrdPrm.dtmf.cnt )
+  {
+    dtmf_sent = cmhCC_SendDTMFdig ( AT_CMD_NONE,
+                                    cId,
+                                    ccShrdPrm.dtmf.dig[ccShrdPrm.dtmf.cur],
+                                    DTMF_MOD_AUTO );
+    ccShrdPrm.dtmf.cur++;
+    if( dtmf_sent )
+    {
+      return;
+    }
+  }
+
+  TRACE_EVENT_P1("End of sending DTMF tones: %d", ccShrdPrm.dtmf.dig[ccShrdPrm.dtmf.cur]);
+  ccShrdPrm.dtmf.cnt = ccShrdPrm.dtmf.cur = 0;
+  ccShrdPrm.dtmf.cId = NO_ENTRY;
+}
+
+GLOBAL void cmhCC_DTMFsent ( SHORT cId )
+{
+  T_CC_CALL_TBL *ctb = ccShrdPrm.ctb[cId];
+
+  TRACE_FUNCTION ("cmhCC_DTMFsent()");
+
+  switch( ctb->dtmfCmd )
+  {
+    case( AT_CMD_VTS ):
+      dtmf_sent_after_vts(cId);
+      return;
+
+    case( AT_CMD_NONE ):
+      dtmf_sent_within_number(cId);
+      return;
+
+    default:
+      TRACE_EVENT_P1("Unexpected DTMF command value: %d", ctb->dtmfCmd);
+      break;
+  }
+}
+
+
+/*
+    This will be called when the call was disconnected while sending DTMF tones
+
+*/
+GLOBAL void cmhCC_DTMFstopped ( SHORT cId )
+{
+  T_CC_CALL_TBL *ctb = ccShrdPrm.ctb[cId];
+
+  TRACE_FUNCTION ("cmhCC_DTMFstopped()");
+
+  switch( ctb->dtmfCmd )
+  {
+  case( AT_CMD_VTS ):
+    TRACE_EVENT ("DTMF stopped within VTS");
+    R_AT( RAT_CME, ctb->dtmfSrc )
+            ( AT_CMD_VTS, CME_ERR_Unknown );
+    return;
+
+  case( AT_CMD_NONE ):
+    TRACE_EVENT ("DTMF stopped within NONE");
+
+    return;
+
+  default:
+    TRACE_EVENT_P1("Unexpected DTMF command value: %d", ctb->dtmfCmd);
+    break;
+  }
+}
+
+
+#if 0 // HM 11-May-2005: Dead code
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)    MODULE  : CMH_CCR                      |
+|                            ROUTINE : cmhCC_DisconnectCall         |
++-------------------------------------------------------------------+
+
+  PURPOSE : request to disconnect the call (in-band tones available)
+
+*/
+
+GLOBAL void cmhCC_DisconnectCall ( SHORT cId )
+{
+  T_CC_CALL_TBL *ctb = ccShrdPrm.ctb[cId];
+  T_CC_CMD_PRM  *pCCCmdPrm;   /* points to CC command parameters */
+  UBYTE cmdBuf;               /* buffers current command */
+  UBYTE srcBuf;               /* buffers current command source */
+
+  TRACE_FUNCTION ("cmhCC_DisconnectCall()");
+
+  /* check for command context */
+  switch (ctb->curCmd)
+  {
+    case( AT_CMD_NONE ):
+    case( AT_CMD_D ):
+    case( AT_CMD_A ):
+     /*
+      *----------------------------------------------------------------
+      * process event for D, A and no command
+      *----------------------------------------------------------------
+      */
+      /* for data calls proceed with call completion */
+      if( cmhCC_getcalltype(cId) NEQ VOICE_CALL )
+      {
+        psaCC_ClearCall (cId);
+      }
+      break;
+
+    case( AT_CMD_H ):
+    case( AT_CMD_Z ):
+    case( AT_CMD_CHUP ):
+
+     /*
+      *----------------------------------------------------------------
+      * process event for H, Z and +CHUP command
+      *----------------------------------------------------------------
+      */
+      cmdBuf = ctb->curCmd;
+      srcBuf = ctb->curSrc;
+
+      psaCC_ClearCall (cId);
+
+      cmhCC_PrepareCmdEnd (cId, NULL, NULL);
+
+      pCCCmdPrm = &cmhPrm[srcBuf].ccCmdPrm;
+
+      if(cmdBuf EQ AT_CMD_Z           AND
+         pCCCmdPrm -> mltyDscFlg EQ 0 )
+      {
+        cmh_Reset ( srcBuf, TRUE );
+        R_AT( RAT_Z, srcBuf)();
+      }
+
+      R_AT( RAT_OK, srcBuf ) ( cmdBuf );
+
+      /* log result */
+      cmh_logRslt ( srcBuf, RAT_OK,
+                    cmdBuf, (SHORT)(cId+1), -1, -1 );
+      break;
+  }
+
+  return;
+}
+#endif /* #if 0 */
+
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)    MODULE  : CMH_CCR                      |
+|                            ROUTINE : cmhCC_IncomingCall           |
++-------------------------------------------------------------------+
+
+  PURPOSE : indication of a mobile terminated call
+
+*/
+
+GLOBAL void cmhCC_IncomingCall ( SHORT cId )
+{
+  T_CC_CALL_TBL *ctb = ccShrdPrm.ctb[cId];
+  SHORT idx;                            /* holds index  counter */
+  T_ACI_CRING_MOD mode;                 /* holds mode of call */
+  T_ACI_CRING_TYP type1, type2;         /* holds types of bearer services */
+  CHAR numBuf[MAXIMUM(MAX_CC_CALLING_NUMBER, MAX_CC_REDIR_NUMBER)+1];
+                                        /* buffers calling number + '\0' */
+  CHAR subBuf[SUB_LENGTH+1];            /* buffers subaddress 'subaddress\0' */
+  T_ACI_TOA toaBuf;                     /* buffers type of address */
+  T_ACI_TOS tosBuf;                     /* buffers type of subaddress */
+  USHORT listcounter;
+  T_ACI_LIST *msg2send;
+
+  TRACE_FUNCTION ("cmhCC_IncomingCall()");
+
+/*
+ *-------------------------------------------------------------------
+ * ring for call, if no call is in use
+ *-------------------------------------------------------------------
+ */
+  if( ! psaCC_ctbCallInUse() )
+  {
+
+    switch (ctb->rptInd) /* determine call mode */
+    {
+      case( RI_NOT_PRES ):
+      case( RI_SEQUENTIAL ):
+        mode = CRING_MOD_Direct;
+        break;
+      case( RI_CIRCULAR ):
+        mode = CRING_MOD_Alternate;
+        break;
+
+      default:
+        TRACE_EVENT("UNEXP REPEAT INDICATOR IN CTB");
+        mode = CRING_MOD_NotPresent;
+        break;
+    }
+
+    /* determine 1st service */
+    type1 = cmhCC_GetCallType_from_bearer( &ctb->BC[0] );
+
+    /* determine 2nd service */
+    type2 = cmhCC_GetCallType_from_bearer( &ctb->BC[1] );
+
+#ifdef FF_ATI
+    io_setRngInd (IO_RING_ON, type1, type2); /* V.24 Ring Indicator Line */
+#endif
+
+    for( idx = 0; idx < CMD_SRC_MAX; idx++ )
+    {
+      if (ctb->prgDesc EQ PROG_NOT_PRES)
+      {
+        R_AT( RAT_CPI, idx )
+          ( cId+1,
+            CPI_MSG_Setup,
+            (ctb->inBndTns)? CPI_IBT_True: CPI_IBT_False,
+            (ccShrdPrm.TCHasg)? CPI_TCH_True: CPI_TCH_False,
+            ctb->curCs );
+      }
+      R_AT( RAT_CRING, idx )( mode, type1, type2 );
+
+      /* calling line presentation, if no call is in use */
+
+      /* check of presentation indicator removed, due to the fact that
+       * other mobiles show the same behaviour.
+      if( ctb->clgPty.present NEQ PRES_NUMB_NOT_AVAIL ){} */
+
+      R_AT( RAT_CLIP, idx )
+        ( CLIP_STAT_NotPresent,
+          psaCC_ctbClrAdr2Num( cId, numBuf, sizeof (numBuf) ),
+          cmhCC_ctbGetClrNumTyp( cId, &toaBuf ),
+          ctb->clgPty.present,
+          psaCC_ctbClrAdr2Sub( cId, subBuf ),
+          cmhCC_ctbGetClrSubTyp( cId, &tosBuf ),
+          psaCC_ctbGetAlpha( cId ) );
+
+      R_AT ( RAT_CDIP, idx )
+           (psaCC_ctbCldAdr2Num( cId, numBuf, sizeof (numBuf) ),
+            cmhCC_ctbGetCldNumTyp( cId, &toaBuf ),
+          	psaCC_ctbCldAdr2Sub( cId, subBuf ),
+          	cmhCC_ctbGetCldSubTyp( cId, &tosBuf ));
+      
+    } /* for */
+
+    if (ctb->CDStat EQ CD_Notified)
+    {
+      send_CSSX_notification(cId,
+          CSSX_CODE_DeflectedCall,
+          ACI_NumParmNotPresent,
+          psaCC_ctbRdrAdr2Num( cId, numBuf, sizeof (numBuf) ),
+          cmhCC_ctbGetRdrNumTyp( cId, &toaBuf ),
+          psaCC_ctbRdrAdr2Sub( cId, subBuf ),
+          cmhCC_ctbGetRdrSubTyp( cId, &tosBuf));
+    }
+
+    if (ctb->CDStat EQ CD_Notified)
+    {
+      psaCC_FreeRdrPty (cId);
+      ctb->CDStat = NO_VLD_CD;
+    }
+    /* check for TTY service */
+    cmhCC_TTY_Control ( cId, TTY_START );
+
+    /* Find out if there is any MNCC_FACILITY_IND stored */
+    listcounter  = 0;
+    if ((listcounter = get_list_count(ccShrdPrm.facility_list)) > 0)
+    {
+      for (;listcounter > 0 ; listcounter --)
+      {
+        msg2send = remove_first_element(ccShrdPrm.facility_list);
+
+        /* Send  MNCC_FACILITY_IND */
+        psa_mncc_facility_ind((T_MNCC_FACILITY_IND *)msg2send);
+      }
+    }
+
+  } /* endif */
+
+
+/*
+ *-------------------------------------------------------------------
+ * call waiting indication, if a call is in use
+ *-------------------------------------------------------------------
+ */
+  else
+  {
+    /* check of presentation indicator removed, due to the fact that
+       other mobiles show the same behaviour.
+    if( ctb->clgPty.present NEQ PRES_NUMB_NOT_AVAIL ) {} */
+
+    if (ctb->CDStat EQ CD_Notified)
+    {
+      send_CSSX_notification( cId,
+                              CSSX_CODE_DeflectedCall,
+                              ACI_NumParmNotPresent,
+                              psaCC_ctbRdrAdr2Num( cId, numBuf, sizeof (numBuf) ),
+                              cmhCC_ctbGetRdrNumTyp( cId, &toaBuf ),
+                              psaCC_ctbRdrAdr2Sub( cId, subBuf ),
+                              cmhCC_ctbGetRdrSubTyp( cId, &tosBuf ));
+    }
+
+    for( idx = 0; idx < CMD_SRC_MAX; idx++ )
+    {
+      if (ctb->prgDesc EQ PROG_NOT_PRES)
+      {
+        R_AT( RAT_CPI, idx )
+          ( cId+1,
+            CPI_MSG_Setup,
+            (ctb->inBndTns)? CPI_IBT_True: CPI_IBT_False,
+            (ccShrdPrm.TCHasg)? CPI_TCH_True: CPI_TCH_False,
+            ctb->curCs );
+      }
+
+      R_AT( RAT_CCWA, idx )
+        ( NULL,
+          psaCC_ctbClrAdr2Num( cId, numBuf, sizeof (numBuf) ),
+          cmhCC_ctbGetClrNumTyp( cId, &toaBuf ),
+          ctb->clgPty.present,
+          cmhCC_GetCallClass( cId ),
+          psaCC_ctbGetAlpha( cId ) );
+    }
+    if (ctb->CDStat EQ CD_Notified)
+    {
+      psaCC_FreeRdrPty (cId);
+      ctb->CDStat = NO_VLD_CD;
+    }
+  }
+}
+
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)    MODULE  : CMH_CCR                      |
+|                            ROUTINE : psaCC_Synchronized           |
++-------------------------------------------------------------------+
+
+  PURPOSE : channel mode has changed or
+            call reestablishment event received.
+            If a channel mode change is indicated cId needs not
+            to be valid.
+
+*/
+
+GLOBAL void cmhCC_Synchronized ( SHORT cId ) 
+{
+  SHORT act_cId;      /* holds call identifier */
+  UBYTE idx;          /* holds index */
+#if defined (FAX_AND_DATA) AND defined (DTI)
+  T_CC_CALL_TYPE calltype;
+#endif    /* of #ifdef FAX_AND_DATA */
+
+  TRACE_FUNCTION ("cmhCC_Synchronized()");
+
+  /* process event */
+  switch( ccShrdPrm.syncCs )
+  {
+    case( MNCC_CAUSE_CHANNEL_SYNC ):   /* change of TCH state */
+
+      if( ccShrdPrm.TCHasg EQ TRUE )
+      {
+        /* search for an active call */
+        if((act_cId = psaCC_ctbFindCall( NO_VLD_OWN, CS_ACT, NO_VLD_CT ))
+            NEQ NO_ENTRY )
+        {
+#if defined (FAX_AND_DATA) AND defined (DTI)
+          calltype = cmhCC_getcalltype(act_cId);
+
+          switch( calltype )
+          {
+#ifdef FF_FAX
+          case( FAX_CALL ):
+              switch( ccShrdPrm.datStat )
+              {
+                case( DS_ACT ):
+                case( DS_TCH_MDF ):
+                  ccShrdPrm.datStat = DS_TCH_MDF;
+                  /*
+                   * use entity owner instead of current source, because
+                   * command is out of scope for CC
+                   */
+                  if( cmhRA_Modify ( raEntStat.entOwn, act_cId ) NEQ AT_EXCT )
+                  {
+                    ccShrdPrm.datStat = DS_IDL;
+                    cmhT30_Deactivate();
+                    psaCC_ctb(act_cId)->nrmCs = MNCC_CAUSE_CALL_CLEAR;
+                    psaCC_ClearCall (act_cId);
+                  }
+                  break;
+
+                case( DS_IDL ):
+                  ccShrdPrm.datStat = DS_ACT_REQ;
+                  if( cmhRA_Activate  ( psaCC_ctb(act_cId)->curSrc,
+                                        psaCC_ctb(act_cId)->curCmd,
+                                        act_cId )
+                      NEQ AT_EXCT )
+                  {
+                    ccShrdPrm.datStat = DS_IDL;
+                    psaCC_ctb(act_cId)->nrmCs = MNCC_CAUSE_CALL_CLEAR;
+                    psaCC_ClearCall (act_cId);
+                  }
+            }
+            break;
+#endif /* FF_FAX */  
+
+            case( TRANS_CALL ):    /* activate RA */
+            case( NON_TRANS_CALL ):    /* activate RA */
+              switch( ccShrdPrm.datStat )
+              {
+                case( DS_IDL ):
+                  ccShrdPrm.datStat = DS_ACT_REQ;
+                  if( cmhRA_Activate  ( psaCC_ctb(act_cId)->curSrc,
+                                        psaCC_ctb(act_cId)->curCmd,
+                                        act_cId )
+                      NEQ AT_EXCT )
+                  {
+                    ccShrdPrm.datStat = DS_IDL;
+                    psaCC_ctb(act_cId)->nrmCs = MNCC_CAUSE_CALL_CLEAR;
+                    psaCC_ClearCall (act_cId);
+                  }
+                  break;
+
+                default:
+                  TRACE_EVENT("modify data call ignored");
+                  break;
+            }
+            break;
+
+            case( UNSUP_DATA_CALL  ):
+              TRACE_EVENT("UNSUPPORTED DATA CALL -> DISC CALL");
+              psaCC_ctb(act_cId)->nrmCs = MNCC_CAUSE_CALL_CLEAR;
+              psaCC_ClearCall (act_cId);
+              break;
+          }
+#endif /* FAX_AND_DATA */
+        }
+      }
+
+      /* Information about Traffic Channel Assignment should be sent
+      for all existing act_cIds */
+      for( act_cId = 0; act_cId < MAX_CALL_NR; act_cId++ )
+      {
+        if (ccShrdPrm.ctb[act_cId] NEQ NULL)
+        {
+          for( idx = 0; idx < CMD_SRC_MAX; idx++ )
+          {
+            R_AT( RAT_CPI, idx )
+              ( act_cId+1,
+                CPI_MSG_Sync,
+                (psaCC_ctb(act_cId)->inBndTns)? CPI_IBT_True: CPI_IBT_False,
+                (ccShrdPrm.TCHasg)? CPI_TCH_True: CPI_TCH_False,
+                psaCC_ctb(act_cId)->curCs );
+          }
+        }
+      }
+      break;
+
+    case( MNCC_CAUSE_REEST_STARTED ):                /* call reestablishment */
+    case( MNCC_CAUSE_REEST_FINISHED ):
+      TRACE_EVENT_P1("SYNC -> CALL REESTABLISHMENT %s", 
+        (ccShrdPrm.syncCs  EQ MNCC_CAUSE_REEST_STARTED ? "STARTED" : "FINISHED"));
+      if (psaCC_ctbIsValid (cId))
+      {
+      /* Send %CPI notification for call reestablishment */
+      for( idx = 0; idx < CMD_SRC_MAX; idx++ )
+      {
+        R_AT( RAT_CPI, idx )
+          ( cId+1,
+            CPI_MSG_Sync,
+              (psaCC_ctb(cId)->inBndTns)? CPI_IBT_True: CPI_IBT_False,
+            (ccShrdPrm.TCHasg)? CPI_TCH_True: CPI_TCH_False, 
+              psaCC_ctb(cId)->curCs );
+        }
+      }
+      else
+      {
+        TRACE_ERROR ("No call table entry");
+      }
+      break;
+  }
+}
+
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)    MODULE  : CMH_CCR                      |
+|                            ROUTINE : psaCC_CallHeld               |
++-------------------------------------------------------------------+
+
+  PURPOSE : call hold result
+
+*/
+
+GLOBAL void cmhCC_CallHeld ( SHORT cId )
+{
+  T_CC_CALL_TBL *ctb = ccShrdPrm.ctb[cId];
+  T_CC_CMD_PRM * pCCCmdPrm;   /* points to CC command parameters */
+  UBYTE cmdBuf;               /* buffers current command */
+  UBYTE srcBuf;               /* buffers current command source */
+  SHORT addId;                /* holds additional call id */
+  UBYTE  idx;
+
+  TRACE_FUNCTION ("cmhCC_CallHeld()");
+
+  /* check for command context */
+  switch (ctb->curCmd )
+  {
+    case( AT_CMD_D    ):
+    case( AT_CMD_A    ):
+    case( AT_CMD_CHLD ):
+      break;
+
+    default:
+      TRACE_EVENT_P1("Error: wrong command context: %d", ctb->curCmd);
+      return;  /* wrong command context */
+  }
+
+  cmhCC_PrepareCmdEnd (cId, &cmdBuf, &srcBuf);
+  pCCCmdPrm = &cmhPrm[srcBuf].ccCmdPrm;
+
+  /* check result of hold request */
+  TRACE_EVENT_P1("Hold CNF cause value: %04X", ctb->rslt);
+  switch( ctb->rslt )
+  {
+    case( MNCC_CAUSE_HOLD_SUCCESS ):
+    case( MNCC_CAUSE_SUCCESS ):
+    case( MNCC_CAUSE_NO_MS_CAUSE ):
+
+      /* Held information displayed if call is on hold */
+      for( idx = 0; idx < CMD_SRC_MAX; idx++ )
+      {
+        R_AT( RAT_CPI, idx )
+          ( cId+1,
+            CPI_MSG_Hld,
+            (ctb->inBndTns)? CPI_IBT_True: CPI_IBT_False,
+            (ccShrdPrm.TCHasg)? CPI_TCH_True: CPI_TCH_False,
+             ctb->rslt);
+      }
+
+      if( cmhCC_tstAndUnflagCall( cId, &(pCCCmdPrm -> mltyCncFlg)))
+      {
+        if((pCCCmdPrm -> CHLDmode EQ CHLD_MOD_HldActExc OR
+            pCCCmdPrm -> CHLDmode EQ CHLD_MOD_HldActAndAcpt OR
+            pCCCmdPrm -> CHLDmode EQ CHLD_MOD_HldActDial) AND
+            pCCCmdPrm -> mltyCncFlg )
+        {
+          process_CHLDaddInfo( srcBuf, CALL_HELD );
+        }
+
+        if( pCCCmdPrm -> mltyCncFlg EQ 0 AND
+            pCCCmdPrm -> mltyDscFlg EQ 0     )  /* if last call */
+        {
+#ifdef SIM_TOOLKIT
+          if (ctb->SATinv )
+          {
+            cmh_logRslt ( srcBuf, RAT_OK,
+                          cmdBuf, (SHORT)(cId+1), -1, -1 );
+
+            cmhSAT_StartPendingCall( );
+          }
+          else
+#endif /* SIM_TOOLKIT */
+          {
+            R_AT( RAT_OK, srcBuf ) ( cmdBuf );
+
+            /* log result */
+            cmh_logRslt ( srcBuf, RAT_OK,
+                          cmdBuf, (SHORT)(cId+1), -1, -1 );
+          }
+        }
+      }
+      break;
+
+    default: /* no positive result, i.e. negative result of Hold operation */
+
+      if( cmhCC_tstAndUnflagCall( cId, &(pCCCmdPrm -> mltyCncFlg)))
+      {
+
+#ifdef SIM_TOOLKIT
+        if (ctb->SATinv)
+        {
+          psaCC_ctb(ccShrdPrm.cIdMPTY)->SATinv = FALSE;
+          /* return network error cause GSM 11.14 / 12.12.3 */
+          cmhSAT_NtwErr( ADD_NO_CAUSE );
+        }
+#endif
+        if( pCCCmdPrm -> CHLDmode EQ CHLD_MOD_HldActDial AND
+            pCCCmdPrm -> mltyCncFlg )
+        {
+          for( addId = 0; !((pCCCmdPrm -> mltyCncFlg >> addId) & 0x01); addId++ )
+            ;
+
+          if( CHLDaddInfo EQ CHLD_ADD_INFO_DIAL_CAL )
+          {
+              CHLDaddInfo = NO_CHLD_ADD_INFO;
+              psaCC_FreeCtbNtry (addId);
+          }
+        }
+
+        pCCCmdPrm -> mltyCncFlg = 0;        /* unflag calls */
+        CHLDaddInfo = NO_CHLD_ADD_INFO;
+
+        R_AT( RAT_CME, srcBuf ) ( cmdBuf, CME_ERR_OpNotAllow );
+
+        /* log result */
+        cmh_logRslt ( srcBuf, RAT_CME,
+                      cmdBuf, -1, -1, CME_ERR_OpNotAllow );
+      }
+      break;
+  }
+}
+
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)    MODULE  : CMH_CCR                      |
+|                            ROUTINE : psaCC_CallRetrieved          |
++-------------------------------------------------------------------+
+
+  PURPOSE : call retrieve result
+
+*/
+
+GLOBAL void cmhCC_CallRetrieved ( SHORT cId )
+{
+  T_CC_CALL_TBL *ctb = ccShrdPrm.ctb[cId];
+  T_CC_CMD_PRM * pCCCmdPrm;   /* points to CC command parameters */
+  UBYTE cmdBuf;               /* buffers current command */
+  UBYTE srcBuf;               /* buffers current command source */
+
+  TRACE_FUNCTION ("cmhCC_CallRetrieved()");
+
+  /* check for command context */
+  if (ctb->curCmd NEQ AT_CMD_CHLD)
+  {
+    return;
+  }
+
+  pCCCmdPrm = &cmhPrm[ctb->curSrc].ccCmdPrm;
+  cmhCC_PrepareCmdEnd (cId, &cmdBuf, &srcBuf);
+
+  /*
+   *  check result of retrieve request
+   */
+  switch (ctb->rslt)
+  {
+    case( MNCC_CAUSE_RETRIEVE_SUCCESS ):
+
+      if( cmhCC_tstAndUnflagCall( cId, &(pCCCmdPrm -> mltyCncFlg)))
+      {
+        if( pCCCmdPrm -> mltyCncFlg EQ 0 AND
+            pCCCmdPrm -> mltyDscFlg EQ 0     )  /* if last call */
+        {
+          R_AT( RAT_OK, srcBuf ) ( cmdBuf );
+
+          /* log result */
+          cmh_logRslt ( srcBuf, RAT_OK,
+                        cmdBuf, (SHORT)(cId+1), -1, -1 );
+        }
+      }
+      break;
+
+    default: /* no positive result of retrieve operation */
+
+      if( cmhCC_tstAndUnflagCall( cId, &(pCCCmdPrm -> mltyCncFlg)))
+      {
+        pCCCmdPrm -> mltyCncFlg = 0;        /* unflag calls */
+
+        R_AT( RAT_CME, srcBuf ) ( cmdBuf, CME_ERR_OpNotAllow );
+
+        /* log result */
+        cmh_logRslt ( srcBuf, RAT_CME,
+                      cmdBuf, -1, -1, CME_ERR_OpNotAllow );
+      }
+      break;
+  }
+}
+
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)    MODULE  : CMH_CCR                      |
+|                            ROUTINE : cmhCC_RA_Activated           |
++-------------------------------------------------------------------+
+
+  PURPOSE : RA entity activated, data path established
+
+*/
+#ifdef DTI
+GLOBAL void cmhCC_RA_Activated ( SHORT cId )
+{
+#ifdef FAX_AND_DATA
+
+  T_CC_CMD_PRM * pCCCmdPrm;   /* points to CC command parameters */
+  UBYTE cmdBuf;               /* buffers current command */
+  UBYTE srcBuf;               /* buffers current command source */
+  T_CC_CALL_TYPE calltype = cmhCC_getcalltype(cId);
+
+  TRACE_FUNCTION ("cmhCC_RA_Activated()");
+
+  srcBuf = psaCC_ctb(cId)->curSrc;
+  cmdBuf = psaCC_ctb(cId)->curCmd;
+  pCCCmdPrm = &cmhPrm[srcBuf].ccCmdPrm;
+
+  switch( ccShrdPrm.datStat )
+  {
+  case( DS_ACT_REQ ):
+  case( DS_REST_REQ ):
+    switch( calltype )
+    {
+    /* transparent data call */
+    case( TRANS_CALL ):
+      psaTRA_Activate( );
+      break;
+
+    /* non-transparent data call */
+    case( NON_TRANS_CALL ):
+    /* a WAP call is a non-transparent data call */
+#ifdef CO_UDP_IP 
+    case( UDPIP_CALL ):
+#endif /* CO_UDP_IP */
+
+#ifdef FF_TCP_IP
+    case( PPP_CALL ):
+#endif /* FF_TCP_IP */
+
+#if defined(FF_GPF_TCPIP)
+    case (TCPIP_CALL):
+#endif /* FF_GPF_TCPIP */
+
+      if( cmhL2R_Activate(srcBuf, cmdBuf, cId) NEQ AT_EXCT )
+      {
+        ccShrdPrm.datStat = DS_DSC_REQ;
+        cmhRA_Deactivate ();
+      }
+      break;
+
+#ifdef FF_FAX
+    case( FAX_CALL ):
+      if( cmhT30_Activate(srcBuf, cmdBuf, cId) NEQ AT_EXCT )
+      {
+        ccShrdPrm.datStat = DS_DSC_REQ;
+        cmhRA_Deactivate ();
+      }
+      break;
+#endif /* FF_FAX */
+
+   /* in case of other types of call */
+    default:
+      ccShrdPrm.datStat = DS_DSC_REQ;
+      cmhRA_Deactivate ();
+      break;
+    }
+    break;
+  }
+#endif    /* of #ifdef FAX_AND_DATA */
+}
+#endif /* DTI */
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)    MODULE  : CMH_CCR                      |
+|                            ROUTINE : cmhCC_RA_Deactivated         |
++-------------------------------------------------------------------+
+
+  PURPOSE : RA entity deactivated, data path disconnected
+
+*/
+#ifdef DTI
+GLOBAL void cmhCC_RA_Deactivated ( SHORT cId )
+{
+#ifdef FAX_AND_DATA
+  T_CC_CALL_TBL *ctb = ccShrdPrm.ctb[cId];
+  T_CC_CALL_TYPE calltype = cmhCC_getcalltype(cId);
+  UBYTE cmdBuf;               /* buffers current command */
+
+  TRACE_FUNCTION ("cmhCC_RA_Deactivated()");
+
+  cmdBuf = ctb->curCmd;
+
+  switch( calltype )
+  {
+    case( TRANS_CALL ):
+     /* transparent data call */
+      switch( ccShrdPrm.datStat )
+      {
+        case( DS_ACT ):
+        case( DS_ACT_REQ ):
+        case( DS_DSC_REQ ):
+        case( DS_TCH_MDF ):
+
+          ccShrdPrm.datStat = DS_IDL;
+          ctb->nrmCs = MNCC_CAUSE_CALL_CLEAR;
+          psaCC_ClearCall (cId);
+#if defined (SIM_TOOLKIT) AND defined (FF_SAT_E)
+              /* check impact for SAT commands */
+              cmhSAT_OpChnCSDDown( cId, TPL_NONE );
+#endif /* SIM TOOLKIT AND FF_SAT_E */
+          break;
+
+        case( DS_MDF_REQ ):
+
+          ccShrdPrm.datStat = DS_IDL;
+          psaCC_ModifyCall(cId);
+          break;
+
+        case( DS_STOP_REQ ):
+
+          ccShrdPrm.datStat = DS_IDL;
+          cmhCC_CallDisconnected(cId);
+          break;
+      }
+      break;
+
+     /* non-transparent data call */
+    case( NON_TRANS_CALL ):
+#ifdef CO_UDP_IP
+    case( UDPIP_CALL ):
+#endif /* CO_UDP_IP */
+
+#ifdef FF_TCP_IP
+    case( PPP_CALL ):
+#endif /* FF_TCP_IP */
+
+#ifdef FF_GPF_TCPIP
+    case (TCPIP_CALL):
+#endif /* FF_GPF_TCPIP */
+
+      switch( ccShrdPrm.datStat )
+      {
+        case( DS_ACT ):
+        case( DS_ACT_REQ ):
+        case( DS_DSC_REQ ):
+        case( DS_REST_REQ ):
+        case( DS_TCH_MDF ):
+
+          ccShrdPrm.datStat        = DS_IDL;
+          ctb->nrmCs        = MNCC_CAUSE_CALL_CLEAR;
+
+#if defined(CO_UDP_IP) OR defined(FF_GPF_TCPIP)
+          /* WAP STACK is down */
+
+          /* The following statements check which configuration is active,
+             because there are three possibilities:
+             1. UDP/IP only - WAP1.x and SAT_E
+             2. TCP/IP only - WAP2.x and higher and App's
+             3. UDP/IP and TCP/IP - WAP2.x and higher and App's and SAT_E 
+          */
+#if defined(FF_GPF_TCPIP) AND !defined(CO_UDP_IP)
+          if(calltype EQ TCPIP_CALL)
+#elif !defined(FF_GPF_TCPIP) AND defined(CO_UDP_IP)
+          if(calltype EQ UDPIP_CALL)
+#elif defined(FF_GPF_TCPIP) AND defined(CO_UDP_IP)
+          if(calltype == UDPIP_CALL OR calltype == TCPIP_CALL)
+#endif
+          {
+#if defined (SIM_TOOLKIT) AND defined (FF_SAT_E)
+            /* check impact for SAT commands */
+            cmhSAT_OpChnCSDDown( cId, UDP );
+#endif /* SIM TOOLKIT AND FF_SAT_E */
+            /* Have CC disconnected before ? */
+            if (ctb->calStat EQ CS_ACT)
+            {
+              psaCC_ClearCall (cId);
+            }
+            else
+            {
+               /* Message to MMI */
+              R_AT( RAT_OK, ctb->calOwn ) ( AT_CMD_NONE, cId+1 );
+
+#ifdef FF_ATI
+              io_setDCD (ctb->calOwn, IO_DCD_OFF); /* V.24 DCD Line */
+#endif
+              /* log result */
+              cmh_logRslt (ctb->calOwn, RAT_OK,
+                        (T_ACI_AT_CMD)cmdBuf, (SHORT)(cId+1), -1, -1 );
+            }
+            break;
+          }
+#endif /* CO_UDP_IP || FF_GPF_TCPIP */
+
+          psaCC_ClearCall (cId);
+#if defined (SIM_TOOLKIT) AND defined (FF_SAT_E) 
+          /* check impact for SAT commands */
+          cmhSAT_OpChnCSDDown( cId, TPL_NONE );
+#endif /* SIM TOOLKIT AND FF_SAT_E */
+          break;
+
+        case( DS_STOP_REQ ):
+
+          ccShrdPrm.datStat = DS_IDL;
+          cmhCC_CallDisconnected(cId);
+#if defined (FF_WAP) || defined (FF_SAT_E)
+          /* WAP STACK is down */
+          ccShrdPrm.wapStat = CC_WAP_STACK_DOWN;
+#endif /* FF_WAP || SAT E */
+          break;
+
+        case( DS_ABO_REQ ):   /* during modification */
+          switch( ctb->rptInd )
+          {
+            case( RI_SEQUENTIAL ):      /* no way back */
+
+              ccShrdPrm.datStat = DS_IDL;
+              ctb->nrmCs = MNCC_CAUSE_CALL_CLEAR;
+              psaCC_ClearCall (cId);
+              break;
+
+            case( RI_CIRCULAR ):
+
+              ccShrdPrm.datStat = DS_IDL;
+              psaCC_ModifyCall(cId);  /* back to former service */
+              break;
+          }
+          break;
+
+        case( DS_MDF_REQ ):
+          ccShrdPrm.datStat = DS_IDL;
+          psaCC_ModifyCall(cId);
+          break;
+      }
+      break;
+
+    /* in case of a fax call */
+    case( FAX_CALL ):
+      switch( ccShrdPrm.datStat )
+      {
+        case( DS_ACT ):
+        case( DS_ACT_REQ ):
+        case( DS_DSC_REQ ):
+        case( DS_REST_REQ ):
+        case( DS_TCH_MDF ):
+          ccShrdPrm.datStat = DS_IDL;
+          ctb->nrmCs = MNCC_CAUSE_CALL_CLEAR;
+          psaCC_ClearCall (cId);
+          break;
+
+        case( DS_STOP_REQ ):
+          ccShrdPrm.datStat = DS_IDL;
+          cmhCC_CallDisconnected(cId);
+          break;
+
+        case( DS_ABO_REQ ):   /* abort during modification */
+          switch (ctb->rptInd)
+          {
+            case( RI_SEQUENTIAL ):      /* no way back */
+
+              ccShrdPrm.datStat = DS_IDL;
+              ctb->nrmCs = MNCC_CAUSE_CALL_CLEAR;
+              psaCC_ClearCall (cId);
+              break;
+
+            case( RI_CIRCULAR ):
+
+              ccShrdPrm.datStat = DS_IDL;
+              psaCC_ModifyCall(cId);  /* back to former service */
+              break;
+          }
+          break;
+
+        case( DS_MDF_REQ ):
+          ccShrdPrm.datStat = DS_IDL;
+          psaCC_ModifyCall(cId);
+          break;
+      }
+      break;
+  }
+#endif    /* of #ifdef FAX_AND_DATA */
+}
+#endif /* DTI */
+
+#ifdef FF_FAX
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)    MODULE  : CMH_CCR                      |
+|                            ROUTINE : cmhCC_RA_Modified            |
++-------------------------------------------------------------------+
+
+  PURPOSE : RA entity modified after CMM
+
+*/
+#ifdef DTI
+GLOBAL void cmhCC_RA_Modified ( SHORT cId )
+{
+#ifdef FAX_AND_DATA
+
+  T_CC_CALL_TYPE calltype = cmhCC_getcalltype(cId);
+
+  TRACE_FUNCTION ("cmhCC_RA_Modified()");
+
+  if( calltype EQ FAX_CALL )
+  {
+   /* only in case of a fax call */
+    if( ccShrdPrm.datStat EQ DS_TCH_MDF )
+    {
+      ccShrdPrm.datStat = DS_ACT;
+
+      if( cmhT30_Modify() NEQ AT_EXCT )
+      {
+        ccShrdPrm.datStat = DS_DSC_REQ;
+        cmhRA_Deactivate ();
+      }
+    }
+  }
+#endif    /* of #ifdef FAX_AND_DATA */
+}
+#endif /* DTI */
+#endif /* FF_FAX */
+
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)    MODULE  : CMH_CCR                      |
+|                            ROUTINE : cmhCC_L2R_or_TRA_Activated   |
++-------------------------------------------------------------------+
+
+  PURPOSE : L2R entity activated, data path established
+
+*/
+#ifdef DTI
+GLOBAL void cmhCC_L2R_or_TRA_Activated ( T_DTI_ENTITY_ID activated_module, SHORT cId )
+{
+#ifdef FAX_AND_DATA
+  T_CC_CALL_TBL *ctb = ccShrdPrm.ctb[cId];
+  T_CC_CMD_PRM * pCCCmdPrm;    /* points to CC command parameters */
+  UBYTE cmdBuf;                /* buffers current command */
+  UBYTE srcBuf;                /* buffers current command source */
+  T_CC_CALL_TYPE calltype = cmhCC_getcalltype(cId);
+
+  TRACE_FUNCTION ("cmhCC_L2R_or_TRA_Activated()");
+
+  if (!psaCC_ctbIsValid (cId))
+  {
+    /*
+     * If for some no good reason we got a L2R_CONNECT_CNF, L2R_CONNECT_IND
+     * or TRA_ACTIVATE_CNF without having a valid entry in the call table,
+     * we do here the same as for the FAX case where those events are also 
+     * unexpected. We send the respective deativation request.
+     */
+    TRACE_ERROR ("Call table entry disappeared");
+    ccShrdPrm.datStat = DS_DSC_REQ;
+    switch( activated_module )
+    {
+      case( DTI_ENTITY_TRA ):
+        psaTRA_Deactivate();
+        break;
+      case( DTI_ENTITY_L2R ):
+        cmhL2R_Deactivate();
+        break;
+      default: /* Unexpected to happen */
+        break;
+    }
+    return;
+  }
+
+  cmdBuf = ctb->curCmd;
+  srcBuf = ctb->curSrc;
+  pCCCmdPrm = &cmhPrm[srcBuf].ccCmdPrm;
+
+  switch( calltype )
+  {
+    case( TRANS_CALL ):
+    case( NON_TRANS_CALL ):
+
+#ifdef CO_UDP_IP
+case( UDPIP_CALL ):
+#endif /* CO_UDP_IP */
+
+#ifdef FF_TCP_IP
+    case( PPP_CALL ):
+#endif
+
+#if defined(FF_GPF_TCPIP)
+    case (TCPIP_CALL):
+#endif /* FF_GPF_TCPIP */
+
+      switch( ccShrdPrm.datStat )
+      {
+        case( DS_ACT_REQ ):
+
+          ccShrdPrm.datStat = DS_ACT;
+          cmhCC_PrepareCmdEnd (cId, NULL, NULL);
+
+          /* reset CMOD to single mode */
+          ccShrdPrm.CMODmode = CMOD_MOD_Single;
+
+          /* check if connect is expected */
+          if( cmhCC_tstAndUnflagCall( cId, &(pCCCmdPrm -> mltyCncFlg)))
+          {
+            if( pCCCmdPrm -> mltyCncFlg EQ 0 )  /* if last call */
+            {
+              R_AT( RAT_CR, srcBuf )
+                (cmhCC_GetSrvType (&ctb->BC[ctb->curBC]));
+
+              R_AT( RAT_ILRR, srcBuf )
+                (cmhCC_GetDataRate (&ctb->BC[ctb->curBC]),
+                 cmhCC_GetFormat (&ctb->BC[ctb->curBC]),
+                 cmhCC_GetParity (&ctb->BC[ctb->curBC]));
+#if defined (CO_UDP_IP) AND defined (FF_GPF_TCPIP)
+              if ( (calltype NEQ UDPIP_CALL) AND (calltype NEQ TCPIP_CALL) )
+#endif
+#if defined (CO_UDP_IP) AND !defined(FF_GPF_TCPIP)
+              if (calltype NEQ UDPIP_CALL)
+#endif
+#if defined (FF_GPF_TCPIP) AND !defined(CO_UDP_IP)
+              if (calltype NEQ TCPIP_CALL)
+#endif
+
+#ifdef FF_TCP_IP
+              if (calltype NEQ PPP_CALL)
+#endif /* FF_TCP_IP */
+              {
+#if defined (SIM_TOOLKIT) AND defined (FF_SAT_E)
+                if (!cmhSAT_OpChnChckCSD( TPL_NONE))
+#endif /* of SIM_TOOLKIT AND FF_SAT_E*/
+                {
+                  R_AT( RAT_CONNECT, srcBuf )
+                    (cmdBuf, cmhCC_GetDataRate(&ctb->BC[ctb->curBC]), cId+1, FALSE);
+                }
+              }
+
+              /* log result */
+              cmh_logRslt ( srcBuf, RAT_CONNECT,
+                            cmdBuf, (SHORT)(cId+1),
+                            cmhCC_GetDataRate(&ctb->BC[ctb->curBC]), -1 );
+
+              switch( activated_module )
+              {
+                case( DTI_ENTITY_TRA ):
+                  if (IS_SRC_BT(srcBuf))
+                  {
+                    T_DTI_ENTITY_ID entity_list[] = {DTI_ENTITY_BLUETOOTH, DTI_ENTITY_TRA};
+                    UBYTE dti_id = dti_cntrl_new_dti(DTI_DTI_ID_NOTPRESENT);
+                    dti_cntrl_est_dpath ( dti_id,
+                                          entity_list,
+                                          2,
+                                          SPLIT,
+                                          TRA_connect_dti_cb);
+                  }
+#if defined (SIM_TOOLKIT) AND defined (FF_SAT_E)
+                  if (cmhSAT_OpChnChckCSD( TPL_NONE))
+                  {
+                    cmhSAT_OpChnSIMCnctReq( DTI_ENTITY_TRA );
+                  }
+#endif /* of SIM_TOOLKIT AND FF_SAT_E */
+                  else
+                  {
+                    T_DTI_ENTITY_ID entity_list[] = {DTI_ENTITY_TRA};
+
+                    dti_cntrl_est_dpath_indirect ( srcBuf,
+                                                   entity_list,
+                                                   1,
+                                                   SPLIT,
+                                                   TRA_connect_dti_cb,
+                                                   DTI_CPBLTY_SER,
+                                                   DTI_CID_NOTPRESENT);
+                  }
+                  break;
+
+                case( DTI_ENTITY_L2R ):
+#ifdef CO_UDP_IP
+                  if ( calltype EQ UDPIP_CALL )
+                  {
+                    UBYTE dti_id;
+                    T_DTI_ENTITY_ID entity_list[] = {DTI_ENTITY_IP, DTI_ENTITY_PPPC, DTI_ENTITY_L2R};
+#if defined (SIM_TOOLKIT) AND defined (FF_SAT_E) 
+                    if ( satShrdPrm.opchStat EQ OPCH_EST_REQ )
+                      dti_id = simShrdPrm.sat_class_e_dti_id;
+                    else
+#endif /* SIM_TOOLKIT AND FF_SAT_E */
+                      dti_id = wap_dti_id;
+
+                    dti_cntrl_est_dpath ( dti_id,
+                                          entity_list,
+                                          3,
+                                          APPEND,
+                                          IP_UDP_connect_dti_cb);
+                    break;
+                  }
+#endif /* CO_UDP_IP */
+
+#if defined (FF_TCP_IP) AND defined (DTI)
+                  if ( calltype EQ PPP_CALL )
+                  {
+                    T_DTI_ENTITY_ID entity_list[] = {DTI_ENTITY_PPPC, DTI_ENTITY_L2R};
+                    dti_cntrl_est_dpath_indirect ( srcBuf,
+                                                   entity_list,
+                                                   2,
+                                                   SPLIT,
+                                                   L2R_connect_dti_cb,
+                                                   DTI_CPBLTY_PKT,
+                                                   DTI_CID_NOTPRESENT);
+                    break;
+                  }
+#endif /* FF_TCP_IP */
+
+#ifdef FF_GPF_TCPIP
+                  if ( calltype EQ TCPIP_CALL )
+                  {
+                    UBYTE dti_id;
+                    T_DTI_ENTITY_ID entity_list[] = {DTI_ENTITY_TCPIP, DTI_ENTITY_PPPC, DTI_ENTITY_L2R};
+                    /* create a WAP DTI if not present */
+                    if (wap_dti_id EQ DTI_DTI_ID_NOTPRESENT)
+                    {
+                       wap_dti_id = dti_cntrl_new_dti (DTI_DTI_ID_NOTPRESENT);
+                       TRACE_EVENT_P1("tcpip_wap_dti_id = %d", wap_dti_id);
+                    }
+                    dti_id = wap_dti_id;
+                    dti_cntrl_est_dpath ( dti_id,
+                                          entity_list,
+                                          3,
+                                          SPLIT,
+                                          TCPIP_connect_dti_cb);
+                    break;
+                  }
+#endif /* FF_GPF_TCPIP */
+
+#if defined (SIM_TOOLKIT) AND defined (FF_SAT_E)
+                  if (cmhSAT_OpChnChckCSD( TPL_NONE))
+                  {
+                    cmhSAT_OpChnSIMCnctReq( DTI_ENTITY_L2R );
+                  }
+#endif /* of SIM_TOOLKIT AND FF_SAT_E */
+
+#ifdef DTI
+                  if (IS_SRC_BT(srcBuf))
+                  {
+                    T_DTI_ENTITY_ID entity_list[] = {DTI_ENTITY_BLUETOOTH, DTI_ENTITY_L2R};
+                    UBYTE dti_id = dti_cntrl_new_dti(DTI_DTI_ID_NOTPRESENT);
+                    dti_cntrl_est_dpath ( dti_id,
+                                          entity_list,
+                                          2,
+                                          SPLIT,
+                                          L2R_connect_dti_cb);
+                  }
+                  else
+                  {
+                    T_DTI_ENTITY_ID entity_list[] = {DTI_ENTITY_L2R};
+                    dti_cntrl_est_dpath_indirect ( srcBuf,
+                                                   entity_list,
+                                                   1,
+                                                   SPLIT,
+                                                   L2R_connect_dti_cb,
+                                                   DTI_CPBLTY_SER,
+                                                   DTI_CID_NOTPRESENT);
+                  }
+#endif /* DTI */
+                  break;
+              } /* switch( activated_module ) */
+            } /* if( pCCCmdPrm -> mltyCncFlg EQ 0 ) */
+          } /* if( cmhCC_tstAndUnflagCall( cId, &(pCCCmdPrm -> mltyCncFlg))) */
+          break;
+
+        case( DS_REST_REQ ):
+          ccShrdPrm.datStat = DS_ACT;
+          break;
+        }
+        break;
+    /* in case of a fax call */
+    case( FAX_CALL  ):
+
+      TRACE_EVENT( "UNEXP BEARER SERV FAX" );
+      ccShrdPrm.datStat = DS_DSC_REQ;
+      switch( activated_module )
+      {
+      case( DTI_ENTITY_TRA ):
+        psaTRA_Deactivate();
+        break;
+      case( DTI_ENTITY_L2R ):
+        cmhL2R_Deactivate();
+        break;
+      }
+      break;
+    }
+#endif    /* of #ifdef FAX_AND_DATA */
+}
+#endif /* UART */
+
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)    MODULE  : CMH_CCR                      |
+|                            ROUTINE : cmhCC_L2R_or_TRA_Deactivated |
++-------------------------------------------------------------------+
+
+  PURPOSE : L2R entity deactivated, data path disconnected
+
+*/
+#ifdef UART
+GLOBAL void cmhCC_L2R_or_TRA_Deactivated ( SHORT cId )
+{
+#ifdef FAX_AND_DATA
+
+  UBYTE srcBuf; 
+#ifdef DTI
+  T_DTI_CNTRL dti_cntrl_info;
+#endif /* DTI */
+  T_CC_CALL_TYPE calltype = cmhCC_getcalltype(cId);
+
+  /* if there is a redirection get proper source */
+#ifdef DTI
+  if (dti_cntrl_get_info_from_dti_id(raShrdPrm.dti_id, &dti_cntrl_info))
+  {
+    srcBuf = dti_cntrl_info.src_id;
+  }
+  else /* if it is not a valid dti_id - take stored src_id */
+  {
+    TRACE_EVENT_P2("No valid dti_id:%d taking owner:%d",
+                   raShrdPrm.dti_id,
+                   raShrdPrm.owner);
+#endif /* DTI */
+    srcBuf = raShrdPrm.owner;
+#ifdef DTI
+  }
+  /* reset ra dti_id storage */
+  raShrdPrm.dti_id = NOT_PRESENT_8BIT;
+#endif /* DTI */
+
+  TRACE_FUNCTION ("cmhCC_L2R_or_TRA_Deactivated()");
+
+  io_setDCD (srcBuf, IO_DCD_OFF);
+
+  switch( calltype )
+  {
+    case( TRANS_CALL ):
+    case( NON_TRANS_CALL ):
+
+#ifdef CO_UDP_IP
+    case( UDPIP_CALL ):
+#endif /* CO_UDP_IP */
+
+#ifdef FF_TCP_IP
+    case( PPP_CALL ):
+#endif
+
+#if defined(FF_GPF_TCPIP)
+    case (TCPIP_CALL):
+#endif /* FF_GPF_TCPIP */
+
+      switch( ccShrdPrm.datStat )
+      {
+        case( DS_ACT ):
+        case( DS_ACT_REQ ):
+        case( DS_DSC_REQ ):
+        case( DS_MDF_REQ ):
+        case( DS_STOP_REQ ):
+
+          cmhRA_Deactivate ();
+          break;
+      }
+      break;
+
+    case( FAX_CALL ):
+      TRACE_EVENT( "UNEXP BEARER SERV FAX" );
+      ccShrdPrm.datStat = DS_DSC_REQ;
+      cmhRA_Deactivate();
+      break;
+  }
+#endif    /* of #ifdef FAX_AND_DATA */
+}
+#endif /* UART */
+
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)    MODULE  : CMH_CCR                      |
+|                            ROUTINE : cmhCC_L2R_Failed             |
++-------------------------------------------------------------------+
+
+  PURPOSE : L2R entity failure
+
+*/
+
+GLOBAL void cmhCC_L2R_Failed ( void )
+{
+#ifdef FAX_AND_DATA
+  SHORT          cId = raShrdPrm.cId;  /* holds call identifier */
+  T_CC_CALL_TYPE calltype;
+
+  TRACE_FUNCTION ("cmhCC_L2R_Failed()");
+
+  calltype = cmhCC_getcalltype(cId);
+
+  switch( calltype )
+  {
+    case( NON_TRANS_CALL ):
+      switch( ccShrdPrm.datStat )
+      {
+        case( DS_ACT_REQ ):
+          if( psaCC_ctbIsValid (cId) AND
+              psaCC_ctb(cId)->calStat EQ CS_MDF_REQ )
+          {
+            ccShrdPrm.datStat = DS_ABO_REQ;
+          }
+          /*lint -fallthrough*/
+        case( DS_ACT ):
+        case( DS_REST_REQ ):
+            cmhL2R_Deactivate ();
+          break;
+      }
+      break;
+
+
+    case( FAX_CALL  ):
+
+      TRACE_EVENT( "UNEXP BEARER SERV FAX" );
+      ccShrdPrm.datStat = DS_DSC_REQ;
+      cmhL2R_Deactivate();
+      break;
+    }
+
+#endif    /* of #ifdef FAX_AND_DATA */
+}
+
+#ifdef FF_FAX
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)    MODULE  : CMH_CCR                      |
+|                            ROUTINE : cmhCC_T30_Activated          |
++-------------------------------------------------------------------+
+
+  PURPOSE : T30 entity activated, data path established
+
+*/
+
+GLOBAL void cmhCC_T30_Activated ( void )
+{
+#if defined (FAX_AND_DATA) AND defined (DTI)
+
+  T_CC_CMD_PRM * pCCCmdPrm;    /* points to CC command parameters */
+  UBYTE cmdBuf;                /* buffers current command */
+  SHORT cId = t30ShrdPrm.cId;  /* holds call identifier */
+  T_CC_CALL_TYPE calltype = cmhCC_getcalltype(cId);
+
+  TRACE_FUNCTION ("cmhCC_T30_Activated()");
+
+  pCCCmdPrm = &cmhPrm[psaCC_ctb(cId)->calOwn].ccCmdPrm;
+  cmdBuf = psaCC_ctb(cId)->curCmd;
+
+  switch( calltype )
+  {
+    case( FAX_CALL ):
+      switch( ccShrdPrm.datStat )
+      {
+        case( DS_ACT_REQ ):
+
+          ccShrdPrm.datStat = DS_ACT;
+
+          /* reset CMOD to single mode */
+          ccShrdPrm.CMODmode = CMOD_MOD_Single;
+
+          if( psaCC_ctb(cId)->calType EQ CT_MTC )
+          {
+            cmhT30_SendCaps( psaCC_ctb(cId)->curSrc, FRT_DIS );
+          }
+          break;
+      }
+      break;
+
+   /* in case of a asynchronous call */
+    case( TRANS_CALL ):
+    case( NON_TRANS_CALL ):
+      TRACE_EVENT( "UNEXP BEARER SERV ASYNC" );
+      ccShrdPrm.datStat = DS_DSC_REQ;
+      cmhT30_Deactivate();
+      break;
+    }
+
+#endif    /* of #ifdef FAX_AND_DATA */
+}
+
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)    MODULE  : CMH_CCR                      |
+|                            ROUTINE : cmhCC_T30_Deactivated        |
++-------------------------------------------------------------------+
+
+  PURPOSE : T30 entity deactivated, data path disconnected
+
+*/
+
+GLOBAL void cmhCC_T30_Deactivated ( void )
+{
+#ifdef FAX_AND_DATA
+
+  SHORT cId = t30ShrdPrm.cId;  /* holds call identifier */
+  T_CC_CALL_TYPE calltype = cmhCC_getcalltype(cId);
+
+  TRACE_FUNCTION ("cmhCC_T30_Deactivated()");
+
+  switch( calltype )
+  {
+    case( FAX_CALL ):
+      switch( ccShrdPrm.datStat )
+      {
+        case( DS_ACT ):
+        case( DS_ACT_REQ ):
+        case( DS_DSC_REQ ):
+        case( DS_MDF_REQ ):
+        case( DS_STOP_REQ ):
+        case( DS_TCH_MDF ):
+
+          cmhRA_Deactivate ();
+          break;
+      }
+      break;
+
+    /* in case of a asynchronous data call */
+    case( TRANS_CALL ):
+    case( NON_TRANS_CALL ):
+
+      TRACE_EVENT( "UNEXP BEARER SERV ASYNC" );
+      ccShrdPrm.datStat = DS_DSC_REQ;
+      cmhRA_Deactivate();
+      break;
+  }
+
+#endif    /* of #ifdef FAX_AND_DATA */
+}
+
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)    MODULE  : CMH_CCR                      |
+|                            ROUTINE : cmhCC_T30_Failed             |
++-------------------------------------------------------------------+
+
+  PURPOSE : T30 entity failure
+
+*/
+
+GLOBAL void cmhCC_T30_Failed ( void )
+{
+#if defined FAX_AND_DATA AND defined (DTI)
+
+  SHORT cId = t30ShrdPrm.cId;  /* holds call identifier */
+  T_CC_CALL_TYPE calltype = cmhCC_getcalltype(cId);
+
+  TRACE_FUNCTION ("cmhCC_T30_Failed()");
+
+  switch( calltype )
+  {
+    case( FAX_CALL ):
+
+      switch( ccShrdPrm.datStat )
+      {
+        case( DS_ACT_REQ ):
+
+          if( psaCC_ctb(cId)->calStat EQ CS_MDF_REQ )
+          {
+            ccShrdPrm.datStat = DS_ABO_REQ;
+          }
+          /*lint -fallthrough*/
+        case( DS_ACT ):
+        case( DS_REST_REQ ):
+        case( DS_TCH_MDF ):
+
+          cmhT30_Deactivate ();
+          break;
+      }
+      break;
+
+    /* in case of a asynchronous data call */
+    case( TRANS_CALL ):
+    case( NON_TRANS_CALL ):
+
+      TRACE_EVENT( "UNEXP BEARER SERV ASYNC" );
+      ccShrdPrm.datStat = DS_DSC_REQ;
+      cmhT30_Deactivate();
+      break;
+    }
+
+#endif    /* of #ifdef FAX_AND_DATA */
+}
+
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)    MODULE  : CMH_CCR                      |
+|                            ROUTINE : cmhCC_T30_RmtCaps            |
++-------------------------------------------------------------------+
+
+  PURPOSE : T30 remote capability indication
+
+*/
+
+GLOBAL void cmhCC_T30_RmtCaps ( void )
+{
+#ifdef FAX_AND_DATA
+
+  T_CC_CMD_PRM * pCCCmdPrm;    /* points to CC command parameters */
+  UBYTE cmdBuf;                /* buffers current command */
+  UBYTE srcBuf;                /* buffers current command source */
+  SHORT cId = t30ShrdPrm.cId;  /* holds call identifier */
+
+  TRACE_FUNCTION ("cmhCC_T30_RmtCaps()");
+
+/*
+ *-------------------------------------------------------------------
+ * check if connect is expected
+ *-------------------------------------------------------------------
+ */
+  pCCCmdPrm = &cmhPrm[psaCC_ctb(cId)->curSrc].ccCmdPrm;
+  cmhCC_PrepareCmdEnd (cId, &cmdBuf, &srcBuf);
+
+  if( cmhCC_tstAndUnflagCall( cId, &(pCCCmdPrm -> mltyCncFlg)))
+  {
+    if( pCCCmdPrm -> mltyCncFlg EQ 0 )  /* if last call */
+    {
+      R_AT( RAT_OK, srcBuf ) ( cmdBuf );
+
+      /* log result */
+      cmh_logRslt ( srcBuf, RAT_OK,
+                    cmdBuf, (SHORT)(cId+1), -1, -1 );
+    }
+  }
+
+#endif    /* of #ifdef FAX_AND_DATA */
+}
+
+#endif /* FF_FAX */
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)    MODULE  : CMH_CCR                      |
+|                            ROUTINE : cmhCC_MPTYBuild              |
++-------------------------------------------------------------------+
+
+  PURPOSE : Multiparty successful build.
+
+*/
+
+GLOBAL void cmhCC_MPTYBuild( SHORT cId,
+                             T_BUILD_MPTY_RES *bldMPTY )
+{
+  T_CC_CALL_TBL *ctb = ccShrdPrm.ctb[cId];
+  T_CC_CMD_PRM * pCCCmdPrm;   /* points to CC command parameters */
+  UBYTE ctbIdx;               /* holds call table index */
+  UBYTE cmdBuf;               /* buffers command */
+  UBYTE srcBuf;               /* buffers command source */
+
+  TRACE_FUNCTION ("cmhCC_MPTYBuild()");
+
+  TIMERSTOP( ACI_TMPTY );
+
+  if( ctb->curCmd NEQ AT_CMD_CHLD )
+    return;  /* wrong command context */
+
+  /* set multiparty status for involved calls */
+  for( ctbIdx = 0; ctbIdx < MAX_CALL_NR; ctbIdx++ )
+  {
+    if (ccShrdPrm.ctb[ctbIdx] NEQ NULL AND
+        (psaCC_ctb(ctbIdx)->mptyStat  EQ CS_ACT_REQ OR
+         psaCC_ctb(ctbIdx)->mptyStat  EQ CS_ACT ))
+    {
+      psaCC_ctb(ctbIdx)->mptyStat = CS_ACT;
+      psaCC_ctb(ctbIdx)->calStat  = CS_ACT;
+    }
+  }
+
+  pCCCmdPrm = &cmhPrm[ctb->curSrc].ccCmdPrm;
+  cmhCC_PrepareCmdEnd (cId, &cmdBuf, &srcBuf);
+
+  psaCC_MPTY (cId, MPTY_BUILD_SUCCESS);
+
+  if( cmhCC_tstAndUnflagCall( cId, &(pCCCmdPrm -> mltyCncFlg)))
+  {
+    if( pCCCmdPrm -> mltyCncFlg EQ 0 AND
+        pCCCmdPrm -> mltyDscFlg EQ 0     )  /* if last call */
+    {
+      R_AT( RAT_OK, srcBuf ) ( cmdBuf );
+
+      /* log result */
+      cmh_logRslt ( srcBuf, RAT_OK,
+                    cmdBuf, (SHORT)(cId+1), -1, -1 );
+    }
+  }
+}
+
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)    MODULE  : CMH_CCR                      |
+|                            ROUTINE : cmhCC_MPTYSplit              |
++-------------------------------------------------------------------+
+
+  PURPOSE : Multiparty successful split.
+
+*/
+
+GLOBAL void cmhCC_MPTYSplit( SHORT cId,
+                             T_SPLIT_MPTY_RES *splMPTY )
+{
+  T_CC_CALL_TBL *ctb = ccShrdPrm.ctb[cId];
+  T_CC_CMD_PRM * pCCCmdPrm;   /* points to CC command parameters */
+  UBYTE ctbIdx;               /* holds call table index */
+  UBYTE cmdBuf;               /* buffers command */
+  UBYTE srcBuf;               /* buffers command source */
+  UBYTE fndCId;               /* holds call id of found call */
+  UBYTE fndCal;               /* holds number of found calls */
+
+  TRACE_FUNCTION ("cmhCC_MPTYSplit()");
+
+  TIMERSTOP( ACI_TMPTY );
+
+  if( ctb->curCmd NEQ AT_CMD_CHLD )
+    return;  /* wrong command context */
+
+  /* set status for involved calls */
+  for( fndCal = 0, ctbIdx = 0; ctbIdx < MAX_CALL_NR; ctbIdx++ )
+  {
+    if( ccShrdPrm.ctb[ctbIdx] NEQ NULL AND
+        psaCC_ctb(ctbIdx)->mptyStat   EQ  CS_ACT AND
+        ctbIdx                           NEQ cId )
+    {
+      psaCC_ctb(ctbIdx)->calStat  = CS_HLD;
+      fndCal++;
+      fndCId = ctbIdx;
+    }
+  }
+
+  /* if only one other call is left, reset multiparty status */
+  /* if only one other call is left, do not reset multiparty status - VO patch
+  if( fndCal EQ 1 )
+  {
+    psaCC_ctb(fndCId)->mptyStat = CS_IDL;
+  }
+  */
+
+  pCCCmdPrm = &cmhPrm[ctb->curSrc].ccCmdPrm;
+  cmhCC_PrepareCmdEnd (cId, &cmdBuf, &srcBuf);
+  ctb->calStat  = CS_ACT;
+  ctb->mptyStat = CS_IDL;
+
+  psaCC_MPTY (cId, MPTY_SPLIT_SUCCESS);
+
+  psaCC_setSpeechMode (); /* In case we split from a held mpty */
+
+  if( cmhCC_tstAndUnflagCall( cId, &(pCCCmdPrm -> mltyCncFlg)))
+  {
+    if( pCCCmdPrm -> mltyCncFlg EQ 0 AND
+        pCCCmdPrm -> mltyDscFlg EQ 0     )  /* if last call */
+    {
+      R_AT( RAT_OK, srcBuf ) ( cmdBuf );
+
+      /* log result */
+      cmh_logRslt ( srcBuf, RAT_OK,
+                    cmdBuf, (SHORT)(cId+1), -1, -1 );
+    }
+  }
+}
+
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)    MODULE  : CMH_CCR                      |
+|                            ROUTINE : cmhCC_MPTYHeld               |
++-------------------------------------------------------------------+
+
+  PURPOSE : Multiparty successful held.
+
+*/
+
+GLOBAL void cmhCC_MPTYHeld( SHORT cId,
+                            T_HOLD_MPTY_RES *hldMPTY )
+{
+  T_CC_CMD_PRM * pCCCmdPrm;   /* points to CC command parameters */
+  UBYTE ctbIdx;               /* holds call table index */
+  UBYTE cmdBuf;               /* buffers command */
+  UBYTE srcBuf;               /* buffers command source */
+
+  TRACE_FUNCTION ("cmhCC_MPTYHeld()");
+
+  TIMERSTOP( ACI_TMPTY );
+
+  /* check for command context */
+  switch( psaCC_ctb(cId)->curCmd )
+  {
+    case( AT_CMD_CHLD ):
+    case( AT_CMD_D ):
+      break;
+
+    default:
+      return;  /* wrong command context */
+  }
+
+  /* set call status for multiparty call member */
+  for( ctbIdx = 0; ctbIdx < MAX_CALL_NR; ctbIdx++ )
+  {
+    if( ccShrdPrm.ctb[ctbIdx] NEQ NULL AND
+        psaCC_ctb(ctbIdx)->calStat    EQ CS_HLD_REQ AND
+        psaCC_ctb(ctbIdx)->mptyStat   EQ CS_ACT )
+    {
+      psaCC_ctb(ctbIdx)->calStat = CS_HLD;
+    }
+  }
+
+  psaCC_MPTY (cId, MPTY_HOLD_SUCCESS);
+
+  psaCC_setSpeechMode ();
+
+  pCCCmdPrm = &cmhPrm[psaCC_ctb(cId)->curSrc].ccCmdPrm;
+  cmhCC_PrepareCmdEnd (cId, &cmdBuf, &srcBuf);
+
+  if( cmhCC_tstAndUnflagCall( cId, &(pCCCmdPrm -> mltyCncFlg)))
+  {
+    if((pCCCmdPrm -> CHLDmode EQ CHLD_MOD_HldActExc OR
+        pCCCmdPrm -> CHLDmode EQ CHLD_MOD_HldActAndAcpt OR
+        pCCCmdPrm -> CHLDmode EQ CHLD_MOD_HldActDial) AND
+        pCCCmdPrm -> mltyCncFlg )
+    {
+      process_CHLDaddInfo( srcBuf, MTPTY_HELD );
+    }
+
+    if( pCCCmdPrm -> mltyCncFlg EQ 0 AND
+        pCCCmdPrm -> mltyDscFlg EQ 0     )  /* if last call */
+    {
+      R_AT( RAT_OK, srcBuf ) ( cmdBuf );
+
+      /* log result */
+      cmh_logRslt ( srcBuf, RAT_OK,
+                    cmdBuf, (SHORT)(cId+1), -1, -1 );
+    }
+  }
+}
+
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)    MODULE  : CMH_CCR                      |
+|                            ROUTINE : cmhCC_MPTYRetrieved          |
++-------------------------------------------------------------------+
+
+  PURPOSE : Multiparty successful retrieved.
+
+*/
+
+GLOBAL void cmhCC_MPTYRetrieved( SHORT cId,
+                                 T_RETRIEVE_MPTY_RES *rtvMPTY )
+{
+  T_CC_CMD_PRM * pCCCmdPrm;   /* points to CC command parameters */
+  UBYTE ctbIdx;               /* holds call table index */
+  UBYTE cmdBuf;               /* buffers command */
+  UBYTE srcBuf;               /* buffers command source */
+
+  TRACE_FUNCTION ("cmhCC_MPTYRetrieved()");
+
+  TIMERSTOP( ACI_TMPTY );
+
+  if( psaCC_ctb(cId)->curCmd NEQ AT_CMD_CHLD )
+    return;  /* wrong command context */
+
+  /* set call status for multiparty call member */
+  for( ctbIdx = 0; ctbIdx < MAX_CALL_NR; ctbIdx++ )
+  {
+    if( ccShrdPrm.ctb[ctbIdx] NEQ NULL AND
+        psaCC_ctb(ctbIdx)->calStat    EQ CS_ACT_REQ AND
+        psaCC_ctb(ctbIdx)->mptyStat   EQ CS_ACT )
+    {
+      psaCC_ctb(ctbIdx)->calStat = CS_ACT;
+    }
+  }
+
+  pCCCmdPrm = &cmhPrm[psaCC_ctb(cId)->curSrc].ccCmdPrm;
+  cmhCC_PrepareCmdEnd (cId, &cmdBuf, &srcBuf);
+
+  psaCC_MPTY (cId, MPTY_RETRIEVE_SUCCESS);
+
+  psaCC_setSpeechMode ();
+
+  if( cmhCC_tstAndUnflagCall( cId, &(pCCCmdPrm -> mltyCncFlg)))
+  {
+    if( pCCCmdPrm -> mltyCncFlg EQ 0 AND
+        pCCCmdPrm -> mltyDscFlg EQ 0     )  /* if last call */
+    {
+      R_AT( RAT_OK, srcBuf ) ( cmdBuf );
+
+      /* log result */
+      cmh_logRslt ( srcBuf, RAT_OK,
+                    cmdBuf, (SHORT)(cId+1), -1, -1 );
+    }
+  }
+}
+
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)    MODULE  : CMH_CCR                      |
+|                            ROUTINE : cmhCC_NotifySS               |
++-------------------------------------------------------------------+
+
+  PURPOSE : SS notification received: in preamble, some
+  local functions, otherwise, the function would be huge...
+
+*/
+
+
+/*
++------------------------------------------------------------------------------
+|   Function    :  cssx2I_Code_Convert
++------------------------------------------------------------------------------
+|   Description :  This function converts CSSX codes to CSSI codes.
+|
+|   Parameters  :  cssx_code                 - CSS(X) code
+|
+|   Return      :  CSSI_CODE_ XXX            - exit sucessful with CSSI_CODE_
+|                  CSSI_CODE_NotPresent      - exit not sueccessful
++------------------------------------------------------------------------------
+*/
+
+LOCAL T_ACI_CSSI_CODE cssx2I_Code_Convert(T_ACI_CSSX_CODE cssx_code)
+{
+  T_ACI_CSSI_CODE cssi_code;
+  switch (cssx_code)
+  {
+    case( CSSX_CODE_ForwardedCall ):
+      cssi_code = CSSI_CODE_ForwardedCall;
+      break;
+    case( CSSX_CODE_CFUActive ):
+      cssi_code = CSSI_CODE_CFUActive;
+      break;
+    case( CSSX_CODE_SomeCCFActive ):
+      cssi_code = CSSI_CODE_SomeCCFActive;
+      break;
+    case( CSSX_CODE_CallWaiting ):
+      cssi_code = CSSI_CODE_CallWaiting;
+      break;
+    case( CSSX_CODE_OutCallsBarred ):
+      cssi_code = CSSI_CODE_OutCallsBarred;
+      break;
+    case( CSSX_CODE_IncCallsBarred ):
+      cssi_code = CSSI_CODE_IncCallsBarred;
+      break;
+    case( CSSX_CODE_CLIRSupRej ):
+      cssi_code = CSSI_CODE_CLIRSupRej;
+      break;
+    case( CSSX_CODE_DeflectedCall ):
+      cssi_code = CSSI_CODE_DeflectedCall;
+      break;
+  case( CSSX_CODE_CUGCall ):
+      cssi_code = CSSI_CODE_CUGCall;
+      break;
+
+  default:
+      cssi_code = CSSI_CODE_NotPresent;
+      break;
+    }
+  return cssi_code;
+}
+
+/*
++------------------------------------------------------------------------------
+|   Function    :  cssx2U_Code_Convert
++------------------------------------------------------------------------------
+|   Description :  This function converts CSSX codes to CSSU codes.
+|
+|   Parameters  :  cssx_code                 - CSS(X) code
+|
+|   Return      :  CSSU_CODE_ XXX            - exit sucessful with CSSU_CODE_
+|                  CSSU_CODE_NotPresent      - exit not sueccessful
++------------------------------------------------------------------------------
+*/
+
+LOCAL T_ACI_CSSU_CODE cssx2U_Code_Convert(T_ACI_CSSX_CODE cssx_code)
+{
+  T_ACI_CSSU_CODE cssu_code;
+  switch (cssx_code)
+  {
+    case( CSSX_CODE_ForwardedCall ):
+      cssu_code = CSSU_CODE_ForwardedCall;
+      break;
+    case(  CSSX_CODE_CUGCall ):
+      cssu_code = CSSU_CODE_CUGCall ;
+      break;
+    case( CSSX_CODE_OnHold ):
+      cssu_code = CSSU_CODE_OnHold;
+      break;
+    case( CSSX_CODE_Retrieved ):
+      cssu_code = CSSU_CODE_Retrieved;
+      break;
+    case( CSSX_CODE_Multiparty ):
+      cssu_code = CSSU_CODE_Multiparty;
+      break;
+    case( CSSX_CODE_HeldCallRel ):
+      cssu_code = CSSU_CODE_HeldCallRel;
+      break;
+    case( CSSX_CODE_FwrdCheckSS ):
+      cssu_code = CSSU_CODE_FwrdCheckSS;
+      break;
+    case( CSSX_CODE_ECTAlert ):
+      cssu_code = CSSU_CODE_ECTAlert;
+      break;
+    case( CSSX_CODE_ECTConnect ):
+      cssu_code = CSSU_CODE_ECTConnect;
+      break;
+    case( CSSX_CODE_DeflectedCall ):
+      cssu_code = CSSU_CODE_DeflectedCall;
+      break;
+
+    default:
+      cssu_code = CSSU_CODE_NotPresent;
+      break;
+  }
+  return cssu_code;
+}
+
+
+/*
++------------------------------------------------------------------------------
+|   Function    :  send_CSSX_notification
++------------------------------------------------------------------------------
+|   Description :  This function sends CSSU and CSSI.
+|
+|   Parameters  :  ctbIdx                    - call table index
+|                  cssx_code                 - CSS(X) code
+|                  index                     - Index
+|                  *number                   - buffer for number
+|                  *toa                      - buffers type of address
+|                  *subaddr                  - buffer for subaddress
+|                  *tos                      - holds type of subaddress
+|
+|   Return      :
++------------------------------------------------------------------------------
+*/
+
+GLOBAL void send_CSSX_notification(SHORT ctbIdx,
+                                   T_ACI_CSSX_CODE cssx_code,
+                                   SHORT index,
+                                   CHAR            *number,
+                                   T_ACI_TOA       *toa,
+                                   CHAR            *subaddr,
+                                   T_ACI_TOS       *tos)
+
+{
+  UBYTE idx;     /* holds index counter */
+
+  /*  Check if CC State is CS ACT REQ */
+  if (ctbIdx > NO_ENTRY AND
+      psaCC_ctb(ctbIdx)->calStat EQ CS_ACT_REQ AND 
+      psaCC_ctb(ctbIdx)->calType EQ CT_MOC)
+  {
+    T_ACI_CSSI_CODE cssi_code;
+    cssi_code = cssx2I_Code_Convert(cssx_code);
+    if (cssi_code != CSSI_CODE_NotPresent )
+    {
+      S8 source = psaCC_ctb(ctbIdx)->curSrc;
+      R_AT( RAT_CSSI, source)( cssi_code, index );
+    }
+  }
+  else /* (calldirection EQ CT_MTC) */
+  {
+    /* Sent CSSU TO ALL */
+    T_ACI_CSSU_CODE cssu_code;
+    cssu_code = cssx2U_Code_Convert(cssx_code);
+    if (cssu_code != CSSU_CODE_NotPresent )
+    {
+      for( idx = 0; idx < CMD_SRC_MAX; idx++ )
+      {
+        R_AT( RAT_CSSU, idx )(cssu_code, index, number, toa, subaddr, tos);
+      }
+    }
+  }
+}
+
+
+
+LOCAL void cmhCC_NotifySS_v_ssCode( SHORT cId, T_NOTIFY_SS_INV *ntfySS )
+{
+  CHAR numBuf[MAX_B_SUBSCR_NUM_LEN];         /* buffer for number */
+  T_ACI_TOA toa;                             /* holds type of address */
+  CHAR subBuf[MAX_SUBADDR_LEN];              /* buffer for subaddress */
+  T_ACI_TOS tos;                             /* holds type of subaddress */
+
+  TRACE_FUNCTION ("cmhCC_NotifySS_v_ssCode()");
+
+  switch( ntfySS -> notifySSArg.ssCode )
+  {
+     case( SS_CD_ALL_FWSS ):
+     case( SS_CD_CFU ):
+      if( ntfySS -> notifySSArg.v_ssStatus AND
+          ntfySS -> notifySSArg.ssStatus & SSS_A )
+      {
+        send_CSSX_notification(cId,
+                              CSSX_CODE_CFUActive,
+                              ACI_NumParmNotPresent,
+                              NULL, NULL, NULL, NULL);
+      }
+      break;
+
+    case( SS_CD_CFB       ):
+    case( SS_CD_CFNRY     ):
+    case( SS_CD_CFNRC     ):
+    case( SS_CD_ALL_CFWSS ):
+
+      if( ntfySS -> notifySSArg.v_ssStatus AND
+          ntfySS -> notifySSArg.ssStatus & SSS_A )
+      {
+
+         send_CSSX_notification(cId,
+                              CSSX_CODE_SomeCCFActive,
+                              ACI_NumParmNotPresent,
+                              NULL, NULL, NULL, NULL);
+      }
+      break;
+
+    case( SS_CD_ALL_CBSS ):
+
+      if( ntfySS -> notifySSArg.v_ssStatus AND
+          ntfySS -> notifySSArg.ssStatus & SSS_A )
+      {
+        /* RAT_CSSI ... outgoing calls are barred  */
+        /* RAT_CSSI ... incoming calls are barred  */
+        send_CSSX_notification(cId,
+                              CSSX_CODE_OutCallsBarred,
+                              ACI_NumParmNotPresent,
+                              NULL, NULL, NULL, NULL);
+
+        send_CSSX_notification(cId,
+                              CSSX_CODE_IncCallsBarred,
+                              ACI_NumParmNotPresent,
+                              NULL, NULL, NULL, NULL);
+
+      }
+      break;
+
+    case( SS_CD_BOC ):
+    case( SS_CD_BAOC ):
+    case( SS_CD_BOIC ):
+    case( SS_CD_BOICXH ):
+
+      if( ntfySS -> notifySSArg.v_ssStatus AND
+          ntfySS -> notifySSArg.ssStatus & SSS_A )
+      {
+        /* RAT_CSSI ... outgoing calls are barred  */
+        send_CSSX_notification(cId,
+                              CSSX_CODE_OutCallsBarred,
+                              ACI_NumParmNotPresent,
+                              NULL, NULL, NULL, NULL);
+
+      }
+      break;
+
+    case( SS_CD_BIC ):
+    case( SS_CD_BAIC ):
+    case( SS_CD_BICRM ):
+
+      if( ntfySS -> notifySSArg.v_ssStatus AND
+          ntfySS -> notifySSArg.ssStatus & SSS_A )
+      {
+        /* RAT_CSSI ... incoming calls are barred  */
+     send_CSSX_notification(cId,
+                              CSSX_CODE_IncCallsBarred,
+                              ACI_NumParmNotPresent,
+                              NULL, NULL, NULL, NULL);
+
+}
+      break;
+
+    case( SS_CD_CD ):
+      if (ntfySS->notifySSArg.v_ssNotification AND
+          ntfySS->notifySSArg.ssNotification.fwdSubscriber EQ
+            FWD_C_INC_CALL_FWD)
+      {
+        /*
+         * If alerting is allowed now, send the CSSU indication.
+         * Otherwise just remember that we got this notification.
+         */
+        if ((ccShrdPrm.TCHasg EQ TRUE) OR
+            (psaCC_ctb(cId)->sigInf NEQ SIG_NOT_PRES))
+
+        {
+          /*
+           * The conditions for user alerting are fulfilled.
+           * Send the +CSSU: unsolicited result code now.
+           */
+          send_CSSX_notification(cId,
+                              CSSX_CODE_DeflectedCall,
+                              ACI_NumParmNotPresent,
+                              psaCC_ctbRdrAdr2Num (cId, numBuf, sizeof (numBuf)),
+                              cmhCC_ctbGetRdrNumTyp (cId, &toa),
+                              psaCC_ctbRdrAdr2Sub (cId, subBuf),
+                              cmhCC_ctbGetRdrSubTyp (cId, &tos));
+
+          psaCC_FreeRdrPty (cId);
+          psaCC_ctb(cId)->CDStat = NO_VLD_CD;
+        }
+        else
+        {
+          /*
+           * Indication of the MT call towards the MMI is deferred until
+           * the alerting conditions are fulfilled (TCH assignment).
+           */
+          psaCC_ctb(cId)->CDStat = CD_Notified;
+        }
+        return;
+      }
+
+      if (ntfySS->notifySSArg.v_ssNotification AND
+          ntfySS->notifySSArg.ssNotification.clgSubscriber EQ
+            CLG_A_OUTG_CALL_FWD_C)
+      {
+        /* RAT_CSSI ... outgoing call has been deflected */
+        send_CSSX_notification(cId,
+                              CSSX_CODE_DeflectedCall,
+                              ACI_NumParmNotPresent,
+                              NULL, NULL, NULL, NULL);
+
+      }
+      break;
+
+    default:
+      TRACE_EVENT( "UNHANDLED SS-CODE IN NOTIFY" );
+      break;
+  }
+}
+
+LOCAL void cmhCC_NotifySS_v_ssNotification( SHORT cId, T_NOTIFY_SS_INV *ntfySS )
+{
+
+  TRACE_FUNCTION ("cmhCC_NotifySS_v_ssNotification()");
+
+  if( ntfySS -> notifySSArg.ssNotification.clgSubscriber EQ
+      CLG_A_OUTG_CALL_FWD_C )
+  {
+    /* RAT_CSSI ... outgoing call has been forwarded  */
+    send_CSSX_notification(cId,
+                              CSSX_CODE_ForwardedCall,
+                              ACI_NumParmNotPresent,
+                              NULL, NULL, NULL, NULL);
+  }
+
+  if( ntfySS -> notifySSArg.ssNotification.fwgSubscriber EQ
+      FWG_B_INC_CALL_FWD_C )
+  {
+    /* RAT_CSSU ... this is a forwarded call  */
+    send_CSSX_notification(cId,
+                            CSSX_CODE_ForwardedCall,
+                            ACI_NumParmNotPresent ,
+                            NULL, NULL, NULL, NULL);
+
+  }
+
+  if( ntfySS -> notifySSArg.ssNotification.fwdSubscriber EQ
+      FWD_C_INC_CALL_FWD )
+  {
+    /* RAT_CSSU ... this is a forwarded call  */
+    send_CSSX_notification(cId,
+                            CSSX_CODE_ForwardedCall,
+                            ACI_NumParmNotPresent ,
+                            NULL, NULL, NULL, NULL);
+
+  }
+}
+
+
+
+
+LOCAL void cmhCC_NotifySS_v_ectIndicator( SHORT cId, T_NOTIFY_SS_INV *ntfySS )
+{
+  CHAR numBuf[MAX_B_SUBSCR_NUM_LEN];         /* buffer for number */
+  T_ACI_TOA toa;                             /* holds type of address */
+  CHAR subBuf[MAX_SUBADDR_LEN];              /* buffer for subaddress */
+  T_ACI_TOS tos;                             /* holds type of subaddress */
+  BOOL numFlg   = FALSE;                     /* flags a present number */
+  BOOL subFlg   = FALSE;                     /* flags a present subaddress */
+
+  TRACE_FUNCTION ("cmhCC_NotifySS_v_ectIndicator()");
+
+  /* note that according to GSM 04.91, indications without RDN are
+     possible but not without ectCallState */
+  if( ntfySS -> notifySSArg.ectIndicator.v_ectCallState )
+  {
+    /* (G)ACI-FIX-1415 */
+    if(ntfySS -> notifySSArg.ectIndicator.v_rdn )
+    {
+      if( ntfySS -> notifySSArg.ectIndicator.
+        rdn.v_presentationAllowedAddress )
+      {
+        if( ntfySS -> notifySSArg.ectIndicator.
+          rdn.presentationAllowedAddress.v_partyNumber AND
+          ntfySS -> notifySSArg.ectIndicator.
+          rdn.presentationAllowedAddress.partyNumber.c_bcdDigit )
+        {
+          utl_BCD2DialStr
+            (ntfySS -> notifySSArg.ectIndicator.
+            rdn.presentationAllowedAddress.partyNumber.bcdDigit,
+            numBuf,
+            ntfySS -> notifySSArg.ectIndicator.
+            rdn.presentationAllowedAddress.partyNumber.c_bcdDigit);
+
+          toa.npi = ntfySS -> notifySSArg.ectIndicator.
+            rdn.presentationAllowedAddress.partyNumber.npi;
+          toa.ton = ntfySS -> notifySSArg.ectIndicator.
+            rdn.presentationAllowedAddress.partyNumber.noa;
+
+          numFlg = TRUE;
+        }
+
+        if( ntfySS -> notifySSArg.ectIndicator.
+          rdn.presentationAllowedAddress.v_partySubaddress AND
+          ntfySS -> notifySSArg.ectIndicator.
+          rdn.presentationAllowedAddress.partySubaddress.c_bcdDigit )
+        {
+          utl_BCD2DialStr
+            (ntfySS -> notifySSArg.ectIndicator.
+            rdn.presentationAllowedAddress.partySubaddress.bcdDigit,
+            subBuf,
+            ntfySS -> notifySSArg.ectIndicator.
+            rdn.presentationAllowedAddress.partySubaddress.c_bcdDigit);
+
+          tos.tos = ntfySS -> notifySSArg.ectIndicator.
+            rdn.presentationAllowedAddress.partySubaddress.tos;
+          tos.oe  = ntfySS -> notifySSArg.ectIndicator.
+            rdn.presentationAllowedAddress.partySubaddress.oei;
+
+          subFlg = TRUE;
+        }
+      }
+      /* check if the override case occured, do present RDN, (G)ACI-FIX-1434 */
+      /* if presentationAllowedAddress is present then it is obsolete to look
+         at presentationRestrictedAddress */
+      else if( ntfySS -> notifySSArg.ectIndicator.
+        rdn.v_presentationRestrictedAddress )
+      {
+        if( ntfySS -> notifySSArg.ectIndicator.
+          rdn.presentationRestrictedAddress.v_partyNumber AND
+          ntfySS -> notifySSArg.ectIndicator.
+          rdn.presentationRestrictedAddress.partyNumber.c_bcdDigit )
+        {
+          utl_BCD2DialStr
+            (ntfySS -> notifySSArg.ectIndicator.
+            rdn.presentationRestrictedAddress.partyNumber.bcdDigit,
+            numBuf,
+            ntfySS -> notifySSArg.ectIndicator.
+            rdn.presentationRestrictedAddress.partyNumber.c_bcdDigit);
+
+          toa.npi = ntfySS -> notifySSArg.ectIndicator.
+            rdn.presentationRestrictedAddress.partyNumber.npi;
+          toa.ton = ntfySS -> notifySSArg.ectIndicator.
+            rdn.presentationRestrictedAddress.partyNumber.noa;
+
+          numFlg = TRUE;
+        }
+
+        if( ntfySS -> notifySSArg.ectIndicator.
+          rdn.presentationRestrictedAddress.v_partySubaddress AND
+          ntfySS -> notifySSArg.ectIndicator.
+          rdn.presentationRestrictedAddress.partySubaddress.c_bcdDigit )
+        {
+          utl_BCD2DialStr
+            (ntfySS -> notifySSArg.ectIndicator.
+            rdn.presentationRestrictedAddress.partySubaddress.bcdDigit,
+            subBuf,
+            ntfySS -> notifySSArg.ectIndicator.
+            rdn.presentationRestrictedAddress.partySubaddress.c_bcdDigit);
+
+          tos.tos = ntfySS -> notifySSArg.ectIndicator.
+            rdn.presentationRestrictedAddress.partySubaddress.tos;
+          tos.oe  = ntfySS -> notifySSArg.ectIndicator.
+            rdn.presentationRestrictedAddress.partySubaddress.oei;
+
+          subFlg = TRUE;
+        }
+      }
+    }
+
+    switch( ntfySS -> notifySSArg.ectIndicator.ectCallState )
+    {
+      case( ECT_CS_ALERTING ):
+        /* RAT_CSSU ... ECT alerting */
+        send_CSSX_notification(cId,
+                                CSSX_CODE_ECTAlert,
+                                ACI_NumParmNotPresent,
+                                (numFlg)?numBuf:NULL,
+                                (numFlg)?&toa:NULL,
+                                (subFlg)?subBuf:NULL,
+                                (subFlg)?&tos:NULL);
+        break;
+
+      case( ECT_CS_ACTIVE ):
+        /* RAT_CSSU ... ECT active */
+        send_CSSX_notification(cId,
+                                CSSX_CODE_ECTConnect,
+                                ACI_NumParmNotPresent,
+                                (numFlg)?numBuf:NULL,
+                                (numFlg)?&toa:NULL,
+                                (subFlg)?subBuf:NULL,
+                                (subFlg)?&tos:NULL);
+
+        break;
+    }
+  }
+}
+
+LOCAL void cmhCC_NotifySS_v_ccbsf( T_NOTIFY_SS_INV *ntfySS )
+{
+  T_ACI_CCBS_SET ccbsSet;                    /* holds ccbs setting */
+
+  TRACE_FUNCTION ("cmhCC_NotifySS_v_ccbsf()");
+
+  if( ntfySS -> notifySSArg.ccbsf.v_ccbsIndex )
+  {
+    ccbsSet.idx = ntfySS -> notifySSArg.ccbsf.ccbsIndex;
+  }
+  else
+    ccbsSet.idx = ACI_NumParmNotPresent;
+
+  if( ntfySS -> notifySSArg.ccbsf.v_b_subscriberNumber AND
+      ntfySS -> notifySSArg.ccbsf.b_subscriberNumber.c_bcdDigit)
+  {
+    utl_BCD2DialStr
+      (ntfySS -> notifySSArg.ccbsf.b_subscriberNumber.bcdDigit,
+       ccbsSet.number,
+       ntfySS -> notifySSArg.ccbsf.b_subscriberNumber.c_bcdDigit);
+
+    ccbsSet.type.npi = ntfySS -> notifySSArg.ccbsf.b_subscriberNumber.npi;
+    ccbsSet.type.ton = ntfySS -> notifySSArg.ccbsf.b_subscriberNumber.noa;
+  }
+  else
+  {
+    ccbsSet.number[0] = 0x0;
+    ccbsSet.type.npi = NPI_NotPresent;
+    ccbsSet.type.ton = TON_NotPresent;
+  }
+
+  if( ntfySS -> notifySSArg.ccbsf.v_b_subscriberSubaddress AND
+      ntfySS -> notifySSArg.ccbsf.b_subscriberSubaddress.c_bcdDigit)
+  {
+    utl_BCD2DialStr
+      (ntfySS -> notifySSArg.ccbsf.b_subscriberSubaddress.bcdDigit,
+       ccbsSet.subaddr,
+       ntfySS -> notifySSArg.ccbsf.b_subscriberSubaddress.c_bcdDigit);
+
+    ccbsSet.satype.tos = ntfySS -> notifySSArg.ccbsf.b_subscriberSubaddress.tos;
+    ccbsSet.satype.oe  = ntfySS -> notifySSArg.ccbsf.b_subscriberSubaddress.oei;
+  }
+  else
+  {
+    ccbsSet.subaddr[0] = 0x0;
+    ccbsSet.satype.tos = TOS_NotPresent;
+    ccbsSet.satype.oe  = OE_NotPresent;
+  }
+
+  if( ntfySS -> notifySSArg.ccbsf.v_basicServiceGroup )
+    ccbsSet.class_type = cmhSS_GetClass( (T_basicService*)&ntfySS -> notifySSArg.ccbsf.
+                            basicServiceGroup );
+  else
+    ccbsSet.class_type = CLASS_NotPresent;
+
+  if( ntfySS -> notifySSArg.v_alertingPattern )
+  {
+    ccbsSet.alrtPtn = ntfySS -> notifySSArg.alertingPattern;
+  }
+  else
+  {
+    ccbsSet.alrtPtn = ALPT_NotPresent;
+  }
+
+  cmhrat_ccbs( CMD_SRC_MAX, CCBS_IND_Recall,
+               CCBS_STAT_NotPresent, &ccbsSet );
+}
+
+
+GLOBAL void cmhCC_NotifySS( SHORT cId, T_NOTIFY_SS_INV *ntfySS )
+{
+  UBYTE         idx;        /* holds index counter */
+  T_callingName *NameId;    /* holds Name Identifier for CNAP */
+
+  TRACE_FUNCTION ("cmhCC_NotifySS()");
+
+  /* check SS code */
+  if( ntfySS -> notifySSArg.v_ssCode )
+  {
+    cmhCC_NotifySS_v_ssCode( cId, ntfySS );
+  }
+
+  /* check SS notification */
+  if( ntfySS -> notifySSArg.v_ssNotification )
+  {
+    cmhCC_NotifySS_v_ssNotification( cId, ntfySS );
+  }
+
+  /* check call is waiting indicator */
+  if( ntfySS -> notifySSArg.v_callIsWaitingIndicator )
+  {
+    /* RAT_CSSI ... call is waiting */
+    send_CSSX_notification(cId,
+                              CSSX_CODE_CallWaiting,
+                              ACI_NumParmNotPresent,
+                              NULL, NULL, NULL, NULL);
+
+  }
+
+  /* check call on hold indicator */
+  if( ntfySS -> notifySSArg.v_callOnHoldIndicator )
+  {
+    switch( ntfySS -> notifySSArg.callOnHoldIndicator )
+    {
+    case( CHLD_CALL_RETRIEVED ):
+      send_CSSX_notification(cId,
+                              CSSX_CODE_Retrieved,
+                              ACI_NumParmNotPresent ,
+                              NULL, NULL, NULL, NULL);
+
+      break;
+
+    case( CHLD_CALL_ON_HOLD ):
+      /* RAT_CSSU ... call has been put on hold */
+      send_CSSX_notification(cId,
+                              CSSX_CODE_OnHold,
+                              ACI_NumParmNotPresent ,
+                              NULL, NULL, NULL, NULL);
+
+      break;
+    }
+  }
+
+  /* check multparty indicator */
+  if( ntfySS -> notifySSArg.v_mptyIndicator )
+  {
+    /* If the Call is on hold and a SS_Notify with a MPTY
+       the state shall change from CS_HOLD to CS_ACT */
+      psaCC_ctb(cId)->calStat  = CS_ACT;
+      /* mptyStat equal to CS_ACT_REQ set it to CS_ACT
+         required to place multiparty call on hold */
+      if(psaCC_ctb(cId)->mptyStat EQ CS_ACT_REQ)
+      {
+        psaCC_ctb(cId)->mptyStat = CS_ACT;
+      }
+
+    /* RAT_CSSU ... multiparty call entered */
+    send_CSSX_notification(cId,
+                              CSSX_CODE_Multiparty,
+                              ACI_NumParmNotPresent ,
+                              NULL, NULL, NULL, NULL);
+
+}
+
+  /* check CUG index */
+  if( ntfySS -> notifySSArg.v_cugIndex )
+  {
+      send_CSSX_notification(cId,
+                              CSSX_CODE_CUGCall,
+                              ntfySS -> notifySSArg.cugIndex,
+                              NULL, NULL, NULL, NULL);
+  }
+
+  /* check CLIR suppression */
+  if( ntfySS -> notifySSArg.v_clirSuppressionRejected )
+  {
+    /* RAT_CSSI ... CLIR  suppression rejected */
+    send_CSSX_notification(cId,
+                              CSSX_CODE_CLIRSupRej,
+                              ACI_NumParmNotPresent,
+                              NULL, NULL, NULL, NULL);
+
+  }
+
+  /* check ECT indicator */
+  if( ntfySS -> notifySSArg.v_ectIndicator )
+  {
+    cmhCC_NotifySS_v_ectIndicator( cId, ntfySS );
+  }
+
+  /* check CNAP indicator */
+  if( ntfySS -> notifySSArg.v_nameIndicator )
+  {
+    if ( ntfySS -> notifySSArg.nameIndicator.v_callingName )
+    {
+      NameId = &(ntfySS -> notifySSArg.nameIndicator.callingName);
+      for( idx = 0; idx < CMD_SRC_MAX; idx++ )
+      {
+        R_AT( RAT_CNAP, idx )
+          ( NameId, CNAP_SERVICE_STATUS_NOT_PRESENT);
+      }
+    }
+  }
+
+  /* check CCBS feature */
+  if( ntfySS -> notifySSArg.v_ccbsf )
+  {
+    cmhCC_NotifySS_v_ccbsf( ntfySS );
+  }
+}
+
+
+
+/*
++------------------------------------------------------------------------------
+|   Function    :  cmhCC_CheckSS
++------------------------------------------------------------------------------
+|   Description :  check SS indication received.
+|
+|   Parameters  :  cId -
+|
+|   Return      :
++------------------------------------------------------------------------------
+*/
+GLOBAL void cmhCC_CheckSS( SHORT cId )
+{
+  UBYTE idx;                      /* holds index counter */
+
+  TRACE_FUNCTION ("cmhCC_CheckSS()");
+
+/*
+ *-------------------------------------------------------------------
+ * indicate check SS
+ *-------------------------------------------------------------------
+ */
+  /* RAT_CSSU ... forward check SS indication */
+  for( idx = 0; idx < CMD_SRC_MAX; idx++ )
+  {
+    send_CSSX_notification( cId,
+                              CSSX_CODE_FwrdCheckSS,
+                              ACI_NumParmNotPresent,
+                              NULL, NULL, NULL, NULL);
+
+  }
+}
+
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)    MODULE  : CMH_CCR                      |
+|                            ROUTINE : cmhCC_CCBSRegistered         |
++-------------------------------------------------------------------+
+
+  PURPOSE :  call completion to busy subscriber successfully registered.
+
+*/
+
+GLOBAL void cmhCC_CCBSRegistered( SHORT cId,
+                                  T_ACC_REGISTER_CC_ENTRY_RES *CCBSreg )
+{
+  UBYTE          cmdBuf;                    /* buffers command */
+  UBYTE          srcBuf;                    /* buffers command source */
+  T_ACI_CCBS_SET ccbsSet;                   /* holds ccbs setting */
+
+  TRACE_FUNCTION ("cmhCC_CCBSRegistered()");
+
+  /* check for command context */
+  if( psaCC_ctb(cId)->curCmd NEQ AT_CMD_CHLD )
+  {
+    TRACE_EVENT("cmhCC_CCBSRegistered: wrong command context !");
+    return;
+  }
+
+  if( CCBSreg->accRegisterCCEntryRes.v_ccbsf )
+  {
+    if( CCBSreg->accRegisterCCEntryRes.ccbsf.v_ccbsIndex )
+
+      ccbsSet.idx = CCBSreg->accRegisterCCEntryRes.ccbsf.ccbsIndex;
+    else
+      ccbsSet.idx = ACI_NumParmNotPresent;
+
+
+    if( CCBSreg->accRegisterCCEntryRes.ccbsf.
+        v_b_subscriberNumber                  AND
+        CCBSreg->accRegisterCCEntryRes.ccbsf.
+        b_subscriberNumber.c_bcdDigit)
+    {
+      utl_BCD2DialStr
+        (CCBSreg->accRegisterCCEntryRes.ccbsf.b_subscriberNumber.
+         bcdDigit,
+         ccbsSet.number,
+         CCBSreg->accRegisterCCEntryRes.ccbsf.b_subscriberNumber.
+         c_bcdDigit);
+
+      ccbsSet.type.npi = CCBSreg->accRegisterCCEntryRes.ccbsf.
+                         b_subscriberNumber.npi;
+      ccbsSet.type.ton = CCBSreg->accRegisterCCEntryRes.ccbsf.
+                         b_subscriberNumber.noa;
+    }
+    else
+    {
+      ccbsSet.number[0] = 0x0;
+      ccbsSet.type.npi = NPI_NotPresent;
+      ccbsSet.type.ton = TON_NotPresent;
+    }
+
+    if( CCBSreg->accRegisterCCEntryRes.ccbsf.
+        v_b_subscriberSubaddress              AND
+        CCBSreg->accRegisterCCEntryRes.ccbsf.
+        b_subscriberSubaddress.c_bcdDigit)
+    {
+      utl_BCD2DialStr
+        (CCBSreg->accRegisterCCEntryRes.ccbsf.b_subscriberSubaddress.
+         bcdDigit,
+         ccbsSet.subaddr,
+         CCBSreg->accRegisterCCEntryRes.ccbsf.b_subscriberSubaddress.
+         c_bcdDigit);
+
+      ccbsSet.satype.tos = CCBSreg->accRegisterCCEntryRes.ccbsf.
+                   b_subscriberSubaddress.tos;
+      ccbsSet.satype.oe  = CCBSreg->accRegisterCCEntryRes.ccbsf.
+                   b_subscriberSubaddress.oei;
+    }
+    else
+    {
+      ccbsSet.subaddr[0] = 0x0;
+      ccbsSet.satype.tos = TOS_NotPresent;
+      ccbsSet.satype.oe  = OE_NotPresent;
+    }
+
+    if( CCBSreg->accRegisterCCEntryRes.ccbsf.v_basicServiceGroup )
+      ccbsSet.class_type = cmhSS_GetClass( (T_basicService*)&CCBSreg->accRegisterCCEntryRes.
+                                       ccbsf.basicServiceGroup );
+    else
+      ccbsSet.class_type = CLASS_NotPresent;
+
+    ccbsSet.alrtPtn = ALPT_NotPresent;
+  }
+
+  cmhCC_PrepareCmdEnd (cId, &cmdBuf, &srcBuf);
+  cmhCC_tstAndUnflagCall( cId, &(cmhPrm[srcBuf].ccCmdPrm.mltyDscFlg));
+  psaCC_FreeCtbNtry (cId);
+
+  cmhrat_ccbs( srcBuf, CCBS_IND_Registered,
+               CCBS_STAT_NotPresent, &ccbsSet );
+
+  R_AT( RAT_OK, srcBuf ) ( cmdBuf );
+
+  /* log result */
+  cmh_logRslt ( srcBuf, RAT_OK,
+                cmdBuf, (SHORT)(cId+1), -1, -1 );
+}
+
+/* sends RAT_CCBS: sometimes it is an intermediate result, and sometimes it is an
+indication.
+When srcId = CMD_SRC_MAX, it is an indication and shall go to all sources...
+Otherwise, only to the source specified... */
+GLOBAL void cmhrat_ccbs( UBYTE           srcId,
+                         T_ACI_CCBS_IND  ccbs_ind,
+                         T_ACI_CCBS_STAT status,
+                         T_ACI_CCBS_SET  *setting )
+{
+  UBYTE idx;
+
+  if( srcId EQ CMD_SRC_MAX )
+  {
+#if defined MFW || defined SMI OR defined FF_MMI_RIV
+    rAT_PercentCCBS(ccbs_ind, status, setting);
+#endif
+
+#ifdef FF_ATI
+    for( idx = CMD_SRC_ATI_1; idx < CMD_SRC_MAX; idx++ )
+    {
+      srcId_cb = idx;
+      rCI_PercentCCBS(ccbs_ind, status, setting, FALSE);      
+    }
+#endif /* FF_ATI */
+
+    return;
+  }
+#if defined MFW || defined SMI OR defined FF_MMI_RIV
+  if( srcId EQ CMD_SRC_LCL )
+  {
+    rAT_PercentCCBS( ccbs_ind, status, setting );
+    return;
+  }
+#endif
+
+  /* else it is an ATI source */
+  srcId_cb = srcId;
+
+#ifdef FF_ATI
+  rCI_PercentCCBS(ccbs_ind, status, setting, TRUE);
+#endif /* FF_ATI */
+}
+
+
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)    MODULE  : CMH_CCR                      |
+|                            ROUTINE : cmhCC_CDRegistered           |
++-------------------------------------------------------------------+
+
+  PURPOSE :  Call Deflection (CD) successfully registered.
+
+*/
+
+GLOBAL void cmhCC_CDRegistered( SHORT cId )
+{
+  TRACE_FUNCTION ("cmhCC_CDRegistered()");
+
+  switch( psaCC_ctb(cId)->curCmd )
+  {
+    case AT_CMD_CTFR:
+      psaCC_ctb(cId)->CDStat = CD_Succeeded;
+      break;
+
+    default: /* This is unexpected or network failure, ignore the event */
+      break;
+  }
+}
+
+
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)    MODULE  : CMH_CCR                      |
+|                            ROUTINE : cmhCC_SSTransFail            |
++-------------------------------------------------------------------+
+
+  PURPOSE : SS transaction failed.
+
+*/
+
+GLOBAL void cmhCC_SSTransFail   ( SHORT cId )
+{
+  T_CC_CMD_PRM * pCCCmdPrm;   /* points to CC command parameters */
+  SHORT ctbIdx;               /* holds call table index */
+  SHORT addId;                /* holds additional call id */
+  UBYTE cmdBuf;               /* buffers command */
+  UBYTE srcBuf;               /* buffers command source */
+
+  TRACE_FUNCTION ("cmhCC_SSTransFail()");
+
+/*
+ *-------------------------------------------------------------------
+ * check for command context
+ *-------------------------------------------------------------------
+ */
+  switch( psaCC_ctb(cId)->curCmd )
+  {
+   /*
+    *----------------------------------------------------------------
+    * process result for D and A command
+    *----------------------------------------------------------------
+    */
+    case( AT_CMD_D ):
+    case( AT_CMD_A ):
+
+      /* restore call status for hold request*/
+      if( psaCC_ctb(cId)->calStat EQ CS_HLD_REQ )
+        for( ctbIdx = 0; ctbIdx < MAX_CALL_NR; ctbIdx++ )
+        {
+          if( ccShrdPrm.ctb[ctbIdx] NEQ NULL AND
+              psaCC_ctb(ctbIdx)->calStat    EQ CS_HLD_REQ AND
+              psaCC_ctb(ctbIdx)->mptyStat   EQ CS_ACT )
+          {
+            psaCC_ctb(ctbIdx)->calStat = CS_ACT;
+          }
+        }
+
+      pCCCmdPrm = &cmhPrm[psaCC_ctb(cId)->curSrc].ccCmdPrm;
+
+      cmhCC_PrepareCmdEnd (cId, &cmdBuf, &srcBuf);
+
+      if( cmhCC_tstAndUnflagCall( cId, &(pCCCmdPrm -> mltyCncFlg)))
+      {
+        if( pCCCmdPrm -> CHLDmode EQ CHLD_MOD_HldActDial AND
+            pCCCmdPrm -> mltyCncFlg )
+        {
+          for( addId = 0; !((pCCCmdPrm -> mltyCncFlg >> addId) & 0x01); addId++ )
+            ;
+
+          if( CHLDaddInfo EQ CHLD_ADD_INFO_DIAL_CAL )
+          {
+              CHLDaddInfo = NO_CHLD_ADD_INFO;
+              psaCC_FreeCtbNtry (addId);  /* remove pending call */
+          }
+        }
+
+        pCCCmdPrm -> mltyCncFlg = 0;        /* unflag calls */
+
+        R_AT( RAT_CME, srcBuf ) ( cmdBuf, CME_ERR_NotPresent );
+
+        cmh_logRslt ( srcBuf, RAT_CME,
+                        cmdBuf, -1, -1, CME_ERR_NotPresent );
+      }
+      break;
+
+   /*
+    *----------------------------------------------------------------
+    * process result for +CTFR command
+    *----------------------------------------------------------------
+    */
+    case( AT_CMD_CTFR ):
+      psaCC_ctb(cId)->CDStat = CD_Failed;
+      break;
+
+   /*
+    *----------------------------------------------------------------
+    * process result for +CHLD command
+    *----------------------------------------------------------------
+    */
+    case( AT_CMD_CHLD ):
+
+      /* determine CHLD mode */
+      switch( cmhPrm[psaCC_ctb(cId)->curSrc].ccCmdPrm.CHLDmode )
+      {
+       /*
+        *------------------------------------------------------------
+        * no multiparty relation
+        *------------------------------------------------------------
+        */
+        case( CHLD_MOD_NotPresent ):
+        case( CHLD_MOD_RelHldOrUdub ):
+        case( CHLD_MOD_RelActSpec ):
+
+          TRACE_EVENT( "UNEXP CHLD MODE FOR SS ERROR COMP" );
+          return;
+
+       /*
+        *------------------------------------------------------------
+        * multiparty hold or retrieve
+        *------------------------------------------------------------
+        */
+        case( CHLD_MOD_RelActAndAcpt ):
+        case( CHLD_MOD_HldActAndAcpt ):
+
+          /* restore call status for retrieve request */
+          if( psaCC_ctb(cId)->calStat EQ CS_ACT_REQ )
+          {
+            for( ctbIdx = 0; ctbIdx < MAX_CALL_NR; ctbIdx++ )
+            {
+              if( ccShrdPrm.ctb[ctbIdx] NEQ NULL AND
+                  psaCC_ctb(ctbIdx)->calStat    EQ CS_ACT_REQ AND
+                  psaCC_ctb(ctbIdx)->mptyStat   EQ CS_ACT )
+              {
+                psaCC_ctb(ctbIdx)->calStat = CS_HLD;
+              }
+            }
+            psaCC_MPTY (cId, MPTY_RETRIEVE_FAIL);
+          }
+
+          /* restore call status for hold request*/
+          if( psaCC_ctb(cId)->calStat EQ CS_HLD_REQ )
+          {
+            for( ctbIdx = 0; ctbIdx < MAX_CALL_NR; ctbIdx++ )
+            {
+              if( ccShrdPrm.ctb[ctbIdx] NEQ NULL AND
+                  psaCC_ctb(ctbIdx)->calStat    EQ CS_HLD_REQ AND
+                  psaCC_ctb(ctbIdx)->mptyStat   EQ CS_ACT )
+              {
+                psaCC_ctb(ctbIdx)->calStat = CS_ACT;
+              }
+            }
+            psaCC_MPTY (cId, MPTY_HOLD_FAIL);
+          }
+
+          break;
+
+       /*
+        *------------------------------------------------------------
+        * multiparty split
+        *------------------------------------------------------------
+        */
+        case( CHLD_MOD_HldActExc ):
+
+          psaCC_ctb(cId)->mptyStat = CS_ACT;
+          psaCC_MPTY (cId, MPTY_SPLIT_FAIL);
+          break;
+
+       /*
+        *------------------------------------------------------------
+        * multiparty build
+        *------------------------------------------------------------
+        */
+        case( CHLD_MOD_AddHld ):
+
+          /* restore call status for build request */
+          for( ctbIdx = 0; ctbIdx < MAX_CALL_NR; ctbIdx++ )
+          {
+            if( ccShrdPrm.ctb[ctbIdx] NEQ NULL AND
+                psaCC_ctb(ctbIdx)->mptyStat   EQ CS_ACT_REQ AND
+                psaCC_ctb(ctbIdx)->calStat    EQ CS_HLD )
+            {
+              psaCC_ctb(ctbIdx)->mptyStat = CS_IDL;
+            }
+          }
+
+          if( psaCC_ctb(cId)->mptyStat EQ CS_ACT_REQ )
+            psaCC_ctb(cId)->mptyStat = CS_IDL;
+          psaCC_MPTY (cId, MPTY_BUILD_FAIL);
+          break;
+
+       /*
+        *------------------------------------------------------------
+        * explicit call transfer
+        *------------------------------------------------------------
+        */
+        case( CHLD_MOD_Ect ):
+          pCCCmdPrm = &cmhPrm[psaCC_ctb(cId)->curSrc].ccCmdPrm;
+          TRACE_EVENT("ECT failed...");
+
+          TIMERSTOP( ACI_TECT );
+
+          /* restore call status for other call that was to be transfered */
+          for( ctbIdx = 0; ctbIdx < MAX_CALL_NR; ctbIdx++ )
+          {
+            if( ctbIdx EQ cId )
+            {
+              continue;
+            }
+            else if (ccShrdPrm.ctb[ctbIdx] NEQ NULL AND
+                     cmhCC_tstAndUnflagCall( ctbIdx, &(pCCCmdPrm -> mltyDscFlg)) AND
+                     psaCC_ctb(ctbIdx)->curCmd EQ AT_CMD_CHLD )
+            {
+              /* then it is the second call id */
+              cmhCC_PrepareCmdEnd (ctbIdx, NULL, NULL);
+            }
+          }
+
+          /* restore first call id parameters */
+          cmhCC_PrepareCmdEnd (cId, NULL, &srcBuf);
+
+          if( cmhCC_tstAndUnflagCall( cId, &(pCCCmdPrm -> mltyDscFlg)) )
+          {
+            R_AT( RAT_CME, srcBuf )
+                        ( AT_CMD_CHLD, CME_ERR_Unknown );
+
+            cmh_logRslt ( srcBuf, RAT_CME,
+                          AT_CMD_CHLD, -1, -1, CME_ERR_Unknown );
+          }
+          return;
+
+       /*
+        *------------------------------------------------------------
+        * call completion to busy subscriber
+        *------------------------------------------------------------
+        */
+        case( CHLD_MOD_Ccbs ):
+          pCCCmdPrm = &cmhPrm[psaCC_ctb(cId)->curSrc].ccCmdPrm;
+          TRACE_EVENT("CCBS failed...");
+
+          /* restore first call id parameters */
+          cmhCC_PrepareCmdEnd (cId, NULL, &srcBuf);
+
+          if( psaCC_ctb(cId)->opCode EQ OPC_ACC_REGISTER_CC_ENTRY )
+            psaCC_FreeCtbNtry (cId);  /* remove call table entry */
+
+          if( cmhCC_tstAndUnflagCall( cId, &(pCCCmdPrm -> mltyDscFlg)) )
+          {
+            pCCCmdPrm -> mltyDscFlg = 0;        /* unflag calls */
+
+            R_AT( RAT_CME, srcBuf )
+                        ( AT_CMD_CHLD, CME_ERR_Unknown );
+
+            cmh_logRslt ( srcBuf, RAT_CME,
+                          AT_CMD_CHLD, -1, -1, CME_ERR_Unknown );
+          }
+          return;
+      }
+
+      pCCCmdPrm = &cmhPrm[psaCC_ctb(cId)->curSrc].ccCmdPrm;
+      cmhCC_PrepareCmdEnd (cId, NULL, &srcBuf);
+
+      if( cmhCC_tstAndUnflagCall( cId, &(pCCCmdPrm -> mltyCncFlg)))
+      {
+        pCCCmdPrm -> mltyCncFlg = 0;        /* unflag calls */
+
+        R_AT( RAT_CME, srcBuf ) ( AT_CMD_CHLD, CME_ERR_Unknown );
+
+        cmh_logRslt ( srcBuf, RAT_CME,
+                      AT_CMD_CHLD, -1, -1, CME_ERR_Unknown );
+      }
+
+      break;
+  }
+
+  return;
+}
+
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)         MODULE  : CMH_CCR                 |
+|                                 ROUTINE : cmhCC_MPTYTimeout       |
++-------------------------------------------------------------------+
+
+  PURPOSE : handle multiparty timeout
+
+*/
+
+GLOBAL void cmhCC_MPTYTimeout ( void )
+{
+  TRACE_FUNCTION( "cmhCC_MPTYTimeout()" );
+
+  if (!psaCC_ctbIsValid (ccShrdPrm.cIdMPTY))
+  {
+    TRACE_ERROR ("ccShrdPrm.cIdMPTY invalid");
+    return;
+  }
+
+/*
+ *-------------------------------------------------------------------
+ * SS failure
+ *-------------------------------------------------------------------
+ */
+#ifdef SIM_TOOLKIT
+  if (psaCC_ctb(ccShrdPrm.cIdMPTY)->SATinv )
+  {
+    psaCC_ctb(ccShrdPrm.cIdMPTY)->SATinv = FALSE;
+    /* return network error cause GSM 11.14 / 12.12.3 */
+    cmhSAT_NtwErr( ADD_NO_CAUSE );
+  }
+#endif
+  cmhCC_SSTransFail(ccShrdPrm.cIdMPTY);
+
+}
+
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)         MODULE  : CMH_CCR                 |
+|                                 ROUTINE : cmhCC_ECTTimeout        |
++-------------------------------------------------------------------+
+
+  PURPOSE : handle explicit call transfer timeout
+
+*/
+
+LOCAL SHORT search_ect_call(void)
+{
+  SHORT idx;
+  UBYTE chld_src;
+
+  for(idx = 0; idx < MAX_CALL_NR; idx++)
+  {
+    if (ccShrdPrm.ctb[idx] NEQ NULL AND
+        psaCC_ctb(idx)->curCmd EQ AT_CMD_CHLD)
+    {
+      chld_src = psaCC_ctb(idx)->curSrc;
+
+      if( cmhPrm[chld_src].ccCmdPrm.CHLDmode EQ CHLD_MOD_Ect )
+      {
+        return(idx);
+      }
+    }
+  }
+  return(NO_ENTRY);
+}
+
+GLOBAL void cmhCC_ECTTimeout ( void )
+{
+  SHORT ectId;
+
+  TRACE_FUNCTION( "cmhCC_ECTTimeout()" );
+
+  ectId = search_ect_call( );
+
+  if (ectId NEQ NO_ENTRY)
+  cmhCC_SSTransFail(ectId);
+}
+
+#ifdef FF_TTY
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)    MODULE  : CMH_CCR                      |
+|                            ROUTINE : cmhCC_TTY_Control            |
++-------------------------------------------------------------------+
+
+  PURPOSE : Enabling/disabling TTY for the active call
+
+*/
+
+LOCAL BOOL cmhCC_TTY_Proceed (SHORT cId)
+{
+  T_TTY_CMD ttyAction = TTY_OFF;
+  T_bcpara *bc;
+
+  if (ccShrdPrm.ctb[cId] NEQ NULL)
+  {
+    /* Call table entry exists */
+    bc = &psaCC_ctb(cId)->BC[psaCC_ctb(cId)->curBC];
+  
+    if ((bc->bearer_serv EQ BEARER_SERV_SPEECH_CTM OR
+       bc->bearer_serv EQ BEARER_SERV_AUX_SPEECH_CTM) AND
+        psaCC_ctb(cId)->calStat NEQ CS_DSC_REQ)
+  {
+    if ((ccShrdPrm.chMod EQ CHM_SPEECH) OR
+        (ccShrdPrm.chMod EQ CHM_SPEECH_V2) OR
+        (ccShrdPrm.chMod EQ CHM_SPEECH_V3))
+    {
+      audio_set_tty (ttyAction = (T_TTY_CMD)ccShrdPrm.ttyCmd);
+    }
+    else
+    {
+      TRACE_EVENT_P1 ("TTY no speech mode: %d", (int)ccShrdPrm.chMod);
+    }
+  }
+  else
+  {
+    TRACE_EVENT_P1 ("TTY wrong BCAP: %d", (int)bc->bearer_serv);
+  }
+
+  if (ttyAction NEQ (UBYTE)TTY_OFF)
+  {
+    cmhCC_notifyTTY (CTTY_NEG_Grant, cmhCC_getTTYtrx_state (ttyAction));
+    return TRUE;
+  }
+  else
+  {
+    cmhCC_notifyTTY (((ccShrdPrm.ctmReq EQ CTM_ENABLED)?
+                      CTTY_NEG_Reject: CTTY_NEG_None),
+                     CTTY_TRX_Unknown);
+  }
+  }
+  else
+  {
+    TRACE_EVENT ("TTY no call table entry");
+  }
+
+  return FALSE;
+}
+
+GLOBAL void cmhCC_TTY_Control (SHORT cId, UBYTE action)
+{
+  TRACE_EVENT_P3 ("TTY event %d, old state %d, callId %d",
+                  action, ccShrdPrm.ctmState, cId);
+
+  if (!ccShrdPrm.TCHasg)
+  {
+    TRACE_EVENT ("TTY: no TCH");
+  }
+  switch (action)
+  {
+  case TTY_TCH:
+    if (ccShrdPrm.ctmState EQ TTY_STATE_IDLE)
+    {
+      ccShrdPrm.ctmState = TTY_STATE_SYNC;
+    }
+    else if (ccShrdPrm.ctmState EQ TTY_STATE_BCAP)
+    {
+      if (cmhCC_TTY_Proceed (cId))
+        ccShrdPrm.ctmState = TTY_STATE_ACTIVE;
+      else
+        ccShrdPrm.ctmState = TTY_STATE_WAIT;
+    }
+    break;
+
+  case TTY_START:
+    if (ccShrdPrm.ctmState EQ TTY_STATE_IDLE)
+    {
+      ccShrdPrm.ctmState = TTY_STATE_BCAP;
+    }
+    else if (ccShrdPrm.ctmState EQ TTY_STATE_SYNC)
+    {
+      if (cmhCC_TTY_Proceed (cId))
+        ccShrdPrm.ctmState = TTY_STATE_ACTIVE;
+      else
+        ccShrdPrm.ctmState = TTY_STATE_WAIT;
+    }
+    break;
+
+  case TTY_PAUSE:
+    if (ccShrdPrm.ctmState EQ TTY_STATE_WAIT)
+    {
+      ccShrdPrm.ctmState = TTY_STATE_SYNC;
+    }
+    else if (ccShrdPrm.ctmState EQ TTY_STATE_ACTIVE)
+    {
+      audio_set_tty (TTY_OFF);
+      ccShrdPrm.ctmState = TTY_STATE_SYNC;
+    }
+    break;
+
+  case TTY_STOP:
+    if (ccShrdPrm.ctmState EQ TTY_STATE_ACTIVE)
+    {
+      audio_set_tty (TTY_OFF);
+      cmhCC_notifyTTY (CTTY_NEG_None, CTTY_TRX_Off);
+    }
+    ccShrdPrm.ctmState = (ccShrdPrm.ctmReq EQ CTM_ENABLED)?
+                         TTY_STATE_IDLE: TTY_STATE_NONE;
+    break;
+
+  default:
+    break;
+  }
+  TRACE_EVENT_P1 ("TTY new state %d", ccShrdPrm.ctmState);
+}
+#endif /* FF_TTY */
+
+#if defined (FF_WAP) || defined (FF_TCP_IP) || defined (FF_GPF_TCPIP) || defined (FF_SAT_E) 
+/* Only for WAP or RNET */
+
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)    MODULE  : CMH_CCR                      |
+|                            ROUTINE : cmhCC_PPP_Established        |
++-------------------------------------------------------------------+
+
+  PURPOSE : PPP entity activated, data path established
+
+*/
+
+GLOBAL SHORT cmhCC_PPP_Established (ULONG ip_address, USHORT max_receive_unit,
+                                    ULONG dns1, ULONG dns2)
+{
+
+  char c_ip_address[16],c_dns1[16],c_dns2[16];
+  SHORT cId = raShrdPrm.cId;
+  TRACE_FUNCTION ("cmhCC_PPP_Established()");
+
+  ipAddress = ip_address;
+  sprintf (c_ip_address, "%03u.%03u.%03u.%03u", (ip_address & 0xff000000) >> 24,
+                                                (ip_address & 0x00ff0000) >> 16,
+                                                (ip_address & 0x0000ff00) >> 8 ,
+                                                (ip_address & 0x000000ff)        );
+
+  sprintf(c_dns1, "%03u.%03u.%03u.%03u",       (dns1 & 0xff000000) >> 24,
+                                               (dns1 & 0x00ff0000) >> 16,
+                                               (dns1 & 0x0000ff00) >> 8 ,
+                                               (dns1 & 0x000000ff)        );
+  
+  sprintf(c_dns2, "%03u.%03u.%03u.%03u",       (dns2 & 0xff000000) >> 24,
+                                               (dns2 & 0x00ff0000) >> 16,
+                                               (dns2 & 0x0000ff00) >> 8 ,
+                                               (dns2 & 0x000000ff)        );
+
+  TRACE_EVENT_P3("addr : %s ,dns1 : %s ,dns2: %s",c_ip_address,c_dns1,c_dns2);
+
+  if(is_gpf_tcpip_call()) {
+    pppShrdPrm.ipaddr = ip_address ;
+    pppShrdPrm.dns1   = dns1 ;
+    pppShrdPrm.dns2   = dns2 ;
+  }
+#ifdef FF_TCP_IP
+  if (psaCC_ctbIsValid (cId) AND /* Ensure not to dereferentiate NULL */
+      pppShrdPrm.is_PPP_CALL EQ TRUE)
+  {
+    pppShrdPrm.ipaddr = ip_address ;
+    pppShrdPrm.dns1   = dns1 ;
+    pppShrdPrm.dns2   = dns2 ;
+    R_AT( RAT_CONNECT, raShrdPrm.owner )
+      (psaCC_ctb(cId)->curCmd, 
+       cmhCC_GetDataRate(&psaCC_ctb(cId)->BC[psaCC_ctb(cId)->curBC]),
+       cId+1, 
+       FALSE);
+    return 0;
+  }
+#endif /*FF_TCP_IP*/
+
+#if defined (FF_SAT_E)
+  if(cmhSAT_OpChnChckCSD(UDP))
+  {
+    psaTCPIP_Configure((UBYTE*)c_ip_address, NULL, NULL, 
+                       (UBYTE*)c_dns1, (UBYTE*)c_dns2,max_receive_unit,
+                       cmhSAT_OpChnUDPConfCsd) ;
+  }
+  else
+#endif /* FF_SAT_E */
+#if defined (FF_WAP) || defined (FF_GPF_TCPIP)
+  {
+    psaTCPIP_Configure((UBYTE*)c_ip_address, NULL, NULL, 
+                       (UBYTE*)c_dns1, (UBYTE*)c_dns1,max_receive_unit,
+                       psaTCPIP_conf_csd_callback) ;
+  }
+#endif /* FF_WAP OR FF_GPF_TCPIP */
+  return 0;
+}
+
+#ifdef CO_UDP_IP
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)    MODULE  : CMH_CCR                      |
+|                            ROUTINE : cmhCC_IPA_Configurated       |
++-------------------------------------------------------------------+
+
+  PURPOSE : IPA entity activated, data path established
+*/
+
+GLOBAL SHORT cmhCC_IPA_Configurated (void)
+{
+  TRACE_FUNCTION ("cmhCC_IPA_Configurated()");
+
+  psaUDPA_Config(UDPA_CONFIG_UP);
+
+  return 0;
+}
+
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)    MODULE  : CMH_CCR                      |
+|                            ROUTINE : cmhCC_UDPA_Configurated      |
++-------------------------------------------------------------------+
+
+  PURPOSE : IPA entity activated, data path established
+
+*/
+
+GLOBAL SHORT cmhCC_UDPA_Configurated (void)
+{
+  TRACE_FUNCTION ("cmhCC_UDPA_Configurated()");
+#ifdef FF_WAP
+  if (Wap_Call)
+  {
+    if ( tcpipShrdPrm.connection_type EQ TCPIP_CONNECTION_TYPE_CSD_WAP )
+    {
+      rAT_WAP_PPP_connected(wapId,ipAddress);
+    }
+    else
+    {
+      TRACE_EVENT_P1 ("IP: %s", tcpipShrdPrm.ipaddr);
+      rAT_WAP_PPP_connected(wapId, psaTCPIP_bytes2ipv4addr(tcpipShrdPrm.ipaddr));
+    }
+  }
+#endif      
+  psaUDPIP_config_dispatch() ;
+  return 0;
+}
+
+
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)    MODULE  : CMH_CCR                      |
+|                            ROUTINE : cmhCC_UDPA_Deconfigurated    |
++-------------------------------------------------------------------+
+
+  PURPOSE :
+
+*/
+
+GLOBAL SHORT cmhCC_UDPA_Deconfigurated (void)
+{
+  TRACE_FUNCTION ("cmhCC_UDPA_Deconfigurated ()");
+
+  cmhUDPA_Deactivate(tcpipShrdPrm.src_id);
+
+  return 0;
+}
+
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)    MODULE  : CMH_CCR                      |
+|                            ROUTINE : cmhCC_IPA_Deconfigurated     |
++-------------------------------------------------------------------+
+
+  PURPOSE :
+
+*/
+
+GLOBAL SHORT cmhCC_IPA_Deconfigurated (void)
+{
+  TRACE_FUNCTION ("cmhCC_IPA_Deconfigurated()");
+
+  psaUDPA_Config(UDPA_CONFIG_DOWN);
+
+  return 0;
+}
+
+#endif /* of WAP || SAT E */
+
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)    MODULE  : CMH_CCR                      |
+|                            ROUTINE : cmhCC_PPP_Terminated         |
++-------------------------------------------------------------------+
+
+  PURPOSE : PPP entity terminated, close connection / update CC parameters
+
+*/
+
+GLOBAL SHORT cmhCC_PPP_Terminated ( void )
+{
+  TRACE_FUNCTION ("cmhCC_PPP_Terminated()");
+
+#ifdef DTI
+#if defined (FF_WAP) || defined (FF_GPF_TCPIP) || defined (FF_SAT_E) 
+  if (Wap_Call EQ TRUE)
+  {
+    if(is_gpf_tcpip_call()) {
+      GPF_TCPIP_STATEMENT(dti_cntrl_entity_disconnected(peer_link_id, 
+                                                        DTI_ENTITY_TCPIP ));
+    }
+    else {
+    dti_cntrl_entity_disconnected( peer_link_id, DTI_ENTITY_IP );
+    }
+    dti_cntrl_entity_disconnected( prot_link_id, DTI_ENTITY_L2R );
+  }
+#endif /* WAP || defined (FF_GPF_TCPIP) || SAT E */
+
+  dti_cntrl_entity_disconnected( peer_link_id, DTI_ENTITY_PPPC );
+  dti_cntrl_entity_disconnected( prot_link_id, DTI_ENTITY_PPPC );
+
+
+#if defined (FF_SAT_E)
+  if( cmhSAT_OpChnChckCSD(UDP))
+  {
+    psaTCPIP_Deactivate(cmhSAT_OpChnUDPDeactCsd) ;
+  }
+  else
+#endif /* FF_SAT_E */
+#if defined (FF_WAP) OR defined (FF_GPF_TCPIP)
+  {
+    psaTCPIP_Deactivate(psaTCPIP_deact_csd_callback) ;
+  }
+#endif /* defined (WAP) OR defined (FF_GPF_TCPIP) */
+#endif /* DTI */
+  return 0;
+}
+
+
+#endif /* of WAP or FF_TCP_IP || defined (FF_GPF_TCPIP) or SAT E */
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)         MODULE  : CMH_CCR                  |
+| STATE   : code                  ROUTINE : cmhCC_checkALS_Support_cb|
++--------------------------------------------------------------------+
+
+  PURPOSE : Call-backs for ALS support check.
+*/
+
+GLOBAL void cmhCC_checkALS_Support_cb ( SHORT aId )
+{
+  TRACE_FUNCTION ("cmhCC_checkALS_Support_cb()");
+
+  simShrdPrm.atb[aId].ntryUsdFlg = FALSE;
+
+  /* Step #1: Reading of CPHS Info */
+  if (simShrdPrm.atb[aId].errCode NEQ SIM_NO_ERROR OR
+      simShrdPrm.atb[aId].exchData EQ NULL OR
+      simShrdPrm.atb[aId].dataLen < 2)
+  {
+    ;  /* CPHS info not supported or invalid */
+  }
+  else if ((simShrdPrm.atb[aId].exchData[1] & 0x03) EQ ALLOCATED_AND_ACTIVATED)
+  {
+    /* continue with step 2 */
+    cmhCC_checkALS_Support_2();
+    return;
+  }
+
+  cmhCC_checkALS_Support_exec( 0 );
+}
+
+GLOBAL void cmhCC_checkALS_Support_cb_2 ( SHORT aId )
+{
+  int i;
+
+  TRACE_FUNCTION ("cmhCC_checkALS_Support_cb_2()");
+
+  simShrdPrm.atb[aId].ntryUsdFlg = FALSE;
+
+  if (simShrdPrm.atb[aId].errCode NEQ SIM_NO_ERROR OR
+      simShrdPrm.atb[aId].exchData EQ NULL         OR
+      simShrdPrm.atb[aId].dataLen < ACI_CPHS_CSP_SIZE )
+  {
+    ;  /* CSP not supported or invalid */
+  }
+  else
+  {
+    for (i = 0; i < simShrdPrm.atb[aId].dataLen; i += 2)
+    {
+      if (simShrdPrm.atb[aId].exchData[i] EQ ALS_SERVICE_GROUP_CODE)
+      {
+        if (BITFIELD_CHECK(simShrdPrm.atb[aId].exchData[i+1],ALS_BIT_ON))
+        {
+          cmhCC_checkALS_Support_exec( 1 );
+          return;
+        }
+        break;
+      }
+    }
+  }
+
+  cmhCC_checkALS_Support_exec( 0 );
+}
+
+
+GLOBAL void cmhCC_checkALS_Support_exec ( UBYTE flag )
+{
+  T_ACI_CMD_SRC ownBuf;       /* buffers current owner */
+  T_ACI_ALS_MOD ALSmode;
+
+  TRACE_FUNCTION ("cmhCC_checkALS_Support_exec()");
+
+  ownBuf = simEntStat.entOwn;
+
+  simEntStat.curCmd = AT_CMD_NONE;
+  simEntStat.entOwn = simShrdPrm.owner = OWN_NONE;
+
+  switch (ccShrdPrm.als_cmd)
+  {
+    case ALS_CMD_SET:
+      if (flag)
+      {
+        cmhPrm[ownBuf].ccCmdPrm.ALSmode = ALS_MOD_AUX_SPEECH;
+        R_AT( RAT_OK, ownBuf ) ( AT_CMD_ALS );
+      }
+      else
+      {
+        R_AT( RAT_CME, ownBuf ) ( AT_CMD_ALS, CME_ERR_OpNotSupp );
+      }      
+      break;
+    case ALS_CMD_TEST:
+      if (flag)
+      {
+        ALSmode = ALS_MOD_SPEECH | ALS_MOD_AUX_SPEECH;
+      }
+      else 
+      {
+        ALSmode = ALS_MOD_SPEECH;
+      }
+      R_AT( RAT_ALS, ownBuf ) ( ALSmode );
+      R_AT( RAT_OK, ownBuf ) ( AT_CMD_ALS );
+      break;
+    default:
+      TRACE_EVENT("wrong value in als_cmd");
+      R_AT( RAT_CME, ownBuf ) ( AT_CMD_ALS, CME_ERR_OpNotSupp );
+  }
+  ccShrdPrm.als_cmd = ALS_CMD_NONE;
+}
+
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)         MODULE  : CMH_CCR                 |
+|                                 ROUTINE : cmhCC_redialTimeout     |
++-------------------------------------------------------------------+
+
+  PURPOSE : handle redial timeout
+
+*/
+
+GLOBAL void cmhCC_redialTimeout ( void )
+{
+  int i;
+  T_CC_CMD_PRM * pCCCmdPrm;   /* points to CC command parameters */
+
+  TRACE_FUNCTION( "cmhCC_redialTimeout()" );
+
+  if (psaCC_ctbIsValid (rdlPrm.rdlcId))
+  {
+    pCCCmdPrm = &cmhPrm[psaCC_ctb(rdlPrm.rdlcId)->curSrc].ccCmdPrm;
+
+    if (rdlPrm.rdlMod EQ AUTOM_REPEAT_ON)
+    {
+      if((psaCC_ctb(rdlPrm.rdlcId)->rdlTimIndex >= 1) AND 
+         (psaCC_ctb(rdlPrm.rdlcId)->rdlTimIndex < 3))
+      {
+#ifdef _SIMULATION_
+          TIMERSTART(ACI_REPEAT_1,ACI_REPEAT_HND);
+#else
+          psaCC_ctb(rdlPrm.rdlcId)->rdlTimIndex++;
+          TIMERSTART(ACI_REPEAT_2_4,ACI_REPEAT_HND);
+#endif
+      }
+      else
+      {
+        psaCC_ctb(rdlPrm.rdlcId)->rdlTimIndex = RDL_TIM_INDEX_NOT_PRESENT;
+        psaCC_ctb(rdlPrm.rdlcId)->rdlCnt++;
+        for(i = 0; i < CMD_SRC_MAX; i++)
+        {
+          R_AT(RAT_RDL, i)(REDIAL_ATT_START);
+        }
+        psaCC_ctb(rdlPrm.rdlcId)->calType = CT_MOC_RDL;
+        cmhCC_flagCall( rdlPrm.rdlcId, &(pCCCmdPrm->mltyCncFlg));
+        /* start a new call */
+        psaCC_NewCall(rdlPrm.rdlcId);
+        rdlPrm.rdlcId = NO_ENTRY;
+      }
+    }
+    else
+    {
+        TRACE_EVENT("cmhCC_redialTimeout: wrong cId");
+    }
+  }
+}
+
+
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)    MODULE  : CMH_CCR                      |
+|                            ROUTINE : cmhCC_sendFie                |
++-------------------------------------------------------------------+
+
+  PURPOSE : forward unsolicited facility responses from CC to terminal
+
+*/
+GLOBAL T_ACI_RETURN cmhCC_sendFie( T_ACI_FAC_DIR tDirection,
+                                         SHORT         cId,
+                                         T_fac_inf    *fie )
+{
+  T_ACI_CMD_SRC tSrc;
+
+  TRACE_EVENT( "cmhCC_sendFie()" );
+
+  for( tSrc=CMD_SRC_LCL; tSrc<CMD_SRC_MAX; tSrc++ )  /* try over all sources */
+  {
+    if( cmhPrm[tSrc].ccCmdPrm.CSCNcc_mode.CcCSCNModeState EQ CC_CSCN_MOD_STATE_ON )
+    {
+      switch (cmhPrm[tSrc].ccCmdPrm.CSCNcc_mode.CcCSCNModeDirection)
+      {
+        case CC_CSCN_MOD_DIR_BOTH:
+          break; /* printout regardless of direction */
+
+        case CC_CSCN_MOD_DIR_IN:
+          if( tDirection NEQ CSCN_FACILITY_DIRECTION_IN)
+            continue; /* settings for source don't match, advance to next source */
+          break;
+
+        case CC_CSCN_MOD_DIR_OUT:
+          if( tDirection NEQ CSCN_FACILITY_DIRECTION_OUT )
+            continue; /* settings for source don't match, advance to next source */
+          break;
+
+        default:
+          continue; /* illegal setting, advance to next source */
+      }
+      R_AT( RAT_CCCN, tSrc )( tDirection, cId, fie );
+    }
+  }
+  return( AT_CMPL );
+}
+
+/*==== EOF ========================================================*/
+