IMM_ZC_STRU *CSD_UL_GetQueueFrontNode(IMM_ZC_HEAD_STRU *pstQueue) { IMM_ZC_STRU *pstNode; /* Modified by l60609 for AP适配项目 ,2012-08-31 Begin */ VOS_UINT32 ulLockLevel; ulLockLevel = 0; /* 队列加锁 */ VOS_SpinLockIntLock(&g_stCsdCtx.stSpinLock, ulLockLevel); /* 返回队尾节点指针 */ pstNode = IMM_ZcDequeueHead(pstQueue); /* 队列解锁 */ VOS_SpinUnlockIntUnlock(&g_stCsdCtx.stSpinLock, ulLockLevel); /* Modified by l60609 for AP适配项目 ,2012-08-31 End */ CSD_NORMAL_LOG3(ACPU_PID_CSD, "CSD_UL_GetQueueFrontNode:: Queue len is %d, Pre is 0x%x, Next is 0x%x", pstQueue->qlen, pstQueue->next, pstQueue->prev); return pstNode; }
IMM_ZC_STRU *CSD_UL_GetQueueFrontNode(IMM_ZC_HEAD_STRU *pstQueue) { IMM_ZC_STRU *pstNode; VOS_ULONG ulLockLevel; ulLockLevel = 0; /* 队列加锁 */ VOS_SpinLockIntLock(&g_stCsdCtx.stSpinLock, ulLockLevel); /* 返回队尾节点指针 */ pstNode = IMM_ZcDequeueHead(pstQueue); /* 队列解锁 */ VOS_SpinUnlockIntUnlock(&g_stCsdCtx.stSpinLock, ulLockLevel); CSD_NORMAL_LOG3(ACPU_PID_CSD, "CSD_UL_GetQueueFrontNode:: Queue len is %d, Pre is 0x%x, Next is 0x%x", pstQueue->qlen, pstQueue->next, pstQueue->prev); return pstNode; }
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); } }
IMM_ZC_STRU* ADS_UL_GetInstanceNextQueueNode( VOS_UINT8 ucInstanceIndex, VOS_UINT8 *pucRabId ) { VOS_UINT32 i; VOS_UINT8 *pucCurIndex; ADS_UL_CTX_STRU *pstAdsUlCtx; IMM_ZC_STRU *pstNode; pstAdsUlCtx = ADS_GetUlCtx(ucInstanceIndex); pucCurIndex = &pstAdsUlCtx->ucAdsUlCurIndex; pstNode = VOS_NULL_PTR; /* 优先级方式 */ for (i = 0; i < ADS_RAB_NUM_MAX; i++) { /* 因为队列已经有序,当前队列无效则代表后面所有队列都无效 需跳过后面所有无效队列,继续从头查找 */ if (VOS_NULL_PTR == ADS_UL_GET_QUEUE_LINK_INFO(ucInstanceIndex, *pucCurIndex)) { i += ADS_RAB_NUM_MAX - (*pucCurIndex + 1U); *pucCurIndex = 0; continue; } /* 队列为有效队列但无数据时,继续向后查找 */ if (0 == ADS_UL_GET_QUEUE_LINK_INFO(ucInstanceIndex, *pucCurIndex)->qlen) { /* 发送下一个队列的数据时,将本队列记录数清空 */ ADS_UL_CLR_RECORD_NUM_IN_WEIGHTED(ucInstanceIndex, *pucCurIndex); *pucCurIndex = (*pucCurIndex + 1) % ADS_RAB_NUM_MAX; continue; } /* 当前队列不允许发送, 继续向后查找 */ if (VOS_FALSE == ADS_UL_GET_RAB_SND_PERMIT_FLAG(ucInstanceIndex, ADS_UL_GET_PRIO_QUEUE_INDEX(ucInstanceIndex, *pucCurIndex))) { *pucCurIndex = (*pucCurIndex + 1) % ADS_RAB_NUM_MAX; continue; } /* 根据优先级等级对应的加权数发送数据 */ /* 优先级高的先发送 */ if (ADS_UL_GET_RECORD_NUM_IN_WEIGHTED(ucInstanceIndex, *pucCurIndex) < ADS_UL_GET_QUEUE_PRI_WEIGHTED_NUM(ucInstanceIndex, *pucCurIndex)) { /* 获取队列头结点 */ pstNode = IMM_ZcDequeueHead(ADS_UL_GET_QUEUE_LINK_INFO(ucInstanceIndex, *pucCurIndex)); /* 获取该结点的RabId */ *pucRabId = ADS_UL_GET_PRIO_QUEUE_INDEX(ucInstanceIndex, *pucCurIndex); /* 本队列记录数增加 1*/ ADS_UL_SET_RECORD_NUM_IN_WEIGHTED(ucInstanceIndex, *pucCurIndex, 1); /* 如果已经发送完本队列的优先级加权数个数的数据,则跳到下个队列发送数据 */ if (ADS_UL_GET_RECORD_NUM_IN_WEIGHTED(ucInstanceIndex, *pucCurIndex) == ADS_UL_GET_QUEUE_PRI_WEIGHTED_NUM(ucInstanceIndex, *pucCurIndex)) { /* 发送下一个队列的数据时,将本队列记录数清空 */ ADS_UL_CLR_RECORD_NUM_IN_WEIGHTED(ucInstanceIndex, *pucCurIndex); *pucCurIndex = (*pucCurIndex + 1) % ADS_RAB_NUM_MAX; } break; } } return pstNode; }