[ewg] [PATCH] RDMA/nes: add backport for RHEL5U4

Chien Tung chien.tin.tung at intel.com
Tue Sep 15 12:30:51 PDT 2009


Copy iw_nes backport patches from RHEL5U3 to RHEL5U4.

Signed-off-by: Chien Tung <chien.tin.tung at intel.com>
---
 .../2.6.18-EL5.4/iw_nes_800_to_2_6_28.patch        |   83 ++++++
 .../2.6.18-EL5.4/iw_nes_870_to_2_6_24.patch        |   27 ++
 .../2.6.18-EL5.4/iw_nes_880_to_2_6_23.patch        |  275 ++++++++++++++++++++
 .../2.6.18-EL5.4/iw_nes_890_to_2_6_22.patch        |   55 ++++
 .../2.6.18-EL5.4/iw_nes_900_to_2_6_21.patch        |   23 ++
 .../2.6.18-EL5.4/iw_nes_930_to_2_6_18.patch        |  115 ++++++++
 6 files changed, 578 insertions(+), 0 deletions(-)
 create mode 100644 kernel_patches/backport/2.6.18-EL5.4/iw_nes_800_to_2_6_28.patch
 create mode 100644 kernel_patches/backport/2.6.18-EL5.4/iw_nes_870_to_2_6_24.patch
 create mode 100644 kernel_patches/backport/2.6.18-EL5.4/iw_nes_880_to_2_6_23.patch
 create mode 100644 kernel_patches/backport/2.6.18-EL5.4/iw_nes_890_to_2_6_22.patch
 create mode 100644 kernel_patches/backport/2.6.18-EL5.4/iw_nes_900_to_2_6_21.patch
 create mode 100644 kernel_patches/backport/2.6.18-EL5.4/iw_nes_930_to_2_6_18.patch

