static int VEthXmit(struct sk_buff *pSkb_p, struct net_device *pNetDevice_p)
{
	tEplKernel Ret = kEplSuccessful;
	tEplFrameInfo FrameInfo;

	//transmit function
	struct net_device_stats *pStats = netdev_priv(pNetDevice_p);

	//save timestemp
	pNetDevice_p->trans_start = jiffies;

	FrameInfo.m_pFrame = (tEplFrame *) pSkb_p->data;
	FrameInfo.m_uiFrameSize = pSkb_p->len;

	//call send fkt on DLL
	Ret = EplDllkCalAsyncSend(&FrameInfo, kEplDllAsyncReqPrioGeneric);
	if (Ret != kEplSuccessful) {
		EPL_DBGLVL_VETH_TRACE1
		    ("VEthXmit: EplDllkCalAsyncSend returned 0x%02X\n", Ret);
		netif_stop_queue(pNetDevice_p);
		goto Exit;
	} else {
		EPL_DBGLVL_VETH_TRACE0("VEthXmit: frame passed to DLL\n");
		dev_kfree_skb(pSkb_p);

		//set stats for the device
		pStats->tx_packets++;
		pStats->tx_bytes += FrameInfo.m_uiFrameSize;
	}

      Exit:
	return 0;

}
tEplKernel EplDlluCalAsyncSend(tEplFrameInfo * pFrameInfo_p,
			       tEplDllAsyncReqPriority Priority_p)
{
	tEplKernel Ret = kEplSuccessful;

#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_DLLK)) != 0)
	pFrameInfo_p->m_uiFrameSize += 14;	// add size of ethernet header
	Ret = EplDllkCalAsyncSend(pFrameInfo_p, Priority_p);
#else
	Ret = kEplSuccessful;
#endif

	return Ret;
}
//---------------------------------------------------------------------------
//
// 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;
}