blob: c3cf8400b053d384ea5d74f2442b0b981016d2b0 [file] [log] [blame]
/*****************************************************************************
* Copyright Statement:
* --------------------
* This software is protected by Copyright and the information contained
* herein is confidential. The software may not be copied and the information
* contained herein may not be used or disclosed except with the written
* permission of MediaTek Inc. (C) 2005
*
* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
*
* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
*
* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
*
*****************************************************************************/
/*****************************************************************************
*
* Filename:
* ---------
* l1_dm.h
*
* Project:
* --------
* Maui_Software
*
* Description:
* ------------
* This file is for the dual mode operation.
*
* Author:
* -------
* -------
*
*============================================================================
* HISTORY
* Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
*------------------------------------------------------------------------------
* removed!
* removed!
* removed!
*
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
* removed!
*
* removed!
* removed!
*
* removed!
* removed!
*
* removed!
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
*
* removed!
* removed!
*
* removed!
* removed!
*
* removed!
* removed!
*
* removed!
* removed!
*
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
*
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
*
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
* removed!
*
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
*
* removed!
* removed!
*
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*------------------------------------------------------------------------------
* Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
*============================================================================
****************************************************************************/
#ifndef L1_DM_H
#define L1_DM_H
#include "l1_surround_private.h"
#include "common_reg.h"
#include "l1d_data_l1core.h"
#include "l1d_cid.h"
#include "l1_types.h"
#include "l1_core_private.h"
#include "mph_types.h"
#include "tool.h"
#include "kal_general_types.h"
#include "mll1_gsm.h"
#include "gmss_public.h"
/****************************** enum begin ************************************/
typedef enum
{
UMTS_FDD_IDLE,
UMTS_FDD_FACH,
UMTS_FDD_EFACH_DRX,
UMTS_FDD_DCH,
UMTS_TDD_IDLE,
UMTS_TDD_FACH,
UMTS_TDD_DCH,
UMTS_C2K_IDLE,
LTE_IDLE,
LTE_DCH,
LTE_DCH_DRX,
GSM_IDLE,
GSM_DCH,
NEWRADIO_IDLE,
NEWRADIO_DCH,
MM_NULL
} mm_mode_enum;
#if 0
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
#endif
/****************************** enum end **************************************/
/****************************** define begin ************************************/
#define L1C_AG_AHEAD_FRAME 9
#define L1C_AG_LENGTH_EBIT 173333 /* 80ms for 2G active */
#define L1C_AG_NOT_CNF_LENGTH (-1) //
#define L1C_NORMAL_GAP_SERVICE (0x1)
#define L1C_AUTO_GAP_SERVICE (0x2)
#define L1C_GAP_STOP_TIME 3
#define GL1_GAP_NUM_IN_PERIOD GSM_SESSION_IN_PERIOD
/* define database switch macros for 2G standby */
#ifdef __GERAN_R8__
#define SIM_REG_BA_OFFSET ( L1C_SIM1 ) //0
#define SIM_PRIO_BA_OFFSET ( L1C_SIM_NUM ) //L1C_SIM_NUM
#define SWITCH_TO_PRIO_RESEL_STANDBY() ( l1c_sim_prio_ba_offset = SIM_PRIO_BA_OFFSET ) /* be called only when the sim is in standby mode */
#define SWITCH_TO_REG_RESEL_STANDBY() ( l1c_sim_prio_ba_offset = SIM_REG_BA_OFFSET )
#define SWITCH_TO_ASSIGNED_RESEL_STANDBY( mode ) ( l1c_sim_prio_ba_offset = (( mode == REG_RESEL_STANDBY )? SIM_REG_BA_OFFSET : SIM_PRIO_BA_OFFSET ) )
#define L1C_RESEL_MODE_STANDBY ( (l1c_sim_prio_ba_offset == SIM_REG_BA_OFFSET)? REG_RESEL_STANDBY : PRIO_RESEL_STANDBY )
#define IS_PRIO_RESEL_MODE_STANDBY ( l1c_sim_prio_ba_offset == SIM_PRIO_BA_OFFSET )
#define IS_REG_RESEL_MODE_STANDBY ( l1c_sim_prio_ba_offset == SIM_REG_BA_OFFSET )
#else
#define L1C_RESEL_MODE_STANDBY ( REG_RESEL_STANDBY )
#endif /* __GERAN_R8__ */
/* define L1C MM mode macros for 2G standby */
#define L1C_IS_CONNECTED_STANDBY(mode) ( mode == UMTS_FDD_FACH || mode == UMTS_TDD_FACH || mode == UMTS_FDD_DCH || mode == UMTS_TDD_DCH || mode == LTE_DCH )
#define L1C_IS_IDLE_STANDBY(mode) ( mode == UMTS_FDD_IDLE || mode == UMTS_TDD_IDLE || mode == UMTS_C2K_IDLE || mode == LTE_IDLE || mode == NEWRADIO_IDLE )
#define L1C_IS_IDLE_OR_CON_DRX_STANDBY(mode) ( mode == UMTS_FDD_IDLE || mode == UMTS_TDD_IDLE || mode == UMTS_FDD_EFACH_DRX || mode == UMTS_C2K_IDLE || mode == LTE_IDLE || mode == LTE_DCH_DRX || mode == NEWRADIO_IDLE )
/* this macro must be used in 2g standby */
#define L1C_IS_UTRAN_TDD_MODE_STANDBY(mode) ( mode == UMTS_TDD_FACH || mode == UMTS_TDD_DCH || mode == UMTS_TDD_IDLE )
#define L1C_IS_UTRAN_TDD_MODE_CONNECTED_STANDBY(mode) ( mode == UMTS_TDD_FACH || mode == UMTS_TDD_DCH )
#define GL1_CHECK_BIT(a, mask) ( ((a)&(mask)) != 0 )
#define GL1_SET_BIT(a, mask) ( (a) |= (mask) )
#define GL1_CLEAR_BIT(a, mask) ( (a) &= ~(mask) )
#define DEFAULT_PM_PASS_PER_PERIOD_IDLE 1
#define DEFAULT_PM_PASS_PER_PERIOD_EFACH_DRX 1
#define DEFAULT_PM_PASS_PER_PERIOD_DCH_FACH 3
#define DEFAULT_PM_PASS_PER_PERIOD_LTE_CONNECTED_DRX 1
#define MAX_TRIES_FB_PLMN_2G_STANDBY 2
#define MIN_3G_GAP_FRAME 8 /* 2 blocks, to avoid PCh norm/ext case. */
#define RF_ADDITIONAL_MARGIN_FOR_SB_HEAD_EBITS (TQ_SBWIN_DSP_EXTEND1 * 2)
#define RF_ADDITIONAL_MARGIN_FOR_SB_TAIL_EBITS (TQ_SBWIN_DSP_EXTEND2 * 2)
#define FB_MAX_WINDOW_SLOTS (12*8+3)
#define FB_MAX_SEARCH_TOTAL_SLOTS (FB_MAX_WINDOW_SLOTS*8) /* use to stop FB search if UMTS_IDLE gap < FB_MAX_WINDOW_SLOTS */
#define FRAME_IN_EBITS 10000
#define SLOT_IN_EBITS 1250
#define FB_MIN_WINDOW_EBITS 2176 //TDD gap use
#define FB_MIN_WINDOW_SLOTS 3 //FDD/LTE gap use
#ifdef __UMTS_RAT__ // TDD needs 106, FDD needs 36
#define L1_MAX_GAP_HANDLER 106
#endif
#if 0
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
#endif
#ifdef __UMTS_RAT__
#define TD_SUBFRAME_TO_EBIT 10833 //10840
#define TD_SLOT_TO_EBIT 1462
#define LONG_GAP_LEN_FACH_DCH 10000 //10000
#define MIN_SB_DELAY_ALLOW_FB_SEARCH 32502 /* # of ebit for 15ms */
#define DEFALT_BSIC_RECONFIRM_TIME 5000 /* in unit of ms */
#define DEFALT_BSIC_SEARCH_ABORT_TIME (DEFALT_BSIC_RECONFIRM_TIME*10/46) /* in unit of TDMA frames */
#endif
#ifdef __GL1_GEMINI__
#if defined( __GL1_GEMINI_WCDMA__ ) || defined( __GEMINI__ ) || defined( __CDMA2000_RAT__ ) || defined( __IRAT_MEAS_SUPPORT_IN_VIRTUAL_MODE__ )
#define STANDBY_MEAS_LENGTH_ACTIVE_IDLE 2 //unit: frame
#endif
#endif
#define SRVCC_USE_CGI_AUTO_GAPS 1
#if (SRVCC_USE_CGI_AUTO_GAPS)
#define SRVCC_BOOST_IN_QDBM 1
#define SRVCC_MAX_BOOST_RANGE_IN_QDBM 12
#define MAX_SRVCC_BSIC_ATTEMPTS 2
#endif
/****************************** define end **************************************/
/****************************** struct begin ************************************/
typedef struct Gap_Handler Gap_Handler;
struct Gap_Handler
{
Time start_time;
bool pm_period_start;
gsm_tgmp_enum purpose;
kal_uint16 gap_num;
sGAP gap[GL1_MAX_GAP_NUM_IN_ONE_FRAME];
kal_bool gap_reschedule;
Gap_Handler* prev;
Gap_Handler* next;
};
typedef struct
{
Gap_Handler GAPPool[L1_MAX_GAP_HANDLER];
Gap_Handler* unusedGAPs[L1_MAX_GAP_HANDLER];
Gap_Handler* usedGAPs[L1_MAX_GAP_HANDLER];
Gap_Handler* running_gap;
Gap_Handler* gapTimer_gap;
Gap_Handler* bsic_gap;
kal_uint32 t_reconfirm; /* In unit of TDMA frames(4.6ms). used for fach/dch/lte connected */
kal_uint32 t_identify; /* In unit of TDMA frames(4.6ms). used for fach/dch/lte connected*/
kal_uint32 bsic_reconfirm_para; /* In unit of msec. Used in FACH/DCH mode. */
Time next_session_start_after; //for FB gap in the end of period, the first session in the next session must >= this time
uint16 fb_search_cnt_down;
kal_uint8 unusedGAPCount;
kal_uint8 usedGAPCount;
#ifdef __LTE_RAT__
kal_uint8 tds_lte_left_gap_idx; //use for lte left pattern calculation
#endif /*__LTE_RAT__*/
} GapGlobal;
typedef struct
{
mm_mode_enum mode;
Timer activeRATTimer;
Timer standbyRATTimer;
/* 3G active, common parameters */
kal_bool pm_meas_started;
intx pm_cell_num[ NUM_RESEL_MODE_STANDBY ];
kal_bool lock_sm;
bool Dedi3G;
kal_uint8 GAPStatus; //bit0: normal gap, bit1: auto gap
kal_bool gap_suspended; // fmo_lock
kal_uint8 wait_HW_stop_count; /* frame countdown to wait 2G FB/SB, PM stop */
bool umts_hspa; //TDS
/* Power Scan */
kal_bool power_scan_started;
kal_bool tempStopPSM;
/* RSSI measurement */
kal_uint8 pm_pass_per_period; /* Default=1. */
kal_uint8 pm_pass_this_period[ NUM_RESEL_MODE_STANDBY ];
kal_uint8 pm_tid[ NUM_RESEL_MODE_STANDBY ];
kal_uint8 pm_tid_new[ NUM_RESEL_MODE_STANDBY ];
bool pm_tid_done[ NUM_RESEL_MODE_STANDBY ];
bool next_pm_start_time_valid;
kal_uint8 next_pm_pass_per_period; //FDD connected
Time next_pm_start_time; //FDD connected
intx next_pm_cell_num; //connected
kal_uint8 arfcn_count_measured; //the number of arfcn that have been measured; reset when ba is changed or avg is reset
#if 1 //def __GL1_GEMINI__
// Timer idleSuspendPM; //used to stop measurement at the end of idle gap
#endif
bool stopAllMeas; //only TDS use
//bool skip_next_gap; //TDS /* after long fb search gap in FACH/DCH, skip next gap to prevent conflict */
Timer pmSessionTimer; //TDS
/* BSIC search */
Timer sbTimer;
Timer fbTimer;
Timer bsicSCTimer;
Timer dummyFBTimer;
Timer SRVCCGapSetTimer;
Timer SRVCCGapResetTimer;
bool resetSRVCCGapMeas;
bool first_gap_notify;
uint16 default_sb_window_ebits;
TID fb_tid;
TID sb_tid;
bool fb_started;
bool sb_started;
bool retry_sb;
bool fb_max_window;
kal_uint16 fb_total_search_slot; /* used to count total FB search slot in UMTS_IDLE */
intx fb_slot_count; //slot for FDD, ebit for TDD
AGCCellData bsic_agc_cell;
//AfcParams* afc;
/*FDD*/
//kal_uint8 bsic_slot; /* For FB window. */
//scCellBSIC* bsic_cell; /* For FB or SB. */
//AGCCellData cell;
//ARFCN fb_arfcn;
/* Gap Handler and Timing sync. */
Timer gapTimer;
Timer gapStopTimer_all; //syy
Timer gapStopTimer_suspend; //syy: fmo lock timer
Timer syncTimer;
TID sync_tid;
Time sync_offset;
//Time sync_start_time;
/* For 2G active */
Timer search_3gTimer;
kal_int8 GAPreservedFrames; /* The gap reserved frames for 3G, ex Timer_3GSearch, TimerAutoGap. Only SIM1 need to check it. */
intx search_3g_FN26;
kal_uint8 search_3g_state_cnt; /* Range: 0~7. If equals 7, it will be reset to 0, and enters CM state. */
kal_bool gap_schedule_started;
/* For 2G active/PCH, assign DRX period to 3G. */
bool rf_checked;
bool l1i_checked;
bool rf_sleep;
kal_uint16 l1i_sleep_frame;
kal_uint16 l1i_sleep_ebit;
bool umts_gap_running;
Time umts_gap_start_time;
kal_uint32 umts_gap_len;
TID GAPtid;
TID SuspendGaptid;
/* Measurement priority */
MeasurementPriority meas_priority;
MeasurementPriority meas_priority_cgi;
MeasurementPriority meas_priority_scan;
#ifdef __GERAN_R8__
MeasurementPriority meas_priority_higher;
#endif /* __GERAN_R8__ */
#ifdef __GERAN_R8__
kal_bool pm_meas_started_higher;
#endif /* __GERAN_R8__ */
#if defined ( __GL1_GEMINI__ )
Timer restartGAPtimer; // This variable is only used when active RAT is FDD or LTE.
#endif
/* TDS */
bool LockGAP;
#if defined (__GL1_GEMINI__)
bool isChannelLock; //used in TD MM Gemini lock and unlock mechanism
/*dm_global.isChannelLock only can be set as true when TDD is active RAT, it cannot be set as true when FDD is active RAT.*/
#endif /* defined (__GL1_GEMINI__) */
//kal_uint8 gapPurpose;
kal_bool DRX_Tick; //2G active, for drx tick in gap pattern
Timer autoGaptimer;
Timer autoGapReportTimer;
kal_int32 autoGaptimerLength; //the length L1C uses, from the time that AG can be used
kal_int32 autoGapLengthGive; //the length filled in report, from ST. If there's reservation after ST, this will be longer than autoGaptimerLength
kal_bool standbyAGConfirm;
kal_int8 standbyAGUseCount;
Time standbyAGStartTime;
kal_int32 standbyAGLength; //-1 means not confirmed
Timer standbyAGStopTimer; //used to wait for L1D stop to send ReportGSMAutoGAPStop
Timer standbyAGEndTimer; //used to send reportGapEnd when reportCGI is stopped by upper layer
#ifdef __GL1_GEMINI__
#if defined( __GL1_GEMINI_WCDMA__ ) || defined( __GEMINI__ ) || defined( __CDMA2000_RAT__ ) || defined( __IRAT_MEAS_SUPPORT_IN_VIRTUAL_MODE__ )
Timer standbyMeasTimer; // used to schedule standby measurement for standby meas
Timer standbyMeasTimerPowerScan; // used to schedule standby measurement for manual power scan request
#endif
#endif
#if defined( __GEMINI__ ) || defined( __IRAT_MEAS_SUPPORT_IN_VIRTUAL_MODE__ )
uint32 scanPeriod;
uint32 scanLength;
uint32 scanPeriod_PM;
uint32 scanLength_PM;
uint16 BSICPeriod;
uint8 rdrb_for_manualscan_standbymeas;
bool backup_meas;
bool backup_scan;
#endif
intx arfcn_start_index_copy; //To backup the value of arfcn_start_index
#ifdef __GL1_GEMINI__
Timer VirtualSuspendCnfTimer;
#endif
} DualModeGlobal;
/****************************** struct end **************************************/
/****************************** function prototype begin ************************************/
/* for autonomous gap, common for FDD, TDD, LTE */
void L1T_AutoGAPStart( Time starting_time );
void L1T_AutoGAPEnd( void );
void L1T_GSMAutoGAPStop( void );
void L1T_GSMAutoGAPConfirm( kal_bool, kal_int32 );
void L1I_Timer_AutoGap( Timer* timer );
void L1I_Timer_ReportAutoGap( Timer* timer );
void L1I_MMPutAutoGAP( void );
intx L1I_GetGSMAutoGAPLengthEbit( void );
void L1I_Timer_GSMAutoGAPStop(Timer* timer);
void L1I_Timer_GSMAutoGAPEnd(Timer* timer);
void L1T_ReRequestGSMAutoGAP( void );
void L1I_ReRequestGSMAutoGAP( void );
/* to suspend GL1 gap usage. to replace fach/fmo lock/unlock */
void L1T_SuspendGAP( void );
void L1T_ResumeGAP( void );
void L1T_CancelGap_Lock_2G( void );
void L1T_CancelGap_Unlock_2G( void );
void L1T_SetGAPPurpose_idle(kal_uint16 gap_num, ll1_gsm_standby_gap_struct *gap);
void L1I_Start_SACCh_Timer( bool delay );
void L1T_SetModeInStandby( ll1_active_rat_mode_status_enum mode );
void L1I_Internal_StopGAP(void);
Gap_Handler* L1I_UpdateRunningGap( l1c_mm_sim_mode_enum local_sim_mode );
void L1T_GAPStatus(gl1_gap_status_enum GAPStatus);
void L1T_StartGAPSchedule( void );
void L1T_StopGAPSchedule (void);
void L1T_StopGAPPattern(void);
void L1I_NextBSIC_GAP(void);
void L1I_Update_HP_SB_UTRAN_TDD( Gap_Handler* gap );
void L1I_StartBSIC_GAP(Gap_Handler* gap);
void L1I_StartFB_GAP(Gap_Handler* gap);
void L1I_StartSB_GAP(Gap_Handler* gap);
void L1T_StandbyRAT(void);
void L1T_ActiveRAT(void);
void L1T_InterRATSyncGen(void);
void L1T_InitMM( void );
void L1I_Set_L1D_DM_State( void );
void L1I_Set_L1D_DM_Query_State( void );
void L1I_Start_GAP_Timer(void);
void L1I_Init_GAPSchedule(void); // bool priority_low );
void L1I_Timer_SB(Timer* timer);
void L1I_Timer_FB(Timer* timer);
#ifdef __GL1_GEMINI__
void L1I_Timer_VirtualSuspendCnf(Timer* timer);
#endif
void L1D_FCCh_DM( Report *report, ARFCN arfcn, int32 gap_len_ebit, AfcParams *afcParams, int16 repeat_cnt, L1D_APIcaller_id caller );
void L1D_SCh_DM( Report *report, ARFCN arfcn, bool retry, intx ebitPosition, AfcParams *afcParams, L1D_APIcaller_id caller );
void L1T_SetGAPPattern_NR(kal_uint16 session_num, ll1_gsm_standby_gap_struct* session, ll1_active_rat_mode_status_enum mode,
kal_bool pm_tick, kal_uint8 pm_tid, kal_bool pm_tick_higher, kal_uint8 pm_tid_higher );
#ifdef __LTE_RAT__
void L1T_SetGAPPattern_LTE(kal_uint16 session_num, ll1_gsm_standby_gap_struct* session, ll1_active_rat_mode_status_enum mode,
kal_uint32 t_reconfirm, kal_uint32 t_identify, kal_uint16 gap_expand_period, kal_uint8 n_freq,
kal_bool pm_tick, kal_uint8 pm_tid,
kal_bool pm_tick_higher, kal_uint8 pm_tid_higher, kal_uint8 gap_set_num );
void L1T_SetGAPPurpose_LTE_connected( kal_uint16 gap_num, ll1_gsm_standby_gap_struct *gap, kal_uint32 t_reconfirm_dch, kal_uint32 t_identify_dch, kal_uint16 gap_expand_period, kal_uint8 n_freq, kal_uint8 gap_set_num );
#endif /*__LTE_RAT__*/
#ifdef __CDMA2000_RAT__
void L1T_SetGAPPattern_C2K( kal_uint16 gap_num, ll1_gsm_standby_gap_struct* gap, ll1_active_rat_mode_status_enum mode,
kal_bool pm_tick, kal_uint8 pm_tid );
#endif
#ifdef __GERAN_R8__
void L1T_SetGAPPattern_FDD( kal_uint16 gap_num, ll1_gsm_standby_gap_struct* gap, ll1_active_rat_mode_status_enum mode,
kal_uint32 t_reconfirm, kal_uint32 t_identify,
kal_bool pm_tick, kal_uint8 pm_tid,
kal_bool pm_tick_higher, kal_uint8 pm_tid_higher );
//void L1T_GAPScheduleDone( kal_uint8 tid, kal_bool priority_search );
#else
void L1T_SetGAPPattern_FDD( kal_uint16 gap_num, Gap_Session*gap, ll1_active_rat_mode_status_enum mode,
kal_uint32 t_reconfirm, kal_uint32 t_identify,
kal_bool pm_tick, kal_uint8 pm_tid );
//void L1T_StartGAPSchedule( void );
//void L1T_GAPScheduleDone( kal_uint8 tid );
#endif /* __GERAN_R8__ */
#if defined ( __GL1_GEMINI__ ) && defined ( __GL1_MULTI_MODE__ )
void L1T_StopALTGAPSchedule_2( void );
void L1T_CancelGap_Lock_2G_2( void );
bool L1I_QueryAny2GStandbyLockSM( void );
bool L1I_QueryAnyDedicatedFlag( void );
#endif
void L1I_Timer_GAP(Timer* timer);
void L1I_Schedule_GapPurpose_rssi( Gap_Handler* gap, Timer* timer );
/* L1 internal function for DM. */
void L1I_InternalFrameTick_DM (void);
void L1I_StartSB_Timer(scCellBSIC* cell, kal_bool retry, intx sb_ebitDelay);
void L1I_StartFB_Timer(scCellBSIC* cell, intx ebitDelay, intx slot_count);
intx L1I_GetNormalGapFBLength( l1c_sim_mode_enum local_sim_mode );
scCellBSIC* check_fb_position(Gap_Handler *gap, intx* ebitDelay, intx* slot_count);
scCellBSIC* check_sb_position(Gap_Handler *gap, intx* ebitDelay);
scCellBSIC* check_hp_sb_position(Gap_Handler *gap, intx* ebitDelay, bool* retry_sb, kal_uint16* sb_pos);
void L1_Prepare_HP_SB_Data( SChData* p );
kal_uint16 ebit_2_slot(intx ebit);
void L1T_SetGAPPurpose_fach( kal_uint16 gap_num, ll1_gsm_standby_gap_struct *gap, kal_uint32 t_reconfirm_fach, kal_uint32 t_identify_fach);
void L1T_SetGAPPurpose_dch( gsm_tgmp_enum change_purpose, kal_uint16 gap_num, ll1_gsm_standby_gap_struct *gap, kal_uint32 t_reconfirm_dch, kal_uint32 t_identify_dch);
intx L1I_GetNext_SB_Position( Time servTime, int32 frameOffset, intx ebitOffset, intx gap_delay );
kal_bool check_bcch_gap_coincide(intx timer_schedule_delay, intx gap_len, intx bcch_ebitDelay);
kal_bool check_sb_gap_coincide(intx gap_len, intx sb_ebitDelay);
kal_uint8 check_hp_sb_gap_coincide(intx gap_ebitDelay, intx len, intx sb_ebitDelay, kal_bool retry);
bool check_hp_sb_end(kal_uint16 hp_sb_pos);
//void L1I_Start_GAP_Timer(void);
#ifdef __GL1_GEMINI__
#if defined( __GL1_GEMINI_WCDMA__ ) || defined( __GEMINI__ ) || defined( __CDMA2000_RAT__ ) || defined( __IRAT_MEAS_SUPPORT_IN_VIRTUAL_MODE__ )
void L1I_Timer_StandbyMeas( Timer* timer );
void L1I_Timer_StandbyPowerScan (Timer* timer );
bool L1I_IsNeedToDoStandbyMeas( void );
void L1I_StartStandbyMeasTimer( void );
#endif
#endif
#ifdef __GL1_GEMINI_WCDMA__
void L1I_SetStandbyPwrScanPriority( bool is_PLMNList );
#endif
void L1I_Timer_Search_3g(Timer* timer);
void L1I_Timer_BSICSC(Timer* timer);
void L1I_Timer_DUMMYFB(Timer* timer);
void L1I_Timer_SRVCCGapSet(Timer* timer);
void L1I_Timer_SRVCCGapReset(Timer* timer);
void L1I_BackupARFCNIndex(void);
void L1I_RestoreARFCNIndex(void);
void L1I_TimerStandby( Timer* timer );
void L1T_Next_BSICSC(void);
void L1T_StartStandby_Timer( void );
void L1I_Timer_IRATSync(Timer* timer);
void L1I_Timer_ActiveRAT(Timer* timer);
void L1T_Search_3g_Start(void);
void L1T_DM_SetMode( SurroundMode newMode );
void L1T_DM_Set_search_3g_FN26(kal_uint8 search_3g_FN26);
//void L1T_Init_GAPSchedule(void); // bool priority_low );
void L1I_Init_3G_GAP_SimMode( l1c_mm_sim_mode_enum local_sim_mode );
void L1I_Check_3G_GAP( l1c_mm_sim_mode_enum local_sim_mode );
#ifdef MTK_SLEEP_ENABLE
bool L1I_Assign_3G_GAP( kal_uint16 l1i_sleep_frame );
#else
bool L1I_Assign_3G_GAP(void);
#endif
bool L1I_Check_3G_GAP_From_Timer(int32 ebitDelay);
void L1I_gsm_gap_cancel_req(void);
void L1I_ReportFCCh_DM( Report* report );
void L1T_ReportFCCh_DM( Report* report );
void L1I_StopSCh_DM( void);
void L1I_StopFCCh_DM( void );
uint8 L1I_SChStop_DM( void );
uint8 L1I_FCChStop_DM( void );
void L1I_AbortReservationFCCh_DM( intx busyFrames, intx busyEBits );
//void L1D_SCh_DM( Report* report, ARFCN arfcn, bool retry, AfcParams* afcParams );
void L1I_ReportSCh_DM( Report* report );
void L1T_ReportSCh_DM( Report* report );
void L1I_ReportSyncTime( Report* report );
void L1T_ReportSyncTime( Report* report );
void L1T_ReportSuspendGap( Report* report );
void L1T_Init_Gap(void);
void L1I_Update_Gap(Gap_Handler* gap, intx remain_gap_len);
Gap_Handler* L1I_NewGapHandler(void);
void L1I_DeleteGapHandler(Gap_Handler* gap_handler);
void L1T_ResetAFC_DM(void);
intx L1_TimeDiff( Time timeA, Time timeB);
void L1I_InsertGapHandler(Gap_Handler* gap);
void L1I_RemoveGapHandler(Gap_Handler* gap_handler);
void L1I_DebugGapHandler(void); /* Only for debug purpose. */
void L1I_RemoveSuspend( void );
void L1I_Schedule_GapPurpose_undefined(Gap_Handler* gap);
void L1I_Consume_PM_DM(void); /* Used to consume PM cells, and not to fill it into PM queue. This is used for FMO_Lock request. */
void L1I_MeasurementsProcessDummyResults( void );
void L1T_SurroundReportTickStandby(void);
uint8 L1I_SurroundAbortReceive_DM( void );
uint8 L1I_SurroundAbortBCChReceive_DM( void );
intx L1I_NBCChStop( void );
void L1I_Timer_Tick(Timer* timer);
void L1I_Timer_GAPStop_suspend(Timer* timer);
void L1I_Timer_GAPStop_all(Timer* timer); //syy
//void L1I_TimerSuspendPMforGAP( Timer* timer ); //syy
#ifdef __GL1_GEMINI__
void L1I_Timer_restartGAP(Timer* timer);
kal_bool L1I_QueryIsContiFB( void );
kal_uint32 L1I_QueryGAPReservedLength( void );
#endif
#ifdef __GL1_GEMINI__
#if defined( __GL1_GEMINI_WCDMA__ ) || defined( __GEMINI__ ) || defined( __CDMA2000_RAT__ ) || defined( __IRAT_MEAS_SUPPORT_IN_VIRTUAL_MODE__ )
kal_uint32 L1I_QueryGAPPMReservedLength(void);
#endif /* defined( __GL1_GEMINI_WCDMA__ ) || defined( __GEMINI__ ) */
#endif
#if defined( __GEMINI__ ) || defined( __IRAT_MEAS_SUPPORT_IN_VIRTUAL_MODE__ )
void L1I_SetStandbyPwrScanParam( uint32 scanPeriod, uint32 scanLength );
void L1I_SetStandbyBSICParam( uint16 scanPeriod );
void L1I_AssignGAPinVirtualMode( void );
#ifdef __IRAT_MEAS_SUPPORT_IN_VIRTUAL_MODE__
void L1T_VStandbyMeasSetParam( uint32 MeasPeriod, uint32 MeasLength );
#endif /* __IRAT_MEAS_SUPPORT_IN_VIRTUAL_MODE__ */
#endif /* defined( __GEMINI__ ) || defined( __IRAT_MEAS_SUPPORT_IN_VIRTUAL_MODE__ ) */
#ifdef __GL1_MULTI_MODE__
bool L1I_QueryAnyActiveRATinDedicated( void );
#endif
/* Interface with L1D. */
//void L1D_FCCh_DM(Report* report, ARFCN arfcn, int16 gap_len, AfcParams* afcParams);
void L1D_Sync_To_3G_DM(Report* report);
void L1D_Start_Next_PM_DM( void );
void L1D_Skip_PM_DM(L1D_APIcaller_id caller);
uint16 L1D_Get_SBWIN_LEN_DM(void);
intx L1D_Cal_PM_Count_DM( sGAP *gap );
intx L1D_Cal_FB_Slot_Length_DM(intx ebit_duration);
void L1D_Sync_To_Multi_Mode( Report *report, L1D_APIcaller_id caller );
bool L1D_check_3g_reli(void);
#if IS_GL1_MULTI_MODE_SUPPORT
void L1D_Set_GSM_RAT_Mode( L1D_MM_STATE L1D_DM_STATE, l1c_sim_mode_enum sim_idx, L1D_APIcaller_id caller);
void L1D_Set_GSM_Query_RAT_Mode( L1D_MM_STATE L1D_DM_STATE );
#endif
void L1I_ResetAFC_DM( void );
void L1T_Set_Timer_UTRAN_FDD_and_EUTRAN( void );
void L1T_Set_Timer_UTRAN_TDD( void );
void L1T_SetGAPPattern_TDD( kal_uint16 gap_num, ll1_gsm_standby_gap_struct* gap, ll1_active_rat_mode_status_enum mode,
kal_bool pm_tick, kal_uint8 pm_tid
#ifdef __GERAN_R8__
,kal_bool pm_tick_higher, kal_uint8 pm_tid_higher
#endif
#ifdef __LTE_RAT__
,kal_uint16 dmo_lte_period, kal_uint16 dmo_lte_length
#endif
);
/* L1C DM Internal Use. */
Time L1I_GapEndTime( Gap_Handler* session );
void L1I_Stop_BSIC_Schedule_UTRAN_TDD( void );
void L1I_Measurement_Period_Start_UTRAN_TDD( void );
void L1I_Schedule_GapPurpose_rssi_UTRAN_TDD( Gap_Handler* gap, sGAP* gap_pattern );
void L1I_Schedule_GapPurpose_bsic_UTRAN_TDD( Gap_Handler* gap, sGAP* gap_pattern );
void L1I_Timer_GAP_UTRAN_TDD(Timer* timer);
void L1I_Timer_PM_Session_UTRAN_TDD( Timer* timer );
void L1I_Reset_PM_Session( void );
void L1T_SetGAPPurpose_fach_dch_UTRAN_TDD( kal_uint16 gap_num, ll1_gsm_standby_gap_struct* gap
#ifdef __LTE_RAT__
,kal_uint16 dmo_lte_period, kal_uint16 dmo_lte_length
#endif
);
#ifdef __UMTS_TDD128_MODE__
/* TDD DM *//* L1C/D Interface function for DM. */
/* TDD DM *///void L1D_Sync_To_3G_DM( Report *report );
#if L1D_WT_COBIN_ARCHITECTURE_SUPPORT
/* TDD DM */void L1D_Set_Gap_TDD( sGAP *gap, L1D_APIcaller_id caller ); /* set GAP pattern to L1D in 3G FACH and DCH state */
#else
/* TDD DM */void L1D_Set_Gap( sGAP *gap ); /* set GAP pattern to L1D in 3G FACH and DCH state */
#endif
/* TDD DM *///void L1D_Set_GSM_RAT_Mode( L1D_MM_STATE L1D_DM_STATE, L1D_APIcaller_id caller );
/* TDD DM *///bool L1D_IsTDStandby_DM(void);
/* TDD DM *///void L1D_SCh_DM( Report *report, ARFCN arfcn, bool retry, intx ebitPosition, AfcParams *afcParams );
/* TDD DM *///void L1D_FCCh_DM( Report *report, ARFCN arfcn, int32 gap_len_ebit, AfcParams *afcParams, int16 repeat_cnt );
/* TDD DM *///void L1D_Sync_To_3G_DM( Report *report );
/* TDD DM *///uint16 L1D_Get_SBWIN_LEN_DM( void );
#if IS_AFC_CAPABILITY_ENHANCEMENT_SUPPORT
/* TDD DM */void L1D_AFCSetDACValue_DM( AfcParams *p, int32 DacValue, L1D_APIcaller_id caller );
#else
/* TDD DM */void L1D_AFCSetDACValue_DM( AfcParams *p, int16 DacValue, L1D_APIcaller_id caller );
#endif /* IS_AFC_CAPABILITY_ENHANCEMENT_SUPPORT */
/* TDD DM *///bool L1D_check_3g_reli( void );
/* TDD DM */void L1D_AFCResetParams_DM( AfcParams *p, L1D_APIcaller_id caller );
/* TDD DM */bool L1D_AFC_2G_ACTIVE_ASK_FreqCorrect( uint8 simIndex, kal_bool correction, kal_bool is_l1c, AfcParams *afcParams );
/* TDD DM */void L1D_Start_Next_PM_DM( void );
/* TDD DM *///void L1D_Skip_PM_DM( L1D_APIcaller_id caller );
/* TDD DM *///intx L1D_Cal_PM_Count_DM( sGAP* gap );
#if L1D_WT_COBIN_ARCHITECTURE_SUPPORT
#if IS_AFC_CAPABILITY_ENHANCEMENT_SUPPORT
/* TDD DM */kal_int32 L1D_AFCGetDAC_Value_DM_TDD(bool is_2g_2_3g);
#else
/* TDD DM */kal_int16 L1D_AFCGetDAC_Value_DM_TDD(bool is_2g_2_3g);
#endif /* IS_AFC_CAPABILITY_ENHANCEMENT_SUPPORT */
/* TDD DM */void L1D_FCCh_Update_rxTime_TDD(Time rxTime, L1D_APIcaller_id caller);
/* TDD DM */void L1D_FBM_Update_left_times_TDD(int16 new_left_times, L1D_APIcaller_id caller);
/* TDD DM */intx L1D_Cal_PM_Count_DM_Query_TDD( sGAP *gap );
#else
#if IS_AFC_CAPABILITY_ENHANCEMENT_SUPPORT
/* TDD DM */kal_int32 L1D_AFCGetDAC_Value_DM(bool is_2g_2_3g);
#else
/* TDD DM */kal_int16 L1D_AFCGetDAC_Value_DM(bool is_2g_2_3g);
#endif /* IS_AFC_CAPABILITY_ENHANCEMENT_SUPPORT */
/* TDD DM */void L1D_FCCh_Update_rxTime(Time rxTime, L1D_APIcaller_id caller);
/* TDD DM */void L1D_FBM_Update_left_times(int16 new_left_times, L1D_APIcaller_id caller);
/* TDD DM */intx L1D_Cal_PM_Count_DM_Query( sGAP *gap );
#endif
/* TDD DM */void L1D_Sync_To_Multi_Mode( Report *report, L1D_APIcaller_id caller );
#endif /*__UMTS_TDD128_MODE__*/
/****************************** function prototype end **************************************/
/****************************** global variable begin ************************************/
#ifdef __GL1_GEMINI_WCDMA__
#define gap_global gapGlobals_database[l1c_sim_mode]
#define local_gap_global gapGlobals_database[local_sim_mode]
extern GapGlobal gapGlobals_database[L1C_MM_SIM_NUM];
#define dm_global dmGlobals_database[l1c_sim_mode]
#define local_dm_global dmGlobals_database[local_sim_mode]
extern DualModeGlobal dmGlobals_database[L1C_MM_SIM_NUM];
#define gap_base gapBase_database[l1c_sim_mode]
#define local_gap_base gapBase_database[local_sim_mode]
extern Gap_Handler gapBase_database[L1C_MM_SIM_NUM];
extern uint8 syncBitmap;
#else
#define local_gap_global gap_global
#define local_dm_global dm_global
#define local_gap_base gap_base
extern GapGlobal gap_global;
extern DualModeGlobal dm_global;
extern Gap_Handler gap_base;
#endif
bool L1I_QueryAllSIMInGSMIdle( void );
/****************************** global variable end **************************************/
EXTERN_TRACE_CLASS( tcDM ); /* For L1 simulation. */
#endif
#if IS_TXRX_GET_INFO
kal_uint64 L1D_Rx_Active_Time();
void L1D_Rx_Reset_Time();
void L1I_CalculateFBRxTime(void);
void L1I_QueryFBStartTime(void);
Power L1I_QueryTxPowerInfo(void);
void L1I_getTxinformationTime(Power txpower, int32 reservationMask);
#endif