priv->hca_caps = hca->attrs.device_cap_flags;
 
        if (priv->hca_caps & IB_DEVICE_UD_IP_CSUM) {
-               priv->dev->hw_features = NETIF_F_SG |
-                       NETIF_F_IP_CSUM | NETIF_F_RXCSUM;
+               priv->dev->hw_features = NETIF_F_IP_CSUM | NETIF_F_RXCSUM;
 
                if (priv->hca_caps & IB_DEVICE_UD_TSO)
                        priv->dev->hw_features |= NETIF_F_TSO;
 
                .cap = {
                        .max_send_wr  = ipoib_sendq_size,
                        .max_recv_wr  = ipoib_recvq_size,
-                       .max_send_sge = 1,
+                       .max_send_sge = min_t(u32, priv->ca->attrs.max_sge,
+                                             MAX_SKB_FRAGS + 1),
                        .max_recv_sge = IPOIB_UD_RX_SG
                },
                .sq_sig_type = IB_SIGNAL_ALL_WR,
        if (priv->hca_caps & IB_DEVICE_MANAGED_FLOW_STEERING)
                init_attr.create_flags |= IB_QP_CREATE_NETIF_QP;
 
-       if (dev->features & NETIF_F_SG)
-               init_attr.cap.max_send_sge =
-                       min_t(u32, priv->ca->attrs.max_sge, MAX_SKB_FRAGS + 1);
-
        priv->qp = ib_create_qp(priv->pd, &init_attr);
        if (IS_ERR(priv->qp)) {
                printk(KERN_WARNING "%s: failed to create QP\n", ca->name);
        priv->rx_wr.next = NULL;
        priv->rx_wr.sg_list = priv->rx_sge;
 
+       if (init_attr.cap.max_send_sge > 1)
+               dev->features |= NETIF_F_SG;
+
        priv->max_send_sge = init_attr.cap.max_send_sge;
 
        return 0;