/***************************************************************************** 函 数 名 : ADS_InitIpfCtx 功能描述 : 初始化和IPF相关的上下文 输入参数 : VOS_VOID 输出参数 : 无 返 回 值 : VOS_VOID 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2012年11月24日 作 者 : l60609 修改内容 : DSDA Phase II: 新生成函数 *****************************************************************************/ VOS_VOID ADS_InitIpfCtx(VOS_VOID) { #if(FEATURE_OFF == FEATURE_SKB_EXP) VOS_UINT8 i; for (i = 0; i < ADS_DL_ADQ_MAX_NUM; i++) { PS_MEM_SET(g_stAdsCtx.stAdsIpfCtx.astIpfDlAdBuff[i], 0x00, IPF_DLAD0_DESC_SIZE * sizeof(IPF_AD_DESC_S)); } /* 初始化上行源内存释放队列 */ IMM_ZcQueueHeadInit(&g_stAdsCtx.stAdsIpfCtx.stUlSrcMemFreeQue); #endif /* 初始化上行BD BUFF*/ PS_MEM_SET(g_stAdsCtx.stAdsIpfCtx.astIpfUlBdBuff, 0x00, IPF_ULBD_DESC_SIZE * sizeof(IPF_CONFIG_ULPARAM_S)); /* 初始化下行RD BUFF*/ PS_MEM_SET(g_stAdsCtx.stAdsIpfCtx.astIpfDlRdBuff, 0x00, IPF_DLRD_DESC_SIZE * sizeof(IPF_RD_DESC_S)); /* 默认上行数据发送保护定时器时长为10ms */ g_stAdsCtx.stAdsIpfCtx.ulProtectTmrLen = 10; /* 默认数据不在发送 */ g_stAdsCtx.stAdsIpfCtx.ucSendingFlg = VOS_FALSE; }
VOS_UINT32 ADS_UL_CreateQueue( VOS_UINT8 ucInstanceIndex, VOS_UINT8 ucRabId, ADS_QCI_TYPE_ENUM_UINT8 enPrio, ADS_CDS_IPF_PKT_TYPE_ENUM_UINT8 enPktType ) { IMM_ZC_HEAD_STRU *pstUlQueue; ADS_UL_CTX_STRU *pstAdsUlCtx; pstAdsUlCtx = ADS_GetUlCtx(ucInstanceIndex); /* RabId的队列已经存在 */ if (VOS_OK == ADS_UL_IsQueueExistent(ucInstanceIndex, ucRabId)) { /* 对应的调度优先级也一样或者是比之前的要低,不更新QCI直接返回OK */ if (enPrio >= pstAdsUlCtx->astAdsUlQueue[ucRabId].enPrio) { return VOS_OK; } /* 如果对应的调度优先级比之前的要高,需要更新该PDP的队列优先级,并对队列管理进行排序 */ else { ADS_UL_UpdateQueueInPdpModified(ucInstanceIndex, enPrio, ucRabId); return VOS_OK; } } /* ucRabID的队列不存在, 需要创建队列头结点 */ pstUlQueue = (IMM_ZC_HEAD_STRU *)PS_MEM_ALLOC(ACPU_PID_ADS_UL, sizeof(IMM_ZC_HEAD_STRU)); if (VOS_NULL_PTR == pstUlQueue) { ADS_ERROR_LOG(ACPU_PID_ADS_UL, "ADS_UL_CreateQueue: pstUlQueue is null"); return VOS_ERR; } /* 队列初始化 */ IMM_ZcQueueHeadInit(pstUlQueue); /* 将队列信息更新到上行上下文 */ ADS_UL_SetQueue(ucInstanceIndex, ucRabId, VOS_TRUE, pstUlQueue, enPrio, enPktType); /* 队列不可能被用尽,一个RABID对应一个队列,而无效的已经在消息处理处屏蔽, 故不需要判断是否满,可以直接重新排序 */ ADS_UL_OrderQueueIndex(ucInstanceIndex, ucRabId); /*lint -e429*/ return VOS_OK; /*lint +e429*/ }
VOS_VOID ADS_InitIpfCtx(VOS_VOID) { VOS_UINT32 ulRst; ADS_NV_DYNAMIC_THRESHOLD_STRU stThreshold; ADS_UL_DYNAMIC_ASSEM_INFO_STRU *pstUlAssemParmInfo; #if(FEATURE_OFF == FEATURE_SKB_EXP) VOS_UINT8 i; for (i = 0; i < ADS_DL_ADQ_MAX_NUM; i++) { PS_MEM_SET(g_stAdsCtx.stAdsIpfCtx.astIpfDlAdBuff[i], 0x00, (VOS_SIZE_T)(IPF_DLAD0_DESC_SIZE * sizeof(IPF_AD_DESC_S))); } /* 初始化上行源内存释放队列 */ IMM_ZcQueueHeadInit(&g_stAdsCtx.stAdsIpfCtx.stUlSrcMemFreeQue); #endif /* 初始化上行BD BUFF*/ PS_MEM_SET(g_stAdsCtx.stAdsIpfCtx.astIpfUlBdBuff, 0x00, (VOS_SIZE_T)(IPF_ULBD_DESC_SIZE * sizeof(IPF_CONFIG_ULPARAM_S))); /* 初始化下行RD BUFF*/ PS_MEM_SET(g_stAdsCtx.stAdsIpfCtx.astIpfDlRdBuff, 0x00, (VOS_SIZE_T)(IPF_DLRD_DESC_SIZE * sizeof(IPF_RD_DESC_S))); /* 默认上行数据发送保护定时器时长为10ms */ g_stAdsCtx.stAdsIpfCtx.ulProtectTmrLen = 10; pstUlAssemParmInfo = &g_stAdsCtx.stAdsIpfCtx.stUlAssemParmInfo; PS_MEM_SET(&stThreshold, 0x00, (VOS_SIZE_T)sizeof(ADS_NV_DYNAMIC_THRESHOLD_STRU)); ulRst = NV_ReadEx(MODEM_ID_0, en_NV_Item_ADS_DYNAMIC_THRESHOLD_CFG, &stThreshold, sizeof(ADS_NV_DYNAMIC_THRESHOLD_STRU)); if(NV_OK != ulRst) { pstUlAssemParmInfo->ulActiveFlag = VOS_FALSE; pstUlAssemParmInfo->ulProtectTmrExpCnt = 0; pstUlAssemParmInfo->stWaterMarkLevel.ulWaterLevel1 = 80; pstUlAssemParmInfo->stWaterMarkLevel.ulWaterLevel2 = 150; pstUlAssemParmInfo->stWaterMarkLevel.ulWaterLevel3 = 500; pstUlAssemParmInfo->stWaterMarkLevel.ulWaterLevel4 = 0xFFFFFFFF; pstUlAssemParmInfo->stThresholdLevel.ulThreshold1 = 1; pstUlAssemParmInfo->stThresholdLevel.ulThreshold2 = 13; pstUlAssemParmInfo->stThresholdLevel.ulThreshold3 = 60; pstUlAssemParmInfo->stThresholdLevel.ulThreshold4 = 64; ADS_ERROR_LOG(ACPU_PID_ADS_UL, "ADS_InitIpfCtx: NV read failed !"); } pstUlAssemParmInfo->ulActiveFlag = stThreshold.ulActiveFlag; pstUlAssemParmInfo->ulProtectTmrExpCnt = stThreshold.ulProtectTmrExpCnt; pstUlAssemParmInfo->stWaterMarkLevel.ulWaterLevel1 = stThreshold.stWaterMarkLevel.ulWaterLevel1; pstUlAssemParmInfo->stWaterMarkLevel.ulWaterLevel2 = stThreshold.stWaterMarkLevel.ulWaterLevel2; pstUlAssemParmInfo->stWaterMarkLevel.ulWaterLevel3 = stThreshold.stWaterMarkLevel.ulWaterLevel3; pstUlAssemParmInfo->stWaterMarkLevel.ulWaterLevel4 = stThreshold.stWaterMarkLevel.ulWaterLevel4; pstUlAssemParmInfo->stThresholdLevel.ulThreshold1 = stThreshold.stThresholdLevel.ulThreshold1; pstUlAssemParmInfo->stThresholdLevel.ulThreshold2 = stThreshold.stThresholdLevel.ulThreshold2; pstUlAssemParmInfo->stThresholdLevel.ulThreshold3 = stThreshold.stThresholdLevel.ulThreshold3; pstUlAssemParmInfo->stThresholdLevel.ulThreshold4 = stThreshold.stThresholdLevel.ulThreshold4; /* 默认上行数据统计定时器时长为100ms */ pstUlAssemParmInfo->stThresholdStatInfo.ulStatTmrLen = 100; pstUlAssemParmInfo->stThresholdStatInfo.ulStatPktNum = 0; /* 超时时长大于零才需要启动jiffies保护定时器 */ if (0 != pstUlAssemParmInfo->ulProtectTmrExpCnt) { pstUlAssemParmInfo->ulProtectTmrCnt = ADS_GET_CURR_KERNEL_TIME(); } /* 默认攒包的最大个数 */ if (VOS_TRUE == pstUlAssemParmInfo->ulActiveFlag) { g_stAdsCtx.stAdsIpfCtx.ulThredHoldNum = ADS_UL_DATA_THRESHOLD_ONE; } else { g_stAdsCtx.stAdsIpfCtx.ulThredHoldNum = 32; } /* 默认数据不在发送 */ g_stAdsCtx.stAdsIpfCtx.ucSendingFlg = VOS_FALSE; }