📄 m803xxint.c
字号:
/*拷贝IP + UDP头*/
memcpy(ip_hdrTemp, Parameter[PortNo].t38FaxArg.ipUdpHeader, PACKET_START_SIZE);
/*insert IP length*/
ipPktLen = Len + UDP_HEADER_LEN + IPV4_HEADER_LEN;
*(ip_hdrTemp + IPV4_PKT_LEN_OFFSET) = (ipPktLen >> 8)& 0xFF;
*(ip_hdrTemp + IPV4_PKT_LEN_OFFSET + 1) = (ipPktLen)& 0xFF;
/*Inser UDP length*/
udpPktLen = Len + UDP_HEADER_LEN;
*(ip_hdrTemp + UDP_PKT_LEN_OFFSET) = (udpPktLen >> 8)& 0xFF;
*(ip_hdrTemp + UDP_PKT_LEN_OFFSET + 1) = (udpPktLen)& 0xFF;
#endif
#if 0
SET_IP_HEADER_HEADER_CHECKSUM(ip_hdr, 0);
SET_IP_HEADER_HEADER_CHECKSUM(ip_hdr, SWAP16(~GLUE_CKSUM(ip_hdr,
(GET_IP_HEADER_HEADER_LENGTH(ip_hdr) << 1))));
#else
SET_IP_HEADER_HEADER_CHECKSUM (ip_hdrTemp, 0);
SET_IP_HEADER_HEADER_CHECKSUM (ip_hdrTemp,
ROS_HTONS(~GLUE_CKSUM(ip_hdrTemp,(GET_IP_HEADER_HEADER_LENGTH(ip_hdrTemp) << 1))) );
#endif
#if 0 /*暂时不需要校验和*/
udp_hdr = PciReadBuf[m_port[PortNo].Channel]+20;
{
UINT8 pseudo_hdr[SIZEOF_IP_PSEUDO_HEADER];
MEMSET(pseudo_hdr, 0, sizeof(pseudo_hdr));
MEMCPY(PTR_IP_PSEUDO_HEADER_DESTINATION_ADDRESS(pseudo_hdr),
PTR_IPADDR_BITS(&Ipaddr[1]), SIZEOF_IP_ADDRESS);
MEMCPY(PTR_IP_PSEUDO_HEADER_SOURCE_ADDRESS(pseudo_hdr),
PTR_IPADDR_BITS(&Ipaddr[0]), SIZEOF_IP_ADDRESS);
SET_IP_PSEUDO_HEADER_PROTOCOL(pseudo_hdr, IP_PROTOCOL_is_UDP);
SET_IP_PSEUDO_HEADER_PAYLOAD_LENGTH(pseudo_hdr, Len + 8);
SET_UDP_HEADER_CHECKSUM(udp_hdr, SWAP16(GLUE_CKSUM(pseudo_hdr,
SIZEOF_IP_PSEUDO_HEADER >> 1)));
SET_UDP_HEADER_CHECKSUM(udp_hdr, SWAP16(~GLUE_CKSUM(udp_hdr,
(Len + 8 + 1) >> 1)));
if (GET_UDP_HEADER_CHECKSUM(udp_hdr) == 0)
SET_UDP_HEADER_CHECKSUM(udp_hdr, 0xFFFF);
}
#endif /*0*/
Msg.mestype = RTP_PACKET;
Msg.portno = Port; /* 全局端口号 */
Msg.msgLen = Len+PACKET_START_SIZE;
Msg.mesptr = (UINT32 *)tempAddr;
M803xxMsgProcess((VOIP_MUX_STRUCT *)&Msg);
}
/*-----------------------------
* M80320_checkOpenChanQueue - 检查Open channel队列是否有空闲处理下一个消息
*
* Argument:
* UINT8 PortNo - 等于(slot - 1) * 8 (第一个槽位最多8个端口) + port - 1
* UINT16 msgFIFOLen - 此消息要写入FIFO的字节数
* UINT16 funID - 要执行的命令的ID号
*
* 说明:
*
* Return:
* OK - 有能力处理下一个消息
* ERROR - 没有能力处理下一个消息
*
* Modified history
*------------------------------
* 2006-6-2 10:13 ZhengaQishan Created.
*
*
*/
STATUS M80320_checkOpenChanQueue(UINT8 PortNo, UINT16 msgFIFOLen, UINT16 funID)
{
if((RemainedTxCmdNum[PortNo] + (msgFIFOLen + 1) / 2) > MAX_LEN_OF_CMD_FIFO)
{
printf("Functin ID: 0x%x, Port %d Add Cmd FIFO is FULL\n", funID, PortNo);
return ERROR;
}
if(m_OpenChannelMailboxQueue[PortNo].QCount >= m_OpenChannelMailboxQueue[PortNo].QSize)
{
printf("Functin ID: 0x%x, Port %d Open Channel Mailbox Queue is FULL\n", funID, PortNo);
OpenChanMsgFull[PortNo]++;
return ERROR;
}
return OK;
}
/*************************************************************************/
/* Function name: SendMsgToOpenChannelQueue */
/* Description : Write Message To The M803xx's Open Channel Queue */
/* Return type : void */
/* Argument : msg -- Message ID of Message */
/* p0 -- Parameter 1 of Messge */
/* p1 -- Parameter 2 of Message */
/* p2 -- Parameter 3 of Message */
/* PortNo -- No. Of The Specified Port */
/* Author/Date : Cao WanMing/2003-1-25 */
/* Note: */
/* */
/*************************************************************************/
UINT8 SendMsgToOpenChannelQueue(UINT16 msg, UINT16 p0, UINT16 p1, UINT16 p2, UINT8 PortNo)
{
UINT16 loop, loopCnt, InCmd;
UINT16 put, *TxBoxBase;
UINT8 Return_Flag = SENDTOM803xxOK;
put = m_OpenChannelMailboxQueue[PortNo].QPut;
TxBoxBase = (UINT16 *)m_OpenChannelMailboxQueue[PortNo].QAddr;
TxBoxBase[put++] = p2;
TxBoxBase[put++] = p1;
TxBoxBase[put++] = p0;
TxBoxBase[put++] = msg|((m_port[PortNo].Channel)%PORTS_OF_CHIP);
if (put == m_OpenChannelMailboxQueue[PortNo].QSize)
put = 0;
m_OpenChannelMailboxQueue[PortNo].QPut = put;
m_OpenChannelMailboxQueue[PortNo].QCount += 4;
if((M80320_OpenChanMsgFlag == 1) && (drv_DebugPortNo == PortNo))
{
printf("PortNo(%d) (Snd) Msg: %04x %04x %04x %04x ", PortNo, msg, p0, p1, p2);
InCmd = m_port[PortNo].InCmd;
/*p0 中的消息长度是以字节为单位,FIFO是以双字节存放的*/
loopCnt = ((p0 & 0xFF) + 1)/2 ;
/*FIFO是以环方式存放的*/
/*InCmd 是数组下标,从0开始,loopCnt是记数器,从1开始*/
if (InCmd >= (loopCnt -1))
InCmd -= loopCnt;
else
InCmd = MAX_LEN_OF_CMD_FIFO + 2 -loopCnt;
for (loop = 0; loop < loopCnt; loop ++)
{
printf("%04x ", m_port[PortNo].tx_cmd_fifo[InCmd]);
if( ++InCmd >= MAX_LEN_OF_CMD_FIFO)
InCmd = 0;
}
printf("\n");
}
if((m_port[PortNo].tx_cmd_requested == 1)&&(PinStatus[CON_TO_DP[m_port[PortNo].Channel].chip] == TRUE)&&(m_port[PortNo].Ackok == 1))
{
if(SendFlag[PortNo] == 0)
{
SendFlag[PortNo] = 1;
if (ERROR == fwdJobAdd ((FUNCPTR)SendMBoxMessage, (int)(CON_TO_DP[m_port[PortNo].Channel].chip)&0xff,0,(int)PortNo,0,0))
{
if(M80320_Debug[PortNo] == 1)
M80320_PRINTF("Port %d JobAdd Err\n", m_port[PortNo].Channel);
/* 需要如何处理 */
ASSERT(0);
Return_Flag = ADD_FWD_TASK_ERR;
}
}
else
{
if(M80320_Debug[PortNo] == 1)
M80320_PRINTF("SendMsgToOpenChannelQueue: SendFlag[%d] = 1\n", PortNo);
}
}
return Return_Flag;
}
/*************************************************************************/
/* Function name: SendMsgToTxDataQueue */
/* Description : Write Message To The M803xx's Tx Data Queue */
/* Return type : void */
/* Argument : Addr -- Tx Data Addr */
/* Len -- Tx Data Len */
/* PortNo -- No. Of The Specified Port */
/* Author/Date : Cao WanMing/2003-1-25 */
/* Note: */
/* */
/*************************************************************************/
void SendMsgToTxDataQueue(UINT32 Addr, UINT16 Len, UINT8 PortNo, packet * p)
{
UINT16 put, *TxBoxBase;
UINT32 txBufAddrH,txBufAddrL;
UINT32 *tempAddr1 = NULL;
put = m_TxDataQueue[PortNo].QPut;
TxBoxBase = (UINT16 *)m_TxDataQueue[PortNo].QAddr;
/*M803xx_PCI_ADDR(((UINT32 *)Addr));*/
tempAddr1 = (UINT32 *)Addr;
M803xx_PCI_ADDR(tempAddr1);
Addr = (UINT32)tempAddr1;
txBufAddrH = (Addr >> 16) & 0xFFFF;
txBufAddrL = Addr & 0x0000ffff;
TxBoxBase[put++] = txBufAddrL;
TxBoxBase[put++] = txBufAddrH;
TxBoxBase[put++] = Len;
TxBoxBase[put++] = CMD_PCIEOF|((m_port[PortNo].Channel)%PORTS_OF_CHIP);
txBufAddrH = (((UINT32)p) >> 16) & 0xFFFF;
txBufAddrL = ((UINT32)p) & 0x0000ffff;
TxBoxBase[put++] = txBufAddrL;
TxBoxBase[put++] = txBufAddrH;
if (put == m_TxDataQueue[PortNo].QSize)
put = 0;
m_TxDataQueue[PortNo].QPut = put;
m_TxDataQueue[PortNo].QCount += 6;
if((m_port[PortNo].tx_data_requested != 0)&&(PinStatus[CON_TO_DP[m_port[PortNo].Channel].chip] == TRUE))
{
if(SendFlag[PortNo] == 0)
{
SendFlag[PortNo] = 1;
if (ERROR == fwdJobAdd ((FUNCPTR)SendMBoxMessage, (int)(CON_TO_DP[m_port[PortNo].Channel].chip),0,(int)PortNo,0,0))
{
if(M80320_Debug[PortNo] == 1)
M80320_PRINTF("Port %d JobAdd Err\n", m_port[PortNo].Channel);
/* 需要如何处理 */
}
}
}
}
/************************************************************************
* Function name: QueueTxBoxMsg
* Description : Write Message To The M803xx's Cmd Queue
* Return type : void
* Argument : msg -- Message ID of Message
* p0 -- Parameter 1 of Messge
* p1 -- Parameter 2 of Message
* p2 -- Parameter 3 of Message
* PortNo -- No. Of The Specified Port
* Author/Date : Cao WanMing/2003-1-22
* Note:
*
*************************************************************************/
UINT8 QueueTxBoxMsg(UINT32 msg, UINT32 p0, UINT32 p1, UINT32 p2, UINT8 PortNo)
{
UINT16 put;
UINT16 *TxBoxBase;
UINT8 PinNo;
UINT8 Return_Flag = SENDTOM803xxOK;
#if 0
if(M80320_Debug[PortNo] == 1)
M80320_PRINTF("Port %d QueueTxBoxMsg msg = %x, p0 = %x, p1 = %x, p2 = %x\n", PortNo, msg, p0, p1, p2);
#endif
PinNo = CON_TO_DP[m_port[PortNo].Channel].chip;
put = m_txmbox[PinNo].QPut;
if(m_txmbox[PinNo].QCount < m_txmbox[PinNo].QSize)
{
TxBoxBase = (UINT16 *)m_txmbox[PinNo].QAddr;
TxBoxBase[put++] = p2;
TxBoxBase[put++] = p1;
TxBoxBase[put++] = p0;
TxBoxBase[put++] = msg|((m_port[PortNo].Channel)%PORTS_OF_CHIP);
if (put == m_txmbox[PinNo].QSize)
put = 0;
m_txmbox[PinNo].QPut = put;
m_txmbox[PinNo].QCount += 4;
}
else
{
printf("Port %d Message Queue Full, Msg: %x\n", PortNo, msg);
Return_Flag = MBOX_QUEUE_FULL;
}
if(SendFlag[PortNo] == 0)
{
SendFlag[PortNo] = 1;
if (ERROR == fwdJobAdd ((FUNCPTR)SendMBoxMessage, (int)(PinNo)&0xff,0,(int)PortNo,0,0))
{
if(M80320_Debug[PortNo] == 1)
{
M80320_PRINTF("JobAdd Err\n");
}
/* 需要如何处理 */
}
}
return Return_Flag;
}
/*************************************************************************/
/* Function name: Recv_CMD_Result */
/* Description : After Command Has Been Sent To M803xx, Command Result */
/* Can Be Read From Mailbox And Fifo To Check The Command */
/* Issue Has Succeeded Or Failed. */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -