]> err.no Git - linux-2.6/blobdiff - drivers/infiniband/ulp/ipoib/ipoib_cm.c
Merge branch 'for-2.6.26' of master.kernel.org:/pub/scm/linux/kernel/git/jwboyer...
[linux-2.6] / drivers / infiniband / ulp / ipoib / ipoib_cm.c
index 2490b2d79dbb739713422c07fc4457700500928b..97e67d36378fa1532cb2224624ae20ea53acefe2 100644 (file)
@@ -249,8 +249,8 @@ static struct ib_qp *ipoib_cm_create_rx_qp(struct net_device *dev,
        struct ipoib_dev_priv *priv = netdev_priv(dev);
        struct ib_qp_init_attr attr = {
                .event_handler = ipoib_cm_rx_event_handler,
-               .send_cq = priv->cq, /* For drain WR */
-               .recv_cq = priv->cq,
+               .send_cq = priv->recv_cq, /* For drain WR */
+               .recv_cq = priv->recv_cq,
                .srq = priv->cm.srq,
                .cap.max_send_wr = 1, /* For drain WR */
                .cap.max_send_sge = 1, /* FIXME: 0 Seems not to work */
@@ -951,8 +951,8 @@ static struct ib_qp *ipoib_cm_create_tx_qp(struct net_device *dev, struct ipoib_
 {
        struct ipoib_dev_priv *priv = netdev_priv(dev);
        struct ib_qp_init_attr attr = {
-               .send_cq                = priv->cq,
-               .recv_cq                = priv->cq,
+               .send_cq                = priv->recv_cq,
+               .recv_cq                = priv->recv_cq,
                .srq                    = priv->cm.srq,
                .cap.max_send_wr        = ipoib_sendq_size,
                .cap.max_send_sge       = 1,
@@ -1007,9 +1007,9 @@ static int ipoib_cm_modify_tx_init(struct net_device *dev,
        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;
        }
 
@@ -1383,6 +1383,10 @@ static ssize_t set_mode(struct device *d, struct device_attribute *attr,
                set_bit(IPOIB_FLAG_ADMIN_CM, &priv->flags);
                ipoib_warn(priv, "enabling connected mode "
                           "will cause multicast packet drops\n");
+
+               dev->features &= ~(NETIF_F_IP_CSUM | NETIF_F_SG | NETIF_F_TSO);
+               priv->tx_wr.send_flags &= ~IB_SEND_IP_CSUM;
+
                ipoib_flush_paths(dev);
                return count;
        }
@@ -1391,6 +1395,13 @@ static ssize_t set_mode(struct device *d, struct device_attribute *attr,
                clear_bit(IPOIB_FLAG_ADMIN_CM, &priv->flags);
                dev->mtu = min(priv->mcast_mtu, dev->mtu);
                ipoib_flush_paths(dev);
+
+               if (test_bit(IPOIB_FLAG_CSUM, &priv->flags)) {
+                       dev->features |= NETIF_F_IP_CSUM | NETIF_F_SG;
+                       if (priv->hca_caps & IB_DEVICE_UD_TSO)
+                               dev->features |= NETIF_F_TSO;
+               }
+
                return count;
        }