//---------------------------------------------------------------------------
//
// Function:        VEthApiXmit
//
// Description:     Transmit a TX frame
//
// Parameters:      pData_p = point to packet buffer
//                  wDataSize = size of packet
//
// Returns:         kEplApiInvalidParam - maximum MTU is reached
//                  kEplDllAsyncTxBuffer - internal buffer is full
//                  kEplInvalidOperation - Send not allowed in this state
//                  kEplSuccessful - message sent successfully
//
// State:
//
//---------------------------------------------------------------------------
tEplKernel PUBLIC VEthApiXmit(BYTE *pData_p, WORD wDataSize)
{
    tEplKernel      Ret = kEplSuccessful;
    tEplFrameInfo   FrameInfo;
    tEplNmtState    NmtState;

    //check POWERLINK state
    NmtState = EplNmtuGetNmtState();
    if(NmtState <= kEplNmtCsNotActive || NmtState == kEplNmtMsNotActive)
    {
        Ret =  kEplInvalidOperation;
        EPL_DBGLVL_VETH_TRACE("VEthXmit: Error while transmitting! Invalid "
                "state: 0x%x!\n", NmtState);
        goto Exit;
    }

    //check MTU
    if(wDataSize > VEthInstance_g.m_wMtu)
    {
        Ret = kEplApiInvalidParam;
        EPL_DBGLVL_VETH_TRACE("VEthXmit: Error while transmitting! MTU is set to "
                "%d and frame has size %d!\n", VEthInstance_g.m_wMtu, wDataSize);
        goto Exit;
    }

    //save frame and size
    FrameInfo.m_pFrame = (tEplFrame *)pData_p;
    FrameInfo.m_uiFrameSize = wDataSize;

    //call send function on DLL
    Ret = EplDllkCalAsyncSend(&FrameInfo, kEplDllAsyncReqPrioGeneric, kEplDllAsyncBuffVeth);
    switch(Ret)
    {
        case kEplSuccessful:
            //set stats for the device
            VEthInstance_g.m_Statistics.m_dwMsgsent++;
            goto Exit;
        case kEplDllAsyncTxBufferFull:
            //buffer is full
            VEthInstance_g.m_Statistics.m_dwTxBufferFull++;
            goto Exit;
        default:
            EPL_DBGLVL_VETH_TRACE("VEthXmit: EplDllkCalAsyncSend returned 0x%02X\n", Ret);
            goto Exit;
    }

Exit:
    return Ret;
}
Exemplo n.º 2
0
static  int  EplLinProcRead (
    char* pcBuffer_p,
    char** ppcStart_p,
    off_t Offset_p,
    int nBufferSize_p,
    int* pEof_p,
    void* pData_p)
{

int             nSize;
int             Eof;
#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_DLLK)) != 0)
tEplDllkCalStatistics* pDllkCalStats;
#endif

    nSize = 0;
    Eof   = 0;

    // count calls of this function
#ifdef _DBG_TRACE_POINTS_
    TgtDbgSignalTracePoint(0);
#endif

    //---------------------------------------------------------------
    // generate static information
    //---------------------------------------------------------------

    // ---- Driver information ----
    nSize += snprintf (pcBuffer_p + nSize, nBufferSize_p - nSize,
                       "%s    %s    (c) 2006 %s\n",
                       EPL_PRODUCT_NAME, EPL_PRODUCT_VERSION, EPL_PRODUCT_MANUFACTURER);


    //---------------------------------------------------------------
    // generate process information
    //---------------------------------------------------------------

    // ---- EPL state ----
#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMTU)) != 0)
    nSize += snprintf (pcBuffer_p + nSize, nBufferSize_p - nSize,
                       "NMT state:                  0x%04X\n",
                       (WORD) EplNmtuGetNmtState());
#endif

#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_DLLK)) != 0)
    EplDllkCalGetStatistics(&pDllkCalStats);

    nSize += snprintf (pcBuffer_p + nSize, nBufferSize_p - nSize,
                       "CurAsyncTxGen=%lu CurAsyncTxNmt=%lu CurAsyncRx=%lu\nMaxAsyncTxGen=%lu MaxAsyncTxNmt=%lu MaxAsyncRx=%lu\n", pDllkCalStats->m_ulCurTxFrameCountGen, pDllkCalStats->m_ulCurTxFrameCountNmt, pDllkCalStats->m_ulCurRxFrameCount, pDllkCalStats->m_ulMaxTxFrameCountGen, pDllkCalStats->m_ulMaxTxFrameCountNmt, pDllkCalStats->m_ulMaxRxFrameCount);
#endif

#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
    // fetch running IdentRequests
    nSize += snprintf (pcBuffer_p + nSize, nBufferSize_p - nSize,
                       "running IdentRequests:      0x%08lX\n",
                       (ULONG) EplIdentuGetRunningRequests());

    // fetch state of NmtMnu module
    {
    unsigned int    uiMandatorySlaveCount;
    unsigned int    uiSignalSlaveCount;
    WORD            wFlags;

        EplNmtMnuGetDiagnosticInfo(&uiMandatorySlaveCount,
                                   &uiSignalSlaveCount,
                                   &wFlags);


        nSize += snprintf (pcBuffer_p + nSize, nBufferSize_p - nSize,
                           "MN  MandSlaveCount: %u  SigSlaveCount: %u  Flags: 0x%X\n",
                           uiMandatorySlaveCount, uiSignalSlaveCount, wFlags);

    }
#endif

#if (EDRV_USE_DIAGNOSTICS != FALSE)
    nSize += EdrvGetDiagnostics(pcBuffer_p + nSize, nBufferSize_p - nSize);
#endif

    // ---- FEC state ----
    #ifdef CONFIG_COLDFIRE
    {
        // Receive the base address
        unsigned long base_addr;
        #if (EDRV_USED_ETH_CTRL == 0)
            // Set the base address of FEC0
            base_addr = FEC_BASE_ADDR_FEC0;
        #else
            // Set the base address of FEC1
            base_addr = FEC_BASE_ADDR_FEC1;
        #endif

        nSize += snprintf (pcBuffer_p + nSize, nBufferSize_p - nSize,
                           "FEC_ECR = 0x%08X FEC_EIR = 0x%08X FEC_EIMR = 0x%08X\nFEC_TCR = 0x%08X FECTFSR = 0x%08X FECRFSR = 0x%08X\n",
                           FEC_ECR(base_addr), FEC_EIR(base_addr), FEC_EIMR(base_addr), FEC_TCR(base_addr), FEC_FECTFSR(base_addr), FEC_FECRFSR(base_addr));
    }
    #endif


    // ---- DBG: TracePoints ----
    #ifdef _DBG_TRACE_POINTS_
    {
        int nNum;

        nSize += snprintf (pcBuffer_p + nSize, nBufferSize_p - nSize,
                           "DbgTracePoints:\n");
        for (nNum=0; nNum<(sizeof(aatmDbgTracePoint_l)/sizeof(atomic_t)); nNum++)
        {
            nSize += snprintf (pcBuffer_p + nSize, nBufferSize_p - nSize,
                               " TracePoint[%2d]: %d\n", (int)nNum,
                               atomic_read(&aatmDbgTracePoint_l[nNum]));
        }

        nSize += snprintf (pcBuffer_p + nSize, nBufferSize_p - nSize,
                           "DbgTraceValues:\n");
        for (nNum=0; nNum<DBG_TRACE_VALUES; nNum++)
        {
            if (nNum == uiDbgTraceValuePos_l)
            {   // next value will be stored at that position
                nSize += snprintf (pcBuffer_p + nSize, nBufferSize_p - nSize,
                                   "*%08lX", (ULONG) adwDbgTraceValue_l[nNum]);
            }
            else
            {
                nSize += snprintf (pcBuffer_p + nSize, nBufferSize_p - nSize,
                                   " %08lX", (ULONG) adwDbgTraceValue_l[nNum]);
            }
            if ((nNum & 0x00000007) == 0x00000007)
            {   // 8 values printed -> end of line reached
                nSize += snprintf (pcBuffer_p + nSize, nBufferSize_p - nSize,
                                   "\n");
            }
        }
        if ((nNum & 0x00000007) != 0x00000007)
        {   // number of values printed is not a multiple of 8 -> print new line
            nSize += snprintf (pcBuffer_p + nSize, nBufferSize_p - nSize,
                               "\n");
        }
    }
    #endif


    Eof = 1;
    goto Exit;


Exit:

    *pEof_p = Eof;

    return (nSize);

}