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

Reply via email to