FreeCalypso > hg > fc-magnetite
view src/g23m-gprs/grlc/grlc_tms.c @ 218:75ea63a3fce5
README updated for the current status of the project
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sat, 15 Oct 2016 19:30:58 +0000 |
parents | 219afcfc6250 |
children |
line wrap: on
line source
/* +----------------------------------------------------------------------------- | Project : GPRS (8441) | Modul : GRLC +----------------------------------------------------------------------------- | 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 | TM of entity GRLC. +----------------------------------------------------------------------------- */ #ifndef GRLC_TMS_C #define GRLC_TMS_C #endif #define ENTITY_GRLC /*==== 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_grlc.h" /* to get cnf-definitions */ #include "mon_grlc.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 "grlc.h" /* to get the global entity definitions */ #include "grlc_f.h" /* to get the global entity definitions */ #include "grlc_tmf.h" /* to get the service TM procedure definitions */ #include "grlc_tms.h" /* to get the service TM signal definitions */ #include "grlc_rus.h" /* to get the service RU signal definitions */ #include "grlc_rds.h" /* to get the service RD signal definitions */ #if defined REL99 AND defined TI_PS_FF_TBF_EST_PACCH #include "grlc_gffs.h" #endif /*==== CONST ================================================================*/ /*==== DIAGNOSTICS ==========================================================*/ /*==== LOCAL TYPES===========================================================*/ /*==== LOCAL VARS ===========================================================*/ /*==== PRIVATE FUNCTIONS ====================================================*/ /*==== PUBLIC FUNCTIONS =====================================================*/ /* +------------------------------------------------------------------------------ | Function : tm_get_ctrl_blk +------------------------------------------------------------------------------ | Description : | | Parameters : | +------------------------------------------------------------------------------ */ GLOBAL UBYTE* tm_get_ctrl_blk ( UBYTE *index, BOOL unacknowledged ) { UBYTE *ctrl_blk; TRACE_FUNCTION( "tm_get_ctrl_blk" ); ctrl_blk = tm_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 */ tm_set_stop_ctrl_blk( TRUE, CGRLC_BLK_OWNER_NONE, 0 ); } return( ctrl_blk ); } /* tm_get_ctrl_blk() */ /* +------------------------------------------------------------------------------ | Function : tm_is_ctrl_blk_rdy +------------------------------------------------------------------------------ | Description : | | Parameters : | +------------------------------------------------------------------------------ */ GLOBAL BOOL tm_is_ctrl_blk_rdy ( UBYTE ack_cnt_meas_rpt, UBYTE ack_cnt_other ) { BOOL result = FALSE; T_BLK_INDEX blk_index = grlc_data->tm.ul_ctrl_blk.seq[0]; TRACE_FUNCTION( "tm_is_ctrl_blk_rdy" ); if( blk_index NEQ MAX_CTRL_BLK_NUM ) { switch( grlc_data->tm.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 ); } /* tm_is_ctrl_blk_rdy() */ /* +------------------------------------------------------------------------------ | Function : tm_get_num_ctrl_blck +------------------------------------------------------------------------------ | Description : This function returns the number of allocated control blocks. | | Parameters : | +------------------------------------------------------------------------------ */ GLOBAL UBYTE tm_get_num_ctrl_blck ( void ) { UBYTE i = 0; /* used for counting */ UBYTE num = 0; /* number of allocated control blocks */ TRACE_FUNCTION( "tm_get_num_ctrl_blck" ); while( i < MAX_CTRL_BLK_NUM AND grlc_data->tm.ul_ctrl_blk.seq[i] NEQ MAX_CTRL_BLK_NUM ) { if( grlc_data->tm.ul_ctrl_blk.blk[grlc_data->tm.ul_ctrl_blk.seq[i]].state EQ BLK_STATE_ALLOCATED ) { num++; } i++; } return( num ); } /* tm_get_num_ctrl_blck() */ /* +------------------------------------------------------------------------------ | Function : tm_cpy_ctrl_blk_to_buffer +------------------------------------------------------------------------------ | Description : This function ... | | Parameters : | +------------------------------------------------------------------------------ */ GLOBAL UBYTE tm_cpy_ctrl_blk_to_buffer( UBYTE *buffer ) { UBYTE index; UBYTE *ctrl_block = tm_get_ctrl_blk( &index, FALSE ); TRACE_FUNCTION( "tm_cpy_ctrl_blk_to_buffer" ); if( ctrl_block NEQ NULL ) { memcpy( buffer, ctrl_block, BYTE_UL_CTRL_BLOCK ); } else { TRACE_ERROR( "tm_cpy_ctrl_blk_to_buffer: ctrl_block EQ NULL" ); } return( index ); } /* tm_cpy_ctrl_blk_to_buffer() */ /*==== SIGNAL FUNCTIONS =====================================================*/ /* +------------------------------------------------------------------------------ | Function : sig_ru_tm_error_ra +------------------------------------------------------------------------------ | Description : Handles the internal signal SIG_RU_TM_ERROR_RA | in case of contention resulution failed in service RU | refer to GSM0460v650 p35 | | Parameters : void | +------------------------------------------------------------------------------ */ GLOBAL void sig_ru_tm_error_ra ( void ) { TRACE_ISIG( "sig_ru_tm_error_ra" ); switch( GET_STATE( TM ) ) { case TM_PTM: if( grlc_data->testmode.mode EQ CGRLC_TEST_RANDOM OR grlc_data->testmode.mode EQ CGRLC_LOOP ) { tm_abort_tbf(grlc_data->tbf_type); tm_delete_prim_queue(); SET_STATE(TM,TM_WAIT_4_PIM); grlc_data->tm.n_acc_req_procedures = 0; grlc_data->tm.n_res_req = 0; /* reset counter of resource requests during access */ } else { tm_handle_error_ra(); } break; default: TRACE_ERROR( "SIG_RU_TM_ERROR_RA unexpected" ); break; } } /* sig_ru_tm_error_ra() */ /* +------------------------------------------------------------------------------ | Function : sig_ru_tm_cs +------------------------------------------------------------------------------ | Description : Handles the internal signal SIG_RU_TM_CS | | Parameters : void | +------------------------------------------------------------------------------ */ GLOBAL void sig_ru_tm_cs ( void ) { TRACE_ISIG( "sig_ru_tm_cs" ); switch( GET_STATE( TM ) ) { case TM_PTM: /*TRACE_EVENT_P1("CONT_RES:nacc set from %d to zero",grlc_data->tm.n_acc_req_procedures);*/ grlc_data->tm.n_acc_req_procedures = 0; grlc_data->uplink_tbf.ti = 0; { PALLOC(prim,CGRLC_CONT_RES_DONE_IND); PSEND(hCommGRR,prim); } break; default: TRACE_ERROR( "SIG_RU_TM_CS unexpected" ); break; } } /* sig_ru_tm_cs() */ /* +------------------------------------------------------------------------------ | Function : sig_ru_tm_end_of_tbf +------------------------------------------------------------------------------ | Description : Handles the internal signal SIG_RU_TM_END_OF_TBF | | Parameters : void | +------------------------------------------------------------------------------ */ GLOBAL void sig_ru_tm_end_of_tbf ( void ) { TRACE_ISIG( "sig_ru_tm_end_of_tbf" ); /* * TBF end handling for TEST_MODE */ if((grlc_data->testmode.mode EQ CGRLC_TEST_RANDOM ) OR (grlc_data->testmode.mode EQ CGRLC_LOOP ) ) { grlc_delete_prim(); tm_handle_grlc_ready_ind(); } switch( GET_STATE( TM ) ) { case TM_PTM: /* stop timer for sending chan req desc in dl ack/nack if running */ /*TRACE_EVENT_P1("End of tbf:nacc set from %d to zero",grlc_data->tm.n_acc_req_procedures);*/ grlc_data->tm.n_acc_req_procedures = 0; grlc_data->tm.n_res_req = 0; vsi_t_stop(GRLC_handle,T3168); switch( grlc_data->tbf_type ) { case TBF_TYPE_CONC: case TBF_TYPE_UL: tm_send_tbf_rel(TBF_TYPE_UL); tm_deactivate_tbf(TBF_TYPE_UL); break; default: break; } break; default: TRACE_ERROR( "SIG_RU_TM_END_OF_TBF unexpected" ); break; } switch(grlc_data->tbf_type) { case TBF_TYPE_NULL: SET_STATE(TM,TM_WAIT_4_PIM); break; case TBF_TYPE_DL: /* * uplink tbf released, downlink is still running, a new pdu is uplink queue */ tm_ul_tbf_ind(); break; default: TRACE_ERROR( "tm_deactivate_tbf did not work correct in sig_ru_tm_end_of_tbf" ); break; } } /* sig_ru_tm_end_of_tbf() */ /* +------------------------------------------------------------------------------ | Function : sig_rd_tm_end_of_tbf +------------------------------------------------------------------------------ | Description : Handles the internal signal SIG_RD_TM_END_OF_TBF | | Parameters : rel_ul - release UL TBF also. ( True,False) | +------------------------------------------------------------------------------ */ GLOBAL void sig_rd_tm_end_of_tbf ( BOOL rel_ul ) { /* T_TIME dummy; */ TRACE_ISIG( "sig_rd_tm_end_of_tbf" ); switch( GET_STATE( TM ) ) { case TM_PTM: if( grlc_data->testmode.mode EQ CGRLC_LOOP ) { TRACE_EVENT("TESTMODE B: Normal DL release "); tm_send_tbf_rel(grlc_data->tbf_type); sig_tm_ru_abrel(1, FALSE); tm_deactivate_tbf(grlc_data->tbf_type); tm_delete_prim_queue(); SET_STATE(TM,TM_WAIT_4_PIM); grlc_data->tm.n_acc_req_procedures = 0; grlc_data->tm.n_res_req = 0; /* reset counter of resource requests during access */ vsi_t_stop(GRLC_handle,T3168); return; } if (rel_ul AND grlc_data->tbf_type EQ TBF_TYPE_CONC) { sig_tm_ru_abrel(1, FALSE); tm_send_tbf_rel (grlc_data->tbf_type); tm_deactivate_tbf(grlc_data->tbf_type); grlc_data->tm.n_acc_req_procedures = 0; grlc_data->tm.n_res_req = 0; /* reset counter of resource requests during access */ vsi_t_stop(GRLC_handle,T3168); } else { tm_send_tbf_rel (TBF_TYPE_DL); tm_deactivate_tbf(TBF_TYPE_DL); } switch( grlc_data->tbf_type ) { case TBF_TYPE_NULL: SET_STATE(TM,TM_WAIT_4_PIM); vsi_t_stop(GRLC_handle,T3168); /* stop timer for sending chan req desc in dl ack/nack if running */ break; case TBF_TYPE_UL: /* * nothing to do, ul tbf is running */ break; default: TRACE_ERROR( "tm_deactivate_tbf did not work correct in sig_rd_tm_end_of_tbf" ); break; } break; default: TRACE_ERROR( "SIG_RD_TM_END_OF_TBF unexpected" ); break; } } /* sig_rd_tm_end_of_tbf() */ /* +------------------------------------------------------------------------------ | Function : sig_rd_tm_ul_req_cnf +------------------------------------------------------------------------------ | Description : Handles the internal signal SIG_RD_TM_UL_REQ_CNF | RD have to send that inter signal after it sends a Packet Downlink | AckNack including Channel Request Description. | | Parameters : void | +------------------------------------------------------------------------------ */ GLOBAL void sig_rd_tm_ul_req_cnf ( void ) { TRACE_ISIG( "sig_rd_tm_ul_req_cnf" ); switch( GET_STATE( TM ) ) { case TM_PTM: /* TRACE_EVENT_P1("T3168 start: %d ms",((grlc_data->t3168_val)+1)*500); */ vsi_t_start(GRLC_handle,T3168,((grlc_data->t3168_val)+1)*500); break; default: TRACE_ERROR( "SIG_RD_TM_UL_REQ_CNF unexpected" ); break; } } /* sig_rd_tm_ul_req_cnf() */ /* +------------------------------------------------------------------------------ | Function : sig_ru_tm_end_of_pdu +------------------------------------------------------------------------------ | Description : Handles the internal signal SIG_RU_TM_END_OF_PDU | | Parameters : index_of_next_llc_pdu_i - next LLC-PDU to send | +------------------------------------------------------------------------------ */ GLOBAL void sig_ru_tm_end_of_pdu ( UBYTE index_of_next_llc_pdu_i ) { TRACE_ISIG( "sig_ru_tm_end_of_pdu" ); switch( GET_STATE( TM ) ) { case TM_PTM: if(grlc_data->prim_queue[index_of_next_llc_pdu_i].re_allocation) { T_U_GRLC_RESOURCE_REQ resource_req; /*lint !e813*/ tm_ini_realloc(index_of_next_llc_pdu_i); tm_build_res_req(&resource_req, R_RE_ALLOC); tm_store_ctrl_blk( CGRLC_BLK_OWNER_TM, ( void* )&resource_req ); } break; default: TRACE_ERROR( "SIG_RU_TM_END_OF_PDU unexpected" ); break; } } /* sig_ru_tm_end_of_pdu() */ /* +------------------------------------------------------------------------------ | Function : sig_ru_tm_prim_delete +------------------------------------------------------------------------------ | Description : Handles the internal signal SIG_RU_TM_PRIM_DELETE | | Parameters : void | +------------------------------------------------------------------------------ */ GLOBAL void sig_ru_tm_prim_delete ( void ) { TRACE_ISIG( "sig_ru_tm_prim_delete" ); switch( GET_STATE( TM ) ) { case TM_PTM: grlc_delete_prim(); if( (grlc_data->testmode.mode EQ CGRLC_TEST_RANDOM) AND (grlc_data->testmode.n_pdu) ) { /* * queue one new pdu */ TRACE_EVENT_P1("testmode a %ld pdus",grlc_data->testmode.n_pdu); grlc_data->testmode.n_pdu--; tm_queue_test_mode_prim(1); } tm_handle_grlc_ready_ind(); break; default: TRACE_ERROR( "SIG_RU_TM_PRIM_DELETE unexpected" ); break; } } /* sig_ru_tm_prim_delete() */ /* +------------------------------------------------------------------------------ | Function : sig_ru_tm_ctrl_blk_sent +------------------------------------------------------------------------------ | Description : Handles the internal signal SIG_RU_TM_CTRL_BLK_SENT | | Parameters : | +------------------------------------------------------------------------------ */ GLOBAL void sig_ru_tm_ctrl_blk_sent ( UBYTE index ) { TRACE_ISIG( "sig_ru_tm_ctrl_blk_sent" ); if( index < MAX_CTRL_BLK_NUM ) { UBYTE i = 0; if( grlc_data->tm.ul_ctrl_blk.blk[index].owner EQ CGRLC_BLK_OWNER_TM ) { grlc_data->tm.n_res_req++; if((grlc_t_status(T3168) > 0)) { #ifdef _SIMULATION_ TRACE_EVENT("prr is transmitted once again for re-allocation"); #endif vsi_t_stop(GRLC_handle,T3168); grlc_data->tm.n_res_req--; } TRACE_EVENT_P2("T3168 start: %d ms, n_acc=%d",((grlc_data->t3168_val)+1)*500, grlc_data->tm.n_res_req); vsi_t_start(GRLC_handle,T3168,(grlc_data->t3168_val+1)*500); } while( i < MAX_CTRL_BLK_NUM AND grlc_data->tm.ul_ctrl_blk.seq[i] NEQ MAX_CTRL_BLK_NUM AND grlc_data->tm.ul_ctrl_blk.seq[i] NEQ index ) { i++; } if( i < MAX_CTRL_BLK_NUM AND grlc_data->tm.ul_ctrl_blk.seq[i] EQ index ) { PALLOC(cgrlc_ctrl_msg_sent_ind,CGRLC_CTRL_MSG_SENT_IND); PSEND(hCommGRR,cgrlc_ctrl_msg_sent_ind); tm_set_stop_ctrl_blk( TRUE, CGRLC_BLK_OWNER_NONE, i ); } else { TRACE_ERROR( "sig_ru_tm_ctrl_blk_sent: expected block not found" ); } } else { TRACE_ERROR( "sig_ru_tm_ctrl_blk_sent: index >= MAX_CTRL_BLK_NUM" ); } } /* sig_ru_tm_ctrl_blk_sent() */ /* +------------------------------------------------------------------------------ | Function : sig_ru_tm_repeat_alloc +------------------------------------------------------------------------------ | Description : Handles the internal signal sig_ru_tm_repeat_alloc | | Parameters : void | +------------------------------------------------------------------------------ */ GLOBAL void sig_ru_tm_repeat_alloc( void ) { MCAST(d_ul_ack,D_GRLC_UL_ACK); TRACE_ISIG( "sig_ru_tm_repeat_alloc" ); switch( GET_STATE( TM ) ) { case TM_PTM: 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(grlc_data->uplink_tbf.fa_manag.fa_type EQ FA_REPEAT) { /*kill reapeat alloc, which is not yet started*/ grlc_data->uplink_tbf.fa_manag.fa_type = FA_NO_NEXT; grlc_data->uplink_tbf.fa_manag.repeat_alloc = FALSE; grlc_data->uplink_tbf.fa_manag.ul_res_sum -= grlc_data->uplink_tbf.fa_manag.next_alloc.ul_res_sum; } else if(grlc_data->uplink_tbf.fa_manag.fa_type EQ FA_NO_NEXT AND grlc_data->uplink_tbf.fa_manag.repeat_alloc EQ TRUE ) { T_RLC_VALUES rlc_val; grlc_get_sdu_len_and_used_ts( &rlc_val); grlc_data->uplink_tbf.fa_manag.ul_res_remain = grlc_data->uplink_tbf.fa_manag.ul_res_sum - rlc_val.cnt_ts; if(grlc_data->uplink_tbf.fa_manag.ul_res_remain EQ grlc_data->uplink_tbf.fa_manag.current_alloc.ul_res_sum) { /*kill reapeat alloc if is mot yet started*/ grlc_data->uplink_tbf.fa_manag.fa_type = FA_NO_CURRENT; grlc_data->uplink_tbf.fa_manag.repeat_alloc = FALSE; grlc_data->uplink_tbf.fa_manag.ul_res_sum -= grlc_data->uplink_tbf.fa_manag.current_alloc.ul_res_sum; } } return; } vsi_t_stop(GRLC_handle,T3188); /* * check if current allocation is active */ if(grlc_data->uplink_tbf.fa_manag.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 */ grlc_data->uplink_tbf.fa_manag.fa_type = FA_NO_NEXT; grlc_data->uplink_tbf.fa_manag.repeat_alloc = TRUE; grlc_data->uplink_tbf.fa_manag.current_alloc.ul_res_sum = tm_set_fa_bitmap((UBYTE)(d_ul_ack->gprs_ul_ack_nack_info.f_alloc_ack.ts_overr /*& grlc_data->uplink_tbf.ts_usage*/), &grlc_data->uplink_tbf.fa_manag.current_alloc); grlc_data->uplink_tbf.fa_manag.ul_res_sum += grlc_data->uplink_tbf.fa_manag.current_alloc.ul_res_sum; /*find start of alloc (natural boundary of next allocation)*/ next_end_fn = grlc_data->uplink_tbf.fa_manag.current_alloc.alloc_end_fn; do { USHORT len; len = grlc_data->uplink_tbf.fa_manag.current_alloc.alloc.bitmap_len-1; next_start_fn = grlc_decode_tbf_start_rel(next_end_fn,0); next_end_fn = grlc_decode_tbf_start_rel(next_start_fn,(USHORT)(len-1)); if(grlc_data->ul_fn EQ next_start_fn) break; else if((next_end_fn > next_start_fn) AND (grlc_data->ul_fn <= next_start_fn) AND (grlc_data->ul_fn > next_start_fn) ) { next_start_fn = grlc_decode_tbf_start_rel(next_end_fn,0); next_end_fn = grlc_decode_tbf_start_rel(next_start_fn,(USHORT)(len-1)); break; } else if( (next_end_fn < next_start_fn) AND ( ((next_end_fn >= grlc_data->ul_fn) AND (next_start_fn > grlc_data->ul_fn)) OR ((next_end_fn < grlc_data->ul_fn) AND (next_start_fn < grlc_data->ul_fn)) ) ) { next_start_fn = grlc_decode_tbf_start_rel(next_end_fn,0); next_end_fn = grlc_decode_tbf_start_rel(next_start_fn,(USHORT)(len-1)); break; } } while (1); grlc_data->uplink_tbf.fa_manag.current_alloc.alloc_start_fn = next_start_fn; grlc_data->uplink_tbf.fa_manag.current_alloc.alloc_end_fn = next_end_fn; 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. */ grlc_data->uplink_tbf.fa_manag.fa_type = FA_REPEAT; grlc_data->uplink_tbf.fa_manag.repeat_alloc = TRUE; grlc_data->uplink_tbf.fa_manag.next_alloc.ul_res_sum = tm_set_fa_bitmap((UBYTE)(d_ul_ack->gprs_ul_ack_nack_info.f_alloc_ack.ts_overr /*& grlc_data->uplink_tbf.ts_usage*/),&grlc_data->uplink_tbf.fa_manag.next_alloc); grlc_data->uplink_tbf.fa_manag.ul_res_sum += grlc_data->uplink_tbf.fa_manag.next_alloc.ul_res_sum; grlc_data->uplink_tbf.fa_manag.next_alloc.alloc_start_fn = grlc_decode_tbf_start_rel(grlc_data->uplink_tbf.fa_manag.current_alloc.alloc_end_fn,0); len = grlc_data->uplink_tbf.fa_manag.current_alloc.alloc.bitmap_len-1; grlc_data->uplink_tbf.fa_manag.next_alloc.alloc_end_fn = grlc_decode_tbf_start_rel(grlc_data->uplink_tbf.fa_manag.next_alloc.alloc_start_fn, (USHORT)(len-1)); return; } grlc_data->uplink_tbf.fa_manag.repeat_alloc = FALSE; break; default: TRACE_ERROR( "sig_ru_tm_repeat_alloc unexpected" ); break; } } /* sig_ru_tm_repeat_alloc() */ /* +------------------------------------------------------------------------------ | Function : sig_ru_tm_end_of_fix_alloc +------------------------------------------------------------------------------ | Description : Handles the internal signal sig_ru_tm_end_of_fix_alloc, | received from ru if the end of a fixed allocation is reached. | | Parameters : void | +------------------------------------------------------------------------------ */ GLOBAL void sig_ru_tm_end_of_fix_alloc(void) { TRACE_ISIG( "sig_ru_tm_end_of_fix_alloc" ); switch( GET_STATE( TM ) ) { case TM_PTM: /* * if no new allocation is present start timer T3188 * otherwise set next alloc to current alloc and update * grr_data->uplink_tbf.end_fix_alloc_fn */ if (grlc_data->uplink_tbf.fa_manag.fa_type EQ FA_NO_NEXT) { grlc_data->uplink_tbf.fa_manag.fa_type = FA_NO_CURRENT; vsi_t_start(GRLC_handle,T3188,T3188_VALUE); } else if(grlc_data->uplink_tbf.fa_manag.fa_type EQ FA_BITMAP OR grlc_data->uplink_tbf.fa_manag.fa_type EQ FA_REPEAT) { grlc_data->uplink_tbf.fa_manag.fa_type = FA_NO_NEXT; grlc_data->uplink_tbf.fa_manag.repeat_alloc = FALSE; grlc_data->uplink_tbf.fa_manag.current_alloc = grlc_data->uplink_tbf.fa_manag.next_alloc; /* * send packet rsource request if more uplink reseources is needed */ tm_handle_final_alloc(0); /*calc ul resources*/ if(grlc_data->uplink_tbf.fa_manag.tbf_oct_cap_remain < grlc_data->uplink_tbf.fa_manag.tbf_oct_cnt) { T_U_GRLC_RESOURCE_REQ resource_req; /*lint !e813*/ /* send packet resource request*/ tm_build_res_req (&resource_req, R_FIX_RE_ALLOC); } } break; default: TRACE_ERROR( "sig_ru_tm_end_of_fix_alloc unexpected" ); break; } } /* sig_ru_tm_end_of_fix_alloc() */ #if defined REL99 AND defined TI_PS_FF_TBF_EST_PACCH /* +------------------------------------------------------------------------------ | Function : sig_ru_tm_ul_re_est_tbf +------------------------------------------------------------------------------ | Description : Handles the internal signal SIG_RU_TM_UL_RE_EST_TBF | RU have to send that inter signal after it has send resouurce request | by sending PCA or PRR. | Parameters : void | +------------------------------------------------------------------------------ */ GLOBAL void sig_ru_tm_ul_re_est_tbf ( void ) { TRACE_ISIG( "sig_ru_tm_ul_re_est_tbf" ); switch( GET_STATE( TM ) ) { case TM_PTM: /* start T3168 timer */ vsi_t_start(GRLC_handle,T3168,((grlc_data->t3168_val)+1)*500); TRACE_EVENT("sig_ru_tm_ul_re_est_tbf : Timer T3168 started for tbf on pacch"); /*GFF GFF_ACTIVE --> GFF_TWO_PHASE*/ sig_tm_gff_ul_deactivate(); sig_tm_gff_ul_activate(GFF_TWO_PHASE); /* TBF_TYPE_UL --> TBF_TYPE_NULL --> TBF_TYPE_TP_ACCESS */ tm_deactivate_tbf(TBF_TYPE_UL); tm_activate_tbf ( TBF_TYPE_TP_ACCESS ); grlc_data->uplink_tbf.ti = 0; grlc_data->ul_tfi = 0xFF; grlc_data->tm.pacch_prr_pca_sent = TRUE; /* PCA or PRR sent , 1st phase access*/ grlc_data->tm.n_acc_req_procedures = 0; grlc_data->tm.n_res_req = 0; grlc_data->pfi_value = grlc_data->prim_queue[grlc_data->prim_start_tbf].prim_ptr->pkt_flow_id[0]; /* new rlc mode of tbf on pacch */ if ( grlc_data->prim_queue[grlc_data->prim_start_tbf].prim_type EQ CGRLC_LLC_PRIM_TYPE_UNITDATA_REQ ) { grlc_data->uplink_tbf.rlc_mode = CGRLC_RLC_MODE_UACK; } else { grlc_data->uplink_tbf.rlc_mode = CGRLC_RLC_MODE_ACK; } { PALLOC(cgrlc_ul_tbf_ind,CGRLC_UL_TBF_IND); cgrlc_ul_tbf_ind->tbf_est_pacch = TRUE; PSEND(hCommGRR,cgrlc_ul_tbf_ind); } break; default: TRACE_ERROR( "SIG_RU_TM_UL_RE_EST_TBF unexpected" ); break; } } /*sig_ru_tm_ul_re_est_tbf*/ /* +------------------------------------------------------------------------------ | Function : sig_gff_tm_mac_ready_ind_two_phase +------------------------------------------------------------------------------ | Description : Handles the internal signal SIG_GFF_TM_MAC_READY_IND_TWO_PHASE | | Parameters : mac_ready_ind describes the MAC_READY_IND primitive. | | +------------------------------------------------------------------------------ */ void sig_gff_tm_mac_ready_ind_two_phase(T_MAC_READY_IND *mac_ready_ind) { TRACE_ISIG( "sig_gff_tm_mac_ready_ind_two_phase" ); switch( grlc_data->tbf_type ) { case TBF_TYPE_TP_ACCESS: if(mac_ready_ind->rlc_blocks_sent) { grlc_data->ru.ul_data[0].block_status = 0; /*If the timer is not already running then start the timer*/ if(!(grlc_t_status(T3168) > 0)) { /* This case would come in case when * PRR has been sent in 2 phase access */ vsi_t_start(GRLC_handle,T3168,((grlc_data->t3168_val)+1)*500); TRACE_EVENT_P3( "2PA: PRR sent at fn=%ld t3168=%ld | st_fn=%ld " ,mac_ready_ind->fn ,grlc_t_status(T3168) ,grlc_data->ul_tbf_start_time ); } } else { if(!(grlc_t_status(T3168) > 0) AND grlc_data->ru.ul_data[0].block_status EQ 2) /* block still programmed but not sent */ { /*Check if TBF starting time is elapsed*/ if(grlc_check_if_tbf_start_is_elapsed ( grlc_data->ul_tbf_start_time, mac_ready_ind->fn)) { TRACE_EVENT_P3("WAITING FOR Packet Resource Req Sending over st=%ld fn=%ld, ta_val=%d",grlc_data->ul_tbf_start_time ,mac_ready_ind->fn,grlc_data->ta_value); tm_handle_error_ra(); return; } } } break; default: TRACE_ERROR( "SIG_GFF_TM_MAC_READY_IND_TWO_PHASE unexpected" ); break; } } #endif