Applied. Regards, Vladimir
On Wed, 2007-01-17 at 13:50 -0600, Steve Wise wrote: > Backport Chelsio to sles9sp3 > > Signed-off-by: Steve Wise <[EMAIL PROTECTED]> > --- > > .../2.6.5_sles9_sp3/include/linux/ethtool.h | 9 + > .../2.6.5_sles9_sp3/include/linux/genalloc.h | 42 +++++ > .../2.6.5_sles9_sp3/include/linux/interrupt.h | 17 ++ > .../backport/2.6.5_sles9_sp3/include/linux/kfifo.h | 157 ++++++++++++++++++ > .../backport/2.6.5_sles9_sp3/include/linux/mii.h | 18 ++ > .../backport/2.6.5_sles9_sp3/include/linux/mm.h | 20 ++ > .../2.6.5_sles9_sp3/include/linux/netdevice.h | 13 ++ > .../backport/2.6.5_sles9_sp3/include/linux/pci.h | 2 > .../2.6.5_sles9_sp3/include/linux/random.h | 15 ++ > .../2.6.5_sles9_sp3/include/linux/skbuff.h | 3 > .../backport/2.6.5_sles9_sp3/include/linux/slab.h | 19 -- > .../2.6.5_sles9_sp3/include/linux/spinlock.h | 8 + > .../backport/2.6.5_sles9_sp3/include/linux/types.h | 2 > .../2.6.5_sles9_sp3/include/linux/workqueue.h | 8 + > .../backport/2.6.5_sles9_sp3/include/net/dst.h | 17 ++ > .../2.6.5_sles9_sp3/include/net/neighbour.h | 7 + > .../2.6.5_sles9_sp3/include/net/netevent.h | 33 ++++ > .../2.6.5_sles9_sp3/include/src/genalloc.c | 198 > +++++++++++++++++++++++ > .../backport/2.6.5_sles9_sp3/include/src/kfifo.c | 196 > +++++++++++++++++++++++ > .../2.6.5_sles9_sp3/include/src/netevent.c | 71 ++++++++ > .../2.6.5_sles9_sp3/cxgb3_main_to_2_6_13.patch | 12 + > .../2.6.5_sles9_sp3/cxgb3_makefile_to_2_6_19.patch | 12 + > .../2.6.5_sles9_sp3/iwch_cm_to_2_6_5-7_244.patch | 35 ++++ > .../linux_stream_idr_to_2_6_5-7_244.patch | 25 --- > .../linux_stuff_to_2_6_5-7_244.patch | 46 +++++ > .../mthca_provider_3465_to_2_6_9.patch | 15 -- > .../2.6.5_sles9_sp3/t3_hw_to_2_6_5-7_244.patch | 43 +++++ > 27 files changed, 985 insertions(+), 58 deletions(-) > > diff --git a/kernel_addons/backport/2.6.5_sles9_sp3/include/linux/ethtool.h > b/kernel_addons/backport/2.6.5_sles9_sp3/include/linux/ethtool.h > new file mode 100644 > index 0000000..d03127c > --- /dev/null > +++ b/kernel_addons/backport/2.6.5_sles9_sp3/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.5_sles9_sp3/include/linux/genalloc.h > b/kernel_addons/backport/2.6.5_sles9_sp3/include/linux/genalloc.h > new file mode 100644 > index 0000000..3c23c68 > --- /dev/null > +++ b/kernel_addons/backport/2.6.5_sles9_sp3/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.5_sles9_sp3/include/linux/interrupt.h > b/kernel_addons/backport/2.6.5_sles9_sp3/include/linux/interrupt.h > new file mode 100644 > index 0000000..66e66a9 > --- /dev/null > +++ b/kernel_addons/backport/2.6.5_sles9_sp3/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.5_sles9_sp3/include/linux/kfifo.h > b/kernel_addons/backport/2.6.5_sles9_sp3/include/linux/kfifo.h > new file mode 100644 > index 0000000..48eccd8 > --- /dev/null > +++ b/kernel_addons/backport/2.6.5_sles9_sp3/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.5_sles9_sp3/include/linux/mii.h > b/kernel_addons/backport/2.6.5_sles9_sp3/include/linux/mii.h > new file mode 100644 > index 0000000..3ba8e73 > --- /dev/null > +++ b/kernel_addons/backport/2.6.5_sles9_sp3/include/linux/mii.h > @@ -0,0 +1,18 @@ > +#ifndef BACKPORT_LINUX_MII_TO_SLES9SP3 > +#define BACKPORT_LINUX_MII_TO_SLES9SP3 > + > +#include_next <linux/mii.h> > + > +#define BMCR_SPEED1000 0x0040 /* MSB of Speed (1000) */ > +#define ADVERTISE_PAUSE_CAP 0x0400 /* Try for pause */ > +#define ADVERTISE_PAUSE_ASYM 0x0800 /* Try for asymetric pause */ > +#define MII_CTRL1000 0x09 /* 1000BASE-T control */ > +#define ADVERTISE_1000FULL 0x0200 /* Advertise 1000BASE-T full duplex > */ > +#define ADVERTISE_1000HALF 0x0100 /* Advertise 1000BASE-T half duplex > */ > + > +static inline struct mii_ioctl_data *if_mii(struct ifreq *rq) > +{ > + return (struct mii_ioctl_data *) &rq->ifr_ifru; > +} > + > +#endif > diff --git a/kernel_addons/backport/2.6.5_sles9_sp3/include/linux/mm.h > b/kernel_addons/backport/2.6.5_sles9_sp3/include/linux/mm.h > new file mode 100644 > index 0000000..77ee6fc > --- /dev/null > +++ b/kernel_addons/backport/2.6.5_sles9_sp3/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.5_sles9_sp3/include/linux/netdevice.h > b/kernel_addons/backport/2.6.5_sles9_sp3/include/linux/netdevice.h > index 5641019..2e18642 100644 > --- a/kernel_addons/backport/2.6.5_sles9_sp3/include/linux/netdevice.h > +++ b/kernel_addons/backport/2.6.5_sles9_sp3/include/linux/netdevice.h > @@ -15,4 +15,17 @@ 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) > + > +#define NETDEV_TX_OK 0 /* driver took care of packet */ > +#define NETDEV_TX_BUSY 1 /* driver tx path was busy*/ > +#define NETDEV_TX_LOCKED -1 /* driver tx lock was already taken */ > + > #endif > diff --git a/kernel_addons/backport/2.6.5_sles9_sp3/include/linux/pci.h > b/kernel_addons/backport/2.6.5_sles9_sp3/include/linux/pci.h > index b43b19c..beb954b 100644 > --- a/kernel_addons/backport/2.6.5_sles9_sp3/include/linux/pci.h > +++ b/kernel_addons/backport/2.6.5_sles9_sp3/include/linux/pci.h > @@ -6,6 +6,8 @@ #include_next <linux/pci.h> > #define PCI_EXP_DEVCTL 8 /* Device Control */ > #define PCI_EXP_LNKCTL 16 /* Link Control */ > #define PCI_EXP_DEVCTL_READRQ 0x7000 /* Max_Read_Request_Size */ > +#define PCI_EXP_DEVCTL_PAYLOAD 0x00e0 /* Max_Payload_Size */ > +#define PCI_EXP_LNKSTA 18 /* Link Status */ > > struct msix_entry { > u16 vector; /* kernel uses to write allocated vector */ > diff --git a/kernel_addons/backport/2.6.5_sles9_sp3/include/linux/random.h > b/kernel_addons/backport/2.6.5_sles9_sp3/include/linux/random.h > new file mode 100644 > index 0000000..2ea2e1f > --- /dev/null > +++ b/kernel_addons/backport/2.6.5_sles9_sp3/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.5_sles9_sp3/include/linux/skbuff.h > b/kernel_addons/backport/2.6.5_sles9_sp3/include/linux/skbuff.h > index cc56236..0d91d86 100644 > --- a/kernel_addons/backport/2.6.5_sles9_sp3/include/linux/skbuff.h > +++ b/kernel_addons/backport/2.6.5_sles9_sp3/include/linux/skbuff.h > @@ -4,6 +4,7 @@ #define LINUX_SKBUFF_H_BACKPORT > #include_next <linux/skbuff.h> > > #define CHECKSUM_PARTIAL CHECKSUM_HW > +#define CHECKSUM_COMPLETE CHECKSUM_HW > > /** > * skb_header_release - release reference to header > @@ -41,4 +42,6 @@ static inline int skb_can_coalesce(struc > return 0; > } > > +#define gso_size tso_size > + > #endif > diff --git a/kernel_addons/backport/2.6.5_sles9_sp3/include/linux/slab.h > b/kernel_addons/backport/2.6.5_sles9_sp3/include/linux/slab.h > index 0540cc6..c8285ac 100644 > --- a/kernel_addons/backport/2.6.5_sles9_sp3/include/linux/slab.h > +++ b/kernel_addons/backport/2.6.5_sles9_sp3/include/linux/slab.h > @@ -12,12 +12,6 @@ static inline void *kzalloc(size_t size, > return ret; > } > > -#endif > -#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) > { > @@ -29,19 +23,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.5_sles9_sp3/include/linux/spinlock.h > b/kernel_addons/backport/2.6.5_sles9_sp3/include/linux/spinlock.h > index 4644d50..00506f4 100644 > --- a/kernel_addons/backport/2.6.5_sles9_sp3/include/linux/spinlock.h > +++ b/kernel_addons/backport/2.6.5_sles9_sp3/include/linux/spinlock.h > @@ -3,6 +3,7 @@ #define BACKPORT_LINUX_SPINLOCK_H > > #include_next <linux/spinlock.h> > #define DEFINE_SPINLOCK(x) spinlock_t x = SPIN_LOCK_UNLOCKED > +#define DEFINE_RWLOCK(x) rwlock_t x = RW_LOCK_UNLOCKED > > #define spin_trylock_irqsave(lock, flags) \ > ({ \ > @@ -13,4 +14,11 @@ ({ \ > > #define spin_lock_nested(lock, subclass) spin_lock(lock) > > +#define spin_trylock_irq(lock) \ > +({ \ > + local_irq_disable(); \ > + spin_trylock(lock) ? \ > + 1 : ({ local_irq_enable(); 0; }); \ > +}) > + > #endif > diff --git a/kernel_addons/backport/2.6.5_sles9_sp3/include/linux/types.h > b/kernel_addons/backport/2.6.5_sles9_sp3/include/linux/types.h > index c06977a..53c7a33 100644 > --- a/kernel_addons/backport/2.6.5_sles9_sp3/include/linux/types.h > +++ b/kernel_addons/backport/2.6.5_sles9_sp3/include/linux/types.h > @@ -7,4 +7,6 @@ #ifdef __KERNEL__ > typedef unsigned int gfp_t; > #endif > > +#define BITS_PER_BYTE 8 > + > #endif > diff --git a/kernel_addons/backport/2.6.5_sles9_sp3/include/linux/workqueue.h > b/kernel_addons/backport/2.6.5_sles9_sp3/include/linux/workqueue.h > index 330f47f..c054ed2 100644 > --- a/kernel_addons/backport/2.6.5_sles9_sp3/include/linux/workqueue.h > +++ b/kernel_addons/backport/2.6.5_sles9_sp3/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.5_sles9_sp3/include/net/dst.h > b/kernel_addons/backport/2.6.5_sles9_sp3/include/net/dst.h > new file mode 100644 > index 0000000..69cca51 > --- /dev/null > +++ b/kernel_addons/backport/2.6.5_sles9_sp3/include/net/dst.h > @@ -0,0 +1,17 @@ > +#ifndef BACKPORT_NET_DST_2_6_11 > +#define BACKPORT_NET_DST_2_6_11 > + > +#include <linux/skbuff.h> > +#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.5_sles9_sp3/include/net/neighbour.h > b/kernel_addons/backport/2.6.5_sles9_sp3/include/net/neighbour.h > new file mode 100644 > index 0000000..573320d > --- /dev/null > +++ b/kernel_addons/backport/2.6.5_sles9_sp3/include/net/neighbour.h > @@ -0,0 +1,7 @@ > +#ifndef BACKPORT_LINUX_NEIGHBOUR_TO_SLES9SP3 > +#define BACKPORT_LINUX_NEIGHBOUR_TO_SLES9SP3 > + > +#include <net/arp.h> > +#include_next <net/neighbour.h> > + > +#endif > diff --git a/kernel_addons/backport/2.6.5_sles9_sp3/include/net/netevent.h > b/kernel_addons/backport/2.6.5_sles9_sp3/include/net/netevent.h > new file mode 100644 > index 0000000..e5d2162 > --- /dev/null > +++ b/kernel_addons/backport/2.6.5_sles9_sp3/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.5_sles9_sp3/include/src/genalloc.c > b/kernel_addons/backport/2.6.5_sles9_sp3/include/src/genalloc.c > new file mode 100644 > index 0000000..75ae68c > --- /dev/null > +++ b/kernel_addons/backport/2.6.5_sles9_sp3/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.5_sles9_sp3/include/src/kfifo.c > b/kernel_addons/backport/2.6.5_sles9_sp3/include/src/kfifo.c > new file mode 100644 > index 0000000..5d1d907 > --- /dev/null > +++ b/kernel_addons/backport/2.6.5_sles9_sp3/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.5_sles9_sp3/include/src/netevent.c > b/kernel_addons/backport/2.6.5_sles9_sp3/include/src/netevent.c > new file mode 100644 > index 0000000..5ffadd1 > --- /dev/null > +++ b/kernel_addons/backport/2.6.5_sles9_sp3/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.5_sles9_sp3/cxgb3_main_to_2_6_13.patch > b/kernel_patches/backport/2.6.5_sles9_sp3/cxgb3_main_to_2_6_13.patch > new file mode 100644 > index 0000000..e6781f3 > --- /dev/null > +++ b/kernel_patches/backport/2.6.5_sles9_sp3/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.5_sles9_sp3/cxgb3_makefile_to_2_6_19.patch > b/kernel_patches/backport/2.6.5_sles9_sp3/cxgb3_makefile_to_2_6_19.patch > new file mode 100644 > index 0000000..ad7e7f4 > --- /dev/null > +++ b/kernel_patches/backport/2.6.5_sles9_sp3/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.5_sles9_sp3/iwch_cm_to_2_6_5-7_244.patch > b/kernel_patches/backport/2.6.5_sles9_sp3/iwch_cm_to_2_6_5-7_244.patch > new file mode 100644 > index 0000000..af468f7 > --- /dev/null > +++ b/kernel_patches/backport/2.6.5_sles9_sp3/iwch_cm_to_2_6_5-7_244.patch > @@ -0,0 +1,35 @@ > +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 > +@@ -234,7 +234,7 @@ static void *alloc_ep(int size, gfp_t gf > + epc = kmalloc(size, gfp); > + if (epc) { > + memset(epc, 0, size); > +- kref_init(&epc->kref); > ++ kref_init(&epc->kref, __free_ep); > + spin_lock_init(&epc->lock); > + init_waitqueue_head(&epc->waitq); > + } > +@@ -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/drivers/infiniband/hw/cxgb3/iwch_cm.h > b/drivers/infiniband/hw/cxgb3/iwch_cm.h > +index 893f9d0..e54e202 100644 > +--- a/drivers/infiniband/hw/cxgb3/iwch_cm.h > ++++ b/drivers/infiniband/hw/cxgb3/iwch_cm.h > +@@ -57,7 +57,7 @@ #define MPA_FLAGS_MASK 0xE0 > + #define put_ep(ep) { \ > + PDBG("put_ep (via %s:%u) ep %p refcnt %d\n", __FUNCTION__, __LINE__, \ > + ep, atomic_read(&((ep)->kref.refcount))); \ > +- kref_put(&((ep)->kref), __free_ep); \ > ++ kref_put(&((ep)->kref)); \ > + } > + > + #define get_ep(ep) { \ > diff --git > a/kernel_patches/backport/2.6.5_sles9_sp3/linux_stream_idr_to_2_6_5-7_244.patch > > b/kernel_patches/backport/2.6.5_sles9_sp3/linux_stream_idr_to_2_6_5-7_244.patch > deleted file mode 100644 > index 74d8403..0000000 > --- > a/kernel_patches/backport/2.6.5_sles9_sp3/linux_stream_idr_to_2_6_5-7_244.patch > +++ /dev/null > @@ -1,25 +0,0 @@ > -diff --git a/drivers/infiniband/core/Makefile > b/drivers/infiniband/core/Makefile > -index 163d991..2cd239f 100644 > ---- a/drivers/infiniband/core/Makefile > -+++ b/drivers/infiniband/core/Makefile > -@@ -26,3 +26,6 @@ ib_ucm-y := ucm.o > - > - ib_uverbs-y := uverbs_main.o uverbs_cmd.o uverbs_mem.o > \ > - uverbs_marshall.o > -+ > -+obj-$(CONFIG_INFINIBAND) += stream.o > -+ib_core-y += stream.o ib_idr.o > -diff --git a/drivers/infiniband/core/stream.c > b/drivers/infiniband/core/stream.c > -new file mode 100644 > -index 0000000..96a48fe > ---- /dev/null > -+++ b/drivers/infiniband/core/stream.c > -@@ -0,0 +1 @@ > -+#include "src/stream.c" > -diff --git a/drivers/infiniband/core/ib_idr.c > b/drivers/infiniband/core/ib_idr.c > -new file mode 100644 > -index 0000000..58cf933 > ---- /dev/null > -+++ b/drivers/infiniband/core/ib_idr.c > -@@ -0,0 +1 @@ > -+#include "src/ib_idr.c" > diff --git > a/kernel_patches/backport/2.6.5_sles9_sp3/linux_stuff_to_2_6_5-7_244.patch > b/kernel_patches/backport/2.6.5_sles9_sp3/linux_stuff_to_2_6_5-7_244.patch > new file mode 100644 > index 0000000..8733e1a > --- /dev/null > +++ b/kernel_patches/backport/2.6.5_sles9_sp3/linux_stuff_to_2_6_5-7_244.patch > @@ -0,0 +1,46 @@ > +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/stream.c > b/drivers/infiniband/core/stream.c > +new file mode 100644 > +index 0000000..96a48fe > +--- /dev/null > ++++ b/drivers/infiniband/core/stream.c > +@@ -0,0 +1 @@ > ++#include "src/stream.c" > +diff --git a/drivers/infiniband/core/ib_idr.c > b/drivers/infiniband/core/ib_idr.c > +new file mode 100644 > +index 0000000..58cf933 > +--- /dev/null > ++++ b/drivers/infiniband/core/ib_idr.c > +@@ -0,0 +1 @@ > ++#include "src/ib_idr.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,6 @@ ib_ucm-y := ucm.o > + > + ib_uverbs-y := uverbs_main.o uverbs_cmd.o uverbs_mem.o > \ > + uverbs_marshall.o > ++ > ++obj-$(CONFIG_INFINIBAND) += stream.o > ++ib_core-y += stream.o ib_idr.o genalloc.o netevent.o > kfifo.o > diff --git > a/kernel_patches/backport/2.6.5_sles9_sp3/mthca_provider_3465_to_2_6_9.patch > b/kernel_patches/backport/2.6.5_sles9_sp3/mthca_provider_3465_to_2_6_9.patch > deleted file mode 100644 > index a3febff..0000000 > --- > a/kernel_patches/backport/2.6.5_sles9_sp3/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.5_sles9_sp3/t3_hw_to_2_6_5-7_244.patch > b/kernel_patches/backport/2.6.5_sles9_sp3/t3_hw_to_2_6_5-7_244.patch > new file mode 100644 > index 0000000..a667be0 > --- /dev/null > +++ b/kernel_patches/backport/2.6.5_sles9_sp3/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 _______________________________________________ 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