struct ipoib_dev_priv *priv = netdev_priv(dev);
        struct ib_qp_attr qp_attr;
        int qp_attr_mask, ret;
-       ret = ib_find_cached_pkey(priv->ca, priv->port, priv->pkey, &qp_attr.pkey_index);
+       ret = ib_find_pkey(priv->ca, priv->port, priv->pkey, &qp_attr.pkey_index);
        if (ret) {
-               ipoib_warn(priv, "pkey 0x%x not in cache: %d\n", priv->pkey, ret);
+               ipoib_warn(priv, "pkey 0x%x not found: %d\n", priv->pkey, ret);
                return ret;
        }
 
 
        struct ipoib_dev_priv *priv = netdev_priv(dev);
        u16 pkey_index = 0;
 
-       if (ib_find_cached_pkey(priv->ca, priv->port, priv->pkey, &pkey_index))
+       if (ib_find_pkey(priv->ca, priv->port, priv->pkey, &pkey_index))
                clear_bit(IPOIB_PKEY_ASSIGNED, &priv->flags);
        else
                set_bit(IPOIB_PKEY_ASSIGNED, &priv->flags);
                        clear_bit(IPOIB_PKEY_ASSIGNED, &priv->flags);
                        ipoib_ib_dev_down(dev, 0);
                        ipoib_ib_dev_stop(dev, 0);
-                       ipoib_pkey_dev_delay_open(dev);
-                       return;
+                       if (ipoib_pkey_dev_delay_open(dev))
+                               return;
                }
-               set_bit(IPOIB_PKEY_ASSIGNED, &priv->flags);
 
                /* restart QP only if P_Key index is changed */
-               if (new_index == priv->pkey_index) {
+               if (test_and_set_bit(IPOIB_PKEY_ASSIGNED, &priv->flags) &&
+                   new_index == priv->pkey_index) {
                        ipoib_dbg(priv, "Not flushing - P_Key index not changed.\n");
                        return;
                }