Backport Chelsio to RHEL4U4

Signed-off-by: Steve Wise <[EMAIL PROTECTED]>
---

 .../backport/2.6.9_U4/include/linux/ethtool.h      |    9 +
 .../backport/2.6.9_U4/include/linux/genalloc.h     |   42 +++++
 .../backport/2.6.9_U4/include/linux/interrupt.h    |   17 ++
 .../backport/2.6.9_U4/include/linux/kfifo.h        |  157 ++++++++++++++++++
 kernel_addons/backport/2.6.9_U4/include/linux/mm.h |   20 ++
 .../backport/2.6.9_U4/include/linux/netdevice.h    |    9 +
 .../backport/2.6.9_U4/include/linux/pci.h          |    1 
 .../backport/2.6.9_U4/include/linux/random.h       |   15 ++
 .../backport/2.6.9_U4/include/linux/skbuff.h       |    4 
 .../backport/2.6.9_U4/include/linux/slab.h         |   19 --
 .../backport/2.6.9_U4/include/linux/types.h        |    8 +
 .../backport/2.6.9_U4/include/linux/workqueue.h    |    8 +
 kernel_addons/backport/2.6.9_U4/include/net/dst.h  |   16 ++
 .../backport/2.6.9_U4/include/net/netevent.h       |   33 ++++
 .../backport/2.6.9_U4/include/src/genalloc.c       |  198 
+++++++++++++++++++++++
 .../backport/2.6.9_U4/include/src/kfifo.c          |  196 
+++++++++++++++++++++++
 .../backport/2.6.9_U4/include/src/netevent.c       |   71 ++++++++
 .../backport/2.6.9_U4/cxgb3_main_to_2_6_13.patch   |   12 +
 .../2.6.9_U4/cxgb3_makefile_to_2_6_19.patch        |   12 +
 .../backport/2.6.9_U4/iwch_cm_to_2_6_9_U4.patch    |   13 ++
 .../backport/2.6.9_U4/linux_stuff_to_2_6_17.patch  |   31 ++++
 .../2.6.9_U4/mthca_provider_3465_to_2_6_9.patch    |   15 --
 .../backport/2.6.9_U4/t3_hw_to_2_6_5-7_244.patch   |   43 +++++
 23 files changed, 917 insertions(+), 32 deletions(-)

