## Automatically generated incremental diff
## From:   linux-2.4.22-bk44
## To:     linux-2.4.22-bk45
## Robot:  $Id: make-incremental-diff,v 1.11 2002/02/20 02:59:33 hpa Exp $

diff -urN linux-2.4.22-bk44/Documentation/Configure.help linux-2.4.22-bk45/Documentation/Configure.help
--- linux-2.4.22-bk44/Documentation/Configure.help	2003-10-31 02:49:35.000000000 -0800
+++ linux-2.4.22-bk45/Documentation/Configure.help	2003-10-31 02:49:42.000000000 -0800
@@ -4013,7 +4013,7 @@
   You should say Y here if you use XFree86 3.3.6 or 4.x and want to
   use GLX or DRI.  If unsure, say N.
 
-CONFIG_AGP_AMD_8151
+CONFIG_AGP_AMD_K8
   This option gives you AGP support for the GLX component of
   XFree86 on an AMD Opteron/Athlon64 using the on-CPU GART.
 
diff -urN linux-2.4.22-bk44/MAINTAINERS linux-2.4.22-bk45/MAINTAINERS
--- linux-2.4.22-bk44/MAINTAINERS	2003-10-31 02:49:35.000000000 -0800
+++ linux-2.4.22-bk45/MAINTAINERS	2003-10-31 02:49:42.000000000 -0800
@@ -430,26 +430,24 @@
 W:	http://www.coda.cs.cmu.edu/
 S:	Maintained
 
-HP (was COMPAQ) FIBRE CHANNEL 64-bit/66MHz PCI non-intelligent HBA
-P:      Stephen Cameron
-M:      arrays@hp.com 
-M:      steve.cameron@hp.com
-L:	cpqfc-discuss@lists.sourceforge.net
+HP FIBRE CHANNEL 64-bit/66MHz PCI non-intelligent HBA
+P:      Chase Maupin
+M:      chase.maupin@hp.com
+L:     iss_storagedev@hp.com
 S:      Odd Fixes
 
-HP (was COMPAQ) SMART2 RAID DRIVER
-P:	Stephen Cameron
-M:	arrays@hp.com
-M:	steve.cameron@hp.com
-L:	cpqarray-discuss@lists.sourceforge.net
+
+HP SMART2 RAID DRIVER
+P:     Francis Wiran
+M:     francis.wiran@hp.com
+L:     iss_storagedev@hp.com
 S:	Odd Fixes
 
-HP (was COMPAQ) SMART CISS RAID DRIVER 
-P:	Stephen Cameron
-M:	arrays@hp.com
-M:	steve.cameron@hp.com
-L:	cciss-discuss@lists.sourceforge.net
-S:	Supported 
+HP SMART CISS RAID DRIVER
+P:     Mike Miller, Michael Ni
+M:     mike.miller@hp.com
+L:     iss_storagedev@hp.com
+S:	Supported
 
 COMPUTONE INTELLIPORT MULTIPORT CARD
 P:     Michael H. Warfield
diff -urN linux-2.4.22-bk44/Makefile linux-2.4.22-bk45/Makefile
--- linux-2.4.22-bk44/Makefile	2003-10-31 02:49:35.000000000 -0800
+++ linux-2.4.22-bk45/Makefile	2003-10-31 02:49:42.000000000 -0800
@@ -1,7 +1,7 @@
 VERSION = 2
 PATCHLEVEL = 4
 SUBLEVEL = 22
-EXTRAVERSION = -bk44
+EXTRAVERSION = -bk45
 
 KERNELRELEASE=$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)
 
diff -urN linux-2.4.22-bk44/arch/x86_64/ia32/sys_ia32.c linux-2.4.22-bk45/arch/x86_64/ia32/sys_ia32.c
--- linux-2.4.22-bk44/arch/x86_64/ia32/sys_ia32.c	2003-10-31 02:49:36.000000000 -0800
+++ linux-2.4.22-bk45/arch/x86_64/ia32/sys_ia32.c	2003-10-31 02:49:42.000000000 -0800
@@ -16,7 +16,7 @@
  *
  * This file assumes that there is a hole at the end of user address space.
  *
- * $Id: sys_ia32.c,v 1.62 2003/09/22 04:25:53 ak Exp $
+ * $Id: sys_ia32.c,v 1.65 2003/10/11 15:16:35 ak Exp $
  */
 
 #include <linux/config.h>
@@ -93,6 +93,8 @@
 static int
 putstat(struct stat32 *ubuf, struct stat *kbuf)
 {
+	if (kbuf->st_size > 0x7fffffff)
+		return -EOVERFLOW;
 	if (verify_area(VERIFY_WRITE, ubuf, sizeof(struct stat32)) ||
 	    __put_user (kbuf->st_dev, &ubuf->st_dev) ||
 	    __put_user (kbuf->st_ino, &ubuf->st_ino) ||
@@ -123,9 +125,9 @@
 	set_fs (KERNEL_DS);
 	ret = sys_newstat(filename, &s);
 	set_fs (old_fs);
-	if (putstat (statbuf, &s))
-		return -EFAULT;
+	if (ret)
 	return ret;
+	return putstat(statbuf, &s);
 }
 
 extern asmlinkage long sys_newlstat(char * filename, struct stat * statbuf);
@@ -140,9 +142,9 @@
 	set_fs (KERNEL_DS);
 	ret = sys_newlstat(filename, &s);
 	set_fs (old_fs);
-	if (putstat (statbuf, &s))
-		return -EFAULT;
+	if (ret) 
 	return ret;
+	return putstat(statbuf, &s);
 }
 
 extern asmlinkage long sys_newfstat(unsigned int fd, struct stat * statbuf);
@@ -157,9 +159,9 @@
 	set_fs (KERNEL_DS);
 	ret = sys_newfstat(fd, &s);
 	set_fs (old_fs);
-	if (putstat (statbuf, &s))
-		return -EFAULT;
+	if (ret)
 	return ret;
+	return putstat(statbuf, &s);
 }
 
 /* Another set for IA32/LFS -- x86_64 struct stat is different due to 
@@ -197,9 +199,9 @@
 	set_fs (KERNEL_DS);
 	ret = sys_newstat(filename, &s);
 	set_fs (old_fs);
-	if (putstat64 (statbuf, &s))
-		return -EFAULT;
+	if (ret)
 	return ret;
+	return putstat64(statbuf, &s);
 }
 
 asmlinkage long
@@ -212,9 +214,9 @@
 	set_fs (KERNEL_DS);
 	ret = sys_newlstat(filename, &s);
 	set_fs (old_fs);
-	if (putstat64 (statbuf, &s))
-		return -EFAULT;
+	if (ret)
 	return ret;
+	return putstat64(statbuf, &s);
 }
 
 asmlinkage long
@@ -227,9 +229,9 @@
 	set_fs (KERNEL_DS);
 	ret = sys_newfstat(fd, &s);
 	set_fs (old_fs);
-	if (putstat64 (statbuf, &s))
-		return -EFAULT;
+	if (ret)
 	return ret;
+	return putstat64(statbuf, &s);
 }
 
 /* Don't set O_LARGEFILE implicitely. */
@@ -1243,7 +1245,6 @@
 	return sys32_wait4(pid, stat_addr, options, NULL);
 }
 
-
 extern asmlinkage long
 sys_getrusage(int who, struct rusage *ru);
 
@@ -2996,7 +2997,7 @@
 
 static int __init ia32_init (void)
 {
-	printk("IA32 emulation $Id: sys_ia32.c,v 1.62 2003/09/22 04:25:53 ak Exp $\n");  
+	printk("IA32 emulation $Id: sys_ia32.c,v 1.65 2003/10/11 15:16:35 ak Exp $\n");  
 	ia32_exec_domain.signal_map = default_exec_domain.signal_map;
 	ia32_exec_domain.signal_invmap = default_exec_domain.signal_invmap;
 	register_exec_domain(&ia32_exec_domain);
diff -urN linux-2.4.22-bk44/arch/x86_64/kernel/acpi.c linux-2.4.22-bk45/arch/x86_64/kernel/acpi.c
--- linux-2.4.22-bk44/arch/x86_64/kernel/acpi.c	2003-10-31 02:49:36.000000000 -0800
+++ linux-2.4.22-bk45/arch/x86_64/kernel/acpi.c	2003-10-31 02:49:42.000000000 -0800
@@ -115,7 +115,6 @@
 #endif
 }
 
-
 #ifdef CONFIG_X86_LOCAL_APIC
 
 int acpi_lapic;
diff -urN linux-2.4.22-bk44/arch/x86_64/kernel/e820.c linux-2.4.22-bk45/arch/x86_64/kernel/e820.c
--- linux-2.4.22-bk44/arch/x86_64/kernel/e820.c	2003-10-31 02:49:36.000000000 -0800
+++ linux-2.4.22-bk45/arch/x86_64/kernel/e820.c	2003-10-31 02:49:42.000000000 -0800
@@ -1,7 +1,7 @@
 /* 
  * Handle the memory map.
  * The functions here do the job until bootmem takes over.
- * $Id: e820.c,v 1.10 2003/09/25 03:22:05 ak Exp $
+ * $Id: e820.c,v 1.11 2003/10/11 15:16:35 ak Exp $
  */
 #include <linux/config.h>
 #include <linux/kernel.h>
diff -urN linux-2.4.22-bk44/arch/x86_64/kernel/entry.S linux-2.4.22-bk45/arch/x86_64/kernel/entry.S
--- linux-2.4.22-bk44/arch/x86_64/kernel/entry.S	2003-06-13 07:51:32.000000000 -0700
+++ linux-2.4.22-bk45/arch/x86_64/kernel/entry.S	2003-10-31 02:49:42.000000000 -0800
@@ -5,7 +5,7 @@
  *  Copyright (C) 2000, 2001, 2002  Andi Kleen SuSE Labs
  *  Copyright (C) 2000  Pavel Machek <pavel@suse.cz>
  * 
- *  $Id: entry.S,v 1.98 2003/05/12 14:39:00 ak Exp $		
+ *  $Id: entry.S,v 1.99 2003/10/24 17:48:32 ak Exp $		
  */
 
 /*
@@ -351,6 +351,7 @@
 	.section .fixup,"ax"
 	/* force a signal here? this matches i386 behaviour */
 bad_iret:
+	/* runs with kernelgs again */	
 	movq $-9999,%rdi	/* better code? */
 	jmp do_exit			
 	.previous	
@@ -504,7 +505,12 @@
 	incl %r15d
 	/* There are two places in the kernel that can potentially fault with
 	   usergs. Handle them here. */	   
-	cmpq $iret_label,RIP(%rsp)
+	leaq iret_label(%rip),%rdx
+	cmpq %rdx,RIP(%rsp)
+	je 1f
+	/* check truncated address too. This works around a CPU issue */
+	movl %edx,%edx	/* zero extend */
+	cmpq %rdx,RIP(%rsp)
 	je   1f
 	cmpq $gs_change,RIP(%rsp)
 	jne  error_action
diff -urN linux-2.4.22-bk44/arch/x86_64/kernel/irq.c linux-2.4.22-bk45/arch/x86_64/kernel/irq.c
--- linux-2.4.22-bk44/arch/x86_64/kernel/irq.c	2003-10-31 02:49:36.000000000 -0800
+++ linux-2.4.22-bk45/arch/x86_64/kernel/irq.c	2003-10-31 02:49:42.000000000 -0800
@@ -1051,7 +1051,7 @@
 
 	if (!shared) {
 		desc->depth = 0;
-		desc->status &= ~(IRQ_DISABLED | IRQ_AUTODETECT | IRQ_WAITING);
+		desc->status &= ~(IRQ_DISABLED | IRQ_AUTODETECT | IRQ_WAITING | IRQ_INPROGRESS);
 		desc->handler->startup(irq);
 	}
 	spin_unlock_irqrestore(&desc->lock,flags);
diff -urN linux-2.4.22-bk44/arch/x86_64/kernel/setup64.c linux-2.4.22-bk45/arch/x86_64/kernel/setup64.c
--- linux-2.4.22-bk44/arch/x86_64/kernel/setup64.c	2003-10-31 02:49:36.000000000 -0800
+++ linux-2.4.22-bk45/arch/x86_64/kernel/setup64.c	2003-10-31 02:49:42.000000000 -0800
@@ -3,7 +3,7 @@
  * Copyright (C) 1995  Linus Torvalds
  * Copyright 2001, 2002 SuSE Labs / Andi Kleen.
  * See setup.c for older changelog.
- * $Id: setup64.c,v 1.25 2003/07/11 15:58:47 ak Exp $
+ * $Id: setup64.c,v 1.26 2003/10/15 01:32:42 ak Exp $
  */ 
 #include <linux/config.h>
 #include <linux/init.h>
@@ -158,7 +158,6 @@
 #endif
 }
 
-#define EXCEPTION_STK_ORDER 0 /* >= N_EXCEPTION_STACKS*EXCEPTION_STKSZ */
 char boot_exception_stacks[N_EXCEPTION_STACKS*EXCEPTION_STKSZ];
 
 /*
@@ -177,16 +176,11 @@
 #endif
 	struct tss_struct * t = &init_tss[nr];
 	unsigned long v, efer; 	
-	char *estacks; 
+	unsigned long estack;
 
 	/* CPU 0 is initialised in head64.c */
-	if (nr != 0) {
+	if (nr != 0)
 		pda_init(nr);
-		estacks = (char *)__get_free_pages(GFP_ATOMIC, EXCEPTION_STK_ORDER); 
-		if (!estacks)
-			panic("Can't allocate exception stacks for CPU %d\n",nr);
-	} else 
-		estacks = boot_exception_stacks; 
 
 	if (test_and_set_bit(nr, &cpu_initialized))
 		panic("CPU#%d already initialized!\n", nr);
@@ -228,10 +222,17 @@
 	/*
 	 * set up and load the per-CPU TSS
 	 */
-	estacks += EXCEPTION_STKSZ;
+	estack = (unsigned long)boot_exception_stacks + EXCEPTION_STKSZ;
 	for (v = 0; v < N_EXCEPTION_STACKS; v++) {
-		t->ist[v] = (unsigned long)estacks;
-		estacks += EXCEPTION_STKSZ;
+		if (nr == 0) {
+			t->ist[v] = estack;
+			estack += EXCEPTION_STKSZ;
+		} else {
+			estack = __get_free_pages(GFP_ATOMIC, EXCEPTION_STK_ORDER);
+			if(!estack) 
+				panic("Can't allocate exception stack %lu for CPU %d\n", v, nr);
+			t->ist[v] = estack + EXCEPTION_STKSZ;		
+		}
 	}
 
 	atomic_inc(&init_mm.mm_count);
diff -urN linux-2.4.22-bk44/arch/x86_64/kernel/smp.c linux-2.4.22-bk45/arch/x86_64/kernel/smp.c
--- linux-2.4.22-bk44/arch/x86_64/kernel/smp.c	2003-08-25 04:44:40.000000000 -0700
+++ linux-2.4.22-bk45/arch/x86_64/kernel/smp.c	2003-10-31 02:49:42.000000000 -0800
@@ -548,26 +548,3 @@
 		atomic_inc(&call_data->finished);
 	}
 }
-
-/* Slow. Should be only used for debugging. */
-int slow_smp_processor_id(void)
-{ 
-	int stack_location;
-	unsigned long sp = (unsigned long)&stack_location; 
-	int offset = 0, cpu;
-
-	for (offset = 0; (cpu_online_map >> offset); offset = cpu + 1) { 
-		cpu = ffz(~(cpu_online_map >> offset));
-
-		if (sp >= (u64)cpu_pda[cpu].irqstackptr - IRQSTACKSIZE && 
-		    sp <= (u64)cpu_pda[cpu].irqstackptr)
-			return cpu;
-
-		unsigned long estack = init_tss[cpu].ist[0] - EXCEPTION_STKSZ;
-		if (sp >= estack && sp <= estack+(1<<(PAGE_SHIFT+EXCEPTION_STK_ORDER)))
-			return cpu;			
-	}
-
-	return stack_smp_processor_id();
-} 
-
diff -urN linux-2.4.22-bk44/arch/x86_64/kernel/x8664_ksyms.c linux-2.4.22-bk45/arch/x86_64/kernel/x8664_ksyms.c
--- linux-2.4.22-bk44/arch/x86_64/kernel/x8664_ksyms.c	2003-10-31 02:49:36.000000000 -0800
+++ linux-2.4.22-bk45/arch/x86_64/kernel/x8664_ksyms.c	2003-10-31 02:49:42.000000000 -0800
@@ -95,6 +95,7 @@
 
 EXPORT_SYMBOL(pci_map_sg);
 EXPORT_SYMBOL(pci_unmap_sg);
+EXPORT_SYMBOL(bad_dma_address);
 
 #ifdef CONFIG_PCI
 EXPORT_SYMBOL(pcibios_penalize_isa_irq);
@@ -226,3 +227,5 @@
 EXPORT_SYMBOL_NOVERS(int_ret_from_sys_call); 
 
 EXPORT_SYMBOL(touch_nmi_watchdog);
+
+EXPORT_SYMBOL(do_fork);
diff -urN linux-2.4.22-bk44/arch/x86_64/mm/extable.c linux-2.4.22-bk45/arch/x86_64/mm/extable.c
--- linux-2.4.22-bk44/arch/x86_64/mm/extable.c	2002-11-28 15:53:12.000000000 -0800
+++ linux-2.4.22-bk45/arch/x86_64/mm/extable.c	2003-10-31 02:49:42.000000000 -0800
@@ -1,10 +1,11 @@
 /*
- * linux/arch/i386/mm/extable.c
+ * linux/arch/x86_64/mm/extable.c
  */
 
 #include <linux/config.h>
 #include <linux/module.h>
 #include <linux/spinlock.h>
+#include <linux/init.h>
 #include <asm/uaccess.h>
 
 extern const struct exception_table_entry __start___ex_table[];
@@ -39,6 +40,10 @@
 	unsigned long ret = 0;
 	unsigned long flags;
 
+	/* Workaround for an Opteron issue */
+	if ((addr >> 32) == 0) 
+		addr |= 0xffffffffUL << 32; 
+
 #ifndef CONFIG_MODULES
 	/* There is only the kernel to search.  */
 	ret = search_one_table(__start___ex_table, __stop___ex_table-1, addr);
diff -urN linux-2.4.22-bk44/drivers/char/agp/agpgart_be.c linux-2.4.22-bk45/drivers/char/agp/agpgart_be.c
--- linux-2.4.22-bk44/drivers/char/agp/agpgart_be.c	2003-10-31 02:49:36.000000000 -0800
+++ linux-2.4.22-bk45/drivers/char/agp/agpgart_be.c	2003-10-31 02:49:43.000000000 -0800
@@ -49,6 +49,7 @@
 #include <asm/uaccess.h>
 #include <asm/io.h>
 #include <asm/page.h>
+#include <asm/msr.h>
 
 #include <linux/agp_backend.h>
 #include "agp.h"
@@ -66,6 +67,7 @@
 EXPORT_SYMBOL(agp_backend_release);
 
 static void flush_cache(void);
+static int agp_init_one(struct pci_dev *dev);
 
 static struct agp_bridge_data agp_bridge;
 static int agp_try_unsupported __initdata = 0;
@@ -4811,7 +4813,7 @@
 
 static int nvidia_configure(void)
 {
-	int i, rc, num_dirs;
+	int i, num_dirs;
 	u32 apbase, aplimit;
 	aper_size_info_8 *current_size;
 	u32 temp;
@@ -6346,6 +6348,12 @@
 		"NVIDIA",
 		"nForce3/K8 On-CPU GART",
 		nvidia_x86_64_setup },
+	{ PCI_DEVICE_ID_NVIDIA_NFORCE3S,
+	  PCI_VENDOR_ID_NVIDIA,
+	  NVIDIA_NFORCE3,
+	  "NVIDIA",
+	  "nForce3S/K8 On-CPU GART",
+	  nvidia_x86_64_setup },
 #endif
 #ifdef CONFIG_AGP_NVIDIA
 	{ 0,
@@ -6489,15 +6497,24 @@
 static int __init agp_find_supported_device(void)
 {
 	struct pci_dev *dev = NULL;
-	u8 cap_ptr = 0x00;
+	int ret = -ENODEV;
 
 #ifdef CONFIG_AGP_HP_ZX1
 	if (hp_zx1_gart_init() == 0)
 		return 0;
 #endif
 
-	if ((dev = pci_find_class(PCI_CLASS_BRIDGE_HOST << 8, NULL)) == NULL)
-		return -ENODEV;
+	while ((dev = pci_find_class(PCI_CLASS_BRIDGE_HOST << 8, dev)) != NULL) {
+		ret = agp_init_one(dev);
+		if (ret != -ENODEV)
+			break;
+	} 
+	return ret;
+}	
+
+static int __init agp_init_one(struct pci_dev *dev)
+{
+	u8 cap_ptr = 0x00;
 
 	agp_bridge.dev = dev;
 
diff -urN linux-2.4.22-bk44/drivers/net/e100/e100_config.c linux-2.4.22-bk45/drivers/net/e100/e100_config.c
--- linux-2.4.22-bk44/drivers/net/e100/e100_config.c	2003-06-13 07:51:34.000000000 -0700
+++ linux-2.4.22-bk45/drivers/net/e100/e100_config.c	2003-10-31 02:49:45.000000000 -0800
@@ -60,7 +60,7 @@
  * All other init functions will only set values that are
  * different from the 82557 default.
  */
-static void __devinit
+void __devinit
 e100_config_init_82557(struct e100_private *bdp)
 {
 	/* initialize config block */
diff -urN linux-2.4.22-bk44/drivers/net/e100/e100_config.h linux-2.4.22-bk45/drivers/net/e100/e100_config.h
--- linux-2.4.22-bk44/drivers/net/e100/e100_config.h	2003-06-13 07:51:34.000000000 -0700
+++ linux-2.4.22-bk45/drivers/net/e100/e100_config.h	2003-10-31 02:49:45.000000000 -0800
@@ -151,6 +151,7 @@
 
 /* function prototypes */
 extern void e100_config_init(struct e100_private *bdp);
+extern void e100_config_init_82557(struct e100_private *bdp);
 extern unsigned char e100_force_config(struct e100_private *bdp);
 extern unsigned char e100_config(struct e100_private *bdp);
 extern void e100_config_fc(struct e100_private *bdp);
diff -urN linux-2.4.22-bk44/drivers/net/e100/e100_main.c linux-2.4.22-bk45/drivers/net/e100/e100_main.c
--- linux-2.4.22-bk44/drivers/net/e100/e100_main.c	2003-08-25 04:44:42.000000000 -0700
+++ linux-2.4.22-bk45/drivers/net/e100/e100_main.c	2003-10-31 02:49:45.000000000 -0800
@@ -46,7 +46,13 @@
 
 /* Change Log
  * 
- * 2.3.18       07/08/03
+ * 2.3.30       09/21/03
+ * o Bug fix (Bugzilla 97908): Loading e100 was causing crash on Itanium2
+ *   with HP chipset
+ * o Bug fix (Bugzilla 101583): e100 can't pass traffic with ipv6
+ * o Bug fix (Bugzilla 101360): PRO/10+ can't pass traffic
+ * 
+ * 2.3.27       08/08/03
  * o Bug fix: read skb->len after freeing skb
  *   [Andrew Morton] akpm@zip.com.au
  * o Bug fix: 82557 (with National PHY) timeout during init
@@ -54,24 +60,6 @@
  * o Feature add: allow to change Wake On LAN when EEPROM disabled
  * 
  * 2.3.13       05/08/03
- * o Feature remove: /proc/net/PRO_LAN_Adapters support gone completely
- * o Feature remove: IDIAG support (use ethtool -t instead)
- * o Cleanup: fixed spelling mistakes found by community
- * o Feature add: ethtool cable diag test
- * o Feature add: ethtool parameter support (ring size, xsum, flow ctrl)
- * o Cleanup: move e100_asf_enable under CONFIG_PM to avoid warning
- *   [Stephen Rothwell (sfr@canb.auug.org.au)]
- * o Bug fix: don't call any netif_carrier_* until netdev registered.
- *   [Andrew Morton (akpm@digeo.com)]
- * o Cleanup: replace (skb->len - skb->data_len) with skb_headlen(skb)
- *   [jmorris@intercode.com.au]
- * o Bug fix: cleanup of Tx skbs after running ethtool diags
- * o Bug fix: incorrect reporting of ethtool diag overall results
- * o Bug fix: must hold xmit_lock before stopping queue in ethtool
- *   operations that require reset h/w and driver structures.
- * o Bug fix: statistic command failure would stop statistic collection.
- * 
- * 2.2.21	02/11/03
  */
  
 #include <linux/config.h>
@@ -137,7 +125,7 @@
 static inline void e100_tx_skb_free(struct e100_private *bdp, tcb_t *tcb);
 /* Global Data structures and variables */
 char e100_copyright[] __devinitdata = "Copyright (c) 2003 Intel Corporation";
-char e100_driver_version[]="2.3.18-k1";
+char e100_driver_version[]="2.3.30-k1";
 const char *e100_full_driver_name = "Intel(R) PRO/100 Network Driver";
 char e100_short_driver_name[] = "e100";
 static int e100nics = 0;
@@ -184,7 +172,7 @@
 static int e100_set_mac(struct net_device *, void *);
 struct net_device_stats *e100_get_stats(struct net_device *);
 
-static void e100intr(int, void *, struct pt_regs *);
+static irqreturn_t e100intr(int, void *, struct pt_regs *);
 static void e100_print_brd_conf(struct e100_private *);
 static void e100_set_multi(struct net_device *);
 
@@ -583,10 +571,6 @@
 
 	pci_set_drvdata(pcid, dev);
 
-	if ((rc = e100_alloc_space(bdp)) != 0) {
-		goto err_dev;
-	}
-
 	bdp->flags = 0;
 	bdp->ifs_state = 0;
 	bdp->ifs_value = 0;
@@ -603,7 +587,11 @@
 	bdp->watchdog_timer.function = (void *) &e100_watchdog;
 
 	if ((rc = e100_pci_setup(pcid, bdp)) != 0) {
-		goto err_dealloc;
+		goto err_dev;
+	}
+
+	if ((rc = e100_alloc_space(bdp)) != 0) {
+		goto err_pci;
 	}
 
 	if (((bdp->pdev->device > 0x1030)
@@ -644,11 +632,11 @@
 	dev->do_ioctl = &e100_ioctl;
 
 	if (bdp->flags & USE_IPCB)
-	dev->features = NETIF_F_SG | NETIF_F_HW_CSUM |
+	dev->features = NETIF_F_SG | NETIF_F_IP_CSUM |
 			NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
 		
 	if ((rc = register_netdev(dev)) != 0) {
-		goto err_pci;
+		goto err_dealloc;
 	}
 
 	e100_check_options(e100nics, bdp);
@@ -699,12 +687,12 @@
 
 err_unregister_netdev:
 	unregister_netdev(dev);
+err_dealloc:
+	e100_dealloc_space(bdp);
 err_pci:
 	iounmap(bdp->scb);
 	pci_release_regions(pcid);
 	pci_disable_device(pcid);
-err_dealloc:
-	e100_dealloc_space(bdp);
 err_dev:
 	pci_set_drvdata(pcid, NULL);
 	kfree(dev);
@@ -1403,6 +1391,9 @@
 		bdp->flags |= DF_UCODE_LOADED;
 	}
 
+	if ((u8) bdp->rev_id < D101A4_REV_ID)
+		e100_config_init_82557(bdp);
+		
 	if (!e100_config(bdp))
 		goto err;
 
@@ -1845,7 +1836,7 @@
  * the RX & TX queues & starts the RU if it has stopped due
  * to no resources.
  */
-void
+irqreturn_t
 e100intr(int irq, void *dev_inst, struct pt_regs *regs)
 {
 	struct net_device *dev;
@@ -1858,7 +1849,7 @@
 	intr_status = readw(&bdp->scb->scb_status);
 	/* If not my interrupt, just return */
 	if (!(intr_status & SCB_STATUS_ACK_MASK) || (intr_status == 0xffff)) {
-		return;
+		return IRQ_NONE;
 	}
 
 	/* disable and ack intr */
@@ -1867,7 +1858,7 @@
 	/* the device is closed, don't continue or else bad things may happen. */
 	if (!netif_running(dev)) {
 		e100_set_intr_mask(bdp);
-		return;
+		return IRQ_NONE;
 	}
 
 	/* SWI intr (triggered by watchdog) is signal to allocate new skb buffers */
@@ -1885,6 +1876,7 @@
 		e100_tx_srv(bdp);
 
 	e100_set_intr_mask(bdp);
+	return IRQ_HANDLED;
 }
 
 /**
diff -urN linux-2.4.22-bk44/drivers/net/e1000/e1000.h linux-2.4.22-bk45/drivers/net/e1000/e1000.h
--- linux-2.4.22-bk44/drivers/net/e1000/e1000.h	2003-10-31 02:49:37.000000000 -0800
+++ linux-2.4.22-bk45/drivers/net/e1000/e1000.h	2003-10-31 02:49:45.000000000 -0800
@@ -107,11 +107,11 @@
 #define E1000_TX_HEAD_ADDR_SHIFT 7
 #define E1000_PBA_TX_MASK 0xFFFF0000
 
-/* Flow Control High-Watermark: 43464 bytes */
-#define E1000_FC_HIGH_THRESH 0xA9C8
+/* Flow Control High-Watermark: 5688 bytes below Rx FIFO size */
+#define E1000_FC_HIGH_DIFF 0x1638
 
-/* Flow Control Low-Watermark: 43456 bytes */
-#define E1000_FC_LOW_THRESH 0xA9C0
+/* Flow Control Low-Watermark: 5696 bytes below Rx FIFO size */
+#define E1000_FC_LOW_DIFF 0x1640
 
 /* Flow Control Pause Time: 858 usec */
 #define E1000_FC_PAUSE_TIME 0x0680
diff -urN linux-2.4.22-bk44/drivers/net/e1000/e1000_ethtool.c linux-2.4.22-bk45/drivers/net/e1000/e1000_ethtool.c
--- linux-2.4.22-bk44/drivers/net/e1000/e1000_ethtool.c	2003-10-31 02:49:37.000000000 -0800
+++ linux-2.4.22-bk45/drivers/net/e1000/e1000_ethtool.c	2003-10-31 02:49:45.000000000 -0800
@@ -230,11 +230,15 @@
 
 	hw->original_fc = hw->fc;
 
-	if(netif_running(adapter->netdev)) {
-		e1000_down(adapter);
-		e1000_up(adapter);
-	} else
-		e1000_reset(adapter);
+	if(adapter->fc_autoneg == AUTONEG_ENABLE) {
+		if(netif_running(adapter->netdev)) {
+			e1000_down(adapter);
+			e1000_up(adapter);
+		} else
+			e1000_reset(adapter);
+	}
+	else
+		return e1000_force_mac_fc(hw);
 	
 	return 0;
 }
diff -urN linux-2.4.22-bk44/drivers/net/e1000/e1000_hw.c linux-2.4.22-bk45/drivers/net/e1000/e1000_hw.c
--- linux-2.4.22-bk44/drivers/net/e1000/e1000_hw.c	2003-10-31 02:49:37.000000000 -0800
+++ linux-2.4.22-bk45/drivers/net/e1000/e1000_hw.c	2003-10-31 02:49:45.000000000 -0800
@@ -66,7 +66,6 @@
 static int32_t e1000_id_led_init(struct e1000_hw * hw);
 static int32_t e1000_set_vco_speed(struct e1000_hw *hw);
 
-
 /* IGP cable length table */
 static const
 uint16_t e1000_igp_cable_length_table[IGP01E1000_AGC_LENGTH_TABLE_SIZE] =
@@ -79,6 +78,7 @@
       100, 100, 100, 100, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110,
       110, 110, 110, 110, 110, 110, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120};
 
+
 /******************************************************************************
  * Set the phy type member in the hw struct.
  *
@@ -836,18 +836,16 @@
         if(i == (LINK_UP_TIMEOUT / 10)) {
             DEBUGOUT("Never got a valid link from auto-neg!!!\n");
             hw->autoneg_failed = 1;
-            if(hw->media_type == e1000_media_type_fiber) {
-                /* AutoNeg failed to achieve a link, so we'll call
-                 * e1000_check_for_link. This routine will force the link up if
-                 * we detect a signal. This will allow us to communicate with
-                 * non-autonegotiating link partners.
-                 */
-                if((ret_val = e1000_check_for_link(hw))) {
-                    DEBUGOUT("Error while checking for link\n");
-                    return ret_val;
-                }
-                hw->autoneg_failed = 0;
+            /* AutoNeg failed to achieve a link, so we'll call
+             * e1000_check_for_link. This routine will force the link up if
+             * we detect a signal. This will allow us to communicate with
+             * non-autonegotiating link partners.
+             */
+            if((ret_val = e1000_check_for_link(hw))) {
+                DEBUGOUT("Error while checking for link\n");
+                return ret_val;
             }
+            hw->autoneg_failed = 0;
         } else {
             hw->autoneg_failed = 0;
             DEBUGOUT("Valid Link Found\n");
@@ -1456,10 +1454,10 @@
     }
 
     /* Write back the modified PHY MII control register. */
-    udelay(1);
     if((ret_val = e1000_write_phy_reg(hw, PHY_CTRL, mii_ctrl_reg)))
         return ret_val;
 
+    udelay(1);
 
     /* The wait_autoneg_complete flag may be a little misleading here.
      * Since we are forcing speed and duplex, Auto-Neg is not enabled.
@@ -1865,11 +1863,12 @@
              * be asked to delay transmission of packets than asking
              * our link partner to pause transmission of frames.
              */
-            else if(hw->original_fc == e1000_fc_none ||
-                    hw->original_fc == e1000_fc_tx_pause) {
+            else if((hw->original_fc == e1000_fc_none ||
+                     hw->original_fc == e1000_fc_tx_pause) ||
+                    hw->fc_strict_ieee) {
                 hw->fc = e1000_fc_none;
                 DEBUGOUT("Flow Control = NONE.\r\n");
-            } else if(!hw->fc_strict_ieee) {
+            } else {
                 hw->fc = e1000_fc_rx_pause;
                 DEBUGOUT("Flow Control = RX PAUSE frames only.\r\n");
             }
@@ -2045,9 +2044,10 @@
      * auto-negotiation time to complete, in case the cable was just plugged
      * in. The autoneg_failed flag does this.
      */
-    else if((hw->media_type == e1000_media_type_fiber) &&
+    else if((((hw->media_type == e1000_media_type_fiber) &&
+            ((ctrl & E1000_CTRL_SWDPIN1) == signal)) ||
+            (hw->media_type == e1000_media_type_internal_serdes)) &&
             (!(status & E1000_STATUS_LU)) &&
-            ((ctrl & E1000_CTRL_SWDPIN1) == signal) &&
             (!(rxcw & E1000_RXCW_C))) {
         if(hw->autoneg_failed == 0) {
             hw->autoneg_failed = 1;
@@ -2074,7 +2074,8 @@
      * Device Control register in an attempt to auto-negotiate with our link
      * partner.
      */
-    else if((hw->media_type == e1000_media_type_fiber) &&
+    else if(((hw->media_type == e1000_media_type_fiber) ||
+             (hw->media_type == e1000_media_type_internal_serdes)) &&
               (ctrl & E1000_CTRL_SLU) &&
               (rxcw & E1000_RXCW_C)) {
         DEBUGOUT("RXing /C/, enable AutoNeg and stop forcing link.\r\n");
@@ -2480,8 +2481,8 @@
         E1000_WRITE_REG(hw, MDIC, mdic);
 
         /* Poll the ready bit to see if the MDI read completed */
-        for(i = 0; i < 64; i++) {
-            udelay(50);
+        for(i = 0; i < 640; i++) {
+            udelay(5);
             mdic = E1000_READ_REG(hw, MDIC);
             if(mdic & E1000_MDIC_READY) break;
         }
@@ -3497,10 +3498,12 @@
     if (e1000_acquire_eeprom(hw) != E1000_SUCCESS)
         return -E1000_ERR_EEPROM;
 
-    if(eeprom->type == e1000_eeprom_microwire)
+    if(eeprom->type == e1000_eeprom_microwire) {
         status = e1000_write_eeprom_microwire(hw, offset, words, data);
-    else
+    } else {
         status = e1000_write_eeprom_spi(hw, offset, words, data);
+        msec_delay(10);
+    }
 
     /* Done with writing */
     e1000_release_eeprom(hw);
@@ -3718,12 +3721,9 @@
         hw->perm_mac_addr[i+1] = (uint8_t) (eeprom_data >> 8);
     }
     if(((hw->mac_type == e1000_82546) || (hw->mac_type == e1000_82546_rev_3)) &&
-       (E1000_READ_REG(hw, STATUS) & E1000_STATUS_FUNC_1)) {
-        if(hw->perm_mac_addr[5] & 0x01)
-            hw->perm_mac_addr[5] &= ~(0x01);
-        else
-            hw->perm_mac_addr[5] |= 0x01;
-    }
+       (E1000_READ_REG(hw, STATUS) & E1000_STATUS_FUNC_1))
+            hw->perm_mac_addr[5] ^= 0x01;
+
     for(i = 0; i < NODE_ADDRESS_SIZE; i++)
         hw->mac_addr[i] = hw->perm_mac_addr[i];
     return E1000_SUCCESS;
diff -urN linux-2.4.22-bk44/drivers/net/e1000/e1000_hw.h linux-2.4.22-bk45/drivers/net/e1000/e1000_hw.h
--- linux-2.4.22-bk44/drivers/net/e1000/e1000_hw.h	2003-10-31 02:49:37.000000000 -0800
+++ linux-2.4.22-bk45/drivers/net/e1000/e1000_hw.h	2003-10-31 02:49:45.000000000 -0800
@@ -995,7 +995,6 @@
     uint32_t ledctl_mode1;
     uint32_t ledctl_mode2;
     uint16_t phy_spd_default;
-    uint16_t dsp_reset_counter;
     uint16_t autoneg_advertised;
     uint16_t pci_cmd_word;
     uint16_t fc_high_water;
@@ -2109,5 +2108,4 @@
 #define AUTONEG_ADVERTISE_10_100_ALL    0x000F /* All 10/100 speeds*/
 #define AUTONEG_ADVERTISE_10_ALL        0x0003 /* 10Mbps Full & Half speeds*/
 
-
 #endif /* _E1000_HW_H_ */
diff -urN linux-2.4.22-bk44/drivers/net/e1000/e1000_main.c linux-2.4.22-bk45/drivers/net/e1000/e1000_main.c
--- linux-2.4.22-bk44/drivers/net/e1000/e1000_main.c	2003-10-31 02:49:37.000000000 -0800
+++ linux-2.4.22-bk45/drivers/net/e1000/e1000_main.c	2003-10-31 02:49:45.000000000 -0800
@@ -30,6 +30,19 @@
 
 /* Change Log
  *
+ * 5.2.20	9/30/03
+ *   o Bug fix: SERDES devices might be connected to a back-plane
+ *     switch that doesn't support auto-neg, so add the capability
+ *     to force 1000/Full.
+ *   o Bug fix: Flow control settings for hi/lo watermark didn't
+ *     consider changes in the Rx FIFO size, which could occur with
+ *     Jumbo Frames or with the reduced FIFO in 82547.
+ *   o Better propagation of error codes. [Janice Girouard 
+ *     (janiceg@us.ibm.com)].
+ *   o Bug fix: hang under heavy Tx stress when running out of Tx
+ *     descriptors; wasn't clearing context descriptor when backing
+ *     out of send because of no-resource condition.
+ *
  * 5.2.16	8/8/03
  *   o Added support for new controllers: 82545GM, 82546GB, 82541/7_B1
  *   o Bug fix: reset h/w before first EEPROM read because we don't know
@@ -47,19 +60,11 @@
  *   o Feature: Increase default Tx Descriptor count to 1024 for >= 82544.
  *   
  * 5.1.13	5/28/03
- *   o Bug fix: request_irq() failure resulted in freeing resources twice!
- *     [Don Fry (brazilnut@us.ibm.com)]
- *   o Bug fix: fix VLAN support on ppc64 [Mark Rakes (mrakes@vivato.net)]
- *   o Bug fix: missing Tx cleanup opportunities during interrupt handling.
- *   o Bug fix: alloc_etherdev failure didn't cleanup regions in probe.
- *   o Cleanup: s/int/unsigned int/ for descriptor ring indexes.
- *   
- * 5.1.11	5/6/03
  */
 
 char e1000_driver_name[] = "e1000";
 char e1000_driver_string[] = "Intel(R) PRO/1000 Network Driver";
-char e1000_driver_version[] = "5.2.16-k2";
+char e1000_driver_version[] = "5.2.20-k1";
 char e1000_copyright[] = "Copyright (c) 1999-2003 Intel Corporation.";
 
 /* e1000_pci_tbl - PCI Device ID Table
@@ -250,6 +255,7 @@
 e1000_up(struct e1000_adapter *adapter)
 {
 	struct net_device *netdev = adapter->netdev;
+	int err;
 
 	/* hardware has been reset, we need to reload some things */
 
@@ -262,9 +268,10 @@
 	e1000_configure_rx(adapter);
 	e1000_alloc_rx_buffers(adapter);
 
-	if(request_irq(netdev->irq, &e1000_intr, SA_SHIRQ | SA_SAMPLE_RANDOM,
-		       netdev->name, netdev))
-		return -1;
+	if((err = request_irq(netdev->irq, &e1000_intr,
+		              SA_SHIRQ | SA_SAMPLE_RANDOM,
+		              netdev->name, netdev)))
+		return err;
 
 	mod_timer(&adapter->watchdog_timer, jiffies);
 	e1000_irq_enable(adapter);
@@ -318,7 +325,13 @@
 	}
 	E1000_WRITE_REG(&adapter->hw, PBA, pba);
 
+	/* flow control settings */
+	adapter->hw.fc_high_water = pba - E1000_FC_HIGH_DIFF;
+	adapter->hw.fc_low_water = pba - E1000_FC_LOW_DIFF;
+	adapter->hw.fc_pause_time = E1000_FC_PAUSE_TIME;
+	adapter->hw.fc_send_xon = 1;
 	adapter->hw.fc = adapter->hw.original_fc;
+
 	e1000_reset_hw(&adapter->hw);
 	if(adapter->hw.mac_type >= e1000_82544)
 		E1000_WRITE_REG(&adapter->hw, WUC, 0);
@@ -350,29 +363,32 @@
 	int mmio_len;
 	int pci_using_dac;
 	int i;
+	int err;
 	uint16_t eeprom_data;
 
-	if((i = pci_enable_device(pdev)))
-		return i;
+	if((err = pci_enable_device(pdev)))
+		return err;
 
-	if(!(i = pci_set_dma_mask(pdev, PCI_DMA_64BIT))) {
+	if(!(err = pci_set_dma_mask(pdev, PCI_DMA_64BIT))) {
 		pci_using_dac = 1;
 	} else {
-		if((i = pci_set_dma_mask(pdev, PCI_DMA_32BIT))) {
+		if((err = pci_set_dma_mask(pdev, PCI_DMA_32BIT))) {
 			E1000_ERR("No usable DMA configuration, aborting\n");
-			return i;
+			return err;
 		}
 		pci_using_dac = 0;
 	}
 
-	if((i = pci_request_regions(pdev, e1000_driver_name)))
-		return i;
+	if((err = pci_request_regions(pdev, e1000_driver_name)))
+		return err;
 
 	pci_set_master(pdev);
 
 	netdev = alloc_etherdev(sizeof(struct e1000_adapter));
-	if(!netdev)
+	if(!netdev) {
+		err = -ENOMEM;
 		goto err_alloc_etherdev;
+	}
 
 	SET_MODULE_OWNER(netdev);
 
@@ -386,8 +402,10 @@
 	mmio_len = pci_resource_len(pdev, BAR_0);
 
 	adapter->hw.hw_addr = ioremap(mmio_start, mmio_len);
-	if(!adapter->hw.hw_addr)
+	if(!adapter->hw.hw_addr) {
+		err = -EIO;
 		goto err_ioremap;
+	}
 
 	for(i = BAR_1; i <= BAR_5; i++) {
 		if(pci_resource_len(pdev, i) == 0)
@@ -425,7 +443,7 @@
 
 	/* setup the private structure */
 
-	if(e1000_sw_init(adapter))
+	if((err = e1000_sw_init(adapter)))
 		goto err_sw_init;
 
 	if(adapter->hw.mac_type >= e1000_82543) {
@@ -456,6 +474,7 @@
 
 	if(e1000_validate_eeprom_checksum(&adapter->hw) < 0) {
 		printk(KERN_ERR "The EEPROM Checksum Is Not Valid\n");
+		err = -EIO;
 		goto err_eeprom;
 	}
 
@@ -464,8 +483,10 @@
 	e1000_read_mac_addr(&adapter->hw);
 	memcpy(netdev->dev_addr, adapter->hw.mac_addr, netdev->addr_len);
 
-	if(!is_valid_ether_addr(netdev->dev_addr))
+	if(!is_valid_ether_addr(netdev->dev_addr)) {
+		err = -EIO;
 		goto err_eeprom;
+	}
 
 	e1000_read_part_num(&adapter->hw, &(adapter->part_num));
 
@@ -535,10 +556,10 @@
 err_eeprom:
 	iounmap(adapter->hw.hw_addr);
 err_ioremap:
-	kfree(netdev);
+	free_netdev(netdev);
 err_alloc_etherdev:
 	pci_release_regions(pdev);
-	return -ENOMEM;
+	return err;
 }
 
 /**
@@ -574,7 +595,7 @@
 	iounmap(adapter->hw.hw_addr);
 	pci_release_regions(pdev);
 
-	kfree(netdev);
+	free_netdev(netdev);
 }
 
 /**
@@ -613,20 +634,13 @@
 
 	if (e1000_set_mac_type(hw)) {
 		E1000_ERR("Unknown MAC Type\n");
-		return -1;
+		return -EIO;
 	}
 
 	/* initialize eeprom parameters */
 
 	e1000_init_eeprom_params(hw);
 
-	/* flow control settings */
-
-	hw->fc_high_water = E1000_FC_HIGH_THRESH;
-	hw->fc_low_water = E1000_FC_LOW_THRESH;
-	hw->fc_pause_time = E1000_FC_PAUSE_TIME;
-	hw->fc_send_xon = 1;
-
 	if((hw->mac_type == e1000_82541) ||
 	   (hw->mac_type == e1000_82547) ||
 	   (hw->mac_type == e1000_82541_rev_2) ||
@@ -675,18 +689,19 @@
 e1000_open(struct net_device *netdev)
 {
 	struct e1000_adapter *adapter = netdev->priv;
+	int err;
 
 	/* allocate transmit descriptors */
 
-	if(e1000_setup_tx_resources(adapter))
+	if((err = e1000_setup_tx_resources(adapter)))
 		goto err_setup_tx;
 
 	/* allocate receive descriptors */
 
-	if(e1000_setup_rx_resources(adapter))
+	if((err = e1000_setup_rx_resources(adapter)))
 		goto err_setup_rx;
 
-	if(e1000_up(adapter))
+	if((err = e1000_up(adapter)))
 		goto err_up;
 
 	return 0;
@@ -698,7 +713,7 @@
 err_setup_tx:
 	e1000_reset(adapter);
 
-	return -EBUSY;
+	return err;
 }
 
 /**
@@ -1536,19 +1551,24 @@
 	struct e1000_buffer *buffer_info;
 	unsigned int len = skb->len, max_per_txd = E1000_MAX_DATA_PER_TXD;
 	unsigned int offset = 0, size, count = 0, i;
+#ifdef NETIF_F_TSO
+	unsigned int mss;
+#endif
+	unsigned int nr_frags;
+	unsigned int f;
 
 #ifdef NETIF_F_TSO
-	unsigned int mss = skb_shinfo(skb)->tso_size;
+	mss = skb_shinfo(skb)->tso_size;
 	/* The controller does a simple calculation to 
 	 * make sure there is enough room in the FIFO before
 	 * initiating the DMA for each buffer.  The calc is:
 	 * 4 = ceil(buffer len/mss).  To make sure we don't
 	 * overrun the FIFO, adjust the max buffer len if mss
 	 * drops. */
-	if(mss) max_per_txd = min(mss << 2, max_per_txd);
+	if(mss)
+		max_per_txd = min(mss << 2, max_per_txd);
 #endif
-	unsigned int nr_frags = skb_shinfo(skb)->nr_frags;
-	unsigned int f;
+	nr_frags = skb_shinfo(skb)->nr_frags;
 	len -= skb->data_len;
 
 	i = tx_ring->next_to_use;
@@ -2333,7 +2353,7 @@
 
 /**
  * e1000_alloc_rx_buffers - Replace used receive buffers
- * @data: address of board private structure
+ * @adapter: address of board private structure
  **/
 
 static void
diff -urN linux-2.4.22-bk44/drivers/net/e1000/e1000_osdep.h linux-2.4.22-bk45/drivers/net/e1000/e1000_osdep.h
--- linux-2.4.22-bk44/drivers/net/e1000/e1000_osdep.h	2003-10-31 02:49:37.000000000 -0800
+++ linux-2.4.22-bk45/drivers/net/e1000/e1000_osdep.h	2003-10-31 02:49:45.000000000 -0800
@@ -61,8 +61,6 @@
     TRUE = 1
 } boolean_t;
 
-#undef ASSERT
-#define ASSERT(x)	if(!(x)) BUG()
 #define MSGOUT(S, A, B)	printk(KERN_DEBUG S "\n", A, B)
 
 #if DBG
diff -urN linux-2.4.22-bk44/drivers/usb/host/Config.in linux-2.4.22-bk45/drivers/usb/host/Config.in
--- linux-2.4.22-bk44/drivers/usb/host/Config.in	2003-10-31 02:49:38.000000000 -0800
+++ linux-2.4.22-bk45/drivers/usb/host/Config.in	2003-10-31 02:49:48.000000000 -0800
@@ -12,7 +12,7 @@
    define_bool CONFIG_USB_UHCI_ALT n
 fi
 dep_tristate '  OHCI (Compaq, iMacs, OPTi, SiS, ALi, ...) support' CONFIG_USB_OHCI $CONFIG_USB
-if [ "$CONFIG_ARM" = "y" -o "$CONFIG_X86" = "y" ]; then
+if [ "$CONFIG_ARM" = "y" -o "$CONFIG_X86" = "y" -a "$CONFIG_X86_64" != "y" ]; then
    # Cypress embedded USB controller on StrongARM or on x86 in PC/104
    dep_tristate '  SL811HS Alternate (x86, StrongARM, isosynchronous mode)' CONFIG_USB_SL811HS_ALT $CONFIG_USB $CONFIG_EXPERIMENTAL
    dep_tristate '  SL811HS (x86, StrongARM) support, old driver' CONFIG_USB_SL811HS $CONFIG_USB $CONFIG_EXPERIMENTAL
diff -urN linux-2.4.22-bk44/fs/jfs/namei.c linux-2.4.22-bk45/fs/jfs/namei.c
--- linux-2.4.22-bk44/fs/jfs/namei.c	2003-10-31 02:49:39.000000000 -0800
+++ linux-2.4.22-bk45/fs/jfs/namei.c	2003-10-31 02:49:49.000000000 -0800
@@ -758,6 +758,12 @@
 	jfs_info("jfs_link: %s %s", old_dentry->d_name.name,
 		 dentry->d_name.name);
 
+	if (ip->i_nlink == JFS_LINK_MAX)
+		return -EMLINK;
+
+	if (ip->i_nlink == 0)
+		return -ENOENT;
+
 	/* JFS does NOT support link() on directories */
 	if (S_ISDIR(ip->i_mode))
 		return -EPERM;
@@ -767,11 +773,6 @@
 	down(&JFS_IP(dir)->commit_sem);
 	down(&JFS_IP(ip)->commit_sem);
 
-	if (ip->i_nlink == JFS_LINK_MAX) {
-		rc = -EMLINK;
-		goto out;
-	}
-
 	/*
 	 * scan parent directory for entry/freespace
 	 */
diff -urN linux-2.4.22-bk44/include/asm-x86_64/processor.h linux-2.4.22-bk45/include/asm-x86_64/processor.h
--- linux-2.4.22-bk44/include/asm-x86_64/processor.h	2003-10-31 02:49:39.000000000 -0800
+++ linux-2.4.22-bk45/include/asm-x86_64/processor.h	2003-10-31 02:49:49.000000000 -0800
@@ -329,7 +329,7 @@
 #define DOUBLEFAULT_STACK 2 
 #define NMI_STACK 3 
 #define N_EXCEPTION_STACKS 3  /* hw limit: 7 */
-#define EXCEPTION_STKSZ 1024
+#define EXCEPTION_STKSZ PAGE_SIZE
 #define EXCEPTION_STK_ORDER 0
 
 extern void load_gs_index(unsigned);
diff -urN linux-2.4.22-bk44/include/asm-x86_64/smp.h linux-2.4.22-bk45/include/asm-x86_64/smp.h
--- linux-2.4.22-bk44/include/asm-x86_64/smp.h	2003-08-25 04:44:44.000000000 -0700
+++ linux-2.4.22-bk45/include/asm-x86_64/smp.h	2003-10-31 02:49:49.000000000 -0800
@@ -89,10 +89,8 @@
 	return GET_APIC_ID(*(unsigned *)(APIC_BASE+APIC_ID));
 }
 
-extern int apic_disabled;
-extern int slow_smp_processor_id(void);
-#define safe_smp_processor_id() \
-	(!apic_disabled ? hard_smp_processor_id() : slow_smp_processor_id())
+/* Assume apicid == cpuid */
+#define safe_smp_processor_id() (cpuid_ebx(1) >> 24) 
 
 #endif /* !ASSEMBLY */
 
