+++ /dev/null
-Index: compat-rdma/drivers/infiniband/core/umem.c
-===================================================================
---- compat-rdma.orig/drivers/infiniband/core/umem.c
-+++ compat-rdma/drivers/infiniband/core/umem.c
-@@ -137,7 +137,7 @@ struct ib_umem *ib_umem_get(struct ib_uc
-
- down_write(¤t->mm->mmap_sem);
-
-- locked = npages + current->mm->pinned_vm;
-+ locked = npages + current->mm->locked_vm;
- lock_limit = rlimit(RLIMIT_MEMLOCK) >> PAGE_SHIFT;
-
- if ((locked > lock_limit) && !capable(CAP_IPC_LOCK)) {
-@@ -207,7 +207,7 @@ out:
- __ib_umem_release(context->device, umem, 0);
- kfree(umem);
- } else
-- current->mm->pinned_vm = locked;
-+ current->mm->locked_vm = locked;
-
- up_write(¤t->mm->mmap_sem);
- if (vma_list)
-@@ -223,7 +223,7 @@ static void ib_umem_account(struct work_
- struct ib_umem *umem = container_of(work, struct ib_umem, work);
-
- down_write(&umem->mm->mmap_sem);
-- umem->mm->pinned_vm -= umem->diff;
-+ umem->mm->locked_vm -= umem->diff;
- up_write(&umem->mm->mmap_sem);
- mmput(umem->mm);
- kfree(umem);
-Index: compat-rdma/drivers/infiniband/hw/ipath/ipath_user_pages.c
-===================================================================
---- compat-rdma.orig/drivers/infiniband/hw/ipath/ipath_user_pages.c
-+++ compat-rdma/drivers/infiniband/hw/ipath/ipath_user_pages.c
-@@ -79,7 +79,7 @@ static int __ipath_get_user_pages(unsign
- goto bail_release;
- }
-
-- current->mm->pinned_vm += num_pages;
-+ current->mm->locked_vm += num_pages;
-
- ret = 0;
- goto bail;
-@@ -178,7 +178,7 @@ void ipath_release_user_pages(struct pag
-
- __ipath_release_user_pages(p, num_pages, 1);
-
-- current->mm->pinned_vm -= num_pages;
-+ current->mm->locked_vm -= num_pages;
-
- up_write(¤t->mm->mmap_sem);
- }
-@@ -195,7 +195,7 @@ static void user_pages_account(struct wo
- container_of(_work, struct ipath_user_pages_work, work);
-
- down_write(&work->mm->mmap_sem);
-- work->mm->pinned_vm -= work->num_pages;
-+ work->mm->locked_vm -= work->num_pages;
- up_write(&work->mm->mmap_sem);
- mmput(work->mm);
- kfree(work);
-Index: compat-rdma/drivers/infiniband/hw/qib/qib_user_pages.c
-===================================================================
---- compat-rdma.orig/drivers/infiniband/hw/qib/qib_user_pages.c
-+++ compat-rdma/drivers/infiniband/hw/qib/qib_user_pages.c
-@@ -74,7 +74,7 @@ static int __qib_get_user_pages(unsigned
- goto bail_release;
- }
-
-- current->mm->pinned_vm += num_pages;
-+ current->mm->locked_vm += num_pages;
-
- ret = 0;
- goto bail;
-@@ -151,7 +151,7 @@ void qib_release_user_pages(struct page
- __qib_release_user_pages(p, num_pages, 1);
-
- if (current->mm) {
-- current->mm->pinned_vm -= num_pages;
-+ current->mm->locked_vm -= num_pages;
- up_write(¤t->mm->mmap_sem);
- }
- }
+++ /dev/null
-Index: compat-rdma/drivers/net/ethernet/mellanox/mlx4/en_rx.c
-===================================================================
---- compat-rdma.orig/drivers/net/ethernet/mellanox/mlx4/en_rx.c 2012-01-09 16:15:04.000000000 +0200
-+++ compat-rdma/drivers/net/ethernet/mellanox/mlx4/en_rx.c 2012-01-23 11:52:39.899175000 +0200
-@@ -44,7 +44,7 @@
-
- static int mlx4_en_alloc_frag(struct mlx4_en_priv *priv,
- struct mlx4_en_rx_desc *rx_desc,
-- struct page_frag *skb_frags,
-+ struct skb_frag_struct *skb_frags,
- struct mlx4_en_rx_alloc *ring_alloc,
- int i)
- {
-@@ -61,7 +61,7 @@ static int mlx4_en_alloc_frag(struct mlx
- return -ENOMEM;
-
- skb_frags[i].page = page_alloc->page;
-- skb_frags[i].offset = page_alloc->offset;
-+ skb_frags[i].page_offset = page_alloc->offset;
- page_alloc->page = page;
- page_alloc->offset = frag_info->frag_align;
- } else {
-@@ -69,11 +69,11 @@ static int mlx4_en_alloc_frag(struct mlx
- get_page(page);
-
- skb_frags[i].page = page;
-- skb_frags[i].offset = page_alloc->offset;
-+ skb_frags[i].page_offset = page_alloc->offset;
- page_alloc->offset += frag_info->frag_stride;
- }
- dma = pci_map_single(mdev->pdev, page_address(skb_frags[i].page) +
-- skb_frags[i].offset, frag_info->frag_size,
-+ skb_frags[i].page_offset, frag_info->frag_size,
- PCI_DMA_FROMDEVICE);
- rx_desc->data[i].addr = cpu_to_be64(dma);
- return 0;
-@@ -157,8 +157,8 @@ static int mlx4_en_prepare_rx_desc(struc
- struct mlx4_en_rx_ring *ring, int index)
- {
- struct mlx4_en_rx_desc *rx_desc = ring->buf + (index * ring->stride);
-- struct page_frag *skb_frags = ring->rx_info +
-- (index << priv->log_rx_info);
-+ struct skb_frag_struct *skb_frags = ring->rx_info +
-+ (index << priv->log_rx_info);
- int i;
-
- for (i = 0; i < priv->num_frags; i++)
-@@ -183,7 +183,7 @@ static void mlx4_en_free_rx_desc(struct
- int index)
- {
- struct mlx4_en_dev *mdev = priv->mdev;
-- struct page_frag *skb_frags;
-+ struct skb_frag_struct *skb_frags;
- struct mlx4_en_rx_desc *rx_desc = ring->buf + (index << ring->log_stride);
- dma_addr_t dma;
- int nr;
-@@ -194,7 +194,7 @@ static void mlx4_en_free_rx_desc(struct
- dma = be64_to_cpu(rx_desc->data[nr].addr);
-
- en_dbg(DRV, priv, "Unmapping buffer at dma:0x%llx\n", (u64) dma);
-- pci_unmap_single(mdev->pdev, dma, skb_frags[nr].size,
-+ pci_unmap_single(mdev->pdev, dma, skb_frag_size(&skb_frags[nr]),
- PCI_DMA_FROMDEVICE);
- put_page(skb_frags[nr].page);
- }
-@@ -403,7 +403,7 @@ void mlx4_en_deactivate_rx_ring(struct m
- /* Unmap a completed descriptor and free unused pages */
- static int mlx4_en_complete_rx_desc(struct mlx4_en_priv *priv,
- struct mlx4_en_rx_desc *rx_desc,
-- struct page_frag *skb_frags,
-+ struct skb_frag_struct *skb_frags,
- struct sk_buff *skb,
- struct mlx4_en_rx_alloc *page_alloc,
- int length)
-@@ -421,9 +421,9 @@ static int mlx4_en_complete_rx_desc(stru
- break;
-
- /* Save page reference in skb */
-- __skb_frag_set_page(&skb_frags_rx[nr], skb_frags[nr].page);
-- skb_frag_size_set(&skb_frags_rx[nr], skb_frags[nr].size);
-- skb_frags_rx[nr].page_offset = skb_frags[nr].offset;
-+ skb_frags_rx[nr].page = skb_frags[nr].page;
-+ skb_frag_size_set(&skb_frags_rx[nr], skb_frag_size(&skb_frags[nr]));
-+ skb_frags_rx[nr].page_offset = skb_frags[nr].page_offset;
- skb->truesize += frag_info->frag_stride;
- dma = be64_to_cpu(rx_desc->data[nr].addr);
-
-@@ -446,7 +446,7 @@ fail:
- * the descriptor) of this packet; remaining fragments are reused... */
- while (nr > 0) {
- nr--;
-- __skb_frag_unref(&skb_frags_rx[nr]);
-+ put_page(skb_frags_rx[nr].page);
- }
- return 0;
- }
-@@ -454,7 +454,7 @@ fail:
-
- static struct sk_buff *mlx4_en_rx_skb(struct mlx4_en_priv *priv,
- struct mlx4_en_rx_desc *rx_desc,
-- struct page_frag *skb_frags,
-+ struct skb_frag_struct *skb_frags,
- struct mlx4_en_rx_alloc *page_alloc,
- unsigned int length)
- {
-@@ -475,7 +475,7 @@ static struct sk_buff *mlx4_en_rx_skb(st
-
- /* Get pointer to first fragment so we could copy the headers into the
- * (linear part of the) skb */
-- va = page_address(skb_frags[0].page) + skb_frags[0].offset;
-+ va = page_address(skb_frags[0].page) + skb_frags[0].page_offset;
-
- if (length <= SMALL_PACKET_SIZE) {
- /* We are copying all relevant data to the skb - temporarily
-@@ -533,7 +533,7 @@ int mlx4_en_process_rx_cq(struct net_dev
- struct mlx4_en_priv *priv = netdev_priv(dev);
- struct mlx4_cqe *cqe;
- struct mlx4_en_rx_ring *ring = &priv->rx_ring[cq->ring];
-- struct page_frag *skb_frags;
-+ struct skb_frag_struct *skb_frags;
- struct mlx4_en_rx_desc *rx_desc;
- struct sk_buff *skb;
- int index;
+++ /dev/null
-Index: compat-rdma/drivers/infiniband/ulp/iser/iscsi_iser.c
-===================================================================
---- compat-rdma.orig/drivers/infiniband/ulp/iser/iscsi_iser.c
-+++ compat-rdma/drivers/infiniband/ulp/iser/iscsi_iser.c
-@@ -719,7 +719,9 @@ static struct iscsi_transport iscsi_iser
- .create_conn = iscsi_iser_conn_create,
- .bind_conn = iscsi_iser_conn_bind,
- .destroy_conn = iscsi_iser_conn_destroy,
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(3,2,0))
- .attr_is_visible = iser_attr_is_visible,
-+#endif
- .set_param = iscsi_iser_set_param,
- .get_conn_param = iscsi_conn_get_param,
- .get_ep_param = iscsi_iser_get_ep_param,
+++ /dev/null
-From 9e60fe057cb38b467dfbac003175644519920cac Mon Sep 17 00:00:00 2001
-From: Vladimir Sokolovsky <vlad@mellanox.com>
-Date: Fri, 23 Mar 2012 21:21:06 +0200
-Subject: [PATCH] ib/core: Add RHEL6.2 backports
-
-Signed-off-by: Vladimir Sokolovsky <vlad@mellanox.com>
----
- include/rdma/ib_addr.h | 1 +
- drivers/infiniband/core/addr.c | 42 ++++++++++++++++----------------
- drivers/infiniband/core/mad.c | 19 ++++++++++++--
- drivers/infiniband/core/netlink.c | 10 ++++---
- drivers/infiniband/core/sysfs.c | 1 -
- drivers/infiniband/core/ucm.c | 13 ++++++----
- drivers/infiniband/core/user_mad.c | 9 ++++--
- drivers/infiniband/core/uverbs_main.c | 9 ++++--
- 8 files changed, 64 insertions(+), 40 deletions(-)
-
-diff --git a/include/rdma/ib_addr.h b/include/rdma/ib_addr.h
-index 639a449..a040c9c 100644
---- a/include/rdma/ib_addr.h
-+++ b/include/rdma/ib_addr.h
-@@ -40,6 +40,7 @@
- #include <linux/netdevice.h>
- #include <linux/socket.h>
- #include <linux/if_vlan.h>
-+#include <linux/rtnetlink.h>
- #include <rdma/ib_verbs.h>
- #include <rdma/ib_pack.h>
-
-diff --git a/drivers/infiniband/core/addr.c b/drivers/infiniband/core/addr.c
-index e9cf51b..f72272c 100644
---- a/drivers/infiniband/core/addr.c
-+++ b/drivers/infiniband/core/addr.c
-@@ -186,22 +186,22 @@ static int addr4_resolve(struct sockaddr_in *src_in,
- __be32 dst_ip = dst_in->sin_addr.s_addr;
- struct rtable *rt;
- struct neighbour *neigh;
-- struct flowi4 fl4;
-+ struct flowi fl;
- int ret;
-
-- memset(&fl4, 0, sizeof(fl4));
-- fl4.daddr = dst_ip;
-- fl4.saddr = src_ip;
-- fl4.flowi4_oif = addr->bound_dev_if;
-- rt = ip_route_output_key(&init_net, &fl4);
-+ memset(&fl, 0, sizeof(fl));
-+ fl.nl_u.ip4_u.daddr = dst_ip;
-+ fl.nl_u.ip4_u.saddr = src_ip;
-+ fl.oif = addr->bound_dev_if;
-+ ret = ip_route_output_key(&init_net, &rt, &fl);
- if (IS_ERR(rt)) {
- ret = PTR_ERR(rt);
- goto out;
- }
- src_in->sin_family = AF_INET;
-- src_in->sin_addr.s_addr = fl4.saddr;
-+ src_in->sin_addr.s_addr = rt->rt_src;
-
-- if (rt->dst.dev->flags & IFF_LOOPBACK) {
-+ if (rt->idev->dev->flags & IFF_LOOPBACK) {
- ret = rdma_translate_ip((struct sockaddr *) dst_in, addr);
- if (!ret)
- memcpy(addr->dst_dev_addr, addr->src_dev_addr, MAX_ADDR_LEN);
-@@ -209,15 +209,15 @@ static int addr4_resolve(struct sockaddr_in *src_in,
- }
-
- /* If the device does ARP internally, return 'done' */
-- if (rt->dst.dev->flags & IFF_NOARP) {
-- ret = rdma_copy_addr(addr, rt->dst.dev, NULL);
-+ if (rt->idev->dev->flags & IFF_NOARP) {
-+ ret = rdma_copy_addr(addr, rt->idev->dev, NULL);
- goto put;
- }
-
-- neigh = neigh_lookup(&arp_tbl, &rt->rt_gateway, rt->dst.dev);
-+ neigh = neigh_lookup(&arp_tbl, &rt->rt_gateway, rt->idev->dev);
- if (!neigh || !(neigh->nud_state & NUD_VALID)) {
- rcu_read_lock();
-- neigh_event_send(dst_get_neighbour(&rt->dst), NULL);
-+ neigh_event_send(rt->u.dst.neighbour, NULL);
- rcu_read_unlock();
- ret = -ENODATA;
- if (neigh)
-@@ -239,28 +239,28 @@ static int addr6_resolve(struct sockaddr_in6 *src_in,
- struct sockaddr_in6 *dst_in,
- struct rdma_dev_addr *addr)
- {
-- struct flowi6 fl6;
-+ struct flowi fl;
- struct neighbour *neigh;
- struct dst_entry *dst;
- int ret;
-
-- memset(&fl6, 0, sizeof fl6);
-- ipv6_addr_copy(&fl6.daddr, &dst_in->sin6_addr);
-- ipv6_addr_copy(&fl6.saddr, &src_in->sin6_addr);
-- fl6.flowi6_oif = addr->bound_dev_if;
-+ memset(&fl, 0, sizeof fl);
-+ ipv6_addr_copy(&fl.fl6_dst, &dst_in->sin6_addr);
-+ ipv6_addr_copy(&fl.fl6_src, &src_in->sin6_addr);
-+ fl.oif = addr->bound_dev_if;
-
-- dst = ip6_route_output(&init_net, NULL, &fl6);
-+ dst = ip6_route_output(&init_net, NULL, &fl);
- if ((ret = dst->error))
- goto put;
-
-- if (ipv6_addr_any(&fl6.saddr)) {
-+ if (ipv6_addr_any(&fl.fl6_src)) {
- ret = ipv6_dev_get_saddr(&init_net, ip6_dst_idev(dst)->dev,
-- &fl6.daddr, 0, &fl6.saddr);
-+ &fl.fl6_dst, 0, &fl.fl6_src);
- if (ret)
- goto put;
-
- src_in->sin6_family = AF_INET6;
-- ipv6_addr_copy(&src_in->sin6_addr, &fl6.saddr);
-+ ipv6_addr_copy(&src_in->sin6_addr, &fl.fl6_src);
- }
-
- if (dst->dev->flags & IFF_LOOPBACK) {
-diff --git a/drivers/infiniband/core/mad.c b/drivers/infiniband/core/mad.c
-index 2fe428b..a8a769d 100644
---- a/drivers/infiniband/core/mad.c
-+++ b/drivers/infiniband/core/mad.c
-@@ -1200,7 +1200,10 @@ static int method_in_use(struct ib_mad_mgmt_method_table **method,
- {
- int i;
-
-- for_each_set_bit(i, mad_reg_req->method_mask, IB_MGMT_MAX_METHODS) {
-+ for (i = find_first_bit(mad_reg_req->method_mask, IB_MGMT_MAX_METHODS);
-+ i < IB_MGMT_MAX_METHODS;
-+ i = find_next_bit(mad_reg_req->method_mask, IB_MGMT_MAX_METHODS,
-+ 1+i)) {
- if ((*method)->agent[i]) {
- printk(KERN_ERR PFX "Method %d already in use\n", i);
- return -EINVAL;
-@@ -1334,8 +1337,13 @@ static int add_nonoui_reg_req(struct ib_mad_reg_req *mad_reg_req,
- goto error3;
-
- /* Finally, add in methods being registered */
-- for_each_set_bit(i, mad_reg_req->method_mask, IB_MGMT_MAX_METHODS)
-+ for (i = find_first_bit(mad_reg_req->method_mask,
-+ IB_MGMT_MAX_METHODS);
-+ i < IB_MGMT_MAX_METHODS;
-+ i = find_next_bit(mad_reg_req->method_mask, IB_MGMT_MAX_METHODS,
-+ 1+i)) {
- (*method)->agent[i] = agent_priv;
-+ }
-
- return 0;
-
-@@ -1429,8 +1437,13 @@ check_in_use:
- goto error4;
-
- /* Finally, add in methods being registered */
-- for_each_set_bit(i, mad_reg_req->method_mask, IB_MGMT_MAX_METHODS)
-+ for (i = find_first_bit(mad_reg_req->method_mask,
-+ IB_MGMT_MAX_METHODS);
-+ i < IB_MGMT_MAX_METHODS;
-+ i = find_next_bit(mad_reg_req->method_mask, IB_MGMT_MAX_METHODS,
-+ 1+i)) {
- (*method)->agent[i] = agent_priv;
-+ }
-
- return 0;
-
-diff --git a/drivers/infiniband/core/netlink.c b/drivers/infiniband/core/netlink.c
-index d1c8196..3e62f8b 100644
---- a/drivers/infiniband/core/netlink.c
-+++ b/drivers/infiniband/core/netlink.c
-@@ -30,7 +30,9 @@
- * SOFTWARE.
- */
-
-+#ifndef pr_fmt
- #define pr_fmt(fmt) "%s:%s: " fmt, KBUILD_MODNAME, __func__
-+#endif
-
- #include <linux/export.h>
- #include <net/netlink.h>
-@@ -67,7 +69,7 @@ int ibnl_add_client(int index, int nops,
-
- list_for_each_entry(cur, &client_list, list) {
- if (cur->index == index) {
-- pr_warn("Client for %d already exists\n", index);
-+ printk("Client for %d already exists\n", index);
- mutex_unlock(&ibnl_mutex);
- kfree(nl_client);
- return -EINVAL;
-@@ -95,7 +97,7 @@ int ibnl_remove_client(int index)
- return 0;
- }
- }
-- pr_warn("Can't remove callback for client idx %d. Not found\n", index);
-+ printk("Can't remove callback for client idx %d. Not found\n", index);
- mutex_unlock(&ibnl_mutex);
-
- return -EINVAL;
-@@ -149,7 +151,7 @@ static int ibnl_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
- return -EINVAL;
- return netlink_dump_start(nls, skb, nlh,
- client->cb_table[op].dump,
-- NULL, 0);
-+ NULL);
- }
- }
-
-@@ -169,7 +171,7 @@ int __init ibnl_init(void)
- nls = netlink_kernel_create(&init_net, NETLINK_RDMA, 0, ibnl_rcv,
- NULL, THIS_MODULE);
- if (!nls) {
-- pr_warn("Failed to create netlink socket\n");
-+ printk("Failed to create netlink socket\n");
- return -ENOMEM;
- }
-
-diff --git a/drivers/infiniband/core/sysfs.c b/drivers/infiniband/core/sysfs.c
-index c61bca3..2b4d2fc 100644
---- a/drivers/infiniband/core/sysfs.c
-+++ b/drivers/infiniband/core/sysfs.c
-@@ -495,7 +495,6 @@ alloc_group_attrs(ssize_t (*show)(struct ib_port *,
- element->attr.attr.mode = S_IRUGO;
- element->attr.show = show;
- element->index = i;
-- sysfs_attr_init(&element->attr.attr);
-
- tab_attr[i] = &element->attr.attr;
- }
-diff --git a/drivers/infiniband/core/ucm.c b/drivers/infiniband/core/ucm.c
-index b8a0b4a..d249a44 100644
---- a/drivers/infiniband/core/ucm.c
-+++ b/drivers/infiniband/core/ucm.c
-@@ -1333,8 +1333,11 @@ static void ib_ucm_remove_one(struct ib_device *device)
- device_unregister(&ucm_dev->dev);
- }
-
--static CLASS_ATTR_STRING(abi_version, S_IRUGO,
-- __stringify(IB_USER_CM_ABI_VERSION));
-+static ssize_t show_abi_version(struct class *class, char *buf)
-+{
-+ return sprintf(buf, "%d\n", IB_USER_CM_ABI_VERSION);
-+}
-+static CLASS_ATTR(abi_version, S_IRUGO, show_abi_version, NULL);
-
- static int __init ib_ucm_init(void)
- {
-@@ -1347,7 +1350,7 @@ static int __init ib_ucm_init(void)
- goto error1;
- }
-
-- ret = class_create_file(&cm_class, &class_attr_abi_version.attr);
-+ ret = class_create_file(&cm_class, &class_attr_abi_version);
- if (ret) {
- printk(KERN_ERR "ucm: couldn't create abi_version attribute\n");
- goto error2;
-@@ -1361,7 +1364,7 @@ static int __init ib_ucm_init(void)
- return 0;
-
- error3:
-- class_remove_file(&cm_class, &class_attr_abi_version.attr);
-+ class_remove_file(&cm_class, &class_attr_abi_version);
- error2:
- unregister_chrdev_region(IB_UCM_BASE_DEV, IB_UCM_MAX_DEVICES);
- error1:
-@@ -1371,7 +1374,7 @@ error1:
- static void __exit ib_ucm_cleanup(void)
- {
- ib_unregister_client(&ucm_client);
-- class_remove_file(&cm_class, &class_attr_abi_version.attr);
-+ class_remove_file(&cm_class, &class_attr_abi_version);
- unregister_chrdev_region(IB_UCM_BASE_DEV, IB_UCM_MAX_DEVICES);
- if (overflow_maj)
- unregister_chrdev_region(overflow_maj, IB_UCM_MAX_DEVICES);
-diff --git a/drivers/infiniband/core/user_mad.c b/drivers/infiniband/core/user_mad.c
-index 07db229..2fc66f0 100644
---- a/drivers/infiniband/core/user_mad.c
-+++ b/drivers/infiniband/core/user_mad.c
-@@ -969,8 +969,11 @@ static ssize_t show_port(struct device *dev, struct device_attribute *attr,
- }
- static DEVICE_ATTR(port, S_IRUGO, show_port, NULL);
-
--static CLASS_ATTR_STRING(abi_version, S_IRUGO,
-- __stringify(IB_USER_MAD_ABI_VERSION));
-+static ssize_t show_abi_version(struct class *class, char *buf)
-+{
-+ return sprintf(buf, "%d\n", IB_USER_MAD_ABI_VERSION);
-+}
-+static CLASS_ATTR(abi_version, S_IRUGO, show_abi_version, NULL);
-
- static dev_t overflow_maj;
- static DECLARE_BITMAP(overflow_map, IB_UMAD_MAX_PORTS);
-@@ -1200,7 +1203,7 @@ static int __init ib_umad_init(void)
-
- umad_class->devnode = umad_devnode;
-
-- ret = class_create_file(umad_class, &class_attr_abi_version.attr);
-+ ret = class_create_file(umad_class, &class_attr_abi_version);
- if (ret) {
- printk(KERN_ERR "user_mad: couldn't create abi_version attribute\n");
- goto out_class;
-diff --git a/drivers/infiniband/core/uverbs_main.c b/drivers/infiniband/core/uverbs_main.c
-index 8796367..9ce0700 100644
---- a/drivers/infiniband/core/uverbs_main.c
-+++ b/drivers/infiniband/core/uverbs_main.c
-@@ -715,8 +715,11 @@ static ssize_t show_dev_abi_version(struct device *device,
- }
- static DEVICE_ATTR(abi_version, S_IRUGO, show_dev_abi_version, NULL);
-
--static CLASS_ATTR_STRING(abi_version, S_IRUGO,
-- __stringify(IB_USER_VERBS_ABI_VERSION));
-+static ssize_t show_abi_version(struct class *class, char *buf)
-+{
-+ return sprintf(buf, "%d\n", IB_USER_VERBS_ABI_VERSION);
-+}
-+static CLASS_ATTR(abi_version, S_IRUGO, show_abi_version, NULL);
-
- static dev_t overflow_maj;
- static DECLARE_BITMAP(overflow_map, IB_UVERBS_MAX_DEVICES);
-@@ -873,7 +876,7 @@ static int __init ib_uverbs_init(void)
-
- uverbs_class->devnode = uverbs_devnode;
-
-- ret = class_create_file(uverbs_class, &class_attr_abi_version.attr);
-+ ret = class_create_file(uverbs_class, &class_attr_abi_version);
- if (ret) {
- printk(KERN_ERR "user_verbs: couldn't create abi_version attribute\n");
- goto out_class;
---
-1.5.4.3
-
+++ /dev/null
-From d351f953e3bc99e834b820702d7e121e153ada70 Mon Sep 17 00:00:00 2001
-From: Vladimir Sokolovsky <vlad@mellanox.com>
-Date: Fri, 23 Mar 2012 21:30:36 +0200
-Subject: [PATCH] ipoib: Add RHEL6.2 backports
-
-Signed-off-by: Vladimir Sokolovsky <vlad@mellanox.com>
----
- drivers/infiniband/ulp/ipoib/ipoib.h | 1 +
- drivers/infiniband/ulp/ipoib/ipoib_cm.c | 17 +++++++++++++----
- drivers/infiniband/ulp/ipoib/ipoib_main.c | 17 ++---------------
- drivers/infiniband/ulp/ipoib/ipoib_multicast.c | 11 ++++++-----
- 4 files changed, 22 insertions(+), 24 deletions(-)
-
-diff --git a/drivers/infiniband/ulp/ipoib/ipoib.h b/drivers/infiniband/ulp/ipoib/ipoib.h
-index b3cc1e0..c89fb6c 100644
---- a/drivers/infiniband/ulp/ipoib/ipoib.h
-+++ b/drivers/infiniband/ulp/ipoib/ipoib.h
-@@ -91,6 +91,7 @@ enum {
- IPOIB_STOP_REAPER = 7,
- IPOIB_FLAG_ADMIN_CM = 9,
- IPOIB_FLAG_UMCAST = 10,
-+ IPOIB_FLAG_CSUM = 11,
-
- IPOIB_MAX_BACKOFF_SECONDS = 16,
-
-diff --git a/drivers/infiniband/ulp/ipoib/ipoib_cm.c b/drivers/infiniband/ulp/ipoib/ipoib_cm.c
-index 014504d..d9f2eaf 100644
---- a/drivers/infiniband/ulp/ipoib/ipoib_cm.c
-+++ b/drivers/infiniband/ulp/ipoib/ipoib_cm.c
-@@ -1097,12 +1097,13 @@ static int ipoib_cm_tx_init(struct ipoib_cm_tx *p, u32 qpn,
- struct ipoib_dev_priv *priv = netdev_priv(p->dev);
- int ret;
-
-- p->tx_ring = vzalloc(ipoib_sendq_size * sizeof *p->tx_ring);
-+ p->tx_ring = vmalloc(ipoib_sendq_size * sizeof *p->tx_ring);
- if (!p->tx_ring) {
- ipoib_warn(priv, "failed to allocate tx ring\n");
- ret = -ENOMEM;
- goto err_tx;
- }
-+ memset(p->tx_ring, 0, ipoib_sendq_size * sizeof *p->tx_ring);
-
- p->qp = ipoib_cm_create_tx_qp(p->dev, p);
- if (IS_ERR(p->qp)) {
-@@ -1378,7 +1379,7 @@ static void ipoib_cm_skb_reap(struct work_struct *work)
- icmp_send(skb, ICMP_DEST_UNREACH, ICMP_FRAG_NEEDED, htonl(mtu));
- #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
- else if (skb->protocol == htons(ETH_P_IPV6))
-- icmpv6_send(skb, ICMPV6_PKT_TOOBIG, 0, mtu);
-+ icmpv6_send(skb, ICMPV6_PKT_TOOBIG, 0, mtu, priv->dev);
- #endif
- dev_kfree_skb_any(skb);
-
-@@ -1465,7 +1466,11 @@ static ssize_t set_mode(struct device *d, struct device_attribute *attr,
- set_bit(IPOIB_FLAG_ADMIN_CM, &priv->flags);
- ipoib_warn(priv, "enabling connected mode "
- "will cause multicast packet drops\n");
-- netdev_update_features(dev);
-+ dev->features &= ~(NETIF_F_IP_CSUM | NETIF_F_SG | NETIF_F_TSO);
-+ if (ipoib_cm_max_mtu(dev) > priv->mcast_mtu)
-+ ipoib_warn(priv, "mtu > %d will cause multicast packet drops.\n",
-+ priv->mcast_mtu);
-+ dev_set_mtu(dev, ipoib_cm_max_mtu(dev));
- rtnl_unlock();
- priv->tx_wr.send_flags &= ~IB_SEND_IP_CSUM;
-
-@@ -1475,7 +1480,11 @@ static ssize_t set_mode(struct device *d, struct device_attribute *attr,
-
- if (!strcmp(buf, "datagram\n")) {
- clear_bit(IPOIB_FLAG_ADMIN_CM, &priv->flags);
-- netdev_update_features(dev);
-+ if (test_bit(IPOIB_FLAG_CSUM, &priv->flags)) {
-+ dev->features |= NETIF_F_IP_CSUM | NETIF_F_SG;
-+ if (priv->hca_caps & IB_DEVICE_UD_TSO)
-+ dev->features |= NETIF_F_TSO;
-+ }
- dev_set_mtu(dev, min(priv->mcast_mtu, dev->mtu));
- rtnl_unlock();
- ipoib_flush_paths(dev);
-diff --git a/drivers/infiniband/ulp/ipoib/ipoib_main.c b/drivers/infiniband/ulp/ipoib/ipoib_main.c
-index 83695b4..4f77a5a 100644
---- a/drivers/infiniband/ulp/ipoib/ipoib_main.c
-+++ b/drivers/infiniband/ulp/ipoib/ipoib_main.c
-@@ -171,16 +171,6 @@ static int ipoib_stop(struct net_device *dev)
- return 0;
- }
-
--static u32 ipoib_fix_features(struct net_device *dev, u32 features)
--{
-- struct ipoib_dev_priv *priv = netdev_priv(dev);
--
-- if (test_bit(IPOIB_FLAG_ADMIN_CM, &priv->flags))
-- features &= ~(NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_TSO);
--
-- return features;
--}
--
- static int ipoib_change_mtu(struct net_device *dev, int new_mtu)
- {
- struct ipoib_dev_priv *priv = netdev_priv(dev);
-@@ -999,7 +989,6 @@ static const struct net_device_ops ipoib_netdev_ops = {
- .ndo_open = ipoib_open,
- .ndo_stop = ipoib_stop,
- .ndo_change_mtu = ipoib_change_mtu,
-- .ndo_fix_features = ipoib_fix_features,
- .ndo_start_xmit = ipoib_start_xmit,
- .ndo_tx_timeout = ipoib_timeout,
- .ndo_set_rx_mode = ipoib_set_mcast_list,
-@@ -1184,13 +1173,11 @@ int ipoib_set_dev_features(struct ipoib_dev_priv *priv, struct ib_device *hca)
- kfree(device_attr);
-
- if (priv->hca_caps & IB_DEVICE_UD_IP_CSUM) {
-- priv->dev->hw_features = NETIF_F_SG |
-+ priv->dev->features = NETIF_F_SG |
- NETIF_F_IP_CSUM | NETIF_F_RXCSUM;
-
- if (priv->hca_caps & IB_DEVICE_UD_TSO)
-- priv->dev->hw_features |= NETIF_F_TSO;
--
-- priv->dev->features |= priv->dev->hw_features;
-+ priv->dev->features |= NETIF_F_TSO;
- }
-
- return 0;
-diff --git a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
-index 873bff9..411c544 100644
---- a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
-+++ b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
-@@ -269,7 +269,7 @@ static int ipoib_mcast_join_finish(struct ipoib_mcast *mcast,
-
- skb->dev = dev;
- if (dst)
-- n = dst_get_neighbour_raw(dst);
-+ n = dst->neighbour;
- if (!dst || !n) {
- /* put pseudoheader back on for next time */
- skb_push(skb, sizeof (struct ipoib_pseudoheader));
-@@ -796,7 +796,7 @@ void ipoib_mcast_restart_task(struct work_struct *work)
- struct ipoib_dev_priv *priv =
- container_of(work, struct ipoib_dev_priv, restart_task);
- struct net_device *dev = priv->dev;
-- struct netdev_hw_addr *ha;
-+ struct dev_mc_list *mclist;
- struct ipoib_mcast *mcast, *tmcast;
- LIST_HEAD(remove_list);
- unsigned long flags;
-@@ -821,13 +821,14 @@ void ipoib_mcast_restart_task(struct work_struct *work)
- clear_bit(IPOIB_MCAST_FLAG_FOUND, &mcast->flags);
-
- /* Mark all of the entries that are found or don't exist */
-- netdev_for_each_mc_addr(ha, dev) {
-+ for (mclist = dev->mc_list; mclist; mclist = mclist->next) {
- union ib_gid mgid;
-
-- if (!ipoib_mcast_addr_is_valid(ha->addr, dev->broadcast))
-+ if (!ipoib_mcast_addr_is_valid(mclist->dmi_addr,
-+ dev->broadcast))
- continue;
-
-- memcpy(mgid.raw, ha->addr + 4, sizeof mgid);
-+ memcpy(mgid.raw, mclist->dmi_addr + 4, sizeof mgid);
-
- mcast = __ipoib_mcast_find(dev, &mgid);
- if (!mcast || test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags)) {
---
-1.5.4.3
-
+++ /dev/null
-From ac7e5469789da2ef1aa24cf1f28c23a0d630a294 Mon Sep 17 00:00:00 2001
-From: Vladimir Sokolovsky <vlad@mellanox.com>
-Date: Fri, 23 Mar 2012 21:34:13 +0200
-Subject: [PATCH] mlx4_en: Add RHEL6.2 backports
-
-Signed-off-by: Vladimir Sokolovsky <vlad@mellanox.com>
----
- drivers/net/ethernet/mellanox/mlx4/en_netdev.c | 71 ++++++++++++++----------
- drivers/net/ethernet/mellanox/mlx4/mlx4_en.h | 3 +-
- 2 files changed, 42 insertions(+), 32 deletions(-)
-
-diff --git a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
-index 78d776b..776475d 100644
---- a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
-+++ b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
-@@ -146,29 +146,40 @@ static void mlx4_en_do_set_mac(struct work_struct *work)
- static void mlx4_en_clear_list(struct net_device *dev)
- {
- struct mlx4_en_priv *priv = netdev_priv(dev);
-+ struct dev_mc_list *plist = priv->mc_list;
-+ struct dev_mc_list *next;
-
-- kfree(priv->mc_addrs);
-- priv->mc_addrs_cnt = 0;
-+ while (plist) {
-+ next = plist->next;
-+ kfree(plist);
-+ plist = next;
-+ }
-+ priv->mc_list = NULL;
- }
-
- static void mlx4_en_cache_mclist(struct net_device *dev)
- {
- struct mlx4_en_priv *priv = netdev_priv(dev);
-- struct netdev_hw_addr *ha;
-- char *mc_addrs;
-- int mc_addrs_cnt = netdev_mc_count(dev);
-- int i;
--
-- mc_addrs = kmalloc(mc_addrs_cnt * ETH_ALEN, GFP_ATOMIC);
-- if (!mc_addrs) {
-- en_err(priv, "failed to allocate multicast list\n");
-- return;
-+ struct dev_mc_list *mclist;
-+ struct dev_mc_list *tmp;
-+ struct dev_mc_list *plist = NULL;
-+
-+ mlx4_en_clear_list(dev);
-+ for (mclist = dev->mc_list; mclist; mclist = mclist->next) {
-+ tmp = kmalloc(sizeof(struct dev_mc_list), GFP_ATOMIC);
-+ if (!tmp) {
-+ en_err(priv, "failed to allocate multicast list\n");
-+ mlx4_en_clear_list(dev);
-+ return;
-+ }
-+ memcpy(tmp, mclist, sizeof(struct dev_mc_list));
-+ tmp->next = NULL;
-+ if (plist)
-+ plist->next = tmp;
-+ else
-+ priv->mc_list = tmp;
-+ plist = tmp;
- }
-- i = 0;
-- netdev_for_each_mc_addr(ha, dev)
-- memcpy(mc_addrs + i++ * ETH_ALEN, ha->addr, ETH_ALEN);
-- priv->mc_addrs = mc_addrs;
-- priv->mc_addrs_cnt = mc_addrs_cnt;
- }
-
-
-@@ -188,6 +199,7 @@ static void mlx4_en_do_set_multicast(struct work_struct *work)
- mcast_task);
- struct mlx4_en_dev *mdev = priv->mdev;
- struct net_device *dev = priv->dev;
-+ struct dev_mc_list *mclist;
- u64 mcast_addr = 0;
- u8 mc_list[16] = {0};
- int err;
-@@ -300,7 +312,6 @@ static void mlx4_en_do_set_multicast(struct work_struct *work)
- priv->flags |= MLX4_EN_FLAG_MC_PROMISC;
- }
- } else {
-- int i;
- /* Disable Multicast promisc */
- if (priv->flags & MLX4_EN_FLAG_MC_PROMISC) {
- err = mlx4_multicast_promisc_remove(mdev->dev, priv->base_qpn,
-@@ -316,8 +327,8 @@ static void mlx4_en_do_set_multicast(struct work_struct *work)
- en_err(priv, "Failed disabling multicast filter\n");
-
- /* Detach our qp from all the multicast addresses */
-- for (i = 0; i < priv->mc_addrs_cnt; i++) {
-- memcpy(&mc_list[10], priv->mc_addrs + i * ETH_ALEN, ETH_ALEN);
-+ for (mclist = priv->mc_list; mclist; mclist = mclist->next) {
-+ memcpy(&mc_list[10], mclist->dmi_addr, ETH_ALEN);
- mc_list[5] = priv->port;
- mlx4_multicast_detach(mdev->dev, &priv->rss_map.indir_qp,
- mc_list, MLX4_PROT_ETH);
-@@ -331,13 +342,12 @@ static void mlx4_en_do_set_multicast(struct work_struct *work)
- netif_tx_lock_bh(dev);
- mlx4_en_cache_mclist(dev);
- netif_tx_unlock_bh(dev);
-- for (i = 0; i < priv->mc_addrs_cnt; i++) {
-- mcast_addr =
-- mlx4_en_mac_to_u64(priv->mc_addrs + i * ETH_ALEN);
-- memcpy(&mc_list[10], priv->mc_addrs + i * ETH_ALEN, ETH_ALEN);
-+ for (mclist = priv->mc_list; mclist; mclist = mclist->next) {
-+ memcpy(&mc_list[10], mclist->dmi_addr, ETH_ALEN);
- mc_list[5] = priv->port;
- mlx4_multicast_attach(mdev->dev, &priv->rss_map.indir_qp,
- mc_list, 0, MLX4_PROT_ETH);
-+ mcast_addr = mlx4_en_mac_to_u64(mclist->dmi_addr);
- mlx4_SET_MCAST_FLTR(mdev->dev, priv->port,
- mcast_addr, 0, MLX4_MCAST_CONFIG);
- }
-@@ -714,6 +724,7 @@ void mlx4_en_stop_port(struct net_device *dev)
- {
- struct mlx4_en_priv *priv = netdev_priv(dev);
- struct mlx4_en_dev *mdev = priv->mdev;
-+ struct dev_mc_list *mclist;
- int i;
- u8 mc_list[16] = {0};
-
-@@ -735,8 +746,8 @@ void mlx4_en_stop_port(struct net_device *dev)
- mc_list[5] = priv->port;
- mlx4_multicast_detach(mdev->dev, &priv->rss_map.indir_qp, mc_list,
- MLX4_PROT_ETH);
-- for (i = 0; i < priv->mc_addrs_cnt; i++) {
-- memcpy(&mc_list[10], priv->mc_addrs + i * ETH_ALEN, ETH_ALEN);
-+ for (mclist = priv->mc_list; mclist; mclist = mclist->next) {
-+ memcpy(&mc_list[10], mclist->dmi_addr, ETH_ALEN);
- mc_list[5] = priv->port;
- mlx4_multicast_detach(mdev->dev, &priv->rss_map.indir_qp,
- mc_list, MLX4_PROT_ETH);
-@@ -1078,14 +1089,14 @@ int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port,
- /*
- * Set driver features
- */
-- dev->hw_features = NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM;
-+ dev->features = NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM;
- if (mdev->LSO_support)
-- dev->hw_features |= NETIF_F_TSO | NETIF_F_TSO6;
-+ dev->features |= NETIF_F_TSO | NETIF_F_TSO6;
-
-- dev->vlan_features = dev->hw_features;
-+ dev->vlan_features = dev->features;
-
-- dev->hw_features |= NETIF_F_RXCSUM | NETIF_F_RXHASH;
-- dev->features = dev->hw_features | NETIF_F_HIGHDMA |
-+ dev->features |= NETIF_F_RXCSUM | NETIF_F_RXHASH |
-+ NETIF_F_HIGHDMA |
- NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX |
- NETIF_F_HW_VLAN_FILTER;
-
-diff --git a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h
-index 207b5ad..6b99109 100644
---- a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h
-+++ b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h
-@@ -485,8 +485,7 @@ struct mlx4_en_priv {
- struct mlx4_en_perf_stats pstats;
- struct mlx4_en_pkt_stats pkstats;
- struct mlx4_en_port_stats port_stats;
-- char *mc_addrs;
-- int mc_addrs_cnt;
-+ struct dev_mc_list *mc_list;
- struct mlx4_en_stat_out_mbox hw_stats;
- int vids[128];
- bool wol;
---
-1.5.4.3
-
+++ /dev/null
-From 06357ad55ed41358be53d656451721d7df6eac6e Mon Sep 17 00:00:00 2001
-From: Vladimir Sokolovsky <vlad@mellanox.com>
-Date: Fri, 23 Mar 2012 21:34:39 +0200
-Subject: [PATCH] mlx4_ib: Add RHEL6.2 backports
-
-Signed-off-by: Vladimir Sokolovsky <vlad@mellanox.com>
----
- drivers/infiniband/hw/mlx4/main.c | 4 ++--
- 1 files changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/drivers/infiniband/hw/mlx4/main.c b/drivers/infiniband/hw/mlx4/main.c
-index 18836cd..c12c292 100644
---- a/drivers/infiniband/hw/mlx4/main.c
-+++ b/drivers/infiniband/hw/mlx4/main.c
-@@ -698,7 +698,7 @@ int mlx4_ib_add_mc(struct mlx4_ib_dev *mdev, struct mlx4_ib_qp *mqp,
- if (ndev) {
- rdma_get_mcast_mac((struct in6_addr *)gid, mac);
- rtnl_lock();
-- dev_mc_add(mdev->iboe.netdevs[mqp->port - 1], mac);
-+ dev_mc_add(mdev->iboe.netdevs[mqp->port - 1], mac, 6, 0);
- ret = 1;
- rtnl_unlock();
- dev_put(ndev);
-@@ -771,7 +771,7 @@ static int mlx4_ib_mcg_detach(struct ib_qp *ibqp, union ib_gid *gid, u16 lid)
- rdma_get_mcast_mac((struct in6_addr *)gid, mac);
- if (ndev) {
- rtnl_lock();
-- dev_mc_del(mdev->iboe.netdevs[ge->port - 1], mac);
-+ dev_mc_delete(mdev->iboe.netdevs[ge->port - 1], mac, 6, 0);
- rtnl_unlock();
- dev_put(ndev);
- }
---
-1.5.4.3
-
+++ /dev/null
-From 7fcb2f5260095d495a96f53642e593e023a9a9b6 Mon Sep 17 00:00:00 2001
-From: Vladimir Sokolovsky <vlad@mellanox.com>
-Date: Fri, 23 Mar 2012 21:36:27 +0200
-Subject: [PATCH] rds: Add RHEL6.2 backports
-
-Signed-off-by: Vladimir Sokolovsky <vlad@mellanox.com>
----
- net/rds/tcp_listen.c | 9 +++++++++
- 1 files changed, 9 insertions(+), 0 deletions(-)
-
-diff --git a/net/rds/tcp_listen.c b/net/rds/tcp_listen.c
-index 8b5cc4a..4c5ab88 100644
---- a/net/rds/tcp_listen.c
-+++ b/net/rds/tcp_listen.c
-@@ -67,12 +67,21 @@ static int rds_tcp_accept_one(struct socket *sock)
-
- inet = inet_sk(new_sock->sk);
-
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,32))
- rdsdebug("accepted tcp %pI4:%u -> %pI4:%u\n",
- &inet->inet_saddr, ntohs(inet->inet_sport),
- &inet->inet_daddr, ntohs(inet->inet_dport));
-
- conn = rds_conn_create(inet->inet_saddr, inet->inet_daddr,
- &rds_tcp_transport, GFP_KERNEL);
-+#else
-+ rdsdebug("accepted tcp %pI4:%u -> %pI4:%u\n",
-+ &inet->saddr, ntohs(inet->sport),
-+ &inet->daddr, ntohs(inet->dport));
-+
-+ conn = rds_conn_create(inet->saddr, inet->daddr,
-+ &rds_tcp_transport, GFP_KERNEL);
-+#endif
- if (IS_ERR(conn)) {
- ret = PTR_ERR(conn);
- goto out;
---
-1.5.4.3
-
+++ /dev/null
-From 198ea4dc9d2e1e38995ca5442d71b8bee9247a0c Mon Sep 17 00:00:00 2001
-From: Vipul Pandya <vipul@chelsio.com>
-Date: Mon, 7 May 2012 14:17:55 +0530
-Subject: [PATCH 01/14] cxgb4: Reversing convert to SKB paged frag API.
-
-This patch is a reverse patch of upstream commit
-e91b0f2491f7a7b21c4e562df09f3dbe551f0fe2
-
-Signed-off-by: Vipul Pandya <vipul@chelsio.com>
----
- drivers/net/ethernet/chelsio/cxgb4/cxgb4.h | 2 +-
- drivers/net/ethernet/chelsio/cxgb4/sge.c | 47 ++++++++++++++-------------
- 2 files changed, 25 insertions(+), 24 deletions(-)
-
-diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h b/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h
-index 0fe1885..223a7f7 100644
---- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h
-+++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h
-@@ -326,7 +326,7 @@ struct sge_fl { /* SGE free-buffer queue state */
-
- /* A packet gather list */
- struct pkt_gl {
-- struct page_frag frags[MAX_SKB_FRAGS];
-+ skb_frag_t frags[MAX_SKB_FRAGS];
- void *va; /* virtual address of first byte */
- unsigned int nfrags; /* # of fragments */
- unsigned int tot_len; /* total length of fragments */
-diff --git a/drivers/net/ethernet/chelsio/cxgb4/sge.c b/drivers/net/ethernet/chelsio/cxgb4/sge.c
-index 140254c..7fa9fd0 100644
---- a/drivers/net/ethernet/chelsio/cxgb4/sge.c
-+++ b/drivers/net/ethernet/chelsio/cxgb4/sge.c
-@@ -216,8 +216,8 @@ static int map_skb(struct device *dev, const struct sk_buff *skb,
- end = &si->frags[si->nr_frags];
-
- for (fp = si->frags; fp < end; fp++) {
-- *++addr = skb_frag_dma_map(dev, fp, 0, skb_frag_size(fp),
-- DMA_TO_DEVICE);
-+ *++addr = dma_map_page(dev, fp->page, fp->page_offset,
-+ skb_frag_size(fp), DMA_TO_DEVICE);
- if (dma_mapping_error(dev, *addr))
- goto unwind;
- }
-@@ -1410,23 +1410,23 @@ int cxgb4_ofld_send(struct net_device *dev, struct sk_buff *skb)
- }
- EXPORT_SYMBOL(cxgb4_ofld_send);
-
--static inline void copy_frags(struct sk_buff *skb,
-+static inline void copy_frags(struct skb_shared_info *ssi,
- const struct pkt_gl *gl, unsigned int offset)
- {
-- int i;
-+ unsigned int n;
-
- /* usually there's just one frag */
-- __skb_fill_page_desc(skb, 0, gl->frags[0].page,
-- gl->frags[0].offset + offset,
-- gl->frags[0].size - offset);
-- skb_shinfo(skb)->nr_frags = gl->nfrags;
-- for (i = 1; i < gl->nfrags; i++)
-- __skb_fill_page_desc(skb, i, gl->frags[i].page,
-- gl->frags[i].offset,
-- gl->frags[i].size);
-+ ssi->frags[0].page = gl->frags[0].page;
-+ ssi->frags[0].page_offset = gl->frags[0].page_offset + offset;
-+ skb_frag_size_set(&ssi->frags[0],
-+ skb_frag_size(&gl->frags[0]) - offset);
-+ ssi->nr_frags = gl->nfrags;
-+ n = gl->nfrags - 1;
-+ if (n)
-+ memcpy(&ssi->frags[1], &gl->frags[1], n * sizeof(skb_frag_t));
-
- /* get a reference to the last page, we don't own it */
-- get_page(gl->frags[gl->nfrags - 1].page);
-+ get_page(gl->frags[n].page);
- }
-
- /**
-@@ -1461,7 +1461,7 @@ struct sk_buff *cxgb4_pktgl_to_skb(const struct pkt_gl *gl,
- __skb_put(skb, pull_len);
- skb_copy_to_linear_data(skb, gl->va, pull_len);
-
-- copy_frags(skb, gl, pull_len);
-+ copy_frags(skb_shinfo(skb), gl, pull_len);
- skb->len = gl->tot_len;
- skb->data_len = skb->len - pull_len;
- skb->truesize += skb->data_len;
-@@ -1480,7 +1480,7 @@ EXPORT_SYMBOL(cxgb4_pktgl_to_skb);
- static void t4_pktgl_free(const struct pkt_gl *gl)
- {
- int n;
-- const struct page_frag *p;
-+ const skb_frag_t *p;
-
- for (p = gl->frags, n = gl->nfrags - 1; n--; p++)
- put_page(p->page);
-@@ -1524,7 +1524,7 @@ static void do_gro(struct sge_eth_rxq *rxq, const struct pkt_gl *gl,
- return;
- }
-
-- copy_frags(skb, gl, RX_PKT_PAD);
-+ copy_frags(skb_shinfo(skb), gl, RX_PKT_PAD);
- skb->len = gl->tot_len - RX_PKT_PAD;
- skb->data_len = skb->len;
- skb->truesize += skb->data_len;
-@@ -1700,7 +1700,7 @@ static int process_responses(struct sge_rspq *q, int budget)
- rmb();
- rsp_type = RSPD_TYPE(rc->type_gen);
- if (likely(rsp_type == RSP_TYPE_FLBUF)) {
-- struct page_frag *fp;
-+ skb_frag_t *fp;
- struct pkt_gl si;
- const struct rx_sw_desc *rsd;
- u32 len = ntohl(rc->pldbuflen_qid), bufsz, frags;
-@@ -1719,9 +1719,9 @@ static int process_responses(struct sge_rspq *q, int budget)
- rsd = &rxq->fl.sdesc[rxq->fl.cidx];
- bufsz = get_buf_size(rsd);
- fp->page = rsd->page;
-- fp->offset = q->offset;
-- fp->size = min(bufsz, len);
-- len -= fp->size;
-+ fp->page_offset = q->offset;
-+ skb_frag_size_set(fp, min(bufsz, len));
-+ len -= skb_frag_size(fp);
- if (!len)
- break;
- unmap_rx_buf(q->adap, &rxq->fl);
-@@ -1733,16 +1733,17 @@ static int process_responses(struct sge_rspq *q, int budget)
- */
- dma_sync_single_for_cpu(q->adap->pdev_dev,
- get_buf_addr(rsd),
-- fp->size, DMA_FROM_DEVICE);
-+ skb_frag_size(fp),
-+ DMA_FROM_DEVICE);
-
- si.va = page_address(si.frags[0].page) +
-- si.frags[0].offset;
-+ si.frags[0].page_offset;
- prefetch(si.va);
-
- si.nfrags = frags + 1;
- ret = q->handler(q, q->cur_desc, &si);
- if (likely(ret == 0))
-- q->offset += ALIGN(fp->size, FL_ALIGN);
-+ q->offset += ALIGN(skb_frag_size(fp), FL_ALIGN);
- else
- restore_rx_bufs(&si, &rxq->fl, frags);
- } else if (likely(rsp_type == RSP_TYPE_CPL)) {
---
-1.7.1
-
+++ /dev/null
-From 40c9be2518262d444504619daf15205e211d17d5 Mon Sep 17 00:00:00 2001
-From: Faisal Latif <faisal.latif@intel.com>
-Date: Sat, 21 Apr 2012 18:17:40 -0500
-Subject: [PATCH] nes: backport for RHEL6.2
-
-Add RHEL6.2 backports
-
-Signed-off-by: Faisal Latif <faisal.latif@intel.com>
----
- drivers/infiniband/hw/nes/nes.c | 3 +-
- drivers/infiniband/hw/nes/nes_cm.c | 14 ++--
- drivers/infiniband/hw/nes/nes_nic.c | 116 ++++++++++++-----------------------
- 3 files changed, 48 insertions(+), 85 deletions(-)
-
-diff --git a/drivers/infiniband/hw/nes/nes.c b/drivers/infiniband/hw/nes/nes.c
-index 5965b3d..28e7ebc 100644
---- a/drivers/infiniband/hw/nes/nes.c
-+++ b/drivers/infiniband/hw/nes/nes.c
-@@ -150,8 +150,7 @@ static int nes_inetaddr_event(struct notifier_block *notifier,
- nesdev, nesdev->netdev[0]->name);
- netdev = nesdev->netdev[0];
- nesvnic = netdev_priv(netdev);
-- is_bonded = netif_is_bond_slave(netdev) &&
-- (netdev->master == event_netdev);
-+ is_bonded = (netdev->master == event_netdev);
- if ((netdev == event_netdev) || is_bonded) {
- if (nesvnic->rdma_enabled == 0) {
- nes_debug(NES_DBG_NETDEV, "Returning without processing event for %s since"
-diff --git a/drivers/infiniband/hw/nes/nes_cm.c b/drivers/infiniband/hw/nes/nes_cm.c
-index 0a52d72..bc01b81 100644
---- a/drivers/infiniband/hw/nes/nes_cm.c
-+++ b/drivers/infiniband/hw/nes/nes_cm.c
-@@ -1331,19 +1331,21 @@ static inline int mini_cm_accelerated(struct nes_cm_core *cm_core,
- static int nes_addr_resolve_neigh(struct nes_vnic *nesvnic, u32 dst_ip, int arpindex)
- {
- struct rtable *rt;
-+ struct flowi fl;
- struct neighbour *neigh;
- int rc = arpindex;
- struct net_device *netdev;
- struct nes_adapter *nesadapter = nesvnic->nesdev->nesadapter;
-
-- rt = ip_route_output(&init_net, htonl(dst_ip), 0, 0, 0);
-- if (IS_ERR(rt)) {
-+ memset(&fl, 0, sizeof fl);
-+ fl.nl_u.ip4_u.daddr = htonl(dst_ip);
-+ if (ip_route_output_key(&init_net, &rt, &fl)) {
- printk(KERN_ERR "%s: ip_route_output_key failed for 0x%08X\n",
-- __func__, dst_ip);
-+ __func__, dst_ip);
- return rc;
- }
-
-- if (netif_is_bond_slave(nesvnic->netdev))
-+ if (nesvnic->netdev->master)
- netdev = nesvnic->netdev->master;
- else
- netdev = nesvnic->netdev;
-@@ -1378,9 +1380,7 @@ static int nes_addr_resolve_neigh(struct nes_vnic *nesvnic, u32 dst_ip, int arpi
- }
-
- if ((neigh == NULL) || (!(neigh->nud_state & NUD_VALID))) {
-- rcu_read_lock();
-- neigh_event_send(dst_get_neighbour(&rt->dst), NULL);
-- rcu_read_unlock();
-+ neigh_event_send(rt->u.dst.neighbour, NULL);
- }
- ip_rt_put(rt);
- return rc;
-diff --git a/drivers/infiniband/hw/nes/nes_nic.c b/drivers/infiniband/hw/nes/nes_nic.c
-index c00d2f3..89d06f7 100644
---- a/drivers/infiniband/hw/nes/nes_nic.c
-+++ b/drivers/infiniband/hw/nes/nes_nic.c
-@@ -865,6 +865,7 @@ static void nes_netdev_set_multicast_list(struct net_device *netdev)
- struct nes_vnic *nesvnic = netdev_priv(netdev);
- struct nes_device *nesdev = nesvnic->nesdev;
- struct nes_adapter *nesadapter = nesvnic->nesdev->nesadapter;
-+ struct dev_mc_list *multicast_addr;
- u32 nic_active_bit;
- u32 nic_active;
- u32 perfect_filter_register_address;
-@@ -877,7 +878,6 @@ static void nes_netdev_set_multicast_list(struct net_device *netdev)
- nics_per_function, 4);
- u8 max_pft_entries_avaiable = NES_PFT_SIZE - pft_entries_preallocated;
- unsigned long flags;
-- int mc_count = netdev_mc_count(netdev);
-
- spin_lock_irqsave(&nesadapter->resource_lock, flags);
- nic_active_bit = 1 << nesvnic->nic_index;
-@@ -907,61 +907,46 @@ static void nes_netdev_set_multicast_list(struct net_device *netdev)
- mc_count, !!(netdev->flags & IFF_PROMISC),
- !!(netdev->flags & IFF_ALLMULTI));
- if (!mc_all_on) {
-- char *addrs;
-- int i;
-- struct netdev_hw_addr *ha;
--
-- addrs = kmalloc(ETH_ALEN * mc_count, GFP_ATOMIC);
-- if (!addrs) {
-- set_allmulti(nesdev, nic_active_bit);
-- goto unlock;
-- }
-- i = 0;
-- netdev_for_each_mc_addr(ha, netdev)
-- memcpy(get_addr(addrs, i++), ha->addr, ETH_ALEN);
--
-+ multicast_addr = netdev->mc_list;
- perfect_filter_register_address = NES_IDX_PERFECT_FILTER_LOW +
-- pft_entries_preallocated * 0x8;
-- for (i = 0, mc_index = 0; mc_index < max_pft_entries_avaiable;
-- mc_index++) {
-- while (i < mc_count && nesvnic->mcrq_mcast_filter &&
-- ((mc_nic_index = nesvnic->mcrq_mcast_filter(nesvnic,
-- get_addr(addrs, i++))) == 0));
-+ pft_entries_preallocated * 0x8;
-+ for (mc_index = 0; mc_index < max_pft_entries_avaiable;
-+ mc_index++) {
-+ while (multicast_addr && nesvnic->mcrq_mcast_filter &&
-+ ((mc_nic_index = nesvnic->mcrq_mcast_filter(nesvnic,
-+ multicast_addr->dmi_addr)) == 0)) {
-+ multicast_addr = multicast_addr->next;
-+ }
- if (mc_nic_index < 0)
-- mc_nic_index = nesvnic->nic_index;
-+ mc_nic_index = (1 << nesvnic->nic_index);
- while (nesadapter->pft_mcast_map[mc_index] < 16 &&
- nesadapter->pft_mcast_map[mc_index] !=
- nesvnic->nic_index &&
- mc_index < max_pft_entries_avaiable) {
- nes_debug(NES_DBG_NIC_RX,
-- "mc_index=%d skipping nic_index=%d, "
-- "used for=%d \n", mc_index,
-+ "mc_index=%d skipping nic_index=%d,\
-+ used for=%d \n", mc_index,
- nesvnic->nic_index,
- nesadapter->pft_mcast_map[mc_index]);
- mc_index++;
- }
- if (mc_index >= max_pft_entries_avaiable)
- break;
-- if (i < mc_count) {
-- char *addr = get_addr(addrs, i++);
--
-- nes_debug(NES_DBG_NIC_RX, "Assigning MC Address %pM to register 0x%04X nic_idx=%d\n",
-- addr,
-- perfect_filter_register_address+(mc_index * 8),
-- mc_nic_index);
-- macaddr_high = ((u16) addr[0]) << 8;
-- macaddr_high += (u16) addr[1];
-- macaddr_low = ((u32) addr[2]) << 24;
-- macaddr_low += ((u32) addr[3]) << 16;
-- macaddr_low += ((u32) addr[4]) << 8;
-- macaddr_low += (u32) addr[5];
-+ if (multicast_addr) {
-+ macaddr_high = ((u16)multicast_addr->dmi_addr[0]) << 8;
-+ macaddr_high += (u16)multicast_addr->dmi_addr[1];
-+ macaddr_low = ((u32)multicast_addr->dmi_addr[2]) << 24;
-+ macaddr_low += ((u32)multicast_addr->dmi_addr[3]) << 16;
-+ macaddr_low += ((u32)multicast_addr->dmi_addr[4]) << 8;
-+ macaddr_low += (u32)multicast_addr->dmi_addr[5];
- nes_write_indexed(nesdev,
- perfect_filter_register_address+(mc_index * 8),
- macaddr_low);
- nes_write_indexed(nesdev,
- perfect_filter_register_address+4+(mc_index * 8),
- (u32)macaddr_high | NES_MAC_ADDR_VALID |
-- ((((u32)(1<<mc_nic_index)) << 16)));
-+ ((((u32)(mc_nic_index)) << 16)));
-+ multicast_addr = multicast_addr->next;
- nesadapter->pft_mcast_map[mc_index] =
- nesvnic->nic_index;
- } else {
-@@ -973,13 +958,20 @@ static void nes_netdev_set_multicast_list(struct net_device *netdev)
- nesadapter->pft_mcast_map[mc_index] = 255;
- }
- }
-- kfree(addrs);
- /* PFT is not large enough */
-- if (i < mc_count)
-- set_allmulti(nesdev, nic_active_bit);
-+ if (multicast_addr && multicast_addr->next) {
-+ nic_active = nes_read_indexed(nesdev,
-+ NES_IDX_NIC_MULTICAST_ALL);
-+ nic_active |= nic_active_bit;
-+ nes_write_indexed(nesdev, NES_IDX_NIC_MULTICAST_ALL,
-+ nic_active);
-+ nic_active = nes_read_indexed(nesdev,
-+ NES_IDX_NIC_UNICAST_ALL);
-+ nic_active &= ~nic_active_bit;
-+ nes_write_indexed(nesdev, NES_IDX_NIC_UNICAST_ALL,
-+ nic_active);
-+ }
- }
--
--unlock:
- spin_unlock_irqrestore(&nesadapter->resource_lock, flags);
- }
-
-@@ -1610,32 +1602,6 @@ static void nes_vlan_mode(struct net_device *netdev, struct nes_device *nesdev,
- spin_unlock_irqrestore(&nesadapter->phy_lock, flags);
- }
-
--static u32 nes_fix_features(struct net_device *netdev, u32 features)
--{
-- /*
-- * Since there is no support for separate rx/tx vlan accel
-- * enable/disable make sure tx flag is always in same state as rx.
-- */
-- if (features & NETIF_F_HW_VLAN_RX)
-- features |= NETIF_F_HW_VLAN_TX;
-- else
-- features &= ~NETIF_F_HW_VLAN_TX;
--
-- return features;
--}
--
--static int nes_set_features(struct net_device *netdev, u32 features)
--{
-- struct nes_vnic *nesvnic = netdev_priv(netdev);
-- struct nes_device *nesdev = nesvnic->nesdev;
-- u32 changed = netdev->features ^ features;
--
-- if (changed & NETIF_F_HW_VLAN_RX)
-- nes_vlan_mode(netdev, nesdev, features);
--
-- return 0;
--}
--
- static const struct net_device_ops nes_netdev_ops = {
- .ndo_open = nes_netdev_open,
- .ndo_stop = nes_netdev_stop,
-@@ -1646,8 +1612,6 @@ static const struct net_device_ops nes_netdev_ops = {
- .ndo_set_rx_mode = nes_netdev_set_multicast_list,
- .ndo_change_mtu = nes_netdev_change_mtu,
- .ndo_validate_addr = eth_validate_addr,
-- .ndo_fix_features = nes_fix_features,
-- .ndo_set_features = nes_set_features,
- };
-
- /**
-@@ -1711,12 +1675,12 @@ struct net_device *nes_netdev_init(struct nes_device *nesdev,
- netdev->dev_addr[5] = (u8)u64temp;
- memcpy(netdev->perm_addr, netdev->dev_addr, 6);
-
-- netdev->hw_features = NETIF_F_RXCSUM | NETIF_F_SG | NETIF_F_IP_CSUM |
-- NETIF_F_HW_VLAN_RX;
-- if ((nesvnic->logical_port < 2) || (nesdev->nesadapter->hw_rev != NE020_REV))
-- netdev->hw_features |= NETIF_F_TSO;
-- netdev->features |= netdev->hw_features;
-- netdev->hw_features |= NETIF_F_LRO;
-+ if ((nesvnic->logical_port < 2) || (nesdev->nesadapter->hw_rev != NE020_REV)) {
-+ netdev->features |= NETIF_F_TSO | NETIF_F_SG | NETIF_F_IP_CSUM;
-+ netdev->features |= NETIF_F_GSO | NETIF_F_TSO | NETIF_F_SG | NETIF_F_IP_CSUM;
-+ } else {
-+ netdev->features |= NETIF_F_SG | NETIF_F_IP_CSUM;
-+ }
-
- nes_debug(NES_DBG_INIT, "nesvnic = %p, reported features = 0x%lX, QPid = %d,"
- " nic_index = %d, logical_port = %d, mac_index = %d.\n",
---
-1.7.1
+++ /dev/null
-diff -rup a/drivers/infiniband/core/netlink.c b/drivers/infiniband/core/netlink.c
---- a/drivers/infiniband/core/netlink.c 2012-05-18 13:52:58.000000000 -0400
-+++ b/drivers/infiniband/core/netlink.c 2012-05-18 13:52:13.000000000 -0400
-@@ -151,7 +151,7 @@ static int ibnl_rcv_msg(struct sk_buff *
- return -EINVAL;
- return netlink_dump_start(nls, skb, nlh,
- client->cb_table[op].dump,
-- NULL);
-+ NULL, 0);
- }
- }
-
+++ /dev/null
-From bca407cec6adad6766870d6c26ff3ffa3b10e529 Mon Sep 17 00:00:00 2001
-From: Vipul Pandya <vipul@chelsio.com>
-Date: Mon, 7 May 2012 14:40:34 +0530
-Subject: [PATCH 02/14] cxgb4: Add build support for kernel 3.1
-
-Signed-off-by: Vipul Pandya <vipul@chelsio.com>
----
- drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c | 8 ++++----
- 1 files changed, 4 insertions(+), 4 deletions(-)
-
-diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
-index 4c8f42a..0b77fec 100644
---- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
-+++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
-@@ -32,6 +32,9 @@
- * SOFTWARE.
- */
-
-+#ifdef pr_fmt
-+#undef pr_fmt
-+#endif
- #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
-
- #include <linux/bitmap.h>
-@@ -41,7 +44,6 @@
- #include <linux/err.h>
- #include <linux/etherdevice.h>
- #include <linux/firmware.h>
--#include <linux/if.h>
- #include <linux/if_vlan.h>
- #include <linux/init.h>
- #include <linux/log2.h>
-@@ -1902,7 +1904,7 @@ static int set_rss_table(struct net_device *dev,
- }
-
- static int get_rxnfc(struct net_device *dev, struct ethtool_rxnfc *info,
-- u32 *rules)
-+ void *rules)
- {
- const struct port_info *pi = netdev_priv(dev);
-
-@@ -3640,8 +3642,6 @@ static int __devinit init_one(struct pci_dev *pdev,
- netdev->features |= netdev->hw_features | highdma;
- netdev->vlan_features = netdev->features & VLAN_FEAT;
-
-- netdev->priv_flags |= IFF_UNICAST_FLT;
--
- netdev->netdev_ops = &cxgb4_netdev_ops;
- SET_ETHTOOL_OPS(netdev, &cxgb_ethtool_ops);
- }
---
-1.7.1
-
+++ /dev/null
-From 708ed9efefdc11cf5be0491314befb0fafac1daa Mon Sep 17 00:00:00 2001
-From: Vipul Pandya <vipul@chelsio.com>
-Date: Mon, 7 May 2012 15:50:15 +0530
-Subject: [PATCH 03/14] cxgb3: Reversing do vlan cleanup
-
-This patch is a reverse patch of the following upstream commit
-892ef5d85259e193505d553c10237fd5dc9a3d0d
-
-Signed-off-by: Vipul Pandya <vipul@chelsio.com>
----
- drivers/net/ethernet/chelsio/cxgb3/adapter.h | 2 +
- drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c | 51 ++++---------------
- drivers/net/ethernet/chelsio/cxgb3/cxgb3_offload.c | 9 ++-
- drivers/net/ethernet/chelsio/cxgb3/sge.c | 35 +++++++++++--
- 4 files changed, 48 insertions(+), 49 deletions(-)
-
-diff --git a/drivers/net/ethernet/chelsio/cxgb3/adapter.h b/drivers/net/ethernet/chelsio/cxgb3/adapter.h
-index 8b395b5..7300de5 100644
---- a/drivers/net/ethernet/chelsio/cxgb3/adapter.h
-+++ b/drivers/net/ethernet/chelsio/cxgb3/adapter.h
-@@ -45,6 +45,7 @@
- #include "t3cdev.h"
- #include <asm/io.h>
-
-+struct vlan_group;
- struct adapter;
- struct sge_qset;
- struct port_info;
-@@ -65,6 +66,7 @@ struct iscsi_config {
-
- struct port_info {
- struct adapter *adapter;
-+ struct vlan_group *vlan_grp;
- struct sge_qset *qs;
- u8 port_id;
- u8 nqsets;
-diff --git a/drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c b/drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c
-index 4d15c8f..d9ee262 100644
---- a/drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c
-+++ b/drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c
-@@ -2531,51 +2531,25 @@ static void t3_synchronize_rx(struct adapter *adap, const struct port_info *p)
- }
- }
-
--static void cxgb_vlan_mode(struct net_device *dev, u32 features)
-+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;
-
-- if (adapter->params.rev > 0) {
-- t3_set_vlan_accel(adapter, 1 << pi->port_id,
-- features & NETIF_F_HW_VLAN_RX);
-- } else {
-+ pi->vlan_grp = grp;
-+ if (adapter->params.rev > 0)
-+ t3_set_vlan_accel(adapter, 1 << pi->port_id, grp != NULL);
-+ else {
- /* single control for all ports */
-- unsigned int i, have_vlans = features & NETIF_F_HW_VLAN_RX;
--
-+ unsigned int i, have_vlans = 0;
- for_each_port(adapter, i)
-- have_vlans |=
-- adapter->port[i]->features & NETIF_F_HW_VLAN_RX;
-+ have_vlans |= adap2pinfo(adapter, i)->vlan_grp != NULL;
-
- t3_set_vlan_accel(adapter, 1, have_vlans);
- }
- t3_synchronize_rx(adapter, pi);
- }
-
--static u32 cxgb_fix_features(struct net_device *dev, u32 features)
--{
-- /*
-- * Since there is no support for separate rx/tx vlan accel
-- * enable/disable make sure tx flag is always in same state as rx.
-- */
-- if (features & NETIF_F_HW_VLAN_RX)
-- features |= NETIF_F_HW_VLAN_TX;
-- else
-- features &= ~NETIF_F_HW_VLAN_TX;
--
-- return features;
--}
--
--static int cxgb_set_features(struct net_device *dev, u32 features)
--{
-- u32 changed = dev->features ^ features;
--
-- if (changed & NETIF_F_HW_VLAN_RX)
-- cxgb_vlan_mode(dev, features);
--
-- return 0;
--}
--
- #ifdef CONFIG_NET_POLL_CONTROLLER
- static void cxgb_netpoll(struct net_device *dev)
- {
-@@ -3156,8 +3130,7 @@ static const struct net_device_ops cxgb_netdev_ops = {
- .ndo_do_ioctl = cxgb_ioctl,
- .ndo_change_mtu = cxgb_change_mtu,
- .ndo_set_mac_address = cxgb_set_mac_addr,
-- .ndo_fix_features = cxgb_fix_features,
-- .ndo_set_features = cxgb_set_features,
-+ .ndo_vlan_rx_register = vlan_rx_register,
- #ifdef CONFIG_NET_POLL_CONTROLLER
- .ndo_poll_controller = cxgb_netpoll,
- #endif
-@@ -3289,8 +3262,9 @@ static int __devinit init_one(struct pci_dev *pdev,
- netdev->mem_start = mmio_start;
- netdev->mem_end = mmio_start + mmio_len - 1;
- netdev->hw_features = NETIF_F_SG | NETIF_F_IP_CSUM |
-- NETIF_F_TSO | NETIF_F_RXCSUM | NETIF_F_HW_VLAN_RX;
-- netdev->features |= netdev->hw_features | NETIF_F_HW_VLAN_TX;
-+ NETIF_F_TSO | NETIF_F_RXCSUM;
-+ netdev->features |= netdev->hw_features |
-+ NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
- if (pci_using_dac)
- netdev->features |= NETIF_F_HIGHDMA;
-
-@@ -3354,9 +3328,6 @@ static int __devinit init_one(struct pci_dev *pdev,
- err = sysfs_create_group(&adapter->port[0]->dev.kobj,
- &cxgb3_attr_group);
-
-- for_each_port(adapter, i)
-- cxgb_vlan_mode(adapter->port[i], adapter->port[i]->features);
--
- print_port_info(adapter, ai);
- return 0;
-
-diff --git a/drivers/net/ethernet/chelsio/cxgb3/cxgb3_offload.c b/drivers/net/ethernet/chelsio/cxgb3/cxgb3_offload.c
-index 90ff131..d7cd560 100644
---- a/drivers/net/ethernet/chelsio/cxgb3/cxgb3_offload.c
-+++ b/drivers/net/ethernet/chelsio/cxgb3/cxgb3_offload.c
-@@ -177,13 +177,16 @@ static struct net_device *get_iff_from_mac(struct adapter *adapter,
- int i;
-
- for_each_port(adapter, i) {
-+ struct vlan_group *grp;
- struct net_device *dev = adapter->port[i];
-+ const struct port_info *p = netdev_priv(dev);
-
- if (!memcmp(dev->dev_addr, mac, ETH_ALEN)) {
- if (vlan && vlan != VLAN_VID_MASK) {
-- rcu_read_lock();
-- dev = __vlan_find_dev_deep(dev, vlan);
-- rcu_read_unlock();
-+ grp = p->vlan_grp;
-+ dev = NULL;
-+ if (grp)
-+ dev = vlan_group_get_device(grp, vlan);
- } else if (netif_is_bond_slave(dev)) {
- while (dev->master)
- dev = dev->master;
-diff --git a/drivers/net/ethernet/chelsio/cxgb3/sge.c b/drivers/net/ethernet/chelsio/cxgb3/sge.c
-index cfb60e1..12c3d36 100644
---- a/drivers/net/ethernet/chelsio/cxgb3/sge.c
-+++ b/drivers/net/ethernet/chelsio/cxgb3/sge.c
-@@ -2028,11 +2028,28 @@ static void rx_eth(struct adapter *adap, struct sge_rspq *rq,
- skb_checksum_none_assert(skb);
- skb_record_rx_queue(skb, qs - &adap->sge.qs[pi->first_qset]);
-
-- if (p->vlan_valid) {
-+ if (unlikely(p->vlan_valid)) {
-+ struct vlan_group *grp = pi->vlan_grp;
-+
- qs->port_stats[SGE_PSTAT_VLANEX]++;
-- __vlan_hwaccel_put_tag(skb, ntohs(p->vlan));
-- }
-- if (rq->polling) {
-+ if (likely(grp))
-+ if (lro)
-+ vlan_gro_receive(&qs->napi, grp,
-+ ntohs(p->vlan), skb);
-+ else {
-+ if (unlikely(pi->iscsic.flags)) {
-+ unsigned short vtag = ntohs(p->vlan) &
-+ VLAN_VID_MASK;
-+ skb->dev = vlan_group_get_device(grp,
-+ vtag);
-+ cxgb3_process_iscsi_prov_pack(pi, skb);
-+ }
-+ __vlan_hwaccel_rx(skb, grp, ntohs(p->vlan),
-+ rq->polling);
-+ }
-+ else
-+ dev_kfree_skb_any(skb);
-+ } else if (rq->polling) {
- if (lro)
- napi_gro_receive(&qs->napi, skb);
- else {
-@@ -2130,8 +2147,14 @@ static void lro_add_page(struct adapter *adap, struct sge_qset *qs,
-
- skb_record_rx_queue(skb, qs - &adap->sge.qs[pi->first_qset]);
-
-- if (cpl->vlan_valid)
-- __vlan_hwaccel_put_tag(skb, ntohs(cpl->vlan));
-+ if (unlikely(cpl->vlan_valid)) {
-+ struct vlan_group *grp = pi->vlan_grp;
-+
-+ if (likely(grp != NULL)) {
-+ vlan_gro_frags(&qs->napi, grp, ntohs(cpl->vlan));
-+ return;
-+ }
-+ }
- napi_gro_frags(&qs->napi);
- }
-
---
-1.7.1
-
+++ /dev/null
-From 4d79ac47a87ece1a8bae619683a11b264f7db063 Mon Sep 17 00:00:00 2001
-From: Vipul Pandya <vipul@chelsio.com>
-Date: Thu, 3 May 2012 14:39:49 +0530
-Subject: [PATCH 04/14] iw_cxgb3: Add RHEL6.2 backports
-
-Signed-off-by: Vipul Pandya <vipul@chelsio.com>
----
- drivers/infiniband/hw/cxgb3/iwch_cm.c | 27 ++++++++++++++++++++-------
- 1 files changed, 20 insertions(+), 7 deletions(-)
-
-diff --git a/drivers/infiniband/hw/cxgb3/iwch_cm.c b/drivers/infiniband/hw/cxgb3/iwch_cm.c
-index c88b12b..25f2377 100644
---- a/drivers/infiniband/hw/cxgb3/iwch_cm.c
-+++ b/drivers/infiniband/hw/cxgb3/iwch_cm.c
-@@ -338,12 +338,25 @@ static struct rtable *find_route(struct t3cdev *dev, __be32 local_ip,
- __be16 peer_port, u8 tos)
- {
- struct rtable *rt;
-- struct flowi4 fl4;
-+ 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
-+ }
-+ }
-+ };
-
-- rt = ip_route_output_ports(&init_net, &fl4, NULL, peer_ip, local_ip,
-- peer_port, local_port, IPPROTO_TCP,
-- tos, 0);
-- if (IS_ERR(rt))
-+ if (ip_route_output_flow(&init_net, &rt, &fl, NULL, false))
- return NULL;
- return rt;
- }
-@@ -1374,7 +1387,7 @@ static int pass_accept_req(struct t3cdev *tdev, struct sk_buff *skb, void *ctx)
- __func__);
- goto reject;
- }
-- dst = &rt->dst;
-+ dst = &rt->u.dst;
- rcu_read_lock();
- neigh = dst_get_neighbour(dst);
- l2t = t3_l2t_get(tdev, neigh, neigh->dev);
-@@ -1946,7 +1959,7 @@ int iwch_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
- err = -EHOSTUNREACH;
- goto fail3;
- }
-- ep->dst = &rt->dst;
-+ ep->dst = &rt->u.dst;
-
- rcu_read_lock();
- neigh = dst_get_neighbour(ep->dst);
---
-1.7.1
-
+++ /dev/null
-From d80b776c844c1a35f32a55150021f2e8635b7323 Mon Sep 17 00:00:00 2001
-From: Vipul Pandya <vipul@chelsio.com>
-Date: Thu, 10 May 2012 15:39:37 +0530
-Subject: [PATCH 05/14] iw_cxgb4: Add RHEL6.2 backports
-
-Signed-off-by: Vipul Pandya <vipul@chelsio.com>
----
- drivers/infiniband/hw/cxgb4/cm.c | 30 +++++++++++++++++++++---------
- 1 files changed, 21 insertions(+), 9 deletions(-)
-
-diff --git a/drivers/infiniband/hw/cxgb4/cm.c b/drivers/infiniband/hw/cxgb4/cm.c
-index 0747004..15b903c 100644
---- a/drivers/infiniband/hw/cxgb4/cm.c
-+++ b/drivers/infiniband/hw/cxgb4/cm.c
-@@ -316,12 +316,24 @@ static struct rtable *find_route(struct c4iw_dev *dev, __be32 local_ip,
- __be16 peer_port, u8 tos)
- {
- struct rtable *rt;
-- struct flowi4 fl4;
--
-- rt = ip_route_output_ports(&init_net, &fl4, NULL, peer_ip, local_ip,
-- peer_port, local_port, IPPROTO_TCP,
-- tos, 0);
-- if (IS_ERR(rt))
-+ 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, false))
- return NULL;
- return rt;
- }
-@@ -1595,7 +1607,7 @@ static int pass_accept_req(struct c4iw_dev *dev, struct sk_buff *skb)
- __func__);
- goto reject;
- }
-- dst = &rt->dst;
-+ dst = &rt->u.dst;
- rcu_read_lock();
- neigh = dst_get_neighbour(dst);
- if (neigh->dev->flags & IFF_LOOPBACK) {
-@@ -1822,7 +1834,7 @@ static int c4iw_reconnect(struct c4iw_ep *ep)
- err = -EHOSTUNREACH;
- goto fail3;
- }
-- ep->dst = &rt->dst;
-+ ep->dst = &rt->u.dst;
-
- rcu_read_lock();
- neigh = dst_get_neighbour(ep->dst);
-@@ -2305,7 +2317,7 @@ int c4iw_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
- err = -EHOSTUNREACH;
- goto fail3;
- }
-- ep->dst = &rt->dst;
-+ ep->dst = &rt->u.dst;
-
- rcu_read_lock();
- neigh = dst_get_neighbour(ep->dst);
---
-1.7.1
-
+++ /dev/null
-From 8651cf61a4cd6651c6fbd37a3702d6f134cdaaa6 Mon Sep 17 00:00:00 2001
-From: Vipul Pandya <vipul@chelsio.com>
-Date: Thu, 10 May 2012 15:41:56 +0530
-Subject: [PATCH 06/14] iw_cxgb4: Revert use the DMA state API instead of the pci equivalents
-
-This patch is a reverse patch of the following upstream commit
-f38926aa1dc5fbf7dfc5f97a53377b2e796dedc3
-
-Signed-off-by: Vipul Pandya <vipul@chelsio.com>
----
- drivers/infiniband/hw/cxgb4/cq.c | 6 +++---
- drivers/infiniband/hw/cxgb4/iw_cxgb4.h | 2 +-
- drivers/infiniband/hw/cxgb4/mem.c | 4 ++--
- drivers/infiniband/hw/cxgb4/qp.c | 8 ++++----
- drivers/infiniband/hw/cxgb4/t4.h | 6 +++---
- 5 files changed, 13 insertions(+), 13 deletions(-)
-
-diff --git a/drivers/infiniband/hw/cxgb4/cq.c b/drivers/infiniband/hw/cxgb4/cq.c
-index 0f1607c..c3c2d68 100644
---- a/drivers/infiniband/hw/cxgb4/cq.c
-+++ b/drivers/infiniband/hw/cxgb4/cq.c
-@@ -70,7 +70,7 @@ static int destroy_cq(struct c4iw_rdev *rdev, struct t4_cq *cq,
- kfree(cq->sw_queue);
- dma_free_coherent(&(rdev->lldi.pdev->dev),
- cq->memsize, cq->queue,
-- dma_unmap_addr(cq, mapping));
-+ pci_unmap_addr(cq, mapping));
- c4iw_put_cqid(rdev, cq->cqid, uctx);
- return ret;
- }
-@@ -105,7 +105,7 @@ static int create_cq(struct c4iw_rdev *rdev, struct t4_cq *cq,
- ret = -ENOMEM;
- goto err3;
- }
-- dma_unmap_addr_set(cq, mapping, cq->dma_addr);
-+ pci_unmap_addr_set(cq, mapping, cq->dma_addr);
- memset(cq->queue, 0, cq->memsize);
-
- /* build fw_ri_res_wr */
-@@ -165,7 +165,7 @@ static int create_cq(struct c4iw_rdev *rdev, struct t4_cq *cq,
- return 0;
- err4:
- dma_free_coherent(&rdev->lldi.pdev->dev, cq->memsize, cq->queue,
-- dma_unmap_addr(cq, mapping));
-+ pci_unmap_addr(cq, mapping));
- err3:
- kfree(cq->sw_queue);
- err2:
-diff --git a/drivers/infiniband/hw/cxgb4/iw_cxgb4.h b/drivers/infiniband/hw/cxgb4/iw_cxgb4.h
-index 1357c5b..677e8fb 100644
---- a/drivers/infiniband/hw/cxgb4/iw_cxgb4.h
-+++ b/drivers/infiniband/hw/cxgb4/iw_cxgb4.h
-@@ -292,7 +292,7 @@ static inline struct c4iw_mw *to_c4iw_mw(struct ib_mw *ibmw)
-
- struct c4iw_fr_page_list {
- struct ib_fast_reg_page_list ibpl;
-- DEFINE_DMA_UNMAP_ADDR(mapping);
-+ DECLARE_PCI_UNMAP_ADDR(mapping);
- dma_addr_t dma_addr;
- struct c4iw_dev *dev;
- int size;
-diff --git a/drivers/infiniband/hw/cxgb4/mem.c b/drivers/infiniband/hw/cxgb4/mem.c
-index 40c8353..88b1026 100644
---- a/drivers/infiniband/hw/cxgb4/mem.c
-+++ b/drivers/infiniband/hw/cxgb4/mem.c
-@@ -757,7 +757,7 @@ struct ib_fast_reg_page_list *c4iw_alloc_fastreg_pbl(struct ib_device *device,
- if (!c4pl)
- return ERR_PTR(-ENOMEM);
-
-- dma_unmap_addr_set(c4pl, mapping, dma_addr);
-+ pci_unmap_addr_set(c4pl, mapping, dma_addr);
- c4pl->dma_addr = dma_addr;
- c4pl->dev = dev;
- c4pl->size = size;
-@@ -772,7 +772,7 @@ void c4iw_free_fastreg_pbl(struct ib_fast_reg_page_list *ibpl)
- struct c4iw_fr_page_list *c4pl = to_c4iw_fr_page_list(ibpl);
-
- dma_free_coherent(&c4pl->dev->rdev.lldi.pdev->dev, c4pl->size,
-- c4pl, dma_unmap_addr(c4pl, mapping));
-+ c4pl, pci_unmap_addr(c4pl, mapping));
- }
-
- int c4iw_dereg_mr(struct ib_mr *ib_mr)
-diff --git a/drivers/infiniband/hw/cxgb4/qp.c b/drivers/infiniband/hw/cxgb4/qp.c
-index 5f940ae..d682318 100644
---- a/drivers/infiniband/hw/cxgb4/qp.c
-+++ b/drivers/infiniband/hw/cxgb4/qp.c
-@@ -100,7 +100,7 @@ static int destroy_qp(struct c4iw_rdev *rdev, struct t4_wq *wq,
- */
- dma_free_coherent(&(rdev->lldi.pdev->dev),
- wq->rq.memsize, wq->rq.queue,
-- dma_unmap_addr(&wq->rq, mapping));
-+ pci_unmap_addr(&wq->rq, mapping));
- dealloc_sq(rdev, &wq->sq);
- c4iw_rqtpool_free(rdev, wq->rq.rqt_hwaddr, wq->rq.rqt_size);
- kfree(wq->rq.sw_rq);
-@@ -158,7 +158,7 @@ static int create_qp(struct c4iw_rdev *rdev, struct t4_wq *wq,
- if (alloc_host_sq(rdev, &wq->sq))
- goto err5;
- memset(wq->sq.queue, 0, wq->sq.memsize);
-- dma_unmap_addr_set(&wq->sq, mapping, wq->sq.dma_addr);
-+ pci_unmap_addr_set(&wq->sq, mapping, wq->sq.dma_addr);
-
- wq->rq.queue = dma_alloc_coherent(&(rdev->lldi.pdev->dev),
- wq->rq.memsize, &(wq->rq.dma_addr),
-@@ -171,7 +171,7 @@ static int create_qp(struct c4iw_rdev *rdev, struct t4_wq *wq,
- wq->rq.queue,
- (unsigned long long)virt_to_phys(wq->rq.queue));
- memset(wq->rq.queue, 0, wq->rq.memsize);
-- dma_unmap_addr_set(&wq->rq, mapping, wq->rq.dma_addr);
-+ pci_unmap_addr_set(&wq->rq, mapping, wq->rq.dma_addr);
-
- wq->db = rdev->lldi.db_reg;
- wq->gts = rdev->lldi.gts_reg;
-@@ -270,7 +270,7 @@ static int create_qp(struct c4iw_rdev *rdev, struct t4_wq *wq,
- err7:
- dma_free_coherent(&(rdev->lldi.pdev->dev),
- wq->rq.memsize, wq->rq.queue,
-- dma_unmap_addr(&wq->rq, mapping));
-+ pci_unmap_addr(&wq->rq, mapping));
- err6:
- dealloc_sq(rdev, &wq->sq);
- err5:
-diff --git a/drivers/infiniband/hw/cxgb4/t4.h b/drivers/infiniband/hw/cxgb4/t4.h
-index c0221ee..47a9bd2 100644
---- a/drivers/infiniband/hw/cxgb4/t4.h
-+++ b/drivers/infiniband/hw/cxgb4/t4.h
-@@ -292,7 +292,7 @@ enum {
- struct t4_sq {
- union t4_wr *queue;
- dma_addr_t dma_addr;
-- DEFINE_DMA_UNMAP_ADDR(mapping);
-+ DECLARE_PCI_UNMAP_ADDR(mapping);
- unsigned long phys_addr;
- struct t4_swsqe *sw_sq;
- struct t4_swsqe *oldest_read;
-@@ -314,7 +314,7 @@ struct t4_swrqe {
- struct t4_rq {
- union t4_recv_wr *queue;
- dma_addr_t dma_addr;
-- DEFINE_DMA_UNMAP_ADDR(mapping);
-+ DECLARE_PCI_UNMAP_ADDR(mapping);
- struct t4_swrqe *sw_rq;
- u64 udb;
- size_t memsize;
-@@ -452,7 +452,7 @@ static inline int t4_wq_db_enabled(struct t4_wq *wq)
- struct t4_cq {
- struct t4_cqe *queue;
- dma_addr_t dma_addr;
-- DEFINE_DMA_UNMAP_ADDR(mapping);
-+ DECLARE_PCI_UNMAP_ADDR(mapping);
- struct t4_cqe *sw_queue;
- void __iomem *gts;
- struct c4iw_rdev *rdev;
---
-1.7.1
-
+++ /dev/null
-From 6ede508ac7b890df01acd9cd219542d36c49b25e Mon Sep 17 00:00:00 2001
-From: Vipul Pandya <vipul@chelsio.com>
-Date: Thu, 10 May 2012 15:55:10 +0530
-Subject: [PATCH 07/14] cxgb3: Revert implement set_phys_id
-
-This patch is a reverse patch of the following upstream commit
-12fcf941674fd781117a56f998d2bb28b4bc4cf1
-
-Signed-off-by: Vipul Pandya <vipul@chelsio.com>
----
- drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c | 24 ++++++++++------------
- 1 files changed, 11 insertions(+), 13 deletions(-)
-
-diff --git a/drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c b/drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c
-index d9ee262..a671d43 100644
---- a/drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c
-+++ b/drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c
-@@ -1728,26 +1728,24 @@ static int restart_autoneg(struct net_device *dev)
- return 0;
- }
-
--static int set_phys_id(struct net_device *dev,
-- enum ethtool_phys_id_state state)
-+static int cxgb3_phys_id(struct net_device *dev, u32 data)
- {
- struct port_info *pi = netdev_priv(dev);
- struct adapter *adapter = pi->adapter;
-+ int i;
-
-- switch (state) {
-- case ETHTOOL_ID_ACTIVE:
-- return 1; /* cycle on/off once per second */
--
-- case ETHTOOL_ID_OFF:
-- t3_set_reg_field(adapter, A_T3DBG_GPIO_EN, F_GPIO0_OUT_VAL, 0);
-- break;
-+ if (data == 0)
-+ data = 2;
-
-- case ETHTOOL_ID_ON:
-- case ETHTOOL_ID_INACTIVE:
-+ for (i = 0; i < data * 2; i++) {
- t3_set_reg_field(adapter, A_T3DBG_GPIO_EN, F_GPIO0_OUT_VAL,
-- F_GPIO0_OUT_VAL);
-+ (i & 1) ? F_GPIO0_OUT_VAL : 0);
-+ if (msleep_interruptible(500))
-+ break;
- }
-
-+ t3_set_reg_field(adapter, A_T3DBG_GPIO_EN, F_GPIO0_OUT_VAL,
-+ F_GPIO0_OUT_VAL);
- return 0;
- }
-
-@@ -2063,7 +2061,7 @@ static const struct ethtool_ops cxgb_ethtool_ops = {
- .set_pauseparam = set_pauseparam,
- .get_link = ethtool_op_get_link,
- .get_strings = get_strings,
-- .set_phys_id = set_phys_id,
-+ .phys_id = cxgb3_phys_id,
- .nway_reset = restart_autoneg,
- .get_sset_count = get_sset_count,
- .get_ethtool_stats = get_stats,
---
-1.7.1
-
+++ /dev/null
-From 810969f13f370934f20c017cea7ee949db23a002 Mon Sep 17 00:00:00 2001
-From: Vipul Pandya <vipul@chelsio.com>
-Date: Thu, 10 May 2012 17:02:03 +0530
-Subject: [PATCH 08/14] cxgb3: Revert convert to hw_features
-
-This patch is a reverse patch of the following upstream commit
-d2fe2755342b30bc1ee7797b9975f8626d65e485
-
-Signed-off-by: Vipul Pandya <vipul@chelsio.com>
----
- drivers/net/ethernet/chelsio/cxgb3/adapter.h | 7 ++
- drivers/net/ethernet/chelsio/cxgb3/common.h | 1 +
- drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c | 78 +++++++++++++++++++----
- drivers/net/ethernet/chelsio/cxgb3/sge.c | 7 +-
- 4 files changed, 76 insertions(+), 17 deletions(-)
-
-diff --git a/drivers/net/ethernet/chelsio/cxgb3/adapter.h b/drivers/net/ethernet/chelsio/cxgb3/adapter.h
-index 7300de5..ef67be5 100644
---- a/drivers/net/ethernet/chelsio/cxgb3/adapter.h
-+++ b/drivers/net/ethernet/chelsio/cxgb3/adapter.h
-@@ -50,6 +50,11 @@ struct adapter;
- struct sge_qset;
- struct port_info;
-
-+enum { /* rx_offload flags */
-+ T3_RX_CSUM = 1 << 0,
-+ T3_LRO = 1 << 1,
-+};
-+
- enum mac_idx_types {
- LAN_MAC_IDX = 0,
- SAN_MAC_IDX,
-@@ -69,6 +74,7 @@ struct port_info {
- struct vlan_group *vlan_grp;
- struct sge_qset *qs;
- u8 port_id;
-+ u8 rx_offload;
- u8 nqsets;
- u8 first_qset;
- struct cphy phy;
-@@ -206,6 +212,7 @@ struct sge_qset { /* an SGE queue set */
- struct sge_fl fl[SGE_RXQ_PER_SET];
- struct sge_txq txq[SGE_TXQ_PER_SET];
- int nomem;
-+ int lro_enabled;
- void *lro_va;
- struct net_device *netdev;
- struct netdev_queue *tx_q; /* associated netdev TX queue */
-diff --git a/drivers/net/ethernet/chelsio/cxgb3/common.h b/drivers/net/ethernet/chelsio/cxgb3/common.h
-index df01b63..85d032f 100644
---- a/drivers/net/ethernet/chelsio/cxgb3/common.h
-+++ b/drivers/net/ethernet/chelsio/cxgb3/common.h
-@@ -317,6 +317,7 @@ struct tp_params {
-
- struct qset_params { /* SGE queue set parameters */
- unsigned int polling; /* polling/interrupt service for rspq */
-+ unsigned int lro; /* large receive offload */
- unsigned int coalesce_usecs; /* irq coalescing timer */
- unsigned int rspq_size; /* # of entries in response queue */
- unsigned int fl_size; /* # of entries in regular free list */
-diff --git a/drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c b/drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c
-index a671d43..e2da139 100644
---- a/drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c
-+++ b/drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c
-@@ -644,6 +644,26 @@ static void enable_all_napi(struct adapter *adap)
- }
-
- /**
-+ * set_qset_lro - Turn a queue set's LRO capability on and off
-+ * @dev: the device the qset is attached to
-+ * @qset_idx: the queue set index
-+ * @val: the LRO switch
-+ *
-+ * Sets LRO on or off for a particular queue set.
-+ * the device's features flag is updated to reflect the LRO
-+ * capability when all queues belonging to the device are
-+ * in the same state.
-+ */
-+static void set_qset_lro(struct net_device *dev, int qset_idx, int val)
-+{
-+ struct port_info *pi = netdev_priv(dev);
-+ struct adapter *adapter = pi->adapter;
-+
-+ adapter->params.sge.qset[qset_idx].lro = !!val;
-+ adapter->sge.qs[qset_idx].lro_enabled = !!val;
-+}
-+
-+/**
- * setup_sge_qsets - configure SGE Tx/Rx/response queues
- * @adap: the adapter
- *
-@@ -665,6 +685,7 @@ static int setup_sge_qsets(struct adapter *adap)
-
- pi->qs = &adap->sge.qs[pi->first_qset];
- for (j = 0; j < pi->nqsets; ++j, ++qset_idx) {
-+ set_qset_lro(dev, qset_idx, pi->rx_offload & T3_LRO);
- err = t3_sge_alloc_qset(adap, qset_idx, 1,
- (adap->flags & USING_MSIX) ? qset_idx + 1 :
- irq_idx,
-@@ -1889,6 +1910,29 @@ static int set_pauseparam(struct net_device *dev,
- return 0;
- }
-
-+static u32 get_rx_csum(struct net_device *dev)
-+{
-+ struct port_info *p = netdev_priv(dev);
-+
-+ return p->rx_offload & T3_RX_CSUM;
-+}
-+
-+static int set_rx_csum(struct net_device *dev, u32 data)
-+{
-+ struct port_info *p = netdev_priv(dev);
-+
-+ if (data) {
-+ p->rx_offload |= T3_RX_CSUM;
-+ } else {
-+ int i;
-+
-+ p->rx_offload &= ~(T3_RX_CSUM | T3_LRO);
-+ for (i = p->first_qset; i < p->first_qset + p->nqsets; i++)
-+ set_qset_lro(dev, i, 0);
-+ }
-+ return 0;
-+}
-+
- static void get_sge_param(struct net_device *dev, struct ethtool_ringparam *e)
- {
- struct port_info *pi = netdev_priv(dev);
-@@ -2059,6 +2103,10 @@ static const struct ethtool_ops cxgb_ethtool_ops = {
- .set_eeprom = set_eeprom,
- .get_pauseparam = get_pauseparam,
- .set_pauseparam = set_pauseparam,
-+ .get_rx_csum = get_rx_csum,
-+ .set_rx_csum = set_rx_csum,
-+ .set_tx_csum = ethtool_op_set_tx_csum,
-+ .set_sg = ethtool_op_set_sg,
- .get_link = ethtool_op_get_link,
- .get_strings = get_strings,
- .phys_id = cxgb3_phys_id,
-@@ -2068,6 +2116,7 @@ static const struct ethtool_ops cxgb_ethtool_ops = {
- .get_regs_len = get_regs_len,
- .get_regs = get_regs,
- .get_wol = get_wol,
-+ .set_tso = ethtool_op_set_tso,
- };
-
- static int in_range(int val, int lo, int hi)
-@@ -2115,6 +2164,15 @@ static int cxgb_extension_ioctl(struct net_device *dev, void __user *useraddr)
- MAX_RSPQ_ENTRIES))
- return -EINVAL;
-
-+ if ((adapter->flags & FULL_INIT_DONE) && t.lro > 0)
-+ for_each_port(adapter, i) {
-+ pi = adap2pinfo(adapter, i);
-+ if (t.qset_idx >= pi->first_qset &&
-+ t.qset_idx < pi->first_qset + pi->nqsets &&
-+ !(pi->rx_offload & T3_RX_CSUM))
-+ return -EINVAL;
-+ }
-+
- if ((adapter->flags & FULL_INIT_DONE) &&
- (t.rspq_size >= 0 || t.fl_size[0] >= 0 ||
- t.fl_size[1] >= 0 || t.txq_size[0] >= 0 ||
-@@ -2175,14 +2233,8 @@ static int cxgb_extension_ioctl(struct net_device *dev, void __user *useraddr)
- }
- }
- }
--
-- if (t.lro >= 0) {
-- if (t.lro)
-- dev->wanted_features |= NETIF_F_GRO;
-- else
-- dev->wanted_features &= ~NETIF_F_GRO;
-- netdev_update_features(dev);
-- }
-+ if (t.lro >= 0)
-+ set_qset_lro(dev, t.qset_idx, t.lro);
-
- break;
- }
-@@ -2216,7 +2268,7 @@ static int cxgb_extension_ioctl(struct net_device *dev, void __user *useraddr)
- t.fl_size[0] = q->fl_size;
- t.fl_size[1] = q->jumbo_size;
- t.polling = q->polling;
-- t.lro = !!(dev->features & NETIF_F_GRO);
-+ t.lro = q->lro;
- t.intr_lat = q->coalesce_usecs;
- t.cong_thres = q->cong_thres;
- t.qnum = q1;
-@@ -3254,18 +3306,18 @@ static int __devinit init_one(struct pci_dev *pdev,
- adapter->port[i] = netdev;
- pi = netdev_priv(netdev);
- pi->adapter = adapter;
-+ pi->rx_offload = T3_RX_CSUM | T3_LRO;
- pi->port_id = i;
- netif_carrier_off(netdev);
- netdev->irq = pdev->irq;
- netdev->mem_start = mmio_start;
- netdev->mem_end = mmio_start + mmio_len - 1;
-- netdev->hw_features = NETIF_F_SG | NETIF_F_IP_CSUM |
-- NETIF_F_TSO | NETIF_F_RXCSUM;
-- netdev->features |= netdev->hw_features |
-- NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
-+ netdev->features |= NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_TSO;
-+ netdev->features |= NETIF_F_GRO;
- if (pci_using_dac)
- netdev->features |= NETIF_F_HIGHDMA;
-
-+ netdev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
- netdev->netdev_ops = &cxgb_netdev_ops;
- SET_ETHTOOL_OPS(netdev, &cxgb_ethtool_ops);
- }
-diff --git a/drivers/net/ethernet/chelsio/cxgb3/sge.c b/drivers/net/ethernet/chelsio/cxgb3/sge.c
-index 12c3d36..0e5b894 100644
---- a/drivers/net/ethernet/chelsio/cxgb3/sge.c
-+++ b/drivers/net/ethernet/chelsio/cxgb3/sge.c
-@@ -2020,7 +2020,7 @@ static void rx_eth(struct adapter *adap, struct sge_rspq *rq,
- skb_pull(skb, sizeof(*p) + pad);
- skb->protocol = eth_type_trans(skb, adap->port[p->iff]);
- pi = netdev_priv(skb->dev);
-- if ((skb->dev->features & NETIF_F_RXCSUM) && p->csum_valid &&
-+ if ((pi->rx_offload & T3_RX_CSUM) && p->csum_valid &&
- p->csum == htons(0xffff) && !p->fragment) {
- qs->port_stats[SGE_PSTAT_RX_CSUM_GOOD]++;
- skb->ip_summed = CHECKSUM_UNNECESSARY;
-@@ -2121,7 +2121,7 @@ static void lro_add_page(struct adapter *adap, struct sge_qset *qs,
- offset = 2 + sizeof(struct cpl_rx_pkt);
- cpl = qs->lro_va = sd->pg_chunk.va + 2;
-
-- if ((qs->netdev->features & NETIF_F_RXCSUM) &&
-+ if ((pi->rx_offload & T3_RX_CSUM) &&
- cpl->csum_valid && cpl->csum == htons(0xffff)) {
- skb->ip_summed = CHECKSUM_UNNECESSARY;
- qs->port_stats[SGE_PSTAT_RX_CSUM_GOOD]++;
-@@ -2286,8 +2286,7 @@ static int process_responses(struct adapter *adap, struct sge_qset *qs,
- q->next_holdoff = q->holdoff_tmr;
-
- while (likely(budget_left && is_new_response(r, q))) {
-- int packet_complete, eth, ethpad = 2;
-- int lro = !!(qs->netdev->features & NETIF_F_GRO);
-+ int packet_complete, eth, ethpad = 2, lro = qs->lro_enabled;
- struct sk_buff *skb = NULL;
- u32 len, flags;
- __be32 rss_hi, rss_lo;
---
-1.7.1
-
+++ /dev/null
-From 585e4113fc88b627bbc365f2fc15f11a903906c6 Mon Sep 17 00:00:00 2001
-From: Vipul Pandya <vipul@chelsio.com>
-Date: Thu, 10 May 2012 17:12:56 +0530
-Subject: [PATCH 09/14] cxgb3: Add RHEL6.2 backports
-
-Signed-off-by: Vipul Pandya <vipul@chelsio.com>
----
- drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c | 3 +--
- drivers/net/ethernet/chelsio/cxgb3/cxgb3_offload.c | 3 +--
- drivers/net/ethernet/chelsio/cxgb3/xgmac.c | 8 ++++----
- 3 files changed, 6 insertions(+), 8 deletions(-)
-
-diff --git a/drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c b/drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c
-index e2da139..c80fed5 100644
---- a/drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c
-+++ b/drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c
-@@ -1359,7 +1359,6 @@ out:
- static int offload_close(struct t3cdev *tdev)
- {
- struct adapter *adapter = tdev2adap(tdev);
-- struct t3c_data *td = T3C_DATA(tdev);
-
- if (!test_bit(OFFLOAD_DEVMAP_BIT, &adapter->open_device_map))
- return 0;
-@@ -1370,7 +1369,7 @@ static int offload_close(struct t3cdev *tdev)
- sysfs_remove_group(&tdev->lldev->dev.kobj, &offload_attr_group);
-
- /* Flush work scheduled while releasing TIDs */
-- flush_work_sync(&td->tid_release_task);
-+ flush_scheduled_work();
-
- tdev->lldev = NULL;
- cxgb3_set_dummy_ops(tdev);
-diff --git a/drivers/net/ethernet/chelsio/cxgb3/cxgb3_offload.c b/drivers/net/ethernet/chelsio/cxgb3/cxgb3_offload.c
-index d7cd560..ce3b0ae 100644
---- a/drivers/net/ethernet/chelsio/cxgb3/cxgb3_offload.c
-+++ b/drivers/net/ethernet/chelsio/cxgb3/cxgb3_offload.c
-@@ -187,10 +187,9 @@ static struct net_device *get_iff_from_mac(struct adapter *adapter,
- dev = NULL;
- if (grp)
- dev = vlan_group_get_device(grp, vlan);
-- } else if (netif_is_bond_slave(dev)) {
-+ } else
- while (dev->master)
- dev = dev->master;
-- }
- return dev;
- }
- }
-diff --git a/drivers/net/ethernet/chelsio/cxgb3/xgmac.c b/drivers/net/ethernet/chelsio/cxgb3/xgmac.c
-index 3af19a5..5bcadc8 100644
---- a/drivers/net/ethernet/chelsio/cxgb3/xgmac.c
-+++ b/drivers/net/ethernet/chelsio/cxgb3/xgmac.c
-@@ -311,16 +311,16 @@ int t3_mac_set_rx_mode(struct cmac *mac, struct net_device *dev)
- if (dev->flags & IFF_ALLMULTI)
- hash_lo = hash_hi = 0xffffffff;
- else {
-- struct netdev_hw_addr *ha;
-+ const struct dev_addr_list *d;
- int exact_addr_idx = mac->nucast;
-
- hash_lo = hash_hi = 0;
-- netdev_for_each_mc_addr(ha, dev)
-+ netdev_for_each_mc_addr(d, dev)
- if (exact_addr_idx < EXACT_ADDR_FILTERS)
- set_addr_filter(mac, exact_addr_idx++,
-- ha->addr);
-+ d->dmi_addr);
- else {
-- int hash = hash_hw_addr(ha->addr);
-+ int hash = hash_hw_addr(d->dmi_addr);
-
- if (hash < 32)
- hash_lo |= (1 << hash);
---
-1.7.1
-
+++ /dev/null
-From 23e76ca8dcd4d2d1ffbf1cde508c81bc14b09bc9 Mon Sep 17 00:00:00 2001
-From: Vipul Pandya <vipul@chelsio.com>
-Date: Thu, 10 May 2012 17:33:51 +0530
-Subject: [PATCH 10/14] cxgb4: Add phys_id interface
-
-Signed-off-by: Vipul Pandya <vipul@chelsio.com>
----
- drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c | 4 ++--
- 1 files changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
-index 0b77fec..4083a3e 100644
---- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
-+++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
-@@ -868,7 +868,7 @@ void *t4_alloc_mem(size_t size)
- void *p = kzalloc(size, GFP_KERNEL);
-
- if (!p)
-- p = vzalloc(size);
-+ p = vmalloc(size);
- return p;
- }
-
-@@ -1983,7 +1983,7 @@ static struct ethtool_ops cxgb_ethtool_ops = {
- .set_pauseparam = set_pauseparam,
- .get_link = ethtool_op_get_link,
- .get_strings = get_strings,
-- .set_phys_id = identify_port,
-+ .phys_id = identify_port,
- .nway_reset = restart_autoneg,
- .get_sset_count = get_sset_count,
- .get_ethtool_stats = get_stats,
---
-1.7.1
-
+++ /dev/null
-From 583857f85aadb5438eeeff7c1f4778f6c11ef9ed Mon Sep 17 00:00:00 2001
-From: Vipul Pandya <vipul@chelsio.com>
-Date: Thu, 10 May 2012 17:37:37 +0530
-Subject: [PATCH 11/14] cxgb4: Revert netdevice changes
-
-Signed-off-by: Vipul Pandya <vipul@chelsio.com>
----
- drivers/net/ethernet/chelsio/cxgb4/cxgb4.h | 6 ++
- drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c | 72 +++++++++++++++++-----
- drivers/net/ethernet/chelsio/cxgb4/sge.c | 4 +-
- 3 files changed, 64 insertions(+), 18 deletions(-)
-
-diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h b/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h
-index 223a7f7..eb79a2d 100644
---- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h
-+++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h
-@@ -289,6 +289,7 @@ struct port_info {
- u8 port_id;
- u8 tx_chan;
- u8 lport; /* associated offload logical port */
-+ u8 rx_offload; /* CSO, etc */
- u8 nqsets; /* # of qsets */
- u8 first_qset; /* index of first qset */
- u8 rss_mode;
-@@ -296,6 +297,11 @@ struct port_info {
- u16 *rss;
- };
-
-+/* port_info.rx_offload flags */
-+enum {
-+ RX_CSO = 1 << 0,
-+};
-+
- struct dentry;
- struct work_struct;
-
-diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
-index 4083a3e..ef62323 100644
---- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
-+++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
-@@ -1536,6 +1536,24 @@ static int set_pauseparam(struct net_device *dev,
- return 0;
- }
-
-+static u32 get_rx_csum(struct net_device *dev)
-+{
-+ struct port_info *p = netdev_priv(dev);
-+
-+ return p->rx_offload & RX_CSO;
-+}
-+
-+static int set_rx_csum(struct net_device *dev, u32 data)
-+{
-+ struct port_info *p = netdev_priv(dev);
-+
-+ if (data)
-+ p->rx_offload |= RX_CSO;
-+ else
-+ p->rx_offload &= ~RX_CSO;
-+ return 0;
-+}
-+
- static void get_sge_param(struct net_device *dev, struct ethtool_ringparam *e)
- {
- const struct port_info *pi = netdev_priv(dev);
-@@ -1857,20 +1875,36 @@ static int set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
- return err;
- }
-
--static int cxgb_set_features(struct net_device *dev, u32 features)
-+#define TSO_FLAGS (NETIF_F_TSO | NETIF_F_TSO6 | NETIF_F_TSO_ECN)
-+
-+static int set_tso(struct net_device *dev, u32 value)
-+{
-+ if (value)
-+ dev->features |= TSO_FLAGS;
-+ else
-+ dev->features &= ~TSO_FLAGS;
-+ return 0;
-+}
-+
-+static int set_flags(struct net_device *dev, u32 flags)
- {
-- const struct port_info *pi = netdev_priv(dev);
-- u32 changed = dev->features ^ features;
- int err;
-+ unsigned long old_feat = dev->features;
-
-- if (!(changed & NETIF_F_HW_VLAN_RX))
-- return 0;
-+ err = ethtool_op_set_flags(dev, flags, ETH_FLAG_RXHASH |
-+ ETH_FLAG_RXVLAN | ETH_FLAG_TXVLAN);
-+ if (err)
-+ return err;
-
-- err = t4_set_rxmode(pi->adapter, pi->adapter->fn, pi->viid, -1,
-- -1, -1, -1,
-- !!(features & NETIF_F_HW_VLAN_RX), true);
-- if (unlikely(err))
-- dev->features = features ^ NETIF_F_HW_VLAN_RX;
-+ if ((old_feat ^ dev->features) & NETIF_F_HW_VLAN_RX) {
-+ const struct port_info *pi = netdev_priv(dev);
-+
-+ err = t4_set_rxmode(pi->adapter, pi->adapter->fn, pi->viid, -1,
-+ -1, -1, -1, !!(flags & ETH_FLAG_RXVLAN),
-+ true);
-+ if (err)
-+ dev->features = old_feat;
-+ }
- return err;
- }
-
-@@ -1981,6 +2015,10 @@ static struct ethtool_ops cxgb_ethtool_ops = {
- .set_eeprom = set_eeprom,
- .get_pauseparam = get_pauseparam,
- .set_pauseparam = set_pauseparam,
-+ .get_rx_csum = get_rx_csum,
-+ .set_rx_csum = set_rx_csum,
-+ .set_tx_csum = ethtool_op_set_tx_ipv6_csum,
-+ .set_sg = ethtool_op_set_sg,
- .get_link = ethtool_op_get_link,
- .get_strings = get_strings,
- .phys_id = identify_port,
-@@ -1991,6 +2029,8 @@ static struct ethtool_ops cxgb_ethtool_ops = {
- .get_regs = get_regs,
- .get_wol = get_wol,
- .set_wol = set_wol,
-+ .set_tso = set_tso,
-+ .set_flags = set_flags,
- .get_rxnfc = get_rxnfc,
- .get_rxfh_indir = get_rss_table,
- .set_rxfh_indir = set_rss_table,
-@@ -2847,7 +2887,6 @@ static const struct net_device_ops cxgb4_netdev_ops = {
- .ndo_get_stats64 = cxgb_get_stats,
- .ndo_set_rx_mode = cxgb_set_rxmode,
- .ndo_set_mac_address = cxgb_set_mac_addr,
-- .ndo_set_features = cxgb_set_features,
- .ndo_validate_addr = eth_validate_addr,
- .ndo_do_ioctl = cxgb_ioctl,
- .ndo_change_mtu = cxgb_change_mtu,
-@@ -3530,7 +3569,6 @@ static void free_some_resources(struct adapter *adapter)
- t4_fw_bye(adapter, adapter->fn);
- }
-
--#define TSO_FLAGS (NETIF_F_TSO | NETIF_F_TSO6 | NETIF_F_TSO_ECN)
- #define VLAN_FEAT (NETIF_F_SG | NETIF_F_IP_CSUM | TSO_FLAGS | \
- NETIF_F_IPV6_CSUM | NETIF_F_HIGHDMA)
-
-@@ -3632,14 +3670,14 @@ static int __devinit init_one(struct pci_dev *pdev,
- pi = netdev_priv(netdev);
- pi->adapter = adapter;
- pi->xact_addr_filt = -1;
-+ pi->rx_offload = RX_CSO;
- pi->port_id = i;
- netdev->irq = pdev->irq;
-
-- netdev->hw_features = NETIF_F_SG | TSO_FLAGS |
-- NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM |
-- NETIF_F_RXCSUM | NETIF_F_RXHASH |
-- NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
-- netdev->features |= netdev->hw_features | highdma;
-+ netdev->features |= NETIF_F_SG | TSO_FLAGS;
-+ netdev->features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM;
-+ netdev->features |= NETIF_F_GRO | NETIF_F_RXHASH | highdma;
-+ netdev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
- netdev->vlan_features = netdev->features & VLAN_FEAT;
-
- netdev->netdev_ops = &cxgb4_netdev_ops;
-diff --git a/drivers/net/ethernet/chelsio/cxgb4/sge.c b/drivers/net/ethernet/chelsio/cxgb4/sge.c
-index 7fa9fd0..1dcf0fd 100644
---- a/drivers/net/ethernet/chelsio/cxgb4/sge.c
-+++ b/drivers/net/ethernet/chelsio/cxgb4/sge.c
-@@ -1559,6 +1559,7 @@ int t4_ethrx_handler(struct sge_rspq *q, const __be64 *rsp,
- {
- bool csum_ok;
- struct sk_buff *skb;
-+ struct port_info *pi;
- const struct cpl_rx_pkt *pkt;
- struct sge_eth_rxq *rxq = container_of(q, struct sge_eth_rxq, rspq);
-
-@@ -1586,9 +1587,10 @@ int t4_ethrx_handler(struct sge_rspq *q, const __be64 *rsp,
- if (skb->dev->features & NETIF_F_RXHASH)
- skb->rxhash = (__force u32)pkt->rsshdr.hash_val;
-
-+ pi = netdev_priv(skb->dev);
- rxq->stats.pkts++;
-
-- if (csum_ok && (q->netdev->features & NETIF_F_RXCSUM) &&
-+ if (csum_ok && (pi->rx_offload & RX_CSO) &&
- (pkt->l2info & htonl(RXF_UDP | RXF_TCP))) {
- if (!pkt->ip_frag) {
- skb->ip_summed = CHECKSUM_UNNECESSARY;
---
-1.7.1
-
+++ /dev/null
-From 65f230d00b7f0d6558f53a2df049cc7f9fa7f041 Mon Sep 17 00:00:00 2001
-From: Vipul Pandya <vipul@chelsio.com>
-Date: Thu, 10 May 2012 17:49:00 +0530
-Subject: [PATCH 12/14] cxgb4: cxgb4_main and sge changes
-
-Signed-off-by: Vipul Pandya <vipul@chelsio.com>
----
- drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c | 89 ++---------------------
- drivers/net/ethernet/chelsio/cxgb4/sge.c | 4 -
- 2 files changed, 7 insertions(+), 86 deletions(-)
-
-diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
-index ef62323..49da127 100644
---- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
-+++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
-@@ -333,14 +333,14 @@ static int set_addr_filters(const struct net_device *dev, bool sleep)
- u16 filt_idx[7];
- const u8 *addr[7];
- int ret, naddr = 0;
-+ const struct dev_addr_list *d;
- const struct netdev_hw_addr *ha;
-- int uc_cnt = netdev_uc_count(dev);
-- int mc_cnt = netdev_mc_count(dev);
-+ int uc_cnt = ((&(dev)->uc)->count);
- const struct port_info *pi = netdev_priv(dev);
- unsigned int mb = pi->adapter->fn;
-
- /* first do the secondary unicast addresses */
-- netdev_for_each_uc_addr(ha, dev) {
-+ list_for_each_entry(ha, &(&(dev)->uc)->list, list) {
- addr[naddr++] = ha->addr;
- if (--uc_cnt == 0 || naddr >= ARRAY_SIZE(addr)) {
- ret = t4_alloc_mac_filt(pi->adapter, mb, pi->viid, free,
-@@ -354,9 +354,9 @@ static int set_addr_filters(const struct net_device *dev, bool sleep)
- }
-
- /* next set up the multicast addresses */
-- netdev_for_each_mc_addr(ha, dev) {
-- addr[naddr++] = ha->addr;
-- if (--mc_cnt == 0 || naddr >= ARRAY_SIZE(addr)) {
-+ netdev_for_each_mc_addr(d, dev) {
-+ addr[naddr++] = d->dmi_addr;
-+ if (naddr >= ARRAY_SIZE(addr) || d->next == NULL) {
- ret = t4_alloc_mac_filt(pi->adapter, mb, pi->viid, free,
- naddr, addr, filt_idx, &mhash, sleep);
- if (ret < 0)
-@@ -1891,8 +1891,7 @@ static int set_flags(struct net_device *dev, u32 flags)
- int err;
- unsigned long old_feat = dev->features;
-
-- err = ethtool_op_set_flags(dev, flags, ETH_FLAG_RXHASH |
-- ETH_FLAG_RXVLAN | ETH_FLAG_TXVLAN);
-+ err = ethtool_op_set_flags(dev, flags);
- if (err)
- return err;
-
-@@ -1908,35 +1907,6 @@ static int set_flags(struct net_device *dev, u32 flags)
- return err;
- }
-
--static int get_rss_table(struct net_device *dev, struct ethtool_rxfh_indir *p)
--{
-- const struct port_info *pi = netdev_priv(dev);
-- unsigned int n = min_t(unsigned int, p->size, pi->rss_size);
--
-- p->size = pi->rss_size;
-- while (n--)
-- p->ring_index[n] = pi->rss[n];
-- return 0;
--}
--
--static int set_rss_table(struct net_device *dev,
-- const struct ethtool_rxfh_indir *p)
--{
-- unsigned int i;
-- struct port_info *pi = netdev_priv(dev);
--
-- if (p->size != pi->rss_size)
-- return -EINVAL;
-- for (i = 0; i < p->size; i++)
-- if (p->ring_index[i] >= pi->nqsets)
-- return -EINVAL;
-- for (i = 0; i < p->size; i++)
-- pi->rss[i] = p->ring_index[i];
-- if (pi->adapter->flags & FULL_INIT_DONE)
-- return write_rss(pi, pi->rss);
-- return 0;
--}
--
- static int get_rxnfc(struct net_device *dev, struct ethtool_rxnfc *info,
- void *rules)
- {
-@@ -2032,8 +2002,6 @@ static struct ethtool_ops cxgb_ethtool_ops = {
- .set_tso = set_tso,
- .set_flags = set_flags,
- .get_rxnfc = get_rxnfc,
-- .get_rxfh_indir = get_rss_table,
-- .set_rxfh_indir = set_rss_table,
- .flash_device = set_flash,
- };
-
-@@ -2743,48 +2711,6 @@ static int cxgb_close(struct net_device *dev)
- return t4_enable_vi(adapter, adapter->fn, pi->viid, false, false);
- }
-
--static struct rtnl_link_stats64 *cxgb_get_stats(struct net_device *dev,
-- struct rtnl_link_stats64 *ns)
--{
-- struct port_stats stats;
-- struct port_info *p = netdev_priv(dev);
-- struct adapter *adapter = p->adapter;
--
-- spin_lock(&adapter->stats_lock);
-- t4_get_port_stats(adapter, p->tx_chan, &stats);
-- spin_unlock(&adapter->stats_lock);
--
-- ns->tx_bytes = stats.tx_octets;
-- ns->tx_packets = stats.tx_frames;
-- ns->rx_bytes = stats.rx_octets;
-- ns->rx_packets = stats.rx_frames;
-- ns->multicast = stats.rx_mcast_frames;
--
-- /* detailed rx_errors */
-- ns->rx_length_errors = stats.rx_jabber + stats.rx_too_long +
-- stats.rx_runt;
-- ns->rx_over_errors = 0;
-- ns->rx_crc_errors = stats.rx_fcs_err;
-- ns->rx_frame_errors = stats.rx_symbol_err;
-- ns->rx_fifo_errors = stats.rx_ovflow0 + stats.rx_ovflow1 +
-- stats.rx_ovflow2 + stats.rx_ovflow3 +
-- stats.rx_trunc0 + stats.rx_trunc1 +
-- stats.rx_trunc2 + stats.rx_trunc3;
-- ns->rx_missed_errors = 0;
--
-- /* detailed tx_errors */
-- ns->tx_aborted_errors = 0;
-- ns->tx_carrier_errors = 0;
-- ns->tx_fifo_errors = 0;
-- ns->tx_heartbeat_errors = 0;
-- ns->tx_window_errors = 0;
--
-- ns->tx_errors = stats.tx_error_frames;
-- ns->rx_errors = stats.rx_symbol_err + stats.rx_fcs_err +
-- ns->rx_length_errors + stats.rx_len_err + ns->rx_fifo_errors;
-- return ns;
--}
--
- static int cxgb_ioctl(struct net_device *dev, struct ifreq *req, int cmd)
- {
- unsigned int mbox;
-@@ -2884,7 +2810,6 @@ static const struct net_device_ops cxgb4_netdev_ops = {
- .ndo_open = cxgb_open,
- .ndo_stop = cxgb_close,
- .ndo_start_xmit = t4_eth_xmit,
-- .ndo_get_stats64 = cxgb_get_stats,
- .ndo_set_rx_mode = cxgb_set_rxmode,
- .ndo_set_mac_address = cxgb_set_mac_addr,
- .ndo_validate_addr = eth_validate_addr,
-diff --git a/drivers/net/ethernet/chelsio/cxgb4/sge.c b/drivers/net/ethernet/chelsio/cxgb4/sge.c
-index 1dcf0fd..c935ae9 100644
---- a/drivers/net/ethernet/chelsio/cxgb4/sge.c
-+++ b/drivers/net/ethernet/chelsio/cxgb4/sge.c
-@@ -1530,8 +1530,6 @@ static void do_gro(struct sge_eth_rxq *rxq, const struct pkt_gl *gl,
- skb->truesize += skb->data_len;
- skb->ip_summed = CHECKSUM_UNNECESSARY;
- skb_record_rx_queue(skb, rxq->rspq.idx);
-- if (rxq->rspq.netdev->features & NETIF_F_RXHASH)
-- skb->rxhash = (__force u32)pkt->rsshdr.hash_val;
-
- if (unlikely(pkt->vlan_ex)) {
- __vlan_hwaccel_put_tag(skb, ntohs(pkt->vlan));
-@@ -1584,8 +1582,6 @@ int t4_ethrx_handler(struct sge_rspq *q, const __be64 *rsp,
- __skb_pull(skb, RX_PKT_PAD); /* remove ethernet header padding */
- skb->protocol = eth_type_trans(skb, q->netdev);
- skb_record_rx_queue(skb, q->idx);
-- if (skb->dev->features & NETIF_F_RXHASH)
-- skb->rxhash = (__force u32)pkt->rsshdr.hash_val;
-
- pi = netdev_priv(skb->dev);
- rxq->stats.pkts++;
---
-1.7.1
-
+++ /dev/null
-From ce0bbdee8fe4ac34ad0b695f914c499b5ebeae3f Mon Sep 17 00:00:00 2001
-From: Vipul Pandya <vipul@chelsio.com>
-Date: Thu, 10 May 2012 17:51:16 +0530
-Subject: [PATCH 13/14] cxgb4: real_num_tx_queues changes
-
-Signed-off-by: Vipul Pandya <vipul@chelsio.com>
----
- drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c | 3 ++-
- drivers/net/ethernet/chelsio/cxgb4/t4_hw.c | 2 +-
- 2 files changed, 3 insertions(+), 2 deletions(-)
-
-diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
-index 49da127..a669aad 100644
---- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
-+++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
-@@ -3462,7 +3462,7 @@ static void __devinit enable_pcie_relaxed_ordering(struct pci_dev *dev)
- u16 v;
- int pos;
-
-- pos = pci_pcie_cap(dev);
-+ pos = pci_find_capability(dev, PCI_CAP_ID_EXP);
- if (pos > 0) {
- pci_read_config_word(dev, pos + PCI_EXP_DEVCTL, &v);
- v |= PCI_EXP_DEVCTL_RELAX_EN;
-@@ -3654,6 +3654,7 @@ static int __devinit init_one(struct pci_dev *pdev,
- */
- for_each_port(adapter, i) {
- pi = adap2pinfo(adapter, i);
-+ adapter->port[i]->real_num_tx_queues = pi->nqsets;
- netif_set_real_num_tx_queues(adapter->port[i], pi->nqsets);
- netif_set_real_num_rx_queues(adapter->port[i], pi->nqsets);
-
-diff --git a/drivers/net/ethernet/chelsio/cxgb4/t4_hw.c b/drivers/net/ethernet/chelsio/cxgb4/t4_hw.c
-index d1ec111..8147917 100644
---- a/drivers/net/ethernet/chelsio/cxgb4/t4_hw.c
-+++ b/drivers/net/ethernet/chelsio/cxgb4/t4_hw.c
-@@ -2685,7 +2685,7 @@ static void __devinit get_pci_mode(struct adapter *adapter,
- struct pci_params *p)
- {
- u16 val;
-- u32 pcie_cap = pci_pcie_cap(adapter->pdev);
-+ u32 pcie_cap = pci_find_capability(adapter->pdev, PCI_CAP_ID_EXP);
-
- if (pcie_cap) {
- pci_read_config_word(adapter->pdev, pcie_cap + PCI_EXP_LNKSTA,
---
-1.7.1
-
+++ /dev/null
-From 05e7163348fbef11a2307c52259e75ff19d46cf1 Mon Sep 17 00:00:00 2001
-From: Vipul Pandya <vipul@chelsio.com>
-Date: Thu, 10 May 2012 17:52:47 +0530
-Subject: [PATCH 14/14] cxgb4: Fix packet counters
-
-Signed-off-by: Vipul Pandya <vipul@chelsio.com>
----
- drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c | 43 +++++++++++++++++++++++
- 1 files changed, 43 insertions(+), 0 deletions(-)
-
-diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
-index a669aad..90390c3 100644
---- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
-+++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
-@@ -2711,6 +2711,48 @@ static int cxgb_close(struct net_device *dev)
- return t4_enable_vi(adapter, adapter->fn, pi->viid, false, false);
- }
-
-+static struct net_device_stats *cxgb_get_stats(struct net_device *dev)
-+{
-+ struct port_stats stats;
-+ struct port_info *p = netdev_priv(dev);
-+ struct adapter *adapter = p->adapter;
-+ struct net_device_stats *ns = &dev->stats;
-+
-+ spin_lock(&adapter->stats_lock);
-+ t4_get_port_stats(adapter, p->tx_chan, &stats);
-+ spin_unlock(&adapter->stats_lock);
-+
-+ ns->tx_bytes = stats.tx_octets;
-+ ns->tx_packets = stats.tx_frames;
-+ ns->rx_bytes = stats.rx_octets;
-+ ns->rx_packets = stats.rx_frames;
-+ ns->multicast = stats.rx_mcast_frames;
-+
-+ /* detailed rx_errors */
-+ ns->rx_length_errors = stats.rx_jabber + stats.rx_too_long +
-+ stats.rx_runt;
-+ ns->rx_over_errors = 0;
-+ ns->rx_crc_errors = stats.rx_fcs_err;
-+ ns->rx_frame_errors = stats.rx_symbol_err;
-+ ns->rx_fifo_errors = stats.rx_ovflow0 + stats.rx_ovflow1 +
-+ stats.rx_ovflow2 + stats.rx_ovflow3 +
-+ stats.rx_trunc0 + stats.rx_trunc1 +
-+ stats.rx_trunc2 + stats.rx_trunc3;
-+ ns->rx_missed_errors = 0;
-+
-+ /* detailed tx_errors */
-+ ns->tx_aborted_errors = 0;
-+ ns->tx_carrier_errors = 0;
-+ ns->tx_fifo_errors = 0;
-+ ns->tx_heartbeat_errors = 0;
-+ ns->tx_window_errors = 0;
-+
-+ ns->tx_errors = stats.tx_error_frames;
-+ ns->rx_errors = stats.rx_symbol_err + stats.rx_fcs_err +
-+ ns->rx_length_errors + stats.rx_len_err + ns->rx_fifo_errors;
-+ return ns;
-+}
-+
- static int cxgb_ioctl(struct net_device *dev, struct ifreq *req, int cmd)
- {
- unsigned int mbox;
-@@ -2810,6 +2852,7 @@ static const struct net_device_ops cxgb4_netdev_ops = {
- .ndo_open = cxgb_open,
- .ndo_stop = cxgb_close,
- .ndo_start_xmit = t4_eth_xmit,
-+ .ndo_get_stats = cxgb_get_stats,
- .ndo_set_rx_mode = cxgb_set_rxmode,
- .ndo_set_mac_address = cxgb_set_mac_addr,
- .ndo_validate_addr = eth_validate_addr,
---
-1.7.1
-
+++ /dev/null
-diff -rup a/drivers/infiniband/hw/qib/qib_fs.c b/drivers/infiniband/hw/qib/qib_fs.c
---- a/drivers/infiniband/hw/qib/qib_fs.c 2012-05-21 10:14:13.000000000 -0400
-+++ b/drivers/infiniband/hw/qib/qib_fs.c 2012-05-21 10:51:08.000000000 -0400
-@@ -58,7 +58,9 @@ static int qibfs_mknod(struct inode *dir
- goto bail;
- }
-
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,36))
- inode->i_ino = get_next_ino();
-+#endif
- inode->i_mode = mode;
- inode->i_uid = 0;
- inode->i_gid = 0;
-@@ -453,14 +455,27 @@ static int remove_file(struct dentry *pa
- goto bail;
- }
-
-+#if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,36))
-+ spin_lock(&dcache_lock);
-+#endif
- spin_lock(&tmp->d_lock);
- if (!(d_unhashed(tmp) && tmp->d_inode)) {
-+#if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,36))
-+ dget_locked(tmp);
-+#else
- dget_dlock(tmp);
-+#endif
- __d_drop(tmp);
- spin_unlock(&tmp->d_lock);
-+#if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,36))
-+ spin_unlock(&dcache_lock);
-+#endif
- simple_unlink(parent->d_inode, tmp);
- } else {
- spin_unlock(&tmp->d_lock);
-+#if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,36))
-+ spin_unlock(&dcache_lock);
-+#endif
- }
-
- ret = 0;
-@@ -552,6 +567,7 @@ bail:
- return ret;
- }
-
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,36))
- static struct dentry *qibfs_mount(struct file_system_type *fs_type, int flags,
- const char *dev_name, void *data)
- {
-@@ -559,6 +575,15 @@ static struct dentry *qibfs_mount(struct
- ret = mount_single(fs_type, flags, data, qibfs_fill_super);
- if (!IS_ERR(ret))
- qib_super = ret->d_sb;
-+#else
-+static int qibfs_get_sb(struct file_system_type *fs_type, int flags,
-+ const char *dev_name, void *data, struct vfsmount *mnt)
-+{
-+ int ret = get_sb_single(fs_type, flags, data,
-+ qibfs_fill_super, mnt);
-+ if (ret >= 0)
-+ qib_super = mnt->mnt_sb;
-+#endif
- return ret;
- }
-
-@@ -600,7 +625,11 @@ int qibfs_remove(struct qib_devdata *dd)
- static struct file_system_type qibfs_fs_type = {
- .owner = THIS_MODULE,
- .name = "ipathfs",
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,36))
- .mount = qibfs_mount,
-+#else
-+ .get_sb = qibfs_get_sb,
-+#endif
- .kill_sb = qibfs_kill_super,
- };
-
+++ /dev/null
-Index: compat-rdma/drivers/infiniband/core/umem.c
-===================================================================
---- compat-rdma.orig/drivers/infiniband/core/umem.c
-+++ compat-rdma/drivers/infiniband/core/umem.c
-@@ -137,7 +137,7 @@ struct ib_umem *ib_umem_get(struct ib_uc
-
- down_write(¤t->mm->mmap_sem);
-
-- locked = npages + current->mm->pinned_vm;
-+ locked = npages + current->mm->locked_vm;
- lock_limit = rlimit(RLIMIT_MEMLOCK) >> PAGE_SHIFT;
-
- if ((locked > lock_limit) && !capable(CAP_IPC_LOCK)) {
-@@ -207,7 +207,7 @@ out:
- __ib_umem_release(context->device, umem, 0);
- kfree(umem);
- } else
-- current->mm->pinned_vm = locked;
-+ current->mm->locked_vm = locked;
-
- up_write(¤t->mm->mmap_sem);
- if (vma_list)
-@@ -223,7 +223,7 @@ static void ib_umem_account(struct work_
- struct ib_umem *umem = container_of(work, struct ib_umem, work);
-
- down_write(&umem->mm->mmap_sem);
-- umem->mm->pinned_vm -= umem->diff;
-+ umem->mm->locked_vm -= umem->diff;
- up_write(&umem->mm->mmap_sem);
- mmput(umem->mm);
- kfree(umem);
-Index: compat-rdma/drivers/infiniband/hw/ipath/ipath_user_pages.c
-===================================================================
---- compat-rdma.orig/drivers/infiniband/hw/ipath/ipath_user_pages.c
-+++ compat-rdma/drivers/infiniband/hw/ipath/ipath_user_pages.c
-@@ -79,7 +79,7 @@ static int __ipath_get_user_pages(unsign
- goto bail_release;
- }
-
-- current->mm->pinned_vm += num_pages;
-+ current->mm->locked_vm += num_pages;
-
- ret = 0;
- goto bail;
-@@ -178,7 +178,7 @@ void ipath_release_user_pages(struct pag
-
- __ipath_release_user_pages(p, num_pages, 1);
-
-- current->mm->pinned_vm -= num_pages;
-+ current->mm->locked_vm -= num_pages;
-
- up_write(¤t->mm->mmap_sem);
- }
-@@ -195,7 +195,7 @@ static void user_pages_account(struct wo
- container_of(_work, struct ipath_user_pages_work, work);
-
- down_write(&work->mm->mmap_sem);
-- work->mm->pinned_vm -= work->num_pages;
-+ work->mm->locked_vm -= work->num_pages;
- up_write(&work->mm->mmap_sem);
- mmput(work->mm);
- kfree(work);
-Index: compat-rdma/drivers/infiniband/hw/qib/qib_user_pages.c
-===================================================================
---- compat-rdma.orig/drivers/infiniband/hw/qib/qib_user_pages.c
-+++ compat-rdma/drivers/infiniband/hw/qib/qib_user_pages.c
-@@ -74,7 +74,7 @@ static int __qib_get_user_pages(unsigned
- goto bail_release;
- }
-
-- current->mm->pinned_vm += num_pages;
-+ current->mm->locked_vm += num_pages;
-
- ret = 0;
- goto bail;
-@@ -151,7 +151,7 @@ void qib_release_user_pages(struct page
- __qib_release_user_pages(p, num_pages, 1);
-
- if (current->mm) {
-- current->mm->pinned_vm -= num_pages;
-+ current->mm->locked_vm -= num_pages;
- up_write(¤t->mm->mmap_sem);
- }
- }
+++ /dev/null
-Index: compat-rdma/drivers/net/ethernet/mellanox/mlx4/en_rx.c
-===================================================================
---- compat-rdma.orig/drivers/net/ethernet/mellanox/mlx4/en_rx.c 2012-01-09 16:15:04.000000000 +0200
-+++ compat-rdma/drivers/net/ethernet/mellanox/mlx4/en_rx.c 2012-01-23 11:52:39.899175000 +0200
-@@ -44,7 +44,7 @@
-
- static int mlx4_en_alloc_frag(struct mlx4_en_priv *priv,
- struct mlx4_en_rx_desc *rx_desc,
-- struct page_frag *skb_frags,
-+ struct skb_frag_struct *skb_frags,
- struct mlx4_en_rx_alloc *ring_alloc,
- int i)
- {
-@@ -61,7 +61,7 @@ static int mlx4_en_alloc_frag(struct mlx
- return -ENOMEM;
-
- skb_frags[i].page = page_alloc->page;
-- skb_frags[i].offset = page_alloc->offset;
-+ skb_frags[i].page_offset = page_alloc->offset;
- page_alloc->page = page;
- page_alloc->offset = frag_info->frag_align;
- } else {
-@@ -69,11 +69,11 @@ static int mlx4_en_alloc_frag(struct mlx
- get_page(page);
-
- skb_frags[i].page = page;
-- skb_frags[i].offset = page_alloc->offset;
-+ skb_frags[i].page_offset = page_alloc->offset;
- page_alloc->offset += frag_info->frag_stride;
- }
- dma = pci_map_single(mdev->pdev, page_address(skb_frags[i].page) +
-- skb_frags[i].offset, frag_info->frag_size,
-+ skb_frags[i].page_offset, frag_info->frag_size,
- PCI_DMA_FROMDEVICE);
- rx_desc->data[i].addr = cpu_to_be64(dma);
- return 0;
-@@ -157,8 +157,8 @@ static int mlx4_en_prepare_rx_desc(struc
- struct mlx4_en_rx_ring *ring, int index)
- {
- struct mlx4_en_rx_desc *rx_desc = ring->buf + (index * ring->stride);
-- struct page_frag *skb_frags = ring->rx_info +
-- (index << priv->log_rx_info);
-+ struct skb_frag_struct *skb_frags = ring->rx_info +
-+ (index << priv->log_rx_info);
- int i;
-
- for (i = 0; i < priv->num_frags; i++)
-@@ -183,7 +183,7 @@ static void mlx4_en_free_rx_desc(struct
- int index)
- {
- struct mlx4_en_dev *mdev = priv->mdev;
-- struct page_frag *skb_frags;
-+ struct skb_frag_struct *skb_frags;
- struct mlx4_en_rx_desc *rx_desc = ring->buf + (index << ring->log_stride);
- dma_addr_t dma;
- int nr;
-@@ -194,7 +194,7 @@ static void mlx4_en_free_rx_desc(struct
- dma = be64_to_cpu(rx_desc->data[nr].addr);
-
- en_dbg(DRV, priv, "Unmapping buffer at dma:0x%llx\n", (u64) dma);
-- pci_unmap_single(mdev->pdev, dma, skb_frags[nr].size,
-+ pci_unmap_single(mdev->pdev, dma, skb_frag_size(&skb_frags[nr]),
- PCI_DMA_FROMDEVICE);
- put_page(skb_frags[nr].page);
- }
-@@ -403,7 +403,7 @@ void mlx4_en_deactivate_rx_ring(struct m
- /* Unmap a completed descriptor and free unused pages */
- static int mlx4_en_complete_rx_desc(struct mlx4_en_priv *priv,
- struct mlx4_en_rx_desc *rx_desc,
-- struct page_frag *skb_frags,
-+ struct skb_frag_struct *skb_frags,
- struct sk_buff *skb,
- struct mlx4_en_rx_alloc *page_alloc,
- int length)
-@@ -421,9 +421,9 @@ static int mlx4_en_complete_rx_desc(stru
- break;
-
- /* Save page reference in skb */
-- __skb_frag_set_page(&skb_frags_rx[nr], skb_frags[nr].page);
-- skb_frag_size_set(&skb_frags_rx[nr], skb_frags[nr].size);
-- skb_frags_rx[nr].page_offset = skb_frags[nr].offset;
-+ skb_frags_rx[nr].page = skb_frags[nr].page;
-+ skb_frag_size_set(&skb_frags_rx[nr], skb_frag_size(&skb_frags[nr]));
-+ skb_frags_rx[nr].page_offset = skb_frags[nr].page_offset;
- skb->truesize += frag_info->frag_stride;
- dma = be64_to_cpu(rx_desc->data[nr].addr);
-
-@@ -446,7 +446,7 @@ fail:
- * the descriptor) of this packet; remaining fragments are reused... */
- while (nr > 0) {
- nr--;
-- __skb_frag_unref(&skb_frags_rx[nr]);
-+ put_page(skb_frags_rx[nr].page);
- }
- return 0;
- }
-@@ -454,7 +454,7 @@ fail:
-
- static struct sk_buff *mlx4_en_rx_skb(struct mlx4_en_priv *priv,
- struct mlx4_en_rx_desc *rx_desc,
-- struct page_frag *skb_frags,
-+ struct skb_frag_struct *skb_frags,
- struct mlx4_en_rx_alloc *page_alloc,
- unsigned int length)
- {
-@@ -475,7 +475,7 @@ static struct sk_buff *mlx4_en_rx_skb(st
-
- /* Get pointer to first fragment so we could copy the headers into the
- * (linear part of the) skb */
-- va = page_address(skb_frags[0].page) + skb_frags[0].offset;
-+ va = page_address(skb_frags[0].page) + skb_frags[0].page_offset;
-
- if (length <= SMALL_PACKET_SIZE) {
- /* We are copying all relevant data to the skb - temporarily
-@@ -533,7 +533,7 @@ int mlx4_en_process_rx_cq(struct net_dev
- struct mlx4_en_priv *priv = netdev_priv(dev);
- struct mlx4_cqe *cqe;
- struct mlx4_en_rx_ring *ring = &priv->rx_ring[cq->ring];
-- struct page_frag *skb_frags;
-+ struct skb_frag_struct *skb_frags;
- struct mlx4_en_rx_desc *rx_desc;
- struct sk_buff *skb;
- int index;
+++ /dev/null
-Index: compat-rdma/drivers/infiniband/ulp/iser/iscsi_iser.c
-===================================================================
---- compat-rdma.orig/drivers/infiniband/ulp/iser/iscsi_iser.c
-+++ compat-rdma/drivers/infiniband/ulp/iser/iscsi_iser.c
-@@ -719,7 +719,9 @@ static struct iscsi_transport iscsi_iser
- .create_conn = iscsi_iser_conn_create,
- .bind_conn = iscsi_iser_conn_bind,
- .destroy_conn = iscsi_iser_conn_destroy,
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(3,2,0))
- .attr_is_visible = iser_attr_is_visible,
-+#endif
- .set_param = iscsi_iser_set_param,
- .get_conn_param = iscsi_conn_get_param,
- .get_ep_param = iscsi_iser_get_ep_param,
+++ /dev/null
-From 5ea32823a4937cd918a823bd0dfbbb592e8b9e6e Mon Sep 17 00:00:00 2001
-From: Vipul Pandya <vipul@chelsio.com>
-Date: Mon, 7 May 2012 14:17:55 +0530
-Subject: [PATCH 1/2] cxgb4: Reversing convert to SKB paged frag API.
-
-This patch is a reverse patch of upstream commit
-e91b0f2491f7a7b21c4e562df09f3dbe551f0fe2
-
-Signed-off-by: Vipul Pandya <vipul@chelsio.com>
----
- drivers/net/ethernet/chelsio/cxgb4/cxgb4.h | 2 +-
- drivers/net/ethernet/chelsio/cxgb4/sge.c | 45 +++++++++++++--------------
- 2 files changed, 23 insertions(+), 24 deletions(-)
-
-diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h b/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h
-index 0fe1885..223a7f7 100644
---- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h
-+++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h
-@@ -326,7 +326,7 @@ struct sge_fl { /* SGE free-buffer queue state */
-
- /* A packet gather list */
- struct pkt_gl {
-- struct page_frag frags[MAX_SKB_FRAGS];
-+ skb_frag_t frags[MAX_SKB_FRAGS];
- void *va; /* virtual address of first byte */
- unsigned int nfrags; /* # of fragments */
- unsigned int tot_len; /* total length of fragments */
-diff --git a/drivers/net/ethernet/chelsio/cxgb4/sge.c b/drivers/net/ethernet/chelsio/cxgb4/sge.c
-index 140254c..c5e99fb 100644
---- a/drivers/net/ethernet/chelsio/cxgb4/sge.c
-+++ b/drivers/net/ethernet/chelsio/cxgb4/sge.c
-@@ -216,8 +216,8 @@ static int map_skb(struct device *dev, const struct sk_buff *skb,
- end = &si->frags[si->nr_frags];
-
- for (fp = si->frags; fp < end; fp++) {
-- *++addr = skb_frag_dma_map(dev, fp, 0, skb_frag_size(fp),
-- DMA_TO_DEVICE);
-+ *++addr = dma_map_page(dev, fp->page, fp->page_offset,
-+ skb_frag_size(fp), DMA_TO_DEVICE);
- if (dma_mapping_error(dev, *addr))
- goto unwind;
- }
-@@ -1410,23 +1410,22 @@ int cxgb4_ofld_send(struct net_device *dev, struct sk_buff *skb)
- }
- EXPORT_SYMBOL(cxgb4_ofld_send);
-
--static inline void copy_frags(struct sk_buff *skb,
-+static inline void copy_frags(struct skb_shared_info *ssi,
- const struct pkt_gl *gl, unsigned int offset)
- {
-- int i;
-+ unsigned int n;
-
- /* usually there's just one frag */
-- __skb_fill_page_desc(skb, 0, gl->frags[0].page,
-- gl->frags[0].offset + offset,
-- gl->frags[0].size - offset);
-- skb_shinfo(skb)->nr_frags = gl->nfrags;
-- for (i = 1; i < gl->nfrags; i++)
-- __skb_fill_page_desc(skb, i, gl->frags[i].page,
-- gl->frags[i].offset,
-- gl->frags[i].size);
-+ ssi->frags[0].page = gl->frags[0].page;
-+ ssi->frags[0].page_offset = gl->frags[0].page_offset + offset;
-+ skb_frag_size_set(&ssi->frags[0], skb_frag_size(&gl->frags[0]) - offset);
-+ ssi->nr_frags = gl->nfrags;
-+ n = gl->nfrags - 1;
-+ if (n)
-+ memcpy(&ssi->frags[1], &gl->frags[1], n * sizeof(skb_frag_t));
-
- /* get a reference to the last page, we don't own it */
-- get_page(gl->frags[gl->nfrags - 1].page);
-+ get_page(gl->frags[n].page);
- }
-
- /**
-@@ -1461,7 +1460,7 @@ struct sk_buff *cxgb4_pktgl_to_skb(const struct pkt_gl *gl,
- __skb_put(skb, pull_len);
- skb_copy_to_linear_data(skb, gl->va, pull_len);
-
-- copy_frags(skb, gl, pull_len);
-+ copy_frags(skb_shinfo(skb), gl, pull_len);
- skb->len = gl->tot_len;
- skb->data_len = skb->len - pull_len;
- skb->truesize += skb->data_len;
-@@ -1480,7 +1479,7 @@ EXPORT_SYMBOL(cxgb4_pktgl_to_skb);
- static void t4_pktgl_free(const struct pkt_gl *gl)
- {
- int n;
-- const struct page_frag *p;
-+ const skb_frag_t *p;
-
- for (p = gl->frags, n = gl->nfrags - 1; n--; p++)
- put_page(p->page);
-@@ -1524,7 +1523,7 @@ static void do_gro(struct sge_eth_rxq *rxq, const struct pkt_gl *gl,
- return;
- }
-
-- copy_frags(skb, gl, RX_PKT_PAD);
-+ copy_frags(skb_shinfo(skb), gl, RX_PKT_PAD);
- skb->len = gl->tot_len - RX_PKT_PAD;
- skb->data_len = skb->len;
- skb->truesize += skb->data_len;
-@@ -1700,7 +1699,7 @@ static int process_responses(struct sge_rspq *q, int budget)
- rmb();
- rsp_type = RSPD_TYPE(rc->type_gen);
- if (likely(rsp_type == RSP_TYPE_FLBUF)) {
-- struct page_frag *fp;
-+ skb_frag_t *fp;
- struct pkt_gl si;
- const struct rx_sw_desc *rsd;
- u32 len = ntohl(rc->pldbuflen_qid), bufsz, frags;
-@@ -1719,9 +1718,9 @@ static int process_responses(struct sge_rspq *q, int budget)
- rsd = &rxq->fl.sdesc[rxq->fl.cidx];
- bufsz = get_buf_size(rsd);
- fp->page = rsd->page;
-- fp->offset = q->offset;
-- fp->size = min(bufsz, len);
-- len -= fp->size;
-+ fp->page_offset = q->offset;
-+ skb_frag_size_set(fp, min(bufsz, len));
-+ len -= skb_frag_size(fp);
- if (!len)
- break;
- unmap_rx_buf(q->adap, &rxq->fl);
-@@ -1733,16 +1732,16 @@ static int process_responses(struct sge_rspq *q, int budget)
- */
- dma_sync_single_for_cpu(q->adap->pdev_dev,
- get_buf_addr(rsd),
-- fp->size, DMA_FROM_DEVICE);
-+ skb_frag_size(fp), DMA_FROM_DEVICE);
-
- si.va = page_address(si.frags[0].page) +
-- si.frags[0].offset;
-+ si.frags[0].page_offset;
- prefetch(si.va);
-
- si.nfrags = frags + 1;
- ret = q->handler(q, q->cur_desc, &si);
- if (likely(ret == 0))
-- q->offset += ALIGN(fp->size, FL_ALIGN);
-+ q->offset += ALIGN(skb_frag_size(fp), FL_ALIGN);
- else
- restore_rx_bufs(&si, &rxq->fl, frags);
- } else if (likely(rsp_type == RSP_TYPE_CPL)) {
---
-1.7.1
-
+++ /dev/null
-From e861ec83739c5c981a1ae96edb08062f73d52dc4 Mon Sep 17 00:00:00 2001
-From: Vipul Pandya <vipul@chelsio.com>
-Date: Mon, 7 May 2012 14:40:34 +0530
-Subject: [PATCH 2/2] cxgb4: Add build support for kernel 3.1
-
-Signed-off-by: Vipul Pandya <vipul@chelsio.com>
----
- drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c | 8 ++++----
- 1 files changed, 4 insertions(+), 4 deletions(-)
-
-diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
-index 4c8f42a..0b77fec 100644
---- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
-+++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
-@@ -32,6 +32,9 @@
- * SOFTWARE.
- */
-
-+#ifdef pr_fmt
-+#undef pr_fmt
-+#endif
- #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
-
- #include <linux/bitmap.h>
-@@ -41,7 +44,6 @@
- #include <linux/err.h>
- #include <linux/etherdevice.h>
- #include <linux/firmware.h>
--#include <linux/if.h>
- #include <linux/if_vlan.h>
- #include <linux/init.h>
- #include <linux/log2.h>
-@@ -1902,7 +1904,7 @@ static int set_rss_table(struct net_device *dev,
- }
-
- static int get_rxnfc(struct net_device *dev, struct ethtool_rxnfc *info,
-- u32 *rules)
-+ void *rules)
- {
- const struct port_info *pi = netdev_priv(dev);
-
-@@ -3640,8 +3642,6 @@ static int __devinit init_one(struct pci_dev *pdev,
- netdev->features |= netdev->hw_features | highdma;
- netdev->vlan_features = netdev->features & VLAN_FEAT;
-
-- netdev->priv_flags |= IFF_UNICAST_FLT;
--
- netdev->netdev_ops = &cxgb4_netdev_ops;
- SET_ETHTOOL_OPS(netdev, &cxgb_ethtool_ops);
- }
---
-1.7.1
-
+++ /dev/null
-From d6b1c6b1aaca4eaf89e0e0021bafa29af933063e Mon Sep 17 00:00:00 2001
-From: Vipul Pandya <vipul@chelsio.com>
-Date: Mon, 7 May 2012 15:50:15 +0530
-Subject: [PATCH 3/3] cxgb3: Reversing do vlan cleanup
-
-This patch is a reverse patch of the following upstream commit
-892ef5d85259e193505d553c10237fd5dc9a3d0d
-
-Signed-off-by: Vipul Pandya <vipul@chelsio.com>
----
- drivers/net/ethernet/chelsio/cxgb3/adapter.h | 2 +
- drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c | 51 ++++---------------
- drivers/net/ethernet/chelsio/cxgb3/cxgb3_offload.c | 9 ++-
- drivers/net/ethernet/chelsio/cxgb3/sge.c | 35 +++++++++++--
- 4 files changed, 48 insertions(+), 49 deletions(-)
-
-diff --git a/drivers/net/ethernet/chelsio/cxgb3/adapter.h b/drivers/net/ethernet/chelsio/cxgb3/adapter.h
-index 8b395b5..7300de5 100644
---- a/drivers/net/ethernet/chelsio/cxgb3/adapter.h
-+++ b/drivers/net/ethernet/chelsio/cxgb3/adapter.h
-@@ -45,6 +45,7 @@
- #include "t3cdev.h"
- #include <asm/io.h>
-
-+struct vlan_group;
- struct adapter;
- struct sge_qset;
- struct port_info;
-@@ -65,6 +66,7 @@ struct iscsi_config {
-
- struct port_info {
- struct adapter *adapter;
-+ struct vlan_group *vlan_grp;
- struct sge_qset *qs;
- u8 port_id;
- u8 nqsets;
-diff --git a/drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c b/drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c
-index 4d15c8f..d9ee262 100644
---- a/drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c
-+++ b/drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c
-@@ -2531,51 +2531,25 @@ static void t3_synchronize_rx(struct adapter *adap, const struct port_info *p)
- }
- }
-
--static void cxgb_vlan_mode(struct net_device *dev, u32 features)
-+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;
-
-- if (adapter->params.rev > 0) {
-- t3_set_vlan_accel(adapter, 1 << pi->port_id,
-- features & NETIF_F_HW_VLAN_RX);
-- } else {
-+ pi->vlan_grp = grp;
-+ if (adapter->params.rev > 0)
-+ t3_set_vlan_accel(adapter, 1 << pi->port_id, grp != NULL);
-+ else {
- /* single control for all ports */
-- unsigned int i, have_vlans = features & NETIF_F_HW_VLAN_RX;
--
-+ unsigned int i, have_vlans = 0;
- for_each_port(adapter, i)
-- have_vlans |=
-- adapter->port[i]->features & NETIF_F_HW_VLAN_RX;
-+ have_vlans |= adap2pinfo(adapter, i)->vlan_grp != NULL;
-
- t3_set_vlan_accel(adapter, 1, have_vlans);
- }
- t3_synchronize_rx(adapter, pi);
- }
-
--static u32 cxgb_fix_features(struct net_device *dev, u32 features)
--{
-- /*
-- * Since there is no support for separate rx/tx vlan accel
-- * enable/disable make sure tx flag is always in same state as rx.
-- */
-- if (features & NETIF_F_HW_VLAN_RX)
-- features |= NETIF_F_HW_VLAN_TX;
-- else
-- features &= ~NETIF_F_HW_VLAN_TX;
--
-- return features;
--}
--
--static int cxgb_set_features(struct net_device *dev, u32 features)
--{
-- u32 changed = dev->features ^ features;
--
-- if (changed & NETIF_F_HW_VLAN_RX)
-- cxgb_vlan_mode(dev, features);
--
-- return 0;
--}
--
- #ifdef CONFIG_NET_POLL_CONTROLLER
- static void cxgb_netpoll(struct net_device *dev)
- {
-@@ -3156,8 +3130,7 @@ static const struct net_device_ops cxgb_netdev_ops = {
- .ndo_do_ioctl = cxgb_ioctl,
- .ndo_change_mtu = cxgb_change_mtu,
- .ndo_set_mac_address = cxgb_set_mac_addr,
-- .ndo_fix_features = cxgb_fix_features,
-- .ndo_set_features = cxgb_set_features,
-+ .ndo_vlan_rx_register = vlan_rx_register,
- #ifdef CONFIG_NET_POLL_CONTROLLER
- .ndo_poll_controller = cxgb_netpoll,
- #endif
-@@ -3289,8 +3262,9 @@ static int __devinit init_one(struct pci_dev *pdev,
- netdev->mem_start = mmio_start;
- netdev->mem_end = mmio_start + mmio_len - 1;
- netdev->hw_features = NETIF_F_SG | NETIF_F_IP_CSUM |
-- NETIF_F_TSO | NETIF_F_RXCSUM | NETIF_F_HW_VLAN_RX;
-- netdev->features |= netdev->hw_features | NETIF_F_HW_VLAN_TX;
-+ NETIF_F_TSO | NETIF_F_RXCSUM;
-+ netdev->features |= netdev->hw_features |
-+ NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
- if (pci_using_dac)
- netdev->features |= NETIF_F_HIGHDMA;
-
-@@ -3354,9 +3328,6 @@ static int __devinit init_one(struct pci_dev *pdev,
- err = sysfs_create_group(&adapter->port[0]->dev.kobj,
- &cxgb3_attr_group);
-
-- for_each_port(adapter, i)
-- cxgb_vlan_mode(adapter->port[i], adapter->port[i]->features);
--
- print_port_info(adapter, ai);
- return 0;
-
-diff --git a/drivers/net/ethernet/chelsio/cxgb3/cxgb3_offload.c b/drivers/net/ethernet/chelsio/cxgb3/cxgb3_offload.c
-index 90ff131..d7cd560 100644
---- a/drivers/net/ethernet/chelsio/cxgb3/cxgb3_offload.c
-+++ b/drivers/net/ethernet/chelsio/cxgb3/cxgb3_offload.c
-@@ -177,13 +177,16 @@ static struct net_device *get_iff_from_mac(struct adapter *adapter,
- int i;
-
- for_each_port(adapter, i) {
-+ struct vlan_group *grp;
- struct net_device *dev = adapter->port[i];
-+ const struct port_info *p = netdev_priv(dev);
-
- if (!memcmp(dev->dev_addr, mac, ETH_ALEN)) {
- if (vlan && vlan != VLAN_VID_MASK) {
-- rcu_read_lock();
-- dev = __vlan_find_dev_deep(dev, vlan);
-- rcu_read_unlock();
-+ grp = p->vlan_grp;
-+ dev = NULL;
-+ if (grp)
-+ dev = vlan_group_get_device(grp, vlan);
- } else if (netif_is_bond_slave(dev)) {
- while (dev->master)
- dev = dev->master;
-diff --git a/drivers/net/ethernet/chelsio/cxgb3/sge.c b/drivers/net/ethernet/chelsio/cxgb3/sge.c
-index cfb60e1..a73523e 100644
---- a/drivers/net/ethernet/chelsio/cxgb3/sge.c
-+++ b/drivers/net/ethernet/chelsio/cxgb3/sge.c
-@@ -2028,11 +2028,28 @@ static void rx_eth(struct adapter *adap, struct sge_rspq *rq,
- skb_checksum_none_assert(skb);
- skb_record_rx_queue(skb, qs - &adap->sge.qs[pi->first_qset]);
-
-- if (p->vlan_valid) {
-+ if (unlikely(p->vlan_valid)) {
-+ struct vlan_group *grp = pi->vlan_grp;
-+
- qs->port_stats[SGE_PSTAT_VLANEX]++;
-- __vlan_hwaccel_put_tag(skb, ntohs(p->vlan));
-- }
-- if (rq->polling) {
-+ if (likely(grp))
-+ if (lro)
-+ vlan_gro_receive(&qs->napi, grp,
-+ ntohs(p->vlan), skb);
-+ else {
-+ if (unlikely(pi->iscsic.flags)) {
-+ unsigned short vtag = ntohs(p->vlan) &
-+ VLAN_VID_MASK;
-+ skb->dev = vlan_group_get_device(grp,
-+ vtag);
-+ cxgb3_process_iscsi_prov_pack(pi, skb);
-+ }
-+ __vlan_hwaccel_rx(skb, grp, ntohs(p->vlan),
-+ rq->polling);
-+ }
-+ else
-+ dev_kfree_skb_any(skb);
-+ } else if (rq->polling) {
- if (lro)
- napi_gro_receive(&qs->napi, skb);
- else {
-@@ -2130,8 +2147,14 @@ static void lro_add_page(struct adapter *adap, struct sge_qset *qs,
-
- skb_record_rx_queue(skb, qs - &adap->sge.qs[pi->first_qset]);
-
-- if (cpl->vlan_valid)
-- __vlan_hwaccel_put_tag(skb, ntohs(cpl->vlan));
-+ if (unlikely(cpl->vlan_valid)) {
-+ struct vlan_group *grp = pi->vlan_grp;
-+
-+ if (likely(grp != NULL)) {
-+ vlan_gro_frags(&qs->napi, grp, ntohs(cpl->vlan));
-+ return;
-+ }
-+ }
- napi_gro_frags(&qs->napi);
- }
-
---
-1.7.1
-
+++ /dev/null
-diff -rup a/drivers/infiniband/core/Makefile b/drivers/infiniband/core/Makefile
---- a/drivers/infiniband/core/Makefile 2012-05-18 13:16:13.000000000 -0400
-+++ b/drivers/infiniband/core/Makefile 2012-05-18 13:17:57.000000000 -0400
-@@ -30,3 +30,6 @@ ib_umad-y := user_mad.o
- ib_ucm-y := ucm.o
-
- ib_uverbs-y := uverbs_main.o uverbs_cmd.o uverbs_marshall.o
-+
-+# sles11sp2 specific
-+CFLAGS_netlink.o += -DNEED_MIN_DUMP_ALLOC_ARG
+++ /dev/null
-From 8c4674b2176db67f3a059d9dfb22377caff3a3be Mon Sep 17 00:00:00 2001
-From: Vipul Pandya <vipul@chelsio.com>
-Date: Wed, 30 May 2012 17:26:47 +0530
-Subject: [PATCH] cxgb4: remove netdev_alloc_page and use __GFP_COLD
-
-This patch is created from following upstream commit
-1f2149c1df50c8c712950872675f46e6e44629f0
-
-Signed-off-by: Vipul Pandya <vipul@chelsio.com>
----
- drivers/net/ethernet/chelsio/cxgb4/sge.c | 6 +++---
- 1 files changed, 3 insertions(+), 3 deletions(-)
-
-diff --git a/drivers/net/ethernet/chelsio/cxgb4/sge.c b/drivers/net/ethernet/chelsio/cxgb4/sge.c
-index c5e99fb..6a554a7 100644
---- a/drivers/net/ethernet/chelsio/cxgb4/sge.c
-+++ b/drivers/net/ethernet/chelsio/cxgb4/sge.c
-@@ -491,7 +491,7 @@ static unsigned int refill_fl(struct adapter *adap, struct sge_fl *q, int n,
- __be64 *d = &q->desc[q->pidx];
- struct rx_sw_desc *sd = &q->sdesc[q->pidx];
-
-- gfp |= __GFP_NOWARN; /* failures are expected */
-+ gfp |= __GFP_NOWARN | __GFP_COLD; /* failures are expected */
-
- #if FL_PG_ORDER > 0
- /*
-@@ -528,7 +528,7 @@ static unsigned int refill_fl(struct adapter *adap, struct sge_fl *q, int n,
- #endif
-
- while (n--) {
-- pg = __netdev_alloc_page(adap->port[0], gfp);
-+ pg = alloc_page(gfp);
- if (unlikely(!pg)) {
- q->alloc_failed++;
- break;
-@@ -537,7 +537,7 @@ static unsigned int refill_fl(struct adapter *adap, struct sge_fl *q, int n,
- mapping = dma_map_page(adap->pdev_dev, pg, 0, PAGE_SIZE,
- PCI_DMA_FROMDEVICE);
- if (unlikely(dma_mapping_error(adap->pdev_dev, mapping))) {
-- netdev_free_page(adap->port[0], pg);
-+ put_page(pg);
- goto out;
- }
- *d++ = cpu_to_be64(mapping);
---
-1.7.7
-
+++ /dev/null
-Index: compat-rdma/drivers/infiniband/core/umem.c
-===================================================================
---- compat-rdma.orig/drivers/infiniband/core/umem.c
-+++ compat-rdma/drivers/infiniband/core/umem.c
-@@ -137,7 +137,7 @@ struct ib_umem *ib_umem_get(struct ib_uc
-
- down_write(¤t->mm->mmap_sem);
-
-- locked = npages + current->mm->pinned_vm;
-+ locked = npages + current->mm->locked_vm;
- lock_limit = rlimit(RLIMIT_MEMLOCK) >> PAGE_SHIFT;
-
- if ((locked > lock_limit) && !capable(CAP_IPC_LOCK)) {
-@@ -207,7 +207,7 @@ out:
- __ib_umem_release(context->device, umem, 0);
- kfree(umem);
- } else
-- current->mm->pinned_vm = locked;
-+ current->mm->locked_vm = locked;
-
- up_write(¤t->mm->mmap_sem);
- if (vma_list)
-@@ -223,7 +223,7 @@ static void ib_umem_account(struct work_
- struct ib_umem *umem = container_of(work, struct ib_umem, work);
-
- down_write(&umem->mm->mmap_sem);
-- umem->mm->pinned_vm -= umem->diff;
-+ umem->mm->locked_vm -= umem->diff;
- up_write(&umem->mm->mmap_sem);
- mmput(umem->mm);
- kfree(umem);
-Index: compat-rdma/drivers/infiniband/hw/ipath/ipath_user_pages.c
-===================================================================
---- compat-rdma.orig/drivers/infiniband/hw/ipath/ipath_user_pages.c
-+++ compat-rdma/drivers/infiniband/hw/ipath/ipath_user_pages.c
-@@ -79,7 +79,7 @@ static int __ipath_get_user_pages(unsign
- goto bail_release;
- }
-
-- current->mm->pinned_vm += num_pages;
-+ current->mm->locked_vm += num_pages;
-
- ret = 0;
- goto bail;
-@@ -178,7 +178,7 @@ void ipath_release_user_pages(struct pag
-
- __ipath_release_user_pages(p, num_pages, 1);
-
-- current->mm->pinned_vm -= num_pages;
-+ current->mm->locked_vm -= num_pages;
-
- up_write(¤t->mm->mmap_sem);
- }
-@@ -195,7 +195,7 @@ static void user_pages_account(struct wo
- container_of(_work, struct ipath_user_pages_work, work);
-
- down_write(&work->mm->mmap_sem);
-- work->mm->pinned_vm -= work->num_pages;
-+ work->mm->locked_vm -= work->num_pages;
- up_write(&work->mm->mmap_sem);
- mmput(work->mm);
- kfree(work);
-Index: compat-rdma/drivers/infiniband/hw/qib/qib_user_pages.c
-===================================================================
---- compat-rdma.orig/drivers/infiniband/hw/qib/qib_user_pages.c
-+++ compat-rdma/drivers/infiniband/hw/qib/qib_user_pages.c
-@@ -74,7 +74,7 @@ static int __qib_get_user_pages(unsigned
- goto bail_release;
- }
-
-- current->mm->pinned_vm += num_pages;
-+ current->mm->locked_vm += num_pages;
-
- ret = 0;
- goto bail;
-@@ -151,7 +151,7 @@ void qib_release_user_pages(struct page
- __qib_release_user_pages(p, num_pages, 1);
-
- if (current->mm) {
-- current->mm->pinned_vm -= num_pages;
-+ current->mm->locked_vm -= num_pages;
- up_write(¤t->mm->mmap_sem);
- }
- }
+++ /dev/null
-Index: compat-rdma/drivers/net/ethernet/mellanox/mlx4/en_rx.c
-===================================================================
---- compat-rdma.orig/drivers/net/ethernet/mellanox/mlx4/en_rx.c 2012-01-09 16:15:04.000000000 +0200
-+++ compat-rdma/drivers/net/ethernet/mellanox/mlx4/en_rx.c 2012-01-23 11:52:39.899175000 +0200
-@@ -44,7 +44,7 @@
-
- static int mlx4_en_alloc_frag(struct mlx4_en_priv *priv,
- struct mlx4_en_rx_desc *rx_desc,
-- struct page_frag *skb_frags,
-+ struct skb_frag_struct *skb_frags,
- struct mlx4_en_rx_alloc *ring_alloc,
- int i)
- {
-@@ -61,7 +61,7 @@ static int mlx4_en_alloc_frag(struct mlx
- return -ENOMEM;
-
- skb_frags[i].page = page_alloc->page;
-- skb_frags[i].offset = page_alloc->offset;
-+ skb_frags[i].page_offset = page_alloc->offset;
- page_alloc->page = page;
- page_alloc->offset = frag_info->frag_align;
- } else {
-@@ -69,11 +69,11 @@ static int mlx4_en_alloc_frag(struct mlx
- get_page(page);
-
- skb_frags[i].page = page;
-- skb_frags[i].offset = page_alloc->offset;
-+ skb_frags[i].page_offset = page_alloc->offset;
- page_alloc->offset += frag_info->frag_stride;
- }
- dma = pci_map_single(mdev->pdev, page_address(skb_frags[i].page) +
-- skb_frags[i].offset, frag_info->frag_size,
-+ skb_frags[i].page_offset, frag_info->frag_size,
- PCI_DMA_FROMDEVICE);
- rx_desc->data[i].addr = cpu_to_be64(dma);
- return 0;
-@@ -157,8 +157,8 @@ static int mlx4_en_prepare_rx_desc(struc
- struct mlx4_en_rx_ring *ring, int index)
- {
- struct mlx4_en_rx_desc *rx_desc = ring->buf + (index * ring->stride);
-- struct page_frag *skb_frags = ring->rx_info +
-- (index << priv->log_rx_info);
-+ struct skb_frag_struct *skb_frags = ring->rx_info +
-+ (index << priv->log_rx_info);
- int i;
-
- for (i = 0; i < priv->num_frags; i++)
-@@ -183,7 +183,7 @@ static void mlx4_en_free_rx_desc(struct
- int index)
- {
- struct mlx4_en_dev *mdev = priv->mdev;
-- struct page_frag *skb_frags;
-+ struct skb_frag_struct *skb_frags;
- struct mlx4_en_rx_desc *rx_desc = ring->buf + (index << ring->log_stride);
- dma_addr_t dma;
- int nr;
-@@ -194,7 +194,7 @@ static void mlx4_en_free_rx_desc(struct
- dma = be64_to_cpu(rx_desc->data[nr].addr);
-
- en_dbg(DRV, priv, "Unmapping buffer at dma:0x%llx\n", (u64) dma);
-- pci_unmap_single(mdev->pdev, dma, skb_frags[nr].size,
-+ pci_unmap_single(mdev->pdev, dma, skb_frag_size(&skb_frags[nr]),
- PCI_DMA_FROMDEVICE);
- put_page(skb_frags[nr].page);
- }
-@@ -403,7 +403,7 @@ void mlx4_en_deactivate_rx_ring(struct m
- /* Unmap a completed descriptor and free unused pages */
- static int mlx4_en_complete_rx_desc(struct mlx4_en_priv *priv,
- struct mlx4_en_rx_desc *rx_desc,
-- struct page_frag *skb_frags,
-+ struct skb_frag_struct *skb_frags,
- struct sk_buff *skb,
- struct mlx4_en_rx_alloc *page_alloc,
- int length)
-@@ -421,9 +421,9 @@ static int mlx4_en_complete_rx_desc(stru
- break;
-
- /* Save page reference in skb */
-- __skb_frag_set_page(&skb_frags_rx[nr], skb_frags[nr].page);
-- skb_frag_size_set(&skb_frags_rx[nr], skb_frags[nr].size);
-- skb_frags_rx[nr].page_offset = skb_frags[nr].offset;
-+ skb_frags_rx[nr].page = skb_frags[nr].page;
-+ skb_frag_size_set(&skb_frags_rx[nr], skb_frag_size(&skb_frags[nr]));
-+ skb_frags_rx[nr].page_offset = skb_frags[nr].page_offset;
- skb->truesize += frag_info->frag_stride;
- dma = be64_to_cpu(rx_desc->data[nr].addr);
-
-@@ -446,7 +446,7 @@ fail:
- * the descriptor) of this packet; remaining fragments are reused... */
- while (nr > 0) {
- nr--;
-- __skb_frag_unref(&skb_frags_rx[nr]);
-+ put_page(skb_frags_rx[nr].page);
- }
- return 0;
- }
-@@ -454,7 +454,7 @@ fail:
-
- static struct sk_buff *mlx4_en_rx_skb(struct mlx4_en_priv *priv,
- struct mlx4_en_rx_desc *rx_desc,
-- struct page_frag *skb_frags,
-+ struct skb_frag_struct *skb_frags,
- struct mlx4_en_rx_alloc *page_alloc,
- unsigned int length)
- {
-@@ -475,7 +475,7 @@ static struct sk_buff *mlx4_en_rx_skb(st
-
- /* Get pointer to first fragment so we could copy the headers into the
- * (linear part of the) skb */
-- va = page_address(skb_frags[0].page) + skb_frags[0].offset;
-+ va = page_address(skb_frags[0].page) + skb_frags[0].page_offset;
-
- if (length <= SMALL_PACKET_SIZE) {
- /* We are copying all relevant data to the skb - temporarily
-@@ -533,7 +533,7 @@ int mlx4_en_process_rx_cq(struct net_dev
- struct mlx4_en_priv *priv = netdev_priv(dev);
- struct mlx4_cqe *cqe;
- struct mlx4_en_rx_ring *ring = &priv->rx_ring[cq->ring];
-- struct page_frag *skb_frags;
-+ struct skb_frag_struct *skb_frags;
- struct mlx4_en_rx_desc *rx_desc;
- struct sk_buff *skb;
- int index;
+++ /dev/null
-Index: compat-rdma/drivers/infiniband/ulp/iser/iscsi_iser.c
-===================================================================
---- compat-rdma.orig/drivers/infiniband/ulp/iser/iscsi_iser.c
-+++ compat-rdma/drivers/infiniband/ulp/iser/iscsi_iser.c
-@@ -719,7 +719,9 @@ static struct iscsi_transport iscsi_iser
- .create_conn = iscsi_iser_conn_create,
- .bind_conn = iscsi_iser_conn_bind,
- .destroy_conn = iscsi_iser_conn_destroy,
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(3,2,0))
- .attr_is_visible = iser_attr_is_visible,
-+#endif
- .set_param = iscsi_iser_set_param,
- .get_conn_param = iscsi_conn_get_param,
- .get_ep_param = iscsi_iser_get_ep_param,
+++ /dev/null
-From 5ea32823a4937cd918a823bd0dfbbb592e8b9e6e Mon Sep 17 00:00:00 2001
-From: Vipul Pandya <vipul@chelsio.com>
-Date: Mon, 7 May 2012 14:17:55 +0530
-Subject: [PATCH 1/2] cxgb4: Reversing convert to SKB paged frag API.
-
-This patch is a reverse patch of upstream commit
-e91b0f2491f7a7b21c4e562df09f3dbe551f0fe2
-
-Signed-off-by: Vipul Pandya <vipul@chelsio.com>
----
- drivers/net/ethernet/chelsio/cxgb4/cxgb4.h | 2 +-
- drivers/net/ethernet/chelsio/cxgb4/sge.c | 45 +++++++++++++--------------
- 2 files changed, 23 insertions(+), 24 deletions(-)
-
-diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h b/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h
-index 0fe1885..223a7f7 100644
---- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h
-+++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h
-@@ -326,7 +326,7 @@ struct sge_fl { /* SGE free-buffer queue state */
-
- /* A packet gather list */
- struct pkt_gl {
-- struct page_frag frags[MAX_SKB_FRAGS];
-+ skb_frag_t frags[MAX_SKB_FRAGS];
- void *va; /* virtual address of first byte */
- unsigned int nfrags; /* # of fragments */
- unsigned int tot_len; /* total length of fragments */
-diff --git a/drivers/net/ethernet/chelsio/cxgb4/sge.c b/drivers/net/ethernet/chelsio/cxgb4/sge.c
-index 140254c..c5e99fb 100644
---- a/drivers/net/ethernet/chelsio/cxgb4/sge.c
-+++ b/drivers/net/ethernet/chelsio/cxgb4/sge.c
-@@ -216,8 +216,8 @@ static int map_skb(struct device *dev, const struct sk_buff *skb,
- end = &si->frags[si->nr_frags];
-
- for (fp = si->frags; fp < end; fp++) {
-- *++addr = skb_frag_dma_map(dev, fp, 0, skb_frag_size(fp),
-- DMA_TO_DEVICE);
-+ *++addr = dma_map_page(dev, fp->page, fp->page_offset,
-+ skb_frag_size(fp), DMA_TO_DEVICE);
- if (dma_mapping_error(dev, *addr))
- goto unwind;
- }
-@@ -1410,23 +1410,22 @@ int cxgb4_ofld_send(struct net_device *dev, struct sk_buff *skb)
- }
- EXPORT_SYMBOL(cxgb4_ofld_send);
-
--static inline void copy_frags(struct sk_buff *skb,
-+static inline void copy_frags(struct skb_shared_info *ssi,
- const struct pkt_gl *gl, unsigned int offset)
- {
-- int i;
-+ unsigned int n;
-
- /* usually there's just one frag */
-- __skb_fill_page_desc(skb, 0, gl->frags[0].page,
-- gl->frags[0].offset + offset,
-- gl->frags[0].size - offset);
-- skb_shinfo(skb)->nr_frags = gl->nfrags;
-- for (i = 1; i < gl->nfrags; i++)
-- __skb_fill_page_desc(skb, i, gl->frags[i].page,
-- gl->frags[i].offset,
-- gl->frags[i].size);
-+ ssi->frags[0].page = gl->frags[0].page;
-+ ssi->frags[0].page_offset = gl->frags[0].page_offset + offset;
-+ skb_frag_size_set(&ssi->frags[0], skb_frag_size(&gl->frags[0]) - offset);
-+ ssi->nr_frags = gl->nfrags;
-+ n = gl->nfrags - 1;
-+ if (n)
-+ memcpy(&ssi->frags[1], &gl->frags[1], n * sizeof(skb_frag_t));
-
- /* get a reference to the last page, we don't own it */
-- get_page(gl->frags[gl->nfrags - 1].page);
-+ get_page(gl->frags[n].page);
- }
-
- /**
-@@ -1461,7 +1460,7 @@ struct sk_buff *cxgb4_pktgl_to_skb(const struct pkt_gl *gl,
- __skb_put(skb, pull_len);
- skb_copy_to_linear_data(skb, gl->va, pull_len);
-
-- copy_frags(skb, gl, pull_len);
-+ copy_frags(skb_shinfo(skb), gl, pull_len);
- skb->len = gl->tot_len;
- skb->data_len = skb->len - pull_len;
- skb->truesize += skb->data_len;
-@@ -1480,7 +1479,7 @@ EXPORT_SYMBOL(cxgb4_pktgl_to_skb);
- static void t4_pktgl_free(const struct pkt_gl *gl)
- {
- int n;
-- const struct page_frag *p;
-+ const skb_frag_t *p;
-
- for (p = gl->frags, n = gl->nfrags - 1; n--; p++)
- put_page(p->page);
-@@ -1524,7 +1523,7 @@ static void do_gro(struct sge_eth_rxq *rxq, const struct pkt_gl *gl,
- return;
- }
-
-- copy_frags(skb, gl, RX_PKT_PAD);
-+ copy_frags(skb_shinfo(skb), gl, RX_PKT_PAD);
- skb->len = gl->tot_len - RX_PKT_PAD;
- skb->data_len = skb->len;
- skb->truesize += skb->data_len;
-@@ -1700,7 +1699,7 @@ static int process_responses(struct sge_rspq *q, int budget)
- rmb();
- rsp_type = RSPD_TYPE(rc->type_gen);
- if (likely(rsp_type == RSP_TYPE_FLBUF)) {
-- struct page_frag *fp;
-+ skb_frag_t *fp;
- struct pkt_gl si;
- const struct rx_sw_desc *rsd;
- u32 len = ntohl(rc->pldbuflen_qid), bufsz, frags;
-@@ -1719,9 +1718,9 @@ static int process_responses(struct sge_rspq *q, int budget)
- rsd = &rxq->fl.sdesc[rxq->fl.cidx];
- bufsz = get_buf_size(rsd);
- fp->page = rsd->page;
-- fp->offset = q->offset;
-- fp->size = min(bufsz, len);
-- len -= fp->size;
-+ fp->page_offset = q->offset;
-+ skb_frag_size_set(fp, min(bufsz, len));
-+ len -= skb_frag_size(fp);
- if (!len)
- break;
- unmap_rx_buf(q->adap, &rxq->fl);
-@@ -1733,16 +1732,16 @@ static int process_responses(struct sge_rspq *q, int budget)
- */
- dma_sync_single_for_cpu(q->adap->pdev_dev,
- get_buf_addr(rsd),
-- fp->size, DMA_FROM_DEVICE);
-+ skb_frag_size(fp), DMA_FROM_DEVICE);
-
- si.va = page_address(si.frags[0].page) +
-- si.frags[0].offset;
-+ si.frags[0].page_offset;
- prefetch(si.va);
-
- si.nfrags = frags + 1;
- ret = q->handler(q, q->cur_desc, &si);
- if (likely(ret == 0))
-- q->offset += ALIGN(fp->size, FL_ALIGN);
-+ q->offset += ALIGN(skb_frag_size(fp), FL_ALIGN);
- else
- restore_rx_bufs(&si, &rxq->fl, frags);
- } else if (likely(rsp_type == RSP_TYPE_CPL)) {
---
-1.7.1
-
+++ /dev/null
-From e861ec83739c5c981a1ae96edb08062f73d52dc4 Mon Sep 17 00:00:00 2001
-From: Vipul Pandya <vipul@chelsio.com>
-Date: Mon, 7 May 2012 14:40:34 +0530
-Subject: [PATCH 2/2] cxgb4: Add build support for kernel 3.1
-
-Signed-off-by: Vipul Pandya <vipul@chelsio.com>
----
- drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c | 8 ++++----
- 1 files changed, 4 insertions(+), 4 deletions(-)
-
-diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
-index 4c8f42a..0b77fec 100644
---- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
-+++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
-@@ -32,6 +32,9 @@
- * SOFTWARE.
- */
-
-+#ifdef pr_fmt
-+#undef pr_fmt
-+#endif
- #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
-
- #include <linux/bitmap.h>
-@@ -41,7 +44,6 @@
- #include <linux/err.h>
- #include <linux/etherdevice.h>
- #include <linux/firmware.h>
--#include <linux/if.h>
- #include <linux/if_vlan.h>
- #include <linux/init.h>
- #include <linux/log2.h>
-@@ -1902,7 +1904,7 @@ static int set_rss_table(struct net_device *dev,
- }
-
- static int get_rxnfc(struct net_device *dev, struct ethtool_rxnfc *info,
-- u32 *rules)
-+ void *rules)
- {
- const struct port_info *pi = netdev_priv(dev);
-
-@@ -3640,8 +3642,6 @@ static int __devinit init_one(struct pci_dev *pdev,
- netdev->features |= netdev->hw_features | highdma;
- netdev->vlan_features = netdev->features & VLAN_FEAT;
-
-- netdev->priv_flags |= IFF_UNICAST_FLT;
--
- netdev->netdev_ops = &cxgb4_netdev_ops;
- SET_ETHTOOL_OPS(netdev, &cxgb_ethtool_ops);
- }
---
-1.7.1
-
+++ /dev/null
-From d6b1c6b1aaca4eaf89e0e0021bafa29af933063e Mon Sep 17 00:00:00 2001
-From: Vipul Pandya <vipul@chelsio.com>
-Date: Mon, 7 May 2012 15:50:15 +0530
-Subject: [PATCH 3/3] cxgb3: Reversing do vlan cleanup
-
-This patch is a reverse patch of the following upstream commit
-892ef5d85259e193505d553c10237fd5dc9a3d0d
-
-Signed-off-by: Vipul Pandya <vipul@chelsio.com>
----
- drivers/net/ethernet/chelsio/cxgb3/adapter.h | 2 +
- drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c | 51 ++++---------------
- drivers/net/ethernet/chelsio/cxgb3/cxgb3_offload.c | 9 ++-
- drivers/net/ethernet/chelsio/cxgb3/sge.c | 35 +++++++++++--
- 4 files changed, 48 insertions(+), 49 deletions(-)
-
-diff --git a/drivers/net/ethernet/chelsio/cxgb3/adapter.h b/drivers/net/ethernet/chelsio/cxgb3/adapter.h
-index 8b395b5..7300de5 100644
---- a/drivers/net/ethernet/chelsio/cxgb3/adapter.h
-+++ b/drivers/net/ethernet/chelsio/cxgb3/adapter.h
-@@ -45,6 +45,7 @@
- #include "t3cdev.h"
- #include <asm/io.h>
-
-+struct vlan_group;
- struct adapter;
- struct sge_qset;
- struct port_info;
-@@ -65,6 +66,7 @@ struct iscsi_config {
-
- struct port_info {
- struct adapter *adapter;
-+ struct vlan_group *vlan_grp;
- struct sge_qset *qs;
- u8 port_id;
- u8 nqsets;
-diff --git a/drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c b/drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c
-index 4d15c8f..d9ee262 100644
---- a/drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c
-+++ b/drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c
-@@ -2531,51 +2531,25 @@ static void t3_synchronize_rx(struct adapter *adap, const struct port_info *p)
- }
- }
-
--static void cxgb_vlan_mode(struct net_device *dev, u32 features)
-+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;
-
-- if (adapter->params.rev > 0) {
-- t3_set_vlan_accel(adapter, 1 << pi->port_id,
-- features & NETIF_F_HW_VLAN_RX);
-- } else {
-+ pi->vlan_grp = grp;
-+ if (adapter->params.rev > 0)
-+ t3_set_vlan_accel(adapter, 1 << pi->port_id, grp != NULL);
-+ else {
- /* single control for all ports */
-- unsigned int i, have_vlans = features & NETIF_F_HW_VLAN_RX;
--
-+ unsigned int i, have_vlans = 0;
- for_each_port(adapter, i)
-- have_vlans |=
-- adapter->port[i]->features & NETIF_F_HW_VLAN_RX;
-+ have_vlans |= adap2pinfo(adapter, i)->vlan_grp != NULL;
-
- t3_set_vlan_accel(adapter, 1, have_vlans);
- }
- t3_synchronize_rx(adapter, pi);
- }
-
--static u32 cxgb_fix_features(struct net_device *dev, u32 features)
--{
-- /*
-- * Since there is no support for separate rx/tx vlan accel
-- * enable/disable make sure tx flag is always in same state as rx.
-- */
-- if (features & NETIF_F_HW_VLAN_RX)
-- features |= NETIF_F_HW_VLAN_TX;
-- else
-- features &= ~NETIF_F_HW_VLAN_TX;
--
-- return features;
--}
--
--static int cxgb_set_features(struct net_device *dev, u32 features)
--{
-- u32 changed = dev->features ^ features;
--
-- if (changed & NETIF_F_HW_VLAN_RX)
-- cxgb_vlan_mode(dev, features);
--
-- return 0;
--}
--
- #ifdef CONFIG_NET_POLL_CONTROLLER
- static void cxgb_netpoll(struct net_device *dev)
- {
-@@ -3156,8 +3130,7 @@ static const struct net_device_ops cxgb_netdev_ops = {
- .ndo_do_ioctl = cxgb_ioctl,
- .ndo_change_mtu = cxgb_change_mtu,
- .ndo_set_mac_address = cxgb_set_mac_addr,
-- .ndo_fix_features = cxgb_fix_features,
-- .ndo_set_features = cxgb_set_features,
-+ .ndo_vlan_rx_register = vlan_rx_register,
- #ifdef CONFIG_NET_POLL_CONTROLLER
- .ndo_poll_controller = cxgb_netpoll,
- #endif
-@@ -3289,8 +3262,9 @@ static int __devinit init_one(struct pci_dev *pdev,
- netdev->mem_start = mmio_start;
- netdev->mem_end = mmio_start + mmio_len - 1;
- netdev->hw_features = NETIF_F_SG | NETIF_F_IP_CSUM |
-- NETIF_F_TSO | NETIF_F_RXCSUM | NETIF_F_HW_VLAN_RX;
-- netdev->features |= netdev->hw_features | NETIF_F_HW_VLAN_TX;
-+ NETIF_F_TSO | NETIF_F_RXCSUM;
-+ netdev->features |= netdev->hw_features |
-+ NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
- if (pci_using_dac)
- netdev->features |= NETIF_F_HIGHDMA;
-
-@@ -3354,9 +3328,6 @@ static int __devinit init_one(struct pci_dev *pdev,
- err = sysfs_create_group(&adapter->port[0]->dev.kobj,
- &cxgb3_attr_group);
-
-- for_each_port(adapter, i)
-- cxgb_vlan_mode(adapter->port[i], adapter->port[i]->features);
--
- print_port_info(adapter, ai);
- return 0;
-
-diff --git a/drivers/net/ethernet/chelsio/cxgb3/cxgb3_offload.c b/drivers/net/ethernet/chelsio/cxgb3/cxgb3_offload.c
-index 90ff131..d7cd560 100644
---- a/drivers/net/ethernet/chelsio/cxgb3/cxgb3_offload.c
-+++ b/drivers/net/ethernet/chelsio/cxgb3/cxgb3_offload.c
-@@ -177,13 +177,16 @@ static struct net_device *get_iff_from_mac(struct adapter *adapter,
- int i;
-
- for_each_port(adapter, i) {
-+ struct vlan_group *grp;
- struct net_device *dev = adapter->port[i];
-+ const struct port_info *p = netdev_priv(dev);
-
- if (!memcmp(dev->dev_addr, mac, ETH_ALEN)) {
- if (vlan && vlan != VLAN_VID_MASK) {
-- rcu_read_lock();
-- dev = __vlan_find_dev_deep(dev, vlan);
-- rcu_read_unlock();
-+ grp = p->vlan_grp;
-+ dev = NULL;
-+ if (grp)
-+ dev = vlan_group_get_device(grp, vlan);
- } else if (netif_is_bond_slave(dev)) {
- while (dev->master)
- dev = dev->master;
-diff --git a/drivers/net/ethernet/chelsio/cxgb3/sge.c b/drivers/net/ethernet/chelsio/cxgb3/sge.c
-index cfb60e1..a73523e 100644
---- a/drivers/net/ethernet/chelsio/cxgb3/sge.c
-+++ b/drivers/net/ethernet/chelsio/cxgb3/sge.c
-@@ -2028,11 +2028,28 @@ static void rx_eth(struct adapter *adap, struct sge_rspq *rq,
- skb_checksum_none_assert(skb);
- skb_record_rx_queue(skb, qs - &adap->sge.qs[pi->first_qset]);
-
-- if (p->vlan_valid) {
-+ if (unlikely(p->vlan_valid)) {
-+ struct vlan_group *grp = pi->vlan_grp;
-+
- qs->port_stats[SGE_PSTAT_VLANEX]++;
-- __vlan_hwaccel_put_tag(skb, ntohs(p->vlan));
-- }
-- if (rq->polling) {
-+ if (likely(grp))
-+ if (lro)
-+ vlan_gro_receive(&qs->napi, grp,
-+ ntohs(p->vlan), skb);
-+ else {
-+ if (unlikely(pi->iscsic.flags)) {
-+ unsigned short vtag = ntohs(p->vlan) &
-+ VLAN_VID_MASK;
-+ skb->dev = vlan_group_get_device(grp,
-+ vtag);
-+ cxgb3_process_iscsi_prov_pack(pi, skb);
-+ }
-+ __vlan_hwaccel_rx(skb, grp, ntohs(p->vlan),
-+ rq->polling);
-+ }
-+ else
-+ dev_kfree_skb_any(skb);
-+ } else if (rq->polling) {
- if (lro)
- napi_gro_receive(&qs->napi, skb);
- else {
-@@ -2130,8 +2147,14 @@ static void lro_add_page(struct adapter *adap, struct sge_qset *qs,
-
- skb_record_rx_queue(skb, qs - &adap->sge.qs[pi->first_qset]);
-
-- if (cpl->vlan_valid)
-- __vlan_hwaccel_put_tag(skb, ntohs(cpl->vlan));
-+ if (unlikely(cpl->vlan_valid)) {
-+ struct vlan_group *grp = pi->vlan_grp;
-+
-+ if (likely(grp != NULL)) {
-+ vlan_gro_frags(&qs->napi, grp, ntohs(cpl->vlan));
-+ return;
-+ }
-+ }
- napi_gro_frags(&qs->napi);
- }
-
---
-1.7.1
-
+++ /dev/null
-Index: compat-rdma/drivers/infiniband/core/umem.c
-===================================================================
---- compat-rdma.orig/drivers/infiniband/core/umem.c
-+++ compat-rdma/drivers/infiniband/core/umem.c
-@@ -137,7 +137,7 @@ struct ib_umem *ib_umem_get(struct ib_uc
-
- down_write(¤t->mm->mmap_sem);
-
-- locked = npages + current->mm->pinned_vm;
-+ locked = npages + current->mm->locked_vm;
- lock_limit = rlimit(RLIMIT_MEMLOCK) >> PAGE_SHIFT;
-
- if ((locked > lock_limit) && !capable(CAP_IPC_LOCK)) {
-@@ -207,7 +207,7 @@ out:
- __ib_umem_release(context->device, umem, 0);
- kfree(umem);
- } else
-- current->mm->pinned_vm = locked;
-+ current->mm->locked_vm = locked;
-
- up_write(¤t->mm->mmap_sem);
- if (vma_list)
-@@ -223,7 +223,7 @@ static void ib_umem_account(struct work_
- struct ib_umem *umem = container_of(work, struct ib_umem, work);
-
- down_write(&umem->mm->mmap_sem);
-- umem->mm->pinned_vm -= umem->diff;
-+ umem->mm->locked_vm -= umem->diff;
- up_write(&umem->mm->mmap_sem);
- mmput(umem->mm);
- kfree(umem);
-Index: compat-rdma/drivers/infiniband/hw/ipath/ipath_user_pages.c
-===================================================================
---- compat-rdma.orig/drivers/infiniband/hw/ipath/ipath_user_pages.c
-+++ compat-rdma/drivers/infiniband/hw/ipath/ipath_user_pages.c
-@@ -79,7 +79,7 @@ static int __ipath_get_user_pages(unsign
- goto bail_release;
- }
-
-- current->mm->pinned_vm += num_pages;
-+ current->mm->locked_vm += num_pages;
-
- ret = 0;
- goto bail;
-@@ -178,7 +178,7 @@ void ipath_release_user_pages(struct pag
-
- __ipath_release_user_pages(p, num_pages, 1);
-
-- current->mm->pinned_vm -= num_pages;
-+ current->mm->locked_vm -= num_pages;
-
- up_write(¤t->mm->mmap_sem);
- }
-@@ -195,7 +195,7 @@ static void user_pages_account(struct wo
- container_of(_work, struct ipath_user_pages_work, work);
-
- down_write(&work->mm->mmap_sem);
-- work->mm->pinned_vm -= work->num_pages;
-+ work->mm->locked_vm -= work->num_pages;
- up_write(&work->mm->mmap_sem);
- mmput(work->mm);
- kfree(work);
-Index: compat-rdma/drivers/infiniband/hw/qib/qib_user_pages.c
-===================================================================
---- compat-rdma.orig/drivers/infiniband/hw/qib/qib_user_pages.c
-+++ compat-rdma/drivers/infiniband/hw/qib/qib_user_pages.c
-@@ -74,7 +74,7 @@ static int __qib_get_user_pages(unsigned
- goto bail_release;
- }
-
-- current->mm->pinned_vm += num_pages;
-+ current->mm->locked_vm += num_pages;
-
- ret = 0;
- goto bail;
-@@ -151,7 +151,7 @@ void qib_release_user_pages(struct page
- __qib_release_user_pages(p, num_pages, 1);
-
- if (current->mm) {
-- current->mm->pinned_vm -= num_pages;
-+ current->mm->locked_vm -= num_pages;
- up_write(¤t->mm->mmap_sem);
- }
- }
+++ /dev/null
-Index: compat-rdma/drivers/net/ethernet/mellanox/mlx4/en_rx.c
-===================================================================
---- compat-rdma.orig/drivers/net/ethernet/mellanox/mlx4/en_rx.c 2012-01-09 16:15:04.000000000 +0200
-+++ compat-rdma/drivers/net/ethernet/mellanox/mlx4/en_rx.c 2012-01-23 11:52:39.899175000 +0200
-@@ -44,7 +44,7 @@
-
- static int mlx4_en_alloc_frag(struct mlx4_en_priv *priv,
- struct mlx4_en_rx_desc *rx_desc,
-- struct page_frag *skb_frags,
-+ struct skb_frag_struct *skb_frags,
- struct mlx4_en_rx_alloc *ring_alloc,
- int i)
- {
-@@ -61,7 +61,7 @@ static int mlx4_en_alloc_frag(struct mlx
- return -ENOMEM;
-
- skb_frags[i].page = page_alloc->page;
-- skb_frags[i].offset = page_alloc->offset;
-+ skb_frags[i].page_offset = page_alloc->offset;
- page_alloc->page = page;
- page_alloc->offset = frag_info->frag_align;
- } else {
-@@ -69,11 +69,11 @@ static int mlx4_en_alloc_frag(struct mlx
- get_page(page);
-
- skb_frags[i].page = page;
-- skb_frags[i].offset = page_alloc->offset;
-+ skb_frags[i].page_offset = page_alloc->offset;
- page_alloc->offset += frag_info->frag_stride;
- }
- dma = pci_map_single(mdev->pdev, page_address(skb_frags[i].page) +
-- skb_frags[i].offset, frag_info->frag_size,
-+ skb_frags[i].page_offset, frag_info->frag_size,
- PCI_DMA_FROMDEVICE);
- rx_desc->data[i].addr = cpu_to_be64(dma);
- return 0;
-@@ -157,8 +157,8 @@ static int mlx4_en_prepare_rx_desc(struc
- struct mlx4_en_rx_ring *ring, int index)
- {
- struct mlx4_en_rx_desc *rx_desc = ring->buf + (index * ring->stride);
-- struct page_frag *skb_frags = ring->rx_info +
-- (index << priv->log_rx_info);
-+ struct skb_frag_struct *skb_frags = ring->rx_info +
-+ (index << priv->log_rx_info);
- int i;
-
- for (i = 0; i < priv->num_frags; i++)
-@@ -183,7 +183,7 @@ static void mlx4_en_free_rx_desc(struct
- int index)
- {
- struct mlx4_en_dev *mdev = priv->mdev;
-- struct page_frag *skb_frags;
-+ struct skb_frag_struct *skb_frags;
- struct mlx4_en_rx_desc *rx_desc = ring->buf + (index << ring->log_stride);
- dma_addr_t dma;
- int nr;
-@@ -194,7 +194,7 @@ static void mlx4_en_free_rx_desc(struct
- dma = be64_to_cpu(rx_desc->data[nr].addr);
-
- en_dbg(DRV, priv, "Unmapping buffer at dma:0x%llx\n", (u64) dma);
-- pci_unmap_single(mdev->pdev, dma, skb_frags[nr].size,
-+ pci_unmap_single(mdev->pdev, dma, skb_frag_size(&skb_frags[nr]),
- PCI_DMA_FROMDEVICE);
- put_page(skb_frags[nr].page);
- }
-@@ -403,7 +403,7 @@ void mlx4_en_deactivate_rx_ring(struct m
- /* Unmap a completed descriptor and free unused pages */
- static int mlx4_en_complete_rx_desc(struct mlx4_en_priv *priv,
- struct mlx4_en_rx_desc *rx_desc,
-- struct page_frag *skb_frags,
-+ struct skb_frag_struct *skb_frags,
- struct sk_buff *skb,
- struct mlx4_en_rx_alloc *page_alloc,
- int length)
-@@ -421,9 +421,9 @@ static int mlx4_en_complete_rx_desc(stru
- break;
-
- /* Save page reference in skb */
-- __skb_frag_set_page(&skb_frags_rx[nr], skb_frags[nr].page);
-- skb_frag_size_set(&skb_frags_rx[nr], skb_frags[nr].size);
-- skb_frags_rx[nr].page_offset = skb_frags[nr].offset;
-+ skb_frags_rx[nr].page = skb_frags[nr].page;
-+ skb_frag_size_set(&skb_frags_rx[nr], skb_frag_size(&skb_frags[nr]));
-+ skb_frags_rx[nr].page_offset = skb_frags[nr].page_offset;
- skb->truesize += frag_info->frag_stride;
- dma = be64_to_cpu(rx_desc->data[nr].addr);
-
-@@ -446,7 +446,7 @@ fail:
- * the descriptor) of this packet; remaining fragments are reused... */
- while (nr > 0) {
- nr--;
-- __skb_frag_unref(&skb_frags_rx[nr]);
-+ put_page(skb_frags_rx[nr].page);
- }
- return 0;
- }
-@@ -454,7 +454,7 @@ fail:
-
- static struct sk_buff *mlx4_en_rx_skb(struct mlx4_en_priv *priv,
- struct mlx4_en_rx_desc *rx_desc,
-- struct page_frag *skb_frags,
-+ struct skb_frag_struct *skb_frags,
- struct mlx4_en_rx_alloc *page_alloc,
- unsigned int length)
- {
-@@ -475,7 +475,7 @@ static struct sk_buff *mlx4_en_rx_skb(st
-
- /* Get pointer to first fragment so we could copy the headers into the
- * (linear part of the) skb */
-- va = page_address(skb_frags[0].page) + skb_frags[0].offset;
-+ va = page_address(skb_frags[0].page) + skb_frags[0].page_offset;
-
- if (length <= SMALL_PACKET_SIZE) {
- /* We are copying all relevant data to the skb - temporarily
-@@ -533,7 +533,7 @@ int mlx4_en_process_rx_cq(struct net_dev
- struct mlx4_en_priv *priv = netdev_priv(dev);
- struct mlx4_cqe *cqe;
- struct mlx4_en_rx_ring *ring = &priv->rx_ring[cq->ring];
-- struct page_frag *skb_frags;
-+ struct skb_frag_struct *skb_frags;
- struct mlx4_en_rx_desc *rx_desc;
- struct sk_buff *skb;
- int index;
+++ /dev/null
-Index: compat-rdma/drivers/infiniband/ulp/iser/iscsi_iser.c
-===================================================================
---- compat-rdma.orig/drivers/infiniband/ulp/iser/iscsi_iser.c
-+++ compat-rdma/drivers/infiniband/ulp/iser/iscsi_iser.c
-@@ -719,7 +719,9 @@ static struct iscsi_transport iscsi_iser
- .create_conn = iscsi_iser_conn_create,
- .bind_conn = iscsi_iser_conn_bind,
- .destroy_conn = iscsi_iser_conn_destroy,
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(3,2,0))
- .attr_is_visible = iser_attr_is_visible,
-+#endif
- .set_param = iscsi_iser_set_param,
- .get_conn_param = iscsi_conn_get_param,
- .get_ep_param = iscsi_iser_get_ep_param,
+++ /dev/null
-From 5ea32823a4937cd918a823bd0dfbbb592e8b9e6e Mon Sep 17 00:00:00 2001
-From: Vipul Pandya <vipul@chelsio.com>
-Date: Mon, 7 May 2012 14:17:55 +0530
-Subject: [PATCH 1/2] cxgb4: Reversing convert to SKB paged frag API.
-
-This patch is a reverse patch of upstream commit
-e91b0f2491f7a7b21c4e562df09f3dbe551f0fe2
-
-Signed-off-by: Vipul Pandya <vipul@chelsio.com>
----
- drivers/net/ethernet/chelsio/cxgb4/cxgb4.h | 2 +-
- drivers/net/ethernet/chelsio/cxgb4/sge.c | 45 +++++++++++++--------------
- 2 files changed, 23 insertions(+), 24 deletions(-)
-
-diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h b/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h
-index 0fe1885..223a7f7 100644
---- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h
-+++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h
-@@ -326,7 +326,7 @@ struct sge_fl { /* SGE free-buffer queue state */
-
- /* A packet gather list */
- struct pkt_gl {
-- struct page_frag frags[MAX_SKB_FRAGS];
-+ skb_frag_t frags[MAX_SKB_FRAGS];
- void *va; /* virtual address of first byte */
- unsigned int nfrags; /* # of fragments */
- unsigned int tot_len; /* total length of fragments */
-diff --git a/drivers/net/ethernet/chelsio/cxgb4/sge.c b/drivers/net/ethernet/chelsio/cxgb4/sge.c
-index 140254c..c5e99fb 100644
---- a/drivers/net/ethernet/chelsio/cxgb4/sge.c
-+++ b/drivers/net/ethernet/chelsio/cxgb4/sge.c
-@@ -216,8 +216,8 @@ static int map_skb(struct device *dev, const struct sk_buff *skb,
- end = &si->frags[si->nr_frags];
-
- for (fp = si->frags; fp < end; fp++) {
-- *++addr = skb_frag_dma_map(dev, fp, 0, skb_frag_size(fp),
-- DMA_TO_DEVICE);
-+ *++addr = dma_map_page(dev, fp->page, fp->page_offset,
-+ skb_frag_size(fp), DMA_TO_DEVICE);
- if (dma_mapping_error(dev, *addr))
- goto unwind;
- }
-@@ -1410,23 +1410,22 @@ int cxgb4_ofld_send(struct net_device *dev, struct sk_buff *skb)
- }
- EXPORT_SYMBOL(cxgb4_ofld_send);
-
--static inline void copy_frags(struct sk_buff *skb,
-+static inline void copy_frags(struct skb_shared_info *ssi,
- const struct pkt_gl *gl, unsigned int offset)
- {
-- int i;
-+ unsigned int n;
-
- /* usually there's just one frag */
-- __skb_fill_page_desc(skb, 0, gl->frags[0].page,
-- gl->frags[0].offset + offset,
-- gl->frags[0].size - offset);
-- skb_shinfo(skb)->nr_frags = gl->nfrags;
-- for (i = 1; i < gl->nfrags; i++)
-- __skb_fill_page_desc(skb, i, gl->frags[i].page,
-- gl->frags[i].offset,
-- gl->frags[i].size);
-+ ssi->frags[0].page = gl->frags[0].page;
-+ ssi->frags[0].page_offset = gl->frags[0].page_offset + offset;
-+ skb_frag_size_set(&ssi->frags[0], skb_frag_size(&gl->frags[0]) - offset);
-+ ssi->nr_frags = gl->nfrags;
-+ n = gl->nfrags - 1;
-+ if (n)
-+ memcpy(&ssi->frags[1], &gl->frags[1], n * sizeof(skb_frag_t));
-
- /* get a reference to the last page, we don't own it */
-- get_page(gl->frags[gl->nfrags - 1].page);
-+ get_page(gl->frags[n].page);
- }
-
- /**
-@@ -1461,7 +1460,7 @@ struct sk_buff *cxgb4_pktgl_to_skb(const struct pkt_gl *gl,
- __skb_put(skb, pull_len);
- skb_copy_to_linear_data(skb, gl->va, pull_len);
-
-- copy_frags(skb, gl, pull_len);
-+ copy_frags(skb_shinfo(skb), gl, pull_len);
- skb->len = gl->tot_len;
- skb->data_len = skb->len - pull_len;
- skb->truesize += skb->data_len;
-@@ -1480,7 +1479,7 @@ EXPORT_SYMBOL(cxgb4_pktgl_to_skb);
- static void t4_pktgl_free(const struct pkt_gl *gl)
- {
- int n;
-- const struct page_frag *p;
-+ const skb_frag_t *p;
-
- for (p = gl->frags, n = gl->nfrags - 1; n--; p++)
- put_page(p->page);
-@@ -1524,7 +1523,7 @@ static void do_gro(struct sge_eth_rxq *rxq, const struct pkt_gl *gl,
- return;
- }
-
-- copy_frags(skb, gl, RX_PKT_PAD);
-+ copy_frags(skb_shinfo(skb), gl, RX_PKT_PAD);
- skb->len = gl->tot_len - RX_PKT_PAD;
- skb->data_len = skb->len;
- skb->truesize += skb->data_len;
-@@ -1700,7 +1699,7 @@ static int process_responses(struct sge_rspq *q, int budget)
- rmb();
- rsp_type = RSPD_TYPE(rc->type_gen);
- if (likely(rsp_type == RSP_TYPE_FLBUF)) {
-- struct page_frag *fp;
-+ skb_frag_t *fp;
- struct pkt_gl si;
- const struct rx_sw_desc *rsd;
- u32 len = ntohl(rc->pldbuflen_qid), bufsz, frags;
-@@ -1719,9 +1718,9 @@ static int process_responses(struct sge_rspq *q, int budget)
- rsd = &rxq->fl.sdesc[rxq->fl.cidx];
- bufsz = get_buf_size(rsd);
- fp->page = rsd->page;
-- fp->offset = q->offset;
-- fp->size = min(bufsz, len);
-- len -= fp->size;
-+ fp->page_offset = q->offset;
-+ skb_frag_size_set(fp, min(bufsz, len));
-+ len -= skb_frag_size(fp);
- if (!len)
- break;
- unmap_rx_buf(q->adap, &rxq->fl);
-@@ -1733,16 +1732,16 @@ static int process_responses(struct sge_rspq *q, int budget)
- */
- dma_sync_single_for_cpu(q->adap->pdev_dev,
- get_buf_addr(rsd),
-- fp->size, DMA_FROM_DEVICE);
-+ skb_frag_size(fp), DMA_FROM_DEVICE);
-
- si.va = page_address(si.frags[0].page) +
-- si.frags[0].offset;
-+ si.frags[0].page_offset;
- prefetch(si.va);
-
- si.nfrags = frags + 1;
- ret = q->handler(q, q->cur_desc, &si);
- if (likely(ret == 0))
-- q->offset += ALIGN(fp->size, FL_ALIGN);
-+ q->offset += ALIGN(skb_frag_size(fp), FL_ALIGN);
- else
- restore_rx_bufs(&si, &rxq->fl, frags);
- } else if (likely(rsp_type == RSP_TYPE_CPL)) {
---
-1.7.1
-
+++ /dev/null
-From e861ec83739c5c981a1ae96edb08062f73d52dc4 Mon Sep 17 00:00:00 2001
-From: Vipul Pandya <vipul@chelsio.com>
-Date: Mon, 7 May 2012 14:40:34 +0530
-Subject: [PATCH 2/2] cxgb4: Add build support for kernel 3.1
-
-Signed-off-by: Vipul Pandya <vipul@chelsio.com>
----
- drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c | 8 ++++----
- 1 files changed, 4 insertions(+), 4 deletions(-)
-
-diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
-index 4c8f42a..0b77fec 100644
---- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
-+++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
-@@ -32,6 +32,9 @@
- * SOFTWARE.
- */
-
-+#ifdef pr_fmt
-+#undef pr_fmt
-+#endif
- #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
-
- #include <linux/bitmap.h>
-@@ -41,7 +44,6 @@
- #include <linux/err.h>
- #include <linux/etherdevice.h>
- #include <linux/firmware.h>
--#include <linux/if.h>
- #include <linux/if_vlan.h>
- #include <linux/init.h>
- #include <linux/log2.h>
-@@ -1902,7 +1904,7 @@ static int set_rss_table(struct net_device *dev,
- }
-
- static int get_rxnfc(struct net_device *dev, struct ethtool_rxnfc *info,
-- u32 *rules)
-+ void *rules)
- {
- const struct port_info *pi = netdev_priv(dev);
-
-@@ -3640,8 +3642,6 @@ static int __devinit init_one(struct pci_dev *pdev,
- netdev->features |= netdev->hw_features | highdma;
- netdev->vlan_features = netdev->features & VLAN_FEAT;
-
-- netdev->priv_flags |= IFF_UNICAST_FLT;
--
- netdev->netdev_ops = &cxgb4_netdev_ops;
- SET_ETHTOOL_OPS(netdev, &cxgb_ethtool_ops);
- }
---
-1.7.1
-