diff --git a/kernel_addons/backport/2.6.9_U4/include/linux/ethtool.h 
b/kernel_addons/backport/2.6.9_U4/include/linux/ethtool.h
new file mode 100644
index 0000000..d03127c
--- /dev/null
+++ b/kernel_addons/backport/2.6.9_U4/include/linux/ethtool.h
@@ -0,0 +1,9 @@
+#ifndef BACKPORT_LINUX_ETHTOOL_TO_2_6_13
+#define BACKPORT_LINUX_ETHTOOL_TO_2_6_13
+
+#include_next <linux/ethtool.h>
+
+#define ADVERTISED_Pause               (1 << 13)
+#define ADVERTISED_Asym_Pause          (1 << 14)
+
+#endif
diff --git a/kernel_addons/backport/2.6.9_U4/include/linux/genalloc.h 
b/kernel_addons/backport/2.6.9_U4/include/linux/genalloc.h
new file mode 100644
index 0000000..3c23c68
--- /dev/null
+++ b/kernel_addons/backport/2.6.9_U4/include/linux/genalloc.h
@@ -0,0 +1,42 @@
+/*
+ * Basic general purpose allocator for managing special purpose memory
+ * not managed by the regular kmalloc/kfree interface.
+ * Uses for this includes on-device special memory, uncached memory
+ * etc.
+ *
+ * This source code is licensed under the GNU General Public License,
+ * Version 2.  See the file COPYING for more details.
+ */
+
+
+/*
+ *  General purpose special memory pool descriptor.
+ */
+struct gen_pool {
+       rwlock_t lock;
+       struct list_head chunks;        /* list of chunks in this pool */
+       int min_alloc_order;            /* minimum allocation order */
+};
+
+/*
+ *  General purpose special memory pool chunk descriptor.
+ */
+struct gen_pool_chunk {
+       spinlock_t lock;
+       struct list_head next_chunk;    /* next chunk in pool */
+       unsigned long start_addr;       /* starting address of memory chunk */
+       unsigned long end_addr;         /* ending address of memory chunk */
+       unsigned long bits[0];          /* bitmap for allocating memory chunk */
+};
+
+extern struct gen_pool *ib_gen_pool_create(int, int);
+extern int ib_gen_pool_add(struct gen_pool *, unsigned long, size_t, int);
+extern void ib_gen_pool_destroy(struct gen_pool *);
+extern unsigned long ib_gen_pool_alloc(struct gen_pool *, size_t);
+extern void ib_gen_pool_free(struct gen_pool *, unsigned long, size_t);
+
+#define gen_pool_create ib_gen_pool_create
+#define gen_pool_add ib_gen_pool_add
+#define gen_pool_destroy ib_gen_pool_destroy
+#define gen_pool_alloc ib_gen_pool_alloc
+#define gen_pool_free ib_gen_pool_free
diff --git a/kernel_addons/backport/2.6.9_U4/include/linux/interrupt.h 
b/kernel_addons/backport/2.6.9_U4/include/linux/interrupt.h
new file mode 100644
index 0000000..66e66a9
--- /dev/null
+++ b/kernel_addons/backport/2.6.9_U4/include/linux/interrupt.h
@@ -0,0 +1,17 @@
+#ifndef BACKPORT_LINUX_INTERRUPT_TO_2_6_18
+#define BACKPORT_LINUX_INTERRUPT_TO_2_6_18
+#include_next <linux/interrupt.h>
+
+static inline int 
+backport_request_irq(unsigned int irq,
+                     irqreturn_t (*handler)(int, void *),
+                     unsigned long flags, const char *dev_name, void *dev_id)
+{
+       return request_irq(irq, 
+                          (irqreturn_t (*)(int, void *, struct pt_regs 
*))handler, 
+                          flags, dev_name, dev_id);
+}
+
+#define request_irq backport_request_irq
+
+#endif
diff --git a/kernel_addons/backport/2.6.9_U4/include/linux/kfifo.h 
b/kernel_addons/backport/2.6.9_U4/include/linux/kfifo.h
new file mode 100644
index 0000000..48eccd8
--- /dev/null
+++ b/kernel_addons/backport/2.6.9_U4/include/linux/kfifo.h
@@ -0,0 +1,157 @@
+/*
+ * A simple kernel FIFO implementation.
+ *
+ * Copyright (C) 2004 Stelian Pop <[EMAIL PROTECTED]>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+#ifndef _LINUX_KFIFO_H
+#define _LINUX_KFIFO_H
+
+#ifdef __KERNEL__
+
+#include <linux/kernel.h>
+#include <linux/spinlock.h>
+
+struct kfifo {
+       unsigned char *buffer;  /* the buffer holding the data */
+       unsigned int size;      /* the size of the allocated buffer */
+       unsigned int in;        /* data is added at offset (in % size) */
+       unsigned int out;       /* data is extracted from off. (out % size) */
+       spinlock_t *lock;       /* protects concurrent modifications */
+};
+
+extern struct kfifo *kfifo_init(unsigned char *buffer, unsigned int size,
+                               gfp_t gfp_mask, spinlock_t *lock);
+extern struct kfifo *kfifo_alloc(unsigned int size, gfp_t gfp_mask,
+                                spinlock_t *lock);
+extern void kfifo_free(struct kfifo *fifo);
+extern unsigned int __kfifo_put(struct kfifo *fifo,
+                               unsigned char *buffer, unsigned int len);
+extern unsigned int __kfifo_get(struct kfifo *fifo,
+                               unsigned char *buffer, unsigned int len);
+
+/**
+ * __kfifo_reset - removes the entire FIFO contents, no locking version
+ * @fifo: the fifo to be emptied.
+ */
+static inline void __kfifo_reset(struct kfifo *fifo)
+{
+       fifo->in = fifo->out = 0;
+}
+
+/**
+ * kfifo_reset - removes the entire FIFO contents
+ * @fifo: the fifo to be emptied.
+ */
+static inline void kfifo_reset(struct kfifo *fifo)
+{
+       unsigned long flags;
+
+       spin_lock_irqsave(fifo->lock, flags);
+
+       __kfifo_reset(fifo);
+
+       spin_unlock_irqrestore(fifo->lock, flags);
+}
+
+/**
+ * kfifo_put - puts some data into the FIFO
+ * @fifo: the fifo to be used.
+ * @buffer: the data to be added.
+ * @len: the length of the data to be added.
+ *
+ * This function copies at most 'len' bytes from the 'buffer' into
+ * the FIFO depending on the free space, and returns the number of
+ * bytes copied.
+ */
+static inline unsigned int kfifo_put(struct kfifo *fifo,
+                                    unsigned char *buffer, unsigned int len)
+{
+       unsigned long flags;
+       unsigned int ret;
+
+       spin_lock_irqsave(fifo->lock, flags);
+
+       ret = __kfifo_put(fifo, buffer, len);
+
+       spin_unlock_irqrestore(fifo->lock, flags);
+
+       return ret;
+}
+
+/**
+ * kfifo_get - gets some data from the FIFO
+ * @fifo: the fifo to be used.
+ * @buffer: where the data must be copied.
+ * @len: the size of the destination buffer.
+ *
+ * This function copies at most 'len' bytes from the FIFO into the
+ * 'buffer' and returns the number of copied bytes.
+ */
+static inline unsigned int kfifo_get(struct kfifo *fifo,
+                                    unsigned char *buffer, unsigned int len)
+{
+       unsigned long flags;
+       unsigned int ret;
+
+       spin_lock_irqsave(fifo->lock, flags);
+
+       ret = __kfifo_get(fifo, buffer, len);
+
+       /*
+        * optimization: if the FIFO is empty, set the indices to 0
+        * so we don't wrap the next time
+        */
+       if (fifo->in == fifo->out)
+               fifo->in = fifo->out = 0;
+
+       spin_unlock_irqrestore(fifo->lock, flags);
+
+       return ret;
+}
+
+/**
+ * __kfifo_len - returns the number of bytes available in the FIFO, no locking 
version
+ * @fifo: the fifo to be used.
+ */
+static inline unsigned int __kfifo_len(struct kfifo *fifo)
+{
+       return fifo->in - fifo->out;
+}
+
+/**
+ * kfifo_len - returns the number of bytes available in the FIFO
+ * @fifo: the fifo to be used.
+ */
+static inline unsigned int kfifo_len(struct kfifo *fifo)
+{
+       unsigned long flags;
+       unsigned int ret;
+
+       spin_lock_irqsave(fifo->lock, flags);
+
+       ret = __kfifo_len(fifo);
+
+       spin_unlock_irqrestore(fifo->lock, flags);
+
+       return ret;
+}
+
+#else
+#warning "don't include kernel headers in userspace"
+#endif /* __KERNEL__ */
+#endif
diff --git a/kernel_addons/backport/2.6.9_U4/include/linux/mm.h 
b/kernel_addons/backport/2.6.9_U4/include/linux/mm.h
new file mode 100644
index 0000000..77ee6fc
--- /dev/null
+++ b/kernel_addons/backport/2.6.9_U4/include/linux/mm.h
@@ -0,0 +1,20 @@
+#ifndef BACKPORT_LINUX_MM_TO_SLES9SP3
+#define BACKPORT_LINUX_MM_TO_SLES9SP3
+
+#include_next <linux/mm.h>
+
+static inline int 
+remap_pfn_range(struct vm_area_struct *vma, unsigned long addr,
+               unsigned long pfn, unsigned long size, pgprot_t prot)
+{
+       return remap_page_range(vma, addr, pfn << PAGE_SHIFT, size, prot);
+}
+
+static inline int 
+io_remap_pfn_range(struct vm_area_struct *vma, unsigned long addr,
+               unsigned long pfn, unsigned long size, pgprot_t prot)
+{
+       return io_remap_page_range(vma, addr, pfn << PAGE_SHIFT, size, prot);
+}
+
+#endif
diff --git a/kernel_addons/backport/2.6.9_U4/include/linux/netdevice.h 
b/kernel_addons/backport/2.6.9_U4/include/linux/netdevice.h
index 5641019..2f12781 100644
--- a/kernel_addons/backport/2.6.9_U4/include/linux/netdevice.h
+++ b/kernel_addons/backport/2.6.9_U4/include/linux/netdevice.h
@@ -15,4 +15,13 @@ static inline void netif_tx_unlock(struc
        spin_unlock(&dev->xmit_lock);
 }
 
+static inline int __netif_rx_schedule_prep(struct net_device *dev)
+{
+        return !test_and_set_bit(__LINK_STATE_RX_SCHED, &dev->state);
+}
+
+#undef SET_ETHTOOL_OPS
+#define SET_ETHTOOL_OPS(netdev, ops) \
+       (netdev)->ethtool_ops = (struct ethtool_ops *)(ops)
+
 #endif
diff --git a/kernel_addons/backport/2.6.9_U4/include/linux/pci.h 
b/kernel_addons/backport/2.6.9_U4/include/linux/pci.h
index bd47cd4..6e0df62 100644
--- a/kernel_addons/backport/2.6.9_U4/include/linux/pci.h
+++ b/kernel_addons/backport/2.6.9_U4/include/linux/pci.h
@@ -4,5 +4,6 @@ #define LINUX_PCI_BACKPORT_TO_2_6_9_H
 #include_next <linux/pci.h>
 
 #define PCI_EXP_LNKCTL          16      /* Link Control */
+#define PCI_EXP_LNKSTA          18      /* Link Status */
 
 #endif
diff --git a/kernel_addons/backport/2.6.9_U4/include/linux/random.h 
b/kernel_addons/backport/2.6.9_U4/include/linux/random.h
new file mode 100644
index 0000000..2ea2e1f
--- /dev/null
+++ b/kernel_addons/backport/2.6.9_U4/include/linux/random.h
@@ -0,0 +1,15 @@
+#ifndef BACKPORT_LINUX_RANDOM_TO_2_6_18
+#define BACKPORT_LINUX_RANDOM_TO_2_6_18
+#include_next <linux/random.h>
+
+static inline u32 backport_random32(void)
+{
+       u32 v;
+
+       get_random_bytes(&v, sizeof(u32));
+       return v;
+}
+
+#define random32 backport_random32
+
+#endif
diff --git a/kernel_addons/backport/2.6.9_U4/include/linux/skbuff.h 
b/kernel_addons/backport/2.6.9_U4/include/linux/skbuff.h
index 94b968a..62bfb3b 100644
--- a/kernel_addons/backport/2.6.9_U4/include/linux/skbuff.h
+++ b/kernel_addons/backport/2.6.9_U4/include/linux/skbuff.h
@@ -3,7 +3,8 @@ #define LINUX_SKBUFF_H_BACKPORT
 
 #include_next <linux/skbuff.h>
 
