📄 hfctlpmc.c
字号:
#if 0
logMsg("HFCtlIoctl.HFCTL_WRITE_FIFO: pDestBuffer = 0x%8x.\n", (int)pDestBuffer, 0, 0, 0, 0, 0);
#endif /* if 0 */
for(i = 0; i < pHfctlRamBlk->count; i++)
{
*pDestBuffer = *pSrcBuffer++;
}
return(OK);
case HFCTL_INIT_SEND_FIFO: /* Init TX FIFO */
pFlagAdrs = (unsigned long *)(pHfctlDev->boardDataSpace0 + HFCTL_DEV_SEND_FIFO_INIT_FLAG_BASE_ADRS);
pDestBuffer = (unsigned long *)(pHfctlDev->boardDataSpace0 + HFCTL_FIFO_OFFSET);
pSrcBuffer = (unsigned long *)&iTemp;
*pFlagAdrs = 1;
for(i = 0; i < 5; i++)
{
*pDestBuffer = *pSrcBuffer;
}
*pFlagAdrs = 0;
*pDestBuffer = *pSrcBuffer;
return(OK);
case HFCTL_READ_RX_FIFO: /* read RX FIFO */
pHfctlRamBlk = (HFCTL_RAM_BLOCK *)(iParam);
pSrcBuffer = (unsigned long *)(pHfctlDev->boardDataSpace0 + HFCTL_RX_FIFO_OFFSET);
pDestBuffer = (unsigned long *)(pHfctlRamBlk->buffer);
for(i = 0; i < pHfctlRamBlk->count; i++)
{
*pDestBuffer++ = *pSrcBuffer;
}
return(OK);
case HFCTL_WRITE_RX_FIFO: /* write RX FIFO */
#if 0
logMsg("HFCtlIoctl.HFCTL_WRITE_RX_FIFO: enter.\n", 0, 0, 0, 0, 0, 0);
#endif /* if 0 */
pHfctlRamBlk = (HFCTL_RAM_BLOCK *)(iParam);
pDestBuffer = (unsigned long *)(pHfctlDev->boardDataSpace0 + HFCTL_RX_FIFO_OFFSET);
pSrcBuffer = (unsigned long *)(pHfctlRamBlk->buffer);
#if 0
logMsg("HFCtlIoctl.HFCTL_WRITE_RX_FIFO: pDestBuffer = 0x%8x.\n", (int)pDestBuffer, 0, 0, 0, 0, 0);
#endif /* if 0 */
for(i = 0; i < pHfctlRamBlk->count; i++)
{
*pDestBuffer = *pSrcBuffer++;
}
return(OK);
case HFCTL_INIT_RX_FIFO: /* Init RX FIFO */
pFlagAdrs = (unsigned long *)(pHfctlDev->boardDataSpace0 + HFCTL_DEV_RX_FIFO_INIT_FLAG_BASE_ADRS);
pSrcBuffer = (unsigned long *)(pHfctlDev->boardDataSpace0 + HFCTL_RX_FIFO_OFFSET);
*pFlagAdrs = 1;
for(i = 0; i < 5; i++)
{
iTemp1 = *pSrcBuffer;
}
*pFlagAdrs = 0;
return(OK);
case HFCTL_READ_DEHFDATA_FIFO: /* read DeHFData FIFO */
pHfctlRamBlk = (HFCTL_RAM_BLOCK *)(iParam);
pSrcBuffer = (unsigned long *)(pHfctlDev->boardDataSpace0 + HFCTL_DEHFDATA_FIFO_OFFSET);
pDestBuffer = (unsigned long *)(pHfctlRamBlk->buffer);
for(i = 0; i < pHfctlRamBlk->count; i++)
{
*pDestBuffer++ = *pSrcBuffer;
}
return(OK);
case HFCTL_WRITE_DEHFDATA_FIFO: /* write DeHFData FIFO */
#if 0
logMsg("HFCtlIoctl.HFCTL_WRITE_DEHFDATA_FIFO: enter.\n", 0, 0, 0, 0, 0, 0);
#endif /* if 0 */
pHfctlRamBlk = (HFCTL_RAM_BLOCK *)(iParam);
pDestBuffer = (unsigned long *)(pHfctlDev->boardDataSpace0 + HFCTL_DEHFDATA_FIFO_OFFSET);
pSrcBuffer = (unsigned long *)(pHfctlRamBlk->buffer);
#if 0
logMsg("HFCtlIoctl.HFCTL_WRITE_DEHFDATA_FIFO: pDestBuffer = 0x%8x.\n", (int)pDestBuffer, 0, 0, 0, 0, 0);
#endif /* if 0 */
for(i = 0; i < pHfctlRamBlk->count; i++)
{
*pDestBuffer = *pSrcBuffer++;
}
return(OK);
case HFCTL_INIT_DEHFDATA_FIFO: /* Init DeHFData FIFO */
pFlagAdrs = (unsigned long *)(pHfctlDev->boardDataSpace0 + HFCTL_DEV_DEHFDATA_FIFO_INIT_FLAG_BASE_ADRS);
pDestBuffer = (unsigned long *)(pHfctlDev->boardDataSpace0 + HFCTL_DEHFDATA_FIFO_OFFSET);
pSrcBuffer = (unsigned long *)&iTemp;
*pFlagAdrs = 1;
for(i = 0; i < 5; i++)
{
*pDestBuffer = *pSrcBuffer;
}
*pFlagAdrs = 0;
*pDestBuffer = *pSrcBuffer;
return(OK);
case HFCTL_ENABLE_DEHFDATA_FIFO_OUTPUT: /* Enable DeHFData FIFO Output */
pFlagAdrs = (unsigned long *)(pHfctlDev->boardDataSpace0 + HFCTL_DEV_DEHFDATA_FIFO_RD_EN_FLAG_BASE_ADRS);
*pFlagAdrs = 1;
return(OK);
case HFCTL_DISABLE_DEHFDATA_FIFO_OUTPUT: /* Disable DeHFData FIFO Output */
pFlagAdrs = (unsigned long *)(pHfctlDev->boardDataSpace0 + HFCTL_DEV_DEHFDATA_FIFO_RD_EN_FLAG_BASE_ADRS);
*pFlagAdrs = 0;
return(OK);
case HFCTL_WAIT_RXFIFO_DATA:
#if 0
logMsg("HFCtlIoctl.HFCTL_WAIT_RXFIFO_DATA: Enter.\n", 0, 0, 0, 0, 0, 0);
logMsg("HFCtlIoctl.HFCTL_WAIT_RXFIFO_DATA: iParam = %d.\n", iParam, 0, 0, 0, 0, 0);
#endif /* if 0 */
iResult = semTake(pHfctlDev->semRxFifoRdy, iParam);
#if 0
if (iResult == ERROR)
{
logMsg("HFCtlIoctl.HFCTL_WAIT_LOCAL_DATA: semTake() ERROR.\n", 0, 0, 0, 0, 0, 0);
}
#endif /* if 0 */
return(iResult);
case HFCTL_QUERY_DEHF_DATA_RDY_FLAG:
#if 0
logMsg("HFCtlIoctl.HFCTL_QUERY_DEHF_DATA_RDY_FLAG: Enter.\n", 0, 0, 0, 0, 0, 0);
logMsg("HFCtlIoctl.HFCTL_QUERY_DEHF_DATA_RDY_FLAG: iParam = %d.\n", iParam, 0, 0, 0, 0, 0);
#endif /* if 0 */
pDestBuffer = (unsigned long *)(pHfctlDev->boardDataSpace0 + HFCTL_DEV_DEHFDATA_RDY_FLAG_BASE_ADRS);
*(UINT32*)iParam = *pDestBuffer;
return(OK);
case HFCTL_CLEAR_DEHF_DATA_RDY_FLAG:
#if 0
logMsg("HFCtlIoctl.HFCTL_CLEAR_DEHF_DATA_RDY_FLAG: Enter.\n", 0, 0, 0, 0, 0, 0);
logMsg("HFCtlIoctl.HFCTL_CLEAR_DEHF_DATA_RDY_FLAG: iParam = %d.\n", iParam, 0, 0, 0, 0, 0);
#endif /* if 0 */
pDestBuffer = (unsigned long *)(pHfctlDev->boardDataSpace0 + HFCTL_DEV_DEHFDATA_RDY_FLAG_BASE_ADRS);
*pDestBuffer = 0;
return(OK);
case HFCTL_SET_DEHF_DATA_RDY_FLAG:
#if 0
logMsg("HFCtlIoctl.HFCTL_CLEAR_DEHF_DATA_RDY_FLAG: Enter.\n", 0, 0, 0, 0, 0, 0);
logMsg("HFCtlIoctl.HFCTL_CLEAR_DEHF_DATA_RDY_FLAG: iParam = %d.\n", iParam, 0, 0, 0, 0, 0);
#endif /* if 0 */
pDestBuffer = (unsigned long *)(pHfctlDev->boardDataSpace0 + HFCTL_DEV_DEHFDATA_RDY_FLAG_BASE_ADRS);
*pDestBuffer = 1;
return(OK);
case HFCTL_QUERY_DEHF_DATA_BUF_FLAG:
#if 0
logMsg("HFCtlIoctl.HFCTL_QUERY_DEHF_DATA_BUF_FLAG: Enter.\n", 0, 0, 0, 0, 0, 0);
logMsg("HFCtlIoctl.HFCTL_QUERY_DEHF_DATA_BUF_FLAG: iParam = %d.\n", iParam, 0, 0, 0, 0, 0);
#endif /* if 0 */
pDestBuffer = (unsigned long *)(pHfctlDev->boardDataSpace0 + HFCTL_DEV_DEHFDATA_BUF_FLAG_BASE_ADRS);
*(UINT32*)iParam = *pDestBuffer;
return(OK);
case HFCTL_CLEAR_DEHF_DATA_BUF_FLAG:
pDestBuffer = (unsigned long *)(pHfctlDev->boardDataSpace0 + HFCTL_DEV_DEHFDATA_BUF_FLAG_BASE_ADRS);
*pDestBuffer = 0;
return(OK);
case HFCTL_CLEAR_PCI_INT:
/* clear local interrupt */
pciWriteLong((int)(pHfctlDev->boardDataSpace0 + HFCTL_CARD_LINT_CLR_REG), ulTemp);
return(OK);
case HFCTL_CLEAR_PCI_INT_VECTOR:
/* clear local interrupt */
pDestBuffer = (unsigned long *)(pHfctlDev->boardDataSpace0 + HFCTL_CARD_LINT_VECTOR_REG_BASE_ADRS);
*pDestBuffer = 0;
return(OK);
case HFCTL_GET_WORK_STATUS:
/* get working status */
pDestBuffer = (unsigned long *)(pHfctlDev->boardDataSpace0 + HFCTL_DEV_WORK_STATE_FLAG_BASE_ADRS);
*(UINT32*)iParam = *pDestBuffer;
return(OK);
case HFCTL_SET_WORK_STATUS:
/* get working status */
pDestBuffer = (unsigned long *)(pHfctlDev->boardDataSpace0 + HFCTL_DEV_WORK_STATE_FLAG_BASE_ADRS);
*pDestBuffer = (unsigned long)iParam;
return(OK);
case HFCTL_CLEAR_WORK_STATUS:
/* clear working status */
pDestBuffer = (unsigned long *)(pHfctlDev->boardDataSpace0 + HFCTL_DEV_WORK_STATE_FLAG_BASE_ADRS);
*pDestBuffer = 0;
return(OK);
case HFCTL_SW_RESET_HFCTL_DEV:
/* reset the HfCtl PMC card */
pDestBuffer = (unsigned long *)(pHfctlDev->boardDataSpace0 + HFCTL_DEV_SW_RESET_CTL_REG_BASE_ADRS);
*pDestBuffer = 0;
return(OK);
case HFCTL_DO_DMA:
return(OK);
break;
}
return (ERROR);
}
/******************************************************************************
TITLE: HFCtlIntHandle
DESC: PCI interrupt handler for hop freq control PMC card
PARAM: none
RETURN: none
******************************************************************************/
void HFCtlIntHandle(HFCTL_DEV *pHfctlDev)
{
int i = 0;
int iOldLevel; /* current interrupt level mask */
unsigned long ulIntCsrValue;
unsigned long ulIntClrValue = 1;
unsigned long ulIntVecValue = 0;
unsigned long ulIntVecRd = 0;
unsigned long ulIntVecWr = 0;
unsigned long ulIntVecTempRd = 0;
unsigned long *pIntVecAdrs = NULL;
iPciIntCount++;
#if 0
logMsg("HFCtlIntHandle: receive PCI interrupt %d\n", iPciIntCount, 0, 0, 0, 0, 0);
#endif /* if 0 */
pIntVecAdrs = (unsigned long *)(pHfctlDev->boardDataSpace0 + HFCTL_CARD_LINT_VECTOR_REG_BASE_ADRS);
#if 0
logMsg("HFCtlIntHandle: pIntVecAdrs = 0x%.8x\n", (int)pIntVecAdrs, 0, 0, 0, 0, 0);
#endif /* if 0 */
iOldLevel = intLock();
ulIntCsrValue = pciReadLong((int)(pHfctlDev->pciControllerSpace0 + PLX9656_RT_REG_INTCSR_PCI));
ulIntVecValue = *pIntVecAdrs;
intUnlock (iOldLevel);
#if 0
logMsg("HFCtlIntHandle: PLX9656 INTCSR = 0x%.8x\n", ulIntCsrValue, 0, 0, 0, 0, 0);
logMsg("HFCtlIntHandle: PLX9656 INTVECTOR = 0x%.8x\n", ulIntVecValue, 0, 0, 0, 0, 0);
#endif /* if 0 */
if ((ulIntCsrValue & DATA_BIT11) && (ulIntCsrValue & DATA_BIT15))
{
i9656LocalIntCount++;
/* clear local interrupt */
pciWriteLong((int)(pHfctlDev->boardDataSpace0 + HFCTL_CARD_LINT_CLR_REG), ulIntClrValue);
#if 1
/* judge local interrupt vector to decide which interrupt source */
if ((ulIntVecValue & DATA_BIT0) && (ulIntVecValue & DATA_BIT2))
{
i9656LintTxHFDataRdyCount++;
semGive(pHfctlDev->semLocalData);
#if 1
ulIntVecRd = *pIntVecAdrs;
#if 0
logMsg("HFCtlIntHandle.LintTxHFDataRdy: ulIntVecRd = 0x%.8x\n", ulIntVecRd, 0, 0, 0, 0, 0);
#endif /* if 0 */
#else
ulIntVecRd = ulIntVecValue;
#endif /* if 0 */
ulIntVecWr = ulIntVecRd & ((~DATA_BIT0) & (~DATA_BIT2));
#if 0
logMsg("HFCtlIntHandle.LintTxHFDataRdy: ulIntVecWr = 0x%.8x\n", ulIntVecWr, 0, 0, 0, 0, 0);
#endif /* if 0 */
*pIntVecAdrs = ulIntVecWr;
#if 0
logMsg("HFCtlIntHandle.LintTxHFDataRdy: after set Int Vector\n", 0, 0, 0, 0, 0, 0);
ulIntVecTempRd = *pIntVecAdrs;
logMsg("HFCtlIntHandle.LintTxHFDataRdy: ulIntVecTempRd = 0x%.8x\n", ulIntVecTempRd, 0, 0, 0, 0, 0);
#endif /* if 0 */
}
#if 1
if ((ulIntVecValue & DATA_BIT1) && (ulIntVecValue & DATA_BIT3))
{
i9656LintRxFifoRdyCount++;
semGive(pHfctlDev->semRxFifoRdy);
#if 1
ulIntVecRd = *pIntVecAdrs;
#if 0
logMsg("HFCtlIntHandle.LintRxFifoRdy: ulIntVecRd = 0x%.8x\n", ulIntVecRd, 0, 0, 0, 0, 0);
#endif /* if 0 */
#else
ulIntVecRd = ulIntVecValue;
#endif /* if 0 */
ulIntVecWr = ulIntVecRd & ((~DATA_BIT1) & (~DATA_BIT3));
#if 0
logMsg("HFCtlIntHandle.LintRxFifoRdy: ulIntVecWr = 0x%.8x\n", ulIntVecWr, 0, 0, 0, 0, 0);
#endif /* if 0 */
*pIntVecAdrs = ulIntVecWr;
#if 0
logMsg("HFCtlIntHandle.LintRxFifoRdy: after set Int Vector\n", 0, 0, 0, 0, 0, 0);
ulIntVecTempRd = *pIntVecAdrs;
logMsg("HFCtlIntHandle.LintRxFifoRdy: ulIntVecTempRd = 0x%.8x\n", ulIntVecTempRd, 0, 0, 0, 0, 0);
#endif /* if 0 */
#if 0
/* use to detect Vector Write ERROR */
ulIntVecTempRd = *pIntVecAdrs;
if (ulIntVecTempRd != ulIntVecWr)
{
iPciIntExecCount++;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -