📄 m803xxint.c
字号:
/*************************************************************************
* Module Name: GAR VOIP File Name: M803xxInt.c
* Create Date: 2003/01/22 Author : Caowm
* Function : M803xx Int Functions
* Version : 1.0
* History :
* Date Version Modifier Activies
*
*************************************************************************/
#include "vxWorks.h"
#include "ctype.h"
#include "string.h"
#include "sysLib.h"
#include "bootLib.h"
#include "stdio.h"
#include "fioLib.h"
#include "private/vmLibP.h"
#include "taskLib.h"
#include "garlib.h"
#include "inetLib.h"
#include "ioLib.h"
#include "logLib.h"
#include "m803xx.h"
#include "Typedef.h"
#include "RTPMIB.h"
#include "t38Fax.h"
/*#include <protocol/port/vxworks/attache.h>*/
#include MPLIB_H
#include "driver/drvLib/include/drvLib.h"
int VoIP_Call_Printf = 0;
int M80320_Printf = 0;
UINT8 M803xx_Stop_PciReq[64] = {0};
UINT32 BUFNULL = 0;
UINT16 OpenchannelFail = 0;
UINT16 ClosechannelFail =0;
UINT16 totalUp = 0;
UINT16 totalDown = 0;
UINT16 UpCount1 = 0;
UINT16 UpCount2 = 0;
UINT16 UpCount3 = 0;
UINT16 DownCount1 = 0;
UINT16 DownCount2 = 0;
UINT8 Send_Flag[M803XX_MAX_PORT_NUM * MAX_PIN_NUM] = {0};
UINT8 M80320_Loop_Call = 0;
UINT32 M80320_DataReq_Num[64] = {0};
UINT32 M80320_PciReq_Num[64] = {0};
UINT32 M80320_PciEOF_Num[64] = {0};
UINT32 M80320_PciDATA_Num[64] = {0};
UINT32 Host_PciEOF_Num[64] = {0};
UINT32 M80320_PciERR_Num[64] = {0};
UINT32 M80320_PciDONE_Num[64] = {0};
UINT32 M80320_ReDataReq_Num[64] ={0};
UINT8 M803xx_Open_Channel_Flag[64] = {0};
UINT32 RXFIFO_FULL = 0;
UINT32 M80320_CmdReq_Num[64] = {0};
UINT32 Host_CmdReq_Num = 0;
UINT32 Tx_Interrupt_Num[8] = {0};
UINT32 Tx_Cmd_Num[8] = {0};
UINT32 Tx_Data_Num[8] = {0};
UINT32 Tx_Req_Num[8] = {0};
UINT32 Tx_Other_Num[8] = {0};
UINT32 Rx_Other_Num[8] = {0};
int M80320_OpenChanMsgFlag = 0;
int drv_DebugPortNo = 0x100;
extern UINT8 Command_Ack[M803XX_MAX_PORT_NUM * MAX_PIN_NUM];
extern UINT8 M80320_Debug[64];
UINT32 OpenChanMsgFull[64] = {0};
extern SEM_ID M803xxOprSem[MAX_PIN_NUM];
/* local defines */
extern void * sysPhysToPci ( void * PhysAddr );
extern void * sysPciToPhys ( void * PciAddr );
extern void * sysVirtToPhys(void *virtAddr);
extern void * sysPhysToVirt(void *physAddr);
extern void* endPktAlloc();
extern void endPktFree(char* buff );
extern STATUS b_pciUnitIntEnable(UINT8 pciUnit);
extern STATUS b_pciUnitIntConnect(UINT8 pciUnit,VOIDFUNCPTR routine,int para);
extern STATUS b_pciIntDisable(UINT8 pciIntNum);
extern UINT16 RemainedTxCmdNum[M803XX_MAX_PORT_NUM * MAX_PIN_NUM];
extern M803xx_PORT_STATE m_port[M803XX_MAX_PORT_NUM * MAX_PIN_NUM];
extern CHANNEL m_channel[PORTS_OF_CHIP * MAX_PIN_NUM];
extern UINT32 PCIM803xx_BASEADDR[MAX_PIN_NUM];
void * PciReadBuf[PORTS_OF_CHIP * MAX_PIN_NUM];
void * M803xxSendBuf[M803XX_MAX_PORT_NUM * MAX_PIN_NUM];
extern SEM_ID M803xxQueueSem[8];
UINT32 M80320_ReCmdReq_Num[64] = {0};
UINT16 RtcpPkt[MAX_PIN_NUM][64];
extern BOOL PinStatus[MAX_PIN_NUM];
extern M80320_QUEUE m_txmbox[MAX_PIN_NUM];
extern M803xx_PORT CON_TO_DP[PORTS_OF_CHIP * MAX_PIN_NUM];
extern M80320_QUEUE m_OpenChannelMailboxQueue[M803XX_MAX_PORT_NUM * MAX_PIN_NUM];
extern M80320_QUEUE m_TxDataQueue[M803XX_MAX_PORT_NUM * MAX_PIN_NUM];
extern MBOX_PACKET Receive_Message[MAX_PIN_NUM][MAX_RX_MSG_NUM];
UINT16 Receive_Message_Num[MAX_PIN_NUM] = {0};
extern PortStatusParameter Parameter[M803XX_MAX_PORT_NUM * MAX_PIN_NUM];
extern unsigned long Swap_DwordM( unsigned long in );
extern RtpSessionValue RtpValue[MAX_CID_NUM];
extern unsigned long RecordRTPTimeStamp[MAX_CID_NUM];
UINT8 SendFlag[64] = {0};
UINT8 ChannelWorkStatus[M803XX_MAX_PORT_NUM * MAX_PIN_NUM]; /* LFXS_DOWN MODE, LFXS_UP MODE */
gChannelOperateCount ChannelOperateCount[M803XX_MAX_PORT_NUM * MAX_PIN_NUM];
UINT8 PinPos[MAX_PIN_NUM] = {0};
void SendMBoxMessage(UINT8 PinNo, int flag, UINT8 PP);
UINT32 Rx_Interrupt_Num[MAX_PIN_NUM] = {0};
int Real_Interrupt_Num[8] = {0};
void initChannelOperateCount(UINT8 slotNum)
{
if (slotNum > MAX_PIN_NUM)
{
return;
}
memset(&(ChannelOperateCount[slotNum -1]),0,sizeof(gChannelOperateCount) * M803XX_MAX_PORT_NUM);
}
void voip_driver_check_qos_dscp(UINT32 *dscp)
{
UINT32 TOS;
TOS = *dscp;
if(TOS > VOIP_DRIVER_IP_PRECEDENCE_MAX)
{
TOS = VOIP_DRIVER_IP_PRECEDENCE_DEFAULT;
}
if((TOS > 0)&&(TOS < 7))
{
TOS = (TOS << 3)& 0x3f;
}
*(UINT32 *)dscp = TOS;
}
/***********************************************************************
* Function name: ReceiveData
* Description : Receive RTP/UDP/IP Packet From M803xx
* Return type : void
* Argument : PortPtr -- Port Status
* PortNo -- No. Of The M803xx Port
* Len -- Length Of The Data
* Addr -- Base Address of the M803xx
* Eof --
* Author/Date : Cao WanMing/2003-1-22
* Note:
*
* Modified History
*------------------------------
* 2006-3-23 17:03 ZhengQishan, 修改收包处理流程
*
*************************************************************************/
LOCAL void ReceiveData(M803xx_PORT_STATE *PortPtr, UINT8 PortNo, UINT16 Len, UINT32 Addr, UINT8 Eof)
{
#if 1
UINT16 ipPktLen;
UINT16 udpPktLen;
#else
ipaddr_t Ipaddr[2];
UINT8 i;
UINT16 UdpPort[2];
UINT32 TOS;
#endif
UINT32 rxBufAddrH,rxBufAddrL;
UINT32 *bufAddr,*buf;
UINT32 Port;
VOIP_MUX_STRUCT Msg;
void *tempAddr;
TRTPHeader* pRTPHdr;
UINT8 *ip_hdrTemp = NULL;
#if 0
UINT8 *udp_hdr;
#endif
#if 0
for(i=0; i<MAX_IP_ADDR_LEN; i++)
{
Ipaddr[0].addr[i] = Parameter[PortNo].localRtpAddress.ipAddr.addr[i];
Ipaddr[1].addr[i] = Parameter[PortNo].remoteRtpAddress.ipAddr.addr[i];
}
UdpPort[0] = Parameter[PortNo].localRtpAddress.port;
UdpPort[1] = Parameter[PortNo].remoteRtpAddress.port;
TOS = Parameter[PortNo].Tos;
voip_driver_check_qos_dscp(&TOS);
#endif
Port = (((UINT32)((CON_TO_DP[m_port[PortNo].Channel].chan)+1)<<16))+((CON_TO_DP[m_port[PortNo].Channel].chip+1)<<24); /* 全局端口号 */
semTake(M803xxQueueSem[PortNo/8], WAIT_FOREVER);
if((m_port[PortNo].status == TalkStatus)||(m_port[PortNo].status == RingGenerateStatus))
{
M803xx_ALLOC_PCI_ADDR(bufAddr,tempAddr,buf);
/*如果申请不到缓冲区,将当前缓冲区再给M80320的固件*/
if (buf == NULL)
{
rxBufAddrH = ((UINT32)((UINT8 *)PciReadBuf[m_port[PortNo].Channel]+PACKET_START_SIZE)) >> 16;
rxBufAddrL = ((UINT32)((UINT8 *)PciReadBuf[m_port[PortNo].Channel]+PACKET_START_SIZE)) & 0x0000ffff;
/*将当前的缓冲区地址告诉M80320固件*/
if (MBOX_QUEUE_FULL == QueueTxBoxMsg(CMD_PCIREQ, 0x400, rxBufAddrH, rxBufAddrL, PortNo))
{
/*如果消息队列满,应该释放缓冲区*/
printf("Cannot put endBuf into M80320!\n");
}
printf("!!!!!!!!!!!!!!M803xx PktAlloc Fail\n");
BUFNULL++;
semGive(M803xxQueueSem[PortNo/8]);
return;
}
rxBufAddrH = ((UINT32)((UINT8 *)bufAddr+PACKET_START_SIZE)) >> 16;
rxBufAddrL = ((UINT32)((UINT8 *)bufAddr+PACKET_START_SIZE)) & 0x0000ffff;
/*将新的缓冲区地址告诉M80320固件*/
if (MBOX_QUEUE_FULL == QueueTxBoxMsg(CMD_PCIREQ, 0x400, rxBufAddrH, rxBufAddrL, PortNo))
{
/*如果消息队列满,应该释放缓冲区*/
printf("Cannot put endBuf into M80320!\n");
}
/*取出当前接收数据的缓冲区地址*/
tempAddr = PciReadBuf[m_port[PortNo].Channel];
/*将新的缓冲地址记录下来,以便下次收包使用*/
PciReadBuf[m_port[PortNo].Channel] = bufAddr;
}
else
{
M803xx_Stop_PciReq[PortNo] = 1;
semGive(M803xxQueueSem[PortNo/8]);
return;
}
semGive(M803xxQueueSem[PortNo/8]);
if (m_port[PortNo].status == RingGenerateStatus)
{
M803xx_ADDR(tempAddr);
endPktFree((char *)tempAddr);
return;
}
/*将PCI地址转换成本地虚拟地址*/
M803xx_ADDR(tempAddr);
/*如果所接收的数据包长度超过缓冲区长度,直接释放然后返回*/
if (Len > 2000)
{
endPktFree((char *)tempAddr);
return;
}
RTCPUpdateTxStatistics(PortNo, Len);
pRTPHdr = (TRTPHeader*)(((UINT8 *)tempAddr)+PACKET_START_SIZE);
RecordRTPTimeStamp[PortNo] = Swap_DwordM(pRTPHdr->RTPTimeStamp);
if(m_port[PortNo].VAD == Voice)
{
RtpValue[PortNo].Sender_Packets++;
RtpValue[PortNo].Sender_Octets += (Len - 12);
}
#if 0
*(UINT32 *)(PciReadBuf[m_port[PortNo].Channel])=Swap_DwordM((0x45000000 | (((TOS & 0x3F) << 18) & 0xfc0000))+(Len+PACKET_START_SIZE));
*(((UINT32 *)(PciReadBuf[m_port[PortNo].Channel]))+1)=0x00000000;
*(((UINT32 *)(PciReadBuf[m_port[PortNo].Channel]))+2)=Swap_DwordM(0x7e110000);
*(((UINT32 *)(PciReadBuf[m_port[PortNo].Channel]))+3)=
Swap_DwordM((UINT32)((((UINT32)(Ipaddr[0].addr[0]))<<24)&0xff000000)
+(((Ipaddr[0].addr[1])<<16)&0x00ff0000)
+(((Ipaddr[0].addr[2])<<8)&0x0000ff00)
+((Ipaddr[0].addr[3])&0x000000ff));
*(((UINT32 *)(PciReadBuf[m_port[PortNo].Channel]))+4)=
Swap_DwordM((UINT32)((((UINT32)(Ipaddr[1].addr[0]))<<24)&0xff000000)
+(((Ipaddr[1].addr[1])<<16)&0x00ff0000)
+(((Ipaddr[1].addr[2])<<8)&0x0000ff00)+
((Ipaddr[1].addr[3])&0x000000ff));
*(((UINT32 *)(PciReadBuf[m_port[PortNo].Channel]))+5)=
Swap_DwordM(((((UINT32)UdpPort[0])<<16)&0xffff0000)+(((UINT32)UdpPort[1])&0x0000ffff));
*(((UINT32 *)(PciReadBuf[m_port[PortNo].Channel]))+6)=
Swap_DwordM(((UINT32)(Len+8)<<16)&0xffff0000);
ip_hdr = (UINT8 *)PciReadBuf[m_port[PortNo].Channel];
#else
ip_hdrTemp = (UINT8 *)tempAddr;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -