]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blobdiff - drivers/infiniband/ulp/ipoib/ipoib_main.c
[NET]: Make NAPI polling independent of struct net_device objects.
[mirror_ubuntu-bionic-kernel.git] / drivers / infiniband / ulp / ipoib / ipoib_main.c
index b4c380c5a3ba97c99dfa7465af7f85f5e23b2bde..a59ff07ec3cd870a05890744c4dc47bfa1a3bdf1 100644 (file)
@@ -98,16 +98,20 @@ int ipoib_open(struct net_device *dev)
 
        ipoib_dbg(priv, "bringing up interface\n");
 
+       napi_enable(&priv->napi);
        set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
 
        if (ipoib_pkey_dev_delay_open(dev))
                return 0;
 
-       if (ipoib_ib_dev_open(dev))
+       if (ipoib_ib_dev_open(dev)) {
+               napi_disable(&priv->napi);
                return -EINVAL;
+       }
 
        if (ipoib_ib_dev_up(dev)) {
-               ipoib_ib_dev_stop(dev);
+               ipoib_ib_dev_stop(dev, 1);
+               napi_disable(&priv->napi);
                return -EINVAL;
        }
 
@@ -140,6 +144,7 @@ static int ipoib_stop(struct net_device *dev)
        ipoib_dbg(priv, "stopping interface\n");
 
        clear_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
+       napi_disable(&priv->napi);
 
        netif_stop_queue(dev);
 
@@ -152,7 +157,7 @@ static int ipoib_stop(struct net_device *dev)
        flush_workqueue(ipoib_workqueue);
 
        ipoib_ib_dev_down(dev, 1);
-       ipoib_ib_dev_stop(dev);
+       ipoib_ib_dev_stop(dev, 1);
 
        if (!test_bit(IPOIB_FLAG_SUBINTERFACE, &priv->flags)) {
                struct ipoib_dev_priv *cpriv;
@@ -949,6 +954,8 @@ static void ipoib_setup(struct net_device *dev)
        dev->set_multicast_list  = ipoib_set_mcast_list;
        dev->neigh_setup         = ipoib_neigh_setup_dev;
 
+       netif_napi_add(dev, &priv->napi, ipoib_poll, 100);
+
        dev->watchdog_timeo      = HZ;
 
        dev->flags              |= IFF_BROADCAST | IFF_MULTICAST;
@@ -986,7 +993,8 @@ static void ipoib_setup(struct net_device *dev)
        INIT_LIST_HEAD(&priv->dead_ahs);
        INIT_LIST_HEAD(&priv->multicast_list);
 
-       INIT_DELAYED_WORK(&priv->pkey_task,    ipoib_pkey_poll);
+       INIT_DELAYED_WORK(&priv->pkey_poll_task, ipoib_pkey_poll);
+       INIT_WORK(&priv->pkey_event_task, ipoib_pkey_event);
        INIT_DELAYED_WORK(&priv->mcast_task,   ipoib_mcast_join_task);
        INIT_WORK(&priv->flush_task,   ipoib_ib_dev_flush);
        INIT_WORK(&priv->restart_task, ipoib_mcast_restart_task);