Merge branch 'perf/rbtree_copy' of git://git.kernel.org/pub/scm/linux/kernel/git...
[firefly-linux-kernel-4.4.55.git] / drivers / net / ntb_netdev.c
index 5a7e6397440ab18487a87dd9951aa8ed12caf21a..3cc316cb7e6be792b06dfc2c520eae9809f1008b 100644 (file)
@@ -5,6 +5,7 @@
  *   GPL LICENSE SUMMARY
  *
  *   Copyright(c) 2012 Intel Corporation. All rights reserved.
+ *   Copyright (C) 2015 EMC 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
@@ -13,6 +14,7 @@
  *   BSD LICENSE
  *
  *   Copyright(c) 2012 Intel Corporation. All rights reserved.
+ *   Copyright (C) 2015 EMC Corporation. All Rights Reserved.
  *
  *   Redistribution and use in source and binary forms, with or without
  *   modification, are permitted provided that the following conditions
@@ -40,7 +42,7 @@
  *   (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
+ * PCIe NTB Network Linux driver
  *
  * Contact Information:
  * Jon Mason <jon.mason@intel.com>
@@ -50,6 +52,7 @@
 #include <linux/module.h>
 #include <linux/pci.h>
 #include <linux/ntb.h>
+#include <linux/ntb_transport.h>
 
 #define NTB_NETDEV_VER "0.7"
 
@@ -70,26 +73,19 @@ struct ntb_netdev {
 
 static LIST_HEAD(dev_list);
 
-static void ntb_netdev_event_handler(void *data, int status)
+static void ntb_netdev_event_handler(void *data, int link_is_up)
 {
        struct net_device *ndev = data;
        struct ntb_netdev *dev = netdev_priv(ndev);
 
-       netdev_dbg(ndev, "Event %x, Link %x\n", status,
+       netdev_dbg(ndev, "Event %x, Link %x\n", link_is_up,
                   ntb_transport_link_query(dev->qp));
 
-       switch (status) {
-       case NTB_LINK_DOWN:
+       if (link_is_up) {
+               if (ntb_transport_link_query(dev->qp))
+                       netif_carrier_on(ndev);
+       } else {
                netif_carrier_off(ndev);
-               break;
-       case NTB_LINK_UP:
-               if (!ntb_transport_link_query(dev->qp))
-                       return;
-
-               netif_carrier_on(ndev);
-               break;
-       default:
-               netdev_warn(ndev, "Unsupported event type %d\n", status);
        }
 }
 
@@ -160,8 +156,6 @@ static netdev_tx_t ntb_netdev_start_xmit(struct sk_buff *skb,
        struct ntb_netdev *dev = netdev_priv(ndev);
        int rc;
 
-       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)
                goto err;
@@ -322,20 +316,26 @@ static const struct ntb_queue_handlers ntb_netdev_handlers = {
        .event_handler = ntb_netdev_event_handler,
 };
 
-static int ntb_netdev_probe(struct pci_dev *pdev)
+static int ntb_netdev_probe(struct device *client_dev)
 {
+       struct ntb_dev *ntb;
        struct net_device *ndev;
+       struct pci_dev *pdev;
        struct ntb_netdev *dev;
        int rc;
 
-       ndev = alloc_etherdev(sizeof(struct ntb_netdev));
+       ntb = dev_ntb(client_dev->parent);
+       pdev = ntb->pdev;
+       if (!pdev)
+               return -ENODEV;
+
+       ndev = alloc_etherdev(sizeof(*dev));
        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;
@@ -349,7 +349,8 @@ static int ntb_netdev_probe(struct pci_dev *pdev)
        ndev->netdev_ops = &ntb_netdev_ops;
        ndev->ethtool_ops = &ntb_ethtool_ops;
 
-       dev->qp = ntb_transport_create_queue(ndev, pdev, &ntb_netdev_handlers);
+       dev->qp = ntb_transport_create_queue(ndev, client_dev,
+                                            &ntb_netdev_handlers);
        if (!dev->qp) {
                rc = -EIO;
                goto err;
@@ -372,12 +373,17 @@ err:
        return rc;
 }
 
-static void ntb_netdev_remove(struct pci_dev *pdev)
+static void ntb_netdev_remove(struct device *client_dev)
 {
+       struct ntb_dev *ntb;
        struct net_device *ndev;
+       struct pci_dev *pdev;
        struct ntb_netdev *dev;
        bool found = false;
 
+       ntb = dev_ntb(client_dev->parent);
+       pdev = ntb->pdev;
+
        list_for_each_entry(dev, &dev_list, list) {
                if (dev->pdev == pdev) {
                        found = true;
@@ -396,7 +402,7 @@ static void ntb_netdev_remove(struct pci_dev *pdev)
        free_netdev(ndev);
 }
 
-static struct ntb_client ntb_netdev_client = {
+static struct ntb_transport_client ntb_netdev_client = {
        .driver.name = KBUILD_MODNAME,
        .driver.owner = THIS_MODULE,
        .probe = ntb_netdev_probe,
@@ -407,16 +413,16 @@ static int __init ntb_netdev_init_module(void)
 {
        int rc;
 
-       rc = ntb_register_client_dev(KBUILD_MODNAME);
+       rc = ntb_transport_register_client_dev(KBUILD_MODNAME);
        if (rc)
                return rc;
-       return ntb_register_client(&ntb_netdev_client);
+       return ntb_transport_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);
+       ntb_transport_unregister_client(&ntb_netdev_client);
+       ntb_transport_unregister_client_dev(KBUILD_MODNAME);
 }
 module_exit(ntb_netdev_exit_module);