linux-cvs-patches
[Top] [All Lists]

CVS Update@linux-mips.org: linux

To: linux-cvs-patches@linux-mips.org
Subject: CVS Update@linux-mips.org: linux
From: ralf@linux-mips.org
Date: Tue, 12 Jul 2005 10:19:34 +0100
Reply-to: linux-mips@linux-mips.org
Sender: linux-cvs-patches-bounce@linux-mips.org
CVSROOT:        /home/cvs
Module name:    linux
Changes by:     ralf@ftp.linux-mips.org 05/07/12 10:19:26

Modified files:
        .              : Makefile 
        Documentation  : Changes kernel-parameters.txt 
        Documentation/pcmcia: devicetable.txt 
        Documentation/serial: driver 
        arch/alpha/kernel: irq_alpha.c traps.c 
        arch/arm       : Makefile 
        arch/arm/kernel: armksyms.c head.S setup.c smp.c traps.c 
        arch/arm/lib   : Makefile 
        arch/arm/mach-aaec2000: aaed2000.c 
        arch/arm/mach-clps711x: autcpu12.c cdb89712.c ceiva.c clep7312.c 
                                edb7211-arch.c fortunet.c p720t.c 
        arch/arm/mach-clps7500: core.c 
        arch/arm/mach-ebsa110: core.c 
        arch/arm/mach-epxa10db: arch.c 
        arch/arm/mach-footbridge: cats-hw.c co285.c ebsa285.c 
                                  netwinder-hw.c personal.c 
        arch/arm/mach-h720x: h7201-eval.c h7202-eval.c 
        arch/arm/mach-imx: mx1ads.c 
        arch/arm/mach-integrator: core.c integrator_ap.c integrator_cp.c 
        arch/arm/mach-iop3xx: iop321-setup.c iop331-setup.c 
        arch/arm/mach-ixp2000: enp2611.c ixdp2400.c ixdp2800.c 
                               ixdp2x01.c 
        arch/arm/mach-ixp4xx: coyote-setup.c gtwx5715-setup.c 
                              ixdp425-setup.c 
        arch/arm/mach-l7200: core.c 
        arch/arm/mach-lh7a40x: arch-kev7a400.c arch-lpd7a40x.c 
        arch/arm/mach-omap: board-generic.c board-h2.c board-h3.c 
                            board-innovator.c board-netstar.c 
                            board-osk.c board-perseus2.c 
                            board-voiceblue.c pm.c time.c usb.c 
        arch/arm/mach-pxa: Makefile corgi.c idp.c lubbock.c mainstone.c 
                           poodle.c pxa27x.c 
        arch/arm/mach-rpc: riscpc.c 
        arch/arm/mach-s3c2410: Kconfig Makefile devs.c mach-bast.c 
                               mach-h1940.c mach-n30.c mach-nexcoder.c 
                               mach-otom.c mach-rx3715.c mach-smdk2410.c 
                               mach-smdk2440.c mach-vr1000.c 
        arch/arm/mach-sa1100: assabet.c badge4.c cerf.c collie.c 
                              cpu-sa1110.c h3600.c hackkit.c 
                              jornada720.c lart.c pleb.c shannon.c 
                              simpad.c 
        arch/arm/mach-shark: core.c 
        arch/arm/mach-versatile: core.c versatile_ab.c versatile_pb.c 
        arch/arm/mm    : blockops.c fault.c init.c mm-armv.c 
                         proc-arm1020.S proc-arm1020e.S 
        arch/arm/vfp   : vfp.h vfpdouble.c vfpmodule.c vfpsingle.c 
        arch/i386/kernel: apic.c apm.c io_apic.c kprobes.c time.c 
        arch/i386/kernel/cpu/cpufreq: gx-suspmod.c 
        arch/i386/kernel/timers: timer_cyclone.c timer_pit.c timer_tsc.c 
        arch/i386/mach-voyager: voyager_basic.c 
        arch/i386/pci  : common.c i386.c 
        arch/ia64/configs: sn2_defconfig tiger_defconfig zx1_defconfig 
        arch/ia64/hp/common: sba_iommu.c 
        arch/ia64/hp/sim: simserial.c 
        arch/ia64/kernel: entry.S fsys.S gate.S ia64_ksyms.c ivt.S 
                          kprobes.c ptrace.c setup.c smp.c 
        arch/ia64/sn/kernel: io_init.c iomv.c setup.c tiocx.c 
        arch/ia64/sn/kernel/sn2: ptc_deadlock.S 
        arch/ia64/sn/pci: tioca_provider.c 
        arch/mips      : defconfig 
        arch/mips/configs: atlas_defconfig capcella_defconfig 
                           cobalt_defconfig db1000_defconfig 
                           db1100_defconfig db1500_defconfig 
                           db1550_defconfig ddb5476_defconfig 
                           ddb5477_defconfig decstation_defconfig 
                           e55_defconfig ev64120_defconfig 
                           ev96100_defconfig ip22_defconfig 
                           ip27_defconfig ip32_defconfig 
                           it8172_defconfig ivr_defconfig 
                           jaguar-atx_defconfig jmr3927_defconfig 
                           lasat200_defconfig malta_defconfig 
                           mpc30x_defconfig ocelot_3_defconfig 
                           ocelot_c_defconfig ocelot_defconfig 
                           ocelot_g_defconfig pb1100_defconfig 
                           pb1500_defconfig pb1550_defconfig 
                           qemu_defconfig rm200_defconfig 
                           sb1250-swarm_defconfig sead_defconfig 
                           tb0226_defconfig tb0229_defconfig 
                           workpad_defconfig yosemite_defconfig 
        arch/mips/pci  : pci.c 
        arch/parisc    : defconfig 
        arch/parisc/configs: 712_defconfig a500_defconfig b180_defconfig 
                             c3000_defconfig 
        arch/ppc       : Kconfig 
        arch/ppc/8xx_io: enet.c 
        arch/ppc/kernel: relocate_kernel.S time.c 
        arch/ppc/platforms: fads.h 
        arch/ppc/platforms/85xx: mpc8540_ads.c 
        arch/ppc/syslib: ppc4xx_pic.c 
        arch/ppc64/boot: Makefile main.c prom.c 
        arch/ppc64/kernel: ItLpQueue.c LparData.c iSeries_proc.c 
                           iSeries_setup.c idle.c irq.c kprobes.c mf.c 
                           nvram.c pacaData.c sysfs.c time.c 
        arch/sparc64   : Kconfig 
        arch/sparc64/kernel: entry.S irq.c kprobes.c pci_psycho.c 
                             pci_sabre.c pci_schizo.c time.c 
        arch/sparc64/mm: ultra.S 
        arch/x86_64/kernel: io_apic.c kprobes.c 
        arch/xtensa    : Kconfig Makefile 
        arch/xtensa/boot: Makefile 
        arch/xtensa/boot/boot-elf: Makefile 
        arch/xtensa/boot/boot-redboot: Makefile 
        arch/xtensa/boot/lib: Makefile zmem.c 
        arch/xtensa/kernel: pci.c ptrace.c 
        drivers/acpi   : pci_irq.c 
        drivers/base   : base.h bus.c core.c dd.c driver.c 
        drivers/block  : ll_rw_blk.c 
        drivers/char   : hw_random.c 
        drivers/char/tpm: tpm.c 
        drivers/char/watchdog: i8xx_tco.c 
        drivers/firmware: pcdp.c pcdp.h 
        drivers/i2c/chips: atxp1.c 
        drivers/ide    : Makefile ide-lib.c setup-pci.c 
        drivers/ide/legacy: hd.c 
        drivers/ide/pci: alim15x3.c amd74xx.c cs5530.c cy82c693.c 
                         it8172.c ns87415.c opti621.c sc1200.c 
                         sl82c105.c slc90e66.c triflex.c via82cxxx.c 
        drivers/input/gameport: gameport.c 
        drivers/input/joystick: analog.c 
        drivers/mmc    : mmci.c wbsd.c wbsd.h 
        drivers/mtd    : afs.c 
        drivers/net    : shaper.c skge.h tg3.c tg3.h 
        drivers/net/arm: etherh.c 
        drivers/parport: parport_pc.c 
        drivers/pci    : Makefile hotplug.c pci-driver.c pci.c probe.c 
                         quirks.c setup-bus.c 
        drivers/pci/pcie: portdrv.h portdrv_core.c portdrv_pci.c 
        drivers/pcmcia : ds.c 
        drivers/sbus/char: bpp.c 
        drivers/serial : 8250.c Kconfig au1x00_uart.c ip22zilog.c mpsc.c 
                         pmac_zilog.c pxa.c s3c2410.c serial_core.c 
                         serial_txx9.c sunsab.c sunsu.c sunzilog.c 
        drivers/serial/cpm_uart: cpm_uart_cpm1.c 
        drivers/video/console: fbcon.c 
        fs/fat         : cache.c inode.c 
        fs/freevxfs    : vxfs.h vxfs_bmap.c vxfs_fshead.c vxfs_lookup.c 
                         vxfs_olt.c vxfs_subr.c vxfs_super.c 
        fs/reiserfs    : ioctl.c super.c 
        fs/udf         : namei.c 
        include/asm-alpha: serial.h 
        include/asm-arm: stat.h system.h tlbflush.h 
        include/asm-arm/arch-pxa: debug-macro.S pxa-regs.h 
        include/asm-arm/mach: arch.h 
        include/asm-arm26: serial.h 
        include/asm-i386: serial.h 
        include/asm-i386/mach-default: do_timer.h 
        include/asm-ia64: mmu_context.h vga.h 
        include/asm-ia64/sn: addrs.h l1.h shub_mmr.h simulator.h 
                             sn_sal.h tioca_provider.h 
        include/asm-ia64/sn/sn2: sn_hwperf.h 
        include/asm-m68k: serial.h 
        include/asm-mips: serial.h 
        include/asm-parisc: serial.h 
        include/asm-ppc: mpc8xx.h pc_serial.h 
        include/asm-ppc64: paca.h 
        include/asm-ppc64/iSeries: ItLpQueue.h 
        include/asm-s390: system.h 
        include/asm-sh : serial.h 
        include/asm-sh/bigsur: serial.h 
        include/asm-sh/ec3104: serial.h 
        include/asm-sh64: serial.h 
        include/asm-sparc64: irq.h pbm.h signal.h 
        include/asm-x86_64: io_apic.h serial.h 
        include/asm-xtensa: delay.h errno.h ipc.h 
        include/linux  : compat_ioctl.h device.h if_shaper.h kprobes.h 
                         pci.h pci_ids.h skbuff.h tcp.h 
        include/linux/tc_ematch: tc_em_meta.h 
        include/net    : pkt_sched.h sch_generic.h slhc_vj.h sock.h 
                         tcp.h 
        init           : do_mounts_initrd.c 
        kernel         : kprobes.c 
        net/core       : dev.c filter.c skbuff.c 
        net/decnet     : dn_fib.c 
        net/ipv4       : af_inet.c fib_trie.c ip_output.c route.c tcp.c 
                         tcp_input.c tcp_ipv4.c tcp_output.c 
        net/ipv6       : af_inet6.c ip6_output.c tcp_ipv6.c 
        net/sched      : Makefile em_meta.c sch_api.c sch_generic.c 
        security/selinux: hooks.c 
        sound/pci      : bt87x.c 
Added files:
        Documentation/networking: fib_trie.txt 
        arch/arm/mach-pxa: standby.S 
        arch/arm/mach-s3c2410: pm-simtec.c 
        arch/ppc/configs: mpc86x_ads_defconfig mpc885ads_defconfig 
        arch/ppc/platforms: mpc885ads.h 
        include/asm-arm/hardware: arm_timer.h 
        include/asm-i386: i8253.h 
        net/sched      : sch_blackhole.c 
Removed files:
        arch/arm/configs: omnimeter_defconfig 
        arch/arm/lib   : longlong.h udivdi3.c 
        arch/ppc64/boot: mknote.c piggyback.c 
        arch/xtensa/boot/include: zlib.h 
        arch/xtensa/boot/lib: memcpy.S zlib.c 
        fs/freevxfs    : vxfs_kcompat.h 
        include/linux  : pci-dynids.h 

Log message:
        Merge with Linux 2.6.13-rc2.

diff -urN linux/Makefile linux/Makefile
--- linux/Makefile      2005/07/11 20:45:51     1.255
+++ linux/Makefile      2005/07/12 09:18:53     1.256
@@ -1,7 +1,7 @@
 VERSION = 2
 PATCHLEVEL = 6
 SUBLEVEL = 13
-EXTRAVERSION =-rc1
+EXTRAVERSION =-rc2
 NAME=Woozy Numbat
 
 # *DOCUMENTATION*
diff -urN linux/Documentation/Changes linux/Documentation/Changes
--- linux/Documentation/Changes 2005/07/11 20:45:51     1.84
+++ linux/Documentation/Changes 2005/07/12 09:18:54     1.85
@@ -57,7 +57,7 @@
 o  jfsutils               1.1.3                   # fsck.jfs -V
 o  reiserfsprogs          3.6.3                   # reiserfsck -V 2>&1|grep 
reiserfsprogs
 o  xfsprogs               2.6.0                   # xfs_db -V
-o  pcmciautils            001
+o  pcmciautils            004
 o  pcmcia-cs              3.1.21                  # cardmgr -V
 o  quota-tools            3.09                    # quota -V
 o  PPP                    2.4.0                   # pppd --version
diff -urN linux/Documentation/kernel-parameters.txt 
linux/Documentation/kernel-parameters.txt
--- linux/Documentation/kernel-parameters.txt   2005/07/11 20:45:51     1.60
+++ linux/Documentation/kernel-parameters.txt   2005/07/12 09:18:54     1.61
@@ -437,10 +437,6 @@
                        Format: {"of[f]" | "sk[ipmbr]"}
                        See comment in arch/i386/boot/edd.S
 
-       edd             [EDD]
-                       Format: {"of[f]" | "sk[ipmbr]"}
-                       See comment in arch/i386/boot/edd.S
-
        eicon=          [HW,ISDN] 
                        Format: <id>,<membase>,<irq>
 
diff -urN linux/Documentation/networking/fib_trie.txt 
linux/Documentation/networking/fib_trie.txt
--- linux/Documentation/networking/fib_trie.txt 1970/01/01 00:00:00
+++ linux/Documentation/networking/fib_trie.txt 2005-07-12 10:18:54.485901000 
+0100     1.1
@@ -0,0 +1,145 @@
+                       LC-trie implementation notes.
+
+Node types
+----------
+leaf 
+       An end node with data. This has a copy of the relevant key, along
+       with 'hlist' with routing table entries sorted by prefix length.
+       See struct leaf and struct leaf_info.
+
+trie node or tnode
+       An internal node, holding an array of child (leaf or tnode) pointers,
+       indexed through a subset of the key. See Level Compression.
+
+A few concepts explained
+------------------------
+Bits (tnode) 
+       The number of bits in the key segment used for indexing into the
+       child array - the "child index". See Level Compression.
+
+Pos (tnode)
+       The position (in the key) of the key segment used for indexing into
+       the child array. See Path Compression.
+
+Path Compression / skipped bits
+       Any given tnode is linked to from the child array of its parent, using
+       a segment of the key specified by the parent's "pos" and "bits" 
+       In certain cases, this tnode's own "pos" will not be immediately
+       adjacent to the parent (pos+bits), but there will be some bits
+       in the key skipped over because they represent a single path with no
+       deviations. These "skipped bits" constitute Path Compression.
+       Note that the search algorithm will simply skip over these bits when
+       searching, making it necessary to save the keys in the leaves to
+       verify that they actually do match the key we are searching for.
+
+Level Compression / child arrays
+       the trie is kept level balanced moving, under certain conditions, the
+       children of a full child (see "full_children") up one level, so that
+       instead of a pure binary tree, each internal node ("tnode") may
+       contain an arbitrarily large array of links to several children.
+       Conversely, a tnode with a mostly empty child array (see empty_children)
+       may be "halved", having some of its children moved downwards one level,
+       in order to avoid ever-increasing child arrays.
+
+empty_children
+       the number of positions in the child array of a given tnode that are
+       NULL.
+
+full_children
+       the number of children of a given tnode that aren't path compressed.
+       (in other words, they aren't NULL or leaves and their "pos" is equal
+       to this tnode's "pos"+"bits").
+
+       (The word "full" here is used more in the sense of "complete" than
+       as the opposite of "empty", which might be a tad confusing.)
+
+Comments
+---------
+
+We have tried to keep the structure of the code as close to fib_hash as 
+possible to allow verification and help up reviewing. 
+
+fib_find_node()
+       A good start for understanding this code. This function implements a
+       straightforward trie lookup.
+
+fib_insert_node()
+       Inserts a new leaf node in the trie. This is bit more complicated than
+       fib_find_node(). Inserting a new node means we might have to run the
+       level compression algorithm on part of the trie.
+
+trie_leaf_remove()
+       Looks up a key, deletes it and runs the level compression algorithm.
+
+trie_rebalance()
+       The key function for the dynamic trie after any change in the trie
+       it is run to optimize and reorganize. Tt will walk the trie upwards 
+       towards the root from a given tnode, doing a resize() at each step 
+       to implement level compression.
+
+resize()
+       Analyzes a tnode and optimizes the child array size by either inflating
+       or shrinking it repeatedly until it fullfills the criteria for optimal
+       level compression. This part follows the original paper pretty closely
+       and there may be some room for experimentation here.
+
+inflate()
+       Doubles the size of the child array within a tnode. Used by resize().
+
+halve()
+       Halves the size of the child array within a tnode - the inverse of
+       inflate(). Used by resize();
+
+fn_trie_insert(), fn_trie_delete(), fn_trie_select_default()
+       The route manipulation functions. Should conform pretty closely to the
+       corresponding functions in fib_hash.
+
+fn_trie_flush()
+       This walks the full trie (using nextleaf()) and searches for empty
+       leaves which have to be removed.
+
+fn_trie_dump()
+       Dumps the routing table ordered by prefix length. This is somewhat
+       slower than the corresponding fib_hash function, as we have to walk the
+       entire trie for each prefix length. In comparison, fib_hash is organized
+       as one "zone"/hash per prefix length.
+
+Locking
+-------
+
+fib_lock is used for an RW-lock in the same way that this is done in fib_hash.
+However, the functions are somewhat separated for other possible locking
+scenarios. It might conceivably be possible to run trie_rebalance via RCU
+to avoid read_lock in the fn_trie_lookup() function.
+
+Main lookup mechanism
+---------------------
+fn_trie_lookup() is the main lookup function.
+
+The lookup is in its simplest form just like fib_find_node(). We descend the
+trie, key segment by key segment, until we find a leaf. check_leaf() does
+the fib_semantic_match in the leaf's sorted prefix hlist.
+
+If we find a match, we are done.
+
+If we don't find a match, we enter prefix matching mode. The prefix length,
+starting out at the same as the key length, is reduced one step at a time,
+and we backtrack upwards through the trie trying to find a longest matching
+prefix. The goal is always to reach a leaf and get a positive result from the
+fib_semantic_match mechanism.
+
+Inside each tnode, the search for longest matching prefix consists of searching
+through the child array, chopping off (zeroing) the least significant "1" of
+the child index until we find a match or the child index consists of nothing 
but
+zeros.
+
+At this point we backtrack (t->stats.backtrack++) up the trie, continuing to
+chop off part of the key in order to find the longest matching prefix.
+
+At this point we will repeatedly descend subtries to look for a match, and 
there
+are some optimizations available that can provide us with "shortcuts" to avoid
+descending into dead ends. Look for "HL_OPTIMIZE" sections in the code.
+
+To alleviate any doubts about the correctness of the route selection process,
+a new netlink operation has been added. Look for NETLINK_FIB_LOOKUP, which
+gives userland access to fib_lookup().
diff -urN linux/Documentation/pcmcia/devicetable.txt 
linux/Documentation/pcmcia/devicetable.txt
--- linux/Documentation/pcmcia/devicetable.txt  2005/07/11 20:45:56     1.1
+++ linux/Documentation/pcmcia/devicetable.txt  2005/07/12 09:18:54     1.2
@@ -19,9 +19,8 @@
 If the hash is incorrect, the kernel will inform you about this in "dmesg"
 upon module initialization, and tell you of the correct hash.
 
-You can determine the hash of the product ID strings by running
-"pcmcia-modalias %n.%m" [%n being replaced with the socket number and %m being
-replaced with the device function] from pcmciautils. It generates a string
+You can determine the hash of the product ID strings by catting the file
+"modalias" in the sysfs directory of the PCMCIA device. It generates a string
 in the following form:
 pcmcia:m0149cC1ABf06pfn00fn00pa725B842DpbF1EFEE84pc0877B627pd00000000
 
diff -urN linux/Documentation/serial/driver linux/Documentation/serial/driver
--- linux/Documentation/serial/driver   2005/01/25 04:27:51     1.5
+++ linux/Documentation/serial/driver   2005/07/12 09:18:54     1.6
@@ -107,8 +107,8 @@
        indicate that the signal is permanently active.  If RI is
        not available, the signal should not be indicated as active.
 
-       Locking: none.
-       Interrupts: caller dependent.
+       Locking: port->lock taken.
+       Interrupts: locally disabled.
        This call must not sleep
 
   stop_tx(port,tty_stop)
diff -urN linux/arch/alpha/kernel/irq_alpha.c 
linux/arch/alpha/kernel/irq_alpha.c
--- linux/arch/alpha/kernel/irq_alpha.c 2003/08/26 00:28:49     1.15
+++ linux/arch/alpha/kernel/irq_alpha.c 2005/07/12 09:18:54     1.16
@@ -55,6 +55,8 @@
 #ifdef CONFIG_SMP
          {
                long cpu;
+
+               local_irq_disable();
                smp_percpu_timer_interrupt(regs);
                cpu = smp_processor_id();
                if (cpu != boot_cpuid) {
diff -urN linux/arch/alpha/kernel/traps.c linux/arch/alpha/kernel/traps.c
--- linux/arch/alpha/kernel/traps.c     2004/10/12 01:45:39     1.42
+++ linux/arch/alpha/kernel/traps.c     2005/07/12 09:18:54     1.43
@@ -240,7 +240,7 @@
        siginfo_t info;
        int signo, code;
 
-       if (regs->ps == 0) {
+       if ((regs->ps & ~IPL_MAX) == 0) {
                if (type == 1) {
                        const unsigned int *data
                          = (const unsigned int *) regs->pc;
diff -urN linux/arch/arm/Makefile linux/arch/arm/Makefile
--- linux/arch/arm/Makefile     2005/07/11 20:45:58     1.76
+++ linux/arch/arm/Makefile     2005/07/12 09:18:54     1.77
@@ -56,7 +56,7 @@
 tune-$(CONFIG_CPU_V6)          :=-mtune=strongarm
 
 # Need -Uarm for gcc < 3.x
-CFLAGS_ABI     :=$(call cc-option,-mapcs-32,-mabi=apcs-gnu)
+CFLAGS_ABI     :=$(call cc-option,-mapcs-32,-mabi=apcs-gnu) $(call 
cc-option,-mno-thumb-interwork,)
 CFLAGS         +=$(CFLAGS_ABI) $(arch-y) $(tune-y) $(call 
cc-option,-mshort-load-bytes,$(call cc-option,-malignment-traps,)) -msoft-float 
-Uarm
 AFLAGS         +=$(CFLAGS_ABI) $(arch-y) $(tune-y) -msoft-float
 
diff -urN linux/arch/arm/configs/omnimeter_defconfig 
linux/arch/arm/configs/omnimeter_defconfig
--- linux/arch/arm/configs/Attic/omnimeter_defconfig    2005-07-12 
10:18:55.191751000 +0100     1.3
+++ linux/arch/arm/configs/Attic/omnimeter_defconfig    1970/01/01 00:00:00+0100
@@ -1,803 +0,0 @@
-#
-# Automatically generated make config: don't edit
-# Linux kernel version: 2.6.12-rc1-bk2
-# Sun Mar 27 21:31:45 2005
-#
-CONFIG_ARM=y
-CONFIG_MMU=y
-CONFIG_UID16=y
-CONFIG_RWSEM_GENERIC_SPINLOCK=y
-CONFIG_GENERIC_CALIBRATE_DELAY=y
-CONFIG_GENERIC_IOMAP=y
-
-#
-# Code maturity level options
-#
-CONFIG_EXPERIMENTAL=y
-CONFIG_CLEAN_COMPILE=y
-CONFIG_BROKEN_ON_SMP=y
-
-#
-# General setup
-#
-CONFIG_LOCALVERSION=""
-CONFIG_SWAP=y
-CONFIG_SYSVIPC=y
-# CONFIG_POSIX_MQUEUE is not set
-# CONFIG_BSD_PROCESS_ACCT is not set
-CONFIG_SYSCTL=y
-# CONFIG_AUDIT is not set
-CONFIG_HOTPLUG=y
-CONFIG_KOBJECT_UEVENT=y
-# CONFIG_IKCONFIG is not set
-# CONFIG_EMBEDDED is not set
-CONFIG_KALLSYMS=y
-# CONFIG_KALLSYMS_EXTRA_PASS is not set
-CONFIG_BASE_FULL=y
-CONFIG_FUTEX=y
-CONFIG_EPOLL=y
-CONFIG_CC_OPTIMIZE_FOR_SIZE=y
-CONFIG_SHMEM=y
-CONFIG_CC_ALIGN_FUNCTIONS=0
-CONFIG_CC_ALIGN_LABELS=0
-CONFIG_CC_ALIGN_LOOPS=0
-CONFIG_CC_ALIGN_JUMPS=0
-# CONFIG_TINY_SHMEM is not set
-CONFIG_BASE_SMALL=0
-
-#
-# Loadable module support
-#
-CONFIG_MODULES=y
-# CONFIG_MODULE_UNLOAD is not set
-CONFIG_OBSOLETE_MODPARM=y
-# CONFIG_MODVERSIONS is not set
-# CONFIG_MODULE_SRCVERSION_ALL is not set
-CONFIG_KMOD=y
-
-#
-# System Type
-#
-# CONFIG_ARCH_CLPS7500 is not set
-# CONFIG_ARCH_CLPS711X is not set
-# CONFIG_ARCH_CO285 is not set
-# CONFIG_ARCH_EBSA110 is not set
-# CONFIG_ARCH_CAMELOT is not set
-# CONFIG_ARCH_FOOTBRIDGE is not set
-# CONFIG_ARCH_INTEGRATOR is not set
-# CONFIG_ARCH_IOP3XX is not set
-# CONFIG_ARCH_IXP4XX is not set
-# CONFIG_ARCH_IXP2000 is not set
-# CONFIG_ARCH_L7200 is not set
-# CONFIG_ARCH_PXA is not set
-# CONFIG_ARCH_RPC is not set
-CONFIG_ARCH_SA1100=y
-# CONFIG_ARCH_S3C2410 is not set
-# CONFIG_ARCH_SHARK is not set
-# CONFIG_ARCH_LH7A40X is not set
-# CONFIG_ARCH_OMAP is not set
-# CONFIG_ARCH_VERSATILE is not set
-# CONFIG_ARCH_IMX is not set
-# CONFIG_ARCH_H720X is not set
-
-#
-# SA11x0 Implementations
-#
-# CONFIG_SA1100_ASSABET is not set
-# CONFIG_SA1100_CERF is not set
-# CONFIG_SA1100_COLLIE is not set
-# CONFIG_SA1100_H3100 is not set
-# CONFIG_SA1100_H3600 is not set
-# CONFIG_SA1100_H3800 is not set
-# CONFIG_SA1100_BADGE4 is not set
-# CONFIG_SA1100_JORNADA720 is not set
-# CONFIG_SA1100_HACKKIT is not set
-# CONFIG_SA1100_LART is not set
-# CONFIG_SA1100_PLEB is not set
-# CONFIG_SA1100_SHANNON is not set
-# CONFIG_SA1100_SIMPAD is not set
-# CONFIG_SA1100_SSP is not set
-
-#
-# Processor Type
-#
-CONFIG_CPU_32=y
-CONFIG_CPU_SA1100=y
-CONFIG_CPU_32v4=y
-CONFIG_CPU_ABRT_EV4=y
-CONFIG_CPU_CACHE_V4WB=y
-CONFIG_CPU_CACHE_VIVT=y
-CONFIG_CPU_TLB_V4WB=y
-CONFIG_CPU_MINICACHE=y
-
-#
-# Processor Features
-#
-
-#
-# Bus support
-#
-CONFIG_ISA=y
-
-#
-# PCCARD (PCMCIA/CardBus) support
-#
-CONFIG_PCCARD=y
-# CONFIG_PCMCIA_DEBUG is not set
-CONFIG_PCMCIA=y
-
-#
-# PC-card bridges
-#
-CONFIG_I82365=y
-# CONFIG_TCIC is not set
-CONFIG_PCMCIA_SA1100=y
-CONFIG_PCCARD_NONSTATIC=y
-
-#
-# Kernel Features
-#
-# CONFIG_PREEMPT is not set
-CONFIG_DISCONTIGMEM=y
-# CONFIG_LEDS is not set
-CONFIG_ALIGNMENT_TRAP=y
-
-#
-# Boot options
-#
-CONFIG_ZBOOT_ROM_TEXT=0x0
-CONFIG_ZBOOT_ROM_BSS=0x0
-CONFIG_CMDLINE="keepinitrd mem=16M root=/dev/ram ramdisk=8192 
initrd=0xd0000000,4M"
-# CONFIG_XIP_KERNEL is not set
-
-#
-# CPU Frequency scaling
-#
-# CONFIG_CPU_FREQ is not set
-
-#
-# Floating point emulation
-#
-
-#
-# At least one emulation must be selected
-#
-# CONFIG_FPE_NWFPE is not set
-# CONFIG_FPE_FASTFPE is not set
-
-#
-# Userspace binary formats
-#
-CONFIG_BINFMT_ELF=y
-CONFIG_BINFMT_AOUT=y
-# CONFIG_BINFMT_MISC is not set
-# CONFIG_ARTHUR is not set
-
-#
-# Power management options
-#
-# CONFIG_PM is not set
-
-#
-# Device Drivers
-#
-
-#
-# Generic Driver Options
-#
-CONFIG_STANDALONE=y
-CONFIG_PREVENT_FIRMWARE_BUILD=y
-# CONFIG_FW_LOADER is not set
-
-#
-# Memory Technology Devices (MTD)
-#
-# CONFIG_MTD is not set
-
-#
-# Parallel port support
-#
-# CONFIG_PARPORT is not set
-
-#
-# Plug and Play support
-#
-# CONFIG_PNP is not set
-
-#
-# Block devices
-#
-# CONFIG_BLK_DEV_FD is not set
-# CONFIG_BLK_DEV_XD is not set
-# CONFIG_BLK_DEV_COW_COMMON is not set
-CONFIG_BLK_DEV_LOOP=m
-# CONFIG_BLK_DEV_CRYPTOLOOP is not set
-CONFIG_BLK_DEV_NBD=m
-# CONFIG_BLK_DEV_RAM is not set
-CONFIG_BLK_DEV_RAM_COUNT=16
-CONFIG_INITRAMFS_SOURCE=""
-# CONFIG_CDROM_PKTCDVD is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
-# CONFIG_ATA_OVER_ETH is not set
-
-#
-# ATA/ATAPI/MFM/RLL support
-#
-CONFIG_IDE=y
-CONFIG_BLK_DEV_IDE=y
-
-#
-# Please see Documentation/ide.txt for help/info on IDE drives
-#
-# CONFIG_BLK_DEV_IDE_SATA is not set
-CONFIG_BLK_DEV_IDEDISK=y
-# CONFIG_IDEDISK_MULTI_MODE is not set
-# CONFIG_BLK_DEV_IDECS is not set
-# CONFIG_BLK_DEV_IDECD is not set
-# CONFIG_BLK_DEV_IDETAPE is not set
-# CONFIG_BLK_DEV_IDEFLOPPY is not set
-# CONFIG_IDE_TASK_IOCTL is not set
-
-#
-# IDE chipset support/bugfixes
-#
-CONFIG_IDE_GENERIC=y
-# CONFIG_IDE_ARM is not set
-# CONFIG_IDE_CHIPSETS is not set
-# CONFIG_BLK_DEV_IDEDMA is not set
-# CONFIG_IDEDMA_AUTO is not set
-# CONFIG_BLK_DEV_HD is not set
-
-#
-# SCSI device support
-#
-# CONFIG_SCSI is not set
-
-#
-# Multi-device support (RAID and LVM)
-#
-# CONFIG_MD is not set
-
-#
-# Fusion MPT device support
-#
-
-#
-# IEEE 1394 (FireWire) support
-#
-
-#
-# I2O device support
-#
-
-#
-# Networking support
-#
-CONFIG_NET=y
-
-#
-# Networking options
-#
-CONFIG_PACKET=y
-CONFIG_PACKET_MMAP=y
-# CONFIG_NETLINK_DEV is not set
-CONFIG_UNIX=y
-# CONFIG_NET_KEY is not set
-CONFIG_INET=y
-CONFIG_IP_MULTICAST=y
-# CONFIG_IP_ADVANCED_ROUTER is not set
-# CONFIG_IP_PNP is not set
-# CONFIG_NET_IPIP is not set
-# CONFIG_NET_IPGRE is not set
-# CONFIG_IP_MROUTE is not set
-# CONFIG_ARPD is not set
-# CONFIG_SYN_COOKIES is not set
-# CONFIG_INET_AH is not set
-# CONFIG_INET_ESP is not set
-# CONFIG_INET_IPCOMP is not set
-# CONFIG_INET_TUNNEL is not set
-CONFIG_IP_TCPDIAG=y
-# CONFIG_IP_TCPDIAG_IPV6 is not set
-
-#
-# IP: Virtual Server Configuration
-#
-# CONFIG_IP_VS is not set
-# CONFIG_IPV6 is not set
-CONFIG_NETFILTER=y
-# CONFIG_NETFILTER_DEBUG is not set
-
-#
-# IP: Netfilter Configuration
-#
-# CONFIG_IP_NF_CONNTRACK is not set
-# CONFIG_IP_NF_CONNTRACK_MARK is not set
-# CONFIG_IP_NF_QUEUE is not set
-# CONFIG_IP_NF_IPTABLES is not set
-# CONFIG_IP_NF_ARPTABLES is not set
-
-#
-# SCTP Configuration (EXPERIMENTAL)
-#
-# CONFIG_IP_SCTP is not set
-# CONFIG_ATM is not set
-# CONFIG_BRIDGE is not set
-# CONFIG_VLAN_8021Q is not set
-# CONFIG_DECNET is not set
-# CONFIG_LLC2 is not set
-# CONFIG_IPX is not set
-# CONFIG_ATALK is not set
-# CONFIG_X25 is not set
-# CONFIG_LAPB is not set
-# CONFIG_NET_DIVERT is not set
-# CONFIG_ECONET is not set
-# CONFIG_WAN_ROUTER is not set
-
-#
-# QoS and/or fair queueing
-#
-# CONFIG_NET_SCHED is not set
-# CONFIG_NET_CLS_ROUTE is not set
-
-#
-# Network testing
-#
-# CONFIG_NET_PKTGEN is not set
-# CONFIG_NETPOLL is not set
-# CONFIG_NET_POLL_CONTROLLER is not set
-# CONFIG_HAMRADIO is not set
-# CONFIG_IRDA is not set
-# CONFIG_BT is not set
-CONFIG_NETDEVICES=y
-# CONFIG_DUMMY is not set
-# CONFIG_BONDING is not set
-# CONFIG_EQUALIZER is not set
-# CONFIG_TUN is not set
-
-#
-# ARCnet devices
-#
-# CONFIG_ARCNET is not set
-
-#
-# Ethernet (10 or 100Mbit)
-#
-CONFIG_NET_ETHERNET=y
-# CONFIG_MII is not set
-# CONFIG_NET_VENDOR_3COM is not set
-# CONFIG_LANCE is not set
-# CONFIG_NET_VENDOR_SMC is not set
-# CONFIG_SMC91X is not set
-# CONFIG_NET_VENDOR_RACAL is not set
-# CONFIG_AT1700 is not set
-# CONFIG_DEPCA is not set
-# CONFIG_HP100 is not set
-# CONFIG_NET_ISA is not set
-# CONFIG_NET_PCI is not set
-# CONFIG_NET_POCKET is not set
-
-#
-# Ethernet (1000 Mbit)
-#
-
-#
-# Ethernet (10000 Mbit)
-#
-
-#
-# Token Ring devices
-#
-# CONFIG_TR is not set
-
-#
-# Wireless LAN (non-hamradio)
-#
-CONFIG_NET_RADIO=y
-
-#
-# Obsolete Wireless cards support (pre-802.11)
-#
-# CONFIG_STRIP is not set
-# CONFIG_ARLAN is not set
-# CONFIG_WAVELAN is not set
-CONFIG_PCMCIA_WAVELAN=y
-# CONFIG_PCMCIA_NETWAVE is not set
-
-#
-# Wireless 802.11 Frequency Hopping cards support
-#
-# CONFIG_PCMCIA_RAYCS is not set
-
-#
-# Wireless 802.11b ISA/PCI cards support
-#
-# CONFIG_HERMES is not set
-# CONFIG_ATMEL is not set
-
-#
-# Wireless 802.11b Pcmcia/Cardbus cards support
-#
-CONFIG_AIRO_CS=y
-CONFIG_PCMCIA_WL3501=y
-CONFIG_NET_WIRELESS=y
-
-#
-# PCMCIA network device support
-#
-CONFIG_NET_PCMCIA=y
-CONFIG_PCMCIA_3C589=y
-# CONFIG_PCMCIA_3C574 is not set
-# CONFIG_PCMCIA_FMVJ18X is not set
-CONFIG_PCMCIA_PCNET=y
-# CONFIG_PCMCIA_NMCLAN is not set
-# CONFIG_PCMCIA_SMC91C92 is not set
-# CONFIG_PCMCIA_XIRC2PS is not set
-# CONFIG_PCMCIA_AXNET is not set
-
-#
-# Wan interfaces
-#
-# CONFIG_WAN is not set
-# CONFIG_PPP is not set
-# CONFIG_SLIP is not set
-# CONFIG_SHAPER is not set
-# CONFIG_NETCONSOLE is not set
-
-#
-# ISDN subsystem
-#
-# CONFIG_ISDN is not set
-
-#
-# Input device support
-#
-CONFIG_INPUT=y
-
-#
-# Userland interfaces
-#
-CONFIG_INPUT_MOUSEDEV=y
-CONFIG_INPUT_MOUSEDEV_PSAUX=y
-CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
-CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
-# CONFIG_INPUT_JOYDEV is not set
-# CONFIG_INPUT_TSDEV is not set
-# CONFIG_INPUT_EVDEV is not set
-# CONFIG_INPUT_EVBUG is not set
-
-#
-# Input Device Drivers
-#
-CONFIG_INPUT_KEYBOARD=y
-CONFIG_KEYBOARD_ATKBD=y
-# CONFIG_KEYBOARD_SUNKBD is not set
-# CONFIG_KEYBOARD_LKKBD is not set
-# CONFIG_KEYBOARD_XTKBD is not set
-# CONFIG_KEYBOARD_NEWTON is not set
-CONFIG_INPUT_MOUSE=y
-CONFIG_MOUSE_PS2=y
-# CONFIG_MOUSE_SERIAL is not set
-# CONFIG_MOUSE_INPORT is not set
-# CONFIG_MOUSE_LOGIBM is not set
-# CONFIG_MOUSE_PC110PAD is not set
-# CONFIG_MOUSE_VSXXXAA is not set
-# CONFIG_INPUT_JOYSTICK is not set
-# CONFIG_INPUT_TOUCHSCREEN is not set
-# CONFIG_INPUT_MISC is not set
-
-#
-# Hardware I/O ports
-#
-CONFIG_SERIO=y
-CONFIG_SERIO_SERPORT=y
-CONFIG_SERIO_LIBPS2=y
-# CONFIG_SERIO_RAW is not set
-# CONFIG_GAMEPORT is not set
-CONFIG_SOUND_GAMEPORT=y
-
-#
-# Character devices
-#
-CONFIG_VT=y
-CONFIG_VT_CONSOLE=y
-CONFIG_HW_CONSOLE=y
-# CONFIG_SERIAL_NONSTANDARD is not set
-
-#
-# Serial drivers
-#
-# CONFIG_SERIAL_8250 is not set
-
-#
-# Non-8250 serial port support
-#
-CONFIG_SERIAL_SA1100=y
-CONFIG_SERIAL_SA1100_CONSOLE=y
-CONFIG_SERIAL_CORE=y
-CONFIG_SERIAL_CORE_CONSOLE=y
-CONFIG_UNIX98_PTYS=y
-CONFIG_LEGACY_PTYS=y
-CONFIG_LEGACY_PTY_COUNT=256
-
-#
-# IPMI
-#
-# CONFIG_IPMI_HANDLER is not set
-
-#
-# Watchdog Cards
-#
-# CONFIG_WATCHDOG is not set
-# CONFIG_NVRAM is not set
-# CONFIG_RTC is not set
-# CONFIG_DTLK is not set
-# CONFIG_R3964 is not set
-
-#
-# Ftape, the floppy tape device driver
-#
-# CONFIG_DRM is not set
-
-#
-# PCMCIA character devices
-#
-# CONFIG_SYNCLINK_CS is not set
-# CONFIG_RAW_DRIVER is not set
-
-#
-# TPM devices
-#
-# CONFIG_TCG_TPM is not set
-
-#
-# I2C support
-#
-# CONFIG_I2C is not set
-
-#
-# Misc devices
-#
-
-#
-# Multimedia devices
-#
-# CONFIG_VIDEO_DEV is not set
-
-#
-# Digital Video Broadcasting Devices
-#
-# CONFIG_DVB is not set
-
-#
-# Graphics support
-#
-CONFIG_FB=y
-CONFIG_FB_CFB_FILLRECT=y
-CONFIG_FB_CFB_COPYAREA=y
-CONFIG_FB_CFB_IMAGEBLIT=y
-CONFIG_FB_SOFT_CURSOR=y
-# CONFIG_FB_MODE_HELPERS is not set
-# CONFIG_FB_TILEBLITTING is not set
-CONFIG_FB_SA1100=y
-# CONFIG_FB_VIRTUAL is not set
-
-#
-# Console display driver support
-#
-# CONFIG_VGA_CONSOLE is not set
-# CONFIG_MDA_CONSOLE is not set
-CONFIG_DUMMY_CONSOLE=y
-CONFIG_FRAMEBUFFER_CONSOLE=y
-CONFIG_FONTS=y
-CONFIG_FONT_8x8=y
-# CONFIG_FONT_8x16 is not set
-# CONFIG_FONT_6x11 is not set
-# CONFIG_FONT_PEARL_8x8 is not set
-# CONFIG_FONT_ACORN_8x8 is not set
-# CONFIG_FONT_MINI_4x6 is not set
-# CONFIG_FONT_SUN8x16 is not set
-# CONFIG_FONT_SUN12x22 is not set
-
-#
-# Logo configuration
-#
-# CONFIG_LOGO is not set
-# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-
-#
-# Sound
-#
-# CONFIG_SOUND is not set
-
-#
-# USB support
-#
-CONFIG_USB_ARCH_HAS_HCD=y
-# CONFIG_USB_ARCH_HAS_OHCI is not set
-# CONFIG_USB is not set
-
-#
-# USB Gadget Support
-#
-# CONFIG_USB_GADGET is not set
-
-#
-# MMC/SD Card support
-#
-# CONFIG_MMC is not set
-
-#
-# File systems
-#
-CONFIG_EXT2_FS=y
-# CONFIG_EXT2_FS_XATTR is not set
-# CONFIG_EXT3_FS is not set
-# CONFIG_JBD is not set
-# CONFIG_REISERFS_FS is not set
-# CONFIG_JFS_FS is not set
-
-#
-# XFS support
-#
-# CONFIG_XFS_FS is not set
-# CONFIG_MINIX_FS is not set
-# CONFIG_ROMFS_FS is not set
-# CONFIG_QUOTA is not set
-CONFIG_DNOTIFY=y
-# CONFIG_AUTOFS_FS is not set
-# CONFIG_AUTOFS4_FS is not set
-
-#
-# CD-ROM/DVD Filesystems
-#
-# CONFIG_ISO9660_FS is not set
-# CONFIG_UDF_FS is not set
-
-#
-# DOS/FAT/NT Filesystems
-#
-CONFIG_FAT_FS=y
-CONFIG_MSDOS_FS=y
-# CONFIG_VFAT_FS is not set
-CONFIG_FAT_DEFAULT_CODEPAGE=437
-# CONFIG_NTFS_FS is not set
-
-#
-# Pseudo filesystems
-#
-CONFIG_PROC_FS=y
-CONFIG_SYSFS=y
-# CONFIG_DEVFS_FS is not set
-# CONFIG_DEVPTS_FS_XATTR is not set
-# CONFIG_TMPFS is not set
-# CONFIG_HUGETLB_PAGE is not set
-CONFIG_RAMFS=y
-
-#
-# Miscellaneous filesystems
-#
-# CONFIG_ADFS_FS is not set
-# CONFIG_AFFS_FS is not set
-# CONFIG_HFS_FS is not set
-# CONFIG_HFSPLUS_FS is not set
-# CONFIG_BEFS_FS is not set
-# CONFIG_BFS_FS is not set
-# CONFIG_EFS_FS is not set
-# CONFIG_CRAMFS is not set
-# CONFIG_VXFS_FS is not set
-# CONFIG_HPFS_FS is not set
-# CONFIG_QNX4FS_FS is not set
-# CONFIG_SYSV_FS is not set
-# CONFIG_UFS_FS is not set
-
-#
-# Network File Systems
-#
-CONFIG_NFS_FS=y
-# CONFIG_NFS_V3 is not set
-# CONFIG_NFS_V4 is not set
-# CONFIG_NFS_DIRECTIO is not set
-# CONFIG_NFSD is not set
-CONFIG_LOCKD=y
-CONFIG_SUNRPC=y
-# CONFIG_RPCSEC_GSS_KRB5 is not set
-# CONFIG_RPCSEC_GSS_SPKM3 is not set
-# CONFIG_SMB_FS is not set
-# CONFIG_CIFS is not set
-# CONFIG_NCP_FS is not set
-# CONFIG_CODA_FS is not set
-# CONFIG_AFS_FS is not set
-
-#
-# Partition Types
-#
-# CONFIG_PARTITION_ADVANCED is not set
-CONFIG_MSDOS_PARTITION=y
-
-#
-# Native Language Support
-#
-CONFIG_NLS=y
-CONFIG_NLS_DEFAULT="iso8859-1"
-# CONFIG_NLS_CODEPAGE_437 is not set
-# CONFIG_NLS_CODEPAGE_737 is not set
-# CONFIG_NLS_CODEPAGE_775 is not set
-# CONFIG_NLS_CODEPAGE_850 is not set
-# CONFIG_NLS_CODEPAGE_852 is not set
-# CONFIG_NLS_CODEPAGE_855 is not set
-# CONFIG_NLS_CODEPAGE_857 is not set
-# CONFIG_NLS_CODEPAGE_860 is not set
-# CONFIG_NLS_CODEPAGE_861 is not set
-# CONFIG_NLS_CODEPAGE_862 is not set
-# CONFIG_NLS_CODEPAGE_863 is not set
-# CONFIG_NLS_CODEPAGE_864 is not set
-# CONFIG_NLS_CODEPAGE_865 is not set
-# CONFIG_NLS_CODEPAGE_866 is not set
-# CONFIG_NLS_CODEPAGE_869 is not set
-# CONFIG_NLS_CODEPAGE_936 is not set
-# CONFIG_NLS_CODEPAGE_950 is not set
-# CONFIG_NLS_CODEPAGE_932 is not set
-# CONFIG_NLS_CODEPAGE_949 is not set
-# CONFIG_NLS_CODEPAGE_874 is not set
-# CONFIG_NLS_ISO8859_8 is not set
-# CONFIG_NLS_CODEPAGE_1250 is not set
-# CONFIG_NLS_CODEPAGE_1251 is not set
-# CONFIG_NLS_ASCII is not set
-# CONFIG_NLS_ISO8859_1 is not set
-# CONFIG_NLS_ISO8859_2 is not set
-# CONFIG_NLS_ISO8859_3 is not set
-# CONFIG_NLS_ISO8859_4 is not set
-# CONFIG_NLS_ISO8859_5 is not set
-# CONFIG_NLS_ISO8859_6 is not set
-# CONFIG_NLS_ISO8859_7 is not set
-# CONFIG_NLS_ISO8859_9 is not set
-# CONFIG_NLS_ISO8859_13 is not set
-# CONFIG_NLS_ISO8859_14 is not set
-# CONFIG_NLS_ISO8859_15 is not set
-# CONFIG_NLS_KOI8_R is not set
-# CONFIG_NLS_KOI8_U is not set
-# CONFIG_NLS_UTF8 is not set
-
-#
-# Profiling support
-#
-# CONFIG_PROFILING is not set
-
-#
-# Kernel hacking
-#
-# CONFIG_PRINTK_TIME is not set
-# CONFIG_DEBUG_KERNEL is not set
-CONFIG_LOG_BUF_SHIFT=14
-CONFIG_DEBUG_BUGVERBOSE=y
-CONFIG_FRAME_POINTER=y
-# CONFIG_DEBUG_USER is not set
-
-#
-# Security options
-#
-# CONFIG_KEYS is not set
-# CONFIG_SECURITY is not set
-
-#
-# Cryptographic options
-#
-# CONFIG_CRYPTO is not set
-
-#
-# Hardware crypto devices
-#
-
-#
-# Library routines
-#
-# CONFIG_CRC_CCITT is not set
-CONFIG_CRC32=y
-# CONFIG_LIBCRC32C is not set
diff -urN linux/arch/arm/kernel/armksyms.c linux/arch/arm/kernel/armksyms.c
--- linux/arch/arm/kernel/armksyms.c    2004/10/25 20:44:10     1.44
+++ linux/arch/arm/kernel/armksyms.c    2005/07/12 09:18:55     1.45
@@ -30,9 +30,6 @@
 extern void __modsi3(void);
 extern void __muldi3(void);
 extern void __ucmpdi2(void);
-extern void __udivdi3(void);
-extern void __umoddi3(void);
-extern void __udivmoddi4(void);
 extern void __udivsi3(void);
 extern void __umodsi3(void);
 extern void __do_div64(void);
@@ -134,9 +131,6 @@
 EXPORT_SYMBOL(__modsi3);
 EXPORT_SYMBOL(__muldi3);
 EXPORT_SYMBOL(__ucmpdi2);
-EXPORT_SYMBOL(__udivdi3);
-EXPORT_SYMBOL(__umoddi3);
-EXPORT_SYMBOL(__udivmoddi4);
 EXPORT_SYMBOL(__udivsi3);
 EXPORT_SYMBOL(__umodsi3);
 EXPORT_SYMBOL(__do_div64);
diff -urN linux/arch/arm/kernel/head.S linux/arch/arm/kernel/head.S
--- linux/arch/arm/kernel/head.S        2005/07/11 20:45:59     1.18
+++ linux/arch/arm/kernel/head.S        2005/07/12 09:18:55     1.19
@@ -344,9 +344,9 @@
        str     r6, [r0]
 #endif
 
+#ifdef CONFIG_DEBUG_LL
        bic     r7, r7, #0x0c                   @ turn off cacheable
                                                @ and bufferable bits
-#ifdef CONFIG_DEBUG_LL
        /*
         * Map in IO space for serial debugging.
         * This allows debug messages to be output
@@ -372,28 +372,24 @@
        teq     r1, #MACH_TYPE_NETWINDER
        teqne   r1, #MACH_TYPE_CATS
        bne     1f
-       add     r0, r4, #0x3fc0                 @ ff000000
-       mov     r3, #0x7c000000
-       orr     r3, r3, r7
-       str     r3, [r0], #4
-       add     r3, r3, #1 << 20
-       str     r3, [r0], #4
+       add     r0, r4, #0xff000000 >> 18
+       orr     r3, r7, #0x7c000000
+       str     r3, [r0]
 1:
 #endif
-#endif
 #ifdef CONFIG_ARCH_RPC
        /*
         * Map in screen at 0x02000000 & SCREEN2_BASE
         * Similar reasons here - for debug.  This is
         * only for Acorn RiscPC architectures.
         */
-       add     r0, r4, #0x80                   @ 02000000
-       mov     r3, #0x02000000
-       orr     r3, r3, r7
+       add     r0, r4, #0x02000000 >> 18
+       orr     r3, r7, #0x02000000
        str     r3, [r0]
-       add     r0, r4, #0x3600                 @ d8000000
+       add     r0, r4, #0xd8000000 >> 18
        str     r3, [r0]
 #endif
+#endif
        mov     pc, lr
        .ltorg
 
diff -urN linux/arch/arm/kernel/setup.c linux/arch/arm/kernel/setup.c
--- linux/arch/arm/kernel/setup.c       2005/07/11 20:45:59     1.60
+++ linux/arch/arm/kernel/setup.c       2005/07/12 09:18:55     1.61
@@ -359,7 +359,8 @@
              "I" (offsetof(struct stack, abt[0])),
              "I" (PSR_F_BIT | PSR_I_BIT | UND_MODE),
              "I" (offsetof(struct stack, und[0])),
-             "I" (PSR_F_BIT | PSR_I_BIT | SVC_MODE));
+             "I" (PSR_F_BIT | PSR_I_BIT | SVC_MODE)
+           : "r14");
 }
 
 static struct machine_desc * __init setup_machine(unsigned int nr)
@@ -736,8 +737,8 @@
        if (mdesc->soft_reboot)
                reboot_setup("s");
 
-       if (mdesc->param_offset)
-               tags = phys_to_virt(mdesc->param_offset);
+       if (mdesc->boot_params)
+               tags = phys_to_virt(mdesc->boot_params);
 
        /*
         * If we have the old style parameters, convert them to
diff -urN linux/arch/arm/kernel/smp.c linux/arch/arm/kernel/smp.c
--- linux/arch/arm/kernel/smp.c 2005/07/11 20:45:59     1.3
+++ linux/arch/arm/kernel/smp.c 2005/07/12 09:18:55     1.4
@@ -502,3 +502,126 @@
 {
        return -EINVAL;
 }
+
+static int
+on_each_cpu_mask(void (*func)(void *), void *info, int retry, int wait,
+                cpumask_t mask)
+{
+       int ret = 0;
+
+       preempt_disable();
+
+       ret = smp_call_function_on_cpu(func, info, retry, wait, mask);
+       if (cpu_isset(smp_processor_id(), mask))
+               func(info);
+
+       preempt_enable();
+
+       return ret;
+}
+
+/**********************************************************************/
+
+/*
+ * TLB operations
+ */
+struct tlb_args {
+       struct vm_area_struct *ta_vma;
+       unsigned long ta_start;
+       unsigned long ta_end;
+};
+
+static inline void ipi_flush_tlb_all(void *ignored)
+{
+       local_flush_tlb_all();
+}
+
+static inline void ipi_flush_tlb_mm(void *arg)
+{
+       struct mm_struct *mm = (struct mm_struct *)arg;
+
+       local_flush_tlb_mm(mm);
+}
+
+static inline void ipi_flush_tlb_page(void *arg)
+{
+       struct tlb_args *ta = (struct tlb_args *)arg;
+
+       local_flush_tlb_page(ta->ta_vma, ta->ta_start);
+}
+
+static inline void ipi_flush_tlb_kernel_page(void *arg)
+{
+       struct tlb_args *ta = (struct tlb_args *)arg;
+
+       local_flush_tlb_kernel_page(ta->ta_start);
+}
+
+static inline void ipi_flush_tlb_range(void *arg)
+{
+       struct tlb_args *ta = (struct tlb_args *)arg;
+
+       local_flush_tlb_range(ta->ta_vma, ta->ta_start, ta->ta_end);
+}
+
+static inline void ipi_flush_tlb_kernel_range(void *arg)
+{
+       struct tlb_args *ta = (struct tlb_args *)arg;
+
+       local_flush_tlb_kernel_range(ta->ta_start, ta->ta_end);
+}
+
+void flush_tlb_all(void)
+{
+       on_each_cpu(ipi_flush_tlb_all, NULL, 1, 1);
+}
+
+void flush_tlb_mm(struct mm_struct *mm)
+{
+       cpumask_t mask = mm->cpu_vm_mask;
+
+       on_each_cpu_mask(ipi_flush_tlb_mm, mm, 1, 1, mask);
+}
+
+void flush_tlb_page(struct vm_area_struct *vma, unsigned long uaddr)
+{
+       cpumask_t mask = vma->vm_mm->cpu_vm_mask;
+       struct tlb_args ta;
+
+       ta.ta_vma = vma;
+       ta.ta_start = uaddr;
+
+       on_each_cpu_mask(ipi_flush_tlb_page, &ta, 1, 1, mask);
+}
+
+void flush_tlb_kernel_page(unsigned long kaddr)
+{
+       struct tlb_args ta;
+
+       ta.ta_start = kaddr;
+
+       on_each_cpu(ipi_flush_tlb_kernel_page, &ta, 1, 1);
+}
+
+void flush_tlb_range(struct vm_area_struct *vma,
+                     unsigned long start, unsigned long end)
+{
+       cpumask_t mask = vma->vm_mm->cpu_vm_mask;
+       struct tlb_args ta;
+
+       ta.ta_vma = vma;
+       ta.ta_start = start;
+       ta.ta_end = end;
+
+       on_each_cpu_mask(ipi_flush_tlb_range, &ta, 1, 1, mask);
+}
+
+void flush_tlb_kernel_range(unsigned long start, unsigned long end)
+{
+       struct tlb_args ta;
+
+       ta.ta_start = start;
+       ta.ta_end = end;
+
+       on_each_cpu(ipi_flush_tlb_kernel_range, &ta, 1, 1);
+}
diff -urN linux/arch/arm/kernel/traps.c linux/arch/arm/kernel/traps.c
--- linux/arch/arm/kernel/traps.c       2005/07/11 20:45:59     1.53
+++ linux/arch/arm/kernel/traps.c       2005/07/12 09:18:55     1.54
@@ -230,16 +230,8 @@
        do_exit(SIGSEGV);
 }
 
-void die_if_kernel(const char *str, struct pt_regs *regs, int err)
-{
-       if (user_mode(regs))
-               return;
-
-       die(str, regs, err);
-}
-
-static void notify_die(const char *str, struct pt_regs *regs, siginfo_t *info,
-                      unsigned long err, unsigned long trap)
+void notify_die(const char *str, struct pt_regs *regs, struct siginfo *info,
+               unsigned long err, unsigned long trap)
 {
        if (user_mode(regs)) {
                current->thread.error_code = err;
diff -urN linux/arch/arm/lib/Makefile linux/arch/arm/lib/Makefile
--- linux/arch/arm/lib/Makefile 2004/11/15 11:49:14     1.35
+++ linux/arch/arm/lib/Makefile 2005/07/12 09:18:55     1.36
@@ -11,7 +11,7 @@
                   strnlen_user.o strchr.o strrchr.o testchangebit.o  \
                   testclearbit.o testsetbit.o uaccess.o getuser.o    \
                   putuser.o ashldi3.o ashrdi3.o lshrdi3.o muldi3.o   \
-                  ucmpdi2.o udivdi3.o lib1funcs.o div64.o            \
+                  ucmpdi2.o lib1funcs.o div64.o                      \
                   io-readsb.o io-writesb.o io-readsl.o io-writesl.o
 
 ifeq ($(CONFIG_CPU_32v3),y)
diff -urN linux/arch/arm/lib/longlong.h linux/arch/arm/lib/longlong.h
--- linux/arch/arm/lib/Attic/longlong.h 2005-07-12 10:18:55.776579000 +0100     
1.4
+++ linux/arch/arm/lib/Attic/longlong.h 1970/01/01 00:00:00+0100
@@ -1,183 +0,0 @@
-/* longlong.h -- based on code from gcc-2.95.3
-
-   definitions for mixed size 32/64 bit arithmetic.
-   Copyright (C) 1991, 92, 94, 95, 96, 1997, 1998 Free Software Foundation, 
Inc.
-
-   This definition file 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, or (at your option) any later version.
-
-   This definition file is distributed in the hope that it will be
-   useful, but WITHOUT ANY WARRANTY; without even the implied
-   warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-   See the GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place - Suite 330,
-   Boston, MA 02111-1307, USA.  */
-
-/* Borrowed from GCC 2.95.3, I Molton 29/07/01 */
-
-#ifndef SI_TYPE_SIZE
-#define SI_TYPE_SIZE 32
-#endif
-
-#define __BITS4 (SI_TYPE_SIZE / 4)
-#define __ll_B (1L << (SI_TYPE_SIZE / 2))
-#define __ll_lowpart(t) ((u32) (t) % __ll_B)
-#define __ll_highpart(t) ((u32) (t) / __ll_B)
-
-/* Define auxiliary asm macros.
-
-   1) umul_ppmm(high_prod, low_prod, multipler, multiplicand)
-   multiplies two u32 integers MULTIPLER and MULTIPLICAND,
-   and generates a two-part u32 product in HIGH_PROD and
-   LOW_PROD.
-
-   2) __umulsidi3(a,b) multiplies two u32 integers A and B,
-   and returns a u64 product.  This is just a variant of umul_ppmm.
-
-   3) udiv_qrnnd(quotient, remainder, high_numerator, low_numerator,
-   denominator) divides a two-word unsigned integer, composed by the
-   integers HIGH_NUMERATOR and LOW_NUMERATOR, by DENOMINATOR and
-   places the quotient in QUOTIENT and the remainder in REMAINDER.
-   HIGH_NUMERATOR must be less than DENOMINATOR for correct operation.
-   If, in addition, the most significant bit of DENOMINATOR must be 1,
-   then the pre-processor symbol UDIV_NEEDS_NORMALIZATION is defined to 1.
-
-   4) sdiv_qrnnd(quotient, remainder, high_numerator, low_numerator,
-   denominator).  Like udiv_qrnnd but the numbers are signed.  The
-   quotient is rounded towards 0.
-
-   5) count_leading_zeros(count, x) counts the number of zero-bits from
-   the msb to the first non-zero bit.  This is the number of steps X
-   needs to be shifted left to set the msb.  Undefined for X == 0.
-
-   6) add_ssaaaa(high_sum, low_sum, high_addend_1, low_addend_1,
-   high_addend_2, low_addend_2) adds two two-word unsigned integers,
-   composed by HIGH_ADDEND_1 and LOW_ADDEND_1, and HIGH_ADDEND_2 and
-   LOW_ADDEND_2 respectively.  The result is placed in HIGH_SUM and
-   LOW_SUM.  Overflow (i.e. carry out) is not stored anywhere, and is
-   lost.
-
-   7) sub_ddmmss(high_difference, low_difference, high_minuend,
-   low_minuend, high_subtrahend, low_subtrahend) subtracts two
-   two-word unsigned integers, composed by HIGH_MINUEND_1 and
-   LOW_MINUEND_1, and HIGH_SUBTRAHEND_2 and LOW_SUBTRAHEND_2
-   respectively.  The result is placed in HIGH_DIFFERENCE and
-   LOW_DIFFERENCE.  Overflow (i.e. carry out) is not stored anywhere,
-   and is lost.
-
-   If any of these macros are left undefined for a particular CPU,
-   C macros are used.  */
-
-#if defined (__arm__)
-#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
-  __asm__ ("adds       %1, %4, %5                                      \n\
-       adc     %0, %2, %3"                                             \
-          : "=r" ((u32) (sh)),                                 \
-            "=&r" ((u32) (sl))                                 \
-          : "%r" ((u32) (ah)),                                 \
-            "rI" ((u32) (bh)),                                 \
-            "%r" ((u32) (al)),                                 \
-            "rI" ((u32) (bl)))
-#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
-  __asm__ ("subs       %1, %4, %5                                      \n\
-       sbc     %0, %2, %3"                                             \
-          : "=r" ((u32) (sh)),                                 \
-            "=&r" ((u32) (sl))                                 \
-          : "r" ((u32) (ah)),                                  \
-            "rI" ((u32) (bh)),                                 \
-            "r" ((u32) (al)),                                  \
-            "rI" ((u32) (bl)))
-#define umul_ppmm(xh, xl, a, b) \
-{register u32 __t0, __t1, __t2;                                        \
-  __asm__ ("%@ Inlined umul_ppmm                                       \n\
-       mov     %2, %5, lsr #16                                         \n\
-       mov     %0, %6, lsr #16                                         \n\
-       bic     %3, %5, %2, lsl #16                                     \n\
-       bic     %4, %6, %0, lsl #16                                     \n\
-       mul     %1, %3, %4                                              \n\
-       mul     %4, %2, %4                                              \n\
-       mul     %3, %0, %3                                              \n\
-       mul     %0, %2, %0                                              \n\
-       adds    %3, %4, %3                                              \n\
-       addcs   %0, %0, #65536                                          \n\
-       adds    %1, %1, %3, lsl #16                                     \n\
-       adc     %0, %0, %3, lsr #16"                                    \
-          : "=&r" ((u32) (xh)),                                        \
-            "=r" ((u32) (xl)),                                 \
-            "=&r" (__t0), "=&r" (__t1), "=r" (__t2)                    \
-          : "r" ((u32) (a)),                                   \
-            "r" ((u32) (b)));}
-#define UMUL_TIME 20
-#define UDIV_TIME 100
-#endif                         /* __arm__ */
-
-#define __umulsidi3(u, v) \
-  ({DIunion __w;                                                       \
-    umul_ppmm (__w.s.high, __w.s.low, u, v);                           \
-    __w.ll; })
-
-#define __udiv_qrnnd_c(q, r, n1, n0, d) \
-  do {                                                                 \
-    u32 __d1, __d0, __q1, __q0;                                        \
-    u32 __r1, __r0, __m;                                               \
-    __d1 = __ll_highpart (d);                                          \
-    __d0 = __ll_lowpart (d);                                           \
-                                                                       \
-    __r1 = (n1) % __d1;                                                        
\
-    __q1 = (n1) / __d1;                                                        
\
-    __m = (u32) __q1 * __d0;                                   \
-    __r1 = __r1 * __ll_B | __ll_highpart (n0);                         \
-    if (__r1 < __m)                                                    \
-      {                                                                        
\
-       __q1--, __r1 += (d);                                            \
-       if (__r1 >= (d)) /* i.e. we didn't get carry when adding to __r1 */\
-         if (__r1 < __m)                                               \
-           __q1--, __r1 += (d);                                        \
-      }                                                                        
\
-    __r1 -= __m;                                                       \
-                                                                       \
-    __r0 = __r1 % __d1;                                                        
\
-    __q0 = __r1 / __d1;                                                        
\
-    __m = (u32) __q0 * __d0;                                   \
-    __r0 = __r0 * __ll_B | __ll_lowpart (n0);                          \
-    if (__r0 < __m)                                                    \
-      {                                                                        
\
-       __q0--, __r0 += (d);                                            \
-       if (__r0 >= (d))                                                \
-         if (__r0 < __m)                                               \
-           __q0--, __r0 += (d);                                        \
-      }                                                                        
\
-    __r0 -= __m;                                                       \
-                                                                       \
-    (q) = (u32) __q1 * __ll_B | __q0;                          \
-    (r) = __r0;                                                                
\
-  } while (0)
-
-#define UDIV_NEEDS_NORMALIZATION 1
-#define udiv_qrnnd __udiv_qrnnd_c
-
-#define count_leading_zeros(count, x) \
-  do {                                                                 \
-    u32 __xr = (x);                                                    \
-    u32 __a;                                                   \
-                                                                       \
-    if (SI_TYPE_SIZE <= 32)                                            \
-      {                                                                        
\
-       __a = __xr < ((u32)1<<2*__BITS4)                                \
-         ? (__xr < ((u32)1<<__BITS4) ? 0 : __BITS4)            \
-         : (__xr < ((u32)1<<3*__BITS4) ?  2*__BITS4 : 3*__BITS4);      \
-      }                                                                        
\
-    else                                                               \
-      {                                                                        
\
-       for (__a = SI_TYPE_SIZE - 8; __a > 0; __a -= 8)                 \
-         if (((__xr >> __a) & 0xff) != 0)                              \
-           break;                                                      \
-      }                                                                        
\
-                                                                       \
-    (count) = SI_TYPE_SIZE - (__clz_tab[__xr >> __a] + __a);           \
-  } while (0)
diff -urN linux/arch/arm/lib/udivdi3.c linux/arch/arm/lib/udivdi3.c
--- linux/arch/arm/lib/Attic/udivdi3.c  2005-07-12 10:18:55.803142000 +0100     
1.3
+++ linux/arch/arm/lib/Attic/udivdi3.c  1970/01/01 00:00:00+0100
@@ -1,222 +0,0 @@
-/* More subroutines needed by GCC output code on some machines.  */
-/* Compile this one with gcc.  */
-/* Copyright (C) 1989, 92-98, 1999 Free Software Foundation, Inc.
-
-This file is part of GNU CC.
-
-GNU CC 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, or (at your option)
-any later version.
-
-GNU CC is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with GNU CC; see the file COPYING.  If not, write to
-the Free Software Foundation, 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
-
-/* As a special exception, if you link this library with other files,
-   some of which are compiled with GCC, to produce an executable,
-   this library does not by itself cause the resulting executable
-   to be covered by the GNU General Public License.
-   This exception does not however invalidate any other reasons why
-   the executable file might be covered by the GNU General Public License.
- */
-/* support functions required by the kernel. based on code from gcc-2.95.3 */
-/* I Molton     29/07/01 */
-
-#include "gcclib.h"
-#include "longlong.h"
-
-static const u8 __clz_tab[] = {
-       0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5,
-           5, 5, 5, 5, 5, 5, 5, 5,
-       6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
-           6, 6, 6, 6, 6, 6, 6, 6,
-       7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
-           7, 7, 7, 7, 7, 7, 7, 7,
-       7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
-           7, 7, 7, 7, 7, 7, 7, 7,
-       8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
-           8, 8, 8, 8, 8, 8, 8, 8,
-       8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
-           8, 8, 8, 8, 8, 8, 8, 8,
-       8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
-           8, 8, 8, 8, 8, 8, 8, 8,
-       8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
-           8, 8, 8, 8, 8, 8, 8, 8,
-};
-
-u64 __udivmoddi4(u64 n, u64 d, u64 * rp)
-{
-       DIunion ww;
-       DIunion nn, dd;
-       DIunion rr;
-       u32 d0, d1, n0, n1, n2;
-       u32 q0, q1;
-       u32 b, bm;
-
-       nn.ll = n;
-       dd.ll = d;
-
-       d0 = dd.s.low;
-       d1 = dd.s.high;
-       n0 = nn.s.low;
-       n1 = nn.s.high;
-
-       if (d1 == 0) {
-               if (d0 > n1) {
-                       /* 0q = nn / 0D */
-
-                       count_leading_zeros(bm, d0);
-
-                       if (bm != 0) {
-                               /* Normalize, i.e. make the most significant 
bit of the
-                                  denominator set.  */
-
-                               d0 = d0 << bm;
-                               n1 = (n1 << bm) | (n0 >> (SI_TYPE_SIZE - bm));
-                               n0 = n0 << bm;
-                       }
-
-                       udiv_qrnnd(q0, n0, n1, n0, d0);
-                       q1 = 0;
-
-                       /* Remainder in n0 >> bm.  */
-               } else {
-                       /* qq = NN / 0d */
-
-                       if (d0 == 0)
-                               d0 = 1 / d0;    /* Divide intentionally by 
zero.  */
-
-                       count_leading_zeros(bm, d0);
-
-                       if (bm == 0) {
-                               /* From (n1 >= d0) /\ (the most significant bit 
of d0 is set),
-                                  conclude (the most significant bit of n1 is 
set) /\ (the
-                                  leading quotient digit q1 = 1).
-
-                                  This special case is necessary, not an 
optimization.
-                                  (Shifts counts of SI_TYPE_SIZE are 
undefined.)  */
-
-                               n1 -= d0;
-                               q1 = 1;
-                       } else {
-                               /* Normalize.  */
-
-                               b = SI_TYPE_SIZE - bm;
-
-                               d0 = d0 << bm;
-                               n2 = n1 >> b;
-                               n1 = (n1 << bm) | (n0 >> b);
-                               n0 = n0 << bm;
-
-                               udiv_qrnnd(q1, n1, n2, n1, d0);
-                       }
-
-                       /* n1 != d0...  */
-
-                       udiv_qrnnd(q0, n0, n1, n0, d0);
-
-                       /* Remainder in n0 >> bm.  */
-               }
-
-               if (rp != 0) {
-                       rr.s.low = n0 >> bm;
-                       rr.s.high = 0;
-                       *rp = rr.ll;
-               }
-       } else {
-               if (d1 > n1) {
-                       /* 00 = nn / DD */
-
-                       q0 = 0;
-                       q1 = 0;
-
-                       /* Remainder in n1n0.  */
-                       if (rp != 0) {
-                               rr.s.low = n0;
-                               rr.s.high = n1;
-                               *rp = rr.ll;
-                       }
-               } else {
-                       /* 0q = NN / dd */
-
-                       count_leading_zeros(bm, d1);
-                       if (bm == 0) {
-                               /* From (n1 >= d1) /\ (the most significant bit 
of d1 is set),
-                                  conclude (the most significant bit of n1 is 
set) /\ (the
-                                  quotient digit q0 = 0 or 1).
-
-                                  This special case is necessary, not an 
optimization.  */
-
-                               /* The condition on the next line takes 
advantage of that
-                                  n1 >= d1 (true due to program flow).  */
-                               if (n1 > d1 || n0 >= d0) {
-                                       q0 = 1;
-                                       sub_ddmmss(n1, n0, n1, n0, d1, d0);
-                               } else
-                                       q0 = 0;
-
-                               q1 = 0;
-
-                               if (rp != 0) {
-                                       rr.s.low = n0;
-                                       rr.s.high = n1;
-                                       *rp = rr.ll;
-                               }
-                       } else {
-                               u32 m1, m0;
-                               /* Normalize.  */
-
-                               b = SI_TYPE_SIZE - bm;
-
-                               d1 = (d1 << bm) | (d0 >> b);
-                               d0 = d0 << bm;
-                               n2 = n1 >> b;
-                               n1 = (n1 << bm) | (n0 >> b);
-                               n0 = n0 << bm;
-
-                               udiv_qrnnd(q0, n1, n2, n1, d1);
-                               umul_ppmm(m1, m0, q0, d0);
-
-                               if (m1 > n1 || (m1 == n1 && m0 > n0)) {
-                                       q0--;
-                                       sub_ddmmss(m1, m0, m1, m0, d1, d0);
-                               }
-
-                               q1 = 0;
-
-                               /* Remainder in (n1n0 - m1m0) >> bm.  */
-                               if (rp != 0) {
-                                       sub_ddmmss(n1, n0, n1, n0, m1, m0);
-                                       rr.s.low = (n1 << b) | (n0 >> bm);
-                                       rr.s.high = n1 >> bm;
-                                       *rp = rr.ll;
-                               }
-                       }
-               }
-       }
-
-       ww.s.low = q0;
-       ww.s.high = q1;
-       return ww.ll;
-}
-
-u64 __udivdi3(u64 n, u64 d)
-{
-       return __udivmoddi4(n, d, (u64 *) 0);
-}
-
-u64 __umoddi3(u64 u, u64 v)
-{
-       u64 w;
-
-       (void)__udivmoddi4(u, v, &w);
-
-       return w;
-}
diff -urN linux/arch/arm/mach-aaec2000/aaed2000.c 
linux/arch/arm/mach-aaec2000/aaed2000.c
--- linux/arch/arm/mach-aaec2000/aaed2000.c     2005/07/11 20:46:00     1.1
+++ linux/arch/arm/mach-aaec2000/aaed2000.c     2005/07/12 09:18:55     1.2
@@ -40,9 +40,11 @@
 }
 
 MACHINE_START(AAED2000, "Agilent AAED-2000 Development Platform")
-       MAINTAINER("Nicolas Bellido Y Ortega")
-       BOOT_MEM(0xf0000000, PIO_BASE, VIO_BASE)
-       MAPIO(aaed2000_map_io)
-       INITIRQ(aaed2000_init_irq)
+       /* Maintainer: Nicolas Bellido Y Ortega */
+       .phys_ram       = 0xf0000000,
+       .phys_io        = PIO_BASE,
+       .io_pg_offst    = ((VIO_BASE) >> 18) & 0xfffc,
+       .map_io         = aaed2000_map_io,
+       .init_irq       = aaed2000_init_irq,
        .timer          = &aaec2000_timer,
 MACHINE_END
diff -urN linux/arch/arm/mach-clps711x/autcpu12.c 
linux/arch/arm/mach-clps711x/autcpu12.c
--- linux/arch/arm/mach-clps711x/autcpu12.c     2004/10/25 20:44:10     1.9
+++ linux/arch/arm/mach-clps711x/autcpu12.c     2005/07/12 09:18:55     1.10
@@ -59,11 +59,13 @@
 }
 
 MACHINE_START(AUTCPU12, "autronix autcpu12")
-       MAINTAINER("Thomas Gleixner")
-        BOOT_MEM(0xc0000000, 0x80000000, 0xff000000)
-       BOOT_PARAMS(0xc0020000)
-       MAPIO(autcpu12_map_io)
-       INITIRQ(clps711x_init_irq)
+       /* Maintainer: Thomas Gleixner */
+       .phys_ram       = 0xc0000000,
+       .phys_io        = 0x80000000,
+       .io_pg_offst    = ((0xff000000) >> 18) & 0xfffc,
+       .boot_params    = 0xc0020000,
+       .map_io         = autcpu12_map_io,
+       .init_irq       = clps711x_init_irq,
        .timer          = &clps711x_timer,
 MACHINE_END
 
diff -urN linux/arch/arm/mach-clps711x/cdb89712.c 
linux/arch/arm/mach-clps711x/cdb89712.c
--- linux/arch/arm/mach-clps711x/cdb89712.c     2004/10/25 20:44:10     1.10
+++ linux/arch/arm/mach-clps711x/cdb89712.c     2005/07/12 09:18:55     1.11
@@ -49,10 +49,12 @@
 }
 
 MACHINE_START(CDB89712, "Cirrus-CDB89712")
-       MAINTAINER("Ray Lehtiniemi")
-       BOOT_MEM(0xc0000000, 0x80000000, 0xff000000)
-       BOOT_PARAMS(0xc0000100)
-       MAPIO(cdb89712_map_io)
-       INITIRQ(clps711x_init_irq)
+       /* Maintainer: Ray Lehtiniemi */
+       .phys_ram       = 0xc0000000,
+       .phys_io        = 0x80000000,
+       .io_pg_offst    = ((0xff000000) >> 18) & 0xfffc,
+       .boot_params    = 0xc0000100,
+       .map_io         = cdb89712_map_io,
+       .init_irq       = clps711x_init_irq,
        .timer          = &clps711x_timer,
 MACHINE_END
diff -urN linux/arch/arm/mach-clps711x/ceiva.c 
linux/arch/arm/mach-clps711x/ceiva.c
--- linux/arch/arm/mach-clps711x/ceiva.c        2004/10/25 20:44:10     1.3
+++ linux/arch/arm/mach-clps711x/ceiva.c        2005/07/12 09:18:55     1.4
@@ -53,10 +53,12 @@
 
 
 MACHINE_START(CEIVA, "CEIVA/Polaroid Photo MAX Digital Picture Frame")
-       MAINTAINER("Rob Scott")
-       BOOT_MEM(0xc0000000, 0x80000000, 0xff000000)
-       BOOT_PARAMS(0xc0000100)
-       MAPIO(ceiva_map_io)
-       INITIRQ(clps711x_init_irq)
+       /* Maintainer: Rob Scott */
+       .phys_ram       = 0xc0000000,
+       .phys_io        = 0x80000000,
+       .io_pg_offst    = ((0xff000000) >> 18) & 0xfffc,
+       .boot_params    = 0xc0000100,
+       .map_io         = ceiva_map_io,
+       .init_irq       = clps711x_init_irq,
        .timer          = &clps711x_timer,
 MACHINE_END
diff -urN linux/arch/arm/mach-clps711x/clep7312.c 
linux/arch/arm/mach-clps711x/clep7312.c
--- linux/arch/arm/mach-clps711x/clep7312.c     2004/10/25 20:44:10     1.6
+++ linux/arch/arm/mach-clps711x/clep7312.c     2005/07/12 09:18:55     1.7
@@ -37,12 +37,14 @@
 
 
 MACHINE_START(CLEP7212, "Cirrus Logic 7212/7312")
-       MAINTAINER("Nobody")
-        BOOT_MEM(0xc0000000, 0x80000000, 0xff000000)
-       BOOT_PARAMS(0xc0000100)
-       FIXUP(fixup_clep7312)
-       MAPIO(clps711x_map_io)
-       INITIRQ(clps711x_init_irq)
+       /* Maintainer: Nobody */
+       .phys_ram       = 0xc0000000,
+       .phys_io        = 0x80000000,
+       .io_pg_offst    = ((0xff000000) >> 18) & 0xfffc,
+       .boot_params    = 0xc0000100,
+       .fixup          = fixup_clep7312,
+       .map_io         = clps711x_map_io,
+       .init_irq       = clps711x_init_irq,
        .timer          = &clps711x_timer,
 MACHINE_END
 
diff -urN linux/arch/arm/mach-clps711x/edb7211-arch.c 
linux/arch/arm/mach-clps711x/edb7211-arch.c
--- linux/arch/arm/mach-clps711x/edb7211-arch.c 2004/10/25 20:44:10     1.5
+++ linux/arch/arm/mach-clps711x/edb7211-arch.c 2005/07/12 09:18:55     1.6
@@ -51,11 +51,13 @@
 }
 
 MACHINE_START(EDB7211, "CL-EDB7211 (EP7211 eval board)")
-       MAINTAINER("Jon McClintock")
-       BOOT_MEM(0xc0000000, 0x80000000, 0xff000000)
-       BOOT_PARAMS(0xc0020100) /* 0xc0000000 - 0xc001ffff can be video RAM */
-       FIXUP(fixup_edb7211)
-       MAPIO(edb7211_map_io)
-       INITIRQ(clps711x_init_irq)
+       /* Maintainer: Jon McClintock */
+       .phys_ram       = 0xc0000000,
+       .phys_io        = 0x80000000,
+       .io_pg_offst    = ((0xff000000) >> 18) & 0xfffc,
+       .boot_params    = 0xc0020100,   /* 0xc0000000 - 0xc001ffff can be video 
RAM */
+       .fixup          = fixup_edb7211,
+       .map_io         = edb7211_map_io,
+       .init_irq       = clps711x_init_irq,
        .timer          = &clps711x_timer,
 MACHINE_END
diff -urN linux/arch/arm/mach-clps711x/fortunet.c 
linux/arch/arm/mach-clps711x/fortunet.c
--- linux/arch/arm/mach-clps711x/fortunet.c     2004/10/25 20:44:10     1.8
+++ linux/arch/arm/mach-clps711x/fortunet.c     2005/07/12 09:18:55     1.9
@@ -75,11 +75,13 @@
 }
 
 MACHINE_START(FORTUNET, "ARM-FortuNet")
-       MAINTAINER("FortuNet Inc.")
-        BOOT_MEM(0xc0000000, 0x80000000, 0xf0000000)
-       BOOT_PARAMS(0x00000000)
-       FIXUP(fortunet_fixup)
-       MAPIO(clps711x_map_io)
-       INITIRQ(clps711x_init_irq)
+       /* Maintainer: FortuNet Inc. */
+       .phys_ram       = 0xc0000000,
+       .phys_io        = 0x80000000,
+       .io_pg_offst    = ((0xf0000000) >> 18) & 0xfffc,
+       .boot_params    = 0x00000000,
+       .fixup          = fortunet_fixup,
+       .map_io         = clps711x_map_io,
+       .init_irq       = clps711x_init_irq,
        .timer          = &clps711x_timer,
 MACHINE_END
diff -urN linux/arch/arm/mach-clps711x/p720t.c 
linux/arch/arm/mach-clps711x/p720t.c
--- linux/arch/arm/mach-clps711x/p720t.c        2004/10/25 20:44:10     1.7
+++ linux/arch/arm/mach-clps711x/p720t.c        2005/07/12 09:18:55     1.8
@@ -79,12 +79,14 @@
 }
 
 MACHINE_START(P720T, "ARM-Prospector720T")
-       MAINTAINER("ARM Ltd/Deep Blue Solutions Ltd")
-       BOOT_MEM(0xc0000000, 0x80000000, 0xff000000)
-       BOOT_PARAMS(0xc0000100)
-       FIXUP(fixup_p720t)
-       MAPIO(p720t_map_io)
-       INITIRQ(clps711x_init_irq)
+       /* Maintainer: ARM Ltd/Deep Blue Solutions Ltd */
+       .phys_ram       = 0xc0000000,
+       .phys_io        = 0x80000000,
+       .io_pg_offst    = ((0xff000000) >> 18) & 0xfffc,
+       .boot_params    = 0xc0000100,
+       .fixup          = fixup_p720t,
+       .map_io         = p720t_map_io,
+       .init_irq       = clps711x_init_irq,
        .timer          = &clps711x_timer,
 MACHINE_END
 
diff -urN linux/arch/arm/mach-clps7500/core.c 
linux/arch/arm/mach-clps7500/core.c
--- linux/arch/arm/mach-clps7500/core.c 2005/07/11 20:46:01     1.10
+++ linux/arch/arm/mach-clps7500/core.c 2005/07/12 09:18:56     1.11
@@ -366,11 +366,13 @@
 }
 
 MACHINE_START(CLPS7500, "CL-PS7500")
-       MAINTAINER("Philip Blundell")
-       BOOT_MEM(0x10000000, 0x03000000, 0xe0000000)
-       MAPIO(clps7500_map_io)
-       INITIRQ(clps7500_init_irq)
-               .init_machine   = clps7500_init,
-               .timer          = &clps7500_timer,
+       /* Maintainer: Philip Blundell */
+       .phys_ram       = 0x10000000,
+       .phys_io        = 0x03000000,
+       .io_pg_offst    = ((0xe0000000) >> 18) & 0xfffc,
+       .map_io         = clps7500_map_io,
+       .init_irq       = clps7500_init_irq,
+       .init_machine   = clps7500_init,
+       .timer          = &clps7500_timer,
 MACHINE_END
 
diff -urN linux/arch/arm/mach-ebsa110/core.c linux/arch/arm/mach-ebsa110/core.c
--- linux/arch/arm/mach-ebsa110/core.c  2005/07/11 20:46:01     1.8
+++ linux/arch/arm/mach-ebsa110/core.c  2005/07/12 09:18:56     1.9
@@ -233,13 +233,15 @@
 arch_initcall(ebsa110_init);
 
 MACHINE_START(EBSA110, "EBSA110")
-       MAINTAINER("Russell King")
-       BOOT_MEM(0x00000000, 0xe0000000, 0xe0000000)
-       BOOT_PARAMS(0x00000400)
-       DISABLE_PARPORT(0)
-       DISABLE_PARPORT(2)
-       SOFT_REBOOT
-       MAPIO(ebsa110_map_io)
-       INITIRQ(ebsa110_init_irq)
+       /* Maintainer: Russell King */
+       .phys_ram       = 0x00000000,
+       .phys_io        = 0xe0000000,
+       .io_pg_offst    = ((0xe0000000) >> 18) & 0xfffc,
+       .boot_params    = 0x00000400,
+       .reserve_lp0    = 1,
+       .reserve_lp2    = 1,
+       .soft_reboot    = 1,
+       .map_io         = ebsa110_map_io,
+       .init_irq       = ebsa110_init_irq,
        .timer          = &ebsa110_timer,
 MACHINE_END
diff -urN linux/arch/arm/mach-epxa10db/arch.c 
linux/arch/arm/mach-epxa10db/arch.c
--- linux/arch/arm/mach-epxa10db/arch.c 2004/11/15 11:49:14     1.8
+++ linux/arch/arm/mach-epxa10db/arch.c 2005/07/12 09:18:56     1.9
@@ -63,10 +63,12 @@
 extern struct sys_timer epxa10db_timer;
 
 MACHINE_START(CAMELOT, "Altera Epxa10db")
-       MAINTAINER("Altera Corporation")
-       BOOT_MEM(0x00000000, 0x7fffc000, 0xffffc000)
-       MAPIO(epxa10db_map_io)
-       INITIRQ(epxa10db_init_irq)
+       /* Maintainer: Altera Corporation */
+       .phys_ram       = 0x00000000,
+       .phys_io        = 0x7fffc000,
+       .io_pg_offst    = ((0xffffc000) >> 18) & 0xfffc,
+       .map_io         = epxa10db_map_io,
+       .init_irq       = epxa10db_init_irq,
        .timer          = &epxa10db_timer,
 MACHINE_END
 
diff -urN linux/arch/arm/mach-footbridge/cats-hw.c 
linux/arch/arm/mach-footbridge/cats-hw.c
--- linux/arch/arm/mach-footbridge/cats-hw.c    2005/04/08 18:57:51     1.4
+++ linux/arch/arm/mach-footbridge/cats-hw.c    2005/07/12 09:18:56     1.5
@@ -84,12 +84,14 @@
 }
 
 MACHINE_START(CATS, "Chalice-CATS")
-       MAINTAINER("Philip Blundell")
-       BOOT_MEM(0x00000000, DC21285_ARMCSR_BASE, 0xfe000000)
-       BOOT_PARAMS(0x00000100)
-       SOFT_REBOOT
-       FIXUP(fixup_cats)
-       MAPIO(footbridge_map_io)
-       INITIRQ(footbridge_init_irq)
+       /* Maintainer: Philip Blundell */
+       .phys_ram       = 0x00000000,
+       .phys_io        = DC21285_ARMCSR_BASE,
+       .io_pg_offst    = ((0xfe000000) >> 18) & 0xfffc,
+       .boot_params    = 0x00000100,
+       .soft_reboot    = 1,
+       .fixup          = fixup_cats,
+       .map_io         = footbridge_map_io,
+       .init_irq       = footbridge_init_irq,
        .timer          = &isa_timer,
 MACHINE_END
diff -urN linux/arch/arm/mach-footbridge/co285.c 
linux/arch/arm/mach-footbridge/co285.c
--- linux/arch/arm/mach-footbridge/co285.c      2004/10/25 20:44:10     1.1
+++ linux/arch/arm/mach-footbridge/co285.c      2005/07/12 09:18:56     1.2
@@ -28,11 +28,13 @@
 }
 
 MACHINE_START(CO285, "co-EBSA285")
-       MAINTAINER("Mark van Doesburg")
-       BOOT_MEM(0x00000000, DC21285_ARMCSR_BASE, 0x7cf00000)
-       FIXUP(fixup_coebsa285)
-       MAPIO(footbridge_map_io)
-       INITIRQ(footbridge_init_irq)
+       /* Maintainer: Mark van Doesburg */
+       .phys_ram       = 0x00000000,
+       .phys_io        = DC21285_ARMCSR_BASE,
+       .io_pg_offst    = ((0x7cf00000) >> 18) & 0xfffc,
+       .fixup          = fixup_coebsa285,
+       .map_io         = footbridge_map_io,
+       .init_irq       = footbridge_init_irq,
        .timer          = &footbridge_timer,
 MACHINE_END
 
diff -urN linux/arch/arm/mach-footbridge/ebsa285.c 
linux/arch/arm/mach-footbridge/ebsa285.c
--- linux/arch/arm/mach-footbridge/ebsa285.c    2004/10/25 20:44:10     1.1
+++ linux/arch/arm/mach-footbridge/ebsa285.c    2005/07/12 09:18:56     1.2
@@ -13,12 +13,15 @@
 #include "common.h"
 
 MACHINE_START(EBSA285, "EBSA285")
-       MAINTAINER("Russell King")
-       BOOT_MEM(0x00000000, DC21285_ARMCSR_BASE, 0xfe000000)
-       BOOT_PARAMS(0x00000100)
-       VIDEO(0x000a0000, 0x000bffff)
-       MAPIO(footbridge_map_io)
-       INITIRQ(footbridge_init_irq)
+       /* Maintainer: Russell King */
+       .phys_ram       = 0x00000000,
+       .phys_io        = DC21285_ARMCSR_BASE,
+       .io_pg_offst    = ((0xfe000000) >> 18) & 0xfffc,
+       .boot_params    = 0x00000100,
+       .video_start    = 0x000a0000,
+       .video_end      = 0x000bffff,
+       .map_io         = footbridge_map_io,
+       .init_irq       = footbridge_init_irq,
        .timer          = &footbridge_timer,
 MACHINE_END
 
diff -urN linux/arch/arm/mach-footbridge/netwinder-hw.c 
linux/arch/arm/mach-footbridge/netwinder-hw.c
--- linux/arch/arm/mach-footbridge/netwinder-hw.c       2005/01/25 04:27:52     
1.7
+++ linux/arch/arm/mach-footbridge/netwinder-hw.c       2005/07/12 09:18:56     
1.8
@@ -647,14 +647,17 @@
 }
 
 MACHINE_START(NETWINDER, "Rebel-NetWinder")
-       MAINTAINER("Russell King/Rebel.com")
-       BOOT_MEM(0x00000000, DC21285_ARMCSR_BASE, 0xfe000000)
-       BOOT_PARAMS(0x00000100)
-       VIDEO(0x000a0000, 0x000bffff)
-       DISABLE_PARPORT(0)
-       DISABLE_PARPORT(2)
-       FIXUP(fixup_netwinder)
-       MAPIO(footbridge_map_io)
-       INITIRQ(footbridge_init_irq)
+       /* Maintainer: Russell King/Rebel.com */
+       .phys_ram       = 0x00000000,
+       .phys_io        = DC21285_ARMCSR_BASE,
+       .io_pg_offst    = ((0xfe000000) >> 18) & 0xfffc,
+       .boot_params    = 0x00000100,
+       .video_start    = 0x000a0000,
+       .video_end      = 0x000bffff,
+       .reserve_lp0    = 1,
+       .reserve_lp2    = 1,
+       .fixup          = fixup_netwinder,
+       .map_io         = footbridge_map_io,
+       .init_irq       = footbridge_init_irq,
        .timer          = &isa_timer,
 MACHINE_END
diff -urN linux/arch/arm/mach-footbridge/personal.c 
linux/arch/arm/mach-footbridge/personal.c
--- linux/arch/arm/mach-footbridge/personal.c   2004/10/25 20:44:10     1.1
+++ linux/arch/arm/mach-footbridge/personal.c   2005/07/12 09:18:56     1.2
@@ -13,11 +13,13 @@
 #include "common.h"
 
 MACHINE_START(PERSONAL_SERVER, "Compaq-PersonalServer")
-       MAINTAINER("Jamey Hicks / George France")
-       BOOT_MEM(0x00000000, DC21285_ARMCSR_BASE, 0xfe000000)
-       BOOT_PARAMS(0x00000100)
-       MAPIO(footbridge_map_io)
-       INITIRQ(footbridge_init_irq)
+       /* Maintainer: Jamey Hicks / George France */
+       .phys_ram       = 0x00000000,
+       .phys_io        = DC21285_ARMCSR_BASE,
+       .io_pg_offst    = ((0xfe000000) >> 18) & 0xfffc,
+       .boot_params    = 0x00000100,
+       .map_io         = footbridge_map_io,
+       .init_irq       = footbridge_init_irq,
        .timer          = &footbridge_timer,
 MACHINE_END
 
diff -urN linux/arch/arm/mach-h720x/h7201-eval.c 
linux/arch/arm/mach-h720x/h7201-eval.c
--- linux/arch/arm/mach-h720x/h7201-eval.c      2004/11/15 11:49:14     1.2
+++ linux/arch/arm/mach-h720x/h7201-eval.c      2005/07/12 09:18:56     1.3
@@ -30,10 +30,12 @@
 #include "common.h"
 
 MACHINE_START(H7201, "Hynix GMS30C7201")
-       MAINTAINER("Robert Schwebel, Pengutronix")
-       BOOT_MEM(0x40000000, 0x80000000, 0xf0000000)
-       BOOT_PARAMS(0xc0001000)
-       MAPIO(h720x_map_io)
-       INITIRQ(h720x_init_irq)
-       .timer = &h7201_timer,
+       /* Maintainer: Robert Schwebel, Pengutronix */
+       .phys_ram       = 0x40000000,
+       .phys_io        = 0x80000000,
+       .io_pg_offst    = ((0xf0000000) >> 18) & 0xfffc,
+       .boot_params    = 0xc0001000,
+       .map_io         = h720x_map_io,
+       .init_irq       = h720x_init_irq,
+       .timer          = &h7201_timer,
 MACHINE_END
diff -urN linux/arch/arm/mach-h720x/h7202-eval.c 
linux/arch/arm/mach-h720x/h7202-eval.c
--- linux/arch/arm/mach-h720x/h7202-eval.c      2004/11/15 11:49:14     1.2
+++ linux/arch/arm/mach-h720x/h7202-eval.c      2005/07/12 09:18:56     1.3
@@ -71,11 +71,13 @@
 }
 
 MACHINE_START(H7202, "Hynix HMS30C7202")
-       MAINTAINER("Robert Schwebel, Pengutronix")
-       BOOT_MEM(0x40000000, 0x80000000, 0xf0000000)
-       BOOT_PARAMS(0x40000100)
-       MAPIO(h720x_map_io)
-       INITIRQ(h7202_init_irq)
-       .timer = &h7202_timer,
-       INIT_MACHINE(init_eval_h7202)
+       /* Maintainer: Robert Schwebel, Pengutronix */
+       .phys_ram       = 0x40000000,
+       .phys_io        = 0x80000000,
+       .io_pg_offst    = ((0xf0000000) >> 18) & 0xfffc,
+       .boot_params    = 0x40000100,
+       .map_io         = h720x_map_io,
+       .init_irq       = h7202_init_irq,
+       .timer          = &h7202_timer,
+       .init_machine   = init_eval_h7202,
 MACHINE_END
diff -urN linux/arch/arm/mach-imx/mx1ads.c linux/arch/arm/mach-imx/mx1ads.c
--- linux/arch/arm/mach-imx/mx1ads.c    2004/10/25 20:44:10     1.2
+++ linux/arch/arm/mach-imx/mx1ads.c    2005/07/12 09:18:56     1.3
@@ -78,11 +78,13 @@
 }
 
 MACHINE_START(MX1ADS, "Motorola MX1ADS")
-       MAINTAINER("Sascha Hauer, Pengutronix")
-       BOOT_MEM(0x08000000, 0x00200000, 0xe0200000)
-       BOOT_PARAMS(0x08000100)
-       MAPIO(mx1ads_map_io)
-       INITIRQ(imx_init_irq)
+       /* Maintainer: Sascha Hauer, Pengutronix */
+       .phys_ram       = 0x08000000,
+       .phys_io        = 0x00200000,
+       .io_pg_offst    = ((0xe0200000) >> 18) & 0xfffc,
+       .boot_params    = 0x08000100,
+       .map_io         = mx1ads_map_io,
+       .init_irq       = imx_init_irq,
        .timer          = &imx_timer,
-       INIT_MACHINE(mx1ads_init)
+       .init_machine   = mx1ads_init,
 MACHINE_END
diff -urN linux/arch/arm/mach-integrator/core.c 
linux/arch/arm/mach-integrator/core.c
--- linux/arch/arm/mach-integrator/core.c       2005/07/11 20:46:01     1.11
+++ linux/arch/arm/mach-integrator/core.c       2005/07/12 09:18:56     1.12
@@ -20,6 +20,7 @@
 #include <asm/irq.h>
 #include <asm/io.h>
 #include <asm/hardware/amba.h>
+#include <asm/hardware/arm_timer.h>
 #include <asm/arch/cm.h>
 #include <asm/system.h>
 #include <asm/leds.h>
@@ -156,16 +157,6 @@
 #define TICKS2USECS(x) ((x) / TICKS_PER_uSEC)
 #endif
 
-/*
- * What does it look like?
- */
-typedef struct TimerStruct {
-       unsigned long TimerLoad;
-       unsigned long TimerValue;
-       unsigned long TimerControl;
-       unsigned long TimerClear;
-} TimerStruct_t;
-
 static unsigned long timer_reload;
 
 /*
@@ -174,7 +165,6 @@
  */
 unsigned long integrator_gettimeoffset(void)
 {
-       volatile TimerStruct_t *timer1 = (TimerStruct_t *)TIMER1_VA_BASE;
        unsigned long ticks1, ticks2, status;
 
        /*
@@ -183,11 +173,11 @@
         * an interrupt.  We get around this by ensuring that the
         * counter has not reloaded between our two reads.
         */
-       ticks2 = timer1->TimerValue & 0xffff;
+       ticks2 = readl(TIMER1_VA_BASE + TIMER_VALUE) & 0xffff;
        do {
                ticks1 = ticks2;
                status = __raw_readl(VA_IC_BASE + IRQ_RAW_STATUS);
-               ticks2 = timer1->TimerValue & 0xffff;
+               ticks2 = readl(TIMER1_VA_BASE + TIMER_VALUE) & 0xffff;
        } while (ticks2 > ticks1);
 
        /*
@@ -213,14 +203,12 @@
 static irqreturn_t
 integrator_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
 {
-       volatile TimerStruct_t *timer1 = (volatile TimerStruct_t 
*)TIMER1_VA_BASE;
-
        write_seqlock(&xtime_lock);
 
        /*
         * clear the interrupt
         */
-       timer1->TimerClear = 1;
+       writel(1, TIMER1_VA_BASE + TIMER_INTCLR);
 
        /*
         * the clock tick routines are only processed on the
@@ -256,32 +244,29 @@
  */
 void __init integrator_time_init(unsigned long reload, unsigned int ctrl)
 {
-       volatile TimerStruct_t *timer0 = (volatile TimerStruct_t 
*)TIMER0_VA_BASE;
-       volatile TimerStruct_t *timer1 = (volatile TimerStruct_t 
*)TIMER1_VA_BASE;
-       volatile TimerStruct_t *timer2 = (volatile TimerStruct_t 
*)TIMER2_VA_BASE;
-       unsigned int timer_ctrl = 0x80 | 0x40;  /* periodic */
+       unsigned int timer_ctrl = TIMER_CTRL_ENABLE | TIMER_CTRL_PERIODIC;
 
        timer_reload = reload;
        timer_ctrl |= ctrl;
 
        if (timer_reload > 0x100000) {
                timer_reload >>= 8;
-               timer_ctrl |= 0x08; /* /256 */
+               timer_ctrl |= TIMER_CTRL_DIV256;
        } else if (timer_reload > 0x010000) {
                timer_reload >>= 4;
-               timer_ctrl |= 0x04; /* /16 */
+               timer_ctrl |= TIMER_CTRL_DIV16;
        }
 
        /*
         * Initialise to a known state (all timers off)
         */
-       timer0->TimerControl = 0;
-       timer1->TimerControl = 0;
-       timer2->TimerControl = 0;
-
-       timer1->TimerLoad    = timer_reload;
-       timer1->TimerValue   = timer_reload;
-       timer1->TimerControl = timer_ctrl;
+       writel(0, TIMER0_VA_BASE + TIMER_CTRL);
+       writel(0, TIMER1_VA_BASE + TIMER_CTRL);
+       writel(0, TIMER2_VA_BASE + TIMER_CTRL);
+
+       writel(timer_reload, TIMER1_VA_BASE + TIMER_LOAD);
+       writel(timer_reload, TIMER1_VA_BASE + TIMER_VALUE);
+       writel(timer_ctrl, TIMER1_VA_BASE + TIMER_CTRL);
 
        /*
         * Make irqs happen for the system timer
diff -urN linux/arch/arm/mach-integrator/integrator_ap.c 
linux/arch/arm/mach-integrator/integrator_ap.c
--- linux/arch/arm/mach-integrator/integrator_ap.c      2005/04/08 18:57:51     
1.8
+++ linux/arch/arm/mach-integrator/integrator_ap.c      2005/07/12 09:18:57     
1.9
@@ -292,11 +292,13 @@
 };
 
 MACHINE_START(INTEGRATOR, "ARM-Integrator")
-       MAINTAINER("ARM Ltd/Deep Blue Solutions Ltd")
-       BOOT_MEM(0x00000000, 0x16000000, 0xf1600000)
-       BOOT_PARAMS(0x00000100)
-       MAPIO(ap_map_io)
-       INITIRQ(ap_init_irq)
+       /* Maintainer: ARM Ltd/Deep Blue Solutions Ltd */
+       .phys_ram       = 0x00000000,
+       .phys_io        = 0x16000000,
+       .io_pg_offst    = ((0xf1600000) >> 18) & 0xfffc,
+       .boot_params    = 0x00000100,
+       .map_io         = ap_map_io,
+       .init_irq       = ap_init_irq,
        .timer          = &ap_timer,
-       INIT_MACHINE(ap_init)
+       .init_machine   = ap_init,
 MACHINE_END
diff -urN linux/arch/arm/mach-integrator/integrator_cp.c 
linux/arch/arm/mach-integrator/integrator_cp.c
--- linux/arch/arm/mach-integrator/integrator_cp.c      2005/06/18 14:42:38     
1.8
+++ linux/arch/arm/mach-integrator/integrator_cp.c      2005/07/12 09:18:57     
1.9
@@ -532,11 +532,13 @@
 };
 
 MACHINE_START(CINTEGRATOR, "ARM-IntegratorCP")
-       MAINTAINER("ARM Ltd/Deep Blue Solutions Ltd")
-       BOOT_MEM(0x00000000, 0x16000000, 0xf1600000)
-       BOOT_PARAMS(0x00000100)
-       MAPIO(intcp_map_io)
-       INITIRQ(intcp_init_irq)
+       /* Maintainer: ARM Ltd/Deep Blue Solutions Ltd */
+       .phys_ram       = 0x00000000,
+       .phys_io        = 0x16000000,
+       .io_pg_offst    = ((0xf1600000) >> 18) & 0xfffc,
+       .boot_params    = 0x00000100,
+       .map_io         = intcp_map_io,
+       .init_irq       = intcp_init_irq,
        .timer          = &cp_timer,
-       INIT_MACHINE(intcp_init)
+       .init_machine   = intcp_init,
 MACHINE_END
diff -urN linux/arch/arm/mach-iop3xx/iop321-setup.c 
linux/arch/arm/mach-iop3xx/iop321-setup.c
--- linux/arch/arm/mach-iop3xx/iop321-setup.c   2005/01/13 14:05:18     1.4
+++ linux/arch/arm/mach-iop3xx/iop321-setup.c   2005/07/12 09:18:57     1.5
@@ -146,23 +146,27 @@
 
 #if defined(CONFIG_ARCH_IQ80321)
 MACHINE_START(IQ80321, "Intel IQ80321")
-       MAINTAINER("Intel Corporation")
-       BOOT_MEM(PHYS_OFFSET, IQ80321_UART, IQ80321_UART)
-       MAPIO(iq80321_map_io)
-       INITIRQ(iop321_init_irq)
+       /* Maintainer: Intel Corporation */
+       .phys_ram       = PHYS_OFFSET,
+       .phys_io        = IQ80321_UART,
+       .io_pg_offst    = ((IQ80321_UART) >> 18) & 0xfffc,
+       .map_io         = iq80321_map_io,
+       .init_irq       = iop321_init_irq,
        .timer          = &iop321_timer,
-    BOOT_PARAMS(0xa0000100)
-       INIT_MACHINE(iop32x_init)
+       .boot_params    = 0xa0000100,
+       .init_machine   = iop32x_init,
 MACHINE_END
 #elif defined(CONFIG_ARCH_IQ31244)
 MACHINE_START(IQ31244, "Intel IQ31244")
-    MAINTAINER("Intel Corp.")
-    BOOT_MEM(PHYS_OFFSET, IQ31244_UART, IQ31244_UART)
-    MAPIO(iq31244_map_io)
-    INITIRQ(iop321_init_irq)
+       /* Maintainer: Intel Corp. */
+       .phys_ram       = PHYS_OFFSET,
+       .phys_io        = IQ31244_UART,
+       .io_pg_offst    = ((IQ31244_UART) >> 18) & 0xfffc,
+       .map_io         = iq31244_map_io,
+       .init_irq       = iop321_init_irq,
        .timer          = &iop321_timer,
-    BOOT_PARAMS(0xa0000100)
-       INIT_MACHINE(iop32x_init)
+       .boot_params    = 0xa0000100,
+       .init_machine   = iop32x_init,
 MACHINE_END
 #else
 #error No machine descriptor defined for this IOP3XX implementation
diff -urN linux/arch/arm/mach-iop3xx/iop331-setup.c 
linux/arch/arm/mach-iop3xx/iop331-setup.c
--- linux/arch/arm/mach-iop3xx/iop331-setup.c   2005/01/13 14:05:18     1.4
+++ linux/arch/arm/mach-iop3xx/iop331-setup.c   2005/07/12 09:18:57     1.5
@@ -148,26 +148,28 @@
 
 #if defined(CONFIG_ARCH_IQ80331)
 MACHINE_START(IQ80331, "Intel IQ80331")
-    MAINTAINER("Intel Corp.")
-    BOOT_MEM(PHYS_OFFSET, 0xfefff000, 0xfffff000) // virtual, physical
-    //BOOT_MEM(PHYS_OFFSET, IOP331_UART0_VIRT, IOP331_UART0_PHYS)
-    MAPIO(iq80331_map_io)
-    INITIRQ(iop331_init_irq)
+       /* Maintainer: Intel Corp. */
+       .phys_ram       = PHYS_OFFSET,
+       .phys_io        = 0xfefff000,
+       .io_pg_offst    = ((0xfffff000) >> 18) & 0xfffc, // virtual, physical
+       .map_io         = iq80331_map_io,
+       .init_irq       = iop331_init_irq,
        .timer          = &iop331_timer,
-    BOOT_PARAMS(0x0100)
-       INIT_MACHINE(iop33x_init)
+       .boot_params    = 0x0100,
+       .init_machine   = iop33x_init,
 MACHINE_END
 
 #elif defined(CONFIG_MACH_IQ80332)
 MACHINE_START(IQ80332, "Intel IQ80332")
-    MAINTAINER("Intel Corp.")
-    BOOT_MEM(PHYS_OFFSET, 0xfefff000, 0xfffff000) // virtual, physical
-    //BOOT_MEM(PHYS_OFFSET, IOP331_UART0_VIRT, IOP331_UART0_PHYS)
-    MAPIO(iq80332_map_io)
-    INITIRQ(iop331_init_irq)
+       /* Maintainer: Intel Corp. */
+       .phys_ram       = PHYS_OFFSET,
+       .phys_io        = 0xfefff000,
+       .io_pg_offst    = ((0xfffff000) >> 18) & 0xfffc, // virtual, physical
+       .map_io         = iq80332_map_io,
+       .init_irq       = iop331_init_irq,
        .timer          = &iop331_timer,
-    BOOT_PARAMS(0x0100)
-       INIT_MACHINE(iop33x_init)
+       .boot_params    = 0x0100,
+       .init_machine   = iop33x_init,
 MACHINE_END
 
 #else
diff -urN linux/arch/arm/mach-ixp2000/enp2611.c 
linux/arch/arm/mach-ixp2000/enp2611.c
--- linux/arch/arm/mach-ixp2000/enp2611.c       2005/07/11 20:46:02     1.8
+++ linux/arch/arm/mach-ixp2000/enp2611.c       2005/07/12 09:18:57     1.9
@@ -223,13 +223,15 @@
 
 
 MACHINE_START(ENP2611, "Radisys ENP-2611 PCI network processor board")
-       MAINTAINER("Lennert Buytenhek <buytenh@wantstofly.org>")
-       BOOT_MEM(0x00000000, IXP2000_UART_PHYS_BASE, IXP2000_UART_VIRT_BASE)
-       BOOT_PARAMS(0x00000100)
-       MAPIO(ixp2000_map_io)
-       INITIRQ(ixp2000_init_irq)
+       /* Maintainer: Lennert Buytenhek <buytenh@wantstofly.org> */
+       .phys_ram       = 0x00000000,
+       .phys_io        = IXP2000_UART_PHYS_BASE,
+       .io_pg_offst    = ((IXP2000_UART_VIRT_BASE) >> 18) & 0xfffc,
+       .boot_params    = 0x00000100,
+       .map_io         = ixp2000_map_io,
+       .init_irq       = ixp2000_init_irq,
        .timer          = &enp2611_timer,
-       INIT_MACHINE(enp2611_init_machine)
+       .init_machine   = enp2611_init_machine,
 MACHINE_END
 
 
diff -urN linux/arch/arm/mach-ixp2000/ixdp2400.c 
linux/arch/arm/mach-ixp2000/ixdp2400.c
--- linux/arch/arm/mach-ixp2000/ixdp2400.c      2005/01/13 14:05:18     1.4
+++ linux/arch/arm/mach-ixp2000/ixdp2400.c      2005/07/12 09:18:57     1.5
@@ -168,12 +168,14 @@
 }
 
 MACHINE_START(IXDP2400, "Intel IXDP2400 Development Platform")
-       MAINTAINER("MontaVista Software, Inc.")
-       BOOT_MEM(0x00000000, IXP2000_UART_PHYS_BASE, IXP2000_UART_VIRT_BASE)
-       BOOT_PARAMS(0x00000100)
-       MAPIO(ixdp2x00_map_io)
-       INITIRQ(ixdp2400_init_irq)
+       /* Maintainer: MontaVista Software, Inc. */
+       .phys_ram       = 0x00000000,
+       .phys_io        = IXP2000_UART_PHYS_BASE,
+       .io_pg_offst    = ((IXP2000_UART_VIRT_BASE) >> 18) & 0xfffc,
+       .boot_params    = 0x00000100,
+       .map_io         = ixdp2x00_map_io,
+       .init_irq       = ixdp2400_init_irq,
        .timer          = &ixdp2400_timer,
-       INIT_MACHINE(ixdp2x00_init_machine)
+       .init_machine   = ixdp2x00_init_machine,
 MACHINE_END
 
diff -urN linux/arch/arm/mach-ixp2000/ixdp2800.c 
linux/arch/arm/mach-ixp2000/ixdp2800.c
--- linux/arch/arm/mach-ixp2000/ixdp2800.c      2005/07/11 20:46:02     1.6
+++ linux/arch/arm/mach-ixp2000/ixdp2800.c      2005/07/12 09:18:57     1.7
@@ -284,12 +284,14 @@
 }
 
 MACHINE_START(IXDP2800, "Intel IXDP2800 Development Platform")
-       MAINTAINER("MontaVista Software, Inc.")
-       BOOT_MEM(0x00000000, IXP2000_UART_PHYS_BASE, IXP2000_UART_VIRT_BASE)
-       BOOT_PARAMS(0x00000100)
-       MAPIO(ixdp2x00_map_io)
-       INITIRQ(ixdp2800_init_irq)
+       /* Maintainer: MontaVista Software, Inc. */
+       .phys_ram       = 0x00000000,
+       .phys_io        = IXP2000_UART_PHYS_BASE,
+       .io_pg_offst    = ((IXP2000_UART_VIRT_BASE) >> 18) & 0xfffc,
+       .boot_params    = 0x00000100,
+       .map_io         = ixdp2x00_map_io,
+       .init_irq       = ixdp2800_init_irq,
        .timer          = &ixdp2800_timer,
-       INIT_MACHINE(ixdp2x00_init_machine)
+       .init_machine   = ixdp2x00_init_machine,
 MACHINE_END
 
diff -urN linux/arch/arm/mach-ixp2000/ixdp2x01.c 
linux/arch/arm/mach-ixp2000/ixdp2x01.c
--- linux/arch/arm/mach-ixp2000/ixdp2x01.c      2005/03/18 17:36:46     1.5
+++ linux/arch/arm/mach-ixp2000/ixdp2x01.c      2005/07/12 09:18:57     1.6
@@ -375,25 +375,29 @@
 
 #ifdef CONFIG_ARCH_IXDP2401
 MACHINE_START(IXDP2401, "Intel IXDP2401 Development Platform")
-       MAINTAINER("MontaVista Software, Inc.")
-       BOOT_MEM(0x00000000, IXP2000_UART_PHYS_BASE, IXP2000_UART_VIRT_BASE)
-       BOOT_PARAMS(0x00000100)
-       MAPIO(ixdp2x01_map_io)
-       INITIRQ(ixdp2x01_init_irq)
+       /* Maintainer: MontaVista Software, Inc. */
+       .phys_ram       = 0x00000000,
+       .phys_io        = IXP2000_UART_PHYS_BASE,
+       .io_pg_offst    = ((IXP2000_UART_VIRT_BASE) >> 18) & 0xfffc,
+       .boot_params    = 0x00000100,
+       .map_io         = ixdp2x01_map_io,
+       .init_irq       = ixdp2x01_init_irq,
        .timer          = &ixdp2x01_timer,
-       INIT_MACHINE(ixdp2x01_init_machine)
+       .init_machine   = ixdp2x01_init_machine,
 MACHINE_END
 #endif
 
 #ifdef CONFIG_ARCH_IXDP2801
 MACHINE_START(IXDP2801, "Intel IXDP2801 Development Platform")
-       MAINTAINER("MontaVista Software, Inc.")
-       BOOT_MEM(0x00000000, IXP2000_UART_PHYS_BASE, IXP2000_UART_VIRT_BASE)
-       BOOT_PARAMS(0x00000100)
-       MAPIO(ixdp2x01_map_io)
-       INITIRQ(ixdp2x01_init_irq)
+       /* Maintainer: MontaVista Software, Inc. */
+       .phys_ram       = 0x00000000,
+       .phys_io        = IXP2000_UART_PHYS_BASE,
+       .io_pg_offst    = ((IXP2000_UART_VIRT_BASE) >> 18) & 0xfffc,
+       .boot_params    = 0x00000100,
+       .map_io         = ixdp2x01_map_io,
+       .init_irq       = ixdp2x01_init_irq,
        .timer          = &ixdp2x01_timer,
-       INIT_MACHINE(ixdp2x01_init_machine)
+       .init_machine   = ixdp2x01_init_machine,
 MACHINE_END
 #endif
 
diff -urN linux/arch/arm/mach-ixp4xx/coyote-setup.c 
linux/arch/arm/mach-ixp4xx/coyote-setup.c
--- linux/arch/arm/mach-ixp4xx/coyote-setup.c   2005/03/18 17:36:46     1.8
+++ linux/arch/arm/mach-ixp4xx/coyote-setup.c   2005/07/12 09:18:57     1.9
@@ -100,14 +100,15 @@
 
 #ifdef CONFIG_ARCH_ADI_COYOTE
 MACHINE_START(ADI_COYOTE, "ADI Engineering Coyote")
-        MAINTAINER("MontaVista Software, Inc.")
-        BOOT_MEM(PHYS_OFFSET, IXP4XX_PERIPHERAL_BASE_PHYS,
-                IXP4XX_PERIPHERAL_BASE_VIRT)
-        MAPIO(coyote_map_io)
-        INITIRQ(ixp4xx_init_irq)
+       /* Maintainer: MontaVista Software, Inc. */
+       .phys_ram       = PHYS_OFFSET,
+       .phys_io        = IXP4XX_PERIPHERAL_BASE_PHYS,
+       .io_pg_offst    = ((IXP4XX_PERIPHERAL_BASE_VIRT) >> 18) & 0xfffc,
+       .map_io         = coyote_map_io,
+       .init_irq       = ixp4xx_init_irq,
        .timer          = &ixp4xx_timer,
-        BOOT_PARAMS(0x0100)
-       INIT_MACHINE(coyote_init)
+       .boot_params    = 0x0100,
+       .init_machine   = coyote_init,
 MACHINE_END
 #endif
 
@@ -117,14 +118,15 @@
  */
 #ifdef CONFIG_MACH_IXDPG425
 MACHINE_START(IXDPG425, "Intel IXDPG425")
-        MAINTAINER("MontaVista Software, Inc.")
-        BOOT_MEM(PHYS_OFFSET, IXP4XX_PERIPHERAL_BASE_PHYS,
-                IXP4XX_PERIPHERAL_BASE_VIRT)
-        MAPIO(coyote_map_io)
-        INITIRQ(ixp4xx_init_irq)
+       /* Maintainer: MontaVista Software, Inc. */
+       .phys_ram       = PHYS_OFFSET,
+       .phys_io        = IXP4XX_PERIPHERAL_BASE_PHYS,
+       .io_pg_offst    = ((IXP4XX_PERIPHERAL_BASE_VIRT) >> 18) & 0xfffc,
+       .map_io         = coyote_map_io,
+       .init_irq       = ixp4xx_init_irq,
        .timer          = &ixp4xx_timer,
-        BOOT_PARAMS(0x0100)
-       INIT_MACHINE(coyote_init)
+       .boot_params    = 0x0100,
+       .init_machine   = coyote_init,
 MACHINE_END
 #endif
 
diff -urN linux/arch/arm/mach-ixp4xx/gtwx5715-setup.c 
linux/arch/arm/mach-ixp4xx/gtwx5715-setup.c
--- linux/arch/arm/mach-ixp4xx/gtwx5715-setup.c 2005/02/07 02:54:31     1.1
+++ linux/arch/arm/mach-ixp4xx/gtwx5715-setup.c 2005/07/12 09:18:57     1.2
@@ -140,14 +140,15 @@
 
 
 MACHINE_START(GTWX5715, "Gemtek GTWX5715 (Linksys WRV54G)")
-        MAINTAINER("George Joseph")
-        BOOT_MEM(PHYS_OFFSET, IXP4XX_UART2_BASE_PHYS,
-                IXP4XX_UART2_BASE_VIRT)
-        MAPIO(gtwx5715_map_io)
-        INITIRQ(ixp4xx_init_irq)
-                 .timer                = &ixp4xx_timer,
-        BOOT_PARAMS(0x0100)
-        INIT_MACHINE(gtwx5715_init)
+       /* Maintainer: George Joseph */
+       .phys_ram       = PHYS_OFFSET,
+       .phys_io        = IXP4XX_UART2_BASE_PHYS,
+       .io_pg_offst    = ((IXP4XX_UART2_BASE_VIRT) >> 18) & 0xfffc,
+       .map_io         = gtwx5715_map_io,
+       .init_irq       = ixp4xx_init_irq,
+       .timer          = &ixp4xx_timer,
+       .boot_params    = 0x0100,
+       .init_machine   = gtwx5715_init,
 MACHINE_END
 
 
diff -urN linux/arch/arm/mach-ixp4xx/ixdp425-setup.c 
linux/arch/arm/mach-ixp4xx/ixdp425-setup.c
--- linux/arch/arm/mach-ixp4xx/ixdp425-setup.c  2005/03/18 17:36:46     1.7
+++ linux/arch/arm/mach-ixp4xx/ixdp425-setup.c  2005/07/12 09:18:57     1.8
@@ -128,36 +128,39 @@
 }
 
 MACHINE_START(IXDP425, "Intel IXDP425 Development Platform")
-       MAINTAINER("MontaVista Software, Inc.")
-       BOOT_MEM(PHYS_OFFSET, IXP4XX_PERIPHERAL_BASE_PHYS,
-               IXP4XX_PERIPHERAL_BASE_VIRT)
-       MAPIO(ixdp425_map_io)
-       INITIRQ(ixp4xx_init_irq)
+       /* Maintainer: MontaVista Software, Inc. */
+       .phys_ram       = PHYS_OFFSET,
+       .phys_io        = IXP4XX_PERIPHERAL_BASE_PHYS,
+       .io_pg_offst    = ((IXP4XX_PERIPHERAL_BASE_VIRT) >> 18) & 0xfffc,
+       .map_io         = ixdp425_map_io,
+       .init_irq       = ixp4xx_init_irq,
        .timer          = &ixp4xx_timer,
-       BOOT_PARAMS(0x0100)
-       INIT_MACHINE(ixdp425_init)
+       .boot_params    = 0x0100,
+       .init_machine   = ixdp425_init,
 MACHINE_END
 
 MACHINE_START(IXDP465, "Intel IXDP465 Development Platform")
-       MAINTAINER("MontaVista Software, Inc.")
-       BOOT_MEM(PHYS_OFFSET, IXP4XX_PERIPHERAL_BASE_PHYS,
-               IXP4XX_PERIPHERAL_BASE_VIRT)
-       MAPIO(ixdp425_map_io)
-       INITIRQ(ixp4xx_init_irq)
+       /* Maintainer: MontaVista Software, Inc. */
+       .phys_ram       = PHYS_OFFSET,
+       .phys_io        = IXP4XX_PERIPHERAL_BASE_PHYS,
+       .io_pg_offst    = ((IXP4XX_PERIPHERAL_BASE_VIRT) >> 18) & 0xfffc,
+       .map_io         = ixdp425_map_io,
+       .init_irq       = ixp4xx_init_irq,
        .timer          = &ixp4xx_timer,
-       BOOT_PARAMS(0x0100)
-       INIT_MACHINE(ixdp425_init)
+       .boot_params    = 0x0100,
+       .init_machine   = ixdp425_init,
 MACHINE_END
 
 MACHINE_START(IXCDP1100, "Intel IXCDP1100 Development Platform")
-       MAINTAINER("MontaVista Software, Inc.")
-       BOOT_MEM(PHYS_OFFSET, IXP4XX_PERIPHERAL_BASE_PHYS,
-               IXP4XX_PERIPHERAL_BASE_VIRT)
-       MAPIO(ixdp425_map_io)
-       INITIRQ(ixp4xx_init_irq)
+       /* Maintainer: MontaVista Software, Inc. */
+       .phys_ram       = PHYS_OFFSET,
+       .phys_io        = IXP4XX_PERIPHERAL_BASE_PHYS,
+       .io_pg_offst    = ((IXP4XX_PERIPHERAL_BASE_VIRT) >> 18) & 0xfffc,
+       .map_io         = ixdp425_map_io,
+       .init_irq       = ixp4xx_init_irq,
        .timer          = &ixp4xx_timer,
-       BOOT_PARAMS(0x0100)
-       INIT_MACHINE(ixdp425_init)
+       .boot_params    = 0x0100,
+       .init_machine   = ixdp425_init,
 MACHINE_END
 
 /*
@@ -168,14 +171,15 @@
  */
 #ifdef CONFIG_ARCH_AVILA
 MACHINE_START(AVILA, "Gateworks Avila Network Platform")
-       MAINTAINER("Deepak Saxena <dsaxena@plexity.net>")
-       BOOT_MEM(PHYS_OFFSET, IXP4XX_PERIPHERAL_BASE_PHYS,
-               IXP4XX_PERIPHERAL_BASE_VIRT)
-       MAPIO(ixdp425_map_io)
-       INITIRQ(ixp4xx_init_irq)
+       /* Maintainer: Deepak Saxena <dsaxena@plexity.net> */
+       .phys_ram       = PHYS_OFFSET,
+       .phys_io        = IXP4XX_PERIPHERAL_BASE_PHYS,
+       .io_pg_offst    = ((IXP4XX_PERIPHERAL_BASE_VIRT) >> 18) & 0xfffc,
+       .map_io         = ixdp425_map_io,
+       .init_irq       = ixp4xx_init_irq,
        .timer          = &ixp4xx_timer,
-       BOOT_PARAMS(0x0100)
-       INIT_MACHINE(ixdp425_init)
+       .boot_params    = 0x0100,
+       .init_machine   = ixdp425_init,
 MACHINE_END
 #endif
 
diff -urN linux/arch/arm/mach-l7200/core.c linux/arch/arm/mach-l7200/core.c
--- linux/arch/arm/mach-l7200/core.c    2003/09/30 14:27:16     1.7
+++ linux/arch/arm/mach-l7200/core.c    2005/07/12 09:18:57     1.8
@@ -81,9 +81,11 @@
 }
 
 MACHINE_START(L7200, "LinkUp Systems L7200")
-       MAINTAINER("Steve Hill / Scott McConnell")
-       BOOT_MEM(0xf0000000, 0x80040000, 0xd0000000)
-       MAPIO(l7200_map_io)
-       INITIRQ(l7200_init_irq)
+       /* Maintainer: Steve Hill / Scott McConnell */
+       .phys_ram       = 0xf0000000,
+       .phys_io        = 0x80040000,
+       .io_pg_offst    = ((0xd0000000) >> 18) & 0xfffc,
+       .map_io         = l7200_map_io,
+       .init_irq       = l7200_init_irq,
 MACHINE_END
 
diff -urN linux/arch/arm/mach-lh7a40x/arch-kev7a400.c 
linux/arch/arm/mach-lh7a40x/arch-kev7a400.c
--- linux/arch/arm/mach-lh7a40x/arch-kev7a400.c 2004/11/15 11:49:14     1.4
+++ linux/arch/arm/mach-lh7a40x/arch-kev7a400.c 2005/07/12 09:18:57     1.5
@@ -102,10 +102,12 @@
 }
 
 MACHINE_START (KEV7A400, "Sharp KEV7a400")
-       MAINTAINER ("Marc Singer")
-       BOOT_MEM (0xc0000000, 0x80000000, io_p2v (0x80000000))
-       BOOT_PARAMS (0xc0000100)
-       MAPIO (kev7a400_map_io)
-       INITIRQ (lh7a400_init_irq)
+       /* Maintainer: Marc Singer */
+       .phys_ram       = 0xc0000000,
+       .phys_io        = 0x80000000,
+       .io_pg_offst    = ((io_p2v (0x80000000))>>18) & 0xfffc,
+       .boot_params    = 0xc0000100,
+       .map_io         = kev7a400_map_io,
+       .init_irq       = lh7a400_init_irq,
        .timer          = &lh7a40x_timer,
 MACHINE_END
diff -urN linux/arch/arm/mach-lh7a40x/arch-lpd7a40x.c 
linux/arch/arm/mach-lh7a40x/arch-lpd7a40x.c
--- linux/arch/arm/mach-lh7a40x/arch-lpd7a40x.c 2005/03/18 17:36:46     1.9
+++ linux/arch/arm/mach-lh7a40x/arch-lpd7a40x.c 2005/07/12 09:18:57     1.10
@@ -260,13 +260,15 @@
 #ifdef CONFIG_MACH_LPD7A400
 
 MACHINE_START (LPD7A400, "Logic Product Development LPD7A400-10")
-       MAINTAINER ("Marc Singer")
-       BOOT_MEM (0xc0000000, 0x80000000, io_p2v (0x80000000))
-       BOOT_PARAMS (0xc0000100)
-       MAPIO (lpd7a400_map_io)
-       INITIRQ (lh7a400_init_irq)
+       /* Maintainer: Marc Singer */
+       .phys_ram       = 0xc0000000,
+       .phys_io        = 0x80000000,
+       .io_pg_offst    = ((io_p2v (0x80000000))>>18) & 0xfffc,
+       .boot_params    = 0xc0000100,
+       .map_io         = lpd7a400_map_io,
+       .init_irq       = lh7a400_init_irq,
        .timer          = &lh7a40x_timer,
-       INIT_MACHINE (lpd7a40x_init)
+       .init_machine   = lpd7a40x_init,
 MACHINE_END
 
 #endif
@@ -274,13 +276,15 @@
 #ifdef CONFIG_MACH_LPD7A404
 
 MACHINE_START (LPD7A404, "Logic Product Development LPD7A404-10")
-       MAINTAINER ("Marc Singer")
-       BOOT_MEM (0xc0000000, 0x80000000, io_p2v (0x80000000))
-       BOOT_PARAMS (0xc0000100)
-       MAPIO (lpd7a400_map_io)
-       INITIRQ (lh7a404_init_irq)
+       /* Maintainer: Marc Singer */
+       .phys_ram       = 0xc0000000,
+       .phys_io        = 0x80000000,
+       .io_pg_offst    = ((io_p2v (0x80000000))>>18) & 0xfffc,
+       .boot_params    = 0xc0000100,
+       .map_io         = lpd7a400_map_io,
+       .init_irq       = lh7a404_init_irq,
        .timer          = &lh7a40x_timer,
-       INIT_MACHINE (lpd7a40x_init)
+       .init_machine   = lpd7a40x_init,
 MACHINE_END
 
 #endif
diff -urN linux/arch/arm/mach-omap/board-generic.c 
linux/arch/arm/mach-omap/board-generic.c
--- linux/arch/arm/mach-omap/board-generic.c    2005/04/08 18:57:51     1.8
+++ linux/arch/arm/mach-omap/board-generic.c    2005/07/12 09:18:57     1.9
@@ -88,11 +88,13 @@
 }
 
 MACHINE_START(OMAP_GENERIC, "Generic OMAP1510/1610/1710")
-       MAINTAINER("Tony Lindgren <tony@atomide.com>")
-       BOOT_MEM(0x10000000, 0xfff00000, 0xfef00000)
-       BOOT_PARAMS(0x10000100)
-       MAPIO(omap_generic_map_io)
-       INITIRQ(omap_generic_init_irq)
-       INIT_MACHINE(omap_generic_init)
+       /* Maintainer: Tony Lindgren <tony@atomide.com> */
+       .phys_ram       = 0x10000000,
+       .phys_io        = 0xfff00000,
+       .io_pg_offst    = ((0xfef00000) >> 18) & 0xfffc,
+       .boot_params    = 0x10000100,
+       .map_io         = omap_generic_map_io,
+       .init_irq       = omap_generic_init_irq,
+       .init_machine   = omap_generic_init,
        .timer          = &omap_timer,
 MACHINE_END
diff -urN linux/arch/arm/mach-omap/board-h2.c 
linux/arch/arm/mach-omap/board-h2.c
--- linux/arch/arm/mach-omap/board-h2.c 2005/04/08 18:57:51     1.5
+++ linux/arch/arm/mach-omap/board-h2.c 2005/07/12 09:18:57     1.6
@@ -177,11 +177,13 @@
 }
 
 MACHINE_START(OMAP_H2, "TI-H2")
-       MAINTAINER("Imre Deak <imre.deak@nokia.com>")
-       BOOT_MEM(0x10000000, 0xfff00000, 0xfef00000)
-       BOOT_PARAMS(0x10000100)
-       MAPIO(h2_map_io)
-       INITIRQ(h2_init_irq)
-       INIT_MACHINE(h2_init)
+       /* Maintainer: Imre Deak <imre.deak@nokia.com> */
+       .phys_ram       = 0x10000000,
+       .phys_io        = 0xfff00000,
+       .io_pg_offst    = ((0xfef00000) >> 18) & 0xfffc,
+       .boot_params    = 0x10000100,
+       .map_io         = h2_map_io,
+       .init_irq       = h2_init_irq,
+       .init_machine   = h2_init,
        .timer          = &omap_timer,
 MACHINE_END
diff -urN linux/arch/arm/mach-omap/board-h3.c 
linux/arch/arm/mach-omap/board-h3.c
--- linux/arch/arm/mach-omap/board-h3.c 2005/04/08 18:57:51     1.5
+++ linux/arch/arm/mach-omap/board-h3.c 2005/07/12 09:18:57     1.6
@@ -195,11 +195,13 @@
 }
 
 MACHINE_START(OMAP_H3, "TI OMAP1710 H3 board")
-       MAINTAINER("Texas Instruments, Inc.")
-       BOOT_MEM(0x10000000, 0xfff00000, 0xfef00000)
-       BOOT_PARAMS(0x10000100)
-       MAPIO(h3_map_io)
-       INITIRQ(h3_init_irq)
-       INIT_MACHINE(h3_init)
+       /* Maintainer: Texas Instruments, Inc. */
+       .phys_ram       = 0x10000000,
+       .phys_io        = 0xfff00000,
+       .io_pg_offst    = ((0xfef00000) >> 18) & 0xfffc,
+       .boot_params    = 0x10000100,
+       .map_io         = h3_map_io,
+       .init_irq       = h3_init_irq,
+       .init_machine   = h3_init,
        .timer          = &omap_timer,
 MACHINE_END
diff -urN linux/arch/arm/mach-omap/board-innovator.c 
linux/arch/arm/mach-omap/board-innovator.c
--- linux/arch/arm/mach-omap/board-innovator.c  2005/04/08 18:57:51     1.9
+++ linux/arch/arm/mach-omap/board-innovator.c  2005/07/12 09:18:57     1.10
@@ -270,11 +270,13 @@
 }
 
 MACHINE_START(OMAP_INNOVATOR, "TI-Innovator")
-       MAINTAINER("MontaVista Software, Inc.")
-       BOOT_MEM(0x10000000, 0xfff00000, 0xfef00000)
-       BOOT_PARAMS(0x10000100)
-       MAPIO(innovator_map_io)
-       INITIRQ(innovator_init_irq)
-       INIT_MACHINE(innovator_init)
+       /* Maintainer: MontaVista Software, Inc. */
+       .phys_ram       = 0x10000000,
+       .phys_io        = 0xfff00000,
+       .io_pg_offst    = ((0xfef00000) >> 18) & 0xfffc,
+       .boot_params    = 0x10000100,
+       .map_io         = innovator_map_io,
+       .init_irq       = innovator_init_irq,
+       .init_machine   = innovator_init,
        .timer          = &omap_timer,
 MACHINE_END
diff -urN linux/arch/arm/mach-omap/board-netstar.c 
linux/arch/arm/mach-omap/board-netstar.c
--- linux/arch/arm/mach-omap/board-netstar.c    2005/04/08 18:57:51     1.1
+++ linux/arch/arm/mach-omap/board-netstar.c    2005/07/12 09:18:57     1.2
@@ -141,11 +141,13 @@
 postcore_initcall(netstar_late_init);
 
 MACHINE_START(NETSTAR, "NetStar OMAP5910")
-       MAINTAINER("Ladislav Michl <michl@2n.cz>")
-       BOOT_MEM(0x10000000, 0xfff00000, 0xfef00000)
-       BOOT_PARAMS(0x10000100)
-       MAPIO(netstar_map_io)
-       INITIRQ(netstar_init_irq)
-       INIT_MACHINE(netstar_init)
-       .timer = &omap_timer,
+       /* Maintainer: Ladislav Michl <michl@2n.cz> */
+       .phys_ram       = 0x10000000,
+       .phys_io        = 0xfff00000,
+       .io_pg_offst    = ((0xfef00000) >> 18) & 0xfffc,
+       .boot_params    = 0x10000100,
+       .map_io         = netstar_map_io,
+       .init_irq       = netstar_init_irq,
+       .init_machine   = netstar_init,
+       .timer          = &omap_timer,
 MACHINE_END
diff -urN linux/arch/arm/mach-omap/board-osk.c 
linux/arch/arm/mach-omap/board-osk.c
--- linux/arch/arm/mach-omap/board-osk.c        2005/04/08 18:57:51     1.9
+++ linux/arch/arm/mach-omap/board-osk.c        2005/07/12 09:18:57     1.10
@@ -159,11 +159,13 @@
 }
 
 MACHINE_START(OMAP_OSK, "TI-OSK")
-       MAINTAINER("Dirk Behme <dirk.behme@de.bosch.com>")
-       BOOT_MEM(0x10000000, 0xfff00000, 0xfef00000)
-       BOOT_PARAMS(0x10000100)
-       MAPIO(osk_map_io)
-       INITIRQ(osk_init_irq)
-       INIT_MACHINE(osk_init)
+       /* Maintainer: Dirk Behme <dirk.behme@de.bosch.com> */
+       .phys_ram       = 0x10000000,
+       .phys_io        = 0xfff00000,
+       .io_pg_offst    = ((0xfef00000) >> 18) & 0xfffc,
+       .boot_params    = 0x10000100,
+       .map_io         = osk_map_io,
+       .init_irq       = osk_init_irq,
+       .init_machine   = osk_init,
        .timer          = &omap_timer,
 MACHINE_END
diff -urN linux/arch/arm/mach-omap/board-perseus2.c 
linux/arch/arm/mach-omap/board-perseus2.c
--- linux/arch/arm/mach-omap/board-perseus2.c   2005/04/08 18:57:51     1.9
+++ linux/arch/arm/mach-omap/board-perseus2.c   2005/07/12 09:18:57     1.10
@@ -179,11 +179,13 @@
 }
 
 MACHINE_START(OMAP_PERSEUS2, "OMAP730 Perseus2")
-       MAINTAINER("Kevin Hilman <kjh@hilman.org>")
-       BOOT_MEM(0x10000000, 0xfff00000, 0xfef00000)
-       BOOT_PARAMS(0x10000100)
-       MAPIO(omap_perseus2_map_io)
-       INITIRQ(omap_perseus2_init_irq)
-       INIT_MACHINE(omap_perseus2_init)
+       /* Maintainer: Kevin Hilman <kjh@hilman.org> */
+       .phys_ram       = 0x10000000,
+       .phys_io        = 0xfff00000,
+       .io_pg_offst    = ((0xfef00000) >> 18) & 0xfffc,
+       .boot_params    = 0x10000100,
+       .map_io         = omap_perseus2_map_io,
+       .init_irq       = omap_perseus2_init_irq,
+       .init_machine   = omap_perseus2_init,
        .timer          = &omap_timer,
 MACHINE_END
diff -urN linux/arch/arm/mach-omap/board-voiceblue.c 
linux/arch/arm/mach-omap/board-voiceblue.c
--- linux/arch/arm/mach-omap/board-voiceblue.c  2005/04/08 18:57:51     1.1
+++ linux/arch/arm/mach-omap/board-voiceblue.c  2005/07/12 09:18:57     1.2
@@ -246,11 +246,13 @@
 EXPORT_SYMBOL(voiceblue_wdt_ping);
 
 MACHINE_START(VOICEBLUE, "VoiceBlue OMAP5910")
-       MAINTAINER("Ladislav Michl <michl@2n.cz>")
-       BOOT_MEM(0x10000000, 0xfff00000, 0xfef00000)
-       BOOT_PARAMS(0x10000100)
-       MAPIO(voiceblue_map_io)
-       INITIRQ(voiceblue_init_irq)
-       INIT_MACHINE(voiceblue_init)
-       .timer = &omap_timer,
+       /* Maintainer: Ladislav Michl <michl@2n.cz> */
+       .phys_ram       = 0x10000000,
+       .phys_io        = 0xfff00000,
+       .io_pg_offst    = ((0xfef00000) >> 18) & 0xfffc,
+       .boot_params    = 0x10000100,
+       .map_io         = voiceblue_map_io,
+       .init_irq       = voiceblue_init_irq,
+       .init_machine   = voiceblue_init,
+       .timer          = &omap_timer,
 MACHINE_END
diff -urN linux/arch/arm/mach-omap/pm.c linux/arch/arm/mach-omap/pm.c
--- linux/arch/arm/mach-omap/pm.c       2005/04/08 18:57:51     1.3
+++ linux/arch/arm/mach-omap/pm.c       2005/07/12 09:18:57     1.4
@@ -41,7 +41,9 @@
 #include <linux/pm.h>
 
 #include <asm/io.h>
+#include <asm/mach/time.h>
 #include <asm/mach-types.h>
+
 #include <asm/arch/omap16xx.h>
 #include <asm/arch/pm.h>
 #include <asm/arch/mux.h>
@@ -80,13 +82,13 @@
                return;
        }
        mask32 = omap_readl(ARM_SYSST);
-       local_fiq_enable();
-       local_irq_enable();
 
-#if defined(CONFIG_OMAP_32K_TIMER) && defined(CONFIG_NO_IDLE_HZ)
-       /* Override timer to use VST for the next cycle */
-       omap_32k_timer_next_vst_interrupt();
-#endif
+       /*
+        * Since an interrupt may set up a timer, we don't want to
+        * reprogram the hardware timer with interrupts enabled.
+        * Re-enable interrupts only after returning from idle.
+        */
+       timer_dyn_reprogram();
 
        if ((mask32 & DSP_IDLE) == 0) {
                __asm__ volatile ("mcr  p15, 0, r0, c7, c0, 4");
@@ -102,6 +104,8 @@
 
                func_ptr();
        }
+       local_fiq_enable();
+       local_irq_enable();
 }
 
 /*
diff -urN linux/arch/arm/mach-omap/time.c linux/arch/arm/mach-omap/time.c
--- linux/arch/arm/mach-omap/time.c     2005/07/11 20:46:02     1.6
+++ linux/arch/arm/mach-omap/time.c     2005/07/12 09:18:57     1.7
@@ -4,7 +4,7 @@
  * OMAP Timers
  *
  * Copyright (C) 2004 Nokia Corporation
- * Partial timer rewrite and additional VST timer support by
+ * Partial timer rewrite and additional dynamic tick timer support by
  * Tony Lindgen <tony@atomide.com> and
  * Tuukka Tikkanen <tuukka.tikkanen@elektrobit.com>
  *
@@ -261,7 +261,6 @@
  * so with HZ = 100, TVR = 327.68.
  */
 #define OMAP_32K_TIMER_TICK_PERIOD     ((32768 / HZ) - 1)
-#define MAX_SKIP_JIFFIES               25
 #define TIMER_32K_SYNCHRONIZED         0xfffbc410
 
 #define JIFFIES_TO_HW_TICKS(nr_jiffies, clock_rate)                    \
@@ -347,6 +346,42 @@
        return IRQ_HANDLED;
 }
 
+#ifdef CONFIG_NO_IDLE_HZ
+/*
+ * Programs the next timer interrupt needed. Called when dynamic tick is
+ * enabled, and to reprogram the ticks to skip from pm_idle. Note that
+ * we can keep the timer continuous, and don't need to set it to run in
+ * one-shot mode. This is because the timer will get reprogrammed again
+ * after next interrupt.
+ */
+void omap_32k_timer_reprogram(unsigned long next_tick)
+{
+       omap_32k_timer_start(JIFFIES_TO_HW_TICKS(next_tick, 32768) + 1);
+}
+
+static struct irqaction omap_32k_timer_irq;
+extern struct timer_update_handler timer_update;
+
+static int omap_32k_timer_enable_dyn_tick(void)
+{
+       /* No need to reprogram timer, just use the next interrupt */
+       return 0;
+}
+
+static int omap_32k_timer_disable_dyn_tick(void)
+{
+       omap_32k_timer_start(OMAP_32K_TIMER_TICK_PERIOD);
+       return 0;
+}
+
+static struct dyn_tick_timer omap_dyn_tick_timer = {
+       .enable         = omap_32k_timer_enable_dyn_tick,
+       .disable        = omap_32k_timer_disable_dyn_tick,
+       .reprogram      = omap_32k_timer_reprogram,
+       .handler        = omap_32k_timer_interrupt,
+};
+#endif /* CONFIG_NO_IDLE_HZ */
+
 static struct irqaction omap_32k_timer_irq = {
        .name           = "32KHz timer",
        .flags          = SA_INTERRUPT | SA_TIMER,
@@ -355,6 +390,11 @@
 
 static __init void omap_init_32k_timer(void)
 {
+
+#ifdef CONFIG_NO_IDLE_HZ
+       omap_timer.dyn_tick = &omap_dyn_tick_timer;
+#endif
+
        setup_irq(INT_OS_TIMER, &omap_32k_timer_irq);
        omap_timer.offset  = omap_32k_timer_gettimeoffset;
        omap_32k_last_tick = omap_32k_sync_timer_read();
diff -urN linux/arch/arm/mach-omap/usb.c linux/arch/arm/mach-omap/usb.c
--- linux/arch/arm/mach-omap/usb.c      2005/07/11 20:46:02     1.4
+++ linux/arch/arm/mach-omap/usb.c      2005/07/12 09:18:57     1.5
@@ -41,7 +41,6 @@
 
 /* These routines should handle the standard chip-specific modes
  * for usb0/1/2 ports, covering basic mux and transceiver setup.
- * Call omap_usb_init() once, from INIT_MACHINE().
  *
  * Some board-*.c files will need to set up additional mux options,
  * like for suspend handling, vbus sensing, GPIOs, and the D+ pullup.
diff -urN linux/arch/arm/mach-pxa/standby.S linux/arch/arm/mach-pxa/standby.S
--- linux/arch/arm/mach-pxa/standby.S   1970/01/01 00:00:00
+++ linux/arch/arm/mach-pxa/standby.S   2005-07-12 10:18:58.494893000 +0100     
1.1
@@ -0,0 +1,32 @@
+/*
+ * PXA27x standby mode
+ *
+ * Author: David Burrage
+ *
+ * 2005 (c) MontaVista Software, Inc. This file is licensed under
+ * the terms of the GNU General Public License version 2. This program
+ * is licensed "as is" without any warranty of any kind, whether express
+ * or implied.
+ */
+
+#include <linux/config.h>
+#include <linux/linkage.h>
+#include <asm/assembler.h>
+#include <asm/hardware.h>
+
+#include <asm/arch/pxa-regs.h>
+
+               .text
+
+ENTRY(pxa_cpu_standby)
+       ldr     r0, =PSSR
+       mov     r1, #(PSSR_PH | PSSR_STS)
+       mov     r2, #2
+       mov     r3, #UNCACHED_PHYS_0    @ Read mem context in.
+       ldr     ip, [r3]
+       b       1f
+
+       .align  5
+1:     mcr     p14, 0, r2, c7, c0, 0   @ put the system into Standby
+       str     r1, [r0]                @ make sure PSSR_PH/STS are clear
+       mov     pc, lr
diff -urN linux/arch/arm/mach-pxa/Makefile linux/arch/arm/mach-pxa/Makefile
--- linux/arch/arm/mach-pxa/Makefile    2005/03/18 17:36:46     1.12
+++ linux/arch/arm/mach-pxa/Makefile    2005/07/12 09:18:58     1.13
@@ -24,3 +24,7 @@
 
 # Misc features
 obj-$(CONFIG_PM) += pm.o sleep.o
+
+ifeq ($(CONFIG_PXA27x),y)
+obj-$(CONFIG_PM) += standby.o
+endif
diff -urN linux/arch/arm/mach-pxa/corgi.c linux/arch/arm/mach-pxa/corgi.c
--- linux/arch/arm/mach-pxa/corgi.c     2005/04/08 18:57:52     1.5
+++ linux/arch/arm/mach-pxa/corgi.c     2005/07/12 09:18:58     1.6
@@ -287,34 +287,40 @@
 
 #ifdef CONFIG_MACH_CORGI
 MACHINE_START(CORGI, "SHARP Corgi")
-       BOOT_MEM(0xa0000000, 0x40000000, io_p2v(0x40000000))
-       FIXUP(fixup_corgi)
-       MAPIO(corgi_map_io)
-       INITIRQ(corgi_init_irq)
-       .init_machine = corgi_init,
-       .timer = &pxa_timer,
+       .phys_ram       = 0xa0000000,
+       .phys_io        = 0x40000000,
+       .io_pg_offst    = (io_p2v(0x40000000) >> 18) & 0xfffc,
+       .fixup          = fixup_corgi,
+       .map_io         = corgi_map_io,
+       .init_irq       = corgi_init_irq,
+       .init_machine   = corgi_init,
+       .timer          = &pxa_timer,
 MACHINE_END
 #endif
 
 #ifdef CONFIG_MACH_SHEPHERD
 MACHINE_START(SHEPHERD, "SHARP Shepherd")
-       BOOT_MEM(0xa0000000, 0x40000000, io_p2v(0x40000000))
-       FIXUP(fixup_corgi)
-       MAPIO(corgi_map_io)
-       INITIRQ(corgi_init_irq)
-       .init_machine = corgi_init,
-       .timer = &pxa_timer,
+       .phys_ram       = 0xa0000000,
+       .phys_io        = 0x40000000,
+       .io_pg_offst    = (io_p2v(0x40000000) >> 18) & 0xfffc,
+       .fixup          = fixup_corgi,
+       .map_io         = corgi_map_io,
+       .init_irq       = corgi_init_irq,
+       .init_machine   = corgi_init,
+       .timer          = &pxa_timer,
 MACHINE_END
 #endif
 
 #ifdef CONFIG_MACH_HUSKY
 MACHINE_START(HUSKY, "SHARP Husky")
-       BOOT_MEM(0xa0000000, 0x40000000, io_p2v(0x40000000))
-       FIXUP(fixup_corgi)
-       MAPIO(corgi_map_io)
-       INITIRQ(corgi_init_irq)
-       .init_machine = corgi_init,
-       .timer = &pxa_timer,
+       .phys_ram       = 0xa0000000,
+       .phys_io        = 0x40000000,
+       .io_pg_offst    = (io_p2v(0x40000000) >> 18) & 0xfffc,
+       .fixup          = fixup_corgi,
+       .map_io         = corgi_map_io,
+       .init_irq       = corgi_init_irq,
+       .init_machine   = corgi_init,
+       .timer          = &pxa_timer,
 MACHINE_END
 #endif
 
diff -urN linux/arch/arm/mach-pxa/idp.c linux/arch/arm/mach-pxa/idp.c
--- linux/arch/arm/mach-pxa/idp.c       2005/03/18 17:36:46     1.14
+++ linux/arch/arm/mach-pxa/idp.c       2005/07/12 09:18:58     1.15
@@ -181,10 +181,12 @@
 
 
 MACHINE_START(PXA_IDP, "Vibren PXA255 IDP")
-       MAINTAINER("Vibren Technologies")
-       BOOT_MEM(0xa0000000, 0x40000000, io_p2v(0x40000000))
-       MAPIO(idp_map_io)
-       INITIRQ(idp_init_irq)
+       /* Maintainer: Vibren Technologies */
+       .phys_ram       = 0xa0000000,
+       .phys_io        = 0x40000000,
+       .io_pg_offst    = (io_p2v(0x40000000) >> 18) & 0xfffc,
+       .map_io         = idp_map_io,
+       .init_irq       = idp_init_irq,
        .timer          = &pxa_timer,
-       INIT_MACHINE(idp_init)
+       .init_machine   = idp_init,
 MACHINE_END
diff -urN linux/arch/arm/mach-pxa/lubbock.c linux/arch/arm/mach-pxa/lubbock.c
--- linux/arch/arm/mach-pxa/lubbock.c   2005/06/18 14:42:39     1.24
+++ linux/arch/arm/mach-pxa/lubbock.c   2005/07/12 09:18:58     1.25
@@ -268,10 +268,12 @@
 }
 
 MACHINE_START(LUBBOCK, "Intel DBPXA250 Development Platform (aka Lubbock)")
-       MAINTAINER("MontaVista Software Inc.")
-       BOOT_MEM(0xa0000000, 0x40000000, io_p2v(0x40000000))
-       MAPIO(lubbock_map_io)
-       INITIRQ(lubbock_init_irq)
+       /* Maintainer: MontaVista Software Inc. */
+       .phys_ram       = 0xa0000000,
+       .phys_io        = 0x40000000,
+       .io_pg_offst    = (io_p2v(0x40000000) >> 18) & 0xfffc,
+       .map_io         = lubbock_map_io,
+       .init_irq       = lubbock_init_irq,
        .timer          = &pxa_timer,
-       INIT_MACHINE(lubbock_init)
+       .init_machine   = lubbock_init,
 MACHINE_END
diff -urN linux/arch/arm/mach-pxa/mainstone.c 
linux/arch/arm/mach-pxa/mainstone.c
--- linux/arch/arm/mach-pxa/mainstone.c 2005/06/18 14:42:39     1.10
+++ linux/arch/arm/mach-pxa/mainstone.c 2005/07/12 09:18:58     1.11
@@ -345,10 +345,12 @@
 }
 
 MACHINE_START(MAINSTONE, "Intel HCDDBBVA0 Development Platform (aka 
Mainstone)")
-       MAINTAINER("MontaVista Software Inc.")
-       BOOT_MEM(0xa0000000, 0x40000000, io_p2v(0x40000000))
-       MAPIO(mainstone_map_io)
-       INITIRQ(mainstone_init_irq)
+       /* Maintainer: MontaVista Software Inc. */
+       .phys_ram       = 0xa0000000,
+       .phys_io        = 0x40000000,
+       .io_pg_offst    = (io_p2v(0x40000000) >> 18) & 0xfffc,
+       .map_io         = mainstone_map_io,
+       .init_irq       = mainstone_init_irq,
        .timer          = &pxa_timer,
-       INIT_MACHINE(mainstone_init)
+       .init_machine   = mainstone_init,
 MACHINE_END
diff -urN linux/arch/arm/mach-pxa/poodle.c linux/arch/arm/mach-pxa/poodle.c
--- linux/arch/arm/mach-pxa/poodle.c    2005/04/08 18:57:52     1.2
+++ linux/arch/arm/mach-pxa/poodle.c    2005/07/12 09:18:58     1.3
@@ -180,10 +180,12 @@
 }
 
 MACHINE_START(POODLE, "SHARP Poodle")
-       BOOT_MEM(0xa0000000, 0x40000000, io_p2v(0x40000000))
-       FIXUP(fixup_poodle)
-       MAPIO(poodle_map_io)
-       INITIRQ(pxa_init_irq)
-       .timer = &pxa_timer,
-       .init_machine = poodle_init,
+       .phys_ram       = 0xa0000000,
+       .phys_io        = 0x40000000,
+       .io_pg_offst    = (io_p2v(0x40000000) >> 18) & 0xfffc,
+       .fixup          = fixup_poodle,
+       .map_io         = poodle_map_io,
+       .init_irq       = pxa_init_irq,
+       .timer          = &pxa_timer,
+       .init_machine   = poodle_init,
 MACHINE_END
diff -urN linux/arch/arm/mach-pxa/pxa27x.c linux/arch/arm/mach-pxa/pxa27x.c
--- linux/arch/arm/mach-pxa/pxa27x.c    2005/06/18 14:42:39     1.5
+++ linux/arch/arm/mach-pxa/pxa27x.c    2005/07/12 09:18:58     1.6
@@ -126,6 +126,7 @@
 {
        switch (state) {
        case PM_SUSPEND_MEM:
+       case PM_SUSPEND_STANDBY:
                return 0;
        default:
                return -EINVAL;
@@ -138,7 +139,10 @@
        extern void pxa_cpu_suspend(unsigned int);
        extern void pxa_cpu_resume(void);
 
-       CKEN = CKEN22_MEMC | CKEN9_OSTIMER;
+       if (state == PM_SUSPEND_STANDBY)
+               CKEN = CKEN22_MEMC | CKEN9_OSTIMER | CKEN16_LCD |CKEN0_PWM0;
+       else
+               CKEN = CKEN22_MEMC | CKEN9_OSTIMER;
 
        /* ensure voltage-change sequencer not initiated, which hangs */
        PCFR &= ~PCFR_FVC;
@@ -147,6 +151,9 @@
        PEDR = 0xDF12FE1B;
 
        switch (state) {
+       case PM_SUSPEND_STANDBY:
+               pxa_cpu_standby();
+               break;
        case PM_SUSPEND_MEM:
                /* set resume return address */
                PSPR = virt_to_phys(pxa_cpu_resume);
diff -urN linux/arch/arm/mach-rpc/riscpc.c linux/arch/arm/mach-rpc/riscpc.c
--- linux/arch/arm/mach-rpc/riscpc.c    2005/07/11 20:46:03     1.12
+++ linux/arch/arm/mach-rpc/riscpc.c    2005/07/12 09:18:58     1.13
@@ -163,12 +163,14 @@
 extern struct sys_timer ioc_timer;
 
 MACHINE_START(RISCPC, "Acorn-RiscPC")
-       MAINTAINER("Russell King")
-       BOOT_MEM(0x10000000, 0x03000000, 0xe0000000)
-       BOOT_PARAMS(0x10000100)
-       DISABLE_PARPORT(0)
-       DISABLE_PARPORT(1)
-       MAPIO(rpc_map_io)
-       INITIRQ(rpc_init_irq)
+       /* Maintainer: Russell King */
+       .phys_ram       = 0x10000000,
+       .phys_io        = 0x03000000,
+       .io_pg_offst    = ((0xe0000000) >> 18) & 0xfffc,
+       .boot_params    = 0x10000100,
+       .reserve_lp0    = 1,
+       .reserve_lp1    = 1,
+       .map_io         = rpc_map_io,
+       .init_irq       = rpc_init_irq,
        .timer          = &ioc_timer,
 MACHINE_END
diff -urN linux/arch/arm/mach-s3c2410/pm-simtec.c 
linux/arch/arm/mach-s3c2410/pm-simtec.c
--- linux/arch/arm/mach-s3c2410/pm-simtec.c     1970/01/01 00:00:00
+++ linux/arch/arm/mach-s3c2410/pm-simtec.c     2005-07-12 10:18:58.990987000 
+0100     1.1
@@ -0,0 +1,65 @@
+/* linux/arch/arm/mach-s3c2410/pm-simtec.c
+ *
+ * Copyright (c) 2004 Simtec Electronics
+ *     Ben Dooks <ben@simtec.co.uk>
+ *
+ * http://armlinux.simtec.co.uk/
+ *
+ * Power Management helpers for Simtec S3C24XX implementations
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+*/
+
+#include <linux/kernel.h>
+#include <linux/types.h>
+#include <linux/interrupt.h>
+#include <linux/list.h>
+#include <linux/timer.h>
+#include <linux/init.h>
+#include <linux/device.h>
+
+#include <asm/mach/arch.h>
+#include <asm/mach/map.h>
+
+#include <asm/hardware.h>
+#include <asm/io.h>
+
+#include <asm/arch/map.h>
+#include <asm/arch/regs-serial.h>
+#include <asm/arch/regs-gpio.h>
+#include <asm/arch/regs-mem.h>
+
+#include <asm/mach-types.h>
+
+#include "pm.h"
+
+#define COPYRIGHT ", (c) 2005 Simtec Electronics"
+
+/* pm_simtec_init
+ *
+ * enable the power management functions
+*/
+
+static __init int pm_simtec_init(void)
+{
+       unsigned long gstatus4;
+
+       /* check which machine we are running on */
+
+       if (!machine_is_bast() && !machine_is_vr1000())
+               return 0;
+
+       printk(KERN_INFO "Simtec Board Power Manangement" COPYRIGHT "\n");
+
+       gstatus4  = (__raw_readl(S3C2410_BANKCON7) & 0x3) << 30;
+       gstatus4 |= (__raw_readl(S3C2410_BANKCON6) & 0x3) << 28;
+       gstatus4 |= (__raw_readl(S3C2410_BANKSIZE) & S3C2410_BANKSIZE_MASK);
+
+       __raw_writel(gstatus4, S3C2410_GSTATUS4);
+
+       return s3c2410_pm_init();
+}
+
+arch_initcall(pm_simtec_init);
diff -urN linux/arch/arm/mach-s3c2410/Kconfig 
linux/arch/arm/mach-s3c2410/Kconfig
--- linux/arch/arm/mach-s3c2410/Kconfig 2005/03/18 17:36:46     1.10
+++ linux/arch/arm/mach-s3c2410/Kconfig 2005/07/12 09:18:58     1.11
@@ -154,6 +154,11 @@
          the CRC data block will take more memory, but wil identify any
          faults with better precision.
 
+config PM_SIMTEC
+       bool
+       depends on PM && (ARCH_BAST || MACH_VR1000)
+       default y
+
 config S3C2410_LOWLEVEL_UART_PORT
        int "S3C2410 UART to use for low-level messages"
        default 0
diff -urN linux/arch/arm/mach-s3c2410/Makefile 
linux/arch/arm/mach-s3c2410/Makefile
--- linux/arch/arm/mach-s3c2410/Makefile        2005/03/18 17:36:46     1.9
+++ linux/arch/arm/mach-s3c2410/Makefile        2005/07/12 09:18:58     1.10
@@ -18,6 +18,7 @@
 # Power Management support
 
 obj-$(CONFIG_PM)          += pm.o sleep.o
+obj-$(CONFIG_PM_SIMTEC)           += pm-simtec.o
 
 # S3C2440 support
 
diff -urN linux/arch/arm/mach-s3c2410/devs.c linux/arch/arm/mach-s3c2410/devs.c
--- linux/arch/arm/mach-s3c2410/devs.c  2005/03/18 17:36:46     1.5
+++ linux/arch/arm/mach-s3c2410/devs.c  2005/07/12 09:18:58     1.6
@@ -96,8 +96,8 @@
        .num_resources    = ARRAY_SIZE(s3c_lcd_resource),
        .resource         = s3c_lcd_resource,
        .dev              = {
-               .dma_mask = &s3c_device_lcd_dmamask,
-               .coherent_dma_mask = 0xffffffffUL
+               .dma_mask               = &s3c_device_lcd_dmamask,
+               .coherent_dma_mask      = 0xffffffffUL
        }
 };
 
diff -urN linux/arch/arm/mach-s3c2410/mach-bast.c 
linux/arch/arm/mach-s3c2410/mach-bast.c
--- linux/arch/arm/mach-s3c2410/mach-bast.c     2005/07/11 20:46:03     1.11
+++ linux/arch/arm/mach-s3c2410/mach-bast.c     2005/07/12 09:18:58     1.12
@@ -27,6 +27,7 @@
  *     10-Mar-2005 LCVR Changed S3C2410_VA to S3C24XX_VA
  *     14-Mar-2006 BJD  Updated for __iomem changes
  *     22-Jun-2006 BJD  Added DM9000 platform information
+ *     28-Jun-2006 BJD  Moved pm functionality out to common code
 */
 
 #include <linux/kernel.h>
@@ -67,7 +68,6 @@
 #include "devs.h"
 #include "cpu.h"
 #include "usb-simtec.h"
-#include "pm.h"
 
 #define COPYRIGHT ", (c) 2004-2005 Simtec Electronics"
 
@@ -405,44 +405,14 @@
        usb_simtec_init();
 }
 
-void __init bast_init_irq(void)
-{
-       s3c24xx_init_irq();
-}
-
-#ifdef CONFIG_PM
-
-/* bast_init_machine
- *
- * enable the power management functions for the EB2410ITX
-*/
-
-static __init void bast_init_machine(void)
-{
-       unsigned long gstatus4;
-
-       printk(KERN_INFO "BAST Power Manangement" COPYRIGHT "\n");
-
-       gstatus4  = (__raw_readl(S3C2410_BANKCON7) & 0x3) << 30;
-       gstatus4 |= (__raw_readl(S3C2410_BANKCON6) & 0x3) << 28;
-       gstatus4 |= (__raw_readl(S3C2410_BANKSIZE) & S3C2410_BANKSIZE_MASK);
-
-       __raw_writel(gstatus4, S3C2410_GSTATUS4);
-
-       s3c2410_pm_init();
-}
-
-#else
-#define bast_init_machine NULL
-#endif
-
 
 MACHINE_START(BAST, "Simtec-BAST")
-     MAINTAINER("Ben Dooks <ben@simtec.co.uk>")
-     BOOT_MEM(S3C2410_SDRAM_PA, S3C2410_PA_UART, (u32)S3C24XX_VA_UART)
-     BOOT_PARAMS(S3C2410_SDRAM_PA + 0x100)
-     MAPIO(bast_map_io)
-     INITIRQ(bast_init_irq)
-       .init_machine   = bast_init_machine,
+       /* Maintainer: Ben Dooks <ben@simtec.co.uk> */
+       .phys_ram       = S3C2410_SDRAM_PA,
+       .phys_io        = S3C2410_PA_UART,
+       .io_pg_offst    = (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc,
+       .boot_params    = S3C2410_SDRAM_PA + 0x100,
+       .map_io         = bast_map_io,
+       .init_irq       = s3c24xx_init_irq,
        .timer          = &s3c24xx_timer,
 MACHINE_END
diff -urN linux/arch/arm/mach-s3c2410/mach-h1940.c 
linux/arch/arm/mach-s3c2410/mach-h1940.c
--- linux/arch/arm/mach-s3c2410/mach-h1940.c    2005/03/18 17:36:47     1.9
+++ linux/arch/arm/mach-s3c2410/mach-h1940.c    2005/07/12 09:18:58     1.10
@@ -117,10 +117,12 @@
 }
 
 MACHINE_START(H1940, "IPAQ-H1940")
-     MAINTAINER("Ben Dooks <ben@fluff.org>")
-     BOOT_MEM(S3C2410_SDRAM_PA, S3C2410_PA_UART, (u32)S3C24XX_VA_UART)
-     BOOT_PARAMS(S3C2410_SDRAM_PA + 0x100)
-     MAPIO(h1940_map_io)
-     INITIRQ(h1940_init_irq)
+       /* Maintainer: Ben Dooks <ben@fluff.org> */
+       .phys_ram       = S3C2410_SDRAM_PA,
+       .phys_io        = S3C2410_PA_UART,
+       .io_pg_offst    = (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc,
+       .boot_params    = S3C2410_SDRAM_PA + 0x100,
+       .map_io         = h1940_map_io,
+       .init_irq       = h1940_init_irq,
        .timer          = &s3c24xx_timer,
 MACHINE_END
diff -urN linux/arch/arm/mach-s3c2410/mach-n30.c 
linux/arch/arm/mach-s3c2410/mach-n30.c
--- linux/arch/arm/mach-s3c2410/mach-n30.c      2005/03/18 17:36:47     1.1
+++ linux/arch/arm/mach-s3c2410/mach-n30.c      2005/07/12 09:18:58     1.2
@@ -137,10 +137,11 @@
 }
 
 MACHINE_START(N30, "Acer-N30")
-     MAINTAINER("Christer Weinigel <christer@weinigel.se>, Ben Dooks 
<ben-linux@fluff.org>")
-     BOOT_MEM(S3C2410_SDRAM_PA, S3C2410_PA_UART, (u32)S3C24XX_VA_UART)
-     BOOT_PARAMS(S3C2410_SDRAM_PA + 0x100)
-
+       /* Maintainer: Christer Weinigel <christer@weinigel.se>, Ben Dooks 
<ben-linux@fluff.org> */
+       .phys_ram       = S3C2410_SDRAM_PA,
+       .phys_io        = S3C2410_PA_UART,
+       .io_pg_offst    = (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc,
+       .boot_params    = S3C2410_SDRAM_PA + 0x100,
        .timer          = &s3c24xx_timer,
        .init_machine   = n30_init,
        .init_irq       = n30_init_irq,
diff -urN linux/arch/arm/mach-s3c2410/mach-nexcoder.c 
linux/arch/arm/mach-s3c2410/mach-nexcoder.c
--- linux/arch/arm/mach-s3c2410/mach-nexcoder.c 2005/04/08 18:57:52     1.2
+++ linux/arch/arm/mach-s3c2410/mach-nexcoder.c 2005/07/12 09:18:58     1.3
@@ -147,9 +147,11 @@
 
 
 MACHINE_START(NEXCODER_2440, "NexVision - Nexcoder 2440")
-     MAINTAINER("Guillaume GOURAT <guillaume.gourat@nexvision.tv>")
-     BOOT_MEM(S3C2410_SDRAM_PA, S3C2410_PA_UART, (u32)S3C24XX_VA_UART)
-     BOOT_PARAMS(S3C2410_SDRAM_PA + 0x100)
+       /* Maintainer: Guillaume GOURAT <guillaume.gourat@nexvision.tv> */
+       .phys_ram       = S3C2410_SDRAM_PA,
+       .phys_io        = S3C2410_PA_UART,
+       .io_pg_offst    = (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc,
+       .boot_params    = S3C2410_SDRAM_PA + 0x100,
        .map_io         = nexcoder_map_io,
        .init_irq       = s3c24xx_init_irq,
        .timer          = &s3c24xx_timer,
diff -urN linux/arch/arm/mach-s3c2410/mach-otom.c 
linux/arch/arm/mach-s3c2410/mach-otom.c
--- linux/arch/arm/mach-s3c2410/mach-otom.c     2005/04/08 18:57:52     1.2
+++ linux/arch/arm/mach-s3c2410/mach-otom.c     2005/07/12 09:18:58     1.3
@@ -115,9 +115,11 @@
 
 
 MACHINE_START(OTOM, "Nex Vision - Otom 1.1")
-     MAINTAINER("Guillaume GOURAT <guillaume.gourat@nexvision.tv>")
-     BOOT_MEM(S3C2410_SDRAM_PA, S3C2410_PA_UART, (u32)S3C24XX_VA_UART)
-     BOOT_PARAMS(S3C2410_SDRAM_PA + 0x100)
+       /* Maintainer: Guillaume GOURAT <guillaume.gourat@nexvision.tv> */
+       .phys_ram       = S3C2410_SDRAM_PA,
+       .phys_io        = S3C2410_PA_UART,
+       .io_pg_offst    = (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc,
+       .boot_params    = S3C2410_SDRAM_PA + 0x100,
        .map_io         = otom11_map_io,
        .init_irq       = s3c24xx_init_irq,
        .timer          = &s3c24xx_timer,
diff -urN linux/arch/arm/mach-s3c2410/mach-rx3715.c 
linux/arch/arm/mach-s3c2410/mach-rx3715.c
--- linux/arch/arm/mach-s3c2410/mach-rx3715.c   2005/04/08 18:57:52     1.5
+++ linux/arch/arm/mach-s3c2410/mach-rx3715.c   2005/07/12 09:18:58     1.6
@@ -131,11 +131,13 @@
 #endif
 
 MACHINE_START(RX3715, "IPAQ-RX3715")
-     MAINTAINER("Ben Dooks <ben@fluff.org>")
-     BOOT_MEM(S3C2410_SDRAM_PA, S3C2410_PA_UART, (u32)S3C24XX_VA_UART)
-     BOOT_PARAMS(S3C2410_SDRAM_PA + 0x100)
-     MAPIO(rx3715_map_io)
-     INITIRQ(rx3715_init_irq)
-     INIT_MACHINE(rx3715_init_machine)
+       /* Maintainer: Ben Dooks <ben@fluff.org> */
+       .phys_ram       = S3C2410_SDRAM_PA,
+       .phys_io        = S3C2410_PA_UART,
+       .io_pg_offst    = (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc,
+       .boot_params    = S3C2410_SDRAM_PA + 0x100,
+       .map_io         = rx3715_map_io,
+       .init_irq       = rx3715_init_irq,
+       .init_machine   = rx3715_init_machine,
        .timer          = &s3c24xx_timer,
 MACHINE_END
diff -urN linux/arch/arm/mach-s3c2410/mach-smdk2410.c 
linux/arch/arm/mach-s3c2410/mach-smdk2410.c
--- linux/arch/arm/mach-s3c2410/mach-smdk2410.c 2005/03/18 17:36:47     1.9
+++ linux/arch/arm/mach-s3c2410/mach-smdk2410.c 2005/07/12 09:18:58     1.10
@@ -112,11 +112,13 @@
 
 MACHINE_START(SMDK2410, "SMDK2410") /* @TODO: request a new identifier and 
switch
                                    * to SMDK2410 */
-     MAINTAINER("Jonas Dietsche")
-     BOOT_MEM(S3C2410_SDRAM_PA, S3C2410_PA_UART, (u32)S3C24XX_VA_UART)
-     BOOT_PARAMS(S3C2410_SDRAM_PA + 0x100)
-     MAPIO(smdk2410_map_io)
-     INITIRQ(smdk2410_init_irq)
+       /* Maintainer: Jonas Dietsche */
+       .phys_ram       = S3C2410_SDRAM_PA,
+       .phys_io        = S3C2410_PA_UART,
+       .io_pg_offst    = (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc,
+       .boot_params    = S3C2410_SDRAM_PA + 0x100,
+       .map_io         = smdk2410_map_io,
+       .init_irq       = smdk2410_init_irq,
        .timer          = &s3c24xx_timer,
 MACHINE_END
 
diff -urN linux/arch/arm/mach-s3c2410/mach-smdk2440.c 
linux/arch/arm/mach-s3c2410/mach-smdk2440.c
--- linux/arch/arm/mach-s3c2410/mach-smdk2440.c 2005/03/18 17:36:47     1.1
+++ linux/arch/arm/mach-s3c2410/mach-smdk2440.c 2005/07/12 09:18:58     1.2
@@ -124,9 +124,11 @@
 }
 
 MACHINE_START(S3C2440, "SMDK2440")
-       MAINTAINER("Ben Dooks <ben@fluff.org>")
-       BOOT_MEM(S3C2410_SDRAM_PA, S3C2410_PA_UART, (u32)S3C24XX_VA_UART)
-       BOOT_PARAMS(S3C2410_SDRAM_PA + 0x100)
+       /* Maintainer: Ben Dooks <ben@fluff.org> */
+       .phys_ram       = S3C2410_SDRAM_PA,
+       .phys_io        = S3C2410_PA_UART,
+       .io_pg_offst    = (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc,
+       .boot_params    = S3C2410_SDRAM_PA + 0x100,
 
        .init_irq       = s3c24xx_init_irq,
        .map_io         = smdk2440_map_io,
diff -urN linux/arch/arm/mach-s3c2410/mach-vr1000.c 
linux/arch/arm/mach-s3c2410/mach-vr1000.c
--- linux/arch/arm/mach-s3c2410/mach-vr1000.c   2005/07/11 20:46:03     1.12
+++ linux/arch/arm/mach-s3c2410/mach-vr1000.c   2005/07/12 09:18:58     1.13
@@ -371,16 +371,14 @@
        usb_simtec_init();
 }
 
-void __init vr1000_init_irq(void)
-{
-       s3c24xx_init_irq();
-}
 
 MACHINE_START(VR1000, "Thorcom-VR1000")
-     MAINTAINER("Ben Dooks <ben@simtec.co.uk>")
-     BOOT_MEM(S3C2410_SDRAM_PA, S3C2410_PA_UART, (u32)S3C24XX_VA_UART)
-     BOOT_PARAMS(S3C2410_SDRAM_PA + 0x100)
-     MAPIO(vr1000_map_io)
-     INITIRQ(vr1000_init_irq)
+       /* Maintainer: Ben Dooks <ben@simtec.co.uk> */
+       .phys_ram       = S3C2410_SDRAM_PA,
+       .phys_io        = S3C2410_PA_UART,
+       .io_pg_offst    = (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc,
+       .boot_params    = S3C2410_SDRAM_PA + 0x100,
+       .map_io         = vr1000_map_io,
+       .init_irq       = s3c24xx_init_irq,
        .timer          = &s3c24xx_timer,
 MACHINE_END
diff -urN linux/arch/arm/mach-sa1100/assabet.c 
linux/arch/arm/mach-sa1100/assabet.c
--- linux/arch/arm/mach-sa1100/assabet.c        2005/03/18 17:36:47     1.22
+++ linux/arch/arm/mach-sa1100/assabet.c        2005/07/12 09:18:59     1.23
@@ -431,11 +431,13 @@
 
 
 MACHINE_START(ASSABET, "Intel-Assabet")
-       BOOT_MEM(0xc0000000, 0x80000000, 0xf8000000)
-       BOOT_PARAMS(0xc0000100)
-       FIXUP(fixup_assabet)
-       MAPIO(assabet_map_io)
-       INITIRQ(sa1100_init_irq)
+       .phys_ram       = 0xc0000000,
+       .phys_io        = 0x80000000,
+       .io_pg_offst    = ((0xf8000000) >> 18) & 0xfffc,
+       .boot_params    = 0xc0000100,
+       .fixup          = fixup_assabet,
+       .map_io         = assabet_map_io,
+       .init_irq       = sa1100_init_irq,
        .timer          = &sa1100_timer,
        .init_machine   = assabet_init,
 MACHINE_END
diff -urN linux/arch/arm/mach-sa1100/badge4.c 
linux/arch/arm/mach-sa1100/badge4.c
--- linux/arch/arm/mach-sa1100/badge4.c 2005/02/28 15:45:09     1.18
+++ linux/arch/arm/mach-sa1100/badge4.c 2005/07/12 09:18:59     1.19
@@ -285,9 +285,11 @@
 }
 
 MACHINE_START(BADGE4, "Hewlett-Packard Laboratories BadgePAD 4")
-       BOOT_MEM(0xc0000000, 0x80000000, 0xf8000000)
-       BOOT_PARAMS(0xc0000100)
-       MAPIO(badge4_map_io)
-       INITIRQ(sa1100_init_irq)
+       .phys_ram       = 0xc0000000,
+       .phys_io        = 0x80000000,
+       .io_pg_offst    = ((0xf8000000) >> 18) & 0xfffc,
+       .boot_params    = 0xc0000100,
+       .map_io         = badge4_map_io,
+       .init_irq       = sa1100_init_irq,
        .timer          = &sa1100_timer,
 MACHINE_END
diff -urN linux/arch/arm/mach-sa1100/cerf.c linux/arch/arm/mach-sa1100/cerf.c
--- linux/arch/arm/mach-sa1100/cerf.c   2004/11/15 11:49:15     1.11
+++ linux/arch/arm/mach-sa1100/cerf.c   2005/07/12 09:18:59     1.12
@@ -123,10 +123,12 @@
 }
 
 MACHINE_START(CERF, "Intrinsyc CerfBoard/CerfCube")
-       MAINTAINER("support@intrinsyc.com")
-       BOOT_MEM(0xc0000000, 0x80000000, 0xf8000000)
-       MAPIO(cerf_map_io)
-       INITIRQ(cerf_init_irq)
+       /* Maintainer: support@intrinsyc.com */
+       .phys_ram       = 0xc0000000,
+       .phys_io        = 0x80000000,
+       .io_pg_offst    = ((0xf8000000) >> 18) & 0xfffc,
+       .map_io         = cerf_map_io,
+       .init_irq       = cerf_init_irq,
        .timer          = &sa1100_timer,
        .init_machine   = cerf_init,
 MACHINE_END
diff -urN linux/arch/arm/mach-sa1100/collie.c 
linux/arch/arm/mach-sa1100/collie.c
--- linux/arch/arm/mach-sa1100/collie.c 2005/04/08 18:57:52     1.8
+++ linux/arch/arm/mach-sa1100/collie.c 2005/07/12 09:18:59     1.9
@@ -184,9 +184,11 @@
 }
 
 MACHINE_START(COLLIE, "Sharp-Collie")
-       BOOT_MEM(0xc0000000, 0x80000000, 0xf8000000)
-       MAPIO(collie_map_io)
-       INITIRQ(sa1100_init_irq)
+       .phys_ram       = 0xc0000000,
+       .phys_io        = 0x80000000,
+       .io_pg_offst    = ((0xf8000000) >> 18) & 0xfffc,
+       .map_io         = collie_map_io,
+       .init_irq       = sa1100_init_irq,
        .timer          = &sa1100_timer,
        .init_machine   = collie_init,
 MACHINE_END
diff -urN linux/arch/arm/mach-sa1100/cpu-sa1110.c 
linux/arch/arm/mach-sa1100/cpu-sa1110.c
--- linux/arch/arm/mach-sa1100/cpu-sa1110.c     2004/09/19 12:30:02     1.22
+++ linux/arch/arm/mach-sa1100/cpu-sa1110.c     2005/07/12 09:18:59     1.23
@@ -271,8 +271,7 @@
         */
        sdram_set_refresh(2);
        if (!irqs_disabled()) {
-               set_current_state(TASK_UNINTERRUPTIBLE);
-               schedule_timeout(20 * HZ / 1000);
+               msleep(20);
        } else {
                mdelay(20);
        }
diff -urN linux/arch/arm/mach-sa1100/h3600.c linux/arch/arm/mach-sa1100/h3600.c
--- linux/arch/arm/mach-sa1100/h3600.c  2005/07/11 20:46:03     1.19
+++ linux/arch/arm/mach-sa1100/h3600.c  2005/07/12 09:18:59     1.20
@@ -380,10 +380,12 @@
 }
 
 MACHINE_START(H3100, "Compaq iPAQ H3100")
-       BOOT_MEM(0xc0000000, 0x80000000, 0xf8000000)
-       BOOT_PARAMS(0xc0000100)
-       MAPIO(h3100_map_io)
-       INITIRQ(sa1100_init_irq)
+       .phys_ram       = 0xc0000000,
+       .phys_io        = 0x80000000,
+       .io_pg_offst    = ((0xf8000000) >> 18) & 0xfffc,
+       .boot_params    = 0xc0000100,
+       .map_io         = h3100_map_io,
+       .init_irq       = sa1100_init_irq,
        .timer          = &sa1100_timer,
        .init_machine   = h3xxx_mach_init,
 MACHINE_END
@@ -496,10 +498,12 @@
 }
 
 MACHINE_START(H3600, "Compaq iPAQ H3600")
-       BOOT_MEM(0xc0000000, 0x80000000, 0xf8000000)
-       BOOT_PARAMS(0xc0000100)
-       MAPIO(h3600_map_io)
-       INITIRQ(sa1100_init_irq)
+       .phys_ram       = 0xc0000000,
+       .phys_io        = 0x80000000,
+       .io_pg_offst    = ((0xf8000000) >> 18) & 0xfffc,
+       .boot_params    = 0xc0000100,
+       .map_io         = h3600_map_io,
+       .init_irq       = sa1100_init_irq,
        .timer          = &sa1100_timer,
        .init_machine   = h3xxx_mach_init,
 MACHINE_END
@@ -881,10 +885,12 @@
 }
 
 MACHINE_START(H3800, "Compaq iPAQ H3800")
-       BOOT_MEM(0xc0000000, 0x80000000, 0xf8000000)
-       BOOT_PARAMS(0xc0000100)
-       MAPIO(h3800_map_io)
-       INITIRQ(h3800_init_irq)
+       .phys_ram       = 0xc0000000,
+       .phys_io        = 0x80000000,
+       .io_pg_offst    = ((0xf8000000) >> 18) & 0xfffc,
+       .boot_params    = 0xc0000100,
+       .map_io         = h3800_map_io,
+       .init_irq       = h3800_init_irq,
        .timer          = &sa1100_timer,
        .init_machine   = h3xxx_mach_init,
 MACHINE_END
diff -urN linux/arch/arm/mach-sa1100/hackkit.c 
linux/arch/arm/mach-sa1100/hackkit.c
--- linux/arch/arm/mach-sa1100/hackkit.c        2004/11/15 11:49:15     1.6
+++ linux/arch/arm/mach-sa1100/hackkit.c        2005/07/12 09:18:59     1.7
@@ -191,10 +191,12 @@
  */
 
 MACHINE_START(HACKKIT, "HackKit Cpu Board")
-       BOOT_MEM(0xc0000000, 0x80000000, 0xf8000000)
-       BOOT_PARAMS(0xc0000100)
-       MAPIO(hackkit_map_io)
-       INITIRQ(sa1100_init_irq)
+       .phys_ram       = 0xc0000000,
+       .phys_io        = 0x80000000,
+       .io_pg_offst    = ((0xf8000000) >> 18) & 0xfffc,
+       .boot_params    = 0xc0000100,
+       .map_io         = hackkit_map_io,
+       .init_irq       = sa1100_init_irq,
        .timer          = &sa1100_timer,
        .init_machine   = hackkit_init,
 MACHINE_END
diff -urN linux/arch/arm/mach-sa1100/jornada720.c 
linux/arch/arm/mach-sa1100/jornada720.c
--- linux/arch/arm/mach-sa1100/jornada720.c     2004/10/25 20:44:11     1.14
+++ linux/arch/arm/mach-sa1100/jornada720.c     2005/07/12 09:18:59     1.15
@@ -97,9 +97,11 @@
 }
 
 MACHINE_START(JORNADA720, "HP Jornada 720")
-       BOOT_MEM(0xc0000000, 0x80000000, 0xf8000000)
-       BOOT_PARAMS(0xc0000100)
-       MAPIO(jornada720_map_io)
-       INITIRQ(sa1100_init_irq)
+       .phys_ram       = 0xc0000000,
+       .phys_io        = 0x80000000,
+       .io_pg_offst    = ((0xf8000000) >> 18) & 0xfffc,
+       .boot_params    = 0xc0000100,
+       .map_io         = jornada720_map_io,
+       .init_irq       = sa1100_init_irq,
        .timer          = &sa1100_timer,
 MACHINE_END
diff -urN linux/arch/arm/mach-sa1100/lart.c linux/arch/arm/mach-sa1100/lart.c
--- linux/arch/arm/mach-sa1100/lart.c   2004/12/27 02:15:48     1.8
+++ linux/arch/arm/mach-sa1100/lart.c   2005/07/12 09:18:59     1.9
@@ -41,9 +41,11 @@
 }
 
 MACHINE_START(LART, "LART")
-       BOOT_MEM(0xc0000000, 0x80000000, 0xf8000000)
-       BOOT_PARAMS(0xc0000100)
-       MAPIO(lart_map_io)
-       INITIRQ(sa1100_init_irq)
+       .phys_ram       = 0xc0000000,
+       .phys_io        = 0x80000000,
+       .io_pg_offst    = ((0xf8000000) >> 18) & 0xfffc,
+       .boot_params    = 0xc0000100,
+       .map_io         = lart_map_io,
+       .init_irq       = sa1100_init_irq,
        .timer          = &sa1100_timer,
 MACHINE_END
diff -urN linux/arch/arm/mach-sa1100/pleb.c linux/arch/arm/mach-sa1100/pleb.c
--- linux/arch/arm/mach-sa1100/pleb.c   2004/12/04 18:15:58     1.9
+++ linux/arch/arm/mach-sa1100/pleb.c   2005/07/12 09:18:59     1.10
@@ -146,9 +146,11 @@
 }
 
 MACHINE_START(PLEB, "PLEB")
-       BOOT_MEM(0xc0000000, 0x80000000, 0xf8000000)
-       MAPIO(pleb_map_io)
-       INITIRQ(sa1100_init_irq)
+       .phys_ram       = 0xc0000000,
+       .phys_io        = 0x80000000,
+       .io_pg_offst    = ((0xf8000000) >> 18) & 0xfffc,
+       .map_io         = pleb_map_io,
+       .init_irq       = sa1100_init_irq,
        .timer          = &sa1100_timer,
        .init_machine   = pleb_init,
 MACHINE_END
diff -urN linux/arch/arm/mach-sa1100/shannon.c 
linux/arch/arm/mach-sa1100/shannon.c
--- linux/arch/arm/mach-sa1100/shannon.c        2005/02/28 15:45:09     1.7
+++ linux/arch/arm/mach-sa1100/shannon.c        2005/07/12 09:18:59     1.8
@@ -76,10 +76,12 @@
 }
 
 MACHINE_START(SHANNON, "Shannon (AKA: Tuxscreen)")
-       BOOT_MEM(0xc0000000, 0x80000000, 0xf8000000)
-       BOOT_PARAMS(0xc0000100)
-       MAPIO(shannon_map_io)
-       INITIRQ(sa1100_init_irq)
+       .phys_ram       = 0xc0000000,
+       .phys_io        = 0x80000000,
+       .io_pg_offst    = ((0xf8000000) >> 18) & 0xfffc,
+       .boot_params    = 0xc0000100,
+       .map_io         = shannon_map_io,
+       .init_irq       = sa1100_init_irq,
        .timer          = &sa1100_timer,
        .init_machine   = shannon_init,
 MACHINE_END
diff -urN linux/arch/arm/mach-sa1100/simpad.c 
linux/arch/arm/mach-sa1100/simpad.c
--- linux/arch/arm/mach-sa1100/simpad.c 2004/12/27 02:15:48     1.14
+++ linux/arch/arm/mach-sa1100/simpad.c 2005/07/12 09:18:59     1.15
@@ -215,10 +215,12 @@
 
 
 MACHINE_START(SIMPAD, "Simpad")
-       MAINTAINER("Holger Freyther")
-       BOOT_MEM(0xc0000000, 0x80000000, 0xf8000000)
-        BOOT_PARAMS(0xc0000100)
-       MAPIO(simpad_map_io)
-       INITIRQ(sa1100_init_irq)
+       /* Maintainer: Holger Freyther */
+       .phys_ram       = 0xc0000000,
+       .phys_io        = 0x80000000,
+       .io_pg_offst    = ((0xf8000000) >> 18) & 0xfffc,
+       .boot_params    = 0xc0000100,
+       .map_io         = simpad_map_io,
+       .init_irq       = sa1100_init_irq,
        .timer          = &sa1100_timer,
 MACHINE_END
diff -urN linux/arch/arm/mach-shark/core.c linux/arch/arm/mach-shark/core.c
--- linux/arch/arm/mach-shark/core.c    2005/07/11 20:46:03     1.7
+++ linux/arch/arm/mach-shark/core.c    2005/07/12 09:18:59     1.8
@@ -105,10 +105,12 @@
 };
 
 MACHINE_START(SHARK, "Shark")
-       MAINTAINER("Alexander Schulz")
-       BOOT_MEM(0x08000000, 0x40000000, 0xe0000000)
-       BOOT_PARAMS(0x08003000)
-       MAPIO(shark_map_io)
-       INITIRQ(shark_init_irq)
+       /* Maintainer: Alexander Schulz */
+       .phys_ram       = 0x08000000,
+       .phys_io        = 0x40000000,
+       .io_pg_offst    = ((0xe0000000) >> 18) & 0xfffc,
+       .boot_params    = 0x08003000,
+       .map_io         = shark_map_io,
+       .init_irq       = shark_init_irq,
        .timer          = &shark_timer,
 MACHINE_END
diff -urN linux/arch/arm/mach-versatile/core.c 
linux/arch/arm/mach-versatile/core.c
--- linux/arch/arm/mach-versatile/core.c        2005/07/11 20:46:04     1.12
+++ linux/arch/arm/mach-versatile/core.c        2005/07/12 09:19:00     1.13
@@ -33,6 +33,7 @@
 #include <asm/mach-types.h>
 #include <asm/hardware/amba.h>
 #include <asm/hardware/amba_clcd.h>
+#include <asm/hardware/arm_timer.h>
 #include <asm/hardware/icst307.h>
 
 #include <asm/mach/arch.h>
@@ -788,38 +789,25 @@
  */
 #define TIMER_INTERVAL (TICKS_PER_uSEC * mSEC_10)
 #if TIMER_INTERVAL >= 0x100000
-#define TIMER_RELOAD   (TIMER_INTERVAL >> 8)           /* Divide by 256 */
-#define TIMER_CTRL     0x88                            /* Enable, Clock / 256 
*/
+#define TIMER_RELOAD   (TIMER_INTERVAL >> 8)
+#define TIMER_DIVISOR  (TIMER_CTRL_DIV256)
 #define TICKS2USECS(x) (256 * (x) / TICKS_PER_uSEC)
 #elif TIMER_INTERVAL >= 0x10000
 #define TIMER_RELOAD   (TIMER_INTERVAL >> 4)           /* Divide by 16 */
-#define TIMER_CTRL     0x84                            /* Enable, Clock / 16 */
+#define TIMER_DIVISOR  (TIMER_CTRL_DIV16)
 #define TICKS2USECS(x) (16 * (x) / TICKS_PER_uSEC)
 #else
 #define TIMER_RELOAD   (TIMER_INTERVAL)
-#define TIMER_CTRL     0x80                            /* Enable */
+#define TIMER_DIVISOR  (TIMER_CTRL_DIV1)
 #define TICKS2USECS(x) ((x) / TICKS_PER_uSEC)
 #endif
 
-#define TIMER_CTRL_IE  (1 << 5)        /* Interrupt Enable */
-
-/*
- * What does it look like?
- */
-typedef struct TimerStruct {
-       unsigned long TimerLoad;
-       unsigned long TimerValue;
-       unsigned long TimerControl;
-       unsigned long TimerClear;
-} TimerStruct_t;
-
 /*
  * Returns number of ms since last clock interrupt.  Note that interrupts
  * will have been disabled by do_gettimeoffset()
  */
 static unsigned long versatile_gettimeoffset(void)
 {
-       volatile TimerStruct_t *timer0 = (TimerStruct_t *)TIMER0_VA_BASE;
        unsigned long ticks1, ticks2, status;
 
        /*
@@ -828,11 +816,11 @@
         * an interrupt.  We get around this by ensuring that the
         * counter has not reloaded between our two reads.
         */
-       ticks2 = timer0->TimerValue & 0xffff;
+       ticks2 = readl(TIMER0_VA_BASE + TIMER_VALUE) & 0xffff;
        do {
                ticks1 = ticks2;
                status = __raw_readl(VA_IC_BASE + VIC_IRQ_RAW_STATUS);
-               ticks2 = timer0->TimerValue & 0xffff;
+               ticks2 = readl(TIMER0_VA_BASE + TIMER_VALUE) & 0xffff;
        } while (ticks2 > ticks1);
 
        /*
@@ -859,12 +847,10 @@
  */
 static irqreturn_t versatile_timer_interrupt(int irq, void *dev_id, struct 
pt_regs *regs)
 {
-       volatile TimerStruct_t *timer0 = (volatile TimerStruct_t 
*)TIMER0_VA_BASE;
-
        write_seqlock(&xtime_lock);
 
        // ...clear the interrupt
-       timer0->TimerClear = 1;
+       writel(1, TIMER0_VA_BASE + TIMER_INTCLR);
 
        timer_tick(regs);
 
@@ -884,31 +870,32 @@
  */
 static void __init versatile_timer_init(void)
 {
-       volatile TimerStruct_t *timer0 = (volatile TimerStruct_t 
*)TIMER0_VA_BASE;
-       volatile TimerStruct_t *timer1 = (volatile TimerStruct_t 
*)TIMER1_VA_BASE;
-       volatile TimerStruct_t *timer2 = (volatile TimerStruct_t 
*)TIMER2_VA_BASE;
-       volatile TimerStruct_t *timer3 = (volatile TimerStruct_t 
*)TIMER3_VA_BASE;
+       u32 val;
 
        /* 
         * set clock frequency: 
         *      VERSATILE_REFCLK is 32KHz
         *      VERSATILE_TIMCLK is 1MHz
         */
-       *(volatile unsigned int *)IO_ADDRESS(VERSATILE_SCTL_BASE) |= 
-         ((VERSATILE_TIMCLK << VERSATILE_TIMER1_EnSel) | (VERSATILE_TIMCLK << 
VERSATILE_TIMER2_EnSel) | 
-          (VERSATILE_TIMCLK << VERSATILE_TIMER3_EnSel) | (VERSATILE_TIMCLK << 
VERSATILE_TIMER4_EnSel));
+       val = readl(IO_ADDRESS(VERSATILE_SCTL_BASE));
+       writel((VERSATILE_TIMCLK << VERSATILE_TIMER1_EnSel) |
+              (VERSATILE_TIMCLK << VERSATILE_TIMER2_EnSel) | 
+              (VERSATILE_TIMCLK << VERSATILE_TIMER3_EnSel) |
+              (VERSATILE_TIMCLK << VERSATILE_TIMER4_EnSel) | val,
+              IO_ADDRESS(VERSATILE_SCTL_BASE));
 
        /*
         * Initialise to a known state (all timers off)
         */
-       timer0->TimerControl = 0;
-       timer1->TimerControl = 0;
-       timer2->TimerControl = 0;
-       timer3->TimerControl = 0;
-
-       timer0->TimerLoad    = TIMER_RELOAD;
-       timer0->TimerValue   = TIMER_RELOAD;
-       timer0->TimerControl = TIMER_CTRL | 0x40 | TIMER_CTRL_IE;  /* periodic 
+ IE */
+       writel(0, TIMER0_VA_BASE + TIMER_CTRL);
+       writel(0, TIMER1_VA_BASE + TIMER_CTRL);
+       writel(0, TIMER2_VA_BASE + TIMER_CTRL);
+       writel(0, TIMER3_VA_BASE + TIMER_CTRL);
+
+       writel(TIMER_RELOAD, TIMER0_VA_BASE + TIMER_LOAD);
+       writel(TIMER_RELOAD, TIMER0_VA_BASE + TIMER_VALUE);
+       writel(TIMER_DIVISOR | TIMER_CTRL_ENABLE | TIMER_CTRL_PERIODIC |
+              TIMER_CTRL_IE, TIMER0_VA_BASE + TIMER_CTRL);
 
        /* 
         * Make irqs happen for the system timer
diff -urN linux/arch/arm/mach-versatile/versatile_ab.c 
linux/arch/arm/mach-versatile/versatile_ab.c
--- linux/arch/arm/mach-versatile/versatile_ab.c        2004/11/15 11:49:15     
1.1
+++ linux/arch/arm/mach-versatile/versatile_ab.c        2005/07/12 09:19:00     
1.2
@@ -35,11 +35,13 @@
 #include "core.h"
 
 MACHINE_START(VERSATILE_AB, "ARM-Versatile AB")
-       MAINTAINER("ARM Ltd/Deep Blue Solutions Ltd")
-       BOOT_MEM(0x00000000, 0x101f1000, 0xf11f1000)
-       BOOT_PARAMS(0x00000100)
-       MAPIO(versatile_map_io)
-       INITIRQ(versatile_init_irq)
+       /* Maintainer: ARM Ltd/Deep Blue Solutions Ltd */
+       .phys_ram       = 0x00000000,
+       .phys_io        = 0x101f1000,
+       .io_pg_offst    = ((0xf11f1000) >> 18) & 0xfffc,
+       .boot_params    = 0x00000100,
+       .map_io         = versatile_map_io,
+       .init_irq       = versatile_init_irq,
        .timer          = &versatile_timer,
-       INIT_MACHINE(versatile_init)
+       .init_machine   = versatile_init,
 MACHINE_END
diff -urN linux/arch/arm/mach-versatile/versatile_pb.c 
linux/arch/arm/mach-versatile/versatile_pb.c
--- linux/arch/arm/mach-versatile/versatile_pb.c        2004/11/15 11:49:15     
1.1
+++ linux/arch/arm/mach-versatile/versatile_pb.c        2005/07/12 09:19:00     
1.2
@@ -99,11 +99,13 @@
 arch_initcall(versatile_pb_init);
 
 MACHINE_START(VERSATILE_PB, "ARM-Versatile PB")
-       MAINTAINER("ARM Ltd/Deep Blue Solutions Ltd")
-       BOOT_MEM(0x00000000, 0x101f1000, 0xf11f1000)
-       BOOT_PARAMS(0x00000100)
-       MAPIO(versatile_map_io)
-       INITIRQ(versatile_init_irq)
+       /* Maintainer: ARM Ltd/Deep Blue Solutions Ltd */
+       .phys_ram       = 0x00000000,
+       .phys_io        = 0x101f1000,
+       .io_pg_offst    = ((0xf11f1000) >> 18) & 0xfffc,
+       .boot_params    = 0x00000100,
+       .map_io         = versatile_map_io,
+       .init_irq       = versatile_init_irq,
        .timer          = &versatile_timer,
-       INIT_MACHINE(versatile_init)
+       .init_machine   = versatile_init,
 MACHINE_END
diff -urN linux/arch/arm/mm/blockops.c linux/arch/arm/mm/blockops.c
--- linux/arch/arm/mm/blockops.c        2004/08/13 07:18:51     1.3
+++ linux/arch/arm/mm/blockops.c        2005/07/12 09:19:00     1.4
@@ -25,13 +25,14 @@
 {
        asm(
        "add    r1, r0, %0                                                      
\n\
+       sub     r1, r1, %1                                                      
\n\
 1:     .word   0xec401f0e      @ mcrr  p15, 0, r0, r1, c14, 0  @ blocking      
\n\
        mov     r0, #0                                                          
\n\
        mcr     p15, 0, r0, c7, c5, 0                                           
\n\
        mcr     p15, 0, r0, c7, c10, 4                                          
\n\
        mov     pc, lr"
        :
-       : "I" (PAGE_SIZE));
+       : "I" (PAGE_SIZE), "I" (L1_CACHE_BYTES));
 }
 
 /*
diff -urN linux/arch/arm/mm/fault.c linux/arch/arm/mm/fault.c
--- linux/arch/arm/mm/fault.c   2005/04/29 11:15:00     1.5
+++ linux/arch/arm/mm/fault.c   2005/07/12 09:19:00     1.6
@@ -372,49 +372,50 @@
 static struct fsr_info {
        int     (*fn)(unsigned long addr, unsigned int fsr, struct pt_regs 
*regs);
        int     sig;
+       int     code;
        const char *name;
 } fsr_info[] = {
        /*
         * The following are the standard ARMv3 and ARMv4 aborts.  ARMv5
         * defines these to be "precise" aborts.
         */
-       { do_bad,               SIGSEGV, "vector exception"                },
-       { do_bad,               SIGILL,  "alignment exception"             },
-       { do_bad,               SIGKILL, "terminal exception"              },
-       { do_bad,               SIGILL,  "alignment exception"             },
-       { do_bad,               SIGBUS,  "external abort on linefetch"     },
-       { do_translation_fault, SIGSEGV, "section translation fault"       },
-       { do_bad,               SIGBUS,  "external abort on linefetch"     },
-       { do_page_fault,        SIGSEGV, "page translation fault"          },
-       { do_bad,               SIGBUS,  "external abort on non-linefetch" },
-       { do_bad,               SIGSEGV, "section domain fault"            },
-       { do_bad,               SIGBUS,  "external abort on non-linefetch" },
-       { do_bad,               SIGSEGV, "page domain fault"               },
-       { do_bad,               SIGBUS,  "external abort on translation"   },
-       { do_sect_fault,        SIGSEGV, "section permission fault"        },
-       { do_bad,               SIGBUS,  "external abort on translation"   },
-       { do_page_fault,        SIGSEGV, "page permission fault"           },
+       { do_bad,               SIGSEGV, 0,             "vector exception"      
           },
+       { do_bad,               SIGILL,  BUS_ADRALN,    "alignment exception"   
           },
+       { do_bad,               SIGKILL, 0,             "terminal exception"    
           },
+       { do_bad,               SIGILL,  BUS_ADRALN,    "alignment exception"   
           },
+       { do_bad,               SIGBUS,  0,             "external abort on 
linefetch"      },
+       { do_translation_fault, SIGSEGV, SEGV_MAPERR,   "section translation 
fault"        },
+       { do_bad,               SIGBUS,  0,             "external abort on 
linefetch"      },
+       { do_page_fault,        SIGSEGV, SEGV_MAPERR,   "page translation 
fault"           },
+       { do_bad,               SIGBUS,  0,             "external abort on 
non-linefetch"  },
+       { do_bad,               SIGSEGV, SEGV_ACCERR,   "section domain fault"  
           },
+       { do_bad,               SIGBUS,  0,             "external abort on 
non-linefetch"  },
+       { do_bad,               SIGSEGV, SEGV_ACCERR,   "page domain fault"     
           },
+       { do_bad,               SIGBUS,  0,             "external abort on 
translation"    },
+       { do_sect_fault,        SIGSEGV, SEGV_ACCERR,   "section permission 
fault"         },
+       { do_bad,               SIGBUS,  0,             "external abort on 
translation"    },
+       { do_page_fault,        SIGSEGV, SEGV_ACCERR,   "page permission fault" 
           },
        /*
         * The following are "imprecise" aborts, which are signalled by bit
         * 10 of the FSR, and may not be recoverable.  These are only
         * supported if the CPU abort handler supports bit 10.
         */
-       { do_bad,               SIGBUS,  "unknown 16"                      },
-       { do_bad,               SIGBUS,  "unknown 17"                      },
-       { do_bad,               SIGBUS,  "unknown 18"                      },
-       { do_bad,               SIGBUS,  "unknown 19"                      },
-       { do_bad,               SIGBUS,  "lock abort"                      }, 
/* xscale */
-       { do_bad,               SIGBUS,  "unknown 21"                      },
-       { do_bad,               SIGBUS,  "imprecise external abort"        }, 
/* xscale */
-       { do_bad,               SIGBUS,  "unknown 23"                      },
-       { do_bad,               SIGBUS,  "dcache parity error"             }, 
/* xscale */
-       { do_bad,               SIGBUS,  "unknown 25"                      },
-       { do_bad,               SIGBUS,  "unknown 26"                      },
-       { do_bad,               SIGBUS,  "unknown 27"                      },
-       { do_bad,               SIGBUS,  "unknown 28"                      },
-       { do_bad,               SIGBUS,  "unknown 29"                      },
-       { do_bad,               SIGBUS,  "unknown 30"                      },
-       { do_bad,               SIGBUS,  "unknown 31"                      }
+       { do_bad,               SIGBUS,  0,             "unknown 16"            
           },
+       { do_bad,               SIGBUS,  0,             "unknown 17"            
           },
+       { do_bad,               SIGBUS,  0,             "unknown 18"            
           },
+       { do_bad,               SIGBUS,  0,             "unknown 19"            
           },
+       { do_bad,               SIGBUS,  0,             "lock abort"            
           }, /* xscale */
+       { do_bad,               SIGBUS,  0,             "unknown 21"            
           },
+       { do_bad,               SIGBUS,  BUS_OBJERR,    "imprecise external 
abort"         }, /* xscale */
+       { do_bad,               SIGBUS,  0,             "unknown 23"            
           },
+       { do_bad,               SIGBUS,  0,             "dcache parity error"   
           }, /* xscale */
+       { do_bad,               SIGBUS,  0,             "unknown 25"            
           },
+       { do_bad,               SIGBUS,  0,             "unknown 26"            
           },
+       { do_bad,               SIGBUS,  0,             "unknown 27"            
           },
+       { do_bad,               SIGBUS,  0,             "unknown 28"            
           },
+       { do_bad,               SIGBUS,  0,             "unknown 29"            
           },
+       { do_bad,               SIGBUS,  0,             "unknown 30"            
           },
+       { do_bad,               SIGBUS,  0,             "unknown 31"            
           }
 };
 
 void __init
@@ -435,15 +436,19 @@
 do_DataAbort(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
 {
        const struct fsr_info *inf = fsr_info + (fsr & 15) + ((fsr & (1 << 10)) 
>> 6);
+       struct siginfo info;
 
        if (!inf->fn(addr, fsr, regs))
                return;
 
        printk(KERN_ALERT "Unhandled fault: %s (0x%03x) at 0x%08lx\n",
                inf->name, fsr, addr);
-       force_sig(inf->sig, current);
-       show_pte(current->mm, addr);
-       die_if_kernel("Oops", regs, 0);
+
+       info.si_signo = inf->sig;
+       info.si_errno = 0;
+       info.si_code  = inf->code;
+       info.si_addr  = (void __user *)addr;
+       notify_die("", regs, &info, fsr, 0);
 }
 
 asmlinkage void
diff -urN linux/arch/arm/mm/init.c linux/arch/arm/mm/init.c
--- linux/arch/arm/mm/init.c    2005/07/11 20:46:04     1.58
+++ linux/arch/arm/mm/init.c    2005/07/12 09:19:00     1.59
@@ -437,7 +437,7 @@
        memtable_init(mi);
        if (mdesc->map_io)
                mdesc->map_io();
-       flush_tlb_all();
+       local_flush_tlb_all();
 
        /*
         * initialise the zones within each node
diff -urN linux/arch/arm/mm/mm-armv.c linux/arch/arm/mm/mm-armv.c
--- linux/arch/arm/mm/mm-armv.c 2005/07/11 20:46:04     1.49
+++ linux/arch/arm/mm/mm-armv.c 2005/07/12 09:19:00     1.50
@@ -682,7 +682,7 @@
        }
 
        flush_cache_all();
-       flush_tlb_all();
+       local_flush_tlb_all();
 
        top_pmd = pmd_off_k(0xffff0000);
 }
diff -urN linux/arch/arm/mm/proc-arm1020.S linux/arch/arm/mm/proc-arm1020.S
--- linux/arch/arm/mm/proc-arm1020.S    2005/01/13 14:05:19     1.15
+++ linux/arch/arm/mm/proc-arm1020.S    2005/07/12 09:19:00     1.16
@@ -445,14 +445,14 @@
        /*
         *  R
         * .RVI ZFRS BLDP WCAM
-        * .0.1 1001 ..11 0101  /* FIXME: why no V bit? */
+        * .011 1001 ..11 0101
         */
        .type   arm1020_cr1_clear, #object
        .type   arm1020_cr1_set, #object
 arm1020_cr1_clear:
        .word   0x593f
 arm1020_cr1_set:
-       .word   0x1935
+       .word   0x3935
 
        __INITDATA
 
diff -urN linux/arch/arm/mm/proc-arm1020e.S linux/arch/arm/mm/proc-arm1020e.S
--- linux/arch/arm/mm/proc-arm1020e.S   2005/01/13 14:05:19     1.3
+++ linux/arch/arm/mm/proc-arm1020e.S   2005/07/12 09:19:00     1.4
@@ -427,14 +427,14 @@
        /*
         *  R
         * .RVI ZFRS BLDP WCAM
-        * .0.1 1001 ..11 0101  /* FIXME: why no V bit? */
+        * .011 1001 ..11 0101
         */
        .type   arm1020e_cr1_clear, #object
        .type   arm1020e_cr1_set, #object
 arm1020e_cr1_clear:
        .word   0x5f3f
 arm1020e_cr1_set:
-       .word   0x1935
+       .word   0x3935
 
        __INITDATA
 
diff -urN linux/arch/arm/vfp/vfp.h linux/arch/arm/vfp/vfp.h
--- linux/arch/arm/vfp/vfp.h    2004/12/04 18:15:58     1.3
+++ linux/arch/arm/vfp/vfp.h    2005/07/12 09:19:00     1.4
@@ -117,7 +117,13 @@
        if (nh >= m)
                return ~0ULL;
        mh = m >> 32;
-       z = (mh << 32 <= nh) ? 0xffffffff00000000ULL : (nh / mh) << 32;
+       if (mh << 32 <= nh) {
+               z = 0xffffffff00000000ULL;
+       } else {
+               z = nh;
+               do_div(z, mh);
+               z <<= 32;
+       }
        mul64to128(&termh, &terml, m, z);
        sub128(&remh, &reml, nh, nl, termh, terml);
        ml = m << 32;
@@ -126,7 +132,12 @@
                add128(&remh, &reml, remh, reml, mh, ml);
        }
        remh = (remh << 32) | (reml >> 32);
-       z |= (mh << 32 <= remh) ? 0xffffffff : remh / mh;
+       if (mh << 32 <= remh) {
+               z |= 0xffffffff;
+       } else {
+               do_div(remh, mh);
+               z |= remh;
+       }
        return z;
 }
 
diff -urN linux/arch/arm/vfp/vfpdouble.c linux/arch/arm/vfp/vfpdouble.c
--- linux/arch/arm/vfp/vfpdouble.c      2004/12/04 18:15:58     1.4
+++ linux/arch/arm/vfp/vfpdouble.c      2005/07/12 09:19:00     1.5
@@ -32,6 +32,8 @@
  */
 #include <linux/kernel.h>
 #include <linux/bitops.h>
+
+#include <asm/div64.h>
 #include <asm/ptrace.h>
 #include <asm/vfp.h>
 
diff -urN linux/arch/arm/vfp/vfpmodule.c linux/arch/arm/vfp/vfpmodule.c
--- linux/arch/arm/vfp/vfpmodule.c      2004/06/26 15:15:08     1.1
+++ linux/arch/arm/vfp/vfpmodule.c      2005/07/12 09:19:00     1.2
@@ -89,7 +89,7 @@
        current->thread.error_code = 0;
        current->thread.trap_no = 6;
 
-       force_sig_info(SIGFPE, &info, current);
+       send_sig_info(SIGFPE, &info, current);
 }
 
 static void vfp_panic(char *reason)
diff -urN linux/arch/arm/vfp/vfpsingle.c linux/arch/arm/vfp/vfpsingle.c
--- linux/arch/arm/vfp/vfpsingle.c      2004/12/04 18:15:58     1.3
+++ linux/arch/arm/vfp/vfpsingle.c      2005/07/12 09:19:00     1.4
@@ -32,6 +32,8 @@
  */
 #include <linux/kernel.h>
 #include <linux/bitops.h>
+
+#include <asm/div64.h>
 #include <asm/ptrace.h>
 #include <asm/vfp.h>
 
@@ -303,7 +305,11 @@
                if (z <= a)
                        return (s32)a >> 1;
        }
-       return (u32)(((u64)a << 31) / z) + (z >> 1);
+       {
+               u64 v = (u64)a << 31;
+               do_div(v, z);
+               return v + (z >> 1);
+       }
 }
 
 static u32 vfp_single_fsqrt(int sd, int unused, s32 m, u32 fpscr)
@@ -1107,7 +1113,11 @@
                vsn.significand >>= 1;
                vsd.exponent++;
        }
-       vsd.significand = ((u64)vsn.significand << 32) / vsm.significand;
+       {
+               u64 significand = (u64)vsn.significand << 32;
+               do_div(significand, vsm.significand);
+               vsd.significand = significand;
+       }
        if ((vsd.significand & 0x3f) == 0)
                vsd.significand |= ((u64)vsm.significand * vsd.significand != 
(u64)vsn.significand << 32);
 
diff -urN linux/arch/i386/kernel/apic.c linux/arch/i386/kernel/apic.c
--- linux/arch/i386/kernel/apic.c       2005/07/11 20:46:07     1.66
+++ linux/arch/i386/kernel/apic.c       2005/07/12 09:19:00     1.67
@@ -35,6 +35,7 @@
 #include <asm/desc.h>
 #include <asm/arch_hooks.h>
 #include <asm/hpet.h>
+#include <asm/i8253.h>
 
 #include <mach_apic.h>
 
@@ -879,7 +880,6 @@
  */
 static unsigned int __devinit get_8254_timer_count(void)
 {
-       extern spinlock_t i8253_lock;
        unsigned long flags;
 
        unsigned int count;
diff -urN linux/arch/i386/kernel/apm.c linux/arch/i386/kernel/apm.c
--- linux/arch/i386/kernel/apm.c        2005/07/11 20:46:07     1.78
+++ linux/arch/i386/kernel/apm.c        2005/07/12 09:19:00     1.79
@@ -228,10 +228,10 @@
 #include <asm/system.h>
 #include <asm/uaccess.h>
 #include <asm/desc.h>
+#include <asm/i8253.h>
 
 #include "io_ports.h"
 
-extern spinlock_t i8253_lock;
 extern unsigned long get_cmos_time(void);
 extern void machine_real_restart(unsigned char *, int);
 
@@ -1168,8 +1168,7 @@
 static void reinit_timer(void)
 {
 #ifdef INIT_TIMER_AFTER_SUSPEND
-       unsigned long   flags;
-       extern spinlock_t i8253_lock;
+       unsigned long flags;
 
        spin_lock_irqsave(&i8253_lock, flags);
        /* set the clock to 100 Hz */
diff -urN linux/arch/i386/kernel/io_apic.c linux/arch/i386/kernel/io_apic.c
--- linux/arch/i386/kernel/io_apic.c    2005/07/11 20:46:08     1.91
+++ linux/arch/i386/kernel/io_apic.c    2005/07/12 09:19:00     1.92
@@ -37,6 +37,7 @@
 #include <asm/smp.h>
 #include <asm/desc.h>
 #include <asm/timer.h>
+#include <asm/i8259.h>
 
 #include <mach_apic.h>
 
@@ -1566,7 +1567,6 @@
 
 void /*__init*/ print_PIC(void)
 {
-       extern spinlock_t i8259A_lock;
        unsigned int v;
        unsigned long flags;
 
diff -urN linux/arch/i386/kernel/kprobes.c linux/arch/i386/kernel/kprobes.c
--- linux/arch/i386/kernel/kprobes.c    2005/07/11 20:46:08     1.9
+++ linux/arch/i386/kernel/kprobes.c    2005/07/12 09:19:00     1.10
@@ -537,7 +537,7 @@
        .pre_handler = trampoline_probe_handler
 };
 
-int __init arch_init(void)
+int __init arch_init_kprobes(void)
 {
        return register_kprobe(&trampoline_p);
 }
diff -urN linux/arch/i386/kernel/time.c linux/arch/i386/kernel/time.c
--- linux/arch/i386/kernel/time.c       2005/07/11 20:46:08     1.64
+++ linux/arch/i386/kernel/time.c       2005/07/12 09:19:00     1.65
@@ -68,7 +68,8 @@
 
 #include "io_ports.h"
 
-extern spinlock_t i8259A_lock;
+#include <asm/i8259.h>
+
 int pit_latch_buggy;              /* extern */
 
 #include "do_timer.h"
@@ -85,6 +86,8 @@
 DEFINE_SPINLOCK(rtc_lock);
 EXPORT_SYMBOL(rtc_lock);
 
+#include <asm/i8253.h>
+
 DEFINE_SPINLOCK(i8253_lock);
 EXPORT_SYMBOL(i8253_lock);
 
diff -urN linux/arch/i386/kernel/cpu/cpufreq/gx-suspmod.c 
linux/arch/i386/kernel/cpu/cpufreq/gx-suspmod.c
--- linux/arch/i386/kernel/cpu/cpufreq/gx-suspmod.c     2005/01/25 04:27:55     
1.16
+++ linux/arch/i386/kernel/cpu/cpufreq/gx-suspmod.c     2005/07/12 09:19:01     
1.17
@@ -190,7 +190,7 @@
 
        /* detect which companion chip is used */
        while ((gx_pci = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, gx_pci)) != 
NULL) {
-               if ((pci_match_device (gx_chipset_tbl, gx_pci)) != NULL) {
+               if ((pci_match_id(gx_chipset_tbl, gx_pci)) != NULL) {
                        return gx_pci;
                }
        }
diff -urN linux/arch/i386/kernel/timers/timer_cyclone.c 
linux/arch/i386/kernel/timers/timer_cyclone.c
--- linux/arch/i386/kernel/timers/timer_cyclone.c       2004/11/15 11:49:16     
1.12
+++ linux/arch/i386/kernel/timers/timer_cyclone.c       2005/07/12 09:19:01     
1.13
@@ -17,9 +17,9 @@
 #include <asm/io.h>
 #include <asm/pgtable.h>
 #include <asm/fixmap.h>
-#include "io_ports.h"
+#include <asm/i8253.h>
 
-extern spinlock_t i8253_lock;
+#include "io_ports.h"
 
 /* Number of usecs that the last interrupt was delayed */
 static int delay_at_last_interrupt;
diff -urN linux/arch/i386/kernel/timers/timer_pit.c 
linux/arch/i386/kernel/timers/timer_pit.c
--- linux/arch/i386/kernel/timers/timer_pit.c   2004/11/15 11:49:16     1.11
+++ linux/arch/i386/kernel/timers/timer_pit.c   2005/07/12 09:19:01     1.12
@@ -15,9 +15,8 @@
 #include <asm/smp.h>
 #include <asm/io.h>
 #include <asm/arch_hooks.h>
+#include <asm/i8253.h>
 
-extern spinlock_t i8259A_lock;
-extern spinlock_t i8253_lock;
 #include "do_timer.h"
 #include "io_ports.h"
 
@@ -166,7 +165,6 @@
 
 void setup_pit_timer(void)
 {
-       extern spinlock_t i8253_lock;
        unsigned long flags;
 
        spin_lock_irqsave(&i8253_lock, flags);
diff -urN linux/arch/i386/kernel/timers/timer_tsc.c 
linux/arch/i386/kernel/timers/timer_tsc.c
--- linux/arch/i386/kernel/timers/timer_tsc.c   2005/07/11 20:46:10     1.30
+++ linux/arch/i386/kernel/timers/timer_tsc.c   2005/07/12 09:19:01     1.31
@@ -24,6 +24,7 @@
 #include "mach_timer.h"
 
 #include <asm/hpet.h>
+#include <asm/i8253.h>
 
 #ifdef CONFIG_HPET_TIMER
 static unsigned long hpet_usec_quotient;
@@ -35,8 +36,6 @@
 
 int tsc_disable __devinitdata = 0;
 
-extern spinlock_t i8253_lock;
-
 static int use_tsc;
 /* Number of usecs that the last interrupt was delayed */
 static int delay_at_last_interrupt;
diff -urN linux/arch/i386/mach-voyager/voyager_basic.c 
linux/arch/i386/mach-voyager/voyager_basic.c
--- linux/arch/i386/mach-voyager/voyager_basic.c        2005/02/07 02:54:31     
1.7
+++ linux/arch/i386/mach-voyager/voyager_basic.c        2005/07/12 09:19:01     
1.8
@@ -30,6 +30,7 @@
 #include <linux/irq.h>
 #include <asm/tlbflush.h>
 #include <asm/arch_hooks.h>
+#include <asm/i8253.h>
 
 /*
  * Power off function, if any
@@ -182,7 +183,6 @@
                 * and swiftly introduce it to something sharp and
                 * pointy.  */
                __u16 val;
-               extern spinlock_t i8253_lock;
 
                spin_lock(&i8253_lock);
                
diff -urN linux/arch/i386/pci/common.c linux/arch/i386/pci/common.c
--- linux/arch/i386/pci/common.c        2005/07/11 20:46:12     1.19
+++ linux/arch/i386/pci/common.c        2005/07/12 09:19:01     1.20
@@ -165,6 +165,7 @@
        if ((pci_probe & PCI_BIOS_SORT) && !(pci_probe & PCI_NO_SORT))
                pcibios_sort();
 #endif
+       pci_assign_unassigned_resources();
        return 0;
 }
 
diff -urN linux/arch/i386/pci/i386.c linux/arch/i386/pci/i386.c
--- linux/arch/i386/pci/i386.c  2005/04/08 18:57:54     1.10
+++ linux/arch/i386/pci/i386.c  2005/07/12 09:19:01     1.11
@@ -106,11 +106,16 @@
                if ((dev = bus->self)) {
                        for (idx = PCI_BRIDGE_RESOURCES; idx < 
PCI_NUM_RESOURCES; idx++) {
                                r = &dev->resource[idx];
-                               if (!r->start)
+                               if (!r->flags)
                                        continue;
                                pr = pci_find_parent_resource(dev, r);
-                               if (!pr || request_resource(pr, r) < 0)
+                               if (!r->start || !pr || request_resource(pr, r) 
< 0) {
                                        printk(KERN_ERR "PCI: Cannot allocate 
resource region %d of bridge %s\n", idx, pci_name(dev));
+                                       /* Something is wrong with the region.
+                                          Invalidate the resource to prevent 
child
+                                          resource allocations in this range. 
*/
+                                       r->flags = 0;
+                               }
                        }
                }
                pcibios_allocate_bus_resources(&bus->children);
@@ -227,7 +232,7 @@
 
        pci_read_config_word(dev, PCI_COMMAND, &cmd);
        old_cmd = cmd;
-       for(idx=0; idx<6; idx++) {
+       for(idx = 0; idx < PCI_NUM_RESOURCES; idx++) {
                /* Only set up the requested stuff */
                if (!(mask & (1<<idx)))
                        continue;
diff -urN linux/arch/ia64/configs/sn2_defconfig 
linux/arch/ia64/configs/sn2_defconfig
--- linux/arch/ia64/configs/sn2_defconfig       2005/07/11 20:46:13     1.16
+++ linux/arch/ia64/configs/sn2_defconfig       2005/07/12 09:19:01     1.17
@@ -99,7 +99,7 @@
 # Firmware Drivers
 #
 CONFIG_EFI_VARS=y
-# CONFIG_EFI_PCDP is not set
+CONFIG_EFI_PCDP=y
 CONFIG_BINFMT_ELF=y
 # CONFIG_BINFMT_MISC is not set
 
@@ -650,7 +650,7 @@
 #
 # Console display driver support
 #
-# CONFIG_VGA_CONSOLE is not set
+CONFIG_VGA_CONSOLE=y
 CONFIG_DUMMY_CONSOLE=y
 
 #
diff -urN linux/arch/ia64/configs/tiger_defconfig 
linux/arch/ia64/configs/tiger_defconfig
--- linux/arch/ia64/configs/tiger_defconfig     2005/07/11 20:46:13     1.5
+++ linux/arch/ia64/configs/tiger_defconfig     2005/07/12 09:19:01     1.6
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.12-20050621
-# Tue Jun 21 14:03:24 2005
+# Linux kernel version: 2.6.13-rc1-20050629
+# Wed Jun 29 15:28:12 2005
 #
 
 #
@@ -80,18 +80,29 @@
 # CONFIG_IA64_PAGE_SIZE_8KB is not set
 CONFIG_IA64_PAGE_SIZE_16KB=y
 # CONFIG_IA64_PAGE_SIZE_64KB is not set
+# CONFIG_HZ_100 is not set
+CONFIG_HZ_250=y
+# CONFIG_HZ_1000 is not set
+CONFIG_HZ=250
 CONFIG_IA64_L1_CACHE_SHIFT=7
 # CONFIG_NUMA is not set
 CONFIG_VIRTUAL_MEM_MAP=y
 CONFIG_HOLES_IN_ZONE=y
 CONFIG_IA64_CYCLONE=y
 CONFIG_IOSAPIC=y
+# CONFIG_IA64_SGI_SN_XP is not set
 CONFIG_FORCE_MAX_ZONEORDER=18
 CONFIG_SMP=y
 CONFIG_NR_CPUS=4
 CONFIG_HOTPLUG_CPU=y
 # CONFIG_SCHED_SMT is not set
 # CONFIG_PREEMPT is not set
+CONFIG_SELECT_MEMORY_MODEL=y
+CONFIG_FLATMEM_MANUAL=y
+# CONFIG_DISCONTIGMEM_MANUAL is not set
+# CONFIG_SPARSEMEM_MANUAL is not set
+CONFIG_FLATMEM=y
+CONFIG_FLAT_NODE_MEM_MAP=y
 CONFIG_HAVE_DEC_LOCK=y
 CONFIG_IA32_SUPPORT=y
 CONFIG_COMPAT=y
@@ -257,6 +268,7 @@
 # CONFIG_BLK_DEV_HPT366 is not set
 # CONFIG_BLK_DEV_SC1200 is not set
 CONFIG_BLK_DEV_PIIX=y
+# CONFIG_BLK_DEV_IT821X is not set
 # CONFIG_BLK_DEV_NS87415 is not set
 # CONFIG_BLK_DEV_PDC202XX_OLD is not set
 # CONFIG_BLK_DEV_PDC202XX_NEW is not set
@@ -395,6 +407,7 @@
 CONFIG_INET=y
 CONFIG_IP_MULTICAST=y
 # CONFIG_IP_ADVANCED_ROUTER is not set
+CONFIG_IP_FIB_HASH=y
 # CONFIG_IP_PNP is not set
 # CONFIG_NET_IPIP is not set
 # CONFIG_NET_IPGRE is not set
@@ -407,6 +420,8 @@
 # CONFIG_INET_TUNNEL is not set
 CONFIG_IP_TCPDIAG=y
 # CONFIG_IP_TCPDIAG_IPV6 is not set
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_BIC=y
 # CONFIG_IPV6 is not set
 # CONFIG_NETFILTER is not set
 
@@ -598,9 +613,7 @@
 # CONFIG_GAMEPORT_NS558 is not set
 # CONFIG_GAMEPORT_L4 is not set
 # CONFIG_GAMEPORT_EMU10K1 is not set
-# CONFIG_GAMEPORT_VORTEX is not set
 # CONFIG_GAMEPORT_FM801 is not set
-# CONFIG_GAMEPORT_CS461X is not set
 
 #
 # Character devices
@@ -629,7 +642,6 @@
 CONFIG_SERIAL_8250_EXTENDED=y
 CONFIG_SERIAL_8250_SHARE_IRQ=y
 # CONFIG_SERIAL_8250_DETECT_IRQ is not set
-# CONFIG_SERIAL_8250_MULTIPORT is not set
 # CONFIG_SERIAL_8250_RSA is not set
 
 #
@@ -743,6 +755,7 @@
 CONFIG_USB_EHCI_HCD=m
 # CONFIG_USB_EHCI_SPLIT_ISO is not set
 # CONFIG_USB_EHCI_ROOT_HUB_TT is not set
+# CONFIG_USB_ISP116X_HCD is not set
 CONFIG_USB_OHCI_HCD=m
 # CONFIG_USB_OHCI_BIG_ENDIAN is not set
 CONFIG_USB_OHCI_LITTLE_ENDIAN=y
@@ -779,9 +792,11 @@
 # CONFIG_USB_HIDDEV is not set
 # CONFIG_USB_AIPTEK is not set
 # CONFIG_USB_WACOM is not set
+# CONFIG_USB_ACECAD is not set
 # CONFIG_USB_KBTAB is not set
 # CONFIG_USB_POWERMATE is not set
 # CONFIG_USB_MTOUCH is not set
+# CONFIG_USB_ITMTOUCH is not set
 # CONFIG_USB_EGALAX is not set
 # CONFIG_USB_XPAD is not set
 # CONFIG_USB_ATI_REMOTE is not set
@@ -838,7 +853,7 @@
 # CONFIG_USB_TEST is not set
 
 #
-# USB ATM/DSL drivers
+# USB DSL modem support
 #
 
 #
@@ -857,12 +872,17 @@
 # CONFIG_INFINIBAND is not set
 
 #
+# SN Devices
+#
+
+#
 # File systems
 #
 CONFIG_EXT2_FS=y
 CONFIG_EXT2_FS_XATTR=y
 CONFIG_EXT2_FS_POSIX_ACL=y
 CONFIG_EXT2_FS_SECURITY=y
+# CONFIG_EXT2_FS_XIP is not set
 CONFIG_EXT3_FS=y
 CONFIG_EXT3_FS_XATTR=y
 CONFIG_EXT3_FS_POSIX_ACL=y
@@ -922,7 +942,6 @@
 CONFIG_PROC_FS=y
 CONFIG_PROC_KCORE=y
 CONFIG_SYSFS=y
-# CONFIG_DEVFS_FS is not set
 # CONFIG_DEVPTS_FS_XATTR is not set
 CONFIG_TMPFS=y
 CONFIG_TMPFS_XATTR=y
@@ -953,15 +972,18 @@
 #
 CONFIG_NFS_FS=m
 CONFIG_NFS_V3=y
+# CONFIG_NFS_V3_ACL is not set
 CONFIG_NFS_V4=y
 CONFIG_NFS_DIRECTIO=y
 CONFIG_NFSD=m
 CONFIG_NFSD_V3=y
+# CONFIG_NFSD_V3_ACL is not set
 CONFIG_NFSD_V4=y
 CONFIG_NFSD_TCP=y
 CONFIG_LOCKD=m
 CONFIG_LOCKD_V4=y
 CONFIG_EXPORTFS=y
+CONFIG_NFS_COMMON=y
 CONFIG_SUNRPC=m
 CONFIG_SUNRPC_GSS=m
 CONFIG_RPCSEC_GSS_KRB5=m
@@ -1069,6 +1091,7 @@
 # CONFIG_DEBUG_KOBJECT is not set
 # CONFIG_DEBUG_INFO is not set
 # CONFIG_DEBUG_FS is not set
+# CONFIG_KPROBES is not set
 CONFIG_IA64_GRANULE_16MB=y
 # CONFIG_IA64_GRANULE_64MB is not set
 # CONFIG_IA64_PRINT_HAZARDS is not set
@@ -1090,7 +1113,7 @@
 # CONFIG_CRYPTO_HMAC is not set
 # CONFIG_CRYPTO_NULL is not set
 # CONFIG_CRYPTO_MD4 is not set
-CONFIG_CRYPTO_MD5=m
+CONFIG_CRYPTO_MD5=y
 # CONFIG_CRYPTO_SHA1 is not set
 # CONFIG_CRYPTO_SHA256 is not set
 # CONFIG_CRYPTO_SHA512 is not set
diff -urN linux/arch/ia64/configs/zx1_defconfig 
linux/arch/ia64/configs/zx1_defconfig
--- linux/arch/ia64/configs/zx1_defconfig       2005/01/13 14:05:25     1.5
+++ linux/arch/ia64/configs/zx1_defconfig       2005/07/12 09:19:01     1.6
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.10
-# Wed Dec 29 09:05:48 2004
+# Linux kernel version: 2.6.13-rc1-20050629
+# Wed Jun 29 15:31:11 2005
 #
 
 #
@@ -12,6 +12,7 @@
 CONFIG_BROKEN=y
 CONFIG_BROKEN_ON_SMP=y
 CONFIG_LOCK_KERNEL=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
 
 #
 # General setup
@@ -24,23 +25,26 @@
 # CONFIG_BSD_PROCESS_ACCT_V3 is not set
 CONFIG_SYSCTL=y
 # CONFIG_AUDIT is not set
-CONFIG_LOG_BUF_SHIFT=17
 CONFIG_HOTPLUG=y
 CONFIG_KOBJECT_UEVENT=y
 # CONFIG_IKCONFIG is not set
+# CONFIG_CPUSETS is not set
 # CONFIG_EMBEDDED is not set
 CONFIG_KALLSYMS=y
 # CONFIG_KALLSYMS_ALL is not set
 # CONFIG_KALLSYMS_EXTRA_PASS is not set
+CONFIG_PRINTK=y
+CONFIG_BUG=y
+CONFIG_BASE_FULL=y
 CONFIG_FUTEX=y
 CONFIG_EPOLL=y
-# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
 CONFIG_SHMEM=y
 CONFIG_CC_ALIGN_FUNCTIONS=0
 CONFIG_CC_ALIGN_LABELS=0
 CONFIG_CC_ALIGN_LOOPS=0
 CONFIG_CC_ALIGN_JUMPS=0
 # CONFIG_TINY_SHMEM is not set
+CONFIG_BASE_SMALL=0
 
 #
 # Loadable module support
@@ -59,12 +63,15 @@
 CONFIG_64BIT=y
 CONFIG_MMU=y
 CONFIG_RWSEM_XCHGADD_ALGORITHM=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
 CONFIG_TIME_INTERPOLATION=y
 CONFIG_EFI=y
 CONFIG_GENERIC_IOMAP=y
+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
 # CONFIG_IA64_GENERIC is not set
 # CONFIG_IA64_DIG is not set
 CONFIG_IA64_HP_ZX1=y
+# CONFIG_IA64_HP_ZX1_SWIOTLB is not set
 # CONFIG_IA64_SGI_SN2 is not set
 # CONFIG_IA64_HP_SIM is not set
 # CONFIG_ITANIUM is not set
@@ -73,22 +80,36 @@
 # CONFIG_IA64_PAGE_SIZE_8KB is not set
 CONFIG_IA64_PAGE_SIZE_16KB=y
 # CONFIG_IA64_PAGE_SIZE_64KB is not set
+# CONFIG_HZ_100 is not set
+CONFIG_HZ_250=y
+# CONFIG_HZ_1000 is not set
+CONFIG_HZ=250
 CONFIG_IA64_L1_CACHE_SHIFT=7
 # CONFIG_NUMA is not set
 CONFIG_VIRTUAL_MEM_MAP=y
+CONFIG_HOLES_IN_ZONE=y
 # CONFIG_IA64_CYCLONE is not set
 CONFIG_IOSAPIC=y
+# CONFIG_IA64_SGI_SN_XP is not set
 CONFIG_FORCE_MAX_ZONEORDER=18
 CONFIG_SMP=y
 CONFIG_NR_CPUS=16
 # CONFIG_HOTPLUG_CPU is not set
+# CONFIG_SCHED_SMT is not set
 # CONFIG_PREEMPT is not set
+CONFIG_SELECT_MEMORY_MODEL=y
+CONFIG_FLATMEM_MANUAL=y
+# CONFIG_DISCONTIGMEM_MANUAL is not set
+# CONFIG_SPARSEMEM_MANUAL is not set
+CONFIG_FLATMEM=y
+CONFIG_FLAT_NODE_MEM_MAP=y
 CONFIG_HAVE_DEC_LOCK=y
 CONFIG_IA32_SUPPORT=y
 CONFIG_COMPAT=y
 CONFIG_IA64_MCA_RECOVERY=y
 CONFIG_PERFMON=y
 CONFIG_IA64_PALINFO=y
+CONFIG_ACPI_DEALLOCATE_IRQ=y
 
 #
 # Firmware Drivers
@@ -120,6 +141,7 @@
 CONFIG_ACPI_POWER=y
 CONFIG_ACPI_PCI=y
 CONFIG_ACPI_SYSTEM=y
+# CONFIG_ACPI_CONTAINER is not set
 
 #
 # Bus options (PCI, PCMCIA)
@@ -129,6 +151,7 @@
 # CONFIG_PCI_MSI is not set
 CONFIG_PCI_LEGACY_PROC=y
 CONFIG_PCI_NAMES=y
+# CONFIG_PCI_DEBUG is not set
 
 #
 # PCI Hotplug Support
@@ -138,7 +161,6 @@
 CONFIG_HOTPLUG_PCI_ACPI=y
 # CONFIG_HOTPLUG_PCI_ACPI_IBM is not set
 # CONFIG_HOTPLUG_PCI_CPCI is not set
-# CONFIG_HOTPLUG_PCI_PCIE is not set
 # CONFIG_HOTPLUG_PCI_SHPC is not set
 
 #
@@ -147,10 +169,6 @@
 # CONFIG_PCCARD is not set
 
 #
-# PC-card bridges
-#
-
-#
 # Device Drivers
 #
 
@@ -184,6 +202,7 @@
 # CONFIG_BLK_CPQ_CISS_DA is not set
 # CONFIG_BLK_DEV_DAC960 is not set
 # CONFIG_BLK_DEV_UMEM is not set
+# CONFIG_BLK_DEV_COW_COMMON is not set
 CONFIG_BLK_DEV_LOOP=y
 # CONFIG_BLK_DEV_CRYPTOLOOP is not set
 # CONFIG_BLK_DEV_NBD is not set
@@ -203,6 +222,7 @@
 CONFIG_IOSCHED_AS=y
 CONFIG_IOSCHED_DEADLINE=y
 CONFIG_IOSCHED_CFQ=y
+# CONFIG_ATA_OVER_ETH is not set
 
 #
 # ATA/ATAPI/MFM/RLL support
@@ -246,6 +266,7 @@
 # CONFIG_BLK_DEV_HPT366 is not set
 # CONFIG_BLK_DEV_SC1200 is not set
 # CONFIG_BLK_DEV_PIIX is not set
+# CONFIG_BLK_DEV_IT821X is not set
 # CONFIG_BLK_DEV_NS87415 is not set
 # CONFIG_BLK_DEV_PDC202XX_OLD is not set
 # CONFIG_BLK_DEV_PDC202XX_NEW is not set
@@ -275,6 +296,7 @@
 CONFIG_BLK_DEV_SR=y
 CONFIG_BLK_DEV_SR_VENDOR=y
 CONFIG_CHR_DEV_SG=y
+# CONFIG_CHR_DEV_SCH is not set
 
 #
 # Some SCSI devices (e.g. CD jukebox) support multiple LUNs
@@ -288,6 +310,7 @@
 #
 CONFIG_SCSI_SPI_ATTRS=y
 # CONFIG_SCSI_FC_ATTRS is not set
+# CONFIG_SCSI_ISCSI_ATTRS is not set
 
 #
 # SCSI low-level drivers
@@ -303,13 +326,10 @@
 # CONFIG_MEGARAID_NEWGEN is not set
 # CONFIG_MEGARAID_LEGACY is not set
 # CONFIG_SCSI_SATA is not set
-# CONFIG_SCSI_BUSLOGIC is not set
 # CONFIG_SCSI_CPQFCTS is not set
 # CONFIG_SCSI_DMX3191D is not set
-# CONFIG_SCSI_EATA is not set
 # CONFIG_SCSI_EATA_PIO is not set
 # CONFIG_SCSI_FUTURE_DOMAIN is not set
-# CONFIG_SCSI_GDTH is not set
 # CONFIG_SCSI_IPS is not set
 # CONFIG_SCSI_INITIO is not set
 # CONFIG_SCSI_INIA100 is not set
@@ -319,8 +339,6 @@
 CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64
 # CONFIG_SCSI_SYM53C8XX_IOMAPPED is not set
 # CONFIG_SCSI_IPR is not set
-# CONFIG_SCSI_PCI2000 is not set
-# CONFIG_SCSI_PCI2220I is not set
 # CONFIG_SCSI_QLOGIC_ISP is not set
 # CONFIG_SCSI_QLOGIC_FC is not set
 CONFIG_SCSI_QLOGIC_1280=y
@@ -331,7 +349,7 @@
 # CONFIG_SCSI_QLA2300 is not set
 # CONFIG_SCSI_QLA2322 is not set
 # CONFIG_SCSI_QLA6312 is not set
-# CONFIG_SCSI_QLA6322 is not set
+# CONFIG_SCSI_LPFC is not set
 # CONFIG_SCSI_DC395x is not set
 # CONFIG_SCSI_DC390T is not set
 # CONFIG_SCSI_DEBUG is not set
@@ -344,9 +362,9 @@
 #
 # Fusion MPT device support
 #
-CONFIG_FUSION=y
-CONFIG_FUSION_MAX_SGE=40
-# CONFIG_FUSION_CTL is not set
+# CONFIG_FUSION is not set
+# CONFIG_FUSION_SPI is not set
+# CONFIG_FUSION_FC is not set
 
 #
 # IEEE 1394 (FireWire) support
@@ -368,12 +386,12 @@
 #
 CONFIG_PACKET=y
 # CONFIG_PACKET_MMAP is not set
-# CONFIG_NETLINK_DEV is not set
 CONFIG_UNIX=y
 # CONFIG_NET_KEY is not set
 CONFIG_INET=y
 CONFIG_IP_MULTICAST=y
 # CONFIG_IP_ADVANCED_ROUTER is not set
+CONFIG_IP_FIB_HASH=y
 # CONFIG_IP_PNP is not set
 # CONFIG_NET_IPIP is not set
 # CONFIG_NET_IPGRE is not set
@@ -386,6 +404,8 @@
 # CONFIG_INET_TUNNEL is not set
 # CONFIG_IP_TCPDIAG is not set
 # CONFIG_IP_TCPDIAG_IPV6 is not set
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_BIC=y
 
 #
 # IP: Virtual Server Configuration
@@ -405,8 +425,6 @@
 CONFIG_IP_NF_ARPTABLES=y
 # CONFIG_IP_NF_ARPFILTER is not set
 # CONFIG_IP_NF_ARP_MANGLE is not set
-# CONFIG_IP_NF_COMPAT_IPCHAINS is not set
-# CONFIG_IP_NF_COMPAT_IPFWADM is not set
 
 #
 # SCTP Configuration (EXPERIMENTAL)
@@ -483,7 +501,6 @@
 # CONFIG_DGRS is not set
 # CONFIG_EEPRO100 is not set
 CONFIG_E100=y
-# CONFIG_E100_NAPI is not set
 # CONFIG_FEALNX is not set
 # CONFIG_NATSEMI is not set
 # CONFIG_NE2K_PCI is not set
@@ -505,9 +522,11 @@
 # CONFIG_HAMACHI is not set
 # CONFIG_YELLOWFIN is not set
 # CONFIG_R8169 is not set
+# CONFIG_SKGE is not set
 # CONFIG_SK98LIN is not set
 # CONFIG_VIA_VELOCITY is not set
 CONFIG_TIGON3=y
+# CONFIG_BNX2 is not set
 
 #
 # Ethernet (10000 Mbit)
@@ -565,18 +584,6 @@
 # CONFIG_INPUT_EVBUG is not set
 
 #
-# Input I/O drivers
-#
-# CONFIG_GAMEPORT is not set
-CONFIG_SOUND_GAMEPORT=y
-CONFIG_SERIO=y
-# CONFIG_SERIO_I8042 is not set
-# CONFIG_SERIO_SERPORT is not set
-# CONFIG_SERIO_CT82C710 is not set
-# CONFIG_SERIO_PCIPS2 is not set
-# CONFIG_SERIO_RAW is not set
-
-#
 # Input Device Drivers
 #
 # CONFIG_INPUT_KEYBOARD is not set
@@ -586,6 +593,16 @@
 # CONFIG_INPUT_MISC is not set
 
 #
+# Hardware I/O ports
+#
+CONFIG_SERIO=y
+# CONFIG_SERIO_I8042 is not set
+# CONFIG_SERIO_SERPORT is not set
+# CONFIG_SERIO_PCIPS2 is not set
+# CONFIG_SERIO_RAW is not set
+# CONFIG_GAMEPORT is not set
+
+#
 # Character devices
 #
 CONFIG_VT=y
@@ -603,7 +620,6 @@
 CONFIG_SERIAL_8250_EXTENDED=y
 CONFIG_SERIAL_8250_SHARE_IRQ=y
 # CONFIG_SERIAL_8250_DETECT_IRQ is not set
-# CONFIG_SERIAL_8250_MULTIPORT is not set
 # CONFIG_SERIAL_8250_RSA is not set
 
 #
@@ -611,6 +627,7 @@
 #
 CONFIG_SERIAL_CORE=y
 CONFIG_SERIAL_CORE_CONSOLE=y
+# CONFIG_SERIAL_JSM is not set
 CONFIG_UNIX98_PTYS=y
 CONFIG_LEGACY_PTYS=y
 CONFIG_LEGACY_PTY_COUNT=256
@@ -644,6 +661,12 @@
 # CONFIG_DRM_SIS is not set
 # CONFIG_RAW_DRIVER is not set
 # CONFIG_HPET is not set
+# CONFIG_HANGCHECK_TIMER is not set
+
+#
+# TPM devices
+#
+# CONFIG_TCG_TPM is not set
 
 #
 # I2C support
@@ -668,6 +691,7 @@
 # CONFIG_I2C_AMD8111 is not set
 # CONFIG_I2C_I801 is not set
 # CONFIG_I2C_I810 is not set
+# CONFIG_I2C_PIIX4 is not set
 # CONFIG_I2C_ISA is not set
 # CONFIG_I2C_NFORCE2 is not set
 # CONFIG_I2C_PARPORT_LIGHT is not set
@@ -691,10 +715,14 @@
 # CONFIG_SENSORS_ADM1025 is not set
 # CONFIG_SENSORS_ADM1026 is not set
 # CONFIG_SENSORS_ADM1031 is not set
+# CONFIG_SENSORS_ADM9240 is not set
 # CONFIG_SENSORS_ASB100 is not set
+# CONFIG_SENSORS_ATXP1 is not set
 # CONFIG_SENSORS_DS1621 is not set
 # CONFIG_SENSORS_FSCHER is not set
+# CONFIG_SENSORS_FSCPOS is not set
 # CONFIG_SENSORS_GL518SM is not set
+# CONFIG_SENSORS_GL520SM is not set
 # CONFIG_SENSORS_IT87 is not set
 # CONFIG_SENSORS_LM63 is not set
 # CONFIG_SENSORS_LM75 is not set
@@ -705,21 +733,29 @@
 # CONFIG_SENSORS_LM85 is not set
 # CONFIG_SENSORS_LM87 is not set
 # CONFIG_SENSORS_LM90 is not set
+# CONFIG_SENSORS_LM92 is not set
 # CONFIG_SENSORS_MAX1619 is not set
 # CONFIG_SENSORS_PC87360 is not set
+# CONFIG_SENSORS_SMSC47B397 is not set
+# CONFIG_SENSORS_SIS5595 is not set
 # CONFIG_SENSORS_SMSC47M1 is not set
 # CONFIG_SENSORS_VIA686A is not set
 # CONFIG_SENSORS_W83781D is not set
 # CONFIG_SENSORS_W83L785TS is not set
 # CONFIG_SENSORS_W83627HF is not set
+# CONFIG_SENSORS_W83627EHF is not set
 
 #
 # Other I2C Chip support
 #
+# CONFIG_SENSORS_DS1337 is not set
+# CONFIG_SENSORS_DS1374 is not set
 # CONFIG_SENSORS_EEPROM is not set
 # CONFIG_SENSORS_PCF8574 is not set
+# CONFIG_SENSORS_PCA9539 is not set
 # CONFIG_SENSORS_PCF8591 is not set
 # CONFIG_SENSORS_RTC8564 is not set
+# CONFIG_SENSORS_MAX6875 is not set
 # CONFIG_I2C_DEBUG_CORE is not set
 # CONFIG_I2C_DEBUG_ALGO is not set
 # CONFIG_I2C_DEBUG_BUS is not set
@@ -746,6 +782,7 @@
 #
 # Video Adapters
 #
+# CONFIG_TUNER_MULTI_I2C is not set
 # CONFIG_VIDEO_BT848 is not set
 # CONFIG_VIDEO_CPIA is not set
 # CONFIG_VIDEO_SAA5246A is not set
@@ -778,6 +815,11 @@
 # Graphics support
 #
 CONFIG_FB=y
+CONFIG_FB_CFB_FILLRECT=y
+CONFIG_FB_CFB_COPYAREA=y
+CONFIG_FB_CFB_IMAGEBLIT=y
+CONFIG_FB_SOFT_CURSOR=y
+# CONFIG_FB_MACMODES is not set
 CONFIG_FB_MODE_HELPERS=y
 # CONFIG_FB_TILEBLITTING is not set
 # CONFIG_FB_CIRRUS is not set
@@ -785,6 +827,7 @@
 # CONFIG_FB_CYBER2000 is not set
 # CONFIG_FB_ASILIANT is not set
 # CONFIG_FB_IMSTT is not set
+# CONFIG_FB_NVIDIA is not set
 # CONFIG_FB_RIVA is not set
 # CONFIG_FB_MATROX is not set
 # CONFIG_FB_RADEON_OLD is not set
@@ -801,6 +844,7 @@
 # CONFIG_FB_VOODOO1 is not set
 # CONFIG_FB_TRIDENT is not set
 # CONFIG_FB_PM3 is not set
+# CONFIG_FB_S1D13XXX is not set
 # CONFIG_FB_VIRTUAL is not set
 
 #
@@ -820,6 +864,7 @@
 # CONFIG_LOGO_LINUX_MONO is not set
 # CONFIG_LOGO_LINUX_VGA16 is not set
 CONFIG_LOGO_LINUX_CLUT224=y
+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
 
 #
 # Sound
@@ -869,6 +914,8 @@
 # CONFIG_SND_CS46XX is not set
 # CONFIG_SND_CS4281 is not set
 # CONFIG_SND_EMU10K1 is not set
+# CONFIG_SND_EMU10K1X is not set
+# CONFIG_SND_CA0106 is not set
 # CONFIG_SND_KORG1212 is not set
 # CONFIG_SND_MIXART is not set
 # CONFIG_SND_NM256 is not set
@@ -876,6 +923,7 @@
 # CONFIG_SND_RME96 is not set
 # CONFIG_SND_RME9652 is not set
 # CONFIG_SND_HDSP is not set
+# CONFIG_SND_HDSPM is not set
 # CONFIG_SND_TRIDENT is not set
 # CONFIG_SND_YMFPCI is not set
 # CONFIG_SND_ALS4000 is not set
@@ -893,13 +941,14 @@
 # CONFIG_SND_INTEL8X0M is not set
 # CONFIG_SND_SONICVIBES is not set
 # CONFIG_SND_VIA82XX is not set
+# CONFIG_SND_VIA82XX_MODEM is not set
 # CONFIG_SND_VX222 is not set
+# CONFIG_SND_HDA_INTEL is not set
 
 #
 # USB devices
 #
 # CONFIG_SND_USB_AUDIO is not set
-# CONFIG_SND_USB_USX2Y is not set
 
 #
 # Open Sound System
@@ -909,6 +958,8 @@
 #
 # USB support
 #
+CONFIG_USB_ARCH_HAS_HCD=y
+CONFIG_USB_ARCH_HAS_OHCI=y
 CONFIG_USB=y
 # CONFIG_USB_DEBUG is not set
 
@@ -920,8 +971,6 @@
 # CONFIG_USB_DYNAMIC_MINORS is not set
 # CONFIG_USB_SUSPEND is not set
 # CONFIG_USB_OTG is not set
-CONFIG_USB_ARCH_HAS_HCD=y
-CONFIG_USB_ARCH_HAS_OHCI=y
 
 #
 # USB Host Controller Drivers
@@ -929,7 +978,10 @@
 CONFIG_USB_EHCI_HCD=y
 # CONFIG_USB_EHCI_SPLIT_ISO is not set
 # CONFIG_USB_EHCI_ROOT_HUB_TT is not set
+# CONFIG_USB_ISP116X_HCD is not set
 CONFIG_USB_OHCI_HCD=y
+# CONFIG_USB_OHCI_BIG_ENDIAN is not set
+CONFIG_USB_OHCI_LITTLE_ENDIAN=y
 CONFIG_USB_UHCI_HCD=y
 # CONFIG_USB_SL811_HCD is not set
 
@@ -947,12 +999,11 @@
 #
 CONFIG_USB_STORAGE=y
 # CONFIG_USB_STORAGE_DEBUG is not set
-# CONFIG_USB_STORAGE_RW_DETECT is not set
 # CONFIG_USB_STORAGE_DATAFAB is not set
 # CONFIG_USB_STORAGE_FREECOM is not set
 # CONFIG_USB_STORAGE_ISD200 is not set
 # CONFIG_USB_STORAGE_DPCM is not set
-# CONFIG_USB_STORAGE_HP8200e is not set
+# CONFIG_USB_STORAGE_USBAT is not set
 # CONFIG_USB_STORAGE_SDDR09 is not set
 # CONFIG_USB_STORAGE_SDDR55 is not set
 # CONFIG_USB_STORAGE_JUMPSHOT is not set
@@ -966,9 +1017,11 @@
 CONFIG_USB_HIDDEV=y
 # CONFIG_USB_AIPTEK is not set
 # CONFIG_USB_WACOM is not set
+# CONFIG_USB_ACECAD is not set
 # CONFIG_USB_KBTAB is not set
 # CONFIG_USB_POWERMATE is not set
 # CONFIG_USB_MTOUCH is not set
+# CONFIG_USB_ITMTOUCH is not set
 # CONFIG_USB_EGALAX is not set
 # CONFIG_USB_XPAD is not set
 # CONFIG_USB_ATI_REMOTE is not set
@@ -978,7 +1031,6 @@
 #
 # CONFIG_USB_MDC800 is not set
 # CONFIG_USB_MICROTEK is not set
-# CONFIG_USB_HPUSBSCSI is not set
 
 #
 # USB Multimedia devices
@@ -992,6 +1044,7 @@
 # CONFIG_USB_SE401 is not set
 # CONFIG_USB_SN9C102 is not set
 # CONFIG_USB_STV680 is not set
+# CONFIG_USB_PWC is not set
 
 #
 # USB Network Adapters
@@ -1001,6 +1054,7 @@
 # CONFIG_USB_PEGASUS is not set
 # CONFIG_USB_RTL8150 is not set
 # CONFIG_USB_USBNET is not set
+CONFIG_USB_MON=y
 
 #
 # USB port drivers
@@ -1016,7 +1070,6 @@
 #
 # CONFIG_USB_EMI62 is not set
 # CONFIG_USB_EMI26 is not set
-# CONFIG_USB_TIGL is not set
 # CONFIG_USB_AUERSWALD is not set
 # CONFIG_USB_RIO500 is not set
 # CONFIG_USB_LEGOTOWER is not set
@@ -1025,9 +1078,11 @@
 # CONFIG_USB_CYTHERM is not set
 # CONFIG_USB_PHIDGETKIT is not set
 # CONFIG_USB_PHIDGETSERVO is not set
+# CONFIG_USB_IDMOUSE is not set
+# CONFIG_USB_SISUSBVGA is not set
 
 #
-# USB ATM/DSL drivers
+# USB DSL modem support
 #
 
 #
@@ -1041,12 +1096,22 @@
 # CONFIG_MMC is not set
 
 #
+# InfiniBand support
+#
+# CONFIG_INFINIBAND is not set
+
+#
+# SN Devices
+#
+
+#
 # File systems
 #
 CONFIG_EXT2_FS=y
 CONFIG_EXT2_FS_XATTR=y
 # CONFIG_EXT2_FS_POSIX_ACL is not set
 # CONFIG_EXT2_FS_SECURITY is not set
+# CONFIG_EXT2_FS_XIP is not set
 CONFIG_EXT3_FS=y
 CONFIG_EXT3_FS_XATTR=y
 # CONFIG_EXT3_FS_POSIX_ACL is not set
@@ -1056,6 +1121,10 @@
 CONFIG_FS_MBCACHE=y
 # CONFIG_REISERFS_FS is not set
 # CONFIG_JFS_FS is not set
+
+#
+# XFS support
+#
 # CONFIG_XFS_FS is not set
 # CONFIG_MINIX_FS is not set
 # CONFIG_ROMFS_FS is not set
@@ -1089,7 +1158,6 @@
 CONFIG_PROC_FS=y
 CONFIG_PROC_KCORE=y
 CONFIG_SYSFS=y
-# CONFIG_DEVFS_FS is not set
 # CONFIG_DEVPTS_FS_XATTR is not set
 CONFIG_TMPFS=y
 CONFIG_TMPFS_XATTR=y
@@ -1120,15 +1188,18 @@
 #
 CONFIG_NFS_FS=y
 CONFIG_NFS_V3=y
+# CONFIG_NFS_V3_ACL is not set
 CONFIG_NFS_V4=y
 # CONFIG_NFS_DIRECTIO is not set
 CONFIG_NFSD=y
 CONFIG_NFSD_V3=y
+# CONFIG_NFSD_V3_ACL is not set
 # CONFIG_NFSD_V4 is not set
 # CONFIG_NFSD_TCP is not set
 CONFIG_LOCKD=y
 CONFIG_LOCKD_V4=y
 CONFIG_EXPORTFS=y
+CONFIG_NFS_COMMON=y
 CONFIG_SUNRPC=y
 CONFIG_SUNRPC_GSS=y
 CONFIG_RPCSEC_GSS_KRB5=y
@@ -1209,6 +1280,8 @@
 # CONFIG_CRC_CCITT is not set
 CONFIG_CRC32=y
 # CONFIG_LIBCRC32C is not set
+CONFIG_GENERIC_HARDIRQS=y
+CONFIG_GENERIC_IRQ_PROBE=y
 
 #
 # Profiling support
@@ -1218,14 +1291,18 @@
 #
 # Kernel hacking
 #
+# CONFIG_PRINTK_TIME is not set
 CONFIG_DEBUG_KERNEL=y
 CONFIG_MAGIC_SYSRQ=y
+CONFIG_LOG_BUF_SHIFT=17
 # CONFIG_SCHEDSTATS is not set
 # CONFIG_DEBUG_SLAB is not set
 # CONFIG_DEBUG_SPINLOCK is not set
 # CONFIG_DEBUG_SPINLOCK_SLEEP is not set
 # CONFIG_DEBUG_KOBJECT is not set
 # CONFIG_DEBUG_INFO is not set
+# CONFIG_DEBUG_FS is not set
+CONFIG_KPROBES=y
 CONFIG_IA64_GRANULE_16MB=y
 # CONFIG_IA64_GRANULE_64MB is not set
 CONFIG_IA64_PRINT_HAZARDS=y
@@ -1252,6 +1329,7 @@
 # CONFIG_CRYPTO_SHA256 is not set
 # CONFIG_CRYPTO_SHA512 is not set
 # CONFIG_CRYPTO_WP512 is not set
+# CONFIG_CRYPTO_TGR192 is not set
 CONFIG_CRYPTO_DES=y
 # CONFIG_CRYPTO_BLOWFISH is not set
 # CONFIG_CRYPTO_TWOFISH is not set
diff -urN linux/arch/ia64/hp/common/sba_iommu.c 
linux/arch/ia64/hp/common/sba_iommu.c
--- linux/arch/ia64/hp/common/sba_iommu.c       2005/05/19 12:08:09     1.29
+++ linux/arch/ia64/hp/common/sba_iommu.c       2005/07/12 09:19:02     1.30
@@ -156,10 +156,13 @@
 */
 #define DELAYED_RESOURCE_CNT   64
 
+#define PCI_DEVICE_ID_HP_SX2000_IOC    0x12ec
+
 #define ZX1_IOC_ID     ((PCI_DEVICE_ID_HP_ZX1_IOC << 16) | PCI_VENDOR_ID_HP)
 #define ZX2_IOC_ID     ((PCI_DEVICE_ID_HP_ZX2_IOC << 16) | PCI_VENDOR_ID_HP)
 #define REO_IOC_ID     ((PCI_DEVICE_ID_HP_REO_IOC << 16) | PCI_VENDOR_ID_HP)
 #define SX1000_IOC_ID  ((PCI_DEVICE_ID_HP_SX1000_IOC << 16) | PCI_VENDOR_ID_HP)
+#define SX2000_IOC_ID  ((PCI_DEVICE_ID_HP_SX2000_IOC << 16) | PCI_VENDOR_ID_HP)
 
 #define ZX1_IOC_OFFSET 0x1000  /* ACPI reports SBA, we want IOC */
 
@@ -1726,6 +1729,7 @@
        { ZX1_IOC_ID, "zx1", ioc_zx1_init },
        { ZX2_IOC_ID, "zx2", NULL },
        { SX1000_IOC_ID, "sx1000", NULL },
+       { SX2000_IOC_ID, "sx2000", NULL },
 };
 
 static struct ioc * __init
diff -urN linux/arch/ia64/hp/sim/simserial.c linux/arch/ia64/hp/sim/simserial.c
--- linux/arch/ia64/hp/sim/simserial.c  2004/10/25 20:44:14     1.17
+++ linux/arch/ia64/hp/sim/simserial.c  2005/07/12 09:19:02     1.18
@@ -30,6 +30,7 @@
 #include <linux/module.h>
 #include <linux/serial.h>
 #include <linux/serialP.h>
+#include <linux/sysrq.h>
 
 #include <asm/irq.h>
 #include <asm/hw_irq.h>
@@ -149,12 +150,17 @@
                                seen_esc = 2;
                                continue;
                        } else if ( seen_esc == 2 ) {
-                               if ( ch == 'P' ) show_state();          /* F1 
key */
-#ifdef CONFIG_KDB
-                               if ( ch == 'S' )
-                                       kdb(KDB_REASON_KEYBOARD, 0, 
(kdb_eframe_t) regs);
+                               if ( ch == 'P' ) /* F1 */
+                                       show_state();
+#ifdef CONFIG_MAGIC_SYSRQ
+                               if ( ch == 'S' ) { /* F4 */
+                                       do
+                                               ch = ia64_ssc(0, 0, 0, 0,
+                                                             SSC_GETCHAR);
+                                       while (!ch);
+                                       handle_sysrq(ch, regs, NULL);
+                               }
 #endif
-
                                seen_esc = 0;
                                continue;
                        }
diff -urN linux/arch/ia64/kernel/entry.S linux/arch/ia64/kernel/entry.S
--- linux/arch/ia64/kernel/entry.S      2005/07/11 20:46:13     1.58
+++ linux/arch/ia64/kernel/entry.S      2005/07/12 09:19:02     1.59
@@ -470,18 +470,6 @@
        br.cond.sptk.many b7
 END(load_switch_stack)
 
-GLOBAL_ENTRY(__ia64_syscall)
-       .regstk 6,0,0,0
-       mov r15=in5                             // put syscall number in place
-       break __BREAK_SYSCALL
-       movl r2=errno
-       cmp.eq p6,p7=-1,r10
-       ;;
-(p6)   st4 [r2]=r8
-(p6)   mov r8=-1
-       br.ret.sptk.many rp
-END(__ia64_syscall)
-
 GLOBAL_ENTRY(execve)
        mov r15=__NR_execve                     // put syscall number in place
        break __BREAK_SYSCALL
@@ -637,7 +625,7 @@
  *           r8-r11: restored (syscall return value(s))
  *              r12: restored (user-level stack pointer)
  *              r13: restored (user-level thread pointer)
- *              r14: cleared
+ *              r14: set to __kernel_syscall_via_epc
  *              r15: restored (syscall #)
  *          r16-r17: cleared
  *              r18: user-level b6
@@ -658,7 +646,7 @@
  *               pr: restored (user-level pr)
  *               b0: restored (user-level rp)
  *               b6: restored
- *               b7: cleared
+ *               b7: set to __kernel_syscall_via_epc
  *          ar.unat: restored (user-level ar.unat)
  *           ar.pfs: restored (user-level ar.pfs)
  *           ar.rsc: restored (user-level ar.rsc)
@@ -704,72 +692,79 @@
        ;;
 (p6)   ld4 r31=[r18]                           // load 
current_thread_info()->flags
        ld8 r19=[r2],PT(B6)-PT(LOADRS)          // load ar.rsc value for 
"loadrs"
-       mov b7=r0               // clear b7
+       nop.i 0
        ;;
-       ld8 r23=[r3],PT(R11)-PT(AR_BSPSTORE)    // load ar.bspstore (may be 
garbage)
+       mov r16=ar.bsp                          // M2  get existing backing 
store pointer
        ld8 r18=[r2],PT(R9)-PT(B6)              // load b6
 (p6)   and r15=TIF_WORK_MASK,r31               // any work other than 
TIF_SYSCALL_TRACE?
        ;;
-       mov r16=ar.bsp                          // M2  get existing backing 
store pointer
+       ld8 r23=[r3],PT(R11)-PT(AR_BSPSTORE)    // load ar.bspstore (may be 
garbage)
 (p6)   cmp4.ne.unc p6,p0=r15, r0               // any special work pending?
 (p6)   br.cond.spnt .work_pending_syscall
        ;;
        // start restoring the state saved on the kernel stack (struct pt_regs):
        ld8 r9=[r2],PT(CR_IPSR)-PT(R9)
        ld8 r11=[r3],PT(CR_IIP)-PT(R11)
-       mov f6=f0               // clear f6
+(pNonSys) break 0              //      bug check: we shouldn't be here if 
pNonSys is TRUE!
        ;;
        invala                  // M0|1 invalidate ALAT
-       rsm psr.i | psr.ic      // M2 initiate turning off of interrupt and 
interruption collection
-       mov f9=f0               // clear f9
+       rsm psr.i | psr.ic      // M2   turn off interrupts and interruption 
collection
+       cmp.eq p9,p0=r0,r0      // A    set p9 to indicate that we should 
restore cr.ifs
 
-       ld8 r29=[r2],16         // load cr.ipsr
-       ld8 r28=[r3],16                 // load cr.iip
-       mov f8=f0               // clear f8
+       ld8 r29=[r2],16         // M0|1 load cr.ipsr
+       ld8 r28=[r3],16         // M0|1 load cr.iip
+       mov r22=r0              // A    clear r22
        ;;
        ld8 r30=[r2],16         // M0|1 load cr.ifs
        ld8 r25=[r3],16         // M0|1 load ar.unat
-       cmp.eq p9,p0=r0,r0      // set p9 to indicate that we should restore 
cr.ifs
+(pUStk) add r14=IA64_TASK_THREAD_ON_USTACK_OFFSET,r13
        ;;
        ld8 r26=[r2],PT(B0)-PT(AR_PFS)  // M0|1 load ar.pfs
-(pKStk)        mov r22=psr             // M2 read PSR now that interrupts are 
disabled
-       mov f10=f0              // clear f10
-       ;;
-       ld8 r21=[r2],PT(AR_RNAT)-PT(B0) // load b0
-       ld8 r27=[r3],PT(PR)-PT(AR_RSC)  // load ar.rsc
-       mov f11=f0              // clear f11
+(pKStk)        mov r22=psr                     // M2   read PSR now that 
interrupts are disabled
+       nop 0
        ;;
-       ld8 r24=[r2],PT(AR_FPSR)-PT(AR_RNAT)    // load ar.rnat (may be garbage)
-       ld8 r31=[r3],PT(R1)-PT(PR)              // load predicates
-(pUStk) add r14=IA64_TASK_THREAD_ON_USTACK_OFFSET,r13
+       ld8 r21=[r2],PT(AR_RNAT)-PT(B0) // M0|1 load b0
+       ld8 r27=[r3],PT(PR)-PT(AR_RSC)  // M0|1 load ar.rsc
+       mov f6=f0                       // F    clear f6
+       ;;
+       ld8 r24=[r2],PT(AR_FPSR)-PT(AR_RNAT)    // M0|1 load ar.rnat (may be 
garbage)
+       ld8 r31=[r3],PT(R1)-PT(PR)              // M0|1 load predicates
+       mov f7=f0                               // F    clear f7
+       ;;
+       ld8 r20=[r2],PT(R12)-PT(AR_FPSR)        // M0|1 load ar.fpsr
+       ld8.fill r1=[r3],16                     // M0|1 load r1
+(pUStk) mov r17=1                              // A
+       ;;
+(pUStk) st1 [r14]=r17                          // M2|3
+       ld8.fill r13=[r3],16                    // M0|1
+       mov f8=f0                               // F    clear f8
+       ;;
+       ld8.fill r12=[r2]                       // M0|1 restore r12 (sp)
+       ld8.fill r15=[r3]                       // M0|1 restore r15
+       mov b6=r18                              // I0   restore b6
+
+       addl r17=THIS_CPU(ia64_phys_stacked_size_p8),r0 // A
+       mov f9=f0                                       // F    clear f9
+(pKStk) br.cond.dpnt.many skip_rbs_switch              // B
+
+       srlz.d                          // M0   ensure interruption collection 
is off (for cover)
+       shr.u r18=r19,16                // I0|1 get byte size of existing 
"dirty" partition
+       cover                           // B    add current frame into dirty 
partition & set cr.ifs
+       ;;
+(pUStk) ld4 r17=[r17]                  // M0|1 r17 = 
cpu_data->phys_stacked_size_p8
+       mov r19=ar.bsp                  // M2   get new backing store pointer
+       mov f10=f0                      // F    clear f10
+
+       nop.m 0
+       movl r14=__kernel_syscall_via_epc // X
        ;;
-       ld8 r20=[r2],PT(R12)-PT(AR_FPSR)        // load ar.fpsr
-       ld8.fill r1=[r3],16     // load r1
-(pUStk) mov r17=1
-       ;;
-       srlz.d                  // M0  ensure interruption collection is off
-       ld8.fill r13=[r3],16
-       mov f7=f0               // clear f7
-       ;;
-       ld8.fill r12=[r2]       // restore r12 (sp)
-       mov.m ar.ssd=r0         // M2 clear ar.ssd
-       mov r22=r0              // clear r22
-
-       ld8.fill r15=[r3]       // restore r15
-(pUStk) st1 [r14]=r17
-       addl r3=THIS_CPU(ia64_phys_stacked_size_p8),r0
-       ;;
-(pUStk)        ld4 r17=[r3]            // r17 = cpu_data->phys_stacked_size_p8
-       mov.m ar.csd=r0         // M2 clear ar.csd
-       mov b6=r18              // I0  restore b6
-       ;;
-       mov r14=r0              // clear r14
-       shr.u r18=r19,16        // I0|1 get byte size of existing "dirty" 
partition
-(pKStk) br.cond.dpnt.many skip_rbs_switch
-
-       mov.m ar.ccv=r0         // clear ar.ccv
-(pNonSys) br.cond.dpnt.many dont_preserve_current_frame
-       br.cond.sptk.many rbs_switch
+       mov.m ar.csd=r0                 // M2   clear ar.csd
+       mov.m ar.ccv=r0                 // M2   clear ar.ccv
+       mov b7=r14                      // I0   clear b7 (hint with 
__kernel_syscall_via_epc)
+
+       mov.m ar.ssd=r0                 // M2   clear ar.ssd
+       mov f11=f0                      // F    clear f11
+       br.cond.sptk.many rbs_switch    // B
 END(ia64_leave_syscall)
 
 #ifdef CONFIG_IA32_SUPPORT
@@ -885,7 +880,7 @@
        ldf.fill f7=[r2],PT(F11)-PT(F7)
        ldf.fill f8=[r3],32
        ;;
-       srlz.i                  // ensure interruption collection is off
+       srlz.d  // ensure that inter. collection is off (VHPT is don't care, 
since text is pinned)
        mov ar.ccv=r15
        ;;
        ldf.fill f11=[r2]
@@ -945,11 +940,10 @@
         * NOTE: alloc, loadrs, and cover can't be predicated.
         */
 (pNonSys) br.cond.dpnt dont_preserve_current_frame
-
-rbs_switch:
        cover                           // add current frame into dirty 
partition and set cr.ifs
        ;;
        mov r19=ar.bsp                  // get new backing store pointer
+rbs_switch:
        sub r16=r16,r18                 // krbs = old bsp - size of dirty 
partition
        cmp.ne p9,p0=r0,r0              // clear p9 to skip restore of cr.ifs
        ;;
@@ -1024,14 +1018,14 @@
        mov loc5=0
        mov loc6=0
        mov loc7=0
-(pRecurse) br.call.sptk.few b0=rse_clear_invalid
+(pRecurse) br.call.dptk.few b0=rse_clear_invalid
        ;;
        mov loc8=0
        mov loc9=0
        cmp.ne pReturn,p0=r0,in1        // if recursion count != 0, we need to 
do a br.ret
        mov loc10=0
        mov loc11=0
-(pReturn) br.ret.sptk.many b0
+(pReturn) br.ret.dptk.many b0
 #endif /* !CONFIG_ITANIUM */
 #      undef pRecurse
 #      undef pReturn
diff -urN linux/arch/ia64/kernel/fsys.S linux/arch/ia64/kernel/fsys.S
--- linux/arch/ia64/kernel/fsys.S       2005/06/18 14:42:39     1.20
+++ linux/arch/ia64/kernel/fsys.S       2005/07/12 09:19:02     1.21
@@ -531,93 +531,114 @@
        .altrp b6
        .body
        /*
-        * We get here for syscalls that don't have a lightweight handler.  For 
those, we
-        * need to bubble down into the kernel and that requires setting up a 
minimal
-        * pt_regs structure, and initializing the CPU state more or less as if 
an
-        * interruption had occurred.  To make syscall-restarts work, we setup 
pt_regs
-        * such that cr_iip points to the second instruction in 
syscall_via_break.
-        * Decrementing the IP hence will restart the syscall via break and not
-        * decrementing IP will return us to the caller, as usual.  Note that 
we preserve
-        * the value of psr.pp rather than initializing it from dcr.pp.  This 
makes it
-        * possible to distinguish fsyscall execution from other privileged 
execution.
+        * We get here for syscalls that don't have a lightweight
+        * handler.  For those, we need to bubble down into the kernel
+        * and that requires setting up a minimal pt_regs structure,
+        * and initializing the CPU state more or less as if an
+        * interruption had occurred.  To make syscall-restarts work,
+        * we setup pt_regs such that cr_iip points to the second
+        * instruction in syscall_via_break.  Decrementing the IP
+        * hence will restart the syscall via break and not
+        * decrementing IP will return us to the caller, as usual.
+        * Note that we preserve the value of psr.pp rather than
+        * initializing it from dcr.pp.  This makes it possible to
+        * distinguish fsyscall execution from other privileged
+        * execution.
         *
         * On entry:
-        *      - normal fsyscall handler register usage, except that we also 
have:
+        *      - normal fsyscall handler register usage, except
+        *        that we also have:
         *      - r18: address of syscall entry point
         *      - r21: ar.fpsr
         *      - r26: ar.pfs
         *      - r27: ar.rsc
         *      - r29: psr
+        *
+        * We used to clear some PSR bits here but that requires slow
+        * serialization.  Fortuntely, that isn't really necessary.
+        * The rationale is as follows: we used to clear bits
+        * ~PSR_PRESERVED_BITS in PSR.L.  Since
+        * PSR_PRESERVED_BITS==PSR.{UP,MFL,MFH,PK,DT,PP,SP,RT,IC}, we
+        * ended up clearing PSR.{BE,AC,I,DFL,DFH,DI,DB,SI,TB}.
+        * However,
+        *
+        * PSR.BE : already is turned off in __kernel_syscall_via_epc()
+        * PSR.AC : don't care (kernel normally turns PSR.AC on)
+        * PSR.I  : already turned off by the time fsys_bubble_down gets
+        *          invoked
+        * PSR.DFL: always 0 (kernel never turns it on)
+        * PSR.DFH: don't care --- kernel never touches f32-f127 on its own
+        *          initiative
+        * PSR.DI : always 0 (kernel never turns it on)
+        * PSR.SI : always 0 (kernel never turns it on)
+        * PSR.DB : don't care --- kernel never enables kernel-level
+        *          breakpoints
+        * PSR.TB : must be 0 already; if it wasn't zero on entry to
+        *          __kernel_syscall_via_epc, the branch to fsys_bubble_down
+        *          will trigger a taken branch; the taken-trap-handler then
+        *          converts the syscall into a break-based system-call.
         */
-#      define PSR_PRESERVED_BITS       (IA64_PSR_UP | IA64_PSR_MFL | 
IA64_PSR_MFH | IA64_PSR_PK \
-                                        | IA64_PSR_DT | IA64_PSR_PP | 
IA64_PSR_SP | IA64_PSR_RT \
-                                        | IA64_PSR_IC)
        /*
-        * Reading psr.l gives us only bits 0-31, psr.it, and psr.mc.  The rest 
we have
-        * to synthesize.
+        * Reading psr.l gives us only bits 0-31, psr.it, and psr.mc.
+        * The rest we have to synthesize.
         */
-#      define PSR_ONE_BITS             ((3 << IA64_PSR_CPL0_BIT) | (0x1 << 
IA64_PSR_RI_BIT) \
+#      define PSR_ONE_BITS             ((3 << IA64_PSR_CPL0_BIT)       \
+                                        | (0x1 << IA64_PSR_RI_BIT)     \
                                         | IA64_PSR_BN | IA64_PSR_I)
 
-       invala
-       movl r8=PSR_ONE_BITS
-
-       mov r25=ar.unat                 // save ar.unat (5 cyc)
-       movl r9=PSR_PRESERVED_BITS
+       invala                                  // M0|1
+       movl r14=ia64_ret_from_syscall          // X
 
-       mov ar.rsc=0                    // set enforced lazy mode, pl 0, 
little-endian, loadrs=0
-       movl r28=__kernel_syscall_via_break
+       nop.m 0
+       movl r28=__kernel_syscall_via_break     // X    create cr.iip
        ;;
-       mov r23=ar.bspstore             // save ar.bspstore (12 cyc)
-       mov r31=pr                      // save pr (2 cyc)
-       mov r20=r1                      // save caller's gp in r20
+
+       mov r2=r16                              // A    get task addr to 
addl-addressable register
+       adds r16=IA64_TASK_THREAD_ON_USTACK_OFFSET,r16 // A
+       mov r31=pr                              // I0   save pr (2 cyc)
        ;;
-       mov r2=r16                      // copy current task addr to 
addl-addressable register
-       and r9=r9,r29
-       mov r19=b6                      // save b6 (2 cyc)
+       st1 [r16]=r0                            // M2|3 clear 
current->thread.on_ustack flag
+       addl r22=IA64_RBS_OFFSET,r2             // A    compute base of RBS
+       add r3=TI_FLAGS+IA64_TASK_SIZE,r2       // A
        ;;
-       mov psr.l=r9                    // slam the door (17 cyc to srlz.i)
-       or r29=r8,r29                   // construct cr.ipsr value to save
-       addl r22=IA64_RBS_OFFSET,r2     // compute base of RBS
+       ld4 r3=[r3]                             // M0|1 r3 = 
current_thread_info()->flags
+       lfetch.fault.excl.nt1 [r22]             // M0|1 prefetch register 
backing-store
+       nop.i 0
        ;;
-       // GAS reports a spurious RAW hazard on the read of ar.rnat because it 
thinks
-       // we may be reading ar.itc after writing to psr.l.  Avoid that message 
with
-       // this directive:
-       dv_serialize_data
-       mov.m r24=ar.rnat               // read ar.rnat (5 cyc lat)
-       lfetch.fault.excl.nt1 [r22]
-       adds r16=IA64_TASK_THREAD_ON_USTACK_OFFSET,r2
-
-       // ensure previous insn group is issued before we stall for srlz.i:
+       mov ar.rsc=0                            // M2   set enforced lazy mode, 
pl 0, LE, loadrs=0
+       nop.m 0
+       nop.i 0
        ;;
-       srlz.i                          // ensure new psr.l has been established
-       
/////////////////////////////////////////////////////////////////////////////
-       ////////// from this point on, execution is not interruptible anymore
-       
/////////////////////////////////////////////////////////////////////////////
-       addl r1=IA64_STK_OFFSET-IA64_PT_REGS_SIZE,r2    // compute base of 
memory stack
-       cmp.ne pKStk,pUStk=r0,r0        // set pKStk <- 0, pUStk <- 1
+       mov r23=ar.bspstore                     // M2 (12 cyc) save ar.bspstore
+       mov.m r24=ar.rnat                       // M2 (5 cyc) read ar.rnat 
(dual-issues!)
+       nop.i 0
        ;;
-       st1 [r16]=r0                    // clear current->thread.on_ustack flag
-       mov ar.bspstore=r22             // switch to kernel RBS
-       mov b6=r18                      // copy syscall entry-point to b6 (7 
cyc)
-       add r3=TI_FLAGS+IA64_TASK_SIZE,r2
+       mov ar.bspstore=r22                     // M2 (6 cyc) switch to kernel 
RBS
+       movl r8=PSR_ONE_BITS                    // X
        ;;
-       ld4 r3=[r3]                             // r2 = 
current_thread_info()->flags
-       mov r18=ar.bsp                  // save (kernel) ar.bsp (12 cyc)
-       mov ar.rsc=0x3                  // set eager mode, pl 0, little-endian, 
loadrs=0
-       br.call.sptk.many b7=ia64_syscall_setup
+       mov r25=ar.unat                         // M2 (5 cyc) save ar.unat
+       mov r19=b6                              // I0   save b6 (2 cyc)
+       mov r20=r1                              // A    save caller's gp in r20
        ;;
-       ssm psr.i
-       movl r2=ia64_ret_from_syscall
+       or r29=r8,r29                           // A    construct cr.ipsr value 
to save
+       mov b6=r18                              // I0   copy syscall 
entry-point to b6 (7 cyc)
+       addl r1=IA64_STK_OFFSET-IA64_PT_REGS_SIZE,r2 // A compute base of 
memory stack
+
+       mov r18=ar.bsp                          // M2   save (kernel) ar.bsp 
(12 cyc)
+       cmp.ne pKStk,pUStk=r0,r0                // A    set pKStk <- 0, pUStk 
<- 1
+       br.call.sptk.many b7=ia64_syscall_setup // B
        ;;
-       mov rp=r2                               // set the real return addr
-       and r3=_TIF_SYSCALL_TRACEAUDIT,r3
+       mov ar.rsc=0x3                          // M2   set eager mode, pl 0, 
LE, loadrs=0
+       mov rp=r14                              // I0   set the real return addr
+       and r3=_TIF_SYSCALL_TRACEAUDIT,r3       // A
        ;;
-       cmp.eq p8,p0=r3,r0
+       ssm psr.i                               // M2   we're on kernel stacks 
now, reenable irqs
+       cmp.eq p8,p0=r3,r0                      // A
+(p10)  br.cond.spnt.many ia64_ret_from_syscall // B    return if bad 
call-frame or r15 is a NaT
 
-(p10)  br.cond.spnt.many ia64_ret_from_syscall // p10==true means out 
registers are more than 8
-(p8)   br.call.sptk.many b6=b6         // ignore this return addr
-       br.cond.sptk ia64_trace_syscall
+       nop.m 0
+(p8)   br.call.sptk.many b6=b6                 // B    (ignore return address)
+       br.cond.spnt ia64_trace_syscall         // B
 END(fsys_bubble_down)
 
        .rodata
diff -urN linux/arch/ia64/kernel/gate.S linux/arch/ia64/kernel/gate.S
--- linux/arch/ia64/kernel/gate.S       2005/02/07 02:54:32     1.23
+++ linux/arch/ia64/kernel/gate.S       2005/07/12 09:19:02     1.24
@@ -72,38 +72,40 @@
         * bundle get executed.  The remaining code must be safe even if
         * they do not get executed.
         */
-       adds r17=-1024,r15
-       mov r10=0                               // default to successful 
syscall execution
-       epc
+       adds r17=-1024,r15                      // A
+       mov r10=0                               // A    default to successful 
syscall execution
+       epc                                     // B    causes split-issue
 }
        ;;
-       rsm psr.be // note: on McKinley "rsm psr.be/srlz.d" is slightly faster 
than "rum psr.be"
-       LOAD_FSYSCALL_TABLE(r14)
-
-       mov r16=IA64_KR(CURRENT)                // 12 cycle read latency
-       tnat.nz p10,p9=r15
-       mov r19=NR_syscalls-1
-       ;;
-       shladd r18=r17,3,r14
-
-       srlz.d
-       cmp.ne p8,p0=r0,r0                      // p8 <- FALSE
-       /* Note: if r17 is a NaT, p6 will be set to zero.  */
-       cmp.geu p6,p7=r19,r17                   // (syscall > 0 && syscall < 
1024+NR_syscalls)?
-       ;;
-(p6)   ld8 r18=[r18]
-       mov r21=ar.fpsr
-       add r14=-8,r14                          // r14 <- addr of 
fsys_bubble_down entry
+       rsm psr.be | psr.i                      // M2 (5 cyc to srlz.d)
+       LOAD_FSYSCALL_TABLE(r14)                // X
        ;;
-(p6)   mov b7=r18
-(p6)   tbit.z p8,p0=r18,0
-(p8)   br.dptk.many b7
+       mov r16=IA64_KR(CURRENT)                // M2 (12 cyc)
+       shladd r18=r17,3,r14                    // A
+       mov r19=NR_syscalls-1                   // A
+       ;;
+       lfetch [r18]                            // M0|1
+       mov r29=psr                             // M2 (12 cyc)
+       // If r17 is a NaT, p6 will be zero
+       cmp.geu p6,p7=r19,r17                   // A    (sysnr > 0 && sysnr < 
1024+NR_syscalls)?
+       ;;
+       mov r21=ar.fpsr                         // M2 (12 cyc)
+       tnat.nz p10,p9=r15                      // I0
+       mov.i r26=ar.pfs                        // I0 (would stall anyhow due 
to srlz.d...)
+       ;;
+       srlz.d                                  // M0 (forces split-issue) 
ensure PSR.BE==0
+(p6)   ld8 r18=[r18]                           // M0|1
+       nop.i 0
+       ;;
+       nop.m 0
+(p6)   tbit.z.unc p8,p0=r18,0                  // I0 (dual-issues with "mov 
b7=r18"!)
+       nop.i 0
+       ;;
+(p8)   ssm psr.i
+(p6)   mov b7=r18                              // I0
+(p8)   br.dptk.many b7                         // B
 
-(p6)   rsm psr.i
-       mov r27=ar.rsc
-       mov r26=ar.pfs
-       ;;
-       mov r29=psr                             // read psr (12 cyc load 
latency)
+       mov r27=ar.rsc                          // M2 (12 cyc)
 /*
  * brl.cond doesn't work as intended because the linker would convert this 
branch
  * into a branch to a PLT.  Perhaps there will be a way to avoid this with some
@@ -111,6 +113,8 @@
  * instead.
  */
 #ifdef CONFIG_ITANIUM
+(p6)   add r14=-8,r14                          // r14 <- addr of 
fsys_bubble_down entry
+       ;;
 (p6)   ld8 r14=[r14]                           // r14 <- fsys_bubble_down
        ;;
 (p6)   mov b7=r14
@@ -118,7 +122,7 @@
 #else
        BRL_COND_FSYS_BUBBLE_DOWN(p6)
 #endif
-
+       ssm psr.i
        mov r10=-1
 (p10)  mov r8=EINVAL
 (p9)   mov r8=ENOSYS
diff -urN linux/arch/ia64/kernel/ia64_ksyms.c 
linux/arch/ia64/kernel/ia64_ksyms.c
--- linux/arch/ia64/kernel/ia64_ksyms.c 2005/01/13 14:05:26     1.26
+++ linux/arch/ia64/kernel/ia64_ksyms.c 2005/07/12 09:19:02     1.27
@@ -58,9 +58,6 @@
 EXPORT_SYMBOL(__strncpy_from_user);
 EXPORT_SYMBOL(__strnlen_user);
 
-#include <asm/unistd.h>
-EXPORT_SYMBOL(__ia64_syscall);
-
 /* from arch/ia64/lib */
 extern void __divsi3(void);
 extern void __udivsi3(void);
diff -urN linux/arch/ia64/kernel/ivt.S linux/arch/ia64/kernel/ivt.S
--- linux/arch/ia64/kernel/ivt.S        2005/07/11 20:46:13     1.28
+++ linux/arch/ia64/kernel/ivt.S        2005/07/12 09:19:02     1.29
@@ -1,7 +1,7 @@
 /*
  * arch/ia64/kernel/ivt.S
  *
- * Copyright (C) 1998-2001, 2003 Hewlett-Packard Co
+ * Copyright (C) 1998-2001, 2003, 2005 Hewlett-Packard Co
  *     Stephane Eranian <eranian@hpl.hp.com>
  *     David Mosberger <davidm@hpl.hp.com>
  * Copyright (C) 2000, 2002-2003 Intel Co
@@ -692,82 +692,118 @@
         * to prevent leaking bits from kernel to user level.
         */
        DBG_FAULT(11)
-       mov r16=IA64_KR(CURRENT)                // r16 = current task; 12 cycle 
read lat.
-       mov r17=cr.iim
-       mov r18=__IA64_BREAK_SYSCALL
-       mov r21=ar.fpsr
-       mov r29=cr.ipsr
-       mov r19=b6
-       mov r25=ar.unat
-       mov r27=ar.rsc
-       mov r26=ar.pfs
-       mov r28=cr.iip
-       mov r31=pr                              // prepare to save predicates
-       mov r20=r1
-       ;;
+       mov.m r16=IA64_KR(CURRENT)              // M2 r16 <- current task (12 
cyc)
+       mov r29=cr.ipsr                         // M2 (12 cyc)
+       mov r31=pr                              // I0 (2 cyc)
+
+       mov r17=cr.iim                          // M2 (2 cyc)
+       mov.m r27=ar.rsc                        // M2 (12 cyc)
+       mov r18=__IA64_BREAK_SYSCALL            // A
+
+       mov.m ar.rsc=0                          // M2
+       mov.m r21=ar.fpsr                       // M2 (12 cyc)
+       mov r19=b6                              // I0 (2 cyc)
+       ;;
+       mov.m r23=ar.bspstore                   // M2 (12 cyc)
+       mov.m r24=ar.rnat                       // M2 (5 cyc)
+       mov.i r26=ar.pfs                        // I0 (2 cyc)
+
+       invala                                  // M0|1
+       nop.m 0                                 // M
+       mov r20=r1                              // A                    save r1
+
+       nop.m 0
+       movl r30=sys_call_table                 // X
+
+       mov r28=cr.iip                          // M2 (2 cyc)
+       cmp.eq p0,p7=r18,r17                    // I0 is this a system call?
+(p7)   br.cond.spnt non_syscall                // B  no ->
+       //
+       // From this point on, we are definitely on the syscall-path
+       // and we can use (non-banked) scratch registers.
+       //
+///////////////////////////////////////////////////////////////////////
+       mov r1=r16                              // A    move task-pointer to 
"addl"-addressable reg
+       mov r2=r16                              // A    setup r2 for 
ia64_syscall_setup
+       add r9=TI_FLAGS+IA64_TASK_SIZE,r16      // A    r9 = 
&current_thread_info()->flags
+
        adds r16=IA64_TASK_THREAD_ON_USTACK_OFFSET,r16
-       cmp.eq p0,p7=r18,r17                    // is this a system call? (p7 
<- false, if so)
-(p7)   br.cond.spnt non_syscall
+       adds r15=-1024,r15                      // A    subtract 1024 from 
syscall number
+       mov r3=NR_syscalls - 1
        ;;
-       ld1 r17=[r16]                           // load 
current->thread.on_ustack flag
-       st1 [r16]=r0                            // clear 
current->thread.on_ustack flag
-       add r1=-IA64_TASK_THREAD_ON_USTACK_OFFSET,r16   // set r1 for 
MINSTATE_START_SAVE_MIN_VIRT
+       ld1.bias r17=[r16]                      // M0|1 r17 = 
current->thread.on_ustack flag
+       ld4 r9=[r9]                             // M0|1 r9 = 
current_thread_info()->flags
+       extr.u r8=r29,41,2                      // I0   extract ei field from 
cr.ipsr
+
+       shladd r30=r15,3,r30                    // A    r30 = sys_call_table + 
8*(syscall-1024)
+       addl r22=IA64_RBS_OFFSET,r1             // A    compute base of RBS
+       cmp.leu p6,p7=r15,r3                    // A    syscall number in range?
        ;;
-       invala
 
-       /* adjust return address so we skip over the break instruction: */
+       lfetch.fault.excl.nt1 [r22]             // M0|1 prefetch RBS
+(p6)   ld8 r30=[r30]                           // M0|1 load address of syscall 
entry point
+       tnat.nz.or p7,p0=r15                    // I0   is syscall nr a NaT?
 
-       extr.u r8=r29,41,2                      // extract ei field from cr.ipsr
-       ;;
-       cmp.eq p6,p7=2,r8                       // isr.ei==2?
-       mov r2=r1                               // setup r2 for 
ia64_syscall_setup
-       ;;
-(p6)   mov r8=0                                // clear ei to 0
-(p6)   adds r28=16,r28                         // switch cr.iip to next bundle 
cr.ipsr.ei wrapped
-(p7)   adds r8=1,r8                            // increment ei to next slot
-       ;;
-       cmp.eq pKStk,pUStk=r0,r17               // are we in kernel mode 
already?
-       dep r29=r8,r29,41,2                     // insert new ei into cr.ipsr
+       mov.m ar.bspstore=r22                   // M2   switch to kernel RBS
+       cmp.eq p8,p9=2,r8                       // A    isr.ei==2?
        ;;
 
-       // switch from user to kernel RBS:
-       MINSTATE_START_SAVE_MIN_VIRT
-       br.call.sptk.many b7=ia64_syscall_setup
-       ;;
-       MINSTATE_END_SAVE_MIN_VIRT              // switch to bank 1
-       ssm psr.ic | PSR_DEFAULT_BITS
-       ;;
-       srlz.i                                  // guarantee that interruption 
collection is on
-       mov r3=NR_syscalls - 1
-       ;;
-(p15)  ssm psr.i                               // restore psr.i
-       // p10==true means out registers are more than 8 or r15's Nat is true
-(p10)  br.cond.spnt.many ia64_ret_from_syscall
-       ;;
-       movl r16=sys_call_table
+(p8)   mov r8=0                                // A    clear ei to 0
+(p7)   movl r30=sys_ni_syscall                 // X
 
-       adds r15=-1024,r15                      // r15 contains the syscall 
number---subtract 1024
-       movl r2=ia64_ret_from_syscall
-       ;;
-       shladd r20=r15,3,r16                    // r20 = sys_call_table + 
8*(syscall-1024)
-       cmp.leu p6,p7=r15,r3                    // (syscall > 0 && syscall < 
1024 + NR_syscalls) ?
-       mov rp=r2                               // set the real return addr
+(p8)   adds r28=16,r28                         // A    switch cr.iip to next 
bundle
+(p9)   adds r8=1,r8                            // A    increment ei to next 
slot
+       nop.i 0
        ;;
-(p6)   ld8 r20=[r20]                           // load address of syscall 
entry point
-(p7)   movl r20=sys_ni_syscall
 
-       add r2=TI_FLAGS+IA64_TASK_SIZE,r13
-       ;;
-       ld4 r2=[r2]                             // r2 = 
current_thread_info()->flags
-       ;;
-       and r2=_TIF_SYSCALL_TRACEAUDIT,r2       // mask trace or audit
+       mov.m r25=ar.unat                       // M2 (5 cyc)
+       dep r29=r8,r29,41,2                     // I0   insert new ei into 
cr.ipsr
+       adds r15=1024,r15                       // A    restore original 
syscall number
+       //
+       // If any of the above loads miss in L1D, we'll stall here until
+       // the data arrives.
+       //
+///////////////////////////////////////////////////////////////////////
+       st1 [r16]=r0                            // M2|3 clear 
current->thread.on_ustack flag
+       mov b6=r30                              // I0   setup syscall handler 
branch reg early
+       cmp.eq pKStk,pUStk=r0,r17               // A    were we on kernel 
stacks already?
+
+       and r9=_TIF_SYSCALL_TRACEAUDIT,r9       // A    mask trace or audit
+       mov r18=ar.bsp                          // M2 (12 cyc)
+(pKStk)        br.cond.spnt .break_fixup               // B    we're already 
in kernel-mode -- fix up RBS
+       ;;
+.back_from_break_fixup:
+(pUStk)        addl r1=IA64_STK_OFFSET-IA64_PT_REGS_SIZE,r1 // A    compute 
base of memory stack
+       cmp.eq p14,p0=r9,r0                     // A    are syscalls being 
traced/audited?
+       br.call.sptk.many b7=ia64_syscall_setup // B
+1:
+       mov ar.rsc=0x3                          // M2   set eager mode, pl 0, 
LE, loadrs=0
+       nop 0
+       bsw.1                                   // B (6 cyc) regs are saved, 
switch to bank 1
        ;;
-       cmp.eq p8,p0=r2,r0
-       mov b6=r20
+
+       ssm psr.ic | PSR_DEFAULT_BITS           // M2   now it's safe to 
re-enable intr.-collection
+       movl r3=ia64_ret_from_syscall           // X
        ;;
-(p8)   br.call.sptk.many b6=b6                 // ignore this return addr
-       br.cond.sptk ia64_trace_syscall
+
+       srlz.i                                  // M0   ensure interruption 
collection is on
+       mov rp=r3                               // I0   set the real return addr
+(p10)  br.cond.spnt.many ia64_ret_from_syscall // B    return if bad 
call-frame or r15 is a NaT
+
+(p15)  ssm psr.i                               // M2   restore psr.i
+(p14)  br.call.sptk.many b6=b6                 // B    invoke syscall-handker 
(ignore return addr)
+       br.cond.spnt.many ia64_trace_syscall    // B    do syscall-tracing 
thingamagic
        // NOT REACHED
+///////////////////////////////////////////////////////////////////////
+       // On entry, we optimistically assumed that we're coming from 
user-space.
+       // For the rare cases where a system-call is done from within the 
kernel,
+       // we fix things up at this point:
+.break_fixup:
+       add r1=-IA64_PT_REGS_SIZE,sp            // A    allocate space for 
pt_regs structure
+       mov ar.rnat=r24                         // M2   restore kernel's AR.RNAT
+       ;;
+       mov ar.bspstore=r23                     // M2   restore kernel's 
AR.BSPSTORE
+       br.cond.sptk .back_from_break_fixup
 END(break_fault)
 
        .org ia64_ivt+0x3000
@@ -842,8 +878,6 @@
         *      - r31: saved pr
         *      -  b0: original contents (to be saved)
         * On exit:
-        *      - executing on bank 1 registers
-        *      - psr.ic enabled, interrupts restored
         *      -  p10: TRUE if syscall is invoked with more than 8 out
         *              registers or r15's Nat is true
         *      -  r1: kernel's gp
@@ -851,8 +885,11 @@
         *      -  r8: -EINVAL if p10 is true
         *      - r12: points to kernel stack
         *      - r13: points to current task
+        *      - r14: preserved (same as on entry)
+        *      - p13: preserved
         *      - p15: TRUE if interrupts need to be re-enabled
         *      - ar.fpsr: set to kernel settings
+        *      -  b6: preserved (same as on entry)
         */
 GLOBAL_ENTRY(ia64_syscall_setup)
 #if PT(B6) != 0
@@ -920,10 +957,10 @@
 (p13)  mov in5=-1
        ;;
        st8 [r16]=r21,PT(R8)-PT(AR_FPSR)        // save ar.fpsr
-       tnat.nz p14,p0=in6
+       tnat.nz p13,p0=in6
        cmp.lt p10,p9=r11,r8    // frame size can't be more than local+8
        ;;
-       stf8 [r16]=f1           // ensure pt_regs.r8 != 0 (see 
handle_syscall_error)
+       mov r8=1
 (p9)   tnat.nz p10,p0=r15
        adds r12=-16,r1         // switch to kernel memory stack (with 16 bytes 
of scratch)
 
@@ -934,9 +971,9 @@
        mov r13=r2                              // establish `current'
        movl r1=__gp                            // establish kernel global 
pointer
        ;;
-(p14)  mov in6=-1
+       st8 [r16]=r8            // ensure pt_regs.r8 != 0 (see 
handle_syscall_error)
+(p13)  mov in6=-1
 (p8)   mov in7=-1
-       nop.i 0
 
        cmp.eq pSys,pNonSys=r0,r0               // set pSys=1, pNonSys=0
        movl r17=FPSR_DEFAULT
@@ -1007,6 +1044,8 @@
        FAULT(17)
 
 ENTRY(non_syscall)
+       mov ar.rsc=r27                  // restore ar.rsc before 
SAVE_MIN_WITH_COVER
+       ;;
        SAVE_MIN_WITH_COVER
 
        // There is no particular reason for this code to be here, other than 
that
@@ -1204,6 +1243,25 @@
 // 0x5600 Entry 26 (size 16 bundles) Nat Consumption (11,23,37,50)
 ENTRY(nat_consumption)
        DBG_FAULT(26)
+
+       mov r16=cr.ipsr
+       mov r17=cr.isr
+       mov r31=pr                              // save PR
+       ;;
+       and r18=0xf,r17                         // r18 = cr.ipsr.code{3:0}
+       tbit.z p6,p0=r17,IA64_ISR_NA_BIT
+       ;;
+       cmp.ne.or p6,p0=IA64_ISR_CODE_LFETCH,r18
+       dep r16=-1,r16,IA64_PSR_ED_BIT,1
+(p6)   br.cond.spnt 1f         // branch if (cr.ispr.na == 0 || 
cr.ipsr.code{3:0} != LFETCH)
+       ;;
+       mov cr.ipsr=r16         // set cr.ipsr.na
+       mov pr=r31,-1
+       ;;
+       rfi
+
+1:     mov pr=r31,-1
+       ;;
        FAULT(26)
 END(nat_consumption)
 
diff -urN linux/arch/ia64/kernel/kprobes.c linux/arch/ia64/kernel/kprobes.c
--- linux/arch/ia64/kernel/kprobes.c    2005/07/11 20:46:13     1.1
+++ linux/arch/ia64/kernel/kprobes.c    2005/07/12 09:19:02     1.2
@@ -713,7 +713,7 @@
        .pre_handler = trampoline_probe_handler
 };
 
-int __init arch_init(void)
+int __init arch_init_kprobes(void)
 {
        trampoline_p.addr =
                (kprobe_opcode_t *)((struct fnptr *)kretprobe_trampoline)->ip;
diff -urN linux/arch/ia64/kernel/ptrace.c linux/arch/ia64/kernel/ptrace.c
--- linux/arch/ia64/kernel/ptrace.c     2005/07/11 20:46:13     1.40
+++ linux/arch/ia64/kernel/ptrace.c     2005/07/12 09:19:02     1.41
@@ -725,12 +725,32 @@
                        break;
        }
 
+       /*
+        * Note: at the time of this call, the target task is blocked
+        * in notify_resume_user() and by clearling PRED_LEAVE_SYSCALL
+        * (aka, "pLvSys") we redirect execution from
+        * .work_pending_syscall_end to .work_processed_kernel.
+        */
        unw_get_pr(&prev_info, &pr);
-       pr &= ~(1UL << PRED_SYSCALL);
+       pr &= ~((1UL << PRED_SYSCALL) | (1UL << PRED_LEAVE_SYSCALL));
        pr |=  (1UL << PRED_NON_SYSCALL);
        unw_set_pr(&prev_info, pr);
 
        pt->cr_ifs = (1UL << 63) | cfm;
+       /*
+        * Clear the memory that is NOT written on syscall-entry to
+        * ensure we do not leak kernel-state to user when execution
+        * resumes.
+        */
+       pt->r2 = 0;
+       pt->r3 = 0;
+       pt->r14 = 0;
+       memset(&pt->r16, 0, 16*8);      /* clear r16-r31 */
+       memset(&pt->f6, 0, 6*16);       /* clear f6-f11 */
+       pt->b7 = 0;
+       pt->ar_ccv = 0;
+       pt->ar_csd = 0;
+       pt->ar_ssd = 0;
 }
 
 static int
diff -urN linux/arch/ia64/kernel/setup.c linux/arch/ia64/kernel/setup.c
--- linux/arch/ia64/kernel/setup.c      2005/06/18 14:42:39     1.50
+++ linux/arch/ia64/kernel/setup.c      2005/07/12 09:19:02     1.51
@@ -72,6 +72,8 @@
 unsigned long ia64_cycles_per_usec;
 struct ia64_boot_param *ia64_boot_param;
 struct screen_info screen_info;
+unsigned long vga_console_iobase;
+unsigned long vga_console_membase;
 
 unsigned long ia64_max_cacheline_size;
 unsigned long ia64_iobase;     /* virtual address for I/O accesses */
@@ -273,23 +275,25 @@
 static inline int __init
 early_console_setup (char *cmdline)
 {
+       int earlycons = 0;
+
 #ifdef CONFIG_SERIAL_SGI_L1_CONSOLE
        {
                extern int sn_serial_console_early_setup(void);
                if (!sn_serial_console_early_setup())
-                       return 0;
+                       earlycons++;
        }
 #endif
 #ifdef CONFIG_EFI_PCDP
        if (!efi_setup_pcdp_console(cmdline))
-               return 0;
+               earlycons++;
 #endif
 #ifdef CONFIG_SERIAL_8250_CONSOLE
        if (!early_serial_console_init(cmdline))
-               return 0;
+               earlycons++;
 #endif
 
-       return -1;
+       return (earlycons) ? 0 : -1;
 }
 
 static inline void
diff -urN linux/arch/ia64/kernel/smp.c linux/arch/ia64/kernel/smp.c
--- linux/arch/ia64/kernel/smp.c        2005/07/11 20:46:13     1.38
+++ linux/arch/ia64/kernel/smp.c        2005/07/12 09:19:02     1.39
@@ -231,13 +231,16 @@
 void
 smp_flush_tlb_mm (struct mm_struct *mm)
 {
+       preempt_disable();
        /* this happens for the common case of a single-threaded fork():  */
        if (likely(mm == current->active_mm && atomic_read(&mm->mm_users) == 1))
        {
                local_finish_flush_tlb_mm(mm);
+               preempt_enable();
                return;
        }
 
+       preempt_enable();
        /*
         * We could optimize this further by using mm->cpu_vm_mask to track 
which CPUs
         * have been running in the address space.  It's not clear that this is 
worth the
diff -urN linux/arch/ia64/sn/kernel/io_init.c 
linux/arch/ia64/sn/kernel/io_init.c
--- linux/arch/ia64/sn/kernel/io_init.c 2005/05/19 12:08:10     1.5
+++ linux/arch/ia64/sn/kernel/io_init.c 2005/07/12 09:19:03     1.6
@@ -384,7 +384,7 @@
        extern void register_sn_procfs(void);
 #endif
 
-       if (!ia64_platform_is("sn2") || IS_RUNNING_ON_SIMULATOR())
+       if (!ia64_platform_is("sn2") || IS_RUNNING_ON_FAKE_PROM())
                return 0;
 
        /*
diff -urN linux/arch/ia64/sn/kernel/iomv.c linux/arch/ia64/sn/kernel/iomv.c
--- linux/arch/ia64/sn/kernel/iomv.c    2005/01/25 04:27:58     1.6
+++ linux/arch/ia64/sn/kernel/iomv.c    2005/07/12 09:19:03     1.7
@@ -9,12 +9,16 @@
 #include <linux/module.h>
 #include <asm/io.h>
 #include <asm/delay.h>
+#include <asm/vga.h>
 #include <asm/sn/nodepda.h>
 #include <asm/sn/simulator.h>
 #include <asm/sn/pda.h>
 #include <asm/sn/sn_cpuid.h>
 #include <asm/sn/shub_mmr.h>
 
+#define IS_LEGACY_VGA_IOPORT(p) \
+       (((p) >= 0x3b0 && (p) <= 0x3bb) || ((p) >= 0x3c0 && (p) <= 0x3df))
+
 /**
  * sn_io_addr - convert an in/out port to an i/o address
  * @port: port to convert
@@ -26,6 +30,8 @@
 void *sn_io_addr(unsigned long port)
 {
        if (!IS_RUNNING_ON_SIMULATOR()) {
+               if (IS_LEGACY_VGA_IOPORT(port))
+                       port += vga_console_iobase;
                /* On sn2, legacy I/O ports don't point at anything */
                if (port < (64 * 1024))
                        return NULL;
diff -urN linux/arch/ia64/sn/kernel/setup.c linux/arch/ia64/sn/kernel/setup.c
--- linux/arch/ia64/sn/kernel/setup.c   2005/06/18 14:42:40     1.34
+++ linux/arch/ia64/sn/kernel/setup.c   2005/07/12 09:19:03     1.35
@@ -36,6 +36,7 @@
 #include <asm/machvec.h>
 #include <asm/system.h>
 #include <asm/processor.h>
+#include <asm/vga.h>
 #include <asm/sn/arch.h>
 #include <asm/sn/addrs.h>
 #include <asm/sn/pda.h>
@@ -95,6 +96,7 @@
 EXPORT_SYMBOL(sn_coherency_id);
 u8 sn_region_size;
 EXPORT_SYMBOL(sn_region_size);
+int sn_prom_type;      /* 0=hardware, 1=medusa/realprom, 2=medusa/fakeprom */
 
 short physical_node_map[MAX_PHYSNODE_ID];
 
@@ -273,14 +275,17 @@
 
        ia64_sn_plat_set_error_handling_features();
 
+#if defined(CONFIG_VT) && defined(CONFIG_VGA_CONSOLE)
        /*
-        * If the generic code has enabled vga console support - lets
-        * get rid of it again. This is a kludge for the fact that ACPI
-        * currtently has no way of informing us if legacy VGA is available
-        * or not.
+        * If there was a primary vga adapter identified through the
+        * EFI PCDP table, make it the preferred console.  Otherwise
+        * zero out conswitchp.
         */
-#if defined(CONFIG_VT) && defined(CONFIG_VGA_CONSOLE)
-       if (conswitchp == &vga_con) {
+
+       if (vga_console_membase) {
+               /* usable vga ... make tty0 the preferred default console */
+               add_preferred_console("tty", 0, NULL);
+       } else {
                printk(KERN_DEBUG "SGI: Disabling VGA console\n");
 #ifdef CONFIG_DUMMY_CONSOLE
                conswitchp = &dummy_con;
@@ -350,7 +355,7 @@
 
        ia64_mark_idle = &snidle;
 
-       /* 
+       /*
         * For the bootcpu, we do this here. All other cpus will make the
         * call as part of cpu_init in slave cpu initialization.
         */
@@ -397,7 +402,7 @@
                nodepdaindr[cnode] =
                    alloc_bootmem_node(NODE_DATA(cnode), sizeof(nodepda_t));
                memset(nodepdaindr[cnode], 0, sizeof(nodepda_t));
-               memset(nodepdaindr[cnode]->phys_cpuid, -1, 
+               memset(nodepdaindr[cnode]->phys_cpuid, -1,
                    sizeof(nodepdaindr[cnode]->phys_cpuid));
        }
 
@@ -427,7 +432,7 @@
        }
 
        /*
-        * Initialize the per node hubdev.  This includes IO Nodes and 
+        * Initialize the per node hubdev.  This includes IO Nodes and
         * headless/memless nodes.
         */
        for (cnode = 0; cnode < numionodes; cnode++) {
@@ -455,6 +460,14 @@
        int i;
        static int wars_have_been_checked;
 
+       if (smp_processor_id() == 0 && IS_MEDUSA()) {
+               if (ia64_sn_is_fake_prom())
+                       sn_prom_type = 2;
+               else
+                       sn_prom_type = 1;
+               printk("Running on medusa with %s PROM\n", (sn_prom_type == 1) 
? "real" : "fake");
+       }
+
        memset(pda, 0, sizeof(pda));
        if (ia64_sn_get_sn_info(0, &sn_hub_info->shub2, 
&sn_hub_info->nasid_bitmask, &sn_hub_info->nasid_shift,
                                &sn_system_size, &sn_sharing_domain_size, 
&sn_partition_id,
@@ -520,7 +533,7 @@
         */
        {
                u64 pio1[] = {SH1_PIO_WRITE_STATUS_0, 0, 
SH1_PIO_WRITE_STATUS_1, 0};
-               u64 pio2[] = {SH2_PIO_WRITE_STATUS_0, SH2_PIO_WRITE_STATUS_1, 
+               u64 pio2[] = {SH2_PIO_WRITE_STATUS_0, SH2_PIO_WRITE_STATUS_1,
                        SH2_PIO_WRITE_STATUS_2, SH2_PIO_WRITE_STATUS_3};
                u64 *pio;
                pio = is_shub1() ? pio1 : pio2;
@@ -552,6 +565,10 @@
        int nasid = 0;
        lboard_t *brd;
 
+       /* fakeprom does not support klgraph */
+       if (IS_RUNNING_ON_FAKE_PROM())
+               return;
+
        /* Setup ionodes with memory */
        for (nasid = 0; nasid < MAX_PHYSNODE_ID; nasid += 2) {
                char *klgraph_header;
@@ -563,8 +580,6 @@
                cnodeid = -1;
                klgraph_header = __va(ia64_sn_get_klconfig_addr(nasid));
                if (!klgraph_header) {
-                       if (IS_RUNNING_ON_SIMULATOR())
-                               continue;
                        BUG();  /* All nodes must have klconfig tables! */
                }
                cnodeid = nasid_to_cnodeid(nasid);
@@ -630,8 +645,8 @@
 nasid_slice_to_cpuid(int nasid, int slice)
 {
        long cpu;
-       
-       for (cpu=0; cpu < NR_CPUS; cpu++) 
+
+       for (cpu=0; cpu < NR_CPUS; cpu++)
                if (cpuid_to_nasid(cpu) == nasid &&
                                        cpuid_to_slice(cpu) == slice)
                        return cpu;
diff -urN linux/arch/ia64/sn/kernel/tiocx.c linux/arch/ia64/sn/kernel/tiocx.c
--- linux/arch/ia64/sn/kernel/tiocx.c   2005/07/11 20:46:14     1.2
+++ linux/arch/ia64/sn/kernel/tiocx.c   2005/07/12 09:19:03     1.3
@@ -204,8 +204,8 @@
        cx_dev->dev.parent = NULL;
        cx_dev->dev.bus = &tiocx_bus_type;
        cx_dev->dev.release = tiocx_bus_release;
-       snprintf(cx_dev->dev.bus_id, BUS_ID_SIZE, "%d.0x%x",
-                cx_dev->cx_id.nasid, cx_dev->cx_id.part_num);
+       snprintf(cx_dev->dev.bus_id, BUS_ID_SIZE, "%d",
+                cx_dev->cx_id.nasid);
        device_register(&cx_dev->dev);
        get_device(&cx_dev->dev);
 
@@ -236,7 +236,6 @@
  */
 static int cx_device_reload(struct cx_dev *cx_dev)
 {
-       device_remove_file(&cx_dev->dev, &dev_attr_cxdev_control);
        cx_device_unregister(cx_dev);
        return cx_device_register(cx_dev->cx_id.nasid, cx_dev->cx_id.part_num,
                                  cx_dev->cx_id.mfg_num, cx_dev->hubdev);
@@ -383,6 +382,7 @@
        switch (tiocx_btchar_get(nasid)) {
        case L1_BRICKTYPE_SA:
        case L1_BRICKTYPE_ATHENA:
+       case L1_BRICKTYPE_DAYTONA:
                return 1;
        }
        return 0;
@@ -409,7 +409,7 @@
                uint64_t cx_id;
 
                cx_id =
-                   *(volatile int32_t *)(TIO_SWIN_BASE(nasid, TIOCX_CORELET) +
+                   *(volatile uint64_t *)(TIO_SWIN_BASE(nasid, TIOCX_CORELET) +
                                          WIDGET_ID);
                part_num = XWIDGET_PART_NUM(cx_id);
                mfg_num = XWIDGET_MFG_NUM(cx_id);
@@ -458,6 +458,10 @@
 
        switch (n) {
        case 1:
+               tio_corelet_reset(cx_dev->cx_id.nasid, TIOCX_CORELET);
+               tiocx_reload(cx_dev);
+               break;
+       case 2:
                tiocx_reload(cx_dev);
                break;
        case 3:
@@ -537,7 +541,7 @@
        bus_unregister(&tiocx_bus_type);
 }
 
-module_init(tiocx_init);
+subsys_initcall(tiocx_init);
 module_exit(tiocx_exit);
 
 /************************************************************************
diff -urN linux/arch/ia64/sn/kernel/sn2/ptc_deadlock.S 
linux/arch/ia64/sn/kernel/sn2/ptc_deadlock.S
--- linux/arch/ia64/sn/kernel/sn2/ptc_deadlock.S        2005/01/25 04:27:58     
1.3
+++ linux/arch/ia64/sn/kernel/sn2/ptc_deadlock.S        2005/07/12 09:19:03     
1.4
@@ -6,6 +6,7 @@
  * Copyright (C) 2000-2004 Silicon Graphics, Inc. All rights reserved.
  */
 
+#include <asm/types.h>
 #include <asm/sn/shub_mmr.h>
 
 #define DEADLOCKBIT    SH_PIO_WRITE_STATUS_WRITE_DEADLOCK_SHFT
diff -urN linux/arch/ia64/sn/pci/tioca_provider.c 
linux/arch/ia64/sn/pci/tioca_provider.c
--- linux/arch/ia64/sn/pci/tioca_provider.c     2005/05/19 12:08:11     1.1
+++ linux/arch/ia64/sn/pci/tioca_provider.c     2005/07/12 09:19:03     1.2
@@ -336,7 +336,7 @@
        if (!ct_addr)
                return 0;
 
-       bus_addr = (dma_addr_t) (ct_addr & 0xffffffffffff);
+       bus_addr = (dma_addr_t) (ct_addr & 0xffffffffffffUL);
        node_upper = ct_addr >> 48;
 
        if (node_upper > 64) {
@@ -464,7 +464,7 @@
  * For mappings created using the direct modes (64 or 48) there are no
  * resources to release.
  */
-void
+static void
 tioca_dma_unmap(struct pci_dev *pdev, dma_addr_t bus_addr, int dir)
 {
        int i, entry;
@@ -514,7 +514,7 @@
  * The mapping mode used is based on the devices dma_mask.  As a last resort
  * use the GART mapped mode.
  */
-uint64_t
+static uint64_t
 tioca_dma_map(struct pci_dev *pdev, uint64_t paddr, size_t byte_count)
 {
        uint64_t mapaddr;
@@ -580,7 +580,7 @@
  * On successful setup, returns the kernel version of tioca_common back to
  * the caller.
  */
-void *
+static void *
 tioca_bus_fixup(struct pcibus_bussoft *prom_bussoft)
 {
        struct tioca_common *tioca_common;
diff -urN linux/arch/mips/defconfig linux/arch/mips/defconfig
--- linux/arch/mips/defconfig   2005/07/11 20:46:26     1.296
+++ linux/arch/mips/defconfig   2005/07/12 09:19:03     1.297
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.13-rc1
-# Mon Jul 11 20:25:29 2005
+# Linux kernel version: 2.6.13-rc2
+# Tue Jul 12 08:46:10 2005
 #
 CONFIG_MIPS=y
 
diff -urN linux/arch/mips/configs/atlas_defconfig 
linux/arch/mips/configs/atlas_defconfig
--- linux/arch/mips/configs/atlas_defconfig     2005/07/11 20:46:26     1.60
+++ linux/arch/mips/configs/atlas_defconfig     2005/07/12 09:19:03     1.61
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.13-rc1
-# Mon Jul 11 20:25:30 2005
+# Linux kernel version: 2.6.13-rc2
+# Tue Jul 12 08:46:11 2005
 #
 CONFIG_MIPS=y
 
diff -urN linux/arch/mips/configs/capcella_defconfig 
linux/arch/mips/configs/capcella_defconfig
--- linux/arch/mips/configs/capcella_defconfig  2005/07/11 20:46:26     1.60
+++ linux/arch/mips/configs/capcella_defconfig  2005/07/12 09:19:03     1.61
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.13-rc1
-# Mon Jul 11 20:25:30 2005
+# Linux kernel version: 2.6.13-rc2
+# Tue Jul 12 08:46:12 2005
 #
 CONFIG_MIPS=y
 
diff -urN linux/arch/mips/configs/cobalt_defconfig 
linux/arch/mips/configs/cobalt_defconfig
--- linux/arch/mips/configs/cobalt_defconfig    2005/07/11 20:46:26     1.57
+++ linux/arch/mips/configs/cobalt_defconfig    2005/07/12 09:19:03     1.58
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.13-rc1
-# Mon Jul 11 20:25:31 2005
+# Linux kernel version: 2.6.13-rc2
+# Tue Jul 12 08:46:13 2005
 #
 CONFIG_MIPS=y
 
diff -urN linux/arch/mips/configs/db1000_defconfig 
linux/arch/mips/configs/db1000_defconfig
--- linux/arch/mips/configs/db1000_defconfig    2005/07/11 20:46:26     1.63
+++ linux/arch/mips/configs/db1000_defconfig    2005/07/12 09:19:03     1.64
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.13-rc1
-# Mon Jul 11 20:25:31 2005
+# Linux kernel version: 2.6.13-rc2
+# Tue Jul 12 08:46:14 2005
 #
 CONFIG_MIPS=y
 
diff -urN linux/arch/mips/configs/db1100_defconfig 
linux/arch/mips/configs/db1100_defconfig
--- linux/arch/mips/configs/db1100_defconfig    2005/07/11 20:46:26     1.62
+++ linux/arch/mips/configs/db1100_defconfig    2005/07/12 09:19:03     1.63
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.13-rc1
-# Mon Jul 11 20:25:32 2005
+# Linux kernel version: 2.6.13-rc2
+# Tue Jul 12 08:46:15 2005
 #
 CONFIG_MIPS=y
 
diff -urN linux/arch/mips/configs/db1500_defconfig 
linux/arch/mips/configs/db1500_defconfig
--- linux/arch/mips/configs/db1500_defconfig    2005/07/11 20:46:26     1.65
+++ linux/arch/mips/configs/db1500_defconfig    2005/07/12 09:19:03     1.66
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.13-rc1
-# Mon Jul 11 20:25:33 2005
+# Linux kernel version: 2.6.13-rc2
+# Tue Jul 12 08:46:16 2005
 #
 CONFIG_MIPS=y
 
diff -urN linux/arch/mips/configs/db1550_defconfig 
linux/arch/mips/configs/db1550_defconfig
--- linux/arch/mips/configs/db1550_defconfig    2005/07/11 20:46:26     1.40
+++ linux/arch/mips/configs/db1550_defconfig    2005/07/12 09:19:03     1.41
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.13-rc1
-# Mon Jul 11 20:25:33 2005
+# Linux kernel version: 2.6.13-rc2
+# Tue Jul 12 08:46:17 2005
 #
 CONFIG_MIPS=y
 
diff -urN linux/arch/mips/configs/ddb5476_defconfig 
linux/arch/mips/configs/ddb5476_defconfig
--- linux/arch/mips/configs/ddb5476_defconfig   2005/07/11 20:46:26     1.57
+++ linux/arch/mips/configs/ddb5476_defconfig   2005/07/12 09:19:03     1.58
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.13-rc1
-# Mon Jul 11 20:25:34 2005
+# Linux kernel version: 2.6.13-rc2
+# Tue Jul 12 08:46:18 2005
 #
 CONFIG_MIPS=y
 
diff -urN linux/arch/mips/configs/ddb5477_defconfig 
linux/arch/mips/configs/ddb5477_defconfig
--- linux/arch/mips/configs/ddb5477_defconfig   2005/07/11 20:46:26     1.57
+++ linux/arch/mips/configs/ddb5477_defconfig   2005/07/12 09:19:03     1.58
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.13-rc1
-# Mon Jul 11 20:25:34 2005
+# Linux kernel version: 2.6.13-rc2
+# Tue Jul 12 08:46:19 2005
 #
 CONFIG_MIPS=y
 
diff -urN linux/arch/mips/configs/decstation_defconfig 
linux/arch/mips/configs/decstation_defconfig
--- linux/arch/mips/configs/decstation_defconfig        2005/07/11 20:46:26     
1.68
+++ linux/arch/mips/configs/decstation_defconfig        2005/07/12 09:19:03     
1.69
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.13-rc1
-# Mon Jul 11 20:25:35 2005
+# Linux kernel version: 2.6.13-rc2
+# Tue Jul 12 08:46:20 2005
 #
 CONFIG_MIPS=y
 
diff -urN linux/arch/mips/configs/e55_defconfig 
linux/arch/mips/configs/e55_defconfig
--- linux/arch/mips/configs/e55_defconfig       2005/07/11 20:46:26     1.60
+++ linux/arch/mips/configs/e55_defconfig       2005/07/12 09:19:03     1.61
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.13-rc1
-# Mon Jul 11 20:25:35 2005
+# Linux kernel version: 2.6.13-rc2
+# Tue Jul 12 08:46:21 2005
 #
 CONFIG_MIPS=y
 
diff -urN linux/arch/mips/configs/ev64120_defconfig 
linux/arch/mips/configs/ev64120_defconfig
--- linux/arch/mips/configs/ev64120_defconfig   2005/07/11 20:46:26     1.56
+++ linux/arch/mips/configs/ev64120_defconfig   2005/07/12 09:19:03     1.57
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.13-rc1
-# Mon Jul 11 20:25:36 2005
+# Linux kernel version: 2.6.13-rc2
+# Tue Jul 12 08:46:22 2005
 #
 CONFIG_MIPS=y
 
diff -urN linux/arch/mips/configs/ev96100_defconfig 
linux/arch/mips/configs/ev96100_defconfig
--- linux/arch/mips/configs/ev96100_defconfig   2005/07/11 20:46:26     1.57
+++ linux/arch/mips/configs/ev96100_defconfig   2005/07/12 09:19:03     1.58
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.13-rc1
-# Mon Jul 11 20:25:36 2005
+# Linux kernel version: 2.6.13-rc2
+# Tue Jul 12 08:46:23 2005
 #
 CONFIG_MIPS=y
 
diff -urN linux/arch/mips/configs/ip22_defconfig 
linux/arch/mips/configs/ip22_defconfig
--- linux/arch/mips/configs/ip22_defconfig      2005/07/11 20:46:26     1.66
+++ linux/arch/mips/configs/ip22_defconfig      2005/07/12 09:19:03     1.67
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.13-rc1
-# Mon Jul 11 20:25:37 2005
+# Linux kernel version: 2.6.13-rc2
+# Tue Jul 12 08:46:24 2005
 #
 CONFIG_MIPS=y
 
diff -urN linux/arch/mips/configs/ip27_defconfig 
linux/arch/mips/configs/ip27_defconfig
--- linux/arch/mips/configs/ip27_defconfig      2005/07/11 20:46:26     1.70
+++ linux/arch/mips/configs/ip27_defconfig      2005/07/12 09:19:03     1.71
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.13-rc1
-# Mon Jul 11 20:25:37 2005
+# Linux kernel version: 2.6.13-rc2
+# Tue Jul 12 08:46:25 2005
 #
 CONFIG_MIPS=y
 
diff -urN linux/arch/mips/configs/ip32_defconfig 
linux/arch/mips/configs/ip32_defconfig
--- linux/arch/mips/configs/ip32_defconfig      2005/07/11 20:46:26     1.60
+++ linux/arch/mips/configs/ip32_defconfig      2005/07/12 09:19:03     1.61
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.13-rc1
-# Mon Jul 11 20:25:38 2005
+# Linux kernel version: 2.6.13-rc2
+# Tue Jul 12 08:46:25 2005
 #
 CONFIG_MIPS=y
 
diff -urN linux/arch/mips/configs/it8172_defconfig 
linux/arch/mips/configs/it8172_defconfig
--- linux/arch/mips/configs/it8172_defconfig    2005/07/11 20:46:26     1.56
+++ linux/arch/mips/configs/it8172_defconfig    2005/07/12 09:19:03     1.57
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.13-rc1
-# Mon Jul 11 20:25:38 2005
+# Linux kernel version: 2.6.13-rc2
+# Tue Jul 12 08:46:26 2005
 #
 CONFIG_MIPS=y
 
diff -urN linux/arch/mips/configs/ivr_defconfig 
linux/arch/mips/configs/ivr_defconfig
--- linux/arch/mips/configs/ivr_defconfig       2005/07/11 20:46:26     1.56
+++ linux/arch/mips/configs/ivr_defconfig       2005/07/12 09:19:03     1.57
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.13-rc1
-# Mon Jul 11 20:25:39 2005
+# Linux kernel version: 2.6.13-rc2
+# Tue Jul 12 08:46:26 2005
 #
 CONFIG_MIPS=y
 
diff -urN linux/arch/mips/configs/jaguar-atx_defconfig 
linux/arch/mips/configs/jaguar-atx_defconfig
--- linux/arch/mips/configs/jaguar-atx_defconfig        2005/07/11 20:46:26     
1.61
+++ linux/arch/mips/configs/jaguar-atx_defconfig        2005/07/12 09:19:03     
1.62
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.13-rc1
-# Mon Jul 11 20:25:40 2005
+# Linux kernel version: 2.6.13-rc2
+# Tue Jul 12 08:46:27 2005
 #
 CONFIG_MIPS=y
 
diff -urN linux/arch/mips/configs/jmr3927_defconfig 
linux/arch/mips/configs/jmr3927_defconfig
--- linux/arch/mips/configs/jmr3927_defconfig   2005/07/11 20:46:26     1.57
+++ linux/arch/mips/configs/jmr3927_defconfig   2005/07/12 09:19:03     1.58
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.13-rc1
-# Mon Jul 11 20:25:40 2005
+# Linux kernel version: 2.6.13-rc2
+# Tue Jul 12 08:46:28 2005
 #
 CONFIG_MIPS=y
 
diff -urN linux/arch/mips/configs/lasat200_defconfig 
linux/arch/mips/configs/lasat200_defconfig
--- linux/arch/mips/configs/lasat200_defconfig  2005/07/11 20:46:26     1.57
+++ linux/arch/mips/configs/lasat200_defconfig  2005/07/12 09:19:03     1.58
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.13-rc1
-# Mon Jul 11 20:25:41 2005
+# Linux kernel version: 2.6.13-rc2
+# Tue Jul 12 08:46:29 2005
 #
 CONFIG_MIPS=y
 
diff -urN linux/arch/mips/configs/malta_defconfig 
linux/arch/mips/configs/malta_defconfig
--- linux/arch/mips/configs/malta_defconfig     2005/07/11 20:46:26     1.59
+++ linux/arch/mips/configs/malta_defconfig     2005/07/12 09:19:03     1.60
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.13-rc1
-# Mon Jul 11 20:25:41 2005
+# Linux kernel version: 2.6.13-rc2
+# Tue Jul 12 08:46:30 2005
 #
 CONFIG_MIPS=y
 
diff -urN linux/arch/mips/configs/mpc30x_defconfig 
linux/arch/mips/configs/mpc30x_defconfig
--- linux/arch/mips/configs/mpc30x_defconfig    2005/07/11 20:46:26     1.61
+++ linux/arch/mips/configs/mpc30x_defconfig    2005/07/12 09:19:03     1.62
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.13-rc1
-# Mon Jul 11 20:25:42 2005
+# Linux kernel version: 2.6.13-rc2
+# Tue Jul 12 08:46:31 2005
 #
 CONFIG_MIPS=y
 
diff -urN linux/arch/mips/configs/ocelot_3_defconfig 
linux/arch/mips/configs/ocelot_3_defconfig
--- linux/arch/mips/configs/ocelot_3_defconfig  2005/07/11 20:46:26     1.29
+++ linux/arch/mips/configs/ocelot_3_defconfig  2005/07/12 09:19:03     1.30
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.13-rc1
-# Mon Jul 11 20:25:42 2005
+# Linux kernel version: 2.6.13-rc2
+# Tue Jul 12 08:46:32 2005
 #
 CONFIG_MIPS=y
 
diff -urN linux/arch/mips/configs/ocelot_c_defconfig 
linux/arch/mips/configs/ocelot_c_defconfig
--- linux/arch/mips/configs/ocelot_c_defconfig  2005/07/11 20:46:26     1.55
+++ linux/arch/mips/configs/ocelot_c_defconfig  2005/07/12 09:19:03     1.56
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.13-rc1
-# Mon Jul 11 20:25:43 2005
+# Linux kernel version: 2.6.13-rc2
+# Tue Jul 12 08:46:33 2005
 #
 CONFIG_MIPS=y
 
diff -urN linux/arch/mips/configs/ocelot_defconfig 
linux/arch/mips/configs/ocelot_defconfig
--- linux/arch/mips/configs/ocelot_defconfig    2005/07/11 20:46:26     1.57
+++ linux/arch/mips/configs/ocelot_defconfig    2005/07/12 09:19:03     1.58
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.13-rc1
-# Mon Jul 11 20:25:43 2005
+# Linux kernel version: 2.6.13-rc2
+# Tue Jul 12 08:46:34 2005
 #
 CONFIG_MIPS=y
 
diff -urN linux/arch/mips/configs/ocelot_g_defconfig 
linux/arch/mips/configs/ocelot_g_defconfig
--- linux/arch/mips/configs/ocelot_g_defconfig  2005/07/11 20:46:26     1.50
+++ linux/arch/mips/configs/ocelot_g_defconfig  2005/07/12 09:19:03     1.51
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.13-rc1
-# Mon Jul 11 20:25:44 2005
+# Linux kernel version: 2.6.13-rc2
+# Tue Jul 12 08:46:35 2005
 #
 CONFIG_MIPS=y
 
diff -urN linux/arch/mips/configs/pb1100_defconfig 
linux/arch/mips/configs/pb1100_defconfig
--- linux/arch/mips/configs/pb1100_defconfig    2005/07/11 20:46:26     1.59
+++ linux/arch/mips/configs/pb1100_defconfig    2005/07/12 09:19:03     1.60
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.13-rc1
-# Mon Jul 11 20:25:44 2005
+# Linux kernel version: 2.6.13-rc2
+# Tue Jul 12 08:46:36 2005
 #
 CONFIG_MIPS=y
 
diff -urN linux/arch/mips/configs/pb1500_defconfig 
linux/arch/mips/configs/pb1500_defconfig
--- linux/arch/mips/configs/pb1500_defconfig    2005/07/11 20:46:26     1.65
+++ linux/arch/mips/configs/pb1500_defconfig    2005/07/12 09:19:03     1.66
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.13-rc1
-# Mon Jul 11 20:25:45 2005
+# Linux kernel version: 2.6.13-rc2
+# Tue Jul 12 08:46:37 2005
 #
 CONFIG_MIPS=y
 
diff -urN linux/arch/mips/configs/pb1550_defconfig 
linux/arch/mips/configs/pb1550_defconfig
--- linux/arch/mips/configs/pb1550_defconfig    2005/07/11 20:46:26     1.55
+++ linux/arch/mips/configs/pb1550_defconfig    2005/07/12 09:19:03     1.56
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.13-rc1
-# Mon Jul 11 20:25:45 2005
+# Linux kernel version: 2.6.13-rc2
+# Tue Jul 12 08:46:38 2005
 #
 CONFIG_MIPS=y
 
diff -urN linux/arch/mips/configs/qemu_defconfig 
linux/arch/mips/configs/qemu_defconfig
--- linux/arch/mips/configs/qemu_defconfig      2005/07/11 20:46:26     1.2
+++ linux/arch/mips/configs/qemu_defconfig      2005/07/12 09:19:03     1.3
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.13-rc1
-# Mon Jul 11 20:25:46 2005
+# Linux kernel version: 2.6.13-rc2
+# Tue Jul 12 08:46:39 2005
 #
 CONFIG_MIPS=y
 
diff -urN linux/arch/mips/configs/rm200_defconfig 
linux/arch/mips/configs/rm200_defconfig
--- linux/arch/mips/configs/rm200_defconfig     2005/07/11 20:46:26     1.67
+++ linux/arch/mips/configs/rm200_defconfig     2005/07/12 09:19:04     1.68
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.13-rc1
-# Mon Jul 11 20:25:47 2005
+# Linux kernel version: 2.6.13-rc2
+# Tue Jul 12 08:46:40 2005
 #
 CONFIG_MIPS=y
 
diff -urN linux/arch/mips/configs/sb1250-swarm_defconfig 
linux/arch/mips/configs/sb1250-swarm_defconfig
--- linux/arch/mips/configs/sb1250-swarm_defconfig      2005/07/11 20:46:26     
1.63
+++ linux/arch/mips/configs/sb1250-swarm_defconfig      2005/07/12 09:19:04     
1.64
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.13-rc1
-# Mon Jul 11 20:25:47 2005
+# Linux kernel version: 2.6.13-rc2
+# Tue Jul 12 08:46:41 2005
 #
 CONFIG_MIPS=y
 
diff -urN linux/arch/mips/configs/sead_defconfig 
linux/arch/mips/configs/sead_defconfig
--- linux/arch/mips/configs/sead_defconfig      2005/07/11 20:46:26     1.55
+++ linux/arch/mips/configs/sead_defconfig      2005/07/12 09:19:04     1.56
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.13-rc1
-# Mon Jul 11 20:25:48 2005
+# Linux kernel version: 2.6.13-rc2
+# Tue Jul 12 08:46:42 2005
 #
 CONFIG_MIPS=y
 
diff -urN linux/arch/mips/configs/tb0226_defconfig 
linux/arch/mips/configs/tb0226_defconfig
--- linux/arch/mips/configs/tb0226_defconfig    2005/07/11 20:46:27     1.59
+++ linux/arch/mips/configs/tb0226_defconfig    2005/07/12 09:19:04     1.60
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.13-rc1
-# Mon Jul 11 20:25:48 2005
+# Linux kernel version: 2.6.13-rc2
+# Tue Jul 12 08:46:43 2005
 #
 CONFIG_MIPS=y
 
diff -urN linux/arch/mips/configs/tb0229_defconfig 
linux/arch/mips/configs/tb0229_defconfig
--- linux/arch/mips/configs/tb0229_defconfig    2005/07/11 20:46:27     1.62
+++ linux/arch/mips/configs/tb0229_defconfig    2005/07/12 09:19:04     1.63
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.13-rc1
-# Mon Jul 11 20:25:49 2005
+# Linux kernel version: 2.6.13-rc2
+# Tue Jul 12 08:46:44 2005
 #
 CONFIG_MIPS=y
 
diff -urN linux/arch/mips/configs/workpad_defconfig 
linux/arch/mips/configs/workpad_defconfig
--- linux/arch/mips/configs/workpad_defconfig   2005/07/11 20:46:27     1.60
+++ linux/arch/mips/configs/workpad_defconfig   2005/07/12 09:19:04     1.61
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.13-rc1
-# Mon Jul 11 20:25:49 2005
+# Linux kernel version: 2.6.13-rc2
+# Tue Jul 12 08:46:44 2005
 #
 CONFIG_MIPS=y
 
diff -urN linux/arch/mips/configs/yosemite_defconfig 
linux/arch/mips/configs/yosemite_defconfig
--- linux/arch/mips/configs/yosemite_defconfig  2005/07/11 20:46:27     1.61
+++ linux/arch/mips/configs/yosemite_defconfig  2005/07/12 09:19:04     1.62
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.13-rc1
-# Mon Jul 11 20:25:50 2005
+# Linux kernel version: 2.6.13-rc2
+# Tue Jul 12 08:46:45 2005
 #
 CONFIG_MIPS=y
 
diff -urN linux/arch/mips/pci/pci.c linux/arch/mips/pci/pci.c
--- linux/arch/mips/pci/pci.c   2005/07/11 10:03:29     1.31
+++ linux/arch/mips/pci/pci.c   2005/07/12 09:19:05     1.32
@@ -164,7 +164,7 @@
 
        pci_read_config_word(dev, PCI_COMMAND, &cmd);
        old_cmd = cmd;
-       for(idx=0; idx<6; idx++) {
+       for (idx=0; idx < PCI_NUM_RESOURCES; idx++) {
                /* Only set up the requested stuff */
                if (!(mask & (1<<idx)))
                        continue;
diff -urN linux/arch/parisc/defconfig linux/arch/parisc/defconfig
--- linux/arch/parisc/defconfig 2004/08/14 16:16:41     1.11
+++ linux/arch/parisc/defconfig 2005/07/12 09:19:05     1.12
@@ -517,7 +517,7 @@
 #
 CONFIG_SERIAL_8250=y
 CONFIG_SERIAL_8250_CONSOLE=y
-CONFIG_SERIAL_8250_NR_UARTS=4
+CONFIG_SERIAL_8250_NR_UARTS=13
 CONFIG_SERIAL_8250_EXTENDED=y
 CONFIG_SERIAL_8250_MANY_PORTS=y
 CONFIG_SERIAL_8250_SHARE_IRQ=y
diff -urN linux/arch/parisc/configs/712_defconfig 
linux/arch/parisc/configs/712_defconfig
--- linux/arch/parisc/configs/712_defconfig     2005/01/25 04:28:00     1.4
+++ linux/arch/parisc/configs/712_defconfig     2005/07/12 09:19:06     1.5
@@ -506,7 +506,7 @@
 #
 CONFIG_SERIAL_8250=y
 CONFIG_SERIAL_8250_CONSOLE=y
-CONFIG_SERIAL_8250_NR_UARTS=8
+CONFIG_SERIAL_8250_NR_UARTS=17
 CONFIG_SERIAL_8250_EXTENDED=y
 CONFIG_SERIAL_8250_MANY_PORTS=y
 CONFIG_SERIAL_8250_SHARE_IRQ=y
diff -urN linux/arch/parisc/configs/a500_defconfig 
linux/arch/parisc/configs/a500_defconfig
--- linux/arch/parisc/configs/a500_defconfig    2005/03/18 17:36:54     1.8
+++ linux/arch/parisc/configs/a500_defconfig    2005/07/12 09:19:06     1.9
@@ -662,7 +662,7 @@
 CONFIG_SERIAL_8250=y
 CONFIG_SERIAL_8250_CONSOLE=y
 CONFIG_SERIAL_8250_CS=m
-CONFIG_SERIAL_8250_NR_UARTS=8
+CONFIG_SERIAL_8250_NR_UARTS=17
 CONFIG_SERIAL_8250_EXTENDED=y
 CONFIG_SERIAL_8250_MANY_PORTS=y
 CONFIG_SERIAL_8250_SHARE_IRQ=y
diff -urN linux/arch/parisc/configs/b180_defconfig 
linux/arch/parisc/configs/b180_defconfig
--- linux/arch/parisc/configs/b180_defconfig    2005/01/25 04:28:00     1.4
+++ linux/arch/parisc/configs/b180_defconfig    2005/07/12 09:19:06     1.5
@@ -514,7 +514,7 @@
 #
 CONFIG_SERIAL_8250=y
 CONFIG_SERIAL_8250_CONSOLE=y
-CONFIG_SERIAL_8250_NR_UARTS=4
+CONFIG_SERIAL_8250_NR_UARTS=13
 CONFIG_SERIAL_8250_EXTENDED=y
 CONFIG_SERIAL_8250_MANY_PORTS=y
 CONFIG_SERIAL_8250_SHARE_IRQ=y
diff -urN linux/arch/parisc/configs/c3000_defconfig 
linux/arch/parisc/configs/c3000_defconfig
--- linux/arch/parisc/configs/c3000_defconfig   2005/01/25 04:28:00     1.7
+++ linux/arch/parisc/configs/c3000_defconfig   2005/07/12 09:19:06     1.8
@@ -661,7 +661,7 @@
 #
 CONFIG_SERIAL_8250=y
 CONFIG_SERIAL_8250_CONSOLE=y
-CONFIG_SERIAL_8250_NR_UARTS=4
+CONFIG_SERIAL_8250_NR_UARTS=13
 CONFIG_SERIAL_8250_EXTENDED=y
 CONFIG_SERIAL_8250_MANY_PORTS=y
 CONFIG_SERIAL_8250_SHARE_IRQ=y
diff -urN linux/arch/ppc/Kconfig linux/arch/ppc/Kconfig
--- linux/arch/ppc/Kconfig      2005/07/11 20:46:29     1.50
+++ linux/arch/ppc/Kconfig      2005/07/12 09:19:06     1.51
@@ -284,6 +284,9 @@
 
 menu "Platform options"
 
+config FADS
+       bool
+
 choice
        prompt "8xx Machine Type"
        depends on 8xx
@@ -399,8 +402,25 @@
          26MB DRAM, 4MB flash, Ethernet, a 16K-gate FPGA, USB, an LCD/video
          controller, and two RS232 ports.
 
-config FADS
+config MPC8XXFADS
        bool "FADS"
+       select FADS
+
+config MPC86XADS
+       bool "MPC86XADS"
+       help
+         MPC86x Application Development System by Freescale Semiconductor.
+         The MPC86xADS is meant to serve as a platform for s/w and h/w
+         development around the MPC86X processor families.
+       select FADS
+
+config MPC885ADS
+       bool "MPC885ADS"
+       help
+         Freescale Semiconductor MPC885 Application Development System (ADS).
+         Also known as DUET.
+         The MPC885ADS is meant to serve as a platform for s/w and h/w
+         development around the MPC885 processor family.
 
 config TQM823L
        bool "TQM823L"
diff -urN linux/arch/ppc/8xx_io/enet.c linux/arch/ppc/8xx_io/enet.c
--- linux/arch/ppc/8xx_io/enet.c        2005/03/18 17:36:55     1.30
+++ linux/arch/ppc/8xx_io/enet.c        2005/07/12 09:19:06     1.31
@@ -714,16 +714,24 @@
        immap->im_ioport.iop_pcdat &= ~PC_ENET_LBK;     /* Disable Loopback */
 #endif /* PC_ENET_LBK */
 
-       /* Configure port C pins to enable CLSN and RENA.
+#ifdef PE_ENET_TCLK
+       /* Configure port E for TCLK and RCLK.
        */
-       immap->im_ioport.iop_pcpar &= ~(PC_ENET_CLSN | PC_ENET_RENA);
-       immap->im_ioport.iop_pcdir &= ~(PC_ENET_CLSN | PC_ENET_RENA);
-       immap->im_ioport.iop_pcso  |=  (PC_ENET_CLSN | PC_ENET_RENA);
-
+       cp->cp_pepar |=  (PE_ENET_TCLK | PE_ENET_RCLK);
+       cp->cp_pedir &= ~(PE_ENET_TCLK | PE_ENET_RCLK);
+       cp->cp_peso  &= ~(PE_ENET_TCLK | PE_ENET_RCLK);
+#else
        /* Configure port A for TCLK and RCLK.
        */
        immap->im_ioport.iop_papar |=  (PA_ENET_TCLK | PA_ENET_RCLK);
        immap->im_ioport.iop_padir &= ~(PA_ENET_TCLK | PA_ENET_RCLK);
+#endif
+
+       /* Configure port C pins to enable CLSN and RENA.
+       */
+       immap->im_ioport.iop_pcpar &= ~(PC_ENET_CLSN | PC_ENET_RENA);
+       immap->im_ioport.iop_pcdir &= ~(PC_ENET_CLSN | PC_ENET_RENA);
+       immap->im_ioport.iop_pcso  |=  (PC_ENET_CLSN | PC_ENET_RENA);
 
        /* Configure Serial Interface clock routing.
         * First, clear all SCC bits to zero, then set the ones we want.
@@ -896,14 +904,18 @@
        /* It is now OK to enable the Ethernet transmitter.
         * Unfortunately, there are board implementation differences here.
         */
-#if   (!defined (PB_ENET_TENA) &&  defined (PC_ENET_TENA))
+#if   (!defined (PB_ENET_TENA) &&  defined (PC_ENET_TENA) && !defined 
(PE_ENET_TENA))
        immap->im_ioport.iop_pcpar |=  PC_ENET_TENA;
        immap->im_ioport.iop_pcdir &= ~PC_ENET_TENA;
-#elif ( defined (PB_ENET_TENA) && !defined (PC_ENET_TENA))
+#elif ( defined (PB_ENET_TENA) && !defined (PC_ENET_TENA) && !defined 
(PE_ENET_TENA))
        cp->cp_pbpar |= PB_ENET_TENA;
        cp->cp_pbdir |= PB_ENET_TENA;
+#elif ( !defined (PB_ENET_TENA) && !defined (PC_ENET_TENA) && defined 
(PE_ENET_TENA))
+       cp->cp_pepar |=  PE_ENET_TENA;
+       cp->cp_pedir &= ~PE_ENET_TENA;
+       cp->cp_peso  |=  PE_ENET_TENA;
 #else
-#error Configuration Error: define exactly ONE of PB_ENET_TENA, PC_ENET_TENA
+#error Configuration Error: define exactly ONE of PB_ENET_TENA, PC_ENET_TENA, 
PE_ENET_TENA
 #endif
 
 #if defined(CONFIG_RPXLITE) || defined(CONFIG_RPXCLASSIC)
@@ -936,6 +948,29 @@
        *((volatile uint *)BCSR1) &= ~BCSR1_ETHEN;
 #endif
 
+#ifdef CONFIG_MPC885ADS
+
+       /* Deassert PHY reset and enable the PHY.
+        */
+       {
+               volatile uint __iomem *bcsr = ioremap(BCSR_ADDR, BCSR_SIZE);
+               uint tmp;
+
+               tmp = in_be32(bcsr + 1 /* BCSR1 */);
+               tmp |= BCSR1_ETHEN;
+               out_be32(bcsr + 1, tmp);
+               tmp = in_be32(bcsr + 4 /* BCSR4 */);
+               tmp |= BCSR4_ETH10_RST;
+               out_be32(bcsr + 4, tmp);
+               iounmap(bcsr);
+       }
+
+       /* On MPC885ADS SCC ethernet PHY defaults to the full duplex mode
+        * upon reset. SCC is set to half duplex by default. So this
+        * inconsistency should be better fixed by the software.
+        */
+#endif
+
        dev->base_addr = (unsigned long)ep;
 #if 0
        dev->name = "CPM_ENET";
@@ -969,3 +1004,4 @@
 }
 
 module_init(scc_enet_init);
+
diff -urN linux/arch/ppc/configs/mpc86x_ads_defconfig 
linux/arch/ppc/configs/mpc86x_ads_defconfig
--- linux/arch/ppc/configs/mpc86x_ads_defconfig 1970/01/01 00:00:00
+++ linux/arch/ppc/configs/mpc86x_ads_defconfig 2005-07-12 10:19:06.759665000 
+0100     1.1
@@ -0,0 +1,633 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.12-rc4
+# Tue Jun 14 13:36:35 2005
+#
+CONFIG_MMU=y
+CONFIG_GENERIC_HARDIRQS=y
+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_HAVE_DEC_LOCK=y
+CONFIG_PPC=y
+CONFIG_PPC32=y
+CONFIG_GENERIC_NVRAM=y
+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
+
+#
+# Code maturity level options
+#
+CONFIG_EXPERIMENTAL=y
+# CONFIG_CLEAN_COMPILE is not set
+CONFIG_BROKEN=y
+CONFIG_BROKEN_ON_SMP=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+
+#
+# General setup
+#
+CONFIG_LOCALVERSION=""
+# CONFIG_SWAP is not set
+CONFIG_SYSVIPC=y
+# CONFIG_POSIX_MQUEUE is not set
+# CONFIG_BSD_PROCESS_ACCT is not set
+CONFIG_SYSCTL=y
+# CONFIG_AUDIT is not set
+# CONFIG_HOTPLUG is not set
+CONFIG_KOBJECT_UEVENT=y
+# CONFIG_IKCONFIG is not set
+CONFIG_EMBEDDED=y
+# CONFIG_KALLSYMS is not set
+CONFIG_PRINTK=y
+CONFIG_BUG=y
+# CONFIG_BASE_FULL is not set
+CONFIG_FUTEX=y
+# CONFIG_EPOLL is not set
+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+# CONFIG_SHMEM is not set
+CONFIG_CC_ALIGN_FUNCTIONS=0
+CONFIG_CC_ALIGN_LABELS=0
+CONFIG_CC_ALIGN_LOOPS=0
+CONFIG_CC_ALIGN_JUMPS=0
+CONFIG_TINY_SHMEM=y
+CONFIG_BASE_SMALL=1
+
+#
+# Loadable module support
+#
+CONFIG_MODULES=y
+# CONFIG_MODULE_UNLOAD is not set
+CONFIG_OBSOLETE_MODPARM=y
+# CONFIG_MODVERSIONS is not set
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+# CONFIG_KMOD is not set
+
+#
+# Processor
+#
+# CONFIG_6xx is not set
+# CONFIG_40x is not set
+# CONFIG_44x is not set
+# CONFIG_POWER3 is not set
+# CONFIG_POWER4 is not set
+CONFIG_8xx=y
+# CONFIG_E500 is not set
+# CONFIG_MATH_EMULATION is not set
+# CONFIG_CPU_FREQ is not set
+CONFIG_EMBEDDEDBOOT=y
+# CONFIG_PM is not set
+CONFIG_NOT_COHERENT_CACHE=y
+
+#
+# Platform options
+#
+CONFIG_FADS=y
+# CONFIG_RPXLITE is not set
+# CONFIG_RPXCLASSIC is not set
+# CONFIG_BSEIP is not set
+# CONFIG_MPC8XXFADS is not set
+CONFIG_MPC86XADS=y
+# CONFIG_TQM823L is not set
+# CONFIG_TQM850L is not set
+# CONFIG_TQM855L is not set
+# CONFIG_TQM860L is not set
+# CONFIG_FPS850L is not set
+# CONFIG_SPD823TS is not set
+# CONFIG_IVMS8 is not set
+# CONFIG_IVML24 is not set
+# CONFIG_SM850 is not set
+# CONFIG_HERMES_PRO is not set
+# CONFIG_IP860 is not set
+# CONFIG_LWMON is not set
+# CONFIG_PCU_E is not set
+# CONFIG_CCM is not set
+# CONFIG_LANTEC is not set
+# CONFIG_MBX is not set
+# CONFIG_WINCEPT is not set
+# CONFIG_SMP is not set
+# CONFIG_PREEMPT is not set
+# CONFIG_HIGHMEM is not set
+CONFIG_BINFMT_ELF=y
+# CONFIG_BINFMT_MISC is not set
+# CONFIG_CMDLINE_BOOL is not set
+CONFIG_ISA_DMA_API=y
+
+#
+# Bus options
+#
+# CONFIG_PCI is not set
+# CONFIG_PCI_DOMAINS is not set
+# CONFIG_PCI_QSPAN is not set
+
+#
+# PCCARD (PCMCIA/CardBus) support
+#
+# CONFIG_PCCARD is not set
+
+#
+# Advanced setup
+#
+# CONFIG_ADVANCED_OPTIONS is not set
+
+#
+# Default settings for advanced configuration options are used
+#
+CONFIG_HIGHMEM_START=0xfe000000
+CONFIG_LOWMEM_SIZE=0x30000000
+CONFIG_KERNEL_START=0xc0000000
+CONFIG_TASK_SIZE=0x80000000
+CONFIG_CONSISTENT_START=0xff100000
+CONFIG_CONSISTENT_SIZE=0x00200000
+CONFIG_BOOT_LOAD=0x00400000
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+# CONFIG_STANDALONE is not set
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+# CONFIG_FW_LOADER is not set
+
+#
+# Memory Technology Devices (MTD)
+#
+# CONFIG_MTD is not set
+
+#
+# Parallel port support
+#
+# CONFIG_PARPORT is not set
+
+#
+# Plug and Play support
+#
+
+#
+# Block devices
+#
+# CONFIG_BLK_DEV_FD is not set
+# CONFIG_BLK_DEV_COW_COMMON is not set
+CONFIG_BLK_DEV_LOOP=y
+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
+# CONFIG_BLK_DEV_NBD is not set
+# CONFIG_BLK_DEV_RAM is not set
+CONFIG_BLK_DEV_RAM_COUNT=16
+CONFIG_INITRAMFS_SOURCE=""
+# CONFIG_LBD is not set
+# CONFIG_CDROM_PKTCDVD is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+# CONFIG_ATA_OVER_ETH is not set
+
+#
+# ATA/ATAPI/MFM/RLL support
+#
+# CONFIG_IDE is not set
+
+#
+# SCSI device support
+#
+# CONFIG_SCSI is not set
+
+#
+# Multi-device support (RAID and LVM)
+#
+# CONFIG_MD is not set
+
+#
+# Fusion MPT device support
+#
+
+#
+# IEEE 1394 (FireWire) support
+#
+# CONFIG_IEEE1394 is not set
+
+#
+# I2O device support
+#
+
+#
+# Macintosh device drivers
+#
+
+#
+# Networking support
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+CONFIG_PACKET=y
+# CONFIG_PACKET_MMAP is not set
+CONFIG_UNIX=y
+# CONFIG_NET_KEY is not set
+CONFIG_INET=y
+# CONFIG_IP_MULTICAST is not set
+# CONFIG_IP_ADVANCED_ROUTER is not set
+CONFIG_IP_PNP=y
+CONFIG_IP_PNP_DHCP=y
+# CONFIG_IP_PNP_BOOTP is not set
+# CONFIG_IP_PNP_RARP is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE is not set
+# CONFIG_ARPD is not set
+# CONFIG_SYN_COOKIES is not set
+# CONFIG_INET_AH is not set
+# CONFIG_INET_ESP is not set
+# CONFIG_INET_IPCOMP is not set
+# CONFIG_INET_TUNNEL is not set
+CONFIG_IP_TCPDIAG=y
+# CONFIG_IP_TCPDIAG_IPV6 is not set
+CONFIG_IPV6=m
+# CONFIG_IPV6_PRIVACY is not set
+# CONFIG_INET6_AH is not set
+# CONFIG_INET6_ESP is not set
+# CONFIG_INET6_IPCOMP is not set
+# CONFIG_INET6_TUNNEL is not set
+# CONFIG_IPV6_TUNNEL is not set
+# CONFIG_NETFILTER is not set
+
+#
+# SCTP Configuration (EXPERIMENTAL)
+#
+# CONFIG_IP_SCTP is not set
+# CONFIG_ATM is not set
+# CONFIG_BRIDGE is not set
+# CONFIG_VLAN_8021Q is not set
+# CONFIG_DECNET is not set
+# CONFIG_LLC2 is not set
+# CONFIG_IPX is not set
+# CONFIG_ATALK is not set
+# CONFIG_X25 is not set
+# CONFIG_LAPB is not set
+# CONFIG_NET_DIVERT is not set
+# CONFIG_ECONET is not set
+# CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
+# CONFIG_NET_SCHED is not set
+# CONFIG_NET_CLS_ROUTE is not set
+
+#
+# Network testing
+#
+# CONFIG_NET_PKTGEN is not set
+# CONFIG_NETPOLL is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
+# CONFIG_HAMRADIO is not set
+# CONFIG_IRDA is not set
+# CONFIG_BT is not set
+CONFIG_NETDEVICES=y
+# CONFIG_DUMMY is not set
+# CONFIG_BONDING is not set
+# CONFIG_EQUALIZER is not set
+# CONFIG_TUN is not set
+
+#
+# Ethernet (10 or 100Mbit)
+#
+CONFIG_NET_ETHERNET=y
+# CONFIG_MII is not set
+# CONFIG_OAKNET is not set
+
+#
+# Ethernet (1000 Mbit)
+#
+
+#
+# Ethernet (10000 Mbit)
+#
+
+#
+# Token Ring devices
+#
+
+#
+# Wireless LAN (non-hamradio)
+#
+# CONFIG_NET_RADIO is not set
+
+#
+# Wan interfaces
+#
+# CONFIG_WAN is not set
+# CONFIG_PPP is not set
+# CONFIG_SLIP is not set
+# CONFIG_SHAPER is not set
+# CONFIG_NETCONSOLE is not set
+
+#
+# ISDN subsystem
+#
+# CONFIG_ISDN is not set
+
+#
+# Telephony Support
+#
+# CONFIG_PHONE is not set
+
+#
+# Input device support
+#
+# CONFIG_INPUT is not set
+
+#
+# Hardware I/O ports
+#
+# CONFIG_SERIO is not set
+# CONFIG_GAMEPORT is not set
+CONFIG_SOUND_GAMEPORT=y
+
+#
+# Character devices
+#
+# CONFIG_VT is not set
+# CONFIG_SERIAL_NONSTANDARD is not set
+
+#
+# Serial drivers
+#
+# CONFIG_SERIAL_8250 is not set
+
+#
+# Non-8250 serial port support
+#
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+CONFIG_SERIAL_CPM=y
+CONFIG_SERIAL_CPM_CONSOLE=y
+# CONFIG_SERIAL_CPM_SCC1 is not set
+# CONFIG_SERIAL_CPM_SCC2 is not set
+# CONFIG_SERIAL_CPM_SCC3 is not set
+# CONFIG_SERIAL_CPM_SCC4 is not set
+CONFIG_SERIAL_CPM_SMC1=y
+# CONFIG_SERIAL_CPM_SMC2 is not set
+CONFIG_UNIX98_PTYS=y
+# CONFIG_LEGACY_PTYS is not set
+
+#
+# IPMI
+#
+# CONFIG_IPMI_HANDLER is not set
+
+#
+# Watchdog Cards
+#
+# CONFIG_WATCHDOG is not set
+# CONFIG_NVRAM is not set
+# CONFIG_GEN_RTC is not set
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+
+#
+# Ftape, the floppy tape device driver
+#
+# CONFIG_AGP is not set
+# CONFIG_DRM is not set
+# CONFIG_RAW_DRIVER is not set
+
+#
+# TPM devices
+#
+
+#
+# I2C support
+#
+# CONFIG_I2C is not set
+
+#
+# Dallas's 1-wire bus
+#
+# CONFIG_W1 is not set
+
+#
+# Misc devices
+#
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+
+#
+# Digital Video Broadcasting Devices
+#
+# CONFIG_DVB is not set
+
+#
+# Graphics support
+#
+# CONFIG_FB is not set
+
+#
+# Sound
+#
+# CONFIG_SOUND is not set
+
+#
+# USB support
+#
+# CONFIG_USB_ARCH_HAS_HCD is not set
+# CONFIG_USB_ARCH_HAS_OHCI is not set
+
+#
+# USB Gadget Support
+#
+# CONFIG_USB_GADGET is not set
+
+#
+# MMC/SD Card support
+#
+# CONFIG_MMC is not set
+
+#
+# InfiniBand support
+#
+# CONFIG_INFINIBAND is not set
+
+#
+# File systems
+#
+# CONFIG_EXT2_FS is not set
+CONFIG_EXT3_FS=y
+# CONFIG_EXT3_FS_XATTR is not set
+CONFIG_JBD=y
+# CONFIG_JBD_DEBUG is not set
+# CONFIG_REISERFS_FS is not set
+# CONFIG_JFS_FS is not set
+
+#
+# XFS support
+#
+# CONFIG_XFS_FS is not set
+# CONFIG_MINIX_FS is not set
+# CONFIG_ROMFS_FS is not set
+# CONFIG_QUOTA is not set
+# CONFIG_DNOTIFY is not set
+# CONFIG_AUTOFS_FS is not set
+# CONFIG_AUTOFS4_FS is not set
+
+#
+# CD-ROM/DVD Filesystems
+#
+# CONFIG_ISO9660_FS is not set
+# CONFIG_UDF_FS is not set
+
+#
+# DOS/FAT/NT Filesystems
+#
+# CONFIG_MSDOS_FS is not set
+# CONFIG_VFAT_FS is not set
+# CONFIG_NTFS_FS is not set
+
+#
+# Pseudo filesystems
+#
+CONFIG_PROC_FS=y
+CONFIG_PROC_KCORE=y
+CONFIG_SYSFS=y
+# CONFIG_DEVFS_FS is not set
+# CONFIG_DEVPTS_FS_XATTR is not set
+# CONFIG_TMPFS is not set
+# CONFIG_HUGETLBFS is not set
+# CONFIG_HUGETLB_PAGE is not set
+CONFIG_RAMFS=y
+
+#
+# Miscellaneous filesystems
+#
+# CONFIG_ADFS_FS is not set
+# CONFIG_AFFS_FS is not set
+# CONFIG_HFS_FS is not set
+# CONFIG_HFSPLUS_FS is not set
+# CONFIG_BEFS_FS is not set
+# CONFIG_BFS_FS is not set
+# CONFIG_EFS_FS is not set
+# CONFIG_CRAMFS is not set
+# CONFIG_VXFS_FS is not set
+# CONFIG_HPFS_FS is not set
+# CONFIG_QNX4FS_FS is not set
+# CONFIG_SYSV_FS is not set
+# CONFIG_UFS_FS is not set
+
+#
+# Network File Systems
+#
+CONFIG_NFS_FS=y
+CONFIG_NFS_V3=y
+CONFIG_NFS_V4=y
+# CONFIG_NFS_DIRECTIO is not set
+# CONFIG_NFSD is not set
+CONFIG_ROOT_NFS=y
+CONFIG_LOCKD=y
+CONFIG_LOCKD_V4=y
+CONFIG_SUNRPC=y
+CONFIG_SUNRPC_GSS=y
+CONFIG_RPCSEC_GSS_KRB5=y
+# CONFIG_RPCSEC_GSS_SPKM3 is not set
+# CONFIG_SMB_FS is not set
+# CONFIG_CIFS is not set
+# CONFIG_NCP_FS is not set
+# CONFIG_CODA_FS is not set
+# CONFIG_AFS_FS is not set
+
+#
+# Partition Types
+#
+# CONFIG_PARTITION_ADVANCED is not set
+CONFIG_MSDOS_PARTITION=y
+
+#
+# Native Language Support
+#
+# CONFIG_NLS is not set
+
+#
+# MPC8xx CPM Options
+#
+CONFIG_SCC_ENET=y
+CONFIG_SCC1_ENET=y
+# CONFIG_SCC2_ENET is not set
+# CONFIG_SCC3_ENET is not set
+# CONFIG_FEC_ENET is not set
+# CONFIG_ENET_BIG_BUFFERS is not set
+
+#
+# Generic MPC8xx Options
+#
+# CONFIG_8xx_COPYBACK is not set
+# CONFIG_8xx_CPU6 is not set
+CONFIG_NO_UCODE_PATCH=y
+# CONFIG_USB_SOF_UCODE_PATCH is not set
+# CONFIG_I2C_SPI_UCODE_PATCH is not set
+# CONFIG_I2C_SPI_SMC1_UCODE_PATCH is not set
+
+#
+# Library routines
+#
+# CONFIG_CRC_CCITT is not set
+# CONFIG_CRC32 is not set
+# CONFIG_LIBCRC32C is not set
+
+#
+# Profiling support
+#
+# CONFIG_PROFILING is not set
+
+#
+# Kernel hacking
+#
+# CONFIG_PRINTK_TIME is not set
+# CONFIG_DEBUG_KERNEL is not set
+CONFIG_LOG_BUF_SHIFT=14
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+# CONFIG_SECURITY is not set
+
+#
+# Cryptographic options
+#
+CONFIG_CRYPTO=y
+# CONFIG_CRYPTO_HMAC is not set
+# CONFIG_CRYPTO_NULL is not set
+# CONFIG_CRYPTO_MD4 is not set
+CONFIG_CRYPTO_MD5=y
+# CONFIG_CRYPTO_SHA1 is not set
+# CONFIG_CRYPTO_SHA256 is not set
+# CONFIG_CRYPTO_SHA512 is not set
+# CONFIG_CRYPTO_WP512 is not set
+# CONFIG_CRYPTO_TGR192 is not set
+CONFIG_CRYPTO_DES=y
+# CONFIG_CRYPTO_BLOWFISH is not set
+# CONFIG_CRYPTO_TWOFISH is not set
+# CONFIG_CRYPTO_SERPENT is not set
+# CONFIG_CRYPTO_AES is not set
+# CONFIG_CRYPTO_CAST5 is not set
+# CONFIG_CRYPTO_CAST6 is not set
+# CONFIG_CRYPTO_TEA is not set
+# CONFIG_CRYPTO_ARC4 is not set
+# CONFIG_CRYPTO_KHAZAD is not set
+# CONFIG_CRYPTO_ANUBIS is not set
+# CONFIG_CRYPTO_DEFLATE is not set
+# CONFIG_CRYPTO_MICHAEL_MIC is not set
+# CONFIG_CRYPTO_CRC32C is not set
+# CONFIG_CRYPTO_TEST is not set
+
+#
+# Hardware crypto devices
+#
diff -urN linux/arch/ppc/configs/mpc885ads_defconfig 
linux/arch/ppc/configs/mpc885ads_defconfig
--- linux/arch/ppc/configs/mpc885ads_defconfig  1970/01/01 00:00:00
+++ linux/arch/ppc/configs/mpc885ads_defconfig  2005-07-12 10:19:06.806966000 
+0100     1.1
@@ -0,0 +1,622 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.12-rc6
+# Thu Jun  9 21:17:29 2005
+#
+CONFIG_MMU=y
+CONFIG_GENERIC_HARDIRQS=y
+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_HAVE_DEC_LOCK=y
+CONFIG_PPC=y
+CONFIG_PPC32=y
+CONFIG_GENERIC_NVRAM=y
+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
+
+#
+# Code maturity level options
+#
+CONFIG_EXPERIMENTAL=y
+# CONFIG_CLEAN_COMPILE is not set
+CONFIG_BROKEN=y
+CONFIG_BROKEN_ON_SMP=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+
+#
+# General setup
+#
+CONFIG_LOCALVERSION=""
+# CONFIG_SWAP is not set
+CONFIG_SYSVIPC=y
+# CONFIG_POSIX_MQUEUE is not set
+# CONFIG_BSD_PROCESS_ACCT is not set
+CONFIG_SYSCTL=y
+# CONFIG_AUDIT is not set
+CONFIG_HOTPLUG=y
+CONFIG_KOBJECT_UEVENT=y
+# CONFIG_IKCONFIG is not set
+CONFIG_EMBEDDED=y
+# CONFIG_KALLSYMS is not set
+CONFIG_PRINTK=y
+CONFIG_BUG=y
+CONFIG_BASE_FULL=y
+CONFIG_FUTEX=y
+# CONFIG_EPOLL is not set
+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+CONFIG_SHMEM=y
+CONFIG_CC_ALIGN_FUNCTIONS=0
+CONFIG_CC_ALIGN_LABELS=0
+CONFIG_CC_ALIGN_LOOPS=0
+CONFIG_CC_ALIGN_JUMPS=0
+# CONFIG_TINY_SHMEM is not set
+CONFIG_BASE_SMALL=0
+
+#
+# Loadable module support
+#
+# CONFIG_MODULES is not set
+
+#
+# Processor
+#
+# CONFIG_6xx is not set
+# CONFIG_40x is not set
+# CONFIG_44x is not set
+# CONFIG_POWER3 is not set
+# CONFIG_POWER4 is not set
+CONFIG_8xx=y
+# CONFIG_E500 is not set
+# CONFIG_MATH_EMULATION is not set
+# CONFIG_CPU_FREQ is not set
+CONFIG_EMBEDDEDBOOT=y
+# CONFIG_PM is not set
+CONFIG_NOT_COHERENT_CACHE=y
+
+#
+# Platform options
+#
+# CONFIG_RPXLITE is not set
+# CONFIG_RPXCLASSIC is not set
+# CONFIG_BSEIP is not set
+# CONFIG_FADS is not set
+CONFIG_MPC885ADS=y
+# CONFIG_TQM823L is not set
+# CONFIG_TQM850L is not set
+# CONFIG_TQM855L is not set
+# CONFIG_TQM860L is not set
+# CONFIG_FPS850L is not set
+# CONFIG_SPD823TS is not set
+# CONFIG_IVMS8 is not set
+# CONFIG_IVML24 is not set
+# CONFIG_SM850 is not set
+# CONFIG_HERMES_PRO is not set
+# CONFIG_IP860 is not set
+# CONFIG_LWMON is not set
+# CONFIG_PCU_E is not set
+# CONFIG_CCM is not set
+# CONFIG_LANTEC is not set
+# CONFIG_MBX is not set
+# CONFIG_WINCEPT is not set
+# CONFIG_SMP is not set
+# CONFIG_PREEMPT is not set
+# CONFIG_HIGHMEM is not set
+CONFIG_BINFMT_ELF=y
+# CONFIG_BINFMT_MISC is not set
+# CONFIG_CMDLINE_BOOL is not set
+CONFIG_ISA_DMA_API=y
+
+#
+# Bus options
+#
+# CONFIG_PCI is not set
+# CONFIG_PCI_DOMAINS is not set
+# CONFIG_PCI_QSPAN is not set
+
+#
+# PCCARD (PCMCIA/CardBus) support
+#
+# CONFIG_PCCARD is not set
+
+#
+# Advanced setup
+#
+# CONFIG_ADVANCED_OPTIONS is not set
+
+#
+# Default settings for advanced configuration options are used
+#
+CONFIG_HIGHMEM_START=0xfe000000
+CONFIG_LOWMEM_SIZE=0x30000000
+CONFIG_KERNEL_START=0xc0000000
+CONFIG_TASK_SIZE=0x80000000
+CONFIG_CONSISTENT_START=0xff100000
+CONFIG_CONSISTENT_SIZE=0x00200000
+CONFIG_BOOT_LOAD=0x00400000
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+CONFIG_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+# CONFIG_FW_LOADER is not set
+
+#
+# Memory Technology Devices (MTD)
+#
+# CONFIG_MTD is not set
+
+#
+# Parallel port support
+#
+# CONFIG_PARPORT is not set
+
+#
+# Plug and Play support
+#
+
+#
+# Block devices
+#
+# CONFIG_BLK_DEV_FD is not set
+# CONFIG_BLK_DEV_COW_COMMON is not set
+# CONFIG_BLK_DEV_LOOP is not set
+# CONFIG_BLK_DEV_NBD is not set
+# CONFIG_BLK_DEV_RAM is not set
+CONFIG_BLK_DEV_RAM_COUNT=16
+CONFIG_INITRAMFS_SOURCE=""
+# CONFIG_LBD is not set
+# CONFIG_CDROM_PKTCDVD is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+# CONFIG_IOSCHED_AS is not set
+# CONFIG_IOSCHED_DEADLINE is not set
+# CONFIG_IOSCHED_CFQ is not set
+# CONFIG_ATA_OVER_ETH is not set
+
+#
+# ATA/ATAPI/MFM/RLL support
+#
+# CONFIG_IDE is not set
+
+#
+# SCSI device support
+#
+# CONFIG_SCSI is not set
+
+#
+# Multi-device support (RAID and LVM)
+#
+# CONFIG_MD is not set
+
+#
+# Fusion MPT device support
+#
+
+#
+# IEEE 1394 (FireWire) support
+#
+# CONFIG_IEEE1394 is not set
+
+#
+# I2O device support
+#
+
+#
+# Macintosh device drivers
+#
+
+#
+# Networking support
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+CONFIG_PACKET=y
+# CONFIG_PACKET_MMAP is not set
+CONFIG_UNIX=y
+# CONFIG_NET_KEY is not set
+CONFIG_INET=y
+# CONFIG_IP_MULTICAST is not set
+# CONFIG_IP_ADVANCED_ROUTER is not set
+CONFIG_IP_PNP=y
+CONFIG_IP_PNP_DHCP=y
+CONFIG_IP_PNP_BOOTP=y
+# CONFIG_IP_PNP_RARP is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE is not set
+# CONFIG_ARPD is not set
+# CONFIG_SYN_COOKIES is not set
+# CONFIG_INET_AH is not set
+# CONFIG_INET_ESP is not set
+# CONFIG_INET_IPCOMP is not set
+# CONFIG_INET_TUNNEL is not set
+CONFIG_IP_TCPDIAG=y
+# CONFIG_IP_TCPDIAG_IPV6 is not set
+# CONFIG_IPV6 is not set
+# CONFIG_NETFILTER is not set
+
+#
+# SCTP Configuration (EXPERIMENTAL)
+#
+# CONFIG_IP_SCTP is not set
+# CONFIG_ATM is not set
+# CONFIG_BRIDGE is not set
+# CONFIG_VLAN_8021Q is not set
+# CONFIG_DECNET is not set
+# CONFIG_LLC2 is not set
+# CONFIG_IPX is not set
+# CONFIG_ATALK is not set
+# CONFIG_X25 is not set
+# CONFIG_LAPB is not set
+# CONFIG_NET_DIVERT is not set
+# CONFIG_ECONET is not set
+# CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
+# CONFIG_NET_SCHED is not set
+# CONFIG_NET_CLS_ROUTE is not set
+
+#
+# Network testing
+#
+# CONFIG_NET_PKTGEN is not set
+# CONFIG_NETPOLL is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
+# CONFIG_HAMRADIO is not set
+# CONFIG_IRDA is not set
+# CONFIG_BT is not set
+CONFIG_NETDEVICES=y
+# CONFIG_DUMMY is not set
+# CONFIG_BONDING is not set
+# CONFIG_EQUALIZER is not set
+# CONFIG_TUN is not set
+
+#
+# Ethernet (10 or 100Mbit)
+#
+CONFIG_NET_ETHERNET=y
+CONFIG_MII=y
+# CONFIG_OAKNET is not set
+
+#
+# Ethernet (1000 Mbit)
+#
+
+#
+# Ethernet (10000 Mbit)
+#
+
+#
+# Token Ring devices
+#
+
+#
+# Wireless LAN (non-hamradio)
+#
+# CONFIG_NET_RADIO is not set
+
+#
+# Wan interfaces
+#
+# CONFIG_WAN is not set
+CONFIG_PPP=y
+# CONFIG_PPP_MULTILINK is not set
+# CONFIG_PPP_FILTER is not set
+CONFIG_PPP_ASYNC=y
+CONFIG_PPP_SYNC_TTY=y
+CONFIG_PPP_DEFLATE=y
+# CONFIG_PPP_BSDCOMP is not set
+# CONFIG_PPPOE is not set
+# CONFIG_SLIP is not set
+# CONFIG_SHAPER is not set
+# CONFIG_NETCONSOLE is not set
+
+#
+# ISDN subsystem
+#
+# CONFIG_ISDN is not set
+
+#
+# Telephony Support
+#
+# CONFIG_PHONE is not set
+
+#
+# Input device support
+#
+# CONFIG_INPUT is not set
+
+#
+# Hardware I/O ports
+#
+# CONFIG_SERIO is not set
+# CONFIG_GAMEPORT is not set
+
+#
+# Character devices
+#
+# CONFIG_VT is not set
+# CONFIG_SERIAL_NONSTANDARD is not set
+
+#
+# Serial drivers
+#
+# CONFIG_SERIAL_8250 is not set
+
+#
+# Non-8250 serial port support
+#
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+CONFIG_SERIAL_CPM=y
+CONFIG_SERIAL_CPM_CONSOLE=y
+# CONFIG_SERIAL_CPM_SCC1 is not set
+# CONFIG_SERIAL_CPM_SCC2 is not set
+# CONFIG_SERIAL_CPM_SCC3 is not set
+# CONFIG_SERIAL_CPM_SCC4 is not set
+CONFIG_SERIAL_CPM_SMC1=y
+CONFIG_SERIAL_CPM_SMC2=y
+CONFIG_UNIX98_PTYS=y
+# CONFIG_LEGACY_PTYS is not set
+
+#
+# IPMI
+#
+# CONFIG_IPMI_HANDLER is not set
+
+#
+# Watchdog Cards
+#
+# CONFIG_WATCHDOG is not set
+# CONFIG_NVRAM is not set
+# CONFIG_GEN_RTC is not set
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+
+#
+# Ftape, the floppy tape device driver
+#
+# CONFIG_AGP is not set
+# CONFIG_DRM is not set
+# CONFIG_RAW_DRIVER is not set
+
+#
+# TPM devices
+#
+
+#
+# I2C support
+#
+# CONFIG_I2C is not set
+
+#
+# Dallas's 1-wire bus
+#
+# CONFIG_W1 is not set
+
+#
+# Misc devices
+#
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+
+#
+# Digital Video Broadcasting Devices
+#
+# CONFIG_DVB is not set
+
+#
+# Graphics support
+#
+# CONFIG_FB is not set
+
+#
+# Sound
+#
+# CONFIG_SOUND is not set
+
+#
+# USB support
+#
+# CONFIG_USB_ARCH_HAS_HCD is not set
+# CONFIG_USB_ARCH_HAS_OHCI is not set
+
+#
+# USB Gadget Support
+#
+# CONFIG_USB_GADGET is not set
+
+#
+# MMC/SD Card support
+#
+# CONFIG_MMC is not set
+
+#
+# InfiniBand support
+#
+# CONFIG_INFINIBAND is not set
+
+#
+# File systems
+#
+CONFIG_EXT2_FS=y
+CONFIG_EXT2_FS_XATTR=y
+# CONFIG_EXT2_FS_POSIX_ACL is not set
+# CONFIG_EXT2_FS_SECURITY is not set
+CONFIG_EXT3_FS=y
+CONFIG_EXT3_FS_XATTR=y
+# CONFIG_EXT3_FS_POSIX_ACL is not set
+# CONFIG_EXT3_FS_SECURITY is not set
+CONFIG_JBD=y
+# CONFIG_JBD_DEBUG is not set
+CONFIG_FS_MBCACHE=y
+# CONFIG_REISERFS_FS is not set
+# CONFIG_JFS_FS is not set
+
+#
+# XFS support
+#
+# CONFIG_XFS_FS is not set
+# CONFIG_MINIX_FS is not set
+# CONFIG_ROMFS_FS is not set
+# CONFIG_QUOTA is not set
+# CONFIG_DNOTIFY is not set
+# CONFIG_AUTOFS_FS is not set
+# CONFIG_AUTOFS4_FS is not set
+
+#
+# CD-ROM/DVD Filesystems
+#
+# CONFIG_ISO9660_FS is not set
+# CONFIG_UDF_FS is not set
+
+#
+# DOS/FAT/NT Filesystems
+#
+# CONFIG_MSDOS_FS is not set
+# CONFIG_VFAT_FS is not set
+# CONFIG_NTFS_FS is not set
+
+#
+# Pseudo filesystems
+#
+CONFIG_PROC_FS=y
+# CONFIG_PROC_KCORE is not set
+CONFIG_SYSFS=y
+# CONFIG_DEVFS_FS is not set
+# CONFIG_DEVPTS_FS_XATTR is not set
+# CONFIG_TMPFS is not set
+# CONFIG_HUGETLBFS is not set
+# CONFIG_HUGETLB_PAGE is not set
+CONFIG_RAMFS=y
+
+#
+# Miscellaneous filesystems
+#
+# CONFIG_ADFS_FS is not set
+# CONFIG_AFFS_FS is not set
+# CONFIG_HFS_FS is not set
+# CONFIG_HFSPLUS_FS is not set
+# CONFIG_BEFS_FS is not set
+# CONFIG_BFS_FS is not set
+# CONFIG_EFS_FS is not set
+# CONFIG_CRAMFS is not set
+# CONFIG_VXFS_FS is not set
+# CONFIG_HPFS_FS is not set
+# CONFIG_QNX4FS_FS is not set
+# CONFIG_SYSV_FS is not set
+# CONFIG_UFS_FS is not set
+
+#
+# Network File Systems
+#
+CONFIG_NFS_FS=y
+# CONFIG_NFS_V3 is not set
+# CONFIG_NFS_V4 is not set
+# CONFIG_NFS_DIRECTIO is not set
+# CONFIG_NFSD is not set
+CONFIG_ROOT_NFS=y
+CONFIG_LOCKD=y
+CONFIG_SUNRPC=y
+# CONFIG_RPCSEC_GSS_KRB5 is not set
+# CONFIG_RPCSEC_GSS_SPKM3 is not set
+# CONFIG_SMB_FS is not set
+# CONFIG_CIFS is not set
+# CONFIG_NCP_FS is not set
+# CONFIG_CODA_FS is not set
+# CONFIG_AFS_FS is not set
+
+#
+# Partition Types
+#
+CONFIG_PARTITION_ADVANCED=y
+# CONFIG_ACORN_PARTITION is not set
+# CONFIG_OSF_PARTITION is not set
+# CONFIG_AMIGA_PARTITION is not set
+# CONFIG_ATARI_PARTITION is not set
+# CONFIG_MAC_PARTITION is not set
+CONFIG_MSDOS_PARTITION=y
+# CONFIG_BSD_DISKLABEL is not set
+# CONFIG_MINIX_SUBPARTITION is not set
+# CONFIG_SOLARIS_X86_PARTITION is not set
+# CONFIG_UNIXWARE_DISKLABEL is not set
+# CONFIG_LDM_PARTITION is not set
+# CONFIG_SGI_PARTITION is not set
+# CONFIG_ULTRIX_PARTITION is not set
+# CONFIG_SUN_PARTITION is not set
+# CONFIG_EFI_PARTITION is not set
+
+#
+# Native Language Support
+#
+# CONFIG_NLS is not set
+
+#
+# MPC8xx CPM Options
+#
+CONFIG_SCC_ENET=y
+# CONFIG_SCC1_ENET is not set
+# CONFIG_SCC2_ENET is not set
+CONFIG_SCC3_ENET=y
+# CONFIG_FEC_ENET is not set
+# CONFIG_ENET_BIG_BUFFERS is not set
+
+#
+# Generic MPC8xx Options
+#
+CONFIG_8xx_COPYBACK=y
+CONFIG_8xx_CPU6=y
+CONFIG_NO_UCODE_PATCH=y
+# CONFIG_USB_SOF_UCODE_PATCH is not set
+# CONFIG_I2C_SPI_UCODE_PATCH is not set
+# CONFIG_I2C_SPI_SMC1_UCODE_PATCH is not set
+
+#
+# Library routines
+#
+CONFIG_CRC_CCITT=y
+# CONFIG_CRC32 is not set
+# CONFIG_LIBCRC32C is not set
+CONFIG_ZLIB_INFLATE=y
+CONFIG_ZLIB_DEFLATE=y
+
+#
+# Profiling support
+#
+# CONFIG_PROFILING is not set
+
+#
+# Kernel hacking
+#
+# CONFIG_PRINTK_TIME is not set
+# CONFIG_DEBUG_KERNEL is not set
+CONFIG_LOG_BUF_SHIFT=14
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+# CONFIG_SECURITY is not set
+
+#
+# Cryptographic options
+#
+# CONFIG_CRYPTO is not set
+
+#
+# Hardware crypto devices
+#
diff -urN linux/arch/ppc/kernel/relocate_kernel.S 
linux/arch/ppc/kernel/relocate_kernel.S
--- linux/arch/ppc/kernel/relocate_kernel.S     2005/07/11 20:46:30     1.1
+++ linux/arch/ppc/kernel/relocate_kernel.S     2005/07/12 09:19:06     1.2
@@ -34,9 +34,9 @@
 
        mr      r8, r0
        ori     r8, r8, MSR_RI|MSR_ME
-       mtspr   SRR1, r8
+       mtspr   SPRN_SRR1, r8
        addi    r8, r4, 1f - relocate_new_kernel
-       mtspr   SRR0, r8
+       mtspr   SPRN_SRR0, r8
        sync
        rfi
 
diff -urN linux/arch/ppc/kernel/time.c linux/arch/ppc/kernel/time.c
--- linux/arch/ppc/kernel/time.c        2005/04/29 11:15:03     1.47
+++ linux/arch/ppc/kernel/time.c        2005/07/12 09:19:06     1.48
@@ -89,6 +89,9 @@
 
 extern unsigned long wall_jiffies;
 
+/* used for timezone offset */
+static long timezone_offset;
+
 DEFINE_SPINLOCK(rtc_lock);
 
 EXPORT_SYMBOL(rtc_lock);
@@ -170,7 +173,7 @@
                     xtime.tv_sec - last_rtc_update >= 659 &&
                     abs((xtime.tv_nsec / 1000) - (1000000-1000000/HZ)) < 
500000/HZ &&
                     jiffies - wall_jiffies == 1) {
-                       if (ppc_md.set_rtc_time(xtime.tv_sec+1 + time_offset) 
== 0)
+                       if (ppc_md.set_rtc_time(xtime.tv_sec+1 + 
timezone_offset) == 0)
                                last_rtc_update = xtime.tv_sec+1;
                        else
                                /* Try again one minute later */
@@ -286,7 +289,7 @@
        unsigned old_stamp, stamp, elapsed;
 
         if (ppc_md.time_init != NULL)
-                time_offset = ppc_md.time_init();
+                timezone_offset = ppc_md.time_init();
 
        if (__USE_RTC()) {
                /* 601 processor: dec counts down by 128 every 128ns */
@@ -331,10 +334,10 @@
        set_dec(tb_ticks_per_jiffy);
 
        /* If platform provided a timezone (pmac), we correct the time */
-        if (time_offset) {
-               sys_tz.tz_minuteswest = -time_offset / 60;
+        if (timezone_offset) {
+               sys_tz.tz_minuteswest = -timezone_offset / 60;
                sys_tz.tz_dsttime = 0;
-               xtime.tv_sec -= time_offset;
+               xtime.tv_sec -= timezone_offset;
         }
         set_normalized_timespec(&wall_to_monotonic,
                                 -xtime.tv_sec, -xtime.tv_nsec);
diff -urN linux/arch/ppc/platforms/mpc885ads.h 
linux/arch/ppc/platforms/mpc885ads.h
--- linux/arch/ppc/platforms/mpc885ads.h        1970/01/01 00:00:00
+++ linux/arch/ppc/platforms/mpc885ads.h        2005-07-12 10:19:07.114748000 
+0100     1.1
@@ -0,0 +1,92 @@
+/*
+ * A collection of structures, addresses, and values associated with
+ * the Freescale MPC885ADS board.
+ * Copied from the FADS stuff.
+ *
+ * Author: MontaVista Software, Inc.
+ *         source@mvista.com
+ *
+ * 2005 (c) MontaVista Software, Inc.  This file is licensed under the
+ * terms of the GNU General Public License version 2.  This program is licensed
+ * "as is" without any warranty of any kind, whether express or implied.
+ */
+
+#ifdef __KERNEL__
+#ifndef __ASM_MPC885ADS_H__
+#define __ASM_MPC885ADS_H__
+
+#include <linux/config.h>
+
+#include <asm/ppcboot.h>
+
+/* U-Boot maps BCSR to 0xff080000 */
+#define BCSR_ADDR              ((uint)0xff080000)
+#define BCSR_SIZE              ((uint)32)
+#define BCSR0                  ((uint)(BCSR_ADDR + 0x00))
+#define BCSR1                  ((uint)(BCSR_ADDR + 0x04))
+#define BCSR2                  ((uint)(BCSR_ADDR + 0x08))
+#define BCSR3                  ((uint)(BCSR_ADDR + 0x0c))
+#define BCSR4                  ((uint)(BCSR_ADDR + 0x10))
+
+#define CFG_PHYDEV_ADDR                ((uint)0xff0a0000)
+#define BCSR5                  ((uint)(CFG_PHYDEV_ADDR + 0x300))
+
+#define IMAP_ADDR              ((uint)0xff000000)
+#define IMAP_SIZE              ((uint)(64 * 1024))
+
+#define PCMCIA_MEM_ADDR                ((uint)0xff020000)
+#define PCMCIA_MEM_SIZE                ((uint)(64 * 1024))
+
+/* Bits of interest in the BCSRs.
+ */
+#define BCSR1_ETHEN            ((uint)0x20000000)
+#define BCSR1_IRDAEN           ((uint)0x10000000)
+#define BCSR1_RS232EN_1                ((uint)0x01000000)
+#define BCSR1_PCCEN            ((uint)0x00800000)
+#define BCSR1_PCCVCC0          ((uint)0x00400000)
+#define BCSR1_PCCVPP0          ((uint)0x00200000)
+#define BCSR1_PCCVPP1          ((uint)0x00100000)
+#define BCSR1_PCCVPP_MASK      (BCSR1_PCCVPP0 | BCSR1_PCCVPP1)
+#define BCSR1_RS232EN_2                ((uint)0x00040000)
+#define BCSR1_PCCVCC1          ((uint)0x00010000)
+#define BCSR1_PCCVCC_MASK      (BCSR1_PCCVCC0 | BCSR1_PCCVCC1)
+
+#define BCSR4_ETH10_RST                ((uint)0x80000000)      /* 10Base-T PHY 
reset*/
+#define BCSR4_USB_LO_SPD       ((uint)0x04000000)
+#define BCSR4_USB_VCC          ((uint)0x02000000)
+#define BCSR4_USB_FULL_SPD     ((uint)0x00040000)
+#define BCSR4_USB_EN           ((uint)0x00020000)
+
+#define BCSR5_MII2_EN          0x40
+#define BCSR5_MII2_RST         0x20
+#define BCSR5_T1_RST           0x10
+#define BCSR5_ATM155_RST       0x08
+#define BCSR5_ATM25_RST                0x04
+#define BCSR5_MII1_EN          0x02
+#define BCSR5_MII1_RST         0x01
+
+/* Interrupt level assignments */
+#define PHY_INTERRUPT  SIU_IRQ7        /* PHY link change interrupt */
+#define SIU_INT_FEC1   SIU_LEVEL1      /* FEC1 interrupt */
+#define SIU_INT_FEC2   SIU_LEVEL3      /* FEC2 interrupt */
+#define FEC_INTERRUPT  SIU_INT_FEC1    /* FEC interrupt */
+
+/* We don't use the 8259 */
+#define NR_8259_INTS   0
+
+/* CPM Ethernet through SCC3 */
+#define PA_ENET_RXD    ((ushort)0x0040)
+#define PA_ENET_TXD    ((ushort)0x0080)
+#define PE_ENET_TCLK   ((uint)0x00004000)
+#define PE_ENET_RCLK   ((uint)0x00008000)
+#define PE_ENET_TENA   ((uint)0x00000010)
+#define PC_ENET_CLSN   ((ushort)0x0400)
+#define PC_ENET_RENA   ((ushort)0x0800)
+
+/* Control bits in the SICR to route TCLK (CLK5) and RCLK (CLK6) to
+ * SCC3.  Also, make sure GR3 (bit 8) and SC3 (bit 9) are zero */
+#define SICR_ENET_MASK ((uint)0x00ff0000)
+#define SICR_ENET_CLKRT        ((uint)0x002c0000)
+
+#endif /* __ASM_MPC885ADS_H__ */
+#endif /* __KERNEL__ */
diff -urN linux/arch/ppc/platforms/fads.h linux/arch/ppc/platforms/fads.h
--- linux/arch/ppc/platforms/fads.h     2002/11/01 02:32:26     1.2
+++ linux/arch/ppc/platforms/fads.h     2005/07/12 09:19:07     1.3
@@ -3,7 +3,18 @@
  * the Motorola 860T FADS board.  Copied from the MBX stuff.
  *
  * Copyright (c) 1998 Dan Malek (dmalek@jlc.net)
+ *
+ * Added MPC86XADS support.
+ * The MPC86xADS manual says the board "is compatible with the MPC8xxFADS
+ * for SW point of view". This is 99% correct.
+ *
+ * Author: MontaVista Software, Inc.
+ *         source@mvista.com
+ * 2005 (c) MontaVista Software, Inc.  This file is licensed under the
+ * terms of the GNU General Public License version 2.  This program is licensed
+ * "as is" without any warranty of any kind, whether express or implied.
  */
+
 #ifdef __KERNEL__
 #ifndef __ASM_FADS_H__
 #define __ASM_FADS_H__
@@ -12,18 +23,45 @@
 
 #include <asm/ppcboot.h>
 
+#if defined(CONFIG_MPC86XADS)
+
+/* U-Boot maps BCSR to 0xff080000 */
+#define BCSR_ADDR              ((uint)0xff080000)
+
+/* MPC86XADS has one more CPLD and an additional BCSR.
+ */
+#define CFG_PHYDEV_ADDR                ((uint)0xff0a0000)
+#define BCSR5                  ((uint)(CFG_PHYDEV_ADDR + 0x300))
+
+#define BCSR5_T1_RST           0x10
+#define BCSR5_ATM155_RST       0x08
+#define BCSR5_ATM25_RST                0x04
+#define BCSR5_MII1_EN          0x02
+#define BCSR5_MII1_RST         0x01
+
+/* There is no PHY link change interrupt */
+#define PHY_INTERRUPT  (-1)
+
+#else /* FADS */
+
 /* Memory map is configured by the PROM startup.
  * I tried to follow the FADS manual, although the startup PROM
  * dictates this and we simply have to move some of the physical
  * addresses for Linux.
  */
 #define BCSR_ADDR              ((uint)0xff010000)
+
+/* PHY link change interrupt */
+#define PHY_INTERRUPT  SIU_IRQ2
+
+#endif /* CONFIG_MPC86XADS */
+
 #define BCSR_SIZE              ((uint)(64 * 1024))
-#define        BCSR0                   ((uint)0xff010000)
-#define        BCSR1                   ((uint)0xff010004)
-#define        BCSR2                   ((uint)0xff010008)
-#define        BCSR3                   ((uint)0xff01000c)
-#define        BCSR4                   ((uint)0xff010010)
+#define BCSR0                  ((uint)(BCSR_ADDR + 0x00))
+#define BCSR1                  ((uint)(BCSR_ADDR + 0x04))
+#define BCSR2                  ((uint)(BCSR_ADDR + 0x08))
+#define BCSR3                  ((uint)(BCSR_ADDR + 0x0c))
+#define BCSR4                  ((uint)(BCSR_ADDR + 0x10))
 
 #define IMAP_ADDR              ((uint)0xff000000)
 #define IMAP_SIZE              ((uint)(64 * 1024))
@@ -34,8 +72,17 @@
 /* Bits of interest in the BCSRs.
  */
 #define BCSR1_ETHEN            ((uint)0x20000000)
+#define BCSR1_IRDAEN           ((uint)0x10000000)
 #define BCSR1_RS232EN_1                ((uint)0x01000000)
+#define BCSR1_PCCEN            ((uint)0x00800000)
+#define BCSR1_PCCVCC0          ((uint)0x00400000)
+#define BCSR1_PCCVPP0          ((uint)0x00200000)
+#define BCSR1_PCCVPP1          ((uint)0x00100000)
+#define BCSR1_PCCVPP_MASK      (BCSR1_PCCVPP0 | BCSR1_PCCVPP1)
 #define BCSR1_RS232EN_2                ((uint)0x00040000)
+#define BCSR1_PCCVCC1          ((uint)0x00010000)
+#define BCSR1_PCCVCC_MASK      (BCSR1_PCCVCC0 | BCSR1_PCCVCC1)
+
 #define BCSR4_ETHLOOP          ((uint)0x80000000)      /* EEST Loopback */
 #define BCSR4_EEFDX            ((uint)0x40000000)      /* EEST FDX enable */
 #define BCSR4_FETH_EN          ((uint)0x08000000)      /* PHY enable */
@@ -44,14 +91,64 @@
 #define BCSR4_FETHFDE          ((uint)0x02000000)      /* PHY FDX advertise */
 #define BCSR4_FETHRST          ((uint)0x00200000)      /* PHY Reset */
 
+/* IO_BASE definition for pcmcia.
+ */
+#define _IO_BASE       0x80000000
+#define _IO_BASE_SIZE  0x1000
+
+#ifdef CONFIG_IDE
+#define MAX_HWIFS 1
+#endif
+
 /* Interrupt level assignments.
  */
 #define FEC_INTERRUPT  SIU_LEVEL1      /* FEC interrupt */
-#define PHY_INTERRUPT  SIU_IRQ2        /* PHY link change interrupt */
 
 /* We don't use the 8259.
  */
 #define NR_8259_INTS   0
 
+/* CPM Ethernet through SCC1 or SCC2 */
+
+#ifdef CONFIG_SCC1_ENET                /* Probably 860 variant */
+/* Bits in parallel I/O port registers that have to be set/cleared
+ * to configure the pins for SCC1 use.
+ * TCLK - CLK1, RCLK - CLK2.
+ */
+#define PA_ENET_RXD    ((ushort)0x0001)
+#define PA_ENET_TXD    ((ushort)0x0002)
+#define PA_ENET_TCLK   ((ushort)0x0100)
+#define PA_ENET_RCLK   ((ushort)0x0200)
+#define PB_ENET_TENA   ((uint)0x00001000)
+#define PC_ENET_CLSN   ((ushort)0x0010)
+#define PC_ENET_RENA   ((ushort)0x0020)
+
+/* Control bits in the SICR to route TCLK (CLK1) and RCLK (CLK2) to
+ * SCC1.  Also, make sure GR1 (bit 24) and SC1 (bit 25) are zero.
+ */
+#define SICR_ENET_MASK ((uint)0x000000ff)
+#define SICR_ENET_CLKRT        ((uint)0x0000002c)
+#endif /* CONFIG_SCC1_ENET */
+
+#ifdef CONFIG_SCC2_ENET                /* Probably 823/850 variant */
+/* Bits in parallel I/O port registers that have to be set/cleared
+ * to configure the pins for SCC1 use.
+ * TCLK - CLK1, RCLK - CLK2.
+ */
+#define PA_ENET_RXD    ((ushort)0x0004)
+#define PA_ENET_TXD    ((ushort)0x0008)
+#define PA_ENET_TCLK   ((ushort)0x0400)
+#define PA_ENET_RCLK   ((ushort)0x0200)
+#define PB_ENET_TENA   ((uint)0x00002000)
+#define PC_ENET_CLSN   ((ushort)0x0040)
+#define PC_ENET_RENA   ((ushort)0x0080)
+
+/* Control bits in the SICR to route TCLK and RCLK to
+ * SCC2.  Also, make sure GR1 (bit 24) and SC1 (bit 25) are zero.
+ */
+#define SICR_ENET_MASK ((uint)0x0000ff00)
+#define SICR_ENET_CLKRT        ((uint)0x00002e00)
+#endif /* CONFIG_SCC2_ENET */
+
 #endif /* __ASM_FADS_H__ */
 #endif /* __KERNEL__ */
diff -urN linux/arch/ppc/platforms/85xx/mpc8540_ads.c 
linux/arch/ppc/platforms/85xx/mpc8540_ads.c
--- linux/arch/ppc/platforms/85xx/mpc8540_ads.c 2005/07/11 20:46:32     1.9
+++ linux/arch/ppc/platforms/85xx/mpc8540_ads.c 2005/07/12 09:19:07     1.10
@@ -111,8 +111,8 @@
                memcpy(pdata->mac_addr, binfo->bi_enet1addr, 6);
        }
 
+       pdata = (struct gianfar_platform_data *) ppc_sys_get_pdata(MPC85xx_FEC);
        if (pdata) {
-               pdata = (struct gianfar_platform_data *) 
ppc_sys_get_pdata(MPC85xx_FEC);
                pdata->board_flags = 0;
                pdata->interruptPHY = MPC85xx_IRQ_EXT5;
                pdata->phyid = 3;
diff -urN linux/arch/ppc/syslib/ppc4xx_pic.c linux/arch/ppc/syslib/ppc4xx_pic.c
--- linux/arch/ppc/syslib/ppc4xx_pic.c  2005/04/29 11:15:03     1.9
+++ linux/arch/ppc/syslib/ppc4xx_pic.c  2005/07/12 09:19:07     1.10
@@ -110,6 +110,10 @@
 
 static void __init ppc4xx_pic_impl_init(void)
 {
+#if defined(CONFIG_440GX)
+       /* Disable 440GP compatibility mode if it was enabled in firmware */
+       SDR_WRITE(DCRN_SDR_MFR, SDR_READ(DCRN_SDR_MFR) & ~DCRN_SDR_MFR_PCM);
+#endif
        /* Configure Base UIC */
        mtdcr(DCRN_UIC_CR(UICB), 0);
        mtdcr(DCRN_UIC_TR(UICB), 0);
diff -urN linux/arch/ppc64/boot/Makefile linux/arch/ppc64/boot/Makefile
--- linux/arch/ppc64/boot/Makefile      2005/03/18 17:36:58     1.22
+++ linux/arch/ppc64/boot/Makefile      2005/07/12 09:19:07     1.23
@@ -52,7 +52,7 @@
 src-sec = $(foreach section, $(1), $(patsubst %,$(obj)/kernel-%.c, $(section)))
 gz-sec  = $(foreach section, $(1), $(patsubst %,$(obj)/kernel-%.gz, 
$(section)))
 
-hostprogs-y            := piggy addnote addRamDisk
+hostprogs-y            := addnote addRamDisk
 targets                += zImage zImage.initrd imagesize.c \
                           $(patsubst $(obj)/%,%, $(call obj-sec, $(required) 
$(initrd))) \
                           $(patsubst $(obj)/%,%, $(call src-sec, $(required) 
$(initrd))) \
@@ -78,9 +78,6 @@
 quiet_cmd_addnote = ADDNOTE $@ 
       cmd_addnote = $(CROSS32LD) $(BOOTLFLAGS) -o $@ $(obj-boot) && 
$(obj)/addnote $@
 
-quiet_cmd_piggy = PIGGY   $@
-      cmd_piggy = $(obj)/piggyback $(@:.o=) < $< | $(CROSS32AS) -o $@
-
 $(call gz-sec, $(required)): $(obj)/kernel-%.gz: % FORCE
        $(call if_changed,gzip)
 
diff -urN linux/arch/ppc64/boot/main.c linux/arch/ppc64/boot/main.c
--- linux/arch/ppc64/boot/main.c        2005/05/19 12:08:14     1.13
+++ linux/arch/ppc64/boot/main.c        2005/07/12 09:19:07     1.14
@@ -17,7 +17,6 @@
 
 extern void *finddevice(const char *);
 extern int getprop(void *, const char *, void *, int);
-extern void printk(char *fmt, ...);
 extern void printf(const char *fmt, ...);
 extern int sprintf(char *buf, const char *fmt, ...);
 void gunzip(void *, int, unsigned char *, int *);
@@ -147,10 +146,10 @@
                }
                a1 = initrd.addr;
                a2 = initrd.size;
-               printf("initial ramdisk moving 0x%lx <- 0x%lx (%lx bytes)\n\r",
+               printf("initial ramdisk moving 0x%lx <- 0x%lx (0x%lx 
bytes)\n\r",
                       initrd.addr, (unsigned long)_initrd_start, initrd.size);
                memmove((void *)initrd.addr, (void *)_initrd_start, 
initrd.size);
-               printf("initrd head: 0x%lx\n\r", *((u32 *)initrd.addr));
+               printf("initrd head: 0x%lx\n\r", *((unsigned long 
*)initrd.addr));
        }
 
        /* Eventually gunzip the kernel */
@@ -201,9 +200,6 @@
 
        flush_cache((void *)vmlinux.addr, vmlinux.size);
 
-       if (a1)
-               printf("initrd head: 0x%lx\n\r", *((u32 *)initrd.addr));
-
        kernel_entry = (kernel_entry_t)vmlinux.addr;
 #ifdef DEBUG
        printf( "kernel:\n\r"
diff -urN linux/arch/ppc64/boot/prom.c linux/arch/ppc64/boot/prom.c
--- linux/arch/ppc64/boot/prom.c        2005/06/18 14:42:42     1.5
+++ linux/arch/ppc64/boot/prom.c        2005/07/12 09:19:07     1.6
@@ -40,7 +40,7 @@
 int getprop(void *phandle, const char *name, void *buf, int buflen);
 void chrpboot(int a1, int a2, void *prom);     /* in main.c */
 
-void printk(char *fmt, ...);
+int printf(char *fmt, ...);
 
 /* there is no convenient header to get this from...  -- paulus */
 extern unsigned long strlen(const char *);
@@ -220,7 +220,7 @@
                case 1:
                        return ch;
                case -1:
-                       printk("read(stdin) returned -1\r\n");
+                       printf("read(stdin) returned -1\r\n");
                        return -1;
                }
        }
@@ -627,18 +627,6 @@
 
 static char sprint_buf[1024];
 
-void
-printk(char *fmt, ...)
-{
-       va_list args;
-       int n;
-
-       va_start(args, fmt);
-       n = vsprintf(sprint_buf, fmt, args);
-       va_end(args);
-       write(stdout, sprint_buf, n);
-}
-
 int
 printf(char *fmt, ...)
 {
diff -urN linux/arch/ppc64/boot/mknote.c linux/arch/ppc64/boot/mknote.c
--- linux/arch/ppc64/boot/Attic/mknote.c        2005-07-12 10:19:07.634245000 
+0100     1.2
+++ linux/arch/ppc64/boot/Attic/mknote.c        1970/01/01 00:00:00+0100
@@ -1,43 +0,0 @@
-/*
- * Copyright (C) Cort Dougan 1999.
- *
- * 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.
- *
- * Generate a note section as per the CHRP specification.
- *
- */
-
-#include <stdio.h>
-
-#define PL(x) printf("%c%c%c%c", ((x)>>24)&0xff, ((x)>>16)&0xff, 
((x)>>8)&0xff, (x)&0xff );
-
-int main(void)
-{
-/* header */
-       /* namesz */
-       PL(strlen("PowerPC")+1);
-       /* descrsz */
-       PL(6*4);
-       /* type */
-       PL(0x1275);
-       /* name */
-       printf("PowerPC"); printf("%c", 0);
-       
-/* descriptor */
-       /* real-mode */
-       PL(0xffffffff);
-       /* real-base */
-       PL(0x00c00000);
-       /* real-size */
-       PL(0xffffffff);
-       /* virt-base */
-       PL(0xffffffff);
-       /* virt-size */
-       PL(0xffffffff);
-       /* load-base */
-       PL(0x4000);
-       return 0;
-}
diff -urN linux/arch/ppc64/boot/piggyback.c linux/arch/ppc64/boot/piggyback.c
--- linux/arch/ppc64/boot/Attic/piggyback.c     2005-07-12 10:19:07.678344000 
+0100     1.2
+++ linux/arch/ppc64/boot/Attic/piggyback.c     1970/01/01 00:00:00+0100
@@ -1,83 +0,0 @@
-/*
- * Copyright 2001 IBM Corp 
- *
- * 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.
- */
-#include <stdio.h>
-#include <unistd.h>
-#include <string.h>
-
-extern long ce_exec_config[];
-
-int main(int argc, char *argv[])
-{
-       int i, cnt, pos, len;
-       unsigned int cksum, val;
-       unsigned char *lp;
-       unsigned char buf[8192];
-       char *varname;
-       if (argc != 2)
-       {
-               fprintf(stderr, "usage: %s name <in-file >out-file\n",
-                       argv[0]);
-               exit(1);
-       }
-
-       varname = strrchr(argv[1], '/');
-       if (varname)
-               varname++;
-       else
-               varname = argv[1];
-
-       fprintf(stdout, "#\n");
-       fprintf(stdout, "# Miscellaneous data structures:\n");
-       fprintf(stdout, "# WARNING - this file is automatically generated!\n");
-       fprintf(stdout, "#\n");
-       fprintf(stdout, "\n");
-       fprintf(stdout, "\t.data\n");
-       fprintf(stdout, "\t.globl %s_data\n", varname);
-       fprintf(stdout, "%s_data:\n", varname);
-       pos = 0;
-       cksum = 0;
-       while ((len = read(0, buf, sizeof(buf))) > 0)
-       {
-               cnt = 0;
-               lp = (unsigned char *)buf;
-               len = (len + 3) & ~3;  /* Round up to longwords */
-               for (i = 0;  i < len;  i += 4)
-               {
-                       if (cnt == 0)
-                       {
-                               fprintf(stdout, "\t.long\t");
-                       }
-                       fprintf(stdout, "0x%02X%02X%02X%02X", lp[0], lp[1], 
lp[2], lp[3]);
-                       val = *(unsigned long *)lp;
-                       cksum ^= val;
-                       lp += 4;
-                       if (++cnt == 4)
-                       {
-                               cnt = 0;
-                               fprintf(stdout, " # %x \n", pos+i-12);
-                               fflush(stdout);
-                       } else
-                       {
-                               fprintf(stdout, ",");
-                       }
-               }
-               if (cnt)
-               {
-                       fprintf(stdout, "0\n");
-               }
-               pos += len;
-       }
-       fprintf(stdout, "\t.globl %s_len\n", varname);
-       fprintf(stdout, "%s_len:\t.long\t0x%x\n", varname, pos);
-       fflush(stdout);
-       fclose(stdout);
-       fprintf(stderr, "cksum = %x\n", cksum);
-       exit(0);
-}
-
diff -urN linux/arch/ppc64/kernel/ItLpQueue.c 
linux/arch/ppc64/kernel/ItLpQueue.c
--- linux/arch/ppc64/kernel/ItLpQueue.c 2005/07/11 20:46:34     1.8
+++ linux/arch/ppc64/kernel/ItLpQueue.c 2005/07/12 09:19:07     1.9
@@ -1,7 +1,7 @@
 /*
  * ItLpQueue.c
  * Copyright (C) 2001 Mike Corrigan  IBM Corporation
- * 
+ *
  * 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
@@ -11,156 +11,252 @@
 #include <linux/stddef.h>
 #include <linux/kernel.h>
 #include <linux/sched.h>
+#include <linux/bootmem.h>
+#include <linux/seq_file.h>
+#include <linux/proc_fs.h>
 #include <asm/system.h>
 #include <asm/paca.h>
 #include <asm/iSeries/ItLpQueue.h>
 #include <asm/iSeries/HvLpEvent.h>
 #include <asm/iSeries/HvCallEvent.h>
 
-static __inline__ int set_inUse( struct ItLpQueue * lpQueue )
-{
-       int t;
-       u32 * inUseP = &(lpQueue->xInUseWord);
+/*
+ * The LpQueue is used to pass event data from the hypervisor to
+ * the partition.  This is where I/O interrupt events are communicated.
+ *
+ * It is written to by the hypervisor so cannot end up in the BSS.
+ */
+struct hvlpevent_queue hvlpevent_queue __attribute__((__section__(".data")));
 
-       __asm__ __volatile__("\n\
-1:     lwarx   %0,0,%2         \n\
-       cmpwi   0,%0,0          \n\
-       li      %0,0            \n\
-       bne-    2f              \n\
-       addi    %0,%0,1         \n\
-       stwcx.  %0,0,%2         \n\
-       bne-    1b              \n\
-2:     eieio"
-       : "=&r" (t), "=m" (lpQueue->xInUseWord)
-       : "r" (inUseP), "m" (lpQueue->xInUseWord)
-       : "cc");
+DEFINE_PER_CPU(unsigned long[HvLpEvent_Type_NumTypes], hvlpevent_counts);
 
-       return t;
-}
-
-static __inline__ void clear_inUse( struct ItLpQueue * lpQueue )
-{
-       lpQueue->xInUseWord = 0;
-}
+static char *event_types[HvLpEvent_Type_NumTypes] = {
+       "Hypervisor",
+       "Machine Facilities",
+       "Session Manager",
+       "SPD I/O",
+       "Virtual Bus",
+       "PCI I/O",
+       "RIO I/O",
+       "Virtual Lan",
+       "Virtual I/O"
+};
 
 /* Array of LpEvent handler functions */
 extern LpEventHandler lpEventHandler[HvLpEvent_Type_NumTypes];
-unsigned long ItLpQueueInProcess = 0;
 
-struct HvLpEvent * ItLpQueue_getNextLpEvent( struct ItLpQueue * lpQueue )
+static struct HvLpEvent * get_next_hvlpevent(void)
 {
-       struct HvLpEvent * nextLpEvent = 
-               (struct HvLpEvent *)lpQueue->xSlicCurEventPtr;
-       if ( nextLpEvent->xFlags.xValid ) {
+       struct HvLpEvent * event;
+       event = (struct HvLpEvent *)hvlpevent_queue.xSlicCurEventPtr;
+
+       if (event->xFlags.xValid) {
                /* rmb() needed only for weakly consistent machines (regatta) */
                rmb();
                /* Set pointer to next potential event */
-               lpQueue->xSlicCurEventPtr += ((nextLpEvent->xSizeMinus1 +
-                                     LpEventAlign ) /
-                                     LpEventAlign ) *
-                                     LpEventAlign;
+               hvlpevent_queue.xSlicCurEventPtr += ((event->xSizeMinus1 +
+                               LpEventAlign) / LpEventAlign) * LpEventAlign;
+
                /* Wrap to beginning if no room at end */
-               if (lpQueue->xSlicCurEventPtr > lpQueue->xSlicLastValidEventPtr)
-                       lpQueue->xSlicCurEventPtr = lpQueue->xSlicEventStackPtr;
+               if (hvlpevent_queue.xSlicCurEventPtr >
+                               hvlpevent_queue.xSlicLastValidEventPtr) {
+                       hvlpevent_queue.xSlicCurEventPtr =
+                               hvlpevent_queue.xSlicEventStackPtr;
+               }
+       } else {
+               event = NULL;
        }
-       else 
-               nextLpEvent = NULL;
 
-       return nextLpEvent;
+       return event;
+}
+
+static unsigned long spread_lpevents = NR_CPUS;
+
+int hvlpevent_is_pending(void)
+{
+       struct HvLpEvent *next_event;
+
+       if (smp_processor_id() >= spread_lpevents)
+               return 0;
+
+       next_event = (struct HvLpEvent *)hvlpevent_queue.xSlicCurEventPtr;
+
+       return next_event->xFlags.xValid |
+               hvlpevent_queue.xPlicOverflowIntPending;
 }
 
-int ItLpQueue_isLpIntPending( struct ItLpQueue * lpQueue )
-{
-       int retval = 0;
-       struct HvLpEvent * nextLpEvent;
-       if ( lpQueue ) {
-               nextLpEvent = (struct HvLpEvent *)lpQueue->xSlicCurEventPtr;
-               retval = nextLpEvent->xFlags.xValid | 
lpQueue->xPlicOverflowIntPending;
-       }
-       return retval;
-}
-
-void ItLpQueue_clearValid( struct HvLpEvent * event )
-{
-       /* Clear the valid bit of the event
-        * Also clear bits within this event that might
-        * look like valid bits (on 64-byte boundaries)
-        */
-       unsigned extra = (( event->xSizeMinus1 + LpEventAlign ) /
-                                                LpEventAlign ) - 1;
-       switch ( extra ) {
-         case 3:
-          ((struct HvLpEvent*)((char*)event+3*LpEventAlign))->xFlags.xValid=0;
-         case 2:
-          ((struct HvLpEvent*)((char*)event+2*LpEventAlign))->xFlags.xValid=0;
-         case 1:
-          ((struct HvLpEvent*)((char*)event+1*LpEventAlign))->xFlags.xValid=0;
-         case 0:
-          ;    
+static void hvlpevent_clear_valid(struct HvLpEvent * event)
+{
+       /* Tell the Hypervisor that we're done with this event.
+        * Also clear bits within this event that might look like valid bits.
+        * ie. on 64-byte boundaries.
+        */
+       struct HvLpEvent *tmp;
+       unsigned extra = ((event->xSizeMinus1 + LpEventAlign) /
+                                                LpEventAlign) - 1;
+
+       switch (extra) {
+       case 3:
+               tmp = (struct HvLpEvent*)((char*)event + 3 * LpEventAlign);
+               tmp->xFlags.xValid = 0;
+       case 2:
+               tmp = (struct HvLpEvent*)((char*)event + 2 * LpEventAlign);
+               tmp->xFlags.xValid = 0;
+       case 1:
+               tmp = (struct HvLpEvent*)((char*)event + 1 * LpEventAlign);
+               tmp->xFlags.xValid = 0;
        }
+
        mb();
+
        event->xFlags.xValid = 0;
 }
 
-unsigned ItLpQueue_process( struct ItLpQueue * lpQueue, struct pt_regs *regs )
+void process_hvlpevents(struct pt_regs *regs)
 {
-       unsigned numIntsProcessed = 0;
-       struct HvLpEvent * nextLpEvent;
+       struct HvLpEvent * event;
 
        /* If we have recursed, just return */
-       if ( !set_inUse( lpQueue ) )
-               return 0;
-       
-       if (ItLpQueueInProcess == 0)
-               ItLpQueueInProcess = 1;
-       else
-               BUG();
+       if (!spin_trylock(&hvlpevent_queue.lock))
+               return;
 
        for (;;) {
-               nextLpEvent = ItLpQueue_getNextLpEvent( lpQueue );
-               if ( nextLpEvent ) {
-                       /* Count events to return to caller
-                        * and count processed events in lpQueue
-                        */
-                       ++numIntsProcessed;
-                       lpQueue->xLpIntCount++;         
-                       /* Call appropriate handler here, passing 
+               event = get_next_hvlpevent();
+               if (event) {
+                       /* Call appropriate handler here, passing
                         * a pointer to the LpEvent.  The handler
                         * must make a copy of the LpEvent if it
                         * needs it in a bottom half. (perhaps for
                         * an ACK)
-                        *      
-                        *  Handlers are responsible for ACK processing 
+                        *
+                        *  Handlers are responsible for ACK processing
                         *
                         * The Hypervisor guarantees that LpEvents will
                         * only be delivered with types that we have
                         * registered for, so no type check is necessary
                         * here!
-                        */
-                       if ( nextLpEvent->xType < HvLpEvent_Type_NumTypes )
-                               
lpQueue->xLpIntCountByType[nextLpEvent->xType]++;
-                       if ( nextLpEvent->xType < HvLpEvent_Type_NumTypes &&
-                            lpEventHandler[nextLpEvent->xType] ) 
-                               lpEventHandler[nextLpEvent->xType](nextLpEvent, 
regs);
+                        */
+                       if (event->xType < HvLpEvent_Type_NumTypes)
+                               __get_cpu_var(hvlpevent_counts)[event->xType]++;
+                       if (event->xType < HvLpEvent_Type_NumTypes &&
+                                       lpEventHandler[event->xType])
+                               lpEventHandler[event->xType](event, regs);
                        else
-                               printk(KERN_INFO "Unexpected Lp Event 
type=%d\n", nextLpEvent->xType );
-                       
-                       ItLpQueue_clearValid( nextLpEvent );
-               } else if ( lpQueue->xPlicOverflowIntPending )
+                               printk(KERN_INFO "Unexpected Lp Event 
type=%d\n", event->xType );
+
+                       hvlpevent_clear_valid(event);
+               } else if (hvlpevent_queue.xPlicOverflowIntPending)
                        /*
                         * No more valid events. If overflow events are
                         * pending process them
                         */
-                       HvCallEvent_getOverflowLpEvents( lpQueue->xIndex);
+                       HvCallEvent_getOverflowLpEvents(hvlpevent_queue.xIndex);
                else
                        break;
        }
 
-       ItLpQueueInProcess = 0;
-       mb();
-       clear_inUse( lpQueue );
+       spin_unlock(&hvlpevent_queue.lock);
+}
 
-       get_paca()->lpevent_count += numIntsProcessed;
+static int set_spread_lpevents(char *str)
+{
+       unsigned long val = simple_strtoul(str, NULL, 0);
 
-       return numIntsProcessed;
+       /*
+        * The parameter is the number of processors to share in processing
+        * lp events.
+        */
+       if (( val > 0) && (val <= NR_CPUS)) {
+               spread_lpevents = val;
+               printk("lpevent processing spread over %ld processors\n", val);
+       } else {
+               printk("invalid spread_lpevents %ld\n", val);
+       }
+
+       return 1;
 }
+__setup("spread_lpevents=", set_spread_lpevents);
+
+void setup_hvlpevent_queue(void)
+{
+       void *eventStack;
+
+       /*
+        * Allocate a page for the Event Stack. The Hypervisor needs the
+        * absolute real address, so we subtract out the KERNELBASE and add
+        * in the absolute real address of the kernel load area.
+        */
+       eventStack = alloc_bootmem_pages(LpEventStackSize);
+       memset(eventStack, 0, LpEventStackSize);
+
+       /* Invoke the hypervisor to initialize the event stack */
+       HvCallEvent_setLpEventStack(0, eventStack, LpEventStackSize);
+
+       hvlpevent_queue.xSlicEventStackPtr = (char *)eventStack;
+       hvlpevent_queue.xSlicCurEventPtr = (char *)eventStack;
+       hvlpevent_queue.xSlicLastValidEventPtr = (char *)eventStack +
+                                       (LpEventStackSize - LpEventMaxSize);
+       hvlpevent_queue.xIndex = 0;
+}
+
+static int proc_lpevents_show(struct seq_file *m, void *v)
+{
+       int cpu, i;
+       unsigned long sum;
+       static unsigned long cpu_totals[NR_CPUS];
+
+       /* FIXME: do we care that there's no locking here? */
+       sum = 0;
+       for_each_online_cpu(cpu) {
+               cpu_totals[cpu] = 0;
+               for (i = 0; i < HvLpEvent_Type_NumTypes; i++) {
+                       cpu_totals[cpu] += per_cpu(hvlpevent_counts, cpu)[i];
+               }
+               sum += cpu_totals[cpu];
+       }
+
+       seq_printf(m, "LpEventQueue 0\n");
+       seq_printf(m, "  events processed:\t%lu\n", sum);
+
+       for (i = 0; i < HvLpEvent_Type_NumTypes; ++i) {
+               sum = 0;
+               for_each_online_cpu(cpu) {
+                       sum += per_cpu(hvlpevent_counts, cpu)[i];
+               }
+
+               seq_printf(m, "    %-20s %10lu\n", event_types[i], sum);
+       }
+
+       seq_printf(m, "\n  events processed by processor:\n");
+
+       for_each_online_cpu(cpu) {
+               seq_printf(m, "    CPU%02d  %10lu\n", cpu, cpu_totals[cpu]);
+       }
+
+       return 0;
+}
+
+static int proc_lpevents_open(struct inode *inode, struct file *file)
+{
+       return single_open(file, proc_lpevents_show, NULL);
+}
+
+static struct file_operations proc_lpevents_operations = {
+       .open           = proc_lpevents_open,
+       .read           = seq_read,
+       .llseek         = seq_lseek,
+       .release        = single_release,
+};
+
+static int __init proc_lpevents_init(void)
+{
+       struct proc_dir_entry *e;
+
+       e = create_proc_entry("iSeries/lpevents", S_IFREG|S_IRUGO, NULL);
+       if (e)
+               e->proc_fops = &proc_lpevents_operations;
+
+       return 0;
+}
+__initcall(proc_lpevents_init);
+
diff -urN linux/arch/ppc64/kernel/LparData.c linux/arch/ppc64/kernel/LparData.c
--- linux/arch/ppc64/kernel/LparData.c  2005/03/18 17:36:58     1.14
+++ linux/arch/ppc64/kernel/LparData.c  2005/07/12 09:19:07     1.15
@@ -28,13 +28,6 @@
 #include <asm/iSeries/IoHriProcessorVpd.h>
 #include <asm/iSeries/ItSpCommArea.h>
 
-/* The LpQueue is used to pass event data from the hypervisor to
- * the partition.  This is where I/O interrupt events are communicated.
- */
-
-/* May be filled in by the hypervisor so cannot end up in the BSS */
-struct ItLpQueue xItLpQueue __attribute__((__section__(".data")));
-
 
 /* The HvReleaseData is the root of the information shared between 
  * the hypervisor and Linux.  
@@ -200,7 +193,7 @@
                0,0,0,                  /* 13 - 15 */
                sizeof(struct IoHriProcessorVpd),/* 16 length of Proc Vpd */
                0,0,0,0,0,0,            /* 17 - 22  */
-               sizeof(struct ItLpQueue),/*     23 length of Lp Queue */
+               sizeof(struct hvlpevent_queue), /* 23 length of Lp Queue */
                0,0                     /* 24 - 25 */
                },
        .xSlicVpdAdrs = {                       /* VPD addresses */
@@ -218,7 +211,7 @@
                0,0,0,                  /* 13 - 15 */
                &xIoHriProcessorVpd,    /*      16 Proc Vpd */
                0,0,0,0,0,0,            /* 17 - 22 */
-               &xItLpQueue,            /*      23 Lp Queue */
+               &hvlpevent_queue,       /*      23 Lp Queue */
                0,0
        }
 };
diff -urN linux/arch/ppc64/kernel/iSeries_proc.c 
linux/arch/ppc64/kernel/iSeries_proc.c
--- linux/arch/ppc64/kernel/iSeries_proc.c      2005/07/11 20:46:34     1.8
+++ linux/arch/ppc64/kernel/iSeries_proc.c      2005/07/12 09:19:07     1.9
@@ -40,50 +40,6 @@
 }
 core_initcall(iseries_proc_create);
 
-static char *event_types[9] = {
-       "Hypervisor\t\t",
-       "Machine Facilities\t",
-       "Session Manager\t",
-       "SPD I/O\t\t",
-       "Virtual Bus\t\t",
-       "PCI I/O\t\t",
-       "RIO I/O\t\t",
-       "Virtual Lan\t\t",
-       "Virtual I/O\t\t"
-};
-
-static int proc_lpevents_show(struct seq_file *m, void *v)
-{
-       unsigned int i;
-
-       seq_printf(m, "LpEventQueue 0\n");
-       seq_printf(m, "  events processed:\t%lu\n",
-                  (unsigned long)xItLpQueue.xLpIntCount);
-
-       for (i = 0; i < 9; ++i)
-               seq_printf(m, "    %s %10lu\n", event_types[i],
-                          (unsigned long)xItLpQueue.xLpIntCountByType[i]);
-
-       seq_printf(m, "\n  events processed by processor:\n");
-
-       for_each_online_cpu(i)
-               seq_printf(m, "    CPU%02d  %10u\n", i, paca[i].lpevent_count);
-
-       return 0;
-}
-
-static int proc_lpevents_open(struct inode *inode, struct file *file)
-{
-       return single_open(file, proc_lpevents_show, NULL);
-}
-
-static struct file_operations proc_lpevents_operations = {
-       .open           = proc_lpevents_open,
-       .read           = seq_read,
-       .llseek         = seq_lseek,
-       .release        = single_release,
-};
-
 static unsigned long startTitan = 0;
 static unsigned long startTb = 0;
 
@@ -148,10 +104,6 @@
 {
        struct proc_dir_entry *e;
 
-       e = create_proc_entry("iSeries/lpevents", S_IFREG|S_IRUGO, NULL);
-       if (e)
-               e->proc_fops = &proc_lpevents_operations;
-
        e = create_proc_entry("iSeries/titanTod", S_IFREG|S_IRUGO, NULL);
        if (e)
                e->proc_fops = &proc_titantod_operations;
diff -urN linux/arch/ppc64/kernel/iSeries_setup.c 
linux/arch/ppc64/kernel/iSeries_setup.c
--- linux/arch/ppc64/kernel/iSeries_setup.c     2005/07/11 20:46:34     1.28
+++ linux/arch/ppc64/kernel/iSeries_setup.c     2005/07/12 09:19:07     1.29
@@ -24,7 +24,6 @@
 #include <linux/smp.h>
 #include <linux/param.h>
 #include <linux/string.h>
-#include <linux/bootmem.h>
 #include <linux/initrd.h>
 #include <linux/seq_file.h>
 #include <linux/kdev_t.h>
@@ -676,7 +675,6 @@
  */
 static void __init iSeries_setup_arch(void)
 {
-       void *eventStack;
        unsigned procIx = get_paca()->lppaca.dyn_hv_phys_proc_index;
 
        /* Add an eye catcher and the systemcfg layout version number */
@@ -685,24 +683,7 @@
        systemcfg->version.minor = SYSTEMCFG_MINOR;
 
        /* Setup the Lp Event Queue */
-
-       /* Allocate a page for the Event Stack
-        * The hypervisor wants the absolute real address, so
-        * we subtract out the KERNELBASE and add in the
-        * absolute real address of the kernel load area
-        */
-       eventStack = alloc_bootmem_pages(LpEventStackSize);
-       memset(eventStack, 0, LpEventStackSize);
-
-       /* Invoke the hypervisor to initialize the event stack */
-       HvCallEvent_setLpEventStack(0, eventStack, LpEventStackSize);
-
-       /* Initialize fields in our Lp Event Queue */
-       xItLpQueue.xSlicEventStackPtr = (char *)eventStack;
-       xItLpQueue.xSlicCurEventPtr = (char *)eventStack;
-       xItLpQueue.xSlicLastValidEventPtr = (char *)eventStack +
-                                       (LpEventStackSize - LpEventMaxSize);
-       xItLpQueue.xIndex = 0;
+       setup_hvlpevent_queue();
 
        /* Compute processor frequency */
        procFreqHz = ((1UL << 34) * 1000000) /
@@ -853,28 +834,6 @@
 
 late_initcall(iSeries_src_init);
 
-static int set_spread_lpevents(char *str)
-{
-       unsigned long i;
-       unsigned long val = simple_strtoul(str, NULL, 0);
-
-       /*
-        * The parameter is the number of processors to share in processing
-        * lp events.
-        */
-       if (( val > 0) && (val <= NR_CPUS)) {
-               for (i = 1; i < val; ++i)
-                       paca[i].lpqueue_ptr = paca[0].lpqueue_ptr;
-
-               printk("lpevent processing spread over %ld processors\n", val);
-       } else {
-               printk("invalid spread_lpevents %ld\n", val);
-       }
-
-       return 1;
-}
-__setup("spread_lpevents=", set_spread_lpevents);
-
 #ifndef CONFIG_PCI
 void __init iSeries_init_IRQ(void) { }
 #endif
diff -urN linux/arch/ppc64/kernel/idle.c linux/arch/ppc64/kernel/idle.c
--- linux/arch/ppc64/kernel/idle.c      2005/07/11 20:46:34     1.20
+++ linux/arch/ppc64/kernel/idle.c      2005/07/12 09:19:07     1.21
@@ -88,7 +88,7 @@
 
        while (1) {
                if (lpaca->lppaca.shared_proc) {
-                       if (ItLpQueue_isLpIntPending(lpaca->lpqueue_ptr))
+                       if (hvlpevent_is_pending())
                                process_iSeries_events();
                        if (!need_resched())
                                yield_shared_processor();
@@ -100,7 +100,7 @@
 
                                while (!need_resched()) {
                                        HMT_medium();
-                                       if 
(ItLpQueue_isLpIntPending(lpaca->lpqueue_ptr))
+                                       if (hvlpevent_is_pending())
                                                process_iSeries_events();
                                        HMT_low();
                                }
diff -urN linux/arch/ppc64/kernel/irq.c linux/arch/ppc64/kernel/irq.c
--- linux/arch/ppc64/kernel/irq.c       2005/07/11 20:46:34     1.39
+++ linux/arch/ppc64/kernel/irq.c       2005/07/12 09:19:07     1.40
@@ -66,7 +66,6 @@
 int distribute_irqs = 1;
 int __irq_offset_value;
 int ppc_spurious_interrupts;
-unsigned long lpevent_count;
 u64 ppc64_interrupt_controller;
 
 int show_interrupts(struct seq_file *p, void *v)
@@ -269,7 +268,6 @@
 void do_IRQ(struct pt_regs *regs)
 {
        struct paca_struct *lpaca;
-       struct ItLpQueue *lpq;
 
        irq_enter();
 
@@ -295,9 +293,8 @@
                iSeries_smp_message_recv(regs);
        }
 #endif /* CONFIG_SMP */
-       lpq = lpaca->lpqueue_ptr;
-       if (lpq && ItLpQueue_isLpIntPending(lpq))
-               lpevent_count += ItLpQueue_process(lpq, regs);
+       if (hvlpevent_is_pending())
+               process_hvlpevents(regs);
 
        irq_exit();
 
diff -urN linux/arch/ppc64/kernel/kprobes.c linux/arch/ppc64/kernel/kprobes.c
--- linux/arch/ppc64/kernel/kprobes.c   2005/07/11 20:46:34     1.6
+++ linux/arch/ppc64/kernel/kprobes.c   2005/07/12 09:19:07     1.7
@@ -444,7 +444,7 @@
        .pre_handler = trampoline_probe_handler
 };
 
-int __init arch_init(void)
+int __init arch_init_kprobes(void)
 {
        return register_kprobe(&trampoline_p);
 }
diff -urN linux/arch/ppc64/kernel/mf.c linux/arch/ppc64/kernel/mf.c
--- linux/arch/ppc64/kernel/mf.c        2005/07/11 20:46:34     1.12
+++ linux/arch/ppc64/kernel/mf.c        2005/07/12 09:19:07     1.13
@@ -801,10 +801,8 @@
                return rc;
        /* We need to poll here as we are not yet taking interrupts */
        while (rtc_data.busy) {
-               extern unsigned long lpevent_count;
-               struct ItLpQueue *lpq = get_paca()->lpqueue_ptr;
-               if (lpq && ItLpQueue_isLpIntPending(lpq))
-                       lpevent_count += ItLpQueue_process(lpq, NULL);
+               if (hvlpevent_is_pending())
+                       process_hvlpevents(NULL);
        }
        return rtc_set_tm(rtc_data.rc, rtc_data.ce_msg.ce_msg, tm);
 }
diff -urN linux/arch/ppc64/kernel/nvram.c linux/arch/ppc64/kernel/nvram.c
--- linux/arch/ppc64/kernel/nvram.c     2005/05/19 12:08:14     1.14
+++ linux/arch/ppc64/kernel/nvram.c     2005/07/12 09:19:07     1.15
@@ -338,9 +338,8 @@
  */
 static int nvram_create_os_partition(void)
 {
-       struct list_head * p;
-       struct nvram_partition *part = NULL;
-       struct nvram_partition *new_part = NULL;
+       struct nvram_partition *part;
+       struct nvram_partition *new_part;
        struct nvram_partition *free_part = NULL;
        int seq_init[2] = { 0, 0 };
        loff_t tmp_index;
@@ -349,8 +348,7 @@
        
        /* Find a free partition that will give us the maximum needed size 
           If can't find one that will give us the minimum size needed */
-       list_for_each(p, &nvram_part->partition) {
-               part = list_entry(p, struct nvram_partition, partition);
+       list_for_each_entry(part, &nvram_part->partition, partition) {
                if (part->header.signature != NVRAM_SIG_FREE)
                        continue;
 
diff -urN linux/arch/ppc64/kernel/pacaData.c linux/arch/ppc64/kernel/pacaData.c
--- linux/arch/ppc64/kernel/pacaData.c  2005/03/18 17:36:59     1.21
+++ linux/arch/ppc64/kernel/pacaData.c  2005/07/12 09:19:07     1.22
@@ -42,21 +42,7 @@
  * processors.  The processor VPD array needs one entry per physical
  * processor (not thread).
  */
-#ifdef CONFIG_PPC_ISERIES
-#define EXTRA_INITS(number, lpq)                                           \
-       .lppaca_ptr = &paca[number].lppaca,                                 \
-       .lpqueue_ptr = (lpq),           /* &xItLpQueue, */                  \
-       .reg_save_ptr = &paca[number].reg_save,                             \
-       .reg_save = {                                                       \
-               .xDesc = 0xd397d9e2,    /* "LpRS" */                        \
-               .xSize = sizeof(struct ItLpRegSave)                         \
-       },
-#else
-#define EXTRA_INITS(number, lpq)
-#endif
-
-#define PACAINITDATA(number,start,lpq,asrr,asrv)                           \
-{                                                                          \
+#define PACA_INIT_COMMON(number, start, asrr, asrv)                        \
        .lock_token = 0x8000,                                               \
        .paca_index = (number),         /* Paca Index */                    \
        .default_decr = 0x00ff0000,     /* Initial Decr */                  \
@@ -74,147 +60,79 @@
                .end_of_quantum = 0xfffffffffffffffful,                     \
                .slb_count = 64,                                            \
        },                                                                  \
-       EXTRA_INITS((number), (lpq))                                        \
-}
 
-struct paca_struct paca[] = {
 #ifdef CONFIG_PPC_ISERIES
-       PACAINITDATA( 0, 1, &xItLpQueue, 0, STAB0_VIRT_ADDR),
+#define PACA_INIT_ISERIES(number)                                          \
+       .lppaca_ptr = &paca[number].lppaca,                                 \
+       .reg_save_ptr = &paca[number].reg_save,                             \
+       .reg_save = {                                                       \
+               .xDesc = 0xd397d9e2,    /* "LpRS" */                        \
+               .xSize = sizeof(struct ItLpRegSave)                         \
+       }
+
+#define PACA_INIT(number)                                                  \
+{                                                                          \
+       PACA_INIT_COMMON(number, 0, 0, 0)                                   \
+       PACA_INIT_ISERIES(number)                                           \
+}
+
+#define BOOTCPU_PACA_INIT(number)                                          \
+{                                                                          \
+       PACA_INIT_COMMON(number, 1, 0, STAB0_VIRT_ADDR)                     \
+       PACA_INIT_ISERIES(number)                                           \
+}
+
 #else
-       PACAINITDATA( 0, 1, NULL, STAB0_PHYS_ADDR, STAB0_VIRT_ADDR),
+#define PACA_INIT(number)                                                  \
+{                                                                          \
+       PACA_INIT_COMMON(number, 0, 0, 0)                                   \
+}
+
+#define BOOTCPU_PACA_INIT(number)                                          \
+{                                                                          \
+       PACA_INIT_COMMON(number, 1, STAB0_PHYS_ADDR, STAB0_VIRT_ADDR)       \
+}
 #endif
+
+struct paca_struct paca[] = {
+       BOOTCPU_PACA_INIT(0),
 #if NR_CPUS > 1
-       PACAINITDATA( 1, 0, NULL, 0, 0),
-       PACAINITDATA( 2, 0, NULL, 0, 0),
-       PACAINITDATA( 3, 0, NULL, 0, 0),
+       PACA_INIT(  1), PACA_INIT(  2), PACA_INIT(  3),
 #if NR_CPUS > 4
-       PACAINITDATA( 4, 0, NULL, 0, 0),
-       PACAINITDATA( 5, 0, NULL, 0, 0),
-       PACAINITDATA( 6, 0, NULL, 0, 0),
-       PACAINITDATA( 7, 0, NULL, 0, 0),
+       PACA_INIT(  4), PACA_INIT(  5), PACA_INIT(  6), PACA_INIT(  7),
 #if NR_CPUS > 8
-       PACAINITDATA( 8, 0, NULL, 0, 0),
-       PACAINITDATA( 9, 0, NULL, 0, 0),
-       PACAINITDATA(10, 0, NULL, 0, 0),
-       PACAINITDATA(11, 0, NULL, 0, 0),
-       PACAINITDATA(12, 0, NULL, 0, 0),
-       PACAINITDATA(13, 0, NULL, 0, 0),
-       PACAINITDATA(14, 0, NULL, 0, 0),
-       PACAINITDATA(15, 0, NULL, 0, 0),
-       PACAINITDATA(16, 0, NULL, 0, 0),
-       PACAINITDATA(17, 0, NULL, 0, 0),
-       PACAINITDATA(18, 0, NULL, 0, 0),
-       PACAINITDATA(19, 0, NULL, 0, 0),
-       PACAINITDATA(20, 0, NULL, 0, 0),
-       PACAINITDATA(21, 0, NULL, 0, 0),
-       PACAINITDATA(22, 0, NULL, 0, 0),
-       PACAINITDATA(23, 0, NULL, 0, 0),
-       PACAINITDATA(24, 0, NULL, 0, 0),
-       PACAINITDATA(25, 0, NULL, 0, 0),
-       PACAINITDATA(26, 0, NULL, 0, 0),
-       PACAINITDATA(27, 0, NULL, 0, 0),
-       PACAINITDATA(28, 0, NULL, 0, 0),
-       PACAINITDATA(29, 0, NULL, 0, 0),
-       PACAINITDATA(30, 0, NULL, 0, 0),
-       PACAINITDATA(31, 0, NULL, 0, 0),
+       PACA_INIT(  8), PACA_INIT(  9), PACA_INIT( 10), PACA_INIT( 11),
+       PACA_INIT( 12), PACA_INIT( 13), PACA_INIT( 14), PACA_INIT( 15),
+       PACA_INIT( 16), PACA_INIT( 17), PACA_INIT( 18), PACA_INIT( 19),
+       PACA_INIT( 20), PACA_INIT( 21), PACA_INIT( 22), PACA_INIT( 23),
+       PACA_INIT( 24), PACA_INIT( 25), PACA_INIT( 26), PACA_INIT( 27),
+       PACA_INIT( 28), PACA_INIT( 29), PACA_INIT( 30), PACA_INIT( 31),
 #if NR_CPUS > 32
-       PACAINITDATA(32, 0, NULL, 0, 0),
-       PACAINITDATA(33, 0, NULL, 0, 0),
-       PACAINITDATA(34, 0, NULL, 0, 0),
-       PACAINITDATA(35, 0, NULL, 0, 0),
-       PACAINITDATA(36, 0, NULL, 0, 0),
-       PACAINITDATA(37, 0, NULL, 0, 0),
-       PACAINITDATA(38, 0, NULL, 0, 0),
-       PACAINITDATA(39, 0, NULL, 0, 0),
-       PACAINITDATA(40, 0, NULL, 0, 0),
-       PACAINITDATA(41, 0, NULL, 0, 0),
-       PACAINITDATA(42, 0, NULL, 0, 0),
-       PACAINITDATA(43, 0, NULL, 0, 0),
-       PACAINITDATA(44, 0, NULL, 0, 0),
-       PACAINITDATA(45, 0, NULL, 0, 0),
-       PACAINITDATA(46, 0, NULL, 0, 0),
-       PACAINITDATA(47, 0, NULL, 0, 0),
-       PACAINITDATA(48, 0, NULL, 0, 0),
-       PACAINITDATA(49, 0, NULL, 0, 0),
-       PACAINITDATA(50, 0, NULL, 0, 0),
-       PACAINITDATA(51, 0, NULL, 0, 0),
-       PACAINITDATA(52, 0, NULL, 0, 0),
-       PACAINITDATA(53, 0, NULL, 0, 0),
-       PACAINITDATA(54, 0, NULL, 0, 0),
-       PACAINITDATA(55, 0, NULL, 0, 0),
-       PACAINITDATA(56, 0, NULL, 0, 0),
-       PACAINITDATA(57, 0, NULL, 0, 0),
-       PACAINITDATA(58, 0, NULL, 0, 0),
-       PACAINITDATA(59, 0, NULL, 0, 0),
-       PACAINITDATA(60, 0, NULL, 0, 0),
-       PACAINITDATA(61, 0, NULL, 0, 0),
-       PACAINITDATA(62, 0, NULL, 0, 0),
-       PACAINITDATA(63, 0, NULL, 0, 0),
+       PACA_INIT( 32), PACA_INIT( 33), PACA_INIT( 34), PACA_INIT( 35),
+       PACA_INIT( 36), PACA_INIT( 37), PACA_INIT( 38), PACA_INIT( 39),
+       PACA_INIT( 40), PACA_INIT( 41), PACA_INIT( 42), PACA_INIT( 43),
+       PACA_INIT( 44), PACA_INIT( 45), PACA_INIT( 46), PACA_INIT( 47),
+       PACA_INIT( 48), PACA_INIT( 49), PACA_INIT( 50), PACA_INIT( 51),
+       PACA_INIT( 52), PACA_INIT( 53), PACA_INIT( 54), PACA_INIT( 55),
+       PACA_INIT( 56), PACA_INIT( 57), PACA_INIT( 58), PACA_INIT( 59),
+       PACA_INIT( 60), PACA_INIT( 61), PACA_INIT( 62), PACA_INIT( 63),
 #if NR_CPUS > 64
-       PACAINITDATA(64, 0, NULL, 0, 0),
-       PACAINITDATA(65, 0, NULL, 0, 0),
-       PACAINITDATA(66, 0, NULL, 0, 0),
-       PACAINITDATA(67, 0, NULL, 0, 0),
-       PACAINITDATA(68, 0, NULL, 0, 0),
-       PACAINITDATA(69, 0, NULL, 0, 0),
-       PACAINITDATA(70, 0, NULL, 0, 0),
-       PACAINITDATA(71, 0, NULL, 0, 0),
-       PACAINITDATA(72, 0, NULL, 0, 0),
-       PACAINITDATA(73, 0, NULL, 0, 0),
-       PACAINITDATA(74, 0, NULL, 0, 0),
-       PACAINITDATA(75, 0, NULL, 0, 0),
-       PACAINITDATA(76, 0, NULL, 0, 0),
-       PACAINITDATA(77, 0, NULL, 0, 0),
-       PACAINITDATA(78, 0, NULL, 0, 0),
-       PACAINITDATA(79, 0, NULL, 0, 0),
-       PACAINITDATA(80, 0, NULL, 0, 0),
-       PACAINITDATA(81, 0, NULL, 0, 0),
-       PACAINITDATA(82, 0, NULL, 0, 0),
-       PACAINITDATA(83, 0, NULL, 0, 0),
-       PACAINITDATA(84, 0, NULL, 0, 0),
-       PACAINITDATA(85, 0, NULL, 0, 0),
-       PACAINITDATA(86, 0, NULL, 0, 0),
-       PACAINITDATA(87, 0, NULL, 0, 0),
-       PACAINITDATA(88, 0, NULL, 0, 0),
-       PACAINITDATA(89, 0, NULL, 0, 0),
-       PACAINITDATA(90, 0, NULL, 0, 0),
-       PACAINITDATA(91, 0, NULL, 0, 0),
-       PACAINITDATA(92, 0, NULL, 0, 0),
-       PACAINITDATA(93, 0, NULL, 0, 0),
-       PACAINITDATA(94, 0, NULL, 0, 0),
-       PACAINITDATA(95, 0, NULL, 0, 0),
-       PACAINITDATA(96, 0, NULL, 0, 0),
-       PACAINITDATA(97, 0, NULL, 0, 0),
-       PACAINITDATA(98, 0, NULL, 0, 0),
-       PACAINITDATA(99, 0, NULL, 0, 0),
-       PACAINITDATA(100, 0, NULL, 0, 0),
-       PACAINITDATA(101, 0, NULL, 0, 0),
-       PACAINITDATA(102, 0, NULL, 0, 0),
-       PACAINITDATA(103, 0, NULL, 0, 0),
-       PACAINITDATA(104, 0, NULL, 0, 0),
-       PACAINITDATA(105, 0, NULL, 0, 0),
-       PACAINITDATA(106, 0, NULL, 0, 0),
-       PACAINITDATA(107, 0, NULL, 0, 0),
-       PACAINITDATA(108, 0, NULL, 0, 0),
-       PACAINITDATA(109, 0, NULL, 0, 0),
-       PACAINITDATA(110, 0, NULL, 0, 0),
-       PACAINITDATA(111, 0, NULL, 0, 0),
-       PACAINITDATA(112, 0, NULL, 0, 0),
-       PACAINITDATA(113, 0, NULL, 0, 0),
-       PACAINITDATA(114, 0, NULL, 0, 0),
-       PACAINITDATA(115, 0, NULL, 0, 0),
-       PACAINITDATA(116, 0, NULL, 0, 0),
-       PACAINITDATA(117, 0, NULL, 0, 0),
-       PACAINITDATA(118, 0, NULL, 0, 0),
-       PACAINITDATA(119, 0, NULL, 0, 0),
-       PACAINITDATA(120, 0, NULL, 0, 0),
-       PACAINITDATA(121, 0, NULL, 0, 0),
-       PACAINITDATA(122, 0, NULL, 0, 0),
-       PACAINITDATA(123, 0, NULL, 0, 0),
-       PACAINITDATA(124, 0, NULL, 0, 0),
-       PACAINITDATA(125, 0, NULL, 0, 0),
-       PACAINITDATA(126, 0, NULL, 0, 0),
-       PACAINITDATA(127, 0, NULL, 0, 0),
+       PACA_INIT( 64), PACA_INIT( 65), PACA_INIT( 66), PACA_INIT( 67),
+       PACA_INIT( 68), PACA_INIT( 69), PACA_INIT( 70), PACA_INIT( 71),
+       PACA_INIT( 72), PACA_INIT( 73), PACA_INIT( 74), PACA_INIT( 75),
+       PACA_INIT( 76), PACA_INIT( 77), PACA_INIT( 78), PACA_INIT( 79),
+       PACA_INIT( 80), PACA_INIT( 81), PACA_INIT( 82), PACA_INIT( 83),
+       PACA_INIT( 84), PACA_INIT( 85), PACA_INIT( 86), PACA_INIT( 87),
+       PACA_INIT( 88), PACA_INIT( 89), PACA_INIT( 90), PACA_INIT( 91),
+       PACA_INIT( 92), PACA_INIT( 93), PACA_INIT( 94), PACA_INIT( 95),
+       PACA_INIT( 96), PACA_INIT( 97), PACA_INIT( 98), PACA_INIT( 99),
+       PACA_INIT(100), PACA_INIT(101), PACA_INIT(102), PACA_INIT(103),
+       PACA_INIT(104), PACA_INIT(105), PACA_INIT(106), PACA_INIT(107),
+       PACA_INIT(108), PACA_INIT(109), PACA_INIT(110), PACA_INIT(111),
+       PACA_INIT(112), PACA_INIT(113), PACA_INIT(114), PACA_INIT(115),
+       PACA_INIT(116), PACA_INIT(117), PACA_INIT(118), PACA_INIT(119),
+       PACA_INIT(120), PACA_INIT(121), PACA_INIT(122), PACA_INIT(123),
+       PACA_INIT(124), PACA_INIT(125), PACA_INIT(126), PACA_INIT(127),
 #endif
 #endif
 #endif
diff -urN linux/arch/ppc64/kernel/sysfs.c linux/arch/ppc64/kernel/sysfs.c
--- linux/arch/ppc64/kernel/sysfs.c     2005/06/07 13:45:29     1.13
+++ linux/arch/ppc64/kernel/sysfs.c     2005/07/12 09:19:07     1.14
@@ -400,7 +400,12 @@
                struct cpu *c = &per_cpu(cpu_devices, cpu);
 
 #ifdef CONFIG_NUMA
-               parent = &node_devices[cpu_to_node(cpu)];
+               /* The node to which a cpu belongs can't be known
+                * until the cpu is made present.
+                */
+               parent = NULL;
+               if (cpu_present(cpu))
+                       parent = &node_devices[cpu_to_node(cpu)];
 #endif
                /*
                 * For now, we just see if the system supports making
diff -urN linux/arch/ppc64/kernel/time.c linux/arch/ppc64/kernel/time.c
--- linux/arch/ppc64/kernel/time.c      2005/07/11 20:46:34     1.36
+++ linux/arch/ppc64/kernel/time.c      2005/07/12 09:19:08     1.37
@@ -99,7 +99,6 @@
 struct gettimeofday_struct do_gtod;
 
 extern unsigned long wall_jiffies;
-extern unsigned long lpevent_count;
 extern int smp_tb_synchronized;
 
 extern struct timezone sys_tz;
@@ -367,11 +366,8 @@
        set_dec(next_dec);
 
 #ifdef CONFIG_PPC_ISERIES
-       {
-               struct ItLpQueue *lpq = lpaca->lpqueue_ptr;
-               if (lpq && ItLpQueue_isLpIntPending(lpq))
-                       lpevent_count += ItLpQueue_process(lpq, regs);
-       }
+       if (hvlpevent_is_pending())
+               process_hvlpevents(regs);
 #endif
 
 /* collect purr register values often, for accurate calculations */
diff -urN linux/arch/sparc64/Kconfig linux/arch/sparc64/Kconfig
--- linux/arch/sparc64/Kconfig  2005/07/11 20:46:40     1.44
+++ linux/arch/sparc64/Kconfig  2005/07/12 09:19:08     1.45
@@ -444,6 +444,24 @@
          If you have more than 8 printers, you need to increase the LP_NO
          macro in lp.c and the PARPORT_MAX macro in parport.h.
 
+config PPDEV
+       tristate "Support for user-space parallel port device drivers"
+       depends on PARPORT
+       ---help---
+         Saying Y to this adds support for /dev/parport device nodes.  This
+         is needed for programs that want portable access to the parallel
+         port, for instance deviceid (which displays Plug-and-Play device
+         IDs).
+
+         This is the parallel port equivalent of SCSI generic support (sg).
+         It is safe to say N to this -- it is not needed for normal printing
+         or parallel port CD-ROM/disk support.
+
+         To compile this driver as a module, choose M here: the
+         module will be called ppdev.
+
+         If unsure, say N.
+
 config ENVCTRL
        tristate "SUNW, envctrl support"
        depends on PCI
diff -urN linux/arch/sparc64/kernel/entry.S linux/arch/sparc64/kernel/entry.S
--- linux/arch/sparc64/kernel/entry.S   2005/07/11 20:46:40     1.53
+++ linux/arch/sparc64/kernel/entry.S   2005/07/12 09:19:08     1.54
@@ -553,13 +553,11 @@
        sllx            %g3, 5, %g3
        or              %g2, %lo(ivector_table), %g2
        add             %g2, %g3, %g3
-       ldx             [%g3 + 0x08], %g2       /* irq_info */
        ldub            [%g3 + 0x04], %g4       /* pil */
-       brz,pn          %g2, do_ivec_spurious
-        mov            1, %g2
-
+       mov             1, %g2
        sllx            %g2, %g4, %g2
        sllx            %g4, 2, %g4
+
        lduw            [%g6 + %g4], %g5        /* g5 = irq_work(cpu, pil) */
        stw             %g5, [%g3 + 0x00]       /* bucket->irq_chain = g5 */
        stw             %g3, [%g6 + %g4]        /* irq_work(cpu, pil) = bucket 
*/
@@ -567,9 +565,9 @@
        retry
 do_ivec_xcall:
        mov             0x50, %g1
-
        ldxa            [%g1 + %g0] ASI_INTR_R, %g1
        srl             %g3, 0, %g3
+
        mov             0x60, %g7
        ldxa            [%g7 + %g0] ASI_INTR_R, %g7
        stxa            %g0, [%g0] ASI_INTR_RECEIVE
@@ -581,19 +579,6 @@
 1:     jmpl            %g3, %g0
         nop
 
-do_ivec_spurious:
-       stw             %g3, [%g6 + 0x00]       /* irq_work(cpu, 0) = bucket */
-       rdpr            %pstate, %g5
-
-       wrpr            %g5, PSTATE_IG | PSTATE_AG, %pstate
-       sethi           %hi(109f), %g7
-       ba,pt           %xcc, etrap
-109:    or             %g7, %lo(109b), %g7
-       call            catch_disabled_ivec
-        add            %sp, PTREGS_OFF, %o0
-       ba,pt           %xcc, rtrap
-        clr            %l6
-
        .globl          save_alternate_globals
 save_alternate_globals: /* %o0 = save_area */
        rdpr            %pstate, %o5
diff -urN linux/arch/sparc64/kernel/irq.c linux/arch/sparc64/kernel/irq.c
--- linux/arch/sparc64/kernel/irq.c     2005/07/11 20:46:40     1.61
+++ linux/arch/sparc64/kernel/irq.c     2005/07/12 09:19:08     1.62
@@ -71,31 +71,7 @@
 struct irq_work_struct __irq_work[NR_CPUS];
 #define irq_work(__cpu, __pil) &(__irq_work[(__cpu)].irq_worklists[(__pil)])
 
-#ifdef CONFIG_PCI
-/* This is a table of physical addresses used to deal with IBF_DMA_SYNC.
- * It is used for PCI only to synchronize DMA transfers with IRQ delivery
- * for devices behind busses other than APB on Sabre systems.
- *
- * Currently these physical addresses are just config space accesses
- * to the command register for that device.
- */
-unsigned long pci_dma_wsync;
-unsigned long dma_sync_reg_table[256];
-unsigned char dma_sync_reg_table_entry = 0;
-#endif
-
-/* This is based upon code in the 32-bit Sparc kernel written mostly by
- * David Redman (djhr@tadpole.co.uk).
- */
-#define MAX_STATIC_ALLOC       4
-static struct irqaction static_irqaction[MAX_STATIC_ALLOC];
-static int static_irq_count;
-
-/* This is exported so that fast IRQ handlers can get at it... -DaveM */
-struct irqaction *irq_action[NR_IRQS+1] = {
-         NULL, NULL, NULL, NULL, NULL, NULL , NULL, NULL,
-         NULL, NULL, NULL, NULL, NULL, NULL , NULL, NULL
-};
+static struct irqaction *irq_action[NR_IRQS+1];
 
 /* This only synchronizes entities which modify IRQ handler
  * state and some selected user-level spots that want to
@@ -241,17 +217,22 @@
  * the CPU %tick register and not by some normal vectored interrupt
  * source.  To handle this special case, we use this dummy INO bucket.
  */
+static struct irq_desc pil0_dummy_desc;
 static struct ino_bucket pil0_dummy_bucket = {
-       0,      /* irq_chain */
-       0,      /* pil */
-       0,      /* pending */
-       0,      /* flags */
-       0,      /* __unused */
-       NULL,   /* irq_info */
-       0UL,    /* iclr */
-       0UL,    /* imap */
+       .irq_info       =       &pil0_dummy_desc,
 };
 
+static void build_irq_error(const char *msg, unsigned int ino, int pil, int 
inofixup,
+                           unsigned long iclr, unsigned long imap,
+                           struct ino_bucket *bucket)
+{
+       prom_printf("IRQ: INO %04x (%d:%016lx:%016lx) --> "
+                   "(%d:%d:%016lx:%016lx), halting...\n",
+                   ino, bucket->pil, bucket->iclr, bucket->imap,
+                   pil, inofixup, iclr, imap);
+       prom_halt();
+}
+
 unsigned int build_irq(int pil, int inofixup, unsigned long iclr, unsigned 
long imap)
 {
        struct ino_bucket *bucket;
@@ -280,28 +261,35 @@
                prom_halt();
        }
 
-       /* Ok, looks good, set it up.  Don't touch the irq_chain or
-        * the pending flag.
-        */
        bucket = &ivector_table[ino];
-       if ((bucket->flags & IBF_ACTIVE) ||
-           (bucket->irq_info != NULL)) {
-               /* This is a gross fatal error if it happens here. */
-               prom_printf("IRQ: Trying to reinit INO bucket, fatal error.\n");
-               prom_printf("IRQ: Request INO %04x (%d:%d:%016lx:%016lx)\n",
-                           ino, pil, inofixup, iclr, imap);
-               prom_printf("IRQ: Existing (%d:%016lx:%016lx)\n",
-                           bucket->pil, bucket->iclr, bucket->imap);
-               prom_printf("IRQ: Cannot continue, halting...\n");
+       if (bucket->flags & IBF_ACTIVE)
+               build_irq_error("IRQ: Trying to build active INO bucket.\n",
+                               ino, pil, inofixup, iclr, imap, bucket);
+
+       if (bucket->irq_info) {
+               if (bucket->imap != imap || bucket->iclr != iclr)
+                       build_irq_error("IRQ: Trying to reinit INO bucket.\n",
+                                       ino, pil, inofixup, iclr, imap, bucket);
+
+               goto out;
+       }
+
+       bucket->irq_info = kmalloc(sizeof(struct irq_desc), GFP_ATOMIC);
+       if (!bucket->irq_info) {
+               prom_printf("IRQ: Error, kmalloc(irq_desc) failed.\n");
                prom_halt();
        }
+       memset(bucket->irq_info, 0, sizeof(struct irq_desc));
+
+       /* Ok, looks good, set it up.  Don't touch the irq_chain or
+        * the pending flag.
+        */
        bucket->imap  = imap;
        bucket->iclr  = iclr;
        bucket->pil   = pil;
        bucket->flags = 0;
 
-       bucket->irq_info = NULL;
-
+out:
        return __irq(bucket);
 }
 
@@ -319,26 +307,65 @@
        __asm__ __volatile__("wrpr %0, 0x0, %%pstate" : : "r" (pstate));
 }
 
+static int check_irq_sharing(int pil, unsigned long irqflags)
+{
+       struct irqaction *action, *tmp;
+
+       action = *(irq_action + pil);
+       if (action) {
+               if ((action->flags & SA_SHIRQ) && (irqflags & SA_SHIRQ)) {
+                       for (tmp = action; tmp->next; tmp = tmp->next)
+                               ;
+               } else {
+                       return -EBUSY;
+               }
+       }
+       return 0;
+}
+
+static void append_irq_action(int pil, struct irqaction *action)
+{
+       struct irqaction **pp = irq_action + pil;
+
+       while (*pp)
+               pp = &((*pp)->next);
+       *pp = action;
+}
+
+static struct irqaction *get_action_slot(struct ino_bucket *bucket)
+{
+       struct irq_desc *desc = bucket->irq_info;
+       int max_irq, i;
+
+       max_irq = 1;
+       if (bucket->flags & IBF_PCI)
+               max_irq = MAX_IRQ_DESC_ACTION;
+       for (i = 0; i < max_irq; i++) {
+               struct irqaction *p = &desc->action[i];
+               u32 mask = (1 << i);
+
+               if (desc->action_active_mask & mask)
+                       continue;
+
+               desc->action_active_mask |= mask;
+               return p;
+       }
+       return NULL;
+}
+
 int request_irq(unsigned int irq, irqreturn_t (*handler)(int, void *, struct 
pt_regs *),
                unsigned long irqflags, const char *name, void *dev_id)
 {
-       struct irqaction *action, *tmp = NULL;
+       struct irqaction *action;
        struct ino_bucket *bucket = __bucket(irq);
        unsigned long flags;
        int pending = 0;
 
-       if ((bucket != &pil0_dummy_bucket) &&
-           (bucket < &ivector_table[0] ||
-            bucket >= &ivector_table[NUM_IVECS])) {
-               unsigned int *caller;
-
-               __asm__ __volatile__("mov %%i7, %0" : "=r" (caller));
-               printk(KERN_CRIT "request_irq: Old style IRQ registry attempt "
-                      "from %p, irq %08x.\n", caller, irq);
+       if (unlikely(!handler))
                return -EINVAL;
-       }       
-       if (!handler)
-           return -EINVAL;
+
+       if (unlikely(!bucket->irq_info))
+               return -ENODEV;
 
        if ((bucket != &pil0_dummy_bucket) && (irqflags & SA_SAMPLE_RANDOM)) {
                /*
@@ -356,93 +383,20 @@
 
        spin_lock_irqsave(&irq_action_lock, flags);
 
-       action = *(bucket->pil + irq_action);
-       if (action) {
-               if ((action->flags & SA_SHIRQ) && (irqflags & SA_SHIRQ))
-                       for (tmp = action; tmp->next; tmp = tmp->next)
-                               ;
-               else {
-                       spin_unlock_irqrestore(&irq_action_lock, flags);
-                       return -EBUSY;
-               }
-               action = NULL;          /* Or else! */
+       if (check_irq_sharing(bucket->pil, irqflags)) {
+               spin_unlock_irqrestore(&irq_action_lock, flags);
+               return -EBUSY;
        }
 
-       /* If this is flagged as statically allocated then we use our
-        * private struct which is never freed.
-        */
-       if (irqflags & SA_STATIC_ALLOC) {
-           if (static_irq_count < MAX_STATIC_ALLOC)
-               action = &static_irqaction[static_irq_count++];
-           else
-               printk("Request for IRQ%d (%s) SA_STATIC_ALLOC failed "
-                      "using kmalloc\n", irq, name);
-       }       
-       if (action == NULL)
-           action = (struct irqaction *)kmalloc(sizeof(struct irqaction),
-                                                GFP_ATOMIC);
-       
+       action = get_action_slot(bucket);
        if (!action) { 
                spin_unlock_irqrestore(&irq_action_lock, flags);
                return -ENOMEM;
        }
 
-       if (bucket == &pil0_dummy_bucket) {
-               bucket->irq_info = action;
-               bucket->flags |= IBF_ACTIVE;
-       } else {
-               if ((bucket->flags & IBF_ACTIVE) != 0) {
-                       void *orig = bucket->irq_info;
-                       void **vector = NULL;
-
-                       if ((bucket->flags & IBF_PCI) == 0) {
-                               printk("IRQ: Trying to share non-PCI 
bucket.\n");
-                               goto free_and_ebusy;
-                       }
-                       if ((bucket->flags & IBF_MULTI) == 0) {
-                               vector = kmalloc(sizeof(void *) * 4, 
GFP_ATOMIC);
-                               if (vector == NULL)
-                                       goto free_and_enomem;
-
-                               /* We might have slept. */
-                               if ((bucket->flags & IBF_MULTI) != 0) {
-                                       int ent;
-
-                                       kfree(vector);
-                                       vector = (void **)bucket->irq_info;
-                                       for(ent = 0; ent < 4; ent++) {
-                                               if (vector[ent] == NULL) {
-                                                       vector[ent] = action;
-                                                       break;
-                                               }
-                                       }
-                                       if (ent == 4)
-                                               goto free_and_ebusy;
-                               } else {
-                                       vector[0] = orig;
-                                       vector[1] = action;
-                                       vector[2] = NULL;
-                                       vector[3] = NULL;
-                                       bucket->irq_info = vector;
-                                       bucket->flags |= IBF_MULTI;
-                               }
-                       } else {
-                               int ent;
-
-                               vector = (void **)orig;
-                               for (ent = 0; ent < 4; ent++) {
-                                       if (vector[ent] == NULL) {
-                                               vector[ent] = action;
-                                               break;
-                                       }
-                               }
-                               if (ent == 4)
-                                       goto free_and_ebusy;
-                       }
-               } else {
-                       bucket->irq_info = action;
-                       bucket->flags |= IBF_ACTIVE;
-               }
+       bucket->flags |= IBF_ACTIVE;
+       pending = 0;
+       if (bucket != &pil0_dummy_bucket) {
                pending = bucket->pending;
                if (pending)
                        bucket->pending = 0;
@@ -456,10 +410,7 @@
        put_ino_in_irqaction(action, irq);
        put_smpaff_in_irqaction(action, CPU_MASK_NONE);
 
-       if (tmp)
-               tmp->next = action;
-       else
-               *(bucket->pil + irq_action) = action;
+       append_irq_action(bucket->pil, action);
 
        enable_irq(irq);
 
@@ -468,147 +419,103 @@
                atomic_bucket_insert(bucket);
                set_softint(1 << bucket->pil);
        }
+
        spin_unlock_irqrestore(&irq_action_lock, flags);
-       if ((bucket != &pil0_dummy_bucket) && (!(irqflags & SA_STATIC_ALLOC)))
+
+       if (bucket != &pil0_dummy_bucket)
                register_irq_proc(__irq_ino(irq));
 
 #ifdef CONFIG_SMP
        distribute_irqs();
 #endif
        return 0;
-
-free_and_ebusy:
-       kfree(action);
-       spin_unlock_irqrestore(&irq_action_lock, flags);
-       return -EBUSY;
-
-free_and_enomem:
-       kfree(action);
-       spin_unlock_irqrestore(&irq_action_lock, flags);
-       return -ENOMEM;
 }
 
 EXPORT_SYMBOL(request_irq);
 
-void free_irq(unsigned int irq, void *dev_id)
+static struct irqaction *unlink_irq_action(unsigned int irq, void *dev_id)
 {
-       struct irqaction *action;
-       struct irqaction *tmp = NULL;
-       unsigned long flags;
-       struct ino_bucket *bucket = __bucket(irq), *bp;
+       struct ino_bucket *bucket = __bucket(irq);
+       struct irqaction *action, **pp;
 
-       if ((bucket != &pil0_dummy_bucket) &&
-           (bucket < &ivector_table[0] ||
-            bucket >= &ivector_table[NUM_IVECS])) {
-               unsigned int *caller;
-
-               __asm__ __volatile__("mov %%i7, %0" : "=r" (caller));
-               printk(KERN_CRIT "free_irq: Old style IRQ removal attempt "
-                      "from %p, irq %08x.\n", caller, irq);
-               return;
-       }
-       
-       spin_lock_irqsave(&irq_action_lock, flags);
+       pp = irq_action + bucket->pil;
+       action = *pp;
+       if (unlikely(!action))
+               return NULL;
 
-       action = *(bucket->pil + irq_action);
-       if (!action->handler) {
+       if (unlikely(!action->handler)) {
                printk("Freeing free IRQ %d\n", bucket->pil);
-               return;
-       }
-       if (dev_id) {
-               for ( ; action; action = action->next) {
-                       if (action->dev_id == dev_id)
-                               break;
-                       tmp = action;
-               }
-               if (!action) {
-                       printk("Trying to free free shared IRQ %d\n", 
bucket->pil);
-                       spin_unlock_irqrestore(&irq_action_lock, flags);
-                       return;
-               }
-       } else if (action->flags & SA_SHIRQ) {
-               printk("Trying to free shared IRQ %d with NULL device ID\n", 
bucket->pil);
-               spin_unlock_irqrestore(&irq_action_lock, flags);
-               return;
+               return NULL;
        }
 
-       if (action->flags & SA_STATIC_ALLOC) {
-               printk("Attempt to free statically allocated IRQ %d (%s)\n",
-                      bucket->pil, action->name);
-               spin_unlock_irqrestore(&irq_action_lock, flags);
-               return;
+       while (action && action->dev_id != dev_id) {
+               pp = &action->next;
+               action = *pp;
        }
 
-       if (action && tmp)
-               tmp->next = action->next;
-       else
-               *(bucket->pil + irq_action) = action->next;
+       if (likely(action))
+               *pp = action->next;
+
+       return action;
+}
+
+void free_irq(unsigned int irq, void *dev_id)
+{
+       struct irqaction *action;
+       struct ino_bucket *bucket;
+       unsigned long flags;
+
+       spin_lock_irqsave(&irq_action_lock, flags);
+
+       action = unlink_irq_action(irq, dev_id);
 
        spin_unlock_irqrestore(&irq_action_lock, flags);
 
+       if (unlikely(!action))
+               return;
+
        synchronize_irq(irq);
 
        spin_lock_irqsave(&irq_action_lock, flags);
 
+       bucket = __bucket(irq);
        if (bucket != &pil0_dummy_bucket) {
+               struct irq_desc *desc = bucket->irq_info;
                unsigned long imap = bucket->imap;
-               void **vector, *orig;
-               int ent;
+               int ent, i;
 
-               orig = bucket->irq_info;
-               vector = (void **)orig;
+               for (i = 0; i < MAX_IRQ_DESC_ACTION; i++) {
+                       struct irqaction *p = &desc->action[i];
 
-               if ((bucket->flags & IBF_MULTI) != 0) {
-                       int other = 0;
-                       void *orphan = NULL;
-                       for (ent = 0; ent < 4; ent++) {
-                               if (vector[ent] == action)
-                                       vector[ent] = NULL;
-                               else if (vector[ent] != NULL) {
-                                       orphan = vector[ent];
-                                       other++;
-                               }
+                       if (p == action) {
+                               desc->action_active_mask &= ~(1 << i);
+                               break;
                        }
+               }
+
+               if (!desc->action_active_mask) {
+                       /* This unique interrupt source is now inactive. */
+                       bucket->flags &= ~IBF_ACTIVE;
 
-                       /* Only free when no other shared irq
-                        * uses this bucket.
+                       /* See if any other buckets share this bucket's IMAP
+                        * and are still active.
                         */
-                       if (other) {
-                               if (other == 1) {
-                                       /* Convert back to non-shared bucket. */
-                                       bucket->irq_info = orphan;
-                                       bucket->flags &= ~(IBF_MULTI);
-                                       kfree(vector);
-                               }
-                               goto out;
+                       for (ent = 0; ent < NUM_IVECS; ent++) {
+                               struct ino_bucket *bp = &ivector_table[ent];
+                               if (bp != bucket        &&
+                                   bp->imap == imap    &&
+                                   (bp->flags & IBF_ACTIVE) != 0)
+                                       break;
                        }
-               } else {
-                       bucket->irq_info = NULL;
-               }
-
-               /* This unique interrupt source is now inactive. */
-               bucket->flags &= ~IBF_ACTIVE;
 
-               /* See if any other buckets share this bucket's IMAP
-                * and are still active.
-                */
-               for (ent = 0; ent < NUM_IVECS; ent++) {
-                       bp = &ivector_table[ent];
-                       if (bp != bucket        &&
-                           bp->imap == imap    &&
-                           (bp->flags & IBF_ACTIVE) != 0)
-                               break;
+                       /* Only disable when no other sub-irq levels of
+                        * the same IMAP are active.
+                        */
+                       if (ent == NUM_IVECS)
+                               disable_irq(irq);
                }
-
-               /* Only disable when no other sub-irq levels of
-                * the same IMAP are active.
-                */
-               if (ent == NUM_IVECS)
-                       disable_irq(irq);
        }
 
-out:
-       kfree(action);
        spin_unlock_irqrestore(&irq_action_lock, flags);
 }
 
@@ -647,99 +554,55 @@
 }
 #endif /* CONFIG_SMP */
 
-void catch_disabled_ivec(struct pt_regs *regs)
+static void process_bucket(int irq, struct ino_bucket *bp, struct pt_regs 
*regs)
 {
-       int cpu = smp_processor_id();
-       struct ino_bucket *bucket = __bucket(*irq_work(cpu, 0));
+       struct irq_desc *desc = bp->irq_info;
+       unsigned char flags = bp->flags;
+       u32 action_mask, i;
+       int random;
 
-       /* We can actually see this on Ultra/PCI PCI cards, which are bridges
-        * to other devices.  Here a single IMAP enabled potentially multiple
-        * unique interrupt sources (which each do have a unique ICLR register.
-        *
-        * So what we do is just register that the IVEC arrived, when registered
-        * for real the request_irq() code will check the bit and signal
-        * a local CPU interrupt for it.
-        */
-#if 0
-       printk("IVEC: Spurious interrupt vector (%x) received at (%016lx)\n",
-              bucket - &ivector_table[0], regs->tpc);
-#endif
-       *irq_work(cpu, 0) = 0;
-       bucket->pending = 1;
-}
-
-/* Tune this... */
-#define FORWARD_VOLUME         12
-
-#ifdef CONFIG_SMP
-
-static inline void redirect_intr(int cpu, struct ino_bucket *bp)
-{
-       /* Ok, here is what is going on:
-        * 1) Retargeting IRQs on Starfire is very
-        *    expensive so just forget about it on them.
-        * 2) Moving around very high priority interrupts
-        *    is a losing game.
-        * 3) If the current cpu is idle, interrupts are
-        *    useful work, so keep them here.  But do not
-        *    pass to our neighbour if he is not very idle.
-        * 4) If sysadmin explicitly asks for directed intrs,
-        *    Just Do It.
-        */
-       struct irqaction *ap = bp->irq_info;
-       cpumask_t cpu_mask;
-       unsigned int buddy, ticks;
+       bp->flags |= IBF_INPROGRESS;
 
-       cpu_mask = get_smpaff_in_irqaction(ap);
-       cpus_and(cpu_mask, cpu_mask, cpu_online_map);
-       if (cpus_empty(cpu_mask))
-               cpu_mask = cpu_online_map;
-
-       if (this_is_starfire != 0 ||
-           bp->pil >= 10 || current->pid == 0)
+       if (unlikely(!(flags & IBF_ACTIVE))) {
+               bp->pending = 1;
                goto out;
-
-       /* 'cpu' is the MID (ie. UPAID), calculate the MID
-        * of our buddy.
-        */
-       buddy = cpu + 1;
-       if (buddy >= NR_CPUS)
-               buddy = 0;
-
-       ticks = 0;
-       while (!cpu_isset(buddy, cpu_mask)) {
-               if (++buddy >= NR_CPUS)
-                       buddy = 0;
-               if (++ticks > NR_CPUS) {
-                       put_smpaff_in_irqaction(ap, CPU_MASK_NONE);
-                       goto out;
-               }
        }
 
-       if (buddy == cpu)
-               goto out;
+       if (desc->pre_handler)
+               desc->pre_handler(bp,
+                                 desc->pre_handler_arg1,
+                                 desc->pre_handler_arg2);
+
+       action_mask = desc->action_active_mask;
+       random = 0;
+       for (i = 0; i < MAX_IRQ_DESC_ACTION; i++) {
+               struct irqaction *p = &desc->action[i];
+               u32 mask = (1 << i);
 
-       /* Voo-doo programming. */
-       if (cpu_data(buddy).idle_volume < FORWARD_VOLUME)
-               goto out;
+               if (!(action_mask & mask))
+                       continue;
 
-       /* This just so happens to be correct on Cheetah
-        * at the moment.
-        */
-       buddy <<= 26;
+               action_mask &= ~mask;
 
-       /* Push it to our buddy. */
-       upa_writel(buddy | IMAP_VALID, bp->imap);
+               if (p->handler(__irq(bp), p->dev_id, regs) == IRQ_HANDLED)
+                       random |= p->flags;
 
+               if (!action_mask)
+                       break;
+       }
+       if (bp->pil != 0) {
+               upa_writel(ICLR_IDLE, bp->iclr);
+               /* Test and add entropy */
+               if (random & SA_SAMPLE_RANDOM)
+                       add_interrupt_randomness(irq);
+       }
 out:
-       return;
+       bp->flags &= ~IBF_INPROGRESS;
 }
 
-#endif
-
 void handler_irq(int irq, struct pt_regs *regs)
 {
-       struct ino_bucket *bp, *nbp;
+       struct ino_bucket *bp;
        int cpu = smp_processor_id();
 
 #ifndef CONFIG_SMP
@@ -757,8 +620,6 @@
                clear_softint(clr_mask);
        }
 #else
-       int should_forward = 0;
-
        clear_softint(1 << irq);
 #endif
 
@@ -773,63 +634,12 @@
 #else
        bp = __bucket(xchg32(irq_work(cpu, irq), 0));
 #endif
-       for ( ; bp != NULL; bp = nbp) {
-               unsigned char flags = bp->flags;
-               unsigned char random = 0;
+       while (bp) {
+               struct ino_bucket *nbp = __bucket(bp->irq_chain);
 
-               nbp = __bucket(bp->irq_chain);
                bp->irq_chain = 0;
-
-               bp->flags |= IBF_INPROGRESS;
-
-               if ((flags & IBF_ACTIVE) != 0) {
-#ifdef CONFIG_PCI
-                       if ((flags & IBF_DMA_SYNC) != 0) {
-                               upa_readl(dma_sync_reg_table[bp->synctab_ent]);
-                               upa_readq(pci_dma_wsync);
-                       }
-#endif
-                       if ((flags & IBF_MULTI) == 0) {
-                               struct irqaction *ap = bp->irq_info;
-                               int ret;
-
-                               ret = ap->handler(__irq(bp), ap->dev_id, regs);
-                               if (ret == IRQ_HANDLED)
-                                       random |= ap->flags;
-                       } else {
-                               void **vector = (void **)bp->irq_info;
-                               int ent;
-                               for (ent = 0; ent < 4; ent++) {
-                                       struct irqaction *ap = vector[ent];
-                                       if (ap != NULL) {
-                                               int ret;
-
-                                               ret = ap->handler(__irq(bp),
-                                                                 ap->dev_id,
-                                                                 regs);
-                                               if (ret == IRQ_HANDLED)
-                                                       random |= ap->flags;
-                                       }
-                               }
-                       }
-                       /* Only the dummy bucket lacks IMAP/ICLR. */
-                       if (bp->pil != 0) {
-#ifdef CONFIG_SMP
-                               if (should_forward) {
-                                       redirect_intr(cpu, bp);
-                                       should_forward = 0;
-                               }
-#endif
-                               upa_writel(ICLR_IDLE, bp->iclr);
-
-                               /* Test and add entropy */
-                               if (random & SA_SAMPLE_RANDOM)
-                                       add_interrupt_randomness(irq);
-                       }
-               } else
-                       bp->pending = 1;
-
-               bp->flags &= ~IBF_INPROGRESS;
+               process_bucket(irq, bp, regs);
+               bp = nbp;
        }
        irq_exit();
 }
@@ -959,7 +769,10 @@
         */
        for (level = 1; level < NR_IRQS; level++) {
                struct irqaction *p = irq_action[level];
-               if (level == 12) continue;
+
+               if (level == 12)
+                       continue;
+
                while(p) {
                        cpu = retarget_one_irq(p, cpu);
                        p = p->next;
diff -urN linux/arch/sparc64/kernel/kprobes.c 
linux/arch/sparc64/kernel/kprobes.c
--- linux/arch/sparc64/kernel/kprobes.c 2005/07/11 20:46:40     1.6
+++ linux/arch/sparc64/kernel/kprobes.c 2005/07/12 09:19:08     1.7
@@ -433,3 +433,8 @@
        return 0;
 }
 
+/* architecture specific initialization */
+int arch_init_kprobes(void)
+{
+       return 0;
+}
diff -urN linux/arch/sparc64/kernel/pci_psycho.c 
linux/arch/sparc64/kernel/pci_psycho.c
--- linux/arch/sparc64/kernel/pci_psycho.c      2005/06/07 13:45:30     1.37
+++ linux/arch/sparc64/kernel/pci_psycho.c      2005/07/12 09:19:08     1.38
@@ -1303,8 +1303,7 @@
 {
        u64 tmp;
 
-       /* PROM sets the IRQ retry value too low, increase it. */
-       psycho_write(p->pbm_A.controller_regs + PSYCHO_IRQ_RETRY, 0xff);
+       psycho_write(p->pbm_A.controller_regs + PSYCHO_IRQ_RETRY, 5);
 
        /* Enable arbiter for all PCI slots. */
        tmp = psycho_read(p->pbm_A.controller_regs + PSYCHO_PCIA_CTRL);
diff -urN linux/arch/sparc64/kernel/pci_sabre.c 
linux/arch/sparc64/kernel/pci_sabre.c
--- linux/arch/sparc64/kernel/pci_sabre.c       2005/06/07 13:45:30     1.35
+++ linux/arch/sparc64/kernel/pci_sabre.c       2005/07/12 09:19:08     1.36
@@ -595,6 +595,23 @@
        return ret;
 }
 
+/* When a device lives behind a bridge deeper in the PCI bus topology
+ * than APB, a special sequence must run to make sure all pending DMA
+ * transfers at the time of IRQ delivery are visible in the coherency
+ * domain by the cpu.  This sequence is to perform a read on the far
+ * side of the non-APB bridge, then perform a read of Sabre's DMA
+ * write-sync register.
+ */
+static void sabre_wsync_handler(struct ino_bucket *bucket, void *_arg1, void 
*_arg2)
+{
+       struct pci_dev *pdev = _arg1;
+       unsigned long sync_reg = (unsigned long) _arg2;
+       u16 _unused;
+
+       pci_read_config_word(pdev, PCI_VENDOR_ID, &_unused);
+       sabre_read(sync_reg);
+}
+
 static unsigned int __init sabre_irq_build(struct pci_pbm_info *pbm,
                                           struct pci_dev *pdev,
                                           unsigned int ino)
@@ -639,24 +656,14 @@
        if (pdev) {
                struct pcidev_cookie *pcp = pdev->sysdata;
 
-               /* When a device lives behind a bridge deeper in the
-                * PCI bus topology than APB, a special sequence must
-                * run to make sure all pending DMA transfers at the
-                * time of IRQ delivery are visible in the coherency
-                * domain by the cpu.  This sequence is to perform
-                * a read on the far side of the non-APB bridge, then
-                * perform a read of Sabre's DMA write-sync register.
-                *
-                * Currently, the PCI_CONFIG register for the device
-                * is used for this read from the far side of the bridge.
-                */
                if (pdev->bus->number != pcp->pbm->pci_first_busno) {
-                       bucket->flags |= IBF_DMA_SYNC;
-                       bucket->synctab_ent = dma_sync_reg_table_entry++;
-                       dma_sync_reg_table[bucket->synctab_ent] =
-                               (unsigned long) sabre_pci_config_mkaddr(
-                                       pcp->pbm,
-                                       pdev->bus->number, pdev->devfn, 
PCI_COMMAND);
+                       struct pci_controller_info *p = pcp->pbm->parent;
+                       struct irq_desc *d = bucket->irq_info;
+
+                       d->pre_handler = sabre_wsync_handler;
+                       d->pre_handler_arg1 = pdev;
+                       d->pre_handler_arg2 = (void *)
+                               p->pbm_A.controller_regs + SABRE_WRSYNC;
                }
        }
        return __irq(bucket);
@@ -1626,10 +1633,9 @@
         */
        p->pbm_A.controller_regs = pr_regs[0].phys_addr;
        p->pbm_B.controller_regs = pr_regs[0].phys_addr;
-       pci_dma_wsync = p->pbm_A.controller_regs + SABRE_WRSYNC;
 
-       printk("PCI: Found SABRE, main regs at %016lx, wsync at %016lx\n",
-              p->pbm_A.controller_regs, pci_dma_wsync);
+       printk("PCI: Found SABRE, main regs at %016lx\n",
+              p->pbm_A.controller_regs);
 
        /* Clear interrupts */
 
diff -urN linux/arch/sparc64/kernel/pci_schizo.c 
linux/arch/sparc64/kernel/pci_schizo.c
--- linux/arch/sparc64/kernel/pci_schizo.c      2005/06/07 13:45:30     1.28
+++ linux/arch/sparc64/kernel/pci_schizo.c      2005/07/12 09:19:08     1.29
@@ -15,6 +15,7 @@
 #include <asm/iommu.h>
 #include <asm/irq.h>
 #include <asm/upa.h>
+#include <asm/pstate.h>
 
 #include "pci_impl.h"
 #include "iommu_common.h"
@@ -326,6 +327,44 @@
        return ret;
 }
 
+static void tomatillo_wsync_handler(struct ino_bucket *bucket, void *_arg1, 
void *_arg2)
+{
+       unsigned long sync_reg = (unsigned long) _arg2;
+       u64 mask = 1 << (__irq_ino(__irq(bucket)) & IMAP_INO);
+       u64 val;
+       int limit;
+
+       schizo_write(sync_reg, mask);
+
+       limit = 100000;
+       val = 0;
+       while (--limit) {
+               val = schizo_read(sync_reg);
+               if (!(val & mask))
+                       break;
+       }
+       if (limit <= 0) {
+               printk("tomatillo_wsync_handler: DMA won't sync [%lx:%lx]\n",
+                      val, mask);
+       }
+
+       if (_arg1) {
+               static unsigned char cacheline[64]
+                       __attribute__ ((aligned (64)));
+
+               __asm__ __volatile__("rd %%fprs, %0\n\t"
+                                    "or %0, %4, %1\n\t"
+                                    "wr %1, 0x0, %%fprs\n\t"
+                                    "stda %%f0, [%5] %6\n\t"
+                                    "wr %0, 0x0, %%fprs\n\t"
+                                    "membar #Sync"
+                                    : "=&r" (mask), "=&r" (val)
+                                    : "0" (mask), "1" (val),
+                                    "i" (FPRS_FEF), "r" (&cacheline[0]),
+                                    "i" (ASI_BLK_COMMIT_P));
+       }
+}
+
 static unsigned int schizo_irq_build(struct pci_pbm_info *pbm,
                                     struct pci_dev *pdev,
                                     unsigned int ino)
@@ -369,6 +408,15 @@
        bucket = __bucket(build_irq(pil, ign_fixup, iclr, imap));
        bucket->flags |= IBF_PCI;
 
+       if (pdev && pbm->chip_type == PBM_CHIP_TYPE_TOMATILLO) {
+               struct irq_desc *p = bucket->irq_info;
+
+               p->pre_handler = tomatillo_wsync_handler;
+               p->pre_handler_arg1 = ((pbm->chip_version <= 4) ?
+                                      (void *) 1 : (void *) 0);
+               p->pre_handler_arg2 = (void *) pbm->sync_reg;
+       }
+
        return __irq(bucket);
 }
 
@@ -885,6 +933,7 @@
 
 #define SCHIZO_PCI_CTRL                (0x2000UL)
 #define SCHIZO_PCICTRL_BUS_UNUS        (1UL << 63UL) /* Safari */
+#define SCHIZO_PCICTRL_DTO_INT (1UL << 61UL) /* Tomatillo */
 #define SCHIZO_PCICTRL_ARB_PRIO (0x1ff << 52UL) /* Tomatillo */
 #define SCHIZO_PCICTRL_ESLCK   (1UL << 51UL) /* Safari */
 #define SCHIZO_PCICTRL_ERRSLOT (7UL << 48UL) /* Safari */
@@ -1887,37 +1936,27 @@
 {
        u64 tmp;
 
-       /* Set IRQ retry to infinity. */
-       schizo_write(pbm->pbm_regs + SCHIZO_PCI_IRQ_RETRY,
-                    SCHIZO_IRQ_RETRY_INF);
-
-       /* Enable arbiter for all PCI slots.  Also, disable PCI interval
-        * timer so that DTO (Discard TimeOuts) are not reported because
-        * some Schizo revisions report them erroneously.
-        */
+       schizo_write(pbm->pbm_regs + SCHIZO_PCI_IRQ_RETRY, 5);
+
        tmp = schizo_read(pbm->pbm_regs + SCHIZO_PCI_CTRL);
-       if (pbm->chip_type == PBM_CHIP_TYPE_SCHIZO_PLUS &&
-           pbm->chip_version == 0x5 &&
-           pbm->chip_revision == 0x1)
-               tmp |= 0x0f;
-       else
-               tmp |= 0xff;
 
-       tmp &= ~SCHIZO_PCICTRL_PTO;
+       /* Enable arbiter for all PCI slots.  */
+       tmp |= 0xff;
+
        if (pbm->chip_type == PBM_CHIP_TYPE_TOMATILLO &&
            pbm->chip_version >= 0x2)
                tmp |= 0x3UL << SCHIZO_PCICTRL_PTO_SHIFT;
-       else
-               tmp |= 0x1UL << SCHIZO_PCICTRL_PTO_SHIFT;
 
        if (!prom_getbool(pbm->prom_node, "no-bus-parking"))
                tmp |= SCHIZO_PCICTRL_PARK;
+       else
+               tmp &= ~SCHIZO_PCICTRL_PARK;
 
        if (pbm->chip_type == PBM_CHIP_TYPE_TOMATILLO &&
            pbm->chip_version <= 0x1)
-               tmp |= (1UL << 61);
+               tmp |= SCHIZO_PCICTRL_DTO_INT;
        else
-               tmp &= ~(1UL << 61);
+               tmp &= ~SCHIZO_PCICTRL_DTO_INT;
 
        if (pbm->chip_type == PBM_CHIP_TYPE_TOMATILLO)
                tmp |= (SCHIZO_PCICTRL_MRM_PREF |
@@ -2015,6 +2054,9 @@
        pbm->pbm_regs = pr_regs[0].phys_addr;
        pbm->controller_regs = pr_regs[1].phys_addr - 0x10000UL;
 
+       if (chip_type == PBM_CHIP_TYPE_TOMATILLO)
+               pbm->sync_reg = pr_regs[3].phys_addr + 0x1a18UL;
+
        sprintf(pbm->name,
                (chip_type == PBM_CHIP_TYPE_TOMATILLO ?
                 "TOMATILLO%d PBM%c" :
diff -urN linux/arch/sparc64/kernel/time.c linux/arch/sparc64/kernel/time.c
--- linux/arch/sparc64/kernel/time.c    2005/05/19 12:08:16     1.61
+++ linux/arch/sparc64/kernel/time.c    2005/07/12 09:19:08     1.62
@@ -973,7 +973,7 @@
        int err;
 
        /* Register IRQ handler. */
-       err = request_irq(build_irq(0, 0, 0UL, 0UL), cfunc, SA_STATIC_ALLOC,
+       err = request_irq(build_irq(0, 0, 0UL, 0UL), cfunc, 0,
                          "timer", NULL);
 
        if (err) {
diff -urN linux/arch/sparc64/mm/ultra.S linux/arch/sparc64/mm/ultra.S
--- linux/arch/sparc64/mm/ultra.S       2005/07/11 20:46:41     1.39
+++ linux/arch/sparc64/mm/ultra.S       2005/07/12 09:19:09     1.40
@@ -72,6 +72,7 @@
        flush           %g6
        retl
         wrpr           %g7, 0x0, %pstate
+       nop
 
        .align          32
        .globl          __flush_tlb_kernel_range
@@ -249,7 +250,7 @@
        retl
         wrpr           %g7, 0x0, %pstate
 
-__cheetah_flush_tlb_pending:   /* 22 insns */
+__cheetah_flush_tlb_pending:   /* 23 insns */
        /* %o0 = context, %o1 = nr, %o2 = vaddrs[] */
        rdpr            %pstate, %g7
        sllx            %o1, 3, %o1
@@ -317,7 +318,7 @@
        sethi           %hi(__cheetah_flush_tlb_pending), %o1
        or              %o1, %lo(__cheetah_flush_tlb_pending), %o1
        call            cheetah_patch_one
-        mov            22, %o2
+        mov            23, %o2
 
 #ifdef DCACHE_ALIASING_POSSIBLE
        sethi           %hi(__flush_dcache_page), %o0
diff -urN linux/arch/x86_64/kernel/io_apic.c linux/arch/x86_64/kernel/io_apic.c
--- linux/arch/x86_64/kernel/io_apic.c  2005/07/11 20:46:45     1.37
+++ linux/arch/x86_64/kernel/io_apic.c  2005/07/12 09:19:09     1.38
@@ -1064,7 +1064,6 @@
 
 void __apicdebuginit print_PIC(void)
 {
-       extern spinlock_t i8259A_lock;
        unsigned int v;
        unsigned long flags;
 
diff -urN linux/arch/x86_64/kernel/kprobes.c linux/arch/x86_64/kernel/kprobes.c
--- linux/arch/x86_64/kernel/kprobes.c  2005/07/11 20:46:45     1.5
+++ linux/arch/x86_64/kernel/kprobes.c  2005/07/12 09:19:09     1.6
@@ -682,7 +682,7 @@
        .pre_handler = trampoline_probe_handler
 };
 
-int __init arch_init(void)
+int __init arch_init_kprobes(void)
 {
        return register_kprobe(&trampoline_p);
 }
diff -urN linux/arch/xtensa/Kconfig linux/arch/xtensa/Kconfig
--- linux/arch/xtensa/Kconfig   2005/07/11 20:46:47     1.1
+++ linux/arch/xtensa/Kconfig   2005/07/12 09:19:09     1.2
@@ -132,7 +132,7 @@
 config GENERIC_CALIBRATE_DELAY
        bool "Auto calibration of the BogoMIPS value"
        ---help---
-         The BogoMIPS value can easily derived from the CPU frequency.
+         The BogoMIPS value can easily be derived from the CPU frequency.
 
 config CMDLINE_BOOL
        bool "Default bootloader kernel arguments"
@@ -158,6 +158,8 @@
        depends on XTENSA_PLATFORM_ISS
        default y
 
+source "mm/Kconfig"
+
 endmenu
 
 menu "Bus options"
diff -urN linux/arch/xtensa/Makefile linux/arch/xtensa/Makefile
--- linux/arch/xtensa/Makefile  2005/07/11 20:46:47     1.1
+++ linux/arch/xtensa/Makefile  2005/07/12 09:19:09     1.2
@@ -21,23 +21,17 @@
 
 # Platform configuration
 
-platform-y                                     := common
 platform-$(CONFIG_XTENSA_PLATFORM_XT2000)      := xt2000
 platform-$(CONFIG_XTENSA_PLATFORM_ISS)         := iss
 
 PLATFORM = $(platform-y)
 export PLATFORM
 
-#LDFLAGS_vmlinux               := -T$(word 1,$(LINKSCRIPT))
-AFLAGS_vmlinux.lds.o   := -Uxtensa
-CPPFLAGS               += -Iarch/xtensa -Iinclude/asm  -mlongcalls  -g
-AFLAGS                 += -Iarch/xtensa -Iinclude/asm
-CPP                    = $(CC) -E $(CFLAGS)
+CPPFLAGS       += $(if $(KBUILD_SRC),-I$(srctree)/include/asm-xtensa/)
+CPPFLAGS       += -Iinclude/asm
+CFLAGS         += -pipe -mlongcalls
 
-cflags-y       += -Iarch/xtensa -pipe -mlongcalls
-
-
-KBUILD_DEFCONFIG := common_defconfig
+KBUILD_DEFCONFIG := iss_defconfig
 
 # ramdisk/initrd support
 # You need a compressed ramdisk image, named ramdisk.gz in
@@ -62,30 +56,36 @@
 LIBGCC := $(shell $(CC) $(CFLAGS) -print-libgcc-file-name)
 
 head-y         := arch/xtensa/kernel/head.o
-core-y         += arch/xtensa/kernel/ \
-                  arch/xtensa/mm/ arch/xtensa/platform-$(PLATFORM)/
+core-y         += arch/xtensa/kernel/ arch/xtensa/mm/
+ifneq ($(PLATFORM),)
+core-y         += arch/xtensa/platform-$(PLATFORM)/
+endif
 libs-y         += arch/xtensa/lib/ $(LIBGCC)
 
-boot   := arch/xtensa/boot
+boot           := arch/xtensa/boot
+
+archinc                := include/asm-xtensa
 
 arch/xtensa/kernel/asm-offsets.s: \
-       arch/xtensa/kernel/asm-offsets.c \
-       include/asm-xtensa/.platform
+       arch/xtensa/kernel/asm-offsets.c $(archinc)/.platform
 
 include/asm-xtensa/offsets.h: arch/xtensa/kernel/asm-offsets.s
        $(call filechk,gen-asm-offsets)
 
-prepare: include/asm-xtensa/.platform include/asm-xtensa/offsets.h
+prepare: $(archinc)/.platform $(archinc)/offsets.h
 
 # Update machine cpu and platform symlinks if something which affects
 # them changed.
 
-include/asm-xtensa/.platform: $(wildcard include/config/arch/*.h)
-       @echo '  Setting up cpu ($(CPU)) and platform ($(PLATFORM)) symlinks'
-       $(Q)rm -f include/asm-xtensa/platform
-       $(Q)rm -f include/asm-xtensa/xtensa/config
-       $(Q)(cd include/asm-xtensa/; ln -sf platform-$(PLATFORM) platform)
-       $(Q)(cd include/asm-xtensa/xtensa; ln -sf config-$(CPU) config)
+$(archinc)/.platform: $(wildcard include/config/arch/*.h) include/config/MARKER
+       @echo '  SYMLINK $(archinc)/xtensa/config -> 
$(archinc)/xtensa/config-$(CPU)'
+       $(Q)mkdir -p $(archinc)
+       $(Q)mkdir -p $(archinc)/xtensa
+       $(Q)ln -fsn $(srctree)/$(archinc)/xtensa/config-$(CPU) 
$(archinc)/xtensa/config
+       @echo '  SYMLINK $(archinc)/platform -> $(archinc)/platform-$(PLATFORM)'
+       $(Q)ln -fsn $(srctree)/$(archinc)/platform-$(PLATFORM) 
$(archinc)/platform
+       @touch $@
+
 
 all: zImage
 
@@ -94,7 +94,9 @@
 zImage zImage.initrd: vmlinux
        $(Q)$(MAKE) $(build)=$(boot) $@
 
-CLEAN_FILES    += arch/xtensa/vmlinux.lds include/asm-xtensa/offset.h
+CLEAN_FILES    += arch/xtensa/vmlinux.lds $(archinc)/offset.h \
+                  $(archinc)/platform $(archinc)/xtensa/config \
+                  $(archinc)/.platform
 
 define archhelp
   @echo '* zImage      - Compressed kernel image 
(arch/xtensa/boot/images/zImage.*)'
diff -urN linux/arch/xtensa/boot/Makefile linux/arch/xtensa/boot/Makefile
--- linux/arch/xtensa/boot/Makefile     2005/07/11 20:46:47     1.1
+++ linux/arch/xtensa/boot/Makefile     2005/07/12 09:19:09     1.2
@@ -11,21 +11,19 @@
 CFLAGS                 += -fno-builtin -Iarch/$(ARCH)/boot/include
 HOSTFLAGS      += -Iarch/$(ARCH)/boot/include
 
-BIG_ENDIAN     := $(shell echo -e "\#ifdef __XTENSA_EL__\nint 
little;\n\#else\nint big;\n\#endif" | $(CC) -E -|grep -c big)
-
+BIG_ENDIAN     := $(shell echo -e __XTENSA_EB__ | $(CC) -E - | grep -v "\#")
 
 export CFLAGS
 export AFLAGS
 export BIG_ENDIAN
 
+subdir-y       := lib
+
 # Subdirs for the boot loader(s)
 
 bootdir-$(CONFIG_XTENSA_PLATFORM_ISS)   += boot-elf
 bootdir-$(CONFIG_XTENSA_PLATFORM_XT2000) += boot-redboot boot-elf
 
-subdir-y       := lib/
-
-subdir-y       += boot-elf/ boot-redboot/
 
 zImage zImage.initrd Image Image.initrd: $(bootdir-y)
 
@@ -33,5 +31,3 @@
              $(addprefix $(obj)/,$(host-progs))
        $(Q)$(MAKE) $(build)=$(obj)/$@ $(MAKECMDGOALS)
 
-
-
diff -urN linux/arch/xtensa/boot/boot-elf/Makefile 
linux/arch/xtensa/boot/boot-elf/Makefile
--- linux/arch/xtensa/boot/boot-elf/Makefile    2005/07/11 20:46:47     1.1
+++ linux/arch/xtensa/boot/boot-elf/Makefile    2005/07/12 09:19:09     1.2
@@ -27,7 +27,7 @@
                --set-section-flags image=contents,alloc,load,load,data \
                $(OBJS) $@.tmp
        $(LD) $(LDFLAGS) $(LDFLAGS_vmlinux) \
-               -T arch/$(ARCH)/boot/boot-elf/boot.ld \
+               -T $(srctree)/arch/$(ARCH)/boot/boot-elf/boot.ld \
                -o arch/$(ARCH)/boot/$@.elf $@.tmp
        rm -f $@.tmp vmlinux.tmp
 
@@ -41,7 +41,7 @@
                --set-section-flags image=contents,alloc,load,load,data \
                $(OBJS) $@.tmp
        $(LD) $(LDFLAGS) $(LDFLAGS_vmlinux) \
-               -T arch/$(ARCH)/boot/boot-elf/boot.ld \
+               -T $(srctree)/arch/$(ARCH)/boot/boot-elf/boot.ld \
                -o arch/$(ARCH)/boot/$@.elf $@.tmp
        rm -f $@.tmp vmlinux.tmp
 
diff -urN linux/arch/xtensa/boot/boot-redboot/Makefile 
linux/arch/xtensa/boot/boot-redboot/Makefile
--- linux/arch/xtensa/boot/boot-redboot/Makefile        2005/07/11 20:46:47     
1.1
+++ linux/arch/xtensa/boot/boot-redboot/Makefile        2005/07/12 09:19:09     
1.2
@@ -12,24 +12,24 @@
 OBJCOPY_ARGS   := -O elf32-xtensa-le
 endif
 
-LD_ARGS        = -T $(obj)/boot.ld
+LD_ARGS        = -T $(srctree)/$(obj)/boot.ld
 
 boot-y := bootstrap.o
 
 OBJS   := $(addprefix $(obj)/,$(boot-y))
-LIBS   := arch/$(ARCH)/boot/lib/lib.a arch/$(ARCH)/lib/lib.a
+LIBS   := arch/xtensa/boot/lib/lib.a arch/xtensa/lib/lib.a
 
 LIBGCC := $(shell $(CC) $(CFLAGS) -print-libgcc-file-name)
 
 zImage: vmlinux $(OBJS) $(LIBS)
        $(OBJCOPY) --strip-all -R .comment -R .xt.insn -O binary \
-               $(TOPDIR)/vmlinux vmlinux.tmp
+               vmlinux vmlinux.tmp
        gzip -vf9 vmlinux.tmp
        $(OBJCOPY) $(OBJCOPY_ARGS) -R .comment \
                --add-section image=vmlinux.tmp.gz \
                --set-section-flags image=contents,alloc,load,load,data \
                $(OBJS) $@.tmp
        $(LD) $(LD_ARGS) -o $@.elf $@.tmp $(LIBS) -L/xtensa-elf/lib $(LIBGCC)
-       $(OBJCOPY) -S -O binary $@.elf arch/$(ARCH)/boot/images/$@.redboot
-#      rm -f $@.tmp $@.elf vmlinux.tmp.gz
+       $(OBJCOPY) -S -O binary $@.elf arch/$(ARCH)/boot/$@.redboot
+       rm -f $@.tmp $@.elf vmlinux.tmp.gz
 
diff -urN linux/arch/xtensa/boot/include/zlib.h 
linux/arch/xtensa/boot/include/zlib.h
--- linux/arch/xtensa/boot/include/Attic/zlib.h 2005-07-12 10:19:09.994082000 
+0100     1.1
+++ linux/arch/xtensa/boot/include/Attic/zlib.h 1970/01/01 00:00:00+0100
@@ -1,433 +0,0 @@
-/*
- * BK Id: SCCS/s.zlib.h 1.8 05/18/01 15:17:23 cort
- */
-/*
- * This file is derived from zlib.h and zconf.h from the zlib-0.95
- * distribution by Jean-loup Gailly and Mark Adler, with some additions
- * by Paul Mackerras to aid in implementing Deflate compression and
- * decompression for PPP packets.
- */
-
-/*
- *  ==FILEVERSION 960122==
- *
- * This marker is used by the Linux installation script to determine
- * whether an up-to-date version of this file is already installed.
- */
-
-/* zlib.h -- interface of the 'zlib' general purpose compression library
-  version 0.95, Aug 16th, 1995.
-
-  Copyright (C) 1995 Jean-loup Gailly and Mark Adler
-
-  This software is provided 'as-is', without any express or implied
-  warranty.  In no event will the authors be held liable for any damages
-  arising from the use of this software.
-
-  Permission is granted to anyone to use this software for any purpose,
-  including commercial applications, and to alter it and redistribute it
-  freely, subject to the following restrictions:
-
-  1. The origin of this software must not be misrepresented; you must not
-     claim that you wrote the original software. If you use this software
-     in a product, an acknowledgment in the product documentation would be
-     appreciated but is not required.
-  2. Altered source versions must be plainly marked as such, and must not be
-     misrepresented as being the original software.
-  3. This notice may not be removed or altered from any source distribution.
-
-  Jean-loup Gailly        Mark Adler
-  gzip@prep.ai.mit.edu    madler@alumni.caltech.edu
- */
-
-#ifndef _ZLIB_H
-#define _ZLIB_H
-
-/* #include "zconf.h" */       /* included directly here */
-
-/* zconf.h -- configuration of the zlib compression library
- * Copyright (C) 1995 Jean-loup Gailly.
- * For conditions of distribution and use, see copyright notice in zlib.h
- */
-
-/* From: zconf.h,v 1.12 1995/05/03 17:27:12 jloup Exp */
-
-/*
-     The library does not install any signal handler. It is recommended to
-  add at least a handler for SIGSEGV when decompressing; the library checks
-  the consistency of the input data whenever possible but may go nuts
-  for some forms of corrupted input.
- */
-
-/*
- * Compile with -DMAXSEG_64K if the alloc function cannot allocate more
- * than 64k bytes at a time (needed on systems with 16-bit int).
- * Compile with -DUNALIGNED_OK if it is OK to access shorts or ints
- * at addresses which are not a multiple of their size.
- * Under DOS, -DFAR=far or -DFAR=__far may be needed.
- */
-
-#ifndef STDC
-#  if defined(MSDOS) || defined(__STDC__) || defined(__cplusplus)
-#    define STDC
-#  endif
-#endif
-
-#ifdef __MWERKS__ /* Metrowerks CodeWarrior declares fileno() in unix.h */
-#  include <unix.h>
-#endif
-
-/* Maximum value for memLevel in deflateInit2 */
-#ifndef MAX_MEM_LEVEL
-#  ifdef MAXSEG_64K
-#    define MAX_MEM_LEVEL 8
-#  else
-#    define MAX_MEM_LEVEL 9
-#  endif
-#endif
-
-#ifndef FAR
-#  define FAR
-#endif
-
-/* Maximum value for windowBits in deflateInit2 and inflateInit2 */
-#ifndef MAX_WBITS
-#  define MAX_WBITS   15 /* 32K LZ77 window */
-#endif
-
-/* The memory requirements for deflate are (in bytes):
-            1 << (windowBits+2)   +  1 << (memLevel+9)
- that is: 128K for windowBits=15  +  128K for memLevel = 8  (default values)
- plus a few kilobytes for small objects. For example, if you want to reduce
- the default memory requirements from 256K to 128K, compile with
-     make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7"
- Of course this will generally degrade compression (there's no free lunch).
-
-   The memory requirements for inflate are (in bytes) 1 << windowBits
- that is, 32K for windowBits=15 (default value) plus a few kilobytes
- for small objects.
-*/
-
-                        /* Type declarations */
-
-#ifndef OF /* function prototypes */
-#  ifdef STDC
-#    define OF(args)  args
-#  else
-#    define OF(args)  ()
-#  endif
-#endif
-
-typedef unsigned char  Byte;  /* 8 bits */
-typedef unsigned int   uInt;  /* 16 bits or more */
-typedef unsigned long  uLong; /* 32 bits or more */
-
-typedef Byte FAR Bytef;
-typedef char FAR charf;
-typedef int FAR intf;
-typedef uInt FAR uIntf;
-typedef uLong FAR uLongf;
-
-#ifdef STDC
-   typedef void FAR *voidpf;
-   typedef void     *voidp;
-#else
-   typedef Byte FAR *voidpf;
-   typedef Byte     *voidp;
-#endif
-
-/* end of original zconf.h */
-
-#define ZLIB_VERSION "0.95P"
-
-/*
-     The 'zlib' compression library provides in-memory compression and
-  decompression functions, including integrity checks of the uncompressed
-  data.  This version of the library supports only one compression method
-  (deflation) but other algorithms may be added later and will have the same
-  stream interface.
-
-     For compression the application must provide the output buffer and
-  may optionally provide the input buffer for optimization. For decompression,
-  the application must provide the input buffer and may optionally provide
-  the output buffer for optimization.
-
-     Compression can be done in a single step if the buffers are large
-  enough (for example if an input file is mmap'ed), or can be done by
-  repeated calls of the compression function.  In the latter case, the
-  application must provide more input and/or consume the output
-  (providing more output space) before each call.
-*/
-
-typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size));
-typedef void   (*free_func)  OF((voidpf opaque, voidpf address, uInt nbytes));
-
-struct internal_state;
-
-typedef struct z_stream_s {
-    Bytef    *next_in;  /* next input byte */
-    uInt     avail_in;  /* number of bytes available at next_in */
-    uLong    total_in;  /* total nb of input bytes read so far */
-
-    Bytef    *next_out; /* next output byte should be put there */
-    uInt     avail_out; /* remaining free space at next_out */
-    uLong    total_out; /* total nb of bytes output so far */
-
-    char     *msg;      /* last error message, NULL if no error */
-    struct internal_state FAR *state; /* not visible by applications */
-
-    alloc_func zalloc;  /* used to allocate the internal state */
-    free_func  zfree;   /* used to free the internal state */
-    voidp      opaque;  /* private data object passed to zalloc and zfree */
-
-    Byte     data_type; /* best guess about the data type: ascii or binary */
-
-} z_stream;
-
-/*
-   The application must update next_in and avail_in when avail_in has
-   dropped to zero. It must update next_out and avail_out when avail_out
-   has dropped to zero. The application must initialize zalloc, zfree and
-   opaque before calling the init function. All other fields are set by the
-   compression library and must not be updated by the application.
-
-   The opaque value provided by the application will be passed as the first
-   parameter for calls of zalloc and zfree. This can be useful for custom
-   memory management. The compression library attaches no meaning to the
-   opaque value.
-
-   zalloc must return Z_NULL if there is not enough memory for the object.
-   On 16-bit systems, the functions zalloc and zfree must be able to allocate
-   exactly 65536 bytes, but will not be required to allocate more than this
-   if the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS,
-   pointers returned by zalloc for objects of exactly 65536 bytes *must*
-   have their offset normalized to zero. The default allocation function
-   provided by this library ensures this (see zutil.c). To reduce memory
-   requirements and avoid any allocation of 64K objects, at the expense of
-   compression ratio, compile the library with -DMAX_WBITS=14 (see zconf.h).
-
-   The fields total_in and total_out can be used for statistics or
-   progress reports. After compression, total_in holds the total size of
-   the uncompressed data and may be saved for use in the decompressor
-   (particularly if the decompressor wants to decompress everything in
-   a single step).
-*/
-
-                        /* constants */
-
-#define Z_NO_FLUSH      0
-#define Z_PARTIAL_FLUSH 1
-#define Z_FULL_FLUSH    2
-#define Z_SYNC_FLUSH    3 /* experimental: partial_flush + byte align */
-#define Z_FINISH        4
-#define Z_PACKET_FLUSH 5
-/* See deflate() below for the usage of these constants */
-
-#define Z_OK            0
-#define Z_STREAM_END    1
-#define Z_ERRNO        (-1)
-#define Z_STREAM_ERROR (-2)
-#define Z_DATA_ERROR   (-3)
-#define Z_MEM_ERROR    (-4)
-#define Z_BUF_ERROR    (-5)
-/* error codes for the compression/decompression functions */
-
-#define Z_BEST_SPEED             1
-#define Z_BEST_COMPRESSION       9
-#define Z_DEFAULT_COMPRESSION  (-1)
-/* compression levels */
-
-#define Z_FILTERED            1
-#define Z_HUFFMAN_ONLY        2
-#define Z_DEFAULT_STRATEGY    0
-
-#define Z_BINARY   0
-#define Z_ASCII    1
-#define Z_UNKNOWN  2
-/* Used to set the data_type field */
-
-#define Z_NULL  0  /* for initializing zalloc, zfree, opaque */
-
-extern char *zlib_version;
-/* The application can compare zlib_version and ZLIB_VERSION for consistency.
-   If the first character differs, the library code actually used is
-   not compatible with the zlib.h header file used by the application.
- */
-
-                        /* basic functions */
-
-extern int inflateInit OF((z_stream *strm));
-/*
-     Initializes the internal stream state for decompression. The fields
-   zalloc and zfree must be initialized before by the caller.  If zalloc and
-   zfree are set to Z_NULL, inflateInit updates them to use default allocation
-   functions.
-
-     inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not
-   enough memory.  msg is set to null if there is no error message.
-   inflateInit does not perform any decompression: this will be done by
-   inflate().
-*/
-
-
-extern int inflate OF((z_stream *strm, int flush));
-/*
-  Performs one or both of the following actions:
-
-  - Decompress more input starting at next_in and update next_in and avail_in
-    accordingly. If not all input can be processed (because there is not
-    enough room in the output buffer), next_in is updated and processing
-    will resume at this point for the next call of inflate().
-
-  - Provide more output starting at next_out and update next_out and avail_out
-    accordingly.  inflate() always provides as much output as possible
-    (until there is no more input data or no more space in the output buffer).
-
-  Before the call of inflate(), the application should ensure that at least
-  one of the actions is possible, by providing more input and/or consuming
-  more output, and updating the next_* and avail_* values accordingly.
-  The application can consume the uncompressed output when it wants, for
-  example when the output buffer is full (avail_out == 0), or after each
-  call of inflate().
-
-    If the parameter flush is set to Z_PARTIAL_FLUSH or Z_PACKET_FLUSH,
-  inflate flushes as much output as possible to the output buffer. The
-  flushing behavior of inflate is not specified for values of the flush
-  parameter other than Z_PARTIAL_FLUSH, Z_PACKET_FLUSH or Z_FINISH, but the
-  current implementation actually flushes as much output as possible
-  anyway.  For Z_PACKET_FLUSH, inflate checks that once all the input data
-  has been consumed, it is expecting to see the length field of a stored
-  block; if not, it returns Z_DATA_ERROR.
-
-    inflate() should normally be called until it returns Z_STREAM_END or an
-  error. However if all decompression is to be performed in a single step
-  (a single call of inflate), the parameter flush should be set to
-  Z_FINISH. In this case all pending input is processed and all pending
-  output is flushed; avail_out must be large enough to hold all the
-  uncompressed data. (The size of the uncompressed data may have been saved
-  by the compressor for this purpose.) The next operation on this stream must
-  be inflateEnd to deallocate the decompression state. The use of Z_FINISH
-  is never required, but can be used to inform inflate that a faster routine
-  may be used for the single inflate() call.
-
-    inflate() returns Z_OK if some progress has been made (more input
-  processed or more output produced), Z_STREAM_END if the end of the
-  compressed data has been reached and all uncompressed output has been
-  produced, Z_DATA_ERROR if the input data was corrupted, Z_STREAM_ERROR if
-  the stream structure was inconsistent (for example if next_in or next_out
-  was NULL), Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR if no
-  progress is possible or if there was not enough room in the output buffer
-  when Z_FINISH is used. In the Z_DATA_ERROR case, the application may then
-  call inflateSync to look for a good compression block.  */
-
-
-extern int inflateEnd OF((z_stream *strm));
-/*
-     All dynamically allocated data structures for this stream are freed.
-   This function discards any unprocessed input and does not flush any
-   pending output.
-
-     inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state
-   was inconsistent. In the error case, msg may be set but then points to a
-   static string (which must not be deallocated).
-*/
-
-                        /* advanced functions */
-
-extern int inflateInit2 OF((z_stream *strm,
-                            int  windowBits));
-/*
-     This is another version of inflateInit with more compression options. The
-   fields next_out, zalloc and zfree must be initialized before by the caller.
-
-     The windowBits parameter is the base two logarithm of the maximum window
-   size (the size of the history buffer).  It should be in the range 8..15 for
-   this version of the library (the value 16 will be allowed soon). The
-   default value is 15 if inflateInit is used instead. If a compressed stream
-   with a larger window size is given as input, inflate() will return with
-   the error code Z_DATA_ERROR instead of trying to allocate a larger window.
-
-     If next_out is not null, the library will use this buffer for the history
-   buffer; the buffer must either be large enough to hold the entire output
-   data, or have at least 1<<windowBits bytes.  If next_out is null, the
-   library will allocate its own buffer (and leave next_out null). next_in
-   need not be provided here but must be provided by the application for the
-   next call of inflate().
-
-     If the history buffer is provided by the application, next_out must
-   never be changed by the application since the decompressor maintains
-   history information inside this buffer from call to call; the application
-   can only reset next_out to the beginning of the history buffer when
-   avail_out is zero and all output has been consumed.
-
-      inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was
-   not enough memory, Z_STREAM_ERROR if a parameter is invalid (such as
-   windowBits < 8). msg is set to null if there is no error message.
-   inflateInit2 does not perform any decompression: this will be done by
-   inflate().
-*/
-
-extern int inflateSync OF((z_stream *strm));
-/*
-    Skips invalid compressed data until the special marker (see deflate()
-  above) can be found, or until all available input is skipped. No output
-  is provided.
-
-    inflateSync returns Z_OK if the special marker has been found, Z_BUF_ERROR
-  if no more input was provided, Z_DATA_ERROR if no marker has been found,
-  or Z_STREAM_ERROR if the stream structure was inconsistent. In the success
-  case, the application may save the current current value of total_in which
-  indicates where valid compressed data was found. In the error case, the
-  application may repeatedly call inflateSync, providing more input each time,
-  until success or end of the input data.
-*/
-
-extern int inflateReset OF((z_stream *strm));
-/*
-     This function is equivalent to inflateEnd followed by inflateInit,
-   but does not free and reallocate all the internal decompression state.
-   The stream will keep attributes that may have been set by inflateInit2.
-
-      inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source
-   stream state was inconsistent (such as zalloc or state being NULL).
-*/
-
-extern int inflateIncomp OF((z_stream *strm));
-/*
-     This function adds the data at next_in (avail_in bytes) to the output
-   history without performing any output.  There must be no pending output,
-   and the decompressor must be expecting to see the start of a block.
-   Calling this function is equivalent to decompressing a stored block
-   containing the data at next_in (except that the data is not output).
-*/
-
-                        /* checksum functions */
-
-/*
-     This function is not related to compression but is exported
-   anyway because it might be useful in applications using the
-   compression library.
-*/
-
-extern uLong adler32 OF((uLong adler, Bytef *buf, uInt len));
-
-/*
-     Update a running Adler-32 checksum with the bytes buf[0..len-1] and
-   return the updated checksum. If buf is NULL, this function returns
-   the required initial value for the checksum.
-   An Adler-32 checksum is almost as reliable as a CRC32 but can be computed
-   much faster. Usage example:
-
-     uLong adler = adler32(0L, Z_NULL, 0);
-
-     while (read_buffer(buffer, length) != EOF) {
-       adler = adler32(adler, buffer, length);
-     }
-     if (adler != original_adler) error();
-*/
-
-#ifndef _Z_UTIL_H
-    struct internal_state {int dummy;}; /* hack for buggy compilers */
-#endif
-
-#endif /* _ZLIB_H */
diff -urN linux/arch/xtensa/boot/lib/Makefile 
linux/arch/xtensa/boot/lib/Makefile
--- linux/arch/xtensa/boot/lib/Makefile 2005/07/11 20:46:48     1.1
+++ linux/arch/xtensa/boot/lib/Makefile 2005/07/12 09:19:10     1.2
@@ -2,5 +2,16 @@
 # Makefile for some libs needed by zImage.
 #
 
+zlib   := infblock.c infcodes.c inffast.c inflate.c inftrees.c infutil.c
 
-lib-y := zlib.o zmem.o
+lib-y  += $(zlib:.c=.o) zmem.o
+
+EXTRA_CFLAGS   += -Ilib/zlib_inflate
+
+quiet_cmd_copy_zlib = COPY    $@
+      cmd_copy_zlib = cat $< > $@
+
+$(addprefix $(obj)/,$(zlib)): $(obj)/%: $(srctree)/lib/zlib_inflate/%
+       $(call cmd,copy_zlib)
+
+clean-files    := $(zlib)
diff -urN linux/arch/xtensa/boot/lib/zmem.c linux/arch/xtensa/boot/lib/zmem.c
--- linux/arch/xtensa/boot/lib/zmem.c   2005/07/11 20:46:48     1.1
+++ linux/arch/xtensa/boot/lib/zmem.c   2005/07/12 09:19:10     1.2
@@ -1,4 +1,4 @@
-#include "zlib.h"
+#include <linux/zlib.h>
 
 /* bits taken from ppc */
 
@@ -9,11 +9,10 @@
   for (;;);
 }
 
-void *zalloc(void *x, unsigned items, unsigned size)
+void *zalloc(unsigned size)
 {
         void *p = avail_ram;
 
-        size *= items;
         size = (size + 7) & -8;
         avail_ram += size;
         if (avail_ram > end_avail) {
@@ -24,11 +23,6 @@
         return p;
 }
 
-void zfree(void *x, void *addr, unsigned nb)
-{
-}
-
-
 #define HEAD_CRC        2
 #define EXTRA_FIELD     4
 #define ORIG_NAME       8
@@ -43,7 +37,6 @@
        int r, i, flags;
 
         /* skip header */
-
         i = 10;
         flags = src[3];
         if (src[2] != DEFLATED || (flags & RESERVED) != 0) {
@@ -65,9 +58,8 @@
                 exit();
         }
 
-        s.zalloc = zalloc;
-        s.zfree = zfree;
-        r = inflateInit2(&s, -MAX_WBITS);
+       s.workspace = zalloc(zlib_inflate_workspacesize());
+        r = zlib_inflateInit2(&s, -MAX_WBITS);
         if (r != Z_OK) {
                 //puts("inflateInit2 returned "); puthex(r); puts("\n");
                 exit();
@@ -76,12 +68,12 @@
         s.avail_in = *lenp - i;
         s.next_out = dst;
         s.avail_out = dstlen;
-        r = inflate(&s, Z_FINISH);
+        r = zlib_inflate(&s, Z_FINISH);
         if (r != Z_OK && r != Z_STREAM_END) {
                 //puts("inflate returned "); puthex(r); puts("\n");
                 exit();
         }
         *lenp = s.next_out - (unsigned char *) dst;
-        inflateEnd(&s);
+        zlib_inflateEnd(&s);
 }
 
diff -urN linux/arch/xtensa/boot/lib/memcpy.S 
linux/arch/xtensa/boot/lib/memcpy.S
--- linux/arch/xtensa/boot/lib/Attic/memcpy.S   2005-07-12 10:19:10.196074000 
+0100     1.1
+++ linux/arch/xtensa/boot/lib/Attic/memcpy.S   1970/01/01 00:00:00+0100
@@ -1,36 +0,0 @@
-/*
- *  arch/xtensa/lib/memcpy.S
- *
- *  ANSI C standard library function memcpy
- *
- *  This file is subject to the terms and conditions of the GNU General
- *  Public License.  See the file "COPYING" in the main directory of
- *  this archive for more details.
- *
- *  Copyright (C) 2002 Tensilica Inc.
- */
-
-#define _ASMLANGUAGE
-#include <xtensa/config/core.h>
-
-.text
-.align 4
-.global        bcopy
-.type   bcopy,@function
-bcopy:
-        movi    a14, xthal_bcopy        // a14 safe to use regardless of 
whether caller
-                                        //   used call4 or call8 (can't have 
used call12)
-        jx      a14                     // let the Core HAL do the work
-
-.text
-.align 4
-.global        memcpy
-.type   memcpy,@function
-memcpy:
-.global        memmove
-.type   memmove,@function
-memmove:
-        movi    a14, xthal_memcpy      // a14 safe to use regardless of 
whether caller
-                                        //   used call4 or call8 (can't have 
used call12)
-        jx      a14                     // let the Core HAL do the work
-
diff -urN linux/arch/xtensa/boot/lib/zlib.c linux/arch/xtensa/boot/lib/zlib.c
--- linux/arch/xtensa/boot/lib/Attic/zlib.c     2005-07-12 10:19:10.217630000 
+0100     1.1
+++ linux/arch/xtensa/boot/lib/Attic/zlib.c     1970/01/01 00:00:00+0100
@@ -1,2150 +0,0 @@
-/*
- * BK Id: SCCS/s.zlib.c 1.8 05/18/01 15:17:24 cort
- */
-/*
- * This file is derived from various .h and .c files from the zlib-0.95
- * distribution by Jean-loup Gailly and Mark Adler, with some additions
- * by Paul Mackerras to aid in implementing Deflate compression and
- * decompression for PPP packets.  See zlib.h for conditions of
- * distribution and use.
- *
- * Changes that have been made include:
- * - changed functions not used outside this file to "local"
- * - added minCompression parameter to deflateInit2
- * - added Z_PACKET_FLUSH (see zlib.h for details)
- * - added inflateIncomp
- *
- */
-
-/*+++++*/
-/* zutil.h -- internal interface and configuration of the compression library
- * Copyright (C) 1995 Jean-loup Gailly.
- * For conditions of distribution and use, see copyright notice in zlib.h
- */
-
-/* WARNING: this file should *not* be used by applications. It is
-   part of the implementation of the compression library and is
-   subject to change. Applications should only use zlib.h.
- */
-
-/* From: zutil.h,v 1.9 1995/05/03 17:27:12 jloup Exp */
-
-#define _Z_UTIL_H
-
-#include "zlib.h"
-
-#ifndef local
-#  define local static
-#endif
-/* compile with -Dlocal if your debugger can't find static symbols */
-
-#define FAR
-
-typedef unsigned char  uch;
-typedef uch FAR uchf;
-typedef unsigned short ush;
-typedef ush FAR ushf;
-typedef unsigned long  ulg;
-
-extern char *z_errmsg[]; /* indexed by 1-zlib_error */
-
-#define ERR_RETURN(strm,err) return (strm->msg=z_errmsg[1-err], err)
-/* To be used only when the state is known to be valid */
-
-#ifndef NULL
-#define NULL   ((void *) 0)
-#endif
-
-        /* common constants */
-
-#define DEFLATED   8
-
-#ifndef DEF_WBITS
-#  define DEF_WBITS MAX_WBITS
-#endif
-/* default windowBits for decompression. MAX_WBITS is for compression only */
-
-#if MAX_MEM_LEVEL >= 8
-#  define DEF_MEM_LEVEL 8
-#else
-#  define DEF_MEM_LEVEL  MAX_MEM_LEVEL
-#endif
-/* default memLevel */
-
-#define STORED_BLOCK 0
-#define STATIC_TREES 1
-#define DYN_TREES    2
-/* The three kinds of block type */
-
-#define MIN_MATCH  3
-#define MAX_MATCH  258
-/* The minimum and maximum match lengths */
-
-         /* functions */
-
-#include <linux/string.h>
-#define zmemcpy memcpy
-#define zmemzero(dest, len)    memset(dest, 0, len)
-
-/* Diagnostic functions */
-#ifdef DEBUG_ZLIB
-#  include <stdio.h>
-#  ifndef verbose
-#    define verbose 0
-#  endif
-#  define Assert(cond,msg) {if(!(cond)) z_error(msg);}
-#  define Trace(x) fprintf x
-#  define Tracev(x) {if (verbose) fprintf x ;}
-#  define Tracevv(x) {if (verbose>1) fprintf x ;}
-#  define Tracec(c,x) {if (verbose && (c)) fprintf x ;}
-#  define Tracecv(c,x) {if (verbose>1 && (c)) fprintf x ;}
-#else
-#  define Assert(cond,msg)
-#  define Trace(x)
-#  define Tracev(x)
-#  define Tracevv(x)
-#  define Tracec(c,x)
-#  define Tracecv(c,x)
-#endif
-
-
-typedef uLong (*check_func) OF((uLong check, Bytef *buf, uInt len));
-
-/* voidpf zcalloc OF((voidpf opaque, unsigned items, unsigned size)); */
-/* void   zcfree  OF((voidpf opaque, voidpf ptr)); */
-
-#define ZALLOC(strm, items, size) \
-           (*((strm)->zalloc))((strm)->opaque, (items), (size))
-#define ZFREE(strm, addr, size)        \
-          (*((strm)->zfree))((strm)->opaque, (voidpf)(addr), (size))
-#define TRY_FREE(s, p, n) {if (p) ZFREE(s, p, n);}
-
-/* deflate.h -- internal compression state
- * Copyright (C) 1995 Jean-loup Gailly
- * For conditions of distribution and use, see copyright notice in zlib.h
- */
-
-/* WARNING: this file should *not* be used by applications. It is
-   part of the implementation of the compression library and is
-   subject to change. Applications should only use zlib.h.
- */
-
-/*+++++*/
-/* infblock.h -- header to use infblock.c
- * Copyright (C) 1995 Mark Adler
- * For conditions of distribution and use, see copyright notice in zlib.h
- */
-
-/* WARNING: this file should *not* be used by applications. It is
-   part of the implementation of the compression library and is
-   subject to change. Applications should only use zlib.h.
- */
-
-struct inflate_blocks_state;
-typedef struct inflate_blocks_state FAR inflate_blocks_statef;
-
-local inflate_blocks_statef * inflate_blocks_new OF((
-    z_stream *z,
-    check_func c,               /* check function */
-    uInt w));                   /* window size */
-
-local int inflate_blocks OF((
-    inflate_blocks_statef *,
-    z_stream *,
-    int));                      /* initial return code */
-
-local void inflate_blocks_reset OF((
-    inflate_blocks_statef *,
-    z_stream *,
-    uLongf *));                  /* check value on output */
-
-local int inflate_blocks_free OF((
-    inflate_blocks_statef *,
-    z_stream *,
-    uLongf *));                  /* check value on output */
-
-local int inflate_addhistory OF((
-    inflate_blocks_statef *,
-    z_stream *));
-
-local int inflate_packet_flush OF((
-    inflate_blocks_statef *));
-
-/*+++++*/
-/* inftrees.h -- header to use inftrees.c
- * Copyright (C) 1995 Mark Adler
- * For conditions of distribution and use, see copyright notice in zlib.h
- */
-
-/* WARNING: this file should *not* be used by applications. It is
-   part of the implementation of the compression library and is
-   subject to change. Applications should only use zlib.h.
- */
-
-/* Huffman code lookup table entry--this entry is four bytes for machines
-   that have 16-bit pointers (e.g. PC's in the small or medium model). */
-
-typedef struct inflate_huft_s FAR inflate_huft;
-
-struct inflate_huft_s {
-  union {
-    struct {
-      Byte Exop;        /* number of extra bits or operation */
-      Byte Bits;        /* number of bits in this code or subcode */
-    } what;
-    uInt Nalloc;       /* number of these allocated here */
-    Bytef *pad;         /* pad structure to a power of 2 (4 bytes for */
-  } word;               /*  16-bit, 8 bytes for 32-bit machines) */
-  union {
-    uInt Base;          /* literal, length base, or distance base */
-    inflate_huft *Next; /* pointer to next level of table */
-  } more;
-};
-
-#ifdef DEBUG_ZLIB
-  local uInt inflate_hufts;
-#endif
-
-local int inflate_trees_bits OF((
-    uIntf *,                    /* 19 code lengths */
-    uIntf *,                    /* bits tree desired/actual depth */
-    inflate_huft * FAR *,       /* bits tree result */
-    z_stream *));               /* for zalloc, zfree functions */
-
-local int inflate_trees_dynamic OF((
-    uInt,                       /* number of literal/length codes */
-    uInt,                       /* number of distance codes */
-    uIntf *,                    /* that many (total) code lengths */
-    uIntf *,                    /* literal desired/actual bit depth */
-    uIntf *,                    /* distance desired/actual bit depth */
-    inflate_huft * FAR *,       /* literal/length tree result */
-    inflate_huft * FAR *,       /* distance tree result */
-    z_stream *));               /* for zalloc, zfree functions */
-
-local int inflate_trees_fixed OF((
-    uIntf *,                    /* literal desired/actual bit depth */
-    uIntf *,                    /* distance desired/actual bit depth */
-    inflate_huft * FAR *,       /* literal/length tree result */
-    inflate_huft * FAR *));     /* distance tree result */
-
-local int inflate_trees_free OF((
-    inflate_huft *,             /* tables to free */
-    z_stream *));               /* for zfree function */
-
-
-/*+++++*/
-/* infcodes.h -- header to use infcodes.c
- * Copyright (C) 1995 Mark Adler
- * For conditions of distribution and use, see copyright notice in zlib.h
- */
-
-/* WARNING: this file should *not* be used by applications. It is
-   part of the implementation of the compression library and is
-   subject to change. Applications should only use zlib.h.
- */
-
-struct inflate_codes_state;
-typedef struct inflate_codes_state FAR inflate_codes_statef;
-
-local inflate_codes_statef *inflate_codes_new OF((
-    uInt, uInt,
-    inflate_huft *, inflate_huft *,
-    z_stream *));
-
-local int inflate_codes OF((
-    inflate_blocks_statef *,
-    z_stream *,
-    int));
-
-local void inflate_codes_free OF((
-    inflate_codes_statef *,
-    z_stream *));
-
-
-/*+++++*/
-/* inflate.c -- zlib interface to inflate modules
- * Copyright (C) 1995 Mark Adler
- * For conditions of distribution and use, see copyright notice in zlib.h
- */
-
-/* inflate private state */
-struct internal_state {
-
-  /* mode */
-  enum {
-      METHOD,   /* waiting for method byte */
-      FLAG,     /* waiting for flag byte */
-      BLOCKS,   /* decompressing blocks */
-      CHECK4,   /* four check bytes to go */
-      CHECK3,   /* three check bytes to go */
-      CHECK2,   /* two check bytes to go */
-      CHECK1,   /* one check byte to go */
-      DONE,     /* finished check, done */
-      BAD}      /* got an error--stay here */
-    mode;               /* current inflate mode */
-
-  /* mode dependent information */
-  union {
-    uInt method;        /* if FLAGS, method byte */
-    struct {
-      uLong was;                /* computed check value */
-      uLong need;               /* stream check value */
-    } check;            /* if CHECK, check values to compare */
-    uInt marker;        /* if BAD, inflateSync's marker bytes count */
-  } sub;        /* submode */
-
-  /* mode independent information */
-  int  nowrap;          /* flag for no wrapper */
-  uInt wbits;           /* log2(window size)  (8..15, defaults to 15) */
-  inflate_blocks_statef
-    *blocks;            /* current inflate_blocks state */
-
-};
-
-
-int inflateReset(z)
-z_stream *z;
-{
-  uLong c;
-
-  if (z == Z_NULL || z->state == Z_NULL)
-    return Z_STREAM_ERROR;
-  z->total_in = z->total_out = 0;
-  z->msg = Z_NULL;
-  z->state->mode = z->state->nowrap ? BLOCKS : METHOD;
-  inflate_blocks_reset(z->state->blocks, z, &c);
-  Trace((stderr, "inflate: reset\n"));
-  return Z_OK;
-}
-
-
-int inflateEnd(z)
-z_stream *z;
-{
-  uLong c;
-
-  if (z == Z_NULL || z->state == Z_NULL || z->zfree == Z_NULL)
-    return Z_STREAM_ERROR;
-  if (z->state->blocks != Z_NULL)
-    inflate_blocks_free(z->state->blocks, z, &c);
-  ZFREE(z, z->state, sizeof(struct internal_state));
-  z->state = Z_NULL;
-  Trace((stderr, "inflate: end\n"));
-  return Z_OK;
-}
-
-
-int inflateInit2(z, w)
-z_stream *z;
-int w;
-{
-  /* initialize state */
-  if (z == Z_NULL)
-    return Z_STREAM_ERROR;
-/*  if (z->zalloc == Z_NULL) z->zalloc = zcalloc; */
-/*  if (z->zfree == Z_NULL) z->zfree = zcfree; */
-  if ((z->state = (struct internal_state FAR *)
-       ZALLOC(z,1,sizeof(struct internal_state))) == Z_NULL)
-    return Z_MEM_ERROR;
-  z->state->blocks = Z_NULL;
-
-  /* handle undocumented nowrap option (no zlib header or check) */
-  z->state->nowrap = 0;
-  if (w < 0)
-  {
-    w = - w;
-    z->state->nowrap = 1;
-  }
-
-  /* set window size */
-  if (w < 8 || w > 15)
-  {
-    inflateEnd(z);
-    return Z_STREAM_ERROR;
-  }
-  z->state->wbits = (uInt)w;
-
-  /* create inflate_blocks state */
-  if ((z->state->blocks =
-       inflate_blocks_new(z, z->state->nowrap ? Z_NULL : adler32, 1 << w))
-      == Z_NULL)
-  {
-    inflateEnd(z);
-    return Z_MEM_ERROR;
-  }
-  Trace((stderr, "inflate: allocated\n"));
-
-  /* reset state */
-  inflateReset(z);
-  return Z_OK;
-}
-
-
-int inflateInit(z)
-z_stream *z;
-{
-  return inflateInit2(z, DEF_WBITS);
-}
-
-
-#define NEEDBYTE {if(z->avail_in==0)goto empty;r=Z_OK;}
-#define NEXTBYTE (z->avail_in--,z->total_in++,*z->next_in++)
-
-int inflate(z, f)
-z_stream *z;
-int f;
-{
-  int r;
-  uInt b;
-
-  if (z == Z_NULL || z->next_in == Z_NULL)
-    return Z_STREAM_ERROR;
-  r = Z_BUF_ERROR;
-  while (1) switch (z->state->mode)
-  {
-    case METHOD:
-      NEEDBYTE
-      if (((z->state->sub.method = NEXTBYTE) & 0xf) != DEFLATED)
-      {
-        z->state->mode = BAD;
-        z->msg = "unknown compression method";
-        z->state->sub.marker = 5;       /* can't try inflateSync */
-        break;
-      }
-      if ((z->state->sub.method >> 4) + 8 > z->state->wbits)
-      {
-        z->state->mode = BAD;
-        z->msg = "invalid window size";
-        z->state->sub.marker = 5;       /* can't try inflateSync */
-        break;
-      }
-      z->state->mode = FLAG;
-    case FLAG:
-      NEEDBYTE
-      if ((b = NEXTBYTE) & 0x20)
-      {
-        z->state->mode = BAD;
-        z->msg = "invalid reserved bit";
-        z->state->sub.marker = 5;       /* can't try inflateSync */
-        break;
-      }
-      if (((z->state->sub.method << 8) + b) % 31)
-      {
-        z->state->mode = BAD;
-        z->msg = "incorrect header check";
-        z->state->sub.marker = 5;       /* can't try inflateSync */
-        break;
-      }
-      Trace((stderr, "inflate: zlib header ok\n"));
-      z->state->mode = BLOCKS;
-    case BLOCKS:
-      r = inflate_blocks(z->state->blocks, z, r);
-      if (f == Z_PACKET_FLUSH && z->avail_in == 0 && z->avail_out != 0)
-         r = inflate_packet_flush(z->state->blocks);
-      if (r == Z_DATA_ERROR)
-      {
-        z->state->mode = BAD;
-        z->state->sub.marker = 0;       /* can try inflateSync */
-        break;
-      }
-      if (r != Z_STREAM_END)
-        return r;
-      r = Z_OK;
-      inflate_blocks_reset(z->state->blocks, z, &z->state->sub.check.was);
-      if (z->state->nowrap)
-      {
-        z->state->mode = DONE;
-        break;
-      }
-      z->state->mode = CHECK4;
-    case CHECK4:
-      NEEDBYTE
-      z->state->sub.check.need = (uLong)NEXTBYTE << 24;
-      z->state->mode = CHECK3;
-    case CHECK3:
-      NEEDBYTE
-      z->state->sub.check.need += (uLong)NEXTBYTE << 16;
-      z->state->mode = CHECK2;
-    case CHECK2:
-      NEEDBYTE
-      z->state->sub.check.need += (uLong)NEXTBYTE << 8;
-      z->state->mode = CHECK1;
-    case CHECK1:
-      NEEDBYTE
-      z->state->sub.check.need += (uLong)NEXTBYTE;
-
-      if (z->state->sub.check.was != z->state->sub.check.need)
-      {
-        z->state->mode = BAD;
-        z->msg = "incorrect data check";
-        z->state->sub.marker = 5;       /* can't try inflateSync */
-        break;
-      }
-      Trace((stderr, "inflate: zlib check ok\n"));
-      z->state->mode = DONE;
-    case DONE:
-      return Z_STREAM_END;
-    case BAD:
-      return Z_DATA_ERROR;
-    default:
-      return Z_STREAM_ERROR;
-  }
-
- empty:
-  if (f != Z_PACKET_FLUSH)
-    return r;
-  z->state->mode = BAD;
-  z->state->sub.marker = 0;       /* can try inflateSync */
-  return Z_DATA_ERROR;
-}
-
-/*
- * This subroutine adds the data at next_in/avail_in to the output history
- * without performing any output.  The output buffer must be "caught up";
- * i.e. no pending output (hence s->read equals s->write), and the state must
- * be BLOCKS (i.e. we should be willing to see the start of a series of
- * BLOCKS).  On exit, the output will also be caught up, and the checksum
- * will have been updated if need be.
- */
-
-int inflateIncomp(z)
-z_stream *z;
-{
-    if (z->state->mode != BLOCKS)
-       return Z_DATA_ERROR;
-    return inflate_addhistory(z->state->blocks, z);
-}
-
-
-int inflateSync(z)
-z_stream *z;
-{
-  uInt n;       /* number of bytes to look at */
-  Bytef *p;     /* pointer to bytes */
-  uInt m;       /* number of marker bytes found in a row */
-  uLong r, w;   /* temporaries to save total_in and total_out */
-
-  /* set up */
-  if (z == Z_NULL || z->state == Z_NULL)
-    return Z_STREAM_ERROR;
-  if (z->state->mode != BAD)
-  {
-    z->state->mode = BAD;
-    z->state->sub.marker = 0;
-  }
-  if ((n = z->avail_in) == 0)
-    return Z_BUF_ERROR;
-  p = z->next_in;
-  m = z->state->sub.marker;
-
-  /* search */
-  while (n && m < 4)
-  {
-    if (*p == (Byte)(m < 2 ? 0 : 0xff))
-      m++;
-    else if (*p)
-      m = 0;
-    else
-      m = 4 - m;
-    p++, n--;
-  }
-
-  /* restore */
-  z->total_in += p - z->next_in;
-  z->next_in = p;
-  z->avail_in = n;
-  z->state->sub.marker = m;
-
-  /* return no joy or set up to restart on a new block */
-  if (m != 4)
-    return Z_DATA_ERROR;
-  r = z->total_in;  w = z->total_out;
-  inflateReset(z);
-  z->total_in = r;  z->total_out = w;
-  z->state->mode = BLOCKS;
-  return Z_OK;
-}
-
-#undef NEEDBYTE
-#undef NEXTBYTE
-
-/*+++++*/
-/* infutil.h -- types and macros common to blocks and codes
- * Copyright (C) 1995 Mark Adler
- * For conditions of distribution and use, see copyright notice in zlib.h
- */
-
-/* WARNING: this file should *not* be used by applications. It is
-   part of the implementation of the compression library and is
-   subject to change. Applications should only use zlib.h.
- */
-
-/* inflate blocks semi-private state */
-struct inflate_blocks_state {
-
-  /* mode */
-  enum {
-      TYPE,     /* get type bits (3, including end bit) */
-      LENS,     /* get lengths for stored */
-      STORED,   /* processing stored block */
-      TABLE,    /* get table lengths */
-      BTREE,    /* get bit lengths tree for a dynamic block */
-      DTREE,    /* get length, distance trees for a dynamic block */
-      CODES,    /* processing fixed or dynamic block */
-      DRY,      /* output remaining window bytes */
-      DONEB,     /* finished last block, done */
-      BADB}      /* got a data error--stuck here */
-    mode;               /* current inflate_block mode */
-
-  /* mode dependent information */
-  union {
-    uInt left;          /* if STORED, bytes left to copy */
-    struct {
-      uInt table;               /* table lengths (14 bits) */
-      uInt index;               /* index into blens (or border) */
-      uIntf *blens;             /* bit lengths of codes */
-      uInt bb;                  /* bit length tree depth */
-      inflate_huft *tb;         /* bit length decoding tree */
-      int nblens;              /* # elements allocated at blens */
-    } trees;            /* if DTREE, decoding info for trees */
-    struct {
-      inflate_huft *tl, *td;    /* trees to free */
-      inflate_codes_statef
-         *codes;
-    } decode;           /* if CODES, current state */
-  } sub;                /* submode */
-  uInt last;            /* true if this block is the last block */
-
-  /* mode independent information */
-  uInt bitk;            /* bits in bit buffer */
-  uLong bitb;           /* bit buffer */
-  Bytef *window;        /* sliding window */
-  Bytef *end;           /* one byte after sliding window */
-  Bytef *read;          /* window read pointer */
-  Bytef *write;         /* window write pointer */
-  check_func checkfn;   /* check function */
-  uLong check;          /* check on output */
-
-};
-
-
-/* defines for inflate input/output */
-/*   update pointers and return */
-#define UPDBITS {s->bitb=b;s->bitk=k;}
-#define UPDIN {z->avail_in=n;z->total_in+=p-z->next_in;z->next_in=p;}
-#define UPDOUT {s->write=q;}
-#define UPDATE {UPDBITS UPDIN UPDOUT}
-#define LEAVE {UPDATE return inflate_flush(s,z,r);}
-/*   get bytes and bits */
-#define LOADIN {p=z->next_in;n=z->avail_in;b=s->bitb;k=s->bitk;}
-#define NEEDBYTE {if(n)r=Z_OK;else LEAVE}
-#define NEXTBYTE (n--,*p++)
-#define NEEDBITS(j) {while(k<(j)){NEEDBYTE;b|=((uLong)NEXTBYTE)<<k;k+=8;}}
-#define DUMPBITS(j) {b>>=(j);k-=(j);}
-/*   output bytes */
-#define WAVAIL (q<s->read?s->read-q-1:s->end-q)
-#define LOADOUT {q=s->write;m=WAVAIL;}
-#define WRAP {if(q==s->end&&s->read!=s->window){q=s->window;m=WAVAIL;}}
-#define FLUSH {UPDOUT r=inflate_flush(s,z,r); LOADOUT}
-#define NEEDOUT {if(m==0){WRAP if(m==0){FLUSH WRAP if(m==0) LEAVE}}r=Z_OK;}
-#define OUTBYTE(a) {*q++=(Byte)(a);m--;}
-/*   load local pointers */
-#define LOAD {LOADIN LOADOUT}
-
-/*
- * The IBM 150 firmware munges the data right after _etext[].  This
- * protects it. -- Cort
- */
-local uInt protect_mask[] = {0, 0, 0, 0, 0, 0, 0, 0, 0 ,0 ,0 ,0};
-/* And'ing with mask[n] masks the lower n bits */
-local uInt inflate_mask[] = {
-    0x0000,
-    0x0001, 0x0003, 0x0007, 0x000f, 0x001f, 0x003f, 0x007f, 0x00ff,
-    0x01ff, 0x03ff, 0x07ff, 0x0fff, 0x1fff, 0x3fff, 0x7fff, 0xffff
-};
-
-/* copy as much as possible from the sliding window to the output area */
-local int inflate_flush OF((
-    inflate_blocks_statef *,
-    z_stream *,
-    int));
-
-/*+++++*/
-/* inffast.h -- header to use inffast.c
- * Copyright (C) 1995 Mark Adler
- * For conditions of distribution and use, see copyright notice in zlib.h
- */
-
-/* WARNING: this file should *not* be used by applications. It is
-   part of the implementation of the compression library and is
-   subject to change. Applications should only use zlib.h.
- */
-
-local int inflate_fast OF((
-    uInt,
-    uInt,
-    inflate_huft *,
-    inflate_huft *,
-    inflate_blocks_statef *,
-    z_stream *));
-
-
-/*+++++*/
-/* infblock.c -- interpret and process block types to last block
- * Copyright (C) 1995 Mark Adler
- * For conditions of distribution and use, see copyright notice in zlib.h
- */
-
-/* Table for deflate from PKZIP's appnote.txt. */
-local uInt border[] = { /* Order of the bit length code lengths */
-        16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};
-
-/*
-   Notes beyond the 1.93a appnote.txt:
-
-   1. Distance pointers never point before the beginning of the output
-      stream.
-   2. Distance pointers can point back across blocks, up to 32k away.
-   3. There is an implied maximum of 7 bits for the bit length table and
-      15 bits for the actual data.
-   4. If only one code exists, then it is encoded using one bit.  (Zero
-      would be more efficient, but perhaps a little confusing.)  If two
-      codes exist, they are coded using one bit each (0 and 1).
-   5. There is no way of sending zero distance codes--a dummy must be
-      sent if there are none.  (History: a pre 2.0 version of PKZIP would
-      store blocks with no distance codes, but this was discovered to be
-      too harsh a criterion.)  Valid only for 1.93a.  2.04c does allow
-      zero distance codes, which is sent as one code of zero bits in
-      length.
-   6. There are up to 286 literal/length codes.  Code 256 represents the
-      end-of-block.  Note however that the static length tree defines
-      288 codes just to fill out the Huffman codes.  Codes 286 and 287
-      cannot be used though, since there is no length base or extra bits
-      defined for them.  Similarily, there are up to 30 distance codes.
-      However, static trees define 32 codes (all 5 bits) to fill out the
-      Huffman codes, but the last two had better not show up in the data.
-   7. Unzip can check dynamic Huffman blocks for complete code sets.
-      The exception is that a single code would not be complete (see #4).
-   8. The five bits following the block type is really the number of
-      literal codes sent minus 257.
-   9. Length codes 8,16,16 are interpreted as 13 length codes of 8 bits
-      (1+6+6).  Therefore, to output three times the length, you output
-      three codes (1+1+1), whereas to output four times the same length,
-      you only need two codes (1+3).  Hmm.
-  10. In the tree reconstruction algorithm, Code = Code + Increment
-      only if BitLength(i) is not zero.  (Pretty obvious.)
-  11. Correction: 4 Bits: # of Bit Length codes - 4     (4 - 19)
-  12. Note: length code 284 can represent 227-258, but length code 285
-      really is 258.  The last length deserves its own, short code
-      since it gets used a lot in very redundant files.  The length
-      258 is special since 258 - 3 (the min match length) is 255.
-  13. The literal/length and distance code bit lengths are read as a
-      single stream of lengths.  It is possible (and advantageous) for
-      a repeat code (16, 17, or 18) to go across the boundary between
-      the two sets of lengths.
- */
-
-
-local void inflate_blocks_reset(s, z, c)
-inflate_blocks_statef *s;
-z_stream *z;
-uLongf *c;
-{
-  if (s->checkfn != Z_NULL)
-    *c = s->check;
-  if (s->mode == BTREE || s->mode == DTREE)
-    ZFREE(z, s->sub.trees.blens, s->sub.trees.nblens * sizeof(uInt));
-  if (s->mode == CODES)
-  {
-    inflate_codes_free(s->sub.decode.codes, z);
-    inflate_trees_free(s->sub.decode.td, z);
-    inflate_trees_free(s->sub.decode.tl, z);
-  }
-  s->mode = TYPE;
-  s->bitk = 0;
-  s->bitb = 0;
-  s->read = s->write = s->window;
-  if (s->checkfn != Z_NULL)
-    s->check = (*s->checkfn)(0L, Z_NULL, 0);
-  Trace((stderr, "inflate:   blocks reset\n"));
-}
-
-
-local inflate_blocks_statef *inflate_blocks_new(z, c, w)
-z_stream *z;
-check_func c;
-uInt w;
-{
-  inflate_blocks_statef *s;
-
-  if ((s = (inflate_blocks_statef *)ZALLOC
-       (z,1,sizeof(struct inflate_blocks_state))) == Z_NULL)
-    return s;
-  if ((s->window = (Bytef *)ZALLOC(z, 1, w)) == Z_NULL)
-  {
-    ZFREE(z, s, sizeof(struct inflate_blocks_state));
-    return Z_NULL;
-  }
-  s->end = s->window + w;
-  s->checkfn = c;
-  s->mode = TYPE;
-  Trace((stderr, "inflate:   blocks allocated\n"));
-  inflate_blocks_reset(s, z, &s->check);
-  return s;
-}
-
-
-local int inflate_blocks(s, z, r)
-inflate_blocks_statef *s;
-z_stream *z;
-int r;
-{
-  uInt t;               /* temporary storage */
-  uLong b;              /* bit buffer */
-  uInt k;               /* bits in bit buffer */
-  Bytef *p;             /* input data pointer */
-  uInt n;               /* bytes available there */
-  Bytef *q;             /* output window write pointer */
-  uInt m;               /* bytes to end of window or read pointer */
-
-  /* copy input/output information to locals (UPDATE macro restores) */
-  LOAD
-
-  /* process input based on current state */
-  while (1) switch (s->mode)
-  {
-    case TYPE:
-      NEEDBITS(3)
-      t = (uInt)b & 7;
-      s->last = t & 1;
-      switch (t >> 1)
-      {
-        case 0:                         /* stored */
-          Trace((stderr, "inflate:     stored block%s\n",
-                 s->last ? " (last)" : ""));
-          DUMPBITS(3)
-          t = k & 7;                    /* go to byte boundary */
-          DUMPBITS(t)
-          s->mode = LENS;               /* get length of stored block */
-          break;
-        case 1:                         /* fixed */
-          Trace((stderr, "inflate:     fixed codes block%s\n",
-                 s->last ? " (last)" : ""));
-          {
-            uInt bl, bd;
-            inflate_huft *tl, *td;
-
-            inflate_trees_fixed(&bl, &bd, &tl, &td);
-            s->sub.decode.codes = inflate_codes_new(bl, bd, tl, td, z);
-            if (s->sub.decode.codes == Z_NULL)
-            {
-              r = Z_MEM_ERROR;
-              LEAVE
-            }
-            s->sub.decode.tl = Z_NULL;  /* don't try to free these */
-            s->sub.decode.td = Z_NULL;
-          }
-          DUMPBITS(3)
-          s->mode = CODES;
-          break;
-        case 2:                         /* dynamic */
-          Trace((stderr, "inflate:     dynamic codes block%s\n",
-                 s->last ? " (last)" : ""));
-          DUMPBITS(3)
-          s->mode = TABLE;
-          break;
-        case 3:                         /* illegal */
-          DUMPBITS(3)
-          s->mode = BADB;
-          z->msg = "invalid block type";
-          r = Z_DATA_ERROR;
-          LEAVE
-      }
-      break;
-    case LENS:
-      NEEDBITS(32)
-      if (((~b) >> 16) != (b & 0xffff))
-      {
-        s->mode = BADB;
-        z->msg = "invalid stored block lengths";
-        r = Z_DATA_ERROR;
-        LEAVE
-      }
-      s->sub.left = (uInt)b & 0xffff;
-      b = k = 0;                      /* dump bits */
-      Tracev((stderr, "inflate:       stored length %u\n", s->sub.left));
-      s->mode = s->sub.left ? STORED : TYPE;
-      break;
-    case STORED:
-      if (n == 0)
-        LEAVE
-      NEEDOUT
-      t = s->sub.left;
-      if (t > n) t = n;
-      if (t > m) t = m;
-      zmemcpy(q, p, t);
-      p += t;  n -= t;
-      q += t;  m -= t;
-      if ((s->sub.left -= t) != 0)
-        break;
-      Tracev((stderr, "inflate:       stored end, %lu total out\n",
-              z->total_out + (q >= s->read ? q - s->read :
-              (s->end - s->read) + (q - s->window))));
-      s->mode = s->last ? DRY : TYPE;
-      break;
-    case TABLE:
-      NEEDBITS(14)
-      s->sub.trees.table = t = (uInt)b & 0x3fff;
-#ifndef PKZIP_BUG_WORKAROUND
-      if ((t & 0x1f) > 29 || ((t >> 5) & 0x1f) > 29)
-      {
-        s->mode = BADB;
-        z->msg = "too many length or distance symbols";
-        r = Z_DATA_ERROR;
-        LEAVE
-      }
-#endif
-      t = 258 + (t & 0x1f) + ((t >> 5) & 0x1f);
-      if (t < 19)
-        t = 19;
-      if ((s->sub.trees.blens = (uIntf*)ZALLOC(z, t, sizeof(uInt))) == Z_NULL)
-      {
-        r = Z_MEM_ERROR;
-        LEAVE
-      }
-      s->sub.trees.nblens = t;
-      DUMPBITS(14)
-      s->sub.trees.index = 0;
-      Tracev((stderr, "inflate:       table sizes ok\n"));
-      s->mode = BTREE;
-    case BTREE:
-      while (s->sub.trees.index < 4 + (s->sub.trees.table >> 10))
-      {
-        NEEDBITS(3)
-        s->sub.trees.blens[border[s->sub.trees.index++]] = (uInt)b & 7;
-        DUMPBITS(3)
-      }
-      while (s->sub.trees.index < 19)
-        s->sub.trees.blens[border[s->sub.trees.index++]] = 0;
-      s->sub.trees.bb = 7;
-      t = inflate_trees_bits(s->sub.trees.blens, &s->sub.trees.bb,
-                             &s->sub.trees.tb, z);
-      if (t != Z_OK)
-      {
-        r = t;
-        if (r == Z_DATA_ERROR)
-          s->mode = BADB;
-        LEAVE
-      }
-      s->sub.trees.index = 0;
-      Tracev((stderr, "inflate:       bits tree ok\n"));
-      s->mode = DTREE;
-    case DTREE:
-      while (t = s->sub.trees.table,
-             s->sub.trees.index < 258 + (t & 0x1f) + ((t >> 5) & 0x1f))
-      {
-        inflate_huft *h;
-        uInt i, j, c;
-
-        t = s->sub.trees.bb;
-        NEEDBITS(t)
-        h = s->sub.trees.tb + ((uInt)b & inflate_mask[t]);
-        t = h->word.what.Bits;
-        c = h->more.Base;
-        if (c < 16)
-        {
-          DUMPBITS(t)
-          s->sub.trees.blens[s->sub.trees.index++] = c;
-        }
-        else /* c == 16..18 */
-        {
-          i = c == 18 ? 7 : c - 14;
-          j = c == 18 ? 11 : 3;
-          NEEDBITS(t + i)
-          DUMPBITS(t)
-          j += (uInt)b & inflate_mask[i];
-          DUMPBITS(i)
-          i = s->sub.trees.index;
-          t = s->sub.trees.table;
-          if (i + j > 258 + (t & 0x1f) + ((t >> 5) & 0x1f) ||
-              (c == 16 && i < 1))
-          {
-            s->mode = BADB;
-            z->msg = "invalid bit length repeat";
-            r = Z_DATA_ERROR;
-            LEAVE
-          }
-          c = c == 16 ? s->sub.trees.blens[i - 1] : 0;
-          do {
-            s->sub.trees.blens[i++] = c;
-          } while (--j);
-          s->sub.trees.index = i;
-        }
-      }
-      inflate_trees_free(s->sub.trees.tb, z);
-      s->sub.trees.tb = Z_NULL;
-      {
-        uInt bl, bd;
-        inflate_huft *tl, *td;
-        inflate_codes_statef *c;
-
-        bl = 9;         /* must be <= 9 for lookahead assumptions */
-        bd = 6;         /* must be <= 9 for lookahead assumptions */
-        t = s->sub.trees.table;
-        t = inflate_trees_dynamic(257 + (t & 0x1f), 1 + ((t >> 5) & 0x1f),
-                                  s->sub.trees.blens, &bl, &bd, &tl, &td, z);
-        if (t != Z_OK)
-        {
-          if (t == (uInt)Z_DATA_ERROR)
-            s->mode = BADB;
-          r = t;
-          LEAVE
-        }
-        Tracev((stderr, "inflate:       trees ok\n"));
-        if ((c = inflate_codes_new(bl, bd, tl, td, z)) == Z_NULL)
-        {
-          inflate_trees_free(td, z);
-          inflate_trees_free(tl, z);
-          r = Z_MEM_ERROR;
-          LEAVE
-        }
-        ZFREE(z, s->sub.trees.blens, s->sub.trees.nblens * sizeof(uInt));
-        s->sub.decode.codes = c;
-        s->sub.decode.tl = tl;
-        s->sub.decode.td = td;
-      }
-      s->mode = CODES;
-    case CODES:
-      UPDATE
-      if ((r = inflate_codes(s, z, r)) != Z_STREAM_END)
-        return inflate_flush(s, z, r);
-      r = Z_OK;
-      inflate_codes_free(s->sub.decode.codes, z);
-      inflate_trees_free(s->sub.decode.td, z);
-      inflate_trees_free(s->sub.decode.tl, z);
-      LOAD
-      Tracev((stderr, "inflate:       codes end, %lu total out\n",
-              z->total_out + (q >= s->read ? q - s->read :
-              (s->end - s->read) + (q - s->window))));
-      if (!s->last)
-      {
-        s->mode = TYPE;
-        break;
-      }
-      if (k > 7)              /* return unused byte, if any */
-      {
-        Assert(k < 16, "inflate_codes grabbed too many bytes")
-        k -= 8;
-        n++;
-        p--;                    /* can always return one */
-      }
-      s->mode = DRY;
-    case DRY:
-      FLUSH
-      if (s->read != s->write)
-        LEAVE
-      s->mode = DONEB;
-    case DONEB:
-      r = Z_STREAM_END;
-      LEAVE
-    case BADB:
-      r = Z_DATA_ERROR;
-      LEAVE
-    default:
-      r = Z_STREAM_ERROR;
-      LEAVE
-  }
-}
-
-
-local int inflate_blocks_free(s, z, c)
-inflate_blocks_statef *s;
-z_stream *z;
-uLongf *c;
-{
-  inflate_blocks_reset(s, z, c);
-  ZFREE(z, s->window, s->end - s->window);
-  ZFREE(z, s, sizeof(struct inflate_blocks_state));
-  Trace((stderr, "inflate:   blocks freed\n"));
-  return Z_OK;
-}
-
-/*
- * This subroutine adds the data at next_in/avail_in to the output history
- * without performing any output.  The output buffer must be "caught up";
- * i.e. no pending output (hence s->read equals s->write), and the state must
- * be BLOCKS (i.e. we should be willing to see the start of a series of
- * BLOCKS).  On exit, the output will also be caught up, and the checksum
- * will have been updated if need be.
- */
-local int inflate_addhistory(s, z)
-inflate_blocks_statef *s;
-z_stream *z;
-{
-    uLong b;              /* bit buffer */  /* NOT USED HERE */
-    uInt k;               /* bits in bit buffer */ /* NOT USED HERE */
-    uInt t;               /* temporary storage */
-    Bytef *p;             /* input data pointer */
-    uInt n;               /* bytes available there */
-    Bytef *q;             /* output window write pointer */
-    uInt m;               /* bytes to end of window or read pointer */
-
-    if (s->read != s->write)
-       return Z_STREAM_ERROR;
-    if (s->mode != TYPE)
-       return Z_DATA_ERROR;
-
-    /* we're ready to rock */
-    LOAD
-    /* while there is input ready, copy to output buffer, moving
-     * pointers as needed.
-     */
-    while (n) {
-       t = n;  /* how many to do */
-       /* is there room until end of buffer? */
-       if (t > m) t = m;
-       /* update check information */
-       if (s->checkfn != Z_NULL)
-           s->check = (*s->checkfn)(s->check, q, t);
-       zmemcpy(q, p, t);
-       q += t;
-       p += t;
-       n -= t;
-       z->total_out += t;
-       s->read = q;    /* drag read pointer forward */
-/*      WRAP  */       /* expand WRAP macro by hand to handle s->read */
-       if (q == s->end) {
-           s->read = q = s->window;
-           m = WAVAIL;
-       }
-    }
-    UPDATE
-    return Z_OK;
-}
-
-
-/*
- * At the end of a Deflate-compressed PPP packet, we expect to have seen
- * a `stored' block type value but not the (zero) length bytes.
- */
-local int inflate_packet_flush(s)
-    inflate_blocks_statef *s;
-{
-    if (s->mode != LENS)
-       return Z_DATA_ERROR;
-    s->mode = TYPE;
-    return Z_OK;
-}
-
-
-/*+++++*/
-/* inftrees.c -- generate Huffman trees for efficient decoding
- * Copyright (C) 1995 Mark Adler
- * For conditions of distribution and use, see copyright notice in zlib.h
- */
-
-/* simplify the use of the inflate_huft type with some defines */
-#define base more.Base
-#define next more.Next
-#define exop word.what.Exop
-#define bits word.what.Bits
-
-
-local int huft_build OF((
-    uIntf *,            /* code lengths in bits */
-    uInt,               /* number of codes */
-    uInt,               /* number of "simple" codes */
-    uIntf *,            /* list of base values for non-simple codes */
-    uIntf *,            /* list of extra bits for non-simple codes */
-    inflate_huft * FAR*,/* result: starting table */
-    uIntf *,            /* maximum lookup bits (returns actual) */
-    z_stream *));       /* for zalloc function */
-
-local voidpf falloc OF((
-    voidpf,             /* opaque pointer (not used) */
-    uInt,               /* number of items */
-    uInt));             /* size of item */
-
-local void ffree OF((
-    voidpf q,           /* opaque pointer (not used) */
-    voidpf p,           /* what to free (not used) */
-    uInt n));          /* number of bytes (not used) */
-
-/* Tables for deflate from PKZIP's appnote.txt. */
-local uInt cplens[] = { /* Copy lengths for literal codes 257..285 */
-        3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,
-        35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0};
-        /* actually lengths - 2; also see note #13 above about 258 */
-local uInt cplext[] = { /* Extra bits for literal codes 257..285 */
-        0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2,
-        3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 192, 192}; /* 192==invalid */
-local uInt cpdist[] = { /* Copy offsets for distance codes 0..29 */
-        1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,
-        257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,
-        8193, 12289, 16385, 24577};
-local uInt cpdext[] = { /* Extra bits for distance codes */
-        0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6,
-        7, 7, 8, 8, 9, 9, 10, 10, 11, 11,
-        12, 12, 13, 13};
-
-/*
-   Huffman code decoding is performed using a multi-level table lookup.
-   The fastest way to decode is to simply build a lookup table whose
-   size is determined by the longest code.  However, the time it takes
-   to build this table can also be a factor if the data being decoded
-   is not very long.  The most common codes are necessarily the
-   shortest codes, so those codes dominate the decoding time, and hence
-   the speed.  The idea is you can have a shorter table that decodes the
-   shorter, more probable codes, and then point to subsidiary tables for
-   the longer codes.  The time it costs to decode the longer codes is
-   then traded against the time it takes to make longer tables.
-
-   This results of this trade are in the variables lbits and dbits
-   below.  lbits is the number of bits the first level table for literal/
-   length codes can decode in one step, and dbits is the same thing for
-   the distance codes.  Subsequent tables are also less than or equal to
-   those sizes.  These values may be adjusted either when all of the
-   codes are shorter than that, in which case the longest code length in
-   bits is used, or when the shortest code is *longer* than the requested
-   table size, in which case the length of the shortest code in bits is
-   used.
-
-   There are two different values for the two tables, since they code a
-   different number of possibilities each.  The literal/length table
-   codes 286 possible values, or in a flat code, a little over eight
-   bits.  The distance table codes 30 possible values, or a little less
-   than five bits, flat.  The optimum values for speed end up being
-   about one bit more than those, so lbits is 8+1 and dbits is 5+1.
-   The optimum values may differ though from machine to machine, and
-   possibly even between compilers.  Your mileage may vary.
- */
-
-
-/* If BMAX needs to be larger than 16, then h and x[] should be uLong. */
-#define BMAX 15         /* maximum bit length of any code */
-#define N_MAX 288       /* maximum number of codes in any set */
-
-#ifdef DEBUG_ZLIB
-  uInt inflate_hufts;
-#endif
-
-local int huft_build(b, n, s, d, e, t, m, zs)
-uIntf *b;               /* code lengths in bits (all assumed <= BMAX) */
-uInt n;                 /* number of codes (assumed <= N_MAX) */
-uInt s;                 /* number of simple-valued codes (0..s-1) */
-uIntf *d;               /* list of base values for non-simple codes */
-uIntf *e;               /* list of extra bits for non-simple codes */
-inflate_huft * FAR *t;  /* result: starting table */
-uIntf *m;               /* maximum lookup bits, returns actual */
-z_stream *zs;           /* for zalloc function */
-/* Given a list of code lengths and a maximum table size, make a set of
-   tables to decode that set of codes.  Return Z_OK on success, Z_BUF_ERROR
-   if the given code set is incomplete (the tables are still built in this
-   case), Z_DATA_ERROR if the input is invalid (all zero length codes or an
-   over-subscribed set of lengths), or Z_MEM_ERROR if not enough memory. */
-{
-
-  uInt a;                       /* counter for codes of length k */
-  uInt c[BMAX+1];               /* bit length count table */
-  uInt f;                       /* i repeats in table every f entries */
-  int g;                        /* maximum code length */
-  int h;                        /* table level */
-  register uInt i;              /* counter, current code */
-  register uInt j;              /* counter */
-  register int k;               /* number of bits in current code */
-  int l;                        /* bits per table (returned in m) */
-  register uIntf *p;            /* pointer into c[], b[], or v[] */
-  inflate_huft *q;              /* points to current table */
-  struct inflate_huft_s r;      /* table entry for structure assignment */
-  inflate_huft *u[BMAX];        /* table stack */
-  uInt v[N_MAX];                /* values in order of bit length */
-  register int w;               /* bits before this table == (l * h) */
-  uInt x[BMAX+1];               /* bit offsets, then code stack */
-  uIntf *xp;                    /* pointer into x */
-  int y;                        /* number of dummy codes added */
-  uInt z;                       /* number of entries in current table */
-
-
-  /* Generate counts for each bit length */
-  p = c;
-#define C0 *p++ = 0;
-#define C2 C0 C0 C0 C0
-#define C4 C2 C2 C2 C2
-  C4                            /* clear c[]--assume BMAX+1 is 16 */
-  p = b;  i = n;
-  do {
-    c[*p++]++;                  /* assume all entries <= BMAX */
-  } while (--i);
-  if (c[0] == n)                /* null input--all zero length codes */
-  {
-    *t = (inflate_huft *)Z_NULL;
-    *m = 0;
-    return Z_OK;
-  }
-
-
-  /* Find minimum and maximum length, bound *m by those */
-  l = *m;
-  for (j = 1; j <= BMAX; j++)
-    if (c[j])
-      break;
-  k = j;                        /* minimum code length */
-  if ((uInt)l < j)
-    l = j;
-  for (i = BMAX; i; i--)
-    if (c[i])
-      break;
-  g = i;                        /* maximum code length */
-  if ((uInt)l > i)
-    l = i;
-  *m = l;
-
-
-  /* Adjust last length count to fill out codes, if needed */
-  for (y = 1 << j; j < i; j++, y <<= 1)
-    if ((y -= c[j]) < 0)
-      return Z_DATA_ERROR;
-  if ((y -= c[i]) < 0)
-    return Z_DATA_ERROR;
-  c[i] += y;
-
-
-  /* Generate starting offsets into the value table for each length */
-  x[1] = j = 0;
-  p = c + 1;  xp = x + 2;
-  while (--i) {                 /* note that i == g from above */
-    *xp++ = (j += *p++);
-  }
-
-
-  /* Make a table of values in order of bit lengths */
-  p = b;  i = 0;
-  do {
-    if ((j = *p++) != 0)
-      v[x[j]++] = i;
-  } while (++i < n);
-
-
-  /* Generate the Huffman codes and for each, make the table entries */
-  x[0] = i = 0;                 /* first Huffman code is zero */
-  p = v;                        /* grab values in bit order */
-  h = -1;                       /* no tables yet--level -1 */
-  w = -l;                       /* bits decoded == (l * h) */
-  u[0] = (inflate_huft *)Z_NULL;        /* just to keep compilers happy */
-  q = (inflate_huft *)Z_NULL;   /* ditto */
-  z = 0;                        /* ditto */
-
-  /* go through the bit lengths (k already is bits in shortest code) */
-  for (; k <= g; k++)
-  {
-    a = c[k];
-    while (a--)
-    {
-      /* here i is the Huffman code of length k bits for value *p */
-      /* make tables up to required level */
-      while (k > w + l)
-      {
-        h++;
-        w += l;                 /* previous table always l bits */
-
-        /* compute minimum size table less than or equal to l bits */
-        z = (z = g - w) > (uInt)l ? l : z;      /* table size upper limit */
-        if ((f = 1 << (j = k - w)) > a + 1)     /* try a k-w bit table */
-        {                       /* too few codes for k-w bit table */
-          f -= a + 1;           /* deduct codes from patterns left */
-          xp = c + k;
-          if (j < z)
-            while (++j < z)     /* try smaller tables up to z bits */
-            {
-              if ((f <<= 1) <= *++xp)
-                break;          /* enough codes to use up j bits */
-              f -= *xp;         /* else deduct codes from patterns */
-            }
-        }
-        z = 1 << j;             /* table entries for j-bit table */
-
-        /* allocate and link in new table */
-        if ((q = (inflate_huft *)ZALLOC
-             (zs,z + 1,sizeof(inflate_huft))) == Z_NULL)
-        {
-          if (h)
-            inflate_trees_free(u[0], zs);
-          return Z_MEM_ERROR;   /* not enough memory */
-        }
-       q->word.Nalloc = z + 1;
-#ifdef DEBUG_ZLIB
-        inflate_hufts += z + 1;
-#endif
-        *t = q + 1;             /* link to list for huft_free() */
-        *(t = &(q->next)) = Z_NULL;
-        u[h] = ++q;             /* table starts after link */
-
-        /* connect to last table, if there is one */
-        if (h)
-        {
-          x[h] = i;             /* save pattern for backing up */
-          r.bits = (Byte)l;     /* bits to dump before this table */
-          r.exop = (Byte)j;     /* bits in this table */
-          r.next = q;           /* pointer to this table */
-          j = i >> (w - l);     /* (get around Turbo C bug) */
-          u[h-1][j] = r;        /* connect to last table */
-        }
-      }
-
-      /* set up table entry in r */
-      r.bits = (Byte)(k - w);
-      if (p >= v + n)
-        r.exop = 128 + 64;      /* out of values--invalid code */
-      else if (*p < s)
-      {
-        r.exop = (Byte)(*p < 256 ? 0 : 32 + 64);     /* 256 is end-of-block */
-        r.base = *p++;          /* simple code is just the value */
-      }
-      else
-      {
-        r.exop = (Byte)e[*p - s] + 16 + 64; /* non-simple--look up in lists */
-        r.base = d[*p++ - s];
-      }
-
-      /* fill code-like entries with r */
-      f = 1 << (k - w);
-      for (j = i >> w; j < z; j += f)
-        q[j] = r;
-
-      /* backwards increment the k-bit code i */
-      for (j = 1 << (k - 1); i & j; j >>= 1)
-        i ^= j;
-      i ^= j;
-
-      /* backup over finished tables */
-      while ((i & ((1 << w) - 1)) != x[h])
-      {
-        h--;                    /* don't need to update q */
-        w -= l;
-      }
-    }
-  }
-
-
-  /* Return Z_BUF_ERROR if we were given an incomplete table */
-  return y != 0 && g != 1 ? Z_BUF_ERROR : Z_OK;
-}
-
-
-local int inflate_trees_bits(c, bb, tb, z)
-uIntf *c;               /* 19 code lengths */
-uIntf *bb;              /* bits tree desired/actual depth */
-inflate_huft * FAR *tb; /* bits tree result */
-z_stream *z;            /* for zfree function */
-{
-  int r;
-
-  r = huft_build(c, 19, 19, (uIntf*)Z_NULL, (uIntf*)Z_NULL, tb, bb, z);
-  if (r == Z_DATA_ERROR)
-    z->msg = "oversubscribed dynamic bit lengths tree";
-  else if (r == Z_BUF_ERROR)
-  {
-    inflate_trees_free(*tb, z);
-    z->msg = "incomplete dynamic bit lengths tree";
-    r = Z_DATA_ERROR;
-  }
-  return r;
-}
-
-
-local int inflate_trees_dynamic(nl, nd, c, bl, bd, tl, td, z)
-uInt nl;                /* number of literal/length codes */
-uInt nd;                /* number of distance codes */
-uIntf *c;               /* that many (total) code lengths */
-uIntf *bl;              /* literal desired/actual bit depth */
-uIntf *bd;              /* distance desired/actual bit depth */
-inflate_huft * FAR *tl; /* literal/length tree result */
-inflate_huft * FAR *td; /* distance tree result */
-z_stream *z;            /* for zfree function */
-{
-  int r;
-
-  /* build literal/length tree */
-  if ((r = huft_build(c, nl, 257, cplens, cplext, tl, bl, z)) != Z_OK)
-  {
-    if (r == Z_DATA_ERROR)
-      z->msg = "oversubscribed literal/length tree";
-    else if (r == Z_BUF_ERROR)
-    {
-      inflate_trees_free(*tl, z);
-      z->msg = "incomplete literal/length tree";
-      r = Z_DATA_ERROR;
-    }
-    return r;
-  }
-
-  /* build distance tree */
-  if ((r = huft_build(c + nl, nd, 0, cpdist, cpdext, td, bd, z)) != Z_OK)
-  {
-    if (r == Z_DATA_ERROR)
-      z->msg = "oversubscribed literal/length tree";
-    else if (r == Z_BUF_ERROR) {
-#ifdef PKZIP_BUG_WORKAROUND
-      r = Z_OK;
-    }
-#else
-      inflate_trees_free(*td, z);
-      z->msg = "incomplete literal/length tree";
-      r = Z_DATA_ERROR;
-    }
-    inflate_trees_free(*tl, z);
-    return r;
-#endif
-  }
-
-  /* done */
-  return Z_OK;
-}
-
-
-/* build fixed tables only once--keep them here */
-local int fixed_lock = 0;
-local int fixed_built = 0;
-#define FIXEDH 530      /* number of hufts used by fixed tables */
-local uInt fixed_left = FIXEDH;
-local inflate_huft fixed_mem[FIXEDH];
-local uInt fixed_bl;
-local uInt fixed_bd;
-local inflate_huft *fixed_tl;
-local inflate_huft *fixed_td;
-
-
-local voidpf falloc(q, n, s)
-voidpf q;        /* opaque pointer (not used) */
-uInt n;         /* number of items */
-uInt s;         /* size of item */
-{
-  Assert(s == sizeof(inflate_huft) && n <= fixed_left,
-         "inflate_trees falloc overflow");
-  if (q) s++; /* to make some compilers happy */
-  fixed_left -= n;
-  return (voidpf)(fixed_mem + fixed_left);
-}
-
-
-local void ffree(q, p, n)
-voidpf q;
-voidpf p;
-uInt n;
-{
-  Assert(0, "inflate_trees ffree called!");
-  if (q) q = p; /* to make some compilers happy */
-}
-
-
-local int inflate_trees_fixed(bl, bd, tl, td)
-uIntf *bl;               /* literal desired/actual bit depth */
-uIntf *bd;               /* distance desired/actual bit depth */
-inflate_huft * FAR *tl;  /* literal/length tree result */
-inflate_huft * FAR *td;  /* distance tree result */
-{
-  /* build fixed tables if not built already--lock out other instances */
-  while (++fixed_lock > 1)
-    fixed_lock--;
-  if (!fixed_built)
-  {
-    int k;              /* temporary variable */
-    unsigned c[288];    /* length list for huft_build */
-    z_stream z;         /* for falloc function */
-
-    /* set up fake z_stream for memory routines */
-    z.zalloc = falloc;
-    z.zfree = ffree;
-    z.opaque = Z_NULL;
-
-    /* literal table */
-    for (k = 0; k < 144; k++)
-      c[k] = 8;
-    for (; k < 256; k++)
-      c[k] = 9;
-    for (; k < 280; k++)
-      c[k] = 7;
-    for (; k < 288; k++)
-      c[k] = 8;
-    fixed_bl = 7;
-    huft_build(c, 288, 257, cplens, cplext, &fixed_tl, &fixed_bl, &z);
-
-    /* distance table */
-    for (k = 0; k < 30; k++)
-      c[k] = 5;
-    fixed_bd = 5;
-    huft_build(c, 30, 0, cpdist, cpdext, &fixed_td, &fixed_bd, &z);
-
-    /* done */
-    fixed_built = 1;
-  }
-  fixed_lock--;
-  *bl = fixed_bl;
-  *bd = fixed_bd;
-  *tl = fixed_tl;
-  *td = fixed_td;
-  return Z_OK;
-}
-
-
-local int inflate_trees_free(t, z)
-inflate_huft *t;        /* table to free */
-z_stream *z;            /* for zfree function */
-/* Free the malloc'ed tables built by huft_build(), which makes a linked
-   list of the tables it made, with the links in a dummy first entry of
-   each table. */
-{
-  register inflate_huft *p, *q;
-
-  /* Go through linked list, freeing from the malloced (t[-1]) address. */
-  p = t;
-  while (p != Z_NULL)
-  {
-    q = (--p)->next;
-    ZFREE(z, p, p->word.Nalloc * sizeof(inflate_huft));
-    p = q;
-  }
-  return Z_OK;
-}
-
-/*+++++*/
-/* infcodes.c -- process literals and length/distance pairs
- * Copyright (C) 1995 Mark Adler
- * For conditions of distribution and use, see copyright notice in zlib.h
- */
-
-/* simplify the use of the inflate_huft type with some defines */
-#define base more.Base
-#define next more.Next
-#define exop word.what.Exop
-#define bits word.what.Bits
-
-/* inflate codes private state */
-struct inflate_codes_state {
-
-  /* mode */
-  enum {        /* waiting for "i:"=input, "o:"=output, "x:"=nothing */
-      START,    /* x: set up for LEN */
-      LEN,      /* i: get length/literal/eob next */
-      LENEXT,   /* i: getting length extra (have base) */
-      DIST,     /* i: get distance next */
-      DISTEXT,  /* i: getting distance extra */
-      COPY,     /* o: copying bytes in window, waiting for space */
-      LIT,      /* o: got literal, waiting for output space */
-      WASH,     /* o: got eob, possibly still output waiting */
-      END,      /* x: got eob and all data flushed */
-      BADCODE}  /* x: got error */
-    mode;               /* current inflate_codes mode */
-
-  /* mode dependent information */
-  uInt len;
-  union {
-    struct {
-      inflate_huft *tree;       /* pointer into tree */
-      uInt need;                /* bits needed */
-    } code;             /* if LEN or DIST, where in tree */
-    uInt lit;           /* if LIT, literal */
-    struct {
-      uInt get;                 /* bits to get for extra */
-      uInt dist;                /* distance back to copy from */
-    } copy;             /* if EXT or COPY, where and how much */
-  } sub;                /* submode */
-
-  /* mode independent information */
-  Byte lbits;           /* ltree bits decoded per branch */
-  Byte dbits;           /* dtree bits decoder per branch */
-  inflate_huft *ltree;          /* literal/length/eob tree */
-  inflate_huft *dtree;          /* distance tree */
-
-};
-
-
-local inflate_codes_statef *inflate_codes_new(bl, bd, tl, td, z)
-uInt bl, bd;
-inflate_huft *tl, *td;
-z_stream *z;
-{
-  inflate_codes_statef *c;
-
-  if ((c = (inflate_codes_statef *)
-       ZALLOC(z,1,sizeof(struct inflate_codes_state))) != Z_NULL)
-  {
-    c->mode = START;
-    c->lbits = (Byte)bl;
-    c->dbits = (Byte)bd;
-    c->ltree = tl;
-    c->dtree = td;
-    Tracev((stderr, "inflate:       codes new\n"));
-  }
-  return c;
-}
-
-
-local int inflate_codes(s, z, r)
-inflate_blocks_statef *s;
-z_stream *z;
-int r;
-{
-  uInt j;               /* temporary storage */
-  inflate_huft *t;      /* temporary pointer */
-  uInt e;               /* extra bits or operation */
-  uLong b;              /* bit buffer */
-  uInt k;               /* bits in bit buffer */
-  Bytef *p;             /* input data pointer */
-  uInt n;               /* bytes available there */
-  Bytef *q;             /* output window write pointer */
-  uInt m;               /* bytes to end of window or read pointer */
-  Bytef *f;             /* pointer to copy strings from */
-  inflate_codes_statef *c = s->sub.decode.codes;  /* codes state */
-
-  /* copy input/output information to locals (UPDATE macro restores) */
-  LOAD
-
-  /* process input and output based on current state */
-  while (1) switch (c->mode)
-  {             /* waiting for "i:"=input, "o:"=output, "x:"=nothing */
-    case START:         /* x: set up for LEN */
-#ifndef SLOW
-      if (m >= 258 && n >= 10)
-      {
-        UPDATE
-        r = inflate_fast(c->lbits, c->dbits, c->ltree, c->dtree, s, z);
-        LOAD
-        if (r != Z_OK)
-        {
-          c->mode = r == Z_STREAM_END ? WASH : BADCODE;
-          break;
-        }
-      }
-#endif /* !SLOW */
-      c->sub.code.need = c->lbits;
-      c->sub.code.tree = c->ltree;
-      c->mode = LEN;
-    case LEN:           /* i: get length/literal/eob next */
-      j = c->sub.code.need;
-      NEEDBITS(j)
-      t = c->sub.code.tree + ((uInt)b & inflate_mask[j]);
-      DUMPBITS(t->bits)
-      e = (uInt)(t->exop);
-      if (e == 0)               /* literal */
-      {
-        c->sub.lit = t->base;
-        Tracevv((stderr, t->base >= 0x20 && t->base < 0x7f ?
-                 "inflate:         literal '%c'\n" :
-                 "inflate:         literal 0x%02x\n", t->base));
-        c->mode = LIT;
-        break;
-      }
-      if (e & 16)               /* length */
-      {
-        c->sub.copy.get = e & 15;
-        c->len = t->base;
-        c->mode = LENEXT;
-        break;
-      }
-      if ((e & 64) == 0)        /* next table */
-      {
-        c->sub.code.need = e;
-        c->sub.code.tree = t->next;
-        break;
-      }
-      if (e & 32)               /* end of block */
-      {
-        Tracevv((stderr, "inflate:         end of block\n"));
-        c->mode = WASH;
-        break;
-      }
-      c->mode = BADCODE;        /* invalid code */
-      z->msg = "invalid literal/length code";
-      r = Z_DATA_ERROR;
-      LEAVE
-    case LENEXT:        /* i: getting length extra (have base) */
-      j = c->sub.copy.get;
-      NEEDBITS(j)
-      c->len += (uInt)b & inflate_mask[j];
-      DUMPBITS(j)
-      c->sub.code.need = c->dbits;
-      c->sub.code.tree = c->dtree;
-      Tracevv((stderr, "inflate:         length %u\n", c->len));
-      c->mode = DIST;
-    case DIST:          /* i: get distance next */
-      j = c->sub.code.need;
-      NEEDBITS(j)
-      t = c->sub.code.tree + ((uInt)b & inflate_mask[j]);
-      DUMPBITS(t->bits)
-      e = (uInt)(t->exop);
-      if (e & 16)               /* distance */
-      {
-        c->sub.copy.get = e & 15;
-        c->sub.copy.dist = t->base;
-        c->mode = DISTEXT;
-        break;
-      }
-      if ((e & 64) == 0)        /* next table */
-      {
-        c->sub.code.need = e;
-        c->sub.code.tree = t->next;
-        break;
-      }
-      c->mode = BADCODE;        /* invalid code */
-      z->msg = "invalid distance code";
-      r = Z_DATA_ERROR;
-      LEAVE
-    case DISTEXT:       /* i: getting distance extra */
-      j = c->sub.copy.get;
-      NEEDBITS(j)
-      c->sub.copy.dist += (uInt)b & inflate_mask[j];
-      DUMPBITS(j)
-      Tracevv((stderr, "inflate:         distance %u\n", c->sub.copy.dist));
-      c->mode = COPY;
-    case COPY:          /* o: copying bytes in window, waiting for space */
-#ifndef __TURBOC__ /* Turbo C bug for following expression */
-      f = (uInt)(q - s->window) < c->sub.copy.dist ?
-          s->end - (c->sub.copy.dist - (q - s->window)) :
-          q - c->sub.copy.dist;
-#else
-      f = q - c->sub.copy.dist;
-      if ((uInt)(q - s->window) < c->sub.copy.dist)
-        f = s->end - (c->sub.copy.dist - (q - s->window));
-#endif
-      while (c->len)
-      {
-        NEEDOUT
-        OUTBYTE(*f++)
-        if (f == s->end)
-          f = s->window;
-        c->len--;
-      }
-      c->mode = START;
-      break;
-    case LIT:           /* o: got literal, waiting for output space */
-      NEEDOUT
-      OUTBYTE(c->sub.lit)
-      c->mode = START;
-      break;
-    case WASH:          /* o: got eob, possibly more output */
-      FLUSH
-      if (s->read != s->write)
-        LEAVE
-      c->mode = END;
-    case END:
-      r = Z_STREAM_END;
-      LEAVE
-    case BADCODE:       /* x: got error */
-      r = Z_DATA_ERROR;
-      LEAVE
-    default:
-      r = Z_STREAM_ERROR;
-      LEAVE
-  }
-}
-
-
-local void inflate_codes_free(c, z)
-inflate_codes_statef *c;
-z_stream *z;
-{
-  ZFREE(z, c, sizeof(struct inflate_codes_state));
-  Tracev((stderr, "inflate:       codes free\n"));
-}
-
-/*+++++*/
-/* inflate_util.c -- data and routines common to blocks and codes
- * Copyright (C) 1995 Mark Adler
- * For conditions of distribution and use, see copyright notice in zlib.h
- */
-
-/* copy as much as possible from the sliding window to the output area */
-local int inflate_flush(s, z, r)
-inflate_blocks_statef *s;
-z_stream *z;
-int r;
-{
-  uInt n;
-  Bytef *p, *q;
-
-  /* local copies of source and destination pointers */
-  p = z->next_out;
-  q = s->read;
-
-  /* compute number of bytes to copy as far as end of window */
-  n = (uInt)((q <= s->write ? s->write : s->end) - q);
-  if (n > z->avail_out) n = z->avail_out;
-  if (n && r == Z_BUF_ERROR) r = Z_OK;
-
-  /* update counters */
-  z->avail_out -= n;
-  z->total_out += n;
-
-  /* update check information */
-  if (s->checkfn != Z_NULL)
-    s->check = (*s->checkfn)(s->check, q, n);
-
-  /* copy as far as end of window */
-  zmemcpy(p, q, n);
-  p += n;
-  q += n;
-
-  /* see if more to copy at beginning of window */
-  if (q == s->end)
-  {
-    /* wrap pointers */
-    q = s->window;
-    if (s->write == s->end)
-      s->write = s->window;
-
-    /* compute bytes to copy */
-    n = (uInt)(s->write - q);
-    if (n > z->avail_out) n = z->avail_out;
-    if (n && r == Z_BUF_ERROR) r = Z_OK;
-
-    /* update counters */
-    z->avail_out -= n;
-    z->total_out += n;
-
-    /* update check information */
-    if (s->checkfn != Z_NULL)
-      s->check = (*s->checkfn)(s->check, q, n);
-
-    /* copy */
-    zmemcpy(p, q, n);
-    p += n;
-    q += n;
-  }
-
-  /* update pointers */
-  z->next_out = p;
-  s->read = q;
-
-  /* done */
-  return r;
-}
-
-
-/*+++++*/
-/* inffast.c -- process literals and length/distance pairs fast
- * Copyright (C) 1995 Mark Adler
- * For conditions of distribution and use, see copyright notice in zlib.h
- */
-
-/* simplify the use of the inflate_huft type with some defines */
-#define base more.Base
-#define next more.Next
-#define exop word.what.Exop
-#define bits word.what.Bits
-
-/* macros for bit input with no checking and for returning unused bytes */
-#define GRABBITS(j) {while(k<(j)){b|=((uLong)NEXTBYTE)<<k;k+=8;}}
-#define UNGRAB {n+=(c=k>>3);p-=c;k&=7;}
-
-/* Called with number of bytes left to write in window at least 258
-   (the maximum string length) and number of input bytes available
-   at least ten.  The ten bytes are six bytes for the longest length/
-   distance pair plus four bytes for overloading the bit buffer. */
-
-local int inflate_fast(bl, bd, tl, td, s, z)
-uInt bl, bd;
-inflate_huft *tl, *td;
-inflate_blocks_statef *s;
-z_stream *z;
-{
-  inflate_huft *t;      /* temporary pointer */
-  uInt e;               /* extra bits or operation */
-  uLong b;              /* bit buffer */
-  uInt k;               /* bits in bit buffer */
-  Bytef *p;             /* input data pointer */
-  uInt n;               /* bytes available there */
-  Bytef *q;             /* output window write pointer */
-  uInt m;               /* bytes to end of window or read pointer */
-  uInt ml;              /* mask for literal/length tree */
-  uInt md;              /* mask for distance tree */
-  uInt c;               /* bytes to copy */
-  uInt d;               /* distance back to copy from */
-  Bytef *r;             /* copy source pointer */
-
-  /* load input, output, bit values */
-  LOAD
-
-  /* initialize masks */
-  ml = inflate_mask[bl];
-  md = inflate_mask[bd];
-
-  /* do until not enough input or output space for fast loop */
-  do {                          /* assume called with m >= 258 && n >= 10 */
-    /* get literal/length code */
-    GRABBITS(20)                /* max bits for literal/length code */
-    if ((e = (t = tl + ((uInt)b & ml))->exop) == 0)
-    {
-      DUMPBITS(t->bits)
-      Tracevv((stderr, t->base >= 0x20 && t->base < 0x7f ?
-                "inflate:         * literal '%c'\n" :
-                "inflate:         * literal 0x%02x\n", t->base));
-      *q++ = (Byte)t->base;
-      m--;
-      continue;
-    }
-    do {
-      DUMPBITS(t->bits)
-      if (e & 16)
-      {
-        /* get extra bits for length */
-        e &= 15;
-        c = t->base + ((uInt)b & inflate_mask[e]);
-        DUMPBITS(e)
-        Tracevv((stderr, "inflate:         * length %u\n", c));
-
-        /* decode distance base of block to copy */
-        GRABBITS(15);           /* max bits for distance code */
-        e = (t = td + ((uInt)b & md))->exop;
-        do {
-          DUMPBITS(t->bits)
-          if (e & 16)
-          {
-            /* get extra bits to add to distance base */
-            e &= 15;
-            GRABBITS(e)         /* get extra bits (up to 13) */
-            d = t->base + ((uInt)b & inflate_mask[e]);
-            DUMPBITS(e)
-            Tracevv((stderr, "inflate:         * distance %u\n", d));
-
-            /* do the copy */
-            m -= c;
-            if ((uInt)(q - s->window) >= d)     /* offset before dest */
-            {                                   /*  just copy */
-              r = q - d;
-              *q++ = *r++;  c--;        /* minimum count is three, */
-              *q++ = *r++;  c--;        /*  so unroll loop a little */
-            }
-            else                        /* else offset after destination */
-            {
-              e = d - (q - s->window);  /* bytes from offset to end */
-              r = s->end - e;           /* pointer to offset */
-              if (c > e)                /* if source crosses, */
-              {
-                c -= e;                 /* copy to end of window */
-                do {
-                  *q++ = *r++;
-                } while (--e);
-                r = s->window;          /* copy rest from start of window */
-              }
-            }
-            do {                        /* copy all or what's left */
-              *q++ = *r++;
-            } while (--c);
-            break;
-          }
-          else if ((e & 64) == 0)
-            e = (t = t->next + ((uInt)b & inflate_mask[e]))->exop;
-          else
-          {
-            z->msg = "invalid distance code";
-            UNGRAB
-            UPDATE
-            return Z_DATA_ERROR;
-          }
-        } while (1);
-        break;
-      }
-      if ((e & 64) == 0)
-      {
-        if ((e = (t = t->next + ((uInt)b & inflate_mask[e]))->exop) == 0)
-        {
-          DUMPBITS(t->bits)
-          Tracevv((stderr, t->base >= 0x20 && t->base < 0x7f ?
-                    "inflate:         * literal '%c'\n" :
-                    "inflate:         * literal 0x%02x\n", t->base));
-          *q++ = (Byte)t->base;
-          m--;
-          break;
-        }
-      }
-      else if (e & 32)
-      {
-        Tracevv((stderr, "inflate:         * end of block\n"));
-        UNGRAB
-        UPDATE
-        return Z_STREAM_END;
-      }
-      else
-      {
-        z->msg = "invalid literal/length code";
-        UNGRAB
-        UPDATE
-        return Z_DATA_ERROR;
-      }
-    } while (1);
-  } while (m >= 258 && n >= 10);
-
-  /* not enough input or output--restore pointers and return */
-  UNGRAB
-  UPDATE
-  return Z_OK;
-}
-
-
-/*+++++*/
-/* zutil.c -- target dependent utility functions for the compression library
- * Copyright (C) 1995 Jean-loup Gailly.
- * For conditions of distribution and use, see copyright notice in zlib.h
- */
-
-/* From: zutil.c,v 1.8 1995/05/03 17:27:12 jloup Exp */
-
-char *zlib_version = ZLIB_VERSION;
-
-char *z_errmsg[] = {
-"stream end",          /* Z_STREAM_END    1 */
-"",                    /* Z_OK            0 */
-"file error",          /* Z_ERRNO        (-1) */
-"stream error",        /* Z_STREAM_ERROR (-2) */
-"data error",          /* Z_DATA_ERROR   (-3) */
-"insufficient memory", /* Z_MEM_ERROR    (-4) */
-"buffer error",        /* Z_BUF_ERROR    (-5) */
-""};
-
-
-/*+++++*/
-/* adler32.c -- compute the Adler-32 checksum of a data stream
- * Copyright (C) 1995 Mark Adler
- * For conditions of distribution and use, see copyright notice in zlib.h
- */
-
-/* From: adler32.c,v 1.6 1995/05/03 17:27:08 jloup Exp */
-
-#define BASE 65521L /* largest prime smaller than 65536 */
-#define NMAX 5552
-/* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */
-
-#define DO1(buf)  {s1 += *buf++; s2 += s1;}
-#define DO2(buf)  DO1(buf); DO1(buf);
-#define DO4(buf)  DO2(buf); DO2(buf);
-#define DO8(buf)  DO4(buf); DO4(buf);
-#define DO16(buf) DO8(buf); DO8(buf);
-
-/* ========================================================================= */
-uLong adler32(adler, buf, len)
-    uLong adler;
-    Bytef *buf;
-    uInt len;
-{
-    unsigned long s1 = adler & 0xffff;
-    unsigned long s2 = (adler >> 16) & 0xffff;
-    int k;
-
-    if (buf == Z_NULL) return 1L;
-
-    while (len > 0) {
-        k = len < NMAX ? len : NMAX;
-        len -= k;
-        while (k >= 16) {
-            DO16(buf);
-            k -= 16;
-        }
-        if (k != 0) do {
-            DO1(buf);
-        } while (--k);
-        s1 %= BASE;
-        s2 %= BASE;
-    }
-    return (s2 << 16) | s1;
-}
diff -urN linux/arch/xtensa/kernel/pci.c linux/arch/xtensa/kernel/pci.c
--- linux/arch/xtensa/kernel/pci.c      2005/07/11 20:46:48     1.1
+++ linux/arch/xtensa/kernel/pci.c      2005/07/12 09:19:10     1.2
@@ -57,50 +57,6 @@
 
 static int pci_bus_count;
 
-static void pcibios_fixup_resources(struct pci_dev* dev);
-
-#if 0 // FIXME
-struct pci_fixup pcibios_fixups[] = {
-       { DECLARE_PCI_FIXUP_HEADER, PCI_ANY_ID, PCI_ANY_ID, 
pcibios_fixup_resources },
-       { 0 }
-};
-#endif
-
-void
-pcibios_update_resource(struct pci_dev *dev, struct resource *root,
-                       struct resource *res, int resource)
-{
-       u32 new, check, mask;
-       int reg;
-       struct pci_controller* pci_ctrl = dev->sysdata;
-
-       new = res->start;
-       if (pci_ctrl && res->flags & IORESOURCE_IO) {
-               new -= pci_ctrl->io_space.base;
-       }
-       new |= (res->flags & PCI_REGION_FLAG_MASK);
-       if (resource < 6) {
-               reg = PCI_BASE_ADDRESS_0 + 4*resource;
-       } else if (resource == PCI_ROM_RESOURCE) {
-               res->flags |= PCI_ROM_ADDRESS_ENABLE;
-               reg = dev->rom_base_reg;
-       } else {
-       /* Somebody might have asked allocation of a non-standard resource */
-               return;
-       }
-
-       pci_write_config_dword(dev, reg, new);
-       pci_read_config_dword(dev, reg, &check);
-       mask = (new & PCI_BASE_ADDRESS_SPACE_IO) ?
-               PCI_BASE_ADDRESS_IO_MASK : PCI_BASE_ADDRESS_MEM_MASK;
-
-       if ((new ^ check) & mask) {
-               printk(KERN_ERR "PCI: Error while updating region "
-                      "%s/%d (%08x != %08x)\n", dev->slot_name, resource,
-                      new, check);
-       }
-}
-
 /*
  * We need to avoid collisions with `mirrored' VGA ports
  * and other strange ISA hardware, so we always want the
@@ -125,7 +81,7 @@
 
                if (size > 0x100) {
                        printk(KERN_ERR "PCI: I/O Region %s/%d too large"
-                              " (%ld bytes)\n", dev->slot_name,
+                              " (%ld bytes)\n", pci_name(dev),
                               dev->resource - res, size);
                }
 
@@ -149,7 +105,7 @@
                r = &dev->resource[idx];
                if (!r->start && r->end) {
                        printk (KERN_ERR "PCI: Device %s not available because "
-                               "of resource collisions\n", dev->slot_name);
+                               "of resource collisions\n", pci_name(dev));
                        return -EINVAL;
                }
                if (r->flags & IORESOURCE_IO)
@@ -161,7 +117,7 @@
                cmd |= PCI_COMMAND_MEMORY;
        if (cmd != old_cmd) {
                printk("PCI: Enabling device %s (%04x -> %04x)\n",
-                       dev->slot_name, old_cmd, cmd);
+                       pci_name(dev), old_cmd, cmd);
                pci_write_config_word(dev, PCI_COMMAND, cmd);
        }
        return 0;
@@ -293,7 +249,7 @@
                r = &dev->resource[idx];
                if (!r->start && r->end) {
                        printk(KERN_ERR "PCI: Device %s not available because "
-                              "of resource collisions\n", dev->slot_name);
+                              "of resource collisions\n", pci_name(dev));
                        return -EINVAL;
                }
                if (r->flags & IORESOURCE_IO)
@@ -303,7 +259,7 @@
        }
        if (cmd != old_cmd) {
                printk("PCI: Enabling device %s (%04x -> %04x)\n",
-                      dev->slot_name, old_cmd, cmd);
+                      pci_name(dev), old_cmd, cmd);
                pci_write_config_word(dev, PCI_COMMAND, cmd);
        }
 
@@ -325,47 +281,6 @@
 
 #endif /* CONFIG_PROC_FS */
 
-
-static void
-pcibios_fixup_resources(struct pci_dev *dev)
-{
-       struct pci_controller* pci_ctrl = (struct pci_controller *)dev->sysdata;
-       int i;
-       unsigned long offset;
-
-       if (!pci_ctrl) {
-               printk(KERN_ERR "No pci_ctrl for PCI dev %s!\n",dev->slot_name);
-               return;
-       }
-       for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
-               struct resource *res = dev->resource + i;
-               if (!res->start || !res->flags)
-                       continue;
-               if (res->end == 0xffffffff) {
-                       DBG("PCI:%s Resource %d [%08lx-%08lx] is unassigned\n",
-                           dev->slot_name, i, res->start, res->end);
-                       res->end -= res->start;
-                       res->start = 0;
-                       continue;
-               }
-               offset = 0;
-               if (res->flags & IORESOURCE_IO)
-                       offset = (unsigned long) pci_ctrl->io_space.base;
-               else if (res->flags & IORESOURCE_MEM)
-                       offset = (unsigned long) pci_ctrl->mem_space.base;
-
-               if (offset != 0) {
-                       res->start += offset;
-                       res->end += offset;
-#ifdef DEBUG
-                       printk("Fixup res %d (%lx) of dev %s: %lx -> %lx\n",
-                              i, res->flags, dev->slot_name,
-                              res->start - offset, res->start);
-#endif
-               }
-       }
-}
-
 /*
  * Platform support for /proc/bus/pci/X/Y mmap()s,
  * modelled on the sparc64 implementation by Dave Miller.
diff -urN linux/arch/xtensa/kernel/ptrace.c linux/arch/xtensa/kernel/ptrace.c
--- linux/arch/xtensa/kernel/ptrace.c   2005/07/11 20:46:48     1.1
+++ linux/arch/xtensa/kernel/ptrace.c   2005/07/12 09:19:10     1.2
@@ -22,6 +22,7 @@
 #include <linux/smp.h>
 #include <linux/smp_lock.h>
 #include <linux/security.h>
+#include <linux/signal.h>
 
 #include <asm/pgtable.h>
 #include <asm/page.h>
@@ -239,7 +240,7 @@
        case PTRACE_CONT: /* restart after signal. */
        {
                ret = -EIO;
-               if ((unsigned long) data > _NSIG)
+               if (!valid_signal(data))
                        break;
                if (request == PTRACE_SYSCALL)
                        set_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
@@ -269,7 +270,7 @@
 
        case PTRACE_SINGLESTEP:
                ret = -EIO;
-               if ((unsigned long) data > _NSIG)
+               if (!valid_signal(data))
                        break;
                clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
                child->ptrace |= PT_SINGLESTEP;
diff -urN linux/drivers/acpi/pci_irq.c linux/drivers/acpi/pci_irq.c
--- linux/drivers/acpi/pci_irq.c        2005/07/11 20:46:51     1.28
+++ linux/drivers/acpi/pci_irq.c        2005/07/12 09:19:10     1.29
@@ -433,7 +433,7 @@
                printk(KERN_WARNING PREFIX "PCI Interrupt %s[%c]: no GSI",
                        pci_name(dev), ('A' + pin));
                /* Interrupt Line values above 0xF are forbidden */
-               if (dev->irq >= 0 && (dev->irq <= 0xF)) {
+               if (dev->irq > 0 && (dev->irq <= 0xF)) {
                        printk(" - using IRQ %d\n", dev->irq);
                        acpi_register_gsi(dev->irq, ACPI_LEVEL_SENSITIVE, 
ACPI_ACTIVE_LOW);
                        return_VALUE(0);
diff -urN linux/drivers/base/base.h linux/drivers/base/base.h
--- linux/drivers/base/base.h   2005/07/11 20:46:51     1.23
+++ linux/drivers/base/base.h   2005/07/12 09:19:10     1.24
@@ -5,6 +5,7 @@
 extern void bus_remove_driver(struct device_driver *);
 
 extern void driver_detach(struct device_driver * drv);
+extern int driver_probe_device(struct device_driver *, struct device *);
 
 static inline struct class_device *to_class_dev(struct kobject *obj)
 {
diff -urN linux/drivers/base/bus.c linux/drivers/base/bus.c
--- linux/drivers/base/bus.c    2005/07/11 20:46:51     1.37
+++ linux/drivers/base/bus.c    2005/07/12 09:19:10     1.38
@@ -133,6 +133,58 @@
 decl_subsys(bus, &ktype_bus, NULL);
 
 
+/* Manually detach a device from it's associated driver. */
+static int driver_helper(struct device *dev, void *data)
+{
+       const char *name = data;
+
+       if (strcmp(name, dev->bus_id) == 0)
+               return 1;
+       return 0;
+}
+
+static ssize_t driver_unbind(struct device_driver *drv,
+                            const char *buf, size_t count)
+{
+       struct bus_type *bus = get_bus(drv->bus);
+       struct device *dev;
+       int err = -ENODEV;
+
+       dev = bus_find_device(bus, NULL, (void *)buf, driver_helper);
+       if ((dev) &&
+           (dev->driver == drv)) {
+               device_release_driver(dev);
+               err = count;
+       }
+       return err;
+}
+static DRIVER_ATTR(unbind, S_IWUSR, NULL, driver_unbind);
+
+/*
+ * Manually attach a device to a driver.
+ * Note: the driver must want to bind to the device,
+ * it is not possible to override the driver's id table.
+ */
+static ssize_t driver_bind(struct device_driver *drv,
+                          const char *buf, size_t count)
+{
+       struct bus_type *bus = get_bus(drv->bus);
+       struct device *dev;
+       int err = -ENODEV;
+
+       dev = bus_find_device(bus, NULL, (void *)buf, driver_helper);
+       if ((dev) &&
+           (dev->driver == NULL)) {
+               down(&dev->sem);
+               err = driver_probe_device(drv, dev);
+               up(&dev->sem);
+               put_device(dev);
+       }
+       return err;
+}
+static DRIVER_ATTR(bind, S_IWUSR, NULL, driver_bind);
+
+
 static struct device * next_device(struct klist_iter * i)
 {
        struct klist_node * n = klist_next(i);
@@ -177,6 +229,39 @@
        return error;
 }
 
+/**
+ * bus_find_device - device iterator for locating a particular device.
+ * @bus: bus type
+ * @start: Device to begin with
+ * @data: Data to pass to match function
+ * @match: Callback function to check device
+ *
+ * This is similar to the bus_for_each_dev() function above, but it
+ * returns a reference to a device that is 'found' for later use, as
+ * determined by the @match callback.
+ *
+ * The callback should return 0 if the device doesn't match and non-zero
+ * if it does.  If the callback returns non-zero, this function will
+ * return to the caller and not iterate over any more devices.
+ */
+struct device * bus_find_device(struct bus_type *bus,
+                               struct device *start, void *data,
+                               int (*match)(struct device *, void *))
+{
+       struct klist_iter i;
+       struct device *dev;
+
+       if (!bus)
+               return NULL;
+
+       klist_iter_init_node(&bus->klist_devices, &i,
+                            (start ? &start->knode_bus : NULL));
+       while ((dev = next_device(&i)))
+               if (match(dev, data) && get_device(dev))
+                       break;
+       klist_iter_exit(&i);
+       return dev;
+}
 
 
 static struct device_driver * next_driver(struct klist_iter * i)
@@ -363,6 +448,8 @@
                module_add_driver(drv->owner, drv);
 
                driver_add_attrs(bus, drv);
+               driver_create_file(drv, &driver_attr_unbind);
+               driver_create_file(drv, &driver_attr_bind);
        }
        return error;
 }
@@ -380,6 +467,8 @@
 void bus_remove_driver(struct device_driver * drv)
 {
        if (drv->bus) {
+               driver_remove_file(drv, &driver_attr_bind);
+               driver_remove_file(drv, &driver_attr_unbind);
                driver_remove_attrs(drv->bus, drv);
                klist_remove(&drv->knode_bus);
                pr_debug("bus %s: remove driver %s\n", drv->bus->name, 
drv->name);
@@ -394,31 +483,22 @@
 /* Helper for bus_rescan_devices's iter */
 static int bus_rescan_devices_helper(struct device *dev, void *data)
 {
-       int *count = data;
-
-       if (!dev->driver && (device_attach(dev) > 0))
-               (*count)++;
-
+       if (!dev->driver)
+               device_attach(dev);
        return 0;
 }
 
-
 /**
- *     bus_rescan_devices - rescan devices on the bus for possible drivers
- *     @bus:   the bus to scan.
+ * bus_rescan_devices - rescan devices on the bus for possible drivers
+ * @bus: the bus to scan.
  *
- *     This function will look for devices on the bus with no driver
- *     attached and rescan it against existing drivers to see if it
- *     matches any. Calls device_attach(). Returns the number of devices
- *     that were sucessfully bound to a driver.
+ * This function will look for devices on the bus with no driver
+ * attached and rescan it against existing drivers to see if it matches
+ * any by calling device_attach() for the unbound devices.
  */
-int bus_rescan_devices(struct bus_type * bus)
+void bus_rescan_devices(struct bus_type * bus)
 {
-       int count = 0;
-
-       bus_for_each_dev(bus, NULL, &count, bus_rescan_devices_helper);
-
-       return count;
+       bus_for_each_dev(bus, NULL, NULL, bus_rescan_devices_helper);
 }
 
 
@@ -557,6 +637,7 @@
 
 
 EXPORT_SYMBOL_GPL(bus_for_each_dev);
+EXPORT_SYMBOL_GPL(bus_find_device);
 EXPORT_SYMBOL_GPL(bus_for_each_drv);
 
 EXPORT_SYMBOL_GPL(bus_add_device);
diff -urN linux/drivers/base/core.c linux/drivers/base/core.c
--- linux/drivers/base/core.c   2005/07/11 20:46:51     1.44
+++ linux/drivers/base/core.c   2005/07/12 09:19:10     1.45
@@ -333,7 +333,7 @@
        struct device * parent = dev->parent;
 
        if (parent)
-               klist_remove(&dev->knode_parent);
+               klist_del(&dev->knode_parent);
 
        /* Notify the platform of the removal, in case they
         * need to do anything...
diff -urN linux/drivers/base/dd.c linux/drivers/base/dd.c
--- linux/drivers/base/dd.c     2005/07/11 20:46:51     1.1
+++ linux/drivers/base/dd.c     2005/07/12 09:19:10     1.2
@@ -65,7 +65,7 @@
  *
  *     This function must be called with @dev->sem held.
  */
-static int driver_probe_device(struct device_driver * drv, struct device * dev)
+int driver_probe_device(struct device_driver * drv, struct device * dev)
 {
        int ret = 0;
 
diff -urN linux/drivers/base/driver.c linux/drivers/base/driver.c
--- linux/drivers/base/driver.c 2005/07/11 20:46:51     1.20
+++ linux/drivers/base/driver.c 2005/07/12 09:19:10     1.21
@@ -56,6 +56,41 @@
 
 
 /**
+ * driver_find_device - device iterator for locating a particular device.
+ * @driver: The device's driver
+ * @start: Device to begin with
+ * @data: Data to pass to match function
+ * @match: Callback function to check device
+ *
+ * This is similar to the driver_for_each_device() function above, but
+ * it returns a reference to a device that is 'found' for later use, as
+ * determined by the @match callback.
+ *
+ * The callback should return 0 if the device doesn't match and non-zero
+ * if it does.  If the callback returns non-zero, this function will
+ * return to the caller and not iterate over any more devices.
+ */
+struct device * driver_find_device(struct device_driver *drv,
+                                  struct device * start, void * data,
+                                  int (*match)(struct device *, void *))
+{
+       struct klist_iter i;
+       struct device *dev;
+
+       if (!drv)
+               return NULL;
+
+       klist_iter_init_node(&drv->klist_devices, &i,
+                            (start ? &start->knode_driver : NULL));
+       while ((dev = next_device(&i)))
+               if (match(dev, data) && get_device(dev))
+                       break;
+       klist_iter_exit(&i);
+       return dev;
+}
+EXPORT_SYMBOL_GPL(driver_find_device);
+
+/**
  *     driver_create_file - create sysfs file for driver.
  *     @drv:   driver.
  *     @attr:  driver attribute descriptor.
diff -urN linux/drivers/block/ll_rw_blk.c linux/drivers/block/ll_rw_blk.c
--- linux/drivers/block/ll_rw_blk.c     2005/07/11 20:46:51     1.145
+++ linux/drivers/block/ll_rw_blk.c     2005/07/12 09:19:10     1.146
@@ -1917,10 +1917,9 @@
         * limit of requests, otherwise we could have thousands of requests
         * allocated with any setting of ->nr_requests
         */
-       if (rl->count[rw] >= (3 * q->nr_requests / 2)) {
-               spin_unlock_irq(q->queue_lock);
+       if (rl->count[rw] >= (3 * q->nr_requests / 2))
                goto out;
-       }
+
        rl->count[rw]++;
        rl->starved[rw] = 0;
        if (rl->count[rw] >= queue_congestion_on_threshold(q))
diff -urN linux/drivers/char/hw_random.c linux/drivers/char/hw_random.c
--- linux/drivers/char/hw_random.c      2005/01/13 14:05:52     1.11
+++ linux/drivers/char/hw_random.c      2005/07/12 09:19:10     1.12
@@ -579,7 +579,7 @@
 
        /* Probe for Intel, AMD RNGs */
        for_each_pci_dev(pdev) {
-               ent = pci_match_device (rng_pci_tbl, pdev);
+               ent = pci_match_id(rng_pci_tbl, pdev);
                if (ent) {
                        rng_ops = &rng_vendor_ops[ent->driver_data];
                        goto match;
diff -urN linux/drivers/char/tpm/tpm.c linux/drivers/char/tpm/tpm.c
--- linux/drivers/char/tpm/tpm.c        2005/07/11 20:46:58     1.5
+++ linux/drivers/char/tpm/tpm.c        2005/07/12 09:19:11     1.6
@@ -464,7 +464,7 @@
 
        pci_set_drvdata(pci_dev, NULL);
        misc_deregister(&chip->vendor->miscdev);
-       kfree(&chip->vendor->miscdev.name);
+       kfree(chip->vendor->miscdev.name);
 
        sysfs_remove_group(&pci_dev->dev.kobj, chip->vendor->attr_group);
 
diff -urN linux/drivers/char/watchdog/i8xx_tco.c 
linux/drivers/char/watchdog/i8xx_tco.c
--- linux/drivers/char/watchdog/i8xx_tco.c      2005/05/26 09:12:41     1.7
+++ linux/drivers/char/watchdog/i8xx_tco.c      2005/07/12 09:19:11     1.8
@@ -401,7 +401,7 @@
         */
 
        while ((dev = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) {
-               if (pci_match_device(i8xx_tco_pci_tbl, dev)) {
+               if (pci_match_id(i8xx_tco_pci_tbl, dev)) {
                        i8xx_tco_pci = dev;
                        break;
                }
diff -urN linux/drivers/firmware/pcdp.c linux/drivers/firmware/pcdp.c
--- linux/drivers/firmware/pcdp.c       2005/07/11 20:46:59     1.10
+++ linux/drivers/firmware/pcdp.c       2005/07/12 09:19:11     1.11
@@ -16,6 +16,7 @@
 #include <linux/console.h>
 #include <linux/efi.h>
 #include <linux/serial.h>
+#include <asm/vga.h>
 #include "pcdp.h"
 
 static int __init
@@ -40,10 +41,27 @@
 }
 
 static int __init
-setup_vga_console(struct pcdp_vga *vga)
+setup_vga_console(struct pcdp_device *dev)
 {
 #if defined(CONFIG_VT) && defined(CONFIG_VGA_CONSOLE)
-       if (efi_mem_type(0xA0000) == EFI_CONVENTIONAL_MEMORY) {
+       u8 *if_ptr;
+
+       if_ptr = ((u8 *)dev + sizeof(struct pcdp_device));
+       if (if_ptr[0] == PCDP_IF_PCI) {
+               struct pcdp_if_pci if_pci;
+
+               /* struct copy since ifptr might not be correctly aligned */
+
+               memcpy(&if_pci, if_ptr, sizeof(if_pci));
+
+               if (if_pci.trans & PCDP_PCI_TRANS_IOPORT)
+                       vga_console_iobase = if_pci.ioport_tra;
+
+               if (if_pci.trans & PCDP_PCI_TRANS_MMIO)
+                       vga_console_membase = if_pci.mmio_tra;
+       }
+
+       if (efi_mem_type(vga_console_membase + 0xA0000) == 
EFI_CONVENTIONAL_MEMORY) {
                printk(KERN_ERR "PCDP: VGA selected, but frame buffer is not 
MMIO!\n");
                return -ENODEV;
        }
@@ -95,7 +113,7 @@
             dev = (struct pcdp_device *) ((u8 *) dev + dev->length)) {
                if (dev->flags & PCDP_PRIMARY_CONSOLE) {
                        if (dev->type == PCDP_CONSOLE_VGA) {
-                               return setup_vga_console((struct pcdp_vga *) 
dev);
+                               return setup_vga_console(dev);
                        }
                }
        }
diff -urN linux/drivers/firmware/pcdp.h linux/drivers/firmware/pcdp.h
--- linux/drivers/firmware/pcdp.h       2005/07/11 20:46:59     1.3
+++ linux/drivers/firmware/pcdp.h       2005/07/12 09:19:11     1.4
@@ -52,11 +52,34 @@
        u32                             clock_rate;
        u8                              pci_prog_intfc;
        u8                              flags;
-};
+} __attribute__((packed));
+
+#define PCDP_IF_PCI    1
+
+/* pcdp_if_pci.trans */
+#define PCDP_PCI_TRANS_IOPORT  0x02
+#define PCDP_PCI_TRANS_MMIO    0x01
+
+struct pcdp_if_pci {
+       u8                      interconnect;
+       u8                      reserved;
+       u16                     length;
+       u8                      segment;
+       u8                      bus;
+       u8                      dev;
+       u8                      fun;
+       u16                     dev_id;
+       u16                     vendor_id;
+       u32                     acpi_interrupt;
+       u64                     mmio_tra;
+       u64                     ioport_tra;
+       u8                      flags;
+       u8                      trans;
+} __attribute__((packed));
 
 struct pcdp_vga {
        u8                      count;          /* address space descriptors */
-};
+} __attribute__((packed));
 
 /* pcdp_device.flags */
 #define PCDP_PRIMARY_CONSOLE   1
@@ -66,7 +89,9 @@
        u8                      flags;
        u16                     length;
        u16                     efi_index;
-};
+       /* next data is pcdp_if_pci or pcdp_if_acpi (not yet supported) */
+       /* next data is device specific type (currently only pcdp_vga) */
+} __attribute__((packed));
 
 struct pcdp {
        u8                      signature[4];
@@ -81,4 +106,4 @@
        u32                     num_uarts;
        struct pcdp_uart        uart[0];        /* actual size is num_uarts */
        /* remainder of table is pcdp_device structures */
-};
+} __attribute__((packed));
diff -urN linux/drivers/i2c/chips/atxp1.c linux/drivers/i2c/chips/atxp1.c
--- linux/drivers/i2c/chips/atxp1.c     2005/07/11 20:47:02     1.1
+++ linux/drivers/i2c/chips/atxp1.c     2005/07/12 09:19:11     1.2
@@ -144,7 +144,7 @@
        if (vid == cvid)
                return count;
 
-       dev_info(dev, "Setting VCore to %d mV (0x%02x)\n", vcore, vid);
+       dev_dbg(dev, "Setting VCore to %d mV (0x%02x)\n", vcore, vid);
 
        /* Write every 25 mV step to increase stability */
        if (cvid > vid) {
diff -urN linux/drivers/ide/Makefile linux/drivers/ide/Makefile
--- linux/drivers/ide/Makefile  2005/04/08 18:58:14     1.48
+++ linux/drivers/ide/Makefile  2005/07/12 09:19:11     1.49
@@ -20,7 +20,6 @@
 # Core IDE code - must come before legacy
 ide-core-$(CONFIG_BLK_DEV_IDEPCI)      += setup-pci.o
 ide-core-$(CONFIG_BLK_DEV_IDEDMA)      += ide-dma.o
-ide-core-$(CONFIG_BLK_DEV_IDE_TCQ)     += ide-tcq.o
 ide-core-$(CONFIG_PROC_FS)             += ide-proc.o
 ide-core-$(CONFIG_BLK_DEV_IDEPNP)      += ide-pnp.o
 
diff -urN linux/drivers/ide/ide-lib.c linux/drivers/ide/ide-lib.c
--- linux/drivers/ide/ide-lib.c 2005/02/13 20:16:22     1.17
+++ linux/drivers/ide/ide-lib.c 2005/07/12 09:19:11     1.18
@@ -487,8 +487,7 @@
        u8 err = 0;
 
        local_irq_set(flags);
-       printk("%s: %s: status=0x%02x", drive->name, msg, stat);
-       printk(" { ");
+       printk("%s: %s: status=0x%02x { ", drive->name, msg, stat);
        if (stat & BUSY_STAT)
                printk("Busy ");
        else {
@@ -500,15 +499,13 @@
                if (stat & INDEX_STAT)  printk("Index ");
                if (stat & ERR_STAT)    printk("Error ");
        }
-       printk("}");
-       printk("\n");
+       printk("}\n");
        if ((stat & (BUSY_STAT|ERR_STAT)) == ERR_STAT) {
                err = hwif->INB(IDE_ERROR_REG);
-               printk("%s: %s: error=0x%02x", drive->name, msg, err);
-               printk(" { ");
+               printk("%s: %s: error=0x%02x { ", drive->name, msg, err);
                if (err & ABRT_ERR)     printk("DriveStatusError ");
                if (err & ICRC_ERR)
-                       printk("Bad%s ", (err & ABRT_ERR) ? "CRC" : "Sector");
+                       printk((err & ABRT_ERR) ? "BadCRC " : "BadSector ");
                if (err & ECC_ERR)      printk("UncorrectableError ");
                if (err & ID_ERR)       printk("SectorIdNotFound ");
                if (err & TRK0_ERR)     printk("TrackZeroNotFound ");
@@ -546,8 +543,8 @@
                                printk(", sector=%llu",
                                        (unsigned long 
long)HWGROUP(drive)->rq->sector);
                }
+               printk("\n");
        }
-       printk("\n");
        ide_dump_opcode(drive);
        local_irq_restore(flags);
        return err;
diff -urN linux/drivers/ide/setup-pci.c linux/drivers/ide/setup-pci.c
--- linux/drivers/ide/setup-pci.c       2005/01/13 14:05:59     1.23
+++ linux/drivers/ide/setup-pci.c       2005/07/12 09:19:11     1.24
@@ -847,7 +847,7 @@
                d = list_entry(l, struct pci_driver, node);
                if(d->id_table)
                {
-                       const struct pci_device_id *id = 
pci_match_device(d->id_table, dev);
+                       const struct pci_device_id *id = 
pci_match_id(d->id_table, dev);
                        if(id != NULL)
                        {
                                if(d->probe(dev, id) >= 0)
diff -urN linux/drivers/ide/legacy/hd.c linux/drivers/ide/legacy/hd.c
--- linux/drivers/ide/legacy/hd.c       2005/04/29 11:15:06     1.20
+++ linux/drivers/ide/legacy/hd.c       2005/07/12 09:19:11     1.21
@@ -156,11 +156,13 @@
 
 
 #if (HD_DELAY > 0)
+
+#include <asm/i8253.h>
+
 unsigned long last_req;
 
 unsigned long read_timer(void)
 {
-        extern spinlock_t i8253_lock;
        unsigned long t, flags;
        int i;
 
diff -urN linux/drivers/ide/pci/alim15x3.c linux/drivers/ide/pci/alim15x3.c
--- linux/drivers/ide/pci/alim15x3.c    2005/01/13 14:06:00     1.20
+++ linux/drivers/ide/pci/alim15x3.c    2005/07/12 09:19:11     1.21
@@ -583,7 +583,7 @@
  *     appropriate also sets up the 1533 southbridge.
  */
   
-static unsigned int __init init_chipset_ali15x3 (struct pci_dev *dev, const 
char *name)
+static unsigned int __devinit init_chipset_ali15x3 (struct pci_dev *dev, const 
char *name)
 {
        unsigned long flags;
        u8 tmpbyte;
@@ -677,7 +677,7 @@
  *     FIXME: frobs bits that are not defined on newer ALi devicea
  */
 
-static unsigned int __init ata66_ali15x3 (ide_hwif_t *hwif)
+static unsigned int __devinit ata66_ali15x3 (ide_hwif_t *hwif)
 {
        struct pci_dev *dev     = hwif->pci_dev;
        unsigned int ata66      = 0;
@@ -748,7 +748,7 @@
  *     Initialize the IDE structure side of the ALi 15x3 driver.
  */
  
-static void __init init_hwif_common_ali15x3 (ide_hwif_t *hwif)
+static void __devinit init_hwif_common_ali15x3 (ide_hwif_t *hwif)
 {
        hwif->autodma = 0;
        hwif->tuneproc = &ali15x3_tune_drive;
@@ -794,7 +794,7 @@
  *     Sparc systems
  */
 
-static void __init init_hwif_ali15x3 (ide_hwif_t *hwif)
+static void __devinit init_hwif_ali15x3 (ide_hwif_t *hwif)
 {
        u8 ideic, inmir;
        s8 irq_routing_table[] = { -1,  9, 3, 10, 4,  5, 7,  6,
@@ -847,7 +847,7 @@
  *     the actual work.
  */
 
-static void __init init_dma_ali15x3 (ide_hwif_t *hwif, unsigned long dmabase)
+static void __devinit init_dma_ali15x3 (ide_hwif_t *hwif, unsigned long 
dmabase)
 {
        if (m5229_revision < 0x20)
                return;
diff -urN linux/drivers/ide/pci/amd74xx.c linux/drivers/ide/pci/amd74xx.c
--- linux/drivers/ide/pci/amd74xx.c     2005/06/07 13:45:32     1.29
+++ linux/drivers/ide/pci/amd74xx.c     2005/07/12 09:19:11     1.30
@@ -73,6 +73,7 @@
        { PCI_DEVICE_ID_NVIDIA_NFORCE_CK804_IDE,        0x50, AMD_UDMA_133 },
        { PCI_DEVICE_ID_NVIDIA_NFORCE_MCP04_IDE,        0x50, AMD_UDMA_133 },
        { PCI_DEVICE_ID_NVIDIA_NFORCE_MCP51_IDE,        0x50, AMD_UDMA_133 },
+       { PCI_DEVICE_ID_NVIDIA_NFORCE_MCP55_IDE,        0x50, AMD_UDMA_133 },
        { 0 }
 };
 
@@ -309,7 +310,7 @@
  * and initialize its drive independent registers.
  */
 
-static unsigned int __init init_chipset_amd74xx(struct pci_dev *dev, const 
char *name)
+static unsigned int __devinit init_chipset_amd74xx(struct pci_dev *dev, const 
char *name)
 {
        unsigned char t;
        unsigned int u;
@@ -413,7 +414,7 @@
        return dev->irq;
 }
 
-static void __init init_hwif_amd74xx(ide_hwif_t *hwif)
+static void __devinit init_hwif_amd74xx(ide_hwif_t *hwif)
 {
        int i;
 
@@ -489,6 +490,7 @@
        /* 13 */ DECLARE_NV_DEV("NFORCE-CK804"),
        /* 14 */ DECLARE_NV_DEV("NFORCE-MCP04"),
        /* 15 */ DECLARE_NV_DEV("NFORCE-MCP51"),
+       /* 16 */ DECLARE_NV_DEV("NFORCE-MCP55"),
 };
 
 static int __devinit amd74xx_probe(struct pci_dev *dev, const struct 
pci_device_id *id)
@@ -524,6 +526,7 @@
        { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_CK804_IDE,  
PCI_ANY_ID, PCI_ANY_ID, 0, 0, 13 },
        { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP04_IDE,  
PCI_ANY_ID, PCI_ANY_ID, 0, 0, 14 },
        { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP51_IDE,  
PCI_ANY_ID, PCI_ANY_ID, 0, 0, 15 },
+       { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP55_IDE,  
PCI_ANY_ID, PCI_ANY_ID, 0, 0, 16 },
        { 0, },
 };
 MODULE_DEVICE_TABLE(pci, amd74xx_pci_tbl);
diff -urN linux/drivers/ide/pci/cs5530.c linux/drivers/ide/pci/cs5530.c
--- linux/drivers/ide/pci/cs5530.c      2005/01/13 14:06:00     1.18
+++ linux/drivers/ide/pci/cs5530.c      2005/07/12 09:19:11     1.19
@@ -217,7 +217,7 @@
  *     Initialize the cs5530 bridge for reliable IDE DMA operation.
  */
 
-static unsigned int __init init_chipset_cs5530 (struct pci_dev *dev, const 
char *name)
+static unsigned int __devinit init_chipset_cs5530 (struct pci_dev *dev, const 
char *name)
 {
        struct pci_dev *master_0 = NULL, *cs5530_0 = NULL;
        unsigned long flags;
@@ -308,7 +308,7 @@
  *     performs channel-specific pre-initialization before drive probing.
  */
 
-static void __init init_hwif_cs5530 (ide_hwif_t *hwif)
+static void __devinit init_hwif_cs5530 (ide_hwif_t *hwif)
 {
        unsigned long basereg;
        u32 d0_timings;
diff -urN linux/drivers/ide/pci/cy82c693.c linux/drivers/ide/pci/cy82c693.c
--- linux/drivers/ide/pci/cy82c693.c    2005/02/13 20:16:23     1.17
+++ linux/drivers/ide/pci/cy82c693.c    2005/07/12 09:19:11     1.18
@@ -391,7 +391,7 @@
 /*
  * this function is called during init and is used to setup the cy82c693 chip
  */
-static unsigned int __init init_chipset_cy82c693(struct pci_dev *dev, const 
char *name)
+static unsigned int __devinit init_chipset_cy82c693(struct pci_dev *dev, const 
char *name)
 {
        if (PCI_FUNC(dev->devfn) != 1)
                return 0;
@@ -443,7 +443,7 @@
 /*
  * the init function - called for each ide channel once
  */
-static void __init init_hwif_cy82c693(ide_hwif_t *hwif)
+static void __devinit init_hwif_cy82c693(ide_hwif_t *hwif)
 {
        hwif->autodma = 0;
 
@@ -467,9 +467,9 @@
        hwif->drives[1].autodma = hwif->autodma;
 }
 
-static __initdata ide_hwif_t *primary;
+static __devinitdata ide_hwif_t *primary;
 
-void __init init_iops_cy82c693(ide_hwif_t *hwif)
+void __devinit init_iops_cy82c693(ide_hwif_t *hwif)
 {
        if (PCI_FUNC(hwif->pci_dev->devfn) == 1)
                primary = hwif;
diff -urN linux/drivers/ide/pci/it8172.c linux/drivers/ide/pci/it8172.c
--- linux/drivers/ide/pci/it8172.c      2005/02/13 20:16:23     1.18
+++ linux/drivers/ide/pci/it8172.c      2005/07/12 09:19:11     1.19
@@ -216,7 +216,7 @@
        return 0;
 }
 
-static unsigned int __init init_chipset_it8172 (struct pci_dev *dev, const 
char *name)
+static unsigned int __devinit init_chipset_it8172 (struct pci_dev *dev, const 
char *name)
 {
        unsigned char progif;
     
@@ -230,7 +230,7 @@
 }
 
 
-static void __init init_hwif_it8172 (ide_hwif_t *hwif)
+static void __devinit init_hwif_it8172 (ide_hwif_t *hwif)
 {
        struct pci_dev* dev = hwif->pci_dev;
        unsigned long cmdBase, ctrlBase;
diff -urN linux/drivers/ide/pci/ns87415.c linux/drivers/ide/pci/ns87415.c
--- linux/drivers/ide/pci/ns87415.c     2005/01/13 14:06:00     1.18
+++ linux/drivers/ide/pci/ns87415.c     2005/07/12 09:19:11     1.19
@@ -195,7 +195,7 @@
        return __ide_dma_check(drive);
 }
 
-static void __init init_hwif_ns87415 (ide_hwif_t *hwif)
+static void __devinit init_hwif_ns87415 (ide_hwif_t *hwif)
 {
        struct pci_dev *dev = hwif->pci_dev;
        unsigned int ctrl, using_inta;
diff -urN linux/drivers/ide/pci/opti621.c linux/drivers/ide/pci/opti621.c
--- linux/drivers/ide/pci/opti621.c     2005/02/13 20:16:23     1.17
+++ linux/drivers/ide/pci/opti621.c     2005/07/12 09:19:11     1.18
@@ -326,7 +326,7 @@
 /*
  * init_hwif_opti621() is called once for each hwif found at boot.
  */
-static void __init init_hwif_opti621 (ide_hwif_t *hwif)
+static void __devinit init_hwif_opti621 (ide_hwif_t *hwif)
 {
        hwif->autodma = 0;
        hwif->drives[0].drive_data = PIO_DONT_KNOW;
diff -urN linux/drivers/ide/pci/sc1200.c linux/drivers/ide/pci/sc1200.c
--- linux/drivers/ide/pci/sc1200.c      2005/04/29 11:15:06     1.20
+++ linux/drivers/ide/pci/sc1200.c      2005/07/12 09:19:11     1.21
@@ -459,7 +459,7 @@
  * This gets invoked by the IDE driver once for each channel,
  * and performs channel-specific pre-initialization before drive probing.
  */
-static void __init init_hwif_sc1200 (ide_hwif_t *hwif)
+static void __devinit init_hwif_sc1200 (ide_hwif_t *hwif)
 {
        if (hwif->mate)
                hwif->serialized = hwif->mate->serialized = 1;
diff -urN linux/drivers/ide/pci/sl82c105.c linux/drivers/ide/pci/sl82c105.c
--- linux/drivers/ide/pci/sl82c105.c    2005/01/13 14:06:00     1.17
+++ linux/drivers/ide/pci/sl82c105.c    2005/07/12 09:19:11     1.18
@@ -386,7 +386,7 @@
  * channel 0 here at least, but channel 1 has to be enabled by
  * firmware or arch code. We still set both to 16 bits mode.
  */
-static unsigned int __init init_chipset_sl82c105(struct pci_dev *dev, const 
char *msg)
+static unsigned int __devinit init_chipset_sl82c105(struct pci_dev *dev, const 
char *msg)
 {
        u32 val;
 
@@ -399,7 +399,7 @@
        return dev->irq;
 }
 
-static void __init init_dma_sl82c105(ide_hwif_t *hwif, unsigned long dma_base)
+static void __devinit init_dma_sl82c105(ide_hwif_t *hwif, unsigned long 
dma_base)
 {
        unsigned int rev;
        u8 dma_state;
@@ -431,7 +431,7 @@
  * Initialise the chip
  */
 
-static void __init init_hwif_sl82c105(ide_hwif_t *hwif)
+static void __devinit init_hwif_sl82c105(ide_hwif_t *hwif)
 {
        struct pci_dev *dev = hwif->pci_dev;
        u32 val;
diff -urN linux/drivers/ide/pci/slc90e66.c linux/drivers/ide/pci/slc90e66.c
--- linux/drivers/ide/pci/slc90e66.c    2005/01/13 14:06:00     1.19
+++ linux/drivers/ide/pci/slc90e66.c    2005/07/12 09:19:11     1.20
@@ -196,7 +196,7 @@
 }
 #endif /* CONFIG_BLK_DEV_IDEDMA */
 
-static void __init init_hwif_slc90e66 (ide_hwif_t *hwif)
+static void __devinit init_hwif_slc90e66 (ide_hwif_t *hwif)
 {
        u8 reg47 = 0;
        u8 mask = hwif->channel ? 0x01 : 0x02;  /* bit0:Primary */
diff -urN linux/drivers/ide/pci/triflex.c linux/drivers/ide/pci/triflex.c
--- linux/drivers/ide/pci/triflex.c     2005/01/13 14:06:00     1.12
+++ linux/drivers/ide/pci/triflex.c     2005/07/12 09:19:11     1.13
@@ -130,7 +130,7 @@
        return hwif->ide_dma_off_quietly(drive);
 }
 
-static void __init init_hwif_triflex(ide_hwif_t *hwif)
+static void __devinit init_hwif_triflex(ide_hwif_t *hwif)
 {
        hwif->tuneproc = &triflex_tune_drive;
        hwif->speedproc = &triflex_tune_chipset;
diff -urN linux/drivers/ide/pci/via82cxxx.c linux/drivers/ide/pci/via82cxxx.c
--- linux/drivers/ide/pci/via82cxxx.c   2005/04/08 18:58:14     1.23
+++ linux/drivers/ide/pci/via82cxxx.c   2005/07/12 09:19:11     1.24
@@ -415,7 +415,7 @@
  *     and initialize its drive independent registers.
  */
 
-static unsigned int __init init_chipset_via82cxxx(struct pci_dev *dev, const 
char *name)
+static unsigned int __devinit init_chipset_via82cxxx(struct pci_dev *dev, 
const char *name)
 {
        struct pci_dev *isa = NULL;
        u8 t, v;
@@ -576,7 +576,7 @@
        return 0;
 }
 
-static void __init init_hwif_via82cxxx(ide_hwif_t *hwif)
+static void __devinit init_hwif_via82cxxx(ide_hwif_t *hwif)
 {
        int i;
 
diff -urN linux/drivers/input/gameport/gameport.c 
linux/drivers/input/gameport/gameport.c
--- linux/drivers/input/gameport/gameport.c     2005/07/11 20:47:08     1.11
+++ linux/drivers/input/gameport/gameport.c     2005/07/12 09:19:12     1.12
@@ -60,12 +60,13 @@
 
 #if defined(__i386__)
 
+#include <asm/i8253.h>
+
 #define DELTA(x,y)      ((y)-(x)+((y)<(x)?1193182/HZ:0))
 #define GET_TIME(x)     do { x = get_time_pit(); } while (0)
 
 static unsigned int get_time_pit(void)
 {
-       extern spinlock_t i8253_lock;
        unsigned long flags;
        unsigned int count;
 
diff -urN linux/drivers/input/joystick/analog.c 
linux/drivers/input/joystick/analog.c
--- linux/drivers/input/joystick/analog.c       2005/03/18 17:37:21     1.14
+++ linux/drivers/input/joystick/analog.c       2005/07/12 09:19:12     1.15
@@ -140,12 +140,14 @@
  */
 
 #ifdef __i386__
+
+#include <asm/i8253.h>
+
 #define GET_TIME(x)    do { if (cpu_has_tsc) rdtscl(x); else x = 
get_time_pit(); } while (0)
 #define DELTA(x,y)     (cpu_has_tsc ? ((y) - (x)) : ((x) - (y) + ((x) < (y) ? 
CLOCK_TICK_RATE / HZ : 0)))
 #define TIME_NAME      (cpu_has_tsc?"TSC":"PIT")
 static unsigned int get_time_pit(void)
 {
-        extern spinlock_t i8253_lock;
         unsigned long flags;
         unsigned int count;
 
diff -urN linux/drivers/mmc/mmci.c linux/drivers/mmc/mmci.c
--- linux/drivers/mmc/mmci.c    2005/04/29 11:15:08     1.6
+++ linux/drivers/mmc/mmci.c    2005/07/12 09:19:12     1.7
@@ -20,6 +20,7 @@
 #include <linux/mmc/host.h>
 #include <linux/mmc/protocol.h>
 
+#include <asm/div64.h>
 #include <asm/io.h>
 #include <asm/irq.h>
 #include <asm/scatterlist.h>
@@ -70,6 +71,7 @@
 static void mmci_start_data(struct mmci_host *host, struct mmc_data *data)
 {
        unsigned int datactrl, timeout, irqmask;
+       unsigned long long clks;
        void __iomem *base;
 
        DBG(host, "blksz %04x blks %04x flags %08x\n",
@@ -81,9 +83,10 @@
 
        mmci_init_sg(host, data);
 
-       timeout = data->timeout_clks +
-                 ((unsigned long long)data->timeout_ns * host->cclk) /
-                  1000000000ULL;
+       clks = (unsigned long long)data->timeout_ns * host->cclk;
+       do_div(clks, 1000000000UL);
+
+       timeout = data->timeout_clks + (unsigned int)clks;
 
        base = host->base;
        writel(timeout, base + MMCIDATATIMER);
diff -urN linux/drivers/mmc/wbsd.c linux/drivers/mmc/wbsd.c
--- linux/drivers/mmc/wbsd.c    2005/05/26 09:12:44     1.5
+++ linux/drivers/mmc/wbsd.c    2005/07/12 09:19:12     1.6
@@ -54,28 +54,6 @@
 #define DBGF(x...)     do { } while (0)
 #endif
 
-#ifdef CONFIG_MMC_DEBUG
-void DBG_REG(int reg, u8 value)
-{
-       int i;
-       
-       printk(KERN_DEBUG "wbsd: Register %d: 0x%02X %3d '%c' ",
-               reg, (int)value, (int)value, (value < 0x20)?'.':value);
-       
-       for (i = 7;i >= 0;i--)
-       {
-               if (value & (1 << i))
-                       printk("x");
-               else
-                       printk(".");
-       }
-       
-       printk("\n");
-}
-#else
-#define DBG_REG(r, v) do {}  while (0)
-#endif
-
 /*
  * Device resources
  */
@@ -92,6 +70,13 @@
 
 #endif /* CONFIG_PNP */
 
+static const int config_ports[] = { 0x2E, 0x4E };
+static const int unlock_codes[] = { 0x83, 0x87 };
+
+static const int valid_ids[] = {
+       0x7112,
+       };
+
 #ifdef CONFIG_PNP
 static unsigned int nopnp = 0;
 #else
@@ -1051,6 +1036,20 @@
 \*****************************************************************************/
 
 /*
+ * Helper function for card detection
+ */
+static void wbsd_detect_card(unsigned long data)
+{
+       struct wbsd_host *host = (struct wbsd_host*)data;
+       
+       BUG_ON(host == NULL);
+       
+       DBG("Executing card detection\n");
+       
+       mmc_detect_change(host->mmc);   
+}
+
+/*
  * Tasklets
  */
 
@@ -1075,7 +1074,6 @@
 {
        struct wbsd_host* host = (struct wbsd_host*)param;
        u8 csr;
-       int change = 0;
        
        spin_lock(&host->lock);
        
@@ -1094,14 +1092,20 @@
                {
                        DBG("Card inserted\n");
                        host->flags |= WBSD_FCARD_PRESENT;
-                       change = 1;
+                       
+                       /*
+                        * Delay card detection to allow electrical connections
+                        * to stabilise.
+                        */
+                       mod_timer(&host->timer, jiffies + HZ/2);
                }
+               
+               spin_unlock(&host->lock);
        }
        else if (host->flags & WBSD_FCARD_PRESENT)
        {
                DBG("Card removed\n");
                host->flags &= ~WBSD_FCARD_PRESENT;
-               change = 1;
                
                if (host->mrq)
                {
@@ -1112,15 +1116,14 @@
                        host->mrq->cmd->error = MMC_ERR_FAILED;
                        tasklet_schedule(&host->finish_tasklet);
                }
-       }
-       
-       /*
-        * Unlock first since we might get a call back.
-        */
-       spin_unlock(&host->lock);
+               
+               /*
+                * Unlock first since we might get a call back.
+                */
+               spin_unlock(&host->lock);
 
-       if (change)
                mmc_detect_change(host->mmc);
+       }
 }
 
 static void wbsd_tasklet_fifo(unsigned long param)
@@ -1325,6 +1328,13 @@
        spin_lock_init(&host->lock);
        
        /*
+        * Set up detection timer
+        */
+       init_timer(&host->timer);
+       host->timer.data = (unsigned long)host;
+       host->timer.function = wbsd_detect_card;
+       
+       /*
         * Maximum number of segments. Worst case is one sector per segment
         * so this will be 64kB/512.
         */
@@ -1351,11 +1361,17 @@
 static void __devexit wbsd_free_mmc(struct device* dev)
 {
        struct mmc_host* mmc;
+       struct wbsd_host* host;
        
        mmc = dev_get_drvdata(dev);
        if (!mmc)
                return;
        
+       host = mmc_priv(mmc);
+       BUG_ON(host == NULL);
+       
+       del_timer_sync(&host->timer);
+       
        mmc_free_host(mmc);
        
        dev_set_drvdata(dev, NULL);
diff -urN linux/drivers/mmc/wbsd.h linux/drivers/mmc/wbsd.h
--- linux/drivers/mmc/wbsd.h    2005/05/26 09:12:44     1.3
+++ linux/drivers/mmc/wbsd.h    2005/07/12 09:19:12     1.4
@@ -8,13 +8,6 @@
  * published by the Free Software Foundation.
  */
 
-const int config_ports[] = { 0x2E, 0x4E };
-const int unlock_codes[] = { 0x83, 0x87 };
-
-const int valid_ids[] = {
-       0x7112,
-       };
-
 #define LOCK_CODE              0xAA
 
 #define WBSD_CONF_SWRST                0x02
@@ -187,4 +180,6 @@
        struct tasklet_struct   timeout_tasklet;
        struct tasklet_struct   finish_tasklet;
        struct tasklet_struct   block_tasklet;
+       
+       struct timer_list       timer;          /* Card detection timer */
 };
diff -urN linux/drivers/mtd/afs.c linux/drivers/mtd/afs.c
--- linux/drivers/mtd/afs.c     2004/07/20 20:21:20     1.6
+++ linux/drivers/mtd/afs.c     2005/07/12 09:19:12     1.7
@@ -219,7 +219,7 @@
         */
        for (idx = off = 0; off < mtd->size; off += mtd->erasesize) {
                struct image_info_struct iis;
-               u_int iis_ptr, img_ptr, size;
+               u_int iis_ptr, img_ptr;
 
                /* Read the footer. */
                ret = afs_read_footer(mtd, &img_ptr, &iis_ptr, off, mask);
@@ -236,21 +236,9 @@
                        continue;
 
                strcpy(str, iis.name);
-               size = mtd->erasesize + off - img_ptr;
-
-               /*
-                * In order to support JFFS2 partitions on this layout,
-                * we must lie to MTD about the real size of JFFS2
-                * partitions; this ensures that the AFS flash footer
-                * won't be erased by JFFS2.  Please ensure that your
-                * JFFS2 partitions are given image numbers between
-                * 1000 and 2000 inclusive.
-                */
-               if (iis.imageNumber >= 1000 && iis.imageNumber < 2000)
-                       size -= mtd->erasesize;
 
                parts[idx].name         = str;
-               parts[idx].size         = size;
+               parts[idx].size         = (iis.length + mtd->erasesize - 1) & 
~(mtd->erasesize - 1);
                parts[idx].offset       = img_ptr;
                parts[idx].mask_flags   = 0;
 
diff -urN linux/drivers/net/shaper.c linux/drivers/net/shaper.c
--- linux/drivers/net/shaper.c  2005/06/07 13:45:34     1.37
+++ linux/drivers/net/shaper.c  2005/07/12 09:19:12     1.38
@@ -135,10 +135,8 @@
 {
        struct shaper *shaper = dev->priv;
        struct sk_buff *ptr;
-   
-       if (down_trylock(&shaper->sem))
-               return -1;
-
+  
+       spin_lock(&shaper->lock);
        ptr=shaper->sendq.prev;
        
        /*
@@ -232,7 +230,7 @@
                 shaper->stats.collisions++;
        }
        shaper_kick(shaper);
-       up(&shaper->sem);
+       spin_unlock(&shaper->lock);
        return 0;
 }
 
@@ -271,11 +269,9 @@
 {
        struct shaper *shaper = (struct shaper *)data;
 
-       if (!down_trylock(&shaper->sem)) {
-               shaper_kick(shaper);
-               up(&shaper->sem);
-       } else
-               mod_timer(&shaper->timer, jiffies);
+       spin_lock(&shaper->lock);
+       shaper_kick(shaper);
+       spin_unlock(&shaper->lock);
 }
 
 /*
@@ -332,21 +328,6 @@
 
 
 /*
- *     Flush the shaper queues on a closedown
- */
- 
-static void shaper_flush(struct shaper *shaper)
-{
-       struct sk_buff *skb;
-
-       down(&shaper->sem);
-       while((skb=skb_dequeue(&shaper->sendq))!=NULL)
-               dev_kfree_skb(skb);
-       shaper_kick(shaper);
-       up(&shaper->sem);
-}
-
-/*
  *     Bring the interface up. We just disallow this until a 
  *     bind.
  */
@@ -375,7 +356,15 @@
 static int shaper_close(struct net_device *dev)
 {
        struct shaper *shaper=dev->priv;
-       shaper_flush(shaper);
+       struct sk_buff *skb;
+
+       while ((skb = skb_dequeue(&shaper->sendq)) != NULL)
+               dev_kfree_skb(skb);
+
+       spin_lock_bh(&shaper->lock);
+       shaper_kick(shaper);
+       spin_unlock_bh(&shaper->lock);
+
        del_timer_sync(&shaper->timer);
        return 0;
 }
@@ -576,6 +565,7 @@
        init_timer(&sh->timer);
        sh->timer.function=shaper_timer;
        sh->timer.data=(unsigned long)sh;
+       spin_lock_init(&sh->lock);
 }
 
 /*
diff -urN linux/drivers/net/skge.h linux/drivers/net/skge.h
--- linux/drivers/net/skge.h    2005/07/11 20:47:28     1.1
+++ linux/drivers/net/skge.h    2005/07/12 09:19:12     1.2
@@ -7,6 +7,7 @@
 /* PCI config registers */
 #define PCI_DEV_REG1   0x40
 #define PCI_DEV_REG2   0x44
+#define  PCI_REV_DESC   0x4
 
 #define PCI_STATUS_ERROR_BITS (PCI_STATUS_DETECTED_PARITY | \
                               PCI_STATUS_SIG_SYSTEM_ERROR | \
diff -urN linux/drivers/net/tg3.c linux/drivers/net/tg3.c
--- linux/drivers/net/tg3.c     2005/07/11 20:47:29     1.63
+++ linux/drivers/net/tg3.c     2005/07/12 09:19:12     1.64
@@ -66,8 +66,8 @@
 
 #define DRV_MODULE_NAME                "tg3"
 #define PFX DRV_MODULE_NAME    ": "
-#define DRV_MODULE_VERSION     "3.32"
-#define DRV_MODULE_RELDATE     "June 24, 2005"
+#define DRV_MODULE_VERSION     "3.33"
+#define DRV_MODULE_RELDATE     "July 5, 2005"
 
 #define TG3_DEF_MAC_MODE       0
 #define TG3_DEF_RX_MODE                0
@@ -5117,7 +5117,7 @@
 }
 
 static void __tg3_set_rx_mode(struct net_device *);
-static void tg3_set_coalesce(struct tg3 *tp, struct ethtool_coalesce *ec)
+static void __tg3_set_coalesce(struct tg3 *tp, struct ethtool_coalesce *ec)
 {
        tw32(HOSTCC_RXCOL_TICKS, ec->rx_coalesce_usecs);
        tw32(HOSTCC_TXCOL_TICKS, ec->tx_coalesce_usecs);
@@ -5460,7 +5460,7 @@
                udelay(10);
        }
 
-       tg3_set_coalesce(tp, &tp->coal);
+       __tg3_set_coalesce(tp, &tp->coal);
 
        /* set status block DMA address */
        tw32(HOSTCC_STATUS_BLK_HOST_ADDR + TG3_64BIT_REG_HIGH,
@@ -7821,6 +7821,60 @@
        return 0;
 }
 
+static int tg3_set_coalesce(struct net_device *dev, struct ethtool_coalesce 
*ec)
+{
+       struct tg3 *tp = netdev_priv(dev);
+       u32 max_rxcoal_tick_int = 0, max_txcoal_tick_int = 0;
+       u32 max_stat_coal_ticks = 0, min_stat_coal_ticks = 0;
+
+       if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS)) {
+               max_rxcoal_tick_int = MAX_RXCOAL_TICK_INT;
+               max_txcoal_tick_int = MAX_TXCOAL_TICK_INT;
+               max_stat_coal_ticks = MAX_STAT_COAL_TICKS;
+               min_stat_coal_ticks = MIN_STAT_COAL_TICKS;
+       }
+
+       if ((ec->rx_coalesce_usecs > MAX_RXCOL_TICKS) ||
+           (ec->tx_coalesce_usecs > MAX_TXCOL_TICKS) ||
+           (ec->rx_max_coalesced_frames > MAX_RXMAX_FRAMES) ||
+           (ec->tx_max_coalesced_frames > MAX_TXMAX_FRAMES) ||
+           (ec->rx_coalesce_usecs_irq > max_rxcoal_tick_int) ||
+           (ec->tx_coalesce_usecs_irq > max_txcoal_tick_int) ||
+           (ec->rx_max_coalesced_frames_irq > MAX_RXCOAL_MAXF_INT) ||
+           (ec->tx_max_coalesced_frames_irq > MAX_TXCOAL_MAXF_INT) ||
+           (ec->stats_block_coalesce_usecs > max_stat_coal_ticks) ||
+           (ec->stats_block_coalesce_usecs < min_stat_coal_ticks))
+               return -EINVAL;
+
+       /* No rx interrupts will be generated if both are zero */
+       if ((ec->rx_coalesce_usecs == 0) &&
+           (ec->rx_max_coalesced_frames == 0))
+               return -EINVAL;
+
+       /* No tx interrupts will be generated if both are zero */
+       if ((ec->tx_coalesce_usecs == 0) &&
+           (ec->tx_max_coalesced_frames == 0))
+               return -EINVAL;
+
+       /* Only copy relevant parameters, ignore all others. */
+       tp->coal.rx_coalesce_usecs = ec->rx_coalesce_usecs;
+       tp->coal.tx_coalesce_usecs = ec->tx_coalesce_usecs;
+       tp->coal.rx_max_coalesced_frames = ec->rx_max_coalesced_frames;
+       tp->coal.tx_max_coalesced_frames = ec->tx_max_coalesced_frames;
+       tp->coal.rx_coalesce_usecs_irq = ec->rx_coalesce_usecs_irq;
+       tp->coal.tx_coalesce_usecs_irq = ec->tx_coalesce_usecs_irq;
+       tp->coal.rx_max_coalesced_frames_irq = ec->rx_max_coalesced_frames_irq;
+       tp->coal.tx_max_coalesced_frames_irq = ec->tx_max_coalesced_frames_irq;
+       tp->coal.stats_block_coalesce_usecs = ec->stats_block_coalesce_usecs;
+
+       if (netif_running(dev)) {
+               tg3_full_lock(tp, 0);
+               __tg3_set_coalesce(tp, &tp->coal);
+               tg3_full_unlock(tp);
+       }
+       return 0;
+}
+
 static struct ethtool_ops tg3_ethtool_ops = {
        .get_settings           = tg3_get_settings,
        .set_settings           = tg3_set_settings,
@@ -7856,6 +7910,7 @@
        .get_stats_count        = tg3_get_stats_count,
        .get_ethtool_stats      = tg3_get_ethtool_stats,
        .get_coalesce           = tg3_get_coalesce,
+       .set_coalesce           = tg3_set_coalesce,
 };
 
 static void __devinit tg3_get_eeprom_size(struct tg3 *tp)
@@ -9800,6 +9855,12 @@
                ec->tx_coalesce_usecs = LOW_TXCOL_TICKS_CLRTCKS;
                ec->tx_coalesce_usecs_irq = DEFAULT_TXCOAL_TICK_INT_CLRTCKS;
        }
+
+       if (tp->tg3_flags2 & TG3_FLG2_5705_PLUS) {
+               ec->rx_coalesce_usecs_irq = 0;
+               ec->tx_coalesce_usecs_irq = 0;
+               ec->stats_block_coalesce_usecs = 0;
+       }
 }
 
 static int __devinit tg3_init_one(struct pci_dev *pdev,
diff -urN linux/drivers/net/tg3.h linux/drivers/net/tg3.h
--- linux/drivers/net/tg3.h     2005/07/11 20:47:29     1.34
+++ linux/drivers/net/tg3.h     2005/07/12 09:19:13     1.35
@@ -879,31 +879,41 @@
 #define  LOW_RXCOL_TICKS_CLRTCKS        0x00000014
 #define  DEFAULT_RXCOL_TICKS            0x00000048
 #define  HIGH_RXCOL_TICKS               0x00000096
+#define  MAX_RXCOL_TICKS                0x000003ff
 #define HOSTCC_TXCOL_TICKS             0x00003c0c
 #define  LOW_TXCOL_TICKS                0x00000096
 #define  LOW_TXCOL_TICKS_CLRTCKS        0x00000048
 #define  DEFAULT_TXCOL_TICKS            0x0000012c
 #define  HIGH_TXCOL_TICKS               0x00000145
+#define  MAX_TXCOL_TICKS                0x000003ff
 #define HOSTCC_RXMAX_FRAMES            0x00003c10
 #define  LOW_RXMAX_FRAMES               0x00000005
 #define  DEFAULT_RXMAX_FRAMES           0x00000008
 #define  HIGH_RXMAX_FRAMES              0x00000012
+#define  MAX_RXMAX_FRAMES               0x000000ff
 #define HOSTCC_TXMAX_FRAMES            0x00003c14
 #define  LOW_TXMAX_FRAMES               0x00000035
 #define  DEFAULT_TXMAX_FRAMES           0x0000004b
 #define  HIGH_TXMAX_FRAMES              0x00000052
+#define  MAX_TXMAX_FRAMES               0x000000ff
 #define HOSTCC_RXCOAL_TICK_INT         0x00003c18
 #define  DEFAULT_RXCOAL_TICK_INT        0x00000019
 #define  DEFAULT_RXCOAL_TICK_INT_CLRTCKS 0x00000014
+#define  MAX_RXCOAL_TICK_INT            0x000003ff
 #define HOSTCC_TXCOAL_TICK_INT         0x00003c1c
 #define  DEFAULT_TXCOAL_TICK_INT        0x00000019
 #define  DEFAULT_TXCOAL_TICK_INT_CLRTCKS 0x00000014
+#define  MAX_TXCOAL_TICK_INT            0x000003ff
 #define HOSTCC_RXCOAL_MAXF_INT         0x00003c20
 #define  DEFAULT_RXCOAL_MAXF_INT        0x00000005
+#define  MAX_RXCOAL_MAXF_INT            0x000000ff
 #define HOSTCC_TXCOAL_MAXF_INT         0x00003c24
 #define  DEFAULT_TXCOAL_MAXF_INT        0x00000005
+#define  MAX_TXCOAL_MAXF_INT            0x000000ff
 #define HOSTCC_STAT_COAL_TICKS         0x00003c28
 #define  DEFAULT_STAT_COAL_TICKS        0x000f4240
+#define  MAX_STAT_COAL_TICKS            0xd693d400
+#define  MIN_STAT_COAL_TICKS            0x00000064
 /* 0x3c2c --> 0x3c30 unused */
 #define HOSTCC_STATS_BLK_HOST_ADDR     0x00003c30 /* 64-bit */
 #define HOSTCC_STATUS_BLK_HOST_ADDR    0x00003c38 /* 64-bit */
diff -urN linux/drivers/net/arm/etherh.c linux/drivers/net/arm/etherh.c
--- linux/drivers/net/arm/etherh.c      2005/07/11 20:47:33     1.11
+++ linux/drivers/net/arm/etherh.c      2005/07/12 09:19:15     1.12
@@ -68,7 +68,6 @@
        void __iomem    *dma_base;
        unsigned int    id;
        void __iomem    *ctrl_port;
-       void __iomem    *base;
        unsigned char   ctrl;
        u32             supported;
 };
@@ -178,7 +177,7 @@
        switch (etherh_priv(dev)->id) {
        case PROD_I3_ETHERLAN600:
        case PROD_I3_ETHERLAN600A:
-               addr = etherh_priv(dev)->base + EN0_RCNTHI;
+               addr = (void *)dev->base_addr + EN0_RCNTHI;
 
                switch (dev->if_port) {
                case IF_PORT_10BASE2:
@@ -219,7 +218,7 @@
        switch (etherh_priv(dev)->id) {
        case PROD_I3_ETHERLAN600:
        case PROD_I3_ETHERLAN600A:
-               addr = etherh_priv(dev)->base + EN0_RCNTHI;
+               addr = (void *)dev->base_addr + EN0_RCNTHI;
                switch (dev->if_port) {
                case IF_PORT_10BASE2:
                        stat = 1;
@@ -282,7 +281,7 @@
 etherh_reset(struct net_device *dev)
 {
        struct ei_device *ei_local = netdev_priv(dev);
-       void __iomem *addr = etherh_priv(dev)->base;
+       void __iomem *addr = (void *)dev->base_addr;
 
        writeb(E8390_NODMA+E8390_PAGE0+E8390_STOP, addr);
 
@@ -328,7 +327,7 @@
 
        ei_local->dmaing = 1;
 
-       addr = etherh_priv(dev)->base;
+       addr = (void *)dev->base_addr;
        dma_base = etherh_priv(dev)->dma_base;
 
        count = (count + 1) & ~1;
@@ -388,7 +387,7 @@
 
        ei_local->dmaing = 1;
 
-       addr = etherh_priv(dev)->base;
+       addr = (void *)dev->base_addr;
        dma_base = etherh_priv(dev)->dma_base;
 
        buf = skb->data;
@@ -428,7 +427,7 @@
 
        ei_local->dmaing = 1;
 
-       addr = etherh_priv(dev)->base;
+       addr = (void *)dev->base_addr;
        dma_base = etherh_priv(dev)->dma_base;
 
        writeb (E8390_NODMA | E8390_PAGE0 | E8390_START, addr + E8390_CMD);
@@ -697,8 +696,7 @@
                eh->ctrl_port = eh->ioc_fast;
        }
 
-       eh->base = eh->memc + data->ns8390_offset;
-       dev->base_addr = (unsigned long)eh->base;
+       dev->base_addr = (unsigned long)eh->memc + data->ns8390_offset;
        eh->dma_base = eh->memc + data->dataport_offset;
        eh->ctrl_port += data->ctrlport_offset;
 
diff -urN linux/drivers/parport/parport_pc.c linux/drivers/parport/parport_pc.c
--- linux/drivers/parport/parport_pc.c  2005/07/11 20:47:42     1.77
+++ linux/drivers/parport/parport_pc.c  2005/07/12 09:19:15     1.78
@@ -3008,7 +3008,7 @@
        int ret = 0;
 
        while ((pdev = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, pdev)) != NULL) {
-               id = pci_match_device (parport_pc_pci_tbl, pdev);
+               id = pci_match_id(parport_pc_pci_tbl, pdev);
                if (id == NULL || id->driver_data >= last_sio)
                        continue;
 
diff -urN linux/drivers/pci/Makefile linux/drivers/pci/Makefile
--- linux/drivers/pci/Makefile  2005/04/08 18:58:21     1.49
+++ linux/drivers/pci/Makefile  2005/07/12 09:19:15     1.50
@@ -19,6 +19,7 @@
 #
 # Some architectures use the generic PCI setup functions
 #
+obj-$(CONFIG_X86) += setup-bus.o
 obj-$(CONFIG_ALPHA) += setup-bus.o setup-irq.o
 obj-$(CONFIG_ARM) += setup-bus.o setup-irq.o
 obj-$(CONFIG_PARISC) += setup-bus.o
diff -urN linux/drivers/pci/hotplug.c linux/drivers/pci/hotplug.c
--- linux/drivers/pci/hotplug.c 2005/05/26 09:12:45     1.21
+++ linux/drivers/pci/hotplug.c 2005/07/12 09:19:15     1.22
@@ -54,7 +54,7 @@
 
        envp[i++] = scratch;
        length += scnprintf (scratch, buffer_size - length,
-                           
"MODALIAS=pci:v%08Xd%08Xsv%08Xsd%08Xbc%02Xsc%02Xi%02x\n",
+                           
"MODALIAS=pci:v%08Xd%08Xsv%08Xsd%08Xbc%02Xsc%02Xi%02x",
                            pdev->vendor, pdev->device,
                            pdev->subsystem_vendor, pdev->subsystem_device,
                            (u8)(pdev->class >> 16), (u8)(pdev->class >> 8),
diff -urN linux/drivers/pci/pci-driver.c linux/drivers/pci/pci-driver.c
--- linux/drivers/pci/pci-driver.c      2005/07/11 20:47:42     1.33
+++ linux/drivers/pci/pci-driver.c      2005/07/12 09:19:15     1.34
@@ -7,7 +7,6 @@
 #include <linux/module.h>
 #include <linux/init.h>
 #include <linux/device.h>
-#include <linux/pci-dynids.h>
 #include "pci.h"
 
 /*
@@ -19,35 +18,11 @@
  */
 
 #ifdef CONFIG_HOTPLUG
-/**
- * pci_device_probe_dynamic()
- *
- * Walk the dynamic ID list looking for a match.
- * returns 0 and sets pci_dev->driver when drv claims pci_dev, else error.
- */
-static int
-pci_device_probe_dynamic(struct pci_driver *drv, struct pci_dev *pci_dev)
-{
-       int error = -ENODEV;
-       struct list_head *pos;
-       struct dynid *dynid;
 
-       spin_lock(&drv->dynids.lock);
-       list_for_each(pos, &drv->dynids.list) {
-               dynid = list_entry(pos, struct dynid, node);
-               if (pci_match_one_device(&dynid->id, pci_dev)) {
-                       spin_unlock(&drv->dynids.lock);
-                       error = drv->probe(pci_dev, &dynid->id);
-                       if (error >= 0) {
-                               pci_dev->driver = drv;
-                               return 0;
-                       }
-                       return error;
-               }
-       }
-       spin_unlock(&drv->dynids.lock);
-       return error;
-}
+struct pci_dynid {
+       struct list_head node;
+       struct pci_device_id id;
+};
 
 /**
  * store_new_id
@@ -58,8 +33,7 @@
 static inline ssize_t
 store_new_id(struct device_driver *driver, const char *buf, size_t count)
 {
-       struct dynid *dynid;
-       struct bus_type * bus;
+       struct pci_dynid *dynid;
        struct pci_driver *pdrv = to_pci_driver(driver);
        __u32 vendor=PCI_ANY_ID, device=PCI_ANY_ID, subvendor=PCI_ANY_ID,
                subdevice=PCI_ANY_ID, class=0, class_mask=0;
@@ -91,37 +65,22 @@
        list_add_tail(&pdrv->dynids.list, &dynid->node);
        spin_unlock(&pdrv->dynids.lock);
 
-       bus = get_bus(pdrv->driver.bus);
-       if (bus) {
-               if (get_driver(&pdrv->driver)) {
-                       down_write(&bus->subsys.rwsem);
-                       driver_attach(&pdrv->driver);
-                       up_write(&bus->subsys.rwsem);
-                       put_driver(&pdrv->driver);
-               }
-               put_bus(bus);
+       if (get_driver(&pdrv->driver)) {
+               driver_attach(&pdrv->driver);
+               put_driver(&pdrv->driver);
        }
 
        return count;
 }
-
 static DRIVER_ATTR(new_id, S_IWUSR, NULL, store_new_id);
-static inline void
-pci_init_dynids(struct pci_dynids *dynids)
-{
-       spin_lock_init(&dynids->lock);
-       INIT_LIST_HEAD(&dynids->list);
-}
 
 static void
 pci_free_dynids(struct pci_driver *drv)
 {
-       struct list_head *pos, *n;
-       struct dynid *dynid;
+       struct pci_dynid *dynid, *n;
 
        spin_lock(&drv->dynids.lock);
-       list_for_each_safe(pos, n, &drv->dynids.list) {
-               dynid = list_entry(pos, struct dynid, node);
+       list_for_each_entry_safe(dynid, n, &drv->dynids.list, node) {
                list_del(&dynid->node);
                kfree(dynid);
        }
@@ -138,83 +97,70 @@
        return error;
 }
 
-static int
-pci_bus_match_dynids(const struct pci_dev *pci_dev, struct pci_driver *pci_drv)
-{
-       struct list_head *pos;
-       struct dynid *dynid;
-
-       spin_lock(&pci_drv->dynids.lock);
-       list_for_each(pos, &pci_drv->dynids.list) {
-               dynid = list_entry(pos, struct dynid, node);
-               if (pci_match_one_device(&dynid->id, pci_dev)) {
-                       spin_unlock(&pci_drv->dynids.lock);
-                       return 1;
-               }
-       }
-       spin_unlock(&pci_drv->dynids.lock);
-       return 0;
-}
-
 #else /* !CONFIG_HOTPLUG */
-static inline int pci_device_probe_dynamic(struct pci_driver *drv, struct 
pci_dev *pci_dev)
-{
-       return -ENODEV;
-}
-static inline void pci_init_dynids(struct pci_dynids *dynids) {}
 static inline void pci_free_dynids(struct pci_driver *drv) {}
 static inline int pci_create_newid_file(struct pci_driver *drv)
 {
        return 0;
 }
-static inline int pci_bus_match_dynids(const struct pci_dev *pci_dev, struct 
pci_driver *pci_drv)
-{
-       return 0;
-}
 #endif
 
 /**
- * pci_match_device - Tell if a PCI device structure has a matching
- *                    PCI device id structure
+ * pci_match_id - See if a pci device matches a given pci_id table
  * @ids: array of PCI device id structures to search in
- * @dev: the PCI device structure to match against
- * 
+ * @dev: the PCI device structure to match against.
+ *
  * Used by a driver to check whether a PCI device present in the
- * system is in its list of supported devices.Returns the matching
+ * system is in its list of supported devices.  Returns the matching
  * pci_device_id structure or %NULL if there is no match.
+ *
+ * Depreciated, don't use this as it will not catch any dynamic ids
+ * that a driver might want to check for.
  */
-const struct pci_device_id *
-pci_match_device(const struct pci_device_id *ids, const struct pci_dev *dev)
+const struct pci_device_id *pci_match_id(const struct pci_device_id *ids,
+                                        struct pci_dev *dev)
 {
-       while (ids->vendor || ids->subvendor || ids->class_mask) {
-               if (pci_match_one_device(ids, dev))
-                       return ids;
-               ids++;
+       if (ids) {
+               while (ids->vendor || ids->subvendor || ids->class_mask) {
+                       if (pci_match_one_device(ids, dev))
+                               return ids;
+                       ids++;
+               }
        }
        return NULL;
 }
 
 /**
- * pci_device_probe_static()
- * 
- * returns 0 and sets pci_dev->driver when drv claims pci_dev, else error.
+ * pci_match_device - Tell if a PCI device structure has a matching
+ *                    PCI device id structure
+ * @ids: array of PCI device id structures to search in
+ * @dev: the PCI device structure to match against
+ * @drv: the PCI driver to match against
+ *
+ * Used by a driver to check whether a PCI device present in the
+ * system is in its list of supported devices.  Returns the matching
+ * pci_device_id structure or %NULL if there is no match.
  */
-static int
-pci_device_probe_static(struct pci_driver *drv, struct pci_dev *pci_dev)
-{                 
-       int error = -ENODEV;
+const struct pci_device_id *pci_match_device(struct pci_driver *drv,
+                                            struct pci_dev *dev)
+{
        const struct pci_device_id *id;
+       struct pci_dynid *dynid;
 
-       if (!drv->id_table)
-               return error;
-       id = pci_match_device(drv->id_table, pci_dev);
+       id = pci_match_id(drv->id_table, dev);
        if (id)
-               error = drv->probe(pci_dev, id);
-       if (error >= 0) {
-               pci_dev->driver = drv;
-               error = 0;
+               return id;
+
+       /* static ids didn't match, lets look at the dynamic ones */
+       spin_lock(&drv->dynids.lock);
+       list_for_each_entry(dynid, &drv->dynids.list, node) {
+               if (pci_match_one_device(&dynid->id, dev)) {
+                       spin_unlock(&drv->dynids.lock);
+                       return &dynid->id;
+               }
        }
-       return error;
+       spin_unlock(&drv->dynids.lock);
+       return NULL;
 }
 
 /**
@@ -225,13 +171,20 @@
  */
 static int
 __pci_device_probe(struct pci_driver *drv, struct pci_dev *pci_dev)
-{                 
+{
+       const struct pci_device_id *id;
        int error = 0;
 
        if (!pci_dev->driver && drv->probe) {
-               error = pci_device_probe_static(drv, pci_dev);
-               if (error == -ENODEV)
-                       error = pci_device_probe_dynamic(drv, pci_dev);
+               error = -ENODEV;
+
+               id = pci_match_device(drv, pci_dev);
+               if (id)
+                       error = drv->probe(pci_dev, id);
+               if (error >= 0) {
+                       pci_dev->driver = drv;
+                       error = 0;
+               }
        }
        return error;
 }
@@ -371,12 +324,6 @@
        .sysfs_ops = &pci_driver_sysfs_ops,
 };
 
-static int
-pci_populate_driver_dir(struct pci_driver *drv)
-{
-       return pci_create_newid_file(drv);
-}
-
 /**
  * pci_register_driver - register a new pci driver
  * @drv: the driver structure to register
@@ -401,13 +348,15 @@
                drv->driver.shutdown = pci_device_shutdown;
        drv->driver.owner = drv->owner;
        drv->driver.kobj.ktype = &pci_driver_kobj_type;
-       pci_init_dynids(&drv->dynids);
+
+       spin_lock_init(&drv->dynids.lock);
+       INIT_LIST_HEAD(&drv->dynids.list);
 
        /* register with core */
        error = driver_register(&drv->driver);
 
        if (!error)
-               pci_populate_driver_dir(drv);
+               error = pci_create_newid_file(drv);
 
        return error;
 }
@@ -463,21 +412,17 @@
  * system is in its list of supported devices.Returns the matching
  * pci_device_id structure or %NULL if there is no match.
  */
-static int pci_bus_match(struct device * dev, struct device_driver * drv) 
+static int pci_bus_match(struct device *dev, struct device_driver *drv)
 {
-       const struct pci_dev * pci_dev = to_pci_dev(dev);
-       struct pci_driver * pci_drv = to_pci_driver(drv);
-       const struct pci_device_id * ids = pci_drv->id_table;
+       struct pci_dev *pci_dev = to_pci_dev(dev);
+       struct pci_driver *pci_drv = to_pci_driver(drv);
        const struct pci_device_id *found_id;
 
-       if (!ids)
-               return 0;
-
-       found_id = pci_match_device(ids, pci_dev);
+       found_id = pci_match_device(pci_drv, pci_dev);
        if (found_id)
                return 1;
 
-       return pci_bus_match_dynids(pci_dev, pci_drv);
+       return 0;
 }
 
 /**
@@ -536,6 +481,7 @@
 
 postcore_initcall(pci_driver_init);
 
+EXPORT_SYMBOL(pci_match_id);
 EXPORT_SYMBOL(pci_match_device);
 EXPORT_SYMBOL(pci_register_driver);
 EXPORT_SYMBOL(pci_unregister_driver);
diff -urN linux/drivers/pci/pci.c linux/drivers/pci/pci.c
--- linux/drivers/pci/pci.c     2005/05/19 12:08:27     1.84
+++ linux/drivers/pci/pci.c     2005/07/12 09:19:15     1.85
@@ -334,10 +334,6 @@
 /**
  * pci_save_state - save the PCI configuration space of a device before 
suspending
  * @dev: - PCI device that we're dealing with
- * @buffer: - buffer to hold config space context
- *
- * @buffer must be large enough to hold the entire PCI 2.2 config space 
- * (>= 64 bytes).
  */
 int
 pci_save_state(struct pci_dev *dev)
@@ -352,8 +348,6 @@
 /** 
  * pci_restore_state - Restore the saved state of a PCI device
  * @dev: - PCI device that we're dealing with
- * @buffer: - saved PCI config space
- *
  */
 int 
 pci_restore_state(struct pci_dev *dev)
diff -urN linux/drivers/pci/probe.c linux/drivers/pci/probe.c
--- linux/drivers/pci/probe.c   2005/07/11 20:47:42     1.47
+++ linux/drivers/pci/probe.c   2005/07/12 09:19:15     1.48
@@ -239,9 +239,8 @@
 
        if (dev->transparent) {
                printk(KERN_INFO "PCI: Transparent bridge - %s\n", 
pci_name(dev));
-               for(i = 0; i < PCI_BUS_NUM_RESOURCES; i++)
-                       child->resource[i] = child->parent->resource[i];
-               return;
+               for(i = 3; i < PCI_BUS_NUM_RESOURCES; i++)
+                       child->resource[i] = child->parent->resource[i - 3];
        }
 
        for(i=0; i<3; i++)
@@ -398,6 +397,16 @@
        pci_write_config_word(dev, rpcap + PCI_EXP_RTCTL, rpctl);
 }
 
+static void __devinit pci_fixup_parent_subordinate_busnr(struct pci_bus 
*child, int max)
+{
+       struct pci_bus *parent = child->parent;
+       while (parent->parent && parent->subordinate < max) {
+               parent->subordinate = max;
+               pci_write_config_byte(parent->self, PCI_SUBORDINATE_BUS, max);
+               parent = parent->parent;
+       }
+}
+
 unsigned int __devinit pci_scan_child_bus(struct pci_bus *bus);
 
 /*
@@ -499,7 +508,13 @@
 
                if (!is_cardbus) {
                        child->bridge_ctl = PCI_BRIDGE_CTL_NO_ISA;
-
+                       /*
+                        * Adjust subordinate busnr in parent buses.
+                        * We do this before scanning for children because
+                        * some devices may not be detected if the bios
+                        * was lazy.
+                        */
+                       pci_fixup_parent_subordinate_busnr(child, max);
                        /* Now we can scan all subordinate buses... */
                        max = pci_scan_child_bus(child);
                } else {
@@ -513,6 +528,7 @@
                                                        max+i+1))
                                        break;
                        max += i;
+                       pci_fixup_parent_subordinate_busnr(child, max);
                }
                /*
                 * Set the subordinate bus number to its real value.
diff -urN linux/drivers/pci/quirks.c linux/drivers/pci/quirks.c
--- linux/drivers/pci/quirks.c  2005/06/18 14:42:48     1.66
+++ linux/drivers/pci/quirks.c  2005/07/12 09:19:15     1.67
@@ -767,6 +767,7 @@
        if (unlikely(dev->subsystem_vendor == PCI_VENDOR_ID_ASUSTEK)) {
                if (dev->device == PCI_DEVICE_ID_INTEL_82845_HB)
                        switch(dev->subsystem_device) {
+                       case 0x8025: /* P4B-LX */
                        case 0x8070: /* P4B */
                        case 0x8088: /* P4B533 */
                        case 0x1626: /* L3C notebook */
diff -urN linux/drivers/pci/setup-bus.c linux/drivers/pci/setup-bus.c
--- linux/drivers/pci/setup-bus.c       2005/07/11 20:47:42     1.22
+++ linux/drivers/pci/setup-bus.c       2005/07/12 09:19:15     1.23
@@ -273,6 +273,8 @@
 
        for (i = 0; i < PCI_BUS_NUM_RESOURCES; i++) {
                r = bus->resource[i];
+               if (r == &ioport_resource || r == &iomem_resource)
+                       continue;
                if (r && (r->flags & type_mask) == type && !r->parent)
                        return r;
        }
diff -urN linux/drivers/pci/pcie/portdrv.h linux/drivers/pci/pcie/portdrv.h
--- linux/drivers/pci/pcie/portdrv.h    2005/04/29 11:15:09     1.3
+++ linux/drivers/pci/pcie/portdrv.h    2005/07/12 09:19:16     1.4
@@ -27,6 +27,11 @@
 
 #define get_descriptor_id(type, service) (((type - 4) << 4) | service)
 
+struct pcie_port_device_ext {
+       int interrupt_mode;     /* [0:INTx | 1:MSI | 2:MSI-X] */
+       unsigned int saved_msi_config_space[5];
+};
+
 extern struct bus_type pcie_port_bus_type;
 extern int pcie_port_device_probe(struct pci_dev *dev);
 extern int pcie_port_device_register(struct pci_dev *dev);
diff -urN linux/drivers/pci/pcie/portdrv_core.c 
linux/drivers/pci/pcie/portdrv_core.c
--- linux/drivers/pci/pcie/portdrv_core.c       2005/07/11 20:47:43     1.4
+++ linux/drivers/pci/pcie/portdrv_core.c       2005/07/12 09:19:16     1.5
@@ -275,10 +275,17 @@
 
 int pcie_port_device_register(struct pci_dev *dev)
 {
+       struct pcie_port_device_ext *p_ext;
        int status, type, capabilities, irq_mode, i;
        int vectors[PCIE_PORT_DEVICE_MAXSERVICES];
        u16 reg16;
 
+       /* Allocate port device extension */
+       if (!(p_ext = kmalloc(sizeof(struct pcie_port_device_ext), GFP_KERNEL)))
+               return -ENOMEM;
+
+       pci_set_drvdata(dev, p_ext);
+
        /* Get port type */
        pci_read_config_word(dev,
                pci_find_capability(dev, PCI_CAP_ID_EXP) +
@@ -288,6 +295,7 @@
        /* Now get port services */
        capabilities = get_port_device_capability(dev);
        irq_mode = assign_interrupt_mode(dev, vectors, capabilities);
+       p_ext->interrupt_mode = irq_mode;
 
        /* Allocate child services if any */
        for (i = 0; i < PCIE_PORT_DEVICE_MAXSERVICES; i++) {
diff -urN linux/drivers/pci/pcie/portdrv_pci.c 
linux/drivers/pci/pcie/portdrv_pci.c
--- linux/drivers/pci/pcie/portdrv_pci.c        2005/04/29 11:15:09     1.4
+++ linux/drivers/pci/pcie/portdrv_pci.c        2005/07/12 09:19:16     1.5
@@ -29,6 +29,78 @@
 /* global data */
 static const char device_name[] = "pcieport-driver";
 
+static void pci_save_msi_state(struct pci_dev *dev)
+{
+       struct pcie_port_device_ext *p_ext = pci_get_drvdata(dev);
+       int i = 0, pos;
+       u16 control;
+
+       if ((pos = pci_find_capability(dev, PCI_CAP_ID_MSI)) <= 0)
+               return;
+
+       pci_read_config_dword(dev, pos, &p_ext->saved_msi_config_space[i++]);
+       control = p_ext->saved_msi_config_space[0] >> 16;
+       pci_read_config_dword(dev, pos + PCI_MSI_ADDRESS_LO,
+               &p_ext->saved_msi_config_space[i++]);
+       if (control & PCI_MSI_FLAGS_64BIT) {
+               pci_read_config_dword(dev, pos + PCI_MSI_ADDRESS_HI,
+                       &p_ext->saved_msi_config_space[i++]);
+               pci_read_config_dword(dev, pos + PCI_MSI_DATA_64,
+                       &p_ext->saved_msi_config_space[i++]);
+       } else
+               pci_read_config_dword(dev, pos + PCI_MSI_DATA_32,
+                       &p_ext->saved_msi_config_space[i++]);
+       if (control & PCI_MSI_FLAGS_MASKBIT)
+               pci_read_config_dword(dev, pos + PCI_MSI_MASK_BIT,
+                       &p_ext->saved_msi_config_space[i++]);
+}
+
+static void pci_restore_msi_state(struct pci_dev *dev)
+{
+       struct pcie_port_device_ext *p_ext = pci_get_drvdata(dev);
+       int i = 0, pos;
+       u16 control;
+
+       if ((pos = pci_find_capability(dev, PCI_CAP_ID_MSI)) <= 0)
+               return;
+
+       control = p_ext->saved_msi_config_space[i++] >> 16;
+       pci_write_config_word(dev, pos + PCI_MSI_FLAGS, control);
+       pci_write_config_dword(dev, pos + PCI_MSI_ADDRESS_LO,
+               p_ext->saved_msi_config_space[i++]);
+       if (control & PCI_MSI_FLAGS_64BIT) {
+               pci_write_config_dword(dev, pos + PCI_MSI_ADDRESS_HI,
+                       p_ext->saved_msi_config_space[i++]);
+               pci_write_config_dword(dev, pos + PCI_MSI_DATA_64,
+                       p_ext->saved_msi_config_space[i++]);
+       } else
+               pci_write_config_dword(dev, pos + PCI_MSI_DATA_32,
+                       p_ext->saved_msi_config_space[i++]);
+       if (control & PCI_MSI_FLAGS_MASKBIT)
+               pci_write_config_dword(dev, pos + PCI_MSI_MASK_BIT,
+                       p_ext->saved_msi_config_space[i++]);
+}
+
+static void pcie_portdrv_save_config(struct pci_dev *dev)
+{
+       struct pcie_port_device_ext *p_ext = pci_get_drvdata(dev);
+
+       pci_save_state(dev);
+       if (p_ext->interrupt_mode == PCIE_PORT_MSI_MODE)
+               pci_save_msi_state(dev);
+}
+
+static void pcie_portdrv_restore_config(struct pci_dev *dev)
+{
+       struct pcie_port_device_ext *p_ext = pci_get_drvdata(dev);
+
+       pci_restore_state(dev);
+       if (p_ext->interrupt_mode == PCIE_PORT_MSI_MODE)
+               pci_restore_msi_state(dev);
+       pci_enable_device(dev);
+       pci_set_master(dev);
+}
+
 /*
  * pcie_portdrv_probe - Probe PCI-Express port devices
  * @dev: PCI-Express port device being probed
@@ -64,16 +136,21 @@
 static void pcie_portdrv_remove (struct pci_dev *dev)
 {
        pcie_port_device_remove(dev);
+       kfree(pci_get_drvdata(dev));
 }
 
 #ifdef CONFIG_PM
 static int pcie_portdrv_suspend (struct pci_dev *dev, pm_message_t state)
 {
-       return pcie_port_device_suspend(dev, state);
+       int ret = pcie_port_device_suspend(dev, state);
+
+       pcie_portdrv_save_config(dev);
+       return ret;
 }
 
 static int pcie_portdrv_resume (struct pci_dev *dev)
 {
+       pcie_portdrv_restore_config(dev);
        return pcie_port_device_resume(dev);
 }
 #endif
diff -urN linux/drivers/pcmcia/ds.c linux/drivers/pcmcia/ds.c
--- linux/drivers/pcmcia/ds.c   2005/07/11 20:47:44     1.46
+++ linux/drivers/pcmcia/ds.c   2005/07/12 09:19:16     1.47
@@ -847,7 +847,7 @@
 pcmcia_device_stringattr(prod_id3, prod_id[2]);
 pcmcia_device_stringattr(prod_id4, prod_id[3]);
 
-static ssize_t modalias_show(struct device *dev, char *buf)
+static ssize_t modalias_show(struct device *dev, struct device_attribute 
*attr, char *buf)
 {
        struct pcmcia_device *p_dev = to_pcmcia_dev(dev);
        int i;
diff -urN linux/drivers/sbus/char/bpp.c linux/drivers/sbus/char/bpp.c
--- linux/drivers/sbus/char/bpp.c       2005/01/25 04:28:41     1.38
+++ linux/drivers/sbus/char/bpp.c       2005/07/12 09:19:16     1.39
@@ -79,10 +79,6 @@
 
       unsigned char run_length;
       unsigned char repeat_byte;
-
-      /* These members manage timeouts for programmed delays */
-      wait_queue_head_t wait_queue;
-      struct timer_list timer_list;
 };
 
 static struct inst instances[BPP_NO];
@@ -297,16 +293,10 @@
 
 #endif /* __sparc__ */
 
-static void bpp_wake_up(unsigned long val)
-{ wake_up(&instances[val].wait_queue); }
-
 static void snooze(unsigned long snooze_time, unsigned minor)
 {
-      init_timer(&instances[minor].timer_list);
-      instances[minor].timer_list.expires = jiffies + snooze_time + 1;
-      instances[minor].timer_list.data    = minor;
-      add_timer(&instances[minor].timer_list);
-      sleep_on (&instances[minor].wait_queue);
+       set_current_state(TASK_UNINTERRUPTIBLE);
+       schedule_timeout(snooze_time + 1);
 }
 
 static int wait_for(unsigned short set, unsigned short clr,
@@ -880,11 +870,8 @@
       instances[idx].enhanced = 0;
       instances[idx].direction = 0;
       instances[idx].mode = COMPATIBILITY;
-      instances[idx].wait_queue = 0;
       instances[idx].run_length = 0;
       instances[idx].run_flag = 0;
-      init_timer(&instances[idx].timer_list);
-      instances[idx].timer_list.function = bpp_wake_up;
       if (!request_region(lpAddr,3, dev_name)) return;
 
       /*
@@ -977,11 +964,8 @@
       instances[idx].enhanced = 0;
       instances[idx].direction = 0;
       instances[idx].mode = COMPATIBILITY;
-      init_waitqueue_head(&instances[idx].wait_queue);
       instances[idx].run_length = 0;
       instances[idx].run_flag = 0;
-      init_timer(&instances[idx].timer_list);
-      instances[idx].timer_list.function = bpp_wake_up;
 
       if (!rp) return;
 
diff -urN linux/drivers/serial/8250.c linux/drivers/serial/8250.c
--- linux/drivers/serial/8250.c 2005/07/11 20:48:02     1.38
+++ linux/drivers/serial/8250.c 2005/07/12 09:19:16     1.39
@@ -105,7 +105,7 @@
        SERIAL_PORT_DFNS /* defined in asm/serial.h */
 };
 
-#define UART_NR        (ARRAY_SIZE(old_serial_port) + 
CONFIG_SERIAL_8250_NR_UARTS)
+#define UART_NR        CONFIG_SERIAL_8250_NR_UARTS
 
 #ifdef CONFIG_SERIAL_8250_RSA
 
@@ -993,21 +993,24 @@
        up->port.irq = (irq > 0) ? irq : 0;
 }
 
+static inline void __stop_tx(struct uart_8250_port *p)
+{
+       if (p->ier & UART_IER_THRI) {
+               p->ier &= ~UART_IER_THRI;
+               serial_out(p, UART_IER, p->ier);
+       }
+}
+
 static void serial8250_stop_tx(struct uart_port *port, unsigned int tty_stop)
 {
        struct uart_8250_port *up = (struct uart_8250_port *)port;
 
-       if (up->ier & UART_IER_THRI) {
-               up->ier &= ~UART_IER_THRI;
-               serial_out(up, UART_IER, up->ier);
-       }
+       __stop_tx(up);
 
        /*
-        * We only do this from uart_stop - if we run out of
-        * characters to send, we don't want to prevent the
-        * FIFO from emptying.
+        * We really want to stop the transmitter from sending.
         */
-       if (up->port.type == PORT_16C950 && tty_stop) {
+       if (up->port.type == PORT_16C950) {
                up->acr |= UART_ACR_TXDIS;
                serial_icr_write(up, UART_ACR, up->acr);
        }
@@ -1031,10 +1034,11 @@
                                transmit_chars(up);
                }
        }
+
        /*
-        * We only do this from uart_start
+        * Re-enable the transmitter if we disabled it.
         */
-       if (tty_start && up->port.type == PORT_16C950) {
+       if (up->port.type == PORT_16C950 && up->acr & UART_ACR_TXDIS) {
                up->acr &= ~UART_ACR_TXDIS;
                serial_icr_write(up, UART_ACR, up->acr);
        }
@@ -1155,7 +1159,7 @@
                return;
        }
        if (uart_circ_empty(xmit) || uart_tx_stopped(&up->port)) {
-               serial8250_stop_tx(&up->port, 0);
+               __stop_tx(up);
                return;
        }
 
@@ -1174,7 +1178,7 @@
        DEBUG_INTR("THRE...");
 
        if (uart_circ_empty(xmit))
-               serial8250_stop_tx(&up->port, 0);
+               __stop_tx(up);
 }
 
 static _INLINE_ void check_modem_status(struct uart_8250_port *up)
@@ -1376,13 +1380,10 @@
 static unsigned int serial8250_get_mctrl(struct uart_port *port)
 {
        struct uart_8250_port *up = (struct uart_8250_port *)port;
-       unsigned long flags;
        unsigned char status;
        unsigned int ret;
 
-       spin_lock_irqsave(&up->port.lock, flags);
        status = serial_in(up, UART_MSR);
-       spin_unlock_irqrestore(&up->port.lock, flags);
 
        ret = 0;
        if (status & UART_MSR_DCD)
@@ -2060,7 +2061,8 @@
                up->port.ops = &serial8250_pops;
        }
 
-       for (i = 0, up = serial8250_ports; i < ARRAY_SIZE(old_serial_port);
+       for (i = 0, up = serial8250_ports;
+            i < ARRAY_SIZE(old_serial_port) && i < UART_NR;
             i++, up++) {
                up->port.iobase   = old_serial_port[i].port;
                up->port.irq      = irq_canonicalize(old_serial_port[i].irq);
diff -urN linux/drivers/serial/Kconfig linux/drivers/serial/Kconfig
--- linux/drivers/serial/Kconfig        2005/07/11 20:48:02     1.43
+++ linux/drivers/serial/Kconfig        2005/07/12 09:19:16     1.44
@@ -86,7 +86,7 @@
          namespace, say Y here.  If unsure, say N.
 
 config SERIAL_8250_NR_UARTS
-       int "Maximum number of non-legacy 8250/16550 serial ports"
+       int "Maximum number of 8250/16550 serial ports"
        depends on SERIAL_8250
        default "4"
        help
diff -urN linux/drivers/serial/au1x00_uart.c linux/drivers/serial/au1x00_uart.c
--- linux/drivers/serial/au1x00_uart.c  2005/07/11 20:48:02     1.16
+++ linux/drivers/serial/au1x00_uart.c  2005/07/12 09:19:16     1.17
@@ -533,13 +533,10 @@
 static unsigned int serial8250_get_mctrl(struct uart_port *port)
 {
        struct uart_8250_port *up = (struct uart_8250_port *)port;
-       unsigned long flags;
        unsigned char status;
        unsigned int ret;
 
-       spin_lock_irqsave(&up->port.lock, flags);
        status = serial_in(up, UART_MSR);
-       spin_unlock_irqrestore(&up->port.lock, flags);
 
        ret = 0;
        if (status & UART_MSR_DCD)
diff -urN linux/drivers/serial/ip22zilog.c linux/drivers/serial/ip22zilog.c
--- linux/drivers/serial/ip22zilog.c    2005/07/03 18:00:33     1.17
+++ linux/drivers/serial/ip22zilog.c    2005/07/12 09:19:16     1.18
@@ -518,27 +518,28 @@
 static __inline__ unsigned char ip22zilog_read_channel_status(struct uart_port 
*port)
 {
        struct zilog_channel *channel;
-       unsigned long flags;
        unsigned char status;
 
-       spin_lock_irqsave(&port->lock, flags);
-
        channel = ZILOG_CHANNEL_FROM_PORT(port);
        status = readb(&channel->control);
        ZSDELAY();
 
-       spin_unlock_irqrestore(&port->lock, flags);
-
        return status;
 }
 
 /* The port lock is not held.  */
 static unsigned int ip22zilog_tx_empty(struct uart_port *port)
 {
+       unsigned long flags;
        unsigned char status;
        unsigned int ret;
 
+       spin_lock_irqsave(&port->lock, flags);
+
        status = ip22zilog_read_channel_status(port);
+
+       spin_unlock_irqrestore(&port->lock, flags);
+
        if (status & Tx_BUF_EMP)
                ret = TIOCSER_TEMT;
        else
@@ -547,7 +548,7 @@
        return ret;
 }
 
-/* The port lock is not held.  */
+/* The port lock is held and interrupts are disabled.  */
 static unsigned int ip22zilog_get_mctrl(struct uart_port *port)
 {
        unsigned char status;
diff -urN linux/drivers/serial/mpsc.c linux/drivers/serial/mpsc.c
--- linux/drivers/serial/mpsc.c 2005/07/11 20:48:02     1.4
+++ linux/drivers/serial/mpsc.c 2005/07/12 09:19:16     1.5
@@ -1058,12 +1058,9 @@
 {
        struct mpsc_port_info *pi = (struct mpsc_port_info *)port;
        u32 mflags, status;
-       ulong iflags;
 
-       spin_lock_irqsave(&pi->port.lock, iflags);
        status = (pi->mirror_regs) ? pi->MPSC_CHR_10_m :
                readl(pi->mpsc_base + MPSC_CHR_10);
-       spin_unlock_irqrestore(&pi->port.lock, iflags);
 
        mflags = 0;
        if (status & 0x1)
diff -urN linux/drivers/serial/pmac_zilog.c linux/drivers/serial/pmac_zilog.c
--- linux/drivers/serial/pmac_zilog.c   2005/04/29 11:15:14     1.13
+++ linux/drivers/serial/pmac_zilog.c   2005/07/12 09:19:16     1.14
@@ -604,7 +604,7 @@
 /* 
  * Get Modem Control bits (only the input ones, the core will
  * or that with a cached value of the control ones)
- * The port lock is not held.
+ * The port lock is held and interrupts are disabled.
  */
 static unsigned int pmz_get_mctrl(struct uart_port *port)
 {
@@ -615,7 +615,7 @@
        if (ZS_IS_ASLEEP(uap) || uap->node == NULL)
                return 0;
 
-       status = pmz_peek_status(to_pmz(port));
+       status = read_zsreg(uap, R0);
 
        ret = 0;
        if (status & DCD)
diff -urN linux/drivers/serial/pxa.c linux/drivers/serial/pxa.c
--- linux/drivers/serial/pxa.c  2005/07/11 20:48:02     1.8
+++ linux/drivers/serial/pxa.c  2005/07/12 09:19:16     1.9
@@ -274,14 +274,11 @@
 static unsigned int serial_pxa_get_mctrl(struct uart_port *port)
 {
        struct uart_pxa_port *up = (struct uart_pxa_port *)port;
-       unsigned long flags;
        unsigned char status;
        unsigned int ret;
 
 return TIOCM_CTS | TIOCM_DSR | TIOCM_CAR;
-       spin_lock_irqsave(&up->port.lock, flags);
        status = serial_in(up, UART_MSR);
-       spin_unlock_irqrestore(&up->port.lock, flags);
 
        ret = 0;
        if (status & UART_MSR_DCD)
diff -urN linux/drivers/serial/s3c2410.c linux/drivers/serial/s3c2410.c
--- linux/drivers/serial/s3c2410.c      2005/07/11 20:48:02     1.11
+++ linux/drivers/serial/s3c2410.c      2005/07/12 09:19:16     1.12
@@ -522,14 +522,11 @@
 static int s3c24xx_serial_startup(struct uart_port *port)
 {
        struct s3c24xx_uart_port *ourport = to_ourport(port);
-       unsigned long flags;
        int ret;
 
        dbg("s3c24xx_serial_startup: port=%p (%08lx,%p)\n",
            port->mapbase, port->membase);
 
-       local_irq_save(flags);
-
        rx_enabled(port) = 1;
 
        ret = request_irq(RX_IRQ(port),
@@ -563,12 +560,10 @@
        /* the port reset code should have done the correct
         * register setup for the port controls */
 
-       local_irq_restore(flags);
        return ret;
 
  err:
        s3c24xx_serial_shutdown(port);
-       local_irq_restore(flags);
        return ret;
 }
 
diff -urN linux/drivers/serial/serial_core.c linux/drivers/serial/serial_core.c
--- linux/drivers/serial/serial_core.c  2005/04/08 18:58:25     1.16
+++ linux/drivers/serial/serial_core.c  2005/07/12 09:19:16     1.17
@@ -182,6 +182,13 @@
                                uart_set_mctrl(port, TIOCM_RTS | TIOCM_DTR);
                }
 
+               if (info->flags & UIF_CTS_FLOW) {
+                       spin_lock_irq(&port->lock);
+                       if (!(port->ops->get_mctrl(port) & TIOCM_CTS))
+                               info->tty->hw_stopped = 1;
+                       spin_unlock_irq(&port->lock);
+               }
+
                info->flags |= UIF_INITIALIZED;
 
                clear_bit(TTY_IO_ERROR, &info->tty->flags);
@@ -828,7 +835,10 @@
        if ((!file || !tty_hung_up_p(file)) &&
            !(tty->flags & (1 << TTY_IO_ERROR))) {
                result = port->mctrl;
+
+               spin_lock_irq(&port->lock);
                result |= port->ops->get_mctrl(port);
+               spin_unlock_irq(&port->lock);
        }
        up(&state->sem);
 
@@ -1131,6 +1141,16 @@
                spin_unlock_irqrestore(&state->port->lock, flags);
        }
 
+       /* Handle turning on CRTSCTS */
+       if (!(old_termios->c_cflag & CRTSCTS) && (cflag & CRTSCTS)) {
+               spin_lock_irqsave(&state->port->lock, flags);
+               if (!(state->port->ops->get_mctrl(state->port) & TIOCM_CTS)) {
+                       tty->hw_stopped = 1;
+                       state->port->ops->stop_tx(state->port, 0);
+               }
+               spin_unlock_irqrestore(&state->port->lock, flags);
+       }
+
 #if 0
        /*
         * No need to wake up processes in open wait, since they
@@ -1369,6 +1389,7 @@
        DECLARE_WAITQUEUE(wait, current);
        struct uart_info *info = state->info;
        struct uart_port *port = state->port;
+       unsigned int mctrl;
 
        info->blocked_open++;
        state->count--;
@@ -1416,7 +1437,10 @@
                 * and wait for the carrier to indicate that the
                 * modem is ready for us.
                 */
-               if (port->ops->get_mctrl(port) & TIOCM_CAR)
+               spin_lock_irq(&port->lock);
+               mctrl = port->ops->get_mctrl(port);
+               spin_unlock_irq(&port->lock);
+               if (mctrl & TIOCM_CAR)
                        break;
 
                up(&state->sem);
@@ -1618,7 +1642,9 @@
 
        if(capable(CAP_SYS_ADMIN))
        {
+               spin_lock_irq(&port->lock);
                status = port->ops->get_mctrl(port);
+               spin_unlock_irq(&port->lock);
 
                ret += sprintf(buf + ret, " tx:%d rx:%d",
                                port->icount.tx, port->icount.rx);
@@ -1782,6 +1808,12 @@
        struct termios termios;
        int i;
 
+       /*
+        * Ensure that the serial console lock is initialised
+        * early.
+        */
+       spin_lock_init(&port->lock);
+
        memset(&termios, 0, sizeof(struct termios));
 
        termios.c_cflag = CREAD | HUPCL | CLOCAL;
@@ -2170,10 +2202,16 @@
 
        state->port = port;
 
-       spin_lock_init(&port->lock);
        port->cons = drv->cons;
        port->info = state->info;
 
+       /*
+        * If this port is a console, then the spinlock is already
+        * initialised.
+        */
+       if (!uart_console(port))
+               spin_lock_init(&port->lock);
+
        uart_configure_port(drv, state, port);
 
        /*
diff -urN linux/drivers/serial/serial_txx9.c linux/drivers/serial/serial_txx9.c
--- linux/drivers/serial/serial_txx9.c  2005/05/26 09:12:46     1.3
+++ linux/drivers/serial/serial_txx9.c  2005/07/12 09:19:16     1.4
@@ -448,13 +448,10 @@
 static unsigned int serial_txx9_get_mctrl(struct uart_port *port)
 {
        struct uart_txx9_port *up = (struct uart_txx9_port *)port;
-       unsigned long flags;
        unsigned int ret;
 
-       spin_lock_irqsave(&up->port.lock, flags);
        ret =  ((sio_in(up, TXX9_SIFLCR) & TXX9_SIFLCR_RTSSC) ? 0 : TIOCM_RTS)
                | ((sio_in(up, TXX9_SICISR) & TXX9_SICISR_CTSS) ? 0 : 
TIOCM_CTS);
-       spin_unlock_irqrestore(&up->port.lock, flags);
 
        return ret;
 }
diff -urN linux/drivers/serial/sunsab.c linux/drivers/serial/sunsab.c
--- linux/drivers/serial/sunsab.c       2005/05/26 09:12:46     1.17
+++ linux/drivers/serial/sunsab.c       2005/07/12 09:19:16     1.18
@@ -426,18 +426,15 @@
                sunsab_tx_idle(up);
 }
 
-/* port->lock is not held.  */
+/* port->lock is held by caller and interrupts are disabled.  */
 static unsigned int sunsab_get_mctrl(struct uart_port *port)
 {
        struct uart_sunsab_port *up = (struct uart_sunsab_port *) port;
-       unsigned long flags;
        unsigned char val;
        unsigned int result;
 
        result = 0;
 
-       spin_lock_irqsave(&up->port.lock, flags);
-
        val = readb(&up->regs->r.pvr);
        result |= (val & up->pvr_dsr_bit) ? 0 : TIOCM_DSR;
 
@@ -447,8 +444,6 @@
        val = readb(&up->regs->r.star);
        result |= (val & SAB82532_STAR_CTS) ? TIOCM_CTS : 0;
 
-       spin_unlock_irqrestore(&up->port.lock, flags);
-
        return result;
 }
 
diff -urN linux/drivers/serial/sunsu.c linux/drivers/serial/sunsu.c
--- linux/drivers/serial/sunsu.c        2005/05/19 12:08:30     1.26
+++ linux/drivers/serial/sunsu.c        2005/07/12 09:19:16     1.27
@@ -572,13 +572,10 @@
 static unsigned int sunsu_get_mctrl(struct uart_port *port)
 {
        struct uart_sunsu_port *up = (struct uart_sunsu_port *) port;
-       unsigned long flags;
        unsigned char status;
        unsigned int ret;
 
-       spin_lock_irqsave(&up->port.lock, flags);
        status = serial_in(up, UART_MSR);
-       spin_unlock_irqrestore(&up->port.lock, flags);
 
        ret = 0;
        if (status & UART_MSR_DCD)
diff -urN linux/drivers/serial/sunzilog.c linux/drivers/serial/sunzilog.c
--- linux/drivers/serial/sunzilog.c     2005/07/11 20:48:02     1.25
+++ linux/drivers/serial/sunzilog.c     2005/07/12 09:19:16     1.26
@@ -610,27 +610,28 @@
 static __inline__ unsigned char sunzilog_read_channel_status(struct uart_port 
*port)
 {
        struct zilog_channel __iomem *channel;
-       unsigned long flags;
        unsigned char status;
 
-       spin_lock_irqsave(&port->lock, flags);
-
        channel = ZILOG_CHANNEL_FROM_PORT(port);
        status = sbus_readb(&channel->control);
        ZSDELAY();
 
-       spin_unlock_irqrestore(&port->lock, flags);
-
        return status;
 }
 
 /* The port lock is not held.  */
 static unsigned int sunzilog_tx_empty(struct uart_port *port)
 {
+       unsigned long flags;
        unsigned char status;
        unsigned int ret;
 
+       spin_lock_irqsave(&port->lock, flags);
+
        status = sunzilog_read_channel_status(port);
+
+       spin_unlock_irqrestore(&port->lock, flags);
+
        if (status & Tx_BUF_EMP)
                ret = TIOCSER_TEMT;
        else
@@ -639,7 +640,7 @@
        return ret;
 }
 
-/* The port lock is not held.  */
+/* The port lock is held and interrupts are disabled.  */
 static unsigned int sunzilog_get_mctrl(struct uart_port *port)
 {
        unsigned char status;
diff -urN linux/drivers/serial/cpm_uart/cpm_uart_cpm1.c 
linux/drivers/serial/cpm_uart/cpm_uart_cpm1.c
--- linux/drivers/serial/cpm_uart/cpm_uart_cpm1.c       2004/11/15 11:49:32     
1.3
+++ linux/drivers/serial/cpm_uart/cpm_uart_cpm1.c       2005/07/12 09:19:17     
1.4
@@ -94,12 +94,42 @@
                ((immap_t *)IMAP_ADDR)->im_ioport.iop_paodr &= ~iobits;
        }
 
+#ifdef CONFIG_MPC885ADS
+       /* Enable SMC1 transceivers */
+       {
+               volatile uint __iomem *bcsr1 = ioremap(BCSR1, 4);
+               uint tmp;
+
+               tmp = in_be32(bcsr1);
+               tmp &= ~BCSR1_RS232EN_1;
+               out_be32(bcsr1, tmp);
+               iounmap(bcsr1);
+       }
+#endif
+
        pinfo->brg = 1;
 }
 
 void smc2_lineif(struct uart_cpm_port *pinfo)
 {
-       /* XXX SMC2: insert port configuration here */
+#ifdef CONFIG_MPC885ADS
+       volatile cpm8xx_t *cp = cpmp;
+       volatile uint __iomem *bcsr1;
+       uint tmp;
+
+       cp->cp_pepar |= 0x00000c00;
+       cp->cp_pedir &= ~0x00000c00;
+       cp->cp_peso &= ~0x00000400;
+       cp->cp_peso |= 0x00000800;
+
+       /* Enable SMC2 transceivers */
+       bcsr1 = ioremap(BCSR1, 4);
+       tmp = in_be32(bcsr1);
+       tmp &= ~BCSR1_RS232EN_2;
+       out_be32(bcsr1, tmp);
+       iounmap(bcsr1);
+#endif
+
        pinfo->brg = 2;
 }
 
diff -urN linux/drivers/video/console/fbcon.c 
linux/drivers/video/console/fbcon.c
--- linux/drivers/video/console/fbcon.c 2005/05/19 12:08:33     1.28
+++ linux/drivers/video/console/fbcon.c 2005/07/12 09:19:17     1.29
@@ -142,7 +142,6 @@
 #define CURSOR_DRAW_DELAY              (1)
 
 /* # VBL ints between cursor state changes */
-#define ARM_CURSOR_BLINK_RATE          (10)
 #define ATARI_CURSOR_BLINK_RATE                (42)
 #define MAC_CURSOR_BLINK_RATE          (32)
 #define DEFAULT_CURSOR_BLINK_RATE      (20)
@@ -288,7 +287,7 @@
        release_console_sem();
 }
 
-#if (defined(__arm__) && defined(IRQ_VSYNCPULSE)) || defined(CONFIG_ATARI) || 
defined(CONFIG_MAC)
+#if defined(CONFIG_ATARI) || defined(CONFIG_MAC)
 static int cursor_blink_rate;
 static irqreturn_t fb_vbl_handler(int irq, void *dev_id, struct pt_regs *fp)
 {
@@ -878,11 +877,6 @@
        }
 #endif                         /* CONFIG_MAC */
 
-#if defined(__arm__) && defined(IRQ_VSYNCPULSE)
-       cursor_blink_rate = ARM_CURSOR_BLINK_RATE;
-       irqres = request_irq(IRQ_VSYNCPULSE, fb_vbl_handler, SA_SHIRQ,
-                            "framebuffer vbl", info);
-#endif
        /* Initialize the work queue. If the driver provides its
         * own work queue this means it will use something besides 
         * default timer to flash the cursor. */
diff -urN linux/fs/fat/cache.c linux/fs/fat/cache.c
--- linux/fs/fat/cache.c        2005/03/18 17:38:01     1.29
+++ linux/fs/fat/cache.c        2005/07/12 09:19:17     1.30
@@ -56,7 +56,7 @@
        return 0;
 }
 
-void __exit fat_cache_destroy(void)
+void fat_cache_destroy(void)
 {
        if (kmem_cache_destroy(fat_cache_cachep))
                printk(KERN_INFO "fat_cache: not all structures were freed\n");
diff -urN linux/fs/fat/inode.c linux/fs/fat/inode.c
--- linux/fs/fat/inode.c        2005/04/08 18:58:34     1.93
+++ linux/fs/fat/inode.c        2005/07/12 09:19:17     1.94
@@ -1327,16 +1327,25 @@
 EXPORT_SYMBOL(fat_fill_super);
 
 int __init fat_cache_init(void);
-void __exit fat_cache_destroy(void);
+void fat_cache_destroy(void);
 
 static int __init init_fat_fs(void)
 {
-       int ret;
+       int err;
 
-       ret = fat_cache_init();
-       if (ret < 0)
-               return ret;
-       return fat_init_inodecache();
+       err = fat_cache_init();
+       if (err)
+               return err;
+
+       err = fat_init_inodecache();
+       if (err)
+               goto failed;
+
+       return 0;
+
+failed:
+       fat_cache_destroy();
+       return err;
 }
 
 static void __exit exit_fat_fs(void)
diff -urN linux/fs/freevxfs/vxfs.h linux/fs/freevxfs/vxfs.h
--- linux/fs/freevxfs/vxfs.h    2004/02/19 03:06:32     1.4
+++ linux/fs/freevxfs/vxfs.h    2005/07/12 09:19:17     1.5
@@ -37,7 +37,6 @@
  * superblocks of the Veritas Filesystem.
  */
 #include <linux/types.h>
-#include "vxfs_kcompat.h"
 
 
 /*
diff -urN linux/fs/freevxfs/vxfs_bmap.c linux/fs/freevxfs/vxfs_bmap.c
--- linux/fs/freevxfs/vxfs_bmap.c       2004/03/11 16:46:55     1.8
+++ linux/fs/freevxfs/vxfs_bmap.c       2005/07/12 09:19:17     1.9
@@ -101,7 +101,7 @@
        return 0;
 
 fail_size:
-       printk("vxfs: indirect extent to big!\n");
+       printk("vxfs: indirect extent too big!\n");
 fail_buf:
        return 0;
 }
diff -urN linux/fs/freevxfs/vxfs_fshead.c linux/fs/freevxfs/vxfs_fshead.c
--- linux/fs/freevxfs/vxfs_fshead.c     2004/02/19 03:06:32     1.7
+++ linux/fs/freevxfs/vxfs_fshead.c     2005/07/12 09:19:17     1.8
@@ -78,17 +78,18 @@
        struct buffer_head              *bp;
 
        bp = vxfs_bread(ip, which);
-       if (buffer_mapped(bp)) {
+       if (bp) {
                struct vxfs_fsh         *fhp;
 
-               if (!(fhp = kmalloc(sizeof(*fhp), SLAB_KERNEL)))
-                       return NULL;
+               if (!(fhp = kmalloc(sizeof(*fhp), GFP_KERNEL)))
+                       goto out;
                memcpy(fhp, bp->b_data, sizeof(*fhp));
 
-               brelse(bp);
+               put_bh(bp);
                return (fhp);
        }
-
+out:
+       brelse(bp);
        return NULL;
 }
 
diff -urN linux/fs/freevxfs/vxfs_lookup.c linux/fs/freevxfs/vxfs_lookup.c
--- linux/fs/freevxfs/vxfs_lookup.c     2004/02/19 03:06:32     1.8
+++ linux/fs/freevxfs/vxfs_lookup.c     2005/07/12 09:19:17     1.9
@@ -61,13 +61,13 @@
 };
 
  
-static __inline__ u_long
+static inline u_long
 dir_pages(struct inode *inode)
 {
        return (inode->i_size + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT;
 }
  
-static __inline__ u_long
+static inline u_long
 dir_blocks(struct inode *ip)
 {
        u_long                  bsize = ip->i_sb->s_blocksize;
@@ -79,7 +79,7 @@
  *
  * len <= VXFS_NAMELEN and de != NULL are guaranteed by caller.
  */
-static __inline__ int
+static inline int
 vxfs_match(int len, const char * const name, struct vxfs_direct *de)
 {
        if (len != de->d_namelen)
@@ -89,7 +89,7 @@
        return !memcmp(name, de->d_name, len);
 }
 
-static __inline__ struct vxfs_direct *
+static inline struct vxfs_direct *
 vxfs_next_entry(struct vxfs_direct *de)
 {
        return ((struct vxfs_direct *)((char*)de + de->d_reclen));
diff -urN linux/fs/freevxfs/vxfs_olt.c linux/fs/freevxfs/vxfs_olt.c
--- linux/fs/freevxfs/vxfs_olt.c        2004/02/19 03:06:32     1.6
+++ linux/fs/freevxfs/vxfs_olt.c        2005/07/12 09:19:17     1.7
@@ -38,7 +38,7 @@
 #include "vxfs_olt.h"
 
 
-static __inline__ void
+static inline void
 vxfs_get_fshead(struct vxfs_oltfshead *fshp, struct vxfs_sb_info *infp)
 {
        if (infp->vsi_fshino)
@@ -46,7 +46,7 @@
        infp->vsi_fshino = fshp->olt_fsino[0];
 }
 
-static __inline__ void
+static inline void
 vxfs_get_ilist(struct vxfs_oltilist *ilistp, struct vxfs_sb_info *infp)
 {
        if (infp->vsi_iext)
@@ -54,7 +54,7 @@
        infp->vsi_iext = ilistp->olt_iext[0]; 
 }
 
-static __inline__ u_long
+static inline u_long
 vxfs_oblock(struct super_block *sbp, daddr_t block, u_long bsize)
 {
        if (sbp->s_blocksize % bsize)
@@ -104,8 +104,8 @@
                goto fail;
        }
 
-       oaddr = (char *)bp->b_data + op->olt_size;
-       eaddr = (char *)bp->b_data + (infp->vsi_oltsize * sbp->s_blocksize);
+       oaddr = bp->b_data + op->olt_size;
+       eaddr = bp->b_data + (infp->vsi_oltsize * sbp->s_blocksize);
 
        while (oaddr < eaddr) {
                struct vxfs_oltcommon   *ocp =
diff -urN linux/fs/freevxfs/vxfs_subr.c linux/fs/freevxfs/vxfs_subr.c
--- linux/fs/freevxfs/vxfs_subr.c       2004/02/19 03:06:32     1.8
+++ linux/fs/freevxfs/vxfs_subr.c       2005/07/12 09:19:17     1.9
@@ -36,7 +36,6 @@
 #include <linux/slab.h>
 #include <linux/pagemap.h>
 
-#include "vxfs_kcompat.h"
 #include "vxfs_extern.h"
 
 
diff -urN linux/fs/freevxfs/vxfs_super.c linux/fs/freevxfs/vxfs_super.c
--- linux/fs/freevxfs/vxfs_super.c      2004/09/19 12:30:17     1.20
+++ linux/fs/freevxfs/vxfs_super.c      2005/07/12 09:19:17     1.21
@@ -155,12 +155,11 @@
 
        sbp->s_flags |= MS_RDONLY;
 
-       infp = kmalloc(sizeof(*infp), GFP_KERNEL);
+       infp = kcalloc(1, sizeof(*infp), GFP_KERNEL);
        if (!infp) {
                printk(KERN_WARNING "vxfs: unable to allocate incore 
superblock\n");
                return -ENOMEM;
        }
-       memset(infp, 0, sizeof(*infp));
 
        bsize = sb_min_blocksize(sbp, BLOCK_SIZE);
        if (!bsize) {
@@ -196,7 +195,7 @@
 #endif
 
        sbp->s_magic = rsbp->vs_magic;
-       sbp->s_fs_info = (void *)infp;
+       sbp->s_fs_info = infp;
 
        infp->vsi_raw = rsbp;
        infp->vsi_bp = bp;
@@ -263,7 +262,7 @@
                        sizeof(struct vxfs_inode_info), 0, 
                        SLAB_RECLAIM_ACCOUNT, NULL, NULL);
        if (vxfs_inode_cachep)
-               return (register_filesystem(&vxfs_fs_type));
+               return register_filesystem(&vxfs_fs_type);
        return -ENOMEM;
 }
 
diff -urN linux/fs/freevxfs/vxfs_kcompat.h linux/fs/freevxfs/vxfs_kcompat.h
--- linux/fs/freevxfs/Attic/vxfs_kcompat.h      2005-07-12 10:19:18.312515000 
+0100     1.2
+++ linux/fs/freevxfs/Attic/vxfs_kcompat.h      1970/01/01 00:00:00+0100
@@ -1,49 +0,0 @@
-#ifndef _VXFS_KCOMPAT_H
-#define _VXFS_KCOMPAT_H
-
-#include <linux/version.h>
-
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
-
-#include <linux/blkdev.h>
-
-typedef long sector_t;
-
-/* From include/linux/fs.h (Linux 2.5.2-pre3)  */
-static inline struct buffer_head * sb_bread(struct super_block *sb, int block)
-{
-       return bread(sb->s_dev, block, sb->s_blocksize);
-}
-
-/* Dito.  */
-static inline void map_bh(struct buffer_head *bh, struct super_block *sb, int 
block)
-{
-       bh->b_state |= 1 << BH_Mapped;
-       bh->b_dev = sb->s_dev;
-       bh->b_blocknr = block;
-}
-
-/* From fs/block_dev.c (Linux 2.5.2-pre2)  */
-static inline int sb_set_blocksize(struct super_block *sb, int size)
-{
-       int bits;
-       if (set_blocksize(sb->s_dev, size) < 0)
-               return 0;
-       sb->s_blocksize = size;
-       for (bits = 9, size >>= 9; size >>= 1; bits++)
-               ;
-       sb->s_blocksize_bits = bits;
-       return sb->s_blocksize;
-}
-
-/* Dito.  */
-static inline int sb_min_blocksize(struct super_block *sb, int size)
-{
-       int minsize = get_hardsect_size(sb->s_dev);
-       if (size < minsize)
-               size = minsize;
-       return sb_set_blocksize(sb, size);
-}
-
-#endif /* Kernel 2.4 */
-#endif /* _VXFS_KCOMPAT_H */
diff -urN linux/fs/reiserfs/ioctl.c linux/fs/reiserfs/ioctl.c
--- linux/fs/reiserfs/ioctl.c   2005/01/13 14:06:38     1.14
+++ linux/fs/reiserfs/ioctl.c   2005/07/12 09:19:18     1.15
@@ -36,10 +36,16 @@
        /* following two cases are taken from fs/ext2/ioctl.c by Remy
           Card (card@masi.ibp.fr) */
        case REISERFS_IOC_GETFLAGS:
+               if (!reiserfs_attrs (inode->i_sb))
+                       return -ENOTTY;
+
                flags = REISERFS_I(inode) -> i_attrs;
                i_attrs_to_sd_attrs( inode, ( __u16 * ) &flags );
                return put_user(flags, (int __user *) arg);
        case REISERFS_IOC_SETFLAGS: {
+               if (!reiserfs_attrs (inode->i_sb))
+                       return -ENOTTY;
+
                if (IS_RDONLY(inode))
                        return -EROFS;
 
diff -urN linux/fs/reiserfs/super.c linux/fs/reiserfs/super.c
--- linux/fs/reiserfs/super.c   2005/07/11 20:48:25     1.47
+++ linux/fs/reiserfs/super.c   2005/07/12 09:19:18     1.48
@@ -1053,10 +1053,9 @@
 
 static void handle_attrs( struct super_block *s )
 {
-       struct reiserfs_super_block * rs;
+       struct reiserfs_super_block * rs = SB_DISK_SUPER_BLOCK (s);
 
        if( reiserfs_attrs( s ) ) {
-               rs = SB_DISK_SUPER_BLOCK (s);
                if( old_format_only(s) ) {
                        reiserfs_warning(s, "reiserfs: cannot support 
attributes on 3.5.x disk format" );
                        REISERFS_SB(s) -> s_mount_opt &= ~ ( 1 << 
REISERFS_ATTRS );
@@ -1066,6 +1065,8 @@
                                reiserfs_warning(s, "reiserfs: cannot support 
attributes until flag is set in super-block" );
                                REISERFS_SB(s) -> s_mount_opt &= ~ ( 1 << 
REISERFS_ATTRS );
                }
+       } else if (le32_to_cpu( rs -> s_flags ) & reiserfs_attrs_cleared) {
+               REISERFS_SB(s)->s_mount_opt |= REISERFS_ATTRS;
        }
 }
 
diff -urN linux/fs/udf/namei.c linux/fs/udf/namei.c
--- linux/fs/udf/namei.c        2005/07/11 20:48:25     1.35
+++ linux/fs/udf/namei.c        2005/07/12 09:19:18     1.36
@@ -164,11 +164,7 @@
        uint32_t extoffset, elen, offset;
        struct buffer_head *bh = NULL;
 
-       if (!dir)
-               return NULL;
-
        size = (udf_ext0_offset(dir) + dir->i_size) >> 2;
-
        f_pos = (udf_ext0_offset(dir) >> 2);
 
        fibh->soffset = fibh->eoffset = (f_pos & ((dir->i_sb->s_blocksize - 1) 
>> 2)) << 2;
diff -urN linux/include/asm-alpha/serial.h linux/include/asm-alpha/serial.h
--- linux/include/asm-alpha/serial.h    2003/10/09 13:09:34     1.4
+++ linux/include/asm-alpha/serial.h    2005/07/12 09:19:18     1.5
@@ -22,54 +22,9 @@
 #define STD_COM4_FLAGS ASYNC_BOOT_AUTOCONF
 #endif
 
-#ifdef CONFIG_SERIAL_MANY_PORTS
-#define FOURPORT_FLAGS ASYNC_FOURPORT
-#define ACCENT_FLAGS 0
-#define BOCA_FLAGS 0
-#endif
-       
-#define STD_SERIAL_PORT_DEFNS                  \
+#define SERIAL_PORT_DFNS                       \
        /* UART CLK   PORT IRQ     FLAGS        */                      \
        { 0, BASE_BAUD, 0x3F8, 4, STD_COM_FLAGS },      /* ttyS0 */     \
        { 0, BASE_BAUD, 0x2F8, 3, STD_COM_FLAGS },      /* ttyS1 */     \
        { 0, BASE_BAUD, 0x3E8, 4, STD_COM_FLAGS },      /* ttyS2 */     \
        { 0, BASE_BAUD, 0x2E8, 3, STD_COM4_FLAGS },     /* ttyS3 */
-
-
-#ifdef CONFIG_SERIAL_MANY_PORTS
-#define EXTRA_SERIAL_PORT_DEFNS                        \
-       { 0, BASE_BAUD, 0x1A0, 9, FOURPORT_FLAGS },     /* ttyS4 */     \
-       { 0, BASE_BAUD, 0x1A8, 9, FOURPORT_FLAGS },     /* ttyS5 */     \
-       { 0, BASE_BAUD, 0x1B0, 9, FOURPORT_FLAGS },     /* ttyS6 */     \
-       { 0, BASE_BAUD, 0x1B8, 9, FOURPORT_FLAGS },     /* ttyS7 */     \
-       { 0, BASE_BAUD, 0x2A0, 5, FOURPORT_FLAGS },     /* ttyS8 */     \
-       { 0, BASE_BAUD, 0x2A8, 5, FOURPORT_FLAGS },     /* ttyS9 */     \
-       { 0, BASE_BAUD, 0x2B0, 5, FOURPORT_FLAGS },     /* ttyS10 */    \
-       { 0, BASE_BAUD, 0x2B8, 5, FOURPORT_FLAGS },     /* ttyS11 */    \
-       { 0, BASE_BAUD, 0x330, 4, ACCENT_FLAGS },       /* ttyS12 */    \
-       { 0, BASE_BAUD, 0x338, 4, ACCENT_FLAGS },       /* ttyS13 */    \
-       { 0, BASE_BAUD, 0x000, 0, 0 },  /* ttyS14 (spare) */            \
-       { 0, BASE_BAUD, 0x000, 0, 0 },  /* ttyS15 (spare) */            \
-       { 0, BASE_BAUD, 0x100, 12, BOCA_FLAGS },        /* ttyS16 */    \
-       { 0, BASE_BAUD, 0x108, 12, BOCA_FLAGS },        /* ttyS17 */    \
-       { 0, BASE_BAUD, 0x110, 12, BOCA_FLAGS },        /* ttyS18 */    \
-       { 0, BASE_BAUD, 0x118, 12, BOCA_FLAGS },        /* ttyS19 */    \
-       { 0, BASE_BAUD, 0x120, 12, BOCA_FLAGS },        /* ttyS20 */    \
-       { 0, BASE_BAUD, 0x128, 12, BOCA_FLAGS },        /* ttyS21 */    \
-       { 0, BASE_BAUD, 0x130, 12, BOCA_FLAGS },        /* ttyS22 */    \
-       { 0, BASE_BAUD, 0x138, 12, BOCA_FLAGS },        /* ttyS23 */    \
-       { 0, BASE_BAUD, 0x140, 12, BOCA_FLAGS },        /* ttyS24 */    \
-       { 0, BASE_BAUD, 0x148, 12, BOCA_FLAGS },        /* ttyS25 */    \
-       { 0, BASE_BAUD, 0x150, 12, BOCA_FLAGS },        /* ttyS26 */    \
-       { 0, BASE_BAUD, 0x158, 12, BOCA_FLAGS },        /* ttyS27 */    \
-       { 0, BASE_BAUD, 0x160, 12, BOCA_FLAGS },        /* ttyS28 */    \
-       { 0, BASE_BAUD, 0x168, 12, BOCA_FLAGS },        /* ttyS29 */    \
-       { 0, BASE_BAUD, 0x170, 12, BOCA_FLAGS },        /* ttyS30 */    \
-       { 0, BASE_BAUD, 0x178, 12, BOCA_FLAGS },        /* ttyS31 */
-#else
-#define EXTRA_SERIAL_PORT_DEFNS
-#endif
-
-#define SERIAL_PORT_DFNS               \
-       STD_SERIAL_PORT_DEFNS           \
-       EXTRA_SERIAL_PORT_DEFNS
diff -urN linux/include/asm-arm/stat.h linux/include/asm-arm/stat.h
--- linux/include/asm-arm/stat.h        2003/06/05 11:24:18     1.10
+++ linux/include/asm-arm/stat.h        2005/07/12 09:19:18     1.11
@@ -89,6 +89,6 @@
        unsigned long   st_ctime_nsec;
 
        unsigned long long      st_ino;
-};
+} __attribute__((packed));
 
 #endif
diff -urN linux/include/asm-arm/system.h linux/include/asm-arm/system.h
--- linux/include/asm-arm/system.h      2005/07/11 20:48:30     1.47
+++ linux/include/asm-arm/system.h      2005/07/12 09:19:18     1.48
@@ -85,7 +85,9 @@
 void die(const char *msg, struct pt_regs *regs, int err)
                __attribute__((noreturn));
 
-void die_if_kernel(const char *str, struct pt_regs *regs, int err);
+struct siginfo;
+void notify_die(const char *str, struct pt_regs *regs, struct siginfo *info,
+               unsigned long err, unsigned long trap);
 
 void hook_fault_code(int nr, int (*fn)(unsigned long, unsigned int,
                                       struct pt_regs *),
@@ -290,7 +292,6 @@
 })
 
 #ifdef CONFIG_SMP
-#error SMP not supported
 
 #define smp_mb()               mb()
 #define smp_rmb()              rmb()
@@ -304,6 +305,8 @@
 #define smp_wmb()              barrier()
 #define smp_read_barrier_depends()             do { } while(0)
 
+#endif /* CONFIG_SMP */
+
 #if defined(CONFIG_CPU_SA1100) || defined(CONFIG_CPU_SA110)
 /*
  * On the StrongARM, "swp" is terminally broken since it bypasses the
@@ -316,9 +319,16 @@
  *
  * We choose (1) since its the "easiest" to achieve here and is not
  * dependent on the processor type.
+ *
+ * NOTE that this solution won't work on an SMP system, so explcitly
+ * forbid it here.
  */
+#ifdef CONFIG_SMP
+#error SMP is not supported on SA1100/SA110
+#else
 #define swp_is_buggy
 #endif
+#endif
 
 static inline unsigned long __xchg(unsigned long x, volatile void *ptr, int 
size)
 {
@@ -361,8 +371,6 @@
        return ret;
 }
 
-#endif /* CONFIG_SMP */
-
 #endif /* __ASSEMBLY__ */
 
 #define arch_align_stack(x) (x)
diff -urN linux/include/asm-arm/tlbflush.h linux/include/asm-arm/tlbflush.h
--- linux/include/asm-arm/tlbflush.h    2004/11/15 11:49:36     1.4
+++ linux/include/asm-arm/tlbflush.h    2005/07/12 09:19:18     1.5
@@ -235,7 +235,7 @@
 
 #define tlb_flag(f)    ((always_tlb_flags & (f)) || (__tlb_flag & 
possible_tlb_flags & (f)))
 
-static inline void flush_tlb_all(void)
+static inline void local_flush_tlb_all(void)
 {
        const int zero = 0;
        const unsigned int __tlb_flag = __cpu_tlb_flags;
@@ -253,7 +253,7 @@
                asm("mcr%? p15, 0, %0, c8, c5, 0" : : "r" (zero));
 }
 
-static inline void flush_tlb_mm(struct mm_struct *mm)
+static inline void local_flush_tlb_mm(struct mm_struct *mm)
 {
        const int zero = 0;
        const int asid = ASID(mm);
@@ -282,7 +282,7 @@
 }
 
 static inline void
-flush_tlb_page(struct vm_area_struct *vma, unsigned long uaddr)
+local_flush_tlb_page(struct vm_area_struct *vma, unsigned long uaddr)
 {
        const int zero = 0;
        const unsigned int __tlb_flag = __cpu_tlb_flags;
@@ -313,7 +313,7 @@
                asm("mcr%? p15, 0, %0, c8, c5, 1" : : "r" (uaddr));
 }
 
-static inline void flush_tlb_kernel_page(unsigned long kaddr)
+static inline void local_flush_tlb_kernel_page(unsigned long kaddr)
 {
        const int zero = 0;
        const unsigned int __tlb_flag = __cpu_tlb_flags;
@@ -384,8 +384,24 @@
 /*
  * Convert calls to our calling convention.
  */
-#define flush_tlb_range(vma,start,end) 
__cpu_flush_user_tlb_range(start,end,vma)
-#define flush_tlb_kernel_range(s,e)    __cpu_flush_kern_tlb_range(s,e)
+#define local_flush_tlb_range(vma,start,end)   
__cpu_flush_user_tlb_range(start,end,vma)
+#define local_flush_tlb_kernel_range(s,e)      __cpu_flush_kern_tlb_range(s,e)
+
+#ifndef CONFIG_SMP
+#define flush_tlb_all          local_flush_tlb_all
+#define flush_tlb_mm           local_flush_tlb_mm
+#define flush_tlb_page         local_flush_tlb_page
+#define flush_tlb_kernel_page  local_flush_tlb_kernel_page
+#define flush_tlb_range                local_flush_tlb_range
+#define flush_tlb_kernel_range local_flush_tlb_kernel_range
+#else
+extern void flush_tlb_all(void);
+extern void flush_tlb_mm(struct mm_struct *mm);
+extern void flush_tlb_page(struct vm_area_struct *vma, unsigned long uaddr);
+extern void flush_tlb_kernel_page(unsigned long kaddr);
+extern void flush_tlb_range(struct vm_area_struct *vma, unsigned long start, 
unsigned long end);
+extern void flush_tlb_kernel_range(unsigned long start, unsigned long end);
+#endif
 
 /*
  * if PG_dcache_dirty is set for the page, we need to ensure that any
diff -urN linux/include/asm-arm/arch-pxa/debug-macro.S 
linux/include/asm-arm/arch-pxa/debug-macro.S
--- linux/include/asm-arm/arch-pxa/debug-macro.S        2005/02/07 02:54:58     
1.1
+++ linux/include/asm-arm/arch-pxa/debug-macro.S        2005/07/12 09:19:18     
1.2
@@ -11,6 +11,8 @@
  *
 */
 
+#include "hardware.h"
+
                .macro  addruart,rx
                mrc     p15, 0, \rx, c1, c0
                tst     \rx, #1                 @ MMU enabled?
diff -urN linux/include/asm-arm/arch-pxa/pxa-regs.h 
linux/include/asm-arm/arch-pxa/pxa-regs.h
--- linux/include/asm-arm/arch-pxa/pxa-regs.h   2005/06/18 14:42:50     1.19
+++ linux/include/asm-arm/arch-pxa/pxa-regs.h   2005/07/12 09:19:18     1.20
@@ -1505,6 +1505,7 @@
 #define PSSR_OTGPH     (1 << 6)        /* OTG Peripheral control Hold */
 #define PSSR_RDH       (1 << 5)        /* Read Disable Hold */
 #define PSSR_PH                (1 << 4)        /* Peripheral Control Hold */
+#define PSSR_STS       (1 << 3)        /* Standby Mode Status */
 #define PSSR_VFS       (1 << 2)        /* VDD Fault Status */
 #define PSSR_BFS       (1 << 1)        /* Battery Fault Status */
 #define PSSR_SSS       (1 << 0)        /* Software Sleep Status */
@@ -1965,6 +1966,7 @@
 #define MECR_NOS       (1 << 0)        /* Number Of Sockets: 0 -> 1 sock, 1 -> 
2 sock */
 #define MECR_CIT       (1 << 1)        /* Card Is There: 0 -> no card, 1 -> 
card inserted */
 
+#define MDREFR_K0DB4   (1 << 29)       /* SDCLK0 Divide by 4 Control/Status */
 #define MDREFR_K2FREE  (1 << 25)       /* SDRAM Free-Running Control */
 #define MDREFR_K1FREE  (1 << 24)       /* SDRAM Free-Running Control */
 #define MDREFR_K0FREE  (1 << 23)       /* SDRAM Free-Running Control */
diff -urN linux/include/asm-arm/hardware/arm_timer.h 
linux/include/asm-arm/hardware/arm_timer.h
--- linux/include/asm-arm/hardware/arm_timer.h  1970/01/01 00:00:00
+++ linux/include/asm-arm/hardware/arm_timer.h  2005-07-12 10:19:19.272749000 
+0100     1.1
@@ -0,0 +1,21 @@
+#ifndef __ASM_ARM_HARDWARE_ARM_TIMER_H
+#define __ASM_ARM_HARDWARE_ARM_TIMER_H
+
+#define TIMER_LOAD     0x00
+#define TIMER_VALUE    0x04
+#define TIMER_CTRL     0x08
+#define TIMER_CTRL_ONESHOT     (1 << 0)
+#define TIMER_CTRL_32BIT       (1 << 1)
+#define TIMER_CTRL_DIV1                (0 << 2)
+#define TIMER_CTRL_DIV16       (1 << 2)
+#define TIMER_CTRL_DIV256      (2 << 2)
+#define TIMER_CTRL_IE          (1 << 5)        /* Interrupt Enable (versatile 
only) */
+#define TIMER_CTRL_PERIODIC    (1 << 6)
+#define TIMER_CTRL_ENABLE      (1 << 7)
+
+#define TIMER_INTCLR   0x0c
+#define TIMER_RIS      0x10
+#define TIMER_MIS      0x14
+#define TIMER_BGLOAD   0x18
+
+#endif
diff -urN linux/include/asm-arm/mach/arch.h linux/include/asm-arm/mach/arch.h
--- linux/include/asm-arm/mach/arch.h   2005/04/08 18:58:40     1.13
+++ linux/include/asm-arm/mach/arch.h   2005/07/12 09:19:19     1.14
@@ -26,7 +26,7 @@
                                                 * page tabe entry      */
 
        const char              *name;          /* architecture name    */
-       unsigned int            param_offset;   /* parameter page       */
+       unsigned long           boot_params;    /* tagged list          */
 
        unsigned int            video_start;    /* start of video RAM   */
        unsigned int            video_end;      /* end of video RAM     */
@@ -54,38 +54,6 @@
        .nr             = MACH_TYPE_##_type,    \
        .name           = _name,
 
-#define MAINTAINER(n)
-
-#define BOOT_MEM(_pram,_pio,_vio)              \
-       .phys_ram       = _pram,                \
-       .phys_io        = _pio,                 \
-       .io_pg_offst    = ((_vio)>>18)&0xfffc,
-
-#define BOOT_PARAMS(_params)                   \
-       .param_offset   = _params,
-
-#define VIDEO(_start,_end)                     \
-       .video_start    = _start,               \
-       .video_end      = _end,
-
-#define DISABLE_PARPORT(_n)                    \
-       .reserve_lp##_n = 1,
-
-#define SOFT_REBOOT                            \
-       .soft_reboot    = 1,
-
-#define FIXUP(_func)                           \
-       .fixup          = _func,
-
-#define MAPIO(_func)                           \
-       .map_io         = _func,
-
-#define INITIRQ(_func)                         \
-       .init_irq       = _func,
-
-#define INIT_MACHINE(_func)                    \
-       .init_machine   = _func,
-
 #define MACHINE_END                            \
 };
 
diff -urN linux/include/asm-arm26/serial.h linux/include/asm-arm26/serial.h
--- linux/include/asm-arm26/serial.h    2003/10/09 13:09:35     1.2
+++ linux/include/asm-arm26/serial.h    2005/07/12 09:19:19     1.3
@@ -30,34 +30,16 @@
 #if defined(CONFIG_ARCH_A5K)
      /* UART CLK        PORT  IRQ     FLAGS        */
 
-#define STD_SERIAL_PORT_DEFNS                                           \
+#define SERIAL_PORT_DFNS                                                \
         { 0, BASE_BAUD, 0x3F8, 10, STD_COM_FLAGS },     /* ttyS0 */     \
         { 0, BASE_BAUD, 0x2F8, 10, STD_COM_FLAGS },     /* ttyS1 */
 
 #else
 
-#define STD_SERIAL_PORT_DEFNS                                           \
+#define SERIAL_PORT_DFNS                                                \
         { 0, BASE_BAUD, 0    ,  0, STD_COM_FLAGS },     /* ttyS0 */     \
         { 0, BASE_BAUD, 0    ,  0, STD_COM_FLAGS },     /* ttyS1 */
 
 #endif
 
-#define EXTRA_SERIAL_PORT_DEFNS \
-        { 0, BASE_BAUD, 0    ,  0, STD_COM_FLAGS },     /* ttyS2 */     \
-        { 0, BASE_BAUD, 0    ,  0, STD_COM_FLAGS },     /* ttyS3 */     \
-        { 0, BASE_BAUD, 0    ,  0, STD_COM_FLAGS },     /* ttyS4 */     \
-        { 0, BASE_BAUD, 0    ,  0, STD_COM_FLAGS },     /* ttyS5 */     \
-        { 0, BASE_BAUD, 0    ,  0, STD_COM_FLAGS },     /* ttyS6 */     \
-        { 0, BASE_BAUD, 0    ,  0, STD_COM_FLAGS },     /* ttyS7 */     \
-        { 0, BASE_BAUD, 0    ,  0, STD_COM_FLAGS },     /* ttyS8 */     \
-        { 0, BASE_BAUD, 0    ,  0, STD_COM_FLAGS },     /* ttyS9 */     \
-        { 0, BASE_BAUD, 0    ,  0, STD_COM_FLAGS },     /* ttyS10 */    \
-        { 0, BASE_BAUD, 0    ,  0, STD_COM_FLAGS },     /* ttyS11 */    \
-        { 0, BASE_BAUD, 0    ,  0, STD_COM_FLAGS },     /* ttyS12 */    \
-        { 0, BASE_BAUD, 0    ,  0, STD_COM_FLAGS },     /* ttyS13 */
-
-#define SERIAL_PORT_DFNS               \
-       STD_SERIAL_PORT_DEFNS           \
-       EXTRA_SERIAL_PORT_DEFNS
-
 #endif
diff -urN linux/include/asm-i386/i8253.h linux/include/asm-i386/i8253.h
--- linux/include/asm-i386/i8253.h      1970/01/01 00:00:00
+++ linux/include/asm-i386/i8253.h      2005-07-12 10:19:19.578127000 +0100     
1.1
@@ -0,0 +1,6 @@
+#ifndef __ASM_I8253_H__
+#define __ASM_I8253_H__
+
+extern spinlock_t i8253_lock;
+
+#endif /* __ASM_I8253_H__ */
diff -urN linux/include/asm-i386/serial.h linux/include/asm-i386/serial.h
--- linux/include/asm-i386/serial.h     2004/06/26 15:15:24     1.6
+++ linux/include/asm-i386/serial.h     2005/07/12 09:19:19     1.7
@@ -22,109 +22,9 @@
 #define STD_COM4_FLAGS ASYNC_BOOT_AUTOCONF
 #endif
 
-#ifdef CONFIG_SERIAL_MANY_PORTS
-#define FOURPORT_FLAGS ASYNC_FOURPORT
-#define ACCENT_FLAGS 0
-#define BOCA_FLAGS 0
-#define HUB6_FLAGS 0
-#endif
-
-#define MCA_COM_FLAGS  (STD_COM_FLAGS|ASYNC_BOOT_ONLYMCA)
-
-/*
- * The following define the access methods for the HUB6 card. All
- * access is through two ports for all 24 possible chips. The card is
- * selected through the high 2 bits, the port on that card with the
- * "middle" 3 bits, and the register on that port with the bottom
- * 3 bits.
- *
- * While the access port and interrupt is configurable, the default
- * port locations are 0x302 for the port control register, and 0x303
- * for the data read/write register. Normally, the interrupt is at irq3
- * but can be anything from 3 to 7 inclusive. Note that using 3 will
- * require disabling com2.
- */
-
-#define C_P(card,port) (((card)<<6|(port)<<3) + 1)
-
-#define STD_SERIAL_PORT_DEFNS                  \
+#define SERIAL_PORT_DFNS                       \
        /* UART CLK   PORT IRQ     FLAGS        */                      \
        { 0, BASE_BAUD, 0x3F8, 4, STD_COM_FLAGS },      /* ttyS0 */     \
        { 0, BASE_BAUD, 0x2F8, 3, STD_COM_FLAGS },      /* ttyS1 */     \
        { 0, BASE_BAUD, 0x3E8, 4, STD_COM_FLAGS },      /* ttyS2 */     \
        { 0, BASE_BAUD, 0x2E8, 3, STD_COM4_FLAGS },     /* ttyS3 */
-
-
-#ifdef CONFIG_SERIAL_MANY_PORTS
-#define EXTRA_SERIAL_PORT_DEFNS                        \
-       { 0, BASE_BAUD, 0x1A0, 9, FOURPORT_FLAGS },     /* ttyS4 */     \
-       { 0, BASE_BAUD, 0x1A8, 9, FOURPORT_FLAGS },     /* ttyS5 */     \
-       { 0, BASE_BAUD, 0x1B0, 9, FOURPORT_FLAGS },     /* ttyS6 */     \
-       { 0, BASE_BAUD, 0x1B8, 9, FOURPORT_FLAGS },     /* ttyS7 */     \
-       { 0, BASE_BAUD, 0x2A0, 5, FOURPORT_FLAGS },     /* ttyS8 */     \
-       { 0, BASE_BAUD, 0x2A8, 5, FOURPORT_FLAGS },     /* ttyS9 */     \
-       { 0, BASE_BAUD, 0x2B0, 5, FOURPORT_FLAGS },     /* ttyS10 */    \
-       { 0, BASE_BAUD, 0x2B8, 5, FOURPORT_FLAGS },     /* ttyS11 */    \
-       { 0, BASE_BAUD, 0x330, 4, ACCENT_FLAGS },       /* ttyS12 */    \
-       { 0, BASE_BAUD, 0x338, 4, ACCENT_FLAGS },       /* ttyS13 */    \
-       { 0, BASE_BAUD, 0x000, 0, 0 },  /* ttyS14 (spare) */            \
-       { 0, BASE_BAUD, 0x000, 0, 0 },  /* ttyS15 (spare) */            \
-       { 0, BASE_BAUD, 0x100, 12, BOCA_FLAGS },        /* ttyS16 */    \
-       { 0, BASE_BAUD, 0x108, 12, BOCA_FLAGS },        /* ttyS17 */    \
-       { 0, BASE_BAUD, 0x110, 12, BOCA_FLAGS },        /* ttyS18 */    \
-       { 0, BASE_BAUD, 0x118, 12, BOCA_FLAGS },        /* ttyS19 */    \
-       { 0, BASE_BAUD, 0x120, 12, BOCA_FLAGS },        /* ttyS20 */    \
-       { 0, BASE_BAUD, 0x128, 12, BOCA_FLAGS },        /* ttyS21 */    \
-       { 0, BASE_BAUD, 0x130, 12, BOCA_FLAGS },        /* ttyS22 */    \
-       { 0, BASE_BAUD, 0x138, 12, BOCA_FLAGS },        /* ttyS23 */    \
-       { 0, BASE_BAUD, 0x140, 12, BOCA_FLAGS },        /* ttyS24 */    \
-       { 0, BASE_BAUD, 0x148, 12, BOCA_FLAGS },        /* ttyS25 */    \
-       { 0, BASE_BAUD, 0x150, 12, BOCA_FLAGS },        /* ttyS26 */    \
-       { 0, BASE_BAUD, 0x158, 12, BOCA_FLAGS },        /* ttyS27 */    \
-       { 0, BASE_BAUD, 0x160, 12, BOCA_FLAGS },        /* ttyS28 */    \
-       { 0, BASE_BAUD, 0x168, 12, BOCA_FLAGS },        /* ttyS29 */    \
-       { 0, BASE_BAUD, 0x170, 12, BOCA_FLAGS },        /* ttyS30 */    \
-       { 0, BASE_BAUD, 0x178, 12, BOCA_FLAGS },        /* ttyS31 */
-#else
-#define EXTRA_SERIAL_PORT_DEFNS
-#endif
-
-/* You can have up to four HUB6's in the system, but I've only
- * included two cards here for a total of twelve ports.
- */
-#if (defined(CONFIG_HUB6) && defined(CONFIG_SERIAL_MANY_PORTS))
-#define HUB6_SERIAL_PORT_DFNS          \
-       { 0, BASE_BAUD, 0x302, 3, HUB6_FLAGS, C_P(0,0) },  /* ttyS32 */ \
-       { 0, BASE_BAUD, 0x302, 3, HUB6_FLAGS, C_P(0,1) },  /* ttyS33 */ \
-       { 0, BASE_BAUD, 0x302, 3, HUB6_FLAGS, C_P(0,2) },  /* ttyS34 */ \
-       { 0, BASE_BAUD, 0x302, 3, HUB6_FLAGS, C_P(0,3) },  /* ttyS35 */ \
-       { 0, BASE_BAUD, 0x302, 3, HUB6_FLAGS, C_P(0,4) },  /* ttyS36 */ \
-       { 0, BASE_BAUD, 0x302, 3, HUB6_FLAGS, C_P(0,5) },  /* ttyS37 */ \
-       { 0, BASE_BAUD, 0x302, 3, HUB6_FLAGS, C_P(1,0) },  /* ttyS38 */ \
-       { 0, BASE_BAUD, 0x302, 3, HUB6_FLAGS, C_P(1,1) },  /* ttyS39 */ \
-       { 0, BASE_BAUD, 0x302, 3, HUB6_FLAGS, C_P(1,2) },  /* ttyS40 */ \
-       { 0, BASE_BAUD, 0x302, 3, HUB6_FLAGS, C_P(1,3) },  /* ttyS41 */ \
-       { 0, BASE_BAUD, 0x302, 3, HUB6_FLAGS, C_P(1,4) },  /* ttyS42 */ \
-       { 0, BASE_BAUD, 0x302, 3, HUB6_FLAGS, C_P(1,5) },  /* ttyS43 */
-#else
-#define HUB6_SERIAL_PORT_DFNS
-#endif
-
-#ifdef CONFIG_MCA
-#define MCA_SERIAL_PORT_DFNS                   \
-       { 0, BASE_BAUD, 0x3220, 3, MCA_COM_FLAGS },     \
-       { 0, BASE_BAUD, 0x3228, 3, MCA_COM_FLAGS },     \
-       { 0, BASE_BAUD, 0x4220, 3, MCA_COM_FLAGS },     \
-       { 0, BASE_BAUD, 0x4228, 3, MCA_COM_FLAGS },     \
-       { 0, BASE_BAUD, 0x5220, 3, MCA_COM_FLAGS },     \
-       { 0, BASE_BAUD, 0x5228, 3, MCA_COM_FLAGS },
-#else
-#define MCA_SERIAL_PORT_DFNS
-#endif
-
-#define SERIAL_PORT_DFNS               \
-       STD_SERIAL_PORT_DEFNS           \
-       EXTRA_SERIAL_PORT_DEFNS         \
-       HUB6_SERIAL_PORT_DFNS           \
-       MCA_SERIAL_PORT_DFNS
-
diff -urN linux/include/asm-i386/mach-default/do_timer.h 
linux/include/asm-i386/mach-default/do_timer.h
--- linux/include/asm-i386/mach-default/do_timer.h      2004/10/25 20:44:43     
1.4
+++ linux/include/asm-i386/mach-default/do_timer.h      2005/07/12 09:19:19     
1.5
@@ -1,6 +1,7 @@
 /* defines for inline arch setup functions */
 
 #include <asm/apic.h>
+#include <asm/i8259.h>
 
 /**
  * do_timer_interrupt_hook - hook into timer tick
diff -urN linux/include/asm-ia64/mmu_context.h 
linux/include/asm-ia64/mmu_context.h
--- linux/include/asm-ia64/mmu_context.h        2004/10/12 14:36:39     1.21
+++ linux/include/asm-ia64/mmu_context.h        2005/07/12 09:19:19     1.22
@@ -132,6 +132,9 @@
        ia64_srlz_i();                  /* srlz.i implies srlz.d */
 }
 
+/*
+ * Must be called with preemption off
+ */
 static inline void
 activate_context (struct mm_struct *mm)
 {
diff -urN linux/include/asm-ia64/vga.h linux/include/asm-ia64/vga.h
--- linux/include/asm-ia64/vga.h        2000/02/23 00:41:37     1.1
+++ linux/include/asm-ia64/vga.h        2005/07/12 09:19:19     1.2
@@ -14,7 +14,10 @@
  * videoram directly without any black magic.
  */
 
-#define VGA_MAP_MEM(x) ((unsigned long) ioremap((x), 0))
+extern unsigned long vga_console_iobase;
+extern unsigned long vga_console_membase;
+
+#define VGA_MAP_MEM(x) ((unsigned long) ioremap(vga_console_membase + (x), 0))
 
 #define vga_readb(x)   (*(x))
 #define vga_writeb(x,y)        (*(y) = (x))
diff -urN linux/include/asm-ia64/sn/addrs.h linux/include/asm-ia64/sn/addrs.h
--- linux/include/asm-ia64/sn/addrs.h   2005/05/19 12:08:42     1.12
+++ linux/include/asm-ia64/sn/addrs.h   2005/07/12 09:19:19     1.13
@@ -216,6 +216,10 @@
 #define TIO_SWIN_WIDGETNUM(x)          (((x)  >> TIO_SWIN_SIZE_BITS) & 
TIO_SWIN_WIDGET_MASK)
 
 
+#define TIO_IOSPACE_ADDR(n,x)                                  \
+       /* Move in the Chiplet ID for TIO Local Block MMR */    \
+       (REMOTE_ADDR(n,x) | 1UL << (NASID_SHIFT - 2))
+
 /*
  * The following macros produce the correct base virtual address for
  * the hub registers. The REMOTE_HUB_* macro produce
@@ -233,13 +237,16 @@
 #define REMOTE_HUB_ADDR(n,x)                                           \
        ((n & 1) ?                                                      \
        /* TIO: */                                                      \
-       ((volatile u64 *)(GLOBAL_MMR_ADDR(n,x)))                        \
-       : /* SHUB: */                                                   \
-       (((x) & BWIN_TOP) ? ((volatile u64 *)(GLOBAL_MMR_ADDR(n,x)))\
+       (is_shub2() ?                                                   \
+       /* TIO on Shub2 */                                              \
+       (volatile u64 *)(TIO_IOSPACE_ADDR(n,x))                         \
+       : /* TIO on shub1 */                                            \
+       (volatile u64 *)(GLOBAL_MMR_ADDR(n,x)))                         \
+                                                                       \
+       : /* SHUB1 and SHUB2 MMRs: */                                   \
+       (((x) & BWIN_TOP) ? ((volatile u64 *)(GLOBAL_MMR_ADDR(n,x)))    \
        : ((volatile u64 *)(NODE_SWIN_BASE(n,1) + 0x800000 + (x)))))
 
-
-
 #define HUB_L(x)                       (*((volatile typeof(*x) *)x))
 #define        HUB_S(x,d)                      (*((volatile typeof(*x) *)x) = 
(d))
 
diff -urN linux/include/asm-ia64/sn/l1.h linux/include/asm-ia64/sn/l1.h
--- linux/include/asm-ia64/sn/l1.h      2005/05/19 12:08:42     1.2
+++ linux/include/asm-ia64/sn/l1.h      2005/07/12 09:19:19     1.3
@@ -33,5 +33,6 @@
 #define L1_BRICKTYPE_PA                0x6a            /* j */
 #define L1_BRICKTYPE_IA                0x6b            /* k */
 #define L1_BRICKTYPE_ATHENA    0x2b            /* + */
+#define L1_BRICKTYPE_DAYTONA   0x7a            /* z */
 
 #endif /* _ASM_IA64_SN_L1_H */
diff -urN linux/include/asm-ia64/sn/shub_mmr.h 
linux/include/asm-ia64/sn/shub_mmr.h
--- linux/include/asm-ia64/sn/shub_mmr.h        2005/05/19 12:08:42     1.4
+++ linux/include/asm-ia64/sn/shub_mmr.h        2005/07/12 09:19:19     1.5
@@ -14,96 +14,98 @@
 /*                        Register "SH_IPI_INT"                         */
 /*               SHub Inter-Processor Interrupt Registers               */
 /* ==================================================================== */
-#define SH1_IPI_INT                               0x0000000110000380
-#define SH2_IPI_INT                               0x0000000010000380
+#define SH1_IPI_INT                    __IA64_UL_CONST(0x0000000110000380)
+#define SH2_IPI_INT                    __IA64_UL_CONST(0x0000000010000380)
 
 /*   SH_IPI_INT_TYPE                                                    */
 /*   Description:  Type of Interrupt: 0=INT, 2=PMI, 4=NMI, 5=INIT       */
-#define SH_IPI_INT_TYPE_SHFT                     0
-#define SH_IPI_INT_TYPE_MASK                     0x0000000000000007
+#define SH_IPI_INT_TYPE_SHFT                           0
+#define SH_IPI_INT_TYPE_MASK           __IA64_UL_CONST(0x0000000000000007)
 
 /*   SH_IPI_INT_AGT                                                     */
 /*   Description:  Agent, must be 0 for SHub                            */
-#define SH_IPI_INT_AGT_SHFT                      3
-#define SH_IPI_INT_AGT_MASK                      0x0000000000000008
+#define SH_IPI_INT_AGT_SHFT                            3
+#define SH_IPI_INT_AGT_MASK            __IA64_UL_CONST(0x0000000000000008)
 
 /*   SH_IPI_INT_PID                                                     */
 /*   Description:  Processor ID, same setting as on targeted McKinley  */
-#define SH_IPI_INT_PID_SHFT                      4
-#define SH_IPI_INT_PID_MASK                      0x00000000000ffff0
+#define SH_IPI_INT_PID_SHFT                            4
+#define SH_IPI_INT_PID_MASK            __IA64_UL_CONST(0x00000000000ffff0)
 
 /*   SH_IPI_INT_BASE                                                    */
 /*   Description:  Optional interrupt vector area, 2MB aligned          */
-#define SH_IPI_INT_BASE_SHFT                     21
-#define SH_IPI_INT_BASE_MASK                     0x0003ffffffe00000
+#define SH_IPI_INT_BASE_SHFT                           21
+#define SH_IPI_INT_BASE_MASK           __IA64_UL_CONST(0x0003ffffffe00000)
 
 /*   SH_IPI_INT_IDX                                                     */
 /*   Description:  Targeted McKinley interrupt vector                   */
-#define SH_IPI_INT_IDX_SHFT                      52
-#define SH_IPI_INT_IDX_MASK                      0x0ff0000000000000
+#define SH_IPI_INT_IDX_SHFT                            52
+#define SH_IPI_INT_IDX_MASK            __IA64_UL_CONST(0x0ff0000000000000)
 
 /*   SH_IPI_INT_SEND                                                    */
 /*   Description:  Send Interrupt Message to PI, This generates a puls  */
-#define SH_IPI_INT_SEND_SHFT                     63
-#define SH_IPI_INT_SEND_MASK                     0x8000000000000000
+#define SH_IPI_INT_SEND_SHFT                           63
+#define SH_IPI_INT_SEND_MASK           __IA64_UL_CONST(0x8000000000000000)
 
 /* ==================================================================== */
 /*                     Register "SH_EVENT_OCCURRED"                     */
 /*                    SHub Interrupt Event Occurred                     */
 /* ==================================================================== */
-#define SH1_EVENT_OCCURRED                        0x0000000110010000
-#define SH1_EVENT_OCCURRED_ALIAS                  0x0000000110010008
-#define SH2_EVENT_OCCURRED                        0x0000000010010000
-#define SH2_EVENT_OCCURRED_ALIAS                  0x0000000010010008
+#define SH1_EVENT_OCCURRED             __IA64_UL_CONST(0x0000000110010000)
+#define SH1_EVENT_OCCURRED_ALIAS       __IA64_UL_CONST(0x0000000110010008)
+#define SH2_EVENT_OCCURRED             __IA64_UL_CONST(0x0000000010010000)
+#define SH2_EVENT_OCCURRED_ALIAS       __IA64_UL_CONST(0x0000000010010008)
 
 /* ==================================================================== */
 /*                     Register "SH_PI_CAM_CONTROL"                     */
 /*                      CRB CAM MMR Access Control                      */
 /* ==================================================================== */
-#define SH1_PI_CAM_CONTROL                        0x0000000120050300
+#define SH1_PI_CAM_CONTROL             __IA64_UL_CONST(0x0000000120050300)
 
 /* ==================================================================== */
 /*                        Register "SH_SHUB_ID"                         */
 /*                            SHub ID Number                            */
 /* ==================================================================== */
-#define SH1_SHUB_ID                               0x0000000110060580
-#define SH1_SHUB_ID_REVISION_SHFT                 28
-#define SH1_SHUB_ID_REVISION_MASK                 0x00000000f0000000
+#define SH1_SHUB_ID                    __IA64_UL_CONST(0x0000000110060580)
+#define SH1_SHUB_ID_REVISION_SHFT                      28
+#define SH1_SHUB_ID_REVISION_MASK      __IA64_UL_CONST(0x00000000f0000000)
 
 /* ==================================================================== */
 /*                          Register "SH_RTC"                           */
 /*                           Real-time Clock                            */
 /* ==================================================================== */
-#define SH1_RTC                                   0x00000001101c0000
-#define SH2_RTC                                          0x00000002101c0000
-#define SH_RTC_MASK                               0x007fffffffffffff
+#define SH1_RTC                                
__IA64_UL_CONST(0x00000001101c0000)
+#define SH2_RTC                                
__IA64_UL_CONST(0x00000002101c0000)
+#define SH_RTC_MASK                    __IA64_UL_CONST(0x007fffffffffffff)
 
 /* ==================================================================== */
 /*                   Register "SH_PIO_WRITE_STATUS_0|1"                 */
 /*                      PIO Write Status for CPU 0 & 1                  */
 /* ==================================================================== */
-#define SH1_PIO_WRITE_STATUS_0                    0x0000000120070200
-#define SH1_PIO_WRITE_STATUS_1                    0x0000000120070280
-#define SH2_PIO_WRITE_STATUS_0                    0x0000000020070200
-#define SH2_PIO_WRITE_STATUS_1                    0x0000000020070280
-#define SH2_PIO_WRITE_STATUS_2                    0x0000000020070300
-#define SH2_PIO_WRITE_STATUS_3                    0x0000000020070380
+#define SH1_PIO_WRITE_STATUS_0         __IA64_UL_CONST(0x0000000120070200)
+#define SH1_PIO_WRITE_STATUS_1         __IA64_UL_CONST(0x0000000120070280)
+#define SH2_PIO_WRITE_STATUS_0         __IA64_UL_CONST(0x0000000020070200)
+#define SH2_PIO_WRITE_STATUS_1         __IA64_UL_CONST(0x0000000020070280)
+#define SH2_PIO_WRITE_STATUS_2         __IA64_UL_CONST(0x0000000020070300)
+#define SH2_PIO_WRITE_STATUS_3         __IA64_UL_CONST(0x0000000020070380)
 
 /*   SH_PIO_WRITE_STATUS_0_WRITE_DEADLOCK                               */
 /*   Description:  Deadlock response detected                           */
-#define SH_PIO_WRITE_STATUS_WRITE_DEADLOCK_SHFT 1
-#define SH_PIO_WRITE_STATUS_WRITE_DEADLOCK_MASK 0x0000000000000002
+#define SH_PIO_WRITE_STATUS_WRITE_DEADLOCK_SHFT                1
+#define SH_PIO_WRITE_STATUS_WRITE_DEADLOCK_MASK \
+                                       __IA64_UL_CONST(0x0000000000000002)
 
 /*   SH_PIO_WRITE_STATUS_0_PENDING_WRITE_COUNT                          */
 /*   Description:  Count of currently pending PIO writes                */
-#define SH_PIO_WRITE_STATUS_PENDING_WRITE_COUNT_SHFT 56
-#define SH_PIO_WRITE_STATUS_PENDING_WRITE_COUNT_MASK 0x3f00000000000000
+#define SH_PIO_WRITE_STATUS_PENDING_WRITE_COUNT_SHFT   56
+#define SH_PIO_WRITE_STATUS_PENDING_WRITE_COUNT_MASK \
+                                       __IA64_UL_CONST(0x3f00000000000000)
 
 /* ==================================================================== */
 /*                Register "SH_PIO_WRITE_STATUS_0_ALIAS"                */
 /* ==================================================================== */
-#define SH1_PIO_WRITE_STATUS_0_ALIAS              0x0000000120070208
-#define SH2_PIO_WRITE_STATUS_0_ALIAS              0x0000000020070208
+#define SH1_PIO_WRITE_STATUS_0_ALIAS   __IA64_UL_CONST(0x0000000120070208)
+#define SH2_PIO_WRITE_STATUS_0_ALIAS   __IA64_UL_CONST(0x0000000020070208)
 
 /* ==================================================================== */
 /*                     Register "SH_EVENT_OCCURRED"                     */
@@ -111,33 +113,33 @@
 /* ==================================================================== */
 /*   SH_EVENT_OCCURRED_UART_INT                                         */
 /*   Description:  Pending Junk Bus UART Interrupt                      */
-#define SH_EVENT_OCCURRED_UART_INT_SHFT          20
-#define SH_EVENT_OCCURRED_UART_INT_MASK          0x0000000000100000
+#define SH_EVENT_OCCURRED_UART_INT_SHFT                        20
+#define SH_EVENT_OCCURRED_UART_INT_MASK        
__IA64_UL_CONST(0x0000000000100000)
 
 /*   SH_EVENT_OCCURRED_IPI_INT                                          */
 /*   Description:  Pending IPI Interrupt                                */
-#define SH_EVENT_OCCURRED_IPI_INT_SHFT           28
-#define SH_EVENT_OCCURRED_IPI_INT_MASK           0x0000000010000000
+#define SH_EVENT_OCCURRED_IPI_INT_SHFT                 28
+#define SH_EVENT_OCCURRED_IPI_INT_MASK __IA64_UL_CONST(0x0000000010000000)
 
 /*   SH_EVENT_OCCURRED_II_INT0                                          */
 /*   Description:  Pending II 0 Interrupt                               */
-#define SH_EVENT_OCCURRED_II_INT0_SHFT           29
-#define SH_EVENT_OCCURRED_II_INT0_MASK           0x0000000020000000
+#define SH_EVENT_OCCURRED_II_INT0_SHFT                 29
+#define SH_EVENT_OCCURRED_II_INT0_MASK __IA64_UL_CONST(0x0000000020000000)
 
 /*   SH_EVENT_OCCURRED_II_INT1                                          */
 /*   Description:  Pending II 1 Interrupt                               */
-#define SH_EVENT_OCCURRED_II_INT1_SHFT           30
-#define SH_EVENT_OCCURRED_II_INT1_MASK           0x0000000040000000
+#define SH_EVENT_OCCURRED_II_INT1_SHFT                 30
+#define SH_EVENT_OCCURRED_II_INT1_MASK __IA64_UL_CONST(0x0000000040000000)
 
 /*   SH2_EVENT_OCCURRED_EXTIO_INT2                                      */
 /*   Description:  Pending SHUB 2 EXT IO INT2                           */
-#define SH2_EVENT_OCCURRED_EXTIO_INT2_SHFT       33
-#define SH2_EVENT_OCCURRED_EXTIO_INT2_MASK       0x0000000200000000
+#define SH2_EVENT_OCCURRED_EXTIO_INT2_SHFT             33
+#define SH2_EVENT_OCCURRED_EXTIO_INT2_MASK __IA64_UL_CONST(0x0000000200000000)
 
 /*   SH2_EVENT_OCCURRED_EXTIO_INT3                                      */
 /*   Description:  Pending SHUB 2 EXT IO INT3                           */
-#define SH2_EVENT_OCCURRED_EXTIO_INT3_SHFT       34
-#define SH2_EVENT_OCCURRED_EXTIO_INT3_MASK       0x0000000400000000
+#define SH2_EVENT_OCCURRED_EXTIO_INT3_SHFT             34
+#define SH2_EVENT_OCCURRED_EXTIO_INT3_MASK __IA64_UL_CONST(0x0000000400000000)
 
 #define SH_ALL_INT_MASK \
        (SH_EVENT_OCCURRED_UART_INT_MASK | SH_EVENT_OCCURRED_IPI_INT_MASK | \
@@ -149,310 +151,310 @@
 /* ==================================================================== */
 /*                         LEDS                                         */
 /* ==================================================================== */
-#define SH1_REAL_JUNK_BUS_LED0                  0x7fed00000UL
-#define SH1_REAL_JUNK_BUS_LED1                  0x7fed10000UL
-#define SH1_REAL_JUNK_BUS_LED2                  0x7fed20000UL
-#define SH1_REAL_JUNK_BUS_LED3                  0x7fed30000UL
-
-#define SH2_REAL_JUNK_BUS_LED0                  0xf0000000UL
-#define SH2_REAL_JUNK_BUS_LED1                  0xf0010000UL
-#define SH2_REAL_JUNK_BUS_LED2                  0xf0020000UL
-#define SH2_REAL_JUNK_BUS_LED3                  0xf0030000UL
+#define SH1_REAL_JUNK_BUS_LED0                 0x7fed00000UL
+#define SH1_REAL_JUNK_BUS_LED1                 0x7fed10000UL
+#define SH1_REAL_JUNK_BUS_LED2                 0x7fed20000UL
+#define SH1_REAL_JUNK_BUS_LED3                 0x7fed30000UL
+
+#define SH2_REAL_JUNK_BUS_LED0                 0xf0000000UL
+#define SH2_REAL_JUNK_BUS_LED1                 0xf0010000UL
+#define SH2_REAL_JUNK_BUS_LED2                 0xf0020000UL
+#define SH2_REAL_JUNK_BUS_LED3                 0xf0030000UL
 
 /* ==================================================================== */
 /*                         Register "SH1_PTC_0"                         */
 /*       Puge Translation Cache Message Configuration Information       */
 /* ==================================================================== */
-#define SH1_PTC_0                                 0x00000001101a0000
+#define SH1_PTC_0                      __IA64_UL_CONST(0x00000001101a0000)
 
 /*   SH1_PTC_0_A                                                        */
 /*   Description:  Type                                                 */
-#define SH1_PTC_0_A_SHFT                          0
+#define SH1_PTC_0_A_SHFT                               0
 
 /*   SH1_PTC_0_PS                                                       */
 /*   Description:  Page Size                                            */
-#define SH1_PTC_0_PS_SHFT                         2
+#define SH1_PTC_0_PS_SHFT                              2
 
 /*   SH1_PTC_0_RID                                                      */
 /*   Description:  Region ID                                            */
-#define SH1_PTC_0_RID_SHFT                        8
+#define SH1_PTC_0_RID_SHFT                             8
 
 /*   SH1_PTC_0_START                                                    */
 /*   Description:  Start                                                */
-#define SH1_PTC_0_START_SHFT                      63
+#define SH1_PTC_0_START_SHFT                           63
 
 /* ==================================================================== */
 /*                         Register "SH1_PTC_1"                         */
 /*       Puge Translation Cache Message Configuration Information       */
 /* ==================================================================== */
-#define SH1_PTC_1                                 0x00000001101a0080
+#define SH1_PTC_1                      __IA64_UL_CONST(0x00000001101a0080)
 
 /*   SH1_PTC_1_START                                                    */
 /*   Description:  PTC_1 Start                                          */
-#define SH1_PTC_1_START_SHFT                      63
-
+#define SH1_PTC_1_START_SHFT                           63
 
 /* ==================================================================== */
 /*                         Register "SH2_PTC"                           */
 /*       Puge Translation Cache Message Configuration Information       */
 /* ==================================================================== */
-#define SH2_PTC                                   0x0000000170000000
+#define SH2_PTC                                
__IA64_UL_CONST(0x0000000170000000)
 
 /*   SH2_PTC_A                                                          */
 /*   Description:  Type                                                 */
-#define SH2_PTC_A_SHFT                            0
+#define SH2_PTC_A_SHFT                                 0
 
 /*   SH2_PTC_PS                                                         */
 /*   Description:  Page Size                                            */
-#define SH2_PTC_PS_SHFT                           2
+#define SH2_PTC_PS_SHFT                                        2
 
 /*   SH2_PTC_RID                                                      */
 /*   Description:  Region ID                                            */
-#define SH2_PTC_RID_SHFT                          4
+#define SH2_PTC_RID_SHFT                               4
 
 /*   SH2_PTC_START                                                      */
 /*   Description:  Start                                                */
-#define SH2_PTC_START_SHFT                        63
+#define SH2_PTC_START_SHFT                             63
 
 /*   SH2_PTC_ADDR_RID                                                   */
 /*   Description:  Region ID                                            */
-#define SH2_PTC_ADDR_SHFT                         4
-#define SH2_PTC_ADDR_MASK                         0x1ffffffffffff000
+#define SH2_PTC_ADDR_SHFT                              4
+#define SH2_PTC_ADDR_MASK              __IA64_UL_CONST(0x1ffffffffffff000)
 
 /* ==================================================================== */
 /*                    Register "SH_RTC1_INT_CONFIG"                     */
 /*                SHub RTC 1 Interrupt Config Registers                 */
 /* ==================================================================== */
 
-#define SH1_RTC1_INT_CONFIG                      0x0000000110001480
-#define SH2_RTC1_INT_CONFIG                      0x0000000010001480
-#define SH_RTC1_INT_CONFIG_MASK                  0x0ff3ffffffefffff
-#define SH_RTC1_INT_CONFIG_INIT                  0x0000000000000000
+#define SH1_RTC1_INT_CONFIG            __IA64_UL_CONST(0x0000000110001480)
+#define SH2_RTC1_INT_CONFIG            __IA64_UL_CONST(0x0000000010001480)
+#define SH_RTC1_INT_CONFIG_MASK                
__IA64_UL_CONST(0x0ff3ffffffefffff)
+#define SH_RTC1_INT_CONFIG_INIT                
__IA64_UL_CONST(0x0000000000000000)
 
 /*   SH_RTC1_INT_CONFIG_TYPE                                            */
 /*   Description:  Type of Interrupt: 0=INT, 2=PMI, 4=NMI, 5=INIT       */
-#define SH_RTC1_INT_CONFIG_TYPE_SHFT             0
-#define SH_RTC1_INT_CONFIG_TYPE_MASK             0x0000000000000007
+#define SH_RTC1_INT_CONFIG_TYPE_SHFT                   0
+#define SH_RTC1_INT_CONFIG_TYPE_MASK   __IA64_UL_CONST(0x0000000000000007)
 
 /*   SH_RTC1_INT_CONFIG_AGT                                             */
 /*   Description:  Agent, must be 0 for SHub                            */
-#define SH_RTC1_INT_CONFIG_AGT_SHFT              3
-#define SH_RTC1_INT_CONFIG_AGT_MASK              0x0000000000000008
+#define SH_RTC1_INT_CONFIG_AGT_SHFT                    3
+#define SH_RTC1_INT_CONFIG_AGT_MASK    __IA64_UL_CONST(0x0000000000000008)
 
 /*   SH_RTC1_INT_CONFIG_PID                                             */
 /*   Description:  Processor ID, same setting as on targeted McKinley  */
-#define SH_RTC1_INT_CONFIG_PID_SHFT              4
-#define SH_RTC1_INT_CONFIG_PID_MASK              0x00000000000ffff0
+#define SH_RTC1_INT_CONFIG_PID_SHFT                    4
+#define SH_RTC1_INT_CONFIG_PID_MASK    __IA64_UL_CONST(0x00000000000ffff0)
 
 /*   SH_RTC1_INT_CONFIG_BASE                                            */
 /*   Description:  Optional interrupt vector area, 2MB aligned          */
-#define SH_RTC1_INT_CONFIG_BASE_SHFT             21
-#define SH_RTC1_INT_CONFIG_BASE_MASK             0x0003ffffffe00000
+#define SH_RTC1_INT_CONFIG_BASE_SHFT                   21
+#define SH_RTC1_INT_CONFIG_BASE_MASK   __IA64_UL_CONST(0x0003ffffffe00000)
 
 /*   SH_RTC1_INT_CONFIG_IDX                                             */
 /*   Description:  Targeted McKinley interrupt vector                   */
-#define SH_RTC1_INT_CONFIG_IDX_SHFT              52
-#define SH_RTC1_INT_CONFIG_IDX_MASK              0x0ff0000000000000
+#define SH_RTC1_INT_CONFIG_IDX_SHFT                    52
+#define SH_RTC1_INT_CONFIG_IDX_MASK    __IA64_UL_CONST(0x0ff0000000000000)
 
 /* ==================================================================== */
 /*                    Register "SH_RTC1_INT_ENABLE"                     */
 /*                SHub RTC 1 Interrupt Enable Registers                 */
 /* ==================================================================== */
 
-#define SH1_RTC1_INT_ENABLE                      0x0000000110001500
-#define SH2_RTC1_INT_ENABLE                      0x0000000010001500
-#define SH_RTC1_INT_ENABLE_MASK                  0x0000000000000001
-#define SH_RTC1_INT_ENABLE_INIT                  0x0000000000000000
+#define SH1_RTC1_INT_ENABLE            __IA64_UL_CONST(0x0000000110001500)
+#define SH2_RTC1_INT_ENABLE            __IA64_UL_CONST(0x0000000010001500)
+#define SH_RTC1_INT_ENABLE_MASK                
__IA64_UL_CONST(0x0000000000000001)
+#define SH_RTC1_INT_ENABLE_INIT                
__IA64_UL_CONST(0x0000000000000000)
 
 /*   SH_RTC1_INT_ENABLE_RTC1_ENABLE                                     */
 /*   Description:  Enable RTC 1 Interrupt                               */
-#define SH_RTC1_INT_ENABLE_RTC1_ENABLE_SHFT      0
-#define SH_RTC1_INT_ENABLE_RTC1_ENABLE_MASK      0x0000000000000001
+#define SH_RTC1_INT_ENABLE_RTC1_ENABLE_SHFT            0
+#define SH_RTC1_INT_ENABLE_RTC1_ENABLE_MASK \
+                                       __IA64_UL_CONST(0x0000000000000001)
 
 /* ==================================================================== */
 /*                    Register "SH_RTC2_INT_CONFIG"                     */
 /*                SHub RTC 2 Interrupt Config Registers                 */
 /* ==================================================================== */
 
-#define SH1_RTC2_INT_CONFIG                      0x0000000110001580
-#define SH2_RTC2_INT_CONFIG                      0x0000000010001580
-#define SH_RTC2_INT_CONFIG_MASK                  0x0ff3ffffffefffff
-#define SH_RTC2_INT_CONFIG_INIT                  0x0000000000000000
+#define SH1_RTC2_INT_CONFIG            __IA64_UL_CONST(0x0000000110001580)
+#define SH2_RTC2_INT_CONFIG            __IA64_UL_CONST(0x0000000010001580)
+#define SH_RTC2_INT_CONFIG_MASK                
__IA64_UL_CONST(0x0ff3ffffffefffff)
+#define SH_RTC2_INT_CONFIG_INIT                
__IA64_UL_CONST(0x0000000000000000)
 
 /*   SH_RTC2_INT_CONFIG_TYPE                                            */
 /*   Description:  Type of Interrupt: 0=INT, 2=PMI, 4=NMI, 5=INIT       */
-#define SH_RTC2_INT_CONFIG_TYPE_SHFT             0
-#define SH_RTC2_INT_CONFIG_TYPE_MASK             0x0000000000000007
+#define SH_RTC2_INT_CONFIG_TYPE_SHFT                   0
+#define SH_RTC2_INT_CONFIG_TYPE_MASK   __IA64_UL_CONST(0x0000000000000007)
 
 /*   SH_RTC2_INT_CONFIG_AGT                                             */
 /*   Description:  Agent, must be 0 for SHub                            */
-#define SH_RTC2_INT_CONFIG_AGT_SHFT              3
-#define SH_RTC2_INT_CONFIG_AGT_MASK              0x0000000000000008
+#define SH_RTC2_INT_CONFIG_AGT_SHFT                    3
+#define SH_RTC2_INT_CONFIG_AGT_MASK    __IA64_UL_CONST(0x0000000000000008)
 
 /*   SH_RTC2_INT_CONFIG_PID                                             */
 /*   Description:  Processor ID, same setting as on targeted McKinley  */
-#define SH_RTC2_INT_CONFIG_PID_SHFT              4
-#define SH_RTC2_INT_CONFIG_PID_MASK              0x00000000000ffff0
+#define SH_RTC2_INT_CONFIG_PID_SHFT                    4
+#define SH_RTC2_INT_CONFIG_PID_MASK    __IA64_UL_CONST(0x00000000000ffff0)
 
 /*   SH_RTC2_INT_CONFIG_BASE                                            */
 /*   Description:  Optional interrupt vector area, 2MB aligned          */
-#define SH_RTC2_INT_CONFIG_BASE_SHFT             21
-#define SH_RTC2_INT_CONFIG_BASE_MASK             0x0003ffffffe00000
+#define SH_RTC2_INT_CONFIG_BASE_SHFT                   21
+#define SH_RTC2_INT_CONFIG_BASE_MASK   __IA64_UL_CONST(0x0003ffffffe00000)
 
 /*   SH_RTC2_INT_CONFIG_IDX                                             */
 /*   Description:  Targeted McKinley interrupt vector                   */
-#define SH_RTC2_INT_CONFIG_IDX_SHFT              52
-#define SH_RTC2_INT_CONFIG_IDX_MASK              0x0ff0000000000000
+#define SH_RTC2_INT_CONFIG_IDX_SHFT                    52
+#define SH_RTC2_INT_CONFIG_IDX_MASK    __IA64_UL_CONST(0x0ff0000000000000)
 
 /* ==================================================================== */
 /*                    Register "SH_RTC2_INT_ENABLE"                     */
 /*                SHub RTC 2 Interrupt Enable Registers                 */
 /* ==================================================================== */
 
-#define SH1_RTC2_INT_ENABLE                      0x0000000110001600
-#define SH2_RTC2_INT_ENABLE                      0x0000000010001600
-#define SH_RTC2_INT_ENABLE_MASK                  0x0000000000000001
-#define SH_RTC2_INT_ENABLE_INIT                  0x0000000000000000
+#define SH1_RTC2_INT_ENABLE            __IA64_UL_CONST(0x0000000110001600)
+#define SH2_RTC2_INT_ENABLE            __IA64_UL_CONST(0x0000000010001600)
+#define SH_RTC2_INT_ENABLE_MASK                
__IA64_UL_CONST(0x0000000000000001)
+#define SH_RTC2_INT_ENABLE_INIT                
__IA64_UL_CONST(0x0000000000000000)
 
 /*   SH_RTC2_INT_ENABLE_RTC2_ENABLE                                     */
 /*   Description:  Enable RTC 2 Interrupt                               */
-#define SH_RTC2_INT_ENABLE_RTC2_ENABLE_SHFT      0
-#define SH_RTC2_INT_ENABLE_RTC2_ENABLE_MASK      0x0000000000000001
+#define SH_RTC2_INT_ENABLE_RTC2_ENABLE_SHFT            0
+#define SH_RTC2_INT_ENABLE_RTC2_ENABLE_MASK \
+                                       __IA64_UL_CONST(0x0000000000000001)
 
 /* ==================================================================== */
 /*                    Register "SH_RTC3_INT_CONFIG"                     */
 /*                SHub RTC 3 Interrupt Config Registers                 */
 /* ==================================================================== */
 
-#define SH1_RTC3_INT_CONFIG                      0x0000000110001680
-#define SH2_RTC3_INT_CONFIG                      0x0000000010001680
-#define SH_RTC3_INT_CONFIG_MASK                  0x0ff3ffffffefffff
-#define SH_RTC3_INT_CONFIG_INIT                  0x0000000000000000
+#define SH1_RTC3_INT_CONFIG            __IA64_UL_CONST(0x0000000110001680)
+#define SH2_RTC3_INT_CONFIG            __IA64_UL_CONST(0x0000000010001680)
+#define SH_RTC3_INT_CONFIG_MASK                
__IA64_UL_CONST(0x0ff3ffffffefffff)
+#define SH_RTC3_INT_CONFIG_INIT                
__IA64_UL_CONST(0x0000000000000000)
 
 /*   SH_RTC3_INT_CONFIG_TYPE                                            */
 /*   Description:  Type of Interrupt: 0=INT, 2=PMI, 4=NMI, 5=INIT       */
-#define SH_RTC3_INT_CONFIG_TYPE_SHFT             0
-#define SH_RTC3_INT_CONFIG_TYPE_MASK             0x0000000000000007
+#define SH_RTC3_INT_CONFIG_TYPE_SHFT                   0
+#define SH_RTC3_INT_CONFIG_TYPE_MASK   __IA64_UL_CONST(0x0000000000000007)
 
 /*   SH_RTC3_INT_CONFIG_AGT                                             */
 /*   Description:  Agent, must be 0 for SHub                            */
-#define SH_RTC3_INT_CONFIG_AGT_SHFT              3
-#define SH_RTC3_INT_CONFIG_AGT_MASK              0x0000000000000008
+#define SH_RTC3_INT_CONFIG_AGT_SHFT                    3
+#define SH_RTC3_INT_CONFIG_AGT_MASK    __IA64_UL_CONST(0x0000000000000008)
 
 /*   SH_RTC3_INT_CONFIG_PID                                             */
 /*   Description:  Processor ID, same setting as on targeted McKinley  */
-#define SH_RTC3_INT_CONFIG_PID_SHFT              4
-#define SH_RTC3_INT_CONFIG_PID_MASK              0x00000000000ffff0
+#define SH_RTC3_INT_CONFIG_PID_SHFT                    4
+#define SH_RTC3_INT_CONFIG_PID_MASK    __IA64_UL_CONST(0x00000000000ffff0)
 
 /*   SH_RTC3_INT_CONFIG_BASE                                            */
 /*   Description:  Optional interrupt vector area, 2MB aligned          */
-#define SH_RTC3_INT_CONFIG_BASE_SHFT             21
-#define SH_RTC3_INT_CONFIG_BASE_MASK             0x0003ffffffe00000
+#define SH_RTC3_INT_CONFIG_BASE_SHFT                   21
+#define SH_RTC3_INT_CONFIG_BASE_MASK   __IA64_UL_CONST(0x0003ffffffe00000)
 
 /*   SH_RTC3_INT_CONFIG_IDX                                             */
 /*   Description:  Targeted McKinley interrupt vector                   */
-#define SH_RTC3_INT_CONFIG_IDX_SHFT              52
-#define SH_RTC3_INT_CONFIG_IDX_MASK              0x0ff0000000000000
+#define SH_RTC3_INT_CONFIG_IDX_SHFT                    52
+#define SH_RTC3_INT_CONFIG_IDX_MASK    __IA64_UL_CONST(0x0ff0000000000000)
 
 /* ==================================================================== */
 /*                    Register "SH_RTC3_INT_ENABLE"                     */
 /*                SHub RTC 3 Interrupt Enable Registers                 */
 /* ==================================================================== */
 
-#define SH1_RTC3_INT_ENABLE                      0x0000000110001700
-#define SH2_RTC3_INT_ENABLE                      0x0000000010001700
-#define SH_RTC3_INT_ENABLE_MASK                  0x0000000000000001
-#define SH_RTC3_INT_ENABLE_INIT                  0x0000000000000000
+#define SH1_RTC3_INT_ENABLE            __IA64_UL_CONST(0x0000000110001700)
+#define SH2_RTC3_INT_ENABLE            __IA64_UL_CONST(0x0000000010001700)
+#define SH_RTC3_INT_ENABLE_MASK                
__IA64_UL_CONST(0x0000000000000001)
+#define SH_RTC3_INT_ENABLE_INIT                
__IA64_UL_CONST(0x0000000000000000)
 
 /*   SH_RTC3_INT_ENABLE_RTC3_ENABLE                                     */
 /*   Description:  Enable RTC 3 Interrupt                               */
-#define SH_RTC3_INT_ENABLE_RTC3_ENABLE_SHFT      0
-#define SH_RTC3_INT_ENABLE_RTC3_ENABLE_MASK      0x0000000000000001
+#define SH_RTC3_INT_ENABLE_RTC3_ENABLE_SHFT            0
+#define SH_RTC3_INT_ENABLE_RTC3_ENABLE_MASK \
+                                       __IA64_UL_CONST(0x0000000000000001)
 
 /*   SH_EVENT_OCCURRED_RTC1_INT                                         */
 /*   Description:  Pending RTC 1 Interrupt                              */
-#define SH_EVENT_OCCURRED_RTC1_INT_SHFT          24
-#define SH_EVENT_OCCURRED_RTC1_INT_MASK          0x0000000001000000
+#define SH_EVENT_OCCURRED_RTC1_INT_SHFT                        24
+#define SH_EVENT_OCCURRED_RTC1_INT_MASK        
__IA64_UL_CONST(0x0000000001000000)
 
 /*   SH_EVENT_OCCURRED_RTC2_INT                                         */
 /*   Description:  Pending RTC 2 Interrupt                              */
-#define SH_EVENT_OCCURRED_RTC2_INT_SHFT          25
-#define SH_EVENT_OCCURRED_RTC2_INT_MASK          0x0000000002000000
+#define SH_EVENT_OCCURRED_RTC2_INT_SHFT                        25
+#define SH_EVENT_OCCURRED_RTC2_INT_MASK        
__IA64_UL_CONST(0x0000000002000000)
 
 /*   SH_EVENT_OCCURRED_RTC3_INT                                         */
 /*   Description:  Pending RTC 3 Interrupt                              */
-#define SH_EVENT_OCCURRED_RTC3_INT_SHFT          26
-#define SH_EVENT_OCCURRED_RTC3_INT_MASK          0x0000000004000000
+#define SH_EVENT_OCCURRED_RTC3_INT_SHFT                        26
+#define SH_EVENT_OCCURRED_RTC3_INT_MASK        
__IA64_UL_CONST(0x0000000004000000)
 
 /* ==================================================================== */
 /*                       Register "SH_IPI_ACCESS"                       */
 /*                 CPU interrupt Access Permission Bits                 */
 /* ==================================================================== */
 
-#define SH1_IPI_ACCESS                           0x0000000110060480
-#define SH2_IPI_ACCESS0                          0x0000000010060c00
-#define SH2_IPI_ACCESS1                          0x0000000010060c80
-#define SH2_IPI_ACCESS2                          0x0000000010060d00
-#define SH2_IPI_ACCESS3                          0x0000000010060d80
+#define SH1_IPI_ACCESS                 __IA64_UL_CONST(0x0000000110060480)
+#define SH2_IPI_ACCESS0                        
__IA64_UL_CONST(0x0000000010060c00)
+#define SH2_IPI_ACCESS1                        
__IA64_UL_CONST(0x0000000010060c80)
+#define SH2_IPI_ACCESS2                        
__IA64_UL_CONST(0x0000000010060d00)
+#define SH2_IPI_ACCESS3                        
__IA64_UL_CONST(0x0000000010060d80)
 
 /* ==================================================================== */
 /*                        Register "SH_INT_CMPB"                        */
 /*                  RTC Compare Value for Processor B                   */
 /* ==================================================================== */
 
-#define SH1_INT_CMPB                             0x00000001101b0080
-#define SH2_INT_CMPB                             0x00000000101b0080
-#define SH_INT_CMPB_MASK                         0x007fffffffffffff
-#define SH_INT_CMPB_INIT                         0x0000000000000000
+#define SH1_INT_CMPB                   __IA64_UL_CONST(0x00000001101b0080)
+#define SH2_INT_CMPB                   __IA64_UL_CONST(0x00000000101b0080)
+#define SH_INT_CMPB_MASK               __IA64_UL_CONST(0x007fffffffffffff)
+#define SH_INT_CMPB_INIT               __IA64_UL_CONST(0x0000000000000000)
 
 /*   SH_INT_CMPB_REAL_TIME_CMPB                                         */
 /*   Description:  Real Time Clock Compare                              */
-#define SH_INT_CMPB_REAL_TIME_CMPB_SHFT          0
-#define SH_INT_CMPB_REAL_TIME_CMPB_MASK          0x007fffffffffffff
+#define SH_INT_CMPB_REAL_TIME_CMPB_SHFT                        0
+#define SH_INT_CMPB_REAL_TIME_CMPB_MASK        
__IA64_UL_CONST(0x007fffffffffffff)
 
 /* ==================================================================== */
 /*                        Register "SH_INT_CMPC"                        */
 /*                  RTC Compare Value for Processor C                   */
 /* ==================================================================== */
 
-#define SH1_INT_CMPC                             0x00000001101b0100
-#define SH2_INT_CMPC                             0x00000000101b0100
-#define SH_INT_CMPC_MASK                         0x007fffffffffffff
-#define SH_INT_CMPC_INIT                         0x0000000000000000
+#define SH1_INT_CMPC                   __IA64_UL_CONST(0x00000001101b0100)
+#define SH2_INT_CMPC                   __IA64_UL_CONST(0x00000000101b0100)
+#define SH_INT_CMPC_MASK               __IA64_UL_CONST(0x007fffffffffffff)
+#define SH_INT_CMPC_INIT               __IA64_UL_CONST(0x0000000000000000)
 
 /*   SH_INT_CMPC_REAL_TIME_CMPC                                         */
 /*   Description:  Real Time Clock Compare                              */
-#define SH_INT_CMPC_REAL_TIME_CMPC_SHFT          0
-#define SH_INT_CMPC_REAL_TIME_CMPC_MASK          0x007fffffffffffff
+#define SH_INT_CMPC_REAL_TIME_CMPC_SHFT                        0
+#define SH_INT_CMPC_REAL_TIME_CMPC_MASK        
__IA64_UL_CONST(0x007fffffffffffff)
 
 /* ==================================================================== */
 /*                        Register "SH_INT_CMPD"                        */
 /*                  RTC Compare Value for Processor D                   */
 /* ==================================================================== */
 
-#define SH1_INT_CMPD                             0x00000001101b0180
-#define SH2_INT_CMPD                             0x00000000101b0180
-#define SH_INT_CMPD_MASK                         0x007fffffffffffff
-#define SH_INT_CMPD_INIT                         0x0000000000000000
+#define SH1_INT_CMPD                   __IA64_UL_CONST(0x00000001101b0180)
+#define SH2_INT_CMPD                   __IA64_UL_CONST(0x00000000101b0180)
+#define SH_INT_CMPD_MASK               __IA64_UL_CONST(0x007fffffffffffff)
+#define SH_INT_CMPD_INIT               __IA64_UL_CONST(0x0000000000000000)
 
 /*   SH_INT_CMPD_REAL_TIME_CMPD                                         */
 /*   Description:  Real Time Clock Compare                              */
-#define SH_INT_CMPD_REAL_TIME_CMPD_SHFT          0
-#define SH_INT_CMPD_REAL_TIME_CMPD_MASK          0x007fffffffffffff
+#define SH_INT_CMPD_REAL_TIME_CMPD_SHFT                        0
+#define SH_INT_CMPD_REAL_TIME_CMPD_MASK        
__IA64_UL_CONST(0x007fffffffffffff)
 
 /* ==================================================================== */
 /*                Register "SH_MD_DQLP_MMR_DIR_PRIVEC0"                 */
 /*                      privilege vector for acc=0                      */
 /* ==================================================================== */
-
-#define SH1_MD_DQLP_MMR_DIR_PRIVEC0              0x0000000100030300
+#define SH1_MD_DQLP_MMR_DIR_PRIVEC0    __IA64_UL_CONST(0x0000000100030300)
 
 /* ==================================================================== */
 /*                Register "SH_MD_DQRP_MMR_DIR_PRIVEC0"                 */
 /*                      privilege vector for acc=0                      */
 /* ==================================================================== */
-
-#define SH1_MD_DQRP_MMR_DIR_PRIVEC0              0x0000000100050300
+#define SH1_MD_DQRP_MMR_DIR_PRIVEC0    __IA64_UL_CONST(0x0000000100050300)
 
 /* ==================================================================== */
 /* Some MMRs are functionally identical (or close enough) on both SHUB1 */
@@ -484,17 +486,17 @@
 /*                    Engine 0 Control and Status Register                    
*/
 /* ========================================================================== 
*/
 
-#define SH2_BT_ENG_CSR_0                         0x0000000030040000
-#define SH2_BT_ENG_SRC_ADDR_0                    0x0000000030040080
-#define SH2_BT_ENG_DEST_ADDR_0                   0x0000000030040100
-#define SH2_BT_ENG_NOTIF_ADDR_0                  0x0000000030040180
+#define SH2_BT_ENG_CSR_0               __IA64_UL_CONST(0x0000000030040000)
+#define SH2_BT_ENG_SRC_ADDR_0          __IA64_UL_CONST(0x0000000030040080)
+#define SH2_BT_ENG_DEST_ADDR_0         __IA64_UL_CONST(0x0000000030040100)
+#define SH2_BT_ENG_NOTIF_ADDR_0                
__IA64_UL_CONST(0x0000000030040180)
 
 /* ========================================================================== 
*/
 /*                       BTE interfaces 1-3                                   
*/
 /* ========================================================================== 
*/
 
-#define SH2_BT_ENG_CSR_1                         0x0000000030050000
-#define SH2_BT_ENG_CSR_2                         0x0000000030060000
-#define SH2_BT_ENG_CSR_3                         0x0000000030070000
+#define SH2_BT_ENG_CSR_1               __IA64_UL_CONST(0x0000000030050000)
+#define SH2_BT_ENG_CSR_2               __IA64_UL_CONST(0x0000000030060000)
+#define SH2_BT_ENG_CSR_3               __IA64_UL_CONST(0x0000000030070000)
 
 #endif /* _ASM_IA64_SN_SHUB_MMR_H */
diff -urN linux/include/asm-ia64/sn/simulator.h 
linux/include/asm-ia64/sn/simulator.h
--- linux/include/asm-ia64/sn/simulator.h       2004/10/25 20:44:43     1.4
+++ linux/include/asm-ia64/sn/simulator.h       2005/07/12 09:19:19     1.5
@@ -10,16 +10,17 @@
 
 #include <linux/config.h>
 
-#ifdef CONFIG_IA64_SGI_SN_SIM
-
 #define SNMAGIC 0xaeeeeeee8badbeefL
-#define IS_RUNNING_ON_SIMULATOR() ({long sn; asm("mov %0=cpuid[%1]" : "=r"(sn) 
: "r"(2)); sn == SNMAGIC;})
-
-#define SIMULATOR_SLEEP()      asm("nop.i 0x8beef")
+#define IS_MEDUSA()                    ({long sn; asm("mov %0=cpuid[%1]" : 
"=r"(sn) : "r"(2)); sn == SNMAGIC;})
 
+#ifdef CONFIG_IA64_SGI_SN_SIM
+#define SIMULATOR_SLEEP()              asm("nop.i 0x8beef")
+#define IS_RUNNING_ON_SIMULATOR()      (sn_prom_type)
+#define IS_RUNNING_ON_FAKE_PROM()      (sn_prom_type == 2)
+extern int sn_prom_type;               /* 0=hardware, 1=medusa/realprom, 
2=medusa/fakeprom */
 #else
-
 #define IS_RUNNING_ON_SIMULATOR()      (0)
+#define IS_RUNNING_ON_FAKE_PROM()      (0)
 #define SIMULATOR_SLEEP()
 
 #endif
diff -urN linux/include/asm-ia64/sn/sn_sal.h linux/include/asm-ia64/sn/sn_sal.h
--- linux/include/asm-ia64/sn/sn_sal.h  2005/06/07 13:45:40     1.19
+++ linux/include/asm-ia64/sn/sn_sal.h  2005/07/12 09:19:19     1.20
@@ -132,6 +132,8 @@
 #define SALRET_INVALID_ARG     (-2)
 #define SALRET_ERROR           (-3)
 
+#define SN_SAL_FAKE_PROM                          0x02009999
+
 
 /**
  * sn_sal_rev_major - get the major SGI SAL revision number
@@ -1105,4 +1107,12 @@
        return (int) rv.status;
 }
 
+static inline int
+ia64_sn_is_fake_prom(void)
+{
+       struct ia64_sal_retval rv;
+       SAL_CALL_NOLOCK(rv, SN_SAL_FAKE_PROM, 0, 0, 0, 0, 0, 0, 0);
+       return (rv.status == 0);
+}
+
 #endif /* _ASM_IA64_SN_SN_SAL_H */
diff -urN linux/include/asm-ia64/sn/tioca_provider.h 
linux/include/asm-ia64/sn/tioca_provider.h
--- linux/include/asm-ia64/sn/tioca_provider.h  2005/05/19 12:08:42     1.1
+++ linux/include/asm-ia64/sn/tioca_provider.h  2005/07/12 09:19:19     1.2
@@ -201,6 +201,7 @@
 }
 
 extern uint32_t        tioca_gart_found;
+extern struct list_head tioca_list;
 extern int tioca_init_provider(void);
 extern void tioca_fastwrite_enable(struct tioca_kernel *tioca_kern);
 #endif /* _ASM_IA64_SN_TIO_CA_AGP_PROVIDER_H */
diff -urN linux/include/asm-ia64/sn/sn2/sn_hwperf.h 
linux/include/asm-ia64/sn/sn2/sn_hwperf.h
--- linux/include/asm-ia64/sn/sn2/sn_hwperf.h   2004/11/15 11:49:38     1.2
+++ linux/include/asm-ia64/sn/sn2/sn_hwperf.h   2005/07/12 09:19:20     1.3
@@ -223,4 +223,6 @@
 #define SN_HWPERF_OP_RECONFIGURE       253
 #define SN_HWPERF_OP_INVAL             254
 
+int sn_topology_open(struct inode *inode, struct file *file);
+int sn_topology_release(struct inode *inode, struct file *file);
 #endif                         /* SN_HWPERF_H */
diff -urN linux/include/asm-m68k/serial.h linux/include/asm-m68k/serial.h
--- linux/include/asm-m68k/serial.h     2004/06/06 02:12:54     1.13
+++ linux/include/asm-m68k/serial.h     2005/07/12 09:19:20     1.14
@@ -26,54 +26,9 @@
 #define STD_COM4_FLAGS ASYNC_BOOT_AUTOCONF
 #endif
 
-#ifdef CONFIG_SERIAL_MANY_PORTS
-#define FOURPORT_FLAGS ASYNC_FOURPORT
-#define ACCENT_FLAGS 0
-#define BOCA_FLAGS 0
-#endif
-
-#define STD_SERIAL_PORT_DEFNS                  \
+#define SERIAL_PORT_DFNS                       \
        /* UART CLK   PORT IRQ     FLAGS        */                      \
        { 0, BASE_BAUD, 0x3F8, 4, STD_COM_FLAGS },      /* ttyS0 */     \
        { 0, BASE_BAUD, 0x2F8, 3, STD_COM_FLAGS },      /* ttyS1 */     \
        { 0, BASE_BAUD, 0x3E8, 4, STD_COM_FLAGS },      /* ttyS2 */     \
        { 0, BASE_BAUD, 0x2E8, 3, STD_COM4_FLAGS },     /* ttyS3 */
-
-
-#ifdef CONFIG_SERIAL_MANY_PORTS
-#define EXTRA_SERIAL_PORT_DEFNS                        \
-       { 0, BASE_BAUD, 0x1A0, 9, FOURPORT_FLAGS },     /* ttyS4 */     \
-       { 0, BASE_BAUD, 0x1A8, 9, FOURPORT_FLAGS },     /* ttyS5 */     \
-       { 0, BASE_BAUD, 0x1B0, 9, FOURPORT_FLAGS },     /* ttyS6 */     \
-       { 0, BASE_BAUD, 0x1B8, 9, FOURPORT_FLAGS },     /* ttyS7 */     \
-       { 0, BASE_BAUD, 0x2A0, 5, FOURPORT_FLAGS },     /* ttyS8 */     \
-       { 0, BASE_BAUD, 0x2A8, 5, FOURPORT_FLAGS },     /* ttyS9 */     \
-       { 0, BASE_BAUD, 0x2B0, 5, FOURPORT_FLAGS },     /* ttyS10 */    \
-       { 0, BASE_BAUD, 0x2B8, 5, FOURPORT_FLAGS },     /* ttyS11 */    \
-       { 0, BASE_BAUD, 0x330, 4, ACCENT_FLAGS },       /* ttyS12 */    \
-       { 0, BASE_BAUD, 0x338, 4, ACCENT_FLAGS },       /* ttyS13 */    \
-       { 0, BASE_BAUD, 0x000, 0, 0 },  /* ttyS14 (spare) */            \
-       { 0, BASE_BAUD, 0x000, 0, 0 },  /* ttyS15 (spare) */            \
-       { 0, BASE_BAUD, 0x100, 12, BOCA_FLAGS },        /* ttyS16 */    \
-       { 0, BASE_BAUD, 0x108, 12, BOCA_FLAGS },        /* ttyS17 */    \
-       { 0, BASE_BAUD, 0x110, 12, BOCA_FLAGS },        /* ttyS18 */    \
-       { 0, BASE_BAUD, 0x118, 12, BOCA_FLAGS },        /* ttyS19 */    \
-       { 0, BASE_BAUD, 0x120, 12, BOCA_FLAGS },        /* ttyS20 */    \
-       { 0, BASE_BAUD, 0x128, 12, BOCA_FLAGS },        /* ttyS21 */    \
-       { 0, BASE_BAUD, 0x130, 12, BOCA_FLAGS },        /* ttyS22 */    \
-       { 0, BASE_BAUD, 0x138, 12, BOCA_FLAGS },        /* ttyS23 */    \
-       { 0, BASE_BAUD, 0x140, 12, BOCA_FLAGS },        /* ttyS24 */    \
-       { 0, BASE_BAUD, 0x148, 12, BOCA_FLAGS },        /* ttyS25 */    \
-       { 0, BASE_BAUD, 0x150, 12, BOCA_FLAGS },        /* ttyS26 */    \
-       { 0, BASE_BAUD, 0x158, 12, BOCA_FLAGS },        /* ttyS27 */    \
-       { 0, BASE_BAUD, 0x160, 12, BOCA_FLAGS },        /* ttyS28 */    \
-       { 0, BASE_BAUD, 0x168, 12, BOCA_FLAGS },        /* ttyS29 */    \
-       { 0, BASE_BAUD, 0x170, 12, BOCA_FLAGS },        /* ttyS30 */    \
-       { 0, BASE_BAUD, 0x178, 12, BOCA_FLAGS },        /* ttyS31 */
-#else
-#define EXTRA_SERIAL_PORT_DEFNS
-#endif
-
-#define SERIAL_PORT_DFNS               \
-       STD_SERIAL_PORT_DEFNS           \
-       EXTRA_SERIAL_PORT_DEFNS
diff -urN linux/include/asm-mips/serial.h linux/include/asm-mips/serial.h
--- linux/include/asm-mips/serial.h     2005/03/04 17:24:33     1.64
+++ linux/include/asm-mips/serial.h     2005/07/12 09:19:20     1.65
@@ -29,32 +29,6 @@
 #define STD_COM4_FLAGS ASYNC_BOOT_AUTOCONF
 #endif
 
-#ifdef CONFIG_SERIAL_MANY_PORTS
-#define FOURPORT_FLAGS ASYNC_FOURPORT
-#define ACCENT_FLAGS 0
-#define BOCA_FLAGS 0
-#define HUB6_FLAGS 0
-#define RS_TABLE_SIZE  64
-#else
-#define RS_TABLE_SIZE
-#endif
-
-/*
- * The following define the access methods for the HUB6 card. All
- * access is through two ports for all 24 possible chips. The card is
- * selected through the high 2 bits, the port on that card with the
- * "middle" 3 bits, and the register on that port with the bottom
- * 3 bits.
- *
- * While the access port and interrupt is configurable, the default
- * port locations are 0x302 for the port control register, and 0x303
- * for the data read/write register. Normally, the interrupt is at irq3
- * but can be anything from 3 to 7 inclusive. Note that using 3 will
- * require disabling com2.
- */
-
-#define C_P(card,port) (((card)<<6|(port)<<3) + 1)
-
 #ifdef CONFIG_MACH_JAZZ
 #include <asm/jazz.h>
 
@@ -219,66 +193,10 @@
        { 0, BASE_BAUD, 0x3E8, 4, STD_COM_FLAGS },      /* ttyS2 */     \
        { 0, BASE_BAUD, 0x2E8, 3, STD_COM4_FLAGS },     /* ttyS3 */
 
-#ifdef CONFIG_SERIAL_MANY_PORTS
-#define EXTRA_SERIAL_PORT_DEFNS                        \
-       { 0, BASE_BAUD, 0x1A0, 9, FOURPORT_FLAGS },     /* ttyS4 */     \
-       { 0, BASE_BAUD, 0x1A8, 9, FOURPORT_FLAGS },     /* ttyS5 */     \
-       { 0, BASE_BAUD, 0x1B0, 9, FOURPORT_FLAGS },     /* ttyS6 */     \
-       { 0, BASE_BAUD, 0x1B8, 9, FOURPORT_FLAGS },     /* ttyS7 */     \
-       { 0, BASE_BAUD, 0x2A0, 5, FOURPORT_FLAGS },     /* ttyS8 */     \
-       { 0, BASE_BAUD, 0x2A8, 5, FOURPORT_FLAGS },     /* ttyS9 */     \
-       { 0, BASE_BAUD, 0x2B0, 5, FOURPORT_FLAGS },     /* ttyS10 */    \
-       { 0, BASE_BAUD, 0x2B8, 5, FOURPORT_FLAGS },     /* ttyS11 */    \
-       { 0, BASE_BAUD, 0x330, 4, ACCENT_FLAGS },       /* ttyS12 */    \
-       { 0, BASE_BAUD, 0x338, 4, ACCENT_FLAGS },       /* ttyS13 */    \
-       { 0, BASE_BAUD, 0x000, 0, 0 },                  /* ttyS14 (spare) */ \
-       { 0, BASE_BAUD, 0x000, 0, 0 },                  /* ttyS15 (spare) */ \
-       { 0, BASE_BAUD, 0x100, 12, BOCA_FLAGS },        /* ttyS16 */    \
-       { 0, BASE_BAUD, 0x108, 12, BOCA_FLAGS },        /* ttyS17 */    \
-       { 0, BASE_BAUD, 0x110, 12, BOCA_FLAGS },        /* ttyS18 */    \
-       { 0, BASE_BAUD, 0x118, 12, BOCA_FLAGS },        /* ttyS19 */    \
-       { 0, BASE_BAUD, 0x120, 12, BOCA_FLAGS },        /* ttyS20 */    \
-       { 0, BASE_BAUD, 0x128, 12, BOCA_FLAGS },        /* ttyS21 */    \
-       { 0, BASE_BAUD, 0x130, 12, BOCA_FLAGS },        /* ttyS22 */    \
-       { 0, BASE_BAUD, 0x138, 12, BOCA_FLAGS },        /* ttyS23 */    \
-       { 0, BASE_BAUD, 0x140, 12, BOCA_FLAGS },        /* ttyS24 */    \
-       { 0, BASE_BAUD, 0x148, 12, BOCA_FLAGS },        /* ttyS25 */    \
-       { 0, BASE_BAUD, 0x150, 12, BOCA_FLAGS },        /* ttyS26 */    \
-       { 0, BASE_BAUD, 0x158, 12, BOCA_FLAGS },        /* ttyS27 */    \
-       { 0, BASE_BAUD, 0x160, 12, BOCA_FLAGS },        /* ttyS28 */    \
-       { 0, BASE_BAUD, 0x168, 12, BOCA_FLAGS },        /* ttyS29 */    \
-       { 0, BASE_BAUD, 0x170, 12, BOCA_FLAGS },        /* ttyS30 */    \
-       { 0, BASE_BAUD, 0x178, 12, BOCA_FLAGS },        /* ttyS31 */
-#else /* CONFIG_SERIAL_MANY_PORTS */
-#define EXTRA_SERIAL_PORT_DEFNS
-#endif /* CONFIG_SERIAL_MANY_PORTS */
-
 #else /* CONFIG_HAVE_STD_PC_SERIAL_PORTS */
 #define STD_SERIAL_PORT_DEFNS
-#define EXTRA_SERIAL_PORT_DEFNS
 #endif /* CONFIG_HAVE_STD_PC_SERIAL_PORTS */
 
-/* You can have up to four HUB6's in the system, but I've only
- * included two cards here for a total of twelve ports.
- */
-#if (defined(CONFIG_HUB6) && defined(CONFIG_SERIAL_MANY_PORTS))
-#define HUB6_SERIAL_PORT_DFNS          \
-       { 0, BASE_BAUD, 0x302, 3, HUB6_FLAGS, C_P(0,0) },  /* ttyS32 */ \
-       { 0, BASE_BAUD, 0x302, 3, HUB6_FLAGS, C_P(0,1) },  /* ttyS33 */ \
-       { 0, BASE_BAUD, 0x302, 3, HUB6_FLAGS, C_P(0,2) },  /* ttyS34 */ \
-       { 0, BASE_BAUD, 0x302, 3, HUB6_FLAGS, C_P(0,3) },  /* ttyS35 */ \
-       { 0, BASE_BAUD, 0x302, 3, HUB6_FLAGS, C_P(0,4) },  /* ttyS36 */ \
-       { 0, BASE_BAUD, 0x302, 3, HUB6_FLAGS, C_P(0,5) },  /* ttyS37 */ \
-       { 0, BASE_BAUD, 0x302, 3, HUB6_FLAGS, C_P(1,0) },  /* ttyS38 */ \
-       { 0, BASE_BAUD, 0x302, 3, HUB6_FLAGS, C_P(1,1) },  /* ttyS39 */ \
-       { 0, BASE_BAUD, 0x302, 3, HUB6_FLAGS, C_P(1,2) },  /* ttyS40 */ \
-       { 0, BASE_BAUD, 0x302, 3, HUB6_FLAGS, C_P(1,3) },  /* ttyS41 */ \
-       { 0, BASE_BAUD, 0x302, 3, HUB6_FLAGS, C_P(1,4) },  /* ttyS42 */ \
-       { 0, BASE_BAUD, 0x302, 3, HUB6_FLAGS, C_P(1,5) },  /* ttyS43 */
-#else
-#define HUB6_SERIAL_PORT_DFNS
-#endif
-
 #ifdef CONFIG_MOMENCO_JAGUAR_ATX
 /* Ordinary NS16552 duart with a 20MHz crystal.  */
 #define JAGUAR_ATX_UART_CLK    20000000
@@ -405,8 +323,6 @@
 #define SERIAL_PORT_DFNS                               \
        DDB5477_SERIAL_PORT_DEFNS                       \
        EV96100_SERIAL_PORT_DEFNS                       \
-       EXTRA_SERIAL_PORT_DEFNS                         \
-       HUB6_SERIAL_PORT_DFNS                           \
        IP32_SERIAL_PORT_DEFNS                          \
        ITE_SERIAL_PORT_DEFNS                           \
        IVR_SERIAL_PORT_DEFNS                           \
diff -urN linux/include/asm-parisc/serial.h linux/include/asm-parisc/serial.h
--- linux/include/asm-parisc/serial.h   2005/03/18 17:38:09     1.4
+++ linux/include/asm-parisc/serial.h   2005/07/12 09:19:20     1.5
@@ -19,18 +19,4 @@
  * A500 w/ PCI serial cards: 5 + 4 * card ~= 17
  */
  
-#define STD_SERIAL_PORT_DEFNS                  \
-       { 0, },         /* ttyS0 */     \
-       { 0, },         /* ttyS1 */     \
-       { 0, },         /* ttyS2 */     \
-       { 0, },         /* ttyS3 */     \
-       { 0, },         /* ttyS4 */     \
-       { 0, },         /* ttyS5 */     \
-       { 0, },         /* ttyS6 */     \
-       { 0, },         /* ttyS7 */     \
-       { 0, },         /* ttyS8 */
-
-
-#define SERIAL_PORT_DFNS               \
-       STD_SERIAL_PORT_DEFNS
-
+#define SERIAL_PORT_DFNS
diff -urN linux/include/asm-ppc/mpc8xx.h linux/include/asm-ppc/mpc8xx.h
--- linux/include/asm-ppc/mpc8xx.h      2004/11/15 11:49:38     1.11
+++ linux/include/asm-ppc/mpc8xx.h      2005/07/12 09:19:21     1.12
@@ -68,6 +68,10 @@
 #include <platforms/lantec.h>
 #endif
 
+#if defined(CONFIG_MPC885ADS)
+#include <platforms/mpc885ads.h>
+#endif
+
 /* Currently, all 8xx boards that support a processor to PCI/ISA bridge
  * use the same memory map.
  */
diff -urN linux/include/asm-ppc/pc_serial.h linux/include/asm-ppc/pc_serial.h
--- linux/include/asm-ppc/pc_serial.h   2002/11/01 02:32:28     1.2
+++ linux/include/asm-ppc/pc_serial.h   2005/07/12 09:19:21     1.3
@@ -35,93 +35,9 @@
 #define STD_COM4_FLAGS ASYNC_BOOT_AUTOCONF
 #endif
 
-#ifdef CONFIG_SERIAL_MANY_PORTS
-#define FOURPORT_FLAGS ASYNC_FOURPORT
-#define ACCENT_FLAGS 0
-#define BOCA_FLAGS 0
-#define HUB6_FLAGS 0
-#endif
-       
-/*
- * The following define the access methods for the HUB6 card. All
- * access is through two ports for all 24 possible chips. The card is
- * selected through the high 2 bits, the port on that card with the
- * "middle" 3 bits, and the register on that port with the bottom
- * 3 bits.
- *
- * While the access port and interrupt is configurable, the default
- * port locations are 0x302 for the port control register, and 0x303
- * for the data read/write register. Normally, the interrupt is at irq3
- * but can be anything from 3 to 7 inclusive. Note that using 3 will
- * require disabling com2.
- */
-
-#define C_P(card,port) (((card)<<6|(port)<<3) + 1)
-
-#define STD_SERIAL_PORT_DEFNS                  \
+#define SERIAL_PORT_DFNS                       \
        /* UART CLK   PORT IRQ     FLAGS        */                      \
        { 0, BASE_BAUD, 0x3F8, 4, STD_COM_FLAGS },      /* ttyS0 */     \
        { 0, BASE_BAUD, 0x2F8, 3, STD_COM_FLAGS },      /* ttyS1 */     \
        { 0, BASE_BAUD, 0x3E8, 4, STD_COM_FLAGS },      /* ttyS2 */     \
        { 0, BASE_BAUD, 0x2E8, 3, STD_COM4_FLAGS },     /* ttyS3 */
-
-
-#ifdef CONFIG_SERIAL_MANY_PORTS
-#define EXTRA_SERIAL_PORT_DEFNS                        \
-       { 0, BASE_BAUD, 0x1A0, 9, FOURPORT_FLAGS },     /* ttyS4 */     \
-       { 0, BASE_BAUD, 0x1A8, 9, FOURPORT_FLAGS },     /* ttyS5 */     \
-       { 0, BASE_BAUD, 0x1B0, 9, FOURPORT_FLAGS },     /* ttyS6 */     \
-       { 0, BASE_BAUD, 0x1B8, 9, FOURPORT_FLAGS },     /* ttyS7 */     \
-       { 0, BASE_BAUD, 0x2A0, 5, FOURPORT_FLAGS },     /* ttyS8 */     \
-       { 0, BASE_BAUD, 0x2A8, 5, FOURPORT_FLAGS },     /* ttyS9 */     \
-       { 0, BASE_BAUD, 0x2B0, 5, FOURPORT_FLAGS },     /* ttyS10 */    \
-       { 0, BASE_BAUD, 0x2B8, 5, FOURPORT_FLAGS },     /* ttyS11 */    \
-       { 0, BASE_BAUD, 0x330, 4, ACCENT_FLAGS },       /* ttyS12 */    \
-       { 0, BASE_BAUD, 0x338, 4, ACCENT_FLAGS },       /* ttyS13 */    \
-       { 0, BASE_BAUD, 0x000, 0, 0 },  /* ttyS14 (spare) */            \
-       { 0, BASE_BAUD, 0x000, 0, 0 },  /* ttyS15 (spare) */            \
-       { 0, BASE_BAUD, 0x100, 12, BOCA_FLAGS },        /* ttyS16 */    \
-       { 0, BASE_BAUD, 0x108, 12, BOCA_FLAGS },        /* ttyS17 */    \
-       { 0, BASE_BAUD, 0x110, 12, BOCA_FLAGS },        /* ttyS18 */    \
-       { 0, BASE_BAUD, 0x118, 12, BOCA_FLAGS },        /* ttyS19 */    \
-       { 0, BASE_BAUD, 0x120, 12, BOCA_FLAGS },        /* ttyS20 */    \
-       { 0, BASE_BAUD, 0x128, 12, BOCA_FLAGS },        /* ttyS21 */    \
-       { 0, BASE_BAUD, 0x130, 12, BOCA_FLAGS },        /* ttyS22 */    \
-       { 0, BASE_BAUD, 0x138, 12, BOCA_FLAGS },        /* ttyS23 */    \
-       { 0, BASE_BAUD, 0x140, 12, BOCA_FLAGS },        /* ttyS24 */    \
-       { 0, BASE_BAUD, 0x148, 12, BOCA_FLAGS },        /* ttyS25 */    \
-       { 0, BASE_BAUD, 0x150, 12, BOCA_FLAGS },        /* ttyS26 */    \
-       { 0, BASE_BAUD, 0x158, 12, BOCA_FLAGS },        /* ttyS27 */    \
-       { 0, BASE_BAUD, 0x160, 12, BOCA_FLAGS },        /* ttyS28 */    \
-       { 0, BASE_BAUD, 0x168, 12, BOCA_FLAGS },        /* ttyS29 */    \
-       { 0, BASE_BAUD, 0x170, 12, BOCA_FLAGS },        /* ttyS30 */    \
-       { 0, BASE_BAUD, 0x178, 12, BOCA_FLAGS },        /* ttyS31 */
-#else
-#define EXTRA_SERIAL_PORT_DEFNS
-#endif
-
-/* You can have up to four HUB6's in the system, but I've only
- * included two cards here for a total of twelve ports.
- */
-#if (defined(CONFIG_HUB6) && defined(CONFIG_SERIAL_MANY_PORTS))
-#define HUB6_SERIAL_PORT_DFNS          \
-       { 0, BASE_BAUD, 0x302, 3, HUB6_FLAGS, C_P(0,0) },  /* ttyS32 */ \
-       { 0, BASE_BAUD, 0x302, 3, HUB6_FLAGS, C_P(0,1) },  /* ttyS33 */ \
-       { 0, BASE_BAUD, 0x302, 3, HUB6_FLAGS, C_P(0,2) },  /* ttyS34 */ \
-       { 0, BASE_BAUD, 0x302, 3, HUB6_FLAGS, C_P(0,3) },  /* ttyS35 */ \
-       { 0, BASE_BAUD, 0x302, 3, HUB6_FLAGS, C_P(0,4) },  /* ttyS36 */ \
-       { 0, BASE_BAUD, 0x302, 3, HUB6_FLAGS, C_P(0,5) },  /* ttyS37 */ \
-       { 0, BASE_BAUD, 0x302, 3, HUB6_FLAGS, C_P(1,0) },  /* ttyS38 */ \
-       { 0, BASE_BAUD, 0x302, 3, HUB6_FLAGS, C_P(1,1) },  /* ttyS39 */ \
-       { 0, BASE_BAUD, 0x302, 3, HUB6_FLAGS, C_P(1,2) },  /* ttyS40 */ \
-       { 0, BASE_BAUD, 0x302, 3, HUB6_FLAGS, C_P(1,3) },  /* ttyS41 */ \
-       { 0, BASE_BAUD, 0x302, 3, HUB6_FLAGS, C_P(1,4) },  /* ttyS42 */ \
-       { 0, BASE_BAUD, 0x302, 3, HUB6_FLAGS, C_P(1,5) },  /* ttyS43 */
-#else
-#define HUB6_SERIAL_PORT_DFNS
-#endif
-
-#define SERIAL_PORT_DFNS               \
-       STD_SERIAL_PORT_DEFNS           \
-       EXTRA_SERIAL_PORT_DEFNS         \
-       HUB6_SERIAL_PORT_DFNS
diff -urN linux/include/asm-ppc64/paca.h linux/include/asm-ppc64/paca.h
--- linux/include/asm-ppc64/paca.h      2005/07/11 20:48:38     1.20
+++ linux/include/asm-ppc64/paca.h      2005/07/12 09:19:21     1.21
@@ -20,7 +20,6 @@
 #include       <asm/types.h>
 #include       <asm/lppaca.h>
 #include       <asm/iSeries/ItLpRegSave.h>
-#include       <asm/iSeries/ItLpQueue.h>
 #include       <asm/mmu.h>
 
 register struct paca_struct *local_paca asm("r13");
@@ -62,7 +61,6 @@
        u16 paca_index;                 /* Logical processor number */
 
        u32 default_decr;               /* Default decrementer value */
-       struct ItLpQueue *lpqueue_ptr;  /* LpQueue handled by this CPU */
        u64 kernel_toc;                 /* Kernel TOC address */
        u64 stab_real;                  /* Absolute address of segment table */
        u64 stab_addr;                  /* Virtual address of segment table */
@@ -91,7 +89,6 @@
        u64 next_jiffy_update_tb;       /* TB value for next jiffy update */
        u64 saved_r1;                   /* r1 save for RTAS calls */
        u64 saved_msr;                  /* MSR saved here by enter_rtas */
-       u32 lpevent_count;              /* lpevents processed  */
        u8 proc_enabled;                /* irq soft-enable flag */
 
        /* not yet used */
diff -urN linux/include/asm-ppc64/iSeries/ItLpQueue.h 
linux/include/asm-ppc64/iSeries/ItLpQueue.h
--- linux/include/asm-ppc64/iSeries/ItLpQueue.h 2005/07/11 20:48:40     1.4
+++ linux/include/asm-ppc64/iSeries/ItLpQueue.h 2005/07/12 09:19:21     1.5
@@ -41,7 +41,7 @@
 #define LpEventMaxSize         256
 #define LpEventAlign           64
 
-struct ItLpQueue {
+struct hvlpevent_queue {
 /*
  * The xSlicCurEventPtr is the pointer to the next event stack entry
  * that will become valid.  The OS must peek at this entry to determine
@@ -69,16 +69,13 @@
        char    *xSlicEventStackPtr;    // 0x20
        u8      xIndex;                 // 0x28 unique sequential index.
        u8      xSlicRsvd[3];           // 0x29-2b
-       u32     xInUseWord;             // 0x2C
-       u64     xLpIntCount;            // 0x30 Total Lp Int msgs processed
-       u64     xLpIntCountByType[9];   // 0x38-0x7F Event counts by type
+       spinlock_t      lock;
 };
 
-extern struct ItLpQueue xItLpQueue;
+extern struct hvlpevent_queue hvlpevent_queue;
 
-extern struct HvLpEvent *ItLpQueue_getNextLpEvent(struct ItLpQueue *);
-extern int ItLpQueue_isLpIntPending(struct ItLpQueue *);
-extern unsigned ItLpQueue_process(struct ItLpQueue *, struct pt_regs *);
-extern void ItLpQueue_clearValid(struct HvLpEvent *);
+extern int hvlpevent_is_pending(void);
+extern void process_hvlpevents(struct pt_regs *);
+extern void setup_hvlpevent_queue(void);
 
 #endif /* _ITLPQUEUE_H */
diff -urN linux/include/asm-s390/system.h linux/include/asm-s390/system.h
--- linux/include/asm-s390/system.h     2005/07/11 20:48:41     1.21
+++ linux/include/asm-s390/system.h     2005/07/12 09:19:21     1.22
@@ -107,11 +107,9 @@
 #ifdef CONFIG_VIRT_CPU_ACCOUNTING
 extern void account_user_vtime(struct task_struct *);
 extern void account_system_vtime(struct task_struct *);
-#else
-#define account_system_vtime(prev) do { } while (0)
 #endif
 
-#define finish_arch_switch(rq, prev) do {                                   \
+#define finish_arch_switch(prev) do {                                       \
        set_fs(current->thread.mm_segment);                                  \
        account_system_vtime(prev);                                          \
 } while (0)
diff -urN linux/include/asm-sh/serial.h linux/include/asm-sh/serial.h
--- linux/include/asm-sh/serial.h       2004/06/26 15:15:25     1.7
+++ linux/include/asm-sh/serial.h       2005/07/12 09:19:21     1.8
@@ -29,20 +29,18 @@
 #ifdef CONFIG_HD64465
 #include <asm/hd64465.h>
 
-#define STD_SERIAL_PORT_DEFNS                   \
+#define SERIAL_PORT_DFNS                   \
         /* UART CLK   PORT IRQ     FLAGS        */                      \
         { 0, BASE_BAUD, 0x3F8, HD64465_IRQ_UART, STD_COM_FLAGS }  /* ttyS0 */
 
 #else
 
-#define STD_SERIAL_PORT_DEFNS                  \
+#define SERIAL_PORT_DFNS                       \
        /* UART CLK   PORT IRQ     FLAGS        */                      \
        { 0, BASE_BAUD, 0x3F8, 4, STD_COM_FLAGS },      /* ttyS0 */     \
        { 0, BASE_BAUD, 0x2F8, 3, STD_COM_FLAGS }       /* ttyS1 */
 
 #endif
 
-#define SERIAL_PORT_DFNS STD_SERIAL_PORT_DEFNS
-
 #endif
 #endif /* _ASM_SERIAL_H */
diff -urN linux/include/asm-sh/bigsur/serial.h 
linux/include/asm-sh/bigsur/serial.h
--- linux/include/asm-sh/bigsur/serial.h        2003/10/09 13:09:35     1.2
+++ linux/include/asm-sh/bigsur/serial.h        2005/07/12 09:19:21     1.3
@@ -14,13 +14,10 @@
 #define STD_COM_FLAGS (ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST)
 
 
-#define STD_SERIAL_PORT_DEFNS                   \
+#define SERIAL_PORT_DFNS                   \
         /* UART CLK   PORT IRQ     FLAGS        */                      \
         { 0, BASE_BAUD, 0x3F8, HD64465_IRQ_UART, STD_COM_FLAGS } /* ttyS0 */ 
 
-
-#define SERIAL_PORT_DFNS STD_SERIAL_PORT_DEFNS
-
 /* XXX: This should be moved ino irq.h */
 #define irq_cannonicalize(x) (x)
 
diff -urN linux/include/asm-sh/ec3104/serial.h 
linux/include/asm-sh/ec3104/serial.h
--- linux/include/asm-sh/ec3104/serial.h        2003/10/09 13:09:36     1.2
+++ linux/include/asm-sh/ec3104/serial.h        2005/07/12 09:19:21     1.3
@@ -10,13 +10,11 @@
  * it's got the keyboard controller behind it so we can't really use it
  * (without moving the keyboard driver to userspace, which doesn't sound
  * like a very good idea) */
-#define STD_SERIAL_PORT_DEFNS                  \
+#define SERIAL_PORT_DFNS                       \
        /* UART CLK   PORT IRQ     FLAGS        */                      \
        { 0, BASE_BAUD, 0x11C00, EC3104_IRQBASE+7, STD_COM_FLAGS }, /* ttyS0 */ 
\
        { 0, BASE_BAUD, 0x12000, EC3104_IRQBASE+8, STD_COM_FLAGS }, /* ttyS1 */ 
\
        { 0, BASE_BAUD, 0x12400, EC3104_IRQBASE+9, STD_COM_FLAGS }, /* ttyS2 */
 
-#define SERIAL_PORT_DFNS STD_SERIAL_PORT_DEFNS
-
 /* XXX: This should be moved ino irq.h */
 #define irq_cannonicalize(x) (x)
diff -urN linux/include/asm-sh64/serial.h linux/include/asm-sh64/serial.h
--- linux/include/asm-sh64/serial.h     2004/06/30 17:26:50     1.2
+++ linux/include/asm-sh64/serial.h     2005/07/12 09:19:22     1.3
@@ -20,13 +20,11 @@
 
 #define STD_COM_FLAGS (ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST)
 
-#define STD_SERIAL_PORT_DEFNS                  \
+#define SERIAL_PORT_DFNS                       \
        /* UART CLK   PORT IRQ     FLAGS        */                      \
        { 0, BASE_BAUD, 0x3F8, 4, STD_COM_FLAGS },      /* ttyS0 */     \
        { 0, BASE_BAUD, 0x2F8, 3, STD_COM_FLAGS }       /* ttyS1 */
 
-#define SERIAL_PORT_DFNS STD_SERIAL_PORT_DEFNS
-
 /* XXX: This should be moved ino irq.h */
 #define irq_cannonicalize(x) (x)
 
diff -urN linux/include/asm-sparc64/irq.h linux/include/asm-sparc64/irq.h
--- linux/include/asm-sparc64/irq.h     2005/07/11 20:48:42     1.27
+++ linux/include/asm-sparc64/irq.h     2005/07/12 09:19:22     1.28
@@ -16,6 +16,18 @@
 #include <asm/pil.h>
 #include <asm/ptrace.h>
 
+struct ino_bucket;
+
+#define MAX_IRQ_DESC_ACTION    4
+
+struct irq_desc {
+       void                    (*pre_handler)(struct ino_bucket *, void *, 
void *);
+       void                    *pre_handler_arg1;
+       void                    *pre_handler_arg2;
+       u32                     action_active_mask;
+       struct irqaction        action[MAX_IRQ_DESC_ACTION];
+};
+
 /* You should not mess with this directly. That's the job of irq.c.
  *
  * If you make changes here, please update hand coded assembler of
@@ -42,24 +54,11 @@
        /* Miscellaneous flags. */
 /*0x06*/unsigned char flags;
 
-       /* This is used to deal with IBF_DMA_SYNC on
-        * Sabre systems.
-        */
-/*0x07*/unsigned char synctab_ent;
+       /* Currently unused.  */
+/*0x07*/unsigned char __pad;
 
-       /* Reference to handler for this IRQ.  If this is
-        * non-NULL this means it is active and should be
-        * serviced.  Else the pending member is set to one
-        * and later registry of the interrupt checks for
-        * this condition.
-        *
-        * Normally this is just an irq_action structure.
-        * But, on PCI, if multiple interrupt sources behind
-        * a bridge have multiple interrupt sources that share
-        * the same INO bucket, this points to an array of
-        * pointers to four IRQ action structures.
-        */
-/*0x08*/void *irq_info;
+       /* Reference to IRQ descriptor for this bucket. */
+/*0x08*/struct irq_desc *irq_info;
 
        /* Sun5 Interrupt Clear Register. */
 /*0x10*/unsigned long iclr;
@@ -69,12 +68,6 @@
 
 };
 
-#ifdef CONFIG_PCI
-extern unsigned long pci_dma_wsync;
-extern unsigned long dma_sync_reg_table[256];
-extern unsigned char dma_sync_reg_table_entry;
-#endif
-
 /* IMAP/ICLR register defines */
 #define IMAP_VALID             0x80000000      /* IRQ Enabled          */
 #define IMAP_TID_UPA           0x7c000000      /* UPA TargetID         */
@@ -90,11 +83,9 @@
 #define ICLR_PENDING           0x00000003      /* Pending state        */
 
 /* Only 8-bits are available, be careful.  -DaveM */
-#define IBF_DMA_SYNC   0x01    /* DMA synchronization behind PCI bridge 
needed. */
-#define IBF_PCI                0x02    /* Indicates PSYCHO/SABRE/SCHIZO PCI 
interrupt.  */
-#define IBF_ACTIVE     0x04    /* This interrupt is active and has a handler.  
 */
-#define IBF_MULTI      0x08    /* On PCI, indicates shared bucket.             
 */
-#define IBF_INPROGRESS 0x10    /* IRQ is being serviced.                       
 */
+#define IBF_PCI                0x02    /* PSYCHO/SABRE/SCHIZO PCI interrupt.   
 */
+#define IBF_ACTIVE     0x04    /* Interrupt is active and has a handler.*/
+#define IBF_INPROGRESS 0x10    /* IRQ is being serviced.                */
 
 #define NUM_IVECS      (IMAP_INR + 1)
 extern struct ino_bucket ivector_table[NUM_IVECS];
diff -urN linux/include/asm-sparc64/pbm.h linux/include/asm-sparc64/pbm.h
--- linux/include/asm-sparc64/pbm.h     2005/06/07 13:45:40     1.19
+++ linux/include/asm-sparc64/pbm.h     2005/07/12 09:19:22     1.20
@@ -145,6 +145,9 @@
        /* Physical address base of PBM registers. */
        unsigned long                   pbm_regs;
 
+       /* Physical address of DMA sync register, if any.  */
+       unsigned long                   sync_reg;
+
        /* Opaque 32-bit system bus Port ID. */
        u32                             portid;
 
diff -urN linux/include/asm-sparc64/signal.h linux/include/asm-sparc64/signal.h
--- linux/include/asm-sparc64/signal.h  2005/05/19 12:08:44     1.19
+++ linux/include/asm-sparc64/signal.h  2005/07/12 09:19:22     1.20
@@ -162,21 +162,6 @@
 #define MINSIGSTKSZ    4096
 #define SIGSTKSZ       16384
 
-#ifdef __KERNEL__
-/*
- * DJHR
- * SA_STATIC_ALLOC is used for the SPARC system to indicate that this
- * interrupt handler's irq structure should be statically allocated
- * by the request_irq routine.
- * The alternative is that arch/sparc/kernel/irq.c has carnal knowledge
- * of interrupt usage and that sucks. Also without a flag like this
- * it may be possible for the free_irq routine to attempt to free
- * statically allocated data.. which is NOT GOOD.
- *
- */
-#define SA_STATIC_ALLOC                0x80
-#endif
-
 #include <asm-generic/signal.h>
 
 struct __new_sigaction {
diff -urN linux/include/asm-x86_64/io_apic.h linux/include/asm-x86_64/io_apic.h
--- linux/include/asm-x86_64/io_apic.h  2005/05/26 09:12:47     1.12
+++ linux/include/asm-x86_64/io_apic.h  2005/07/12 09:19:22     1.13
@@ -217,4 +217,6 @@
 
 void enable_NMI_through_LVT0 (void * dummy);
 
+extern spinlock_t i8259A_lock;
+
 #endif
diff -urN linux/include/asm-x86_64/serial.h linux/include/asm-x86_64/serial.h
--- linux/include/asm-x86_64/serial.h   2003/10/09 13:09:36     1.2
+++ linux/include/asm-x86_64/serial.h   2005/07/12 09:19:22     1.3
@@ -22,109 +22,9 @@
 #define STD_COM4_FLAGS ASYNC_BOOT_AUTOCONF
 #endif
 
-#ifdef CONFIG_SERIAL_MANY_PORTS
-#define FOURPORT_FLAGS ASYNC_FOURPORT
-#define ACCENT_FLAGS 0
-#define BOCA_FLAGS 0
-#define HUB6_FLAGS 0
-#endif
-
-#define MCA_COM_FLAGS  (STD_COM_FLAGS|ASYNC_BOOT_ONLYMCA)
-
-/*
- * The following define the access methods for the HUB6 card. All
- * access is through two ports for all 24 possible chips. The card is
- * selected through the high 2 bits, the port on that card with the
- * "middle" 3 bits, and the register on that port with the bottom
- * 3 bits.
- *
- * While the access port and interrupt is configurable, the default
- * port locations are 0x302 for the port control register, and 0x303
- * for the data read/write register. Normally, the interrupt is at irq3
- * but can be anything from 3 to 7 inclusive. Note that using 3 will
- * require disabling com2.
- */
-
-#define C_P(card,port) (((card)<<6|(port)<<3) + 1)
-
-#define STD_SERIAL_PORT_DEFNS                  \
+#define SERIAL_PORT_DFNS                       \
        /* UART CLK   PORT IRQ     FLAGS        */                      \
        { 0, BASE_BAUD, 0x3F8, 4, STD_COM_FLAGS },      /* ttyS0 */     \
        { 0, BASE_BAUD, 0x2F8, 3, STD_COM_FLAGS },      /* ttyS1 */     \
        { 0, BASE_BAUD, 0x3E8, 4, STD_COM_FLAGS },      /* ttyS2 */     \
        { 0, BASE_BAUD, 0x2E8, 3, STD_COM4_FLAGS },     /* ttyS3 */
-
-
-#ifdef CONFIG_SERIAL_MANY_PORTS
-#define EXTRA_SERIAL_PORT_DEFNS                        \
-       { 0, BASE_BAUD, 0x1A0, 9, FOURPORT_FLAGS },     /* ttyS4 */     \
-       { 0, BASE_BAUD, 0x1A8, 9, FOURPORT_FLAGS },     /* ttyS5 */     \
-       { 0, BASE_BAUD, 0x1B0, 9, FOURPORT_FLAGS },     /* ttyS6 */     \
-       { 0, BASE_BAUD, 0x1B8, 9, FOURPORT_FLAGS },     /* ttyS7 */     \
-       { 0, BASE_BAUD, 0x2A0, 5, FOURPORT_FLAGS },     /* ttyS8 */     \
-       { 0, BASE_BAUD, 0x2A8, 5, FOURPORT_FLAGS },     /* ttyS9 */     \
-       { 0, BASE_BAUD, 0x2B0, 5, FOURPORT_FLAGS },     /* ttyS10 */    \
-       { 0, BASE_BAUD, 0x2B8, 5, FOURPORT_FLAGS },     /* ttyS11 */    \
-       { 0, BASE_BAUD, 0x330, 4, ACCENT_FLAGS },       /* ttyS12 */    \
-       { 0, BASE_BAUD, 0x338, 4, ACCENT_FLAGS },       /* ttyS13 */    \
-       { 0, BASE_BAUD, 0x000, 0, 0 },  /* ttyS14 (spare) */            \
-       { 0, BASE_BAUD, 0x000, 0, 0 },  /* ttyS15 (spare) */            \
-       { 0, BASE_BAUD, 0x100, 12, BOCA_FLAGS },        /* ttyS16 */    \
-       { 0, BASE_BAUD, 0x108, 12, BOCA_FLAGS },        /* ttyS17 */    \
-       { 0, BASE_BAUD, 0x110, 12, BOCA_FLAGS },        /* ttyS18 */    \
-       { 0, BASE_BAUD, 0x118, 12, BOCA_FLAGS },        /* ttyS19 */    \
-       { 0, BASE_BAUD, 0x120, 12, BOCA_FLAGS },        /* ttyS20 */    \
-       { 0, BASE_BAUD, 0x128, 12, BOCA_FLAGS },        /* ttyS21 */    \
-       { 0, BASE_BAUD, 0x130, 12, BOCA_FLAGS },        /* ttyS22 */    \
-       { 0, BASE_BAUD, 0x138, 12, BOCA_FLAGS },        /* ttyS23 */    \
-       { 0, BASE_BAUD, 0x140, 12, BOCA_FLAGS },        /* ttyS24 */    \
-       { 0, BASE_BAUD, 0x148, 12, BOCA_FLAGS },        /* ttyS25 */    \
-       { 0, BASE_BAUD, 0x150, 12, BOCA_FLAGS },        /* ttyS26 */    \
-       { 0, BASE_BAUD, 0x158, 12, BOCA_FLAGS },        /* ttyS27 */    \
-       { 0, BASE_BAUD, 0x160, 12, BOCA_FLAGS },        /* ttyS28 */    \
-       { 0, BASE_BAUD, 0x168, 12, BOCA_FLAGS },        /* ttyS29 */    \
-       { 0, BASE_BAUD, 0x170, 12, BOCA_FLAGS },        /* ttyS30 */    \
-       { 0, BASE_BAUD, 0x178, 12, BOCA_FLAGS },        /* ttyS31 */
-#else
-#define EXTRA_SERIAL_PORT_DEFNS
-#endif
-
-/* You can have up to four HUB6's in the system, but I've only
- * included two cards here for a total of twelve ports.
- */
-#if (defined(CONFIG_HUB6) && defined(CONFIG_SERIAL_MANY_PORTS))
-#define HUB6_SERIAL_PORT_DFNS          \
-       { 0, BASE_BAUD, 0x302, 3, HUB6_FLAGS, C_P(0,0) },  /* ttyS32 */ \
-       { 0, BASE_BAUD, 0x302, 3, HUB6_FLAGS, C_P(0,1) },  /* ttyS33 */ \
-       { 0, BASE_BAUD, 0x302, 3, HUB6_FLAGS, C_P(0,2) },  /* ttyS34 */ \
-       { 0, BASE_BAUD, 0x302, 3, HUB6_FLAGS, C_P(0,3) },  /* ttyS35 */ \
-       { 0, BASE_BAUD, 0x302, 3, HUB6_FLAGS, C_P(0,4) },  /* ttyS36 */ \
-       { 0, BASE_BAUD, 0x302, 3, HUB6_FLAGS, C_P(0,5) },  /* ttyS37 */ \
-       { 0, BASE_BAUD, 0x302, 3, HUB6_FLAGS, C_P(1,0) },  /* ttyS38 */ \
-       { 0, BASE_BAUD, 0x302, 3, HUB6_FLAGS, C_P(1,1) },  /* ttyS39 */ \
-       { 0, BASE_BAUD, 0x302, 3, HUB6_FLAGS, C_P(1,2) },  /* ttyS40 */ \
-       { 0, BASE_BAUD, 0x302, 3, HUB6_FLAGS, C_P(1,3) },  /* ttyS41 */ \
-       { 0, BASE_BAUD, 0x302, 3, HUB6_FLAGS, C_P(1,4) },  /* ttyS42 */ \
-       { 0, BASE_BAUD, 0x302, 3, HUB6_FLAGS, C_P(1,5) },  /* ttyS43 */
-#else
-#define HUB6_SERIAL_PORT_DFNS
-#endif
-
-#ifdef CONFIG_MCA
-#define MCA_SERIAL_PORT_DFNS                   \
-       { 0, BASE_BAUD, 0x3220, 3, MCA_COM_FLAGS },     \
-       { 0, BASE_BAUD, 0x3228, 3, MCA_COM_FLAGS },     \
-       { 0, BASE_BAUD, 0x4220, 3, MCA_COM_FLAGS },     \
-       { 0, BASE_BAUD, 0x4228, 3, MCA_COM_FLAGS },     \
-       { 0, BASE_BAUD, 0x5220, 3, MCA_COM_FLAGS },     \
-       { 0, BASE_BAUD, 0x5228, 3, MCA_COM_FLAGS },
-#else
-#define MCA_SERIAL_PORT_DFNS
-#endif
-
-#define SERIAL_PORT_DFNS               \
-       STD_SERIAL_PORT_DEFNS           \
-       EXTRA_SERIAL_PORT_DEFNS         \
-       HUB6_SERIAL_PORT_DFNS           \
-       MCA_SERIAL_PORT_DFNS
-
diff -urN linux/include/asm-xtensa/delay.h linux/include/asm-xtensa/delay.h
--- linux/include/asm-xtensa/delay.h    2005/07/11 20:48:44     1.1
+++ linux/include/asm-xtensa/delay.h    2005/07/12 09:19:22     1.2
@@ -21,7 +21,7 @@
 extern __inline__ void __delay(unsigned long loops)
 {
   /* 2 cycles per loop. */
-  __asm__ __volatile__ ("1: addi %0, %0, -2; bgeui %0, 1, 1b"
+  __asm__ __volatile__ ("1: addi %0, %0, -2; bgeui %0, 2, 1b"
                        : "=r" (loops) : "0" (loops));
 }
 
diff -urN linux/include/asm-xtensa/errno.h linux/include/asm-xtensa/errno.h
--- linux/include/asm-xtensa/errno.h    2005/07/11 20:48:44     1.1
+++ linux/include/asm-xtensa/errno.h    2005/07/12 09:19:22     1.2
@@ -11,132 +11,6 @@
 #ifndef _XTENSA_ERRNO_H
 #define _XTENSA_ERRNO_H
 
-#define        EPERM            1      /* Operation not permitted */
-#define        ENOENT           2      /* No such file or directory */
-#define        ESRCH            3      /* No such process */
-#define        EINTR            4      /* Interrupted system call */
-#define        EIO              5      /* I/O error */
-#define        ENXIO            6      /* No such device or address */
-#define        E2BIG            7      /* Arg list too long */
-#define        ENOEXEC          8      /* Exec format error */
-#define        EBADF            9      /* Bad file number */
-#define        ECHILD          10      /* No child processes */
-#define        EAGAIN          11      /* Try again */
-#define        ENOMEM          12      /* Out of memory */
-#define        EACCES          13      /* Permission denied */
-#define        EFAULT          14      /* Bad address */
-#define        ENOTBLK         15      /* Block device required */
-#define        EBUSY           16      /* Device or resource busy */
-#define        EEXIST          17      /* File exists */
-#define        EXDEV           18      /* Cross-device link */
-#define        ENODEV          19      /* No such device */
-#define        ENOTDIR         20      /* Not a directory */
-#define        EISDIR          21      /* Is a directory */
-#define        EINVAL          22      /* Invalid argument */
-#define        ENFILE          23      /* File table overflow */
-#define        EMFILE          24      /* Too many open files */
-#define        ENOTTY          25      /* Not a typewriter */
-#define        ETXTBSY         26      /* Text file busy */
-#define        EFBIG           27      /* File too large */
-#define        ENOSPC          28      /* No space left on device */
-#define        ESPIPE          29      /* Illegal seek */
-#define        EROFS           30      /* Read-only file system */
-#define        EMLINK          31      /* Too many links */
-#define        EPIPE           32      /* Broken pipe */
-#define        EDOM            33      /* Math argument out of domain of func 
*/
-#define        ERANGE          34      /* Math result not representable */
-#define        EDEADLK         35      /* Resource deadlock would occur */
-#define        ENAMETOOLONG    36      /* File name too long */
-#define        ENOLCK          37      /* No record locks available */
-#define        ENOSYS          38      /* Function not implemented */
-#define        ENOTEMPTY       39      /* Directory not empty */
-#define        ELOOP           40      /* Too many symbolic links encountered 
*/
-#define        EWOULDBLOCK     EAGAIN  /* Operation would block */
-#define        ENOMSG          42      /* No message of desired type */
-#define        EIDRM           43      /* Identifier removed */
-#define        ECHRNG          44      /* Channel number out of range */
-#define        EL2NSYNC        45      /* Level 2 not synchronized */
-#define        EL3HLT          46      /* Level 3 halted */
-#define        EL3RST          47      /* Level 3 reset */
-#define        ELNRNG          48      /* Link number out of range */
-#define        EUNATCH         49      /* Protocol driver not attached */
-#define        ENOCSI          50      /* No CSI structure available */
-#define        EL2HLT          51      /* Level 2 halted */
-#define        EBADE           52      /* Invalid exchange */
-#define        EBADR           53      /* Invalid request descriptor */
-#define        EXFULL          54      /* Exchange full */
-#define        ENOANO          55      /* No anode */
-#define        EBADRQC         56      /* Invalid request code */
-#define        EBADSLT         57      /* Invalid slot */
-
-#define        EDEADLOCK       EDEADLK
-
-#define        EBFONT          59      /* Bad font file format */
-#define        ENOSTR          60      /* Device not a stream */
-#define        ENODATA         61      /* No data available */
-#define        ETIME           62      /* Timer expired */
-#define        ENOSR           63      /* Out of streams resources */
-#define        ENONET          64      /* Machine is not on the network */
-#define        ENOPKG          65      /* Package not installed */
-#define        EREMOTE         66      /* Object is remote */
-#define        ENOLINK         67      /* Link has been severed */
-#define        EADV            68      /* Advertise error */
-#define        ESRMNT          69      /* Srmount error */
-#define        ECOMM           70      /* Communication error on send */
-#define        EPROTO          71      /* Protocol error */
-#define        EMULTIHOP       72      /* Multihop attempted */
-#define        EDOTDOT         73      /* RFS specific error */
-#define        EBADMSG         74      /* Not a data message */
-#define        EOVERFLOW       75      /* Value too large for defined data 
type */
-#define        ENOTUNIQ        76      /* Name not unique on network */
-#define        EBADFD          77      /* File descriptor in bad state */
-#define        EREMCHG         78      /* Remote address changed */
-#define        ELIBACC         79      /* Can not access a needed shared 
library */
-#define        ELIBBAD         80      /* Accessing a corrupted shared library 
*/
-#define        ELIBSCN         81      /* .lib section in a.out corrupted */
-#define        ELIBMAX         82      /* Attempting to link in too many 
shared libraries */
-#define        ELIBEXEC        83      /* Cannot exec a shared library 
directly */
-#define        EILSEQ          84      /* Illegal byte sequence */
-#define        ERESTART        85      /* Interrupted system call should be 
restarted */
-#define        ESTRPIPE        86      /* Streams pipe error */
-#define        EUSERS          87      /* Too many users */
-#define        ENOTSOCK        88      /* Socket operation on non-socket */
-#define        EDESTADDRREQ    89      /* Destination address required */
-#define        EMSGSIZE        90      /* Message too long */
-#define        EPROTOTYPE      91      /* Protocol wrong type for socket */
-#define        ENOPROTOOPT     92      /* Protocol not available */
-#define        EPROTONOSUPPORT 93      /* Protocol not supported */
-#define        ESOCKTNOSUPPORT 94      /* Socket type not supported */
-#define        EOPNOTSUPP      95      /* Operation not supported on transport 
endpoint */
-#define        EPFNOSUPPORT    96      /* Protocol family not supported */
-#define        EAFNOSUPPORT    97      /* Address family not supported by 
protocol */
-#define        EADDRINUSE      98      /* Address already in use */
-#define        EADDRNOTAVAIL   99      /* Cannot assign requested address */
-#define        ENETDOWN        100     /* Network is down */
-#define        ENETUNREACH     101     /* Network is unreachable */
-#define        ENETRESET       102     /* Network dropped connection because 
of reset */
-#define        ECONNABORTED    103     /* Software caused connection abort */
-#define        ECONNRESET      104     /* Connection reset by peer */
-#define        ENOBUFS         105     /* No buffer space available */
-#define        EISCONN         106     /* Transport endpoint is already 
connected */
-#define        ENOTCONN        107     /* Transport endpoint is not connected 
*/
-#define        ESHUTDOWN       108     /* Cannot send after transport endpoint 
shutdown */
-#define        ETOOMANYREFS    109     /* Too many references: cannot splice */
-#define        ETIMEDOUT       110     /* Connection timed out */
-#define        ECONNREFUSED    111     /* Connection refused */
-#define        EHOSTDOWN       112     /* Host is down */
-#define        EHOSTUNREACH    113     /* No route to host */
-#define        EALREADY        114     /* Operation already in progress */
-#define        EINPROGRESS     115     /* Operation now in progress */
-#define        ESTALE          116     /* Stale NFS file handle */
-#define        EUCLEAN         117     /* Structure needs cleaning */
-#define        ENOTNAM         118     /* Not a XENIX named type file */
-#define        ENAVAIL         119     /* No XENIX semaphores available */
-#define        EISNAM          120     /* Is a named type file */
-#define        EREMOTEIO       121     /* Remote I/O error */
-#define        EDQUOT          122     /* Quota exceeded */
-
-#define        ENOMEDIUM       123     /* No medium found */
-#define        EMEDIUMTYPE     124     /* Wrong medium type */
+#include <asm-generic/errno.h>
 
 #endif /* _XTENSA_ERRNO_H */
diff -urN linux/include/asm-xtensa/ipc.h linux/include/asm-xtensa/ipc.h
--- linux/include/asm-xtensa/ipc.h      2005/07/11 20:48:44     1.1
+++ linux/include/asm-xtensa/ipc.h      2005/07/12 09:19:22     1.2
@@ -11,24 +11,6 @@
 #ifndef _XTENSA_IPC_H
 #define _XTENSA_IPC_H
 
-struct ipc_kludge {
-       struct msgbuf __user *msgp;
-       long msgtyp;
-};
-
-#define SEMOP           1
-#define SEMGET          2
-#define SEMCTL          3
-#define SEMTIMEDOP      4
-#define MSGSND         11
-#define MSGRCV         12
-#define MSGGET         13
-#define MSGCTL         14
-#define SHMAT          21
-#define SHMDT          22
-#define SHMGET         23
-#define SHMCTL         24
-
-#define IPCCALL(version,op)    ((version)<<16 | (op))
+#include <asm-generic/ipc.h>
 
 #endif /* _XTENSA_IPC_H */
diff -urN linux/include/linux/compat_ioctl.h linux/include/linux/compat_ioctl.h
--- linux/include/linux/compat_ioctl.h  2005/03/18 17:38:13     1.24
+++ linux/include/linux/compat_ioctl.h  2005/07/12 09:19:22     1.25
@@ -346,10 +346,27 @@
 /* LP */
 COMPATIBLE_IOCTL(LPGETSTATUS)
 /* ppdev */
+COMPATIBLE_IOCTL(PPSETMODE)
+COMPATIBLE_IOCTL(PPRSTATUS)
+COMPATIBLE_IOCTL(PPRCONTROL)
+COMPATIBLE_IOCTL(PPWCONTROL)
+COMPATIBLE_IOCTL(PPFCONTROL)
+COMPATIBLE_IOCTL(PPRDATA)
+COMPATIBLE_IOCTL(PPWDATA)
 COMPATIBLE_IOCTL(PPCLAIM)
 COMPATIBLE_IOCTL(PPRELEASE)
-COMPATIBLE_IOCTL(PPEXCL)
 COMPATIBLE_IOCTL(PPYIELD)
+COMPATIBLE_IOCTL(PPEXCL)
+COMPATIBLE_IOCTL(PPDATADIR)
+COMPATIBLE_IOCTL(PPNEGOT)
+COMPATIBLE_IOCTL(PPWCTLONIRQ)
+COMPATIBLE_IOCTL(PPCLRIRQ)
+COMPATIBLE_IOCTL(PPSETPHASE)
+COMPATIBLE_IOCTL(PPGETMODES)
+COMPATIBLE_IOCTL(PPGETMODE)
+COMPATIBLE_IOCTL(PPGETPHASE)
+COMPATIBLE_IOCTL(PPGETFLAGS)
+COMPATIBLE_IOCTL(PPSETFLAGS)
 /* CDROM stuff */
 COMPATIBLE_IOCTL(CDROMPAUSE)
 COMPATIBLE_IOCTL(CDROMRESUME)
diff -urN linux/include/linux/device.h linux/include/linux/device.h
--- linux/include/linux/device.h        2005/07/11 20:48:47     1.55
+++ linux/include/linux/device.h        2005/07/12 09:19:22     1.56
@@ -69,7 +69,7 @@
 extern int bus_register(struct bus_type * bus);
 extern void bus_unregister(struct bus_type * bus);
 
-extern int bus_rescan_devices(struct bus_type * bus);
+extern void bus_rescan_devices(struct bus_type * bus);
 
 extern struct bus_type * get_bus(struct bus_type * bus);
 extern void put_bus(struct bus_type * bus);
@@ -80,6 +80,8 @@
 
 int bus_for_each_dev(struct bus_type * bus, struct device * start, void * data,
                     int (*fn)(struct device *, void *));
+struct device * bus_find_device(struct bus_type *bus, struct device *start,
+                               void *data, int (*match)(struct device *, void 
*));
 
 int bus_for_each_drv(struct bus_type * bus, struct device_driver * start, 
                     void * data, int (*fn)(struct device_driver *, void *));
@@ -142,6 +144,9 @@
 
 extern int driver_for_each_device(struct device_driver * drv, struct device * 
start,
                                  void * data, int (*fn)(struct device *, void 
*));
+struct device * driver_find_device(struct device_driver *drv,
+                                  struct device *start, void *data,
+                                  int (*match)(struct device *, void *));
 
 
 /*
diff -urN linux/include/linux/if_shaper.h linux/include/linux/if_shaper.h
--- linux/include/linux/if_shaper.h     2005/06/07 13:45:41     1.8
+++ linux/include/linux/if_shaper.h     2005/07/12 09:19:22     1.9
@@ -23,7 +23,7 @@
        __u32 shapeclock;
        unsigned long recovery; /* Time we can next clock a packet out on
                                   an empty queue */
-       struct semaphore sem;
+       spinlock_t lock;
         struct net_device_stats stats;
        struct net_device *dev;
        int  (*hard_start_xmit) (struct sk_buff *skb,
diff -urN linux/include/linux/kprobes.h linux/include/linux/kprobes.h
--- linux/include/linux/kprobes.h       2005/07/11 20:48:48     1.5
+++ linux/include/linux/kprobes.h       2005/07/12 09:19:22     1.6
@@ -155,7 +155,7 @@
 extern void arch_arm_kprobe(struct kprobe *p);
 extern void arch_disarm_kprobe(struct kprobe *p);
 extern void arch_remove_kprobe(struct kprobe *p);
-extern int arch_init(void);
+extern int arch_init_kprobes(void);
 extern void show_registers(struct pt_regs *regs);
 extern kprobe_opcode_t *get_insn_slot(void);
 extern void free_insn_slot(kprobe_opcode_t *slot);
diff -urN linux/include/linux/pci.h linux/include/linux/pci.h
--- linux/include/linux/pci.h   2005/07/11 20:48:48     1.105
+++ linux/include/linux/pci.h   2005/07/12 09:19:22     1.106
@@ -586,7 +586,7 @@
 #define PCI_NUM_RESOURCES 11
 
 #ifndef PCI_BUS_NUM_RESOURCES
-#define PCI_BUS_NUM_RESOURCES 4
+#define PCI_BUS_NUM_RESOURCES 8
 #endif
   
 #define PCI_REGION_FLAG_MASK 0x0fU     /* These bits of resource flags tell us 
the PCI region flags */
@@ -860,7 +860,8 @@
 void pci_unregister_driver(struct pci_driver *);
 void pci_remove_behind_bridge(struct pci_dev *);
 struct pci_driver *pci_dev_driver(const struct pci_dev *);
-const struct pci_device_id *pci_match_device(const struct pci_device_id *ids, 
const struct pci_dev *dev);
+const struct pci_device_id *pci_match_device(struct pci_driver *drv, struct 
pci_dev *dev);
+const struct pci_device_id *pci_match_id(const struct pci_device_id *ids, 
struct pci_dev *dev);
 int pci_scan_bridge(struct pci_bus *bus, struct pci_dev * dev, int max, int 
pass);
 
 /* kmem_cache style wrapper around pci_alloc_consistent() */
diff -urN linux/include/linux/pci_ids.h linux/include/linux/pci_ids.h
--- linux/include/linux/pci_ids.h       2005/07/11 20:48:48     1.148
+++ linux/include/linux/pci_ids.h       2005/07/12 09:19:22     1.149
@@ -1238,6 +1238,7 @@
 #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP51_IDE  0x0265
 #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP51_SATA 0x0266
 #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP51_SATA2        0x0267
+#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP55_IDE  0x036E
 #define PCI_DEVICE_ID_NVIDIA_NVENET_12         0x0268
 #define PCI_DEVICE_ID_NVIDIA_NVENET_13         0x0269
 #define PCI_DEVICE_ID_NVIDIA_MCP51_AUDIO       0x026B
diff -urN linux/include/linux/skbuff.h linux/include/linux/skbuff.h
--- linux/include/linux/skbuff.h        2005/07/11 20:48:48     1.63
+++ linux/include/linux/skbuff.h        2005/07/12 09:19:22     1.64
@@ -183,7 +183,6 @@
  *     @priority: Packet queueing priority
  *     @users: User count - see {datagram,tcp}.c
  *     @protocol: Packet protocol from driver
- *     @security: Security level of packet
  *     @truesize: Buffer size 
  *     @head: Head of buffer
  *     @data: Data head pointer
@@ -249,18 +248,18 @@
                                data_len,
                                mac_len,
                                csum;
-       unsigned char           local_df,
-                               cloned:1,
-                               nohdr:1,
-                               pkt_type,
-                               ip_summed;
        __u32                   priority;
-       unsigned short          protocol,
-                               security;
+       __u8                    local_df:1,
+                               cloned:1,
+                               ip_summed:2,
+                               nohdr:1;
+                               /* 3 bits spare */
+       __u8                    pkt_type;
+       __u16                   protocol;
 
        void                    (*destructor)(struct sk_buff *skb);
 #ifdef CONFIG_NETFILTER
-        unsigned long          nfmark;
+       unsigned long           nfmark;
        __u32                   nfcache;
        __u32                   nfctinfo;
        struct nf_conntrack     *nfct;
@@ -1211,7 +1210,7 @@
 {
        int hlen = skb_headlen(skb);
 
-       if (offset + len <= hlen)
+       if (hlen - offset >= len)
                return skb->data + offset;
 
        if (skb_copy_bits(skb, offset, buffer, len) < 0)
diff -urN linux/include/linux/tcp.h linux/include/linux/tcp.h
--- linux/include/linux/tcp.h   2005/07/11 20:48:48     1.36
+++ linux/include/linux/tcp.h   2005/07/12 09:19:22     1.37
@@ -286,7 +286,7 @@
        __u32   max_window;     /* Maximal window ever seen from peer   */
        __u32   pmtu_cookie;    /* Last pmtu seen by socket             */
        __u32   mss_cache;      /* Cached effective mss, not including SACKS */
-       __u16   mss_cache_std;  /* Like mss_cache, but without TSO */
+       __u16   xmit_size_goal; /* Goal for segmenting output packets   */
        __u16   ext_header_len; /* Network protocol overhead (IP/IPv6 options) 
*/
        __u8    ca_state;       /* State of fast-retransmit machine     */
        __u8    retransmits;    /* Number of unrecovered RTO timeouts.  */
diff -urN linux/include/linux/pci-dynids.h linux/include/linux/pci-dynids.h
--- linux/include/linux/Attic/pci-dynids.h      2005-07-12 10:19:23.436601000 
+0100     1.2
+++ linux/include/linux/Attic/pci-dynids.h      1970/01/01 00:00:00+0100
@@ -1,18 +0,0 @@
-/*
- *     PCI defines and function prototypes
- *     Copyright 2003 Dell Inc.
- *        by Matt Domsch <Matt_Domsch@dell.com>
- */
-
-#ifndef LINUX_PCI_DYNIDS_H
-#define LINUX_PCI_DYNIDS_H
-
-#include <linux/list.h>
-#include <linux/mod_devicetable.h>
-
-struct dynid {
-       struct list_head        node;
-       struct pci_device_id    id;
-};
-
-#endif
diff -urN linux/include/linux/tc_ematch/tc_em_meta.h 
linux/include/linux/tc_ematch/tc_em_meta.h
--- linux/include/linux/tc_ematch/tc_em_meta.h  2005/06/18 14:42:51     1.2
+++ linux/include/linux/tc_ematch/tc_em_meta.h  2005/07/12 09:19:23     1.3
@@ -45,7 +45,7 @@
        TCF_META_ID_REALDEV,
        TCF_META_ID_PRIORITY,
        TCF_META_ID_PROTOCOL,
-       TCF_META_ID_SECURITY,
+       TCF_META_ID_SECURITY, /* obsolete */
        TCF_META_ID_PKTTYPE,
        TCF_META_ID_PKTLEN,
        TCF_META_ID_DATALEN,
diff -urN linux/include/net/pkt_sched.h linux/include/net/pkt_sched.h
--- linux/include/net/pkt_sched.h       2005/05/19 12:08:46     1.30
+++ linux/include/net/pkt_sched.h       2005/07/12 09:19:23     1.31
@@ -13,13 +13,12 @@
 
 extern rwlock_t qdisc_tree_lock;
 
-#define        QDISC_ALIGN             32
-#define        QDISC_ALIGN_CONST       (QDISC_ALIGN - 1)
+#define QDISC_ALIGNTO          32
+#define QDISC_ALIGN(len)       (((len) + QDISC_ALIGNTO-1) & ~(QDISC_ALIGNTO-1))
 
 static inline void *qdisc_priv(struct Qdisc *q)
 {
-       return (char *)q + ((sizeof(struct Qdisc) + QDISC_ALIGN_CONST)
-                             & ~QDISC_ALIGN_CONST);
+       return (char *) q + QDISC_ALIGN(sizeof(struct Qdisc));
 }
 
 /* 
@@ -207,8 +206,6 @@
 
 #endif /* !CONFIG_NET_SCH_CLK_GETTIMEOFDAY */
 
-extern struct Qdisc noop_qdisc;
-extern struct Qdisc_ops noop_qdisc_ops;
 extern struct Qdisc_ops pfifo_qdisc_ops;
 extern struct Qdisc_ops bfifo_qdisc_ops;
 
@@ -216,14 +213,6 @@
 extern int unregister_qdisc(struct Qdisc_ops *qops);
 extern struct Qdisc *qdisc_lookup(struct net_device *dev, u32 handle);
 extern struct Qdisc *qdisc_lookup_class(struct net_device *dev, u32 handle);
-extern void dev_init_scheduler(struct net_device *dev);
-extern void dev_shutdown(struct net_device *dev);
-extern void dev_activate(struct net_device *dev);
-extern void dev_deactivate(struct net_device *dev);
-extern void qdisc_reset(struct Qdisc *qdisc);
-extern void qdisc_destroy(struct Qdisc *qdisc);
-extern struct Qdisc * qdisc_create_dflt(struct net_device *dev,
-       struct Qdisc_ops *ops);
 extern struct qdisc_rate_table *qdisc_get_rtab(struct tc_ratespec *r,
                struct rtattr *tab);
 extern void qdisc_put_rtab(struct qdisc_rate_table *tab);
diff -urN linux/include/net/sch_generic.h linux/include/net/sch_generic.h
--- linux/include/net/sch_generic.h     2005/07/11 20:48:56     1.2
+++ linux/include/net/sch_generic.h     2005/07/12 09:19:23     1.3
@@ -164,6 +164,19 @@
 #define tcf_tree_lock(tp)      qdisc_lock_tree((tp)->q->dev)
 #define tcf_tree_unlock(tp)    qdisc_unlock_tree((tp)->q->dev)
 
+extern struct Qdisc noop_qdisc;
+extern struct Qdisc_ops noop_qdisc_ops;
+
+extern void dev_init_scheduler(struct net_device *dev);
+extern void dev_shutdown(struct net_device *dev);
+extern void dev_activate(struct net_device *dev);
+extern void dev_deactivate(struct net_device *dev);
+extern void qdisc_reset(struct Qdisc *qdisc);
+extern void qdisc_destroy(struct Qdisc *qdisc);
+extern struct Qdisc *qdisc_alloc(struct net_device *dev, struct Qdisc_ops 
*ops);
+extern struct Qdisc *qdisc_create_dflt(struct net_device *dev,
+                                      struct Qdisc_ops *ops);
+
 static inline void
 tcf_destroy(struct tcf_proto *tp)
 {
diff -urN linux/include/net/slhc_vj.h linux/include/net/slhc_vj.h
--- linux/include/net/slhc_vj.h 2005/03/18 17:38:17     1.5
+++ linux/include/net/slhc_vj.h 2005/07/12 09:19:23     1.6
@@ -170,19 +170,14 @@
 };
 #define NULLSLCOMPR    (struct slcompress *)0
 
-#define __ARGS(x) x
-
 /* In slhc.c: */
-struct slcompress *slhc_init __ARGS((int rslots, int tslots));
-void slhc_free __ARGS((struct slcompress *comp));
+struct slcompress *slhc_init(int rslots, int tslots);
+void slhc_free(struct slcompress *comp);
 
-int slhc_compress __ARGS((struct slcompress *comp, unsigned char *icp,
-                         int isize, unsigned char *ocp, unsigned char **cpp,
-                         int compress_cid));
-int slhc_uncompress __ARGS((struct slcompress *comp, unsigned char *icp,
-                           int isize));
-int slhc_remember __ARGS((struct slcompress *comp, unsigned char *icp,
-                         int isize));
-int slhc_toss __ARGS((struct slcompress *comp));
+int slhc_compress(struct slcompress *comp, unsigned char *icp, int isize,
+                 unsigned char *ocp, unsigned char **cpp, int compress_cid);
+int slhc_uncompress(struct slcompress *comp, unsigned char *icp, int isize);
+int slhc_remember(struct slcompress *comp, unsigned char *icp, int isize);
+int slhc_toss(struct slcompress *comp);
 
 #endif /* _SLHC_H */
diff -urN linux/include/net/sock.h linux/include/net/sock.h
--- linux/include/net/sock.h    2005/07/11 20:48:56     1.82
+++ linux/include/net/sock.h    2005/07/12 09:19:23     1.83
@@ -1134,13 +1134,16 @@
 static inline struct sk_buff *sk_stream_alloc_pskb(struct sock *sk,
                                                   int size, int mem, int gfp)
 {
-       struct sk_buff *skb = alloc_skb(size + sk->sk_prot->max_header, gfp);
+       struct sk_buff *skb;
+       int hdr_len;
 
+       hdr_len = SKB_DATA_ALIGN(sk->sk_prot->max_header);
+       skb = alloc_skb(size + hdr_len, gfp);
        if (skb) {
                skb->truesize += mem;
                if (sk->sk_forward_alloc >= (int)skb->truesize ||
                    sk_stream_mem_schedule(sk, skb->truesize, 0)) {
-                       skb_reserve(skb, sk->sk_prot->max_header);
+                       skb_reserve(skb, hdr_len);
                        return skb;
                }
                __kfree_skb(skb);
diff -urN linux/include/net/tcp.h linux/include/net/tcp.h
--- linux/include/net/tcp.h     2005/07/11 20:48:56     1.86
+++ linux/include/net/tcp.h     2005/07/12 09:19:23     1.87
@@ -721,11 +721,16 @@
        return tp->ack.pending&TCP_ACK_SCHED;
 }
 
-static __inline__ void tcp_dec_quickack_mode(struct tcp_sock *tp)
+static __inline__ void tcp_dec_quickack_mode(struct tcp_sock *tp, unsigned int 
pkts)
 {
-       if (tp->ack.quick && --tp->ack.quick == 0) {
-               /* Leaving quickack mode we deflate ATO. */
-               tp->ack.ato = TCP_ATO_MIN;
+       if (tp->ack.quick) {
+               if (pkts >= tp->ack.quick) {
+                       tp->ack.quick = 0;
+
+                       /* Leaving quickack mode we deflate ATO. */
+                       tp->ack.ato = TCP_ATO_MIN;
+               } else
+                       tp->ack.quick -= pkts;
        }
 }
 
@@ -843,7 +848,9 @@
 
 /* tcp_output.c */
 
-extern int tcp_write_xmit(struct sock *, int nonagle);
+extern void __tcp_push_pending_frames(struct sock *sk, struct tcp_sock *tp,
+                                     unsigned int cur_mss, int nonagle);
+extern int tcp_may_send_now(struct sock *sk, struct tcp_sock *tp);
 extern int tcp_retransmit_skb(struct sock *, struct sk_buff *);
 extern void tcp_xmit_retransmit_queue(struct sock *);
 extern void tcp_simple_retransmit(struct sock *);
@@ -855,10 +862,13 @@
 extern void tcp_send_fin(struct sock *sk);
 extern void tcp_send_active_reset(struct sock *sk, int priority);
 extern int  tcp_send_synack(struct sock *);
-extern void tcp_push_one(struct sock *, unsigned mss_now);
+extern void tcp_push_one(struct sock *, unsigned int mss_now);
 extern void tcp_send_ack(struct sock *sk);
 extern void tcp_send_delayed_ack(struct sock *sk);
 
+/* tcp_input.c */
+extern void tcp_cwnd_application_limited(struct sock *sk);
+
 /* tcp_timer.c */
 extern void tcp_init_xmit_timers(struct sock *);
 extern void tcp_clear_xmit_timers(struct sock *);
@@ -958,7 +968,7 @@
 static inline void tcp_initialize_rcv_mss(struct sock *sk)
 {
        struct tcp_sock *tp = tcp_sk(sk);
-       unsigned int hint = min(tp->advmss, tp->mss_cache_std);
+       unsigned int hint = min_t(unsigned int, tp->advmss, tp->mss_cache);
 
        hint = min(hint, tp->rcv_wnd/2);
        hint = min(hint, TCP_MIN_RCVMSS);
@@ -1225,28 +1235,6 @@
        tp->left_out = tp->sacked_out + tp->lost_out;
 }
 
-extern void tcp_cwnd_application_limited(struct sock *sk);
-
-/* Congestion window validation. (RFC2861) */
-
-static inline void tcp_cwnd_validate(struct sock *sk, struct tcp_sock *tp)
-{
-       __u32 packets_out = tp->packets_out;
-
-       if (packets_out >= tp->snd_cwnd) {
-               /* Network is feed fully. */
-               tp->snd_cwnd_used = 0;
-               tp->snd_cwnd_stamp = tcp_time_stamp;
-       } else {
-               /* Network starves. */
-               if (tp->packets_out > tp->snd_cwnd_used)
-                       tp->snd_cwnd_used = tp->packets_out;
-
-               if ((s32)(tcp_time_stamp - tp->snd_cwnd_stamp) >= tp->rto)
-                       tcp_cwnd_application_limited(sk);
-       }
-}
-
 /* Set slow start threshould and cwnd not falling to slow start */
 static inline void __tcp_enter_cwr(struct tcp_sock *tp)
 {
@@ -1279,12 +1267,6 @@
        return 3;
 }
 
-static __inline__ int tcp_minshall_check(const struct tcp_sock *tp)
-{
-       return after(tp->snd_sml,tp->snd_una) &&
-               !after(tp->snd_sml, tp->snd_nxt);
-}
-
 static __inline__ void tcp_minshall_update(struct tcp_sock *tp, int mss, 
                                           const struct sk_buff *skb)
 {
@@ -1292,122 +1274,18 @@
                tp->snd_sml = TCP_SKB_CB(skb)->end_seq;
 }
 
-/* Return 0, if packet can be sent now without violation Nagle's rules:
-   1. It is full sized.
-   2. Or it contains FIN.
-   3. Or TCP_NODELAY was set.
-   4. Or TCP_CORK is not set, and all sent packets are ACKed.
-      With Minshall's modification: all sent small packets are ACKed.
- */
-
-static __inline__ int
-tcp_nagle_check(const struct tcp_sock *tp, const struct sk_buff *skb, 
-               unsigned mss_now, int nonagle)
-{
-       return (skb->len < mss_now &&
-               !(TCP_SKB_CB(skb)->flags & TCPCB_FLAG_FIN) &&
-               ((nonagle&TCP_NAGLE_CORK) ||
-                (!nonagle &&
-                 tp->packets_out &&
-                 tcp_minshall_check(tp))));
-}
-
-extern void tcp_set_skb_tso_segs(struct sock *, struct sk_buff *);
-
-/* This checks if the data bearing packet SKB (usually sk->sk_send_head)
- * should be put on the wire right now.
- */
-static __inline__ int tcp_snd_test(struct sock *sk,
-                                  struct sk_buff *skb,
-                                  unsigned cur_mss, int nonagle)
-{
-       struct tcp_sock *tp = tcp_sk(sk);
-       int pkts = tcp_skb_pcount(skb);
-
-       if (!pkts) {
-               tcp_set_skb_tso_segs(sk, skb);
-               pkts = tcp_skb_pcount(skb);
-       }
-
-       /*      RFC 1122 - section 4.2.3.4
-        *
-        *      We must queue if
-        *
-        *      a) The right edge of this frame exceeds the window
-        *      b) There are packets in flight and we have a small segment
-        *         [SWS avoidance and Nagle algorithm]
-        *         (part of SWS is done on packetization)
-        *         Minshall version sounds: there are no _small_
-        *         segments in flight. (tcp_nagle_check)
-        *      c) We have too many packets 'in flight'
-        *
-        *      Don't use the nagle rule for urgent data (or
-        *      for the final FIN -DaveM).
-        *
-        *      Also, Nagle rule does not apply to frames, which
-        *      sit in the middle of queue (they have no chances
-        *      to get new data) and if room at tail of skb is
-        *      not enough to save something seriously (<32 for now).
-        */
-
-       /* Don't be strict about the congestion window for the
-        * final FIN frame.  -DaveM
-        */
-       return (((nonagle&TCP_NAGLE_PUSH) || tp->urg_mode
-                || !tcp_nagle_check(tp, skb, cur_mss, nonagle)) &&
-               (((tcp_packets_in_flight(tp) + (pkts-1)) < tp->snd_cwnd) ||
-                (TCP_SKB_CB(skb)->flags & TCPCB_FLAG_FIN)) &&
-               !after(TCP_SKB_CB(skb)->end_seq, tp->snd_una + tp->snd_wnd));
-}
-
 static __inline__ void tcp_check_probe_timer(struct sock *sk, struct tcp_sock 
*tp)
 {
        if (!tp->packets_out && !tp->pending)
                tcp_reset_xmit_timer(sk, TCP_TIME_PROBE0, tp->rto);
 }
 
-static __inline__ int tcp_skb_is_last(const struct sock *sk, 
-                                     const struct sk_buff *skb)
-{
-       return skb->next == (struct sk_buff *)&sk->sk_write_queue;
-}
-
-/* Push out any pending frames which were held back due to
- * TCP_CORK or attempt at coalescing tiny packets.
- * The socket must be locked by the caller.
- */
-static __inline__ void __tcp_push_pending_frames(struct sock *sk,
-                                                struct tcp_sock *tp,
-                                                unsigned cur_mss,
-                                                int nonagle)
-{
-       struct sk_buff *skb = sk->sk_send_head;
-
-       if (skb) {
-               if (!tcp_skb_is_last(sk, skb))
-                       nonagle = TCP_NAGLE_PUSH;
-               if (!tcp_snd_test(sk, skb, cur_mss, nonagle) ||
-                   tcp_write_xmit(sk, nonagle))
-                       tcp_check_probe_timer(sk, tp);
-       }
-       tcp_cwnd_validate(sk, tp);
-}
-
 static __inline__ void tcp_push_pending_frames(struct sock *sk,
                                               struct tcp_sock *tp)
 {
        __tcp_push_pending_frames(sk, tp, tcp_current_mss(sk, 1), tp->nonagle);
 }
 
-static __inline__ int tcp_may_send_now(struct sock *sk, struct tcp_sock *tp)
-{
-       struct sk_buff *skb = sk->sk_send_head;
-
-       return (skb &&
-               tcp_snd_test(sk, skb, tcp_current_mss(sk, 1),
-                            tcp_skb_is_last(sk, skb) ? TCP_NAGLE_PUSH : 
tp->nonagle));
-}
-
 static __inline__ void tcp_init_wl(struct tcp_sock *tp, u32 ack, u32 seq)
 {
        tp->snd_wl1 = seq;
diff -urN linux/init/do_mounts_initrd.c linux/init/do_mounts_initrd.c
--- linux/init/do_mounts_initrd.c       2005/07/11 20:48:59     1.8
+++ linux/init/do_mounts_initrd.c       2005/07/12 09:19:23     1.9
@@ -86,7 +86,10 @@
                printk("okay\n");
        else {
                int fd = sys_open("/dev/root.old", O_RDWR, 0);
-               printk("failed\n");
+               if (error == -ENOENT)
+                       printk("/initrd does not exist. Ignored.\n");
+               else
+                       printk("failed\n");
                printk(KERN_NOTICE "Unmounting old root\n");
                sys_umount("/old", MNT_DETACH);
                printk(KERN_NOTICE "Trying to free ramdisk memory ... ");
diff -urN linux/kernel/kprobes.c linux/kernel/kprobes.c
--- linux/kernel/kprobes.c      2005/07/11 20:48:59     1.8
+++ linux/kernel/kprobes.c      2005/07/12 09:19:24     1.9
@@ -574,7 +574,7 @@
                INIT_HLIST_HEAD(&kretprobe_inst_table[i]);
        }
 
-       err = arch_init();
+       err = arch_init_kprobes();
        if (!err)
                err = register_die_notifier(&kprobe_exceptions_nb);
 
diff -urN linux/net/core/dev.c linux/net/core/dev.c
--- linux/net/core/dev.c        2005/07/11 20:49:05     1.116
+++ linux/net/core/dev.c        2005/07/12 09:19:24     1.117
@@ -2089,10 +2089,11 @@
 {
        unsigned short old_flags = dev->flags;
 
-       dev->flags |= IFF_PROMISC;
        if ((dev->promiscuity += inc) == 0)
                dev->flags &= ~IFF_PROMISC;
-       if (dev->flags ^ old_flags) {
+       else
+               dev->flags |= IFF_PROMISC;
+       if (dev->flags != old_flags) {
                dev_mc_upload(dev);
                printk(KERN_INFO "device %s %s promiscuous mode\n",
                       dev->name, (dev->flags & IFF_PROMISC) ? "entered" :
diff -urN linux/net/core/filter.c linux/net/core/filter.c
--- linux/net/core/filter.c     2004/08/24 15:10:17     1.14
+++ linux/net/core/filter.c     2005/07/12 09:19:24     1.15
@@ -36,7 +36,7 @@
 #include <linux/filter.h>
 
 /* No hurry in this branch */
-static u8 *load_pointer(struct sk_buff *skb, int k)
+static void *__load_pointer(struct sk_buff *skb, int k)
 {
        u8 *ptr = NULL;
 
@@ -50,6 +50,18 @@
        return NULL;
 }
 
+static inline void *load_pointer(struct sk_buff *skb, int k,
+                                 unsigned int size, void *buffer)
+{
+       if (k >= 0)
+               return skb_header_pointer(skb, k, size, buffer);
+       else {
+               if (k >= SKF_AD_OFF)
+                       return NULL;
+               return __load_pointer(skb, k);
+       }
+}
+
 /**
  *     sk_run_filter   -       run a filter on a socket
  *     @skb: buffer to run the filter on
@@ -64,15 +76,12 @@
  
 int sk_run_filter(struct sk_buff *skb, struct sock_filter *filter, int flen)
 {
-       unsigned char *data = skb->data;
-       /* len is UNSIGNED. Byte wide insns relies only on implicit
-          type casts to prevent reading arbitrary memory locations.
-        */
-       unsigned int len = skb->len-skb->data_len;
        struct sock_filter *fentry;     /* We walk down these */
+       void *ptr;
        u32 A = 0;                      /* Accumulator */
        u32 X = 0;                      /* Index Register */
        u32 mem[BPF_MEMWORDS];          /* Scratch Memory Store */
+       u32 tmp;
        int k;
        int pc;
 
@@ -168,86 +177,35 @@
                case BPF_LD|BPF_W|BPF_ABS:
                        k = fentry->k;
  load_w:
-                       if (k >= 0 && (unsigned int)(k+sizeof(u32)) <= len) {
-                               A = ntohl(*(u32*)&data[k]);
+                       ptr = load_pointer(skb, k, 4, &tmp);
+                       if (ptr != NULL) {
+                               A = ntohl(*(u32 *)ptr);
                                continue;
                        }
-                       if (k < 0) {
-                               u8 *ptr;
-
-                               if (k >= SKF_AD_OFF)
-                                       break;
-                               ptr = load_pointer(skb, k);
-                               if (ptr) {
-                                       A = ntohl(*(u32*)ptr);
-                                       continue;
-                               }
-                       } else {
-                               u32 _tmp, *p;
-                               p = skb_header_pointer(skb, k, 4, &_tmp);
-                               if (p != NULL) {
-                                       A = ntohl(*p);
-                                       continue;
-                               }
-                       }
                        return 0;
                case BPF_LD|BPF_H|BPF_ABS:
                        k = fentry->k;
  load_h:
-                       if (k >= 0 && (unsigned int)(k + sizeof(u16)) <= len) {
-                               A = ntohs(*(u16*)&data[k]);
+                       ptr = load_pointer(skb, k, 2, &tmp);
+                       if (ptr != NULL) {
+                               A = ntohs(*(u16 *)ptr);
                                continue;
                        }
-                       if (k < 0) {
-                               u8 *ptr;
-
-                               if (k >= SKF_AD_OFF)
-                                       break;
-                               ptr = load_pointer(skb, k);
-                               if (ptr) {
-                                       A = ntohs(*(u16*)ptr);
-                                       continue;
-                               }
-                       } else {
-                               u16 _tmp, *p;
-                               p = skb_header_pointer(skb, k, 2, &_tmp);
-                               if (p != NULL) {
-                                       A = ntohs(*p);
-                                       continue;
-                               }
-                       }
                        return 0;
                case BPF_LD|BPF_B|BPF_ABS:
                        k = fentry->k;
 load_b:
-                       if (k >= 0 && (unsigned int)k < len) {
-                               A = data[k];
+                       ptr = load_pointer(skb, k, 1, &tmp);
+                       if (ptr != NULL) {
+                               A = *(u8 *)ptr;
                                continue;
                        }
-                       if (k < 0) {
-                               u8 *ptr;
-
-                               if (k >= SKF_AD_OFF)
-                                       break;
-                               ptr = load_pointer(skb, k);
-                               if (ptr) {
-                                       A = *ptr;
-                                       continue;
-                               }
-                       } else {
-                               u8 _tmp, *p;
-                               p = skb_header_pointer(skb, k, 1, &_tmp);
-                               if (p != NULL) {
-                                       A = *p;
-                                       continue;
-                               }
-                       }
                        return 0;
                case BPF_LD|BPF_W|BPF_LEN:
-                       A = len;
+                       A = skb->len;
                        continue;
                case BPF_LDX|BPF_W|BPF_LEN:
-                       X = len;
+                       X = skb->len;
                        continue;
                case BPF_LD|BPF_W|BPF_IND:
                        k = X + fentry->k;
@@ -259,10 +217,12 @@
                        k = X + fentry->k;
                        goto load_b;
                case BPF_LDX|BPF_B|BPF_MSH:
-                       if (fentry->k >= len)
-                               return 0;
-                       X = (data[fentry->k] & 0xf) << 2;
-                       continue;
+                       ptr = load_pointer(skb, fentry->k, 1, &tmp);
+                       if (ptr != NULL) {
+                               X = (*(u8 *)ptr & 0xf) << 2;
+                               continue;
+                       }
+                       return 0;
                case BPF_LD|BPF_IMM:
                        A = fentry->k;
                        continue;
diff -urN linux/net/core/skbuff.c linux/net/core/skbuff.c
--- linux/net/core/skbuff.c     2005/07/11 20:49:05     1.58
+++ linux/net/core/skbuff.c     2005/07/12 09:19:24     1.59
@@ -357,7 +357,6 @@
        C(ip_summed);
        C(priority);
        C(protocol);
-       C(security);
        n->destructor = NULL;
 #ifdef CONFIG_NETFILTER
        C(nfmark);
@@ -422,7 +421,6 @@
        new->pkt_type   = old->pkt_type;
        new->stamp      = old->stamp;
        new->destructor = NULL;
-       new->security   = old->security;
 #ifdef CONFIG_NETFILTER
        new->nfmark     = old->nfmark;
        new->nfcache    = old->nfcache;
diff -urN linux/net/decnet/dn_fib.c linux/net/decnet/dn_fib.c
--- linux/net/decnet/dn_fib.c   2005/01/25 04:29:02     1.11
+++ linux/net/decnet/dn_fib.c   2005/07/12 09:19:24     1.12
@@ -551,7 +551,8 @@
                if (t < s_t)
                        continue;
                if (t > s_t)
-                       memset(&cb->args[1], 0, sizeof(cb->args)-sizeof(int));
+                       memset(&cb->args[1], 0,
+                              sizeof(cb->args) - sizeof(cb->args[0]));
                tb = dn_fib_get_table(t, 0);
                if (tb == NULL)
                        continue;
diff -urN linux/net/ipv4/af_inet.c linux/net/ipv4/af_inet.c
--- linux/net/ipv4/af_inet.c    2005/07/11 20:49:10     1.88
+++ linux/net/ipv4/af_inet.c    2005/07/12 09:19:24     1.89
@@ -1009,6 +1009,15 @@
 static int ipv4_proc_init(void);
 extern void ipfrag_init(void);
 
+/*
+ *     IP protocol layer initialiser
+ */
+
+static struct packet_type ip_packet_type = {
+       .type = __constant_htons(ETH_P_IP),
+       .func = ip_rcv,
+};
+
 static int __init inet_init(void)
 {
        struct sk_buff *dummy_skb;
@@ -1102,6 +1111,8 @@
 
        ipfrag_init();
 
+       dev_add_pack(&ip_packet_type);
+
        rc = 0;
 out:
        return rc;
diff -urN linux/net/ipv4/fib_trie.c linux/net/ipv4/fib_trie.c
--- linux/net/ipv4/fib_trie.c   2005/07/11 20:49:10     1.1
+++ linux/net/ipv4/fib_trie.c   2005/07/12 09:19:24     1.2
@@ -43,7 +43,7 @@
  *             2 of the License, or (at your option) any later version.
  */
 
-#define VERSION "0.324"
+#define VERSION "0.325"
 
 #include <linux/config.h>
 #include <asm/uaccess.h>
@@ -136,6 +136,7 @@
        unsigned int semantic_match_passed;
        unsigned int semantic_match_miss;
        unsigned int null_node_hit;
+       unsigned int resize_node_skipped;
 };
 #endif
 
@@ -164,8 +165,8 @@
 static void tnode_put_child_reorg(struct tnode *tn, int i, struct node *n, int 
wasfull);
 static int tnode_child_length(struct tnode *tn);
 static struct node *resize(struct trie *t, struct tnode *tn);
-static struct tnode *inflate(struct trie *t, struct tnode *tn);
-static struct tnode *halve(struct trie *t, struct tnode *tn);
+static struct tnode *inflate(struct trie *t, struct tnode *tn, int *err);
+static struct tnode *halve(struct trie *t, struct tnode *tn, int *err);
 static void tnode_free(struct tnode *tn);
 static void trie_dump_seq(struct seq_file *seq, struct trie *t);
 extern struct fib_alias *fib_find_alias(struct list_head *fah, u8 tos, u32 
prio);
@@ -358,11 +359,32 @@
        kfree(li);
 }
 
+static struct tnode *tnode_alloc(unsigned int size)
+{
+       if (size <= PAGE_SIZE) {
+               return kmalloc(size, GFP_KERNEL);
+       } else {
+               return (struct tnode *)
+                      __get_free_pages(GFP_KERNEL, get_order(size));
+       }
+}
+
+static void __tnode_free(struct tnode *tn)
+{
+       unsigned int size = sizeof(struct tnode) +
+                           (1<<tn->bits) * sizeof(struct node *);
+
+       if (size <= PAGE_SIZE)
+               kfree(tn);
+       else
+               free_pages((unsigned long)tn, get_order(size));
+}
+
 static struct tnode* tnode_new(t_key key, int pos, int bits)
 {
        int nchildren = 1<<bits;
        int sz = sizeof(struct tnode) + nchildren * sizeof(struct node *);
-       struct tnode *tn = kmalloc(sz,  GFP_KERNEL);
+       struct tnode *tn = tnode_alloc(sz);
 
        if(tn)  {
                memset(tn, 0, sz);
@@ -390,7 +412,7 @@
                        printk("FL %p \n", tn);
        }
        else if(IS_TNODE(tn)) { 
-               kfree(tn);
+               __tnode_free(tn);
                if(trie_debug > 0 ) 
                        printk("FT %p \n", tn);
        }
@@ -460,6 +482,7 @@
 static struct node *resize(struct trie *t, struct tnode *tn) 
 {
        int i;
+       int err = 0;
 
        if (!tn)
                return NULL;
@@ -556,12 +579,20 @@
         */
 
        check_tnode(tn);
-
+       
+       err = 0;
        while ((tn->full_children > 0 &&
               50 * (tn->full_children + tnode_child_length(tn) - 
tn->empty_children) >=
                                inflate_threshold * tnode_child_length(tn))) {
 
-               tn = inflate(t, tn);
+               tn = inflate(t, tn, &err);
+
+               if(err) {
+#ifdef CONFIG_IP_FIB_TRIE_STATS
+                       t->stats.resize_node_skipped++;
+#endif
+                       break;
+               }
        }
 
        check_tnode(tn);
@@ -570,11 +601,22 @@
         * Halve as long as the number of empty children in this
         * node is above threshold.
         */
+
+       err = 0;
        while (tn->bits > 1 &&
               100 * (tnode_child_length(tn) - tn->empty_children) <
-              halve_threshold * tnode_child_length(tn))
+              halve_threshold * tnode_child_length(tn)) {
+
+               tn = halve(t, tn, &err);
+
+               if(err) {
+#ifdef CONFIG_IP_FIB_TRIE_STATS
+                       t->stats.resize_node_skipped++;
+#endif
+                       break;
+               }
+       }
 
-               tn = halve(t, tn);
   
        /* Only one child remains */
 
@@ -599,7 +641,7 @@
        return (struct node *) tn;
 }
 
-static struct tnode *inflate(struct trie *t, struct tnode *tn)
+static struct tnode *inflate(struct trie *t, struct tnode *tn, int *err)
 {
        struct tnode *inode;
        struct tnode *oldtnode = tn;
@@ -611,8 +653,63 @@
 
        tn = tnode_new(oldtnode->key, oldtnode->pos, oldtnode->bits + 1);
 
-       if (!tn)
-               trie_bug("tnode_new failed");
+       if (!tn) {
+               *err = -ENOMEM;
+               return oldtnode;
+       }
+
+       /*
+        * Preallocate and store tnodes before the actual work so we 
+        * don't get into an inconsistent state if memory allocation 
+        * fails. In case of failure we return the oldnode and  inflate 
+        * of tnode is ignored.
+        */
+                       
+       for(i = 0; i < olen; i++) {
+               struct tnode *inode = (struct tnode *) 
tnode_get_child(oldtnode, i);
+
+               if (inode &&
+                   IS_TNODE(inode) &&
+                   inode->pos == oldtnode->pos + oldtnode->bits &&
+                   inode->bits > 1) {
+                       struct tnode *left, *right;
+
+                       t_key m = TKEY_GET_MASK(inode->pos, 1);
+ 
+                       left = tnode_new(inode->key&(~m), inode->pos + 1,
+                                        inode->bits - 1);
+
+                       if(!left) {
+                               *err = -ENOMEM; 
+                               break;
+                       }
+                       
+                       right = tnode_new(inode->key|m, inode->pos + 1,
+                                         inode->bits - 1);
+
+                       if(!right) {
+                               *err = -ENOMEM; 
+                               break;
+                       }
+
+                       put_child(t, tn, 2*i, (struct node *) left);
+                       put_child(t, tn, 2*i+1, (struct node *) right);
+               }
+       }
+
+       if(*err) {
+               int size = tnode_child_length(tn);
+               int j;
+
+               for(j = 0; j < size; j++) 
+                       if( tn->child[j])
+                               tnode_free((struct tnode *)tn->child[j]);
+
+               tnode_free(tn);
+               
+               *err = -ENOMEM;
+               return oldtnode;
+       }
 
        for(i = 0; i < olen; i++) {
                struct node *node = tnode_get_child(oldtnode, i);
@@ -625,7 +722,7 @@
 
                if(IS_LEAF(node) || ((struct tnode *) node)->pos >
                   tn->pos + tn->bits - 1) {
-                       if(tkey_extract_bits(node->key, tn->pos + tn->bits - 1,
+                       if(tkey_extract_bits(node->key, oldtnode->pos + 
oldtnode->bits,
                                             1) == 0)
                                put_child(t, tn, 2*i, node);
                        else
@@ -665,27 +762,22 @@
                         * the position (inode->pos)
                         */
 
-                       t_key m = TKEY_GET_MASK(inode->pos, 1);
- 
                        /* Use the old key, but set the new significant 
                         *   bit to zero. 
                         */
-                       left = tnode_new(inode->key&(~m), inode->pos + 1,
-                                        inode->bits - 1);
 
-                       if(!left) 
-                               trie_bug("tnode_new failed");
-                       
-                       
-                       /* Use the old key, but set the new significant 
-                        * bit to one. 
-                        */
-                       right = tnode_new(inode->key|m, inode->pos + 1,
-                                         inode->bits - 1);
+                       left = (struct tnode *) tnode_get_child(tn, 2*i);
+                       put_child(t, tn, 2*i, NULL);
+
+                       if(!left)
+                               BUG();
+
+                       right = (struct tnode *) tnode_get_child(tn, 2*i+1);
+                       put_child(t, tn, 2*i+1, NULL);
+
+                       if(!right)
+                               BUG();
 
-                       if(!right) 
-                               trie_bug("tnode_new failed");
-                       
                        size = tnode_child_length(left);
                        for(j = 0; j < size; j++) {
                                put_child(t, left, j, inode->child[j]);
@@ -701,7 +793,7 @@
        return tn;
 }
 
-static struct tnode *halve(struct trie *t, struct tnode *tn)
+static struct tnode *halve(struct trie *t, struct tnode *tn, int *err)
 {
        struct tnode *oldtnode = tn;
        struct node *left, *right;
@@ -712,8 +804,48 @@
   
        tn=tnode_new(oldtnode->key, oldtnode->pos, oldtnode->bits - 1);
 
-       if(!tn) 
-               trie_bug("tnode_new failed");
+       if (!tn) {
+               *err = -ENOMEM;
+               return oldtnode;
+       }
+
+       /*
+        * Preallocate and store tnodes before the actual work so we 
+        * don't get into an inconsistent state if memory allocation 
+        * fails. In case of failure we return the oldnode and halve 
+        * of tnode is ignored.
+        */
+
+       for(i = 0; i < olen; i += 2) {
+               left = tnode_get_child(oldtnode, i);
+               right = tnode_get_child(oldtnode, i+1);
+    
+               /* Two nonempty children */
+               if( left && right)  {
+                       struct tnode *newBinNode =
+                               tnode_new(left->key, tn->pos + tn->bits, 1);
+
+                       if(!newBinNode) {
+                               *err = -ENOMEM; 
+                               break;
+                       }
+                       put_child(t, tn, i/2, (struct node *)newBinNode);
+               }
+       }
+
+       if(*err) {
+               int size = tnode_child_length(tn);
+               int j;
+
+               for(j = 0; j < size; j++) 
+                       if( tn->child[j])
+                               tnode_free((struct tnode *)tn->child[j]);
+
+               tnode_free(tn);
+               
+               *err = -ENOMEM;
+               return oldtnode;
+       }
 
        for(i = 0; i < olen; i += 2) {
                left = tnode_get_child(oldtnode, i);
@@ -730,10 +862,11 @@
                /* Two nonempty children */
                else {
                        struct tnode *newBinNode =
-                               tnode_new(left->key, tn->pos + tn->bits, 1);
+                               (struct tnode *) tnode_get_child(tn, i/2);
+                       put_child(t, tn, i/2, NULL);
 
                        if(!newBinNode) 
-                               trie_bug("tnode_new failed");
+                               BUG();
 
                        put_child(t, newBinNode, 0, left);
                        put_child(t, newBinNode, 1, right);
@@ -2301,6 +2434,7 @@
        seq_printf(seq,"semantic match passed = %d\n", 
t->stats.semantic_match_passed);
        seq_printf(seq,"semantic match miss = %d\n", 
t->stats.semantic_match_miss);
        seq_printf(seq,"null node hit= %d\n", t->stats.null_node_hit);
+       seq_printf(seq,"skipped node resize = %d\n", 
t->stats.resize_node_skipped);
 #ifdef CLEAR_STATS
        memset(&(t->stats), 0, sizeof(t->stats));
 #endif
diff -urN linux/net/ipv4/ip_output.c linux/net/ipv4/ip_output.c
--- linux/net/ipv4/ip_output.c  2005/07/11 20:49:10     1.81
+++ linux/net/ipv4/ip_output.c  2005/07/12 09:19:24     1.82
@@ -389,7 +389,6 @@
        to->pkt_type = from->pkt_type;
        to->priority = from->priority;
        to->protocol = from->protocol;
-       to->security = from->security;
        dst_release(to->dst);
        to->dst = dst_clone(from->dst);
        to->dev = from->dev;
@@ -1329,23 +1328,8 @@
        ip_rt_put(rt);
 }
 
-/*
- *     IP protocol layer initialiser
- */
-
-static struct packet_type ip_packet_type = {
-       .type = __constant_htons(ETH_P_IP),
-       .func = ip_rcv,
-};
-
-/*
- *     IP registers the packet type and then calls the subprotocol initialisers
- */
-
 void __init ip_init(void)
 {
-       dev_add_pack(&ip_packet_type);
-
        ip_rt_init();
        inet_initpeers();
 
diff -urN linux/net/ipv4/route.c linux/net/ipv4/route.c
--- linux/net/ipv4/route.c      2005/07/11 20:49:10     1.88
+++ linux/net/ipv4/route.c      2005/07/12 09:19:24     1.89
@@ -54,6 +54,7 @@
  *             Marc Boucher    :       routing by fwmark
  *     Robert Olsson           :       Added rt_cache statistics
  *     Arnaldo C. Melo         :       Convert proc stuff to seq_file
+ *     Eric Dumazet            :       hashed spinlocks and rt_check_expire() 
fixes.
  *
  *             This program is free software; you can redistribute it and/or
  *             modify it under the terms of the GNU General Public License
@@ -70,6 +71,7 @@
 #include <linux/kernel.h>
 #include <linux/sched.h>
 #include <linux/mm.h>
+#include <linux/bootmem.h>
 #include <linux/string.h>
 #include <linux/socket.h>
 #include <linux/sockios.h>
@@ -201,8 +203,37 @@
 
 struct rt_hash_bucket {
        struct rtable   *chain;
-       spinlock_t      lock;
-} __attribute__((__aligned__(8)));
+};
+#if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK)
+/*
+ * Instead of using one spinlock for each rt_hash_bucket, we use a table of 
spinlocks
+ * The size of this table is a power of two and depends on the number of CPUS.
+ */
+#if NR_CPUS >= 32
+#define RT_HASH_LOCK_SZ        4096
+#elif NR_CPUS >= 16
+#define RT_HASH_LOCK_SZ        2048
+#elif NR_CPUS >= 8
+#define RT_HASH_LOCK_SZ        1024
+#elif NR_CPUS >= 4
+#define RT_HASH_LOCK_SZ        512
+#else
+#define RT_HASH_LOCK_SZ        256
+#endif
+
+static spinlock_t      *rt_hash_locks;
+# define rt_hash_lock_addr(slot) &rt_hash_locks[(slot) & (RT_HASH_LOCK_SZ - 1)]
+# define rt_hash_lock_init()   { \
+               int i; \
+               rt_hash_locks = kmalloc(sizeof(spinlock_t) * RT_HASH_LOCK_SZ, 
GFP_KERNEL); \
+               if (!rt_hash_locks) panic("IP: failed to allocate 
rt_hash_locks\n"); \
+               for (i = 0; i < RT_HASH_LOCK_SZ; i++) \
+                       spin_lock_init(&rt_hash_locks[i]); \
+               }
+#else
+# define rt_hash_lock_addr(slot) NULL
+# define rt_hash_lock_init()
+#endif
 
 static struct rt_hash_bucket   *rt_hash_table;
 static unsigned                        rt_hash_mask;
@@ -575,19 +606,26 @@
 /* This runs via a timer and thus is always in BH context. */
 static void rt_check_expire(unsigned long dummy)
 {
-       static int rover;
-       int i = rover, t;
+       static unsigned int rover;
+       unsigned int i = rover, goal;
        struct rtable *rth, **rthp;
        unsigned long now = jiffies;
+       u64 mult;
 
-       for (t = ip_rt_gc_interval << rt_hash_log; t >= 0;
-            t -= ip_rt_gc_timeout) {
+       mult = ((u64)ip_rt_gc_interval) << rt_hash_log;
+       if (ip_rt_gc_timeout > 1)
+               do_div(mult, ip_rt_gc_timeout);
+       goal = (unsigned int)mult;
+       if (goal > rt_hash_mask) goal = rt_hash_mask + 1;
+       for (; goal > 0; goal--) {
                unsigned long tmo = ip_rt_gc_timeout;
 
                i = (i + 1) & rt_hash_mask;
                rthp = &rt_hash_table[i].chain;
 
-               spin_lock(&rt_hash_table[i].lock);
+               if (*rthp == 0)
+                       continue;
+               spin_lock(rt_hash_lock_addr(i));
                while ((rth = *rthp) != NULL) {
                        if (rth->u.dst.expires) {
                                /* Entry is expired even if it is in use */
@@ -620,14 +658,14 @@
                        rt_free(rth);
 #endif /* CONFIG_IP_ROUTE_MULTIPATH_CACHED */
                }
-               spin_unlock(&rt_hash_table[i].lock);
+               spin_unlock(rt_hash_lock_addr(i));
 
                /* Fallback loop breaker. */
                if (time_after(jiffies, now))
                        break;
        }
        rover = i;
-       mod_timer(&rt_periodic_timer, now + ip_rt_gc_interval);
+       mod_timer(&rt_periodic_timer, jiffies + ip_rt_gc_interval);
 }
 
 /* This can run from both BH and non-BH contexts, the latter
@@ -643,11 +681,11 @@
        get_random_bytes(&rt_hash_rnd, 4);
 
        for (i = rt_hash_mask; i >= 0; i--) {
-               spin_lock_bh(&rt_hash_table[i].lock);
+               spin_lock_bh(rt_hash_lock_addr(i));
                rth = rt_hash_table[i].chain;
                if (rth)
                        rt_hash_table[i].chain = NULL;
-               spin_unlock_bh(&rt_hash_table[i].lock);
+               spin_unlock_bh(rt_hash_lock_addr(i));
 
                for (; rth; rth = next) {
                        next = rth->u.rt_next;
@@ -780,7 +818,7 @@
 
                        k = (k + 1) & rt_hash_mask;
                        rthp = &rt_hash_table[k].chain;
-                       spin_lock_bh(&rt_hash_table[k].lock);
+                       spin_lock_bh(rt_hash_lock_addr(k));
                        while ((rth = *rthp) != NULL) {
                                if (!rt_may_expire(rth, tmo, expire)) {
                                        tmo >>= 1;
@@ -812,7 +850,7 @@
                                goal--;
 #endif /* CONFIG_IP_ROUTE_MULTIPATH_CACHED */
                        }
-                       spin_unlock_bh(&rt_hash_table[k].lock);
+                       spin_unlock_bh(rt_hash_lock_addr(k));
                        if (goal <= 0)
                                break;
                }
@@ -882,7 +920,7 @@
 
        rthp = &rt_hash_table[hash].chain;
 
-       spin_lock_bh(&rt_hash_table[hash].lock);
+       spin_lock_bh(rt_hash_lock_addr(hash));
        while ((rth = *rthp) != NULL) {
 #ifdef CONFIG_IP_ROUTE_MULTIPATH_CACHED
                if (!(rth->u.dst.flags & DST_BALANCED) &&
@@ -908,7 +946,7 @@
                        rth->u.dst.__use++;
                        dst_hold(&rth->u.dst);
                        rth->u.dst.lastuse = now;
-                       spin_unlock_bh(&rt_hash_table[hash].lock);
+                       spin_unlock_bh(rt_hash_lock_addr(hash));
 
                        rt_drop(rt);
                        *rp = rth;
@@ -949,7 +987,7 @@
        if (rt->rt_type == RTN_UNICAST || rt->fl.iif == 0) {
                int err = arp_bind_neighbour(&rt->u.dst);
                if (err) {
-                       spin_unlock_bh(&rt_hash_table[hash].lock);
+                       spin_unlock_bh(rt_hash_lock_addr(hash));
 
                        if (err != -ENOBUFS) {
                                rt_drop(rt);
@@ -990,7 +1028,7 @@
        }
 #endif
        rt_hash_table[hash].chain = rt;
-       spin_unlock_bh(&rt_hash_table[hash].lock);
+       spin_unlock_bh(rt_hash_lock_addr(hash));
        *rp = rt;
        return 0;
 }
@@ -1058,7 +1096,7 @@
 {
        struct rtable **rthp;
 
-       spin_lock_bh(&rt_hash_table[hash].lock);
+       spin_lock_bh(rt_hash_lock_addr(hash));
        ip_rt_put(rt);
        for (rthp = &rt_hash_table[hash].chain; *rthp;
             rthp = &(*rthp)->u.rt_next)
@@ -1067,7 +1105,7 @@
                        rt_free(rt);
                        break;
                }
-       spin_unlock_bh(&rt_hash_table[hash].lock);
+       spin_unlock_bh(rt_hash_lock_addr(hash));
 }
 
 void ip_rt_redirect(u32 old_gw, u32 daddr, u32 new_gw,
@@ -3073,12 +3111,14 @@
 
 int __init ip_rt_init(void)
 {
-       int i, order, goal, rc = 0;
+       int rc = 0;
 
        rt_hash_rnd = (int) ((num_physpages ^ (num_physpages>>8)) ^
                             (jiffies ^ (jiffies >> 7)));
 
 #ifdef CONFIG_NET_CLS_ROUTE
+       {
+       int order;
        for (order = 0;
             (PAGE_SIZE << order) < 256 * sizeof(struct ip_rt_acct) * NR_CPUS; 
order++)
                /* NOTHING */;
@@ -3086,6 +3126,7 @@
        if (!ip_rt_acct)
                panic("IP: failed to allocate ip_rt_acct\n");
        memset(ip_rt_acct, 0, PAGE_SIZE << order);
+       }
 #endif
 
        ipv4_dst_ops.kmem_cachep = kmem_cache_create("ip_dst_cache",
@@ -3096,36 +3137,19 @@
        if (!ipv4_dst_ops.kmem_cachep)
                panic("IP: failed to allocate ip_dst_cache\n");
 
-       goal = num_physpages >> (26 - PAGE_SHIFT);
-       if (rhash_entries)
-               goal = (rhash_entries * sizeof(struct rt_hash_bucket)) >> 
PAGE_SHIFT;
-       for (order = 0; (1UL << order) < goal; order++)
-               /* NOTHING */;
-
-       do {
-               rt_hash_mask = (1UL << order) * PAGE_SIZE /
-                       sizeof(struct rt_hash_bucket);
-               while (rt_hash_mask & (rt_hash_mask - 1))
-                       rt_hash_mask--;
-               rt_hash_table = (struct rt_hash_bucket *)
-                       __get_free_pages(GFP_ATOMIC, order);
-       } while (rt_hash_table == NULL && --order > 0);
-
-       if (!rt_hash_table)
-               panic("Failed to allocate IP route cache hash table\n");
-
-       printk(KERN_INFO "IP: routing cache hash table of %u buckets, 
%ldKbytes\n",
-              rt_hash_mask,
-              (long) (rt_hash_mask * sizeof(struct rt_hash_bucket)) / 1024);
-
-       for (rt_hash_log = 0; (1 << rt_hash_log) != rt_hash_mask; rt_hash_log++)
-               /* NOTHING */;
-
-       rt_hash_mask--;
-       for (i = 0; i <= rt_hash_mask; i++) {
-               spin_lock_init(&rt_hash_table[i].lock);
-               rt_hash_table[i].chain = NULL;
-       }
+       rt_hash_table = (struct rt_hash_bucket *)
+               alloc_large_system_hash("IP route cache",
+                                       sizeof(struct rt_hash_bucket),
+                                       rhash_entries,
+                                       (num_physpages >= 128 * 1024) ?
+                                               (27 - PAGE_SHIFT) :
+                                               (29 - PAGE_SHIFT),
+                                       HASH_HIGHMEM,
+                                       &rt_hash_log,
+                                       &rt_hash_mask,
+                                       0);
+       memset(rt_hash_table, 0, (rt_hash_mask + 1) * sizeof(struct 
rt_hash_bucket));
+       rt_hash_lock_init();
 
        ipv4_dst_ops.gc_thresh = (rt_hash_mask + 1);
        ip_rt_max_size = (rt_hash_mask + 1) * 16;
diff -urN linux/net/ipv4/tcp.c linux/net/ipv4/tcp.c
--- linux/net/ipv4/tcp.c        2005/07/11 20:49:10     1.94
+++ linux/net/ipv4/tcp.c        2005/07/12 09:19:24     1.95
@@ -615,7 +615,7 @@
                         size_t psize, int flags)
 {
        struct tcp_sock *tp = tcp_sk(sk);
-       int mss_now;
+       int mss_now, size_goal;
        int err;
        ssize_t copied;
        long timeo = sock_sndtimeo(sk, flags & MSG_DONTWAIT);
@@ -628,6 +628,7 @@
        clear_bit(SOCK_ASYNC_NOSPACE, &sk->sk_socket->flags);
 
        mss_now = tcp_current_mss(sk, !(flags&MSG_OOB));
+       size_goal = tp->xmit_size_goal;
        copied = 0;
 
        err = -EPIPE;
@@ -641,7 +642,7 @@
                int offset = poffset % PAGE_SIZE;
                int size = min_t(size_t, psize, PAGE_SIZE - offset);
 
-               if (!sk->sk_send_head || (copy = mss_now - skb->len) <= 0) {
+               if (!sk->sk_send_head || (copy = size_goal - skb->len) <= 0) {
 new_segment:
                        if (!sk_stream_memory_free(sk))
                                goto wait_for_sndbuf;
@@ -652,7 +653,7 @@
                                goto wait_for_memory;
 
                        skb_entail(sk, tp, skb);
-                       copy = mss_now;
+                       copy = size_goal;
                }
 
                if (copy > size)
@@ -693,7 +694,7 @@
                if (!(psize -= copy))
                        goto out;
 
-               if (skb->len != mss_now || (flags & MSG_OOB))
+               if (skb->len < mss_now || (flags & MSG_OOB))
                        continue;
 
                if (forced_push(tp)) {
@@ -713,6 +714,7 @@
                        goto do_error;
 
                mss_now = tcp_current_mss(sk, !(flags&MSG_OOB));
+               size_goal = tp->xmit_size_goal;
        }
 
 out:
@@ -754,15 +756,20 @@
 
 static inline int select_size(struct sock *sk, struct tcp_sock *tp)
 {
-       int tmp = tp->mss_cache_std;
+       int tmp = tp->mss_cache;
 
        if (sk->sk_route_caps & NETIF_F_SG) {
-               int pgbreak = SKB_MAX_HEAD(MAX_TCP_HEADER);
+               if (sk->sk_route_caps & NETIF_F_TSO)
+                       tmp = 0;
+               else {
+                       int pgbreak = SKB_MAX_HEAD(MAX_TCP_HEADER);
 
-               if (tmp >= pgbreak &&
-                   tmp <= pgbreak + (MAX_SKB_FRAGS - 1) * PAGE_SIZE)
-                       tmp = pgbreak;
+                       if (tmp >= pgbreak &&
+                           tmp <= pgbreak + (MAX_SKB_FRAGS - 1) * PAGE_SIZE)
+                               tmp = pgbreak;
+               }
        }
+
        return tmp;
 }
 
@@ -773,7 +780,7 @@
        struct tcp_sock *tp = tcp_sk(sk);
        struct sk_buff *skb;
        int iovlen, flags;
-       int mss_now;
+       int mss_now, size_goal;
        int err, copied;
        long timeo;
 
@@ -792,6 +799,7 @@
        clear_bit(SOCK_ASYNC_NOSPACE, &sk->sk_socket->flags);
 
        mss_now = tcp_current_mss(sk, !(flags&MSG_OOB));
+       size_goal = tp->xmit_size_goal;
 
        /* Ok commence sending. */
        iovlen = msg->msg_iovlen;
@@ -814,7 +822,7 @@
                        skb = sk->sk_write_queue.prev;
 
                        if (!sk->sk_send_head ||
-                           (copy = mss_now - skb->len) <= 0) {
+                           (copy = size_goal - skb->len) <= 0) {
 
 new_segment:
                                /* Allocate new segment. If the interface is SG,
@@ -837,7 +845,7 @@
                                        skb->ip_summed = CHECKSUM_HW;
 
                                skb_entail(sk, tp, skb);
-                               copy = mss_now;
+                               copy = size_goal;
                        }
 
                        /* Try to append data to the end of skb. */
@@ -872,11 +880,6 @@
                                        tcp_mark_push(tp, skb);
                                        goto new_segment;
                                } else if (page) {
-                                       /* If page is cached, align
-                                        * offset to L1 cache boundary
-                                        */
-                                       off = (off + L1_CACHE_BYTES - 1) &
-                                             ~(L1_CACHE_BYTES - 1);
                                        if (off == PAGE_SIZE) {
                                                put_page(page);
                                                TCP_PAGE(sk) = page = NULL;
@@ -937,7 +940,7 @@
                        if ((seglen -= copy) == 0 && iovlen == 0)
                                goto out;
 
-                       if (skb->len != mss_now || (flags & MSG_OOB))
+                       if (skb->len < mss_now || (flags & MSG_OOB))
                                continue;
 
                        if (forced_push(tp)) {
@@ -957,6 +960,7 @@
                                goto do_error;
 
                        mss_now = tcp_current_mss(sk, !(flags&MSG_OOB));
+                       size_goal = tp->xmit_size_goal;
                }
        }
 
@@ -2128,7 +2132,7 @@
 
        info->tcpi_rto = jiffies_to_usecs(tp->rto);
        info->tcpi_ato = jiffies_to_usecs(tp->ack.ato);
-       info->tcpi_snd_mss = tp->mss_cache_std;
+       info->tcpi_snd_mss = tp->mss_cache;
        info->tcpi_rcv_mss = tp->ack.rcv_mss;
 
        info->tcpi_unacked = tp->packets_out;
@@ -2178,7 +2182,7 @@
 
        switch (optname) {
        case TCP_MAXSEG:
-               val = tp->mss_cache_std;
+               val = tp->mss_cache;
                if (!val && ((1 << sk->sk_state) & (TCPF_CLOSE | TCPF_LISTEN)))
                        val = tp->rx_opt.user_mss;
                break;
diff -urN linux/net/ipv4/tcp_input.c linux/net/ipv4/tcp_input.c
--- linux/net/ipv4/tcp_input.c  2005/07/11 20:49:10     1.95
+++ linux/net/ipv4/tcp_input.c  2005/07/12 09:19:24     1.96
@@ -740,10 +740,10 @@
        __u32 cwnd = (dst ? dst_metric(dst, RTAX_INITCWND) : 0);
 
        if (!cwnd) {
-               if (tp->mss_cache_std > 1460)
+               if (tp->mss_cache > 1460)
                        cwnd = 2;
                else
-                       cwnd = (tp->mss_cache_std > 1095) ? 3 : 4;
+                       cwnd = (tp->mss_cache > 1095) ? 3 : 4;
        }
        return min_t(__u32, cwnd, tp->snd_cwnd_clamp);
 }
@@ -914,7 +914,7 @@
        if (sk->sk_route_caps & NETIF_F_TSO) {
                sk->sk_route_caps &= ~NETIF_F_TSO;
                sock_set_flag(sk, SOCK_NO_LARGESEND);
-               tp->mss_cache = tp->mss_cache_std;
+               tp->mss_cache = tp->mss_cache;
        }
 
        if (!tp->sacked_out)
@@ -1077,7 +1077,7 @@
                            (IsFack(tp) ||
                             !before(lost_retrans,
                                     TCP_SKB_CB(skb)->ack_seq + tp->reordering *
-                                    tp->mss_cache_std))) {
+                                    tp->mss_cache))) {
                                TCP_SKB_CB(skb)->sacked &= 
~TCPCB_SACKED_RETRANS;
                                tp->retrans_out -= tcp_skb_pcount(skb);
 
@@ -1957,15 +1957,6 @@
        }
 }
 
-/* There is one downside to this scheme.  Although we keep the
- * ACK clock ticking, adjusting packet counters and advancing
- * congestion window, we do not liberate socket send buffer
- * space.
- *
- * Mucking with skb->truesize and sk->sk_wmem_alloc et al.
- * then making a write space wakeup callback is a possible
- * future enhancement.  WARNING: it is not trivial to make.
- */
 static int tcp_tso_acked(struct sock *sk, struct sk_buff *skb,
                         __u32 now, __s32 *seq_rtt)
 {
@@ -2047,7 +2038,8 @@
                 * the other end.
                 */
                if (after(scb->end_seq, tp->snd_una)) {
-                       if (tcp_skb_pcount(skb) > 1)
+                       if (tcp_skb_pcount(skb) > 1 &&
+                           after(tp->snd_una, scb->seq))
                                acked |= tcp_tso_acked(sk, skb,
                                                       now, &seq_rtt);
                        break;
@@ -3308,6 +3300,28 @@
        tp->snd_cwnd_stamp = tcp_time_stamp;
 }
 
+static inline int tcp_should_expand_sndbuf(struct sock *sk, struct tcp_sock 
*tp)
+{
+       /* If the user specified a specific send buffer setting, do
+        * not modify it.
+        */
+       if (sk->sk_userlocks & SOCK_SNDBUF_LOCK)
+               return 0;
+
+       /* If we are under global TCP memory pressure, do not expand.  */
+       if (tcp_memory_pressure)
+               return 0;
+
+       /* If we are under soft global TCP memory pressure, do not expand.  */
+       if (atomic_read(&tcp_memory_allocated) >= sysctl_tcp_mem[0])
+               return 0;
+
+       /* If we filled the congestion window, do not expand.  */
+       if (tp->packets_out >= tp->snd_cwnd)
+               return 0;
+
+       return 1;
+}
 
 /* When incoming ACK allowed to free some skb from write_queue,
  * we remember this event in flag SOCK_QUEUE_SHRUNK and wake up socket
@@ -3319,11 +3333,8 @@
 {
        struct tcp_sock *tp = tcp_sk(sk);
 
-       if (tp->packets_out < tp->snd_cwnd &&
-           !(sk->sk_userlocks & SOCK_SNDBUF_LOCK) &&
-           !tcp_memory_pressure &&
-           atomic_read(&tcp_memory_allocated) < sysctl_tcp_mem[0]) {
-               int sndmem = max_t(u32, tp->rx_opt.mss_clamp, 
tp->mss_cache_std) +
+       if (tcp_should_expand_sndbuf(sk, tp)) {
+               int sndmem = max_t(u32, tp->rx_opt.mss_clamp, tp->mss_cache) +
                        MAX_TCP_HEADER + 16 + sizeof(struct sk_buff),
                    demanded = max_t(unsigned int, tp->snd_cwnd,
                                                   tp->reordering + 1);
@@ -3346,22 +3357,9 @@
        }
 }
 
-static void __tcp_data_snd_check(struct sock *sk, struct sk_buff *skb)
+static __inline__ void tcp_data_snd_check(struct sock *sk, struct tcp_sock *tp)
 {
-       struct tcp_sock *tp = tcp_sk(sk);
-
-       if (after(TCP_SKB_CB(skb)->end_seq, tp->snd_una + tp->snd_wnd) ||
-           tcp_packets_in_flight(tp) >= tp->snd_cwnd ||
-           tcp_write_xmit(sk, tp->nonagle))
-               tcp_check_probe_timer(sk, tp);
-}
-
-static __inline__ void tcp_data_snd_check(struct sock *sk)
-{
-       struct sk_buff *skb = sk->sk_send_head;
-
-       if (skb != NULL)
-               __tcp_data_snd_check(sk, skb);
+       tcp_push_pending_frames(sk, tp);
        tcp_check_space(sk);
 }
 
@@ -3655,7 +3653,7 @@
                                 */
                                tcp_ack(sk, skb, 0);
                                __kfree_skb(skb); 
-                               tcp_data_snd_check(sk);
+                               tcp_data_snd_check(sk, tp);
                                return 0;
                        } else { /* Header too small */
                                TCP_INC_STATS_BH(TCP_MIB_INERRS);
@@ -3721,7 +3719,7 @@
                        if (TCP_SKB_CB(skb)->ack_seq != tp->snd_una) {
                                /* Well, only one small jumplet in fast path... 
*/
                                tcp_ack(sk, skb, FLAG_DATA);
-                               tcp_data_snd_check(sk);
+                               tcp_data_snd_check(sk, tp);
                                if (!tcp_ack_scheduled(tp))
                                        goto no_ack;
                        }
@@ -3799,7 +3797,7 @@
        /* step 7: process the segment text */
        tcp_data_queue(sk, skb);
 
-       tcp_data_snd_check(sk);
+       tcp_data_snd_check(sk, tp);
        tcp_ack_snd_check(sk);
        return 0;
 
@@ -4109,7 +4107,7 @@
                /* Do step6 onward by hand. */
                tcp_urg(sk, skb, th);
                __kfree_skb(skb);
-               tcp_data_snd_check(sk);
+               tcp_data_snd_check(sk, tp);
                return 0;
        }
 
@@ -4300,7 +4298,7 @@
 
        /* tcp_data could move socket to TIME-WAIT */
        if (sk->sk_state != TCP_CLOSE) {
-               tcp_data_snd_check(sk);
+               tcp_data_snd_check(sk, tp);
                tcp_ack_snd_check(sk);
        }
 
diff -urN linux/net/ipv4/tcp_ipv4.c linux/net/ipv4/tcp_ipv4.c
--- linux/net/ipv4/tcp_ipv4.c   2005/07/11 20:49:10     1.103
+++ linux/net/ipv4/tcp_ipv4.c   2005/07/12 09:19:24     1.104
@@ -2045,7 +2045,7 @@
         */
        tp->snd_ssthresh = 0x7fffffff;  /* Infinity */
        tp->snd_cwnd_clamp = ~0;
-       tp->mss_cache_std = tp->mss_cache = 536;
+       tp->mss_cache = 536;
 
        tp->reordering = sysctl_tcp_reordering;
        tp->ca_ops = &tcp_init_congestion_ops;
diff -urN linux/net/ipv4/tcp_output.c linux/net/ipv4/tcp_output.c
--- linux/net/ipv4/tcp_output.c 2005/07/11 20:49:10     1.70
+++ linux/net/ipv4/tcp_output.c 2005/07/12 09:19:24     1.71
@@ -49,7 +49,7 @@
  * will allow a single TSO frame to consume.  Building TSO frames
  * which are too large can cause TCP streams to be bursty.
  */
-int sysctl_tcp_tso_win_divisor = 8;
+int sysctl_tcp_tso_win_divisor = 3;
 
 static inline void update_send_head(struct sock *sk, struct tcp_sock *tp,
                                    struct sk_buff *skb)
@@ -140,11 +140,11 @@
                tp->ack.pingpong = 1;
 }
 
-static __inline__ void tcp_event_ack_sent(struct sock *sk)
+static __inline__ void tcp_event_ack_sent(struct sock *sk, unsigned int pkts)
 {
        struct tcp_sock *tp = tcp_sk(sk);
 
-       tcp_dec_quickack_mode(tp);
+       tcp_dec_quickack_mode(tp, pkts);
        tcp_clear_xmit_timer(sk, TCP_TIME_DACK);
 }
 
@@ -355,7 +355,7 @@
                tp->af_specific->send_check(sk, th, skb->len, skb);
 
                if (tcb->flags & TCPCB_FLAG_ACK)
-                       tcp_event_ack_sent(sk);
+                       tcp_event_ack_sent(sk, tcp_skb_pcount(skb));
 
                if (skb->len != tcp_header_size)
                        tcp_event_data_sent(tp, skb, sk);
@@ -403,42 +403,11 @@
                sk->sk_send_head = skb;
 }
 
-static inline void tcp_tso_set_push(struct sk_buff *skb)
-{
-       /* Force push to be on for any TSO frames to workaround
-        * problems with busted implementations like Mac OS-X that
-        * hold off socket receive wakeups until push is seen.
-        */
-       if (tcp_skb_pcount(skb) > 1)
-               TCP_SKB_CB(skb)->flags |= TCPCB_FLAG_PSH;
-}
-
-/* Send _single_ skb sitting at the send head. This function requires
- * true push pending frames to setup probe timer etc.
- */
-void tcp_push_one(struct sock *sk, unsigned cur_mss)
+static void tcp_set_skb_tso_segs(struct sock *sk, struct sk_buff *skb)
 {
        struct tcp_sock *tp = tcp_sk(sk);
-       struct sk_buff *skb = sk->sk_send_head;
 
-       if (tcp_snd_test(sk, skb, cur_mss, TCP_NAGLE_PUSH)) {
-               /* Send it out now. */
-               TCP_SKB_CB(skb)->when = tcp_time_stamp;
-               tcp_tso_set_push(skb);
-               if (!tcp_transmit_skb(sk, skb_clone(skb, sk->sk_allocation))) {
-                       sk->sk_send_head = NULL;
-                       tp->snd_nxt = TCP_SKB_CB(skb)->end_seq;
-                       tcp_packets_out_inc(sk, tp, skb);
-                       return;
-               }
-       }
-}
-
-void tcp_set_skb_tso_segs(struct sock *sk, struct sk_buff *skb)
-{
-       struct tcp_sock *tp = tcp_sk(sk);
-
-       if (skb->len <= tp->mss_cache_std ||
+       if (skb->len <= tp->mss_cache ||
            !(sk->sk_route_caps & NETIF_F_TSO)) {
                /* Avoid the costly divide in the normal
                 * non-TSO case.
@@ -448,10 +417,10 @@
        } else {
                unsigned int factor;
 
-               factor = skb->len + (tp->mss_cache_std - 1);
-               factor /= tp->mss_cache_std;
+               factor = skb->len + (tp->mss_cache - 1);
+               factor /= tp->mss_cache;
                skb_shinfo(skb)->tso_segs = factor;
-               skb_shinfo(skb)->tso_size = tp->mss_cache_std;
+               skb_shinfo(skb)->tso_size = tp->mss_cache;
        }
 }
 
@@ -537,6 +506,7 @@
        }
 
        /* Link BUFF into the send queue. */
+       skb_header_release(buff);
        __skb_append(skb, buff);
 
        return 0;
@@ -657,7 +627,7 @@
 
        /* And store cached results */
        tp->pmtu_cookie = pmtu;
-       tp->mss_cache = tp->mss_cache_std = mss_now;
+       tp->mss_cache = mss_now;
 
        return mss_now;
 }
@@ -669,59 +639,318 @@
  * cannot be large. However, taking into account rare use of URG, this
  * is not a big flaw.
  */
-
-unsigned int tcp_current_mss(struct sock *sk, int large)
+unsigned int tcp_current_mss(struct sock *sk, int large_allowed)
 {
        struct tcp_sock *tp = tcp_sk(sk);
        struct dst_entry *dst = __sk_dst_get(sk);
-       unsigned int do_large, mss_now;
+       u32 mss_now;
+       u16 xmit_size_goal;
+       int doing_tso = 0;
+
+       mss_now = tp->mss_cache;
+
+       if (large_allowed &&
+           (sk->sk_route_caps & NETIF_F_TSO) &&
+           !tp->urg_mode)
+               doing_tso = 1;
 
-       mss_now = tp->mss_cache_std;
        if (dst) {
                u32 mtu = dst_mtu(dst);
                if (mtu != tp->pmtu_cookie)
                        mss_now = tcp_sync_mss(sk, mtu);
        }
 
-       do_large = (large &&
-                   (sk->sk_route_caps & NETIF_F_TSO) &&
-                   !tp->urg_mode);
+       if (tp->rx_opt.eff_sacks)
+               mss_now -= (TCPOLEN_SACK_BASE_ALIGNED +
+                           (tp->rx_opt.eff_sacks * TCPOLEN_SACK_PERBLOCK));
 
-       if (do_large) {
-               unsigned int large_mss, factor, limit;
+       xmit_size_goal = mss_now;
 
-               large_mss = 65535 - tp->af_specific->net_header_len -
+       if (doing_tso) {
+               xmit_size_goal = 65535 -
+                       tp->af_specific->net_header_len -
                        tp->ext_header_len - tp->tcp_header_len;
 
-               if (tp->max_window && large_mss > (tp->max_window>>1))
-                       large_mss = max((tp->max_window>>1),
-                                       68U - tp->tcp_header_len);
-
-               factor = large_mss / mss_now;
-
-               /* Always keep large mss multiple of real mss, but
-                * do not exceed 1/tso_win_divisor of the congestion window
-                * so we can keep the ACK clock ticking and minimize
-                * bursting.
-                */
-               limit = tp->snd_cwnd;
-               if (sysctl_tcp_tso_win_divisor)
-                       limit /= sysctl_tcp_tso_win_divisor;
-               limit = max(1U, limit);
-               if (factor > limit)
-                       factor = limit;
-
-               tp->mss_cache = mss_now * factor;
+               if (tp->max_window &&
+                   (xmit_size_goal > (tp->max_window >> 1)))
+                       xmit_size_goal = max((tp->max_window >> 1),
+                                            68U - tp->tcp_header_len);
 
-               mss_now = tp->mss_cache;
+               xmit_size_goal -= (xmit_size_goal % mss_now);
        }
+       tp->xmit_size_goal = xmit_size_goal;
 
-       if (tp->rx_opt.eff_sacks)
-               mss_now -= (TCPOLEN_SACK_BASE_ALIGNED +
-                           (tp->rx_opt.eff_sacks * TCPOLEN_SACK_PERBLOCK));
        return mss_now;
 }
 
+/* Congestion window validation. (RFC2861) */
+
+static inline void tcp_cwnd_validate(struct sock *sk, struct tcp_sock *tp)
+{
+       __u32 packets_out = tp->packets_out;
+
+       if (packets_out >= tp->snd_cwnd) {
+               /* Network is feed fully. */
+               tp->snd_cwnd_used = 0;
+               tp->snd_cwnd_stamp = tcp_time_stamp;
+       } else {
+               /* Network starves. */
+               if (tp->packets_out > tp->snd_cwnd_used)
+                       tp->snd_cwnd_used = tp->packets_out;
+
+               if ((s32)(tcp_time_stamp - tp->snd_cwnd_stamp) >= tp->rto)
+                       tcp_cwnd_application_limited(sk);
+       }
+}
+
+static unsigned int tcp_window_allows(struct tcp_sock *tp, struct sk_buff 
*skb, unsigned int mss_now, unsigned int cwnd)
+{
+       u32 window, cwnd_len;
+
+       window = (tp->snd_una + tp->snd_wnd - TCP_SKB_CB(skb)->seq);
+       cwnd_len = mss_now * cwnd;
+       return min(window, cwnd_len);
+}
+
+/* Can at least one segment of SKB be sent right now, according to the
+ * congestion window rules?  If so, return how many segments are allowed.
+ */
+static inline unsigned int tcp_cwnd_test(struct tcp_sock *tp, struct sk_buff 
*skb)
+{
+       u32 in_flight, cwnd;
+
+       /* Don't be strict about the congestion window for the final FIN.  */
+       if (TCP_SKB_CB(skb)->flags & TCPCB_FLAG_FIN)
+               return 1;
+
+       in_flight = tcp_packets_in_flight(tp);
+       cwnd = tp->snd_cwnd;
+       if (in_flight < cwnd)
+               return (cwnd - in_flight);
+
+       return 0;
+}
+
+/* This must be invoked the first time we consider transmitting
+ * SKB onto the wire.
+ */
+static inline int tcp_init_tso_segs(struct sock *sk, struct sk_buff *skb)
+{
+       int tso_segs = tcp_skb_pcount(skb);
+
+       if (!tso_segs) {
+               tcp_set_skb_tso_segs(sk, skb);
+               tso_segs = tcp_skb_pcount(skb);
+       }
+       return tso_segs;
+}
+
+static inline int tcp_minshall_check(const struct tcp_sock *tp)
+{
+       return after(tp->snd_sml,tp->snd_una) &&
+               !after(tp->snd_sml, tp->snd_nxt);
+}
+
+/* Return 0, if packet can be sent now without violation Nagle's rules:
+ * 1. It is full sized.
+ * 2. Or it contains FIN. (already checked by caller)
+ * 3. Or TCP_NODELAY was set.
+ * 4. Or TCP_CORK is not set, and all sent packets are ACKed.
+ *    With Minshall's modification: all sent small packets are ACKed.
+ */
+
+static inline int tcp_nagle_check(const struct tcp_sock *tp,
+                                 const struct sk_buff *skb, 
+                                 unsigned mss_now, int nonagle)
+{
+       return (skb->len < mss_now &&
+               ((nonagle&TCP_NAGLE_CORK) ||
+                (!nonagle &&
+                 tp->packets_out &&
+                 tcp_minshall_check(tp))));
+}
+
+/* Return non-zero if the Nagle test allows this packet to be
+ * sent now.
+ */
+static inline int tcp_nagle_test(struct tcp_sock *tp, struct sk_buff *skb,
+                                unsigned int cur_mss, int nonagle)
+{
+       /* Nagle rule does not apply to frames, which sit in the middle of the
+        * write_queue (they have no chances to get new data).
+        *
+        * This is implemented in the callers, where they modify the 'nonagle'
+        * argument based upon the location of SKB in the send queue.
+        */
+       if (nonagle & TCP_NAGLE_PUSH)
+               return 1;
+
+       /* Don't use the nagle rule for urgent data (or for the final FIN).  */
+       if (tp->urg_mode ||
+           (TCP_SKB_CB(skb)->flags & TCPCB_FLAG_FIN))
+               return 1;
+
+       if (!tcp_nagle_check(tp, skb, cur_mss, nonagle))
+               return 1;
+
+       return 0;
+}
+
+/* Does at least the first segment of SKB fit into the send window? */
+static inline int tcp_snd_wnd_test(struct tcp_sock *tp, struct sk_buff *skb, 
unsigned int cur_mss)
+{
+       u32 end_seq = TCP_SKB_CB(skb)->end_seq;
+
+       if (skb->len > cur_mss)
+               end_seq = TCP_SKB_CB(skb)->seq + cur_mss;
+
+       return !after(end_seq, tp->snd_una + tp->snd_wnd);
+}
+
+/* This checks if the data bearing packet SKB (usually sk->sk_send_head)
+ * should be put on the wire right now.  If so, it returns the number of
+ * packets allowed by the congestion window.
+ */
+static unsigned int tcp_snd_test(struct sock *sk, struct sk_buff *skb,
+                                unsigned int cur_mss, int nonagle)
+{
+       struct tcp_sock *tp = tcp_sk(sk);
+       unsigned int cwnd_quota;
+
+       tcp_init_tso_segs(sk, skb);
+
+       if (!tcp_nagle_test(tp, skb, cur_mss, nonagle))
+               return 0;
+
+       cwnd_quota = tcp_cwnd_test(tp, skb);
+       if (cwnd_quota &&
+           !tcp_snd_wnd_test(tp, skb, cur_mss))
+               cwnd_quota = 0;
+
+       return cwnd_quota;
+}
+
+static inline int tcp_skb_is_last(const struct sock *sk, 
+                                 const struct sk_buff *skb)
+{
+       return skb->next == (struct sk_buff *)&sk->sk_write_queue;
+}
+
+int tcp_may_send_now(struct sock *sk, struct tcp_sock *tp)
+{
+       struct sk_buff *skb = sk->sk_send_head;
+
+       return (skb &&
+               tcp_snd_test(sk, skb, tcp_current_mss(sk, 1),
+                            (tcp_skb_is_last(sk, skb) ?
+                             TCP_NAGLE_PUSH :
+                             tp->nonagle)));
+}
+
+/* Trim TSO SKB to LEN bytes, put the remaining data into a new packet
+ * which is put after SKB on the list.  It is very much like
+ * tcp_fragment() except that it may make several kinds of assumptions
+ * in order to speed up the splitting operation.  In particular, we
+ * know that all the data is in scatter-gather pages, and that the
+ * packet has never been sent out before (and thus is not cloned).
+ */
+static int tso_fragment(struct sock *sk, struct sk_buff *skb, unsigned int len)
+{
+       struct sk_buff *buff;
+       int nlen = skb->len - len;
+       u16 flags;
+
+       /* All of a TSO frame must be composed of paged data.  */
+       BUG_ON(skb->len != skb->data_len);
+
+       buff = sk_stream_alloc_pskb(sk, 0, 0, GFP_ATOMIC);
+       if (unlikely(buff == NULL))
+               return -ENOMEM;
+
+       buff->truesize = nlen;
+       skb->truesize -= nlen;
+
+       /* Correct the sequence numbers. */
+       TCP_SKB_CB(buff)->seq = TCP_SKB_CB(skb)->seq + len;
+       TCP_SKB_CB(buff)->end_seq = TCP_SKB_CB(skb)->end_seq;
+       TCP_SKB_CB(skb)->end_seq = TCP_SKB_CB(buff)->seq;
+
+       /* PSH and FIN should only be set in the second packet. */
+       flags = TCP_SKB_CB(skb)->flags;
+       TCP_SKB_CB(skb)->flags = flags & ~(TCPCB_FLAG_FIN|TCPCB_FLAG_PSH);
+       TCP_SKB_CB(buff)->flags = flags;
+
+       /* This packet was never sent out yet, so no SACK bits. */
+       TCP_SKB_CB(buff)->sacked = 0;
+
+       buff->ip_summed = skb->ip_summed = CHECKSUM_HW;
+       skb_split(skb, buff, len);
+
+       /* Fix up tso_factor for both original and new SKB.  */
+       tcp_set_skb_tso_segs(sk, skb);
+       tcp_set_skb_tso_segs(sk, buff);
+
+       /* Link BUFF into the send queue. */
+       skb_header_release(buff);
+       __skb_append(skb, buff);
+
+       return 0;
+}
+
+/* Try to defer sending, if possible, in order to minimize the amount
+ * of TSO splitting we do.  View it as a kind of TSO Nagle test.
+ *
+ * This algorithm is from John Heffner.
+ */
+static int tcp_tso_should_defer(struct sock *sk, struct tcp_sock *tp, struct 
sk_buff *skb)
+{
+       u32 send_win, cong_win, limit, in_flight;
+
+       if (TCP_SKB_CB(skb)->flags & TCPCB_FLAG_FIN)
+               return 0;
+
+       if (tp->ca_state != TCP_CA_Open)
+               return 0;
+
+       in_flight = tcp_packets_in_flight(tp);
+
+       BUG_ON(tcp_skb_pcount(skb) <= 1 ||
+              (tp->snd_cwnd <= in_flight));
+
+       send_win = (tp->snd_una + tp->snd_wnd) - TCP_SKB_CB(skb)->seq;
+
+       /* From in_flight test above, we know that cwnd > in_flight.  */
+       cong_win = (tp->snd_cwnd - in_flight) * tp->mss_cache;
+
+       limit = min(send_win, cong_win);
+
+       /* If sk_send_head can be sent fully now, just do it.  */
+       if (skb->len <= limit)
+               return 0;
+
+       if (sysctl_tcp_tso_win_divisor) {
+               u32 chunk = min(tp->snd_wnd, tp->snd_cwnd * tp->mss_cache);
+
+               /* If at least some fraction of a window is available,
+                * just use it.
+                */
+               chunk /= sysctl_tcp_tso_win_divisor;
+               if (limit >= chunk)
+                       return 0;
+       } else {
+               /* Different approach, try not to defer past a single
+                * ACK.  Receiver should ACK every other full sized
+                * frame, so if we have space for more than 3 frames
+                * then send now.
+                */
+               if (limit > tcp_max_burst(tp) * tp->mss_cache)
+                       return 0;
+       }
+
+       /* Ok, it looks like it is advisable to defer.  */
+       return 1;
+}
+
 /* This routine writes packets to the network.  It advances the
  * send_head.  This happens as incoming acks open up the remote
  * window for us.
@@ -729,57 +958,158 @@
  * Returns 1, if no segments are in flight and we have queued segments, but
  * cannot send anything now because of SWS or another problem.
  */
-int tcp_write_xmit(struct sock *sk, int nonagle)
+static int tcp_write_xmit(struct sock *sk, unsigned int mss_now, int nonagle)
 {
        struct tcp_sock *tp = tcp_sk(sk);
-       unsigned int mss_now;
+       struct sk_buff *skb;
+       unsigned int tso_segs, sent_pkts;
+       int cwnd_quota;
 
        /* If we are closed, the bytes will have to remain here.
         * In time closedown will finish, we empty the write queue and all
         * will be happy.
         */
-       if (sk->sk_state != TCP_CLOSE) {
-               struct sk_buff *skb;
-               int sent_pkts = 0;
+       if (unlikely(sk->sk_state == TCP_CLOSE))
+               return 0;
 
-               /* Account for SACKS, we may need to fragment due to this.
-                * It is just like the real MSS changing on us midstream.
-                * We also handle things correctly when the user adds some
-                * IP options mid-stream.  Silly to do, but cover it.
-                */
-               mss_now = tcp_current_mss(sk, 1);
+       skb = sk->sk_send_head;
+       if (unlikely(!skb))
+               return 0;
+
+       tso_segs = tcp_init_tso_segs(sk, skb);
+       cwnd_quota = tcp_cwnd_test(tp, skb);
+       if (unlikely(!cwnd_quota))
+               goto out;
+
+       sent_pkts = 0;
+       while (likely(tcp_snd_wnd_test(tp, skb, mss_now))) {
+               BUG_ON(!tso_segs);
+
+               if (tso_segs == 1) {
+                       if (unlikely(!tcp_nagle_test(tp, skb, mss_now,
+                                                    (tcp_skb_is_last(sk, skb) ?
+                                                     nonagle : 
TCP_NAGLE_PUSH))))
+                               break;
+               } else {
+                       if (tcp_tso_should_defer(sk, tp, skb))
+                               break;
+               }
+
+               if (tso_segs > 1) {
+                       u32 limit = tcp_window_allows(tp, skb,
+                                                     mss_now, cwnd_quota);
 
-               while ((skb = sk->sk_send_head) &&
-                      tcp_snd_test(sk, skb, mss_now,
-                                   tcp_skb_is_last(sk, skb) ? nonagle :
-                                                              TCP_NAGLE_PUSH)) 
{
-                       if (skb->len > mss_now) {
-                               if (tcp_fragment(sk, skb, mss_now))
+                       if (skb->len < limit) {
+                               unsigned int trim = skb->len % mss_now;
+
+                               if (trim)
+                                       limit = skb->len - trim;
+                       }
+                       if (skb->len > limit) {
+                               if (tso_fragment(sk, skb, limit))
                                        break;
                        }
-
-                       TCP_SKB_CB(skb)->when = tcp_time_stamp;
-                       tcp_tso_set_push(skb);
-                       if (tcp_transmit_skb(sk, skb_clone(skb, GFP_ATOMIC)))
+               } else if (unlikely(skb->len > mss_now)) {
+                       if (unlikely(tcp_fragment(sk, skb,  mss_now)))
                                break;
+               }
 
-                       /* Advance the send_head.  This one is sent out.
-                        * This call will increment packets_out.
-                        */
-                       update_send_head(sk, tp, skb);
+               TCP_SKB_CB(skb)->when = tcp_time_stamp;
+
+               if (unlikely(tcp_transmit_skb(sk, skb_clone(skb, GFP_ATOMIC))))
+                       break;
+
+               /* Advance the send_head.  This one is sent out.
+                * This call will increment packets_out.
+                */
+               update_send_head(sk, tp, skb);
+
+               tcp_minshall_update(tp, mss_now, skb);
+               sent_pkts++;
+
+               /* Do not optimize this to use tso_segs. If we chopped up
+                * the packet above, tso_segs will no longer be valid.
+                */
+               cwnd_quota -= tcp_skb_pcount(skb);
+
+               BUG_ON(cwnd_quota < 0);
+               if (!cwnd_quota)
+                       break;
+
+               skb = sk->sk_send_head;
+               if (!skb)
+                       break;
+               tso_segs = tcp_init_tso_segs(sk, skb);
+       }
+
+       if (likely(sent_pkts)) {
+               tcp_cwnd_validate(sk, tp);
+               return 0;
+       }
+out:
+       return !tp->packets_out && sk->sk_send_head;
+}
+
+/* Push out any pending frames which were held back due to
+ * TCP_CORK or attempt at coalescing tiny packets.
+ * The socket must be locked by the caller.
+ */
+void __tcp_push_pending_frames(struct sock *sk, struct tcp_sock *tp,
+                              unsigned int cur_mss, int nonagle)
+{
+       struct sk_buff *skb = sk->sk_send_head;
 
-                       tcp_minshall_update(tp, mss_now, skb);
-                       sent_pkts = 1;
+       if (skb) {
+               if (tcp_write_xmit(sk, cur_mss, nonagle))
+                       tcp_check_probe_timer(sk, tp);
+       }
+}
+
+/* Send _single_ skb sitting at the send head. This function requires
+ * true push pending frames to setup probe timer etc.
+ */
+void tcp_push_one(struct sock *sk, unsigned int mss_now)
+{
+       struct tcp_sock *tp = tcp_sk(sk);
+       struct sk_buff *skb = sk->sk_send_head;
+       unsigned int tso_segs, cwnd_quota;
+
+       BUG_ON(!skb || skb->len < mss_now);
+
+       tso_segs = tcp_init_tso_segs(sk, skb);
+       cwnd_quota = tcp_snd_test(sk, skb, mss_now, TCP_NAGLE_PUSH);
+
+       if (likely(cwnd_quota)) {
+               BUG_ON(!tso_segs);
+
+               if (tso_segs > 1) {
+                       u32 limit = tcp_window_allows(tp, skb,
+                                                     mss_now, cwnd_quota);
+
+                       if (skb->len < limit) {
+                               unsigned int trim = skb->len % mss_now;
+
+                               if (trim)
+                                       limit = skb->len - trim;
+                       }
+                       if (skb->len > limit) {
+                               if (unlikely(tso_fragment(sk, skb, limit)))
+                                       return;
+                       }
+               } else if (unlikely(skb->len > mss_now)) {
+                       if (unlikely(tcp_fragment(sk, skb, mss_now)))
+                               return;
                }
 
-               if (sent_pkts) {
+               /* Send it out now. */
+               TCP_SKB_CB(skb)->when = tcp_time_stamp;
+
+               if (likely(!tcp_transmit_skb(sk, skb_clone(skb, 
sk->sk_allocation)))) {
+                       update_send_head(sk, tp, skb);
                        tcp_cwnd_validate(sk, tp);
-                       return 0;
+                       return;
                }
-
-               return !tp->packets_out && sk->sk_send_head;
        }
-       return 0;
 }
 
 /* This function returns the amount that we can raise the
@@ -1039,7 +1369,6 @@
                if (sk->sk_route_caps & NETIF_F_TSO) {
                        sk->sk_route_caps &= ~NETIF_F_TSO;
                        sock_set_flag(sk, SOCK_NO_LARGESEND);
-                       tp->mss_cache = tp->mss_cache_std;
                }
 
                if (tcp_trim_head(sk, skb, tp->snd_una - TCP_SKB_CB(skb)->seq))
@@ -1101,7 +1430,6 @@
         * is still in somebody's hands, else make a clone.
         */
        TCP_SKB_CB(skb)->when = tcp_time_stamp;
-       tcp_tso_set_push(skb);
 
        err = tcp_transmit_skb(sk, (skb_cloned(skb) ?
                                    pskb_copy(skb, GFP_ATOMIC):
@@ -1670,14 +1998,12 @@
                                if (sk->sk_route_caps & NETIF_F_TSO) {
                                        sock_set_flag(sk, SOCK_NO_LARGESEND);
                                        sk->sk_route_caps &= ~NETIF_F_TSO;
-                                       tp->mss_cache = tp->mss_cache_std;
                                }
                        } else if (!tcp_skb_pcount(skb))
                                tcp_set_skb_tso_segs(sk, skb);
 
                        TCP_SKB_CB(skb)->flags |= TCPCB_FLAG_PSH;
                        TCP_SKB_CB(skb)->when = tcp_time_stamp;
-                       tcp_tso_set_push(skb);
                        err = tcp_transmit_skb(sk, skb_clone(skb, GFP_ATOMIC));
                        if (!err) {
                                update_send_head(sk, tp, skb);
diff -urN linux/net/ipv6/af_inet6.c linux/net/ipv6/af_inet6.c
--- linux/net/ipv6/af_inet6.c   2005/05/19 12:08:51     1.73
+++ linux/net/ipv6/af_inet6.c   2005/07/12 09:19:25     1.74
@@ -774,7 +774,6 @@
        if (if6_proc_init())
                goto proc_if6_fail;
 #endif
-       ipv6_packet_init();
        ip6_route_init();
        ip6_flowlabel_init();
        err = addrconf_init();
@@ -791,6 +790,8 @@
        /* Init v6 transport protocols. */
        udpv6_init();
        tcpv6_init();
+
+       ipv6_packet_init();
        err = 0;
 out:
        return err;
@@ -798,7 +799,6 @@
 addrconf_fail:
        ip6_flowlabel_cleanup();
        ip6_route_cleanup();
-       ipv6_packet_cleanup();
 #ifdef CONFIG_PROC_FS
        if6_proc_exit();
 proc_if6_fail:
diff -urN linux/net/ipv6/ip6_output.c linux/net/ipv6/ip6_output.c
--- linux/net/ipv6/ip6_output.c 2005/07/11 20:49:13     1.62
+++ linux/net/ipv6/ip6_output.c 2005/07/12 09:19:25     1.63
@@ -465,7 +465,6 @@
        to->pkt_type = from->pkt_type;
        to->priority = from->priority;
        to->protocol = from->protocol;
-       to->security = from->security;
        dst_release(to->dst);
        to->dst = dst_clone(from->dst);
        to->dev = from->dev;
diff -urN linux/net/ipv6/tcp_ipv6.c linux/net/ipv6/tcp_ipv6.c
--- linux/net/ipv6/tcp_ipv6.c   2005/07/11 20:49:13     1.89
+++ linux/net/ipv6/tcp_ipv6.c   2005/07/12 09:19:25     1.90
@@ -2018,7 +2018,7 @@
         */
        tp->snd_ssthresh = 0x7fffffff;
        tp->snd_cwnd_clamp = ~0;
-       tp->mss_cache_std = tp->mss_cache = 536;
+       tp->mss_cache = 536;
 
        tp->reordering = sysctl_tcp_reordering;
 
diff -urN linux/net/sched/sch_blackhole.c linux/net/sched/sch_blackhole.c
--- linux/net/sched/sch_blackhole.c     1970/01/01 00:00:00
+++ linux/net/sched/sch_blackhole.c     2005-07-12 10:19:26.039373000 +0100     
1.1
@@ -0,0 +1,54 @@
+/*
+ * net/sched/sch_blackhole.c   Black hole queue
+ *
+ *             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.
+ *
+ * Authors:    Thomas Graf <tgraf@suug.ch>
+ *
+ * Note: Quantum tunneling is not supported.
+ */
+
+#include <linux/config.h>
+#include <linux/module.h>
+#include <linux/types.h>
+#include <linux/kernel.h>
+#include <linux/netdevice.h>
+#include <linux/skbuff.h>
+#include <net/pkt_sched.h>
+
+static int blackhole_enqueue(struct sk_buff *skb, struct Qdisc *sch)
+{
+       qdisc_drop(skb, sch);
+       return NET_XMIT_SUCCESS;
+}
+
+static struct sk_buff *blackhole_dequeue(struct Qdisc *sch)
+{
+       return NULL;
+}
+
+static struct Qdisc_ops blackhole_qdisc_ops = {
+       .id             = "blackhole",
+       .priv_size      = 0,
+       .enqueue        = blackhole_enqueue,
+       .dequeue        = blackhole_dequeue,
+       .owner          = THIS_MODULE,
+};
+
+static int __init blackhole_module_init(void)
+{
+       return register_qdisc(&blackhole_qdisc_ops);
+}
+
+static void __exit blackhole_module_exit(void)
+{
+       unregister_qdisc(&blackhole_qdisc_ops);
+}
+
+module_init(blackhole_module_init)
+module_exit(blackhole_module_exit)
+
+MODULE_LICENSE("GPL");
diff -urN linux/net/sched/Makefile linux/net/sched/Makefile
--- linux/net/sched/Makefile    2005/07/11 20:49:15     1.21
+++ linux/net/sched/Makefile    2005/07/12 09:19:25     1.22
@@ -4,7 +4,7 @@
 
 obj-y  := sch_generic.o
 
-obj-$(CONFIG_NET_SCHED)                += sch_api.o sch_fifo.o
+obj-$(CONFIG_NET_SCHED)                += sch_api.o sch_fifo.o sch_blackhole.o
 obj-$(CONFIG_NET_CLS)          += cls_api.o
 obj-$(CONFIG_NET_CLS_ACT)      += act_api.o
 obj-$(CONFIG_NET_ACT_POLICE)   += police.o
diff -urN linux/net/sched/em_meta.c linux/net/sched/em_meta.c
--- linux/net/sched/em_meta.c   2005/06/18 14:42:52     1.2
+++ linux/net/sched/em_meta.c   2005/07/12 09:19:25     1.3
@@ -205,11 +205,6 @@
        dst->value = skb->protocol;
 }
 
-META_COLLECTOR(int_security)
-{
-       dst->value = skb->security;
-}
-
 META_COLLECTOR(int_pkttype)
 {
        dst->value = skb->pkt_type;
@@ -524,7 +519,6 @@
                [META_ID(REALDEV)]              = META_FUNC(int_realdev),
                [META_ID(PRIORITY)]             = META_FUNC(int_priority),
                [META_ID(PROTOCOL)]             = META_FUNC(int_protocol),
-               [META_ID(SECURITY)]             = META_FUNC(int_security),
                [META_ID(PKTTYPE)]              = META_FUNC(int_pkttype),
                [META_ID(PKTLEN)]               = META_FUNC(int_pktlen),
                [META_ID(DATALEN)]              = META_FUNC(int_datalen),
diff -urN linux/net/sched/sch_api.c linux/net/sched/sch_api.c
--- linux/net/sched/sch_api.c   2005/07/11 20:49:15     1.36
+++ linux/net/sched/sch_api.c   2005/07/12 09:19:25     1.37
@@ -399,10 +399,8 @@
 {
        int err;
        struct rtattr *kind = tca[TCA_KIND-1];
-       void *p = NULL;
        struct Qdisc *sch;
        struct Qdisc_ops *ops;
-       int size;
 
        ops = qdisc_lookup_ops(kind);
 #ifdef CONFIG_KMOD
@@ -437,64 +435,55 @@
        if (ops == NULL)
                goto err_out;
 
-       /* ensure that the Qdisc and the private data are 32-byte aligned */
-       size = ((sizeof(*sch) + QDISC_ALIGN_CONST) & ~QDISC_ALIGN_CONST);
-       size += ops->priv_size + QDISC_ALIGN_CONST;
-
-       p = kmalloc(size, GFP_KERNEL);
-       err = -ENOBUFS;
-       if (!p)
+       sch = qdisc_alloc(dev, ops);
+       if (IS_ERR(sch)) {
+               err = PTR_ERR(sch);
                goto err_out2;
-       memset(p, 0, size);
-       sch = (struct Qdisc *)(((unsigned long)p + QDISC_ALIGN_CONST)
-                              & ~QDISC_ALIGN_CONST);
-       sch->padded = (char *)sch - (char *)p;
-
-       INIT_LIST_HEAD(&sch->list);
-       skb_queue_head_init(&sch->q);
+       }
 
-       if (handle == TC_H_INGRESS)
+       if (handle == TC_H_INGRESS) {
                sch->flags |= TCQ_F_INGRESS;
-
-       sch->ops = ops;
-       sch->enqueue = ops->enqueue;
-       sch->dequeue = ops->dequeue;
-       sch->dev = dev;
-       dev_hold(dev);
-       atomic_set(&sch->refcnt, 1);
-       sch->stats_lock = &dev->queue_lock;
-       if (handle == 0) {
+               handle = TC_H_MAKE(TC_H_INGRESS, 0);
+       } else if (handle == 0) {
                handle = qdisc_alloc_handle(dev);
                err = -ENOMEM;
                if (handle == 0)
                        goto err_out3;
        }
 
-       if (handle == TC_H_INGRESS)
-                sch->handle =TC_H_MAKE(TC_H_INGRESS, 0);
-        else
-                sch->handle = handle;
+       sch->handle = handle;
 
        if (!ops->init || (err = ops->init(sch, tca[TCA_OPTIONS-1])) == 0) {
+#ifdef CONFIG_NET_ESTIMATOR
+               if (tca[TCA_RATE-1]) {
+                       err = gen_new_estimator(&sch->bstats, &sch->rate_est,
+                                               sch->stats_lock,
+                                               tca[TCA_RATE-1]);
+                       if (err) {
+                               /*
+                                * Any broken qdiscs that would require
+                                * a ops->reset() here? The qdisc was never
+                                * in action so it shouldn't be necessary.
+                                */
+                               if (ops->destroy)
+                                       ops->destroy(sch);
+                               goto err_out3;
+                       }
+               }
+#endif
                qdisc_lock_tree(dev);
                list_add_tail(&sch->list, &dev->qdisc_list);
                qdisc_unlock_tree(dev);
 
-#ifdef CONFIG_NET_ESTIMATOR
-               if (tca[TCA_RATE-1])
-                       gen_new_estimator(&sch->bstats, &sch->rate_est,
-                               sch->stats_lock, tca[TCA_RATE-1]);
-#endif
                return sch;
        }
 err_out3:
        dev_put(dev);
+       kfree((char *) sch - sch->padded);
 err_out2:
        module_put(ops->owner);
 err_out:
        *errp = err;
-       if (p)
-               kfree(p);
        return NULL;
 }
 
diff -urN linux/net/sched/sch_generic.c linux/net/sched/sch_generic.c
--- linux/net/sched/sch_generic.c       2005/07/11 20:49:15     1.35
+++ linux/net/sched/sch_generic.c       2005/07/12 09:19:25     1.36
@@ -395,24 +395,23 @@
        .owner          =       THIS_MODULE,
 };
 
-struct Qdisc * qdisc_create_dflt(struct net_device *dev, struct Qdisc_ops *ops)
+struct Qdisc *qdisc_alloc(struct net_device *dev, struct Qdisc_ops *ops)
 {
        void *p;
        struct Qdisc *sch;
-       int size;
+       unsigned int size;
+       int err = -ENOBUFS;
 
        /* ensure that the Qdisc and the private data are 32-byte aligned */
-       size = ((sizeof(*sch) + QDISC_ALIGN_CONST) & ~QDISC_ALIGN_CONST);
-       size += ops->priv_size + QDISC_ALIGN_CONST;
+       size = QDISC_ALIGN(sizeof(*sch));
+       size += ops->priv_size + (QDISC_ALIGNTO - 1);
 
        p = kmalloc(size, GFP_KERNEL);
        if (!p)
-               return NULL;
+               goto errout;
        memset(p, 0, size);
-
-       sch = (struct Qdisc *)(((unsigned long)p + QDISC_ALIGN_CONST) 
-                              & ~QDISC_ALIGN_CONST);
-       sch->padded = (char *)sch - (char *)p;
+       sch = (struct Qdisc *) QDISC_ALIGN((unsigned long) p);
+       sch->padded = (char *) sch - (char *) p;
 
        INIT_LIST_HEAD(&sch->list);
        skb_queue_head_init(&sch->q);
@@ -423,11 +422,24 @@
        dev_hold(dev);
        sch->stats_lock = &dev->queue_lock;
        atomic_set(&sch->refcnt, 1);
+
+       return sch;
+errout:
+       return ERR_PTR(-err);
+}
+
+struct Qdisc * qdisc_create_dflt(struct net_device *dev, struct Qdisc_ops *ops)
+{
+       struct Qdisc *sch;
+       
+       sch = qdisc_alloc(dev, ops);
+       if (IS_ERR(sch))
+               goto errout;
+
        if (!ops->init || ops->init(sch, NULL) == 0)
                return sch;
 
-       dev_put(dev);
-       kfree(p);
+errout:
        return NULL;
 }
 
@@ -591,6 +603,7 @@
 EXPORT_SYMBOL(noop_qdisc);
 EXPORT_SYMBOL(noop_qdisc_ops);
 EXPORT_SYMBOL(qdisc_create_dflt);
+EXPORT_SYMBOL(qdisc_alloc);
 EXPORT_SYMBOL(qdisc_destroy);
 EXPORT_SYMBOL(qdisc_reset);
 EXPORT_SYMBOL(qdisc_restart);
diff -urN linux/security/selinux/hooks.c linux/security/selinux/hooks.c
--- linux/security/selinux/hooks.c      2005/07/11 20:49:19     1.34
+++ linux/security/selinux/hooks.c      2005/07/12 09:19:26     1.35
@@ -68,6 +68,7 @@
 #include <linux/personality.h>
 #include <linux/sysctl.h>
 #include <linux/audit.h>
+#include <linux/string.h>
 
 #include "avc.h"
 #include "objsec.h"
@@ -1943,7 +1944,7 @@
                }
        } while (*in_end++);
 
-       copy_page(in_save, nosec_save);
+       strcpy(in_save, nosec_save);
        free_page((unsigned long)nosec_save);
 out:
        return rc;
diff -urN linux/sound/pci/bt87x.c linux/sound/pci/bt87x.c
--- linux/sound/pci/bt87x.c     2005/07/11 20:49:25     1.11
+++ linux/sound/pci/bt87x.c     2005/07/12 09:19:26     1.12
@@ -804,7 +804,7 @@
        int i;
        const struct pci_device_id *supported;
 
-       supported = pci_match_device(snd_bt87x_ids, pci);
+       supported = pci_match_device(driver, pci);
        if (supported)
                return supported->driver_data;
 

<Prev in Thread] Current Thread [Next in Thread>