RDMA/cxgb4: Fix vlan support
authorSteve Wise <swise@opengridcomputing.com>
Fri, 16 May 2014 17:42:46 +0000 (12:42 -0500)
committerRoland Dreier <roland@purestorage.com>
Tue, 20 May 2014 01:00:32 +0000 (18:00 -0700)
RDMA connections over a vlan interface don't work due to
import_ep() not using the correct egress device.

 - use the real device in import_ep()
 - use rdma_vlan_dev_real_dev() in get_real_dev().

Signed-off-by: Steve Wise <swise@opengridcomputing.com>
Signed-off-by: Roland Dreier <roland@purestorage.com>
drivers/infiniband/hw/cxgb4/cm.c

index 1f863a96a480fd1ab087989acea029a781c7c23e..28114e6b02e96bda7cf503e8e74a73fde19399d0 100644 (file)
@@ -47,6 +47,8 @@
 #include <net/ip6_route.h>
 #include <net/addrconf.h>
 
+#include <rdma/ib_addr.h>
+
 #include "iw_cxgb4.h"
 
 static char *states[] = {
@@ -341,10 +343,7 @@ static struct sk_buff *get_skb(struct sk_buff *skb, int len, gfp_t gfp)
 
 static struct net_device *get_real_dev(struct net_device *egress_dev)
 {
-       struct net_device *phys_dev = egress_dev;
-       if (egress_dev->priv_flags & IFF_802_1Q_VLAN)
-               phys_dev = vlan_dev_real_dev(egress_dev);
-       return phys_dev;
+       return rdma_vlan_dev_real_dev(egress_dev) ? : egress_dev;
 }
 
 static int our_interface(struct c4iw_dev *dev, struct net_device *egress_dev)
@@ -1746,16 +1745,16 @@ static int import_ep(struct c4iw_ep *ep, int iptype, __u8 *peer_ip,
                if (!ep->l2t)
                        goto out;
                ep->mtu = dst_mtu(dst);
-               ep->tx_chan = cxgb4_port_chan(n->dev);
-               ep->smac_idx = (cxgb4_port_viid(n->dev) & 0x7F) << 1;
+               ep->tx_chan = cxgb4_port_chan(pdev);
+               ep->smac_idx = (cxgb4_port_viid(pdev) & 0x7F) << 1;
                step = cdev->rdev.lldi.ntxq /
                        cdev->rdev.lldi.nchan;
-               ep->txq_idx = cxgb4_port_idx(n->dev) * step;
-               ep->ctrlq_idx = cxgb4_port_idx(n->dev);
+               ep->txq_idx = cxgb4_port_idx(pdev) * step;
+               ep->ctrlq_idx = cxgb4_port_idx(pdev);
                step = cdev->rdev.lldi.nrxq /
                        cdev->rdev.lldi.nchan;
                ep->rss_qid = cdev->rdev.lldi.rxq_ids[
-                       cxgb4_port_idx(n->dev) * step];
+                       cxgb4_port_idx(pdev) * step];
 
                if (clear_mpa_v1) {
                        ep->retry_with_mpa_v1 = 0;