{
        struct ipoib_dev_priv *priv = netdev_priv(dev);
        struct ib_qp_attr qp_attr;
-       int attr_mask;
        unsigned long begin;
        struct ipoib_tx_buf *tx_req;
        int i;
 
-       /* Kill the existing QP and allocate a new one */
+       /*
+        * Move our QP to the error state and then reinitialize in
+        * when all work requests have completed or have been flushed.
+        */
        qp_attr.qp_state = IB_QPS_ERR;
-       attr_mask        = IB_QP_STATE;
-       if (ib_modify_qp(priv->qp, &qp_attr, attr_mask))
+       if (ib_modify_qp(priv->qp, &qp_attr, IB_QP_STATE))
                ipoib_warn(priv, "Failed to modify QP to ERROR state\n");
 
        /* Wait for all sends and receives to complete */
 
 timeout:
        qp_attr.qp_state = IB_QPS_RESET;
-       attr_mask        = IB_QP_STATE;
-       if (ib_modify_qp(priv->qp, &qp_attr, attr_mask))
+       if (ib_modify_qp(priv->qp, &qp_attr, IB_QP_STATE))
                ipoib_warn(priv, "Failed to modify QP to RESET state\n");
 
        /* Wait for all AHs to be reaped */
 
 {
        struct ipoib_dev_priv *priv = netdev_priv(dev);
        struct ib_qp_attr *qp_attr;
-       int attr_mask;
        int ret;
        u16 pkey_index;
 
 
        /* set correct QKey for QP */
        qp_attr->qkey = priv->qkey;
-       attr_mask = IB_QP_QKEY;
-       ret = ib_modify_qp(priv->qp, qp_attr, attr_mask);
+       ret = ib_modify_qp(priv->qp, qp_attr, IB_QP_QKEY);
        if (ret) {
                ipoib_warn(priv, "failed to modify QP, ret = %d\n", ret);
                goto out;