From 548c237c0a9972df5d1afaca38aa733ee577128d Mon Sep 17 00:00:00 2001 From: Jon Mason Date: Fri, 16 Nov 2012 19:27:13 -0700 Subject: 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 Reviewed-by: Nicholas Bellinger Acked-by: David S. Miller Signed-off-by: Greg Kroah-Hartman --- drivers/net/ntb_netdev.c | 419 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 419 insertions(+) create mode 100644 drivers/net/ntb_netdev.c (limited to 'drivers/net/ntb_netdev.c') diff --git a/drivers/net/ntb_netdev.c b/drivers/net/ntb_netdev.c new file mode 100644 index 000000000000..af48a69cab02 --- /dev/null +++ b/drivers/net/ntb_netdev.c @@ -0,0 +1,419 @@ +/* + * 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.6" + +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; +}; + +#define NTB_TX_TIMEOUT_MS 1000 +#define NTB_RXQ_SIZE 100 + +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(struct ntb_transport_qp *qp, void *qp_data, + void *data, int len) +{ + struct net_device *ndev = qp_data; + struct sk_buff *skb; + int rc; + + skb = data; + if (!skb) + return; + + 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) { + ndev->stats.rx_errors++; + ndev->stats.rx_dropped++; + } else { + ndev->stats.rx_packets++; + ndev->stats.rx_bytes += len; + } + + skb = netdev_alloc_skb(ndev, ndev->mtu + ETH_HLEN); + if (!skb) { + ndev->stats.rx_errors++; + ndev->stats.rx_frame_errors++; + return; + } + + rc = ntb_transport_rx_enqueue(qp, skb, skb->data, ndev->mtu + ETH_HLEN); + if (rc) { + ndev->stats.rx_errors++; + ndev->stats.rx_fifo_errors++; + } +} + +static void ntb_netdev_tx_handler(struct ntb_transport_qp *qp, void *qp_data, + void *data, int len) +{ + struct net_device *ndev = qp_data; + struct sk_buff *skb; + + skb = data; + if (!skb || !ndev) + return; + + if (len > 0) { + ndev->stats.tx_packets++; + ndev->stats.tx_bytes += skb->len; + } else { + ndev->stats.tx_errors++; + ndev->stats.tx_aborted_errors++; + } + + dev_kfree_skb(skb); + + if (netif_queue_stopped(ndev)) + netif_wake_queue(ndev); +} + +static netdev_tx_t ntb_netdev_start_xmit(struct sk_buff *skb, + struct net_device *ndev) +{ + struct ntb_netdev *dev = netdev_priv(ndev); + int rc; + + netdev_dbg(ndev, "ntb_transport_tx_enqueue\n"); + + rc = ntb_transport_tx_enqueue(dev->qp, skb, skb->data, skb->len); + if (rc) + goto err; + + return NETDEV_TX_OK; + +err: + ndev->stats.tx_dropped++; + ndev->stats.tx_errors++; + netif_stop_queue(ndev); + return NETDEV_TX_BUSY; +} + +static int ntb_netdev_open(struct net_device *ndev) +{ + struct ntb_netdev *dev = netdev_priv(ndev); + struct sk_buff *skb; + int rc, i, len; + + /* Add some empty rx bufs */ + for (i = 0; i < NTB_RXQ_SIZE; i++) { + skb = netdev_alloc_skb(ndev, ndev->mtu + ETH_HLEN); + if (!skb) { + rc = -ENOMEM; + goto err; + } + + rc = ntb_transport_rx_enqueue(dev->qp, skb, skb->data, + ndev->mtu + ETH_HLEN); + if (rc == -EINVAL) + goto err; + } + + netif_carrier_off(ndev); + ntb_transport_link_up(dev->qp); + + return 0; + +err: + while ((skb = ntb_transport_rx_remove(dev->qp, &len))) + dev_kfree_skb(skb); + return rc; +} + +static int ntb_netdev_close(struct net_device *ndev) +{ + struct ntb_netdev *dev = netdev_priv(ndev); + struct sk_buff *skb; + int len; + + ntb_transport_link_down(dev->qp); + + while ((skb = ntb_transport_rx_remove(dev->qp, &len))) + dev_kfree_skb(skb); + + return 0; +} + +static int ntb_netdev_change_mtu(struct net_device *ndev, int new_mtu) +{ + struct ntb_netdev *dev = netdev_priv(ndev); + struct sk_buff *skb; + int len, rc; + + if (new_mtu > ntb_transport_max_size(dev->qp) - ETH_HLEN) + return -EINVAL; + + if (!netif_running(ndev)) { + ndev->mtu = new_mtu; + return 0; + } + + /* Bring down the link and dispose of posted rx entries */ + ntb_transport_link_down(dev->qp); + + if (ndev->mtu < new_mtu) { + int i; + + for (i = 0; (skb = ntb_transport_rx_remove(dev->qp, &len)); i++) + dev_kfree_skb(skb); + + for (; i; i--) { + skb = netdev_alloc_skb(ndev, new_mtu + ETH_HLEN); + if (!skb) { + rc = -ENOMEM; + goto err; + } + + rc = ntb_transport_rx_enqueue(dev->qp, skb, skb->data, + new_mtu + ETH_HLEN); + if (rc) { + dev_kfree_skb(skb); + goto err; + } + } + } + + ndev->mtu = new_mtu; + + ntb_transport_link_up(dev->qp); + + return 0; + +err: + ntb_transport_link_down(dev->qp); + + while ((skb = ntb_transport_rx_remove(dev->qp, &len))) + dev_kfree_skb(skb); + + netdev_err(ndev, "Error changing MTU, device inoperable\n"); + return rc; +} + +static void ntb_netdev_tx_timeout(struct net_device *ndev) +{ + if (netif_running(ndev)) + netif_wake_queue(ndev); +} + +static const struct net_device_ops ntb_netdev_ops = { + .ndo_open = ntb_netdev_open, + .ndo_stop = ntb_netdev_close, + .ndo_start_xmit = ntb_netdev_start_xmit, + .ndo_change_mtu = ntb_netdev_change_mtu, + .ndo_tx_timeout = ntb_netdev_tx_timeout, + .ndo_set_mac_address = eth_mac_addr, +}; + +static void ntb_get_drvinfo(struct net_device *ndev, + struct ethtool_drvinfo *info) +{ + struct ntb_netdev *dev = netdev_priv(ndev); + + strlcpy(info->driver, KBUILD_MODNAME, sizeof(info->driver)); + strlcpy(info->version, NTB_NETDEV_VER, sizeof(info->version)); + strlcpy(info->bus_info, pci_name(dev->pdev), sizeof(info->bus_info)); +} + +static int ntb_get_settings(struct net_device *dev, struct ethtool_cmd *cmd) +{ + cmd->supported = SUPPORTED_Backplane; + cmd->advertising = ADVERTISED_Backplane; + cmd->speed = SPEED_UNKNOWN; + ethtool_cmd_speed_set(cmd, SPEED_UNKNOWN); + cmd->duplex = DUPLEX_FULL; + cmd->port = PORT_OTHER; + cmd->phy_address = 0; + cmd->transceiver = XCVR_DUMMY1; + cmd->autoneg = AUTONEG_ENABLE; + cmd->maxtxpkt = 0; + cmd->maxrxpkt = 0; + + return 0; +} + +static const struct ethtool_ops ntb_ethtool_ops = { + .get_drvinfo = ntb_get_drvinfo, + .get_link = ethtool_op_get_link, + .get_settings = ntb_get_settings, +}; + +static const struct ntb_queue_handlers ntb_netdev_handlers = { + .tx_handler = ntb_netdev_tx_handler, + .rx_handler = ntb_netdev_rx_handler, + .event_handler = ntb_netdev_event_handler, +}; + +static int __devinit ntb_netdev_probe(struct pci_dev *pdev) +{ + struct net_device *ndev; + struct ntb_netdev *dev; + int rc; + + ndev = alloc_etherdev(sizeof(struct ntb_netdev)); + if (!ndev) + return -ENOMEM; + + dev = netdev_priv(ndev); + dev->ndev = ndev; + dev->pdev = pdev; + BUG_ON(!dev->pdev); + ndev->features = NETIF_F_HIGHDMA; + + ndev->priv_flags |= IFF_LIVE_ADDR_CHANGE; + + ndev->hw_features = ndev->features; + ndev->watchdog_timeo = msecs_to_jiffies(NTB_TX_TIMEOUT_MS); + + random_ether_addr(ndev->perm_addr); + memcpy(ndev->dev_addr, ndev->perm_addr, ndev->addr_len); + + ndev->netdev_ops = &ntb_netdev_ops; + SET_ETHTOOL_OPS(ndev, &ntb_ethtool_ops); + + dev->qp = ntb_transport_create_queue(ndev, pdev, &ntb_netdev_handlers); + if (!dev->qp) { + rc = -EIO; + goto err; + } + + ndev->mtu = ntb_transport_max_size(dev->qp) - ETH_HLEN; + + rc = register_netdev(ndev); + if (rc) + goto err1; + + list_add(&dev->list, &dev_list); + pr_info("%s: %s created\n", KBUILD_MODNAME, ndev->name); + return 0; + +err1: + ntb_transport_free_queue(dev->qp); +err: + free_netdev(ndev); + return rc; +} + +static void __exit ntb_netdev_remove(struct pci_dev *pdev) +{ + struct net_device *ndev; + struct ntb_netdev *dev; + + list_for_each_entry(dev, &dev_list, list) { + if (dev->pdev == pdev) + break; + } + if (dev == NULL) + return; + + ndev = dev->ndev; + + unregister_netdev(ndev); + ntb_transport_free_queue(dev->qp); + free_netdev(ndev); +} + +static struct ntb_client ntb_netdev_client = { + .driver.name = KBUILD_MODNAME, + .driver.owner = THIS_MODULE, + .probe = ntb_netdev_probe, + .remove = ntb_netdev_remove, +}; + +static int __init ntb_netdev_init_module(void) +{ + int rc; + + rc = ntb_register_client_dev(KBUILD_MODNAME); + if (rc) + return rc; + return ntb_register_client(&ntb_netdev_client); +} +module_init(ntb_netdev_init_module); + +static void __exit ntb_netdev_exit_module(void) +{ + ntb_unregister_client(&ntb_netdev_client); + ntb_unregister_client_dev(KBUILD_MODNAME); + pr_info("%s: Driver removed\n", KBUILD_MODNAME); +} +module_exit(ntb_netdev_exit_module); -- cgit v1.2.3 From 78a61ab79ae6bd75593b63fbaf5299c96bac0ea4 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Thu, 17 Jan 2013 19:17:42 -0800 Subject: ntb: remove __dev* markings These are now gone from the kernel, so remove them from the newly-added drivers before they start to cause build errors for people. Cc: Jon Mason Signed-off-by: Greg Kroah-Hartman --- drivers/net/ntb_netdev.c | 2 +- drivers/ntb/ntb_hw.c | 16 +++++++--------- drivers/ntb/ntb_transport.c | 4 ++-- 3 files changed, 10 insertions(+), 12 deletions(-) (limited to 'drivers/net/ntb_netdev.c') diff --git a/drivers/net/ntb_netdev.c b/drivers/net/ntb_netdev.c index af48a69cab02..4e52fd2b8226 100644 --- a/drivers/net/ntb_netdev.c +++ b/drivers/net/ntb_netdev.c @@ -323,7 +323,7 @@ static const struct ntb_queue_handlers ntb_netdev_handlers = { .event_handler = ntb_netdev_event_handler, }; -static int __devinit ntb_netdev_probe(struct pci_dev *pdev) +static int ntb_netdev_probe(struct pci_dev *pdev) { struct net_device *ndev; struct ntb_netdev *dev; diff --git a/drivers/ntb/ntb_hw.c b/drivers/ntb/ntb_hw.c index facad51fbc7a..4c71b17f0166 100644 --- a/drivers/ntb/ntb_hw.c +++ b/drivers/ntb/ntb_hw.c @@ -637,7 +637,7 @@ static int ntb_bwd_setup(struct ntb_device *ndev) return 0; } -static int __devinit ntb_device_setup(struct ntb_device *ndev) +static int ntb_device_setup(struct ntb_device *ndev) { int rc; @@ -909,7 +909,7 @@ static int ntb_setup_intx(struct ntb_device *ndev) return 0; } -static int __devinit ntb_setup_interrupts(struct ntb_device *ndev) +static int ntb_setup_interrupts(struct ntb_device *ndev) { int rc; @@ -943,7 +943,7 @@ done: return 0; } -static void __devexit ntb_free_interrupts(struct ntb_device *ndev) +static void ntb_free_interrupts(struct ntb_device *ndev) { struct pci_dev *pdev = ndev->pdev; @@ -973,7 +973,7 @@ static void __devexit ntb_free_interrupts(struct ntb_device *ndev) } } -static int __devinit ntb_create_callbacks(struct ntb_device *ndev) +static int ntb_create_callbacks(struct ntb_device *ndev) { int i; @@ -1006,9 +1006,7 @@ static void ntb_free_callbacks(struct ntb_device *ndev) kfree(ndev->db_cb); } -static int __devinit -ntb_pci_probe(struct pci_dev *pdev, - __attribute__((unused)) const struct pci_device_id *id) +static int ntb_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) { struct ntb_device *ndev; int rc, i; @@ -1122,7 +1120,7 @@ err: return rc; } -static void __devexit ntb_pci_remove(struct pci_dev *pdev) +static void ntb_pci_remove(struct pci_dev *pdev) { struct ntb_device *ndev = pci_get_drvdata(pdev); int i; @@ -1152,6 +1150,6 @@ static struct pci_driver ntb_pci_driver = { .name = KBUILD_MODNAME, .id_table = ntb_pci_tbl, .probe = ntb_pci_probe, - .remove = __devexit_p(ntb_pci_remove), + .remove = ntb_pci_remove, }; module_pci_driver(ntb_pci_driver); diff --git a/drivers/ntb/ntb_transport.c b/drivers/ntb/ntb_transport.c index c907e0773532..250190fba757 100644 --- a/drivers/ntb/ntb_transport.c +++ b/drivers/ntb/ntb_transport.c @@ -217,7 +217,7 @@ struct bus_type ntb_bus_type = { static LIST_HEAD(ntb_transport_list); -static int __devinit ntb_bus_init(struct ntb_transport *nt) +static int ntb_bus_init(struct ntb_transport *nt) { if (list_empty(&ntb_transport_list)) { int rc = bus_register(&ntb_bus_type); @@ -230,7 +230,7 @@ static int __devinit ntb_bus_init(struct ntb_transport *nt) return 0; } -static void __devexit ntb_bus_remove(struct ntb_transport *nt) +static void ntb_bus_remove(struct ntb_transport *nt) { struct ntb_transport_client_dev *client_dev, *cd; -- cgit v1.2.3 From 19e17f7248e8ef72a8b625db7ddd99c0ad3da27c Mon Sep 17 00:00:00 2001 From: Jon Mason Date: Sat, 19 Jan 2013 02:02:30 -0700 Subject: ntb_netdev: remove init/exit from probe/remove Remove init/exit from probe/remove routines to correct warnings of "Section mismatch". Signed-off-by: Jon Mason Signed-off-by: Greg Kroah-Hartman --- drivers/net/ntb_netdev.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'drivers/net/ntb_netdev.c') diff --git a/drivers/net/ntb_netdev.c b/drivers/net/ntb_netdev.c index 4e52fd2b8226..0d4a6ee5a7f0 100644 --- a/drivers/net/ntb_netdev.c +++ b/drivers/net/ntb_netdev.c @@ -373,7 +373,7 @@ err: return rc; } -static void __exit ntb_netdev_remove(struct pci_dev *pdev) +static void ntb_netdev_remove(struct pci_dev *pdev) { struct net_device *ndev; struct ntb_netdev *dev; -- cgit v1.2.3 From 765ccc7bc3d913e18b887a86de1e86db701a2d78 Mon Sep 17 00:00:00 2001 From: Jon Mason Date: Sat, 19 Jan 2013 02:02:31 -0700 Subject: ntb_netdev: correct skb leak If ntb_netdev is unable to pass a new skb to the ntb transport for future rx packets, it should free the newly alloc'ed skb in the error case. Found by Kernel memory leak detector. Signed-off-by: Jon Mason Signed-off-by: Greg Kroah-Hartman --- drivers/net/ntb_netdev.c | 1 + 1 file changed, 1 insertion(+) (limited to 'drivers/net/ntb_netdev.c') diff --git a/drivers/net/ntb_netdev.c b/drivers/net/ntb_netdev.c index 0d4a6ee5a7f0..28d6fea54384 100644 --- a/drivers/net/ntb_netdev.c +++ b/drivers/net/ntb_netdev.c @@ -119,6 +119,7 @@ static void ntb_netdev_rx_handler(struct ntb_transport_qp *qp, void *qp_data, rc = ntb_transport_rx_enqueue(qp, skb, skb->data, ndev->mtu + ETH_HLEN); if (rc) { + dev_kfree_skb(skb); ndev->stats.rx_errors++; ndev->stats.rx_fifo_errors++; } -- cgit v1.2.3 From d723485cb4ca9eefaf43fd9f165554094b97f2c2 Mon Sep 17 00:00:00 2001 From: Jon Mason Date: Sat, 19 Jan 2013 02:02:32 -0700 Subject: ntb_netdev: remove tx timeout There is a race between disabling and enabling the tx queue, resulting in tx timeouts. Since all the tx timeout does is re-enable the tx queue, simple remove the start/stop of the queue and the tx timeout routine. Signed-off-by: Jon Mason Signed-off-by: Greg Kroah-Hartman --- drivers/net/ntb_netdev.c | 11 ----------- 1 file changed, 11 deletions(-) (limited to 'drivers/net/ntb_netdev.c') diff --git a/drivers/net/ntb_netdev.c b/drivers/net/ntb_netdev.c index 28d6fea54384..07c06cdb97b4 100644 --- a/drivers/net/ntb_netdev.c +++ b/drivers/net/ntb_netdev.c @@ -144,9 +144,6 @@ static void ntb_netdev_tx_handler(struct ntb_transport_qp *qp, void *qp_data, } dev_kfree_skb(skb); - - if (netif_queue_stopped(ndev)) - netif_wake_queue(ndev); } static netdev_tx_t ntb_netdev_start_xmit(struct sk_buff *skb, @@ -166,7 +163,6 @@ static netdev_tx_t ntb_netdev_start_xmit(struct sk_buff *skb, err: ndev->stats.tx_dropped++; ndev->stats.tx_errors++; - netif_stop_queue(ndev); return NETDEV_TX_BUSY; } @@ -270,18 +266,11 @@ err: return rc; } -static void ntb_netdev_tx_timeout(struct net_device *ndev) -{ - if (netif_running(ndev)) - netif_wake_queue(ndev); -} - static const struct net_device_ops ntb_netdev_ops = { .ndo_open = ntb_netdev_open, .ndo_stop = ntb_netdev_close, .ndo_start_xmit = ntb_netdev_start_xmit, .ndo_change_mtu = ntb_netdev_change_mtu, - .ndo_tx_timeout = ntb_netdev_tx_timeout, .ndo_set_mac_address = eth_mac_addr, }; -- cgit v1.2.3 From 7bcd2b111f3ac77370ec7efe93e16e19878827c1 Mon Sep 17 00:00:00 2001 From: Jon Mason Date: Sat, 19 Jan 2013 02:02:34 -0700 Subject: ntb_netdev: improve logging Improve driver logging to be more helpful Signed-off-by: Jon Mason Signed-off-by: Greg Kroah-Hartman --- drivers/net/ntb_netdev.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'drivers/net/ntb_netdev.c') diff --git a/drivers/net/ntb_netdev.c b/drivers/net/ntb_netdev.c index 07c06cdb97b4..1626dc198f52 100644 --- a/drivers/net/ntb_netdev.c +++ b/drivers/net/ntb_netdev.c @@ -152,7 +152,7 @@ static netdev_tx_t ntb_netdev_start_xmit(struct sk_buff *skb, struct ntb_netdev *dev = netdev_priv(ndev); int rc; - netdev_dbg(ndev, "ntb_transport_tx_enqueue\n"); + netdev_dbg(ndev, "%s: skb len %d\n", __func__, skb->len); rc = ntb_transport_tx_enqueue(dev->qp, skb, skb->data, skb->len); if (rc) @@ -353,7 +353,7 @@ static int ntb_netdev_probe(struct pci_dev *pdev) goto err1; list_add(&dev->list, &dev_list); - pr_info("%s: %s created\n", KBUILD_MODNAME, ndev->name); + dev_info(&pdev->dev, "%s created\n", ndev->name); return 0; err1: @@ -404,6 +404,5 @@ static void __exit ntb_netdev_exit_module(void) { ntb_unregister_client(&ntb_netdev_client); ntb_unregister_client_dev(KBUILD_MODNAME); - pr_info("%s: Driver removed\n", KBUILD_MODNAME); } module_exit(ntb_netdev_exit_module); -- cgit v1.2.3 From 24208bbed9e1116455be2e4b82c9b559f2462a59 Mon Sep 17 00:00:00 2001 From: Jon Mason Date: Sat, 19 Jan 2013 02:02:35 -0700 Subject: ntb_netdev: Update Version Update NTB netdev version to 0.7 Signed-off-by: Jon Mason Signed-off-by: Greg Kroah-Hartman --- drivers/net/ntb_netdev.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'drivers/net/ntb_netdev.c') diff --git a/drivers/net/ntb_netdev.c b/drivers/net/ntb_netdev.c index 1626dc198f52..ed947dd76fbd 100644 --- a/drivers/net/ntb_netdev.c +++ b/drivers/net/ntb_netdev.c @@ -51,7 +51,7 @@ #include #include -#define NTB_NETDEV_VER "0.6" +#define NTB_NETDEV_VER "0.7" MODULE_DESCRIPTION(KBUILD_MODNAME); MODULE_VERSION(NTB_NETDEV_VER); -- cgit v1.2.3