VOS_VOID CSD_DL_SendData(VOS_VOID) { IMM_ZC_STRU *pstCsdDLMem; CST_CSD_DATA_IND_STRU stDLData; VOS_UINT32 ulDICCNodeCnt; VOS_UINT32 ulRslt; VOS_CHAR *ImmZcData; for ( ; ; ) { /*获取DICC通道发送来数据的个数*/ ulDICCNodeCnt = DICC_GetChannelCurrDataCnt(ACPU_PID_CSD, DICC_CHAN_ID_DL_CSD_DATA_CHAN, DICC_CPU_ID_ACPU); if ( DICC_INVALID_VALUE == ulDICCNodeCnt ) { CSD_ERROR_LOG1(ACPU_PID_CSD, "CSD_DL_SendData :: DICC_GetChannelCurrDataCnt is Wrong", ulDICCNodeCnt); break; } if (0 != ulDICCNodeCnt ) { /*从DICC通道中移出数据*/ ulRslt = DICC_RemoveChannelData(ACPU_PID_CSD, DICC_CHAN_ID_DL_CSD_DATA_CHAN, (VOS_UINT8 *)(&stDLData), DICC_CPU_ID_ACPU); if (DICC_OK != ulRslt) { CSD_ERROR_LOG1(ACPU_PID_CSD, "CSD_DL_SendData:: enMsgId Illage", ulRslt); break; } if (VOS_NULL_PTR == stDLData.pGarbage) { CSD_ERROR_LOG(ACPU_PID_CSD, "CSD_DL_SendData:: stDLData.pGarbage Is Null"); break; } CSD_DBG_DL_RECV_PKT_NUM(1); /*申请sk_buffer内存*/ pstCsdDLMem = IMM_ZcStaticAlloc(stDLData.usLen); if (VOS_NULL_PTR == pstCsdDLMem) { CSD_ERROR_LOG1(ACPU_PID_CSD, "CSD_DL_SendData:: pstCsdDLMem Is Null IMM_ZcStaticAlloc Fail", pstCsdDLMem); /*通知cCpu释放TTFmem*/ IMM_RemoteFreeTtfMem(stDLData.pGarbage); /*此处用continue可能导致死循环*/ break; } /*此步骤不能少用来偏移数据尾指针*/ /* Modified by l60609 for AP适配项目 ,2012-08-31 Begin */ ImmZcData = (VOS_CHAR *)IMM_ZcPut(pstCsdDLMem, stDLData.usLen); /* Modified by l60609 for AP适配项目 ,2012-08-31 End */ PS_MEM_CPY(ImmZcData, (VOS_UINT8 *)TTF_PHY_TO_VIRT((VOS_UINT32)stDLData.pucData), stDLData.usLen); /*发送数据到驱动,第一个参数为pppid目前不使用,由于失败AT会释放内存, 所以此处不需要另行释放a核内存*/ ulRslt = AT_SendCsdZcDataToModem(CSD_UL_GetAtClientIndex(), pstCsdDLMem); if (VOS_OK != ulRslt) { CSD_DBG_DL_SEND_FAIL_NUM(1); CSD_ERROR_LOG(ACPU_PID_CSD, "CSD_DL_SendData:: AT_SendZcDataToModem Fail"); /*通知cCpu释放TTFmem*/ IMM_RemoteFreeTtfMem(stDLData.pGarbage); /*此处用continue可能导致死循环*/ break; } CSD_DBG_DL_SEND_PKT_NUM(1); /*通知cCpu释放TTFmem*/ IMM_RemoteFreeTtfMem(stDLData.pGarbage); } else { /*通道内数据发送完*/ CSD_NORMAL_LOG1(ACPU_PID_CSD, "CSD_DL_SendData Queue is Null", ulDICCNodeCnt); break; } CSD_NORMAL_LOG1(ACPU_PID_CSD, "CSD_DL_SendData Done", ulDICCNodeCnt); } }
VOS_UINT32 ADS_UL_RcvCdsIpPacketMsg(MsgBlock *pMsg) { VOS_UINT32 ulResult; ADS_NDIS_DATA_IND_STRU *pstAdsNdisDataInd; IMM_ZC_STRU *pstZcData; CDS_ADS_DATA_IND_STRU *pstDataInd; VOS_CHAR *pstZcPutData; pstDataInd = (CDS_ADS_DATA_IND_STRU *)pMsg; /* 申请消息 */ pstAdsNdisDataInd = (ADS_NDIS_DATA_IND_STRU *)PS_ALLOC_MSG_WITH_HEADER_LEN( ACPU_PID_ADS_UL, sizeof(ADS_NDIS_DATA_IND_STRU)); if (VOS_NULL_PTR == pstAdsNdisDataInd) { return VOS_ERR; } PS_MEM_SET((VOS_INT8 *)pstAdsNdisDataInd + VOS_MSG_HEAD_LENGTH, 0x00, (VOS_SIZE_T)(sizeof(ADS_NDIS_DATA_IND_STRU) - VOS_MSG_HEAD_LENGTH)); /* 填写消息内容 */ pstAdsNdisDataInd->ulReceiverPid = PS_PID_APP_NDIS; pstAdsNdisDataInd->enMsgId = ID_ADS_NDIS_DATA_IND; pstAdsNdisDataInd->enModemId = pstDataInd->enModemId; pstAdsNdisDataInd->ucRabId = pstDataInd->ucRabId; pstAdsNdisDataInd->enIpPacketType = pstDataInd->enIpPacketType; pstZcData = (IMM_ZC_STRU *)IMM_ZcStaticAlloc((VOS_UINT32)pstDataInd->usLen); if (VOS_NULL_PTR == pstZcData) { PS_MEM_FREE(ACPU_PID_ADS_UL, pstAdsNdisDataInd); return VOS_ERR; } /*此步骤不能少,用来偏移数据尾指针*/ pstZcPutData = (VOS_CHAR *)IMM_ZcPut(pstZcData, pstDataInd->usLen); PS_MEM_CPY(pstZcPutData, pstDataInd->aucData, pstDataInd->usLen); pstAdsNdisDataInd->pstSkBuff = pstZcData; /* 调用VOS发送原语 */ ulResult = PS_SEND_MSG(ACPU_PID_ADS_UL, pstAdsNdisDataInd); if(VOS_OK != ulResult) { ADS_ERROR_LOG(ACPU_PID_ADS_UL, "ADS_UL_RcvCdsIpPacketMsg: Send Msg Fail!"); IMM_ZcFree(pstZcData); return VOS_ERR; } return VOS_OK; }