diff src/g23m-gprs/grr/grr_ctrls.c @ 183:219afcfc6250

src/g23m-gprs: initial import from TCS3.2/LoCosto
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 13 Oct 2016 04:24:13 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/g23m-gprs/grr/grr_ctrls.c	Thu Oct 13 04:24:13 2016 +0000
@@ -0,0 +1,1840 @@
+/* 
++----------------------------------------------------------------------------- 
+|  Project :  GPRS (8441)
+|  Modul   :  GRR
++----------------------------------------------------------------------------- 
+|  Copyright 2002 Texas Instruments Berlin, AG 
+|                 All rights reserved. 
+| 
+|                 This file is confidential and a trade secret of Texas 
+|                 Instruments Berlin, AG 
+|                 The receipt of or possession of this file does not convey 
+|                 any rights to reproduce or disclose its contents or to 
+|                 manufacture, use, or sell anything it may describe, in 
+|                 whole, or in part, without the specific written consent of 
+|                 Texas Instruments Berlin, AG. 
++----------------------------------------------------------------------------- 
+|  Purpose :  This module implements signal handler functions for service
+|             CTRL of entity GRR.
++----------------------------------------------------------------------------- 
+*/ 
+
+#ifndef GRR_CTRLS_C
+#define GRR_CTRLS_C
+#endif
+
+#define ENTITY_GRR
+
+/*==== INCLUDES =============================================================*/
+
+#include "typedefs.h"    /* to get Condat data types */
+
+#include "vsi.h"        /* to get a lot of macros */
+#include "macdef.h"
+#include "gprs.h"
+#include "gsm.h"        /* to get a lot of macros */
+#include "ccdapi.h"     /* to get CCD API */
+#include "cnf_grr.h"    /* to get cnf-definitions */
+#include "mon_grr.h"    /* to get mon-definitions */
+#include "prim.h"       /* to get the definitions of used SAP and directions */
+#include "message.h"
+#include "grr.h"        /* to get the global entity definitions */
+
+#include "grr_f.h"      /* */
+
+#include "grr_ctrlf.h"  /* */
+#include "grr_ctrls.h"  /* */
+
+#include "grr_psis.h"   /* */
+#include "grr_pgs.h"    /* */
+#include "grr_css.h"    /* */
+#include "grr_meass.h"  /* to get the signals for interference measurements */
+#include "grr_tcs.h"    /* */
+
+#include <string.h>     /* for memcpy*/
+
+/*==== CONST ================================================================*/
+
+/*==== LOCAL VARS ===========================================================*/
+
+/*==== PRIVATE FUNCTIONS ====================================================*/
+
+/*==== PUBLIC FUNCTIONS =====================================================*/
+/*
++------------------------------------------------------------------------------
+| Function    : sig_tc_ctrl_set_pckt_mode
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_TC_CTRL_SET_PCKT_MODE
+|
+| Parameters  : 
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_tc_ctrl_set_pckt_mode 
+                              ( T_GLBL_PCKT_MODE final_pckt_mode, UBYTE param )
+{
+  TRACE_ISIG( "sig_tc_ctrl_set_pckt_mode" );
+
+  switch( GET_STATE( CTRL ) )
+  {
+    case CTRL_ACCESS_DISABLED:
+    case CTRL_READY_TO_PROGRESS:
+    case CTRL_IN_PROGRESS:
+    case CTRL_WAIT_RSP_4_RR_CR:
+    case CTRL_WAIT_FOR_CNF_OF_SUSPENSION:
+    case CTRL_CR:
+    case CTRL_CR_IN_SUSP:
+    case CTRL_GRR_NC_CCO:
+    case CTRL_READY:
+      ctrl_stop_rr_task_req( final_pckt_mode, param );
+      break;
+    default:
+      TRACE_ERROR( "sig_tc_ctrl_set_pckt_mode unexpected" );
+      break;
+  }
+} /* sig_tc_ctrl_set_pckt_mode() */
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_tc_ctrl_prepare_abnorm_rel_with_cr
++------------------------------------------------------------------------------
+| Description : Handles the signal SIG_TC_CTRL_PREPARE_ABNORM_REL_WITH_CR
+|
+| Parameters  : void
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_tc_ctrl_prepare_abnorm_rel_with_cr ( void )
+{
+  TRACE_ISIG( "sig_tc_ctrl_prepare_abnorm_rel_with_cr" );
+
+  switch( GET_STATE( CTRL ) )
+  {
+    case CTRL_IN_PROGRESS:
+      ctrl_send_access_disable_if_needed
+                         ( TC_DC_CR_ABNORMAL, sig_tc_ctrl_abnorm_rel_with_cr );
+      break;
+
+    default:
+      TRACE_ERROR( "SIG_TC_CTRL_PREPARE_ABNORM_REL_WITH_CR unexpected" );
+      break;
+  }
+} /* sig_tc_ctrl_prepare_abnorm_rel_with_cr() */
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_tc_ctrl_abnorm_rel_with_cr
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_TC_CTRL_ABNORM_REL_WITH_CR
+|
+| Parameters  : void
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_tc_ctrl_abnorm_rel_with_cr ( void )
+{
+  TRACE_ISIG( "sig_tc_ctrl_abnorm_rel_with_cr" );
+
+  switch( GET_STATE( CTRL ) )
+  {
+    case CTRL_IN_PROGRESS:
+      sig_ctrl_cs_reselect( CS_RESELECT_CAUSE_CTRL_ABNORMAL );
+      break;
+
+    default:
+      TRACE_ERROR( "SIG_TC_CTRL_ABNORM_REL_WITH_CR unexpected" );
+      break;
+  }
+} /* sig_tc_ctrl_abnorm_rel_with_cr() */
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_tc_ctrl_channel_req
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_TC_CTRL_CHANNEL_REQ  
+|
+|               SZML-CTRL/002
+|
+| Parameters  : void
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_tc_ctrl_channel_req ( UBYTE channel_req)
+{
+  TRACE_ISIG( "sig_tc_ctrl_channel_req" );
+  switch( GET_STATE( CTRL ) )
+  {
+    case CTRL_IN_PROGRESS:
+    case CTRL_GRR_NC_CCO:
+      {
+        PALLOC(rrgrr_channel_req, RRGRR_CHANNEL_REQ);
+        rrgrr_channel_req->req_data = channel_req;
+        PSEND(hCommRR, rrgrr_channel_req);
+      }
+      break;
+    default:
+      TRACE_ERROR( "SIG_TC_CTRL_CHANNEL_REQ unexpected" );
+      break;
+  }
+} /* sig_tc_ctrl_channel_req() */
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_tc_ctrl_t3172_running
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_TC_CTRL_T3172_RUNNING
+|
+| Parameters  : void
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_tc_ctrl_t3172_running ( void )
+{
+  TRACE_ISIG( "sig_tc_ctrl_t3172_running" );
+  switch( GET_STATE( CTRL ) )
+  {
+    case CTRL_IN_PROGRESS:
+    case CTRL_GRR_NC_CCO:
+      sig_ctrl_pg_t3172_run();
+      break;
+    default:
+      TRACE_ERROR( "SIG_TC_CTRL_T3172_RUNNING unexpected" );
+      break;
+  }
+} /* sig_tc_ctrl_t3172_running() */
+
+
+
+
+
+
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_pg_ctrl_downlink_transfer
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_PG_CTRL_DOWNLINK_TRANSFER
+|
+| Parameters  : ULONG pg_tlli
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_pg_ctrl_downlink_transfer ( UBYTE page_id)
+{
+  TRACE_ISIG( "sig_pg_ctrl_downlink_transfer" );
+
+  switch( GET_STATE( CTRL ) )
+  {
+    case CTRL_IN_PROGRESS:
+      {
+        PALLOC(gmmrr_page_ind, GMMRR_PAGE_IND);
+        gmmrr_page_ind->page_id = page_id;
+        PSEND(hCommGMM,gmmrr_page_ind);
+      }
+      break;
+    default:
+      TRACE_ERROR( "SIG_PG_CTRL_DOWNLINK_TRANSFER unexpected" );
+      break;
+  }
+} /* sig_pg_ctrl_downlink_transfer() */
+
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_pg_ctrl_rr_est_req
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_PG_CTRL_RR_EST_REQ
+|
+| Parameters  : void
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_pg_ctrl_rr_est_req ( PG_CHANNEL type)
+{
+  UBYTE state = GET_STATE( CTRL );
+
+  TRACE_ISIG( "sig_pg_ctrl_rr_est_req" );
+
+  grr_data->ctrl.cs_page_channel = type;
+
+  switch( state )
+  {
+    case CTRL_READY:
+    case CTRL_IN_PROGRESS:
+      /*
+       * To pass CS page request to GMM
+       */
+      SET_STATE(CTRL, CTRL_WAIT_CS_PAGE_RES);
+
+      ctrl_handle_gmmrr_cs_page_ind( state );
+      break;
+    default:
+      TRACE_ERROR( "SIG_PG_CTRL_RR_EST_REQ unexpected" );
+      break;
+  }
+} /* sig_pg_ctrl_rr_est_req() */
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_psi_ctrl_si13_processed
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_PSI_CTRL_SI13_PROCESSED
+|
+| Parameters  : void
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_psi_ctrl_si13_processed ( void )
+{
+  UBYTE state = GET_STATE( CTRL );
+
+  TRACE_ISIG( "sig_psi_ctrl_si13_processed" );
+
+  switch( state )
+  {
+    case CTRL_READY:
+    case CTRL_READY_TO_PROGRESS:
+    case CTRL_ACCESS_DISABLED:
+    case CTRL_CR:
+    case CTRL_CR_IN_SUSP:
+    case CTRL_AUTO_RR_CR: 
+    case CTRL_RR_CR_IN_SUSP:
+    case CTRL_RR_NC_CCO:
+    case CTRL_GRR_NC_CCO:
+      if( grr_is_pbcch_present( ) )
+      {
+        if( state EQ CTRL_READY )
+        {
+          SET_STATE( CTRL, CTRL_READY_TO_PROGRESS );
+        }
+        ctrl_stop_rr_task_req( GLBL_PCKT_MODE_IDLE, TASK_STOP_DUMMY_VALUE );
+      }
+      else
+      {
+        ctrl_send_cell_reselection_req( CR_COMPLETE );
+        if( state EQ CTRL_READY )
+        {          
+          ctrl_stop_rr_task_req( GLBL_PCKT_MODE_IDLE, TASK_STOP_DUMMY_VALUE );
+
+          SET_STATE( CTRL, CTRL_IN_PROGRESS );
+        }
+        else if( state EQ CTRL_ACCESS_DISABLED     OR
+                 state EQ CTRL_READY_TO_PROGRESS )
+
+        {
+          SET_STATE( CTRL, CTRL_IN_PROGRESS );
+        }
+      }
+      break;
+
+    default:
+      TRACE_ERROR( "SIG_PSI_CTRL_SI13_PROCESSED unexpected" );
+      break;
+  }
+} /* sig_psi_ctrl_si13_processed() */
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_psi_ctrl_access_enabled
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_PSI_CTRL_ACCESS_ENABLED
+|
+| Parameters  :
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_psi_ctrl_access_enabled ( void )
+{
+  BOOL  send_cr_complete = FALSE;
+  UBYTE final            = FALSE;
+
+  TRACE_ISIG( "sig_psi_ctrl_access_enabled" );
+  
+  switch( GET_STATE( CTRL ) )
+  {
+    case CTRL_RR_CR_IN_SUSP:
+      /*
+       * enable cell after resume
+       */
+      SET_STATE(CTRL, CTRL_ACC_ENABLED_SUSP);
+      if(grr_is_pbcch_present())
+      {
+        /*
+         * to stop CCCH after resume
+         */
+        grr_data->ctrl.rr_state.monitoring_stopped = FALSE;
+      }
+      ctrl_send_cell_reselection_req( CR_COMPLETE );
+      
+      sig_ctrl_psi_suspend( );
+      break;
+    case CTRL_CR:
+    case CTRL_CR_IN_SUSP:
+    case CTRL_READY_TO_PROGRESS:
+      final = TRUE;
+      
+      /*lint -fallthrough*/
+
+    case CTRL_RR_NC_CCO:
+    case CTRL_GRR_NC_CCO:
+    case CTRL_AUTO_RR_CR:
+    case CTRL_ACCESS_DISABLED:
+      send_cr_complete = TRUE;
+      if(( GET_STATE( CTRL ) NEQ CTRL_RR_NC_CCO ) AND (GET_STATE( CTRL ) NEQ CTRL_GRR_NC_CCO))
+      {
+        SET_STATE( CTRL, CTRL_IN_PROGRESS );
+      }
+
+      /*lint -fallthrough*/
+
+    case CTRL_IN_PROGRESS:
+      ctrl_enable_serving_cell( final );
+
+      if( send_cr_complete EQ TRUE )
+      {
+        ctrl_send_cell_reselection_req( CR_COMPLETE );
+      }
+      break;    
+
+    default:
+      TRACE_ERROR( "SIG_PSI_CTRL_ACCESS_ENABLED unexpected" );
+      break;
+  }
+} /* sig_psi_ctrl_access_enabled() */
+
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_psi_ctrl_access_disabled
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_PSI_CTRL_ACCESS_DISABLED
+|
+| Parameters  : void
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_psi_ctrl_access_disabled ( T_PSI_DISABLE_CAUSE dc )
+{
+  UBYTE state = GET_STATE( CTRL );
+
+  TRACE_ISIG( "sig_psi_ctrl_access_disabled" );
+
+  switch( state )
+  {
+    case CTRL_IN_PROGRESS:
+      SET_STATE(CTRL, CTRL_ACCESS_DISABLED);
+          
+      /*lint -fallthrough*/
+
+    case CTRL_RR_NC_CCO:
+    case CTRL_GRR_NC_CCO:
+      
+      switch(dc)
+      {
+        case PSI_DC_PBCCH_RELEASED:
+          TRACE_EVENT( "PBCCH switched off" );
+
+          sig_ctrl_cs_reselect( CS_RESELECT_CAUSE_CTRL_SCELL );
+          break;
+        case PSI_DC_PBCCH_ESTABLISHED:
+          TRACE_EVENT( "PBCCH switched on" );
+
+          grr_data->ctrl.psi_tbf_rel_cause = CTRL_PTRC_PBCCH_ESTABLISHED;
+
+          ctrl_stop_all_activities( CTRL_DC_PSI_MANAGEMENT, NULL );
+          break;
+         case PSI_DC_READ_PSI:
+          grr_data->ctrl.psi_tbf_rel_cause = CTRL_PTRC_COMPLETE_PSI_READING;
+
+          ctrl_stop_all_activities( CTRL_DC_PSI_MANAGEMENT, NULL );
+          break;
+         case PSI_DC_OTHER:
+          grr_data->ctrl.psi_tbf_rel_cause = CTRL_PTRC_COMPLETE_SI_READING;
+
+          ctrl_stop_all_activities( CTRL_DC_PSI_MANAGEMENT, NULL );
+          break;
+        default:
+          break;
+      }
+      break;
+    case CTRL_AUTO_RR_CR:
+    case CTRL_RR_CR_IN_SUSP:
+      /*
+       * RR has to continue CR
+       */
+      ctrl_send_cell_reselection_req( CR_CONT );
+      break;
+    case CTRL_CR:
+    case CTRL_CR_IN_SUSP:
+      SET_STATE_FAILED_CR( state );
+      ctrl_cc_rejected( );
+      break;  
+    default:
+      TRACE_ERROR( "SIG_PSI_CTRL_ACCESS_DISABLED unexpected" );
+      break;
+  }
+} /* sig_psi_ctrl_access_disabled() */
+
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_psi_ctrl_psi1or_psi13_receiption_failure
++------------------------------------------------------------------------------
+| Description : Handles the internal signal 
+|               SIG_PSI_CTRL_PSI1OR_PSI13_RECEIPTION_FAILURE
+|
+| Parameters  : void
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_psi_ctrl_psi1or_psi13_receiption_failure ( void )
+{
+  TRACE_ISIG( "sig_psi_ctrl_psi1or_psi13_receiption_failure" );
+  
+  ctrl_failure_processing( FAIL_SIG_PSI1OR_PSI13_RECEIPTION_FAILURE );
+} /* sig_psi_ctrl_psi1or_psi13_receiption_failure() */
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_psi_ctrl_read_si
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_PSI_CTRL_READ_SI: it sends a
+|               request to RR to read some special SI message. This signal is used
+|               in case of acquisition
+|
+| Parameters  : void
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_psi_ctrl_read_si ( UBYTE si_to_read )
+{
+  TRACE_ISIG( "sig_psi_ctrl_read_si" );
+  switch( GET_STATE( CTRL ) )
+  {
+    case CTRL_ACCESS_DISABLED:
+    case CTRL_READY_TO_PROGRESS:
+    case CTRL_IN_PROGRESS:
+      ctrl_start_monitoring_bcch( si_to_read );
+      break;
+    default:
+      TRACE_ERROR( "SIG_PSI_CTRL_READ_SI unexpected" );
+      break;
+  }
+} /* sig_psi_ctrl_read_si() */
+
+
+
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_meas_ctrl_meas_report
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_MEAS_CTRL_MEAS_REPORT
+|
+| Parameters  : T_U_MEAS_REPORT *meas_report
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_meas_ctrl_meas_report ( T_U_MEAS_REPORT *meas_report)
+{
+  TRACE_ISIG( "sig_meas_ctrl_meas_report" );
+
+  switch( GET_STATE( CTRL ) )
+  {
+    case CTRL_IN_PROGRESS:
+      ctrl_send_control_block( CGRLC_BLK_OWNER_MEAS, (void*)meas_report );
+      break;
+    default:
+      sig_ctrl_meas_pmr_reject( );
+
+      TRACE_ERROR( "SIG_MEAS_CTRL_MEAS_REPORT unexpected" );
+      break;
+  }
+} /* sig_meas_ctrl_meas_report() */
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_cs_ctrl_meas_report
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_CS_CTRL_MEAS_REPORT
+|
+| Parameters  : T_U_MEAS_REPORT *meas_report
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_cs_ctrl_meas_report ( T_U_MEAS_REPORT *meas_report)
+{
+  TRACE_ISIG( "sig_cs_ctrl_meas_report" );
+
+  switch( GET_STATE( CTRL ) )
+  {
+    case CTRL_IN_PROGRESS:
+    case CTRL_GRR_NC_CCO:
+      ctrl_send_control_block( CGRLC_BLK_OWNER_CS, (void*)meas_report );
+      break;
+    default:
+      sig_ctrl_cs_pmr_reject( );
+
+      TRACE_ERROR( "SIG_CS_CTRL_MEAS_REPORT unexpected" );
+      break;
+  }
+} /* sig_cs_ctrl_meas_report() */
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_cs_ctrl_cancel_meas_report
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_CS_CTRL_CANCEL_MEAS_REPORT
+|
+| Parameters  : void
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_cs_ctrl_cancel_meas_report ( void )
+{
+  TRACE_ISIG( "sig_cs_ctrl_cancel_meas_report" );
+
+  ctrl_cancel_control_block( CGRLC_BLK_OWNER_CS );
+
+} /* sig_cs_ctrl_cancel_meas_report() */
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_psi_ctrl_access_barred
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_PSI_CTRL_ACCESS_BARRED
+|
+| Parameters  : void
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_psi_ctrl_access_barred ( void )
+{
+  TRACE_ISIG( "sig_psi_ctrl_access_barred" );
+
+  ctrl_failure_processing( FAIL_SIG_CTRL_ACCESS_BARRED );
+}/* sig_psi_ctrl_access_barred*/
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_pg_ctrl_stop_mon_ccch
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_PG_CTRL_STOP_MON_CCCH: it stops the
+|               CCCH monitoring process in RR
+|
+| Parameters  : void
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_pg_ctrl_stop_mon_ccch(void)
+{
+  TRACE_ISIG( "sig_pg_ctrl_stop_mon_ccch" );
+  switch( GET_STATE( CTRL ) )
+  {
+    case CTRL_IN_PROGRESS:
+    case CTRL_GRR_NC_CCO:
+      ctrl_stop_monitoring_ccch();
+      break;
+    default:
+      TRACE_ERROR( "SIG_PG_CTRL_STOP_MON_CCCH unexpected" );
+      break;
+  }
+}/* sig_pg_ctrl_stop_mon_ccch*/
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_pg_ctrl_start_mon_ccch
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_PG_CTRL_START_MON_CCCH: it starts the
+|               CCCH monitoring process in RR
+|
+| Parameters  : void
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_pg_ctrl_start_mon_ccch(UBYTE pg_type)
+{
+  TRACE_ISIG( "sig_pg_ctrl_start_mon_ccch" );
+  switch( GET_STATE( CTRL ) )
+  {
+    case CTRL_IN_PROGRESS:
+    case CTRL_GRR_NC_CCO:
+      switch(pg_type)
+      {
+        case PAG_MODE_PTM_NP:
+        case PAG_MODE_PIM_NP:
+          /*
+           * use PTM_NP or PIM_NP
+           */
+          ctrl_start_monitoring_ccch(pg_type);
+          break;
+        default:
+          if(grr_is_non_drx_period())
+          {
+            /*
+             * RR continue with paging reorg
+             */
+            ctrl_start_monitoring_ccch(PAG_MODE_REORG);
+          }
+          else
+          {
+            /*
+             * RR continue with default paging
+             */
+            ctrl_start_monitoring_ccch(pg_type);
+          }
+          break;
+      }
+      break;
+    default:
+      TRACE_ERROR( "SIG_PG_CTRL_START_MON_CCCH unexpected" );
+      break;
+  }
+}/* sig_pg_ctrl_start_mon_ccch*/
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_tc_ctrl_suspend_cnf
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_TC_CTRL_SUSPEND_CNF:
+|               GRR is suspended
+| Parameters  : void
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_tc_ctrl_suspend_cnf(void)
+{
+  TRACE_ISIG( "sig_tc_ctrl_suspend_cnf" );
+  switch( GET_STATE( CTRL ) )
+  {
+    case CTRL_WAIT_FOR_CNF_OF_SUSPENSION:
+      SET_STATE(CTRL, CTRL_SUSPENDED);
+      ctrl_stop_rr_task_req( GLBL_PCKT_MODE_SUSP, TASK_STOP_DUMMY_VALUE );
+      psc_db->is_access_enabled = FALSE; /* at this point , we do not have any GPRS access*/
+      switch(grr_data->ctrl.after_suspension)
+      {
+        case ACTIVATE_RR:
+          {
+            /*  activate RR. We have to check whether we have non-GPRS access parameters or not.
+             *  Non-GPRS parameters are present in case of PCCCH presence
+             *  GRR has to inform RR whether it should send GPRS Suspension request or not
+             */
+            PALLOC(rrgrr_activate_req, RRGRR_ACTIVATE_REQ);
+
+            /*  Suspension needed*/
+            rrgrr_activate_req->susp_req = grr_data->ctrl.is_susp_needed;
+            if(grr_is_pbcch_present() AND (psc_db->v_non_gprs_opt EQ TRUE))
+            {
+              /*  There is valid non-GPRS parameters present in the database, so we have to send
+               *  it to RR to allow a fast access to the network
+               */
+              rrgrr_activate_req->non_gprs.v_non_gprs = TRUE;
+              ctrl_copy_non_gprs_opt(&rrgrr_activate_req->non_gprs);
+            }
+            else
+              rrgrr_activate_req->non_gprs.v_non_gprs = FALSE;
+            /*
+             * SZML-CTRL/004
+             */
+            rrgrr_activate_req->rac = psc_db->cell_info_for_gmm.cell_info.cell_env.rai.rac;
+
+            PSEND(hCommRR, rrgrr_activate_req);
+          }
+
+          ctrl_send_gmmrr_suspend_cnf( );
+          break;
+        case SEND_RR_EST_REQ:
+          /*  */
+          ctrl_send_rr_est_req(grr_data->ctrl.is_susp_needed);
+          break;
+        case SEND_RR_EST_RSP:
+          ctrl_send_rr_est_rsp(grr_data->ctrl.is_susp_needed,
+                                          TRUE  /* CS_PAGE was accepted*/);
+
+          break;
+      }
+      break;
+    default:
+      TRACE_ERROR( "SIG_TC_CTRL_SUSPEND_CNF unexpected" );
+      break;
+  }
+}/* sig_tc_ctrl_suspend_cnf*/
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_tc_ctrl_dcch_data_req
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_TC_CTRL_DCCH_DATA_REQ
+|
+| Parameters  : rrgrr_data_req-pointer to primitive which includes the data
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_tc_ctrl_dcch_data_req(T_RRGRR_DATA_REQ * rrgrr_data_req_i )
+{
+  TRACE_ISIG( "sig_tc_ctrl_dcch_data_req" );
+  switch( GET_STATE( CTRL ) )
+  {
+    case CTRL_IN_PROGRESS:
+      {
+        PSEND(hCommRR,rrgrr_data_req_i);
+      }
+      break;
+    default:
+      TRACE_ERROR( "sig_tc_ctrl_dcch_data_req unexpected" );
+      break;
+  }
+}/* sig_tc_ctrl_dcch_data_req */
+
+
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_ctrl_tc_gprs_data_req
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_CTRL_TC_GPRS_DATA_REQ
+|
+| Parameters  : rrgrr_gprs_data_req-pointer to primitive which includes the data
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_tc_ctrl_gprs_data_req(T_RRGRR_GPRS_DATA_REQ *rrgrr_gprs_data_req_i)
+{
+  TRACE_ISIG( "sig_tc_ctrl_gprs_data_req" );
+  switch( GET_STATE( CTRL ) )
+  {
+    case CTRL_IN_PROGRESS:
+    case CTRL_GRR_NC_CCO:
+      {
+        PSEND(hCommRR,rrgrr_gprs_data_req_i);
+      }
+      break;
+    default:
+      TRACE_ERROR( "sig_tc_ctrl_gprs_data_req unexpected" );
+      break;
+  }
+}/* sig_tc_ctrl_gprs_data_req*/
+
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_tc_ctrl_suspend_dedi_chan
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_TC_CTRL_SUSPEND_DEDICATED_CHANNEL
+|
+| Parameters  : void
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_tc_ctrl_suspend_dedi_chan(void)
+{
+  TRACE_ISIG( "sig_tc_ctrl_suspend_dedi_chan" );
+  switch( GET_STATE( CTRL ) )
+  {
+    case CTRL_IN_PROGRESS:
+      {
+        PALLOC(rrgrr_suspend_dcch_req, RRGRR_SUSPEND_DCCH_REQ);
+        PSEND(hCommRR, rrgrr_suspend_dcch_req);
+      }
+      break;
+    default:
+      TRACE_ERROR( "SIG_TC_CTRL_SUSPEND_DEDICATED_CHANNEL unexpected" );
+      break;
+  }
+}/* sig_tc_ctrl_suspend_dedi_chan*/
+
+
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_tc_ctrl_resume_dedi_chan
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_TC_CTRL_RESUME_DEDICATED_CHANNEL
+|
+| Parameters  : void
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_tc_ctrl_resume_dedi_chan(void)
+{
+  TRACE_ISIG( "sig_tc_ctrl_resume_dedi_chan" );
+  switch( GET_STATE( CTRL ) )
+  {
+    case CTRL_IN_PROGRESS:
+      ctrl_reinstall_old_scell_req( FALSE, RECONN_PROT_UNSPECIFIED );
+      break;
+    default:
+      TRACE_ERROR( "SIG_TC_CTRL_RESUME_DEDICATED_CHANNEL unexpected" );
+      break;
+  }
+}/* sig_tc_ctrl_resume_dedi_chan*/
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_tc_ctrl_contention_ok
++------------------------------------------------------------------------------
+| Description : Cell change ok
+|
+| Parameters  : void
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_tc_ctrl_contention_ok(void)
+{
+  TRACE_ISIG( "sig_tc_ctrl_contention_ok" );
+
+  switch( GET_STATE( CTRL ) )
+  {
+    case CTRL_GRR_NC_CCO:
+    case CTRL_IN_PROGRESS:
+      if( grr_data->cc_running )
+      {
+        vsi_t_stop( GRR_handle, T3134 );
+
+        grr_data->cc_running = FALSE;
+
+        ctrl_install_new_scell( );
+
+        {
+          PALLOC( rrgrr_resumed_tbf_req, RRGRR_RESUMED_TBF_REQ );
+          PSEND( hCommRR, rrgrr_resumed_tbf_req );
+        }
+      }
+
+      if( grr_t_status( T3174 ) > 0 )
+      {
+        SET_STATE( CTRL, CTRL_IN_PROGRESS );
+        ctrl_stop_T3174( );
+        ctrl_install_new_scell( );
+#if defined (REL99) AND defined (TI_PS_FF_EMR)
+        grr_init_nc_list(&pcr_db->nc_cw.list );
+        grr_init_ba_bcch_nc_list(pcr_db);
+#endif
+      }
+      break;
+    default:
+      TRACE_ERROR( "sig_tc_ctrl_contention_ok unexpected" );
+      break;
+  }
+}/* sig_tc_ctrl_contention_ok()*/
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_tc_ctrl_contention_failure
++------------------------------------------------------------------------------
+| Description : Cell reselection has failled because of different 
+| of contention resolution sending by the MS in RLC and received uplink assigment
+|
+| Parameters  : void
+|
++------------------------------------------------------------------------------
+*/
+
+GLOBAL void sig_tc_ctrl_contention_failure()
+{
+  TRACE_ISIG( "sig_tc_ctrl_contention_failure" );
+  switch( GET_STATE( CTRL ) )
+  {
+    case CTRL_GRR_NC_CCO:
+      ctrl_stop_T3174();  
+      TRACE_EVENT("ctrl_cell_change_order:No response on target cell");
+      grr_data->pcco_failure_cause   = 1;
+      ctrl_pcco_failure();
+      break;
+    default:
+      TRACE_ERROR( "sig_tc_contention_failure unexpected" );
+      break;
+  }
+}  /*sig_tc_ctrl_contention_failure*/
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_tc_ctrl_access_reject_on_new_cell
++------------------------------------------------------------------------------
+| Description : Handles the internal signal ACCESS_REJECT_ON_NEW_CELL
+|
+| Parameters  : void
+|
++------------------------------------------------------------------------------
+*/
+
+GLOBAL void sig_tc_ctrl_access_reject_on_new_cell(void)
+{
+  TRACE_ISIG( "sig_tc_ctrl_access_reject_on_new_cell" );
+
+  ctrl_stop_T3174();
+  ctrl_pcco_failure();
+
+} /*sig_tc_ctrl_access_reject_on_new_cell*/
+
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_cs_ctrl_new_candidate
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_CS_CTRL_NEW_CANDIDATE
+|               This signal indicates that the CS service has detected
+|               a new cell candidate for a cell reselection
+|
+| Parameters  : 
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_cs_ctrl_new_candidate( T_CS_RESELECT_CAUSE reselect_cause )
+{
+  TRACE_ISIG( "sig_cs_ctrl_new_candidate" );
+
+  switch( GET_STATE( CTRL ) )
+  {
+    case CTRL_READY:
+    case CTRL_ACCESS_DISABLED:
+    case CTRL_READY_TO_PROGRESS:
+    case CTRL_IN_PROGRESS:
+      {
+        SET_STATE( CTRL, CTRL_CR );
+
+        if( reselect_cause EQ CS_RESELECT_CAUSE_CTRL_ABNORMAL )
+        {
+          ctrl_stop_all_activities( CTRL_DC_CR_MS_GRR_ABNORMAL, NULL );
+        }
+        else
+        {
+          ctrl_stop_all_activities( CTRL_DC_CR_MS_GRR_NORMAL, NULL );
+        }
+      }
+      break;  
+    case CTRL_CR_IN_SUSP:
+    case CTRL_FAILED_CR_IN_SUSP:
+      ctrl_stop_all_activities( CTRL_DC_OTHER, NULL );
+      
+      /*lint -fallthrough*/
+    
+    case CTRL_CR:
+    case CTRL_FAILED_CR:
+    case CTRL_GRR_NC_CCO:
+      ctrl_handle_new_candidate( FALSE );
+      break;
+    default:
+      TRACE_ERROR( "SIG_CS_CTRL_NEW_CANDIDATE unexpected" );
+      break;
+  }
+}/* sig_cs_ctrl_new_candidate*/
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_psi_ctrl_ncell_param_valid
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_PSI_CTRL_NCELL_PARAM_VALID
+|
+| Parameters  :
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_psi_ctrl_ncell_param_valid ( void )
+{
+  TRACE_ISIG( "sig_psi_ctrl_ncell_param_valid" );
+
+  switch( GET_STATE( CTRL ) )
+  {
+    case CTRL_IN_PROGRESS: 
+#if defined (REL99) AND defined (TI_PS_FF_EMR)
+      psc_db->nc_ms.ncmeas.list.number=0;
+      psc_db->nc_ms.rfreq.number = 0; 
+      /*This is called to reset the only Freq List from PMO as BA(GPRS) is changed.
+        Spec 5.08 - sec 10.1.4.1
+        The list is valid until an empty list is sent to the MS, there is a downlink 
+        signalling failure or the MS selects a new cell or the BA(GPRS) that is modified 
+        by the NC_FREQUENCY_LIST changes or the MS enters dedicated mode
+  
+        The individual parameters are valid until the RESET command is sent to the MS or 
+        there is a downlink signalling failure or the MS goes to the Standby state or the
+        MS enters dedicated mode*/
+        /*NO BREAK */
+#endif 
+	  /*lint -fallthrough*/
+    case CTRL_GRR_NC_CCO: 
+      if( grr_data->is_pg_started )
+
+      {
+        sig_ctrl_cs_start();
+      }
+      break; 
+    default:
+      /* ignore */
+      break; 
+  }
+} /* sig_psi_ctrl_ncell_param_valid() */
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_psi_ctrl_ncell_param_invalid
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_PSI_CTRL_NCELL_PARAM_INVALID
+|
+| Parameters  :
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_psi_ctrl_ncell_param_invalid ( void )
+{
+  TRACE_ISIG( "sig_psi_ctrl_ncell_param_invalid" );
+
+  switch( GET_STATE( CTRL ) )
+  {
+    case CTRL_IN_PROGRESS:
+    case CTRL_GRR_NC_CCO:
+      sig_ctrl_cs_stop(CS_DC_OTHER);
+      break;
+    default:
+      /*ignore*/
+      break;
+  }
+} /* sig_psi_ctrl_ncell_param_invalid() */
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_psi_ctrl_access_changed
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_PSI_CTRL_ACCESS_CHANGED
+|
+| Parameters  :
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_psi_ctrl_access_changed ( void  )
+{
+  TRACE_ISIG( "sig_psi_ctrl_access_changed" );
+
+  switch( GET_STATE( CTRL ) )
+  {
+    case CTRL_IN_PROGRESS:
+      ctrl_send_cell_ind();
+      break;
+    default:
+      TRACE_ERROR( "SIG_PSI_CTRL_ACCESS_CHANGED unexpected" );
+      break;
+  }
+} /* sig_psi_ctrl_access_changed() */
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_psi_ctrl_ncell_psi_read
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_PSI_CTRL_NCELL_PSI_READ
+|
+|
+| Parameters  : BOOL read_successfully
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_psi_ctrl_ncell_psi_read( BOOL read_successfully)
+{
+  TRACE_ISIG( "sig_psi_ctrl_ncell_psi_read" );
+  switch( GET_STATE( CTRL ) )
+  {
+    case CTRL_CR:
+    case CTRL_CR_IN_SUSP:
+      if(read_successfully)
+      {
+        /*
+         * Inform RR and wait for positive indication of the cell reselection request
+         */
+        ctrl_send_cell_reselection_req( CR_COMPLETE );
+      }
+      else
+      {
+        ctrl_cc_rejected( );
+      }
+      break;
+    default:
+      TRACE_ERROR( "SIG_PSI_CTRL_NCELL_PSI_READ unexpected" );
+      break;
+  }
+}/* sig_psi_ctrl_ncell_psi_read*/
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_psi_ctrl_int_list_invalid
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_PSI_CTRL_INT_LIST_INVALID
+|
+|
+| Parameters  : void
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_psi_ctrl_int_list_invalid(void)
+{
+  TRACE_ISIG( "sig_psi_ctrl_int_list_invalid" );
+
+  switch( GET_STATE( CTRL ) )
+  {
+    case CTRL_IN_PROGRESS:
+      sig_ctrl_meas_int_list_invalid();
+      break;
+    default:
+      /*ignore*/
+      break;
+  }
+  
+}/* sig_psi_ctrl_int_list_invalid*/
+/*
++------------------------------------------------------------------------------
+| Function    : sig_psi_ctrl_int_list_valid
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_PSI_CTRL_INT_LIST_VALID
+|
+|
+| Parameters  : void
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_psi_ctrl_int_list_valid(void)
+{
+  TRACE_ISIG( "sig_psi_ctrl_int_list_valid" );
+  switch( GET_STATE( CTRL ) )
+  {
+    case CTRL_IN_PROGRESS:
+      if(grr_data->is_pg_started)
+        sig_ctrl_meas_int_list_valid();
+      break;
+    default:
+      /*ignore*/
+      break;
+  }
+}/* sig_psi_ctrl_int_list_valid*/
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_psi_ctrl_meas_param_invalid_psi5
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_PSI_CTRL_MEAS_PARAM_INVALID_PSI5
+|
+|
+| Parameters  : void
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_psi_ctrl_meas_param_invalid_psi5(void)
+{
+  TRACE_ISIG( "sig_psi_ctrl_meas_param_invalid_psi5" );
+  
+  switch( GET_STATE( CTRL ) )
+  {
+    case CTRL_IN_PROGRESS:
+      sig_ctrl_meas_ext_invalid_psi5();
+      sig_ctrl_cs_nc_param_invalid();
+      break;
+    default:
+      /*ignore*/
+      break;
+  }
+
+}/* sig_psi_ctrl_meas_param_invalid_psi5*/
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_psi_ctrl_meas_param_valid_psi5
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_PSI_CTRL_MEAS_PARAM_VALID_PSI5
+|
+|
+| Parameters  : void
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_psi_ctrl_meas_param_valid_psi5(void)
+{
+  TRACE_ISIG( "sig_psi_ctrl_meas_param_valid_psi5" );
+
+  switch( GET_STATE( CTRL ) )
+  {
+    case CTRL_IN_PROGRESS:
+      if(grr_data->is_pg_started)
+      {
+        sig_ctrl_meas_ext_valid_psi5();
+        sig_ctrl_cs_nc_param_valid();
+      }
+      break;
+    default:
+      /*ignore*/
+      break;
+  }
+}/* sig_psi_ctrl_meas_param_valid_psi5*/
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_psi_ctrl_meas_param_invalid_si13
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_PSI_CTRL_MEAS_PARAM_INVALID_SI13
+|
+| Parameters  : void
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_psi_ctrl_meas_param_invalid_si13( void )
+{
+  TRACE_ISIG( "sig_psi_ctrl_meas_param_invalid_si13" );
+  
+  switch( GET_STATE( CTRL ) )
+  {
+    case CTRL_IN_PROGRESS:
+      sig_ctrl_cs_nc_param_invalid( );
+      break;
+
+    default:
+      /* do nothing */
+      break;
+  }
+}/* sig_psi_ctrl_meas_param_invalid_si13 */
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_psi_ctrl_meas_param_valid_si13
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_PSI_CTRL_MEAS_PARAM_VALID_SI13
+|
+| Parameters  : void
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_psi_ctrl_meas_param_valid_si13( BOOL ba_bcch_changed )
+{
+  TRACE_ISIG( "sig_psi_ctrl_meas_param_valid_si13" );
+
+  switch( GET_STATE( CTRL ) )
+  {
+    case CTRL_IN_PROGRESS:
+      sig_ctrl_cs_nc_param_valid( );
+      sig_ctrl_tc_enable_grlc  (CGRLC_QUEUE_MODE_DEFAULT, CGRLC_RA_DEFAULT );
+
+      if( ba_bcch_changed EQ TRUE )
+      {
+        sig_ctrl_meas_ba_changed( );
+        sig_ctrl_cs_ba_changed( );
+      }
+      break;
+
+    default:
+      /* do nothing */
+      break;
+  }
+}/* sig_psi_ctrl_meas_param_valid_si13 */
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_psi_ctrl_new_pccch
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_PSI_CTRL_NEW_PCCCH
+|
+|
+| Parameters  : void
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_psi_ctrl_new_pccch(void)
+{
+  TRACE_ISIG( "sig_psi_ctrl_new_pccch" );
+
+  switch( GET_STATE( CTRL ) )
+  {
+    case CTRL_IN_PROGRESS:
+      if(grr_data->is_pg_started)
+      {
+        TRACE_EVENT("Restart PCCCH: Config may have changed");
+        sig_ctrl_pg_start();
+      }
+      break;
+    default:
+      TRACE_EVENT_P1( "NEW_PCCCH not handled in CTRL state: %d", grr_data->ctrl.state);
+      break;
+  }
+}/* sig_psi_ctrl_new_pccch*/
+
+#ifdef REL99
+/*
++------------------------------------------------------------------------------
+| Function    : sig_psi_ctrl_cbch_info_ind
++------------------------------------------------------------------------------
+| Description : This function gives the RRGRR_CBCH_INFO ind to RR.
+|               This would be called on success cell selection/reselection
+|               or when PSIs are completely acquired or when there is change
+|               in PSI2,PSI13 or PSI8 messages. 
+|               This primitive is sent to RR only when the mobile is in R99
+|               network.
+|               The CBCH channel description present in this primitive is in
+|               a form which could be used by MPH_* primitives in RR. 
+|               The frequency list is NOT in TI L1 form. When RR passes this
+|               information to ALR, it is converted to TI L1 FORMAT.
+| Parameters  : None.
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_psi_ctrl_cbch_info_ind()
+{
+  T_cbch *cbch_req = NULL;
+  PALLOC(rrgrr_cbch_info_ind, RRGRR_CBCH_INFO_IND);      
+  TRACE_ISIG( "sig_psi_ctrl_cbch_info_ind" );
+  
+  cbch_req = &(rrgrr_cbch_info_ind->cbch);
+  memset (cbch_req, 0, sizeof (T_cbch));
+
+  /* fill in cbch info from psc_db */
+  if(psc_db->v_cbch_chan_desc)
+  {
+    cbch_req->stat = STAT_ACT;   
+    cbch_req->ch = psc_db->cbch_chan_desc.chan_typ_tdma_offset;
+    cbch_req->tn   = psc_db->cbch_chan_desc.tn;
+    cbch_req->tsc = psc_db->cbch_chan_desc.freq_par.tsc;
+    /* If frequency encoding has indirect encoding/direct encoding 1
+     * /direct encoding 2, then hopping is used. Otherwise channel
+     * description describes a non-hopping channel.
+     * When none of the above three coding methods are used, arfcn choice
+     * should be set to true.Ref 3GPP 04.60 Section 12.8 
+     */
+    cbch_req->h = (psc_db->cbch_chan_desc.freq_par.v_arfcn)?H_NO:H_FREQ;
+    if(cbch_req->h)
+    {
+      /*
+       * CBCH uses frequency hopping, then configure MAIO and HSN
+       * and create a frequency hopping list from the cell allocation/
+       * PSI13/direct encoding 2 scheme and the mobile allocation
+       * stored in Frequency Parameters.
+       */
+      /* When hopping is allowed - hsn,maio and ma have to be filled. */
+      ctrl_fill_cbch_hopping_params(cbch_req,&psc_db->cbch_chan_desc.freq_par);
+    }
+    else
+    {
+      /* non hopping channel */
+      cbch_req->arfcn = psc_db->cbch_chan_desc.freq_par.arfcn;
+    }
+  }
+  else
+  {
+    cbch_req->stat = STAT_INACT;
+  }
+  PSEND(hCommRR,rrgrr_cbch_info_ind);
+} /* sig_psi_ctrl_cbch_info_ind */
+#endif
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_cs_ctrl_no_more_candidate
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_CS_CTRL_NO_MORE_CANDIDATE
+|               This signal indicates that the RR has to start a complete cell
+|               selection procedure
+|
+| Parameters  : void
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_cs_ctrl_no_more_candidate( T_CS_RESELECT_CAUSE reselect_cause )
+{
+  UBYTE state = GET_STATE( CTRL );
+
+  TRACE_ISIG( "sig_cs_ctrl_no_more_candidate" );
+
+  switch( state )
+  {
+    case CTRL_IN_PROGRESS:
+      if( reselect_cause EQ CS_RESELECT_CAUSE_CTRL_ABNORMAL )
+      {
+        ctrl_tc_access_enable( sig_ctrl_tc_abnorm_rel_with_cr_failed );
+      }
+      else
+      {
+        SET_STATE( CTRL, CTRL_READY );
+
+        ctrl_stop_all_activities( CTRL_DC_CR_MS_GRR_NORMAL, NULL );
+      }
+      break;
+
+    case CTRL_CR:
+    case CTRL_FAILED_CR:
+    case CTRL_CR_IN_SUSP:
+    case CTRL_FAILED_CR_IN_SUSP:
+
+      switch( reselect_cause )
+      {
+        case CS_RESELECT_CAUSE_CTRL_ABNORMAL:
+          SET_STATE( CTRL, CTRL_IN_PROGRESS );
+
+          grr_set_db_ptr( DB_MODE_CC_REJ );
+          ctrl_tc_access_enable( sig_ctrl_tc_abnorm_rel_with_cr_failed );
+          sig_ctrl_psi_resumpt( );
+          ctrl_enable_serving_cell( FALSE );
+          break;
+    
+        default:
+          SET_STATE( CTRL, CTRL_READY );
+
+          ctrl_stop_all_activities( CTRL_DC_CR_MS_GRR_NORMAL, NULL );
+          break;  
+      }
+      break;
+
+    case CTRL_ACCESS_DISABLED:
+    case CTRL_READY_TO_PROGRESS:
+      {
+        T_CTRL_CR_TYPE ctrl_cr_type;
+
+        ctrl_cr_type = ( reselect_cause EQ CS_RESELECT_CAUSE_CS_NORMAL ?
+                         CTRL_CR_TYPE_CS : CTRL_CR_TYPE_CONT             );
+        
+        ctrl_stop_all_activities( CTRL_DC_CR_MS_GRR_NORMAL, NULL );
+        ctrl_handle_no_more_candidate( ctrl_cr_type, FALSE );
+      }
+      break;
+
+    case CTRL_READY:
+    case CTRL_AUTO_RR_CR:
+    case CTRL_RR_CR_IN_SUSP:
+      ctrl_send_cell_reselection_req( CR_CONT );
+      break;
+
+    default:
+      TRACE_ERROR( "SIG_CS_CTRL_NO_MORE_CANDIDATE unexpected 2" );
+      break;
+  }
+}/* sig_cs_ctrl_no_more_candidate*/
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_tc_ctrl_cr_started_rsp
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_TC_CTRL_CR_STARTED_RSP
+|               This signal indicates that the service TC is ready for
+|               cell reselection, e.g. it stopped running procedures, controlled 
+|               the flow control etc.
+| Parameters  : void
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_tc_ctrl_cr_started_rsp( void )
+{
+  T_NC_MVAL *nc_mval;
+
+  TRACE_ISIG( "sig_tc_ctrl_cr_started_rsp" );
+
+  switch( GET_STATE( CTRL ) )
+  {
+    case CTRL_WAIT_RSP_4_RR_CR:
+      SET_STATE(CTRL, CTRL_AUTO_RR_CR);
+      /*
+       * Init PSI and psc_db parameters to be able to read/process new SI (PSI)
+       */
+      grr_prepare_db_for_new_cell();
+      ctrl_send_cell_reselection_req( CR_COMPLETE );
+      break;    
+    case CTRL_GRR_NC_CCO:
+    if(grr_t_status( T3176 ) > 0 )
+      {       
+        ctrl_start_cell_reselection( CTRL_CR_TYPE_NEW, TRUE );
+      }
+      else
+      {
+        TRACE_ASSERT( grr_data->db.cr_cell NEQ NULL );
+
+        nc_mval = &grr_data->db.nc_mval_list.nc_mval[grr_data->db.cr_cell->idx];
+
+        switch( nc_mval->sync_info.sync.status )
+        {
+          case( STAT_SYNC_OK ):
+            ctrl_start_cell_reselection( CTRL_CR_TYPE_NEW, TRUE );
+
+            TRACE_EVENT( "sig_tc_ctrl_cr_started_rsp: cell already known(sync ok!)" );
+            break;
+
+          case( STAT_SYNC_NONE ):
+            ctrl_start_cell_reselection( CTRL_CR_TYPE_NEW_NOT_SYNCED, TRUE );
+            break;
+
+          case( STAT_SYNC_FAILED ):
+          default:
+            /* stay in the serving cell */
+            break;
+        }
+      }
+      break;
+    case CTRL_CR:
+    case CTRL_CR_IN_SUSP:
+      ctrl_handle_new_candidate( TRUE );
+      break;
+
+    case CTRL_READY:
+      ctrl_handle_no_more_candidate( CTRL_CR_TYPE_CS, TRUE );
+      break;
+
+    case CTRL_RR_CR_IN_SUSP:
+      ctrl_send_cell_reselection_req( CR_COMPLETE );
+      break;
+
+    default:
+      sig_tc_ctrl_tbf_release_cnf( );
+      break;
+  }
+}/* sig_tc_ctrl_cr_started_rsp*/
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_tc_ctrl_tbf_release_cnf
++------------------------------------------------------------------------------
+| Description : 
+|
+| Parameters  : 
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_tc_ctrl_tbf_release_cnf ( void )
+{
+  TRACE_ISIG( "sig_tc_ctrl_tbf_release_cnf" );
+
+  switch( GET_STATE( CTRL ) )
+  {
+    case CTRL_ACCESS_DISABLED:
+    case CTRL_READY_TO_PROGRESS:
+      switch( grr_data->ctrl.psi_tbf_rel_cause )
+      {
+        case CTRL_PTRC_PBCCH_ESTABLISHED:
+          ctrl_start_monitoring_ccch( PAG_MODE_DEFAULT );
+          ctrl_start_monitoring_bcch( UPDATE_SI13 );
+          ctrl_stop_rr_task_req( GLBL_PCKT_MODE_NULL, TASK_STOP_DUMMY_VALUE );
+
+          grr_data->ctrl.rr_state.cr_ind_return = CR_IND_RETURN_COMPLETE;
+          break;
+
+        case CTRL_PTRC_COMPLETE_SI_READING:
+          ctrl_start_monitoring_ccch( PAG_MODE_DEFAULT );
+          ctrl_start_monitoring_bcch( COMPLETE_SI );
+          sig_ctrl_psi_access_disabled( PSI_DC_OTHER );
+          break;
+
+        case CTRL_PTRC_COMPLETE_PSI_READING:
+          sig_ctrl_psi_access_disabled( PSI_DC_READ_PSI );
+          break;
+      }
+
+      grr_data->ctrl.psi_tbf_rel_cause = CTRL_PTRC_NONE;
+      break;
+
+    default:
+      TRACE_ERROR( "SIG_TC_CTRL_TBF_RELEASE_CNF unexpected" );
+      break;
+  }
+}/* sig_tc_ctrl_tbf_release_cnf */
+
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_tc_ctrl_rel_state
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_TC_CTRL_REL_STATE
+|               This signal indicates that the service TC started or performed 
+|               tbf release
+| Parameters  : T_RELEASE_STATE rel_state
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_tc_ctrl_rel_state(T_RELEASE_STATE rel_state)
+{
+  TRACE_ISIG( "sig_tc_ctrl_rel_state" );
+
+  sig_ctrl_psi_rel_state(rel_state);
+
+}/* sig_tc_ctrl_rel_state*/
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_tc_ctrl_control_block_result
++------------------------------------------------------------------------------
+| Description : 
+|
+| Parameters  :
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_tc_ctrl_control_block_result
+                                     ( T_BLK_OWNER blk_owner, BOOL is_success )
+{
+  TRACE_ISIG( "sig_tc_ctrl_control_block_result" );
+  
+  ctrl_send_control_block_result( blk_owner, is_success );
+
+}/* sig_tc_ctrl_control_block_result */
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_tc_ctrl_send_stop_task_req
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_TC_CTRL_STOP_TASK_REQ
+|
+| Parameters  : 
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_tc_ctrl_send_stop_task_req( UBYTE v_stop_ccch  )
+{
+  TRACE_ISIG( "sig_tc_ctrl_send_stop_task_req" );
+  
+  switch( GET_STATE( CTRL ) )
+  {
+    case CTRL_IN_PROGRESS:
+    case CTRL_GRR_NC_CCO:
+      ctrl_send_rrgrr_stop_task_req( CTRL_TASK_BCCH, v_stop_ccch );
+      break;
+    default:
+      sig_ctrl_tc_stop_task_cnf_received( );      
+      TRACE_ERROR( "SIG_TC_CTRL_STOP_TASK_REQ unexpected" );
+      break;
+  }
+}/* sig_tc_ctrl_send_stop_task_req */
+
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_gfp_ctrl_cc_order
++------------------------------------------------------------------------------
+| Description : Handles the signal SIG_GFP_CTRL_CC_ORDER
+|
+| Parameters  : -
+|
++------------------------------------------------------------------------------
+*/
+#ifdef REL99
+GLOBAL void sig_gfp_ctrl_cc_order(T_TIME time_to_poll )
+#else
+GLOBAL void sig_gfp_ctrl_cc_order( void )
+#endif
+{
+  MCAST( d_cell_chan_order, D_CELL_CHAN_ORDER );
+  TRACE_ISIG( "sig_gfp_ctrl_cc_order" );
+  
+  switch( GET_STATE( CTRL ) )
+  {
+    case CTRL_IN_PROGRESS:
+
+      if (grr_data->nc2_on)
+      {
+#ifdef REL99
+        if(time_to_poll > 0)
+        {
+          vsi_t_start(GRR_handle, T_POLL_TIMER,time_to_poll);
+          memcpy(&grr_data->ctrl.pcco, d_cell_chan_order, sizeof(T_D_CELL_CHAN_ORDER));
+          grr_data->ctrl.poll_for_msg = GRR_PCCO_POLL;
+        }
+        else
+#endif
+        {
+          TRACE_EVENT( "PACKET CELL CHANGE ORDER RECEIVED" );
+
+          ctrl_cell_change_order
+                  ( CCO_TYPE_GRR, (void *)d_cell_chan_order );
+        }
+      }
+      else
+      {
+        TRACE_EVENT( "PACKET CELL CHANGE ORDER RECEIVED,but NC2 is deactivated" );
+      }
+
+      break;
+
+    default:
+      TRACE_ERROR( "SIG_GFP_CTRL_CC_ORDER unexpected" );
+      break;
+  }
+
+} /* sig_gfp_ctrl_cc_order() */
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_gfp_ctrl_dsf_ind
++------------------------------------------------------------------------------
+| Description : This signal indicates that a downlink signalling failure has 
+|               occured, we have to reselect a new cell
+| Parameters  : payload to primitive
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_gfp_ctrl_dsf_ind ( void )
+{
+  TRACE_ISIG( "sig_gfp_ctrl_dsf_ind" );
+  
+  /* A set of measurement reporting parameters (NETWORK_CONTROL_ORDER and 
+   * NC_REPORTING_PERIOD(s)) is broadcast on PBCCH. The parameters may also 
+   * be sent individually to an MS on PCCCH or PACCH, in which case it 
+   * overrides the broadcast parameters. The individual parameters are valid 
+   * until the RESET command is sent to the MS or there is a downlink 
+   * signalling failure or the MS goes to the Standby state or the MS enters 
+   * dedicated mode. */
+  sig_ctrl_cs_reset_meas_rep_params ( );
+
+  ctrl_failure_processing( FAIL_SIG_DSF_IND );
+
+}/* sig_gfp_ctrl_dsf_ind*/
+
+#if defined (REL99) AND defined (TI_PS_FF_EMR)
+/*
++------------------------------------------------------------------------------
+| Function    : sig_cs_ctrl_enh_meas_report
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_CS_CTRL_ENH_MEAS_REPORT
+|
+| Parameters  : T_U_ENHNC_MEAS_REPORT *enh_meas_report
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_cs_ctrl_enh_meas_report ( T_U_ENHNC_MEAS_REPORT *enh_meas_report)
+{
+  TRACE_ISIG( "sig_cs_ctrl_enh_meas_report" );
+
+  switch( GET_STATE( CTRL ) )
+  {
+    case CTRL_IN_PROGRESS:
+    case CTRL_GRR_NC_CCO:
+      ctrl_send_control_block( CGRLC_BLK_OWNER_CS, (void*)enh_meas_report );
+      break;
+    default:
+      TRACE_ERROR( "SIG_CS_CTRL_ENH_MEAS_REPORT unexpected" );
+      break;
+  }
+} /* sig_cs_ctrl_enh_meas_report() */
+#endif
+
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_tc_ctrl_test_mode_ind
++------------------------------------------------------------------------------
+| Description :  
+|                
+| Parameters  : 
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_tc_ctrl_test_mode_ind(void)
+{
+  TRACE_EVENT("sig_tc_ctrl_test_mode_ind");
+  if(grr_data->test_mode NEQ CGRLC_NO_TEST_MODE) 
+  {
+    ctrl_stop_monitoring_ccch();
+  }
+
+}