VOS_VOID MTC_InitPsTransferCtx(VOS_VOID) { VOS_UINT32 ulRet; MTC_PS_TRANSFER_CTX_STRU *pstPsTransferCtx = VOS_NULL_PTR; pstPsTransferCtx = MTC_GetPsTransferCtxAddr(); /* 初始化上下文 */ PS_MEM_SET(pstPsTransferCtx, 0, sizeof(MTC_PS_TRANSFER_CTX_STRU)); /* 初始化PSTRANSFER的上报状态值 */ pstPsTransferCtx->enReportCause = MTC_PS_TRANSFER_CAUSE_BUTT; pstPsTransferCtx->enRrcCause = MTC_PS_TRANSFER_CAUSE_BUTT; /* 读取NV项 */ ulRet = NV_Read(en_NV_Item_PS_TRANSFER_CFG, &pstPsTransferCtx->stPsTransferCfg, sizeof(MTC_NV_PS_TRANSFER_CFG_STRU)); if (VOS_OK != ulRet) { MTC_WARNING_LOG("MTC_InitPsTransferCtx: Read Nv Fail."); } return; }
VOS_VOID MTC_ProcCurrCampPlmnInfoForSvlte(VOS_VOID) { MTC_MODEM_POWER_STATE_ENUM_UINT8 enModem1PowerState; MTC_MODEM_NETWORK_INFO_STRU *pstModem0NetworkInfo = VOS_NULL_PTR; MTC_PS_TRANSFER_ENUM_UINT8 enPsTransferSolution; MTC_RATMODE_ENUM_UINT8 enModem0RateMode; VOS_UINT8 ucUsimValidFlag; MTC_PS_TRANSFER_CTX_STRU *pstPsTransferCtx = VOS_NULL_PTR; pstPsTransferCtx = MTC_GetPsTransferCtxAddr(); enModem1PowerState = MTC_GetModemPowerState(MODEM_ID_1); pstModem0NetworkInfo = MTC_GetModemNetworkInfoAddr(MODEM_ID_0); enPsTransferSolution = MTC_GetPsTransferCfg(); enModem0RateMode = MTC_GetModemRatMode(MODEM_ID_0); /* Modem1关机,国外模式无需PS域迁移 */ if (MTC_MODEM_POWER_OFF == enModem1PowerState) { return; } ucUsimValidFlag = MTC_GetModemUsimValidFlag(MODEM_ID_0); /* 1、modem1处于开机状态 2、当前驻留网络接入技术为T/L(OscarTL通过主卡的G重选回T/L) 3、当前驻留网络非禁止plmn 4、单待模式modem0的ps是detach状态,上报PS域迁移指示 */ if ( ( (MTC_RATMODE_LTE == enModem0RateMode) || (MTC_RATMODE_TDS == enModem0RateMode) ) && (VOS_FALSE == pstModem0NetworkInfo->ucIsForbiddenPlmnFlag) && (VOS_TRUE == ucUsimValidFlag) && (VOS_FALSE == pstModem0NetworkInfo->stPsDomainInfo.ucPsAttachAllowFlg) && (VOS_TRUE == pstModem0NetworkInfo->stPsDomainInfo.ucPsSupportFlg) ) { /* PS域迁移策略脱网重选,上报网络恢复指示AT命令 */ if (MTC_PS_TRANSFER_LOST_AREA == enPsTransferSolution) { MTC_SndModem0MtaPsTransferInd(MTC_PS_TRANSFER_CAUSE_AREA_AVALIABLE); MTC_SndModem0MmaPsTransferInd(MTC_PS_TRANSFER_CAUSE_AREA_AVALIABLE); } /* PS域迁移策略离网重选,上报网络恢复指示AT命令 */ if ((MTC_PS_TRANSFER_OFF_AREA == enPsTransferSolution) && (MTC_PS_TRANSFER_CAUSE_AREA_AVALIABLE == pstPsTransferCtx->enRrcCause)) { MTC_SndModem0MtaPsTransferInd(MTC_PS_TRANSFER_CAUSE_AREA_AVALIABLE); MTC_SndModem0MmaPsTransferInd(MTC_PS_TRANSFER_CAUSE_AREA_AVALIABLE); } //MTC_SndModem0MmaPsTransferInd(MTC_PS_TRANSFER_CAUSE_AREA_AVALIABLE); } return; }
VOS_VOID MTC_RcvRrcAreaAvaliableInd(VOS_VOID * pMsg) { MODEM_ID_ENUM_UINT16 enModemId; RRC_MTC_AREA_AVALIABLE_IND_STRU *pstAreaAvaliableInd = VOS_NULL_PTR; MTC_MODEM_NETWORK_INFO_STRU *pstNetworkInfo = VOS_NULL_PTR; VOS_UINT8 ucUsimValidFlag; MTC_PS_TRANSFER_CTX_STRU *pstPsTransferCtx = VOS_NULL_PTR; pstPsTransferCtx = MTC_GetPsTransferCtxAddr(); ucUsimValidFlag = MTC_GetModemUsimValidFlag(MODEM_ID_0); pstAreaAvaliableInd = (RRC_MTC_AREA_AVALIABLE_IND_STRU*)pMsg; enModemId = VOS_GetModemIDFromPid(pstAreaAvaliableInd->stMsgHeader.ulSenderPid); /* 仅处理Modem0发送的网络恢复指示 */ if (enModemId != MODEM_ID_0) { MTC_ERROR1_LOG("MTC_RcvRrcAreaAvaliableInd: Err ModemId ", enModemId); return; } /* PS域离网重选策略开启时 */ if (MTC_PS_TRANSFER_OFF_AREA == MTC_GetPsTransferCfg()) { pstNetworkInfo = MTC_GetModemNetworkInfoAddr(enModemId); /* 当前驻留网络非禁止PLMN、非禁止GPRS接入、卡状态有效、不重复上报 */ if ( (VOS_FALSE == pstNetworkInfo->ucIsForbiddenPlmnFlag) && (VOS_TRUE == pstNetworkInfo->stPsDomainInfo.ucPsSupportFlg) && (VOS_TRUE == ucUsimValidFlag) && (MTC_PS_TRANSFER_CAUSE_AREA_AVALIABLE != pstPsTransferCtx->enReportCause)) { /* 上报PS域迁移网络恢复指示AT命令 */ MTC_SndModem0MtaPsTransferInd(MTC_PS_TRANSFER_CAUSE_AREA_AVALIABLE); } pstPsTransferCtx->enRrcCause = MTC_PS_TRANSFER_CAUSE_AREA_AVALIABLE; MTC_SndModem0MmaPsTransferInd(MTC_PS_TRANSFER_CAUSE_AREA_AVALIABLE); } /* 可维可测: 记录接收到丢网指示的次数 */ MTC_DEBUG_RcvRrcAreaAvaliableInd(); return; }
VOS_VOID MTC_SndModem0MtaPsTransferInd( MTC_PS_TRANSFER_CAUSE_ENUM_UINT8 enPsTransferCause ) { VOS_UINT16 ulLenth; MTC_MTA_PS_TRANSFER_IND_STRU *pstPsTransferInd = VOS_NULL_PTR; MTC_PS_TRANSFER_CTX_STRU *pstPsTransferCtx = VOS_NULL_PTR; pstPsTransferCtx = MTC_GetPsTransferCtxAddr(); pstPsTransferCtx->enReportCause = enPsTransferCause; ulLenth = sizeof(MTC_MTA_PS_TRANSFER_IND_STRU) - VOS_MSG_HEAD_LENGTH; /* 分配消息空间 */ pstPsTransferInd = (MTC_MTA_PS_TRANSFER_IND_STRU*)PS_ALLOC_MSG(UEPS_PID_MTC, ulLenth); if (VOS_NULL_PTR == pstPsTransferInd) { MTC_ERROR_LOG("MTC_SndModem0MtaPsTransferInd: Alloc msg fail!"); return; } /* 清消息空间 */ PS_MEM_SET((VOS_UINT8*)pstPsTransferInd + VOS_MSG_HEAD_LENGTH, 0, ulLenth); /* 填充消息 */ pstPsTransferInd->stMsgHeader.ulReceiverPid = I0_UEPS_PID_MTA; pstPsTransferInd->stMsgHeader.ulMsgName = ID_MTC_MTA_PS_TRANSFER_IND; pstPsTransferInd->ucCause = enPsTransferCause; /* 发送消息 */ if (VOS_OK != PS_SEND_MSG(UEPS_PID_MTC, pstPsTransferInd)) { MTC_ERROR1_LOG("MTC_SndModem0MtaPsTransferInd: Snd Msg err. Rec Pid ", I0_UEPS_PID_MTA); return; } /* 可维可测: 记录上报PS域迁移指示次数 */ MTC_DEBUG_SndPsTransferInd(enPsTransferCause); return; }
VOS_VOID MTC_ProcCurrCampPlmnInfoForLC(VOS_VOID) { MTC_MODEM_NETWORK_INFO_STRU *pstModem0NetworkInfo = VOS_NULL_PTR; MTC_PS_TRANSFER_ENUM_UINT8 enPsTransferSolution; MTC_RATMODE_ENUM_UINT8 enModem0RateMode; MTC_PS_TRANSFER_CTX_STRU *pstPsTransferCtx = VOS_NULL_PTR; pstPsTransferCtx = MTC_GetPsTransferCtxAddr(); pstModem0NetworkInfo = MTC_GetModemNetworkInfoAddr(MODEM_ID_0); enPsTransferSolution = MTC_GetPsTransferCfg(); enModem0RateMode = MTC_GetModemRatMode(MODEM_ID_0); /* 1、当前驻留网络非禁止plmn 2、单待模式modem0的ps是detach状态,上报PS域迁移指示 */ if ( (MTC_RATMODE_LTE == enModem0RateMode) && (VOS_FALSE == pstModem0NetworkInfo->ucIsForbiddenPlmnFlag) && (VOS_FALSE == pstModem0NetworkInfo->stPsDomainInfo.ucPsAttachAllowFlg)) { /* PS域迁移策略脱网重选,上报网络恢复指示AT命令 */ if (MTC_PS_TRANSFER_LOST_AREA == enPsTransferSolution) { MTC_SndModem0MtaPsTransferInd(MTC_PS_TRANSFER_CAUSE_AREA_AVALIABLE); } /* PS域迁移策略离网重选,上报网络恢复指示AT命令 */ if ((MTC_PS_TRANSFER_OFF_AREA == enPsTransferSolution) && (MTC_PS_TRANSFER_CAUSE_AREA_AVALIABLE == pstPsTransferCtx->enRrcCause)) { MTC_SndModem0MtaPsTransferInd(MTC_PS_TRANSFER_CAUSE_AREA_AVALIABLE); } MTC_SndModem0MmaPsTransferInd(MTC_PS_TRANSFER_CAUSE_AREA_AVALIABLE); } return; }
VOS_VOID MTC_RcvMmaPowerStateInd(VOS_VOID *pMsg) { VOS_UINT32 ulPid; MODEM_ID_ENUM_UINT16 enModemId; MMA_MTC_POWER_STATE_IND_STRU *pstPowerState = VOS_NULL_PTR; MTC_CFG_ENUM_UINT8 enIntrusionCfg; MTC_CFG_ENUM_UINT8 enNotchCfg; MTC_CFG_ENUM_UINT8 enNarrowDcsCfg; MTC_CFG_ENUM_UINT8 enTlRfCtrlCfg; MTC_MODEM_MIPI_CLK_PRI_STRU stMomdemPri; VOS_UINT16 usMipiClk; MTC_PS_TRANSFER_CTX_STRU *pstPsTransferCtx = VOS_NULL_PTR; pstPsTransferCtx = MTC_GetPsTransferCtxAddr(); pstPowerState = (MMA_MTC_POWER_STATE_IND_STRU *)pMsg; ulPid = pstPowerState->stMsgHeader.ulSenderPid; PS_MEM_SET(&stMomdemPri, 0, sizeof(MTC_MODEM_MIPI_CLK_PRI_STRU)); /* 根据 Pid获取modem ID */ enModemId = VOS_GetModemIDFromPid(ulPid); if (enModemId >= MODEM_ID_BUTT) { MTC_ERROR_LOG("MTC_RcvMmaPowerStateInd: Modem ID Err."); return ; } if (MTC_MODEM_POWER_ON == pstPowerState->enPowerState) { /* 如果是开机消息,给接入层发送启用干扰控制指示 */ if (PS_TRUE == MTC_GetIntrusionActionEnableFlag()) { MTC_SndIntrusionActionSetReq(enModemId, PS_TRUE); } } else { /* 收到关机指示时需要重置Modem信息 */ MTC_ResetModemInfo(enModemId); /* 收到关机状态指示,需要将对应modem的重置RfCellInfo,并重新计算bitmap上报给MTA */ if (MTC_CFG_DISABLE != MTC_GetRfLcdIntrusionCfg()) { MTC_InitRfCellInfo(enModemId); /* 根据各modem当前的业务调整优先级 */ MTC_VerdictModemBitMapPri(&stMomdemPri); /* 筛选最佳位图 */ usMipiClk = MTC_ProcLcdMipiClkBitMap(&stMomdemPri); /* 上报LCD MipiClk位图给MTA */ MTC_SndMtaMipiClkInfoInd(usMipiClk); } /* 关机时重置PSTRANSFER的上报状态值 */ if (MODEM_ID_0 == enModemId) { pstPsTransferCtx->enReportCause = MTC_PS_TRANSFER_CAUSE_BUTT; pstPsTransferCtx->enRrcCause = MTC_PS_TRANSFER_CAUSE_BUTT; } } /* 更新本地开关机状态 */ MTC_SetModemPowerState(enModemId, pstPowerState->enPowerState); /* 判断干扰控制是否使能 */ enIntrusionCfg = MTC_GetIntrusionCfg(); if (MTC_CFG_ENABLE == enIntrusionCfg) { /* 干扰控制使能,调用对应Modem的开关机状态变化处理函数 */ MTC_IntrusionModemPowerStateChange(enModemId, pstPowerState->enPowerState); } /* 将当前MTC上下文上报到SDT */ MTC_DEBUG_TraceCtxInfo(); /* 判断Notch裁决是否使能 */ enNotchCfg = MTC_GetNotchCfg(); if (MTC_CFG_ENABLE == enNotchCfg) { /* Notch裁决功能使能,执行Notch裁决 */ MTC_ProcNotchStrategy(); } /* 判断Narrow band dcs裁决是否使能 */ enNarrowDcsCfg = MTC_GetNarrowBandDcsCfg(); if (MTC_CFG_ENABLE == enNarrowDcsCfg) { /* 执行Narrow band dcs裁决 */ MTC_ProcNarrowDcsStrategy(); } /* 根据开关机状态控制TL射频的上行发射 */ enTlRfCtrlCfg = MTC_GetTlRfCtrlCfg(); if (MTC_CFG_ENABLE == enTlRfCtrlCfg) { MTC_TlRfCtrlModemPowerStateChange(enModemId, pstPowerState->enPowerState); } MTC_ProcRseStrategy(); /* 可维可测记录开关机状态上报次数 */ MTC_DEBUG_RcvPowerStateInd(enModemId, pstPowerState->enPowerState); return; }
VOS_VOID MTC_RcvRrcAreaLostInd(VOS_VOID * pMsg) { MODEM_ID_ENUM_UINT16 enModemId; RRC_MTC_AREA_LOST_IND_STRU *pstAreaLostInd = VOS_NULL_PTR; MTC_MODEM_POWER_STATE_ENUM_UINT8 enModem1PowerState; MTC_OPERATOR_CUST_SOLUTION_ENUM_UINT8 enOperatorCustSolution; VOS_BOOL enTestCardFlg; MTC_PS_TRANSFER_CTX_STRU *pstPsTransferCtx = VOS_NULL_PTR; pstPsTransferCtx = MTC_GetPsTransferCtxAddr(); /* GCF测试时不需要启动PSTRANSFER流程,否则导致GCF测试部不通过 */ enTestCardFlg = USIMM_IsTestCard(); if (VOS_TRUE == enTestCardFlg) { return; } pstAreaLostInd = (RRC_MTC_AREA_LOST_IND_STRU*)pMsg; enModemId = VOS_GetModemIDFromPid(pstAreaLostInd->stMsgHeader.ulSenderPid); /* 仅处理Modem0发送的丢网指示 */ if (enModemId != MODEM_ID_0) { MTC_ERROR1_LOG("MTC_RcvRrcAreaLostInd: Err ModemId ", enModemId); return; } /* 未开启PS域迁移策略,只记录次数 */ if (MTC_PS_TRANSFER_NONE == MTC_GetPsTransferCfg()) { /* 可维可测: 记录接收到丢网指示的次数 */ MTC_DEBUG_RcvRrcAreaLostInd(pstAreaLostInd->stMsgHeader.ulSenderPid); return; } /* 运营商定制方案SVLTE或C+L时需要上报AT丢网指示 */ enOperatorCustSolution = MTC_GetOperatorCustSolution(); enModem1PowerState = MTC_GetModemPowerState(MODEM_ID_1); /* 当接入层在业务态或idle态丢网且Modem1开机且卡有效时,上报PS域迁移指示 */ if ((VOS_TRUE == MTC_GetModemUsimValidFlag(enModemId)) && (((MTC_OPERATOR_CUST_CMCC_SVLTE == enOperatorCustSolution) && (MTC_MODEM_POWER_ON == enModem1PowerState)) || (MTC_OPERATOR_CUST_CT_LC == enOperatorCustSolution) )) { if (MTC_PS_TRANSFER_CAUSE_AREA_LOST != pstPsTransferCtx->enReportCause) { MTC_SndModem0MtaPsTransferInd(MTC_PS_TRANSFER_CAUSE_AREA_LOST); /* 通知modem0 gmm丢网,gmm记录全局变量后续detach只做一次减少detach时间 */ MTC_SndModem0GmmRrcAreaLostInd(); } } pstPsTransferCtx->enRrcCause = MTC_PS_TRANSFER_CAUSE_AREA_LOST; /* 可维可测: 记录接收到丢网指示的次数 */ MTC_DEBUG_RcvRrcAreaLostInd(pstAreaLostInd->stMsgHeader.ulSenderPid); return; }