]> git.openfabrics.org - ~emulex/compat-rdma.git/commitdiff
cxgb4: Fix vlan support in sles and rhel backport.
authorSteve Wise <swise@opengridcomputing.com>
Thu, 28 Aug 2014 21:07:29 +0000 (16:07 -0500)
committerSteve Wise <swise@opengridcomputing.com>
Thu, 28 Aug 2014 21:07:29 +0000 (16:07 -0500)
If a tagged packet arrives it will cause a crash in t4_ethrx_handler()
due to a bug in the backports causing a skb to be freed twice.  Also in
the RHEL backport, needed to add a vlan netdev op for it to work at all.

Signed-off-by: Steve Wise <swise@opengridcomputing.com>
patches/0033-cxgb4-vlanfix.patch [new file with mode: 0644]
patches/0034-cxgb4-rhel-vlanfix.patch [new file with mode: 0644]

diff --git a/patches/0033-cxgb4-vlanfix.patch b/patches/0033-cxgb4-vlanfix.patch
new file mode 100644 (file)
index 0000000..c2be211
--- /dev/null
@@ -0,0 +1,45 @@
+--- compat-rdma.org/drivers/net/ethernet/chelsio/cxgb4/sge.c   2014-08-28 13:19:02.000000000 -0500
++++ compat-rdma/drivers/net/ethernet/chelsio/cxgb4//sge.c      2014-08-28 13:19:43.000000000 -0500
+@@ -1756,7 +1756,7 @@ int t4_ethrx_handler(struct sge_rspq *q,
+       struct sge *s = &q->adap->sge;
+       int cpl_trace_pkt = is_t4(q->adap->params.chip) ?
+                           CPL_TRACE_PKT : CPL_TRACE_PKT_T5;
+-#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 1, 0)
++#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 0, 0)
+       struct port_info *pi;
+ #endif
+@@ -1783,7 +1783,7 @@ int t4_ethrx_handler(struct sge_rspq *q,
+       skb_record_rx_queue(skb, q->idx);
+       if (skb->dev->features & NETIF_F_RXHASH)
+               skb->rxhash = (__force u32)pkt->rsshdr.hash_val;
+-#if LINUX_VERSION_CODE <= KERNEL_VERSION(3, 1, 0)
++#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 0, 0)
+       pi = netdev_priv(skb->dev);
+ #endif
+@@ -1808,16 +1808,22 @@ int t4_ethrx_handler(struct sge_rspq *q,
+               skb_checksum_none_assert(skb);
+       if (unlikely(pkt->vlan_ex)) {
+-#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 1, 0)
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 0, 0)
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0)
+               __vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), ntohs(pkt->vlan));
+ #else
++              __vlan_hwaccel_put_tag(skb, ntohs(pkt->vlan));
++#endif
++              rxq->stats.vlan_ex++;
++#else
+               struct vlan_group *grp = pi->vlan_grp;
+               if (likely(grp))
+                       vlan_hwaccel_receive_skb(skb, grp, ntohs(pkt->vlan));
+               else
+                       dev_kfree_skb_any(skb);
+-#endif
+               rxq->stats.vlan_ex++;
++              return 0;
++#endif
+       }
+       netif_receive_skb(skb);
+       return 0;
diff --git a/patches/0034-cxgb4-rhel-vlanfix.patch b/patches/0034-cxgb4-rhel-vlanfix.patch
new file mode 100644 (file)
index 0000000..107c00e
--- /dev/null
@@ -0,0 +1,31 @@
+--- compat-rdma/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c        2014-08-28 15:32:56.316456204 -0500
++++ compat-rdma.new/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c    2014-08-28 15:28:29.061456300 -0500
+@@ -4693,6 +4693,18 @@ static int cxgb_set_mac_addr(struct net_
+       return 0;
+ }
++#if LINUX_VERSION_CODE < KERNEL_VERSION(3,1,0)
++static void vlan_rx_register(struct net_device *dev, struct vlan_group *grp)
++{
++        struct port_info *pi = netdev_priv(dev);
++        struct adapter *adapter = pi->adapter;
++
++        pi->vlan_grp = grp;
++        t4_set_rxmode(adapter, adapter->mbox, pi->viid, -1, -1, -1, -1,
++                      grp != NULL, 0);
++}
++#endif
++
+ #ifdef CONFIG_NET_POLL_CONTROLLER
+ static void cxgb_netpoll(struct net_device *dev)
+ {
+@@ -4730,6 +4742,9 @@ static const struct net_device_ops cxgb4
+ #ifdef CONFIG_NET_POLL_CONTROLLER
+       .ndo_poll_controller  = cxgb_netpoll,
+ #endif
++#if LINUX_VERSION_CODE < KERNEL_VERSION(3,1,0)
++        .ndo_vlan_rx_register   = vlan_rx_register,
++#endif
+ };
+ void t4_fatal_err(struct adapter *adap)