VOS_VOID ADS_ShowEntityStats(VOS_VOID) { VOS_UINT8 i; VOS_UINT8 j; for (i = 0; i < ADS_INSTANCE_MAX_NUM; i++) { vos_printf("ADS Modem i 上行允许发送标识 %d\n", i); for (j = ADS_RAB_ID_MIN; j <= ADS_RAB_ID_MAX; j++) { vos_printf("ADS RabId_%d, 上行允许发送标识 %d\n", j, g_stAdsCtx.astAdsSpecCtx[i].stAdsUlCtx.astAdsUlQueue[j].ucRabSndPermitFlg); if (VOS_NULL_PTR != g_stAdsCtx.astAdsSpecCtx[i].stAdsUlCtx.astAdsUlQueue[j].pstAdsUlLink) { vos_printf("ADS Queue length is %d\n", IMM_ZcQueueLen(g_stAdsCtx.astAdsSpecCtx[i].stAdsUlCtx.astAdsUlQueue[j].pstAdsUlLink)); } vos_printf("ADS DL RabId is %d\r\n", g_stAdsCtx.astAdsSpecCtx[i].stAdsDlCtx.astAdsDlRabInfo[j - ADS_RAB_ID_OFFSET].ucRabId); vos_printf("ADS DL Rcv Func is 0x%x\r\n", g_stAdsCtx.astAdsSpecCtx[i].stAdsDlCtx.astAdsDlRabInfo[j - ADS_RAB_ID_OFFSET].pRcvDlDataFunc); } } vos_printf("ADS上行正在发送标识 %d\n",g_stAdsCtx.stAdsIpfCtx.ucSendingFlg); vos_printf("\r\n"); return; }
VOS_VOID ADS_UL_FreeIpfUlConfigFailSrcMem(VOS_UINT32 ulNeedFreeCnt) { IMM_ZC_HEAD_STRU *pstUlFreeQue = VOS_NULL_PTR; VOS_UINT32 ulQueCnt; VOS_UINT32 ulCnt; IMM_ZC_STRU *pFreeNode = VOS_NULL_PTR; pstUlFreeQue = ADS_UL_IPF_SRCMEM_FREE_QUE(); ulQueCnt = IMM_ZcQueueLen(pstUlFreeQue); if (0 == ulQueCnt) { return; } if (ulNeedFreeCnt > ulQueCnt) { ADS_ERROR_LOG2(ACPU_PID_ADS_UL, "ADS_UL_FreeIpfUlConfigFailSrcMem: Queue Num Less Need Free Num.",ulQueCnt,ulNeedFreeCnt); ADS_DBG_UL_IPF_FREE_SRCMEM_ERROR(1); return; } /*free src mem*/ for (ulCnt = 0; ulCnt < ulNeedFreeCnt; ulCnt++) { pFreeNode = IMM_ZcDequeueTail(pstUlFreeQue); IMM_ZcFree(pFreeNode); ADS_DBG_UL_IPF_FREE_SRCMEM_NUM(1); } return; }
VOS_UINT32 CSD_UL_FreeQueue(IMM_ZC_HEAD_STRU *pstQueue) { IMM_ZC_STRU *pstNode; VOS_UINT32 i; VOS_UINT32 ulQueueCnt; ulQueueCnt = IMM_ZcQueueLen(pstQueue); for (i = 0; i < ulQueueCnt; i++) { pstNode = CSD_UL_GetQueueFrontNode(pstQueue); if(VOS_NULL_PTR == pstNode) { CSD_ERROR_LOG1(ACPU_PID_CSD, "CSD_UL_FreeQueue:: CSD_UL_GetQueueFrontNode fail", pstNode); return VOS_ERR; } /*释放数据内存*/ IMM_ZcFree(pstNode); } CSD_NORMAL_LOG3(ACPU_PID_CSD, "CSD_UL_FreeQueue:: Queue len is %d, Pre is 0x%x, Next is 0x%x", pstQueue->qlen, pstQueue->next, pstQueue->prev); return VOS_OK; }
VOS_VOID ADS_UL_ClearIpfUlSrcMem(VOS_VOID) { IMM_ZC_HEAD_STRU *pstUlFreeQue = VOS_NULL_PTR; VOS_UINT32 ulQueCnt; VOS_UINT32 ulCnt; IMM_ZC_STRU *pstFreeNode = VOS_NULL_PTR; VOS_UINT8 i; VOS_UINT32 ulIpfUlBdNum; pstUlFreeQue = ADS_UL_IPF_SRCMEM_FREE_QUE(); ulQueCnt = IMM_ZcQueueLen(pstUlFreeQue); if (0 == ulQueCnt) { return; } /* 所有的PDP都去激活后,并且BD已经全部空闲,即上行数据全部搬完,才清空上行源内存队列 */ for (i = 0; i < ADS_INSTANCE_MAX_NUM; i++) { if (VOS_FALSE == ADS_UL_CheckAllQueueEmpty(i)) { return; } } #if(FEATURE_OFF == FEATURE_SKB_EXP) ulIpfUlBdNum = BSP_IPF_GetUlDescNum(); #else ulIpfUlBdNum = BSP_IPF_GetUlBDNum(); #endif /* 空闲BD最多63个 */ if (IPF_ULBD_DESC_SIZE != ulIpfUlBdNum) { return; } /*free src mem*/ for (ulCnt = 0; ulCnt < ulQueCnt; ulCnt++) { pstFreeNode = IMM_ZcDequeueHead(pstUlFreeQue); IMM_ZcFree(pstFreeNode); ADS_DBG_UL_IPF_FREE_SRCMEM_NUM(1); } return; }
VOS_VOID ADS_UL_FreeIpfUlConfigSuccSrcMem(VOS_VOID) { IMM_ZC_HEAD_STRU *pstUlFreeQue = VOS_NULL_PTR; VOS_UINT32 ulIdleBD; VOS_UINT32 ulBusyBD; VOS_UINT32 ulCanFree; VOS_UINT32 ulQueCnt; VOS_UINT32 ulCnt; IMM_ZC_STRU *pFreeNode = VOS_NULL_PTR; pstUlFreeQue = ADS_UL_IPF_SRCMEM_FREE_QUE(); ulQueCnt = IMM_ZcQueueLen(pstUlFreeQue); if (0 == ulQueCnt) { return; } /* get busy bd num */ #if(FEATURE_OFF == FEATURE_SKB_EXP) ulIdleBD = BSP_IPF_GetUlDescNum(); #else ulIdleBD = BSP_IPF_GetUlBDNum(); #endif ulBusyBD = IPF_ULBD_DESC_SIZE - ulIdleBD; if (ulQueCnt >= ulBusyBD) { ulCanFree = ulQueCnt - ulBusyBD; } else { ADS_ERROR_LOG2(ACPU_PID_ADS_UL, "ADS_UL_FreeIpfUlSrcMem: Buff Num Less IPF Busy BD Num.",ulQueCnt,ulBusyBD); ADS_DBG_UL_IPF_FREE_SRCMEM_ERROR(1); return; } /*free src mem*/ for (ulCnt = 0; ulCnt < ulCanFree; ulCnt++) { pFreeNode = IMM_ZcDequeueHead(pstUlFreeQue); IMM_ZcFree(pFreeNode); ADS_DBG_UL_IPF_FREE_SRCMEM_NUM(1); } return; }
VOS_VOID ADS_UL_ClearQueue( VOS_UINT8 ucRabId, IMM_ZC_HEAD_STRU *pstQueue ) { VOS_UINT32 i; VOS_UINT32 ulQueueCnt; IMM_ZC_STRU *pstNode; ulQueueCnt = IMM_ZcQueueLen(pstQueue); for (i = 0; i < ulQueueCnt; i++) { pstNode = IMM_ZcDequeueHead(pstQueue); /* 释放结点内容 */ IMM_ZcFree(pstNode); } }
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_UINT32 ulLockLevel; ulLockLevel = 0; 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; } /* 队列加锁 */ VOS_SpinLockIntLock(ADS_UL_GET_QUEUE_LINK_SPINLOCK(ucInstanceIndex, ucRabId), ulLockLevel); /* 结点存在,但队列不存在 */ 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) /* (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_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; }