From: Kumar Sanghvi Date: Tue, 24 Dec 2013 18:58:29 +0000 (+0530) Subject: iw_cxgb4: Backports for RHEL6.4, RHEL6.5 and SLES11sp3 X-Git-Tag: compat-rdma-2014-01-30~12 X-Git-Url: https://openfabrics.org/gitweb/?a=commitdiff_plain;h=159289c50561ac74154b4768316ae96fee789d1b;p=~emulex%2Ffor-vlad%2Fcompat-rdma.git iw_cxgb4: Backports for RHEL6.4, RHEL6.5 and SLES11sp3 Signed-off-by: Kumar Sanghvi --- diff --git a/patches/0010-iw_cxgb4_RHEL64-RHEL65-SLES11SP3-backport.patch b/patches/0010-iw_cxgb4_RHEL64-RHEL65-SLES11SP3-backport.patch new file mode 100644 index 0000000..1ea60b4 --- /dev/null +++ b/patches/0010-iw_cxgb4_RHEL64-RHEL65-SLES11SP3-backport.patch @@ -0,0 +1,210 @@ +diff --git a/drivers/infiniband/hw/cxgb4/cm.c b/drivers/infiniband/hw/cxgb4/cm.c +index 4512687..5a1bf82 100644 +--- a/drivers/infiniband/hw/cxgb4/cm.c ++++ b/drivers/infiniband/hw/cxgb4/cm.c +@@ -363,6 +363,7 @@ static struct dst_entry *find_route6(struct c4iw_dev *dev, __u8 *local_ip, + struct dst_entry *dst = NULL; + + if (IS_ENABLED(CONFIG_IPV6)) { ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 0, 0) + struct flowi6 fl6; + + memset(&fl6, 0, sizeof(fl6)); +@@ -371,6 +372,18 @@ static struct dst_entry *find_route6(struct c4iw_dev *dev, __u8 *local_ip, + if (ipv6_addr_type(&fl6.daddr) & IPV6_ADDR_LINKLOCAL) + fl6.flowi6_oif = sin6_scope_id; + dst = ip6_route_output(&init_net, NULL, &fl6); ++#else ++ struct flowi fl; ++ ++ memset(&fl, 0, sizeof(fl)); ++ fl.proto = IPPROTO_TCP; ++ ipv6_addr_copy(&fl.fl6_src, (struct in6_addr *)local_ip); ++ ipv6_addr_copy(&fl.fl6_dst, (struct in6_addr *)peer_ip); ++ fl.fl_ip_dport = peer_port; ++ fl.fl_ip_sport = local_port; ++ ++ dst = ip6_route_output(&init_net, NULL, &fl); ++#endif + if (!dst) + goto out; + if (!our_interface(dev, ip6_dst_idev(dst)->dev) && +@@ -389,6 +402,7 @@ static struct dst_entry *find_route(struct c4iw_dev *dev, __be32 local_ip, + __be16 peer_port, u8 tos) + { + struct rtable *rt; ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 0, 0) + struct flowi4 fl4; + struct neighbour *n; + +@@ -397,7 +411,12 @@ static struct dst_entry *find_route(struct c4iw_dev *dev, __be32 local_ip, + tos, 0); + if (IS_ERR(rt)) + return NULL; ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 1, 0) + n = dst_neigh_lookup(&rt->dst, &peer_ip); ++#endif ++#if LINUX_VERSION_CODE < KERNEL_VERSION(3,3,0) ++ n = dst_get_neighbour(&rt->dst); ++#endif + if (!n) + return NULL; + if (!our_interface(dev, n->dev)) { +@@ -406,6 +425,33 @@ static struct dst_entry *find_route(struct c4iw_dev *dev, __be32 local_ip, + } + neigh_release(n); + return &rt->dst; ++#else ++ struct flowi fl = { ++ .oif = 0, ++ .nl_u = { ++ .ip4_u = { ++ .daddr = peer_ip, ++ .saddr = local_ip, ++ .tos = tos} ++ }, ++ .proto = IPPROTO_TCP, ++ .uli_u = { ++ .ports = { ++ .sport = local_port, ++ .dport = peer_port} ++ } ++ }; ++ ++ if (ip_route_output_flow(&init_net, &rt, &fl, NULL, 0)) ++ return NULL; ++ ++ if (!our_interface(dev, rt->u.dst.neighbour->dev) && ++ !(rt->u.dst.neighbour->dev->flags & IFF_LOOPBACK)) { ++ dst_release(&rt->u.dst); ++ return NULL; ++ } ++ return &rt->u.dst; ++#endif + } + + static void arp_failure_discard(void *handle, struct sk_buff *skb) +@@ -1657,11 +1703,22 @@ static int import_ep(struct c4iw_ep *ep, int iptype, __u8 *peer_ip, + int err, step; + struct net_device *pdev; + ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0) + n = dst_neigh_lookup(dst, peer_ip); + if (!n) + return -ENODEV; + + rcu_read_lock(); ++#else ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 3, 0) ++ n = dst_get_neighbour_noref(dst); ++#else ++ n = dst_get_neighbour(dst); ++#endif ++ err = -ENODEV; ++ if (!n) ++ goto out; ++#endif + err = -ENOMEM; + if (n->dev->flags & IFF_LOOPBACK) { + if (iptype == 4) +@@ -1723,7 +1780,9 @@ static int import_ep(struct c4iw_ep *ep, int iptype, __u8 *peer_ip, + out: + rcu_read_unlock(); + ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0) + neigh_release(n); ++#endif + + return err; + } +@@ -2649,7 +2708,11 @@ static int get_lladdr(struct net_device *dev, struct in6_addr *addr, + struct inet6_ifaddr *ifp; + + read_lock_bh(&idev->lock); ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 35) + list_for_each_entry(ifp, &idev->addr_list, if_list) { ++#else ++ for (ifp=idev->addr_list; ifp; ifp=ifp->if_next) { ++#endif + if (ifp->scope == IFA_LINK && + !(ifp->flags & banned_flags)) { + memcpy(addr, &ifp->addr, 16); +@@ -3162,7 +3225,15 @@ static void build_cpl_pass_accept_req(struct sk_buff *skb, int stid , u8 tos) + */ + memset(&tmp_opt, 0, sizeof(tmp_opt)); + tcp_clear_options(&tmp_opt); ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 33) ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0) + tcp_parse_options(skb, &tmp_opt, 0, NULL); ++#else ++ tcp_parse_options(skb, &tmp_opt, 0, 0); ++#endif ++#else ++ tcp_parse_options(skb, &tmp_opt, 0); ++#endif + + req = (struct cpl_pass_accept_req *)__skb_push(skb, sizeof(*req)); + memset(req, 0, sizeof(*req)); +@@ -3324,7 +3395,15 @@ static int rx_pkt(struct c4iw_dev *dev, struct sk_buff *skb) + __func__); + goto reject; + } ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 0, 0) ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 1, 0) + neigh = dst_neigh_lookup_skb(dst, skb); ++#else ++ neigh = dst_get_neighbour(dst); ++#endif ++#else ++ neigh = dst->neighbour; ++#endif + + if (!neigh) { + pr_err("%s - failed to allocate neigh!\n", +diff --git a/drivers/infiniband/hw/cxgb4/iw_cxgb4.h b/drivers/infiniband/hw/cxgb4/iw_cxgb4.h +index 23eaeab..8fb094c 100644 +--- a/drivers/infiniband/hw/cxgb4/iw_cxgb4.h ++++ b/drivers/infiniband/hw/cxgb4/iw_cxgb4.h +@@ -261,6 +261,7 @@ static inline int _insert_handle(struct c4iw_dev *rhp, struct idr *idr, + { + int ret; + ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0) + if (lock) { + idr_preload(GFP_KERNEL); + spin_lock_irq(&rhp->lock); +@@ -275,6 +276,22 @@ static inline int _insert_handle(struct c4iw_dev *rhp, struct idr *idr, + + BUG_ON(ret == -ENOSPC); + return ret < 0 ? ret : 0; ++#else ++ int newid; ++ ++ do { ++ if (!idr_pre_get(idr, lock ? GFP_KERNEL : GFP_ATOMIC)) ++ return -ENOMEM; ++ if (lock) ++ spin_lock_irq(&rhp->lock); ++ ret = idr_get_new_above(idr, handle, id, &newid); ++ BUG_ON(!ret && newid != id); ++ if (lock) ++ spin_unlock_irq(&rhp->lock); ++ } while (ret == -EAGAIN); ++ ++ return ret; ++#endif + } + + static inline int insert_handle(struct c4iw_dev *rhp, struct idr *idr, +diff --git a/drivers/infiniband/hw/cxgb4/mem.c b/drivers/infiniband/hw/cxgb4/mem.c +index 4cb8eb2..0804aca 100644 +--- a/drivers/infiniband/hw/cxgb4/mem.c ++++ b/drivers/infiniband/hw/cxgb4/mem.c +@@ -34,6 +34,7 @@ + #include + #include + #include ++#include + + #include "iw_cxgb4.h" +