FreeCalypso > hg > fc-magnetite
diff src/g23m-gprs/grr/grr_tcs.c @ 183:219afcfc6250
src/g23m-gprs: initial import from TCS3.2/LoCosto
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Thu, 13 Oct 2016 04:24:13 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/g23m-gprs/grr/grr_tcs.c Thu Oct 13 04:24:13 2016 +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*/