FreeCalypso > hg > fc-selenite
view src/g23m-gprs/grr/grr_ctrls.c @ 40:614668bbbc4f
Nucleus: tmt.s ported over from FreeNucleus by XVilka
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Tue, 17 Jul 2018 07:55:01 +0000 |
parents | d393cd9bb723 |
children |
line wrap: on
line source
/* +----------------------------------------------------------------------------- | Project : GPRS (8441) | Modul : GRR +----------------------------------------------------------------------------- | Copyright 2002 Texas Instruments Berlin, AG | All rights reserved. | | This file is confidential and a trade secret of Texas | Instruments Berlin, AG | The receipt of or possession of this file does not convey | any rights to reproduce or disclose its contents or to | manufacture, use, or sell anything it may describe, in | whole, or in part, without the specific written consent of | Texas Instruments Berlin, AG. +----------------------------------------------------------------------------- | Purpose : This module implements signal handler functions for service | CTRL of entity GRR. +----------------------------------------------------------------------------- */ #ifndef GRR_CTRLS_C #define GRR_CTRLS_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_psis.h" /* */ #include "grr_pgs.h" /* */ #include "grr_css.h" /* */ #include "grr_meass.h" /* to get the signals for interference measurements */ #include "grr_tcs.h" /* */ #include <string.h> /* for memcpy*/ /*==== CONST ================================================================*/ /*==== LOCAL VARS ===========================================================*/ /*==== PRIVATE FUNCTIONS ====================================================*/ /*==== PUBLIC FUNCTIONS =====================================================*/ /* +------------------------------------------------------------------------------ | Function : sig_tc_ctrl_set_pckt_mode +------------------------------------------------------------------------------ | Description : Handles the internal signal SIG_TC_CTRL_SET_PCKT_MODE | | Parameters : | +------------------------------------------------------------------------------ */ GLOBAL void sig_tc_ctrl_set_pckt_mode ( T_GLBL_PCKT_MODE final_pckt_mode, UBYTE param ) { TRACE_ISIG( "sig_tc_ctrl_set_pckt_mode" ); switch( GET_STATE( CTRL ) ) { case CTRL_ACCESS_DISABLED: case CTRL_READY_TO_PROGRESS: case CTRL_IN_PROGRESS: case CTRL_WAIT_RSP_4_RR_CR: case CTRL_WAIT_FOR_CNF_OF_SUSPENSION: case CTRL_CR: case CTRL_CR_IN_SUSP: case CTRL_GRR_NC_CCO: case CTRL_READY: ctrl_stop_rr_task_req( final_pckt_mode, param ); break; default: TRACE_ERROR( "sig_tc_ctrl_set_pckt_mode unexpected" ); break; } } /* sig_tc_ctrl_set_pckt_mode() */ /* +------------------------------------------------------------------------------ | Function : sig_tc_ctrl_prepare_abnorm_rel_with_cr +------------------------------------------------------------------------------ | Description : Handles the signal SIG_TC_CTRL_PREPARE_ABNORM_REL_WITH_CR | | Parameters : void | +------------------------------------------------------------------------------ */ GLOBAL void sig_tc_ctrl_prepare_abnorm_rel_with_cr ( void ) { TRACE_ISIG( "sig_tc_ctrl_prepare_abnorm_rel_with_cr" ); switch( GET_STATE( CTRL ) ) { case CTRL_IN_PROGRESS: ctrl_send_access_disable_if_needed ( TC_DC_CR_ABNORMAL, sig_tc_ctrl_abnorm_rel_with_cr ); break; default: TRACE_ERROR( "SIG_TC_CTRL_PREPARE_ABNORM_REL_WITH_CR unexpected" ); break; } } /* sig_tc_ctrl_prepare_abnorm_rel_with_cr() */ /* +------------------------------------------------------------------------------ | Function : sig_tc_ctrl_abnorm_rel_with_cr +------------------------------------------------------------------------------ | Description : Handles the internal signal SIG_TC_CTRL_ABNORM_REL_WITH_CR | | Parameters : void | +------------------------------------------------------------------------------ */ GLOBAL void sig_tc_ctrl_abnorm_rel_with_cr ( void ) { TRACE_ISIG( "sig_tc_ctrl_abnorm_rel_with_cr" ); switch( GET_STATE( CTRL ) ) { case CTRL_IN_PROGRESS: sig_ctrl_cs_reselect( CS_RESELECT_CAUSE_CTRL_ABNORMAL ); break; default: TRACE_ERROR( "SIG_TC_CTRL_ABNORM_REL_WITH_CR unexpected" ); break; } } /* sig_tc_ctrl_abnorm_rel_with_cr() */ /* +------------------------------------------------------------------------------ | Function : sig_tc_ctrl_channel_req +------------------------------------------------------------------------------ | Description : Handles the internal signal SIG_TC_CTRL_CHANNEL_REQ | | SZML-CTRL/002 | | Parameters : void | +------------------------------------------------------------------------------ */ GLOBAL void sig_tc_ctrl_channel_req ( UBYTE channel_req) { TRACE_ISIG( "sig_tc_ctrl_channel_req" ); switch( GET_STATE( CTRL ) ) { case CTRL_IN_PROGRESS: case CTRL_GRR_NC_CCO: { PALLOC(rrgrr_channel_req, RRGRR_CHANNEL_REQ); rrgrr_channel_req->req_data = channel_req; PSEND(hCommRR, rrgrr_channel_req); } break; default: TRACE_ERROR( "SIG_TC_CTRL_CHANNEL_REQ unexpected" ); break; } } /* sig_tc_ctrl_channel_req() */ /* +------------------------------------------------------------------------------ | Function : sig_tc_ctrl_t3172_running +------------------------------------------------------------------------------ | Description : Handles the internal signal SIG_TC_CTRL_T3172_RUNNING | | Parameters : void | +------------------------------------------------------------------------------ */ GLOBAL void sig_tc_ctrl_t3172_running ( void ) { TRACE_ISIG( "sig_tc_ctrl_t3172_running" ); switch( GET_STATE( CTRL ) ) { case CTRL_IN_PROGRESS: case CTRL_GRR_NC_CCO: sig_ctrl_pg_t3172_run(); break; default: TRACE_ERROR( "SIG_TC_CTRL_T3172_RUNNING unexpected" ); break; } } /* sig_tc_ctrl_t3172_running() */ /* +------------------------------------------------------------------------------ | Function : sig_pg_ctrl_downlink_transfer +------------------------------------------------------------------------------ | Description : Handles the internal signal SIG_PG_CTRL_DOWNLINK_TRANSFER | | Parameters : ULONG pg_tlli | +------------------------------------------------------------------------------ */ GLOBAL void sig_pg_ctrl_downlink_transfer ( UBYTE page_id) { TRACE_ISIG( "sig_pg_ctrl_downlink_transfer" ); switch( GET_STATE( CTRL ) ) { case CTRL_IN_PROGRESS: { PALLOC(gmmrr_page_ind, GMMRR_PAGE_IND); gmmrr_page_ind->page_id = page_id; PSEND(hCommGMM,gmmrr_page_ind); } break; default: TRACE_ERROR( "SIG_PG_CTRL_DOWNLINK_TRANSFER unexpected" ); break; } } /* sig_pg_ctrl_downlink_transfer() */ /* +------------------------------------------------------------------------------ | Function : sig_pg_ctrl_rr_est_req +------------------------------------------------------------------------------ | Description : Handles the internal signal SIG_PG_CTRL_RR_EST_REQ | | Parameters : void | +------------------------------------------------------------------------------ */ GLOBAL void sig_pg_ctrl_rr_est_req ( PG_CHANNEL type) { UBYTE state = GET_STATE( CTRL ); TRACE_ISIG( "sig_pg_ctrl_rr_est_req" ); grr_data->ctrl.cs_page_channel = type; switch( state ) { case CTRL_READY: case CTRL_IN_PROGRESS: /* * To pass CS page request to GMM */ SET_STATE(CTRL, CTRL_WAIT_CS_PAGE_RES); ctrl_handle_gmmrr_cs_page_ind( state ); break; default: TRACE_ERROR( "SIG_PG_CTRL_RR_EST_REQ unexpected" ); break; } } /* sig_pg_ctrl_rr_est_req() */ /* +------------------------------------------------------------------------------ | Function : sig_psi_ctrl_si13_processed +------------------------------------------------------------------------------ | Description : Handles the internal signal SIG_PSI_CTRL_SI13_PROCESSED | | Parameters : void | +------------------------------------------------------------------------------ */ GLOBAL void sig_psi_ctrl_si13_processed ( void ) { UBYTE state = GET_STATE( CTRL ); TRACE_ISIG( "sig_psi_ctrl_si13_processed" ); switch( state ) { case CTRL_READY: case CTRL_READY_TO_PROGRESS: case CTRL_ACCESS_DISABLED: case CTRL_CR: case CTRL_CR_IN_SUSP: case CTRL_AUTO_RR_CR: case CTRL_RR_CR_IN_SUSP: case CTRL_RR_NC_CCO: case CTRL_GRR_NC_CCO: if( grr_is_pbcch_present( ) ) { if( state EQ CTRL_READY ) { SET_STATE( CTRL, CTRL_READY_TO_PROGRESS ); } ctrl_stop_rr_task_req( GLBL_PCKT_MODE_IDLE, TASK_STOP_DUMMY_VALUE ); } else { ctrl_send_cell_reselection_req( CR_COMPLETE ); if( state EQ CTRL_READY ) { ctrl_stop_rr_task_req( GLBL_PCKT_MODE_IDLE, TASK_STOP_DUMMY_VALUE ); SET_STATE( CTRL, CTRL_IN_PROGRESS ); } else if( state EQ CTRL_ACCESS_DISABLED OR state EQ CTRL_READY_TO_PROGRESS ) { SET_STATE( CTRL, CTRL_IN_PROGRESS ); } } break; default: TRACE_ERROR( "SIG_PSI_CTRL_SI13_PROCESSED unexpected" ); break; } } /* sig_psi_ctrl_si13_processed() */ /* +------------------------------------------------------------------------------ | Function : sig_psi_ctrl_access_enabled +------------------------------------------------------------------------------ | Description : Handles the internal signal SIG_PSI_CTRL_ACCESS_ENABLED | | Parameters : | +------------------------------------------------------------------------------ */ GLOBAL void sig_psi_ctrl_access_enabled ( void ) { BOOL send_cr_complete = FALSE; UBYTE final = FALSE; TRACE_ISIG( "sig_psi_ctrl_access_enabled" ); switch( GET_STATE( CTRL ) ) { case CTRL_RR_CR_IN_SUSP: /* * enable cell after resume */ SET_STATE(CTRL, CTRL_ACC_ENABLED_SUSP); if(grr_is_pbcch_present()) { /* * to stop CCCH after resume */ grr_data->ctrl.rr_state.monitoring_stopped = FALSE; } ctrl_send_cell_reselection_req( CR_COMPLETE ); sig_ctrl_psi_suspend( ); break; case CTRL_CR: case CTRL_CR_IN_SUSP: case CTRL_READY_TO_PROGRESS: final = TRUE; /*lint -fallthrough*/ case CTRL_RR_NC_CCO: case CTRL_GRR_NC_CCO: case CTRL_AUTO_RR_CR: case CTRL_ACCESS_DISABLED: send_cr_complete = TRUE; if(( GET_STATE( CTRL ) NEQ CTRL_RR_NC_CCO ) AND (GET_STATE( CTRL ) NEQ CTRL_GRR_NC_CCO)) { SET_STATE( CTRL, CTRL_IN_PROGRESS ); } /*lint -fallthrough*/ case CTRL_IN_PROGRESS: ctrl_enable_serving_cell( final ); if( send_cr_complete EQ TRUE ) { ctrl_send_cell_reselection_req( CR_COMPLETE ); } break; default: TRACE_ERROR( "SIG_PSI_CTRL_ACCESS_ENABLED unexpected" ); break; } } /* sig_psi_ctrl_access_enabled() */ /* +------------------------------------------------------------------------------ | Function : sig_psi_ctrl_access_disabled +------------------------------------------------------------------------------ | Description : Handles the internal signal SIG_PSI_CTRL_ACCESS_DISABLED | | Parameters : void | +------------------------------------------------------------------------------ */ GLOBAL void sig_psi_ctrl_access_disabled ( T_PSI_DISABLE_CAUSE dc ) { UBYTE state = GET_STATE( CTRL ); TRACE_ISIG( "sig_psi_ctrl_access_disabled" ); switch( state ) { case CTRL_IN_PROGRESS: SET_STATE(CTRL, CTRL_ACCESS_DISABLED); /*lint -fallthrough*/ case CTRL_RR_NC_CCO: case CTRL_GRR_NC_CCO: switch(dc) { case PSI_DC_PBCCH_RELEASED: TRACE_EVENT( "PBCCH switched off" ); sig_ctrl_cs_reselect( CS_RESELECT_CAUSE_CTRL_SCELL ); break; case PSI_DC_PBCCH_ESTABLISHED: TRACE_EVENT( "PBCCH switched on" ); grr_data->ctrl.psi_tbf_rel_cause = CTRL_PTRC_PBCCH_ESTABLISHED; ctrl_stop_all_activities( CTRL_DC_PSI_MANAGEMENT, NULL ); break; case PSI_DC_READ_PSI: grr_data->ctrl.psi_tbf_rel_cause = CTRL_PTRC_COMPLETE_PSI_READING; ctrl_stop_all_activities( CTRL_DC_PSI_MANAGEMENT, NULL ); break; case PSI_DC_OTHER: grr_data->ctrl.psi_tbf_rel_cause = CTRL_PTRC_COMPLETE_SI_READING; ctrl_stop_all_activities( CTRL_DC_PSI_MANAGEMENT, NULL ); break; default: break; } break; case CTRL_AUTO_RR_CR: case CTRL_RR_CR_IN_SUSP: /* * RR has to continue 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; default: TRACE_ERROR( "SIG_PSI_CTRL_ACCESS_DISABLED unexpected" ); break; } } /* sig_psi_ctrl_access_disabled() */ /* +------------------------------------------------------------------------------ | Function : sig_psi_ctrl_psi1or_psi13_receiption_failure +------------------------------------------------------------------------------ | Description : Handles the internal signal | SIG_PSI_CTRL_PSI1OR_PSI13_RECEIPTION_FAILURE | | Parameters : void | +------------------------------------------------------------------------------ */ GLOBAL void sig_psi_ctrl_psi1or_psi13_receiption_failure ( void ) { TRACE_ISIG( "sig_psi_ctrl_psi1or_psi13_receiption_failure" ); ctrl_failure_processing( FAIL_SIG_PSI1OR_PSI13_RECEIPTION_FAILURE ); } /* sig_psi_ctrl_psi1or_psi13_receiption_failure() */ /* +------------------------------------------------------------------------------ | Function : sig_psi_ctrl_read_si +------------------------------------------------------------------------------ | Description : Handles the internal signal SIG_PSI_CTRL_READ_SI: it sends a | request to RR to read some special SI message. This signal is used | in case of acquisition | | Parameters : void | +------------------------------------------------------------------------------ */ GLOBAL void sig_psi_ctrl_read_si ( UBYTE si_to_read ) { TRACE_ISIG( "sig_psi_ctrl_read_si" ); switch( GET_STATE( CTRL ) ) { case CTRL_ACCESS_DISABLED: case CTRL_READY_TO_PROGRESS: case CTRL_IN_PROGRESS: ctrl_start_monitoring_bcch( si_to_read ); break; default: TRACE_ERROR( "SIG_PSI_CTRL_READ_SI unexpected" ); break; } } /* sig_psi_ctrl_read_si() */ /* +------------------------------------------------------------------------------ | Function : sig_meas_ctrl_meas_report +------------------------------------------------------------------------------ | Description : Handles the internal signal SIG_MEAS_CTRL_MEAS_REPORT | | Parameters : T_U_MEAS_REPORT *meas_report | +------------------------------------------------------------------------------ */ GLOBAL void sig_meas_ctrl_meas_report ( T_U_MEAS_REPORT *meas_report) { TRACE_ISIG( "sig_meas_ctrl_meas_report" ); switch( GET_STATE( CTRL ) ) { case CTRL_IN_PROGRESS: ctrl_send_control_block( CGRLC_BLK_OWNER_MEAS, (void*)meas_report ); break; default: sig_ctrl_meas_pmr_reject( ); TRACE_ERROR( "SIG_MEAS_CTRL_MEAS_REPORT unexpected" ); break; } } /* sig_meas_ctrl_meas_report() */ /* +------------------------------------------------------------------------------ | Function : sig_cs_ctrl_meas_report +------------------------------------------------------------------------------ | Description : Handles the internal signal SIG_CS_CTRL_MEAS_REPORT | | Parameters : T_U_MEAS_REPORT *meas_report | +------------------------------------------------------------------------------ */ GLOBAL void sig_cs_ctrl_meas_report ( T_U_MEAS_REPORT *meas_report) { TRACE_ISIG( "sig_cs_ctrl_meas_report" ); switch( GET_STATE( CTRL ) ) { case CTRL_IN_PROGRESS: case CTRL_GRR_NC_CCO: ctrl_send_control_block( CGRLC_BLK_OWNER_CS, (void*)meas_report ); break; default: sig_ctrl_cs_pmr_reject( ); TRACE_ERROR( "SIG_CS_CTRL_MEAS_REPORT unexpected" ); break; } } /* sig_cs_ctrl_meas_report() */ /* +------------------------------------------------------------------------------ | Function : sig_cs_ctrl_cancel_meas_report +------------------------------------------------------------------------------ | Description : Handles the internal signal SIG_CS_CTRL_CANCEL_MEAS_REPORT | | Parameters : void | +------------------------------------------------------------------------------ */ GLOBAL void sig_cs_ctrl_cancel_meas_report ( void ) { TRACE_ISIG( "sig_cs_ctrl_cancel_meas_report" ); ctrl_cancel_control_block( CGRLC_BLK_OWNER_CS ); } /* sig_cs_ctrl_cancel_meas_report() */ /* +------------------------------------------------------------------------------ | Function : sig_psi_ctrl_access_barred +------------------------------------------------------------------------------ | Description : Handles the internal signal SIG_PSI_CTRL_ACCESS_BARRED | | Parameters : void | +------------------------------------------------------------------------------ */ GLOBAL void sig_psi_ctrl_access_barred ( void ) { TRACE_ISIG( "sig_psi_ctrl_access_barred" ); ctrl_failure_processing( FAIL_SIG_CTRL_ACCESS_BARRED ); }/* sig_psi_ctrl_access_barred*/ /* +------------------------------------------------------------------------------ | Function : sig_pg_ctrl_stop_mon_ccch +------------------------------------------------------------------------------ | Description : Handles the internal signal SIG_PG_CTRL_STOP_MON_CCCH: it stops the | CCCH monitoring process in RR | | Parameters : void | +------------------------------------------------------------------------------ */ GLOBAL void sig_pg_ctrl_stop_mon_ccch(void) { TRACE_ISIG( "sig_pg_ctrl_stop_mon_ccch" ); switch( GET_STATE( CTRL ) ) { case CTRL_IN_PROGRESS: case CTRL_GRR_NC_CCO: ctrl_stop_monitoring_ccch(); break; default: TRACE_ERROR( "SIG_PG_CTRL_STOP_MON_CCCH unexpected" ); break; } }/* sig_pg_ctrl_stop_mon_ccch*/ /* +------------------------------------------------------------------------------ | Function : sig_pg_ctrl_start_mon_ccch +------------------------------------------------------------------------------ | Description : Handles the internal signal SIG_PG_CTRL_START_MON_CCCH: it starts the | CCCH monitoring process in RR | | Parameters : void | +------------------------------------------------------------------------------ */ GLOBAL void sig_pg_ctrl_start_mon_ccch(UBYTE pg_type) { TRACE_ISIG( "sig_pg_ctrl_start_mon_ccch" ); switch( GET_STATE( CTRL ) ) { case CTRL_IN_PROGRESS: case CTRL_GRR_NC_CCO: switch(pg_type) { case PAG_MODE_PTM_NP: case PAG_MODE_PIM_NP: /* * use PTM_NP or PIM_NP */ ctrl_start_monitoring_ccch(pg_type); break; default: if(grr_is_non_drx_period()) { /* * RR continue with paging reorg */ ctrl_start_monitoring_ccch(PAG_MODE_REORG); } else { /* * RR continue with default paging */ ctrl_start_monitoring_ccch(pg_type); } break; } break; default: TRACE_ERROR( "SIG_PG_CTRL_START_MON_CCCH unexpected" ); break; } }/* sig_pg_ctrl_start_mon_ccch*/ /* +------------------------------------------------------------------------------ | Function : sig_tc_ctrl_suspend_cnf +------------------------------------------------------------------------------ | Description : Handles the internal signal SIG_TC_CTRL_SUSPEND_CNF: | GRR is suspended | Parameters : void | +------------------------------------------------------------------------------ */ GLOBAL void sig_tc_ctrl_suspend_cnf(void) { TRACE_ISIG( "sig_tc_ctrl_suspend_cnf" ); switch( GET_STATE( CTRL ) ) { case CTRL_WAIT_FOR_CNF_OF_SUSPENSION: SET_STATE(CTRL, CTRL_SUSPENDED); ctrl_stop_rr_task_req( GLBL_PCKT_MODE_SUSP, TASK_STOP_DUMMY_VALUE ); psc_db->is_access_enabled = FALSE; /* at this point , we do not have any GPRS access*/ switch(grr_data->ctrl.after_suspension) { case ACTIVATE_RR: { /* activate RR. We have to check whether we have non-GPRS access parameters or not. * Non-GPRS parameters are present in case of PCCCH presence * GRR has to inform RR whether it should send GPRS Suspension request or not */ PALLOC(rrgrr_activate_req, RRGRR_ACTIVATE_REQ); /* Suspension needed*/ rrgrr_activate_req->susp_req = grr_data->ctrl.is_susp_needed; if(grr_is_pbcch_present() AND (psc_db->v_non_gprs_opt EQ TRUE)) { /* There is valid non-GPRS parameters present in the database, so we have to send * it to RR to allow a fast access to the network */ rrgrr_activate_req->non_gprs.v_non_gprs = TRUE; ctrl_copy_non_gprs_opt(&rrgrr_activate_req->non_gprs); } else rrgrr_activate_req->non_gprs.v_non_gprs = FALSE; /* * SZML-CTRL/004 */ rrgrr_activate_req->rac = psc_db->cell_info_for_gmm.cell_info.cell_env.rai.rac; PSEND(hCommRR, rrgrr_activate_req); } ctrl_send_gmmrr_suspend_cnf( ); break; case SEND_RR_EST_REQ: /* */ ctrl_send_rr_est_req(grr_data->ctrl.is_susp_needed); break; case SEND_RR_EST_RSP: ctrl_send_rr_est_rsp(grr_data->ctrl.is_susp_needed, TRUE /* CS_PAGE was accepted*/); break; } break; default: TRACE_ERROR( "SIG_TC_CTRL_SUSPEND_CNF unexpected" ); break; } }/* sig_tc_ctrl_suspend_cnf*/ /* +------------------------------------------------------------------------------ | Function : sig_tc_ctrl_dcch_data_req +------------------------------------------------------------------------------ | Description : Handles the internal signal SIG_TC_CTRL_DCCH_DATA_REQ | | Parameters : rrgrr_data_req-pointer to primitive which includes the data | +------------------------------------------------------------------------------ */ GLOBAL void sig_tc_ctrl_dcch_data_req(T_RRGRR_DATA_REQ * rrgrr_data_req_i ) { TRACE_ISIG( "sig_tc_ctrl_dcch_data_req" ); switch( GET_STATE( CTRL ) ) { case CTRL_IN_PROGRESS: { PSEND(hCommRR,rrgrr_data_req_i); } break; default: TRACE_ERROR( "sig_tc_ctrl_dcch_data_req unexpected" ); break; } }/* sig_tc_ctrl_dcch_data_req */ /* +------------------------------------------------------------------------------ | Function : sig_ctrl_tc_gprs_data_req +------------------------------------------------------------------------------ | Description : Handles the internal signal SIG_CTRL_TC_GPRS_DATA_REQ | | Parameters : rrgrr_gprs_data_req-pointer to primitive which includes the data | +------------------------------------------------------------------------------ */ GLOBAL void sig_tc_ctrl_gprs_data_req(T_RRGRR_GPRS_DATA_REQ *rrgrr_gprs_data_req_i) { TRACE_ISIG( "sig_tc_ctrl_gprs_data_req" ); switch( GET_STATE( CTRL ) ) { case CTRL_IN_PROGRESS: case CTRL_GRR_NC_CCO: { PSEND(hCommRR,rrgrr_gprs_data_req_i); } break; default: TRACE_ERROR( "sig_tc_ctrl_gprs_data_req unexpected" ); break; } }/* sig_tc_ctrl_gprs_data_req*/ /* +------------------------------------------------------------------------------ | Function : sig_tc_ctrl_suspend_dedi_chan +------------------------------------------------------------------------------ | Description : Handles the internal signal SIG_TC_CTRL_SUSPEND_DEDICATED_CHANNEL | | Parameters : void | +------------------------------------------------------------------------------ */ GLOBAL void sig_tc_ctrl_suspend_dedi_chan(void) { TRACE_ISIG( "sig_tc_ctrl_suspend_dedi_chan" ); switch( GET_STATE( CTRL ) ) { case CTRL_IN_PROGRESS: { PALLOC(rrgrr_suspend_dcch_req, RRGRR_SUSPEND_DCCH_REQ); PSEND(hCommRR, rrgrr_suspend_dcch_req); } break; default: TRACE_ERROR( "SIG_TC_CTRL_SUSPEND_DEDICATED_CHANNEL unexpected" ); break; } }/* sig_tc_ctrl_suspend_dedi_chan*/ /* +------------------------------------------------------------------------------ | Function : sig_tc_ctrl_resume_dedi_chan +------------------------------------------------------------------------------ | Description : Handles the internal signal SIG_TC_CTRL_RESUME_DEDICATED_CHANNEL | | Parameters : void | +------------------------------------------------------------------------------ */ GLOBAL void sig_tc_ctrl_resume_dedi_chan(void) { TRACE_ISIG( "sig_tc_ctrl_resume_dedi_chan" ); switch( GET_STATE( CTRL ) ) { case CTRL_IN_PROGRESS: ctrl_reinstall_old_scell_req( FALSE, RECONN_PROT_UNSPECIFIED ); break; default: TRACE_ERROR( "SIG_TC_CTRL_RESUME_DEDICATED_CHANNEL unexpected" ); break; } }/* sig_tc_ctrl_resume_dedi_chan*/ /* +------------------------------------------------------------------------------ | Function : sig_tc_ctrl_contention_ok +------------------------------------------------------------------------------ | Description : Cell change ok | | Parameters : void | +------------------------------------------------------------------------------ */ GLOBAL void sig_tc_ctrl_contention_ok(void) { TRACE_ISIG( "sig_tc_ctrl_contention_ok" ); switch( GET_STATE( CTRL ) ) { case CTRL_GRR_NC_CCO: case CTRL_IN_PROGRESS: if( grr_data->cc_running ) { vsi_t_stop( GRR_handle, T3134 ); grr_data->cc_running = FALSE; ctrl_install_new_scell( ); { PALLOC( rrgrr_resumed_tbf_req, RRGRR_RESUMED_TBF_REQ ); PSEND( hCommRR, rrgrr_resumed_tbf_req ); } } if( grr_t_status( T3174 ) > 0 ) { SET_STATE( CTRL, CTRL_IN_PROGRESS ); ctrl_stop_T3174( ); ctrl_install_new_scell( ); #if defined (REL99) AND defined (TI_PS_FF_EMR) grr_init_nc_list(&pcr_db->nc_cw.list ); grr_init_ba_bcch_nc_list(pcr_db); #endif } break; default: TRACE_ERROR( "sig_tc_ctrl_contention_ok unexpected" ); break; } }/* sig_tc_ctrl_contention_ok()*/ /* +------------------------------------------------------------------------------ | Function : sig_tc_ctrl_contention_failure +------------------------------------------------------------------------------ | Description : Cell reselection has failled because of different | of contention resolution sending by the MS in RLC and received uplink assigment | | Parameters : void | +------------------------------------------------------------------------------ */ GLOBAL void sig_tc_ctrl_contention_failure() { TRACE_ISIG( "sig_tc_ctrl_contention_failure" ); switch( GET_STATE( CTRL ) ) { case CTRL_GRR_NC_CCO: ctrl_stop_T3174(); TRACE_EVENT("ctrl_cell_change_order:No response on target cell"); grr_data->pcco_failure_cause = 1; ctrl_pcco_failure(); break; default: TRACE_ERROR( "sig_tc_contention_failure unexpected" ); break; } } /*sig_tc_ctrl_contention_failure*/ /* +------------------------------------------------------------------------------ | Function : sig_tc_ctrl_access_reject_on_new_cell +------------------------------------------------------------------------------ | Description : Handles the internal signal ACCESS_REJECT_ON_NEW_CELL | | Parameters : void | +------------------------------------------------------------------------------ */ GLOBAL void sig_tc_ctrl_access_reject_on_new_cell(void) { TRACE_ISIG( "sig_tc_ctrl_access_reject_on_new_cell" ); ctrl_stop_T3174(); ctrl_pcco_failure(); } /*sig_tc_ctrl_access_reject_on_new_cell*/ /* +------------------------------------------------------------------------------ | Function : sig_cs_ctrl_new_candidate +------------------------------------------------------------------------------ | Description : Handles the internal signal SIG_CS_CTRL_NEW_CANDIDATE | This signal indicates that the CS service has detected | a new cell candidate for a cell reselection | | Parameters : | +------------------------------------------------------------------------------ */ GLOBAL void sig_cs_ctrl_new_candidate( T_CS_RESELECT_CAUSE reselect_cause ) { TRACE_ISIG( "sig_cs_ctrl_new_candidate" ); switch( GET_STATE( CTRL ) ) { case CTRL_READY: case CTRL_ACCESS_DISABLED: case CTRL_READY_TO_PROGRESS: case CTRL_IN_PROGRESS: { SET_STATE( CTRL, CTRL_CR ); if( reselect_cause EQ CS_RESELECT_CAUSE_CTRL_ABNORMAL ) { ctrl_stop_all_activities( CTRL_DC_CR_MS_GRR_ABNORMAL, NULL ); } else { ctrl_stop_all_activities( CTRL_DC_CR_MS_GRR_NORMAL, NULL ); } } break; case CTRL_CR_IN_SUSP: case CTRL_FAILED_CR_IN_SUSP: ctrl_stop_all_activities( CTRL_DC_OTHER, NULL ); /*lint -fallthrough*/ case CTRL_CR: case CTRL_FAILED_CR: case CTRL_GRR_NC_CCO: ctrl_handle_new_candidate( FALSE ); break; default: TRACE_ERROR( "SIG_CS_CTRL_NEW_CANDIDATE unexpected" ); break; } }/* sig_cs_ctrl_new_candidate*/ /* +------------------------------------------------------------------------------ | Function : sig_psi_ctrl_ncell_param_valid +------------------------------------------------------------------------------ | Description : Handles the internal signal SIG_PSI_CTRL_NCELL_PARAM_VALID | | Parameters : | +------------------------------------------------------------------------------ */ GLOBAL void sig_psi_ctrl_ncell_param_valid ( void ) { TRACE_ISIG( "sig_psi_ctrl_ncell_param_valid" ); switch( GET_STATE( CTRL ) ) { case CTRL_IN_PROGRESS: #if defined (REL99) AND defined (TI_PS_FF_EMR) psc_db->nc_ms.ncmeas.list.number=0; psc_db->nc_ms.rfreq.number = 0; /*This is called to reset the only Freq List from PMO as BA(GPRS) is changed. Spec 5.08 - sec 10.1.4.1 The list is valid until an empty list is sent to the MS, there is a downlink signalling failure or the MS selects a new cell or the BA(GPRS) that is modified by the NC_FREQUENCY_LIST changes or the MS enters dedicated mode The individual parameters are valid until the RESET command is sent to the MS or there is a downlink signalling failure or the MS goes to the Standby state or the MS enters dedicated mode*/ /*NO BREAK */ #endif /*lint -fallthrough*/ case CTRL_GRR_NC_CCO: if( grr_data->is_pg_started ) { sig_ctrl_cs_start(); } break; default: /* ignore */ break; } } /* sig_psi_ctrl_ncell_param_valid() */ /* +------------------------------------------------------------------------------ | Function : sig_psi_ctrl_ncell_param_invalid +------------------------------------------------------------------------------ | Description : Handles the internal signal SIG_PSI_CTRL_NCELL_PARAM_INVALID | | Parameters : | +------------------------------------------------------------------------------ */ GLOBAL void sig_psi_ctrl_ncell_param_invalid ( void ) { TRACE_ISIG( "sig_psi_ctrl_ncell_param_invalid" ); switch( GET_STATE( CTRL ) ) { case CTRL_IN_PROGRESS: case CTRL_GRR_NC_CCO: sig_ctrl_cs_stop(CS_DC_OTHER); break; default: /*ignore*/ break; } } /* sig_psi_ctrl_ncell_param_invalid() */ /* +------------------------------------------------------------------------------ | Function : sig_psi_ctrl_access_changed +------------------------------------------------------------------------------ | Description : Handles the internal signal SIG_PSI_CTRL_ACCESS_CHANGED | | Parameters : | +------------------------------------------------------------------------------ */ GLOBAL void sig_psi_ctrl_access_changed ( void ) { TRACE_ISIG( "sig_psi_ctrl_access_changed" ); switch( GET_STATE( CTRL ) ) { case CTRL_IN_PROGRESS: ctrl_send_cell_ind(); break; default: TRACE_ERROR( "SIG_PSI_CTRL_ACCESS_CHANGED unexpected" ); break; } } /* sig_psi_ctrl_access_changed() */ /* +------------------------------------------------------------------------------ | Function : sig_psi_ctrl_ncell_psi_read +------------------------------------------------------------------------------ | Description : Handles the internal signal SIG_PSI_CTRL_NCELL_PSI_READ | | | Parameters : BOOL read_successfully | +------------------------------------------------------------------------------ */ GLOBAL void sig_psi_ctrl_ncell_psi_read( BOOL read_successfully) { TRACE_ISIG( "sig_psi_ctrl_ncell_psi_read" ); switch( GET_STATE( CTRL ) ) { case CTRL_CR: case CTRL_CR_IN_SUSP: if(read_successfully) { /* * Inform RR and wait for positive indication of the cell reselection request */ ctrl_send_cell_reselection_req( CR_COMPLETE ); } else { ctrl_cc_rejected( ); } break; default: TRACE_ERROR( "SIG_PSI_CTRL_NCELL_PSI_READ unexpected" ); break; } }/* sig_psi_ctrl_ncell_psi_read*/ /* +------------------------------------------------------------------------------ | Function : sig_psi_ctrl_int_list_invalid +------------------------------------------------------------------------------ | Description : Handles the internal signal SIG_PSI_CTRL_INT_LIST_INVALID | | | Parameters : void | +------------------------------------------------------------------------------ */ GLOBAL void sig_psi_ctrl_int_list_invalid(void) { TRACE_ISIG( "sig_psi_ctrl_int_list_invalid" ); switch( GET_STATE( CTRL ) ) { case CTRL_IN_PROGRESS: sig_ctrl_meas_int_list_invalid(); break; default: /*ignore*/ break; } }/* sig_psi_ctrl_int_list_invalid*/ /* +------------------------------------------------------------------------------ | Function : sig_psi_ctrl_int_list_valid +------------------------------------------------------------------------------ | Description : Handles the internal signal SIG_PSI_CTRL_INT_LIST_VALID | | | Parameters : void | +------------------------------------------------------------------------------ */ GLOBAL void sig_psi_ctrl_int_list_valid(void) { TRACE_ISIG( "sig_psi_ctrl_int_list_valid" ); switch( GET_STATE( CTRL ) ) { case CTRL_IN_PROGRESS: if(grr_data->is_pg_started) sig_ctrl_meas_int_list_valid(); break; default: /*ignore*/ break; } }/* sig_psi_ctrl_int_list_valid*/ /* +------------------------------------------------------------------------------ | Function : sig_psi_ctrl_meas_param_invalid_psi5 +------------------------------------------------------------------------------ | Description : Handles the internal signal SIG_PSI_CTRL_MEAS_PARAM_INVALID_PSI5 | | | Parameters : void | +------------------------------------------------------------------------------ */ GLOBAL void sig_psi_ctrl_meas_param_invalid_psi5(void) { TRACE_ISIG( "sig_psi_ctrl_meas_param_invalid_psi5" ); switch( GET_STATE( CTRL ) ) { case CTRL_IN_PROGRESS: sig_ctrl_meas_ext_invalid_psi5(); sig_ctrl_cs_nc_param_invalid(); break; default: /*ignore*/ break; } }/* sig_psi_ctrl_meas_param_invalid_psi5*/ /* +------------------------------------------------------------------------------ | Function : sig_psi_ctrl_meas_param_valid_psi5 +------------------------------------------------------------------------------ | Description : Handles the internal signal SIG_PSI_CTRL_MEAS_PARAM_VALID_PSI5 | | | Parameters : void | +------------------------------------------------------------------------------ */ GLOBAL void sig_psi_ctrl_meas_param_valid_psi5(void) { TRACE_ISIG( "sig_psi_ctrl_meas_param_valid_psi5" ); switch( GET_STATE( CTRL ) ) { case CTRL_IN_PROGRESS: if(grr_data->is_pg_started) { sig_ctrl_meas_ext_valid_psi5(); sig_ctrl_cs_nc_param_valid(); } break; default: /*ignore*/ break; } }/* sig_psi_ctrl_meas_param_valid_psi5*/ /* +------------------------------------------------------------------------------ | Function : sig_psi_ctrl_meas_param_invalid_si13 +------------------------------------------------------------------------------ | Description : Handles the internal signal SIG_PSI_CTRL_MEAS_PARAM_INVALID_SI13 | | Parameters : void | +------------------------------------------------------------------------------ */ GLOBAL void sig_psi_ctrl_meas_param_invalid_si13( void ) { TRACE_ISIG( "sig_psi_ctrl_meas_param_invalid_si13" ); switch( GET_STATE( CTRL ) ) { case CTRL_IN_PROGRESS: sig_ctrl_cs_nc_param_invalid( ); break; default: /* do nothing */ break; } }/* sig_psi_ctrl_meas_param_invalid_si13 */ /* +------------------------------------------------------------------------------ | Function : sig_psi_ctrl_meas_param_valid_si13 +------------------------------------------------------------------------------ | Description : Handles the internal signal SIG_PSI_CTRL_MEAS_PARAM_VALID_SI13 | | Parameters : void | +------------------------------------------------------------------------------ */ GLOBAL void sig_psi_ctrl_meas_param_valid_si13( BOOL ba_bcch_changed ) { TRACE_ISIG( "sig_psi_ctrl_meas_param_valid_si13" ); switch( GET_STATE( CTRL ) ) { case CTRL_IN_PROGRESS: sig_ctrl_cs_nc_param_valid( ); sig_ctrl_tc_enable_grlc (CGRLC_QUEUE_MODE_DEFAULT, CGRLC_RA_DEFAULT ); if( ba_bcch_changed EQ TRUE ) { sig_ctrl_meas_ba_changed( ); sig_ctrl_cs_ba_changed( ); } break; default: /* do nothing */ break; } }/* sig_psi_ctrl_meas_param_valid_si13 */ /* +------------------------------------------------------------------------------ | Function : sig_psi_ctrl_new_pccch +------------------------------------------------------------------------------ | Description : Handles the internal signal SIG_PSI_CTRL_NEW_PCCCH | | | Parameters : void | +------------------------------------------------------------------------------ */ GLOBAL void sig_psi_ctrl_new_pccch(void) { TRACE_ISIG( "sig_psi_ctrl_new_pccch" ); switch( GET_STATE( CTRL ) ) { case CTRL_IN_PROGRESS: if(grr_data->is_pg_started) { TRACE_EVENT("Restart PCCCH: Config may have changed"); sig_ctrl_pg_start(); } break; default: TRACE_EVENT_P1( "NEW_PCCCH not handled in CTRL state: %d", grr_data->ctrl.state); break; } }/* sig_psi_ctrl_new_pccch*/ #ifdef REL99 /* +------------------------------------------------------------------------------ | Function : sig_psi_ctrl_cbch_info_ind +------------------------------------------------------------------------------ | Description : This function gives the RRGRR_CBCH_INFO ind to RR. | This would be called on success cell selection/reselection | or when PSIs are completely acquired or when there is change | in PSI2,PSI13 or PSI8 messages. | This primitive is sent to RR only when the mobile is in R99 | network. | The CBCH channel description present in this primitive is in | a form which could be used by MPH_* primitives in RR. | The frequency list is NOT in TI L1 form. When RR passes this | information to ALR, it is converted to TI L1 FORMAT. | Parameters : None. | +------------------------------------------------------------------------------ */ GLOBAL void sig_psi_ctrl_cbch_info_ind() { T_cbch *cbch_req = NULL; PALLOC(rrgrr_cbch_info_ind, RRGRR_CBCH_INFO_IND); TRACE_ISIG( "sig_psi_ctrl_cbch_info_ind" ); cbch_req = &(rrgrr_cbch_info_ind->cbch); memset (cbch_req, 0, sizeof (T_cbch)); /* fill in cbch info from psc_db */ if(psc_db->v_cbch_chan_desc) { cbch_req->stat = STAT_ACT; cbch_req->ch = psc_db->cbch_chan_desc.chan_typ_tdma_offset; cbch_req->tn = psc_db->cbch_chan_desc.tn; cbch_req->tsc = psc_db->cbch_chan_desc.freq_par.tsc; /* If frequency encoding has indirect encoding/direct encoding 1 * /direct encoding 2, then hopping is used. Otherwise channel * description describes a non-hopping channel. * When none of the above three coding methods are used, arfcn choice * should be set to true.Ref 3GPP 04.60 Section 12.8 */ cbch_req->h = (psc_db->cbch_chan_desc.freq_par.v_arfcn)?H_NO:H_FREQ; if(cbch_req->h) { /* * CBCH uses frequency hopping, then configure MAIO and HSN * and create a frequency hopping list from the cell allocation/ * PSI13/direct encoding 2 scheme and the mobile allocation * stored in Frequency Parameters. */ /* When hopping is allowed - hsn,maio and ma have to be filled. */ ctrl_fill_cbch_hopping_params(cbch_req,&psc_db->cbch_chan_desc.freq_par); } else { /* non hopping channel */ cbch_req->arfcn = psc_db->cbch_chan_desc.freq_par.arfcn; } } else { cbch_req->stat = STAT_INACT; } PSEND(hCommRR,rrgrr_cbch_info_ind); } /* sig_psi_ctrl_cbch_info_ind */ #endif /* +------------------------------------------------------------------------------ | Function : sig_cs_ctrl_no_more_candidate +------------------------------------------------------------------------------ | Description : Handles the internal signal SIG_CS_CTRL_NO_MORE_CANDIDATE | This signal indicates that the RR has to start a complete cell | selection procedure | | Parameters : void | +------------------------------------------------------------------------------ */ GLOBAL void sig_cs_ctrl_no_more_candidate( T_CS_RESELECT_CAUSE reselect_cause ) { UBYTE state = GET_STATE( CTRL ); TRACE_ISIG( "sig_cs_ctrl_no_more_candidate" ); switch( state ) { case CTRL_IN_PROGRESS: if( reselect_cause EQ CS_RESELECT_CAUSE_CTRL_ABNORMAL ) { ctrl_tc_access_enable( sig_ctrl_tc_abnorm_rel_with_cr_failed ); } else { SET_STATE( CTRL, CTRL_READY ); ctrl_stop_all_activities( CTRL_DC_CR_MS_GRR_NORMAL, NULL ); } break; case CTRL_CR: case CTRL_FAILED_CR: case CTRL_CR_IN_SUSP: case CTRL_FAILED_CR_IN_SUSP: switch( reselect_cause ) { case CS_RESELECT_CAUSE_CTRL_ABNORMAL: SET_STATE( CTRL, CTRL_IN_PROGRESS ); grr_set_db_ptr( DB_MODE_CC_REJ ); ctrl_tc_access_enable( sig_ctrl_tc_abnorm_rel_with_cr_failed ); sig_ctrl_psi_resumpt( ); ctrl_enable_serving_cell( FALSE ); break; default: SET_STATE( CTRL, CTRL_READY ); ctrl_stop_all_activities( CTRL_DC_CR_MS_GRR_NORMAL, NULL ); break; } break; case CTRL_ACCESS_DISABLED: case CTRL_READY_TO_PROGRESS: { T_CTRL_CR_TYPE ctrl_cr_type; ctrl_cr_type = ( reselect_cause EQ CS_RESELECT_CAUSE_CS_NORMAL ? CTRL_CR_TYPE_CS : CTRL_CR_TYPE_CONT ); ctrl_stop_all_activities( CTRL_DC_CR_MS_GRR_NORMAL, NULL ); ctrl_handle_no_more_candidate( ctrl_cr_type, FALSE ); } break; case CTRL_READY: case CTRL_AUTO_RR_CR: case CTRL_RR_CR_IN_SUSP: ctrl_send_cell_reselection_req( CR_CONT ); break; default: TRACE_ERROR( "SIG_CS_CTRL_NO_MORE_CANDIDATE unexpected 2" ); break; } }/* sig_cs_ctrl_no_more_candidate*/ /* +------------------------------------------------------------------------------ | Function : sig_tc_ctrl_cr_started_rsp +------------------------------------------------------------------------------ | Description : Handles the internal signal SIG_TC_CTRL_CR_STARTED_RSP | This signal indicates that the service TC is ready for | cell reselection, e.g. it stopped running procedures, controlled | the flow control etc. | Parameters : void | +------------------------------------------------------------------------------ */ GLOBAL void sig_tc_ctrl_cr_started_rsp( void ) { T_NC_MVAL *nc_mval; TRACE_ISIG( "sig_tc_ctrl_cr_started_rsp" ); switch( GET_STATE( CTRL ) ) { case CTRL_WAIT_RSP_4_RR_CR: SET_STATE(CTRL, CTRL_AUTO_RR_CR); /* * Init PSI and psc_db parameters to be able to read/process new SI (PSI) */ grr_prepare_db_for_new_cell(); ctrl_send_cell_reselection_req( CR_COMPLETE ); break; case CTRL_GRR_NC_CCO: if(grr_t_status( T3176 ) > 0 ) { ctrl_start_cell_reselection( CTRL_CR_TYPE_NEW, TRUE ); } else { TRACE_ASSERT( grr_data->db.cr_cell NEQ NULL ); nc_mval = &grr_data->db.nc_mval_list.nc_mval[grr_data->db.cr_cell->idx]; switch( nc_mval->sync_info.sync.status ) { case( STAT_SYNC_OK ): ctrl_start_cell_reselection( CTRL_CR_TYPE_NEW, TRUE ); TRACE_EVENT( "sig_tc_ctrl_cr_started_rsp: cell already known(sync ok!)" ); break; case( STAT_SYNC_NONE ): ctrl_start_cell_reselection( CTRL_CR_TYPE_NEW_NOT_SYNCED, TRUE ); break; case( STAT_SYNC_FAILED ): default: /* stay in the serving cell */ break; } } break; case CTRL_CR: case CTRL_CR_IN_SUSP: ctrl_handle_new_candidate( TRUE ); break; case CTRL_READY: ctrl_handle_no_more_candidate( CTRL_CR_TYPE_CS, TRUE ); break; case CTRL_RR_CR_IN_SUSP: ctrl_send_cell_reselection_req( CR_COMPLETE ); break; default: sig_tc_ctrl_tbf_release_cnf( ); break; } }/* sig_tc_ctrl_cr_started_rsp*/ /* +------------------------------------------------------------------------------ | Function : sig_tc_ctrl_tbf_release_cnf +------------------------------------------------------------------------------ | Description : | | Parameters : | +------------------------------------------------------------------------------ */ GLOBAL void sig_tc_ctrl_tbf_release_cnf ( void ) { TRACE_ISIG( "sig_tc_ctrl_tbf_release_cnf" ); switch( GET_STATE( CTRL ) ) { case CTRL_ACCESS_DISABLED: case CTRL_READY_TO_PROGRESS: switch( grr_data->ctrl.psi_tbf_rel_cause ) { case CTRL_PTRC_PBCCH_ESTABLISHED: ctrl_start_monitoring_ccch( PAG_MODE_DEFAULT ); ctrl_start_monitoring_bcch( UPDATE_SI13 ); 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 CTRL_PTRC_COMPLETE_SI_READING: ctrl_start_monitoring_ccch( PAG_MODE_DEFAULT ); ctrl_start_monitoring_bcch( COMPLETE_SI ); sig_ctrl_psi_access_disabled( PSI_DC_OTHER ); break; case CTRL_PTRC_COMPLETE_PSI_READING: sig_ctrl_psi_access_disabled( PSI_DC_READ_PSI ); break; } grr_data->ctrl.psi_tbf_rel_cause = CTRL_PTRC_NONE; break; default: TRACE_ERROR( "SIG_TC_CTRL_TBF_RELEASE_CNF unexpected" ); break; } }/* sig_tc_ctrl_tbf_release_cnf */ /* +------------------------------------------------------------------------------ | Function : sig_tc_ctrl_rel_state +------------------------------------------------------------------------------ | Description : Handles the internal signal SIG_TC_CTRL_REL_STATE | This signal indicates that the service TC started or performed | tbf release | Parameters : T_RELEASE_STATE rel_state | +------------------------------------------------------------------------------ */ GLOBAL void sig_tc_ctrl_rel_state(T_RELEASE_STATE rel_state) { TRACE_ISIG( "sig_tc_ctrl_rel_state" ); sig_ctrl_psi_rel_state(rel_state); }/* sig_tc_ctrl_rel_state*/ /* +------------------------------------------------------------------------------ | Function : sig_tc_ctrl_control_block_result +------------------------------------------------------------------------------ | Description : | | Parameters : | +------------------------------------------------------------------------------ */ GLOBAL void sig_tc_ctrl_control_block_result ( T_BLK_OWNER blk_owner, BOOL is_success ) { TRACE_ISIG( "sig_tc_ctrl_control_block_result" ); ctrl_send_control_block_result( blk_owner, is_success ); }/* sig_tc_ctrl_control_block_result */ /* +------------------------------------------------------------------------------ | Function : sig_tc_ctrl_send_stop_task_req +------------------------------------------------------------------------------ | Description : Handles the internal signal SIG_TC_CTRL_STOP_TASK_REQ | | Parameters : | +------------------------------------------------------------------------------ */ GLOBAL void sig_tc_ctrl_send_stop_task_req( UBYTE v_stop_ccch ) { TRACE_ISIG( "sig_tc_ctrl_send_stop_task_req" ); switch( GET_STATE( CTRL ) ) { case CTRL_IN_PROGRESS: case CTRL_GRR_NC_CCO: ctrl_send_rrgrr_stop_task_req( CTRL_TASK_BCCH, v_stop_ccch ); break; default: sig_ctrl_tc_stop_task_cnf_received( ); TRACE_ERROR( "SIG_TC_CTRL_STOP_TASK_REQ unexpected" ); break; } }/* sig_tc_ctrl_send_stop_task_req */ /* +------------------------------------------------------------------------------ | Function : sig_gfp_ctrl_cc_order +------------------------------------------------------------------------------ | Description : Handles the signal SIG_GFP_CTRL_CC_ORDER | | Parameters : - | +------------------------------------------------------------------------------ */ #ifdef REL99 GLOBAL void sig_gfp_ctrl_cc_order(T_TIME time_to_poll ) #else GLOBAL void sig_gfp_ctrl_cc_order( void ) #endif { MCAST( d_cell_chan_order, D_CELL_CHAN_ORDER ); TRACE_ISIG( "sig_gfp_ctrl_cc_order" ); switch( GET_STATE( CTRL ) ) { case CTRL_IN_PROGRESS: if (grr_data->nc2_on) { #ifdef REL99 if(time_to_poll > 0) { vsi_t_start(GRR_handle, T_POLL_TIMER,time_to_poll); memcpy(&grr_data->ctrl.pcco, d_cell_chan_order, sizeof(T_D_CELL_CHAN_ORDER)); grr_data->ctrl.poll_for_msg = GRR_PCCO_POLL; } else #endif { TRACE_EVENT( "PACKET CELL CHANGE ORDER RECEIVED" ); ctrl_cell_change_order ( CCO_TYPE_GRR, (void *)d_cell_chan_order ); } } else { TRACE_EVENT( "PACKET CELL CHANGE ORDER RECEIVED,but NC2 is deactivated" ); } break; default: TRACE_ERROR( "SIG_GFP_CTRL_CC_ORDER unexpected" ); break; } } /* sig_gfp_ctrl_cc_order() */ /* +------------------------------------------------------------------------------ | Function : sig_gfp_ctrl_dsf_ind +------------------------------------------------------------------------------ | Description : This signal indicates that a downlink signalling failure has | occured, we have to reselect a new cell | Parameters : payload to primitive | +------------------------------------------------------------------------------ */ GLOBAL void sig_gfp_ctrl_dsf_ind ( void ) { TRACE_ISIG( "sig_gfp_ctrl_dsf_ind" ); /* A set of measurement reporting parameters (NETWORK_CONTROL_ORDER and * NC_REPORTING_PERIOD(s)) is broadcast on PBCCH. The parameters may also * be sent individually to an MS on PCCCH or PACCH, in which case it * overrides the broadcast parameters. The individual parameters are valid * until the RESET command is sent to the MS or there is a downlink * signalling failure or the MS goes to the Standby state or the MS enters * dedicated mode. */ sig_ctrl_cs_reset_meas_rep_params ( ); ctrl_failure_processing( FAIL_SIG_DSF_IND ); }/* sig_gfp_ctrl_dsf_ind*/ #if defined (REL99) AND defined (TI_PS_FF_EMR) /* +------------------------------------------------------------------------------ | Function : sig_cs_ctrl_enh_meas_report +------------------------------------------------------------------------------ | Description : Handles the internal signal SIG_CS_CTRL_ENH_MEAS_REPORT | | Parameters : T_U_ENHNC_MEAS_REPORT *enh_meas_report | +------------------------------------------------------------------------------ */ GLOBAL void sig_cs_ctrl_enh_meas_report ( T_U_ENHNC_MEAS_REPORT *enh_meas_report) { TRACE_ISIG( "sig_cs_ctrl_enh_meas_report" ); switch( GET_STATE( CTRL ) ) { case CTRL_IN_PROGRESS: case CTRL_GRR_NC_CCO: ctrl_send_control_block( CGRLC_BLK_OWNER_CS, (void*)enh_meas_report ); break; default: TRACE_ERROR( "SIG_CS_CTRL_ENH_MEAS_REPORT unexpected" ); break; } } /* sig_cs_ctrl_enh_meas_report() */ #endif /* +------------------------------------------------------------------------------ | Function : sig_tc_ctrl_test_mode_ind +------------------------------------------------------------------------------ | Description : | | Parameters : +------------------------------------------------------------------------------ */ GLOBAL void sig_tc_ctrl_test_mode_ind(void) { TRACE_EVENT("sig_tc_ctrl_test_mode_ind"); if(grr_data->test_mode NEQ CGRLC_NO_TEST_MODE) { ctrl_stop_monitoring_ccch(); } }