📄 ixtimesyncacccodelet.c
字号:
{ ixOsalLog (IX_OSAL_LOG_LVL_ERROR, IX_OSAL_LOG_DEV_STDERR, "ixTimeSyncAccCodeletEthInit: this device is not IXP46x\n", 0, 0, 0, 0, 0, 0); return IX_FAIL; } /* check if all NPEs are enabled */ for (channel = 0, npe = IX_FEATURECTRL_NPEA; npe <= IX_FEATURECTRL_NPEC; npe++, channel++) { if (IX_FEATURE_CTRL_COMPONENT_ENABLED != ixFeatureCtrlComponentCheck (npe)) { ixOsalLog (IX_OSAL_LOG_LVL_ERROR, IX_OSAL_LOG_DEV_STDERR, "ixTimeSyncAccCodeletEthInit: %s is not enabled\n", (UINT32) ixTimeSyncAccCodeletTSChannelLabel[channel], 0, 0, 0, 0, 0); return IX_FAIL; } } /* allocate mBufs */ ixTimeSyncAccCodeletUninitFuncMap[IX_TIMESYNCACC_CODELET_MBUF_ALLOC].initialized = TRUE; for (count = 0; count < IX_TIMESYNCACC_CODELET_MAX_TS_CHANNELS; count++) { mBufPtr = ixTimeSyncAccCodeletMbufAllocate (); if (NULL != mBufPtr) { ixTimeSyncAccCodeletGlobalMBuf[count] = mBufPtr; } else { ixOsalLog (IX_OSAL_LOG_LVL_ERROR, IX_OSAL_LOG_DEV_STDERR, "ixTimeSyncAccCodeletEthInit: failed to allocate mBufs\n", 0, 0, 0, 0, 0, 0); return IX_FAIL; } } /* initialize Q Mgr */ if (IX_SUCCESS != ixQMgrInit ()) { ixOsalLog (IX_OSAL_LOG_LVL_ERROR, IX_OSAL_LOG_DEV_STDERR, "ixTimeSyncAccCodeletEthInit: failed to initialize queue manager\n", 0, 0, 0, 0, 0, 0); return IX_FAIL; } ixTimeSyncAccCodeletUninitFuncMap[IX_TIMESYNCACC_CODELET_Q_MGR].initialized = TRUE; /* start Q Mgr dispatcher */ if (IX_SUCCESS != ixTimeSyncAccCodeletDispatcherStart ()) { ixOsalLog (IX_OSAL_LOG_LVL_ERROR, IX_OSAL_LOG_DEV_STDERR, "ixTimeSyncAccCodeletEthInit: failed to start queue manager dispatch loop\n", 0, 0, 0, 0, 0, 0); return IX_FAIL; } ixTimeSyncAccCodeletUninitFuncMap[IX_TIMESYNCACC_CODELET_DISPATCHER].initialized = TRUE; /* initialize NPE message handler */ if (IX_SUCCESS != ixNpeMhInitialize (IX_NPEMH_NPEINTERRUPTS_YES)) { ixOsalLog (IX_OSAL_LOG_LVL_ERROR, IX_OSAL_LOG_DEV_STDERR, "ixTimeSyncAccCodeletEthInit: failed to initialize NPE Message Handler\n", 0, 0, 0, 0, 0, 0); return IX_FAIL; } ixTimeSyncAccCodeletUninitFuncMap[IX_TIMESYNCACC_CODELET_NPE_MH].initialized = TRUE; /* download NPE A's image with basic Ethernet Rx/Tx and activate NPE A */ if (IX_SUCCESS != ixNpeDlNpeInitAndStart (IX_NPEDL_NPEIMAGE_NPEA_ETH)) { ixOsalLog (IX_OSAL_LOG_LVL_ERROR, IX_OSAL_LOG_DEV_STDERR, "ixTimeSyncAccCodeletEthInit: failed to initialize and start NPE A\n", 0, 0, 0, 0, 0, 0); return IX_FAIL; } ixTimeSyncAccCodeletUninitFuncMap[IX_TIMESYNCACC_CODELET_NPE_A].initialized = TRUE; ixTimeSyncAccCodeletUninitFuncMap[IX_TIMESYNCACC_CODELET_NPE_DL].initialized = TRUE; /* download NPE B's image with basic Ethernet Rx/Tx and activate NPE B */ if (IX_SUCCESS != ixNpeDlNpeInitAndStart (IX_NPEDL_NPEIMAGE_NPEB_ETH)) { ixOsalLog (IX_OSAL_LOG_LVL_ERROR, IX_OSAL_LOG_DEV_STDERR, "ixTimeSyncAccCodeletEthInit: failed to initialize and start NPE B\n", 0, 0, 0, 0, 0, 0); return IX_FAIL; } ixTimeSyncAccCodeletUninitFuncMap[IX_TIMESYNCACC_CODELET_NPE_B].initialized = TRUE; /* download NPE C's image with basic Ethernet Rx/Tx and activate NPE C */ if (IX_SUCCESS != ixNpeDlNpeInitAndStart (IX_NPEDL_NPEIMAGE_NPEC_ETH)) { ixOsalLog (IX_OSAL_LOG_LVL_ERROR, IX_OSAL_LOG_DEV_STDERR, "ixTimeSyncAccCodeletEthInit: failed to initialize and start NPE C\n", 0, 0, 0, 0, 0, 0); return IX_FAIL; } ixTimeSyncAccCodeletUninitFuncMap[IX_TIMESYNCACC_CODELET_NPE_C].initialized = TRUE; /* initialize Ethernet Access component */ if (IX_ETH_ACC_SUCCESS != ixEthAccInit()) { ixOsalLog (IX_OSAL_LOG_LVL_ERROR, IX_OSAL_LOG_DEV_STDERR, "ixTimeSyncAccCodeletEthInit: failed to initialize Ethernet access driver\n", 0, 0, 0, 0, 0, 0); return IX_FAIL; } ixTimeSyncAccCodeletUninitFuncMap[IX_TIMESYNCACC_CODELET_ETH_ACC].initialized = TRUE; /* initialize all ethernet ports */ for (portId = IX_ETH_PORT_1; portId <= IX_ETH_PORT_3; portId++) { if (IX_ETH_ACC_SUCCESS != ixEthAccPortInit (portId)) { ixOsalLog (IX_OSAL_LOG_LVL_ERROR, IX_OSAL_LOG_DEV_STDERR, "ixTimeSyncAccCodeletEthInit: failed to initialize Ethernet port %d\n", portId, 0, 0, 0, 0, 0); return IX_FAIL; } } ixTimeSyncAccCodeletUninitFuncMap[IX_TIMESYNCACC_CODELET_ETH_PORTS].initialized = TRUE; /* spawn new thread to transmit PTP message from each NPEs */ if (IX_SUCCESS != ixTimeSyncAccCodeletNewThreadCreate ((IxOsalVoidFnPtr)ixTimeSyncAccCodeletPTPMsgTransmit, "Tx Thread")) { ixOsalLog (IX_OSAL_LOG_LVL_ERROR, IX_OSAL_LOG_DEV_STDERR, "ixTimeSyncAccCodeletEthInit: failed to spawn Tx Thread\n", 0, 0, 0, 0, 0, 0); return IX_FAIL; } ixTimeSyncAccCodeletUninitFuncMap[IX_TIMESYNCACC_CODELET_TX_PTP].initialized = TRUE; return IX_SUCCESS;} /* end of ixTimeSyncAccCodeletEthInit function *//** * @ingroup IxTimeSyncAccCodelet * * @fn ixTimeSyncAccCodeletPortDisable () * * @brief Disable all ports * * @return void */PRIVATE void ixTimeSyncAccCodeletPortDisable (){ IxEthAccPortId portId; IxEthAccStatus status; for (portId = IX_ETH_PORT_1; portId <= IX_ETH_PORT_3; portId++) { status = ixEthAccPortDisable (portId); if (IX_ETH_ACC_SUCCESS != status) { ixOsalLog (IX_OSAL_LOG_LVL_ERROR, IX_OSAL_LOG_DEV_STDERR, "ixTimeSyncAccCodeletPortDisable: failed to disable port %d, error code %d\n", portId, status, 0, 0, 0, 0); } }} /* end of ixTimeSyncAccCodeletPortDisable function *//** * @ingroup IxTimeSyncAccCodelet * * @fn ixTimeSyncAccCodeletMbufAllocate () * * @brief Allocate memory for mBuf and its associated data buffer * * @return * @li IX_OSAL_MBUF * - successfully allocated memory for mBuf * @li NULL - fail */PRIVATE IX_OSAL_MBUF *ixTimeSyncAccCodeletMbufAllocate (){ IX_OSAL_MBUF *mBufPtr; UINT8 *dataPtr; /* Allocate cache-aligned memory for mbuf header */ mBufPtr = (IX_OSAL_MBUF *) IX_OSAL_CACHE_DMA_MALLOC (sizeof (IX_OSAL_MBUF)); if (NULL == mBufPtr) { ixOsalLog (IX_OSAL_LOG_LVL_ERROR, IX_OSAL_LOG_DEV_STDERR, "ixTimeSyncAccCodeletMbufAllocate: failed to allocate memory for mBuf\n", 0, 0, 0, 0, 0, 0); return NULL; } /* initialize mBuf */ memset (mBufPtr, 0, sizeof (IX_OSAL_MBUF)); /* Allocate cache-aligned memory for mbuf data */ dataPtr = (UINT8 *) IX_OSAL_CACHE_DMA_MALLOC (IX_TIMESYNCACC_CODELET_UDP_FRAME_LEN); if (NULL == dataPtr) { ixOsalLog (IX_OSAL_LOG_LVL_ERROR, IX_OSAL_LOG_DEV_STDERR, "ixTimeSyncAccCodeletMbufAllocate: failed to allocate memory for mBuf's data buffer\n", 0, 0, 0, 0, 0, 0); return NULL; } /* initialize mBuf's data buffer */ memset (dataPtr, 0, IX_TIMESYNCACC_CODELET_UDP_FRAME_LEN); /* Fill in mbuf header fields */ IX_OSAL_MBUF_MDATA (mBufPtr) = dataPtr; IX_OSAL_MBUF_ALLOCATED_BUFF_DATA (mBufPtr) = (UINT32)dataPtr; IX_OSAL_MBUF_MLEN (mBufPtr) = IX_TIMESYNCACC_CODELET_UDP_FRAME_LEN; IX_OSAL_MBUF_ALLOCATED_BUFF_LEN (mBufPtr) = IX_TIMESYNCACC_CODELET_UDP_FRAME_LEN; IX_OSAL_MBUF_PKT_LEN (mBufPtr) = IX_TIMESYNCACC_CODELET_UDP_FRAME_LEN; return mBufPtr;} /* end of ixTimeSyncAccCodeletMbufAllocate function *//** * @ingroup IxTimeSyncAccCodelet * * @fn ixTimeSyncAccCodeletMbufsFree () * * @brief Free all allocated mBufs and their associated data buffer * * @return void */PRIVATE void ixTimeSyncAccCodeletMbufsFree (){ UINT32 count; IX_OSAL_MBUF *mBufPtr; UINT8 *dataPtr; /* free mBufs */ for (count = 0; count < IX_TIMESYNCACC_CODELET_MAX_TS_CHANNELS; count++) { mBufPtr = ixTimeSyncAccCodeletGlobalMBuf[count]; if (NULL != mBufPtr) { dataPtr = (UINT8 *) IX_OSAL_MBUF_MDATA (mBufPtr); if (NULL != dataPtr) { IX_OSAL_CACHE_DMA_FREE (dataPtr); } IX_OSAL_CACHE_DMA_FREE (mBufPtr); ixTimeSyncAccCodeletGlobalMBuf[count] = NULL; } } } /* end of ixTimeSyncAccCodeletMbufsFree function *//** * @ingroup IxTimeSyncAccCodelet * * @fn ixTimeSyncAccCodeletDispatcherStart () * * @brief Hook the QM QLOW dispatcher to the interrupt controller * * @return IX_STATUS * @li IX_SUCCESS - all function operations complete successfully * @li IX_FAIL - any operation fails */PRIVATE IX_STATUS ixTimeSyncAccCodeletDispatcherStart (){ /* get dispatcher function pointer, this should be initialized once */ ixQMgrDispatcherLoopGet(&ixTimeSyncAccCodeletDispatcherFunc); if (NULL == ixTimeSyncAccCodeletDispatcherFunc) { ixOsalLog (IX_OSAL_LOG_LVL_ERROR, IX_OSAL_LOG_DEV_STDERR, "ixTimeSyncAccCodeletDispatcherStart: failed to get dispatcher function pointer\n", 0, 0, 0, 0, 0, 0); return IX_FAIL; } /* Hook the QM QLOW dispatcher to the interrupt controller */ if (IX_SUCCESS != ixOsalIrqBind(IX_OSAL_IXP400_QM1_IRQ_LVL, (IxOsalVoidFnVoidPtr)(ixTimeSyncAccCodeletDispatcherFunc), (void *)IX_QMGR_QUELOW_GROUP)) { ixOsalLog (IX_OSAL_LOG_LVL_ERROR, IX_OSAL_LOG_DEV_STDERR, "ixTimeSyncAccCodeletDispatcherStart: failed to hook QM QLOW dispatcher to the interrupt controller\n", 0, 0, 0, 0, 0, 0); return IX_FAIL; } return (IX_SUCCESS);} /* end of ixTimeSyncAccCodeletDispatcherStart function *//** * @ingroup IxTimeSyncAccCodelet * * @fn ixTimeSyncAccCodeletDispatcherStop () * * @brief Unbind to QM1 interrupt * * @return void */PRIVATE void ixTimeSyncAccCodeletDispatcherStop (){ if (IX_SUCCESS != ixOsalIrqUnbind (IX_OSAL_IXP400_QM1_IRQ_LVL)) { ixOsalLog (IX_OSAL_LOG_LVL_ERROR, IX_OSAL_LOG_DEV_STDERR, "ixTimeSyncAccCodeletDispatcherStop: failed to unbind to QM1 interrupt\n", 0, 0, 0, 0, 0, 0); }} /* end of ixTimeSyncAccCodeletDispatcherStop function *//** * @ingroup IxTimeSyncAccCodelet * * @fn ixTimeSyncAccCodeletDummyCB ( UINT32 cbTag, IX_OSAL_MBUF* mBufPtr, UINT32 reserved) * * @brief Rx callback. TimeSync codelet does not handle receiving PTP message. * Thus, this function is just a dummy function. Rx callback registration * is required by ethernet component. * * @param * cbTag UINT32 [in] - argument passed to callback * * @param * mBufPtr IX_OSAL_MBUF* [in] - pointer to mBuf * * @param * reserved UINT32 [in] - reserved parameter * * @return void */PRIVATE voidixTimeSyncAccCodeletDummyCB ( UINT32 cbTag, IX_OSAL_MBUF *mBufPtr, UINT32 reserved){} /* end of ixTimeSyncAccCodeletDummyCB function *//** * @ingroup IxTimeSyncAccCodelet * * @fn ixTimeSyncAccCodeletTxDoneCB ( UINT32 cbTag, IX_OSAL_MBUF* mBufPtr, * * @brief Tx callback. This function gives semaphore to allow * ixTimeSyncAccCodeletPTPMsgTransmit function to transmit * next PTP message. * * @param * cbTag UINT32 [in] - argument passed to callback * * @param * mBufPtr IX_OSAL_MBUF* [in] - pointer to mBuf * * @return void */PRIVATE void ixTimeSyncAccCodeletTxDoneCB ( UINT32 cbTag, IX_OSAL_MBUF* mBufPtr){ if (IX_SUCCESS != ixOsalSemaphorePost (&ixTimeSyncAccCodeletSemId)) { ixOsalLog (IX_OSAL_LOG_LVL_ERROR, IX_OSAL_LOG_DEV_STDERR, "ixTimeSyncAccCodeletTxDoneCB: Failed to give semaphore, port Id %d\n", cbTag, 0, 0, 0, 0, 0); }} /* end of ixTimeSyncAccCodeletTxDoneCB function *//** * @ingroup IxTimeSyncAccCodelet * * @fn ixTimeSyncAccCodeletPortConfigure ( IxEthAccPortId portId) *
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -