diff src/g23m-gprs/grr/grr_tcs.c @ 1:d393cd9bb723

src/g23m-*: initial import from Magnetite
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 15 Jul 2018 04:40:46 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/g23m-gprs/grr/grr_tcs.c	Sun Jul 15 04:40:46 2018 +0000
@@ -0,0 +1,3182 @@
+/* 
++----------------------------------------------------------------------------- 
+|  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
+|             TC of entity GRR.
++----------------------------------------------------------------------------- 
+*/ 
+
+#ifndef GRR_TCS_C
+#define GRR_TCS_C
+#endif
+
+#define ENTITY_GRR
+
+/*==== INCLUDES =============================================================*/
+
+#include <string.h>
+#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"    /* to get air message definitions */
+#include "grr.h"        /* to get the global entity definitions */
+#include "grr_f.h"      /* to get the global entity definitions */
+#include "grr_tcf.h"    /* to get the service TC procedure definitions */
+#include "grr_tcs.h"    /* to get the service TC signal definitions */
+#include "grr_ctrls.h"  /* to get the service CTRL signal definitions */
+#include "grr_cpaps.h"  /* to get the service CPAP signal definitions */
+#include "grr_meass.h"
+#include "grr_psif.h"   /* stop timers in Testmode A */
+#include "cl_rlcmac.h"
+
+/*==== CONST ================================================================*/
+
+/*==== DIAGNOSTICS ==========================================================*/
+
+/*==== LOCAL TYPES===========================================================*/
+
+LOCAL void tc_handle_new_cell ( BOOL cell_has_changed, UBYTE enable_cause );
+
+/*==== LOCAL VARS ===========================================================*/
+
+/*==== PRIVATE FUNCTIONS ====================================================*/
+/*
++------------------------------------------------------------------------------
+| Function    : tc_handle_new_cell
++------------------------------------------------------------------------------
+| Description : 
+|
+| Parameters  : 
+|
++------------------------------------------------------------------------------
+*/
+LOCAL void tc_handle_new_cell ( BOOL cell_has_changed, UBYTE enable_cause )
+{
+  UBYTE queue_mode;
+
+  TRACE_FUNCTION( "tc_handle_new_cell" );
+
+  if( cell_has_changed )
+  {
+    /* inform CPAP because it has to stop T3142 if running */
+    sig_tc_cpap_new_cell();
+
+    grr_data->ta_params.ta_valid = FALSE;
+  
+    TRACE_EVENT_P1( "tc_handle_new_cell: N3102 = %d", psc_db->gprs_cell_opt.pan_struct.pmax );
+  }
+
+  queue_mode = ( enable_cause EQ CGRLC_ENAC_NORMAL ? 
+                 CGRLC_QUEUE_MODE_GMM : CGRLC_QUEUE_MODE_LLC );
+  
+  tc_cgrlc_enable_req( queue_mode, 
+                       CGRLC_RA_DEFAULT, 
+                       cell_has_changed,
+                       enable_cause );
+} /* tc_handle_new_cell() */
+
+/*==== PUBLIC FUNCTIONS =====================================================*/
+/*
++------------------------------------------------------------------------------
+| Function    : tc_get_ctrl_blk
++------------------------------------------------------------------------------
+| Description : 
+|
+| Parameters  : 
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL UBYTE* tc_get_ctrl_blk ( UBYTE *index, BOOL unacknowledged )
+{ 
+  UBYTE *ctrl_blk;
+
+  TRACE_FUNCTION( "tc_get_ctrl_blk" );
+
+  ctrl_blk = tc_set_start_ctrl_blk( index );
+ 
+  if( unacknowledged )
+  {
+    /* 
+     * in case the control blocks are send by the service RU, we are 
+     * working in unacknowledged mode, so every block is transmitted 
+     * succesfully
+     */
+    tc_set_stop_ctrl_blk( TRUE, CGRLC_BLK_OWNER_NONE, 0 );
+  }
+  
+  return( ctrl_blk );
+
+} /* tc_get_ctrl_blk() */
+
+/*
++------------------------------------------------------------------------------
+| Function    : tc_is_ctrl_blk_rdy
++------------------------------------------------------------------------------
+| Description : 
+|
+| Parameters  : 
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL BOOL tc_is_ctrl_blk_rdy ( UBYTE ack_cnt_meas_rpt, UBYTE ack_cnt_other )
+{ 
+  BOOL        result    = FALSE;
+  T_BLK_INDEX blk_index = grr_data->tc.ul_ctrl_blk.seq[0];
+
+  TRACE_FUNCTION( "tc_is_ctrl_blk_rdy" );
+
+  if( blk_index NEQ MAX_CTRL_BLK_NUM )
+  {
+    switch( grr_data->tc.ul_ctrl_blk.blk[blk_index].owner )
+    {
+      case( CGRLC_BLK_OWNER_MEAS ):
+      case( CGRLC_BLK_OWNER_CS   ): result = ( ack_cnt_meas_rpt EQ 0 ); break;
+      default               : result = ( ack_cnt_other    EQ 0 ); break;
+    }
+  }
+  
+  return( result );
+
+} /* tc_is_ctrl_blk_rdy() */
+
+/*
++------------------------------------------------------------------------------
+| Function    : tc_get_num_ctrl_blck
++------------------------------------------------------------------------------
+| Description : This function returns the number of allocated control blocks.
+|
+| Parameters  : 
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL UBYTE tc_get_num_ctrl_blck ( void )
+{ 
+  UBYTE i   = 0; /* used for counting                  */
+  UBYTE num = 0; /* number of allocated control blocks */
+
+  TRACE_FUNCTION( "tc_get_num_ctrl_blck" );
+
+  while( i                               <   MAX_CTRL_BLK_NUM AND 
+         grr_data->tc.ul_ctrl_blk.seq[i] NEQ MAX_CTRL_BLK_NUM     )
+  {
+    if( grr_data->tc.ul_ctrl_blk.blk[grr_data->tc.ul_ctrl_blk.seq[i]].state
+                                                       EQ BLK_STATE_ALLOCATED )
+    {
+      num++;
+    }
+
+    i++;
+  }
+  
+  return( num );
+
+} /* tc_get_num_ctrl_blck() */
+
+/*
++------------------------------------------------------------------------------
+| Function    : tc_cpy_ctrl_blk_to_buffer
++------------------------------------------------------------------------------
+| Description : This function ...
+|
+| Parameters  : 
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL UBYTE tc_cpy_ctrl_blk_to_buffer( UBYTE *buffer )
+{ 
+  UBYTE  index;
+  UBYTE *ctrl_block = tc_get_ctrl_blk( &index, FALSE );
+
+  TRACE_FUNCTION( "tc_cpy_ctrl_blk_to_buffer" );
+
+  if( ctrl_block NEQ NULL )
+  {
+    memcpy( buffer, ctrl_block, BYTE_UL_CTRL_BLOCK );
+    grr_data->tc.v_sb_without_tbf    = FALSE;
+    /*
+     * After copying Measurement reports (PIM) in single block req 
+     * v_sb_without_tbf is not required
+     */
+  }
+  else
+  {
+    TRACE_ERROR( "tc_cpy_ctrl_blk_to_buffer: ctrl_block EQ NULL" );
+  }
+
+  return( index );
+} /* tc_cpy_ctrl_blk_to_buffer() */
+
+/*==== SIGNAL FUNCTIONS =====================================================*/
+/*
++------------------------------------------------------------------------------
+| Function    : sig_ctrl_tc_control_block
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_CTRL_TC_CONTROL_BLOCK
+|
+| Parameters  : void
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_ctrl_tc_control_block ( T_BLK_OWNER   blk_owner_i, 
+                                          void        * blk_struct_i )
+{ 
+  TRACE_ISIG( "sig_ctrl_tc_control_block " );
+ 
+  switch( GET_STATE( TC ) )
+  {
+    case TC_ACCESS_DISABLED:
+    case TC_CPAP:
+    case TC_WAIT_ASSIGN:
+    case TC_POLLING:
+    case TC_WAIT_2P_ASSIGN:
+    case TC_CONTENTION_RESOLUTION:
+    case TC_TBF_ACTIVE:
+    case TC_WAIT_STOP_TASK_CNF:
+      if( tc_store_ctrl_blk( blk_owner_i, blk_struct_i ) EQ FALSE )
+      {
+        sig_tc_ctrl_control_block_result( blk_owner_i, FALSE );
+      }
+      else
+      {
+        tc_send_control_msg_to_grlc();
+      }
+      break;
+    case TC_SINGLE_BLOCK:
+    case TC_PIM:
+      if( tc_store_ctrl_blk( blk_owner_i, blk_struct_i ) EQ FALSE )
+      {
+        sig_tc_ctrl_control_block_result( blk_owner_i, FALSE );
+      }
+      else
+      {
+        /*
+         * check if grlc has to transmit data
+         */
+        tc_cgrlc_access_status_req();
+/*          grr_data->tc.v_sb_without_tbf    = TRUE;
+          grr_data->uplink_tbf.nr_blocks   = 1;
+          grr_data->uplink_tbf.prio        = RADIO_PRIO_4;
+          grr_data->uplink_tbf.access_type = CGRLC_AT_SINGLE_BLOCK;
+          grr_data->uplink_tbf.ti          = 0;  
+          tc_check_access_is_needed( CAC_OTHER );*/
+      }
+      break;
+    default:
+      sig_tc_ctrl_control_block_result( blk_owner_i, FALSE );
+
+      TRACE_ERROR( "SIG_CTRL_TC_CONTROL_BLOCK unexpected" );
+      break;
+  }
+} /* sig_ctrl_tc_control_block () */
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_ctrl_tc_cancel_control_block
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_CTRL_TC_CANCEL_CONTROL_BLOCK
+|
+| Parameters  : void
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_ctrl_tc_cancel_control_block ( T_BLK_OWNER blk_owner_i )
+{ 
+  UBYTE state = GET_STATE( TC );
+
+  TRACE_ISIG( "sig_ctrl_tc_cancel_control_block " );
+ 
+  switch( state )
+  {
+    case TC_CPAP:
+    case TC_WAIT_ASSIGN:
+      if( tc_cancel_ctrl_blk( blk_owner_i ) EQ TRUE )
+      {
+        if( tc_get_num_ctrl_blck( )  EQ 0  )
+        {
+          if( state EQ TC_CPAP )
+          {
+            sig_tc_cpap_abort_access();
+          }
+          else
+          {
+            SET_STATE( TC, TC_PIM );
+
+            tc_send_ra_stop_req( );
+            vsi_t_stop( GRR_handle, T3170 );
+            tc_check_access_is_needed( CAC_OTHER );
+          }
+        }
+      }
+      break;
+    case TC_ACCESS_DISABLED:
+    case TC_POLLING:
+    case TC_PIM:
+      tc_cancel_ctrl_blk( blk_owner_i );
+      break;
+    case TC_SINGLE_BLOCK:
+    case TC_WAIT_2P_ASSIGN:
+      tc_cancel_ctrl_blk( blk_owner_i );
+      tc_stop_normal_burst_req( );
+      break;
+    case TC_TBF_ACTIVE:  
+    case TC_CONTENTION_RESOLUTION:
+      tc_cancel_ctrl_blk( blk_owner_i );
+      tc_handle_error_ra();
+      break;
+    default:
+      TRACE_EVENT( "SIG_CTRL_TC_CANCEL_CONTROL_BLOCK unexpected" );
+      break;
+  }
+} /* sig_ctrl_tc_cancel_control_block () */
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_ctrl_tc_enable_grlc
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_CTRL_TC_ENABLE_GRLC
+|
+| Parameters  : void
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_ctrl_tc_enable_grlc  (UBYTE queue_mode, UBYTE  cell_update_cause )
+{ 
+  TRACE_ISIG( "sig_ctrl_tc_enable_grlc" );
+
+  if(cell_update_cause EQ GMMRR_RA_CU)
+    tc_cgrlc_enable_req(queue_mode,CGRLC_RA_CU,FALSE,CGRLC_ENAC_NORMAL);
+  else
+    tc_cgrlc_enable_req(queue_mode,CGRLC_RA_DEFAULT,FALSE,CGRLC_ENAC_NORMAL);
+
+} /* sig_ctrl_tc_enable_grlc() */
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_ctrl_tc_access_disable
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_CTRL_TC_ACCESS_DISABLE
+|
+| Parameters  : dc - disable cause
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_ctrl_tc_access_disable 
+                                   ( T_TC_DISABLE_CAUSE         disable_cause,
+                                     T_TC_DISABLE_CALLBACK_FUNC callback_func ) 
+{ 
+  UBYTE         disable_class;
+
+  T_TC_DC_CLASS dc_class =          ( disable_cause & DCM_CLASS );
+  T_TC_DC_TYPE  dc_type  = ( UBYTE )( disable_cause & DCM_TYPE  );
+  UBYTE         state    = GET_STATE( TC );
+  UBYTE         prim_st  = CGRLC_PRIM_STATUS_NULL;
+
+  TRACE_ISIG( "sig_ctrl_tc_access_disable" );
+
+  disable_class =
+    ( dc_class EQ DCC_CR ? CGRLC_DISABLE_CLASS_CR : CGRLC_DISABLE_CLASS_OTHER );
+
+  if( grr_data->tc.disable_class EQ  CGRLC_DISABLE_CLASS_NULL OR 
+      disable_class              NEQ CGRLC_DISABLE_CLASS_CR      )
+  {
+    grr_data->tc.disable_class = disable_class;
+  }
+  if ( disable_cause EQ TC_DC_CR_NETWORK)
+  {
+    TRACE_EVENT("T3170 stopped if disable cause is NW CR");
+    vsi_t_stop(GRR_handle,T3170);
+  }
+  switch( state )
+  {
+    case TC_CPAP:
+      sig_tc_cpap_abort_access();
+
+      SET_STATE( TC, TC_ACCESS_DISABLED );
+
+      tc_cgrlc_disable_req(prim_st);
+
+      callback_func( );
+      break;
+
+    case TC_WAIT_2P_ASSIGN:
+      vsi_t_stop( GRR_handle, T3168 );
+#if defined REL99 AND defined TI_PS_FF_TBF_EST_PACCH
+      if(grr_data->tbf_type EQ CGRLC_TBF_MODE_2PA)
+      {
+        tc_abort_tbf( grr_data->tbf_type );
+      }
+      else
+#endif
+      {
+        tc_stop_normal_burst_req( );        
+      }
+
+      SET_STATE( TC, TC_ACCESS_DISABLED );
+
+      if( dc_class EQ DCC_SUSPEND )
+      {
+        prim_st = CGRLC_PRIM_STATUS_ONE; 
+      }
+      tc_cgrlc_disable_req(prim_st);
+
+      grr_data->tc.disable_callback_func = callback_func;
+      break;
+
+    case TC_POLLING:
+    case TC_WAIT_ASSIGN:
+      tc_send_ra_stop_req( );
+
+      SET_STATE( TC, TC_ACCESS_DISABLED );
+
+      if( dc_class EQ DCC_SUSPEND )
+      {
+        prim_st = CGRLC_PRIM_STATUS_ONE;
+      }
+      tc_cgrlc_disable_req(prim_st);
+
+      callback_func( );
+      break;
+
+    case TC_CONTENTION_RESOLUTION:
+    case TC_TBF_ACTIVE:
+      TRACE_EVENT_P1( "SIG_CTRL_TC_ACCESS_DISABLE: %s of TBF",
+                      dc_type EQ DCT_NORMAL ? "normal release" : "abort" );
+
+      if(!grr_data->tc.two_2p_w_4_tbf_con AND
+         ( dc_type NEQ DCT_NORMAL ))
+      {
+        TRACE_EVENT("SB SUSPEND Before TBF_C");
+        tc_stop_normal_burst_req( );
+        SET_STATE( TC, TC_ACCESS_DISABLED );       
+        if( dc_class EQ DCC_SUSPEND )
+        {
+          prim_st = CGRLC_PRIM_STATUS_ONE; 
+        }
+        tc_cgrlc_disable_req(prim_st);
+      }
+      else if( dc_type NEQ DCT_NORMAL )
+      {
+        if( grr_data->tc.num_of_rels_running EQ  0             OR
+            grr_data->tbf_type               NEQ CGRLC_TBF_MODE_NULL    )
+        {
+          tc_abort_tbf( grr_data->tbf_type );
+
+          SET_STATE( TC, TC_ACCESS_DISABLED );
+        }
+        tc_cgrlc_disable_req(prim_st);
+      }
+
+      grr_data->tc.disable_callback_func = callback_func;
+      break;
+
+    case TC_SINGLE_BLOCK:
+      tc_stop_normal_burst_req( );
+      tc_set_stop_all_ctrl_blk( );
+
+      tc_cgrlc_disable_req(prim_st);
+
+      SET_STATE( TC, TC_ACCESS_DISABLED );
+
+      grr_data->tc.disable_callback_func = callback_func;
+      break;
+
+    case TC_PIM:
+     
+      tc_cgrlc_disable_req(prim_st);
+
+      if( grr_data->tc.num_of_rels_running NEQ 0 )
+      {
+        /* 
+         * disable request during TBF release procedure,
+         * GRR is waiting for RRGRR_STOP_TASK_CNF
+         */
+        TRACE_EVENT( "SIG_CTRL_TC_ACCESS_DISABLE: TBF release procedure is running" );
+
+        grr_data->tc.disable_callback_func = callback_func;
+      }
+      else
+      {
+        SET_STATE( TC, TC_ACCESS_DISABLED );
+
+        callback_func( );
+      }
+      break;
+
+    default:
+      TRACE_EVENT_P1( "SIG_CTRL_TC_ACCESS_DISABLE in TC state %d", state );
+
+      /*lint -fallthrough*/
+
+    case TC_ACCESS_DISABLED:
+    case TC_WAIT_STOP_TASK_CNF:
+
+      tc_cgrlc_disable_req(prim_st);
+
+      SET_STATE( TC, TC_ACCESS_DISABLED );
+      
+      if( grr_data->tc.disable_callback_func EQ NULL )
+      {
+        callback_func( );
+      }
+      else
+      {
+        grr_data->tc.disable_callback_func = callback_func;
+      }
+      break;
+  }
+#ifdef _SIMULATION_
+      tc_stop_timer_t3172();
+#endif
+} /* sig_ctrl_tc_access_disable() */
+
+
+
+
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_cpap_tc_error_pim
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_CPAP_TC_ERROR_PIM
+|
+| Parameters  : void
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_cpap_tc_error_pim ( void ) 
+{ 
+  TRACE_ISIG( "sig_cpap_tc_error_pim" );
+
+  switch( GET_STATE( TC ) )
+  {
+    case TC_CPAP:
+      SET_STATE( TC, TC_PIM );
+
+      tc_handle_error_pim();
+      break;
+    
+    default:
+      TRACE_ERROR( "SIG_CPAP_TC_ERROR_PIM unexpected" );
+      break;
+  }
+} /* sig_cpap_tc_error_pim() */
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_cpap_tc_tbf_created
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_CPAP_TC_TBF_CREATED
+|
+| Parameters  : void
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_cpap_tc_tbf_created ( T_TBF_TYPE tbf_type ) 
+{ 
+  TRACE_ISIG( "sig_cpap_tc_tbf_created" );
+
+  
+  switch( GET_STATE( TC ) )
+  {
+    case TC_CPAP:
+      switch(tbf_type)
+      {
+        case CGRLC_TBF_MODE_UL:
+          SET_STATE(TC,TC_CONTENTION_RESOLUTION);
+          tc_activate_tbf(tbf_type);
+          tc_cgrlc_ul_tbf_res(CGRLC_TBF_MODE_UL,CGRLC_PRIM_STATUS_NULL);
+          break;
+        case CGRLC_TBF_MODE_DL:
+          SET_STATE(TC,TC_TBF_ACTIVE);
+          tc_activate_tbf(tbf_type);
+          tc_cgrlc_dl_tbf_req();
+          break;
+        default:
+          TRACE_ERROR("unknown tbf type! sig_cpap_tc_tbf_created");
+          SET_STATE(TC,TC_PIM);
+          break;
+      }
+      break;
+    case TC_PIM:
+      switch(tbf_type)
+      {
+        case CGRLC_TBF_MODE_UL:
+          TRACE_ERROR("unexpected tbf type! sig_cpap_tc_tbf_created");
+          break;
+        case CGRLC_TBF_MODE_DL:
+          SET_STATE(TC,TC_TBF_ACTIVE);
+          tc_activate_tbf(tbf_type);
+          tc_cgrlc_dl_tbf_req();
+          break;
+        default:
+          TRACE_ERROR("unknown tbf type! sig_cpap_tc_tbf_created 2");
+          SET_STATE(TC,TC_PIM);
+          break;
+      }
+      break;
+    default:
+      TRACE_ERROR( "SIG_CPAP_TC_TBF_CREATED unexpected" );
+      break;
+  }
+} /* sig_cpap_tc_tbf_created() */
+
+
+
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_ctrl_tc_ia_received
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_CTRL_TC_IA_RECEIVED
+|
+| Parameters  : -
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_ctrl_tc_ia_received (T_RRGRR_IA_IND *rrgrr_ia_ind )
+{ 
+  TRACE_ISIG( "sig_ctrl_tc_ia_received" );
+  
+  switch( GET_STATE( TC ) )
+  {
+    case TC_CPAP:
+    case TC_SINGLE_BLOCK:
+    case TC_PIM:
+    case TC_WAIT_ASSIGN:
+    case TC_POLLING:
+    case TC_WAIT_2P_ASSIGN:
+    case TC_CONTENTION_RESOLUTION:
+    case TC_TBF_ACTIVE:
+      sig_tc_cpap_ia_received(rrgrr_ia_ind);
+      break;
+    default:
+      TRACE_ERROR( "sig_ctrl_tc_ia_received unexpected" );
+      break;
+  }
+} /* sig_ctrl_tc_ia_received() */
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_ctrl_tc_iaext_received
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_CTRL_TC_IAEXT_RECEIVED
+|
+| Parameters  : UBYTE indicates the valid immediate assignment
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_ctrl_tc_iaext_received ( T_RRGRR_IAEXT_IND *rrgrr_iaext_ind )
+{ 
+  TRACE_ISIG( "sig_ctrl_tc_iaext_received" );
+  
+  switch( GET_STATE( TC ) )
+  {
+    case TC_CPAP:
+      sig_tc_cpap_iaext_received ( rrgrr_iaext_ind);
+      break;
+    case TC_SINGLE_BLOCK:
+    case TC_PIM:
+    case TC_WAIT_ASSIGN:
+    case TC_POLLING:
+    case TC_WAIT_2P_ASSIGN:
+    case TC_CONTENTION_RESOLUTION:
+    case TC_TBF_ACTIVE:
+
+      break;
+    default:
+      TRACE_ERROR( "sig_ctrl_tc_iaext_received unexpected" );
+      break;
+  }
+} /* sig_ctrl_tc_iaext_received() */
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_ctrl_tc_iarej_received
++------------------------------------------------------------------------------
+| Description : Handles the internal signal sig_ctrl_tc_iarej_received 
+|
+| Parameters  : -
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_ctrl_tc_iarej_received(T_RRGRR_ASSIGNMENT_REJ_IND *rrgrr_assignment_rej_ind )
+{ 
+  TRACE_ISIG( "sig_ctrl_tc_iarej_received" );
+   
+  switch( GET_STATE( TC ) )
+  {
+    case TC_CPAP:
+      sig_tc_cpap_iarej_received(rrgrr_assignment_rej_ind);
+      if(grr_data->cc_running)
+      {
+         SET_STATE(TC,TC_ACCESS_DISABLED)
+         /*
+          * todo:why state change: grlc will be disabled by sending ctrl_tc_disable
+          */
+      }
+      break;
+    case TC_SINGLE_BLOCK:
+    case TC_PIM:
+    case TC_WAIT_ASSIGN:
+    case TC_POLLING:
+    case TC_WAIT_2P_ASSIGN:
+    case TC_CONTENTION_RESOLUTION:
+    case TC_TBF_ACTIVE:
+
+      break;
+    default:
+      TRACE_ERROR( "sig_ctrl_tc_iarej_received unexpected" );
+      break;
+  }
+
+} /* sig_ctrl_tc_iarej_received() */
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_ctrl_tc_ia_downlink_received
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_CTRL_TC_IA_DOWNLINK_RECEIVED 
+|
+| Parameters  : -
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_ctrl_tc_ia_downlink_received (T_RRGRR_IA_DOWNLINK_IND *rrgrr_ia_downlink_in )
+{ 
+  TRACE_ISIG( "sig_ctrl_tc_ia_downlink_received" );
+
+ 
+  switch( GET_STATE( TC ) )
+  {
+    case TC_CPAP:
+    case TC_SINGLE_BLOCK:
+    case TC_PIM:
+    case TC_WAIT_ASSIGN:
+    case TC_CONTENTION_RESOLUTION:
+    case TC_TBF_ACTIVE:
+      sig_tc_cpap_ia_downlink_received(rrgrr_ia_downlink_in);
+      break;
+    default:
+      sig_tc_ctrl_send_stop_task_req( INVALID_MSG );
+      TRACE_EVENT_P1( "sig_ctrl_tc_ia_downlink_received unexpected tc_state=%d", grr_data->tc.state);
+      TRACE_ERROR( "sig_ctrl_tc_ia_downlink_received unexpected" );
+      break;
+  }
+  
+} /* sig_ctrl_tc_ia_downlink_received() */
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_ctrl_tc_stop_task_cnf_received
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_CTRL_TC_STOP_TASK_CNF
+|
+| Parameters  : 
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_ctrl_tc_stop_task_cnf_received ( void )
+{ 
+  TRACE_ISIG( "sig_ctrl_tc_stop_task_cnf_received" );
+  
+  switch( GET_STATE( TC ) )
+  {
+    case TC_CPAP:
+    case TC_PIM:
+      sig_tc_cpap_stop_task_cnf_received();
+      break;
+    default:
+      TRACE_ERROR( "SIG_CTRL_TC_STOP_TASK_CNF unexpected" );
+      break;
+  }
+} /* sig_ctrl_tc_stop_task_cnf_received() */
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_cpap_tc_send_stop_task_req
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_CTRL_TC_STOP_TASK_REQ
+|
+| Parameters  : 
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_cpap_tc_send_stop_task_req( UBYTE v_stop_ccch  )
+{ 
+  TRACE_ISIG( "sig_cpap_tc_send_stop_task_req" );
+  
+  sig_tc_ctrl_send_stop_task_req( v_stop_ccch );
+
+} /* sig_cpap_tc_send_stop_task_req() */
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_cpap_tc_channel_req
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_CPAP_TC_CHANNEL_REQ 
+|
+| Parameters  :  req_data - data which RR has to send
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_cpap_tc_channel_req(UBYTE req_data )
+{ 
+  TRACE_ISIG( "sig_cpap_tc_channel_req" );
+ 
+  switch( GET_STATE( TC ) )
+  {
+    case TC_CPAP:
+      sig_tc_ctrl_channel_req(req_data); 
+      break;
+    default:
+      TRACE_ERROR( "sig_cpap_tc_channel_req unexpected" );
+      break;
+  }
+} /* sig_cpap_tc_channel_req() */
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_cpap_tc_assign_sb
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_CPAP_TC_ASSIGN_SB 
+|
+| Parameters  : void
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_cpap_tc_assign_sb(void *ptr2prim, UBYTE purpose)
+{ 
+  TRACE_ISIG( "sig_cpap_tc_assign_sb" );
+
+  switch( GET_STATE( TC ) )
+  {
+    case TC_CPAP:
+      if(TWO_PHASE_ACESS EQ purpose)
+      {
+        SET_STATE(TC,TC_WAIT_2P_ASSIGN);
+      }
+      else
+      {
+        SET_STATE(TC,TC_SINGLE_BLOCK);
+      }
+
+      sig_tc_meas_update_pch( );
+
+      {
+        T_MPHP_SINGLE_BLOCK_REQ* mphp_single_block_req = ( T_MPHP_SINGLE_BLOCK_REQ* )ptr2prim;
+        
+        TRACE_BINDUMP
+          ( hCommGRR, TC_USER4,
+            cl_rlcmac_get_msg_name
+              ( ( UBYTE )( mphp_single_block_req->l2_frame[1] >> 2 ), RLC_MAC_ROUTE_UL ),
+            mphp_single_block_req->l2_frame, MAX_L2_FRAME_SIZE ); /*lint !e569*/
+      }
+
+      PSEND(hCommL1,ptr2prim);
+      break;
+    case TC_PIM:
+      if(SINGLE_BLOCK_TRANSFER_DL EQ purpose)
+      {
+        SET_STATE(TC,TC_SINGLE_BLOCK);
+        PSEND(hCommL1,ptr2prim);
+      }
+      else
+      { /* this shall never happen! */
+        TRACE_ERROR("FATAL ERROR: single block assignment in wrong state!");
+        PFREE(ptr2prim);
+      }
+      break;
+    default:
+      TRACE_ERROR( "sig_cpap_tc_assign_sb unexpected" );
+      PFREE(ptr2prim);
+      break;
+  }
+} /* sig_cpap_tc_assign_sb() */
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_ctrl_tc_pdch_assign_received
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_CTRL_TC_PDCH_ASSIGN_RECEIVED 
+|
+| Parameters  : fn - reception frame number
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_ctrl_tc_pdch_assign_received( T_RRGRR_DATA_IND *rrgrr_data_ind )
+{ 
+  TRACE_ISIG( "sig_ctrl_tc_pdch_assign_received" );
+
+  switch( GET_STATE( TC ) )
+  {
+    case TC_CPAP:
+      sig_tc_cpap_pdch_assign_received(rrgrr_data_ind);
+      break;
+
+    case TC_SINGLE_BLOCK:
+    case TC_PIM:
+    case TC_WAIT_ASSIGN:
+    case TC_POLLING:
+    case TC_WAIT_2P_ASSIGN:
+    case TC_CONTENTION_RESOLUTION:
+    case TC_TBF_ACTIVE:
+      break;
+    default:
+      TRACE_ERROR( "sig_ctrl_tc_pdch_assign_received unexpected" );
+      break;
+  }
+} /* sig_ctrl_tc_pdch_assign_received() */
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_cpap_tc_dcch_data_req
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_CPAP_TC_DCCH_DATA_REQ 
+|
+| Parameters  : pointer - to primitive with data 
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_cpap_tc_dcch_data_req( T_RRGRR_DATA_REQ * rrgrr_data_req_i )
+{ 
+  TRACE_ISIG( "sig_cpap_tc_dcch_data_req" );
+ 
+  switch( GET_STATE( TC ) )
+  {
+    case TC_CPAP:
+      sig_tc_ctrl_dcch_data_req(rrgrr_data_req_i);
+      break;
+    default:
+      TRACE_ERROR( "sig_cpap_tc_dcch_data_req unexpected" );
+      break;
+  }
+} /* sig_cpap_tc_dcch_data_req() */
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_cpap_tc_assign_pdch
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_CPAP_TC_ASSIGN_PDCH 
+|
+| Parameters  : void
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_cpap_tc_assign_pdch(T_MPHP_ASSIGNMENT_REQ *ptr2prim,
+                                    T_PDCH_ASS_CAUSE cause )
+{ 
+  TRACE_ISIG( "sig_cpap_tc_assign_pdch" );
+
+  switch( GET_STATE( TC ) )
+  {
+    case TC_CPAP:
+      grr_data->tc.dcch_present = FALSE;
+      if( (PDCH_UL_ASS_CMD EQ cause) OR (PDCH_DL_ASS_CMD EQ cause) )
+      {
+        grr_data->tc.dcch_present = TRUE;
+      }
+
+      PSEND(hCommL1,ptr2prim);
+      break;
+    case TC_PIM:
+      grr_data->tc.dcch_present = FALSE;
+      if((IA_UL EQ cause) OR (PDCH_UL_ASS_CMD EQ cause))
+      {
+        PFREE(ptr2prim);
+        TRACE_ERROR( "uplink assignments unexpected in PIM" );
+      }
+      else
+      {        
+        if((PDCH_DL_ASS_CMD EQ cause))
+          grr_data->tc.dcch_present = TRUE;
+
+        PSEND(hCommL1,ptr2prim);
+      }
+      break;
+    case TC_WAIT_ASSIGN:
+    case TC_POLLING:
+    case TC_WAIT_2P_ASSIGN:
+    case TC_CONTENTION_RESOLUTION:
+    case TC_TBF_ACTIVE:
+      TRACE_ERROR( "sig_cpap_tc_assign_pdch unexpected" );
+      PFREE(ptr2prim);
+      break;
+    default:
+      TRACE_ERROR( "sig_cpap_tc_assign_pdch unexpected" );
+      FREE(ptr2prim);
+      break;
+  }
+} /* sig_cpap_tc_assign_pdch() */
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_cpap_tc_suspend_dedi_chan
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_CPAP_TC_SUSPEND_DEDI_CHAN 
+|
+| Parameters  : void
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_cpap_tc_suspend_dedi_chan(void )
+{ 
+  TRACE_ISIG( "sig_cpap_tc_suspend_dedi_chan" );
+  
+  switch( GET_STATE( TC ) )
+  {
+    case TC_CPAP:
+      sig_tc_ctrl_suspend_dedi_chan();
+      break;
+    case TC_SINGLE_BLOCK:
+    case TC_PIM:
+    case TC_WAIT_ASSIGN:
+    case TC_POLLING:
+    case TC_WAIT_2P_ASSIGN:
+    case TC_CONTENTION_RESOLUTION:
+    case TC_TBF_ACTIVE:
+      TRACE_ERROR( "sig_cpap_tc_suspend_dedi_chan unexpected" );
+
+      break;
+    default:
+      TRACE_ERROR( "sig_cpap_tc_suspend_dedi_chan unexpected" );
+      break;
+  }
+} /* sig_cpap_tc_suspend_dedi_chan() */
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_cpap_tc_resume_dedi_chan
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_CPAP_TC_RESUME_DEDI_CHAN 
+|
+| Parameters  : void
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_cpap_tc_resume_dedi_chan(void )
+{ 
+  TRACE_ISIG( "sig_cpap_tc_resume_dedi_chan" );
+  
+  switch( GET_STATE( TC ) )
+  {
+    case TC_CPAP:
+      sig_tc_ctrl_resume_dedi_chan();
+      break;
+    case TC_SINGLE_BLOCK:
+    case TC_PIM:
+    case TC_WAIT_ASSIGN:
+    case TC_POLLING:
+    case TC_WAIT_2P_ASSIGN:
+    case TC_CONTENTION_RESOLUTION:
+    case TC_TBF_ACTIVE:
+      TRACE_ERROR( "sig_cpap_tc_resume_dedi_chan unexpected" );
+
+      break;
+    default:
+      TRACE_ERROR( "sig_cpap_tc_resume_dedi_chan unexpected" );
+      break;
+  }
+} /* sig_cpap_tc_resume_dedi_chan() */
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_cpap_tc_send_gprs_data_req
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_CPAP_TC_SEND_GPRS_DATA_REQ 
+|
+| Parameters  : void
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_cpap_tc_send_gprs_data_req(T_RRGRR_GPRS_DATA_REQ *rrgrr_gprs_data_req)
+{ 
+  TRACE_ISIG( "sig_cpap_tc_send_gprs_data_req" );
+  
+  switch( GET_STATE( TC ) )
+  {
+    case TC_CPAP:
+      sig_tc_ctrl_gprs_data_req(rrgrr_gprs_data_req);
+      break;
+    case TC_SINGLE_BLOCK:
+    case TC_PIM:
+    case TC_WAIT_ASSIGN:
+    case TC_POLLING:
+    case TC_WAIT_2P_ASSIGN:
+    case TC_CONTENTION_RESOLUTION:
+    case TC_TBF_ACTIVE:
+      TRACE_ERROR( "sig_cpap_tc_send_gprs_data_req unexpected" );
+
+      break;
+    default:
+      TRACE_ERROR( "sig_cpap_tc_send_gprs_data_req unexpected" );
+      break;
+  }
+} /* sig_cpap_tc_send_gprs_data_req() */
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_ctrl_tc_suspend_dcch_cnf
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_CTRL_TC_SUSPEND_DCCH_CNF 
+|
+| Parameters  : void
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_ctrl_tc_suspend_dcch_cnf(void)
+{ 
+  TRACE_ISIG( "sig_ctrl_tc_suspend_dcch_cnf" );
+  
+  switch( GET_STATE( TC ) )
+  {
+    case TC_CPAP:
+      sig_tc_cpap_suspend_dcch_cnf();
+      break;
+    case TC_SINGLE_BLOCK:
+    case TC_PIM:
+    case TC_WAIT_ASSIGN:
+    case TC_POLLING:
+    case TC_WAIT_2P_ASSIGN:
+    case TC_CONTENTION_RESOLUTION:
+    case TC_TBF_ACTIVE:
+      TRACE_ERROR( "sig_ctrl_tc_suspend_dcch_cnf unexpected" );
+
+      break;
+    default:
+      TRACE_ERROR( "sig_ctrl_tc_suspend_dcch_cnf unexpected" );
+      break;
+  }
+} /* sig_ctrl_tc_suspend_dcch_cnf() */
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_cpap_tc_build_res_req
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_CPAP_TC_BUILD_RES_REQ 
+|
+| Parameters  : void
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_cpap_tc_build_res_req(T_U_RESOURCE_REQ *ptr2res_req)
+{ 
+  TRACE_ISIG( "sig_cpap_tc_build_res_req" );
+  
+  switch( GET_STATE( TC ) )
+  {
+    case TC_CPAP:
+      tc_build_res_req( ptr2res_req,
+                        R_BUILD_2PHASE_ACCESS,
+                        SRC_TBF_INFO_IMM_ASSIGN ); 
+      break;
+    case TC_SINGLE_BLOCK:
+    case TC_PIM:
+    case TC_WAIT_ASSIGN:
+    case TC_POLLING:
+    case TC_WAIT_2P_ASSIGN:
+    case TC_CONTENTION_RESOLUTION:
+    case TC_TBF_ACTIVE:
+    default:
+      TRACE_ERROR( "sig_cpap_tc_build_res_req unexpected" );
+      break;
+  }
+} /* sig_cpap_tc_build_res_req() */
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_cpap_tc_ctrl_ptm
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_CPAP_TC_CTRL_PTM 
+|
+| Parameters  : void
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_cpap_tc_ctrl_ptm(void)
+{ 
+  TRACE_ISIG( "sig_cpap_tc_ctrl_ptm" );
+  
+  switch( GET_STATE( TC ) )
+  {
+    case TC_CPAP:
+    case TC_PIM:
+      sig_tc_ctrl_set_pckt_mode( GLBL_PCKT_MODE_TRANSFER, TASK_STOP_DUMMY_VALUE );
+      break;
+    case TC_SINGLE_BLOCK:
+    case TC_WAIT_ASSIGN:
+    case TC_POLLING:
+    case TC_WAIT_2P_ASSIGN:
+    case TC_CONTENTION_RESOLUTION:
+    case TC_TBF_ACTIVE:
+      TRACE_ERROR( "sig_cpap_tc_ctrl_ptm unexpected" );
+
+      break;
+    default:
+      TRACE_ERROR( "sig_cpap_tc_ctrl_ptm unexpected" );
+      break;
+  }
+} /* sig_cpap_tc_ctrl_ptm() */
+
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_gfp_tc_fix_alloc_ack_ptm
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_GFP_TC_FIX_ALLOC_ACK_PTM 
+|
+| Parameters  : void
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_gfp_tc_fix_alloc_ack_ptm( void )
+{ 
+  MCAST(d_ul_ack,D_UL_ACK);
+  TRACE_ISIG( "sig_ru_tc_fix_alloc_ack" );
+
+  grr_data->uplink_tbf.cs_mode = d_ul_ack->gprs_ul_ack_nack_info.chan_coding_cmd;
+ 
+  switch( GET_STATE( TC ) )
+  {
+    case TC_CONTENTION_RESOLUTION:
+    case TC_TBF_ACTIVE:
+      if(d_ul_ack->gprs_ul_ack_nack_info.v_f_alloc_ack EQ 0 )
+      {
+        /*
+         * if no fix alloc is present in last uplink ack/nack, delete any existing repeat alloc
+         */
+        if(grr_data->tc.fa_ctrl.fa_type EQ FA_REPEAT)
+        {
+          /*kill reapeat alloc, which is not yet started*/
+          grr_data->tc.fa_ctrl.fa_type        = FA_NO_NEXT;
+          grr_data->tc.fa_ctrl.repeat_alloc   = FALSE;
+          tc_send_ul_repeat_alloc_req();
+        }
+        else if(grr_data->tc.fa_ctrl.fa_type EQ FA_NO_NEXT AND 
+                grr_data->tc.fa_ctrl.repeat_alloc  EQ TRUE )
+        {
+          if(!grr_check_if_tbf_start_is_elapsed ( grr_data->tc.fa_ctrl.current_alloc.alloc_start_fn, grr_data->ul_fn))
+            /*grr_data->tc.fa_ctrl.ul_res_remain EQ grr_data->tc.fa_ctrl.current_alloc.ul_res_sum*/
+          {
+            /*kill reapeat alloc if is not yet started*/
+            grr_data->tc.fa_ctrl.fa_type = FA_NO_CURRENT;
+            grr_data->tc.fa_ctrl.repeat_alloc   = FALSE;
+            tc_send_ul_repeat_alloc_req();
+          }
+        }
+        return;
+      }
+
+      /*
+       * check if current allocation is active 
+       */
+      if(grr_data->tc.fa_ctrl.fa_type EQ FA_NO_CURRENT  AND
+         d_ul_ack->gprs_ul_ack_nack_info.f_alloc_ack.v_ts_overr )
+      {
+        ULONG next_start_fn;
+        ULONG next_end_fn;
+        /* repeat allocation in packet uplink ack/nack received,
+         * no fixed allocation active, find out the next natural boundary
+         * and store new allocation in current allocation
+         */
+        grr_data->tc.fa_ctrl.fa_type        = FA_NO_NEXT;
+        grr_data->tc.fa_ctrl.repeat_alloc   = TRUE;
+        grr_data->tc.fa_ctrl.ts_overr       = d_ul_ack->gprs_ul_ack_nack_info.f_alloc_ack.ts_overr;
+        tc_set_fa_bitmap((UBYTE)(d_ul_ack->gprs_ul_ack_nack_info.f_alloc_ack.ts_overr & grr_data->uplink_tbf.ts_usage),
+                            &grr_data->tc.fa_ctrl.current_alloc);
+        /*find  start of alloc (natural boundary of next allocation)*/
+        next_end_fn = grr_data->tc.fa_ctrl.current_alloc.alloc_end_fn;
+        do
+        {
+          USHORT len;
+          len = grr_data->tc.fa_ctrl.current_alloc.alloc.size_bitmap-1;
+          next_start_fn = grr_decode_tbf_start_rel(next_end_fn,0);
+          next_end_fn   = grr_decode_tbf_start_rel(next_start_fn,(USHORT)(len-1));
+          if(grr_data->ul_fn EQ next_start_fn)
+            break;
+          else if((next_end_fn > next_start_fn)   AND 
+                  (grr_data->ul_fn <= next_start_fn) AND
+                  (grr_data->ul_fn > next_start_fn) )
+          {
+            next_start_fn = grr_decode_tbf_start_rel(next_end_fn,0);
+            next_end_fn   = grr_decode_tbf_start_rel(next_start_fn,(USHORT)(len-1));
+            break;
+          }
+          else if( (next_end_fn < next_start_fn) AND
+                   (
+                    ((next_end_fn >= grr_data->ul_fn) AND (next_start_fn > grr_data->ul_fn)) OR
+                    ((next_end_fn <  grr_data->ul_fn) AND (next_start_fn < grr_data->ul_fn))
+                   )
+                 )
+          {
+            next_start_fn = grr_decode_tbf_start_rel(next_end_fn,0);
+            next_end_fn = grr_decode_tbf_start_rel(next_start_fn,(USHORT)(len-1));
+            break;
+          }
+        }
+        while (1);
+        grr_data->tc.fa_ctrl.current_alloc.alloc_start_fn = next_start_fn;
+        grr_data->tc.fa_ctrl.current_alloc.alloc_end_fn   = next_end_fn;          
+        tc_send_ul_repeat_alloc_req();
+        return;
+      }
+      else if(d_ul_ack->gprs_ul_ack_nack_info.f_alloc_ack.v_ts_overr )
+      {
+        UBYTE len;
+        /* repeat allocation in packet uplink ack/nack received,
+         * current allocation is active, store new alloc in next alloc
+         * overwriting is possibe.
+         */        
+        grr_data->tc.fa_ctrl.fa_type        = FA_REPEAT;
+        grr_data->tc.fa_ctrl.repeat_alloc   = TRUE;
+        grr_data->tc.fa_ctrl.ts_overr       = d_ul_ack->gprs_ul_ack_nack_info.f_alloc_ack.ts_overr;
+        tc_set_fa_bitmap((UBYTE)(d_ul_ack->gprs_ul_ack_nack_info.f_alloc_ack.ts_overr & grr_data->uplink_tbf.ts_usage),&grr_data->tc.fa_ctrl.current_alloc);
+        
+        grr_data->tc.fa_ctrl.current_alloc.alloc_start_fn = 
+            grr_decode_tbf_start_rel(grr_data->tc.fa_ctrl.current_alloc.alloc_end_fn,0);
+        len = grr_data->tc.fa_ctrl.current_alloc.alloc.size_bitmap-1;
+        grr_data->tc.fa_ctrl.current_alloc.alloc_end_fn   =
+            grr_decode_tbf_start_rel(grr_data->tc.fa_ctrl.current_alloc.alloc_start_fn,
+                                     (USHORT)(len-1));
+        tc_send_ul_repeat_alloc_req();
+        return;
+      }
+      grr_data->tc.fa_ctrl.repeat_alloc   = FALSE;
+      if( d_ul_ack->gprs_ul_ack_nack_info.f_alloc_ack.v_fa_s2 )      
+      {
+        /*
+         * new fixed allocation with allocation bitmap
+         */
+        if(d_ul_ack->gprs_ul_ack_nack_info.f_alloc_ack.fa_s2.v_ts_alloc)
+        {
+          UBYTE tx_slots;
+          tx_slots = grr_calc_nr_of_set_bits (d_ul_ack->gprs_ul_ack_nack_info.f_alloc_ack.fa_s2.ts_alloc);
+          grr_data->uplink_tbf.nts = tx_slots;
+          grr_data->uplink_tbf.ts_usage = d_ul_ack->gprs_ul_ack_nack_info.f_alloc_ack.fa_s2.ts_alloc;
+          if(!handle_ms_cap(UL_ASSIGNMENT))
+          {
+            TRACE_ERROR( "TS_ALLOC not valid" );
+            return;
+          }
+        }
+        tc_handle_tbf_start(CGRLC_TBF_MODE_UL);
+      }
+      else
+      {
+        TRACE_EVENT("NO FIX ALLOC STRUCT IN D_UL_ACK " );
+      }
+      break;
+    default:
+      TRACE_ERROR( "sig_ru_tc_fix_alloc_ack unexpected" );
+      break;
+  }
+
+
+
+} /* sig_gfp_tc_fix_alloc_ack_ptm() */
+
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_ctrl_tc_reconnect_cnf
++------------------------------------------------------------------------------
+| Description : Cell reselection has failled and we have to inform cpap 
+|
+| Parameters  : void
+|
++------------------------------------------------------------------------------
+*/
+
+GLOBAL void sig_ctrl_tc_reconnect_dcch_cnf()
+{
+  TRACE_ISIG( "sig_ctrl_tc_reconnect_cnf" );
+  switch( GET_STATE( TC ) )
+  {
+    case TC_CONTENTION_RESOLUTION:
+    case TC_TBF_ACTIVE:
+    case TC_WAIT_ASSIGN:
+      SET_STATE(TC, TC_ACCESS_DISABLED);
+      sig_tc_cpap_reconnect_ind();
+      break;
+    default:
+      TRACE_ERROR( "sig_ctrl_tc_reconnect_cnf unexpected" );
+  }
+}
+/*sig_ctrl_tc_reconnect_dcch_cnf()*/
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_ctrl_tc_cr_timerout_cnf
++------------------------------------------------------------------------------
+| Description : Cell reselection has failled because of timer out 
+|
+| Parameters  : void
+|
++------------------------------------------------------------------------------
+*/
+
+GLOBAL void sig_ctrl_tc_cr_timerout_cnf()
+{
+  TRACE_ISIG( "sig_ctrl_tc_cr_timerout_cnf" );
+  switch( GET_STATE( TC ) )
+  {
+    case TC_CONTENTION_RESOLUTION:    
+    case TC_TBF_ACTIVE:
+    case TC_WAIT_ASSIGN:
+      tc_abort_tbf(grr_data->tbf_type);
+      SET_STATE(TC, TC_ACCESS_DISABLED);
+      sig_tc_cpap_reconnect_ind();
+      break;
+    default:
+      TRACE_ERROR( "sig_ctrl_cr_timerout_cnf unexpected" );
+ }
+   
+
+}/*sig_ctrl_tc_cr_timerout_cnf()*/
+
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_ctrl_tc_abnorm_rel_with_cr_failed
++------------------------------------------------------------------------------
+| Description : Handles the internal signal 
+|               SIG_CTRL_TC_ABNORM_REL_WITH_CR_FAILED
+|
+| Parameters  :
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL BOOL sig_ctrl_tc_abnorm_rel_with_cr_failed ( BOOL cell_has_changed )
+{ 
+  TRACE_ISIG( "sig_ctrl_tc_abnorm_rel_with_cr_failed" );
+  
+  switch( GET_STATE( TC ) )
+  {
+    case TC_ACCESS_DISABLED:
+      SET_STATE_TC_PIM_AFTER_ACCESS_DISABLED
+              ( cell_has_changed, CGRLC_ENAC_ABNORM_RELEASE_CRESELECT_FAILED );
+      break;
+
+    default:
+      TRACE_ERROR( "SIG_CTRL_TC_ABNORM_REL_WITH_CR_FAILED unexpected" );
+      break;
+  }
+
+  return( TRUE );
+} /* sig_ctrl_tc_abnorm_rel_with_cr_failed() */
+
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_cpap_tc_start_T3142
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_CPAP_TC_START_T3142,
+|
+| Parameters  : void
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_cpap_tc_start_T3142(ULONG wait)
+{ 
+  TRACE_ISIG( "sig_cpap_tc_start_T3142" );
+
+  tc_start_timer_t3172(wait);
+  sig_tc_ctrl_t3172_running();
+
+} /* sig_cpap_tc_start_T3142 */
+
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_cpap_tc_stop_T3142
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_CPAP_TC_STOP_T3142,
+|
+| Parameters  : void
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_cpap_tc_stop_T3142(void)
+{ 
+  TRACE_ISIG( "sig_cpap_tc_stop_T3142" );
+
+
+} /* sig_cpap_tc_stop_T3142 */
+
+
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_ctrl_tc_disable_prim_queue
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_CTRL_TC_DISABLE_PRIM_QUEUE
+|
+| Parameters  : void
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL BOOL sig_ctrl_tc_disable_prim_queue ( BOOL cell_has_changed ) 
+{ 
+  TRACE_EVENT( "sig_ctrl_tc_disable_prim_queue" );
+  
+  switch( GET_STATE( TC ) )
+  {
+    case TC_ACCESS_DISABLED:
+      SET_STATE_TC_PIM_AFTER_ACCESS_DISABLED( cell_has_changed,
+                                              CGRLC_ENAC_NORMAL );
+      break;
+    default:
+      TRACE_ERROR( "SIG_CTRL_TC_DISABLE_PRIM_QUEUE unexpected" );
+      break;
+  }
+
+  return( TRUE);
+} /* sig_ctrl_tc_disable_prim_queue() */
+
+
+
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_meas_tc_update_ta_req
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_MEAS_TC_UPDATE_TA_REQ.
+|               New TA values are received, it shall passed to l1
+|
+| Parameters  : 
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_meas_tc_update_ta_req ( void)
+{ 
+  MCAST(d_ctrl_pwr_ta,D_CTRL_PWR_TA); /* T_D_CTRL_PWR_TA */
+
+  TRACE_FUNCTION( "tc_send_reconf_tbf_ta_req" );
+
+  TRACE_EVENT_P9("TAU: %d tav=%d - %d %d %d - %d %d %d tbf_type=%d"
+                                                                  ,d_ctrl_pwr_ta->gpta.v_ta_value
+                                                                  ,d_ctrl_pwr_ta->gpta.ta_value
+                                                                  ,d_ctrl_pwr_ta->gpta.v_ul_ta_index
+                                                                  ,d_ctrl_pwr_ta->gpta.ul_ta_index
+                                                                  ,d_ctrl_pwr_ta->gpta.ul_ta_tn
+                                                                  ,d_ctrl_pwr_ta->gpta.v_dl_ta_index
+                                                                  ,d_ctrl_pwr_ta->gpta.dl_ta_index
+                                                                  ,d_ctrl_pwr_ta->gpta.dl_ta_tn
+                                                                  ,grr_data->tbf_type );
+  switch(grr_data->tbf_type)
+  {
+    case CGRLC_TBF_MODE_DL_UL:
+      {
+        PALLOC(mphp_timing_advance_req,MPHP_TIMING_ADVANCE_REQ);/* T_MPHP_TIMING_ADVANCE_REQ */
+        mphp_timing_advance_req->assign_id = 0;
+        grr_handle_ta ( d_ctrl_pwr_ta->gpta.v_ta_value, 
+                        d_ctrl_pwr_ta->gpta.ta_value,
+                        d_ctrl_pwr_ta->gpta.v_ul_ta_index, 
+                        d_ctrl_pwr_ta->gpta.ul_ta_index,
+                        d_ctrl_pwr_ta->gpta.ul_ta_tn,
+                        d_ctrl_pwr_ta->gpta.v_dl_ta_index,
+                        d_ctrl_pwr_ta->gpta.dl_ta_index,
+                        d_ctrl_pwr_ta->gpta.dl_ta_tn,
+                        &mphp_timing_advance_req->p_timing_advance);
+        PSEND(hCommL1,mphp_timing_advance_req);
+      }
+      break;
+    case CGRLC_TBF_MODE_DL:
+      {
+        PALLOC(mphp_timing_advance_req,MPHP_TIMING_ADVANCE_REQ);/* T_MPHP_TIMING_ADVANCE_REQ */
+        mphp_timing_advance_req->assign_id = 0;
+        if(d_ctrl_pwr_ta->gpta.v_ul_ta_index)
+        {
+          d_ctrl_pwr_ta->gpta.v_ul_ta_index = 0;
+          TRACE_EVENT("TAU: only dl tbf is running, ul ta index present");
+        }
+        if(!d_ctrl_pwr_ta->gpta.v_dl_ta_index)
+        {        
+          TRACE_EVENT("TAU: only dl tbf is running, no dl ta index present");
+        }
+        grr_handle_ta ( d_ctrl_pwr_ta->gpta.v_ta_value, 
+                        d_ctrl_pwr_ta->gpta.ta_value,
+                        d_ctrl_pwr_ta->gpta.v_ul_ta_index, 
+                        d_ctrl_pwr_ta->gpta.ul_ta_index,
+                        d_ctrl_pwr_ta->gpta.ul_ta_tn,
+                        d_ctrl_pwr_ta->gpta.v_dl_ta_index,
+                        d_ctrl_pwr_ta->gpta.dl_ta_index,
+                        d_ctrl_pwr_ta->gpta.dl_ta_tn,
+                        &mphp_timing_advance_req->p_timing_advance);
+        PSEND(hCommL1,mphp_timing_advance_req);
+      }
+      break;
+    case CGRLC_TBF_MODE_UL:
+      {
+        PALLOC(mphp_timing_advance_req,MPHP_TIMING_ADVANCE_REQ);/* T_MPHP_TIMING_ADVANCE_REQ */
+        mphp_timing_advance_req->assign_id = 0;
+        if(d_ctrl_pwr_ta->gpta.v_dl_ta_index)
+        {
+          d_ctrl_pwr_ta->gpta.v_dl_ta_index = 0;
+          TRACE_EVENT("TAU: only ul tbf is running, dl ta index present");
+        }
+        if(!d_ctrl_pwr_ta->gpta.v_ul_ta_index)
+        {        
+          TRACE_EVENT("TAU: only ul tbf is running, no ul ta index present");
+        }
+        grr_handle_ta ( d_ctrl_pwr_ta->gpta.v_ta_value, 
+                        d_ctrl_pwr_ta->gpta.ta_value,
+                        d_ctrl_pwr_ta->gpta.v_ul_ta_index, 
+                        d_ctrl_pwr_ta->gpta.ul_ta_index,
+                        d_ctrl_pwr_ta->gpta.ul_ta_tn,
+                        d_ctrl_pwr_ta->gpta.v_dl_ta_index,
+                        d_ctrl_pwr_ta->gpta.dl_ta_index,
+                        d_ctrl_pwr_ta->gpta.dl_ta_tn,
+                        &mphp_timing_advance_req->p_timing_advance);
+        PSEND(hCommL1,mphp_timing_advance_req);
+      }
+      break;
+    default:
+      TRACE_ERROR ( "sig_meas_tc_update_ta_req: TBF type is invalid" );
+      TRACE_EVENT_P1 ( "TBF type = %d",grr_data->tbf_type );
+      break;
+  }
+} /* sig_meas_tc_update_ta_req() */
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_gfp_tc_update_ta_req_ptm
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_GFP_TC_UPDATE_TA_REQ_PTM.
+|               New TA values are received, it shall passed to l1
+|
+| Parameters  : 
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_gfp_tc_update_ta_req_ptm ( void)
+{
+  MCAST(d_ul_ack,D_UL_ACK);
+  PALLOC(mphp_timing_advance_req,MPHP_TIMING_ADVANCE_REQ);/* T_MPHP_TIMING_ADVANCE_REQ */
+
+  TRACE_FUNCTION( "tc_send_reconf_tbf_ta_req" );
+   
+  mphp_timing_advance_req->assign_id = 0; 
+
+  grr_handle_ta ( d_ul_ack->gprs_ul_ack_nack_info.pta.v_ta_value, 
+                  d_ul_ack->gprs_ul_ack_nack_info.pta.ta_value,
+                  d_ul_ack->gprs_ul_ack_nack_info.pta.v_ta_index_tn, 
+                  d_ul_ack->gprs_ul_ack_nack_info.pta.ta_index_tn.ta_index,
+                  d_ul_ack->gprs_ul_ack_nack_info.pta.ta_index_tn.ta_tn,
+                  0xFF,
+                  0,
+                  0,
+                  &mphp_timing_advance_req->p_timing_advance);
+  PSEND(hCommL1,mphp_timing_advance_req);
+} /* sig_gfp_tc_update_ta_req_ptm() */
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_ctrl_tc_enter_pam
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_CTRL_TC_ENTER_PAM.
+|
+| Parameters  : 
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_ctrl_tc_enter_pam ( void )
+{
+  TRACE_ISIG( "sig_ctrl_tc_enter_pam" );
+
+  switch( GET_STATE( TC ) )
+  {
+    case TC_WAIT_STOP_TASK_CNF:
+      if( grr_is_pbcch_present( ) )
+      {
+        if( grr_data->tc.last_eval_assign.tbf_type EQ CGRLC_TBF_MODE_DL )
+        {
+          sig_tc_ctrl_set_pckt_mode( GLBL_PCKT_MODE_ASSIGNED,
+                                     grr_data->tc.last_eval_assign.ccch_read );
+        }
+        else
+        {
+          SET_STATE( TC, TC_WAIT_ASSIGN );
+          vsi_t_start( GRR_handle, T3186, T3186_VALUE );
+          tc_send_ra_req( );
+        }
+      }
+      else
+      {
+        SET_STATE( TC, TC_CPAP );
+        sig_tc_cpap_acc_req( );
+      }
+      break;
+
+    default:
+      TRACE_ERROR( "SIG_CTRL_TC_ENTER_PAM unexpected" );
+      break;
+  }
+} /* sig_ctrl_tc_enter_pam() */
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_ctrl_tc_leave_to_ptm
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_CTRL_TC_LEAVE_TO_PTM
+|
+| Parameters  : 
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_ctrl_tc_leave_to_ptm ( void )
+{ 
+  TRACE_ISIG( "sig_ctrl_tc_leave_to_ptm" );
+
+  switch( GET_STATE( TC ) )
+  {
+    case TC_WAIT_STOP_TASK_CNF:
+      tc_mfree_assign( TRUE );
+
+#ifdef _SIMULATION_
+
+      switch( grr_data->tc.last_eval_assign.state )
+      {
+        case TC_ACCESS_DISABLED      : SET_STATE( TC, TC_ACCESS_DISABLED );       break;
+        case TC_CPAP                 : SET_STATE( TC, TC_CPAP );                  break;
+        case TC_PIM                  : SET_STATE( TC, TC_PIM );                   break;
+        case TC_WAIT_ASSIGN          : SET_STATE( TC, TC_WAIT_ASSIGN );           break;
+        case TC_POLLING              : SET_STATE( TC, TC_POLLING );               break;
+        case TC_WAIT_2P_ASSIGN       : SET_STATE( TC, TC_WAIT_2P_ASSIGN );        break;
+        case TC_CONTENTION_RESOLUTION: SET_STATE( TC, TC_CONTENTION_RESOLUTION ); break;
+        case TC_TBF_ACTIVE           : SET_STATE( TC, TC_TBF_ACTIVE);             break;
+        case TC_SINGLE_BLOCK         : SET_STATE( TC, TC_SINGLE_BLOCK);           break;
+        case TC_WAIT_STOP_TASK_CNF   : SET_STATE( TC, TC_WAIT_STOP_TASK_CNF);     break;
+
+        default:
+          SET_STATE( TC, grr_data->tc.last_eval_assign.state );
+          TRACE_ERROR( "sig_ctrl_tc_leave_to_ptm: unknown TC state" );
+          break;
+      }
+
+#else  /* #ifdef _SIMULATION_ */
+
+      SET_STATE( TC, grr_data->tc.last_eval_assign.state );
+
+#endif /* #ifdef _SIMULATION_ */
+
+      tc_handle_tbf_start( grr_data->tc.last_eval_assign.tbf_type );
+      break;
+
+    default:
+      TRACE_ERROR( "SIG_CTRL_TC_LEAVE_TO_PTM unexpected" );
+      break;
+  }
+} /* sig_ctrl_tc_leave_to_ptm() */
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_ctrl_tc_leave_to_pim
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_CTRL_TC_LEAVE_TO_PIM
+|
+| Parameters  : 
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_ctrl_tc_leave_to_pim ( void )
+{ 
+  TRACE_ISIG( "sig_ctrl_tc_leave_to_pim" );
+
+  tc_send_tbf_release_req( grr_data->tc.last_tbf_type, FALSE );
+
+} /* sig_ctrl_tc_leave_to_pim() */
+
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_gfp_tc_access_rej_ptm
++------------------------------------------------------------------------------
+| Description : Handles the signal SIG_GFP_TC_ACCESS_REJ_PTM
+|
+| Parameters  : -
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_gfp_tc_access_rej_ptm ( void )
+{ 
+  ULONG t3172_value=0;
+
+  TRACE_ISIG( "sig_gfp_tc_access_rej_ptm" );
+  TRACE_EVENT("ACC REJ PACCH" );
+
+  
+  switch(grr_data->tbf_type)
+  {
+    case CGRLC_TBF_MODE_UL:
+      /*
+       * wait for the end of the current UL TBF
+       */
+      if(grr_t_status( T3172_1 ) EQ 0)
+      {
+        TRACE_EVENT("Return to idle mode after release of DA");
+
+#if defined REL99 AND defined TI_PS_FF_TBF_EST_PACCH
+        if(grr_data->tc.tbf_est_pacch AND grr_t_status( T3170) EQ 0 )
+        {
+          /* GRLC has sent PCA or PRR. PAR received before PUA */
+          vsi_t_start(GRR_handle,T3170,tc_get_t3170_value());
+
+        }
+#endif
+      }
+
+      /*lint -fallthrough*/
+
+    case CGRLC_TBF_MODE_DL_UL:
+
+      /*
+       * UL TBF ends before the number of requested octets has been transferred, as if FINAL_ALLOCATION bit
+       * go to idle mode after release
+       * stop 3168
+       * check 3172
+       * Before initiating a new packet access procedure the mobile station shall decode the 
+       * PRACH Control Parameters if they are broadcast.
+       */
+
+      if(grr_data->uplink_tbf.mac_mode EQ FIXED_ALLOCATION)
+      {
+        tc_abort_tbf(CGRLC_TBF_MODE_UL); /* abort UL TBF*/
+
+      }
+      else if(grr_t_status( T3172_1 ) EQ 0 )
+      {
+        ;
+      }
+
+      /*lint -fallthrough*/
+
+    case CGRLC_TBF_MODE_DL:
+      if(grr_t_status( T3172_1 ) EQ 0 )
+      {
+        TRACE_EVENT("CGRLC_TBF_MODE_DL, T3172_1 is not running");
+        /*
+         * primtive is delted if prim_status is set, status indication is sent to higher layers
+         */
+        tc_cgrlc_ul_tbf_res(CGRLC_TBF_MODE_ACCESS_FAILED,CGRLC_PRIM_STATUS_ONE);
+        switch( tc_eval_access_rej(&t3172_value) )
+        {
+          case E_ACCESS_REJ_WAIT:
+            tc_start_timer_t3172( t3172_value );
+            sig_tc_ctrl_t3172_running();
+            break;
+          case E_ACCESS_REJ_NO_WAIT:
+            TRACE_EVENT("NO WAIT_INDICATION: nothing to do");
+            break;
+          default:
+            break;
+        }
+      } /* no else because additional rejects have to be ignored!! */
+      break;
+#if defined REL99 AND defined TI_PS_FF_TBF_EST_PACCH
+    case CGRLC_TBF_MODE_2PA:
+      /* PRR is sent by GRLC. NW responds with PAR */
+      if(grr_data->tc.tbf_est_pacch)
+      {
+    
+        if(grr_t_status( T3170) EQ 0 )
+           vsi_t_start(GRR_handle,T3170,tc_get_t3170_value());
+
+        switch( tc_eval_access_rej(&t3172_value) )
+        {
+          case E_ACCESS_REJ_WAIT:
+            tc_start_timer_t3172( t3172_value );
+            sig_tc_ctrl_t3172_running();
+            break;
+          case E_ACCESS_REJ_NO_WAIT:
+            TRACE_EVENT("NO WAIT_INDICATION: nothing to do");
+            break;
+          default:
+            break;
+        }
+      }
+      break;
+#endif
+    default:
+      break;
+  }/* switch tbf_type*/
+  
+} /* sig_gfp_tc_access_rej_ptm() */
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_gfp_tc_ts_reconfig_ptm
++------------------------------------------------------------------------------
+| Description : Handles the 
+|
+| Parameters  : 
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_gfp_tc_ts_reconfig_ptm ( void )
+{ 
+
+  TRACE_ISIG( "sig_gfp_tc_ts_reconfig_ptm" );
+  /*
+   * ASUMPTION:
+   * This primitive (re)assigns an uplink AND downlink assignment.
+   * if not the primitive is ignored.
+   * CASES:
+   * 1. ONLY UL_TBF is running:  reassignment of uplink AND assignment of downlink
+   * 2. ONLY DL_TBF is running:  reassignment of downlink AND assignment of uplink
+   * 3. DL_TBF AND UL_TBF is running:  reassignment of downlink AND reassignment of uplink
+   */    
+
+  switch( GET_STATE( TC ) )
+  {
+    case TC_CONTENTION_RESOLUTION:
+      TRACE_ERROR("TS RECONF in CONT: RES. ignored");
+      break; /*ignore during contention resolution procedure*/
+    case TC_TBF_ACTIVE:
+      switch(tc_eval_ts_reconf())
+      {
+        /*handle tbf starting time for uplink*/
+        case E_TS_UL_REASSIG_NEW_DL:
+        case E_TS_NEW_UL_DL_REASSIG:
+        case E_TS_UL_REASSIG_DL_REASSIG:
+          /*
+          TRACE_EVENT("Packet TS Reconfigure ");
+          */
+          tc_handle_tbf_start( CGRLC_TBF_MODE_DL_UL );
+          break;
+        case E_TS_IGNORE:
+          /*no effect on current tbfs*/
+          break;
+        case E_TS_RECONFIG_ERROR_RA:
+          TRACE_EVENT("Packet TS Reconfigure invalid");
+          vsi_t_stop(GRR_handle,T3168); 
+          tc_handle_error_ra();
+          break;
+        default:
+          TRACE_ERROR( "SIG_GFP_TC_TS_RECONFIG_PTM unexpected" );
+          break;
+      }
+      break;
+    default:
+      TRACE_ERROR( "SIG_GFP_TC_TS_RECONFIG_PTM unexpected" );
+      break;
+  }
+
+} /* sig_gfp_tc_ts_reconfig_ptm() */
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_gfp_tc_ul_assign_ptm
++------------------------------------------------------------------------------
+| Description : Handles the 
+|
+| Parameters  : 
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_gfp_tc_ul_assign_ptm  (void )
+{ 
+  TRACE_ISIG( "sig_gfp_tc_ul_assign_ptm " );
+
+
+  switch( GET_STATE( TC ) )
+  {
+    case TC_CONTENTION_RESOLUTION:
+    case TC_TBF_ACTIVE:      
+      switch( tc_eval_ul_assign() )
+      {
+        case E_UL_ASSIGN_DYNAMIC:
+          /*
+          TRACE_EVENT("Packet UL Assignment with dynamic allocation");
+          */
+          tc_handle_tbf_start( CGRLC_TBF_MODE_UL );
+          break;
+        case E_UL_ASSIGN_FIXED:
+          /*
+          TRACE_EVENT("Packet UL Assignment with fixed allocation");
+          */
+          tc_handle_tbf_start( CGRLC_TBF_MODE_UL );
+          break;
+#if defined REL99 AND defined TI_PS_FF_TBF_EST_PACCH
+        case  E_UL_ASSIGN_SB_2PHASE_ACCESS:
+          if((grr_data->tc.tbf_est_pacch) AND 
+             (!psc_db->gprs_cell_opt.ctrl_ack_type))
+          {
+            /* Control ack type is Access burst. GRLC would have sent 
+             * PCA as poll for initiating TBF est on PACCH. Send UL_TBF_RES
+             * to GRLC. Packet resource request message will be sent by GRLC.			 
+             */
+            TRACE_EVENT("TBF on pacch");
+            SET_STATE(TC,TC_WAIT_2P_ASSIGN);
+            tc_handle_tbf_start( CGRLC_TBF_MODE_2PA);
+          }
+          break;
+#endif
+
+
+ 
+
+        default:
+          TRACE_EVENT("Packet UL Assignment invalid");
+          tc_handle_error_ra();
+          break;
+      }
+      break;
+    default:
+      TRACE_ERROR( "SIG_GFP_TC_UL_ASSIGN_PTM  unexpected" );
+      break;
+  }
+
+} /* sig_gfp_tc_ul_assign_ptm () */
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_gfp_tc_dl_assign_ptm 
++------------------------------------------------------------------------------
+| Description : Handles the 
+|
+| Parameters  : 
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_gfp_tc_dl_assign_ptm ( void )
+{ 
+  TRACE_ISIG( "sig_gfp_tc_dl_assign_ptm" );
+
+  switch( GET_STATE( TC ) )
+  {
+    case TC_CONTENTION_RESOLUTION:
+      TRACE_ERROR("P. DL. ASS. in CONT: RES. ignored");
+      break; /*ignore during contention resolution procedure*/
+    case TC_TBF_ACTIVE:
+      switch( tc_eval_dl_assign() )
+      {
+        case E_DL_ASSIGN:
+          /*
+          TRACE_EVENT("Packet DL Assignment");
+          */
+          tc_handle_tbf_start( CGRLC_TBF_MODE_DL );
+          break;
+        case E_DL_ASSIGN_ERROR_RA:
+          TRACE_EVENT("Packet DL Assignment invalid");
+          tc_handle_error_ra();
+          break;
+        case E_DL_ASSIGN_IGNORE:
+          /*
+           *  If a failure in the PACKET DOWNLINK ASSIGNMENT is due to any reason, 
+           *  the mobile station shall abort the procedure and continue the normal 
+           *  operation of the uplink TBF.
+           */
+          break;
+        case E_DL_ASSIGN_ABORT_DL:
+          tc_abort_tbf(CGRLC_TBF_MODE_DL);
+          break;
+        default:
+          TRACE_ERROR( "Packet DL Assignment with unexpected content" );
+          break;
+      }
+      break;
+    default:
+      TRACE_ERROR( "SIG_GFP_TC_DL_ASSIGN_PTM unexpected" );
+      break;
+  }
+} /* sig_gfp_tc_dl_assign_ptm() */
+
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_gfp_tc_pdch_release_ptm ( tn );
++------------------------------------------------------------------------------
+| Description : Handles 
+|
+| Parameters  : tn_i
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_gfp_tc_pdch_release_ptm ( UBYTE tn)
+{ 
+  TRACE_ISIG( "sig_gfp_tc_pdch_release_ptm" );
+  
+  switch( GET_STATE( TC ) )
+  {
+    case TC_CONTENTION_RESOLUTION:
+    case TC_TBF_ACTIVE:
+      switch( tc_eval_pdch_rel(tn) )
+      {
+        case E_PDCH_REL_RECONF:
+          tc_send_pdch_rel(grr_data->pdch_rel_ts_mask);
+          break;
+        case E_PDCH_REL_RELEASE_DL_RECONF_UL:
+          tc_abort_tbf(CGRLC_TBF_MODE_DL);
+          tc_send_pdch_rel(grr_data->pdch_rel_ts_mask);
+          break;
+        case E_PDCH_REL_RELEASE_UL_RECONF_DL:
+          tc_abort_tbf(CGRLC_TBF_MODE_UL);
+          tc_send_pdch_rel(grr_data->pdch_rel_ts_mask);
+          break;
+        case E_PDCH_REL_RELEASE_BOTH:
+          tc_abort_tbf(CGRLC_TBF_MODE_DL_UL);
+          break;
+        case E_PDCH_REL_RELEASE_UL:
+          tc_abort_tbf(CGRLC_TBF_MODE_UL);
+          break;
+        case E_PDCH_REL_RELEASE_DL:
+          tc_abort_tbf(CGRLC_TBF_MODE_DL);
+          break;
+        default:
+          break;
+      } 
+      break;
+    default:
+      TRACE_ERROR( "SIG_GFP_TC_PDCH_RELEASE_PTM unexpected" );
+      break;
+  }
+
+  /*
+   *  in all states
+   */ 
+  if(grr_data->tbf_type EQ CGRLC_TBF_MODE_NULL)
+  {
+    /* new access is done when release confirm arrives */
+    SET_STATE(TC,TC_PIM);
+  }
+  else if(grr_data->tbf_type EQ CGRLC_TBF_MODE_DL)
+  {
+    SET_STATE(TC,TC_TBF_ACTIVE);
+  }
+
+
+} /* sig_gfp_tc_pdch_release_ptm() */
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_gfp_tc_queuing_not 
++------------------------------------------------------------------------------
+| Description : Handles 
+|
+| Parameters  : void
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_gfp_tc_queuing_not  ( void )
+{ 
+  TRACE_ISIG( "sig_gfp_tc_queuing_not " );
+  switch( GET_STATE( TC ) )
+  {
+    case TC_WAIT_ASSIGN:
+
+      SET_STATE(TC,TC_POLLING);
+      /* 
+       * stop sending packet access request 
+       */ 
+      tc_send_ra_stop_req();
+      
+      vsi_t_stop(GRR_handle,T3170);         
+      vsi_t_start(GRR_handle,T3162,T3162_VALUE);      
+
+      /*
+       * save tqi
+       */
+      {
+        MCAST(d_queuing_not,D_QUEUING_NOT);
+        grr_data->tqi = d_queuing_not->tqi;
+      }
+      break;
+    default:
+      TRACE_ERROR( "SIG_GFP_TC_QUEUING_NOT  unexpected" );
+      break;
+  }
+
+} /* sig_gfp_tc_queuing_not () */
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_gfp_tc_ul_assign
++------------------------------------------------------------------------------
+| Description : Handles 
+|
+| Parameters  : void
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_gfp_tc_ul_assign ( void )
+{ 
+  UBYTE  old_state = GET_STATE( TC );
+
+  TRACE_ISIG( "sig_gfp_tc_ul_assign" );
+  
+  if( grr_t_status( T3172_1 ) > 0 ) 
+  {
+    if( grr_t_status( T3170 ) > 0 )
+    {
+      /*
+       * stop T3172 and set some parameters
+       */
+      tc_stop_timer_t3172();
+    }
+    else if ( grr_t_status( T3176 ) EQ 0)
+    {
+      TRACE_EVENT("Ignore UL Assignment");
+      return;
+    }
+  }
+  
+  switch( old_state )
+  {
+    case TC_WAIT_2P_ASSIGN:
+      grr_data->uplink_tbf.ti = 0; 
+      /*  mark that contention resulution is not yet done    */
+
+      /*lint -fallthrough*/
+
+    case TC_WAIT_STOP_TASK_CNF:       
+      if (grr_data->tc.last_eval_assign.tbf_type EQ CGRLC_TBF_MODE_UL)
+      {
+        TRACE_EVENT("Reassignment for UL ASS in CNF state");
+      }
+      else if(grr_data->tc.last_eval_assign.tbf_type EQ CGRLC_TBF_MODE_DL)
+      {
+        TRACE_EVENT("Ignore UL ASS, wait for DL start");
+        break;
+      }
+      else if(grr_data->tc.last_eval_assign.tbf_type EQ CGRLC_TBF_MODE_NULL AND grr_data->uplink_tbf.ti)
+      {
+        TRACE_EVENT("Ignore UL ASS, wait for condirn to start RA procedure  !!!!");
+        break;
+      }
+
+      /*lint -fallthrough*/
+
+      /*
+       * else :TWO PHASE ACCESS IS RUNNING
+       */
+    case TC_POLLING:
+    case TC_WAIT_ASSIGN:
+     /* 
+      * stop sending packet access request if in progress
+      */ 
+      tc_send_ra_stop_req();
+
+      /*lint -fallthrough*/
+
+    case TC_SINGLE_BLOCK:
+    case TC_CONTENTION_RESOLUTION:
+      switch( tc_eval_ul_assign() )
+      {
+        case E_UL_ASSIGN_SB_2PHASE_ACCESS:
+          SET_STATE(TC,TC_WAIT_2P_ASSIGN); 
+          /* 
+           * send MPHP_SINGLE_BLOCK_REQ with PACKET RESOURCE REQUEST
+           */
+          tc_send_resource_request_p();
+          vsi_t_stop(GRR_handle,T3170);
+          break;
+
+        case E_UL_ASSIGN_DYNAMIC:
+          /*
+          TRACE_EVENT("Packet UL Assignment with dynamic allocation");
+          */
+          if(grr_data->uplink_tbf.ti)
+          {
+            SET_STATE(TC,TC_CONTENTION_RESOLUTION);
+          }
+          else
+          {
+            SET_STATE(TC,TC_TBF_ACTIVE);
+            sig_tc_ctrl_contention_ok();
+            grr_data->tc.two_2p_w_4_tbf_con = FALSE;
+          }
+          tc_prepare_handle_tbf_start( CGRLC_TBF_MODE_UL, GET_STATE( TC ), old_state );
+          break;
+        case E_UL_ASSIGN_FIXED:
+          /*TRACE_EVENT("Packet UL Assignment with fixed allocation");*/
+          if(grr_data->uplink_tbf.ti)
+          {
+            SET_STATE(TC,TC_CONTENTION_RESOLUTION);
+          }
+          else
+          {
+            SET_STATE(TC,TC_TBF_ACTIVE);
+            sig_tc_ctrl_contention_ok();
+          }
+          tc_prepare_handle_tbf_start( CGRLC_TBF_MODE_UL, GET_STATE( TC ), old_state );
+          break;
+        case E_UL_ASSIGN_SB_WITHOUT_TBF: 
+          TRACE_EVENT("Packet UL Assignment with single block allocation");
+          /* send MPHP_SINGLE_BLOCK_REQ with DATA      
+           * (measurement report)                              */
+          tc_send_single_block();
+          SET_STATE(TC,TC_SINGLE_BLOCK);
+          vsi_t_stop(GRR_handle,T3170);
+          break;
+        default:
+          vsi_t_stop(GRR_handle,T3170);
+          if(grr_data->tc.state EQ TC_WAIT_2P_ASSIGN OR
+             grr_data->tc.state EQ TC_SINGLE_BLOCK)
+          {
+            vsi_t_stop(GRR_handle,T3168);
+            TRACE_EVENT_P1("Packet UL Assignment invalid during 2 phase access state=%d",grr_data->tc.state);            
+            tc_stop_normal_burst_req( );
+          }
+          else
+          {
+            TRACE_EVENT("Packet UL Assignment invalid");            
+            tc_handle_error_ra();
+          }
+          break;
+      }
+      break;
+    default:
+      vsi_t_stop(GRR_handle,T3170);
+      TRACE_ERROR( "SIG_GFP_TC_UL_ASSIGN unexpected" );
+      break;
+  }
+
+} /* sig_gfp_tc_ul_assign() */
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_gfp_tc_dl_assign  
++------------------------------------------------------------------------------
+| Description : Handles 
+|
+| Parameters  : -
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_gfp_tc_dl_assign  (void)
+{ 
+  UBYTE old_state = GET_STATE( TC );
+
+  TRACE_ISIG( "sig_gfp_tc_dl_assign  " );
+
+  
+  switch( old_state  )
+  {        
+    case TC_WAIT_STOP_TASK_CNF:
+      TRACE_EVENT_P4("ASS IN CNF state:ccch_read=%d  tbf_Type =%d state=%d p_assign=%ld" 
+                       ,grr_data->tc.last_eval_assign.ccch_read
+                       ,grr_data->tc.last_eval_assign.tbf_type
+                       ,grr_data->tc.last_eval_assign.state
+                       ,grr_data->tc.p_assign);
+      if (grr_data->tc.last_eval_assign.tbf_type EQ CGRLC_TBF_MODE_UL)
+      {
+        TRACE_EVENT("Ignore DL ASS, wait for UL start");
+        break;
+      }
+
+      /*lint -fallthrough*/
+
+    case TC_WAIT_ASSIGN:
+     /* 
+      * stop sending packet access request if in progress
+      */ 
+      tc_send_ra_stop_req();
+
+      /*lint -fallthrough*/
+
+    case TC_PIM:
+    case TC_POLLING:
+    case TC_SINGLE_BLOCK:
+    case TC_TBF_ACTIVE:
+      switch( tc_eval_dl_assign() )
+      {
+        case E_DL_ASSIGN:
+          /*
+          TRACE_EVENT("Packet DL Assignment");
+          */
+          SET_STATE(TC,TC_TBF_ACTIVE);
+          if( grr_t_status( T3162 ) NEQ 0 )
+          {
+            vsi_t_stop(GRR_handle,T3162);/*ETSI 4.60 7.1.2.2.2.*/
+          }
+          tc_prepare_handle_tbf_start( CGRLC_TBF_MODE_DL, GET_STATE( TC ), old_state );
+          break;
+        case E_DL_ASSIGN_ERROR_RA:
+          TRACE_EVENT("Packet DL Assignment invalid");
+          vsi_t_stop(GRR_handle,T3170);
+
+          if(grr_data->tc.state EQ TC_SINGLE_BLOCK)
+          {
+            TRACE_EVENT_P1("Packet DL Assignment invalid during IA_DL_SB state=%d",grr_data->tc.state);            
+            tc_stop_normal_burst_req( );
+          }
+          else
+          {
+            tc_handle_error_ra();
+          }
+          break;
+        case E_DL_ASSIGN_IGNORE:
+          /*
+           *  If a failure in the PACKET DOWNLINK ASSIGNMENT is due to any reason, 
+           *  the mobile station shall abort the procedure and continue the normal 
+           *  operation of the uplink TBF.
+           */
+          vsi_t_stop(GRR_handle,T3170);
+          break;
+        default:
+          vsi_t_stop(GRR_handle,T3170);
+          TRACE_ERROR( "DL_ASSIGNMENT with unexpected content" );
+          break;
+      }
+      break;
+    default:
+      vsi_t_stop(GRR_handle,T3170);
+      TRACE_ERROR( "SIG_GFP_TC_DL_ASSIGN    unexpected" );
+      break;
+  }
+
+} /* sig_gfp_tc_dl_assign  () */
+
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_gfp_tc_access_rej 
++------------------------------------------------------------------------------
+| Description : Handles 
+|
+| Parameters  : void
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_gfp_tc_access_rej  ( void )
+{ 
+  ULONG t3172_value=0;
+  BOOL start_t3172 = TRUE;
+
+  TRACE_ISIG( "sig_gfp_tc_access_rej " );
+
+  if(grr_t_status( T3172_1 ) > 0)
+  {
+    TRACE_EVENT("T3172 running: Ignore PACKET ACCESS REJECT");
+  }
+  else
+  {
+    /*  The T3168 could running.  */
+    vsi_t_stop(GRR_handle,T3168); 
+
+    switch( GET_STATE( TC ) )
+    {
+      case TC_WAIT_ASSIGN:
+      case TC_POLLING:
+      case TC_WAIT_2P_ASSIGN:
+      case TC_SINGLE_BLOCK:
+        tc_send_ra_stop_req(); 
+        /*
+         *  stop Packet Access Request sending (T3186 will be stopped if runnig)
+         */
+        if( grr_t_status( T3174 ) > 0 )
+        {
+          TRACE_ERROR( " Access reject on the network commanded cell" );
+          grr_data->pcco_failure_cause   = 2;
+          sig_tc_ctrl_access_reject_on_new_cell();
+          /* Do not start the 3172 timer if on the new cell access reject is received */
+          start_t3172 = FALSE;
+        }
+        else
+        if(grr_t_status( T3170 ) EQ 0 )
+        {   /* T3170 is not running */
+          vsi_t_start(GRR_handle,T3170,tc_get_t3170_value());   
+          TRACE_EVENT("sig_gfp_tc_access_rej: t3170 started");
+        }
+        switch( tc_eval_access_rej( &t3172_value ) )
+        {
+          case E_ACCESS_REJ_WAIT:
+            if (start_t3172 EQ TRUE)
+            {
+              tc_start_timer_t3172( t3172_value );
+              sig_tc_ctrl_t3172_running();
+            }
+            break;
+          case E_ACCESS_REJ_NO_WAIT:
+            TRACE_EVENT("No value for T3172, go to idle mode after T3170 expiration");
+            break;
+          default:
+            break;
+        }
+        break;
+      default:
+        TRACE_ERROR( "SIG_GFP_TC_ACCESS_REJ  unexpected" );
+        break;
+    }
+  }/* ignore reject*/
+
+} /* sig_gfp_tc_access_rej () */
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_gfp_tc_ra_con
++------------------------------------------------------------------------------
+| Description : Handles 
+|
+| Parameters  : payload to primitive
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_gfp_tc_ra_con ( T_MPHP_RA_CON * mphp_ra_con_i )
+{ 
+  TRACE_ISIG( "sig_gfp_tc_ra_con" ); /*MODIF*/
+
+  /*
+   *  save last packet access request reference
+   *  see also 0408d640, 10.5.2.28
+   */
+
+  grr_data->req_ref[grr_data->tc.n_acc_req%3].fn_mod.t1 = 
+                           (UBYTE)( ( mphp_ra_con_i->fn / 1326) % 32 );
+  grr_data->req_ref[grr_data->tc.n_acc_req%3].fn_mod.t2 = 
+                           (UBYTE)( mphp_ra_con_i->fn % 26 ); 
+  grr_data->req_ref[grr_data->tc.n_acc_req%3].fn_mod.t3 = 
+                           (UBYTE)( mphp_ra_con_i->fn % 51 );
+
+
+  /*
+   * 0 8 bit access burst
+   * 1 11 bit access burst
+   */
+  if(psc_db->gprs_cell_opt.ab_type)
+  {
+    /*
+     *  11 Bit access burst
+     * b: bit
+     * b10 b9 b8 b7 b6 b5 b4 b3 b2 b1 b0
+     * should be sent to the network -according 04.60 and 0404- in the
+     * following 16-bit format:
+     * 0 0 0 0 0 b2 b1 b0 b10 b9 b8 b7 b6 b5 b4 b3
+     *
+     * We have to store the access info in the 
+     * b10 b9 b8 b7 b6 b5 b4 b3 b2 b1 b0 format
+     */
+    USHORT acc_inf, dummy = 0;
+    dummy = mphp_ra_con_i->channel_request_data;
+    dummy = dummy >> 8; /* 0 0 0 0 0 0 0 0 0 0 0 0 0 b2 b1 b0*/
+    acc_inf = mphp_ra_con_i->channel_request_data;
+    acc_inf = (acc_inf & 0xFF);/* 0 0 0 0 0 0 0 0 b10 b9 b8 b7 b6 b5 b4 b3 */
+    acc_inf = acc_inf << 3; /* 0 0 0 0 0 b10 b9 b8 b7 b6 b5 b4 b3 0 0 0 */
+    acc_inf = acc_inf | dummy;/* 0 0 0 0 0 b10 b9 b8 b7 b6 b5 b4 b3 b2 b1 b0 */
+    grr_data->req_ref[grr_data->tc.n_acc_req%3].access_info = acc_inf;
+  }
+  else
+  {
+    grr_data->req_ref[grr_data->tc.n_acc_req%3].access_info = mphp_ra_con_i->channel_request_data;
+  }
+
+  grr_data->tc.n_acc_req++;
+
+  grr_data->tc.ra_once_sent++;
+
+  if (grr_data->tc.ra_once_sent >= 2)
+  {
+    grr_data->r_bit = 1;
+  }
+
+  switch( GET_STATE( TC ) )
+  {
+    case TC_WAIT_ASSIGN:
+      switch( tc_handle_ra_con() )
+      {
+      case H_RA_CON_STOP_REQ:
+        tc_send_ra_stop_req();
+        break;
+      case H_RA_CON_CONTINUE:
+        tc_send_ra_req();
+        break;
+      default:
+        break;
+      } 
+      break;
+    default:
+      tc_send_ra_stop_req();
+      break;
+  }
+} /* sig_gfp_tc_ra_con() */
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_gfp_tc_ra_stop_con 
++------------------------------------------------------------------------------
+| Description : Handles the primitive T_MPHP_RA_STOP_CON 
+|
+| Parameters  : Ptr to primitive payload
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_gfp_tc_ra_stop_con ( T_MPHP_RA_STOP_CON * mphp_ra_stop_con_i )
+{ 
+  TRACE_ISIG( "sig_gfp_tc_ra_stop_con" );
+   
+  switch( GET_STATE( TC ) )
+  {
+    case TC_ACCESS_DISABLED:
+      tc_call_disable_callback_func( );
+      break;
+    default:
+      /* nothing to do */
+      break;
+  }
+} /* sig_gfp_tc_ra_stop_con() */
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_gfp_tc_single_block_cnf
++------------------------------------------------------------------------------
+| Description : Handles 
+|
+| Parameters  : *mphp_single_block_con - Ptr to primitive payload
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_gfp_tc_single_block_cnf ( T_MPHP_SINGLE_BLOCK_CON *mphp_single_block_con)
+{ 
+  TRACE_ISIG( "sig_gfp_tc_single_block_cnf" );
+  
+  switch( GET_STATE( TC ) )
+  {
+    case TC_WAIT_2P_ASSIGN:
+      if(!mphp_single_block_con->sb_status)
+      {
+        /*
+         * TRACE_EVENT_P1("T3168 start: %d ms",((psc_db->gprs_cell_opt.t3168)+1)*500);
+         */
+        vsi_t_start(GRR_handle,T3168,(psc_db->gprs_cell_opt.t3168+1)*500); 
+        sig_tc_ctrl_set_pckt_mode( GLBL_PCKT_MODE_ACCESS_TWO_PHASE, TASK_STOP_DUMMY_VALUE );
+      }
+      else
+      {
+        vsi_t_stop(GRR_handle,T3168);
+        TRACE_ERROR("Single Block not sent by layer 1");
+        TRACE_EVENT_P1("sb_status = %d",mphp_single_block_con->sb_status);
+        sig_tc_ctrl_set_pckt_mode( GLBL_PCKT_MODE_ACCESS_TWO_PHASE, TASK_STOP_DUMMY_VALUE );
+        tc_stop_normal_burst_req( );
+      }
+      break;
+    case TC_SINGLE_BLOCK:
+      if(mphp_single_block_con->purpose EQ SINGLE_BLOCK_TRANSFER_UL)   
+      {
+        BOOL is_tx_success = mphp_single_block_con->sb_status EQ SB_STAT_OK;       
+        tc_set_stop_ctrl_blk ( is_tx_success,CGRLC_BLK_OWNER_NONE, 0 ); 
+        sig_tc_ctrl_set_pckt_mode( GLBL_PCKT_MODE_MEAS_REP_IDLE, TASK_STOP_DUMMY_VALUE );
+      }
+      else
+      {
+        sig_tc_ctrl_set_pckt_mode( GLBL_PCKT_MODE_ACCESS_TWO_PHASE, TASK_STOP_DUMMY_VALUE );
+      }
+      tc_stop_normal_burst_req( );
+      break;
+    case TC_ACCESS_DISABLED:
+      /* 
+       * After receiving a Packet Cell Change Order the signal SIG_GFP_SINGLE_BLOCK_CNF
+       * was unexpected. MPHP_STOP_SINGLE_BLOCK_REQ is sent during disableing of the
+       * GRR services.
+       */
+      break;
+    default:
+      TRACE_ERROR( "SIG_GFP_TC_SINGLE_BLOCK_CNF unexpected" );
+      break;
+  }
+} /* sig_gfp_tc_single_block_cnf () */
+
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_gfp_tc_assignment_con 
++------------------------------------------------------------------------------
+| Description : Handles 
+|
+| Parameters  : void
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_gfp_tc_assignment_con  ( void )
+{ 
+  TRACE_ISIG( "sig_gfp_tc_assignment_con " );
+
+  grr_data->tc.two_2p_w_4_tbf_con = TRUE;
+  
+  if(grr_data->tc.state NEQ TC_ACCESS_DISABLED)
+  {
+    if(grr_is_pbcch_present( ))
+    {
+      grr_data->tc.last_eval_assign.ccch_read = 0xFF;  
+      grr_data->tc.last_eval_assign.tbf_type  = CGRLC_TBF_MODE_NULL; 
+      grr_data->tc.last_eval_assign.state     = 0xFF;
+    }
+    sig_tc_ctrl_set_pckt_mode( GLBL_PCKT_MODE_TRANSFER, TASK_STOP_DUMMY_VALUE );
+  }
+  else
+  {
+    TRACE_EVENT_P1("TBF_C in TC_ACCESS_DISABLED: do not sent sig_tc_ctrl_set_pckt_mode num_rel=%d ",grr_data->tc.num_of_rels_running );
+  }
+
+
+} /* sig_gfp_tc_assignment_con () */
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_gfp_tc_tbf_release_con
++------------------------------------------------------------------------------
+| Description : Handles 
+|
+| Parameters  : T_MPHP_TBF_RELEASE_CON * mphp_tbf_release_con_i  
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_gfp_tc_tbf_release_con (  T_MPHP_TBF_RELEASE_CON * mphp_tbf_release_con_i  )
+{ 
+  T_RELEASE_STATE rel_state= REL_RUNNING;
+  TRACE_ISIG( "sig_gfp_tc_tbf_release_con" );
+
+  if(mphp_tbf_release_con_i->tbf_type EQ UL_DL_ASSIGNMENT)
+    grr_data->tc.num_of_rels_running = 0;
+  else if (grr_data->tc.num_of_rels_running)
+    grr_data->tc.num_of_rels_running--;
+  else
+  {
+    TRACE_EVENT_P2("REL CON UNEXPECTED num=%d  tbf_rel_type=%d "
+                                    ,grr_data->tc.num_of_rels_running
+                                    ,mphp_tbf_release_con_i->tbf_type);
+  }
+  
+  if(!grr_data->tc.num_of_rels_running)
+  {
+    rel_state = REL_PERFORMED;
+    if(grr_is_pbcch_present( ))
+    {
+      grr_data->tc.last_eval_assign.ccch_read = 0xFF;  
+      grr_data->tc.last_eval_assign.tbf_type  = CGRLC_TBF_MODE_NULL; 
+      grr_data->tc.last_eval_assign.state     = 0xFF;
+    }
+  }
+
+  sig_tc_ctrl_rel_state(rel_state);
+
+  switch( GET_STATE( TC ) )
+  {
+    case TC_PIM:
+      grr_data->ta_params.ta_value = 0xFF;
+      grr_data->ta_params.ta_valid = FALSE;
+      memset(&grr_data->ta_params, 0xFF, sizeof(T_TA_PARAMS));
+
+      if(0 EQ grr_data->tc.num_of_rels_running)
+      {
+        grr_data->tc.v_freq_set = FALSE;
+
+        if( grr_data->tc.disable_callback_func EQ NULL )
+        {
+          /*enable access for grlc*/
+          tc_cgrlc_tbf_rel_res( mphp_tbf_release_con_i->tbf_type ); /* release of all tbfs, grr has entered PIM, transition rule is taken into acocount*/
+        }
+        else
+        {
+          SET_STATE( TC, TC_ACCESS_DISABLED );
+
+          tc_cgrlc_disable_req ( CGRLC_PRIM_STATUS_NULL );
+          tc_call_disable_callback_func( );
+        }
+      }/* else: wait for last release confirm */
+      else
+      {
+        tc_cgrlc_tbf_rel_res( mphp_tbf_release_con_i->tbf_type );
+
+        TRACE_EVENT_P1("WAIT FOR %d TBF RELEASE CON ",grr_data->tc.num_of_rels_running);
+      }
+      break;
+    case TC_ACCESS_DISABLED:      
+      grr_data->ta_params.ta_value    = 0xFF;
+      grr_data->ta_params.ta_valid    = FALSE;
+      memset(&grr_data->ta_params, 0xFF, sizeof(T_TA_PARAMS));
+      grr_data->tc.v_freq_set         = FALSE;
+      grr_data->tc.two_2p_w_4_tbf_con = TRUE;
+
+      tc_cgrlc_disable_req ( CGRLC_PRIM_STATUS_NULL );
+
+      if(0 EQ grr_data->tc.num_of_rels_running)
+      {
+        tc_call_disable_callback_func( );
+      }
+      else
+      {
+        TRACE_EVENT_P1("REL_C in disable state: nr_rel=%d",grr_data->tc.num_of_rels_running);
+      }
+      break;
+    case TC_CONTENTION_RESOLUTION:
+    case TC_TBF_ACTIVE:
+      /*
+       * update timimg advance
+       */
+      switch(mphp_tbf_release_con_i->tbf_type )
+      {
+        case DL_ASSIGNMENT:
+          { 
+            tc_cgrlc_tbf_rel_res( mphp_tbf_release_con_i->tbf_type );
+          
+            /* 
+             * downlink tbf released, set ul ta, if it is different 
+             */
+            if(!((grr_data->ta_params.l1_ta_value EQ grr_data->ta_params.ta_value) AND
+                 (grr_data->ta_params.l1_ta_i     EQ grr_data->ta_params.ul_ta_i)  AND
+                 (grr_data->ta_params.l1_ta_tn    EQ grr_data->ta_params.ul_ta_tn)))
+            {
+              PALLOC(mphp_timing_advance_req,MPHP_TIMING_ADVANCE_REQ);/* T_MPHP_TIMING_ADVANCE_REQ */
+              mphp_timing_advance_req->assign_id = 0;
+              mphp_timing_advance_req->p_timing_advance.ta_value = grr_data->ta_params.ta_value;
+              mphp_timing_advance_req->p_timing_advance.ta_index = grr_data->ta_params.ul_ta_i;
+              mphp_timing_advance_req->p_timing_advance.tn       = grr_data->ta_params.ul_ta_tn;
+              PSEND(hCommL1,mphp_timing_advance_req);
+              TRACE_EVENT_P5("DL TBF_REL TAU: new: %d %d %d-- old %d %d"
+                                                            ,grr_data->ta_params.ta_value
+                                                            ,grr_data->ta_params.ul_ta_i
+                                                            ,grr_data->ta_params.ul_ta_tn
+                                                            ,grr_data->ta_params.dl_ta_i
+                                                            ,grr_data->ta_params.dl_ta_tn);
+              grr_data->ta_params.dl_ta_i  = 0xFF;
+              grr_data->ta_params.dl_ta_tn = 0xFF;
+            }
+          }
+          break;
+        case UL_ASSIGNMENT:
+          { 
+            tc_cgrlc_tbf_rel_res( mphp_tbf_release_con_i->tbf_type );
+          
+            /* 
+             * uplink tbf released, set dl ta, if it is different
+             */
+            if(!((grr_data->ta_params.l1_ta_value EQ grr_data->ta_params.ta_value) AND
+                 (grr_data->ta_params.l1_ta_i     EQ grr_data->ta_params.dl_ta_i)  AND
+                 (grr_data->ta_params.l1_ta_tn    EQ grr_data->ta_params.dl_ta_tn)))
+            {
+              PALLOC(mphp_timing_advance_req,MPHP_TIMING_ADVANCE_REQ);/* T_MPHP_TIMING_ADVANCE_REQ */
+              mphp_timing_advance_req->assign_id = 0;
+              mphp_timing_advance_req->p_timing_advance.ta_value = grr_data->ta_params.ta_value;
+              mphp_timing_advance_req->p_timing_advance.ta_index = grr_data->ta_params.dl_ta_i;
+              mphp_timing_advance_req->p_timing_advance.tn       = grr_data->ta_params.dl_ta_tn;
+              PSEND(hCommL1,mphp_timing_advance_req);
+              TRACE_EVENT_P5("UL TBF_REL TAU: new: %d %d %d-- old %d %d"
+                                                            ,grr_data->ta_params.ta_value
+                                                            ,grr_data->ta_params.dl_ta_i
+                                                            ,grr_data->ta_params.dl_ta_tn
+                                                            ,grr_data->ta_params.ul_ta_i
+                                                            ,grr_data->ta_params.ul_ta_tn);
+
+              grr_data->ta_params.ul_ta_i  = 0xFF;
+              grr_data->ta_params.ul_ta_tn = 0xFF;
+            }
+          }
+          break;
+        default:
+          TRACE_ERROR( "TBF RELEASED, stay in tbf mode, concurrent tbf or no tbf ????" );
+      break;
+      }
+      break;
+    case TC_CPAP:
+    case TC_WAIT_ASSIGN:
+    case TC_POLLING:
+    case TC_WAIT_2P_ASSIGN:
+      /* in these cases the prim shall not occur */
+    default:
+      TRACE_ERROR( "SIG_GFP_TC_TBF_RELEASE_CON unexpected" );
+      break;
+  }
+   
+} /* sig_gfp_tc_tbf_release_con() */
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_gfp_tc_stop_single_block_con
++------------------------------------------------------------------------------
+| Description : Handles 
+|
+| Parameters  : T_MPHP_STOP_SINGLE_BLOCK_CON * mphp_stop_single_block_con_i
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_gfp_tc_stop_single_block_con (T_MPHP_STOP_SINGLE_BLOCK_CON * mphp_stop_single_block_con_i )
+{ 
+  TRACE_ISIG( "sig_gfp_tc_stop_single_block_con" );
+  
+  switch( GET_STATE( TC ) )
+  {
+    case TC_PIM:
+      TRACE_EVENT("MPHP_STOP_SINGLE_BLOCK_CON in TC_PIM: nothing to do");
+      tc_cgrlc_access_status_req();
+      break;
+    case TC_WAIT_2P_ASSIGN:
+      if(grr_t_status( T3172_1 ) > 0)
+      {        
+        tc_cgrlc_ul_tbf_res(CGRLC_TBF_MODE_ACCESS_FAILED,CGRLC_PRIM_STATUS_ONE);
+        sig_tc_ctrl_set_pckt_mode( GLBL_PCKT_MODE_IDLE, TASK_STOP_DUMMY_VALUE );
+      }
+      else
+      {
+        /*
+         * two phase access has failed
+         */
+        SET_STATE(TC,TC_PIM);
+        tc_cgrlc_ul_tbf_res(CGRLC_TBF_MODE_ACCESS_FAILED,CGRLC_PRIM_STATUS_NULL);
+      }
+      break;
+    case TC_ACCESS_DISABLED:      
+      if(!grr_data->tc.two_2p_w_4_tbf_con)
+      {
+        TRACE_EVENT("BLC_C abort TBF");
+        tc_abort_tbf( grr_data->tbf_type );       
+      }
+      else
+      {
+        tc_call_disable_callback_func( );
+      }
+
+      break;
+    case TC_SINGLE_BLOCK:
+      /*
+       * single block procedure for uplink ctrl message or receiving DL block stopped
+       */
+       /*
+        * Stay in TC_SINGLE_BLOCK state while access reject is running.
+        * Go to TC_PIM after T3170 is expired
+        */
+      if( grr_t_status( T3170 ) EQ 0 )
+      {
+        SET_STATE(TC,TC_PIM);
+        tc_cgrlc_access_status_req();
+      }
+      break;
+    default:
+      TRACE_ERROR( "SIG_GFP_TC_STOP_SINGLE_BLOCK_CON unexpected" );
+      break;
+  }
+} /* sig_gfp_tc_stop_single_block_con () */
+
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_gfp_tc_packet_tbf_rel_ptm 
++------------------------------------------------------------------------------
+| Description : Handles the signal sig_gfp_tc_packet_tbf_rel_ptm
+|
+| Parameters  : 
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_gfp_tc_packet_tbf_rel_ptm (ULONG fn, UBYTE rrbp, UBYTE sp  )
+{
+  MCAST(d_tbf_release,D_TBF_RELEASE);
+
+  TRACE_ISIG( "sig_gfp_tc_packet_tbf_rel_ptm" );
+   
+  switch( GET_STATE( TC ) )
+  {
+    case TC_CONTENTION_RESOLUTION:
+    case TC_TBF_ACTIVE:
+
+
+      if( !d_tbf_release->dl_release AND  
+          !d_tbf_release->ul_release) 
+      {
+        TRACE_ERROR("no release request in packet tbf release");
+        return;
+      }
+      else
+      {
+        T_TBF_TYPE tbf_type = CGRLC_TBF_MODE_NULL;
+        UBYTE rel_cause     = CGRLC_TBF_REL_ABNORMAL;
+        ULONG rel_fn        = CGRLC_STARTING_TIME_NOT_PRESENT;
+
+
+        if( d_tbf_release->dl_release AND 
+            d_tbf_release->ul_release )
+        {
+          if (grr_data->tbf_type EQ CGRLC_TBF_MODE_DL_UL)
+          {
+            tbf_type = CGRLC_TBF_MODE_DL_UL;
+          }
+          else if (grr_data->tbf_type EQ CGRLC_TBF_MODE_UL)
+          {
+            tbf_type = CGRLC_TBF_MODE_UL;
+          }
+          else if (grr_data->tbf_type EQ CGRLC_TBF_MODE_DL)
+          {
+            tbf_type = CGRLC_TBF_MODE_DL;
+          }    
+        }
+
+        else 
+        if (  d_tbf_release->dl_release                  AND 
+           ((grr_data->tbf_type EQ CGRLC_TBF_MODE_DL)    OR 
+            (grr_data->tbf_type EQ CGRLC_TBF_MODE_DL_UL)))
+        {
+          tbf_type = CGRLC_TBF_MODE_DL;
+        }
+
+        else 
+        if (  d_tbf_release->ul_release                  AND 
+           ((grr_data->tbf_type EQ CGRLC_TBF_MODE_UL)    OR
+            (grr_data->tbf_type EQ CGRLC_TBF_MODE_DL_UL)))
+        {
+          tbf_type = CGRLC_TBF_MODE_UL;
+        }
+
+
+        if( sp )
+        {
+          rel_fn = grr_calc_new_poll_pos(fn,rrbp);
+        }
+           
+        if( d_tbf_release->rel_cause EQ NORMAL_RELEASE)
+        {
+          if ( d_tbf_release->ul_release                AND 
+             ((grr_data->tbf_type EQ CGRLC_TBF_MODE_UL)  OR
+             (grr_data->tbf_type EQ CGRLC_TBF_MODE_DL_UL)))
+              
+          {
+             rel_cause = CGRLC_TBF_REL_NORMAL; 
+          }
+        }
+
+        tc_cgrlc_tbf_rel_req(tbf_type,rel_cause,rel_fn);
+      }
+      break;
+    default:
+      TRACE_ERROR( "SIG_GFP_TC_PACKET_TBF_REL_PTM unexpected" );
+      break;
+  }
+
+} /* sig_gfp_tc_packet_tbf_rel_ptm () */
+
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_gfp_tc_poll_ind 
++------------------------------------------------------------------------------
+| Description : Handles the signal sig_gfp_tc_poll_ind
+|
+| Parameters  : 
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_gfp_tc_poll_ind (ULONG fn, UBYTE rrbp, UBYTE poll_type,UBYTE pctrl_ack  )
+{
+
+  TRACE_ISIG( "sig_gfp_tc_poll_ind" );
+   
+  switch( GET_STATE( TC ) )
+  {
+    case TC_PIM:
+    case TC_CPAP:
+    case TC_POLLING:
+    case TC_WAIT_ASSIGN:
+    case TC_WAIT_2P_ASSIGN:
+    case TC_SINGLE_BLOCK:
+    case TC_WAIT_STOP_TASK_CNF:
+
+      switch(grr_data->tbf_type)
+      {
+        case CGRLC_TBF_MODE_NULL: 
+          tc_send_polling_res ( poll_type,fn,rrbp,pctrl_ack);
+          break;
+          default:
+            TRACE_ERROR( "SIG_GFP_TC_POLL_IND unexpected tbf_type" );
+            break;
+      } 
+      break;
+    default:
+      TRACE_ERROR( "SIG_GFP_TC_POLL_IND unexpected" );
+      break;
+  }
+
+} /* sig_gfp_tc_poll_ind () */
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_ctrl_tc_delete_cs_msg
++------------------------------------------------------------------------------
+| Description : This function deletes the control blocks of cs owner. This
+|               function is called when MS is moving from PAM to PTM. In this 
+|               scenario it has to delete PMRs if any.
+|
+| Parameters  : 
+|
++------------------------------------------------------------------------------
+*/
+
+GLOBAL void sig_ctrl_tc_delete_cs_msg        ( void )
+{
+  UBYTE i= 0;
+
+  TRACE_FUNCTION( "sig_ctrl_tc_delete_cs_msg" );
+
+    
+  while( i                               <   MAX_CTRL_BLK_NUM AND 
+         grr_data->tc.ul_ctrl_blk.seq[i] NEQ MAX_CTRL_BLK_NUM     )
+  {
+    if( grr_data->tc.ul_ctrl_blk.blk[grr_data->tc.ul_ctrl_blk.seq[i]].state
+                                                       EQ BLK_STATE_ALLOCATED )
+    {
+      /* remove control block */
+      TRACE_EVENT_P2("Delete Control msg sequence:%d owner:%d",
+          grr_data->tc.ul_ctrl_blk.seq[i],
+          grr_data->tc.ul_ctrl_blk.blk[grr_data->tc.ul_ctrl_blk.seq[i]].owner);
+      if (CGRLC_BLK_OWNER_CS EQ grr_data->tc.ul_ctrl_blk.blk[grr_data->tc.ul_ctrl_blk.seq[i]].owner)
+      {
+          tc_cancel_ctrl_blk(grr_data->tc.ul_ctrl_blk.blk[grr_data->tc.ul_ctrl_blk.seq[i]].owner);
+      }
+	  
+    }
+  }
+
+
+}/* sig_ctrl_tc_delete_cs_msg*/