Commit 11b8e22d authored by Steve Wise's avatar Steve Wise Committed by Roland Dreier

RDMA/cxgb4: Fix vlan support

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: default avatarSteve Wise <swise@opengridcomputing.com>
Signed-off-by: default avatarRoland Dreier <roland@purestorage.com>
parent 65b302ad
...@@ -47,6 +47,8 @@ ...@@ -47,6 +47,8 @@
#include <net/ip6_route.h> #include <net/ip6_route.h>
#include <net/addrconf.h> #include <net/addrconf.h>
#include <rdma/ib_addr.h>
#include "iw_cxgb4.h" #include "iw_cxgb4.h"
static char *states[] = { static char *states[] = {
...@@ -341,10 +343,7 @@ static struct sk_buff *get_skb(struct sk_buff *skb, int len, gfp_t gfp) ...@@ -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) static struct net_device *get_real_dev(struct net_device *egress_dev)
{ {
struct net_device *phys_dev = egress_dev; return rdma_vlan_dev_real_dev(egress_dev) ? : egress_dev;
if (egress_dev->priv_flags & IFF_802_1Q_VLAN)
phys_dev = vlan_dev_real_dev(egress_dev);
return phys_dev;
} }
static int our_interface(struct c4iw_dev *dev, struct net_device *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, ...@@ -1746,16 +1745,16 @@ static int import_ep(struct c4iw_ep *ep, int iptype, __u8 *peer_ip,
if (!ep->l2t) if (!ep->l2t)
goto out; goto out;
ep->mtu = dst_mtu(dst); ep->mtu = dst_mtu(dst);
ep->tx_chan = cxgb4_port_chan(n->dev); ep->tx_chan = cxgb4_port_chan(pdev);
ep->smac_idx = (cxgb4_port_viid(n->dev) & 0x7F) << 1; ep->smac_idx = (cxgb4_port_viid(pdev) & 0x7F) << 1;
step = cdev->rdev.lldi.ntxq / step = cdev->rdev.lldi.ntxq /
cdev->rdev.lldi.nchan; cdev->rdev.lldi.nchan;
ep->txq_idx = cxgb4_port_idx(n->dev) * step; ep->txq_idx = cxgb4_port_idx(pdev) * step;
ep->ctrlq_idx = cxgb4_port_idx(n->dev); ep->ctrlq_idx = cxgb4_port_idx(pdev);
step = cdev->rdev.lldi.nrxq / step = cdev->rdev.lldi.nrxq /
cdev->rdev.lldi.nchan; cdev->rdev.lldi.nchan;
ep->rss_qid = cdev->rdev.lldi.rxq_ids[ ep->rss_qid = cdev->rdev.lldi.rxq_ids[
cxgb4_port_idx(n->dev) * step]; cxgb4_port_idx(pdev) * step];
if (clear_mpa_v1) { if (clear_mpa_v1) {
ep->retry_with_mpa_v1 = 0; ep->retry_with_mpa_v1 = 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment