FreeCalypso > hg > fc-tourmaline
view src/g23m-gprs/grr/grr_ctrlf.c @ 235:ee04ca45053d
config system: add FCBM
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sat, 01 May 2021 10:36:52 +0000 |
parents | fa8dc04885d8 |
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 local functions for service CTRL of | entity GRR. +----------------------------------------------------------------------------- */ #ifndef GRR_CTRLF_C #define GRR_CTRLF_C #endif #define ENTITY_GRR /*==== INCLUDES =============================================================*/ #include "typedefs.h" /* to get Condat data types */ #include "vsi.h" /* to get a lot of macros */ #include "macdef.h" #include "gprs.h" #include "gsm.h" /* to get a lot of macros */ #include "ccdapi.h" /* to get CCD API */ #include "cnf_grr.h" /* to get cnf-definitions */ #include "mon_grr.h" /* to get mon-definitions */ #include "prim.h" /* to get the definitions of used SAP and directions */ #include "message.h" #include "grr.h" /* to get the global entity definitions */ #include "grr_f.h" #include "grr_ctrlf.h" /* */ #include "grr_ctrls.h" #include "grr_meass.h" /* */ #include "grr_pgs.h" /* */ #include "grr_psis.h" /* */ #include "grr_css.h" /* */ #include "grr_tcs.h" /* */ #include <string.h> /* for memcpy */ #include "pcm.h" #ifdef _TARGET_ #include "ffs/ffs.h" #endif /*==== CONST ================================================================*/ #define BCC_OF_BSIC 7 /*==== LOCAL VARS ===========================================================*/ /*==== PRIVATE FUNCTIONS ====================================================*/ LOCAL void ctrl_set_final_pckt_mode ( void ); LOCAL BOOL ctrl_set_transient_pckt_mode ( T_GLBL_PCKT_MODE final_pckt_mode, T_CTRL_TASK *ctrl_task ); LOCAL void ctrl_enter_pim ( void ); LOCAL void ctrl_leave_to_pam ( void ); LOCAL void ctrl_enter_pam ( void ); LOCAL void ctrl_enter_ptm ( void ); LOCAL BOOL ctrl_check_cco_freq ( USHORT arfcn ); /*==== PUBLIC FUNCTIONS =====================================================*/ /* +------------------------------------------------------------------------------ | Function : ctrl_stop_all_activities +------------------------------------------------------------------------------ | Description : The function ctrl_stop_all_activities() .... | | Parameters : void | +------------------------------------------------------------------------------ */ GLOBAL void ctrl_stop_all_activities ( T_CTRL_DISABLE_CAUSE dc, void *data ) { BOOL is_pbcch_reset_needed = FALSE; TRACE_FUNCTION( "ctrl_stop_all_activities" ); /* * inform the service PG * parameters dc and data are not of interest */ sig_ctrl_pg_stop( ); /* * inform the service MEAS * parameter data is not of interest */ switch( dc ) { case( CTRL_DC_OTHER ): case( CTRL_DC_SUSPEND_NORMAL ): case( CTRL_DC_SUSPEND_IMM_REL ): case( CTRL_DC_CR_NW_RR ): case( CTRL_DC_CR_NW_GRR ): case( CTRL_DC_CR_MS_GRR_NORMAL ): case( CTRL_DC_PSI_MANAGEMENT ): case( CTRL_DC_CR_MS_RR_NORMAL ): case( CTRL_DC_CR_MS_RR_IMM_REL ): case( CTRL_DC_CR_MS_GRR_ABNORMAL ): sig_ctrl_meas_stop( ); break; default: TRACE_EVENT( "FATAL ERROR 1 in ctrl_stop_all_activities" ); break; } /* * inform the service CS */ switch( dc ) { case( CTRL_DC_OTHER ): vsi_t_stop( GRR_handle, T3174 ); vsi_t_stop( GRR_handle, T3176 ); #ifdef _SIMULATION_ sig_ctrl_cs_simu_timer_stop(); #endif /*lint -fallthrough*/ case( CTRL_DC_CR_MS_GRR_NORMAL ): case( CTRL_DC_CR_MS_GRR_ABNORMAL ): case( CTRL_DC_PSI_MANAGEMENT ): case( CTRL_DC_CR_MS_RR_NORMAL ): case( CTRL_DC_CR_MS_RR_IMM_REL ): sig_ctrl_cs_stop(CS_DC_OTHER); break; case( CTRL_DC_SUSPEND_NORMAL ): case( CTRL_DC_SUSPEND_IMM_REL ): sig_ctrl_cs_stop( CS_DC_DEDICATED ); break; case( CTRL_DC_CR_NW_RR ): sig_ctrl_cs_cc_order_ind( NULL, (T_D_CHANGE_ORDER *)data ); break; case( CTRL_DC_CR_NW_GRR ): if (grr_t_status( T3174 ) > 0 ) { sig_ctrl_cs_cc_order_ind( (T_D_CELL_CHAN_ORDER *)data, NULL ); } else { sig_ctrl_cs_stop(CS_DC_OTHER); } break; default: TRACE_EVENT( "FATAL ERROR 2 in ctrl_stop_all_activities" ); break; } /* * inform the service PSI * parameter data is not of interest */ switch( dc ) { case( CTRL_DC_OTHER ): case( CTRL_DC_CR_MS_RR_NORMAL ): case( CTRL_DC_CR_MS_RR_IMM_REL ): case( CTRL_DC_CR_MS_GRR_NORMAL ): sig_ctrl_psi_stop( ); is_pbcch_reset_needed = TRUE; break; case( CTRL_DC_SUSPEND_NORMAL ): case( CTRL_DC_SUSPEND_IMM_REL ): case( CTRL_DC_CR_NW_RR ): case( CTRL_DC_CR_NW_GRR ): case( CTRL_DC_CR_MS_GRR_ABNORMAL ): sig_ctrl_psi_suspend( ); break; case( CTRL_DC_PSI_MANAGEMENT ): /* do nothing */ break; default: TRACE_EVENT( "FATAL ERROR 3 in ctrl_stop_all_activities" ); break; } /* * inform the service TC * parameter data is not of interest */ switch( dc ) { case( CTRL_DC_OTHER ): case( CTRL_DC_PSI_MANAGEMENT ): ctrl_send_access_disable_if_needed ( TC_DC_OTHER, sig_tc_ctrl_tbf_release_cnf ); break; case( CTRL_DC_CR_NW_RR ): case( CTRL_DC_CR_NW_GRR ): ctrl_send_access_disable_if_needed ( TC_DC_CR_NETWORK, sig_tc_ctrl_cr_started_rsp ); break; case( CTRL_DC_CR_MS_RR_NORMAL ): ctrl_send_access_disable_if_needed ( TC_DC_CR_NORMAL, sig_tc_ctrl_cr_started_rsp ); break; case( CTRL_DC_CR_MS_RR_IMM_REL ): case( CTRL_DC_CR_MS_GRR_NORMAL ): ctrl_send_access_disable_if_needed ( TC_DC_CR_IMM_REL, sig_tc_ctrl_cr_started_rsp ); break; case( CTRL_DC_CR_MS_GRR_ABNORMAL ): ctrl_send_access_disable_if_needed ( TC_DC_CR_ABNORMAL, sig_tc_ctrl_cr_started_rsp ); break; case( CTRL_DC_SUSPEND_NORMAL ): ctrl_send_access_disable_if_needed ( TC_DC_SUSPEND_NORMAL, sig_tc_ctrl_suspend_cnf ); break; case( CTRL_DC_SUSPEND_IMM_REL ): ctrl_send_access_disable_if_needed ( TC_DC_SUSPEND_IMM_REL, sig_tc_ctrl_suspend_cnf ); break; default: TRACE_EVENT( "FATAL ERROR 4 in ctrl_stop_all_activities" ); break; } if( is_pbcch_reset_needed ) { grr_set_pbcch( FALSE ); } } /* ctrl_stop_all_activities() */ /* +------------------------------------------------------------------------------ | Function : ctrl_init +------------------------------------------------------------------------------ | Description : The function ctrl_init() .... | | Parameters : void | +------------------------------------------------------------------------------ */ GLOBAL void ctrl_init ( void) { TRACE_FUNCTION( "ctrl_init" ); /* init parameters of CTRL*/ INIT_STATE( CTRL, CTRL_NULL ); INIT_STATE( CTRL_GLBL, GLBL_PCKT_MODE_NULL ); grr_data->ctrl.new_cell_responded = FALSE; grr_data->ctrl.psi_tbf_rel_cause = CTRL_PTRC_NONE; grr_data->ctrl_glbl.ctrl_task = CTRL_TASK_NONE; #ifdef _SIMULATION_ TRACE_EVENT_P1( "ctrl_init - ctrl_task: %d", grr_data->ctrl_glbl.ctrl_task ); #endif /* #ifdef _SIMULATION_ */ grr_data->ctrl.rr_state.monitoring_stopped = FALSE; grr_data->ctrl.rr_state.cr_ind_return = CR_IND_RETURN_NONE; ctrl_read_pcm(); } /* ctrl_init() */ /* +------------------------------------------------------------------------------ | Function : ctrl_start_monitoring_bcch +------------------------------------------------------------------------------ | Description : The function ctrl_start_monitoring_bcch() This function starts | reading System Information (SI) on BCCH | | Parameters : void | +------------------------------------------------------------------------------ */ GLOBAL void ctrl_start_monitoring_bcch ( UBYTE si_to_read ) { TRACE_FUNCTION( "ctrl_start_monitoring_bcch" ); { PALLOC( rrgrr_start_mon_bcch_req, RRGRR_START_MON_BCCH_REQ ); rrgrr_start_mon_bcch_req->si_to_read = psc_db->si_to_acquire = si_to_read; PSEND( hCommRR, rrgrr_start_mon_bcch_req ); } } /* ctrl_start_monitoring_bcch() */ /* +------------------------------------------------------------------------------ | Function : ctrl_stop_monitoring_ccch +------------------------------------------------------------------------------ | Description : The function ctrl_stop_monitoring_ccch() This function stops | monitoring CCCH | | Parameters : void | +------------------------------------------------------------------------------ */ GLOBAL void ctrl_stop_monitoring_ccch ( void ) { TRACE_FUNCTION( "ctrl_stop_monitoring_ccch" ); if(!grr_data->ctrl.rr_state.monitoring_stopped OR (grr_data->test_mode NEQ CGRLC_NO_TEST_MODE)) { PALLOC ( rrgrr_stop_mon_ccch_req, RRGRR_STOP_MON_CCCH_REQ); rrgrr_stop_mon_ccch_req->is_pbcch_present = grr_is_pbcch_present(); PSEND (hCommRR, rrgrr_stop_mon_ccch_req); } grr_data->ctrl.rr_state.monitoring_stopped = TRUE; } /* ctrl_stop_monitoring_ccch() */ /* +------------------------------------------------------------------------------ | Function : ctrl_start_monitoring_ccch +------------------------------------------------------------------------------ | Description : The function ctrl_start_monitoring_ccch() This function starts | monitoring CCCH | | Parameters : pag_mode : indicates the page, which shall be uese by RR/L1 | +------------------------------------------------------------------------------ */ GLOBAL void ctrl_start_monitoring_ccch ( UBYTE pag_mode ) { TRACE_FUNCTION( "ctrl_start_monitoring_ccch" ); { PALLOC ( rrgrr_start_mon_ccch_req, RRGRR_START_MON_CCCH_REQ); rrgrr_start_mon_ccch_req->pag_mode = pag_mode; #if defined (REL99) AND defined (TI_PS_FF_EMR) #else rrgrr_start_mon_ccch_req->split_pg = grr_data->ms.split_pg_cycle; #endif PSEND (hCommRR, rrgrr_start_mon_ccch_req); } grr_data->ctrl.rr_state.monitoring_stopped = FALSE; } /* ctrl_start_monitoring_ccch() */ /* +------------------------------------------------------------------------------ | Function : ctrl_send_rr_est_req +------------------------------------------------------------------------------ | Description : The function ctrl_send_rr_est_req() .... | | Parameters : UBYTE susp_req: whether RR needs to send | GPRS Suspension Request or not | +------------------------------------------------------------------------------ */ GLOBAL void ctrl_send_rr_est_req ( UBYTE susp_req) { TRACE_FUNCTION( "ctrl_send_rr_est_req" ); { PALLOC ( rrgrr_rr_est_req, RRGRR_RR_EST_REQ); if(psc_db->v_non_gprs_opt EQ TRUE) { rrgrr_rr_est_req->non_gprs.v_non_gprs = TRUE; /* Copy non GPRS options */ ctrl_copy_non_gprs_opt(&rrgrr_rr_est_req->non_gprs); } else rrgrr_rr_est_req->non_gprs.v_non_gprs = FALSE; rrgrr_rr_est_req->ch_needed = grr_data->pg.ch_needed; rrgrr_rr_est_req->emlpp_prio.v_emlpp = grr_data->pg.v_emlpp_prio; rrgrr_rr_est_req->emlpp_prio.emlpp = grr_data->pg.emlpp_prio; rrgrr_rr_est_req->susp_req = susp_req; rrgrr_rr_est_req->ident_type = grr_data->pg.type; /* IMSI TMSI ??*/ PSEND (hCommRR, rrgrr_rr_est_req); } } /* ctrl_send_rr_est_req() */ /* +------------------------------------------------------------------------------ | Function : ctrl_send_rr_est_rsp +------------------------------------------------------------------------------ | Description : The function ctrl_send_rr_est_rsp() .... | Informs the RR whether the RR connection should be established or not! | Parameters : UBYTE susp_req: Suspension request needed or not | UBYTE rsp: CS_PAGE was accepted or not | +------------------------------------------------------------------------------ */ GLOBAL void ctrl_send_rr_est_rsp ( UBYTE susp_req, UBYTE rsp ) { TRACE_FUNCTION( "ctrl_send_rr_est_rsp" ); { PALLOC(rrgrr_rr_est_rsp, RRGRR_RR_EST_RSP); rrgrr_rr_est_rsp->rr_est = (rsp EQ GMMRR_CS_PAGE_REJ) ? RR_EST_NOT_ALLOWED : RR_EST_ALLOWED; rrgrr_rr_est_rsp->susp_req = susp_req; PSEND(hCommRR, rrgrr_rr_est_rsp); } }/* ctrl_send_rr_est_rsp*/ /* +------------------------------------------------------------------------------ | Function : ctrl_suspend_services +------------------------------------------------------------------------------ | Description : The function ctrl_suspend_services() .... | This function suspends working services in GRR | Parameters : void | +------------------------------------------------------------------------------ */ GLOBAL void ctrl_suspend_services ( UBYTE susp_cause ) { TRACE_FUNCTION( "ctrl_suspend_services" ); if(susp_cause EQ GMMRR_ABNORMAL_RELEASE) ctrl_stop_all_activities( CTRL_DC_SUSPEND_IMM_REL, NULL ); else ctrl_stop_all_activities( CTRL_DC_SUSPEND_NORMAL, NULL ); }/* ctrl_suspend_services*/ /* +------------------------------------------------------------------------------ | Function : ctrl_suspend_services +------------------------------------------------------------------------------ | Description : The function ctrl_copy_non_gprs_opt() .... | Copies the stored non-GPRS options into the given structure | Parameters : p_non_gprs_opt: Pointer to the structure for non-GPRS access; derived from | RRGRR.doc | +------------------------------------------------------------------------------ */ GLOBAL void ctrl_copy_non_gprs_opt( T_non_gprs *p_non_gprs_opt) { TRACE_FUNCTION( "ctrl_copy_non_gprs_opt" ); /* Copy non GPRS options */ p_non_gprs_opt->att = psc_db->non_gprs_opt.att; /*< 0> Attach / detach allowed */ p_non_gprs_opt->v_T3212 = psc_db->non_gprs_opt.v_t3212; /*< 1> valid-flag */ p_non_gprs_opt->T3212 = psc_db->non_gprs_opt.t3212; /*< 2> T 3212 time-out value */ p_non_gprs_opt->neci = psc_db->non_gprs_opt.neci; /*< 3> Half rate support */ p_non_gprs_opt->pwrc = psc_db->non_gprs_opt.pwcr; /*< 4> Power Control */ p_non_gprs_opt->dtx = psc_db->non_gprs_opt.dtx; /*< 5> Discontinuous Transmission (BCCH) */ p_non_gprs_opt->radio_link_timeout = psc_db->non_gprs_opt.rl_timeout; /*< 6> Radio Link Timeout */ p_non_gprs_opt->bs_ag_blks_res = psc_db->non_gprs_opt.bs_ag_blks_res; /*< 7> BS_AG_BLKS_RES */ p_non_gprs_opt->ccch_conf = psc_db->non_gprs_opt.ccch_conf; /*< 8> CCCF-CONF */ p_non_gprs_opt->bs_pa_mfrms = psc_db->non_gprs_opt.bs_pa_mfrms; /*< 9> BS-PA-MFRMS */ p_non_gprs_opt->max_retrans = psc_db->non_gprs_opt.max_retrans; /*< 10> MAX_RETRANS */ p_non_gprs_opt->tx_integer = psc_db->non_gprs_opt.tx_integer; /*< 11> TX_INTEGER */ p_non_gprs_opt->ec = psc_db->non_gprs_opt.ec; /*< 12> EC */ p_non_gprs_opt->gprs_ms_txpwr_max_cch = psc_db->non_gprs_opt.txpwr_max_cch; /*< 13> GPRS_MS_TXPWR_MAX_CCH */ #ifdef REL99 /* copy non GPRS extension information */ if( (psc_db->non_gprs_opt.v_non_gprs_ext_bits EQ TRUE) AND (psc_db->non_gprs_opt.non_gprs_ext_bits.ext_len) ) { /* copy Early classmark sending control flag from GRR database */ p_non_gprs_opt->ecsc = psc_db->non_gprs_opt.non_gprs_ext_bits.non_gprs_ext_info.ecsc; } else { p_non_gprs_opt->ecsc = ECS_ALLOWED; } #endif }/* ctrl_copy_non_gprs_opt*/ /* +------------------------------------------------------------------------------ | Function : ctrl_is_gprs_suspension_request_needed +------------------------------------------------------------------------------ | Description : The function ctrl_is_gprs_suspension_request_needed() .... | checks whether MS has to send GPRS Suspension Request to the network | or not | Parameters : void | +------------------------------------------------------------------------------ */ GLOBAL BOOL ctrl_is_gprs_suspension_request_needed( void) { TRACE_FUNCTION( "ctrl_is_gprs_suspension_request_needed" ); if( (psc_db->cell_info_for_gmm.cell_info.net_mode NEQ GMMRR_NET_MODE_III) AND ( /* BEGIN GRR_NMO_III*/ (grr_data->ms.class_of_mode EQ GMMRR_CLASS_B) OR /* END GRR_NMO_III*/ (grr_data->ms.class_of_mode EQ GMMRR_CLASS_BC) OR (grr_data->ms.class_of_mode EQ GMMRR_CLASS_BG) ) ) { /* We have to suspend GPRS activities on the network side, because of MS * is not able to handle GPRS activities during the dedicated mode of operations */ return TRUE; } return FALSE; }/* ctrl_is_gprs_suspension_request_needed*/ /* +------------------------------------------------------------------------------ | Function : ctrl_get_number_of_digits +------------------------------------------------------------------------------ | Description : The function ctrl_get_number_of_digits() .... | gets the number of valid digits in the array e.g. IMSI digits | Parameters : void | +------------------------------------------------------------------------------ */ GLOBAL UBYTE ctrl_get_number_of_digits( UBYTE *digits) { UBYTE i = 0; TRACE_FUNCTION ("ctrl_get_number_of_digits"); while (digits[i] < 0x0A AND i < 16) i++; return i; }/* ctrl_get_number_of_digits*/ /* +------------------------------------------------------------------------------ | Function : ctrl_send_cell_reselection_req +------------------------------------------------------------------------------ | Description : The function ctrl_send_cell_reselection_req() .... | Prepares the cell reselection parameters for RR | | Parameters : | +------------------------------------------------------------------------------ */ GLOBAL void ctrl_send_cell_reselection_req ( UBYTE cr_type ) { TRACE_FUNCTION( "ctrl_send_cell_reselection_req" ); switch( cr_type ) { case( CR_NEW ): case( CR_NEW_NOT_SYNCED ): { ctrl_stop_rr_task_req( GLBL_PCKT_MODE_NULL, TASK_STOP_DUMMY_VALUE ); grr_data->ctrl.rr_state.cr_ind_return = CR_IND_RETURN_COMPLETE; if( grr_data->ctrl.parked_rrgrr_cr_ind EQ TRUE ) { ctrl_handle_parked_rrgrr_cr_ind( GET_STATE( CTRL ) ); } else { PALLOC( rrgrr_cr_req, RRGRR_CR_REQ ); rrgrr_cr_req->cr_type = cr_type; if( grr_t_status( T3176 ) > 0 ) { /*TRACE_ASSERT( posc_db NEQ NULL );*/ rrgrr_cr_req->arfcn = grr_data->ctrl.old_arfcn; rrgrr_cr_req->bsic = grr_data->ctrl.old_bsic; } else { T_NC_MVAL *nc_mval; nc_mval = &grr_data->db.nc_mval_list.nc_mval[grr_data->db.cr_cell->idx]; rrgrr_cr_req->arfcn = nc_mval->arfcn; rrgrr_cr_req->bsic = nc_mval->sync_info.bsic; } TRACE_EVENT_P3( "RRGRR_CR_REQ: %d %d %d", rrgrr_cr_req->cr_type, rrgrr_cr_req->arfcn, rrgrr_cr_req->bsic ); PSEND( hCommRR, rrgrr_cr_req ); } } break; case( CR_COMPLETE ): { switch( grr_data->ctrl.rr_state.cr_ind_return ) { case( CR_IND_RETURN_NONE ): { TRACE_EVENT( "RRGRR_CR_REQ: CR_IND_RETURN_NONE" ); } break; case( CR_IND_RETURN_RESPONSE ): { PALLOC( cr_rsp, RRGRR_CR_RSP ); TRACE_EVENT( "RRGRR_CR_RSP: CR_IND_RETURN_RESPONSE" ); PSEND( hCommRR, cr_rsp ); ctrl_stop_rr_task_req( GLBL_PCKT_MODE_NULL, TASK_STOP_DUMMY_VALUE ); grr_data->ctrl.rr_state.cr_ind_return = CR_IND_RETURN_COMPLETE; } break; case( CR_IND_RETURN_COMPLETE ): { PALLOC( rrgrr_cr_req, RRGRR_CR_REQ ); rrgrr_cr_req->cr_type = cr_type; rrgrr_cr_req->arfcn = 0; rrgrr_cr_req->bsic = 0; TRACE_EVENT_P1( "RRGRR_CR_REQ: %d", rrgrr_cr_req->cr_type ); PSEND( hCommRR, rrgrr_cr_req ); grr_data->ctrl.rr_state.cr_ind_return = CR_IND_RETURN_NONE; } break; default: { TRACE_ASSERT ( grr_data->ctrl.rr_state.cr_ind_return EQ CR_IND_RETURN_NONE OR grr_data->ctrl.rr_state.cr_ind_return EQ CR_IND_RETURN_RESPONSE OR grr_data->ctrl.rr_state.cr_ind_return EQ CR_IND_RETURN_COMPLETE ); } break; } } break; case( CR_CS ): { ctrl_stop_rr_task_req( GLBL_PCKT_MODE_NULL, TASK_STOP_DUMMY_VALUE ); } /*lint -fallthrough*/ case( CR_CONT ): { PALLOC( rrgrr_cr_req, RRGRR_CR_REQ ); rrgrr_cr_req->cr_type = cr_type; TRACE_EVENT_P1( "RRGRR_CR_REQ: %d", rrgrr_cr_req->cr_type ); PSEND( hCommRR, rrgrr_cr_req ); grr_data->ctrl.rr_state.cr_ind_return = CR_IND_RETURN_COMPLETE; } break; default: { TRACE_ASSERT( cr_type EQ CR_NEW OR cr_type EQ CR_NEW_NOT_SYNCED OR cr_type EQ CR_COMPLETE OR cr_type EQ CR_CONT OR cr_type EQ CR_CS ); } break; } }/* ctrl_send_cell_reselection_req */ /* +------------------------------------------------------------------------------ | Function : ctrl_enable_serving_cell +------------------------------------------------------------------------------ | Description : The function ctrl_enable_serving_cell() .... | | Parameters : void | +------------------------------------------------------------------------------ */ GLOBAL void ctrl_enable_serving_cell( UBYTE final ) { TRACE_FUNCTION( "ctrl_enable_serving_cell" ); if( final ) { ctrl_install_new_scell( ); } #ifdef REL99 /* Update SGSN release in the common library */ cl_nwrl_set_sgsn_release(psc_db->sgsn_rel); #endif ctrl_send_cell_ind(); sig_ctrl_pg_start(); sig_ctrl_cs_pim(); sig_ctrl_cs_start( ); sig_ctrl_meas_pim( ); sig_ctrl_meas_start( ); ctrl_tc_access_enable( sig_ctrl_tc_disable_prim_queue ); }/* ctrl_enable_serving_cell */ /* +------------------------------------------------------------------------------ | Function : ctrl_install_new_scell +------------------------------------------------------------------------------ | Description : The function ctrl_install_new_scell() .... | | Parameters : void | +------------------------------------------------------------------------------ */ GLOBAL void ctrl_install_new_scell( void ) { TRACE_FUNCTION( "ctrl_install_new_scell" ); if( ctrl_get_gprs_service( ) NEQ GPRS_SERVICE_NONE ) { sig_ctrl_cs_install_new_scell( ); } sig_ctrl_cs_cc_result( TRUE ); }/* ctrl_install_new_scell */ /* +------------------------------------------------------------------------------ | Function : ctrl_reinstall_old_scell_req +------------------------------------------------------------------------------ | Description : The function ctrl_reinstall_old_scell_req() .... | | Parameters : | +------------------------------------------------------------------------------ */ GLOBAL void ctrl_reinstall_old_scell_req( BOOL is_pcco, UBYTE cause ) { TRACE_FUNCTION( "ctrl_reinstall_old_scell_req" ); if( grr_get_db_mode( ) EQ DB_MODE_CC_REQ ) { ctrl_stop_all_activities( CTRL_DC_OTHER, NULL ); } ctrl_send_reconnect_dcch_req( cause ); }/* ctrl_reinstall_old_scell_req */ /* +------------------------------------------------------------------------------ | Function : ctrl_reinstall_old_scell_cnf +------------------------------------------------------------------------------ | Description : The function ctrl_reinstall_old_scell_cnf() .... | | Parameters : void | +------------------------------------------------------------------------------ */ GLOBAL void ctrl_reinstall_old_scell_cnf( BOOL is_success ) { TRACE_FUNCTION( "ctrl_reinstall_old_scell_cnf" ); if( is_success ) { ctrl_cc_rejected( ); } else { grr_set_db_ptr( DB_MODE_CC_REJ ); /* * service PSI is still suspended, we have to stop it finally */ sig_ctrl_psi_stop( ); /* grr_set_pbcch( FALSE ); */ } }/* ctrl_reinstall_old_scell_cnf */ /* +------------------------------------------------------------------------------ | Function : ctrl_send_cell_ind +------------------------------------------------------------------------------ | Description : ctrl_send_cell_ind: composes and sends a GMMRR_CELL_IND message | | Parameters : void | +------------------------------------------------------------------------------ */ GLOBAL void ctrl_send_cell_ind() { TRACE_FUNCTION( "ctrl_send_cell_ind" ); { PALLOC(gmmrr_cell_ind, GMMRR_CELL_IND); grr_set_cell_info_service( ); memcpy( &gmmrr_cell_ind->cell_info, &psc_db->cell_info_for_gmm.cell_info, sizeof( T_cell_info ) ); #if !defined (NTRACE) if( grr_data->cs.v_crp_trace EQ TRUE ) { TRACE_EVENT_P9( "CELL_ENV: %x%x%x %x%x%x %x %x %x", gmmrr_cell_ind->cell_info.cell_env.rai.plmn.mcc[0], gmmrr_cell_ind->cell_info.cell_env.rai.plmn.mcc[1], gmmrr_cell_ind->cell_info.cell_env.rai.plmn.mcc[2], gmmrr_cell_ind->cell_info.cell_env.rai.plmn.mnc[0], gmmrr_cell_ind->cell_info.cell_env.rai.plmn.mnc[1], gmmrr_cell_ind->cell_info.cell_env.rai.plmn.mnc[2], gmmrr_cell_ind->cell_info.cell_env.rai.lac, gmmrr_cell_ind->cell_info.cell_env.rai.rac, gmmrr_cell_ind->cell_info.cell_env.cid ); } #endif /* #if !defined (NTRACE) */ grr_data->cell_res_status = FALSE; PSEND(hCommGMM, gmmrr_cell_ind); } }/*ctrl_send_cell_ind */ /* +------------------------------------------------------------------------------ | Function : ctrl_init_params +------------------------------------------------------------------------------ | Description : ctrl_init_params initializes the parameters of the CTRL service | | Parameters : void | +------------------------------------------------------------------------------ */ GLOBAL void ctrl_init_params() { TRACE_FUNCTION( "ctrl_init_params" ); grr_data->ctrl.imm_rel = 0; grr_data->cc_running = FALSE; grr_data->pcco_failure_cause = 8; }/* ctrl_init_params */ /* +------------------------------------------------------------------------------ | Function : ctrl_copy_pbcch_des_from_ncell +------------------------------------------------------------------------------ | Description : Copies pbcch description from the ncell description to a | specific database | | Parameters : void | +------------------------------------------------------------------------------ */ GLOBAL void ctrl_copy_pbcch_des_from_ncell( T_SC_DATABASE *db ) { T_NC_MVAL *nc_mval; T_ncell_info *ncell_info; nc_mval = &grr_data->db.nc_mval_list.nc_mval[grr_data->db.cr_cell->idx]; ncell_info = grr_get_ncell_info( nc_mval->arfcn, nc_mval->sync_info.bsic ); TRACE_FUNCTION( "ctrl_copy_pbcch_des_from_ncell" ); if( ncell_info NEQ NULL ) { db->pbcch.pbcch_des.pb = 0; db->pbcch.pbcch_des.tn = ncell_info->cr_par.si13_pbcch.pbcch_location; /* * for broadcast and common control channels, the TSC must be equal to BCC */ db->pbcch.pbcch_des.tsc = ncell_info->bsic & BCC_OF_BSIC; /* * to indicate that the arfcn of the BCCH carrier should be used */ db->pbcch.pbcch_des.flag = 0; db->pbcch.pbcch_des.v_flag2 = 0; db->pbcch.pbcch_des.flag2 = 0; db->pbcch.bcch.arfcn = ncell_info->arfcn; db->pbcch.bcch.bsic = ncell_info->bsic; db->pbcch.bcch.pbcch_present = TRUE; db->pccch.bs_pbcch_blks = 0; db->psi1_params.psi1_repeat_period = ncell_info->cr_par.si13_pbcch.psi1_repeat_period; } else { TRACE_ERROR( "ctrl_copy_pbcch_des_from_ncell: ncell_info EQ NULL" ); } }/*ctrl_copy_pbcch_des_from_ncell*/ /* +------------------------------------------------------------------------------ | Function : ctrl_sync_to_given_cell() +------------------------------------------------------------------------------ | Description : This function starts synchronisation to the given cell | neighbour cell | | Parameters : void | +------------------------------------------------------------------------------ */ GLOBAL void ctrl_sync_to_given_cell ( void ) { T_NC_MVAL *nc_mval; T_ncell_info *ncell_info; TRACE_FUNCTION( "ctrl_sync_to_given_cell" ); nc_mval = &grr_data->db.nc_mval_list.nc_mval[grr_data->db.cr_cell->idx]; ncell_info = grr_get_ncell_info( nc_mval->arfcn, nc_mval->sync_info.bsic ); if( ncell_info NEQ NULL ) { ctrl_stop_rr_task_req( GLBL_PCKT_MODE_SYNC, TASK_STOP_DUMMY_VALUE ); grr_data->ctrl.rr_state.cr_ind_return = CR_IND_RETURN_COMPLETE; if( grr_data->ctrl.parked_rrgrr_cr_ind EQ TRUE ) { ctrl_handle_parked_rrgrr_cr_ind( GET_STATE( CTRL ) ); } else { PALLOC( rrgrr_sync_req, RRGRR_SYNC_REQ ); rrgrr_sync_req->arfcn = ncell_info->arfcn; rrgrr_sync_req->bsic = ncell_info->bsic; PSEND( hCommRR, rrgrr_sync_req ); } } else { TRACE_ERROR( "ctrl_sync_to_given_cell: ncell_info EQ NULL" ); } } /* ctrl_sync_to_given_cell */ /* +------------------------------------------------------------------------------ | Function : ctrl_stop_T3174 +------------------------------------------------------------------------------ | Description : The function stops T3174 when running. | | Parameters : void | +------------------------------------------------------------------------------ */ GLOBAL void ctrl_stop_T3174 ( void ) { TRACE_FUNCTION( "ctrl_stop_T3174" ); TRACE_EVENT( "T3174 for packet cell change stopped" ); vsi_t_stop( GRR_handle, T3174 ); } /* ctrl_stop_T3174 */ /* +------------------------------------------------------------------------------ | Function : ctrl_send_access_disable_if_needed() +------------------------------------------------------------------------------ | Description : The function sends access disabled signal to TC, if needed | | Parameters : dc - disable cause | +------------------------------------------------------------------------------ */ GLOBAL void ctrl_send_access_disable_if_needed ( T_TC_DISABLE_CAUSE disable_cause, T_TC_DISABLE_CALLBACK_FUNC callback_func ) { TRACE_FUNCTION( "ctrl_send_access_disable_if_needed" ); psc_db->is_access_enabled = FALSE; sig_ctrl_tc_access_disable( disable_cause, callback_func ); } /* ctrl_send_access_disable_if_needed() */ /* +------------------------------------------------------------------------------ | Function : ctrl_copy_cell_env() +------------------------------------------------------------------------------ | Description : | Parameters : +------------------------------------------------------------------------------ */ GLOBAL void ctrl_copy_cell_env( T_cell_env *cell_env, T_serving_cell_info *scell_info ) { TRACE_FUNCTION( "ctrl_copy_cell_env" ); psc_db->pbcch.bcch.arfcn = scell_info->bcch_arfcn; psc_db->pbcch.bcch.bsic = scell_info->bcch_bsic; cell_env->rai.plmn = scell_info->rr_cell_env.plmn; cell_env->rai.lac = scell_info->rr_cell_env.lac; cell_env->cid = scell_info->rr_cell_env.cid; #ifdef _SIMULATION_ TRACE_EVENT_P2( "ctrl_copy_cell_env - SCELL: %d %d", psc_db->pbcch.bcch.arfcn, psc_db->pbcch.bcch.bsic ); #endif /* #ifdef _SIMULATION_ */ } /* ctrl_copy_cell_env */ /* +------------------------------------------------------------------------------ | Function : ctrl_copy_scell_params() +------------------------------------------------------------------------------ | Description : This function copies some serving cell specific parameters into | database of GRR | | Parameters : sc_inf: pointer to serving cell information | +------------------------------------------------------------------------------ */ GLOBAL BOOL ctrl_copy_scell_params( T_serving_cell_info *sc_inf ) { BOOL ba_bcch_changed = FALSE; TRACE_FUNCTION("ctrl_copy_scell_params"); psc_db->scell_par.cr_par_1.cr_pow_par.gprs_ms_txpwr_max_cch = sc_inf->gprs_ms_txpwr_max_cch; psc_db->prach.ac_class = sc_inf->ac_class; ctrl_copy_cell_env( &psc_db->cell_info_for_gmm.cell_info.cell_env, sc_inf ); grr_data->meas.pwr_offset = sc_inf->pwr_offset; psc_db->net_ctrl.bs_pa_mfrms = sc_inf->bs_pa_mfrms; if(sc_inf->arfcn[0] EQ RRGRR_INVALID_ARFCN) { TRACE_EVENT("No BA list sent with SI13 info"); return ba_bcch_changed; } #if defined (REL99) AND defined (TI_PS_FF_EMR) /* Copy ba_ind of the NC list */ if(sc_inf->ba_ind NEQ psc_db->ba_ind) { grr_init_ba_bcch_nc_list(psc_db); psc_db->ba_ind = sc_inf->ba_ind; } #endif if( grr_t_status( T3176 ) > 0 ) { TRACE_EVENT ( "ctrl_copy_scell_params: packet cell change order - do not delete psc_db->nc_cw.list.number" ); } else { UBYTE i = 0; /* used for counting */ while( i < RRGRR_BA_LIST_SIZE AND i < MAX_NR_OF_NCELL AND sc_inf->arfcn[i] NEQ RRGRR_INVALID_ARFCN ) { if( psc_db->nc_cw.list.info[i].index NEQ i OR psc_db->nc_cw.list.info[i].arfcn NEQ sc_inf->arfcn[i] OR psc_db->nc_cw.list.info[i].bsic NEQ RRGRR_INVALID_BSIC ) { psc_db->nc_cw.list.info[i].index = i; psc_db->nc_cw.list.info[i].arfcn = sc_inf->arfcn[i]; psc_db->nc_cw.list.info[i].bsic = RRGRR_INVALID_BSIC; NC_SET_TYPE ( psc_db->nc_cw.list.info[i].info_src, INFO_TYPE_BA_BCCH ); NC_SET_INSTANCE( psc_db->nc_cw.list.info[i].info_src, 0 ); NC_SET_NUMBER ( psc_db->nc_cw.list.info[i].info_src, 0 ); ba_bcch_changed = TRUE; } i++; } if( psc_db->nc_cw.list.number NEQ i ) { psc_db->nc_cw.list.number = i; ba_bcch_changed = TRUE; } } grr_data->pwr_ctrl_valid_flags.v_glbl_pwr_ctrl_param = TRUE; grr_data->pwr_ctrl_valid_flags.v_freq_param = TRUE; return( ba_bcch_changed ); }/* ctrl_copy_scell_params */ /* +------------------------------------------------------------------------------ | Function : ctrl_cell_change_order +------------------------------------------------------------------------------ | Description : Start processing packet cell change order or cell change order | | Parameters : | +------------------------------------------------------------------------------ */ GLOBAL void ctrl_cell_change_order ( T_CTRL_CCO_TYPE type, void *data ) { T_NC_MVAL *nc_mval; TRACE_FUNCTION("ctrl_cell_change_order"); TRACE_EVENT("ctrl_cell_change_order_started");/*to show the trace on target*/ switch( type ) { case( CCO_TYPE_RR ): { T_D_CHANGE_ORDER *d_change_order = (T_D_CHANGE_ORDER *)data; SET_STATE(CTRL,CTRL_RR_NC_CCO); /* set network commanded cell change order */ ctrl_stop_all_activities( CTRL_DC_CR_NW_RR, d_change_order ); grr_init_db( pcr_db ); /* process BCCH ARFCN and BSIC */ pcr_db->pbcch.bcch.arfcn = ((USHORT)d_change_order->cell_desc.bcch_arfcn_hi << 8) + (USHORT)d_change_order->cell_desc.bcch_arfcn_lo; pcr_db->pbcch.bcch.bsic = (d_change_order->cell_desc.ncc << 3) + d_change_order->cell_desc.bcc; /* process state variable */ grr_data->cc_running = TRUE; vsi_t_start(GRR_handle,T3134,T3134_VALUE); } break; case( CCO_TYPE_GRR ): { T_D_CELL_CHAN_ORDER *d_cell_chan_order = ( T_D_CELL_CHAN_ORDER *)data; grr_data->ctrl.pcc_arfcn = d_cell_chan_order->tgt_cell_gsm_info.gsm_target_cell.arfcn; grr_data->ctrl.pcc_bsic = d_cell_chan_order->tgt_cell_gsm_info.gsm_target_cell.bsic;; grr_data->ctrl.old_arfcn = psc_db->pbcch.bcch.arfcn; grr_data->ctrl.old_bsic = psc_db->pbcch.bcch.bsic ; TRACE_EVENT_P2("ctrl_cell_change_order:commanded cell is arfcn:%d ,bsic:%d", d_cell_chan_order->tgt_cell_gsm_info.gsm_target_cell.arfcn, d_cell_chan_order->tgt_cell_gsm_info.gsm_target_cell.bsic); if( grr_data->cs.gmm_state EQ STANDBY_STATE ) { TRACE_EVENT("ctrl_cell_change_order:GMM in STANDBY state"); grr_data->pcco_failure_cause = 5;/*MS in GMM standby mode*/ ctrl_build_pcco_failure_msg(grr_data->ctrl.pcc_arfcn, grr_data->ctrl.pcc_bsic); } else if (ctrl_check_cco_freq(grr_data->ctrl.pcc_arfcn)) { SET_STATE( CTRL, CTRL_GRR_NC_CCO ); ctrl_start_T3174( ); sig_ctrl_cs_check_cell_location ( d_cell_chan_order->tgt_cell_gsm_info.gsm_target_cell.arfcn, d_cell_chan_order->tgt_cell_gsm_info.gsm_target_cell.bsic); nc_mval = &grr_data->db.nc_mval_list.nc_mval[grr_data->db.cr_cell->idx]; /* ncell_info = grr_get_ncell_info( nc_mval->arfcn, nc_mval->sync_info.bsic ); */ grr_data->ctrl.imm_rel = d_cell_chan_order->tgt_cell_gsm_info.im_rel_c0; ctrl_stop_all_activities( CTRL_DC_CR_NW_GRR, d_cell_chan_order ); grr_init_db( pcr_db ); pcr_db->pbcch.bcch.arfcn = nc_mval->arfcn; pcr_db->pbcch.bcch.bsic = nc_mval->sync_info.bsic; } else { TRACE_EVENT("ctrl_cell_change_order:frequency not implemented"); grr_data->pcco_failure_cause = 0;/*Freq_Not_Impl*/ ctrl_build_pcco_failure_msg(grr_data->ctrl.pcc_arfcn, grr_data->ctrl.pcc_bsic); } } break; } }/* ctrl_cell_change_order */ /* +------------------------------------------------------------------------------ | Function : ctrl_send_reconnect_dcch_req +------------------------------------------------------------------------------ | Description : This is only to be sent when cell change failure occures | | Parameters : | +------------------------------------------------------------------------------ */ GLOBAL void ctrl_send_reconnect_dcch_req ( UBYTE cause ) { TRACE_FUNCTION( "ctrl_send_reconnect_dcch_req" ); { PALLOC( rrgrr_reconnect_dcch_req, RRGRR_RECONNECT_DCCH_REQ ); rrgrr_reconnect_dcch_req->reconn_cause = cause; PSEND( hCommRR, rrgrr_reconnect_dcch_req ); } }/* ctrl_send_reconnect_dcch_req */ /* +------------------------------------------------------------------------------ | Function : ctrl_si13_received +------------------------------------------------------------------------------ | Description : | | Parameters : | +------------------------------------------------------------------------------ */ GLOBAL void ctrl_si13_received( T_RRGRR_GPRS_SI13_IND * rrgrr_si13_ind ) { BOOL ba_bcch_changed; TRACE_FUNCTION( "ctrl_si13_received" ); ctrl_set_gprs_service( rrgrr_si13_ind->cause, rrgrr_si13_ind->serving_cell_info.limited ); ba_bcch_changed = ctrl_copy_scell_params( &rrgrr_si13_ind->serving_cell_info ); if( rrgrr_si13_ind->cause EQ GPRS_SUPPORTED ) { sig_ctrl_psi_si13_received( rrgrr_si13_ind, ba_bcch_changed ); } grr_cgrlc_pwr_ctrl_req( FALSE ); }/* ctrl_si13_received */ /* +------------------------------------------------------------------------------ | Function : ctrl_cc_rejected +------------------------------------------------------------------------------ | Description : | | Parameters : | +------------------------------------------------------------------------------ */ GLOBAL void ctrl_cc_rejected ( void ) { TRACE_FUNCTION( "ctrl_cc_rejected" ); grr_set_db_ptr( DB_MODE_CC_REJ ); if( grr_data->ctrl.parked_rrgrr_cr_ind EQ TRUE ) { sig_ctrl_cs_cc_result( TRUE ); } else { sig_ctrl_cs_cc_result( FALSE ); } }/* ctrl_cc_rejected */ /* +------------------------------------------------------------------------------ | Function : ctrl_failure_processing +------------------------------------------------------------------------------ | Description : | | Parameters : | +------------------------------------------------------------------------------ */ GLOBAL void ctrl_failure_processing ( T_FAILURE_SIGNAL fail_sig ) { UBYTE state = GET_STATE( CTRL ); TRACE_FUNCTION( "ctrl_failure_processing" ); TRACE_EVENT_P1( "ctrl_failure_processing: failure signal %d", fail_sig ); switch( state ) { case CTRL_READY_TO_PROGRESS: if (grr_data->db.old_scell.pbcch_present EQ TRUE) { grr_set_db_ptr( DB_MODE_CC_REJ ); sig_ctrl_cs_reselect( CS_RESELECT_CAUSE_CTRL_NORMAL ); } else { /* The old cell is without PBBCH */ ctrl_send_cell_reselection_req( CR_CONT ); } break; case CTRL_READY: case CTRL_ACCESS_DISABLED: case CTRL_IN_PROGRESS: if (fail_sig EQ FAIL_SIG_DSF_IND) { sig_ctrl_cs_reselect( CS_RESELECT_CAUSE_CTRL_DL_SIG_FAIL ); } else { sig_ctrl_cs_reselect( CS_RESELECT_CAUSE_CTRL_NORMAL ); } break; case CTRL_RR_CR_IN_SUSP: case CTRL_AUTO_RR_CR: ctrl_send_cell_reselection_req( CR_CONT ); break; case CTRL_CR: case CTRL_CR_IN_SUSP: SET_STATE_FAILED_CR( state ); ctrl_cc_rejected( ); break; case CTRL_RR_NC_CCO: SET_STATE( CTRL, CTRL_IN_PROGRESS ); ctrl_reinstall_old_scell_req( FALSE, RECONN_NO_ACTIVITY ); break; case CTRL_GRR_NC_CCO: if ( grr_t_status(T3174) > 0) { ctrl_stop_T3174(); } ctrl_pcco_failure( ); break; default: TRACE_ERROR( "ctrl_failure_processing: failure signal unexpected" ); break; } } /* ctrl_failure_processing */ /* +------------------------------------------------------------------------------ | Function : ctrl_pcco_failure +------------------------------------------------------------------------------ | Description : Handles the internal signal ctrl_pcco_failure | | Parameters : void | +------------------------------------------------------------------------------ */ GLOBAL void ctrl_pcco_failure(void) { TRACE_ISIG( "ctrl_pcco_failure" ); vsi_t_start( GRR_handle, T3176, T3176_VALUE ); TRACE_EVENT( "ctrl_pcco_failure:T3176 started." ); ctrl_stop_all_activities( CTRL_DC_CR_NW_GRR, NULL ); } /* ctrl_pcoo_failure */ /* +------------------------------------------------------------------------------ | Function : ctrl_build_pcco_failure_msg +------------------------------------------------------------------------------ | Description : The function is to send packet cell change failure message | | Parameters : void | +------------------------------------------------------------------------------ */ GLOBAL void ctrl_build_pcco_failure_msg(USHORT arfcn, UBYTE bsic) { TRACE_FUNCTION( "ctrl_build_pcco_failure_msg" ); TRACE_EVENT("ctrl_build_pcco_failure_msg"); { T_U_CELL_CHAN_FAILURE u_cell_chan_failure; u_cell_chan_failure.msg_type = U_CELL_CHAN_FAILURE_c; grr_set_buf_tlli( &u_cell_chan_failure.tlli_value, grr_get_tlli( ) ); u_cell_chan_failure.arfcn = arfcn; u_cell_chan_failure.bsic = bsic; u_cell_chan_failure.failure_cause = grr_data->pcco_failure_cause; TRACE_EVENT_P2("ctrl_build_pcco_failure_msg: pcc_arfcn = %1d,pcc_bsic = %1d", arfcn,bsic); ctrl_send_control_block( CGRLC_BLK_OWNER_CTRL, (void*)(&u_cell_chan_failure) ); } } /*ctrl_build_pcco_failure_msg */ /* +------------------------------------------------------------------------------ | Function : ctrl_send_control_block +------------------------------------------------------------------------------ | Description : This function is used to signal service TC the request for | sending a control block. | | Parameters : void | +------------------------------------------------------------------------------ */ GLOBAL void ctrl_send_control_block ( T_BLK_OWNER blk_owner, void * blk_struct ) { TRACE_FUNCTION( "ctrl_send_control_block" ); TRACE_EVENT( "ctrl_send_control_block" ); switch( blk_owner ) { case( CGRLC_BLK_OWNER_MEAS ): case( CGRLC_BLK_OWNER_CS ): /* * If the timers related to measurement reporting expire while the * reselection procedure has not yet been completed, these timers * shall be restarted so that the mobile station resumes measurement * reporting procedures once camped on the new cell */ if( grr_t_status( T3174 ) > 0 OR grr_t_status( T3176 ) > 0 ) { ctrl_send_control_block_result( blk_owner, FALSE ); TRACE_ERROR( "ctrl_send_control_block: measurement reporting not allowed" ); } else { sig_ctrl_tc_control_block( blk_owner, blk_struct ); } break; default: sig_ctrl_tc_control_block( blk_owner, blk_struct ); break; } } /* ctrl_send_control_block */ /* +------------------------------------------------------------------------------ | Function : ctrl_cancel_control_block +------------------------------------------------------------------------------ | Description : | | Parameters : void | +------------------------------------------------------------------------------ */ GLOBAL void ctrl_cancel_control_block ( T_BLK_OWNER blk_owner ) { TRACE_FUNCTION( "ctrl_cancel_control_block" ); sig_ctrl_tc_cancel_control_block( blk_owner ); } /* ctrl_cancel_control_block */ /* +------------------------------------------------------------------------------ | Function : ctrl_send_control_block_result +------------------------------------------------------------------------------ | Description : | | Parameters : void | +------------------------------------------------------------------------------ */ GLOBAL void ctrl_send_control_block_result ( T_BLK_OWNER blk_owner, BOOL is_success ) { TRACE_FUNCTION( "ctrl_send_control_block_result" ); switch( blk_owner ) { case( CGRLC_BLK_OWNER_MEAS ): if( is_success ) sig_ctrl_meas_pmr_accept( ); else sig_ctrl_meas_pmr_reject( ); break; case( CGRLC_BLK_OWNER_CS ): if( is_success ) sig_ctrl_cs_pmr_accept( ); else sig_ctrl_cs_pmr_reject( ); break; case( CGRLC_BLK_OWNER_CTRL ): vsi_t_stop( GRR_handle, T3176 ); TRACE_EVENT("ctrl_send_control_block_result:T3176 stopped"); break; default: TRACE_ERROR( "ctrl_send_control_block_result: blk_owner out of range" ); break; } } /* ctrl_send_control_block_result */ /* +------------------------------------------------------------------------------ | Function : ctrl_resp_resume +------------------------------------------------------------------------------ | Description : The function ctrl_resp_resume() .... | | Parameters : void | +------------------------------------------------------------------------------ */ GLOBAL void ctrl_resp_resume( void ) { psc_db->is_access_enabled = TRUE; ctrl_send_cell_ind(); sig_ctrl_pg_start(); sig_ctrl_psi_resumpt(); sig_ctrl_cs_pim( ); sig_ctrl_cs_start( ); sig_ctrl_meas_pim( ); sig_ctrl_meas_resume( ); ctrl_tc_access_enable( sig_ctrl_tc_disable_prim_queue ); }/* ctrl_resp_resume */ /* +------------------------------------------------------------------------------ | Function : ctrl_handle_new_candidate +------------------------------------------------------------------------------ | Description : | | Parameters : void | +------------------------------------------------------------------------------ */ GLOBAL void ctrl_handle_new_candidate( BOOL initial ) { UBYTE state; T_NC_MVAL *nc_mval; T_ncell_info *ncell_info; TRACE_FUNCTION( "ctrl_handle_new_candidate" ); grr_init_db( pcr_db ); state = GET_STATE( CTRL ); switch( state ) { case CTRL_CR: case CTRL_FAILED_CR: case CTRL_GRR_NC_CCO: SET_STATE( CTRL, CTRL_CR ); break; case CTRL_CR_IN_SUSP: case CTRL_FAILED_CR_IN_SUSP: SET_STATE( CTRL, CTRL_CR_IN_SUSP ); break; default: TRACE_EVENT_P1( "ctrl_handle_new_candidate: unexpected state %d", state ); break; } nc_mval = &grr_data->db.nc_mval_list.nc_mval[grr_data->db.cr_cell->idx]; ncell_info = grr_get_ncell_info( nc_mval->arfcn, nc_mval->sync_info.bsic ); /* * Store ARFCN and BSIC of the cell re-selection candidate, * these parameters should be used to avoid considering RRGRR_SI13_IND * and RRGRR_GPRS_IND primitives which maybe present in the data queue * of GRR but belong to the old serving cell. */ pcr_db->pbcch.bcch.arfcn = nc_mval->arfcn; pcr_db->pbcch.bcch.bsic = nc_mval->sync_info.bsic; if( ncell_info NEQ NULL ) { #ifdef _SIMULATION_ if( ncell_info->cr_par.v_si13_pbcch AND !ncell_info->cr_par.si13_pbcch.v_si13_location ) { /* * Copy pbcch description from the ncell description to pcr_db */ ctrl_copy_pbcch_des_from_ncell( pcr_db ); /* * We have to synchronize to the new cell to be able * to read full PSI in the new cell */ ctrl_start_cell_reselection( CTRL_CR_TYPE_NEW_PBCCH_INFO, initial ); } else #endif /* #ifdef _SIMULATION_ */ { ctrl_start_cell_reselection( CTRL_CR_TYPE_NEW, initial ); } } else { ctrl_start_cell_reselection( CTRL_CR_TYPE_NEW, initial ); } } /* ctrl_handle_new_candidate */ /* +------------------------------------------------------------------------------ | Function : ctrl_handle_no_more_candidate +------------------------------------------------------------------------------ | Description : | | Parameters : void | +------------------------------------------------------------------------------ */ GLOBAL void ctrl_handle_no_more_candidate( T_CTRL_CR_TYPE ctrl_cr_type, BOOL initial ) { TRACE_FUNCTION( "ctrl_handle_no_more_candidate" ); SET_STATE( CTRL, CTRL_READY ); /* grr_set_db_ptr( DB_MODE_INIT ); */ ctrl_start_cell_reselection( ctrl_cr_type, initial ); } /* ctrl_handle_no_more_candidate */ /* +------------------------------------------------------------------------------ | Function : ctrl_start_rr_task +------------------------------------------------------------------------------ | Description : | | Parameters : void | +------------------------------------------------------------------------------ */ GLOBAL void ctrl_start_rr_task ( UBYTE state ) { TRACE_FUNCTION( "ctrl_start_rr_task" ); if( state EQ TASK_STATE_PTM OR grr_is_pbcch_present( ) ) { PALLOC( rrgrr_start_task_req, RRGRR_START_TASK_REQ ); rrgrr_start_task_req->state = state; PSEND( hCommRR, rrgrr_start_task_req ); } } /* ctrl_start_rr_task */ /* +------------------------------------------------------------------------------ | Function : ctrl_stop_rr_task_req +------------------------------------------------------------------------------ | Description : | | Parameters : void | +------------------------------------------------------------------------------ */ GLOBAL void ctrl_stop_rr_task_req ( T_GLBL_PCKT_MODE final_pckt_mode, UBYTE param ) { BOOL pbcch_present = grr_is_pbcch_present( ); BOOL change_pckt_mode; UBYTE curr_pckt_mode; T_CTRL_TASK ctrl_task; TRACE_FUNCTION( "ctrl_stop_rr_task_req" ); change_pckt_mode = ctrl_set_transient_pckt_mode( final_pckt_mode, &ctrl_task ); curr_pckt_mode = GET_STATE( CTRL_GLBL ); if( change_pckt_mode ) { if( curr_pckt_mode EQ GLBL_PCKT_MODE_IDLE_ASSIGNED OR curr_pckt_mode EQ GLBL_PCKT_MODE_IDLE_ACCESS OR ( curr_pckt_mode EQ GLBL_PCKT_MODE_TRANSFER_ACCESS AND !pbcch_present ) OR curr_pckt_mode EQ GLBL_PCKT_MODE_RELEASED_ACCESS ) { ctrl_leave_to_pam( ); } if( ctrl_task EQ CTRL_TASK_PBCCH_LEAVE_NULL AND pbcch_present EQ TRUE ) { grr_data->ctrl_glbl.ctrl_task = ctrl_task; sig_ctrl_psi_rel_state( REL_PERFORMED ); ctrl_stop_rr_task_cnf( TRUE ); } else if( ctrl_task EQ CTRL_TASK_PBCCH_LEAVE_SUSP ) { grr_data->ctrl_glbl.ctrl_task = ctrl_task; ctrl_stop_rr_task_cnf( TRUE ); } else if( pbcch_present ) { if( ctrl_task NEQ CTRL_TASK_NONE AND ctrl_task NEQ CTRL_TASK_PBCCH_LEAVE_SYNC ) { ctrl_send_rrgrr_stop_task_req( ctrl_task, param ); } else { ctrl_stop_rr_task_cnf( change_pckt_mode ); } } else { ctrl_stop_rr_task_cnf( change_pckt_mode ); } } else { if ( curr_pckt_mode EQ GLBL_PCKT_MODE_ACCESS ) { ctrl_enter_pam( ); } else if( curr_pckt_mode EQ GLBL_PCKT_MODE_ACCESS_TWO_PHASE ) { sig_ctrl_pg_mode_ind( PACKET_MODE_2P_PTM ); } else if( curr_pckt_mode EQ GLBL_PCKT_MODE_MEAS_REP_IDLE ) { sig_ctrl_pg_mode_ind( PACKET_MODE_PIM ); } else if( curr_pckt_mode EQ GLBL_PCKT_MODE_SUSP ) { ctrl_start_rr_task( TASK_STATE_PIM ); } ctrl_stop_rr_task_cnf( change_pckt_mode ); } } /* ctrl_stop_rr_task_req */ /* +------------------------------------------------------------------------------ | Function : ctrl_stop_rr_task_cnf +------------------------------------------------------------------------------ | Description : | | Parameters : void | +------------------------------------------------------------------------------ */ GLOBAL void ctrl_stop_rr_task_cnf ( BOOL change_pckt_mode ) { TRACE_FUNCTION( "ctrl_stop_rr_task_cnf" ); ctrl_set_final_pckt_mode( ); if( change_pckt_mode ) { T_GLBL_PCKT_MODE pckt_mode = GET_STATE( CTRL_GLBL ); if( pckt_mode EQ GLBL_PCKT_MODE_IDLE ) { if ( grr_data->ctrl_glbl.ctrl_task EQ CTRL_TASK_PBCCH_LEAVE_SUSP ) { ctrl_resp_resume( ); } else if( grr_data->ctrl_glbl.ctrl_task EQ CTRL_TASK_PBCCH_LEAVE_SYNC ) { /* * just set the correct state, * detailed processing will be performed by the calling function */ } else if( grr_data->ctrl_glbl.ctrl_task NEQ CTRL_TASK_PBCCH_LEAVE_NULL ) { ctrl_enter_pim( ); ctrl_start_rr_task( TASK_STATE_PIM ); } } else if( pckt_mode EQ GLBL_PCKT_MODE_ACCESS ) { ctrl_enter_pam( ); if( grr_data->tc.last_eval_assign.tbf_type EQ CGRLC_TBF_MODE_NULL ) { ctrl_start_rr_task( TASK_STATE_PAM ); } else { TRACE_EVENT( "No task start for PAM, DL assignment received" ); } } else if( pckt_mode EQ GLBL_PCKT_MODE_ASSIGNED ) { if( grr_data->tc.last_eval_assign.ccch_read EQ DONT_STOP_CCCH ) { sig_ctrl_pg_mode_ind( PACKET_MODE_PAM ); } sig_ctrl_tc_leave_to_ptm( ); } else if( pckt_mode EQ GLBL_PCKT_MODE_TRANSFER ) { ctrl_enter_ptm( ); ctrl_start_rr_task( TASK_STATE_PTM ); } else if( pckt_mode EQ GLBL_PCKT_MODE_RELEASED ) { sig_ctrl_tc_leave_to_pim( ); } } grr_data->ctrl_glbl.ctrl_task = CTRL_TASK_NONE; } /* ctrl_stop_rr_task_cnf */ /* +------------------------------------------------------------------------------ | Function : ctrl_send_rrgrr_stop_task_req +------------------------------------------------------------------------------ | Description : | | Parameters : | +------------------------------------------------------------------------------ */ GLOBAL void ctrl_send_rrgrr_stop_task_req ( T_CTRL_TASK ctrl_task, UBYTE param ) { PALLOC( rrgrr_stop_task_req, RRGRR_STOP_TASK_REQ ); TRACE_FUNCTION( "ctrl_send_rrgrr_stop_task_req" ); switch( ctrl_task ) { case CTRL_TASK_PBCCH_LEAVE_IDLE: rrgrr_stop_task_req->ctrl_task = LEAVE_PIM_PBCCH; rrgrr_stop_task_req->task.v_pim_pbcch = param; break; case CTRL_TASK_PBCCH_LEAVE_ACCESS: rrgrr_stop_task_req->ctrl_task = LEAVE_PAM_PBCCH; rrgrr_stop_task_req->task.v_pam_pbcch = param; break; case CTRL_TASK_PBCCH_LEAVE_TRANSFER: rrgrr_stop_task_req->ctrl_task = LEAVE_PTM_PBCCH; rrgrr_stop_task_req->task.v_ptm_pbcch = param; break; case CTRL_TASK_BCCH: rrgrr_stop_task_req->ctrl_task = RR_TASK_1; rrgrr_stop_task_req->task.v_stop_ccch = param; break; default: PFREE( rrgrr_stop_task_req ); TRACE_ERROR( "ctrl_send_rrgrr_stop_task_req: invalid control task" ); TRACE_EVENT_P1( "FATAL ERROR: ctrl_send_rrgrr_stop_task_req: %d", ctrl_task ); return; } /* * Issue #22667, Patch FDS 28-04-04 - Fix for TIL 06 in spain * Don't change the ctrl state if RR doesn't respond to the stop_task_req */ if ( (ctrl_task NEQ CTRL_TASK_BCCH) OR (param NEQ INVALID_MSG) ) grr_data->ctrl_glbl.ctrl_task = ctrl_task; #ifdef _SIMULATION_ TRACE_EVENT_P1( "ctrl_send_rrgrr_stop_task_req - ctrl_task: %d", grr_data->ctrl_glbl.ctrl_task ); #endif /* #ifdef _SIMULATION_ */ PSEND( hCommRR, rrgrr_stop_task_req ); } /* ctrl_send_rrgrr_stop_task_req */ /* +------------------------------------------------------------------------------ | Function : ctrl_set_final_pckt_mode +------------------------------------------------------------------------------ | Description : | | Parameters : void | +------------------------------------------------------------------------------ */ LOCAL void ctrl_set_final_pckt_mode ( void ) { UBYTE pckt_mode = GET_STATE( CTRL_GLBL ); TRACE_FUNCTION( "ctrl_set_final_pckt_mode" ); switch( pckt_mode ) { case( GLBL_PCKT_MODE_NULL_IDLE ): case( GLBL_PCKT_MODE_SUSP_IDLE ): case( GLBL_PCKT_MODE_SYNC_IDLE ): case( GLBL_PCKT_MODE_ACCESS_IDLE ): case( GLBL_PCKT_MODE_ASSIGNED_IDLE ): case( GLBL_PCKT_MODE_TRANSFER_IDLE ): case( GLBL_PCKT_MODE_RELEASED_IDLE ): SET_STATE( CTRL_GLBL, GLBL_PCKT_MODE_IDLE ); break; case( GLBL_PCKT_MODE_IDLE_ACCESS ): case( GLBL_PCKT_MODE_TRANSFER_ACCESS ): case( GLBL_PCKT_MODE_RELEASED_ACCESS ): case( GLBL_PCKT_MODE_ACCESS_TWO_PHASE ): case( GLBL_PCKT_MODE_MEAS_REP_IDLE ): SET_STATE( CTRL_GLBL, GLBL_PCKT_MODE_ACCESS ); break; case( GLBL_PCKT_MODE_IDLE_ASSIGNED ): case( GLBL_PCKT_MODE_ACCESS_ASSIGNED ): SET_STATE( CTRL_GLBL, GLBL_PCKT_MODE_ASSIGNED ); break; case( GLBL_PCKT_MODE_IDLE_TRANSFER ): case( GLBL_PCKT_MODE_ASSIGNED_TRANSFER ): case( GLBL_PCKT_MODE_ACCESS_TRANSFER ): SET_STATE( CTRL_GLBL, GLBL_PCKT_MODE_TRANSFER ); break; case( GLBL_PCKT_MODE_TRANSFER_RELEASED ): SET_STATE( CTRL_GLBL, GLBL_PCKT_MODE_RELEASED ); break; case( GLBL_PCKT_MODE_NULL ): case( GLBL_PCKT_MODE_SUSP ): case( GLBL_PCKT_MODE_SYNC ): case( GLBL_PCKT_MODE_IDLE ): case( GLBL_PCKT_MODE_ACCESS ): case( GLBL_PCKT_MODE_ASSIGNED ): case( GLBL_PCKT_MODE_TRANSFER ): case( GLBL_PCKT_MODE_RELEASED ): /* do nothing */ break; default: TRACE_ERROR( "ctrl_set_final_pckt_mode: invalid transition packet mode" ); TRACE_EVENT_P1( "FATAL ERROR: ctrl_set_final_pckt_mode: %d", pckt_mode ); break; } } /* ctrl_set_final_pckt_mode */ /* +------------------------------------------------------------------------------ | Function : ctrl_set_transient_pckt_mode +------------------------------------------------------------------------------ | Description : | | Parameters : | +------------------------------------------------------------------------------ */ LOCAL BOOL ctrl_set_transient_pckt_mode ( T_GLBL_PCKT_MODE final_pckt_mode, T_CTRL_TASK *ctrl_task ) { BOOL change_pckt_mode = TRUE; UBYTE curr_pckt_mode = GET_STATE( CTRL_GLBL ); TRACE_FUNCTION( "ctrl_set_transient_pckt_mode" ); *ctrl_task = CTRL_TASK_NONE; switch( final_pckt_mode ) { case( GLBL_PCKT_MODE_NULL ): SET_STATE( CTRL_GLBL, GLBL_PCKT_MODE_NULL ); change_pckt_mode = FALSE; break; case( GLBL_PCKT_MODE_SUSP ): SET_STATE( CTRL_GLBL, GLBL_PCKT_MODE_SUSP ); change_pckt_mode = FALSE; break; case( GLBL_PCKT_MODE_SYNC ): SET_STATE( CTRL_GLBL, GLBL_PCKT_MODE_SYNC ); change_pckt_mode = FALSE; break; case( GLBL_PCKT_MODE_IDLE ): switch( curr_pckt_mode ) { case( GLBL_PCKT_MODE_NULL ): SET_STATE( CTRL_GLBL, GLBL_PCKT_MODE_NULL_IDLE ); *ctrl_task = CTRL_TASK_PBCCH_LEAVE_NULL; break; case( GLBL_PCKT_MODE_SUSP ): SET_STATE( CTRL_GLBL, GLBL_PCKT_MODE_SUSP_IDLE ); *ctrl_task = CTRL_TASK_PBCCH_LEAVE_SUSP; break; case( GLBL_PCKT_MODE_SYNC ): SET_STATE( CTRL_GLBL, GLBL_PCKT_MODE_SYNC_IDLE ); *ctrl_task = CTRL_TASK_PBCCH_LEAVE_SYNC; break; case( GLBL_PCKT_MODE_IDLE ): change_pckt_mode = FALSE; break; case( GLBL_PCKT_MODE_ACCESS ): SET_STATE( CTRL_GLBL, GLBL_PCKT_MODE_ACCESS_IDLE ); *ctrl_task = CTRL_TASK_PBCCH_LEAVE_ACCESS; break; case( GLBL_PCKT_MODE_ASSIGNED ): SET_STATE( CTRL_GLBL, GLBL_PCKT_MODE_ASSIGNED_IDLE ); break; case( GLBL_PCKT_MODE_TRANSFER ): SET_STATE( CTRL_GLBL, GLBL_PCKT_MODE_TRANSFER_IDLE ); *ctrl_task = CTRL_TASK_PBCCH_LEAVE_TRANSFER; break; case( GLBL_PCKT_MODE_RELEASED ): SET_STATE( CTRL_GLBL, GLBL_PCKT_MODE_RELEASED_IDLE ); break; default: SET_STATE( CTRL_GLBL, GLBL_PCKT_MODE_IDLE ); change_pckt_mode = FALSE; TRACE_EVENT_P2( "WARNING: ctrl_set_transient_pckt_mode: %d, %d", curr_pckt_mode, final_pckt_mode ); break; } break; case( GLBL_PCKT_MODE_ACCESS ): switch( curr_pckt_mode ) { case( GLBL_PCKT_MODE_IDLE ): SET_STATE( CTRL_GLBL, GLBL_PCKT_MODE_IDLE_ACCESS ); *ctrl_task = CTRL_TASK_PBCCH_LEAVE_IDLE; break; case( GLBL_PCKT_MODE_ACCESS ): change_pckt_mode = FALSE; break; case( GLBL_PCKT_MODE_TRANSFER ): SET_STATE( CTRL_GLBL, GLBL_PCKT_MODE_TRANSFER_ACCESS ); *ctrl_task = CTRL_TASK_PBCCH_LEAVE_TRANSFER; break; case( GLBL_PCKT_MODE_RELEASED ): SET_STATE( CTRL_GLBL, GLBL_PCKT_MODE_RELEASED_ACCESS ); break; default: SET_STATE( CTRL_GLBL, GLBL_PCKT_MODE_ACCESS ); change_pckt_mode = FALSE; TRACE_EVENT_P2( "WARNING: ctrl_set_transient_pckt_mode: %d, %d", curr_pckt_mode, final_pckt_mode ); break; } break; case( GLBL_PCKT_MODE_ACCESS_TWO_PHASE ): switch( curr_pckt_mode ) { case( GLBL_PCKT_MODE_ACCESS ): SET_STATE( CTRL_GLBL, GLBL_PCKT_MODE_ACCESS_TWO_PHASE ); change_pckt_mode = FALSE; break; default: SET_STATE( CTRL_GLBL, GLBL_PCKT_MODE_ACCESS ); change_pckt_mode = FALSE; TRACE_EVENT_P2( "WARNING: ctrl_set_transient_pckt_mode: %d, %d", curr_pckt_mode, final_pckt_mode ); break; } break; case( GLBL_PCKT_MODE_MEAS_REP_IDLE ): switch( curr_pckt_mode ) { case( GLBL_PCKT_MODE_ACCESS ): SET_STATE( CTRL_GLBL, GLBL_PCKT_MODE_MEAS_REP_IDLE ); change_pckt_mode = FALSE; break; default: SET_STATE( CTRL_GLBL, GLBL_PCKT_MODE_ACCESS ); change_pckt_mode = FALSE; TRACE_EVENT_P2( "WARNING: ctrl_set_transient_pckt_mode: %d, %d", curr_pckt_mode, final_pckt_mode ); break; } break; case( GLBL_PCKT_MODE_ASSIGNED ): switch( curr_pckt_mode ) { case( GLBL_PCKT_MODE_IDLE ): SET_STATE( CTRL_GLBL, GLBL_PCKT_MODE_IDLE_ASSIGNED ); *ctrl_task = CTRL_TASK_PBCCH_LEAVE_IDLE; break; case( GLBL_PCKT_MODE_ACCESS ): SET_STATE( CTRL_GLBL, GLBL_PCKT_MODE_ACCESS_ASSIGNED ); *ctrl_task = CTRL_TASK_PBCCH_LEAVE_ACCESS; break; case( GLBL_PCKT_MODE_ASSIGNED ): change_pckt_mode = FALSE; break; default: SET_STATE( CTRL_GLBL, GLBL_PCKT_MODE_ASSIGNED ); change_pckt_mode = FALSE; TRACE_EVENT_P2( "WARNING: ctrl_set_transient_pckt_mode: %d, %d", curr_pckt_mode, final_pckt_mode ); break; } break; case( GLBL_PCKT_MODE_TRANSFER ): switch( curr_pckt_mode ) { case( GLBL_PCKT_MODE_IDLE ): SET_STATE( CTRL_GLBL, GLBL_PCKT_MODE_IDLE_TRANSFER ); *ctrl_task = CTRL_TASK_PBCCH_LEAVE_IDLE; break; case( GLBL_PCKT_MODE_ACCESS ): SET_STATE( CTRL_GLBL, GLBL_PCKT_MODE_ACCESS_TRANSFER ); *ctrl_task = CTRL_TASK_PBCCH_LEAVE_ACCESS; break; case( GLBL_PCKT_MODE_ASSIGNED ): SET_STATE( CTRL_GLBL, GLBL_PCKT_MODE_ASSIGNED_TRANSFER ); break; case( GLBL_PCKT_MODE_TRANSFER ): change_pckt_mode = FALSE; break; default: SET_STATE( CTRL_GLBL, GLBL_PCKT_MODE_TRANSFER ); change_pckt_mode = FALSE; TRACE_EVENT_P2( "WARNING: ctrl_set_transient_pckt_mode: %d, %d", curr_pckt_mode, final_pckt_mode ); break; } break; case( GLBL_PCKT_MODE_RELEASED ): switch( curr_pckt_mode ) { case( GLBL_PCKT_MODE_TRANSFER ): SET_STATE( CTRL_GLBL, GLBL_PCKT_MODE_TRANSFER_RELEASED ); *ctrl_task = CTRL_TASK_PBCCH_LEAVE_TRANSFER; break; case( GLBL_PCKT_MODE_RELEASED ): change_pckt_mode = FALSE; break; default: SET_STATE( CTRL_GLBL, GLBL_PCKT_MODE_RELEASED ); change_pckt_mode = FALSE; TRACE_EVENT_P2( "WARNING: ctrl_set_transient_pckt_mode: %d, %d", curr_pckt_mode, final_pckt_mode ); break; } break; default: change_pckt_mode = FALSE; TRACE_ERROR ( "ctrl_set_transient_pckt_mode: invalid final packet mode" ); TRACE_EVENT_P1( "FATAL ERROR: ctrl_set_transient_pckt_mode: %d", final_pckt_mode ); break; } return( change_pckt_mode ); } /* ctrl_set_transient_pckt_mode */ /* +------------------------------------------------------------------------------ | Function : ctrl_enter_pim +------------------------------------------------------------------------------ | Description : | | Parameters : void | +------------------------------------------------------------------------------ */ LOCAL void ctrl_enter_pim ( void ) { TRACE_FUNCTION( "ctrl_enter_pim" ); /* * Reset TA-Values */ memset(&grr_data->ta_params, 0xFF, sizeof(T_TA_PARAMS)); grr_data->ta_params.ta_valid = FALSE; sig_ctrl_pg_mode_ind( PACKET_MODE_PIM ); sig_ctrl_psi_pim( ); sig_ctrl_meas_pim( ); sig_ctrl_cs_pim( ); } /* ctrl_enter_pim */ /* +------------------------------------------------------------------------------ | Function : ctrl_leave_to_pam +------------------------------------------------------------------------------ | Description : | | Parameters : void | +------------------------------------------------------------------------------ */ LOCAL void ctrl_leave_to_pam ( void ) { TRACE_FUNCTION( "ctrl_leave_to_pam" ); sig_ctrl_meas_pam( ); sig_ctrl_psi_pam( ); sig_ctrl_cs_leave_to_pam( ); } /* ctrl_leave_to_pam */ /* +------------------------------------------------------------------------------ | Function : ctrl_enter_pam +------------------------------------------------------------------------------ | Description : | | Parameters : void | +------------------------------------------------------------------------------ */ LOCAL void ctrl_enter_pam ( void ) { TRACE_FUNCTION( "ctrl_enter_pam" ); sig_ctrl_pg_mode_ind( PACKET_MODE_PAM ); sig_ctrl_cs_enter_pam( ); /* * PATCH 1 BEGIN 10.12.2002 */ /* * wait 2 ms after pccch_req, otherwise prach will not sent --> L1 BUG02724 */ vsi_t_sleep( VSI_CALLER 2 ); /* * PATCH 1 END 10.12.2002 */ sig_ctrl_tc_enter_pam( ); } /* ctrl_enter_pam */ /* +------------------------------------------------------------------------------ | Function : ctrl_enter_ptm +------------------------------------------------------------------------------ | Description : | | Parameters : void | +------------------------------------------------------------------------------ */ LOCAL void ctrl_enter_ptm ( void ) { TRACE_FUNCTION( "ctrl_enter_ptm" ); sig_ctrl_psi_ptm( ); sig_ctrl_pg_mode_ind( PACKET_MODE_PTM ); sig_ctrl_meas_ptm( ); sig_ctrl_cs_ptm( ); } /* ctrl_enter_ptm */ /* +------------------------------------------------------------------------------ | Function : ctrl_set_old_scell +------------------------------------------------------------------------------ | Description : | | Parameters : void | +------------------------------------------------------------------------------ */ GLOBAL void ctrl_set_old_scell ( BOOL service ) { TRACE_FUNCTION( "ctrl_set_old_scell" ); ctrl_send_gmmrr_cr_ind( ); if( service ) { grr_data->db.old_scell.arfcn = psc_db->pbcch.bcch.arfcn; grr_data->db.old_scell.bsic = psc_db->pbcch.bcch.bsic; grr_data->db.old_scell.pbcch_present = psc_db->pbcch.bcch.pbcch_present; } else { grr_data->db.old_scell.arfcn = RRGRR_INVALID_ARFCN; grr_data->db.old_scell.bsic = RRGRR_INVALID_BSIC; grr_data->db.old_scell.pbcch_present = FALSE; } grr_data->ctrl.new_cell_responded = FALSE; grr_data->ctrl.rr_state.cr_ind_return = CR_IND_RETURN_RESPONSE; #ifdef _SIMULATION_ TRACE_EVENT_P2( "ctrl_set_old_scell - old SCELL: %d %d", grr_data->db.old_scell.arfcn, grr_data->db.old_scell.bsic ); #endif /* #ifdef _SIMULATION_ */ } /* ctrl_set_old_scell( ) */ /* +------------------------------------------------------------------------------ | Function : ctrl_send_gmmrr_cr_ind +------------------------------------------------------------------------------ | Description : | | Parameters : void | +------------------------------------------------------------------------------ */ GLOBAL void ctrl_send_gmmrr_cr_ind ( void ) { PALLOC( gmmrr_cr_ind, GMMRR_CR_IND ); PSEND( hCommGMM, gmmrr_cr_ind ); TRACE_FUNCTION( "ctrl_send_gmmrr_cr_ind" ); } /* ctrl_send_gmmrr_cr_ind( ) */ /* +------------------------------------------------------------------------------ | Function : ctrl_start_cell_reselection +------------------------------------------------------------------------------ | Description : | | Parameters : | +------------------------------------------------------------------------------ */ GLOBAL void ctrl_start_cell_reselection ( T_CTRL_CR_TYPE ctrl_cr_type, BOOL initial ) { UBYTE cr_type = CR_CS; TRACE_FUNCTION( "ctrl_start_cell_reselection" ); if( initial EQ TRUE ) { ctrl_set_old_scell( TRUE ); } switch( ctrl_cr_type ) { case CTRL_CR_TYPE_CS : /* nothing to do */ break; case CTRL_CR_TYPE_NEW : case CTRL_CR_TYPE_NEW_PBCCH_INFO: cr_type = CR_NEW; break; case CTRL_CR_TYPE_NEW_NOT_SYNCED: cr_type = CR_NEW_NOT_SYNCED; break; case CTRL_CR_TYPE_CONT : cr_type = CR_CONT; break; default: TRACE_ASSERT( ctrl_cr_type EQ CTRL_CR_TYPE_CS OR ctrl_cr_type EQ CTRL_CR_TYPE_NEW OR ctrl_cr_type EQ CTRL_CR_TYPE_NEW_PBCCH_INFO OR ctrl_cr_type EQ CTRL_CR_TYPE_NEW_NOT_SYNCED OR ctrl_cr_type EQ CTRL_CR_TYPE_CONT ); break; } if( ctrl_cr_type EQ CTRL_CR_TYPE_NEW_PBCCH_INFO ) { ctrl_sync_to_given_cell( ); } else { ctrl_send_cell_reselection_req( cr_type ); } sig_ctrl_cs_start_cell_selection( cr_type ); } /* ctrl_start_cell_reselection() */ /* +------------------------------------------------------------------------------ | Function : ctrl_cell_has_changed +------------------------------------------------------------------------------ | Description : | | Parameters : | +------------------------------------------------------------------------------ */ GLOBAL BOOL ctrl_cell_has_changed ( void ) { #ifdef _SIMULATION_ TRACE_EVENT_P5( "ctrl_cell_has_changed - %d - new SCELL: %d %d - old SCELL: %d %d", grr_data->ctrl.new_cell_responded, psc_db->pbcch.bcch.arfcn, psc_db->pbcch.bcch.bsic, grr_data->db.old_scell.arfcn, grr_data->db.old_scell.bsic ); #endif /* #ifdef _SIMULATION_ */ return ( grr_data->ctrl.new_cell_responded EQ FALSE AND ( grr_data->db.old_scell.arfcn NEQ psc_db->pbcch.bcch.arfcn OR grr_data->db.old_scell.bsic NEQ psc_db->pbcch.bcch.bsic ) ); } /* ctrl_cell_has_changed() */ /* +------------------------------------------------------------------------------ | Function : ctrl_tc_access_enable +------------------------------------------------------------------------------ | Description : | | Parameters : | +------------------------------------------------------------------------------ */ GLOBAL void ctrl_tc_access_enable( T_TC_ACCESS_ENABLE_FUNC access_enable_func ) { grr_data->ctrl.new_cell_responded |= access_enable_func( ctrl_cell_has_changed( ) ); #ifdef _SIMULATION_ TRACE_EVENT_P5( "ctrl_tc_access_enable - %d - new SCELL: %d %d - old SCELL: %d %d", grr_data->ctrl.new_cell_responded, psc_db->pbcch.bcch.arfcn, psc_db->pbcch.bcch.bsic, grr_data->db.old_scell.arfcn, grr_data->db.old_scell.bsic ); #endif /* #ifdef _SIMULATION_ */ } /* ctrl_tc_access_enable() */ /* +------------------------------------------------------------------------------ | Function : ctrl_check_cco_freq +------------------------------------------------------------------------------ | Description : Check if the frequency in the Cell change order is capable of | using | | Parameters : | +------------------------------------------------------------------------------ */ LOCAL BOOL ctrl_check_cco_freq ( USHORT arfcn ) { BOOL result = FALSE; TRACE_FUNCTION( "ctrl_check_cco_freq" ); TRACE_EVENT( "ctrl_check_cco_freq started" );/*for target trace*/ switch( std ) { case STD_900: /* frequencies must between 1 and 124 */ if(( arfcn >= LOW_CHANNEL_900 ) AND ( arfcn <= HIGH_CHANNEL_900)) { result = TRUE; } break; case STD_EGSM: if(( arfcn <= HIGH_CHANNEL_900) OR (( arfcn >= LOW_CHANNEL_EGSM) AND ( arfcn <= HIGH_CHANNEL_EGSM - 1))) { result = TRUE; } break; case STD_1900: if(( arfcn >= LOW_CHANNEL_1900 ) AND ( arfcn <= HIGH_CHANNEL_1900)) { result = TRUE; } break; case STD_1800: if(( arfcn >= LOW_CHANNEL_1800 ) AND ( arfcn <= HIGH_CHANNEL_1800)) { result = TRUE; } break; case STD_850: if(( arfcn >= LOW_CHANNEL_850 ) AND ( arfcn <= HIGH_CHANNEL_850)) { result = TRUE; } break; case STD_DUAL: if ((( arfcn >= LOW_CHANNEL_900 ) AND ( arfcn <= HIGH_CHANNEL_900)) OR (( arfcn >= LOW_CHANNEL_1800 ) AND ( arfcn <= HIGH_CHANNEL_1800))) { result = TRUE; } break; case STD_DUAL_EGSM: if((( arfcn <= HIGH_CHANNEL_900) OR (( arfcn >= LOW_CHANNEL_EGSM) AND ( arfcn <= HIGH_CHANNEL_EGSM - 1))) OR (( arfcn >= LOW_CHANNEL_1800 ) AND ( arfcn <= HIGH_CHANNEL_1800))) { result = TRUE; } break; case STD_DUAL_US: if ((( arfcn >= LOW_CHANNEL_850 ) AND ( arfcn <= HIGH_CHANNEL_850)) OR (( arfcn >= LOW_CHANNEL_1900 ) AND ( arfcn <= HIGH_CHANNEL_1900))) { result = TRUE; } break; #ifdef TI_PS_FF_QUAD_BAND_SUPPORT case STD_850_1800: if ((( arfcn >= LOW_CHANNEL_850 ) AND ( arfcn <= HIGH_CHANNEL_850)) OR (( arfcn >= LOW_CHANNEL_1800 ) AND ( arfcn <= HIGH_CHANNEL_1800))) { result = TRUE; } break; case STD_900_1900: if(( arfcn <= HIGH_CHANNEL_900) OR (( arfcn >= LOW_CHANNEL_EGSM) AND ( arfcn <= HIGH_CHANNEL_EGSM - 1)) OR (( arfcn >= LOW_CHANNEL_1900 ) AND ( arfcn <= HIGH_CHANNEL_1900))) { result = TRUE; } break; case STD_850_900_1800: if ((( arfcn >= LOW_CHANNEL_850 ) AND ( arfcn <= HIGH_CHANNEL_850)) OR ( arfcn <= HIGH_CHANNEL_900) OR (( arfcn >= LOW_CHANNEL_EGSM) AND ( arfcn <= HIGH_CHANNEL_EGSM - 1)) OR (( arfcn >= LOW_CHANNEL_1800 ) AND ( arfcn <= HIGH_CHANNEL_1800))) { result = TRUE; } break; case STD_850_900_1900: if ((( arfcn >= LOW_CHANNEL_850 ) AND ( arfcn <= HIGH_CHANNEL_850)) OR ( arfcn <= HIGH_CHANNEL_900) OR (( arfcn >= LOW_CHANNEL_EGSM) AND ( arfcn <= HIGH_CHANNEL_EGSM - 1)) OR (( arfcn >= LOW_CHANNEL_1900 ) AND ( arfcn <= HIGH_CHANNEL_1900))) { result = TRUE; } break; #endif default: break; } return(result); } /* ctrl_check_cco_freq() */ /* +------------------------------------------------------------------------------ | Function : ctrl_get_gprs_service +------------------------------------------------------------------------------ | Description : | | Parameters : | +------------------------------------------------------------------------------ */ GLOBAL T_GPRS_SERVICE ctrl_get_gprs_service ( void ) { TRACE_FUNCTION( "ctrl_get_gprs_service" ); return( psc_db->cell_info_for_gmm.gprs_service ); } /* ctrl_get_gprs_service() */ /* +------------------------------------------------------------------------------ | Function : ctrl_set_gprs_service +------------------------------------------------------------------------------ | Description : | | Parameters : | +------------------------------------------------------------------------------ */ GLOBAL void ctrl_set_gprs_service ( UBYTE cause, UBYTE limited ) { TRACE_FUNCTION( "ctrl_set_gprs_service" ); switch( cause ) { case GPRS_SUPPORTED: psc_db->cell_info_for_gmm.gprs_service = ( limited EQ TRUE ? GPRS_SERVICE_LIMITED : GPRS_SERVICE_FULL ); break; case GPRS_NOT_SUPPORTED: case GPRS_CELL_NOT_SUITABLE: default: psc_db->cell_info_for_gmm.gprs_service = GPRS_SERVICE_NONE; break; } grr_set_cell_info_service( ); } /* ctrl_set_gprs_service() */ /* +------------------------------------------------------------------------------ | Function : ctrl_send_gmmrr_suspend_cnf +------------------------------------------------------------------------------ | Description : | | Parameters : | +------------------------------------------------------------------------------ */ GLOBAL void ctrl_send_gmmrr_suspend_cnf ( void ) { TRACE_FUNCTION( "ctrl_send_gmmrr_suspend_cnf" ); { PALLOC( gmmrr_suspend_cnf, GMMRR_SUSPEND_CNF ); PSEND( hCommGMM, gmmrr_suspend_cnf ); } } /* ctrl_send_gmmrr_suspend_cnf() */ /* +------------------------------------------------------------------------------ | Function : ctrl_handle_gmmrr_cs_page_ind +------------------------------------------------------------------------------ | Description : | | Parameters : | +------------------------------------------------------------------------------ */ GLOBAL void ctrl_handle_gmmrr_cs_page_ind( UBYTE state ) { TRACE_FUNCTION( "ctrl_handle_gmmrr_cs_page_ind" ); grr_data->ctrl.last_state = state; { PALLOC( gmmrr_cs_page_ind, GMMRR_CS_PAGE_IND ); PSEND( hCommGMM, gmmrr_cs_page_ind ); } } /* ctrl_handle_gmmrr_cs_page_ind() */ /* +------------------------------------------------------------------------------ | Function : ctrl_handle_parked_rrgrr_cr_ind +------------------------------------------------------------------------------ | Description : | | Parameters : | +------------------------------------------------------------------------------ */ GLOBAL void ctrl_handle_parked_rrgrr_cr_ind( UBYTE state ) { UBYTE glbl_state = GET_STATE( CTRL_GLBL ); TRACE_FUNCTION( "ctrl_handle_parked_rrgrr_cr_ind" ); if( glbl_state EQ GLBL_PCKT_MODE_NULL OR glbl_state EQ GLBL_PCKT_MODE_SYNC OR glbl_state EQ GLBL_PCKT_MODE_SUSP ) { /* * In this state the cell re-selection triggered by GRR * is already requested with a RRGRR_CR_REQ */ if( state EQ CTRL_CR ) { SET_STATE( CTRL, CTRL_AUTO_RR_CR ); } else if( state EQ CTRL_CR_IN_SUSP ) { SET_STATE( CTRL, CTRL_RR_CR_IN_SUSP ); } else { TRACE_EVENT_P1( "ctrl_handle_parked_rrgrr_cr_ind in state %d", state ); } ctrl_cc_rejected( ); ctrl_set_old_scell( FALSE ); ctrl_send_cell_reselection_req( CR_COMPLETE ); grr_data->ctrl.parked_rrgrr_cr_ind = FALSE; } } /* ctrl_handle_parked_rrgrr_cr_ind() */ /* +------------------------------------------------------------------------------ | Function : ctrl_read_pcm +------------------------------------------------------------------------------ | Description : The function ctrl_read_pcm read some info from ffs to decide | if nc2 should be switched on or off | | Parameters : void | +------------------------------------------------------------------------------ */ GLOBAL void ctrl_read_pcm ( void ) { #ifdef _TARGET_ T_GRR_FFS GRR_ffsBuffer; T_FFS_SIZE size = ffs_fread("/GPRS/grr", &GRR_ffsBuffer, sizeof(GRR_ffsBuffer)); #endif TRACE_FUNCTION( "ctrl_read_pcm" ); grr_data->nc2_on = TRUE; #ifdef _TARGET_ if ( size != sizeof(GRR_ffsBuffer) ) { if ( size < 0 ) { TRACE_EVENT_P1("FFS can not be read \"/GPRS/grr\" (%d)", size); } else { TRACE_EVENT_P2("FFS contains old file of \"/GPRS/grr\": %dBytes long, but %dBytes expected", size, sizeof(GRR_ffsBuffer)); } } else { grr_data->nc2_on = GRR_ffsBuffer.nc2_on; } #endif TRACE_EVENT_P1("ctrl_read_pcm: grr_data->nc2_on is %d",grr_data->nc2_on); return; } /* +------------------------------------------------------------------------------ | Function : ctrl_enter_standby_state +------------------------------------------------------------------------------ | Description : | | Parameters : | +------------------------------------------------------------------------------ */ GLOBAL void ctrl_enter_standby_state( void ) { TRACE_FUNCTION( "ctrl_enter_standby_state" ); switch( GET_STATE( CTRL ) ) { case CTRL_NULL: TRACE_ERROR( "ctrl_enter_standby_state: unexpected signalling" ); break; default: sig_ctrl_cs_gmm_state( STANDBY_STATE ); if( grr_is_pbcch_present( ) EQ FALSE ) { PALLOC( rrgrr_standby_state_ind, RRGRR_STANDBY_STATE_IND ); PSEND( hCommRR, rrgrr_standby_state_ind ); } break; } } /* ctrl_enter_standby_state() */ /* +------------------------------------------------------------------------------ | Function : ctrl_enter_ready_state +------------------------------------------------------------------------------ | Description : | | Parameters : | +------------------------------------------------------------------------------ */ GLOBAL void ctrl_enter_ready_state( void ) { TRACE_FUNCTION( "ctrl_enter_ready_state" ); switch( GET_STATE( CTRL ) ) { case CTRL_NULL: TRACE_ERROR( "ctrl_enter_ready_state: unexpected signalling" ); break; default: sig_ctrl_cs_gmm_state( READY_STATE ); if( grr_is_pbcch_present( ) EQ FALSE ) { PALLOC( rrgrr_ready_state_ind, RRGRR_READY_STATE_IND ); PSEND( hCommRR, rrgrr_ready_state_ind ); } break; } } /* ctrl_enter_ready_state() */ #ifdef REL99 /* +------------------------------------------------------------------------------ | Function : ctrl_create_freq_list_cbch +------------------------------------------------------------------------------ | Description : Creates the frequency list to be used for mobile allocation | when CBCH has hopping channel. | Parameters. : cbch_req -output ; points the cbch information structure | that would be sent in RRGRR_CBCH_INFO_IND | freq_par : frequency parameters struct received in PSI 8 | describing the CBCH channel. | gp_ma : GPRS mobile allocation IE referred in Freq parametrs | struct. | ma_num : MA_NUM received in freq params, when indirect encoding | is used. Otherwise, this parameter is not important. +------------------------------------------------------------------------------ */ GLOBAL BOOL ctrl_create_freq_list_cbch(T_cbch *cbch_req,const T_freq_par *freq_par,const T_gprs_ms_alloc_ie *gp_ma,UBYTE ma_num) { T_LIST list1; /*lint !e813*/ USHORT list2[64]; /*lint !e813*/ USHORT count = 0; TRACE_FUNCTION( "ctrl_create_freq_list_cbch" ); memset(&list1, 0, sizeof(T_LIST)); memset(list2, NOT_PRESENT_16BIT, sizeof(list2)); /* * Now we have the GPRS Mobile Allocation corresponding to the ma_num. * Get the referenced set of radio frequency lists for this * particular GPRS Mobile Allocation IE. * If RFL number list is not present in the IE, then cell allocation * would be returned by this function. */ if(!grr_get_ref_list_or_cell_allocation(&list1,gp_ma,ma_num)) { TRACE_ERROR("Could not get ref list"); return FALSE; } /* * Copy ARFCN values into freq_list */ srv_create_list (&list1, list2, 64, TRUE, 0); /* * Take MA_BITMAP or ARFCN_INDEX into account */ grr_ma_filter_list( list2, /* input */ cbch_req->ma, /* output */ gp_ma ); /* * Get number of copied frequencies */ if(!grr_validate_and_count_frequencies( cbch_req->ma,&count)) { TRACE_ERROR( "grr_create_freq_list: validation failed/freq count zero" ); return FALSE; } /* The hopping frequency list has to be sent to RR should be in the form * that is used in MPH sap. The T_p_freq_list used in MPHP sap. The temporary * variable temp_p_freq_list has been temporarily used here to reuse the * code. The last element in temp_p_freq_list should be set to NOT_PRESENT_16BIT * and then copied back to T_cbch cbch_req. */ cbch_req->ma[count] = NOT_PRESENT_16BIT; /*There is no need to convert the frequencies to L1 form. This would be * done by ALR when this information is passed to it by RR. */ cbch_req->hsn = gp_ma->hsn; return TRUE; }/* ctrl_create_freq_list_cbch */ /* +------------------------------------------------------------------------------ | Function : ctrl_fill_cbch_hopping_params +------------------------------------------------------------------------------ | Description : Fills the hopping list to be sent in RRGRR_CBCH_INFO_IND | | Parameters : cbch_req - points to cbch info that would go in primitive. | freq_par - frequency parameters received in psi8 | +------------------------------------------------------------------------------ */ GLOBAL BOOL ctrl_fill_cbch_hopping_params(T_cbch *cbch_req,const T_freq_par *freq_par) { T_gprs_ms_alloc_ie *gp_ma = NULL; BOOL result = FALSE; TRACE_FUNCTION("ctrl_fill_cbch_hopping_params"); if(freq_par->v_indi_encod) { result = grr_validate_ma_num_in_freq_par(freq_par,GRR_FREQ_PARAM_RECEIVED_IN_NON_ASSIGNMENT); if(result) { gp_ma = grr_get_gprs_ma(freq_par->indi_encod.ma_num); if(gp_ma EQ NULL) { TRACE_EVENT("No valid GPRS_MA found"); return FALSE; } if(!ctrl_create_freq_list_cbch(cbch_req, freq_par, gp_ma, freq_par->indi_encod.ma_num)) { TRACE_EVENT("Failed to create freq list for cbch"); return FALSE; } cbch_req->maio = freq_par->indi_encod.maio; } else { TRACE_ERROR("error creating frequency list,Invalid MA_NUM"); result = FALSE; } } /* if(freq_par->v_indi_encod) */ else if(freq_par->v_di_encod1) { /* In this case, the GPRS mobile allocation IE is present * in the message itself. */ if(!ctrl_create_freq_list_cbch(cbch_req, freq_par, &freq_par->di_encod1.gprs_ms_alloc_ie, 0)) { TRACE_EVENT("Failed to create freq list for cbch"); return FALSE; } cbch_req->maio = freq_par->di_encod1.maio; } /* if(freq_par->v_di_encod1) */ else if(freq_par->v_di_encod2) { /* processing of T_freq_par from assignment and non-assignment messages * when direct encoding 2 is used, should be done in same object module as * this involvs use of temporary static array variables which are local to the * object module they are used in(_local_dummy_list and _local_rfl_contents). * Hence processing for both assignment and non-assignement messages is done * in grr_f.c. If they are put in different files, we will have to duplicate * the temporary static arrays. */ result = grr_cnv_freq_para_in_psi8_direct_enc_2(cbch_req,freq_par); } /* if(freq_par->v_di_encod2) */ else { TRACE_ERROR("FATAL ERROR: no frequency params in cbch description."); } return (result); }/* ctrl_fill_cbch_hopping_params */ #endif