📄 m803xxint.c
字号:
PortNo, PortPtr->rx_cmd_fifo[0]);
}
break;
case RESULT_OF_CID_GENERATION:
if(M80320_Debug[PortNo] == 1)
M80320_PRINTF("Port %d, Result of CallerID Generation(0x%x)\n", PortNo, PortPtr->rx_cmd_fifo[0]);
break;
default:
break;
}
break;
case Config_Indication:
switch(funcode)
{
case FUN_SSRCVIOL:
case FUN_SSRCCHG:
M80320_PRINTF("Port %d Receive SSRC 0x%x\n",PortNo, funcode);
break;
case FUN_TONEDET:
if((PortPtr->status != CIDStatus)&&(PortPtr->status != CIDTalkStatus))
{
Tone_Detect_Process(PortNo, PortPtr->rx_cmd_fifo, len);
}
break;
case FUN_EVENTDET:
Event_Detect_Process(PortNo, PortPtr->rx_cmd_fifo, len);
break;
case FUN_VINFOIND:
if(M80320_Debug[PortNo] == 1)M80320_PRINTF("the voice information is :\n");
for (i = 0; i < (len + 1) / 2; i++)
if(M80320_Debug[PortNo] == 1)M80320_PRINTF("the PortNo %d,the %d word value is --> %x",
PortNo, i, PortPtr->rx_cmd_fifo[i]);
if(M80320_Debug[PortNo] == 1)M80320_PRINTF("the voice information OK !!\n");
break;
case FUN_FINFOIND:
if(M80320_Debug[PortNo] == 1)M80320_PRINTF("the FAX information is :\n");
for (i = 0; i < (len + 1) / 2; i++)
if(M80320_Debug[PortNo] == 1)M80320_PRINTF("the PortNo %d,the %d word value is --> %x",
PortNo, i, PortPtr->rx_cmd_fifo[i]);
if(M80320_Debug[PortNo] == 1)M80320_PRINTF("the FAX information OK !!\n");
break;
case FUN_FAXSTATE:
faxRelayStateChangeProcess(PortNo, PortPtr->rx_cmd_fifo, len);
if(M80320_Debug[PortNo] == 1)
M80320_PRINTF("the PortNo %d coming TRAINING MESSAGE word value is --> %x\n",PortNo, PortPtr->rx_cmd_fifo[0]);
break;
default:
break;
}
break;
case Config_Query_Response:
switch(funcode)
{
case FUN_RTCPSTAT:
if(M80320_Debug[PortNo] == 1)M80320_PRINTF("There is Rtcp Statistics query response!\n");
memcpy(RtcpPkt[PinNo], PortPtr->rx_cmd_fifo, len);
break;
default:
break;
}
break;
default:
break;
}
break;
default:
break;
}
memset((void *)PortPtr->rx_cmd_fifo, 0, len);
}
/*************************************************************************/
/* Function name: Recv_Config_Result */
/* Description : */
/*************************************************************************/
LOCAL void Recv_Config_Result(M803xx_PORT_STATE *PortPtr, UINT8 PortNo, UINT16 return_msg)
{
switch(return_msg<<8)
{
case CMD_SETSYNC:
PortPtr->asysynmode = DM_SYNC;
#if M803xx_DEBUG
if(M80320_Debug[PortNo] == 1)M80320_PRINTF("Port %d work in SYNC mode!\n", PortNo);
#endif
#if 0
R12_QUERY[PortNo] = 1;
#endif
break;
case CMD_SETASYN:
PortPtr->asysynmode = DM_ASYN;
#if M803xx_DEBUG
if(M80320_Debug[PortNo] == 1)M80320_PRINTF("Port %d work in ASYN mode!\n", PortNo);
#endif
break;
default:
break;
}
}
/*************************************************************************/
/* Function name: Recv_Channel_Result */
/* Description : 当驱动接收到某个通道有错误的命令响应时,将Reset此通道,*/
/* 然后通过此函数判断通道是否正常 */
/*************************************************************************/
void Recv_Channel_Result(UINT8 Channel, UINT8 result)
{
UINT8 i, Flag = 0, PinNo;
PinNo = CON_TO_DP[Channel].chip;
if(result == 1)
{
if (m_port[m_channel[Channel].Port].Active == LFXS_STOP)
{
printf("Port %d From Stop To Work\n",m_channel[Channel].Port);
m_port[m_channel[Channel].Port].Active = LFXS_DOWN;
}
#if 0
if( (m_channel[Channel].Active == REPAIR)||(m_channel[Channel].Active == FAIL) )
{
m_channel[Channel].Port = 0xff;
m_channel[Channel].Active = IDLE;
m_channel[Channel].Repair_Num = 0;
}
#endif
}
else
{
m_port[m_channel[Channel].Port].Active = LFXS_STOP;
semTake(M803xxQueueSem[PinNo], WAIT_FOREVER);
QueueTxBoxMsg(CMD_CHRESET, 0x0, 0x0, 0x0, m_channel[Channel].Port);
semGive(M803xxQueueSem[PinNo]);
#if 0
semTake(M803xxQueueSem[PinNo], WAIT_FOREVER);
if( m_channel[Channel].Active == LFXS_USE )
{
m_channel[Channel].Active = REPAIR;
for( i=(PinNo*PORTS_OF_CHIP); i<((PinNo+1)*PORTS_OF_CHIP); i++ )
{
if( m_channel[i].Active == IDLE )
{
if (OK == M80320_checkOpenChanQueue(PinNo, 0x0, 0x0))
SendMsgToOpenChannelQueue(CMD_SETTSA|i,
(UINT16)(m_port[m_channel[Channel].Port].Slot), 0x0001, 0x0, i);
m_port[m_channel[Channel].Port].Channel = i;
m_channel[i].Active = LFXS_USE;
m_channel[i].Port = m_channel[Channel].Port;
Flag = 1;
i = (PinNo+1)*PORTS_OF_CHIP;
}
}
if(Flag == 0)
m_port[m_channel[Channel].Port].status = ErrStatus;
QueueTxBoxMsg(CMD_CHRESET, 0x0, 0x0, 0x0, m_channel[Channel].Port);
m_channel[Channel].Repair_Num++ ;
m_channel[Channel].Port = 0xff;
}
else
{
if( m_channel[Channel].Repair_Num < MAX_REPAIR_NUM )
{
m_channel[Channel].Repair_Num++;
QueueTxBoxMsg(CMD_CHRESET, 0x0, 0x0, 0x0, m_channel[Channel].Port);
}
else
m_channel[Channel].Active = FAIL;
}
semGive(M803xxQueueSem[PinNo]);
#endif
}
}
/*************************************************************************/
/* Function name: ReceiveMBoxMessage */
/* Description : Receive M803xx Message */
/* Return type : Void */
/* Argument : PinNo -- No. of the specified Pin */
/* Addr -- Base Address of the M803xx */
/* mbox -- Pointer to the Message */
/* Author/Date : Cao WanMing/2003-1-22 */
/* Note: */
/* */
/*
* Modified History
*
*------------------------------
* 2006-03-15 Modified by ZhengQishan
*
*/
/*************************************************************************/
void ReceiveMBoxMessage(UINT8 PinNo, UINT32 p2, UINT32 p1, UINT32 p0, UINT32 message)
{
MBOX_PACKET tmpbuf;
UINT8 PortNo,Channel;
M803xx_PORT_STATE *PortPtr;
MBOX_PACKET *mbox;
UINT32 rxBufAddrH,rxBufAddrL;
#if 0
UINT32 *bufAddr,*buf;
void *tempAddr;
#endif
UINT32 Addr;
Addr = PCIM803xx_BASEADDR[PinNo];
memset(&tmpbuf,0,sizeof(MBOX_PACKET));
mbox = (MBOX_PACKET *)(&tmpbuf);
mbox->p2 = p2;
mbox->p1 = p1;
mbox->p0 = p0;
mbox->message = message;
Channel = (mbox->message & 0xFF) + PinNo * PORTS_OF_CHIP; /* 通道号 */
PortNo = m_channel[Channel].Port; /* 端口号 */
Real_Interrupt_Num[PinNo] ++;
PortPtr = (M803xx_PORT_STATE *)&m_port[PortNo];
semTake(M803xxOprSem[PinNo], WAIT_FOREVER);
switch(mbox->message & 0xFF00)
{
case CMD_PCIDAT:
M80320_PciDATA_Num[PortNo]++;
/*2006-3-23 17:08 Added by ZhengQishan*/
if (m_port[PortNo].VAD == Fax) /*T38 FAX*/
receiveT38FaxPkt(PortPtr, PortNo, mbox->p0, Addr, 0);
else
ReceiveData(PortPtr, PortNo, mbox->p0, Addr, 0);
break;
case CMD_PCIEOF:
M80320_PciEOF_Num[PortNo]++;
/*2006-3-23 17:08 Added by ZhengQishan*/
if (m_port[PortNo].VAD == Fax) /*T38 FAX*/
receiveT38FaxPkt(PortPtr, PortNo, mbox->p0, Addr, 0);
else
ReceiveData(PortPtr, PortNo, mbox->p0, Addr, 1);
break;
case CMD_DATAREQ:
if(PortPtr->tx_data_requested == 1)
{
M80320_ReDataReq_Num[PortNo]++;
if(M80320_Debug[PortNo] == 1)
M80320_PRINTF("Port (%d) DataReq = %d,PciDone = %d,PciEof = %d\n",
PortNo,M80320_DataReq_Num[PortNo],
M80320_PciDONE_Num[PortNo],
Host_PciEOF_Num[PortNo]);
}
M80320_DataReq_Num[PortNo]++;
semTake(M803xxQueueSem[PinNo], WAIT_FOREVER);
PortPtr->tx_data_requested = 1;/*mbox->p0;*/
semGive(M803xxQueueSem[PinNo]);
if(mbox->p0 < 1024)
{
if(M80320_Debug[PortNo] == 1)
{
M80320_PRINTF("Port %d Receive Datareq Len = %d\n", PortNo, mbox->p0);
}
}
if(Send_Flag[PortNo] == 1)
{
pkt_free((packet *)M803xxSendBuf[PortNo]);
Send_Flag[PortNo] = 0;
}
if(PinStatus[PinNo] == TRUE)
{
#if SEM_FLAG
semTake(M803xxQueueSem[PinNo], WAIT_FOREVER);
#endif
if(SendFlag[PortNo] == 0)
{
SendFlag[PortNo] = 1;
/*为什么还要再一次加入tFwdTask任务队列,这不已经是任务级处理了吗?*/
if (ERROR == fwdJobAdd ((FUNCPTR)SendMBoxMessage, (int)PinNo,0,(int)PortNo,0,0))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -