[openib-general] [PATCH RFC 07/10] ofed_1_2 Backport Chelsio to 2.6.13

Steve Wise swise at opengridcomputing.com
Wed Jan 17 11:50:04 PST 2007


Backport Chelsio to 2.6.13

Signed-off-by: Steve Wise <swise at opengridcomputing.com>
---

 .../backport/2.6.13/include/linux/ethtool.h        |    9 +
 .../backport/2.6.13/include/linux/genalloc.h       |   42 +++++
 .../backport/2.6.13/include/linux/interrupt.h      |   17 ++
 .../backport/2.6.13/include/linux/netdevice.h      |    9 +
 .../backport/2.6.13/include/linux/random.h         |   15 ++
 .../backport/2.6.13/include/linux/skbuff.h         |    3 
 .../backport/2.6.13/include/linux/types.h          |    2 
 .../backport/2.6.13/include/linux/workqueue.h      |    9 +
 .../backport/2.6.13/include/net/netevent.h         |   33 ++++
 .../backport/2.6.13/include/src/genalloc.c         |  198 +++++++++++++++++++++++
 .../backport/2.6.13/include/src/netevent.c         |   71 ++++++++
 .../backport/2.6.13/cxgb3_main_to_2_6_13.patch     |   12 +
 .../backport/2.6.13/cxgb3_makefile_to_2_6_19.patch |   12 +
 .../backport/2.6.13/linux_stuff_to_2_6_17.patch    |   24 +++
 .../backport/2.6.13/t3_hw_to_2_6_13.patch          |   13 ++
 15 files changed, 468 insertions(+), 1 deletions(-)

diff --git a/kernel_addons/backport/2.6.13/include/linux/ethtool.h b/kernel_addons/backport/2.6.13/include/linux/ethtool.h
new file mode 100644
index 0000000..d03127c
--- /dev/null
+++ b/kernel_addons/backport/2.6.13/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.13/include/linux/genalloc.h b/kernel_addons/backport/2.6.13/include/linux/genalloc.h
new file mode 100644
index 0000000..3c23c68
--- /dev/null
+++ b/kernel_addons/backport/2.6.13/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.13/include/linux/interrupt.h b/kernel_addons/backport/2.6.13/include/linux/interrupt.h
new file mode 100644
index 0000000..66e66a9
--- /dev/null
+++ b/kernel_addons/backport/2.6.13/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.13/include/linux/netdevice.h b/kernel_addons/backport/2.6.13/include/linux/netdevice.h
index 5641019..2f12781 100644
--- a/kernel_addons/backport/2.6.13/include/linux/netdevice.h
+++ b/kernel_addons/backport/2.6.13/include/linux/netdevice.h
@@ -15,4 +15,13 @@ static inline void netif_tx_unlock(struc
 	spin_unlock(&dev->xmit_lock);
 }
 
+static inline int __netif_rx_schedule_prep(struct net_device *dev)
+{
+        return !test_and_set_bit(__LINK_STATE_RX_SCHED, &dev->state);
+}
+
+#undef SET_ETHTOOL_OPS
+#define SET_ETHTOOL_OPS(netdev, ops) \
+	(netdev)->ethtool_ops = (struct ethtool_ops *)(ops)
+
 #endif
diff --git a/kernel_addons/backport/2.6.13/include/linux/random.h b/kernel_addons/backport/2.6.13/include/linux/random.h
new file mode 100644
index 0000000..2ea2e1f
--- /dev/null
+++ b/kernel_addons/backport/2.6.13/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.13/include/linux/skbuff.h b/kernel_addons/backport/2.6.13/include/linux/skbuff.h
index 4845283..70bf011 100644
--- a/kernel_addons/backport/2.6.13/include/linux/skbuff.h
+++ b/kernel_addons/backport/2.6.13/include/linux/skbuff.h
@@ -4,5 +4,8 @@ #define LINUX_SKBUFF_H_BACKPORT
 #include_next <linux/skbuff.h>
 
 #define CHECKSUM_PARTIAL CHECKSUM_HW 
+#define CHECKSUM_COMPLETE CHECKSUM_HW 
+
+#define gso_size tso_size
 
 #endif
diff --git a/kernel_addons/backport/2.6.13/include/linux/types.h b/kernel_addons/backport/2.6.13/include/linux/types.h
index c06977a..53c7a33 100644
--- a/kernel_addons/backport/2.6.13/include/linux/types.h
+++ b/kernel_addons/backport/2.6.13/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.13/include/linux/workqueue.h b/kernel_addons/backport/2.6.13/include/linux/workqueue.h
index 330f47f..cc8b2cd 100644
--- a/kernel_addons/backport/2.6.13/include/linux/workqueue.h
+++ b/kernel_addons/backport/2.6.13/include/linux/workqueue.h
@@ -26,6 +26,12 @@ backport_cancel_delayed_work(struct dela
 	return cancel_delayed_work(&work->work);
 }
 
+static inline void 
+backport_cancel_rearming_delayed_workqueue(struct workqueue_struct *wq, struct delayed_work *work)
+{
+	cancel_rearming_delayed_workqueue(wq, &work->work);
+}
+
 
 #undef INIT_WORK
 #define INIT_WORK(_work, _func) backport_INIT_WORK(_work, _func)
@@ -33,11 +39,12 @@ #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)) }
 
 #define queue_delayed_work backport_queue_delayed_work
 #define cancel_delayed_work backport_cancel_delayed_work
+#define cancel_rearming_delayed_workqueue backport_cancel_rearming_delayed_workqueue
 
 #endif
diff --git a/kernel_addons/backport/2.6.13/include/net/netevent.h b/kernel_addons/backport/2.6.13/include/net/netevent.h
new file mode 100644
index 0000000..e5d2162
--- /dev/null
+++ b/kernel_addons/backport/2.6.13/include/net/netevent.h
@@ -0,0 +1,33 @@
+#ifndef _NET_EVENT_H
+#define _NET_EVENT_H
+
+/*
+ *	Generic netevent notifiers
+ *
+ *	Authors:
+ *      Tom Tucker              <tom at opengridcomputing.com>
+ *      Steve Wise              <swise at opengridcomputing.com>
+ *
+ * 	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.13/include/src/genalloc.c b/kernel_addons/backport/2.6.13/include/src/genalloc.c
new file mode 100644
index 0000000..75ae68c
--- /dev/null
+++ b/kernel_addons/backport/2.6.13/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 <jes at trained-monkey.org>
+ *
+ * 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.13/include/src/netevent.c b/kernel_addons/backport/2.6.13/include/src/netevent.c
new file mode 100644
index 0000000..5ffadd1
--- /dev/null
+++ b/kernel_addons/backport/2.6.13/include/src/netevent.c
@@ -0,0 +1,71 @@
+/*
+ *	Network event notifiers
+ *
+ *	Authors:
+ *      Tom Tucker             <tom at opengridcomputing.com>
+ *      Steve Wise             <swise at opengridcomputing.com>
+ *
+ *	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.13/cxgb3_main_to_2_6_13.patch b/kernel_patches/backport/2.6.13/cxgb3_main_to_2_6_13.patch
new file mode 100644
index 0000000..e6781f3
--- /dev/null
+++ b/kernel_patches/backport/2.6.13/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.13/cxgb3_makefile_to_2_6_19.patch b/kernel_patches/backport/2.6.13/cxgb3_makefile_to_2_6_19.patch
new file mode 100644
index 0000000..ad7e7f4
--- /dev/null
+++ b/kernel_patches/backport/2.6.13/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.13/linux_stuff_to_2_6_17.patch b/kernel_patches/backport/2.6.13/linux_stuff_to_2_6_17.patch
new file mode 100644
index 0000000..eb2285f
--- /dev/null
+++ b/kernel_patches/backport/2.6.13/linux_stuff_to_2_6_17.patch
@@ -0,0 +1,24 @@
+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/Makefile b/drivers/infiniband/core/Makefile
+index 50fb1cd..456bfd0 100644
+--- a/drivers/infiniband/core/Makefile
++++ b/drivers/infiniband/core/Makefile
+@@ -30,3 +30,5 @@ ib_ucm-y :=			ucm.o
+ 
+ ib_uverbs-y :=			uverbs_main.o uverbs_cmd.o uverbs_mem.o \
+ 				uverbs_marshall.o
++
++ib_core-y +=			genalloc.o netevent.o
diff --git a/kernel_patches/backport/2.6.13/t3_hw_to_2_6_13.patch b/kernel_patches/backport/2.6.13/t3_hw_to_2_6_13.patch
new file mode 100644
index 0000000..611e9dc
--- /dev/null
+++ b/kernel_patches/backport/2.6.13/t3_hw_to_2_6_13.patch
@@ -0,0 +1,13 @@
+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
+@@ -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))




More information about the general mailing list