From 11c62b41fabcf3a286abf6ac6d8d464380dff521 Mon Sep 17 00:00:00 2001 From: Steve Wise Date: Thu, 28 Aug 2014 16:07:29 -0500 Subject: [PATCH] cxgb4: Fix vlan support in sles and rhel backport. 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 --- patches/0033-cxgb4-vlanfix.patch | 45 +++++++++++++++++++++++++++ patches/0034-cxgb4-rhel-vlanfix.patch | 31 ++++++++++++++++++ 2 files changed, 76 insertions(+) create mode 100644 patches/0033-cxgb4-vlanfix.patch create mode 100644 patches/0034-cxgb4-rhel-vlanfix.patch diff --git a/patches/0033-cxgb4-vlanfix.patch b/patches/0033-cxgb4-vlanfix.patch new file mode 100644 index 0000000..c2be211 --- /dev/null +++ b/patches/0033-cxgb4-vlanfix.patch @@ -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 index 0000000..107c00e --- /dev/null +++ b/patches/0034-cxgb4-rhel-vlanfix.patch @@ -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) -- 2.41.0