VOS_VOID ADS_DL_InitFcAssemParamInfo(VOS_VOID) { ADS_DL_FC_ASSEM_STRU *pstFcAssemInfo; pstFcAssemInfo = ADS_DL_GET_FC_ASSEM_INFO_PTR(ADS_INSTANCE_INDEX_0); pstFcAssemInfo->ulEnableMask = VOS_FALSE; pstFcAssemInfo->ulFcActiveFlg = VOS_FALSE; pstFcAssemInfo->ulTmrCnt = ADS_GET_CURR_KERNEL_TIME(); pstFcAssemInfo->ulRdCnt = 0; pstFcAssemInfo->ulRateUpLev = 0; pstFcAssemInfo->ulRateDownLev = 0; pstFcAssemInfo->ulExpireTmrLen = 0; pstFcAssemInfo->pFcAssemTuneFunc = VOS_NULL_PTR; return; }
VOS_UINT32 ADS_UL_InsertQueue( VOS_UINT8 ucInstanceIndex, IMM_ZC_STRU *pstData, VOS_UINT8 ucRabId ) { VOS_UINT32 ulNonEmptyEvent; VOS_UINT32 ulAllUlQueueDataNum; #if(FEATURE_OFF == FEATURE_SKB_EXP) VOS_UINT ulQueueLen; #endif VOS_ULONG ulLockLevel; ulNonEmptyEvent = VOS_FALSE; /* 此接口不释放pstData,由上层模块根据函数返回值判断是否需要释放内存 */ /* 判断RabId是否为有效值 */ if (VOS_OK != ADS_IsValidRabId(ucRabId)) { ADS_WARNING_LOG1(ACPU_PID_ADS_UL, "ADS_UL_InsertQueue: ucRabId is", ucRabId); return VOS_ERR; } /* 队列加锁 */ /*lint -e571*/ VOS_SpinLockIntLock(ADS_UL_GET_QUEUE_LINK_SPINLOCK(ucInstanceIndex, ucRabId), ulLockLevel); /*lint +e571*/ /* 结点存在,但队列不存在 */ if (VOS_OK != ADS_UL_IsQueueExistent(ucInstanceIndex, ucRabId)) { /* 队列操作完成解锁 */ VOS_SpinUnlockIntUnlock(ADS_UL_GET_QUEUE_LINK_SPINLOCK(ucInstanceIndex, ucRabId), ulLockLevel); ADS_WARNING_LOG(ACPU_PID_ADS_UL, "ADS_UL_InsertQueue:the queue is not ext!"); return VOS_ERR; } #if(FEATURE_OFF == FEATURE_SKB_EXP) ulQueueLen = IMM_ZcQueueLen(ADS_UL_GET_QUEUE_LINK_PTR(ucInstanceIndex, ucRabId)); if (ulQueueLen >= ADS_UL_GET_MAX_QUEUE_LENGTH(ucInstanceIndex)) { /* 队列操作完成解锁 */ VOS_SpinUnlockIntUnlock(ADS_UL_GET_QUEUE_LINK_SPINLOCK(ucInstanceIndex, ucRabId), ulLockLevel); ADS_DBG_UL_DROPPED_PACKET_NUM(1); return VOS_ERR; } /* 插入队列前将数据打上时间戳 */ pstData->tstamp.tv64 = (VOS_INT64)VOS_GetSlice(); #endif /* 插入队列 */ IMM_ZcQueueTail(ADS_UL_GET_QUEUE_LINK_PTR(ucInstanceIndex, ucRabId), pstData); /* 队列由空变为非空 */ if (1 == IMM_ZcQueueLen(ADS_UL_GET_QUEUE_LINK_PTR(ucInstanceIndex, ucRabId))) { ulNonEmptyEvent = VOS_TRUE; } /* 队列操作完成解锁 */ VOS_SpinUnlockIntUnlock(ADS_UL_GET_QUEUE_LINK_SPINLOCK(ucInstanceIndex, ucRabId), ulLockLevel); ulAllUlQueueDataNum = ADS_UL_GetAllQueueDataNum(); #if(FEATURE_OFF == FEATURE_SKB_EXP) if (VOS_TRUE == ADS_UL_GET_THRESHOLD_ACTIVE_FLAG()) { /* (1).jiffies超时,则直接触发发数,并停止发数定时器 (2).队列中数据已到攒包门限且当前没有在处理数据,触发上行缓存缓存处理事件 (3).队列由空变为非空时启动数据统计定时器以及保护定时器 */ ADS_UL_ADD_STAT_PKT_NUM(1); /* 超时长度为非零则需要启动触发发数 */ if (0 != ADS_UL_GET_JIFFIES_EXP_TMR_LEN()) { if (ADS_TIME_AFTER_EQ(ADS_GET_CURR_KERNEL_TIME(), (ADS_UL_GET_JIFFIES_TMR_CNT() + ADS_UL_GET_JIFFIES_EXP_TMR_LEN()))) { ADS_UL_SndEvent(ADS_UL_EVENT_DATA_PROC); ADS_StopTimer(ACPU_PID_ADS_UL, TI_ADS_UL_SEND, ADS_TIMER_STOP_CAUSE_USER); ADS_UL_SET_JIFFIES_TMR_CNT(ADS_GET_CURR_KERNEL_TIME()); return VOS_OK; } } if (ADS_UL_IS_REACH_THRESHOLD_DYNAMIC(ulAllUlQueueDataNum, ADS_UL_GET_SENDING_FLAG())) { ADS_UL_SndEvent(ADS_UL_EVENT_DATA_PROC); } /* 队列由空变为非空 */ if (VOS_TRUE == ulNonEmptyEvent) { ADS_StartTimer(ACPU_PID_ADS_UL, TI_ADS_UL_DATA_STAT, ADS_UL_GET_STAT_TIMER_LEN()); ADS_StartTimer(ACPU_PID_ADS_UL, TI_ADS_UL_SEND, ADS_UL_GET_PROTECT_TIMER_LEN()); } } else { /* (1).队列由空变为非空时触发上行缓存处理事件 (2).队列中数据已到攒包门限的整数倍且当前没有在处理数据 触发上行缓存缓存处理事件 */ if (VOS_TRUE == ulNonEmptyEvent) { ADS_UL_SndEvent(ADS_UL_EVENT_DATA_PROC); } else { if (ADS_UL_IS_REACH_THRESHOLD(ulAllUlQueueDataNum, ADS_UL_GET_SENDING_FLAG())) { ADS_UL_SndEvent(ADS_UL_EVENT_DATA_PROC); } } } #else /* (1).从TCP/IP协议栈过来的的数据,ucTailPktInd为0. 当队列由空到非空, 或是达到攒包门限且当前没有在数据处理时触发上行缓存处理事件. (2).USB过来的数据非最后一个包ucTailPktInd为2,最后一个包ucTailPktInd为1 当为最后一个IP包, 或是达到攒包门限且当前没有在数据处理时触发上行缓存处理事件. */ if (0 == pstData->private_mem.ucTailPktInd) { if ((VOS_TRUE == ulNonEmptyEvent) || (ADS_UL_IS_REACH_THRESHOLD(ulAllUlQueueDataNum, ADS_UL_GET_SENDING_FLAG()))) { ADS_UL_SndEvent(ADS_UL_EVENT_DATA_PROC); } } else { if ((1 == pstData->private_mem.ucTailPktInd) || (ADS_UL_IS_REACH_THRESHOLD(ulAllUlQueueDataNum, ADS_UL_GET_SENDING_FLAG()))) { ADS_UL_SndEvent(ADS_UL_EVENT_DATA_PROC); } } #endif return VOS_OK; }
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; }