-#define CHECKSUM_PARTIAL CHECKSUM_HW
+#define CHECKSUM_PARTIAL CHECKSUM_HW 
+#define CHECKSUM_COMPLETE CHECKSUM_HW 
 
 /**
  *      skb_header_release - release reference to header
@@ -17,5 +18,6 @@ static inline void skb_header_release(st
 {
 }
 
+#define gso_size tso_size
 
 #endif
diff --git a/kernel_addons/backport/2.6.9_U4/include/linux/slab.h 
b/kernel_addons/backport/2.6.9_U4/include/linux/slab.h
index 46ac6e5..cbf6311 100644
--- a/kernel_addons/backport/2.6.9_U4/include/linux/slab.h
+++ b/kernel_addons/backport/2.6.9_U4/include/linux/slab.h
@@ -1,10 +1,8 @@
-#include_next <linux/slab.h>
+#ifndef LINUX_SLAB_BACKPORT_H
+#define LINUX_SLAB_BACKPORT_H
 
 #include_next <linux/slab.h>
 
-#ifndef BACKPORT_LINUX_STRING_TO_2_6_18
-#define BACKPORT_LINUX_STRING_TO_2_6_18
-
 static inline
 void *kmemdup(const void *src, size_t len, gfp_t gfp)
 {
@@ -16,19 +14,10 @@ void *kmemdup(const void *src, size_t le
        return p;
 }
 
-#endif
-#ifndef BACKPORT_LINUX_STRING_TO_2_6_18
-#define BACKPORT_LINUX_STRING_TO_2_6_18
-
 static inline
-void *kmemdup(const void *src, size_t len, gfp_t gfp)
+void *kmalloc_node(size_t size, gfp_t flags, int nid)
 {
-       void *p;
-
-       p = kmalloc(len, gfp);
-       if (p)
-               memcpy(p, src, len);
-       return p;
+       return kmalloc(size, flags);
 }
 
 #endif
diff --git a/kernel_addons/backport/2.6.9_U4/include/linux/types.h 
b/kernel_addons/backport/2.6.9_U4/include/linux/types.h
new file mode 100644
index 0000000..0c19a43
--- /dev/null
+++ b/kernel_addons/backport/2.6.9_U4/include/linux/types.h
@@ -0,0 +1,8 @@
+#ifndef LINUX_TYPES_BACKPORT_H
+#define LINUX_TYPES_BACKPORT_H
+
+#include_next <linux/types.h>
+
+#define BITS_PER_BYTE 8
+
+#endif
diff --git a/kernel_addons/backport/2.6.9_U4/include/linux/workqueue.h 
b/kernel_addons/backport/2.6.9_U4/include/linux/workqueue.h
index 330f47f..c054ed2 100644
--- a/kernel_addons/backport/2.6.9_U4/include/linux/workqueue.h
+++ b/kernel_addons/backport/2.6.9_U4/include/linux/workqueue.h
@@ -26,6 +26,12 @@ backport_cancel_delayed_work(struct dela
        return cancel_delayed_work(&work->work);
 }
 
+static inline void cancel_rearming_delayed_workqueue(struct workqueue_struct 
*wq,
+                                      struct delayed_work *dwork)
+{
+       while (!cancel_delayed_work(&dwork->work))
+               flush_workqueue(wq);
+}
 
 #undef INIT_WORK
 #define INIT_WORK(_work, _func) backport_INIT_WORK(_work, _func)
@@ -33,7 +39,7 @@ #define INIT_DELAYED_WORK(_work, _func) 
 
 #undef DECLARE_WORK
 #define DECLARE_WORK(n, f) \
-       struct work_struct n = __WORK_INITIALIZER(n, f, &(n))
+       struct work_struct n = __WORK_INITIALIZER(n, (void (*)(void *))f, &(n))
 #define DECLARE_DELAYED_WORK(n, f) \
        struct delayed_work n = { .work = __WORK_INITIALIZER(n.work, f, 
&(n.work)) }
 
diff --git a/kernel_addons/backport/2.6.9_U4/include/net/dst.h 
b/kernel_addons/backport/2.6.9_U4/include/net/dst.h
new file mode 100644
index 0000000..ec5e7b4
--- /dev/null
+++ b/kernel_addons/backport/2.6.9_U4/include/net/dst.h
@@ -0,0 +1,16 @@
+#ifndef BACKPORT_NET_DST_2_6_11
+#define BACKPORT_NET_DST_2_6_11
+
+#include_next <net/dst.h>
+
+static inline u32 dst_mtu(struct dst_entry *dst)
+{
+       u32 mtu = dst_metric(dst, RTAX_MTU);
+       /*
+        * Alexey put it here, so ask him about it :)
+        */
+       barrier();
+       return mtu;
+}
+
+#endif
diff --git a/kernel_addons/backport/2.6.9_U4/include/net/netevent.h 
b/kernel_addons/backport/2.6.9_U4/include/net/netevent.h
new file mode 100644
index 0000000..e5d2162
--- /dev/null
+++ b/kernel_addons/backport/2.6.9_U4/include/net/netevent.h
@@ -0,0 +1,33 @@
+#ifndef _NET_EVENT_H
+#define _NET_EVENT_H
+
+/*
+ *     Generic netevent notifiers
+ *
+ *     Authors:
+ *      Tom Tucker              <[EMAIL PROTECTED]>
+ *      Steve Wise              <[EMAIL PROTECTED]>
+ *
+ *     Changes:
+ */
+#ifdef __KERNEL__
+
+#include <net/dst.h>
+
+struct netevent_redirect {
+       struct dst_entry *old;
+       struct dst_entry *new;
+};
+
+enum netevent_notif_type {
+       NETEVENT_NEIGH_UPDATE = 1, /* arg is struct neighbour ptr */
+       NETEVENT_PMTU_UPDATE,      /* arg is struct dst_entry ptr */
+       NETEVENT_REDIRECT,         /* arg is struct netevent_redirect ptr */
+};
+
+extern int register_netevent_notifier(struct notifier_block *nb);
+extern int unregister_netevent_notifier(struct notifier_block *nb);
+extern int call_netevent_notifiers(unsigned long val, void *v);
+
+#endif
+#endif
diff --git a/kernel_addons/backport/2.6.9_U4/include/src/genalloc.c 
b/kernel_addons/backport/2.6.9_U4/include/src/genalloc.c
new file mode 100644
index 0000000..75ae68c
--- /dev/null
+++ b/kernel_addons/backport/2.6.9_U4/include/src/genalloc.c
@@ -0,0 +1,198 @@
+/*
+ * Basic general purpose allocator for managing special purpose memory
+ * not managed by the regular kmalloc/kfree interface.
+ * Uses for this includes on-device special memory, uncached memory
+ * etc.
+ *
+ * Copyright 2005 (C) Jes Sorensen <[EMAIL PROTECTED]>
+ *
+ * This source code is licensed under the GNU General Public License,
+ * Version 2.  See the file COPYING for more details.
+ */
+
+#include <linux/module.h>
+#include <linux/genalloc.h>
+
+
+/**
+ * gen_pool_create - create a new special memory pool
+ * @min_alloc_order: log base 2 of number of bytes each bitmap bit represents
+ * @nid: node id of the node the pool structure should be allocated on, or -1
+ *
+ * Create a new special memory pool that can be used to manage special purpose
+ * memory not managed by the regular kmalloc/kfree interface.
+ */
+struct gen_pool *gen_pool_create(int min_alloc_order, int nid)
+{
+       struct gen_pool *pool;
+
+       pool = kmalloc_node(sizeof(struct gen_pool), GFP_KERNEL, nid);
+       if (pool != NULL) {
+               rwlock_init(&pool->lock);
+               INIT_LIST_HEAD(&pool->chunks);
+               pool->min_alloc_order = min_alloc_order;
+       }
+       return pool;
+}
+EXPORT_SYMBOL(gen_pool_create);
+
+/**
+ * gen_pool_add - add a new chunk of special memory to the pool
+ * @pool: pool to add new memory chunk to
+ * @addr: starting address of memory chunk to add to pool
+ * @size: size in bytes of the memory chunk to add to pool
+ * @nid: node id of the node the chunk structure and bitmap should be
+ *       allocated on, or -1
+ *
+ * Add a new chunk of special memory to the specified pool.
+ */
+int gen_pool_add(struct gen_pool *pool, unsigned long addr, size_t size,
+                int nid)
+{
+       struct gen_pool_chunk *chunk;
+       int nbits = size >> pool->min_alloc_order;
+       int nbytes = sizeof(struct gen_pool_chunk) +
+                               (nbits + BITS_PER_BYTE - 1) / BITS_PER_BYTE;
+
+       chunk = kmalloc_node(nbytes, GFP_KERNEL, nid);
+       if (unlikely(chunk == NULL))
+               return -1;
+
+       memset(chunk, 0, nbytes);
+       spin_lock_init(&chunk->lock);
+       chunk->start_addr = addr;
+       chunk->end_addr = addr + size;
+
+       write_lock(&pool->lock);
+       list_add(&chunk->next_chunk, &pool->chunks);
+       write_unlock(&pool->lock);
+
+       return 0;
+}
+EXPORT_SYMBOL(gen_pool_add);
+
+/**
+ * gen_pool_destroy - destroy a special memory pool
+ * @pool: pool to destroy
+ *
+ * Destroy the specified special memory pool. Verifies that there are no
+ * outstanding allocations.
+ */
+void gen_pool_destroy(struct gen_pool *pool)
+{
+       struct list_head *_chunk, *_next_chunk;
+       struct gen_pool_chunk *chunk;
+       int order = pool->min_alloc_order;
+       int bit, end_bit;
+
+
+       write_lock(&pool->lock);
+       list_for_each_safe(_chunk, _next_chunk, &pool->chunks) {
+               chunk = list_entry(_chunk, struct gen_pool_chunk, next_chunk);
+               list_del(&chunk->next_chunk);
+
+               end_bit = (chunk->end_addr - chunk->start_addr) >> order;
+               bit = find_next_bit(chunk->bits, end_bit, 0);
+               BUG_ON(bit < end_bit);
+
+               kfree(chunk);
+       }
+       kfree(pool);
+       return;
+}
+EXPORT_SYMBOL(gen_pool_destroy);
+
+/**
+ * gen_pool_alloc - allocate special memory from the pool
+ * @pool: pool to allocate from
+ * @size: number of bytes to allocate from the pool
+ *
+ * Allocate the requested number of bytes from the specified pool.
+ * Uses a first-fit algorithm.
+ */
+unsigned long gen_pool_alloc(struct gen_pool *pool, size_t size)
+{
+       struct list_head *_chunk;
+       struct gen_pool_chunk *chunk;
+       unsigned long addr, flags;
+       int order = pool->min_alloc_order;
+       int nbits, bit, start_bit, end_bit;
+
+       if (size == 0)
+               return 0;
+
+       nbits = (size + (1UL << order) - 1) >> order;
+
+       read_lock(&pool->lock);
+       list_for_each(_chunk, &pool->chunks) {
+               chunk = list_entry(_chunk, struct gen_pool_chunk, next_chunk);
+
+               end_bit = (chunk->end_addr - chunk->start_addr) >> order;
+               end_bit -= nbits + 1;
+
+               spin_lock_irqsave(&chunk->lock, flags);
+               bit = -1;
+               while (bit + 1 < end_bit) {
+                       bit = find_next_zero_bit(chunk->bits, end_bit, bit + 1);
+                       if (bit >= end_bit)
+                               break;
+
+                       start_bit = bit;
+                       if (nbits > 1) {
+                               bit = find_next_bit(chunk->bits, bit + nbits,
+                                                       bit + 1);
+                               if (bit - start_bit < nbits)
+                                       continue;
+                       }
+
+                       addr = chunk->start_addr +
+                                           ((unsigned long)start_bit << order);
+                       while (nbits--)
+                               __set_bit(start_bit++, &chunk->bits);
+                       spin_unlock_irqrestore(&chunk->lock, flags);
+                       read_unlock(&pool->lock);
+                       return addr;
+               }
+               spin_unlock_irqrestore(&chunk->lock, flags);
+       }
+       read_unlock(&pool->lock);
+       return 0;
+}
+EXPORT_SYMBOL(gen_pool_alloc);
+
+/**
+ * gen_pool_free - free allocated special memory back to the pool
+ * @pool: pool to free to
+ * @addr: starting address of memory to free back to pool
+ * @size: size in bytes of memory to free
+ *
+ * Free previously allocated special memory back to the specified pool.
+ */
+void gen_pool_free(struct gen_pool *pool, unsigned long addr, size_t size)
+{
+       struct list_head *_chunk;
+       struct gen_pool_chunk *chunk;
+       unsigned long flags;
+       int order = pool->min_alloc_order;
+       int bit, nbits;
+
+       nbits = (size + (1UL << order) - 1) >> order;
+
+       read_lock(&pool->lock);
+       list_for_each(_chunk, &pool->chunks) {
+               chunk = list_entry(_chunk, struct gen_pool_chunk, next_chunk);
+
+               if (addr >= chunk->start_addr && addr < chunk->end_addr) {
+                       BUG_ON(addr + size > chunk->end_addr);
+                       spin_lock_irqsave(&chunk->lock, flags);
+                       bit = (addr - chunk->start_addr) >> order;
+                       while (nbits--)
+                               __clear_bit(bit++, &chunk->bits);
+                       spin_unlock_irqrestore(&chunk->lock, flags);
+                       break;
+               }
+       }
+       BUG_ON(nbits > 0);
+       read_unlock(&pool->lock);
+}
+EXPORT_SYMBOL(gen_pool_free);
diff --git a/kernel_addons/backport/2.6.9_U4/include/src/kfifo.c 
b/kernel_addons/backport/2.6.9_U4/include/src/kfifo.c
new file mode 100644
index 0000000..5d1d907
--- /dev/null
+++ b/kernel_addons/backport/2.6.9_U4/include/src/kfifo.c
@@ -0,0 +1,196 @@
+/*
+ * A simple kernel FIFO implementation.
+ *
+ * Copyright (C) 2004 Stelian Pop <[EMAIL PROTECTED]>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/slab.h>
+#include <linux/err.h>
+#include <linux/kfifo.h>
+
+/**
+ * kfifo_init - allocates a new FIFO using a preallocated buffer
+ * @buffer: the preallocated buffer to be used.
+ * @size: the size of the internal buffer, this have to be a power of 2.
+ * @gfp_mask: get_free_pages mask, passed to kmalloc()
+ * @lock: the lock to be used to protect the fifo buffer
+ *
+ * Do NOT pass the kfifo to kfifo_free() after use ! Simply free the
+ * struct kfifo with kfree().
+ */
+struct kfifo *kfifo_init(unsigned char *buffer, unsigned int size,
+                        gfp_t gfp_mask, spinlock_t *lock)
+{
+       struct kfifo *fifo;
+
+       /* size must be a power of 2 */
+       BUG_ON(size & (size - 1));
+
+       fifo = kmalloc(sizeof(struct kfifo), gfp_mask);
+       if (!fifo)
+               return ERR_PTR(-ENOMEM);
+
+       fifo->buffer = buffer;
+       fifo->size = size;
+       fifo->in = fifo->out = 0;
+       fifo->lock = lock;
+
+       return fifo;
+}
+EXPORT_SYMBOL(kfifo_init);
+
+/**
+ * kfifo_alloc - allocates a new FIFO and its internal buffer
+ * @size: the size of the internal buffer to be allocated.
+ * @gfp_mask: get_free_pages mask, passed to kmalloc()
+ * @lock: the lock to be used to protect the fifo buffer
+ *
+ * The size will be rounded-up to a power of 2.
+ */
+struct kfifo *kfifo_alloc(unsigned int size, gfp_t gfp_mask, spinlock_t *lock)
+{
+       unsigned char *buffer;
+       struct kfifo *ret;
+
+       /*
+        * round up to the next power of 2, since our 'let the indices
+        * wrap' tachnique works only in this case.
+        */
+       if (size & (size - 1)) {
+               BUG_ON(size > 0x80000000);
+               size = roundup_pow_of_two(size);
+       }
+
+       buffer = kmalloc(size, gfp_mask);
+       if (!buffer)
+               return ERR_PTR(-ENOMEM);
+
+       ret = kfifo_init(buffer, size, gfp_mask, lock);
+
+       if (IS_ERR(ret))
+               kfree(buffer);
+
+       return ret;
+}
+EXPORT_SYMBOL(kfifo_alloc);
+
+/**
+ * kfifo_free - frees the FIFO
+ * @fifo: the fifo to be freed.
+ */
+void kfifo_free(struct kfifo *fifo)
+{
+       kfree(fifo->buffer);
+       kfree(fifo);
+}
+EXPORT_SYMBOL(kfifo_free);
+
+/**
+ * __kfifo_put - puts some data into the FIFO, no locking version
+ * @fifo: the fifo to be used.
+ * @buffer: the data to be added.
+ * @len: the length of the data to be added.
+ *
+ * This function copies at most 'len' bytes from the 'buffer' into
+ * the FIFO depending on the free space, and returns the number of
+ * bytes copied.
+ *
+ * Note that with only one concurrent reader and one concurrent
+ * writer, you don't need extra locking to use these functions.
+ */
+unsigned int __kfifo_put(struct kfifo *fifo,
+                        unsigned char *buffer, unsigned int len)
+{
+       unsigned int l;
+
+       len = min(len, fifo->size - fifo->in + fifo->out);
+
+       /*
+        * Ensure that we sample the fifo->out index -before- we
+        * start putting bytes into the kfifo.
+        */
+
+       smp_mb();
+
+       /* first put the data starting from fifo->in to buffer end */
+       l = min(len, fifo->size - (fifo->in & (fifo->size - 1)));
+       memcpy(fifo->buffer + (fifo->in & (fifo->size - 1)), buffer, l);
+
+       /* then put the rest (if any) at the beginning of the buffer */
+       memcpy(fifo->buffer, buffer + l, len - l);
+
+       /*
+        * Ensure that we add the bytes to the kfifo -before-
+        * we update the fifo->in index.
+        */
+
+       smp_wmb();
+
+       fifo->in += len;
+
+       return len;
+}
+EXPORT_SYMBOL(__kfifo_put);
+
+/**
+ * __kfifo_get - gets some data from the FIFO, no locking version
+ * @fifo: the fifo to be used.
+ * @buffer: where the data must be copied.
+ * @len: the size of the destination buffer.
+ *
+ * This function copies at most 'len' bytes from the FIFO into the
+ * 'buffer' and returns the number of copied bytes.
+ *
+ * Note that with only one concurrent reader and one concurrent
+ * writer, you don't need extra locking to use these functions.
+ */
+unsigned int __kfifo_get(struct kfifo *fifo,
+                        unsigned char *buffer, unsigned int len)
+{
+       unsigned int l;
+
+       len = min(len, fifo->in - fifo->out);
+
+       /*
+        * Ensure that we sample the fifo->in index -before- we
+        * start removing bytes from the kfifo.
+        */
+
+       smp_rmb();
+
+       /* first get the data from fifo->out until the end of the buffer */
+       l = min(len, fifo->size - (fifo->out & (fifo->size - 1)));
+       memcpy(buffer, fifo->buffer + (fifo->out & (fifo->size - 1)), l);
+
+       /* then get the rest (if any) from the beginning of the buffer */
+       memcpy(buffer + l, fifo->buffer, len - l);
+
+       /*
+        * Ensure that we remove the bytes from the kfifo -before-
+        * we update the fifo->out index.
+        */
+
+       smp_mb();
+
+       fifo->out += len;
+
+       return len;
+}
+EXPORT_SYMBOL(__kfifo_get);
diff --git a/kernel_addons/backport/2.6.9_U4/include/src/netevent.c 
b/kernel_addons/backport/2.6.9_U4/include/src/netevent.c
new file mode 100644
index 0000000..5ffadd1
--- /dev/null
+++ b/kernel_addons/backport/2.6.9_U4/include/src/netevent.c
@@ -0,0 +1,71 @@
+/*
+ *     Network event notifiers
+ *
+ *     Authors:
+ *      Tom Tucker             <[EMAIL PROTECTED]>
+ *      Steve Wise             <[EMAIL PROTECTED]>
+ *
+ *     This program is free software; you can redistribute it and/or
+ *      modify it under the terms of the GNU General Public License
+ *      as published by the Free Software Foundation; either version
+ *      2 of the License, or (at your option) any later version.
+ *
+ *     Fixes:
+ */
+
+#include <linux/module.h>
+#include <linux/skbuff.h>
+#include <linux/rtnetlink.h>
+#include <linux/notifier.h>
+
+static struct notifier_block *netevent_notif_chain;
+
+/**
+ *     register_netevent_notifier - register a netevent notifier block
+ *     @nb: notifier
+ *
+ *     Register a notifier to be called when a netevent occurs.
+ *     The notifier passed is linked into the kernel structures and must
+ *     not be reused until it has been unregistered. A negative errno code
+ *     is returned on a failure.
+ */
+int register_netevent_notifier(struct notifier_block *nb)
+{
+       int err;
+
+       err = notifier_chain_register(&netevent_notif_chain, nb);
+       return err;
+}
+
+/**
+ *     netevent_unregister_notifier - unregister a netevent notifier block
+ *     @nb: notifier
+ *
+ *     Unregister a notifier previously registered by
+ *     register_neigh_notifier(). The notifier is unlinked into the
+ *     kernel structures and may then be reused. A negative errno code
+ *     is returned on a failure.
+ */
+
+int unregister_netevent_notifier(struct notifier_block *nb)
+{
+       return notifier_chain_unregister(&netevent_notif_chain, nb);
+}
+
+/**
+ *     call_netevent_notifiers - call all netevent notifier blocks
+ *      @val: value passed unmodified to notifier function
+ *      @v:   pointer passed unmodified to notifier function
+ *
+ *     Call all neighbour notifier blocks.  Parameters and return value
+ *     are as for notifier_call_chain().
+ */
+
+int call_netevent_notifiers(unsigned long val, void *v)
+{
+       return notifier_call_chain(&netevent_notif_chain, val, v);
+}
+
+EXPORT_SYMBOL_GPL(register_netevent_notifier);
+EXPORT_SYMBOL_GPL(unregister_netevent_notifier);
+EXPORT_SYMBOL_GPL(call_netevent_notifiers);
diff --git a/kernel_patches/backport/2.6.9_U4/cxgb3_main_to_2_6_13.patch 
b/kernel_patches/backport/2.6.9_U4/cxgb3_main_to_2_6_13.patch
new file mode 100644
index 0000000..e6781f3
--- /dev/null
+++ b/kernel_patches/backport/2.6.9_U4/cxgb3_main_to_2_6_13.patch
@@ -0,0 +1,12 @@
+diff --git a/drivers/net/cxgb3/cxgb3_main.c b/drivers/net/cxgb3/cxgb3_main.c
+index dfa035a..414ea84 100755
+--- a/drivers/net/cxgb3/cxgb3_main.c
++++ b/drivers/net/cxgb3/cxgb3_main.c
+@@ -1526,7 +1526,6 @@ static const struct ethtool_ops cxgb_eth
+       .get_wol = get_wol,
+       .get_tso = ethtool_op_get_tso,
+       .set_tso = ethtool_op_set_tso,
+-      .get_perm_addr = ethtool_op_get_perm_addr
+ };
+ 
+ static int in_range(int val, int lo, int hi)
diff --git a/kernel_patches/backport/2.6.9_U4/cxgb3_makefile_to_2_6_19.patch 
b/kernel_patches/backport/2.6.9_U4/cxgb3_makefile_to_2_6_19.patch
new file mode 100644
index 0000000..ad7e7f4
--- /dev/null
+++ b/kernel_patches/backport/2.6.9_U4/cxgb3_makefile_to_2_6_19.patch
@@ -0,0 +1,12 @@
+diff --git a/drivers/net/cxgb3/Makefile b/drivers/net/cxgb3/Makefile
+index 3434679..bb008b6 100755
+--- a/drivers/net/cxgb3/Makefile
++++ b/drivers/net/cxgb3/Makefile
+@@ -1,6 +1,7 @@
+ #
+ # Chelsio T3 driver
+ #
++NOSTDINC_FLAGS:= $(NOSTDINC_FLAGS) $(LINUXINCLUDE)
+ 
+ obj-$(CONFIG_CHELSIO_T3) += cxgb3.o
+ 
diff --git a/kernel_patches/backport/2.6.9_U4/iwch_cm_to_2_6_9_U4.patch 
b/kernel_patches/backport/2.6.9_U4/iwch_cm_to_2_6_9_U4.patch
new file mode 100644
index 0000000..f8f51d6
--- /dev/null
+++ b/kernel_patches/backport/2.6.9_U4/iwch_cm_to_2_6_9_U4.patch
@@ -0,0 +1,13 @@
+diff --git a/drivers/infiniband/hw/cxgb3/iwch_cm.c 
b/drivers/infiniband/hw/cxgb3/iwch_cm.c
+index 3237fc8..2a38953 100644
+--- a/drivers/infiniband/hw/cxgb3/iwch_cm.c
++++ b/drivers/infiniband/hw/cxgb3/iwch_cm.c
+@@ -338,7 +338,7 @@ static struct rtable *find_route(struct 
+                         }
+       };
+ 
+-      if (ip_route_output_flow(&rt, &fl, NULL, 0))
++      if (ip_route_output_key(&rt, &fl))
+               return NULL;
+       return rt;
+ }
diff --git a/kernel_patches/backport/2.6.9_U4/linux_stuff_to_2_6_17.patch 
b/kernel_patches/backport/2.6.9_U4/linux_stuff_to_2_6_17.patch
new file mode 100644
index 0000000..e84b964
--- /dev/null
+++ b/kernel_patches/backport/2.6.9_U4/linux_stuff_to_2_6_17.patch
@@ -0,0 +1,31 @@
+diff --git a/drivers/infiniband/core/genalloc.c 
b/drivers/infiniband/core/genalloc.c
+new file mode 100644
+index 0000000..58cf933
+--- /dev/null
++++ b/drivers/infiniband/core/genalloc.c
+@@ -0,0 +1 @@
++#include "src/genalloc.c"
+diff --git a/drivers/infiniband/core/netevent.c 
b/drivers/infiniband/core/netevent.c
+new file mode 100644
+index 0000000..58cf933
+--- /dev/null
++++ b/drivers/infiniband/core/netevent.c
+@@ -0,0 +1 @@
++#include "src/netevent.c"
+diff --git a/drivers/infiniband/core/kfifo.c b/drivers/infiniband/core/kfifo.c
+new file mode 100644
+index 0000000..58cf933
+--- /dev/null
++++ b/drivers/infiniband/core/kfifo.c
+@@ -0,0 +1 @@
++#include "src/kfifo.c"
+diff --git a/drivers/infiniband/core/Makefile 
b/drivers/infiniband/core/Makefile
+index 50fb1cd..456bfd0 100644
+--- a/drivers/infiniband/core/Makefile
++++ b/drivers/infiniband/core/Makefile
+@@ -30,3 +30,5 @@ ib_ucm-y :=                  ucm.o
+ 
+ ib_uverbs-y :=                        uverbs_main.o uverbs_cmd.o uverbs_mem.o 
\
+                               uverbs_marshall.o
++
++ib_core-y +=                  genalloc.o netevent.o kfifo.o
diff --git 
a/kernel_patches/backport/2.6.9_U4/mthca_provider_3465_to_2_6_9.patch 
b/kernel_patches/backport/2.6.9_U4/mthca_provider_3465_to_2_6_9.patch
deleted file mode 100644
index a3febff..0000000
--- a/kernel_patches/backport/2.6.9_U4/mthca_provider_3465_to_2_6_9.patch
+++ /dev/null
@@ -1,15 +0,0 @@
-Index: linux-kernel/drivers/infiniband/hw/mthca/mthca_provider.c
-===================================================================
---- linux-kernel.orig/drivers/infiniband/hw/mthca/mthca_provider.c     
2005-11-24 14:01:20.000000000 +0200
-+++ linux-kernel/drivers/infiniband/hw/mthca/mthca_provider.c  2005-11-24 
14:03:14.000000000 +0200
-@@ -359,8 +359,8 @@ static int mthca_mmap_uar(struct ib_ucon
- 
-       vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
- 
--      if (io_remap_pfn_range(vma, vma->vm_start,
--                             to_mucontext(context)->uar.pfn,
-+      if (remap_page_range(vma, vma->vm_start,
-+                             (to_mucontext(context)->uar.pfn) << PAGE_SHIFT,
-                              PAGE_SIZE, vma->vm_page_prot))
-               return -EAGAIN;
- 
diff --git a/kernel_patches/backport/2.6.9_U4/t3_hw_to_2_6_5-7_244.patch 
b/kernel_patches/backport/2.6.9_U4/t3_hw_to_2_6_5-7_244.patch
new file mode 100644
index 0000000..a667be0
--- /dev/null
+++ b/kernel_patches/backport/2.6.9_U4/t3_hw_to_2_6_5-7_244.patch
@@ -0,0 +1,43 @@
+diff --git a/drivers/net/cxgb3/adapter.h b/drivers/net/cxgb3/adapter.h
+index 463ca32..b931fd2 100755
+--- a/drivers/net/cxgb3/adapter.h
++++ b/drivers/net/cxgb3/adapter.h
+@@ -179,6 +179,7 @@ struct adapter {
+       struct list_head adapter_list;
+       void __iomem *regs;
+       struct pci_dev *pdev;
++      u32 saved_pci_state[16];
+       unsigned long registered_device_map;
+       unsigned long open_device_map;
+       unsigned long flags;
+diff --git a/drivers/net/cxgb3/t3_hw.c b/drivers/net/cxgb3/t3_hw.c
+index 14ea6b9..f13f581 100755
+--- a/drivers/net/cxgb3/t3_hw.c
++++ b/drivers/net/cxgb3/t3_hw.c
+@@ -3250,7 +3250,7 @@ int t3_reset_adapter(struct adapter *ada
+       uint16_t devid = 0;
+ 
+       if (is_pcie(adapter))
+-              pci_save_state(adapter->pdev);
++              pci_save_state(adapter->pdev, adapter->saved_pci_state);
+       t3_write_reg(adapter, A_PL_RST, F_CRSTWRM | F_CRSTWRMMODE);
+ 
+       /*
+@@ -3268,7 +3268,7 @@ int t3_reset_adapter(struct adapter *ada
+               return -1;
+ 
+       if (is_pcie(adapter))
+-              pci_restore_state(adapter->pdev);
++              pci_restore_state(adapter->pdev, adapter->saved_pci_state);
+       return 0;
+ }
+ 
+@@ -3357,8 +3357,6 @@ int __devinit t3_prep_adapter(struct ada
+ 
+               memcpy(adapter->port[i]->dev_addr, hw_addr,
+                      ETH_ALEN);
+-              memcpy(adapter->port[i]->perm_addr, hw_addr,
+-                     ETH_ALEN);
+               init_link_config(&p->link_config, p->port_type->caps);
+               p->phy.ops->power_down(&p->phy, 1);
+               if (!(p->port_type->caps & SUPPORTED_IRQ))

_______________________________________________
openib-general mailing list
openib-general@openib.org
http://openib.org/mailman/listinfo/openib-general

To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general

Reply via email to