]> git.openfabrics.org - ~emulex/tmp/compat-rdma/.git/commitdiff
cxgb3/cxgb4/iw_cxgb3/iw_cxgb4: Add RHEL 6.2 backports
authorVipul Pandya <vipul@chelsio.com>
Thu, 10 May 2012 14:26:52 +0000 (19:56 +0530)
committerVipul Pandya vipul@chelsio.com <vipulp@openfabrics.org>
Tue, 15 May 2012 15:23:34 +0000 (08:23 -0700)
Signed-off-by: Vipul Pandya <vipul@chelsio.com>
14 files changed:
backports/2.6.32-EL6.2/09-cxgb4-Reversing-convert-to-SKB-paged-frag-API.patch [new file with mode: 0644]
backports/2.6.32-EL6.2/10-cxgb4-Add-build-support-for-kernel-3.1.patch [new file with mode: 0644]
backports/2.6.32-EL6.2/11-cxgb3-Reversing-do-vlan-cleanup.patch [new file with mode: 0644]
backports/2.6.32-EL6.2/12-iw_cxgb3-Add-RHEL6.2-backports.patch [new file with mode: 0644]
backports/2.6.32-EL6.2/13-iw_cxgb4-Add-RHEL6.2-backports.patch [new file with mode: 0644]
backports/2.6.32-EL6.2/14-iw_cxgb4-Revert-use-the-DMA-state-API-instead-of-the.patch [new file with mode: 0644]
backports/2.6.32-EL6.2/15-cxgb3-Revert-implement-set_phys_id.patch [new file with mode: 0644]
backports/2.6.32-EL6.2/16-cxgb3-Revert-convert-to-hw_features.patch [new file with mode: 0644]
backports/2.6.32-EL6.2/17-cxgb3-Add-RHEL6.2-backports.patch [new file with mode: 0644]
backports/2.6.32-EL6.2/18-cxgb4-Add-phys_id-interface.patch [new file with mode: 0644]
backports/2.6.32-EL6.2/19-cxgb4-Revert-netdevice-changes.patch [new file with mode: 0644]
backports/2.6.32-EL6.2/20-cxgb4-cxgb4_main-and-sge-changes.patch [new file with mode: 0644]
backports/2.6.32-EL6.2/21-cxgb4-real_num_tx_queues-changes.patch [new file with mode: 0644]
backports/2.6.32-EL6.2/22-cxgb4-Fix-packet-counters.patch [new file with mode: 0644]

diff --git a/backports/2.6.32-EL6.2/09-cxgb4-Reversing-convert-to-SKB-paged-frag-API.patch b/backports/2.6.32-EL6.2/09-cxgb4-Reversing-convert-to-SKB-paged-frag-API.patch
new file mode 100644 (file)
index 0000000..119e593
--- /dev/null
@@ -0,0 +1,150 @@
+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
+
diff --git a/backports/2.6.32-EL6.2/10-cxgb4-Add-build-support-for-kernel-3.1.patch b/backports/2.6.32-EL6.2/10-cxgb4-Add-build-support-for-kernel-3.1.patch
new file mode 100644 (file)
index 0000000..e5d643e
--- /dev/null
@@ -0,0 +1,53 @@
+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
+
diff --git a/backports/2.6.32-EL6.2/11-cxgb3-Reversing-do-vlan-cleanup.patch b/backports/2.6.32-EL6.2/11-cxgb3-Reversing-do-vlan-cleanup.patch
new file mode 100644 (file)
index 0000000..3b8519a
--- /dev/null
@@ -0,0 +1,212 @@
+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
+
diff --git a/backports/2.6.32-EL6.2/12-iw_cxgb3-Add-RHEL6.2-backports.patch b/backports/2.6.32-EL6.2/12-iw_cxgb3-Add-RHEL6.2-backports.patch
new file mode 100644 (file)
index 0000000..bbd3ed4
--- /dev/null
@@ -0,0 +1,66 @@
+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
+
diff --git a/backports/2.6.32-EL6.2/13-iw_cxgb4-Add-RHEL6.2-backports.patch b/backports/2.6.32-EL6.2/13-iw_cxgb4-Add-RHEL6.2-backports.patch
new file mode 100644 (file)
index 0000000..f191a41
--- /dev/null
@@ -0,0 +1,75 @@
+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
+
diff --git a/backports/2.6.32-EL6.2/14-iw_cxgb4-Revert-use-the-DMA-state-API-instead-of-the.patch b/backports/2.6.32-EL6.2/14-iw_cxgb4-Revert-use-the-DMA-state-API-instead-of-the.patch
new file mode 100644 (file)
index 0000000..2be8286
--- /dev/null
@@ -0,0 +1,157 @@
+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
+
diff --git a/backports/2.6.32-EL6.2/15-cxgb3-Revert-implement-set_phys_id.patch b/backports/2.6.32-EL6.2/15-cxgb3-Revert-implement-set_phys_id.patch
new file mode 100644 (file)
index 0000000..8c00dce
--- /dev/null
@@ -0,0 +1,66 @@
+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
+
diff --git a/backports/2.6.32-EL6.2/16-cxgb3-Revert-convert-to-hw_features.patch b/backports/2.6.32-EL6.2/16-cxgb3-Revert-convert-to-hw_features.patch
new file mode 100644 (file)
index 0000000..17fffb0
--- /dev/null
@@ -0,0 +1,248 @@
+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
+
diff --git a/backports/2.6.32-EL6.2/17-cxgb3-Add-RHEL6.2-backports.patch b/backports/2.6.32-EL6.2/17-cxgb3-Add-RHEL6.2-backports.patch
new file mode 100644 (file)
index 0000000..eef6afa
--- /dev/null
@@ -0,0 +1,77 @@
+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
+
diff --git a/backports/2.6.32-EL6.2/18-cxgb4-Add-phys_id-interface.patch b/backports/2.6.32-EL6.2/18-cxgb4-Add-phys_id-interface.patch
new file mode 100644 (file)
index 0000000..94a38ce
--- /dev/null
@@ -0,0 +1,35 @@
+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
+
diff --git a/backports/2.6.32-EL6.2/19-cxgb4-Revert-netdevice-changes.patch b/backports/2.6.32-EL6.2/19-cxgb4-Revert-netdevice-changes.patch
new file mode 100644 (file)
index 0000000..8123815
--- /dev/null
@@ -0,0 +1,195 @@
+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
+
diff --git a/backports/2.6.32-EL6.2/20-cxgb4-cxgb4_main-and-sge-changes.patch b/backports/2.6.32-EL6.2/20-cxgb4-cxgb4_main-and-sge-changes.patch
new file mode 100644 (file)
index 0000000..648dae6
--- /dev/null
@@ -0,0 +1,183 @@
+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
+
diff --git a/backports/2.6.32-EL6.2/21-cxgb4-real_num_tx_queues-changes.patch b/backports/2.6.32-EL6.2/21-cxgb4-real_num_tx_queues-changes.patch
new file mode 100644 (file)
index 0000000..8a0b6cf
--- /dev/null
@@ -0,0 +1,48 @@
+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
+
diff --git a/backports/2.6.32-EL6.2/22-cxgb4-Fix-packet-counters.patch b/backports/2.6.32-EL6.2/22-cxgb4-Fix-packet-counters.patch
new file mode 100644 (file)
index 0000000..d26dea0
--- /dev/null
@@ -0,0 +1,74 @@
+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
+