diff options
Diffstat (limited to 'drivers/staging/epl/VirtualEthernetLinux.c')
-rw-r--r-- | drivers/staging/epl/VirtualEthernetLinux.c | 348 |
1 files changed, 0 insertions, 348 deletions
diff --git a/drivers/staging/epl/VirtualEthernetLinux.c b/drivers/staging/epl/VirtualEthernetLinux.c deleted file mode 100644 index 7b7cce1b36e8..000000000000 --- a/drivers/staging/epl/VirtualEthernetLinux.c +++ /dev/null @@ -1,348 +0,0 @@ -/**************************************************************************** - - (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29 - www.systec-electronic.com - - Project: openPOWERLINK - - Description: Virtual Ethernet Driver for Linux - - License: - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - 3. Neither the name of SYSTEC electronic GmbH nor the names of its - contributors may be used to endorse or promote products derived - from this software without prior written permission. For written - permission, please contact info@systec-electronic.com. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - - Severability Clause: - - If a provision of this License is or becomes illegal, invalid or - unenforceable in any jurisdiction, that shall not affect: - 1. the validity or enforceability in that jurisdiction of any other - provision of this License; or - 2. the validity or enforceability in other jurisdictions of that or - any other provision of this License. - - ------------------------------------------------------------------------- - - $RCSfile: VirtualEthernetLinux.c,v $ - - $Author: D.Krueger $ - - $Revision: 1.8 $ $Date: 2008/11/20 17:06:51 $ - - $State: Exp $ - - Build Environment: - - ------------------------------------------------------------------------- - - Revision History: - - 2006/06/12 -ar: start of the implementation, version 1.00 - - 2006/09/18 d.k.: integration into EPL DLLk module - - ToDo: - - void netif_carrier_off(struct net_device *dev); - void netif_carrier_on(struct net_device *dev); - -****************************************************************************/ - -#include <linux/module.h> -#include <linux/netdevice.h> -#include <linux/etherdevice.h> -#include <linux/kernel.h> -#include <linux/init.h> -#include <linux/if_arp.h> -#include <net/arp.h> - -#include <net/protocol.h> -#include <net/pkt_sched.h> -#include <linux/if_ether.h> -#include <linux/in.h> -#include <linux/ip.h> -#include <linux/udp.h> -#include <linux/mm.h> -#include <linux/types.h> -#include <linux/skbuff.h> /* for struct sk_buff */ - -#include "kernel/VirtualEthernet.h" -#include "kernel/EplDllkCal.h" -#include "kernel/EplDllk.h" - -#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_VETH)) != 0) - -/***************************************************************************/ -/* */ -/* */ -/* G L O B A L D E F I N I T I O N S */ -/* */ -/* */ -/***************************************************************************/ - -//--------------------------------------------------------------------------- -// const defines -//--------------------------------------------------------------------------- - -#ifndef EPL_VETH_TX_TIMEOUT -//#define EPL_VETH_TX_TIMEOUT (2*HZ) -#define EPL_VETH_TX_TIMEOUT 0 // d.k.: we use no timeout -#endif - -//--------------------------------------------------------------------------- -// local types -//--------------------------------------------------------------------------- - -//--------------------------------------------------------------------------- -// modul globale vars -//--------------------------------------------------------------------------- - -static struct net_device *pVEthNetDevice_g = NULL; - -//--------------------------------------------------------------------------- -// local function prototypes -//--------------------------------------------------------------------------- - -static int VEthOpen(struct net_device *pNetDevice_p); -static int VEthClose(struct net_device *pNetDevice_p); -static int VEthXmit(struct sk_buff *pSkb_p, struct net_device *pNetDevice_p); -static struct net_device_stats *VEthGetStats(struct net_device *pNetDevice_p); -static void VEthTimeout(struct net_device *pNetDevice_p); -static tEplKernel VEthRecvFrame(tEplFrameInfo * pFrameInfo_p); - -//=========================================================================// -// // -// P U B L I C F U N C T I O N S // -// // -//=========================================================================// - -//--------------------------------------------------------------------------- -// -// Function: -// -// Description: -// -// -// -// Parameters: -// -// -// Returns: -// -// -// State: -// -//--------------------------------------------------------------------------- - -static int VEthOpen(struct net_device *pNetDevice_p) -{ - tEplKernel Ret = kEplSuccessful; - - //open the device -// struct net_device_stats* pStats = netdev_priv(pNetDevice_p); - - //start the interface queue for the network subsystem - netif_start_queue(pNetDevice_p); - - // register callback function in DLL - Ret = EplDllkRegAsyncHandler(VEthRecvFrame); - - EPL_DBGLVL_VETH_TRACE1 - ("VEthOpen: EplDllkRegAsyncHandler returned 0x%02X\n", Ret); - - return 0; -} - -static int VEthClose(struct net_device *pNetDevice_p) -{ - tEplKernel Ret = kEplSuccessful; - - EPL_DBGLVL_VETH_TRACE0("VEthClose\n"); - - Ret = EplDllkDeregAsyncHandler(VEthRecvFrame); - - //stop the interface queue for the network subsystem - netif_stop_queue(pNetDevice_p); - return 0; -} - -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 NETDEV_TX_OK; - -} - -static struct net_device_stats *VEthGetStats(struct net_device *pNetDevice_p) -{ - EPL_DBGLVL_VETH_TRACE0("VEthGetStats\n"); - - return netdev_priv(pNetDevice_p); -} - -static void VEthTimeout(struct net_device *pNetDevice_p) -{ - EPL_DBGLVL_VETH_TRACE0("VEthTimeout(\n"); - - // $$$ d.k.: move to extra function, which is called by DLL when new space is available in TxFifo - if (netif_queue_stopped(pNetDevice_p)) { - netif_wake_queue(pNetDevice_p); - } -} - -static tEplKernel VEthRecvFrame(tEplFrameInfo * pFrameInfo_p) -{ - tEplKernel Ret = kEplSuccessful; - struct net_device *pNetDevice = pVEthNetDevice_g; - struct net_device_stats *pStats = netdev_priv(pNetDevice); - struct sk_buff *pSkb; - - EPL_DBGLVL_VETH_TRACE1("VEthRecvFrame: FrameSize=%u\n", - pFrameInfo_p->m_uiFrameSize); - - pSkb = dev_alloc_skb(pFrameInfo_p->m_uiFrameSize + 2); - if (pSkb == NULL) { - pStats->rx_dropped++; - goto Exit; - } - pSkb->dev = pNetDevice; - - skb_reserve(pSkb, 2); - - memcpy((void *)skb_put(pSkb, pFrameInfo_p->m_uiFrameSize), - pFrameInfo_p->m_pFrame, pFrameInfo_p->m_uiFrameSize); - - pSkb->protocol = eth_type_trans(pSkb, pNetDevice); - pSkb->ip_summed = CHECKSUM_UNNECESSARY; - - // call netif_rx with skb - netif_rx(pSkb); - - EPL_DBGLVL_VETH_TRACE1("VEthRecvFrame: SrcMAC=0x%llx\n", - AmiGetQword48FromBe(pFrameInfo_p->m_pFrame-> - m_be_abSrcMac)); - - // update receive statistics - pStats->rx_packets++; - pStats->rx_bytes += pFrameInfo_p->m_uiFrameSize; - - Exit: - return Ret; -} - -static const struct net_device_ops epl_netdev_ops = { - .ndo_open = VEthOpen, - .ndo_stop = VEthClose, - .ndo_get_stats = VEthGetStats, - .ndo_start_xmit = VEthXmit, - .ndo_tx_timeout = VEthTimeout, - .ndo_change_mtu = eth_change_mtu, - .ndo_set_mac_address = eth_mac_addr, - .ndo_validate_addr = eth_validate_addr, -}; - -tEplKernel VEthAddInstance(tEplDllkInitParam *pInitParam_p) -{ - tEplKernel Ret = kEplSuccessful; - - // allocate net device structure with priv pointing to stats structure - pVEthNetDevice_g = - alloc_netdev(sizeof(struct net_device_stats), EPL_VETH_NAME, - ether_setup); -// pVEthNetDevice_g = alloc_etherdev(sizeof (struct net_device_stats)); - - if (pVEthNetDevice_g == NULL) { - Ret = kEplNoResource; - goto Exit; - } - - pVEthNetDevice_g->netdev_ops = &epl_netdev_ops; - pVEthNetDevice_g->watchdog_timeo = EPL_VETH_TX_TIMEOUT; - pVEthNetDevice_g->destructor = free_netdev; - - // copy own MAC address to net device structure - memcpy(pVEthNetDevice_g->dev_addr, pInitParam_p->m_be_abSrcMac, 6); - - //register VEth to the network subsystem - if (register_netdev(pVEthNetDevice_g)) { - EPL_DBGLVL_VETH_TRACE0 - ("VEthAddInstance: Could not register VEth...\n"); - } else { - EPL_DBGLVL_VETH_TRACE0 - ("VEthAddInstance: Register VEth successfull...\n"); - } - - Exit: - return Ret; -} - -tEplKernel VEthDelInstance(void) -{ - tEplKernel Ret = kEplSuccessful; - - if (pVEthNetDevice_g != NULL) { - //unregister VEth from the network subsystem - unregister_netdev(pVEthNetDevice_g); - // destructor was set to free_netdev, - // so we do not need to call free_netdev here - pVEthNetDevice_g = NULL; - } - - return Ret; -} - -#endif // (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_VETH)) != 0) |