From 7a47d680624bbf7796dafaea0fa69d7795880498 Mon Sep 17 00:00:00 2001 From: Vipul Pandya Date: Thu, 10 May 2012 19:56:52 +0530 Subject: [PATCH] cxgb3/cxgb4/iw_cxgb3/iw_cxgb4: Add RHEL 6.2 backports Signed-off-by: Vipul Pandya --- ...ersing-convert-to-SKB-paged-frag-API.patch | 150 +++++++++++ ...gb4-Add-build-support-for-kernel-3.1.patch | 53 ++++ .../11-cxgb3-Reversing-do-vlan-cleanup.patch | 212 +++++++++++++++ .../12-iw_cxgb3-Add-RHEL6.2-backports.patch | 66 +++++ .../13-iw_cxgb4-Add-RHEL6.2-backports.patch | 75 ++++++ ...use-the-DMA-state-API-instead-of-the.patch | 157 +++++++++++ ...5-cxgb3-Revert-implement-set_phys_id.patch | 66 +++++ ...-cxgb3-Revert-convert-to-hw_features.patch | 248 ++++++++++++++++++ .../17-cxgb3-Add-RHEL6.2-backports.patch | 77 ++++++ .../18-cxgb4-Add-phys_id-interface.patch | 35 +++ .../19-cxgb4-Revert-netdevice-changes.patch | 195 ++++++++++++++ .../20-cxgb4-cxgb4_main-and-sge-changes.patch | 183 +++++++++++++ .../21-cxgb4-real_num_tx_queues-changes.patch | 48 ++++ .../22-cxgb4-Fix-packet-counters.patch | 74 ++++++ 14 files changed, 1639 insertions(+) create mode 100644 backports/2.6.32-EL6.2/09-cxgb4-Reversing-convert-to-SKB-paged-frag-API.patch create mode 100644 backports/2.6.32-EL6.2/10-cxgb4-Add-build-support-for-kernel-3.1.patch create mode 100644 backports/2.6.32-EL6.2/11-cxgb3-Reversing-do-vlan-cleanup.patch create mode 100644 backports/2.6.32-EL6.2/12-iw_cxgb3-Add-RHEL6.2-backports.patch create mode 100644 backports/2.6.32-EL6.2/13-iw_cxgb4-Add-RHEL6.2-backports.patch create mode 100644 backports/2.6.32-EL6.2/14-iw_cxgb4-Revert-use-the-DMA-state-API-instead-of-the.patch create mode 100644 backports/2.6.32-EL6.2/15-cxgb3-Revert-implement-set_phys_id.patch create mode 100644 backports/2.6.32-EL6.2/16-cxgb3-Revert-convert-to-hw_features.patch create mode 100644 backports/2.6.32-EL6.2/17-cxgb3-Add-RHEL6.2-backports.patch create mode 100644 backports/2.6.32-EL6.2/18-cxgb4-Add-phys_id-interface.patch create mode 100644 backports/2.6.32-EL6.2/19-cxgb4-Revert-netdevice-changes.patch create mode 100644 backports/2.6.32-EL6.2/20-cxgb4-cxgb4_main-and-sge-changes.patch create mode 100644 backports/2.6.32-EL6.2/21-cxgb4-real_num_tx_queues-changes.patch create mode 100644 backports/2.6.32-EL6.2/22-cxgb4-Fix-packet-counters.patch 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 index 0000000..119e593 --- /dev/null +++ b/backports/2.6.32-EL6.2/09-cxgb4-Reversing-convert-to-SKB-paged-frag-API.patch @@ -0,0 +1,150 @@ +From 198ea4dc9d2e1e38995ca5442d71b8bee9247a0c Mon Sep 17 00:00:00 2001 +From: Vipul Pandya +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 +--- + 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 index 0000000..e5d643e --- /dev/null +++ b/backports/2.6.32-EL6.2/10-cxgb4-Add-build-support-for-kernel-3.1.patch @@ -0,0 +1,53 @@ +From bca407cec6adad6766870d6c26ff3ffa3b10e529 Mon Sep 17 00:00:00 2001 +From: Vipul Pandya +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 +--- + 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 +@@ -41,7 +44,6 @@ + #include + #include + #include +-#include + #include + #include + #include +@@ -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 index 0000000..3b8519a --- /dev/null +++ b/backports/2.6.32-EL6.2/11-cxgb3-Reversing-do-vlan-cleanup.patch @@ -0,0 +1,212 @@ +From 708ed9efefdc11cf5be0491314befb0fafac1daa Mon Sep 17 00:00:00 2001 +From: Vipul Pandya +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 +--- + 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 + ++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 index 0000000..bbd3ed4 --- /dev/null +++ b/backports/2.6.32-EL6.2/12-iw_cxgb3-Add-RHEL6.2-backports.patch @@ -0,0 +1,66 @@ +From 4d79ac47a87ece1a8bae619683a11b264f7db063 Mon Sep 17 00:00:00 2001 +From: Vipul Pandya +Date: Thu, 3 May 2012 14:39:49 +0530 +Subject: [PATCH 04/14] iw_cxgb3: Add RHEL6.2 backports + +Signed-off-by: Vipul Pandya +--- + 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 index 0000000..f191a41 --- /dev/null +++ b/backports/2.6.32-EL6.2/13-iw_cxgb4-Add-RHEL6.2-backports.patch @@ -0,0 +1,75 @@ +From d80b776c844c1a35f32a55150021f2e8635b7323 Mon Sep 17 00:00:00 2001 +From: Vipul Pandya +Date: Thu, 10 May 2012 15:39:37 +0530 +Subject: [PATCH 05/14] iw_cxgb4: Add RHEL6.2 backports + +Signed-off-by: Vipul Pandya +--- + 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 index 0000000..2be8286 --- /dev/null +++ b/backports/2.6.32-EL6.2/14-iw_cxgb4-Revert-use-the-DMA-state-API-instead-of-the.patch @@ -0,0 +1,157 @@ +From 8651cf61a4cd6651c6fbd37a3702d6f134cdaaa6 Mon Sep 17 00:00:00 2001 +From: Vipul Pandya +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 +--- + 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 index 0000000..8c00dce --- /dev/null +++ b/backports/2.6.32-EL6.2/15-cxgb3-Revert-implement-set_phys_id.patch @@ -0,0 +1,66 @@ +From 6ede508ac7b890df01acd9cd219542d36c49b25e Mon Sep 17 00:00:00 2001 +From: Vipul Pandya +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 +--- + 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 index 0000000..17fffb0 --- /dev/null +++ b/backports/2.6.32-EL6.2/16-cxgb3-Revert-convert-to-hw_features.patch @@ -0,0 +1,248 @@ +From 810969f13f370934f20c017cea7ee949db23a002 Mon Sep 17 00:00:00 2001 +From: Vipul Pandya +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 +--- + 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 index 0000000..eef6afa --- /dev/null +++ b/backports/2.6.32-EL6.2/17-cxgb3-Add-RHEL6.2-backports.patch @@ -0,0 +1,77 @@ +From 585e4113fc88b627bbc365f2fc15f11a903906c6 Mon Sep 17 00:00:00 2001 +From: Vipul Pandya +Date: Thu, 10 May 2012 17:12:56 +0530 +Subject: [PATCH 09/14] cxgb3: Add RHEL6.2 backports + +Signed-off-by: Vipul Pandya +--- + 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 index 0000000..94a38ce --- /dev/null +++ b/backports/2.6.32-EL6.2/18-cxgb4-Add-phys_id-interface.patch @@ -0,0 +1,35 @@ +From 23e76ca8dcd4d2d1ffbf1cde508c81bc14b09bc9 Mon Sep 17 00:00:00 2001 +From: Vipul Pandya +Date: Thu, 10 May 2012 17:33:51 +0530 +Subject: [PATCH 10/14] cxgb4: Add phys_id interface + +Signed-off-by: Vipul Pandya +--- + 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 index 0000000..8123815 --- /dev/null +++ b/backports/2.6.32-EL6.2/19-cxgb4-Revert-netdevice-changes.patch @@ -0,0 +1,195 @@ +From 583857f85aadb5438eeeff7c1f4778f6c11ef9ed Mon Sep 17 00:00:00 2001 +From: Vipul Pandya +Date: Thu, 10 May 2012 17:37:37 +0530 +Subject: [PATCH 11/14] cxgb4: Revert netdevice changes + +Signed-off-by: Vipul Pandya +--- + 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 index 0000000..648dae6 --- /dev/null +++ b/backports/2.6.32-EL6.2/20-cxgb4-cxgb4_main-and-sge-changes.patch @@ -0,0 +1,183 @@ +From 65f230d00b7f0d6558f53a2df049cc7f9fa7f041 Mon Sep 17 00:00:00 2001 +From: Vipul Pandya +Date: Thu, 10 May 2012 17:49:00 +0530 +Subject: [PATCH 12/14] cxgb4: cxgb4_main and sge changes + +Signed-off-by: Vipul Pandya +--- + 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 index 0000000..8a0b6cf --- /dev/null +++ b/backports/2.6.32-EL6.2/21-cxgb4-real_num_tx_queues-changes.patch @@ -0,0 +1,48 @@ +From ce0bbdee8fe4ac34ad0b695f914c499b5ebeae3f Mon Sep 17 00:00:00 2001 +From: Vipul Pandya +Date: Thu, 10 May 2012 17:51:16 +0530 +Subject: [PATCH 13/14] cxgb4: real_num_tx_queues changes + +Signed-off-by: Vipul Pandya +--- + 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 index 0000000..d26dea0 --- /dev/null +++ b/backports/2.6.32-EL6.2/22-cxgb4-Fix-packet-counters.patch @@ -0,0 +1,74 @@ +From 05e7163348fbef11a2307c52259e75ff19d46cf1 Mon Sep 17 00:00:00 2001 +From: Vipul Pandya +Date: Thu, 10 May 2012 17:52:47 +0530 +Subject: [PATCH 14/14] cxgb4: Fix packet counters + +Signed-off-by: Vipul Pandya +--- + 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 + -- 2.41.0