diff --git a/kernel_patches/backport/2.6.18-EL5.4/iw_nes_800_to_2_6_28.patch b/kernel_patches/backport/2.6.18-EL5.4/iw_nes_800_to_2_6_28.patch
new file mode 100644
index 0000000..254d9b3
--- /dev/null
+++ b/kernel_patches/backport/2.6.18-EL5.4/iw_nes_800_to_2_6_28.patch
@@ -0,0 +1,83 @@
+diff -Nurp linux-2.6/drivers/infiniband/hw/nes/nes_hw.c nes.2_6_28_patch/drivers/infiniband/hw/nes/nes_hw.c
+--- linux-2.6/drivers/infiniband/hw/nes/nes_hw.c	2009-07-01 13:16:41.000000000 -0500
++++ nes.2_6_28_patch/drivers/infiniband/hw/nes/nes_hw.c	2009-07-06 11:15:13.000000000 -0500
+@@ -2555,7 +2555,7 @@ static void nes_nic_napi_ce_handler(stru
+ {
+ 	struct nes_vnic *nesvnic = container_of(cq, struct nes_vnic, nic_cq);
+ 
+-	napi_schedule(&nesvnic->napi);
++	netif_rx_schedule(nesdev->netdev[nesvnic->netdev_index], &nesvnic->napi);
+ }
+ 
+ 
+diff -Nurp linux-2.6/drivers/infiniband/hw/nes/nes_nic.c nes.2_6_28_patch/drivers/infiniband/hw/nes/nes_nic.c
+--- linux-2.6/drivers/infiniband/hw/nes/nes_nic.c	2009-07-01 13:16:41.000000000 -0500
++++ nes.2_6_28_patch/drivers/infiniband/hw/nes/nes_nic.c	2009-07-06 14:15:25.000000000 -0500
+@@ -99,6 +99,7 @@ static int nics_per_function = 1;
+ static int nes_netdev_poll(struct napi_struct *napi, int budget)
+ {
+ 	struct nes_vnic *nesvnic = container_of(napi, struct nes_vnic, napi);
++	struct net_device *netdev = nesvnic->netdev;
+ 	struct nes_device *nesdev = nesvnic->nesdev;
+ 	struct nes_hw_nic_cq *nescq = &nesvnic->nic_cq;
+ 
+@@ -111,7 +112,7 @@ static int nes_netdev_poll(struct napi_s
+ 	nes_nic_ce_handler(nesdev, nescq);
+ 
+ 	if (nescq->cqes_pending == 0) {
+-		napi_complete(napi);
++		netif_rx_complete(netdev, napi);
+ 		/* clear out completed cqes and arm */
+ 		nes_write32(nesdev->regs+NES_CQE_ALLOC, NES_CQE_ALLOC_NOTIFY_NEXT |
+ 				nescq->cq_number | (nescq->cqe_allocs_pending << 16));
+@@ -1551,19 +1552,6 @@ static void nes_netdev_vlan_rx_register(
+ 	spin_unlock_irqrestore(&nesadapter->phy_lock, flags);
+ }
+ 
+-static const struct net_device_ops nes_netdev_ops = {
+-	.ndo_open 		= nes_netdev_open,
+-	.ndo_stop		= nes_netdev_stop,
+-	.ndo_start_xmit 	= nes_netdev_start_xmit,
+-	.ndo_get_stats		= nes_netdev_get_stats,
+-	.ndo_tx_timeout 	= nes_netdev_tx_timeout,
+-	.ndo_set_mac_address	= nes_netdev_set_mac_address,
+-	.ndo_set_multicast_list = nes_netdev_set_multicast_list,
+-	.ndo_change_mtu		= nes_netdev_change_mtu,
+-	.ndo_set_mac_address 	= eth_mac_addr,
+-	.ndo_validate_addr	= eth_validate_addr,
+-	.ndo_vlan_rx_register 	= nes_netdev_vlan_rx_register,
+-};
+ 
+ /**
+  * nes_netdev_init - initialize network device
+@@ -1590,6 +1578,17 @@ struct net_device *nes_netdev_init(struc
+ 
+ 	SET_NETDEV_DEV(netdev, &nesdev->pcidev->dev);
+ 
++	nesvnic = netdev_priv(netdev);
++	memset(nesvnic, 0, sizeof(*nesvnic));
++
++	netdev->open = nes_netdev_open;
++	netdev->stop = nes_netdev_stop;
++	netdev->hard_start_xmit = nes_netdev_start_xmit;
++	netdev->get_stats = nes_netdev_get_stats;
++	netdev->tx_timeout = nes_netdev_tx_timeout;
++	netdev->set_mac_address = nes_netdev_set_mac_address;
++	netdev->set_multicast_list = nes_netdev_set_multicast_list;
++	netdev->change_mtu = nes_netdev_change_mtu;
+ 	netdev->watchdog_timeo = NES_TX_TIMEOUT;
+ 	netdev->irq = nesdev->pcidev->irq;
+ 	netdev->mtu = ETH_DATA_LEN;
+@@ -1597,11 +1596,11 @@ struct net_device *nes_netdev_init(struc
+ 	netdev->addr_len = ETH_ALEN;
+ 	netdev->type = ARPHRD_ETHER;
+ 	netdev->features = NETIF_F_HIGHDMA;
+-	netdev->netdev_ops = &nes_netdev_ops;
+ 	netdev->ethtool_ops = &nes_ethtool_ops;
+ 	netif_napi_add(netdev, &nesvnic->napi, nes_netdev_poll, 128);
+ 	nes_debug(NES_DBG_INIT, "Enabling VLAN Insert/Delete.\n");
+ 	netdev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
++	netdev->vlan_rx_register = nes_netdev_vlan_rx_register;
+ 
+ 	/* Fill in the port structure */
+ 	nesvnic->netdev = netdev;
diff --git a/kernel_patches/backport/2.6.18-EL5.4/iw_nes_870_to_2_6_24.patch b/kernel_patches/backport/2.6.18-EL5.4/iw_nes_870_to_2_6_24.patch
new file mode 100644
index 0000000..a890b9e
--- /dev/null
+++ b/kernel_patches/backport/2.6.18-EL5.4/iw_nes_870_to_2_6_24.patch
@@ -0,0 +1,27 @@
+diff -Nurp linux-2.6/drivers/infiniband/hw/nes/nes.c nes.2_6_24_patch/drivers/infiniband/hw/nes/nes.c
+--- linux-2.6/drivers/infiniband/hw/nes/nes.c	2009-07-01 13:16:41.000000000 -0500
++++ nes.2_6_24_patch/drivers/infiniband/hw/nes/nes.c	2009-07-06 01:08:56.000000000 -0500
+@@ -1101,19 +1101,19 @@ static ssize_t nes_show_wqm_quanta(struc
+ static ssize_t nes_store_wqm_quanta(struct device_driver *ddp,
+ 					const char *buf, size_t count)
+ {
+-	unsigned long wqm_quanta_value;
++	u32 wqm_quanta;
+ 	u32 wqm_config1;
+ 	u32 i = 0;
+ 	struct nes_device *nesdev;
+ 
+-	strict_strtoul(buf, 0, &wqm_quanta_value);
++	wqm_quanta = simple_strtoul(buf, NULL, 0);
+ 	list_for_each_entry(nesdev, &nes_dev_list, list) {
+ 		if (i == ee_flsh_adapter) {
+-			nesdev->nesadapter->wqm_quanta = wqm_quanta_value;
++			nesdev->nesadapter->wqm_quanta = wqm_quanta;
+ 			wqm_config1 = nes_read_indexed(nesdev,
+ 						NES_IDX_WQM_CONFIG1);
+ 			nes_write_indexed(nesdev, NES_IDX_WQM_CONFIG1,
+-					((wqm_quanta_value << 1) |
++					((wqm_quanta << 1) |
+ 					(wqm_config1 & 0x00000001)));
+ 			break;
+ 		}
diff --git a/kernel_patches/backport/2.6.18-EL5.4/iw_nes_880_to_2_6_23.patch b/kernel_patches/backport/2.6.18-EL5.4/iw_nes_880_to_2_6_23.patch
new file mode 100644
index 0000000..049a5b1
--- /dev/null
+++ b/kernel_patches/backport/2.6.18-EL5.4/iw_nes_880_to_2_6_23.patch
@@ -0,0 +1,275 @@
+diff -Nurp linux-2.6/drivers/infiniband/hw/nes/Kconfig nes.2_6_23_patch/drivers/infiniband/hw/nes/Kconfig
+--- linux-2.6/drivers/infiniband/hw/nes/Kconfig	2009-07-01 13:16:41.000000000 -0500
++++ nes.2_6_23_patch/drivers/infiniband/hw/nes/Kconfig	2009-07-06 01:08:56.000000000 -0500
+@@ -2,7 +2,6 @@ config INFINIBAND_NES
+ 	tristate "NetEffect RNIC Driver"
+ 	depends on PCI && INET && INFINIBAND
+ 	select LIBCRC32C
+-	select INET_LRO
+ 	---help---
+ 	  This is a low-level driver for NetEffect RDMA enabled
+ 	  Network Interface Cards (RNIC).
+diff -Nurp linux-2.6/drivers/infiniband/hw/nes/nes_hw.c nes.2_6_23_patch/drivers/infiniband/hw/nes/nes_hw.c
+--- linux-2.6/drivers/infiniband/hw/nes/nes_hw.c	2009-07-06 15:17:35.000000000 -0500
++++ nes.2_6_23_patch/drivers/infiniband/hw/nes/nes_hw.c	2009-07-06 11:14:30.000000000 -0500
+@@ -38,14 +38,9 @@
+ #include <linux/ip.h>
+ #include <linux/tcp.h>
+ #include <linux/if_vlan.h>
+-#include <linux/inet_lro.h>
+ 
+ #include "nes.h"
+ 
+-static unsigned int nes_lro_max_aggr = NES_LRO_MAX_AGGR;
+-module_param(nes_lro_max_aggr, uint, 0444);
+-MODULE_PARM_DESC(nes_lro_max_aggr, "NIC LRO max packet aggregation");
+-
+ static int wide_ppm_offset;
+ module_param(wide_ppm_offset, int, 0644);
+ MODULE_PARM_DESC(wide_ppm_offset, "Increase CX4 interface clock ppm offset, 0=100ppm (default), 1=300ppm");
+@@ -1530,25 +1525,6 @@ static void nes_rq_wqes_timeout(unsigned
+ }
+ 
+ 
+-static int nes_lro_get_skb_hdr(struct sk_buff *skb, void **iphdr,
+-			       void **tcph, u64 *hdr_flags, void *priv)
+-{
+-	unsigned int ip_len;
+-	struct iphdr *iph;
+-	skb_reset_network_header(skb);
+-	iph = ip_hdr(skb);
+-	if (iph->protocol != IPPROTO_TCP)
+-		return -1;
+-	ip_len = ip_hdrlen(skb);
+-	skb_set_transport_header(skb, ip_len);
+-	*tcph = tcp_hdr(skb);
+-
+-	*hdr_flags = LRO_IPV4 | LRO_TCP;
+-	*iphdr = iph;
+-	return 0;
+-}
+-
+-
+ /**
+  * nes_init_nic_qp
+  */
+@@ -1772,14 +1748,6 @@ int nes_init_nic_qp(struct nes_device *n
+ 			jumbomode = 1;
+ 		nes_nic_init_timer_defaults(nesdev, jumbomode);
+ 	}
+-	nesvnic->lro_mgr.max_aggr       = nes_lro_max_aggr;
+-	nesvnic->lro_mgr.max_desc       = NES_MAX_LRO_DESCRIPTORS;
+-	nesvnic->lro_mgr.lro_arr        = nesvnic->lro_desc;
+-	nesvnic->lro_mgr.get_skb_header = nes_lro_get_skb_hdr;
+-	nesvnic->lro_mgr.features       = LRO_F_NAPI | LRO_F_EXTRACT_VLAN_ID;
+-	nesvnic->lro_mgr.dev            = netdev;
+-	nesvnic->lro_mgr.ip_summed      = CHECKSUM_UNNECESSARY;
+-	nesvnic->lro_mgr.ip_summed_aggr = CHECKSUM_UNNECESSARY;
+ 	return 0;
+ }
+ 
+@@ -2555,7 +2523,7 @@ static void nes_nic_napi_ce_handler(stru
+ {
+ 	struct nes_vnic *nesvnic = container_of(cq, struct nes_vnic, nic_cq);
+ 
+-	netif_rx_schedule(nesdev->netdev[nesvnic->netdev_index], &nesvnic->napi);
++	netif_rx_schedule(nesdev->netdev[nesvnic->netdev_index]);
+ }
+ 
+ 
+@@ -2590,13 +2558,10 @@ void nes_nic_ce_handler(struct nes_devic
+ 	u16 pkt_type;
+ 	u16 rqes_processed = 0;
+ 	u8 sq_cqes = 0;
+-	u8 nes_use_lro = 0;
+ 
+ 	head = cq->cq_head;
+ 	cq_size = cq->cq_size;
+ 	cq->cqes_pending = 1;
+-	if (nesvnic->netdev->features & NETIF_F_LRO)
+-		nes_use_lro = 1;
+ 	do {
+ 		if (le32_to_cpu(cq->cq_vbase[head].cqe_words[NES_NIC_CQE_MISC_IDX]) &
+ 				NES_NIC_CQE_VALID) {
+@@ -2728,17 +2693,9 @@ void nes_nic_ce_handler(struct nes_devic
+ 							>> 16);
+ 					nes_debug(NES_DBG_CQ, "%s: Reporting stripped VLAN packet. Tag = 0x%04X\n",
+ 							nesvnic->netdev->name, vlan_tag);
+-					if (nes_use_lro)
+-						lro_vlan_hwaccel_receive_skb(&nesvnic->lro_mgr, rx_skb,
+-								nesvnic->vlan_grp, vlan_tag, NULL);
+-					else
+-						nes_vlan_rx(rx_skb, nesvnic->vlan_grp, vlan_tag);
+-				} else {
+-					if (nes_use_lro)
+-						lro_receive_skb(&nesvnic->lro_mgr, rx_skb, NULL);
+-					else
+-						nes_netif_rx(rx_skb);
+-				}
++					nes_vlan_rx(rx_skb, nesvnic->vlan_grp, vlan_tag);
++				} else
++					nes_netif_rx(rx_skb);
+ 
+ skip_rx_indicate0:
+ 				nesvnic->netdev->last_rx = jiffies;
+@@ -2769,8 +2726,6 @@ skip_rx_indicate0:
+ 
+ 	} while (1);
+ 
+-	if (nes_use_lro)
+-		lro_flush_all(&nesvnic->lro_mgr);
+ 	if (sq_cqes) {
+ 		barrier();
+ 		/* restart the queue if it had been stopped */
+diff -Nurp linux-2.6/drivers/infiniband/hw/nes/nes_hw.h nes.2_6_23_patch/drivers/infiniband/hw/nes/nes_hw.h
+--- linux-2.6/drivers/infiniband/hw/nes/nes_hw.h	2009-07-01 13:16:41.000000000 -0500
++++ nes.2_6_23_patch/drivers/infiniband/hw/nes/nes_hw.h	2009-07-06 01:08:56.000000000 -0500
+@@ -33,8 +33,6 @@
+ #ifndef __NES_HW_H
+ #define __NES_HW_H
+ 
+-#include <linux/inet_lro.h>
+-
+ #define NES_PHY_TYPE_CX4       1
+ #define NES_PHY_TYPE_1G        2
+ #define NES_PHY_TYPE_IRIS      3
+@@ -993,8 +991,6 @@ struct nes_hw_tune_timer {
+ #define NES_TIMER_ENABLE_LIMIT      4
+ #define NES_MAX_LINK_INTERRUPTS     128
+ #define NES_MAX_LINK_CHECK          200
+-#define NES_MAX_LRO_DESCRIPTORS     32
+-#define NES_LRO_MAX_AGGR            64
+ 
+ struct nes_adapter {
+ 	u64              fw_ver;
+@@ -1169,7 +1165,6 @@ struct nes_vnic {
+ 	u32               msg_enable;
+ 	/* u32 tx_avail; */
+ 	__be32            local_ipaddr;
+-	struct napi_struct   napi;
+ 	spinlock_t           tx_lock;	/* could use netdev tx lock? */
+ 	struct timer_list    rq_wqes_timer;
+ 	u32                  nic_mem_size;
+@@ -1197,9 +1192,6 @@ struct nes_vnic {
+ 	u8  of_device_registered;
+ 	u8  rdma_enabled;
+ 	u8  rx_checksum_disabled;
+-	u32 lro_max_aggr;
+-	struct net_lro_mgr lro_mgr;
+-	struct net_lro_desc lro_desc[NES_MAX_LRO_DESCRIPTORS];
+ };
+ 
+ struct nes_ib_device {
+diff -Nurp linux-2.6/drivers/infiniband/hw/nes/nes_nic.c nes.2_6_23_patch/drivers/infiniband/hw/nes/nes_nic.c
+--- linux-2.6/drivers/infiniband/hw/nes/nes_nic.c	2009-07-06 15:17:35.000000000 -0500
++++ nes.2_6_23_patch/drivers/infiniband/hw/nes/nes_nic.c	2009-07-06 13:39:45.000000000 -0500
+@@ -96,35 +96,38 @@ static int nics_per_function = 1;
+ /**
+  * nes_netdev_poll
+  */
+-static int nes_netdev_poll(struct napi_struct *napi, int budget)
++static int nes_netdev_poll(struct net_device *netdev, int *budget_ptr)
+ {
+-	struct nes_vnic *nesvnic = container_of(napi, struct nes_vnic, napi);
+-	struct net_device *netdev = nesvnic->netdev;
++	struct nes_vnic *nesvnic = netdev_priv(netdev);
+ 	struct nes_device *nesdev = nesvnic->nesdev;
+ 	struct nes_hw_nic_cq *nescq = &nesvnic->nic_cq;
+-
+-	nesvnic->budget = budget;
++	nesvnic->budget = min(netdev->quota, *budget_ptr);
+ 	nescq->cqes_pending = 0;
+ 	nescq->rx_cqes_completed = 0;
+ 	nescq->cqe_allocs_pending = 0;
+ 	nescq->rx_pkts_indicated = 0;
+ 
+ 	nes_nic_ce_handler(nesdev, nescq);
++	netdev->quota -= nescq->rx_pkts_indicated;
++	*budget_ptr -= nescq->rx_pkts_indicated;
+ 
+-	if (nescq->cqes_pending == 0) {
+-		netif_rx_complete(netdev, napi);
++	if ((nescq->cqes_pending == 0) && (netdev->quota != 0)) {
++		netif_rx_complete(netdev);
+ 		/* clear out completed cqes and arm */
+ 		nes_write32(nesdev->regs+NES_CQE_ALLOC, NES_CQE_ALLOC_NOTIFY_NEXT |
+ 				nescq->cq_number | (nescq->cqe_allocs_pending << 16));
+ 		nes_read32(nesdev->regs+NES_CQE_ALLOC);
++
++		return 0;
+ 	} else {
+ 		/* clear out completed cqes but don't arm */
+ 		nes_write32(nesdev->regs+NES_CQE_ALLOC,
+ 				nescq->cq_number | (nescq->cqe_allocs_pending << 16));
+ 		nes_debug(NES_DBG_NETDEV, "%s: exiting with work pending\n",
+ 				nesvnic->netdev->name);
++
++		return 1;
+ 	}
+-	return nescq->rx_pkts_indicated;
+ }
+ 
+ 
+@@ -238,7 +241,6 @@ static int nes_netdev_open(struct net_de
+ 		netif_start_queue(netdev);
+ 		netif_carrier_on(netdev);
+ 	}
+-	napi_enable(&nesvnic->napi);
+ 	nesvnic->netdev_open = 1;
+ 
+ 	return 0;
+@@ -266,7 +268,6 @@ static int nes_netdev_stop(struct net_de
+ 		printk(KERN_INFO PFX "%s: disabling interface\n", netdev->name);
+ 
+ 	/* Disable network packets */
+-	napi_disable(&nesvnic->napi);
+ 	netif_stop_queue(netdev);
+ 	list_for_each_safe(list_pos, list_temp, &nesdev->nesadapter->nesvnic_list[nesdev->mac_index]) {
+ 		first_nesvnic = container_of(list_pos, struct nes_vnic, list);
+@@ -1038,9 +1039,6 @@ static const char nes_ethtool_stringset[
+ 	"CQ Depth 32",
+ 	"CQ Depth 128",
+ 	"CQ Depth 256",
+-	"LRO aggregated",
+-	"LRO flushed",
+-	"LRO no_desc",
+ };
+ 
+ #define NES_ETHTOOL_STAT_COUNT  ARRAY_SIZE(nes_ethtool_stringset)
+@@ -1238,9 +1236,6 @@ static void nes_netdev_get_ethtool_stats
+ 	target_stat_values[++index] = int_mod_cq_depth_32;
+ 	target_stat_values[++index] = int_mod_cq_depth_128;
+ 	target_stat_values[++index] = int_mod_cq_depth_256;
+-	target_stat_values[++index] = nesvnic->lro_mgr.stats.aggregated;
+-	target_stat_values[++index] = nesvnic->lro_mgr.stats.flushed;
+-	target_stat_values[++index] = nesvnic->lro_mgr.stats.no_desc;
+ 
+ }
+ 
+@@ -1523,8 +1518,6 @@ static struct ethtool_ops nes_ethtool_op
+ 	.set_sg = ethtool_op_set_sg,
+ 	.get_tso = ethtool_op_get_tso,
+ 	.set_tso = ethtool_op_set_tso,
+-	.get_flags = ethtool_op_get_flags,
+-	.set_flags = ethtool_op_set_flags,
+ };
+ 
+ 
+@@ -1597,7 +1590,8 @@ struct net_device *nes_netdev_init(struc
+ 	netdev->type = ARPHRD_ETHER;
+ 	netdev->features = NETIF_F_HIGHDMA;
+ 	netdev->ethtool_ops = &nes_ethtool_ops;
+-	netif_napi_add(netdev, &nesvnic->napi, nes_netdev_poll, 128);
++	netdev->poll = nes_netdev_poll;
++	netdev->weight = 128;
+ 	nes_debug(NES_DBG_INIT, "Enabling VLAN Insert/Delete.\n");
+ 	netdev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
+ 	netdev->vlan_rx_register = nes_netdev_vlan_rx_register;
+@@ -1629,7 +1623,6 @@ struct net_device *nes_netdev_init(struc
+ 
+ 	if ((nesvnic->logical_port < 2) || (nesdev->nesadapter->hw_rev != NE020_REV)) {
+ 		netdev->features |= NETIF_F_TSO | NETIF_F_SG | NETIF_F_IP_CSUM;
+-		netdev->features |= NETIF_F_GSO | NETIF_F_TSO | NETIF_F_SG | NETIF_F_IP_CSUM;
+ 	} else {
+ 		netdev->features |= NETIF_F_SG | NETIF_F_IP_CSUM;
+ 	}
diff --git a/kernel_patches/backport/2.6.18-EL5.4/iw_nes_890_to_2_6_22.patch b/kernel_patches/backport/2.6.18-EL5.4/iw_nes_890_to_2_6_22.patch
new file mode 100644
index 0000000..460f507
--- /dev/null
+++ b/kernel_patches/backport/2.6.18-EL5.4/iw_nes_890_to_2_6_22.patch
@@ -0,0 +1,55 @@
+diff -Nurp linux-2.6/drivers/infiniband/hw/nes/nes.c nes.2_6_22_patch/drivers/infiniband/hw/nes/nes.c
+--- linux-2.6/drivers/infiniband/hw/nes/nes.c	2009-07-06 15:17:35.000000000 -0500
++++ nes.2_6_22_patch/drivers/infiniband/hw/nes/nes.c	2009-07-06 01:08:56.000000000 -0500
+@@ -576,16 +576,22 @@ static int __devinit nes_probe(struct pc
+ 						nesdev->nesadapter->port_count;
+ 	}
+ 
+-	if ((limit_maxrdreqsz ||
+-	     ((nesdev->nesadapter->phy_type[0] == NES_PHY_TYPE_GLADIUS) &&
+-	      (hw_rev == NE020_REV1))) &&
+-	    (pcie_get_readrq(pcidev) > 256)) {
+-		if (pcie_set_readrq(pcidev, 256))
+-			printk(KERN_ERR PFX "Unable to set max read request"
+-				" to 256 bytes\n");
+-		else
+-			nes_debug(NES_DBG_INIT, "Max read request size set"
+-				" to 256 bytes\n");
++	if (limit_maxrdreqsz ||
++	    ((nesdev->nesadapter->phy_type[0] == NES_PHY_TYPE_GLADIUS) &&
++	     (hw_rev == NE020_REV1))) {
++		u16 maxrdreqword;
++		pci_read_config_word(pcidev, 0x68, &maxrdreqword);
++		/* set bits 12-14 to 001b = 256 bytes */
++		if ((maxrdreqword & 0x7000) > 0x1000) {
++			maxrdreqword &= 0x8fff;
++			maxrdreqword |= 0x1000;
++			if (pci_write_config_word(pcidev, 0x68, maxrdreqword))
++				printk(KERN_ERR PFX "Unable to set max read "
++					"request to 256 bytes\n");
++			else
++				nes_debug(NES_DBG_INIT, "Max read request size"
++					"set to 256 bytes\n");
++		}
+ 	}
+ 
+ 	tasklet_init(&nesdev->dpc_tasklet, nes_dpc, (unsigned long)nesdev);
+diff -Nurp linux-2.6/drivers/infiniband/hw/nes/nes.h nes.2_6_22_patch/drivers/infiniband/hw/nes/nes.h
+--- linux-2.6/drivers/infiniband/hw/nes/nes.h	2009-07-01 13:16:41.000000000 -0500
++++ nes.2_6_22_patch/drivers/infiniband/hw/nes/nes.h	2009-07-06 01:08:56.000000000 -0500
+@@ -274,14 +274,7 @@ static inline __le32 get_crc_value(struc
+ 	u32 crc_value;
+ 	crc_value = crc32c(~0, (void *)nes_quad, sizeof (struct nes_v4_quad));
+ 
+-	/*
+-	 * With commit ef19454b ("[LIB] crc32c: Keep intermediate crc
+-	 * state in cpu order"), behavior of crc32c changes on
+-	 * big-endian platforms.  Our algorithm expects the previous
+-	 * behavior; otherwise we have RDMA connection establishment
+-	 * issue on big-endian.
+-	 */
+-	return cpu_to_le32(crc_value);
++	return crc_value;
+ }
+ 
+ static inline void
diff --git a/kernel_patches/backport/2.6.18-EL5.4/iw_nes_900_to_2_6_21.patch b/kernel_patches/backport/2.6.18-EL5.4/iw_nes_900_to_2_6_21.patch
new file mode 100644
index 0000000..b88f3a3
--- /dev/null
+++ b/kernel_patches/backport/2.6.18-EL5.4/iw_nes_900_to_2_6_21.patch
@@ -0,0 +1,23 @@
+diff -Nurp linux-2.6/drivers/infiniband/hw/nes/nes_nic.c nes.2_6_21_patch/drivers/infiniband/hw/nes/nes_nic.c
+--- linux-2.6/drivers/infiniband/hw/nes/nes_nic.c	2009-07-06 15:17:35.000000000 -0500
++++ nes.2_6_21_patch/drivers/infiniband/hw/nes/nes_nic.c	2009-07-06 15:14:54.000000000 -0500
+@@ -1545,6 +1545,11 @@ static void nes_netdev_vlan_rx_register(
+ 	spin_unlock_irqrestore(&nesadapter->phy_lock, flags);
+ }
+ 
++static void nes_netdev_vlan_rx_kill_vid(struct net_device *netdev,
++					unsigned short vid)
++{
++}
++
+ 
+ /**
+  * nes_netdev_init - initialize network device
+@@ -1595,6 +1600,7 @@ struct net_device *nes_netdev_init(struc
+ 	nes_debug(NES_DBG_INIT, "Enabling VLAN Insert/Delete.\n");
+ 	netdev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
+ 	netdev->vlan_rx_register = nes_netdev_vlan_rx_register;
++	netdev->vlan_rx_kill_vid = nes_netdev_vlan_rx_kill_vid;
+ 
+ 	/* Fill in the port structure */
+ 	nesvnic->netdev = netdev;
diff --git a/kernel_patches/backport/2.6.18-EL5.4/iw_nes_930_to_2_6_18.patch b/kernel_patches/backport/2.6.18-EL5.4/iw_nes_930_to_2_6_18.patch
new file mode 100644
index 0000000..16f7595
--- /dev/null
+++ b/kernel_patches/backport/2.6.18-EL5.4/iw_nes_930_to_2_6_18.patch
@@ -0,0 +1,115 @@
+diff -Nurp linux-2.6/drivers/infiniband/hw/nes/nes_verbs.c nes.2_6_18_patch/drivers/infiniband/hw/nes/nes_verbs.c
+--- linux-2.6/drivers/infiniband/hw/nes/nes_verbs.c	2009-07-01 13:16:41.000000000 -0500
++++ nes.2_6_18_patch/drivers/infiniband/hw/nes/nes_verbs.c	2009-07-07 09:08:15.000000000 -0500
+@@ -2785,11 +2785,10 @@ static int nes_dereg_mr(struct ib_mr *ib
+ /**
+  * show_rev
+  */
+-static ssize_t show_rev(struct device *dev, struct device_attribute *attr,
+-			char *buf)
++static ssize_t show_rev(struct class_device *cdev, char *buf)
+ {
+ 	struct nes_ib_device *nesibdev =
+-			container_of(dev, struct nes_ib_device, ibdev.dev);
++			container_of(cdev, struct nes_ib_device, ibdev.class_dev);
+ 	struct nes_vnic *nesvnic = nesibdev->nesvnic;
+ 
+ 	nes_debug(NES_DBG_INIT, "\n");
+@@ -2800,11 +2799,10 @@ static ssize_t show_rev(struct device *d
+ /**
+  * show_fw_ver
+  */
+-static ssize_t show_fw_ver(struct device *dev, struct device_attribute *attr,
+-			   char *buf)
++static ssize_t show_fw_ver(struct class_device *cdev, char *buf)
+ {
+ 	struct nes_ib_device *nesibdev =
+-			container_of(dev, struct nes_ib_device, ibdev.dev);
++			container_of(cdev, struct nes_ib_device, ibdev.class_dev);
+ 	struct nes_vnic *nesvnic = nesibdev->nesvnic;
+ 
+ 	nes_debug(NES_DBG_INIT, "\n");
+@@ -2817,8 +2815,7 @@ static ssize_t show_fw_ver(struct device
+ /**
+  * show_hca
+  */
+-static ssize_t show_hca(struct device *dev, struct device_attribute *attr,
+-		        char *buf)
++static ssize_t show_hca(struct class_device *cdev, char *buf)
+ {
+ 	nes_debug(NES_DBG_INIT, "\n");
+ 	return sprintf(buf, "NES020\n");
+@@ -2828,24 +2825,23 @@ static ssize_t show_hca(struct device *d
+ /**
+  * show_board
+  */
+-static ssize_t show_board(struct device *dev, struct device_attribute *attr,
+-			  char *buf)
++static ssize_t show_board(struct class_device *cdev, char *buf)
+ {
+ 	nes_debug(NES_DBG_INIT, "\n");
+ 	return sprintf(buf, "%.*s\n", 32, "NES020 Board ID");
+ }
+ 
+ 
+-static DEVICE_ATTR(hw_rev, S_IRUGO, show_rev, NULL);
+-static DEVICE_ATTR(fw_ver, S_IRUGO, show_fw_ver, NULL);
+-static DEVICE_ATTR(hca_type, S_IRUGO, show_hca, NULL);
+-static DEVICE_ATTR(board_id, S_IRUGO, show_board, NULL);
+-
+-static struct device_attribute *nes_dev_attributes[] = {
+-	&dev_attr_hw_rev,
+-	&dev_attr_fw_ver,
+-	&dev_attr_hca_type,
+-	&dev_attr_board_id
++static CLASS_DEVICE_ATTR(hw_rev, S_IRUGO, show_rev, NULL);
++static CLASS_DEVICE_ATTR(fw_ver, S_IRUGO, show_fw_ver, NULL);
++static CLASS_DEVICE_ATTR(hca_type, S_IRUGO, show_hca, NULL);
++static CLASS_DEVICE_ATTR(board_id, S_IRUGO, show_board, NULL);
++
++static struct class_device_attribute *nes_class_attributes[] = {
++	&class_device_attr_hw_rev,
++	&class_device_attr_fw_ver,
++	&class_device_attr_hca_type,
++	&class_device_attr_board_id
+ };
+ 
+ 
+@@ -3754,7 +3750,7 @@ struct nes_ib_device *nes_init_ofa_devic
+ 	nesibdev->ibdev.phys_port_cnt = 1;
+ 	nesibdev->ibdev.num_comp_vectors = 1;
+ 	nesibdev->ibdev.dma_device = &nesdev->pcidev->dev;
+-	nesibdev->ibdev.dev.parent = &nesdev->pcidev->dev;
++	nesibdev->ibdev.class_dev.dev = &nesdev->pcidev->dev;
+ 	nesibdev->ibdev.query_device = nes_query_device;
+ 	nesibdev->ibdev.query_port = nes_query_port;
+ 	nesibdev->ibdev.modify_port = nes_modify_port;
+@@ -3849,13 +3845,13 @@ int nes_register_ofa_device(struct nes_i
+ 	nesibdev->max_qp = (nesadapter->max_qp-NES_FIRST_QPN) / nesadapter->port_count;
+ 	nesibdev->max_pd = nesadapter->max_pd / nesadapter->port_count;
+ 
+-	for (i = 0; i < ARRAY_SIZE(nes_dev_attributes); ++i) {
+-		ret = device_create_file(&nesibdev->ibdev.dev, nes_dev_attributes[i]);
++	for (i = 0; i < ARRAY_SIZE(nes_class_attributes); ++i) {
++		ret = class_device_create_file(&nesibdev->ibdev.class_dev, nes_class_attributes[i]);
+ 		if (ret) {
+ 			while (i > 0) {
+ 				i--;
+-				device_remove_file(&nesibdev->ibdev.dev,
+-						   nes_dev_attributes[i]);
++				class_device_remove_file(&nesibdev->ibdev.class_dev,
++						nes_class_attributes[i]);
+ 			}
+ 			ib_unregister_device(&nesibdev->ibdev);
+ 			return ret;
+@@ -3876,8 +3872,8 @@ static void nes_unregister_ofa_device(st
+ 	struct nes_vnic *nesvnic = nesibdev->nesvnic;
+ 	int i;
+ 
+-	for (i = 0; i < ARRAY_SIZE(nes_dev_attributes); ++i) {
+-		device_remove_file(&nesibdev->ibdev.dev, nes_dev_attributes[i]);
++	for (i = 0; i < ARRAY_SIZE(nes_class_attributes); ++i) {
++		class_device_remove_file(&nesibdev->ibdev.class_dev, nes_class_attributes[i]);
+ 	}
+ 
+ 	if (nesvnic->of_device_registered) {
-- 
1.6.4.2




More information about the ewg mailing list