IB/ipoib: Avoid flushing the workqueue from worker context
[cascardo/linux.git] / drivers / infiniband / ulp / ipoib / ipoib_main.c
index d64ed05..1bf994a 100644 (file)
@@ -104,12 +104,17 @@ int ipoib_open(struct net_device *dev)
 
        ipoib_dbg(priv, "bringing up interface\n");
 
+       netif_carrier_off(dev);
+
        set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
 
-       if (ipoib_pkey_dev_delay_open(dev))
+
+       ipoib_pkey_dev_check_presence(dev);
+
+       if (!test_bit(IPOIB_PKEY_ASSIGNED, &priv->flags))
                return 0;
 
-       if (ipoib_ib_dev_open(dev))
+       if (ipoib_ib_dev_open(dev, 1))
                goto err_disable;
 
        if (ipoib_ib_dev_up(dev))
@@ -1366,8 +1371,6 @@ void ipoib_setup(struct net_device *dev)
 
        memcpy(dev->broadcast, ipv4_bcast_addr, INFINIBAND_ALEN);
 
-       netif_carrier_off(dev);
-
        priv->dev = dev;
 
        spin_lock_init(&priv->lock);
@@ -1379,7 +1382,6 @@ void ipoib_setup(struct net_device *dev)
        INIT_LIST_HEAD(&priv->dead_ahs);
        INIT_LIST_HEAD(&priv->multicast_list);
 
-       INIT_DELAYED_WORK(&priv->pkey_poll_task, ipoib_pkey_poll);
        INIT_DELAYED_WORK(&priv->mcast_task,   ipoib_mcast_join_task);
        INIT_WORK(&priv->carrier_on_task, ipoib_mcast_carrier_on_task);
        INIT_WORK(&priv->flush_light,   ipoib_ib_dev_flush_light);