[PATCH 2/2] net: Add support for NTB virtual ethernet device
A virtual ethernet device that uses the NTB transport API to send/receive data. Signed-off-by: Jon Mason --- drivers/net/Kconfig |4 + drivers/net/Makefile |1 + drivers/net/ntb_netdev.c | 407 ++ 3 files changed, 412 insertions(+) create mode 100644 drivers/net/ntb_netdev.c diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig index 0c2bd80..9bf8a71 100644 --- a/drivers/net/Kconfig +++ b/drivers/net/Kconfig @@ -178,6 +178,10 @@ config NETPOLL_TRAP config NET_POLL_CONTROLLER def_bool NETPOLL +config NTB_NETDEV + tristate "Virtual Ethernet over NTB" + depends on NTB + config RIONET tristate "RapidIO Ethernet over messaging driver support" depends on RAPIDIO diff --git a/drivers/net/Makefile b/drivers/net/Makefile index 3d375ca..9890148 100644 --- a/drivers/net/Makefile +++ b/drivers/net/Makefile @@ -69,3 +69,4 @@ obj-$(CONFIG_USB_IPHETH)+= usb/ obj-$(CONFIG_USB_CDC_PHONET) += usb/ obj-$(CONFIG_HYPERV_NET) += hyperv/ +obj-$(CONFIG_NTB_NETDEV) += ntb_netdev.o diff --git a/drivers/net/ntb_netdev.c b/drivers/net/ntb_netdev.c new file mode 100644 index 000..bc76c63 --- /dev/null +++ b/drivers/net/ntb_netdev.c @@ -0,0 +1,407 @@ +/* + * This file is provided under a dual BSD/GPLv2 license. When using or + * redistributing this file, you may do so under either license. + * + * GPL LICENSE SUMMARY + * + * Copyright(c) 2012 Intel Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * BSD LICENSE + * + * Copyright(c) 2012 Intel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copy + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 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 + * OWNER 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. + * + * Intel PCIe NTB Network Linux driver + * + * Contact Information: + * Jon Mason + */ +#include +#include +#include +#include +#include + +#define NTB_NETDEV_VER "0.5" + +MODULE_DESCRIPTION(KBUILD_MODNAME); +MODULE_VERSION(NTB_NETDEV_VER); +MODULE_LICENSE("Dual BSD/GPL"); +MODULE_AUTHOR("Intel Corporation"); + +struct ntb_netdev { + struct list_head list; + struct pci_dev *pdev; + struct net_device *ndev; + struct ntb_transport_qp *qp; +}; + +#defineNTB_TX_TIMEOUT_MS 1000 +#defineNTB_RXQ_SIZE100 + +static LIST_HEAD(dev_list); + +static void ntb_netdev_event_handler(void *data, int status) +{ + struct net_device *ndev = data; + struct ntb_netdev *dev = netdev_priv(ndev); + + netdev_dbg(ndev, "Event %x, Link %x\n", status, + ntb_transport_link_query(dev->qp)); + + /* Currently, only link status event is supported */ + if (status) + netif_carrier_on(ndev); + else + netif_carrier_off(ndev); +} + +static void ntb_netdev_rx_handler(void *data, struct ntb_transport_qp *qp) +{ + struct net_device *ndev = data; + struct sk_buff *skb; + int len, rc; + + while ((skb = ntb_transport_rx_dequeue(qp, ))) { + netdev_dbg(ndev, "%s: %d byte payload received\n", __func__, + len); + + skb_put(skb, len); + skb->protocol = eth_type_trans(skb, ndev); + skb->ip_summed = CHECKSUM_NONE; + + if (netif_rx(skb) == NET_RX_DROP) { +
[PATCH 2/2] net: Add support for NTB virtual ethernet device
A virtual ethernet device that uses the NTB transport API to send/receive data. Signed-off-by: Jon Mason jon.ma...@intel.com --- drivers/net/Kconfig |4 + drivers/net/Makefile |1 + drivers/net/ntb_netdev.c | 407 ++ 3 files changed, 412 insertions(+) create mode 100644 drivers/net/ntb_netdev.c diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig index 0c2bd80..9bf8a71 100644 --- a/drivers/net/Kconfig +++ b/drivers/net/Kconfig @@ -178,6 +178,10 @@ config NETPOLL_TRAP config NET_POLL_CONTROLLER def_bool NETPOLL +config NTB_NETDEV + tristate Virtual Ethernet over NTB + depends on NTB + config RIONET tristate RapidIO Ethernet over messaging driver support depends on RAPIDIO diff --git a/drivers/net/Makefile b/drivers/net/Makefile index 3d375ca..9890148 100644 --- a/drivers/net/Makefile +++ b/drivers/net/Makefile @@ -69,3 +69,4 @@ obj-$(CONFIG_USB_IPHETH)+= usb/ obj-$(CONFIG_USB_CDC_PHONET) += usb/ obj-$(CONFIG_HYPERV_NET) += hyperv/ +obj-$(CONFIG_NTB_NETDEV) += ntb_netdev.o diff --git a/drivers/net/ntb_netdev.c b/drivers/net/ntb_netdev.c new file mode 100644 index 000..bc76c63 --- /dev/null +++ b/drivers/net/ntb_netdev.c @@ -0,0 +1,407 @@ +/* + * This file is provided under a dual BSD/GPLv2 license. When using or + * redistributing this file, you may do so under either license. + * + * GPL LICENSE SUMMARY + * + * Copyright(c) 2012 Intel Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * BSD LICENSE + * + * Copyright(c) 2012 Intel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copy + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 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 + * OWNER 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. + * + * Intel PCIe NTB Network Linux driver + * + * Contact Information: + * Jon Mason jon.ma...@intel.com + */ +#include linux/etherdevice.h +#include linux/ethtool.h +#include linux/module.h +#include linux/pci.h +#include linux/ntb.h + +#define NTB_NETDEV_VER 0.5 + +MODULE_DESCRIPTION(KBUILD_MODNAME); +MODULE_VERSION(NTB_NETDEV_VER); +MODULE_LICENSE(Dual BSD/GPL); +MODULE_AUTHOR(Intel Corporation); + +struct ntb_netdev { + struct list_head list; + struct pci_dev *pdev; + struct net_device *ndev; + struct ntb_transport_qp *qp; +}; + +#defineNTB_TX_TIMEOUT_MS 1000 +#defineNTB_RXQ_SIZE100 + +static LIST_HEAD(dev_list); + +static void ntb_netdev_event_handler(void *data, int status) +{ + struct net_device *ndev = data; + struct ntb_netdev *dev = netdev_priv(ndev); + + netdev_dbg(ndev, Event %x, Link %x\n, status, + ntb_transport_link_query(dev-qp)); + + /* Currently, only link status event is supported */ + if (status) + netif_carrier_on(ndev); + else + netif_carrier_off(ndev); +} + +static void ntb_netdev_rx_handler(void *data, struct ntb_transport_qp *qp) +{ + struct net_device *ndev = data; + struct sk_buff *skb; + int len, rc; + + while ((skb = ntb_transport_rx_dequeue(qp, len))) { + netdev_dbg(ndev, %s: %d byte payload received\n, __func__, + len); + + skb_put(skb, len); + skb-protocol = eth_type_trans(skb, ndev); +