## 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 @@ -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 #include 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 * - * $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 #include @@ -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 #include #include +#include #include 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 #include #include +#include #include #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 @@ -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 */