FreeCalypso > hg > fc-magnetite
view src/g23m-gprs/grr/grr_tcs.c @ 481:24078551b620
build system: set ALLOW_CSIM_GSM=1 by default for hybrid configs
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Tue, 19 Jun 2018 06:39:18 +0000 |
parents | 219afcfc6250 |
children |
line wrap: on
line source
/* +----------------------------------------------------------------------------- | 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*/